68 lines · cpp
1// RUN: %clang_cc1 -ast-dump -std=c++26 %s | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -std=c++26 -emit-pch -o %t %s5// RUN: %clang_cc1 %s -std=c++26 -include-pch %t -ast-dump-all | FileCheck %s6 7#ifndef PCH_HELPER8#define PCH_HELPER9 10template <unsigned N>11void 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 {{.*}} foo18// CHECK-LABEL: BindingDecl {{.*}} binding_119// CHECK-NEXT: ArraySubscriptExpr {{.*}}20// CHECK-NEXT: ImplicitCastExpr21// CHECK-NEXT: DeclRefExpr {{.*}}22// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 023// CHECK-NOT: BindingDecl24// CHECK-LABEL: BindingDecl {{.*}} binding_rest25// CHECK-NEXT: FunctionParmPackExpr26// CHECK-LABEL: BindingDecl {{.*}} binding_427// CHECK-NEXT: ArraySubscriptExpr28// CHECK-NEXT: ImplicitCastExpr {{.*}}29// CHECK-NEXT: DeclRefExpr {{.*}} lvalue Decomposition {{.*}}30// CHECK-NEXT: IntegerLiteral {{.*}} 'int' 331// CHECK-NOT: BindingDecl32// CHECK-LABEL: VarDecl {{.*}} arr_233// CHECK-NEXT: InitListExpr34// CHECK-NEXT: PackExpansionExpr {{.*}} '<dependent type>' lvalue35// CHECK-NEXT: DeclRefExpr {{.*}} lvalue Binding {{.*}} 'binding_rest'36 37struct tag_t { };38template <unsigned N>39void bar() {40 auto [...empty_binding_pack] = tag_t{};41 static_assert(sizeof...(empty_binding_pack) == 0);42};43 44// CHECK-LABEL: FunctionTemplateDecl {{.*}} bar45// CHECK-NOT: BindingDecl46// CHECK-LABEL: BindingDecl {{.*}} empty_binding_pack47// CHECK-NEXT: FunctionParmPackExpr48// CHECK: DeclStmt49 50struct int_pair { int x; int y; };51template <typename T>52void baz() {53 auto [binding_1, binding_2, ...empty_binding_pack] = T{};54 static_assert(sizeof...(empty_binding_pack) == 0);55};56 57void(*f)() = baz<int_pair>;58 59// CHECK-LABEL: FunctionDecl {{.*}} baz {{.*}} implicit_instantiation60// CHECK-NEXT: TemplateArgument type 'int_pair'61// CHECK: BindingDecl {{.*}} binding_162// CHECK: BindingDecl {{.*}} binding_263// CHECK-NOT: BindingDecl64// CHECK-LABEL: BindingDecl {{.*}} empty_binding_pack65// CHECK-NEXT: FunctionParmPackExpr66// CHECK: DeclStmt67#endif68