brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 1203a58 Raw
136 lines · cpp
1// RUN: %clang_cc1 -std=c++23 -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s2 3template <class A1, A1... A2> struct A {};4 5using 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:   `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias8// CHECK-NEXT:     |-name: '__make_integer_seq' qualified9// CHECK-NEXT:     | `-BuiltinTemplateDecl {{.+}} __make_integer_seq10// CHECK-NEXT:     |-TemplateArgument template 'A'11// CHECK-NEXT:     | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A12// CHECK-NEXT:     |-TemplateArgument type 'int'13// CHECK-NEXT:     | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'14// CHECK-NEXT:     |-TemplateArgument expr '1'15// CHECK-NEXT:     | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int'16// CHECK-NEXT:     |   |-value: Int 117// CHECK-NEXT:     |   `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 118// CHECK-NEXT:     `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar19// CHECK-NEXT:       |-name: 'A' qualified20// CHECK-NEXT:       | `-ClassTemplateDecl {{.+}} A21// CHECK-NEXT:       |-TemplateArgument type 'int'22// CHECK-NEXT:       | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'23// CHECK-NEXT:       |-TemplateArgument expr '0'24// CHECK-NEXT:       | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int'25// CHECK-NEXT:       |   |-value: Int 026// CHECK-NEXT:       |   `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 027// CHECK-NEXT:       `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'28// CHECK-NEXT:         `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A'29 30template <class B1, B1 B2> using B = __make_integer_seq<A, B1, B2>;31using test2 = B<int, 1>;32//      CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:23> col:7 test2 'B<int, 1>':'A<int, 0>'33// CHECK-NEXT:   `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar alias34// CHECK-NEXT:     |-name: 'B' qualified35// CHECK-NEXT:     | `-TypeAliasTemplateDecl {{.+}} B36// CHECK-NEXT:     |-TemplateArgument type 'int'37// CHECK-NEXT:     | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'38// CHECK-NEXT:     |-TemplateArgument expr '1'39// CHECK-NEXT:     | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:22> 'int'40// CHECK-NEXT:     |   |-value: Int 141// CHECK-NEXT:     |   `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:22> 'int' 142// CHECK-NEXT:     `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias43// CHECK-NEXT:       |-name: '__make_integer_seq' qualified44// CHECK-NEXT:       | `-BuiltinTemplateDecl {{.+}} __make_integer_seq45// CHECK-NEXT:       |-TemplateArgument template 'A'46// CHECK-NEXT:       | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A47// CHECK-NEXT:       |-TemplateArgument type 'int'48// CHECK-NEXT:       | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar class depth 0 index 0 B1 final49// CHECK-NEXT:       |   |-TypeAliasTemplate 0x{{[0-9A-Fa-f]+}} 'B'50// CHECK-NEXT:       |   `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'51// CHECK-NEXT:       |-TemplateArgument expr '1'52// CHECK-NEXT:       | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:64> 'int'53// CHECK-NEXT:       |   |-value: Int 154// CHECK-NEXT:       |   `-SubstNonTypeTemplateParmExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int'55// CHECK-NEXT:       |     |-NonTypeTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <col:21, col:24> col:24 referenced 'B1' depth 0 index 1 B256// CHECK-NEXT:       |     `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 157// CHECK-NEXT:       `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar58// CHECK-NEXT:         |-name: 'A' qualified59// CHECK-NEXT:         | `-ClassTemplateDecl {{.+}} A60// CHECK-NEXT:         |-TemplateArgument type 'int'61// CHECK-NEXT:         | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar class depth 0 index 0 B1 final62// CHECK-NEXT:         |   |-TypeAliasTemplate 0x{{[0-9A-Fa-f]+}} 'B'63// CHECK-NEXT:         |   `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'64// CHECK-NEXT:         |-TemplateArgument expr '0'65// CHECK-NEXT:         | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:64> 'int'66// CHECK-NEXT:         |   |-value: Int 067// CHECK-NEXT:         |   `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 068// CHECK-NEXT:         `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'69// CHECK-NEXT:           `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A'70 71template <template <class T, T...> class S, class T, int N> struct C {72  using test3 = __make_integer_seq<S, T, N>;73//      CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>'74// CHECK-NEXT:   `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' dependent75// CHECK-NEXT:     |-name: '__make_integer_seq'76// CHECK-NEXT:     | `-BuiltinTemplateDecl {{.+}} __make_integer_seq77// CHECK-NEXT:     |-TemplateArgument template 'S'78// CHECK-NEXT:     | | `-TemplateTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:11, col:42> col:42 depth 0 index 0 S79// CHECK-NEXT:     |-TemplateArgument type 'T'80// CHECK-NEXT:     | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 181// CHECK-NEXT:     |   `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'T'82// CHECK-NEXT:     `-TemplateArgument expr 'N'83// CHECK-NEXT:       `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent>84// CHECK-NEXT:         `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'85 86  using test4 = __make_integer_seq<A, T, 1>;87//      CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test4 '__make_integer_seq<A, T, 1>'88// CHECK-NEXT:   `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' dependent89// CHECK-NEXT:     |-name: '__make_integer_seq'90// CHECK-NEXT:     | `-BuiltinTemplateDecl {{.+}} __make_integer_seq91// CHECK-NEXT:     |-TemplateArgument template 'A'92// CHECK-NEXT:     | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A93// CHECK-NEXT:     |-TemplateArgument type 'T'94// CHECK-NEXT:     | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 195// CHECK-NEXT:     |   `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'T'96// CHECK-NEXT:     `-TemplateArgument expr '1'97// CHECK-NEXT:       `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent>98// CHECK-NEXT:         `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 199 100  using test5 = __make_integer_seq<A, int, N>;101//      CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>'102// CHECK-NEXT:   `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' dependent103// CHECK-NEXT:     |-name: '__make_integer_seq'104// CHECK-NEXT:     | `-BuiltinTemplateDecl {{.+}} __make_integer_seq105// CHECK-NEXT:     |-TemplateArgument template 'A'106// CHECK-NEXT:     | `-ClassTemplateDecl 0x{{.+}} <line:{{.+}}:1, col:41> col:38 A107// CHECK-NEXT:     |-TemplateArgument type 'int'108// CHECK-NEXT:     | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'109// CHECK-NEXT:     `-TemplateArgument expr 'N'110// CHECK-NEXT:       `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:44> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'111};112 113// expected-no-diagnostics114 115template <class T, class S> struct D;116template <class T> struct D<T, __make_integer_seq<A, int, sizeof(T)>> {};117template struct D<char, A<int, 0>>;118 119template <class T, class S> struct E;120template <class T> struct E<T, __make_integer_seq<A, T, 2>> {};121template struct E<short, A<short, 0, 1>>;122 123template <template <class A1, A1... A2> class T, class S> struct F;124template <template <class A1, A1... A2> class T> struct F<T, __make_integer_seq<T, long, 3>> {};125template struct F<A, A<long, 0, 1, 2>>;126 127template <class T> struct G;128template <class T> struct G<__make_integer_seq<A, T, 1>> {};129template <class T> struct G<__make_integer_seq<A, T, 1U>> {};130 131template <int S, class = __make_integer_seq<A, int, S>> struct H;132template <int S, int... Is> struct H<S, A<int, Is...>> { };133 134template <int S> void h(H<S>);135void test_h() { h(H<5>{}); }136