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