[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
This revision was not accepted when it landed; it landed in state "Needs Review". This revision was automatically updated to reflect the committed changes. Closed by commit rG591452eb235f: NFC: [clang] add template AST test for make_integer_seq and type_pack_element (authored by mizvekov). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct D<__type_pack_element<0, U, T>> {}; + +template struct E; +template struct
[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
mizvekov updated this revision to Diff 460589. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct D<__type_pack_element<0, U, T>> {}; + +template struct E; +template struct E<__type_pack_element<0, T>> {}; +template struct E<__type_pack_element<0, T, U>> {}; Index: clang/test/SemaTemplate/make_integer_seq.cpp === --- /dev/null +++
[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
mizvekov updated this revision to Diff 460219. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct D<__type_pack_element<0, U, T>> {}; + +template struct E; +template struct E<__type_pack_element<0, T>> {}; +template struct E<__type_pack_element<0, T, U>> {}; Index: clang/test/SemaTemplate/make_integer_seq.cpp === --- /dev/null +++
[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
mizvekov updated this revision to Diff 459364. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct D<__type_pack_element<0, U, T>> {}; + +template struct E; +template struct E<__type_pack_element<0, T>> {}; +template struct E<__type_pack_element<0, T, U>> {}; Index: clang/test/SemaTemplate/make_integer_seq.cpp === --- /dev/null +++
[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
mizvekov updated this revision to Diff 458552. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -triple x86_64-linux-gnu -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct D<__type_pack_element<0, U, T>> {}; + +template struct E; +template struct E<__type_pack_element<0, T>> {}; +template struct E<__type_pack_element<0, T, U>> {}; Index: clang/test/SemaTemplate/make_integer_seq.cpp === --- /dev/null +++
[PATCH] D133261: NFC: [clang] add template AST test for make_integer_seq and type_pack_element
mizvekov retitled this revision from "NFC: [clang] add template substitution AST test for make_integer_seq" to "NFC: [clang] add template AST test for make_integer_seq and type_pack_element". mizvekov edited the summary of this revision. mizvekov updated this revision to Diff 458540. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133261/new/ https://reviews.llvm.org/D133261 Files: clang/test/SemaTemplate/make_integer_seq.cpp clang/test/SemaTemplate/type_pack_element.cpp Index: clang/test/SemaTemplate/type_pack_element.cpp === --- /dev/null +++ clang/test/SemaTemplate/type_pack_element.cpp @@ -0,0 +1,69 @@ +// RUN: %clang_cc1 -std=c++2b -fsyntax-only -ast-dump -verify -xc++ < %s | FileCheck %s + +using test1 = __type_pack_element<0, int>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <:3:1, col:41> col:7 test1 '__type_pack_element<0, int>':'int' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' + +template struct A { + using test2 = __type_pack_element; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test2 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test3 = __type_pack_element<0, Ts...>; +// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, Ts...>' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | |-value: Int 0 +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} 'int' 0 +// CHECK-NEXT: `-TemplateArgument type 'Ts...' +// CHECK-NEXT: `-PackExpansionType 0x{{[0-9A-Fa-f]+}} 'Ts...' dependent +// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'Ts' dependent contains_unexpanded_pack depth 0 index 1 pack +// CHECK-NEXT: `-TemplateTypeParm 0x{{[0-9A-Fa-f]+}} 'Ts' + + using test4 = __type_pack_element; +// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} col:9 test4 '__type_pack_element':'__type_pack_element' +// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' sugar dependent +// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element' dependent __type_pack_element +// CHECK-NEXT: |-TemplateArgument expr +// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} 'unsigned long long' +// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int' +}; + +// FIXME: builtin templates should not participate in deduction +template struct B; // expected-note {{template is declared here}} +template struct B> {}; +template struct B; // expected-error {{explicit instantiation of undefined template}} + +template struct C; // expected-note {{template is declared here}} +template struct C> {}; +template struct C; // expected-error {{explicit instantiation of undefined template}} + +template struct D; +template struct D<__type_pack_element<0, T, U>> {}; +template struct