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