111
|
1 // { dg-do compile { target c++14 } }
|
|
2 // { dg-options "-Wno-return-local-addr" }
|
|
3
|
|
4 template<class,class> struct same_type;
|
|
5 template<class T> struct same_type<T,T> {};
|
|
6
|
|
7 int& f();
|
|
8 int i;
|
|
9
|
|
10 decltype(auto) g() { return f(); }
|
|
11 decltype(auto) h1() { return i; }
|
|
12 decltype(auto) h2() { return (i); }
|
|
13 decltype(auto) h2a() { return 0,i; }
|
|
14
|
|
15 struct A { int i; };
|
|
16 A a;
|
|
17
|
|
18 decltype(auto) h3() { return a.i; }
|
|
19 decltype(auto) h4() { return (a.i); }
|
|
20
|
|
21 template <class T>
|
|
22 decltype(auto) h5(T t) { return t.i; }
|
|
23 template <class T>
|
|
24 decltype(auto) h6(T t) { return (t.i); }
|
131
|
25 template <class T>
|
|
26 decltype(auto) h7(T t) { return (i); }
|
111
|
27
|
|
28 int main()
|
|
29 {
|
|
30 decltype(auto) i = f();
|
|
31 same_type<decltype(i),int&>();
|
|
32 decltype(auto) i2 = i;
|
|
33 same_type<decltype(i2),int&>();
|
|
34 decltype(auto) i3 = ::i;
|
|
35 same_type<decltype(i3),int>();
|
|
36 decltype(auto) i4 = (::i);
|
|
37 same_type<decltype(i4),int&>();
|
|
38 decltype(auto) i5 = a.i;
|
|
39 same_type<decltype(i5),int>();
|
|
40 decltype(auto) i6 = (a.i);
|
|
41 same_type<decltype(i6),int&>();
|
|
42 decltype(auto) i7 = true ? ::i : ::i;
|
|
43 same_type<decltype(i7),int&>();
|
|
44
|
|
45 same_type<decltype(g()),int&>();
|
|
46 same_type<decltype(h1()),int>();
|
|
47 same_type<decltype(h2()),int&>();
|
|
48 same_type<decltype(h2a()),int&>();
|
|
49 same_type<decltype(h3()),int>();
|
|
50 same_type<decltype(h4()),int&>();
|
|
51 same_type<decltype(h5(a)),int>();
|
|
52 same_type<decltype(h6(a)),int&>();
|
131
|
53 same_type<decltype(h7(a)),int&>();
|
111
|
54 }
|