annotate clang/test/SemaTemplate/cxx1z-decomposition.cpp @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -std=c++1z -verify %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 struct A { int x, y; };
anatofuz
parents:
diff changeset
4 typedef int B[2];
anatofuz
parents:
diff changeset
5 struct C { template<int> int get(); };
anatofuz
parents:
diff changeset
6 struct D { int x, y, z; };
anatofuz
parents:
diff changeset
7 struct E { int *p, n; };
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 namespace std {
anatofuz
parents:
diff changeset
10 using size_t = decltype(sizeof(0));
anatofuz
parents:
diff changeset
11 template<typename> struct tuple_size;
anatofuz
parents:
diff changeset
12 template<size_t, typename> struct tuple_element { using type = int; };
anatofuz
parents:
diff changeset
13 }
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 template<> struct std::tuple_size<C> { enum { value = 2 }; };
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 template<typename T> int decomp(T &t) {
anatofuz
parents:
diff changeset
18 auto &[a, b] = t; // expected-error {{type 'D' decomposes into 3 elements, but only 2 names were provided}}
anatofuz
parents:
diff changeset
19 return a + b; // expected-error {{cannot initialize return object of type 'int' with an rvalue of type 'int *'}}
anatofuz
parents:
diff changeset
20 }
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 void test() {
anatofuz
parents:
diff changeset
23 A a;
anatofuz
parents:
diff changeset
24 B b;
anatofuz
parents:
diff changeset
25 C c;
anatofuz
parents:
diff changeset
26 D d;
anatofuz
parents:
diff changeset
27 E e;
anatofuz
parents:
diff changeset
28 decomp(a);
anatofuz
parents:
diff changeset
29 decomp(b);
anatofuz
parents:
diff changeset
30 decomp(c);
anatofuz
parents:
diff changeset
31 decomp(d); // expected-note {{in instantiation of}}
anatofuz
parents:
diff changeset
32 decomp(e); // expected-note {{in instantiation of}}
anatofuz
parents:
diff changeset
33 }