c++: robustify testcase [PR109752]
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / decltype-auto4.C
blob9765857efb199958223f8db6bcb9f256fc06d67c
1 // PR c++/103403
2 // { dg-do compile { target c++14 } }
4 struct false_type { static constexpr bool value = false; };
5 struct true_type { static constexpr bool value = true; };
6 template<class T, class U>
7 struct is_same : false_type {}; 
8 template<class T>
9 struct is_same<T, T> : true_type {};
11 int fn ();
12 int &ref ();
13 int &&rref ();
15 struct S {
16   int i;
17   int &r = i;
20 void
21 ids ()
23   const S *s = new S();
24   int i;
25   int &ir = i;
26   decltype(auto) r1 = s->i;
27   static_assert (is_same<decltype(r1), int>::value, "");
28   decltype(auto) r2 = s->r;
29   static_assert (is_same<decltype(r2), int&>::value, "");
30   decltype(auto) r3 = i;
31   static_assert (is_same<decltype(r3), int>::value, "");
32   decltype(auto) r4 = ir;
33   static_assert (is_same<decltype(r4), int&>::value, "");
36 void
37 nonids ()
39   const S *s = new S();
40   int i;
41   int &ir = i;
42   int &&irr = 42;
43   decltype(auto) r1 = fn ();
44   static_assert (is_same<decltype(r1), int>::value, ""); 
45   decltype(auto) r2 = (fn ());
46   static_assert (is_same<decltype(r2), int>::value, ""); 
47   decltype(auto) r3 = ref ();
48   static_assert (is_same<decltype(r3), int&>::value, ""); 
49   decltype(auto) r4 = (ref ());
50   static_assert (is_same<decltype(r4), int&>::value, ""); 
51   decltype(auto) r5 = rref ();
52   static_assert (is_same<decltype(r5), int&&>::value, ""); 
53   decltype(auto) r6 = (rref ());
54   static_assert (is_same<decltype(r6), int&&>::value, ""); 
55   decltype(auto) r8 = (s->i);
56   static_assert (is_same<decltype(r8), const int&>::value, "");
57   decltype(auto) r9 = (s->r);
58   static_assert (is_same<decltype(r9), int&>::value, "");
59   decltype(auto) r10 = (i);
60   static_assert (is_same<decltype(r10), int&>::value, "");
61   decltype(auto) r11 = (ir);
62   static_assert (is_same<decltype(r11), int&>::value, "");
63   decltype(auto) r12 = (irr);
64   static_assert (is_same<decltype(r12), int&>::value, "");