xref: /llvm-project/clang/test/AST/ast-dump-binding-pack.cpp (revision abc8812df02599fc413d9ed77b992f8236ed2af9)
1 // RUN: %clang_cc1 -ast-dump -std=c++26 %s | FileCheck %s
2 
3 // Test this with PCH.
4 // RUN: %clang_cc1 %s -std=c++26 -emit-pch -o %t %s
5 // RUN: %clang_cc1 %s -std=c++26 -include-pch %t -ast-dump-all | FileCheck %s
6 
7 #ifndef PCH_HELPER
8 #define PCH_HELPER
9 
10 template <unsigned N>
11 void foo() {
12   int arr[4] = {1, 2, 3, 4};
13   auto [binding_1, ...binding_rest, binding_4] = arr;
14   int arr_2[] = {binding_rest...};
15 };
16 
17 // CHECK-LABEL: FunctionTemplateDecl {{.*}} foo
18 // CHECK-LABEL: BindingDecl {{.*}} binding_1
19 // CHECK-NEXT: ArraySubscriptExpr {{.*}}
20 // CHECK-NEXT: ImplicitCastExpr
21 // CHECK-NEXT: DeclRefExpr {{.*}}
22 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 0
23 // CHECK-NOT: BindingDecl
24 // CHECK-LABEL: BindingDecl {{.*}} binding_rest
25 // CHECK-NEXT: ResolvedUnexpandedPackExpr
26 // CHECK-NEXT: DeclRefExpr {{.*}} lvalue Binding {{.*}} 'binding_rest'
27 // CHECK-NEXT: DeclRefExpr {{.*}} lvalue Binding {{.*}} 'binding_rest'
28 // CHECK-NOT: BindingDecl
29 // CHECK-LABEL: BindingDecl {{.*}} binding_4
30 // CHECK-NEXT: ArraySubscriptExpr
31 // CHECK-NEXT: ImplicitCastExpr {{.*}}
32 // CHECK-NEXT: DeclRefExpr {{.*}} lvalue Decomposition {{.*}}
33 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3
34 // CHECK-NOT: BindingDecl
35 // CHECK-LABEL: VarDecl {{.*}} arr_2
36 // CHECK-NEXT: InitListExpr
37 // CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>' lvalue
38 // CHECK-NEXT: DeclRefExpr {{.*}} lvalue Binding {{.*}} 'binding_rest'
39 
40 struct tag_t { };
41 template <unsigned N>
42 void bar() {
43   auto [...empty_binding_pack] = tag_t{};
44   static_assert(sizeof...(empty_binding_pack) == 0);
45 };
46 
47 // CHECK-LABEL: FunctionTemplateDecl {{.*}} bar
48 // CHECK-NOT: BindingDecl
49 // CHECK-LABEL: BindingDecl {{.*}} empty_binding_pack
50 // CHECK-NEXT: ResolvedUnexpandedPackExpr
51 // CHECK-NOT: DeclRefExpr {{.*}} 'empty_binding_pack'
52 // CHECK-NOT: BindingDecl
53 // CHECK: DeclStmt
54 
55 struct int_pair { int x; int y; };
56 template <typename T>
57 void baz() {
58   auto [binding_1, binding_2, ...empty_binding_pack] = T{};
59   static_assert(sizeof...(empty_binding_pack) == 0);
60 };
61 
62 void(*f)() = baz<int_pair>;
63 
64 // CHECK-LABEL: FunctionDecl {{.*}} baz {{.*}} implicit_instantiation
65 // CHECK-NEXT: TemplateArgument type 'int_pair'
66 // CHECK: BindingDecl {{.*}} binding_1
67 // CHECK: BindingDecl {{.*}} binding_2
68 // CHECK-NOT: BindingDecl
69 // CHECK-LABEL: BindingDecl {{.*}} empty_binding_pack
70 // CHECK-NEXT: ResolvedUnexpandedPackExpr
71 // CHECK-NOT: DeclRefExpr {{.*}} 'empty_binding_pack'
72 // CHECK-NOT: BindingDecl
73 // CHECK: DeclStmt
74 #endif
75