@@ -3826,15 +3826,16 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
3826
3826
}
3827
3827
}
3828
3828
3829
- static QualType builtinCommonTypeImpl (Sema &S, TemplateName BaseTemplate,
3829
+ static QualType builtinCommonTypeImpl (Sema &S, const NestedNameSpecifier *NNS,
3830
+ TemplateName BaseTemplate,
3830
3831
SourceLocation TemplateLoc,
3831
3832
ArrayRef<TemplateArgument> Ts) {
3832
3833
auto lookUpCommonType = [&](TemplateArgument T1,
3833
3834
TemplateArgument T2) -> QualType {
3834
3835
// Don't bother looking for other specializations if both types are
3835
3836
// builtins - users aren't allowed to specialize for them
3836
3837
if (T1.getAsType ()->isBuiltinType () && T2.getAsType ()->isBuiltinType ())
3837
- return builtinCommonTypeImpl (S, BaseTemplate, TemplateLoc, {T1, T2});
3838
+ return builtinCommonTypeImpl (S, NNS, BaseTemplate, TemplateLoc, {T1, T2});
3838
3839
3839
3840
TemplateArgumentListInfo Args;
3840
3841
Args.addArgument (TemplateArgumentLoc (
@@ -3848,7 +3849,7 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
3848
3849
Sema::ContextRAII TUContext (S, S.Context .getTranslationUnitDecl ());
3849
3850
3850
3851
QualType BaseTemplateInst =
3851
- S.CheckTemplateIdType (BaseTemplate, TemplateLoc, Args);
3852
+ S.CheckTemplateIdType (NNS, BaseTemplate, TemplateLoc, Args);
3852
3853
3853
3854
if (SFINAE.hasErrorOccurred ())
3854
3855
return QualType ();
@@ -3961,8 +3962,8 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
3961
3962
}
3962
3963
3963
3964
static QualType checkBuiltinTemplateIdType (
3964
- Sema &SemaRef, TemplateName Name, BuiltinTemplateDecl *BTD ,
3965
- ArrayRef<TemplateArgument> SugaredConverted,
3965
+ Sema &SemaRef, const NestedNameSpecifier *NNS, TemplateName Name ,
3966
+ BuiltinTemplateDecl *BTD, ArrayRef<TemplateArgument> SugaredConverted,
3966
3967
ArrayRef<TemplateArgument> CanonicalConverted, SourceLocation TemplateLoc,
3967
3968
TemplateArgumentListInfo &TemplateArgs) {
3968
3969
ASTContext &Context = SemaRef.getASTContext ();
@@ -4014,7 +4015,7 @@ static QualType checkBuiltinTemplateIdType(
4014
4015
// The first template argument will be reused as the template decl that
4015
4016
// our synthetic template arguments will be applied to.
4016
4017
QualType Result =
4017
- SemaRef.CheckTemplateIdType (SugaredConverted[0 ].getAsTemplate (),
4018
+ SemaRef.CheckTemplateIdType (NNS, SugaredConverted[0 ].getAsTemplate (),
4018
4019
TemplateLoc, SyntheticTemplateArgs);
4019
4020
return SemaRef.Context .getTemplateSpecializationType (
4020
4021
Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4064,14 +4065,16 @@ static QualType checkBuiltinTemplateIdType(
4064
4065
QualType HasNoTypeMember = SugaredConverted[2 ].getAsType ();
4065
4066
ArrayRef<TemplateArgument> Ts = SugaredConverted[3 ].getPackAsArray ();
4066
4067
QualType Result = HasNoTypeMember;
4067
- if (auto CT = builtinCommonTypeImpl (SemaRef, BaseTemplate, TemplateLoc, Ts);
4068
+ if (auto CT =
4069
+ builtinCommonTypeImpl (SemaRef, NNS, BaseTemplate, TemplateLoc, Ts);
4068
4070
!CT.isNull ()) {
4069
4071
TemplateArgumentListInfo TAs;
4070
4072
TAs.addArgument (TemplateArgumentLoc (
4071
4073
TemplateArgument (CT), SemaRef.Context .getTrivialTypeSourceInfo (
4072
4074
CT, TemplateArgs[1 ].getLocation ())));
4073
4075
4074
- Result = SemaRef.CheckTemplateIdType (HasTypeMember, TemplateLoc, TAs);
4076
+ Result =
4077
+ SemaRef.CheckTemplateIdType (NNS, HasTypeMember, TemplateLoc, TAs);
4075
4078
}
4076
4079
return SemaRef.Context .getTemplateSpecializationType (
4077
4080
Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4219,7 +4222,8 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
4219
4222
return { FailedCond, Description };
4220
4223
}
4221
4224
4222
- QualType Sema::CheckTemplateIdType (TemplateName Name,
4225
+ QualType Sema::CheckTemplateIdType (const NestedNameSpecifier *NNS,
4226
+ TemplateName Name,
4223
4227
SourceLocation TemplateLoc,
4224
4228
TemplateArgumentListInfo &TemplateArgs) {
4225
4229
// FIXME: 'getUnderlying' loses SubstTemplateTemplateParm nodes from alias
@@ -4298,9 +4302,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
4298
4302
if (!AliasTemplate->getDeclContext ()->isFileContext ())
4299
4303
SavedContext.emplace (*this , AliasTemplate->getDeclContext ());
4300
4304
4301
- CanonType =
4302
- SubstType (Pattern-> getUnderlyingType (), TemplateArgLists ,
4303
- AliasTemplate-> getLocation (), AliasTemplate->getDeclName ());
4305
+ QualType T = resugar (NNS, Pattern-> getUnderlyingType ());
4306
+ CanonType = SubstType (T, TemplateArgLists, AliasTemplate-> getLocation () ,
4307
+ AliasTemplate->getDeclName ());
4304
4308
if (CanonType.isNull ()) {
4305
4309
// If this was enable_if and we failed to find the nested type
4306
4310
// within enable_if in a SFINAE context, dig out the specific
@@ -4337,9 +4341,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
4337
4341
return QualType ();
4338
4342
}
4339
4343
} else if (auto *BTD = dyn_cast<BuiltinTemplateDecl>(Template)) {
4340
- return checkBuiltinTemplateIdType (* this , Name, BTD, CTAI. SugaredConverted ,
4341
- CTAI.CanonicalConverted , TemplateLoc ,
4342
- TemplateArgs);
4344
+ return checkBuiltinTemplateIdType (
4345
+ * this , NNS, Name, BTD, CTAI.SugaredConverted , CTAI. CanonicalConverted ,
4346
+ TemplateLoc, TemplateArgs);
4343
4347
} else if (Name.isDependent () ||
4344
4348
TemplateSpecializationType::anyDependentTemplateArguments (
4345
4349
TemplateArgs, CTAI.CanonicalConverted )) {
@@ -4582,7 +4586,8 @@ TypeResult Sema::ActOnTemplateIdType(
4582
4586
return CreateParsedType (T, TLB.getTypeSourceInfo (Context, T));
4583
4587
}
4584
4588
4585
- QualType SpecTy = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
4589
+ QualType SpecTy = CheckTemplateIdType (SS.getScopeRep (), Template,
4590
+ TemplateIILoc, TemplateArgs);
4586
4591
if (SpecTy.isNull ())
4587
4592
return true ;
4588
4593
@@ -4663,7 +4668,8 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
4663
4668
Diag (TAT->getLocation (), diag::note_declared_at);
4664
4669
}
4665
4670
4666
- QualType Result = CheckTemplateIdType (Template, TemplateLoc, TemplateArgs);
4671
+ QualType Result = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateLoc,
4672
+ TemplateArgs);
4667
4673
if (Result.isNull ())
4668
4674
return TypeResult (true );
4669
4675
@@ -11444,7 +11450,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
11444
11450
return CreateParsedType (T, Builder.getTypeSourceInfo (Context, T));
11445
11451
}
11446
11452
11447
- QualType T = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
11453
+ QualType T = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateIILoc,
11454
+ TemplateArgs);
11448
11455
if (T.isNull ())
11449
11456
return true ;
11450
11457
0 commit comments