@@ -3817,15 +3817,16 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
3817
3817
}
3818
3818
}
3819
3819
3820
- static QualType builtinCommonTypeImpl (Sema &S, TemplateName BaseTemplate,
3820
+ static QualType builtinCommonTypeImpl (Sema &S, const NestedNameSpecifier *NNS,
3821
+ TemplateName BaseTemplate,
3821
3822
SourceLocation TemplateLoc,
3822
3823
ArrayRef<TemplateArgument> Ts) {
3823
3824
auto lookUpCommonType = [&](TemplateArgument T1,
3824
3825
TemplateArgument T2) -> QualType {
3825
3826
// Don't bother looking for other specializations if both types are
3826
3827
// builtins - users aren't allowed to specialize for them
3827
3828
if (T1.getAsType ()->isBuiltinType () && T2.getAsType ()->isBuiltinType ())
3828
- return builtinCommonTypeImpl (S, BaseTemplate, TemplateLoc, {T1, T2});
3829
+ return builtinCommonTypeImpl (S, NNS, BaseTemplate, TemplateLoc, {T1, T2});
3829
3830
3830
3831
TemplateArgumentListInfo Args;
3831
3832
Args.addArgument (TemplateArgumentLoc (
@@ -3839,7 +3840,7 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
3839
3840
Sema::ContextRAII TUContext (S, S.Context .getTranslationUnitDecl ());
3840
3841
3841
3842
QualType BaseTemplateInst =
3842
- S.CheckTemplateIdType (BaseTemplate, TemplateLoc, Args);
3843
+ S.CheckTemplateIdType (NNS, BaseTemplate, TemplateLoc, Args);
3843
3844
3844
3845
if (SFINAE.hasErrorOccurred ())
3845
3846
return QualType ();
@@ -3952,8 +3953,8 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
3952
3953
}
3953
3954
3954
3955
static QualType checkBuiltinTemplateIdType (
3955
- Sema &SemaRef, TemplateName Name, BuiltinTemplateDecl *BTD ,
3956
- ArrayRef<TemplateArgument> SugaredConverted,
3956
+ Sema &SemaRef, const NestedNameSpecifier *NNS, TemplateName Name ,
3957
+ BuiltinTemplateDecl *BTD, ArrayRef<TemplateArgument> SugaredConverted,
3957
3958
ArrayRef<TemplateArgument> CanonicalConverted, SourceLocation TemplateLoc,
3958
3959
TemplateArgumentListInfo &TemplateArgs) {
3959
3960
ASTContext &Context = SemaRef.getASTContext ();
@@ -4005,7 +4006,7 @@ static QualType checkBuiltinTemplateIdType(
4005
4006
// The first template argument will be reused as the template decl that
4006
4007
// our synthetic template arguments will be applied to.
4007
4008
QualType Result =
4008
- SemaRef.CheckTemplateIdType (SugaredConverted[0 ].getAsTemplate (),
4009
+ SemaRef.CheckTemplateIdType (NNS, SugaredConverted[0 ].getAsTemplate (),
4009
4010
TemplateLoc, SyntheticTemplateArgs);
4010
4011
return SemaRef.Context .getTemplateSpecializationType (
4011
4012
Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4055,14 +4056,16 @@ static QualType checkBuiltinTemplateIdType(
4055
4056
QualType HasNoTypeMember = SugaredConverted[2 ].getAsType ();
4056
4057
ArrayRef<TemplateArgument> Ts = SugaredConverted[3 ].getPackAsArray ();
4057
4058
QualType Result = HasNoTypeMember;
4058
- if (auto CT = builtinCommonTypeImpl (SemaRef, BaseTemplate, TemplateLoc, Ts);
4059
+ if (auto CT =
4060
+ builtinCommonTypeImpl (SemaRef, NNS, BaseTemplate, TemplateLoc, Ts);
4059
4061
!CT.isNull ()) {
4060
4062
TemplateArgumentListInfo TAs;
4061
4063
TAs.addArgument (TemplateArgumentLoc (
4062
4064
TemplateArgument (CT), SemaRef.Context .getTrivialTypeSourceInfo (
4063
4065
CT, TemplateArgs[1 ].getLocation ())));
4064
4066
4065
- Result = SemaRef.CheckTemplateIdType (HasTypeMember, TemplateLoc, TAs);
4067
+ Result =
4068
+ SemaRef.CheckTemplateIdType (NNS, HasTypeMember, TemplateLoc, TAs);
4066
4069
}
4067
4070
return SemaRef.Context .getTemplateSpecializationType (
4068
4071
Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4210,7 +4213,8 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
4210
4213
return { FailedCond, Description };
4211
4214
}
4212
4215
4213
- QualType Sema::CheckTemplateIdType (TemplateName Name,
4216
+ QualType Sema::CheckTemplateIdType (const NestedNameSpecifier *NNS,
4217
+ TemplateName Name,
4214
4218
SourceLocation TemplateLoc,
4215
4219
TemplateArgumentListInfo &TemplateArgs) {
4216
4220
DependentTemplateName *DTN =
@@ -4294,9 +4298,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
4294
4298
if (!AliasTemplate->getDeclContext ()->isFileContext ())
4295
4299
SavedContext.emplace (*this , AliasTemplate->getDeclContext ());
4296
4300
4297
- CanonType =
4298
- SubstType (Pattern-> getUnderlyingType (), TemplateArgLists ,
4299
- AliasTemplate-> getLocation (), AliasTemplate->getDeclName ());
4301
+ QualType T = resugar (NNS, Pattern-> getUnderlyingType ());
4302
+ CanonType = SubstType (T, TemplateArgLists, AliasTemplate-> getLocation () ,
4303
+ AliasTemplate->getDeclName ());
4300
4304
if (CanonType.isNull ()) {
4301
4305
// If this was enable_if and we failed to find the nested type
4302
4306
// within enable_if in a SFINAE context, dig out the specific
@@ -4333,9 +4337,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
4333
4337
return QualType ();
4334
4338
}
4335
4339
} else if (auto *BTD = dyn_cast<BuiltinTemplateDecl>(Template)) {
4336
- return checkBuiltinTemplateIdType (* this , Name, BTD, CTAI. SugaredConverted ,
4337
- CTAI.CanonicalConverted , TemplateLoc ,
4338
- TemplateArgs);
4340
+ return checkBuiltinTemplateIdType (
4341
+ * this , NNS, Name, BTD, CTAI.SugaredConverted , CTAI. CanonicalConverted ,
4342
+ TemplateLoc, TemplateArgs);
4339
4343
} else if (Name.isDependent () ||
4340
4344
TemplateSpecializationType::anyDependentTemplateArguments (
4341
4345
TemplateArgs, CTAI.CanonicalConverted )) {
@@ -4579,7 +4583,8 @@ TypeResult Sema::ActOnTemplateIdType(
4579
4583
return CreateParsedType (T, TLB.getTypeSourceInfo (Context, T));
4580
4584
}
4581
4585
4582
- QualType SpecTy = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
4586
+ QualType SpecTy = CheckTemplateIdType (SS.getScopeRep (), Template,
4587
+ TemplateIILoc, TemplateArgs);
4583
4588
if (SpecTy.isNull ())
4584
4589
return true ;
4585
4590
@@ -4661,7 +4666,8 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
4661
4666
Diag (TAT->getLocation (), diag::note_declared_at);
4662
4667
}
4663
4668
4664
- QualType Result = CheckTemplateIdType (Template, TemplateLoc, TemplateArgs);
4669
+ QualType Result = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateLoc,
4670
+ TemplateArgs);
4665
4671
if (Result.isNull ())
4666
4672
return TypeResult (true );
4667
4673
@@ -11451,7 +11457,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
11451
11457
return CreateParsedType (T, Builder.getTypeSourceInfo (Context, T));
11452
11458
}
11453
11459
11454
- QualType T = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
11460
+ QualType T = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateIILoc,
11461
+ TemplateArgs);
11455
11462
if (T.isNull ())
11456
11463
return true ;
11457
11464
0 commit comments