annotate gcc/testsuite/g++.dg/cpp1z/decomp10.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1 // { dg-do compile { target c++17 } }
111
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 namespace std {
kono
parents:
diff changeset
4 template<typename T> struct tuple_size;
kono
parents:
diff changeset
5 template<int, typename> struct tuple_element;
kono
parents:
diff changeset
6 }
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 struct A1 { int i,j; } a1;
kono
parents:
diff changeset
9 template<> struct std::tuple_size<A1> { };
kono
parents:
diff changeset
10 void f1() { auto [ x ] = a1; } // { dg-error "is not an integral constant expression" }
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 struct A2 { int i,j; } a2;
kono
parents:
diff changeset
13 template<> struct std::tuple_size<A2> { enum { value = 5 }; };
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
14 void f2() { auto [ x ] = a2; } // { dg-error "only 1 name provided" }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
15 // { dg-message "decomposes into 5" "" { target *-*-* } .-1 }
111
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 struct A3 { int i,j; } a3;
kono
parents:
diff changeset
18 template<> struct std::tuple_size<A3> { enum { value = 1 }; };
kono
parents:
diff changeset
19 void f3() { auto [ x ] = a3; } // { dg-error "get" }
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 struct A3a { int i,j; int get(); } a3a;
kono
parents:
diff changeset
22 template<> struct std::tuple_size<A3a> { enum { value = 1 }; };
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
23 void f3a() { auto [ x ] = a3a; } // { dg-error "get" }
111
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 struct A3b { int i,j; } a3b;
kono
parents:
diff changeset
26 int get(A3b&&);
kono
parents:
diff changeset
27 template<> struct std::tuple_size<A3b> { enum { value = 1 }; };
kono
parents:
diff changeset
28 void f3b() { auto [ x ] = a3b; } // { dg-error "get<0>" }
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 struct A4 {
kono
parents:
diff changeset
31 int ar[3];
kono
parents:
diff changeset
32 template <int I> int& get() { return ar[I]; }
kono
parents:
diff changeset
33 } a4;
kono
parents:
diff changeset
34 template<> struct std::tuple_size<A4> { enum { value = 3 }; };
kono
parents:
diff changeset
35 void f4() { auto [ x, y, z ] = a4; } // { dg-error "tuple_element" }
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 struct A5 { } a5;
kono
parents:
diff changeset
38 template <int I> int& get(A5&& a);
kono
parents:
diff changeset
39 template<> struct std::tuple_size<A5> { enum { value = 3 }; };
kono
parents:
diff changeset
40 void f5() { auto [ x, y, z ] = a5; } // { dg-error "tuple_element" }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 struct A6 { } a6;
kono
parents:
diff changeset
43 template <int I> int& get(A6&& a);
kono
parents:
diff changeset
44 template<> struct std::tuple_size<A6> { enum { value = 3 }; };
kono
parents:
diff changeset
45 template<> struct std::tuple_element<0, A6> { };
kono
parents:
diff changeset
46 void f6() { auto [ x, y, z ] = a6; } // { dg-error "no type named .type" }