1 // RUN: %clang_cc1 -std=c++23 -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 alias 9 // CHECK-NEXT: |-name: '__make_integer_seq' qualified 10 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 11 // CHECK-NEXT: |-TemplateArgument template 'A' 12 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A 13 // CHECK-NEXT: |-TemplateArgument type 'int' 14 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 15 // CHECK-NEXT: |-TemplateArgument expr '1' 16 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int' 17 // CHECK-NEXT: | |-value: Int 1 18 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1 19 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar 20 // CHECK-NEXT: |-name: 'A' qualified 21 // CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A 22 // CHECK-NEXT: |-TemplateArgument type 'int' 23 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 24 // CHECK-NEXT: |-TemplateArgument expr '0' 25 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int' 26 // CHECK-NEXT: | |-value: Int 0 27 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 0 28 // CHECK-NEXT: `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' 29 // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A' 30 31 template <class B1, B1 B2> using B = __make_integer_seq<A, B1, B2>; 32 using test2 = B<int, 1>; 33 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:23> col:7 test2 'B<int, 1>':'A<int, 0>' 34 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar 35 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar alias 36 // CHECK-NEXT: |-name: 'B' qualified 37 // CHECK-NEXT: | `-TypeAliasTemplateDecl {{.+}} B 38 // CHECK-NEXT: |-TemplateArgument type 'int' 39 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 40 // CHECK-NEXT: |-TemplateArgument expr '1' 41 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:22> 'int' 42 // CHECK-NEXT: | |-value: Int 1 43 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:22> 'int' 1 44 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar 45 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias 46 // CHECK-NEXT: |-name: '__make_integer_seq' qualified 47 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 48 // CHECK-NEXT: |-TemplateArgument template 'A' 49 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A 50 // CHECK-NEXT: |-TemplateArgument type 'int' 51 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 52 // CHECK-NEXT: |-TemplateArgument expr '1' 53 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:64> 'int' 54 // CHECK-NEXT: | |-value: Int 1 55 // CHECK-NEXT: | `-SubstNonTypeTemplateParmExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 56 // CHECK-NEXT: | |-NonTypeTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <col:21, col:24> col:24 referenced 'B1' depth 0 index 1 B2 57 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 1 58 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar 59 // CHECK-NEXT: |-name: 'A' qualified 60 // CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A 61 // CHECK-NEXT: |-TemplateArgument type 'int' 62 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 63 // CHECK-NEXT: |-TemplateArgument expr '0' 64 // CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:64> 'int' 65 // CHECK-NEXT: | |-value: Int 0 66 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 0 67 // CHECK-NEXT: `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' 68 // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A' 69 70 template <template <class T, T...> class S, class T, int N> struct C { 71 using test3 = __make_integer_seq<S, T, N>; 72 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>' 73 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent 74 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent alias 75 // CHECK-NEXT: |-name: '__make_integer_seq' qualified 76 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 77 // CHECK-NEXT: |-TemplateArgument template 'S' 78 // CHECK-NEXT: | | `-TemplateTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:11, col:42> col:42 depth 0 index 0 S 79 // CHECK-NEXT: |-TemplateArgument type 'T' 80 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 1 81 // 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 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>' dependent 86 // CHECK-NEXT: |-name: '__make_integer_seq' 87 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 88 // CHECK-NEXT: |-TemplateArgument template 'template-parameter-0-0' 89 // CHECK-NEXT: | `-TemplateTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> depth 0 index 0 90 // CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-1' 91 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent depth 0 index 1 92 // CHECK-NEXT: `-TemplateArgument expr 'N' 93 // CHECK-NEXT: `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'T' <Dependent> 94 // CHECK-NEXT: `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 95 96 using test4 = __make_integer_seq<A, T, 1>; 97 // CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test4 '__make_integer_seq<A, T, 1>':'__make_integer_seq<A, type-parameter-0-1, 1>' 98 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent 99 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent alias 100 // CHECK-NEXT: |-name: '__make_integer_seq' qualified 101 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 102 // CHECK-NEXT: |-TemplateArgument template 'A' 103 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A 104 // CHECK-NEXT: |-TemplateArgument type 'T' 105 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'T' dependent depth 0 index 1 106 // CHECK-NEXT: | `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'T' 107 // CHECK-NEXT: |-TemplateArgument expr '1' 108 // CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent> 109 // CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1 110 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, type-parameter-0-1, 1>' dependent 111 // CHECK-NEXT: |-name: '__make_integer_seq' 112 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 113 // CHECK-NEXT: |-TemplateArgument template 'A' 114 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A 115 // CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-1' 116 // CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent depth 0 index 1 117 // CHECK-NEXT: `-TemplateArgument expr '1' 118 // CHECK-NEXT: `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent> 119 // CHECK-NEXT: `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1 120 121 using test5 = __make_integer_seq<A, int, N>; 122 // CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>' 123 // CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent 124 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent alias 125 // CHECK-NEXT: |-name: '__make_integer_seq' qualified 126 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 127 // CHECK-NEXT: |-TemplateArgument template 'A' 128 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} <line:{{.+}}:1, col:41> col:38 A 129 // CHECK-NEXT: |-TemplateArgument type 'int' 130 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 131 // CHECK-NEXT: |-TemplateArgument expr 'N' 132 // CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:44> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 133 // CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' dependent 134 // CHECK-NEXT: |-name: '__make_integer_seq' 135 // CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq 136 // CHECK-NEXT: |-TemplateArgument template 'A' 137 // CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A 138 // CHECK-NEXT: |-TemplateArgument type 'int' 139 // CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' 140 // CHECK-NEXT: `-TemplateArgument expr 'N' 141 // CHECK-NEXT: `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:44> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' 142 }; 143 144 // expected-no-diagnostics 145 146 template <class T, class S> struct D; 147 template <class T> struct D<T, __make_integer_seq<A, int, sizeof(T)>> {}; 148 template struct D<char, A<int, 0>>; 149 150 template <class T, class S> struct E; 151 template <class T> struct E<T, __make_integer_seq<A, T, 2>> {}; 152 template struct E<short, A<short, 0, 1>>; 153 154 template <template <class A1, A1... A2> class T, class S> struct F; 155 template <template <class A1, A1... A2> class T> struct F<T, __make_integer_seq<T, long, 3>> {}; 156 template struct F<A, A<long, 0, 1, 2>>; 157 158 template <class T> struct G; 159 template <class T> struct G<__make_integer_seq<A, T, 1>> {}; 160 template <class T> struct G<__make_integer_seq<A, T, 1U>> {}; 161 162 template <int S, class = __make_integer_seq<A, int, S>> struct H; 163 template <int S, int... Is> struct H<S, A<int, Is...>> { }; 164 165 template <int S> void h(H<S>); 166 void test_h() { h(H<5>{}); } 167