Skip to content

Commit 591452e

Browse files
committed
NFC: [clang] add template AST test for make_integer_seq and type_pack_element
Signed-off-by: Matheus Izvekov <[email protected]> Differential Revision: https://reviews.llvm.org/D133261
1 parent 1b69ce1 commit 591452e

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s
2+
3+
template <class A1, A1... A2> struct A {};
4+
5+
using test1 = __make_integer_seq<A, int, 1>;
6+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:5:1, col:43> col:7 test1 '__make_integer_seq<A, int, 1>':'A<int, 0>'
7+
// CHECK-NEXT: | `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar
8+
// CHECK-NEXT: | `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar __make_integer_seq
9+
// CHECK-NEXT: | |-TemplateArgument template A
10+
// CHECK-NEXT: | |-TemplateArgument type 'int'
11+
// CHECK-NEXT: | | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
12+
// CHECK-NEXT: | |-TemplateArgument expr
13+
// CHECK-NEXT: | | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int'
14+
// CHECK-NEXT: | | |-value: Int 1
15+
// CHECK-NEXT: | | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1
16+
// CHECK-NEXT: | `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'
17+
// CHECK-NEXT: | `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A'
18+
19+
template <class B1, B1 B2> using B = __make_integer_seq<A, B1, B2>;
20+
using test2 = B<int, 1>;
21+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:20:1, col:23> col:7 test2 'B<int, 1>':'A<int, 0>'
22+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar
23+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar alias B
24+
// CHECK-NEXT: |-TemplateArgument type 'int'
25+
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
26+
// CHECK-NEXT: |-TemplateArgument expr
27+
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:22> 'int'
28+
// CHECK-NEXT: | |-value: Int 1
29+
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:22> 'int' 1
30+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar
31+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar __make_integer_seq
32+
// CHECK-NEXT: |-TemplateArgument template A
33+
// CHECK-NEXT: |-TemplateArgument type 'int':'int'
34+
// CHECK-NEXT: | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar
35+
// CHECK-NEXT: | |-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'B1' dependent depth 0 index 0
36+
// CHECK-NEXT: | | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'B1'
37+
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
38+
// CHECK-NEXT: |-TemplateArgument expr
39+
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:19:64> 'int'
40+
// CHECK-NEXT: | |-value: Int 1
41+
// CHECK-NEXT: | `-SubstNonTypeTemplateParmExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int'
42+
// CHECK-NEXT: | |-NonTypeTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <col:21, col:24> col:24 referenced 'B1' depth 0 index 1 B2
43+
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 1
44+
// CHECK-NEXT: `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'
45+
// CHECK-NEXT: `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A'
46+
47+
template <template <class T, T...> class S, class T, int N> struct C {
48+
using test3 = __make_integer_seq<S, T, N>;
49+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:48:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<S, T, N>'
50+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent
51+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' dependent __make_integer_seq
52+
// CHECK-NEXT: |-TemplateArgument template S
53+
// CHECK-NEXT: |-TemplateArgument type 'T'
54+
// CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 1
55+
// CHECK-NEXT: | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'T'
56+
// CHECK-NEXT: `-TemplateArgument expr
57+
// CHECK-NEXT: `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'type-parameter-0-1':'type-parameter-0-1' <Dependent>
58+
// CHECK-NEXT: `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
59+
60+
using test4 = __make_integer_seq<A, T, 1>;
61+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:60:3, col:43> col:9 test4 '__make_integer_seq<A, T, 1>':'__make_integer_seq<A, T, 1>'
62+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent
63+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' dependent __make_integer_seq
64+
// CHECK-NEXT: |-TemplateArgument template A
65+
// CHECK-NEXT: |-TemplateArgument type 'T'
66+
// CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 1
67+
// CHECK-NEXT: | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'T'
68+
// CHECK-NEXT: `-TemplateArgument expr
69+
// CHECK-NEXT: `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'type-parameter-0-1':'type-parameter-0-1' <Dependent>
70+
// CHECK-NEXT: `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1
71+
72+
using test5 = __make_integer_seq<A, int, N>;
73+
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:72:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>':'__make_integer_seq<A, int, N>'
74+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent
75+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' dependent __make_integer_seq
76+
// CHECK-NEXT: |-TemplateArgument template A
77+
// CHECK-NEXT: |-TemplateArgument type 'int'
78+
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
79+
// CHECK-NEXT: `-TemplateArgument expr
80+
// CHECK-NEXT: `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:44> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
81+
};
82+
83+
template <class T, class S> struct D; // expected-note {{template is declared here}}
84+
template <class T> struct D<T, __make_integer_seq<A, int, sizeof(T)>> {};
85+
template struct D<char, A<int, 0>>; // expected-error {{explicit instantiation of undefined template}}
86+
87+
template <class T, class S> struct E; // expected-note {{template is declared here}}
88+
template <class T> struct E<T, __make_integer_seq<A, T, 2>> {};
89+
template struct E<short, A<short, 0, 1>>; // expected-error {{explicit instantiation of undefined template}}
90+
91+
template <template <class A1, A1... A2> class T, class S> struct F; // expected-note {{template is declared here}}
92+
template <template <class A1, A1... A2> class T> struct F<T, __make_integer_seq<T, long, 3>> {};
93+
template struct F<A, A<long, 0, 1, 2>>; // expected-error {{explicit instantiation of undefined template}}
94+
95+
template <class T> struct G;
96+
template <class T> struct G<__make_integer_seq<A, T, 1>> {};
97+
template <class T> struct G<__make_integer_seq<A, T, 1U>> {};
98+
99+
template <int S, class = __make_integer_seq<A, int, S>> struct H;
100+
template <int S, int... Is> struct H<S, A<int, Is...>> { };
101+
102+
template <int S> void h(H<S>); // expected-note {{could not match '__make_integer_seq' against 'A'}}
103+
void test_h() { h(H<5>{}); } // expected-error {{no matching function for call to 'h'}}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// RUN: %clang_cc1 -std=c++2b -fsyntax-only -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 __type_pack_element
7+
// CHECK-NEXT: |-TemplateArgument expr
8+
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:35> 'unsigned long'
9+
// CHECK-NEXT: | |-value: Int 0
10+
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:35> 'unsigned long' <IntegralCast>
11+
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:35> 'int' 0
12+
// CHECK-NEXT: |-TemplateArgument type 'int'
13+
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
14+
// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
15+
16+
template<int N, class ...Ts> struct A {
17+
using test2 = __type_pack_element<N, Ts...>;
18+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:17:3, col:45> col:9 test2 '__type_pack_element<N, Ts...>':'__type_pack_element<N, Ts...>'
19+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent
20+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' dependent __type_pack_element
21+
// CHECK-NEXT: |-TemplateArgument expr
22+
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
23+
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
24+
// CHECK-NEXT: `-TemplateArgument type 'Ts...'
25+
// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent
26+
// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack
27+
// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts'
28+
29+
using test3 = __type_pack_element<0, Ts...>;
30+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:29:3, col:45> col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>'
31+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent
32+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element
33+
// CHECK-NEXT: |-TemplateArgument expr
34+
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long'
35+
// CHECK-NEXT: | |-value: Int 0
36+
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
37+
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:37> 'int' 0
38+
// CHECK-NEXT: `-TemplateArgument type 'Ts...'
39+
// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent
40+
// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack
41+
// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts'
42+
43+
using test4 = __type_pack_element<N, int>;
44+
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:43:3, col:43> col:9 test4 '__type_pack_element<N, int>':'__type_pack_element<N, int>'
45+
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent
46+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' dependent __type_pack_element
47+
// CHECK-NEXT: |-TemplateArgument expr
48+
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
49+
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
50+
// CHECK-NEXT: `-TemplateArgument type 'int'
51+
// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
52+
};
53+
54+
template <class T, class S> struct B; // expected-note {{template is declared here}}
55+
template <class T> struct B<T, __type_pack_element<sizeof(T), void, long>> {};
56+
template struct B<char, long>; // expected-error {{explicit instantiation of undefined template}}
57+
58+
template <class T, class S> struct C; // expected-note {{template is declared here}}
59+
template <class T> struct C<T, __type_pack_element<0, T, short>> {};
60+
template struct C<int, int>; // expected-error {{explicit instantiation of undefined template}}
61+
62+
template <class T> struct D;
63+
template <class T, class U> struct D<__type_pack_element<0, T, U>> {};
64+
template <class T, class U> struct D<__type_pack_element<0, U, T>> {};
65+
66+
template <class T> struct E;
67+
template <class T> struct E<__type_pack_element<0, T>> {};
68+
template <class T, class U> struct E<__type_pack_element<0, T, U>> {};

0 commit comments

Comments
 (0)