1 // RUN: %clang_cc1 -std=c++23 -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s 2 3 using test1 = __type_pack_element<0, int>; 4 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <<stdin>:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' 5 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar 6 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar alias 7 // CHECK-NEXT: |-name: '__type_pack_element' qualified 8 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 9 // CHECK-NEXT: |-TemplateArgument expr '0' 10 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:35> 'unsigned long' 11 // CHECK-NEXT: | |-value: Int 0 12 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:35> 'unsigned long' <IntegralCast> 13 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:35> 'int' 0 14 // CHECK-NEXT: |-TemplateArgument type 'int' 15 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 16 // CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 17 18 template<int N, class ...Ts> struct A { 19 using test2 = __type_pack_element<N, Ts...>; 20 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:45> col:9 test2 '__type_pack_element<N, Ts...>':'__type_pack_element<N, type-parameter-0-1...>' 21 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent 22 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent alias 23 // CHECK-NEXT: |-name: '__type_pack_element' qualified 24 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 25 // CHECK-NEXT: |-TemplateArgument expr 'N' 26 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast> 27 // CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 28 // CHECK-NEXT: |-TemplateArgument type 'Ts...' 29 // CHECK-NEXT: | `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent 30 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack 31 // CHECK-NEXT: | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' 32 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, type-parameter-0-1...>' dependent 33 // CHECK-NEXT: |-name: '__type_pack_element' 34 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 35 // CHECK-NEXT: |-TemplateArgument expr 'N' 36 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast> 37 // CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 38 // CHECK-NEXT: `-TemplateArgument pack '<type-parameter-0-1...>' 39 // CHECK-NEXT: `-TemplateArgument type 'type-parameter-0-1...' 40 // CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1...' dependent 41 // CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent contains_unexpanded_pack depth 0 index 1 pack 42 43 using test3 = __type_pack_element<0, Ts...>; 44 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:45> col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, type-parameter-0-1...>' 45 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent 46 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent alias 47 // CHECK-NEXT: |-name: '__type_pack_element' qualified 48 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 49 // CHECK-NEXT: |-TemplateArgument expr '0' 50 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' 51 // CHECK-NEXT: | |-value: Int 0 52 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast> 53 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:37> 'int' 0 54 // CHECK-NEXT: |-TemplateArgument type 'Ts...' 55 // CHECK-NEXT: | `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent 56 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack 57 // CHECK-NEXT: | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' 58 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, type-parameter-0-1...>' dependent 59 // CHECK-NEXT: |-name: '__type_pack_element' 60 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 61 // CHECK-NEXT: |-TemplateArgument integral '0UL' 62 // CHECK-NEXT: `-TemplateArgument pack '<type-parameter-0-1...>' 63 // CHECK-NEXT: `-TemplateArgument type 'type-parameter-0-1...' 64 // CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1...' dependent 65 // CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent contains_unexpanded_pack depth 0 index 1 pack 66 67 using test4 = __type_pack_element<N, int>; 68 // CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test4 '__type_pack_element<N, int>' 69 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent 70 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent alias 71 // CHECK-NEXT: |-name: '__type_pack_element' qualified 72 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 73 // CHECK-NEXT: |-TemplateArgument expr 'N' 74 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast> 75 // CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 76 // CHECK-NEXT: |-TemplateArgument type 'int' 77 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 78 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' dependent 79 // CHECK-NEXT: |-name: '__type_pack_element' 80 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element 81 // CHECK-NEXT: |-TemplateArgument expr 'N' 82 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast> 83 // CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 84 // CHECK-NEXT: `-TemplateArgument pack '<int>' 85 // CHECK-NEXT: `-TemplateArgument type 'int' 86 // CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 87 }; 88 89 // expected-no-diagnostics 90 91 template <class T, class S> struct B; 92 template <class T> struct B<T, __type_pack_element<sizeof(T), void, long>> {}; 93 template struct B<char, long>; 94 95 template <class T, class S> struct C; 96 template <class T> struct C<T, __type_pack_element<0, T, short>> {}; 97 template struct C<int, int>; 98 99 template <class T> struct D; 100 template <class T, class U> struct D<__type_pack_element<0, T, U>> {}; 101 template <class T, class U> struct D<__type_pack_element<0, U, T>> {}; 102 103 template <class T> struct E; 104 template <class T> struct E<__type_pack_element<0, T>> {}; 105 template <class T, class U> struct E<__type_pack_element<0, T, U>> {}; 106