@@ -4022,50 +4022,8 @@ template<typename Derived>
4022
4022
void TreeTransform<Derived>::InventTemplateArgumentLoc(
4023
4023
const TemplateArgument &Arg,
4024
4024
TemplateArgumentLoc &Output) {
4025
- SourceLocation Loc = getDerived().getBaseLocation();
4026
- switch (Arg.getKind()) {
4027
- case TemplateArgument::Null:
4028
- llvm_unreachable("null template argument in TreeTransform");
4029
- break;
4030
-
4031
- case TemplateArgument::Type:
4032
- Output = TemplateArgumentLoc(Arg,
4033
- SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
4034
-
4035
- break;
4036
-
4037
- case TemplateArgument::Template:
4038
- case TemplateArgument::TemplateExpansion: {
4039
- NestedNameSpecifierLocBuilder Builder;
4040
- TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
4041
- if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
4042
- Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
4043
- else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
4044
- Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
4045
-
4046
- if (Arg.getKind() == TemplateArgument::Template)
4047
- Output = TemplateArgumentLoc(Arg,
4048
- Builder.getWithLocInContext(SemaRef.Context),
4049
- Loc);
4050
- else
4051
- Output = TemplateArgumentLoc(Arg,
4052
- Builder.getWithLocInContext(SemaRef.Context),
4053
- Loc, Loc);
4054
-
4055
- break;
4056
- }
4057
-
4058
- case TemplateArgument::Expression:
4059
- Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
4060
- break;
4061
-
4062
- case TemplateArgument::Declaration:
4063
- case TemplateArgument::Integral:
4064
- case TemplateArgument::Pack:
4065
- case TemplateArgument::NullPtr:
4066
- Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
4067
- break;
4068
- }
4025
+ Output = getSema().getTrivialTemplateArgumentLoc(
4026
+ Arg, QualType(), getDerived().getBaseLocation());
4069
4027
}
4070
4028
4071
4029
template<typename Derived>
@@ -4075,12 +4033,45 @@ bool TreeTransform<Derived>::TransformTemplateArgument(
4075
4033
const TemplateArgument &Arg = Input.getArgument();
4076
4034
switch (Arg.getKind()) {
4077
4035
case TemplateArgument::Null:
4078
- case TemplateArgument::Integral:
4079
4036
case TemplateArgument::Pack:
4080
- case TemplateArgument::Declaration:
4081
- case TemplateArgument::NullPtr:
4082
4037
llvm_unreachable("Unexpected TemplateArgument");
4083
4038
4039
+ case TemplateArgument::Integral:
4040
+ case TemplateArgument::NullPtr:
4041
+ case TemplateArgument::Declaration: {
4042
+ // Transform a resolved template argument straight to a resolved template
4043
+ // argument. We get here when substituting into an already-substituted
4044
+ // template type argument during concept satisfaction checking.
4045
+ QualType T = Arg.getNonTypeTemplateArgumentType();
4046
+ QualType NewT = getDerived().TransformType(T);
4047
+ if (NewT.isNull())
4048
+ return true;
4049
+
4050
+ ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4051
+ ? Arg.getAsDecl()
4052
+ : nullptr;
4053
+ ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4054
+ getDerived().getBaseLocation(), D))
4055
+ : nullptr;
4056
+ if (D && !NewD)
4057
+ return true;
4058
+
4059
+ if (NewT == T && D == NewD)
4060
+ Output = Input;
4061
+ else if (Arg.getKind() == TemplateArgument::Integral)
4062
+ Output = TemplateArgumentLoc(
4063
+ TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4064
+ TemplateArgumentLocInfo());
4065
+ else if (Arg.getKind() == TemplateArgument::NullPtr)
4066
+ Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4067
+ TemplateArgumentLocInfo());
4068
+ else
4069
+ Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4070
+ TemplateArgumentLocInfo());
4071
+
4072
+ return false;
4073
+ }
4074
+
4084
4075
case TemplateArgument::Type: {
4085
4076
TypeSourceInfo *DI = Input.getTypeSourceInfo();
4086
4077
if (!DI)
0 commit comments