mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
[clang] Perform sugared substitution of builtin templates
Since these are much like template type aliases, where we don't track a specialization for them and just substitute them eagerly, we can't resugar them anyway, and there is no relevant cost in just performing a finalizing sugared substitution. Signed-off-by: Matheus Izvekov <mizvekov@gmail.com> Differential Revision: https://reviews.llvm.org/D136563
This commit is contained in:
parent
b0f8057e4c
commit
e5d9e802e5
@ -3577,18 +3577,11 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
|
||||
|
||||
static QualType
|
||||
checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD,
|
||||
const SmallVectorImpl<TemplateArgument> &Converted,
|
||||
ArrayRef<TemplateArgument> Converted,
|
||||
SourceLocation TemplateLoc,
|
||||
TemplateArgumentListInfo &TemplateArgs) {
|
||||
ASTContext &Context = SemaRef.getASTContext();
|
||||
|
||||
// Wrap the type in substitution sugar.
|
||||
auto getSubstType = [&](QualType Replacement, unsigned IndexReplaced,
|
||||
Optional<unsigned> PackIndexReplaced) {
|
||||
return SemaRef.Context.getSubstTemplateTypeParmType(
|
||||
Replacement, BTD, IndexReplaced, PackIndexReplaced);
|
||||
};
|
||||
|
||||
switch (BTD->getBuiltinTemplateKind()) {
|
||||
case BTK__make_integer_seq: {
|
||||
// Specializations of __make_integer_seq<S, T, N> are treated like
|
||||
@ -3611,19 +3604,18 @@ checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD,
|
||||
TemplateArgumentListInfo SyntheticTemplateArgs;
|
||||
// The type argument, wrapped in substitution sugar, gets reused as the
|
||||
// first template argument in the synthetic template argument list.
|
||||
QualType SyntheticType = getSubstType(OrigType, 1, None);
|
||||
SyntheticTemplateArgs.addArgument(
|
||||
TemplateArgumentLoc(TemplateArgument(SyntheticType),
|
||||
TemplateArgumentLoc(TemplateArgument(OrigType),
|
||||
SemaRef.Context.getTrivialTypeSourceInfo(
|
||||
SyntheticType, TemplateArgs[1].getLocation())));
|
||||
OrigType, TemplateArgs[1].getLocation())));
|
||||
|
||||
if (llvm::APSInt NumArgs = NumArgsArg.getAsIntegral(); NumArgs >= 0) {
|
||||
// Expand N into 0 ... N-1.
|
||||
for (llvm::APSInt I(NumArgs.getBitWidth(), NumArgs.isUnsigned());
|
||||
I < NumArgs; ++I) {
|
||||
TemplateArgument TA(Context, I, SyntheticType);
|
||||
TemplateArgument TA(Context, I, OrigType);
|
||||
SyntheticTemplateArgs.addArgument(SemaRef.getTrivialTemplateArgumentLoc(
|
||||
TA, SyntheticType, TemplateArgs[2].getLocation()));
|
||||
TA, OrigType, TemplateArgs[2].getLocation()));
|
||||
}
|
||||
} else {
|
||||
// C++14 [inteseq.make]p1:
|
||||
@ -3633,13 +3625,10 @@ checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD,
|
||||
return QualType();
|
||||
}
|
||||
|
||||
// Wrap the template in substitution sugar.
|
||||
TemplateName TN = SemaRef.Context.getSubstTemplateTemplateParm(
|
||||
Converted[0].getAsTemplate(), BTD, 0, None);
|
||||
|
||||
// The first template argument will be reused as the template decl that
|
||||
// our synthetic template arguments will be applied to.
|
||||
return SemaRef.CheckTemplateIdType(TN, TemplateLoc, SyntheticTemplateArgs);
|
||||
return SemaRef.CheckTemplateIdType(Converted[0].getAsTemplate(),
|
||||
TemplateLoc, SyntheticTemplateArgs);
|
||||
}
|
||||
|
||||
case BTK__type_pack_element:
|
||||
@ -3666,8 +3655,7 @@ checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD,
|
||||
|
||||
// We simply return the type at index `Index`.
|
||||
int64_t N = Index.getExtValue();
|
||||
return getSubstType(Ts.getPackAsArray()[N].getAsType(), 1,
|
||||
Ts.pack_size() - 1 - N);
|
||||
return Ts.getPackAsArray()[N].getAsType();
|
||||
}
|
||||
llvm_unreachable("unexpected BuiltinTemplateDecl!");
|
||||
}
|
||||
@ -3915,7 +3903,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
|
||||
return QualType();
|
||||
}
|
||||
} else if (auto *BTD = dyn_cast<BuiltinTemplateDecl>(Template)) {
|
||||
CanonType = checkBuiltinTemplateIdType(*this, BTD, CanonicalConverted,
|
||||
CanonType = checkBuiltinTemplateIdType(*this, BTD, SugaredConverted,
|
||||
TemplateLoc, TemplateArgs);
|
||||
} else if (Name.isDependent() ||
|
||||
TemplateSpecializationType::anyDependentTemplateArguments(
|
||||
|
@ -14,20 +14,18 @@ using test1 = __make_integer_seq<A, int, 1>;
|
||||
// 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: |-TemplateArgument type 'int':'int'
|
||||
// CHECK-NEXT: | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar typename depth 0 index 1
|
||||
// CHECK-NEXT: | |-BuiltinTemplate 0x{{[0-9A-Fa-f]+}} '__make_integer_seq'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int'
|
||||
// CHECK-NEXT: | |-value: Int 0
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int':'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>'
|
||||
// CHECK-NEXT: `-ClassTemplateSpecialization 0x{{[0-9A-Fa-f]+}} 'A'
|
||||
|
||||
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:29:1, col:23> col:7 test2 'B<int, 1>':'A<int, 0>'
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:27: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: |-TemplateArgument type 'int'
|
||||
@ -44,15 +42,15 @@ using test2 = B<int, 1>;
|
||||
// CHECK-NEXT: | |-TypeAliasTemplate 0x{{[0-9A-Fa-f]+}} 'B'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: |-TemplateArgument expr
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:28:64> 'int'
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <line:26:64> 'int'
|
||||
// CHECK-NEXT: | |-value: 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: |-TemplateArgument type 'int':'int'
|
||||
// CHECK-NEXT: | `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar typename depth 0 index 1
|
||||
// CHECK-NEXT: | |-BuiltinTemplate 0x{{[0-9A-Fa-f]+}} '__make_integer_seq'
|
||||
// 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
|
||||
// CHECK-NEXT: | `-ConstantExpr 0x{{[0-9A-Fa-f]+}} <col:64> 'int'
|
||||
@ -63,7 +61,7 @@ using test2 = B<int, 1>;
|
||||
|
||||
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:65:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<type-parameter-0-1, N>'
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:63:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<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: |-TemplateArgument template S
|
||||
@ -82,7 +80,7 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
// CHECK-NEXT: `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
|
||||
|
||||
using test4 = __make_integer_seq<A, T, 1>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:84:3, col:43> col:9 test4 '__make_integer_seq<A, T, 1>':'__make_integer_seq<A, type-parameter-0-1, 1>'
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:82: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: |-TemplateArgument template A
|
||||
@ -101,7 +99,7 @@ template <template <class T, T...> class S, class T, int N> struct C {
|
||||
// CHECK-NEXT: `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:42> 'int' 1
|
||||
|
||||
using test5 = __make_integer_seq<A, int, N>;
|
||||
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:103:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>':'__make_integer_seq<A, int, N>'
|
||||
// CHECK: `-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:101:3, col:45> col:9 test5 '__make_integer_seq<A, int, N>':'__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: |-TemplateArgument template A
|
||||
|
@ -11,13 +11,11 @@ using test1 = __type_pack_element<0, int>;
|
||||
// CHECK-NEXT: | `-IntegerLiteral 0x{{[0-9A-Fa-f]+}} <col:35> 'int' 0
|
||||
// CHECK-NEXT: |-TemplateArgument type 'int'
|
||||
// CHECK-NEXT: | `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: `-SubstTemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'int' sugar typename depth 0 index 1 ... pack_index 0
|
||||
// CHECK-NEXT: |-BuiltinTemplate 0x{{[0-9A-Fa-f]+}} '__type_pack_element'
|
||||
// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
// CHECK-NEXT: `-BuiltinType 0x{{[0-9A-Fa-f]+}} 'int'
|
||||
|
||||
template<int N, class ...Ts> struct A {
|
||||
using test2 = __type_pack_element<N, Ts...>;
|
||||
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:19: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:17: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: |-TemplateArgument expr
|
||||
@ -37,7 +35,7 @@ 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:39: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:37: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: |-TemplateArgument expr
|
||||
@ -57,7 +55,7 @@ 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:59:3, col:43> col:9 test4 '__type_pack_element<N, int>':'__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>':'__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: |-TemplateArgument expr
|
||||
|
Loading…
Reference in New Issue
Block a user