mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 09:16:31 +00:00
[clang] text ast-dumper: dump TemplateName for TST and DTST (#93766)
Implement AST text dumping of the TemplateName for TemplateSpecializationType and DeducedTemplateSpecializationType.
This commit is contained in:
parent
1034b4d38d
commit
3cabbf6039
@ -360,6 +360,10 @@ public:
|
||||
static TemplateName getFromVoidPointer(void *Ptr) {
|
||||
return TemplateName(Ptr);
|
||||
}
|
||||
|
||||
/// Structural equality.
|
||||
bool operator==(TemplateName Other) const { return Storage == Other.Storage; }
|
||||
bool operator!=(TemplateName Other) const { return !operator==(Other); }
|
||||
};
|
||||
|
||||
/// Insertion operator for diagnostics. This allows sending TemplateName's
|
||||
|
@ -214,7 +214,8 @@ public:
|
||||
void dumpNestedNameSpecifier(const NestedNameSpecifier *NNS);
|
||||
void dumpConceptReference(const ConceptReference *R);
|
||||
void dumpTemplateArgument(const TemplateArgument &TA);
|
||||
void dumpTemplateName(TemplateName TN);
|
||||
void dumpBareTemplateName(TemplateName TN);
|
||||
void dumpTemplateName(TemplateName TN, StringRef Label = {});
|
||||
|
||||
void dumpDeclRef(const Decl *D, StringRef Label = {});
|
||||
|
||||
|
@ -1126,7 +1126,32 @@ void TextNodeDumper::VisitIntegralTemplateArgument(const TemplateArgument &TA) {
|
||||
dumpTemplateArgument(TA);
|
||||
}
|
||||
|
||||
void TextNodeDumper::dumpTemplateName(TemplateName TN) {
|
||||
void TextNodeDumper::dumpTemplateName(TemplateName TN, StringRef Label) {
|
||||
AddChild(Label, [=] {
|
||||
{
|
||||
llvm::SmallString<128> Str;
|
||||
{
|
||||
llvm::raw_svector_ostream SS(Str);
|
||||
TN.print(SS, PrintPolicy);
|
||||
}
|
||||
OS << " '" << Str << "'";
|
||||
|
||||
if (TemplateName CanonTN = Context->getCanonicalTemplateName(TN);
|
||||
CanonTN != TN) {
|
||||
llvm::SmallString<128> CanonStr;
|
||||
{
|
||||
llvm::raw_svector_ostream SS(CanonStr);
|
||||
CanonTN.print(SS, PrintPolicy);
|
||||
}
|
||||
if (CanonStr != Str)
|
||||
OS << ":'" << CanonStr << "'";
|
||||
}
|
||||
}
|
||||
dumpBareTemplateName(TN);
|
||||
});
|
||||
}
|
||||
|
||||
void TextNodeDumper::dumpBareTemplateName(TemplateName TN) {
|
||||
switch (TN.getKind()) {
|
||||
case TemplateName::Template:
|
||||
AddChild([=] { Visit(TN.getAsTemplateDecl()); });
|
||||
@ -1143,7 +1168,7 @@ void TextNodeDumper::dumpTemplateName(TemplateName TN) {
|
||||
if (QTN->hasTemplateKeyword())
|
||||
OS << " keyword";
|
||||
dumpNestedNameSpecifier(QTN->getQualifier());
|
||||
dumpTemplateName(QTN->getUnderlyingTemplate());
|
||||
dumpBareTemplateName(QTN->getUnderlyingTemplate());
|
||||
return;
|
||||
}
|
||||
case TemplateName::DependentTemplate: {
|
||||
@ -1162,7 +1187,7 @@ void TextNodeDumper::dumpTemplateName(TemplateName TN) {
|
||||
if (const TemplateTemplateParmDecl *P = STS->getParameter())
|
||||
AddChild("parameter", [=] { Visit(P); });
|
||||
dumpDeclRef(STS->getAssociatedDecl(), "associated");
|
||||
AddChild("replacement", [=] { dumpTemplateName(STS->getReplacement()); });
|
||||
dumpTemplateName(STS->getReplacement(), "replacement");
|
||||
return;
|
||||
}
|
||||
// FIXME: Implement these.
|
||||
@ -1182,14 +1207,14 @@ void TextNodeDumper::dumpTemplateName(TemplateName TN) {
|
||||
void TextNodeDumper::VisitTemplateTemplateArgument(const TemplateArgument &TA) {
|
||||
OS << " template";
|
||||
dumpTemplateArgument(TA);
|
||||
dumpTemplateName(TA.getAsTemplate());
|
||||
dumpBareTemplateName(TA.getAsTemplate());
|
||||
}
|
||||
|
||||
void TextNodeDumper::VisitTemplateExpansionTemplateArgument(
|
||||
const TemplateArgument &TA) {
|
||||
OS << " template expansion";
|
||||
dumpTemplateArgument(TA);
|
||||
dumpTemplateName(TA.getAsTemplateOrTemplatePattern());
|
||||
dumpBareTemplateName(TA.getAsTemplateOrTemplatePattern());
|
||||
}
|
||||
|
||||
void TextNodeDumper::VisitExpressionTemplateArgument(
|
||||
@ -1989,18 +2014,14 @@ void TextNodeDumper::VisitAutoType(const AutoType *T) {
|
||||
|
||||
void TextNodeDumper::VisitDeducedTemplateSpecializationType(
|
||||
const DeducedTemplateSpecializationType *T) {
|
||||
if (T->getTemplateName().getAsUsingShadowDecl())
|
||||
OS << " using";
|
||||
dumpTemplateName(T->getTemplateName(), "name");
|
||||
}
|
||||
|
||||
void TextNodeDumper::VisitTemplateSpecializationType(
|
||||
const TemplateSpecializationType *T) {
|
||||
if (T->isTypeAlias())
|
||||
OS << " alias";
|
||||
if (T->getTemplateName().getAsUsingShadowDecl())
|
||||
OS << " using";
|
||||
OS << " ";
|
||||
T->getTemplateName().dump(OS);
|
||||
dumpTemplateName(T->getTemplateName(), "name");
|
||||
}
|
||||
|
||||
void TextNodeDumper::VisitInjectedClassNameType(
|
||||
|
@ -36,8 +36,12 @@ Out2<double>::AInner t(1.0);
|
||||
// CHECK-NEXT: | | | `-TemplateTypeParmType {{.*}} 'type-parameter-1-0' dependent depth 1 index 0
|
||||
// CHECK-NEXT: | | `-TypeTraitExpr {{.*}} 'bool' __is_deducible
|
||||
// CHECK-NEXT: | | |-DeducedTemplateSpecializationType {{.*}} 'Out2<double>::AInner' dependent
|
||||
// CHECK-NEXT: | | | `-name: 'Out2<double>::AInner'
|
||||
// CHECK-NEXT: | | | `-TypeAliasTemplateDecl {{.+}} AInner{{$}}
|
||||
// CHECK-NEXT: | | `-ElaboratedType {{.*}} 'Inner<type-parameter-1-0>' sugar dependent
|
||||
// CHECK-NEXT: | | `-TemplateSpecializationType {{.*}} 'Inner<type-parameter-1-0>' dependent Inner
|
||||
// CHECK-NEXT: | | `-TemplateSpecializationType {{.*}} 'Inner<type-parameter-1-0>' dependent
|
||||
// CHECK-NEXT: | | |-name: 'Inner':'Out<int>::Inner' qualified
|
||||
// CHECK-NEXT: | | | `-ClassTemplateDecl {{.+}} Inner{{$}}
|
||||
// CHECK-NEXT: | | `-TemplateArgument type 'type-parameter-1-0'
|
||||
// CHECK-NEXT: | | `-SubstTemplateTypeParmType {{.*}} 'type-parameter-1-0'
|
||||
// CHECK-NEXT: | | |-FunctionTemplate {{.*}} '<deduction guide for Inner>'
|
||||
|
@ -116,7 +116,10 @@ template <class T> struct C {
|
||||
using type2 = typename C<int>::type1<void>;
|
||||
// CHECK: TypeAliasDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:42> col:7 type2 'typename C<int>::type1<void>':'void (int)'
|
||||
// CHECK-NEXT: ElaboratedType 0x{{[^ ]*}} 'typename C<int>::type1<void>' sugar
|
||||
// CHECK-NEXT: TemplateSpecializationType 0x{{[^ ]*}} 'type1<void>' sugar alias C<int>::type1
|
||||
// CHECK-NEXT: TemplateSpecializationType 0x{{[^ ]*}} 'type1<void>' sugar alias
|
||||
// CHECK-NEXT: name: 'C<int>::type1':'PR55886::C<int>::type1' qualified
|
||||
// CHECK-NEXT: NestedNameSpecifier TypeSpec 'C<int>':'PR55886::C<int>'
|
||||
// CHECK-NEXT: TypeAliasTemplateDecl {{.+}} type1
|
||||
// CHECK-NEXT: TemplateArgument type 'void'
|
||||
// CHECK-NEXT: BuiltinType 0x{{[^ ]*}} 'void'
|
||||
// CHECK-NEXT: FunctionProtoType 0x{{[^ ]*}} 'void (int)' cdecl
|
||||
@ -135,7 +138,7 @@ template <typename... Cs> struct foo {
|
||||
template <typename... Ds> using bind = Z<Ds..., Cs...>;
|
||||
};
|
||||
using t1 = foo<int, short>::bind<char, float>;
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'Y<char, float, int, short>' sugar Y
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'Y<char, float, int, short>' sugar
|
||||
// CHECK: SubstTemplateTypeParmType 0x{{[^ ]*}} 'char' sugar typename depth 0 index 0 ... Bs pack_index 3
|
||||
// CHECK-NEXT: TypeAliasTemplate 0x{{[^ ]*}} 'Z'
|
||||
// CHECK: SubstTemplateTypeParmType 0x{{[^ ]*}} 'float' sugar typename depth 0 index 0 ... Bs pack_index 2
|
||||
@ -149,7 +152,8 @@ template <typename... T> struct D {
|
||||
template <typename... U> using B = int(int (*...p)(T, U));
|
||||
};
|
||||
using t2 = D<float, char>::B<int, short>;
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'B<int, short>' sugar alias D<float, char>::B{{$}}
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'B<int, short>' sugar alias{{$}}
|
||||
// CHECK-NEXT: name: 'D<float, char>::B':'PR56099::D<float, char>::B' qualified
|
||||
// CHECK: FunctionProtoType 0x{{[^ ]*}} 'int (int (*)(float, int), int (*)(char, short))' cdecl
|
||||
// CHECK: FunctionProtoType 0x{{[^ ]*}} 'int (float, int)' cdecl
|
||||
// CHECK: SubstTemplateTypeParmType 0x{{[^ ]*}} 'float' sugar typename depth 0 index 0 ... T pack_index 1
|
||||
@ -170,7 +174,9 @@ template<template<class C1, class C2 = A<C1>> class D1, class D2> using D = D1<D
|
||||
template<class E1, class E2> class E {};
|
||||
using test1 = D<E, int>;
|
||||
// CHECK: TypeAliasDecl 0x{{[^ ]*}} <line:{{[1-9]+}}:1, col:23> col:7 test1 'D<E, int>':'subst_default_argument::E<int, subst_default_argument::A<int>>'
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'A<int>' sugar A
|
||||
// CHECK: TemplateSpecializationType 0x{{[^ ]*}} 'A<int>' sugar
|
||||
// CHECK-NEXT: |-name: 'A':'subst_default_argument::A' qualified
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-SubstTemplateTypeParmType 0x{{[^ ]*}} 'int' sugar class depth 0 index 1 D2
|
||||
// CHECK-NEXT: | |-TypeAliasTemplate 0x{{[^ ]*}} 'D'
|
||||
|
@ -13,6 +13,8 @@ namespace qualified {
|
||||
// CHECK-NEXT: TypeAliasDecl
|
||||
// CHECK-NEXT: `-ElaboratedType
|
||||
// CHECK-NEXT: `-TemplateSpecializationType
|
||||
// CHECK-NEXT: |-name: 'N' qualified
|
||||
// CHECK-NEXT: | `-TypeAliasTemplateDecl {{.+}} N{{$}}
|
||||
// CHECK-NEXT: |-TemplateArgument template 'foo::A':'qualified::foo::A' qualified{{$}}
|
||||
// CHECK-NEXT: | |-NestedNameSpecifier Namespace 0x{{.+}} 'foo'{{$}}
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A{{$}}
|
||||
@ -27,6 +29,8 @@ namespace dependent {
|
||||
// CHECK-NEXT: TypeAliasDecl
|
||||
// CHECK-NEXT: `-ElaboratedType
|
||||
// CHECK-NEXT: `-TemplateSpecializationType
|
||||
// CHECK-NEXT: |-name: 'N' qualified
|
||||
// CHECK-NEXT: | `-TypeAliasTemplateDecl
|
||||
// CHECK-NEXT: |-TemplateArgument template 'T::template X':'type-parameter-0-0::template X' dependent{{$}}
|
||||
// CHECK-NEXT: | `-NestedNameSpecifier TypeSpec 'T'{{$}}
|
||||
|
||||
@ -47,6 +51,8 @@ namespace subst {
|
||||
// CHECK-NEXT: |-TypeAlias
|
||||
// CHECK-NEXT: `-ElaboratedType
|
||||
// CHECK-NEXT: `-TemplateSpecializationType
|
||||
// CHECK-NEXT: |-name: 'C':'subst::B<subst::A>::C' qualified
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} C
|
||||
// CHECK-NEXT: |-TemplateArgument template 'subst::A' subst index 0
|
||||
// CHECK-NEXT: | |-parameter: TemplateTemplateParmDecl {{.+}} depth 0 index 0 TT{{$}}
|
||||
// CHECK-NEXT: | |-associated ClassTemplateSpecialization {{.+}} 'B'{{$}}
|
||||
|
@ -20,15 +20,19 @@ template<typename T>
|
||||
using A = S<T>;
|
||||
// CHECK: TypeAliasDecl
|
||||
// CHECK-NEXT: `-ElaboratedType {{.*}} 'S<T>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.*}} 'S<T>' dependent using S
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.*}} 'S<T>' dependent
|
||||
// CHECK-NEXT: |-name: 'S':'ns::S' qualified
|
||||
// CHECk-NEXT: | |-UsingShadowDecl {{.+}} ClassTemplate {{.+}} 'S'
|
||||
|
||||
// TemplateName in TemplateArgument.
|
||||
template <template <typename> class T> class X {};
|
||||
using B = X<S>;
|
||||
// CHECK: TypeAliasDecl
|
||||
// CHECK-NEXT: `-ElaboratedType {{.*}} 'X<S>' sugar
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.*}} 'X<S>' sugar X
|
||||
// CHECK-NEXT: |-TemplateArgument template 'S'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.*}} 'X<S>' sugar
|
||||
// CHECK-NEXT: |-name: 'X' qualified
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} X
|
||||
// CHECK-NEXT: |-TemplateArgument template 'S':'ns::S' qualified
|
||||
// CHECK-NEXT: | |-UsingShadowDecl {{.*}} implicit ClassTemplate {{.*}} 'S'
|
||||
// CHECK-NEXT: | `-target: ClassTemplateDecl {{.*}} S
|
||||
// CHECK-NEXT: `-RecordType {{.*}} 'X<ns::S>'
|
||||
@ -40,11 +44,15 @@ using C = decltype(DeducedTemplateSpecializationT);
|
||||
// CHECK: DecltypeType {{.*}}
|
||||
// CHECK-NEXT: |-DeclRefExpr {{.*}}
|
||||
// CHECK-NEXT: `-ElaboratedType {{.*}} 'S<int>' sugar
|
||||
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'ns::S<int>' sugar using
|
||||
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'ns::S<int>' sugar
|
||||
// CHECK-NEXT: |-name: 'S':'ns::S' qualified
|
||||
// CHECK-NEXT: | |-UsingShadowDecl {{.+}} 'S'
|
||||
|
||||
S2 DeducedTemplateSpecializationT2(123);
|
||||
using D = decltype(DeducedTemplateSpecializationT2);
|
||||
// CHECK: DecltypeType {{.*}}
|
||||
// CHECK-NEXT: |-DeclRefExpr {{.*}}
|
||||
// CHECK-NEXT: `-ElaboratedType {{.*}} 'S2<int>' sugar
|
||||
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'S2<int>' sugar using
|
||||
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'S2<int>' sugar
|
||||
// CHECK-NEXT: |-name: 'S2':'ns::S2' qualified
|
||||
//CHECk-NEXT: | |-UsingShadowDecl {{.+}} ClassTemplate {{.+}} 'S2'
|
||||
|
@ -2,15 +2,8 @@
|
||||
// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s -Xcc -DPACK | FileCheck --check-prefix=CHECK-PACK %s
|
||||
// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s -Xcc -DPACK -Xcc -DSEQ | FileCheck --check-prefixes=CHECK-SEQ,CHECK-PACK %s
|
||||
|
||||
// CHECK-SEQ: BuiltinTemplateDecl
|
||||
// CHECK-SEQ-SAME: <invalid sloc>
|
||||
// CHECK-SEQ-SAME: implicit
|
||||
// CHECK-SEQ-SAME: __make_integer_seq
|
||||
|
||||
// CHECK-PACK: BuiltinTemplateDecl
|
||||
// CHECK-PACK-SAME: <invalid sloc>
|
||||
// CHECK-PACK-SAME: implicit
|
||||
// CHECK-PACK-SAME: __type_pack_element
|
||||
// CHECK-SEQ: BuiltinTemplateDecl {{.+}} <<invalid sloc>> <invalid sloc> implicit __make_integer_seq{{$}}
|
||||
// CHECK-PACK: BuiltinTemplateDecl {{.+}} <<invalid sloc>> <invalid sloc> implicit __type_pack_element{{$}}
|
||||
|
||||
void expr() {
|
||||
#ifdef SEQ
|
||||
|
@ -76,7 +76,7 @@ namespace Basic {
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'C<T>' dependent
|
||||
// CHECK: | `-CXXRecord {{.*}} 'C'
|
||||
// CHECK: |-ElaboratedType {{.*}} 'S<T>' sugar dependent
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'S<T>' dependent S
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'S<T>' dependent
|
||||
// CHECK: | `-TemplateArgument type 'T'
|
||||
// CHECK: | `-TemplateTypeParmType {{.*}} 'T' dependent depth 0 index 0
|
||||
// CHECK: | `-TemplateTypeParm {{.*}} 'T'
|
||||
@ -354,7 +354,7 @@ namespace DeduceArity {
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'F<T...>' dependent
|
||||
// CHECK: | `-CXXRecord {{.*}} 'F'
|
||||
// CHECK: |-ElaboratedType {{.*}} 'Types<T...>' sugar dependent
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'Types<T...>' dependent Types
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'Types<T...>' dependent
|
||||
// CHECK: | `-TemplateArgument type 'T...'
|
||||
// CHECK: | `-PackExpansionType {{.*}} 'T...' dependent
|
||||
// CHECK: | `-TemplateTypeParmType {{.*}} 'T' dependent contains_unexpanded_pack depth 0 index 0 pack
|
||||
|
@ -44,7 +44,7 @@ using AT = A<int[3], int, int, short>;
|
||||
// CHECK: FunctionProtoType {{.*}} 'auto (X<Ps...>, Ts (*)[Ns]...) -> A<T, Ts...>' dependent trailing_return
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'A<T, Ts...>' dependent
|
||||
// CHECK: |-ElaboratedType {{.*}} 'X<Ps...>' sugar dependent
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'X<Ps...>' dependent X
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'X<Ps...>' dependent
|
||||
// CHECK: | `-TemplateArgument expr
|
||||
// CHECK: | `-PackExpansionExpr {{.*}} 'T *'
|
||||
// CHECK: | `-DeclRefExpr {{.*}} 'T *' NonTypeTemplateParm {{.*}} 'Ps' 'T *'
|
||||
@ -79,7 +79,7 @@ using BT = B<char, 'x'>;
|
||||
// CHECK: `-ParmVarDecl {{.*}} 'X<nullptr, 'x'>'
|
||||
// CHECK: FunctionProtoType {{.*}} 'auto (X<W, V>) -> B<T, V>' dependent trailing_return
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'B<T, V>' dependent
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'X<W, V>' dependent X
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'X<W, V>' dependent
|
||||
// CHECK: |-TemplateArgument expr
|
||||
// CHECK: | `-DeclRefExpr {{.*}} 'type-parameter-0-2' NonTypeTemplateParm {{.*}} 'W' 'type-parameter-0-2'
|
||||
// CHECK: `-TemplateArgument expr
|
||||
@ -119,7 +119,7 @@ using CT = C<int>;
|
||||
// CHECK: |-TemplateTypeParmType {{.*}} 'A' dependent depth 0 index 0
|
||||
// CHECK: | `-TemplateTypeParm {{.*}} 'A'
|
||||
// CHECK: |-ElaboratedType {{.*}} 'Y<template-parameter-0-1>' sugar dependent
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'Y<template-parameter-0-1>' dependent Y
|
||||
// CHECK: | `-TemplateSpecializationType {{.*}} 'Y<template-parameter-0-1>' dependent
|
||||
// CHECK: | `-TemplateArgument template
|
||||
// CHECK: `-TemplateTypeParmType {{.*}} 'type-parameter-0-2' dependent depth 0 index 2
|
||||
|
||||
@ -144,7 +144,7 @@ using DT = D<int, int>;
|
||||
// CHECK: FunctionProtoType {{.*}} 'auto (B<type-parameter-0-1, type-parameter-0-2> *) -> D<T...>' dependent trailing_return
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'D<T...>' dependent
|
||||
// CHECK: `-PointerType {{.*}} 'B<type-parameter-0-1, type-parameter-0-2> *' dependent
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'B<type-parameter-0-1, type-parameter-0-2>' sugar dependent alias B
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'B<type-parameter-0-1, type-parameter-0-2>' sugar dependent alias
|
||||
// CHECK: |-TemplateArgument type 'type-parameter-0-1'
|
||||
// CHECK: |-TemplateArgument type 'type-parameter-0-2'
|
||||
// CHECK: `-FunctionProtoType {{.*}} 'int (int (*)(T, U)...)' dependent cdecl
|
||||
@ -185,15 +185,15 @@ using ET = E<1, 3>;
|
||||
// CHECK: `-ParmVarDecl {{.*}} 'B<M1, M2>':'Z<X<N, M>...>'
|
||||
// CHECK: FunctionProtoType {{.*}} 'auto (B<M1, M2>) -> E<N...>' dependent trailing_return
|
||||
// CHECK: |-InjectedClassNameType {{.*}} 'E<N...>' dependent
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'B<M1, M2>' sugar dependent alias B
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'B<M1, M2>' sugar dependent alias
|
||||
// CHECK: |-TemplateArgument expr
|
||||
// CHECK: | `-DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'M1' 'int'
|
||||
// CHECK: |-TemplateArgument expr
|
||||
// CHECK: | `-DeclRefExpr {{.*}} 'int' NonTypeTemplateParm {{.*}} 'M2' 'int'
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'Z<X<N, M>...>' dependent Z
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'Z<X<N, M>...>' dependent
|
||||
// CHECK: `-TemplateArgument type 'X<N, M>...'
|
||||
// CHECK: `-PackExpansionType {{.*}} 'X<N, M>...' dependent expansions 2
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'X<N, M>' dependent contains_unexpanded_pack X
|
||||
// CHECK: `-TemplateSpecializationType {{.*}} 'X<N, M>' dependent contains_unexpanded_pack
|
||||
// CHECK: |-TemplateArgument expr
|
||||
// CHECK-NOT: Subst
|
||||
// CHECK: | `-DeclRefExpr {{.*}} 'int' NonTypeTemplateParm [[N]] 'N' 'int'
|
||||
@ -290,7 +290,9 @@ using AFoo = Foo<G<U>>;
|
||||
// CHECK-NEXT: | | `-IntegerLiteral {{.*}}
|
||||
// CHECK-NEXT: | `-TypeTraitExpr {{.*}} 'bool' __is_deducible
|
||||
// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.*}} 'AFoo' dependent
|
||||
// CHECK-NEXT: | `-TemplateSpecializationType {{.*}} 'Foo<G<type-parameter-0-0>>' dependent Foo
|
||||
// CHECK-NEXT: | | `-name: 'AFoo'
|
||||
// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} AFoo
|
||||
// CHECK-NEXT: | `-TemplateSpecializationType {{.*}} 'Foo<G<type-parameter-0-0>>' dependent
|
||||
// CHECK: |-CXXDeductionGuideDecl {{.*}} implicit <deduction guide for AFoo> 'auto (G<type-parameter-0-0>) -> Foo<G<type-parameter-0-0>>'
|
||||
// CHECK-NEXT: | `-ParmVarDecl {{.*}} 'G<type-parameter-0-0>'
|
||||
// CHECK-NEXT: `-CXXDeductionGuideDecl {{.*}} implicit used <deduction guide for AFoo> 'auto (G<int>) -> Foo<G<int>>' implicit_instantiation
|
||||
@ -327,7 +329,9 @@ namespace TTP {
|
||||
// CHECK-NEXT: |-InjectedClassNameType {{.+}} 'B<T>' dependent{{$}}
|
||||
// CHECK-NEXT: | `-CXXRecord {{.+}} 'B'{{$}}
|
||||
// CHECK-NEXT: `-ElaboratedType {{.+}} 'template-parameter-0-1<T>' sugar dependent{{$}}
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.+}} 'template-parameter-0-1<T>' dependent template-parameter-0-1{{$}}
|
||||
// CHECK-NEXT: `-TemplateSpecializationType {{.+}} 'template-parameter-0-1<T>' dependent{{$}}
|
||||
// CHECK-NEXT: |-name: 'template-parameter-0-1' qualified
|
||||
// CHECK-NEXT: | `-TemplateTemplateParmDecl {{.+}} depth 0 index 1
|
||||
// CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}}
|
||||
// CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0{{$}}
|
||||
// CHECK-NEXT: `-TemplateTypeParm {{.+}} 'T'{{$}}
|
||||
|
@ -5,7 +5,9 @@ template <class A1, A1... A2> struct A {};
|
||||
using test1 = __make_integer_seq<A, int, 1>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:5:1, col:43> col:7 test1 '__make_integer_seq<A, int, 1>':'A<int, 0>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
@ -14,11 +16,13 @@ using test1 = __make_integer_seq<A, int, 1>;
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int'
|
||||
// CHECK-NEXT: | |-value: Int 1
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar A
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar
|
||||
// CHECK-NEXT: |-name: 'A' qualified
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr '0'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'int'
|
||||
// CHECK-NEXT: | |-value: Int 0
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 0
|
||||
// CHECK-NEXT: `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'
|
||||
@ -28,15 +32,19 @@ template <class B1, B1 B2> using B = __make_integer_seq<A, B1, B2>;
|
||||
using test2 = B<int, 1>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:23> col:7 test2 'B<int, 1>':'A<int, 0>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar alias B
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'B<int, 1>' sugar alias
|
||||
// CHECK-NEXT: |-name: 'B' qualified
|
||||
// CHECK-NEXT: | `-TypeAliasTemplateDecl {{.+}} B
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr '1'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:22> 'int'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:22> 'int'
|
||||
// CHECK-NEXT: | |-value: Int 1
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:22> 'int' 1
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, 1>' sugar alias
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
@ -49,13 +57,15 @@ using test2 = B<int, 1>;
|
||||
// CHECK-NEXT: | `-SubstNonTypeTemplateParmExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int'
|
||||
// CHECK-NEXT: | |-NonTypeTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <col:21, col:24> col:24 referenced 'B1' depth 0 index 1 B2
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 1
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar A
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>' sugar
|
||||
// CHECK-NEXT: |-name: 'A' qualified
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar class depth 0 index 0 B1
|
||||
// CHECK-NEXT: | |-TypeAliasTemplate 0x{{[0-9A-Fa-f]+}} 'B'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr '0'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:64> 'int'
|
||||
// CHECK-NEXT: | |-value: Int 0
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:64> 'int' 0
|
||||
// CHECK-NEXT: `-RecordType 0x{{[0-9A-Fa-f]+}} 'A<int, 0>'
|
||||
@ -65,7 +75,9 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
using test3 = __make_integer_seq<S, T, N>;
|
||||
// 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>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent alias __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'S'
|
||||
// CHECK-NEXT: | | `-TemplateTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:11, col:42> col:42 depth 0 index 0 S
|
||||
// CHECK-NEXT: |-TemplateArgument type 'T'
|
||||
@ -74,7 +86,9 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent>
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>' dependent __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>' dependent
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'template-parameter-0-0'
|
||||
// CHECK-NEXT: | `-TemplateTemplateParmDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> depth 0 index 0
|
||||
// CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-1'
|
||||
@ -86,7 +100,9 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
using test4 = __make_integer_seq<A, T, 1>;
|
||||
// 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>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent alias __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, T, 1>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'T'
|
||||
@ -95,7 +111,9 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
// CHECK-NEXT: |-TemplateArgument expr '1'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:42> 'T' <Dependent>
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, type-parameter-0-1, 1>' dependent __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, type-parameter-0-1, 1>' dependent
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-1'
|
||||
@ -107,14 +125,18 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
using test5 = __make_integer_seq<A, int, N>;
|
||||
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent alias __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:44> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' dependent __make_integer_seq
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<A, int, N>' dependent
|
||||
// CHECK-NEXT: |-name: '__make_integer_seq'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __make_integer_seq
|
||||
// CHECK-NEXT: |-TemplateArgument template 'A'
|
||||
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:1, col:41> col:38 A
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
|
@ -3,7 +3,9 @@
|
||||
using test1 = __type_pack_element<0, int>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <<stdin>: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 alias __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, int>' sugar alias
|
||||
// CHECK-NEXT: |-name: '__type_pack_element' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr '0'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:35> 'unsigned long'
|
||||
// CHECK-NEXT: | |-value: Int 0
|
||||
@ -15,9 +17,11 @@ using test1 = __type_pack_element<0, int>;
|
||||
|
||||
template<int N, class ...Ts> struct A {
|
||||
using test2 = __type_pack_element<N, Ts...>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:17:3, col:45> col:9 test2 '__type_pack_element<N, Ts...>':'__type_pack_element<N, type-parameter-0-1...>'
|
||||
// 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...>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent alias __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, Ts...>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__type_pack_element' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
@ -25,7 +29,9 @@ template<int N, class ...Ts> struct A {
|
||||
// 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'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, type-parameter-0-1...>' dependent __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, type-parameter-0-1...>' dependent
|
||||
// CHECK-NEXT: |-name: '__type_pack_element'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
@ -35,9 +41,11 @@ template<int N, class ...Ts> struct A {
|
||||
// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent contains_unexpanded_pack depth 0 index 1 pack
|
||||
|
||||
using test3 = __type_pack_element<0, Ts...>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:37:3, col:45> col:9 test3 '__type_pack_element<0, Ts...>':'__type_pack_element<0, type-parameter-0-1...>'
|
||||
// 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...>'
|
||||
// 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...>' sugar dependent alias __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, Ts...>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__type_pack_element' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr '0'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long'
|
||||
// CHECK-NEXT: | |-value: Int 0
|
||||
@ -47,7 +55,9 @@ template<int N, class ...Ts> struct A {
|
||||
// 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'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, type-parameter-0-1...>' dependent __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<0, type-parameter-0-1...>' dependent
|
||||
// CHECK-NEXT: |-name: '__type_pack_element'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument integral '0UL'
|
||||
// CHECK-NEXT: `-TemplateArgument pack '<type-parameter-0-1...>'
|
||||
// CHECK-NEXT: `-TemplateArgument type 'type-parameter-0-1...'
|
||||
@ -55,15 +65,19 @@ template<int N, class ...Ts> struct A {
|
||||
// CHECK-NEXT: `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent contains_unexpanded_pack depth 0 index 1 pack
|
||||
|
||||
using test4 = __type_pack_element<N, int>;
|
||||
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:57:3, col:43> col:9 test4 '__type_pack_element<N, int>'
|
||||
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:{{.+}}:3, col:43> col:9 test4 '__type_pack_element<N, int>'
|
||||
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent alias __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' sugar dependent alias
|
||||
// CHECK-NEXT: |-name: '__type_pack_element' qualified
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' dependent __type_pack_element
|
||||
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__type_pack_element<N, int>' dependent
|
||||
// CHECK-NEXT: |-name: '__type_pack_element'
|
||||
// CHECK-NEXT: | `-BuiltinTemplateDecl {{.+}} __type_pack_element
|
||||
// CHECK-NEXT: |-TemplateArgument expr 'N'
|
||||
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'unsigned long' <IntegralCast>
|
||||
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:37> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
|
Loading…
x
Reference in New Issue
Block a user