xref: /llvm-project/clang/test/SemaTemplate/type_pack_element.cpp (revision 3cabbf60393cc8d55fe635e35e89e5973162de33)
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