@@ -3827,15 +3827,16 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
38273827 }
38283828}
38293829
3830- static QualType builtinCommonTypeImpl (Sema &S, TemplateName BaseTemplate,
3830+ static QualType builtinCommonTypeImpl (Sema &S, const NestedNameSpecifier *NNS,
3831+ TemplateName BaseTemplate,
38313832 SourceLocation TemplateLoc,
38323833 ArrayRef<TemplateArgument> Ts) {
38333834 auto lookUpCommonType = [&](TemplateArgument T1,
38343835 TemplateArgument T2) -> QualType {
38353836 // Don't bother looking for other specializations if both types are
38363837 // builtins - users aren't allowed to specialize for them
38373838 if (T1.getAsType ()->isBuiltinType () && T2.getAsType ()->isBuiltinType ())
3838- return builtinCommonTypeImpl (S, BaseTemplate, TemplateLoc, {T1, T2});
3839+ return builtinCommonTypeImpl (S, NNS, BaseTemplate, TemplateLoc, {T1, T2});
38393840
38403841 TemplateArgumentListInfo Args;
38413842 Args.addArgument (TemplateArgumentLoc (
@@ -3849,7 +3850,7 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
38493850 Sema::ContextRAII TUContext (S, S.Context .getTranslationUnitDecl ());
38503851
38513852 QualType BaseTemplateInst =
3852- S.CheckTemplateIdType (BaseTemplate, TemplateLoc, Args);
3853+ S.CheckTemplateIdType (NNS, BaseTemplate, TemplateLoc, Args);
38533854
38543855 if (SFINAE.hasErrorOccurred ())
38553856 return QualType ();
@@ -3962,8 +3963,8 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
39623963}
39633964
39643965static 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,
39673968 ArrayRef<TemplateArgument> CanonicalConverted, SourceLocation TemplateLoc,
39683969 TemplateArgumentListInfo &TemplateArgs) {
39693970 ASTContext &Context = SemaRef.getASTContext ();
@@ -4015,7 +4016,7 @@ static QualType checkBuiltinTemplateIdType(
40154016 // The first template argument will be reused as the template decl that
40164017 // our synthetic template arguments will be applied to.
40174018 QualType Result =
4018- SemaRef.CheckTemplateIdType (SugaredConverted[0 ].getAsTemplate (),
4019+ SemaRef.CheckTemplateIdType (NNS, SugaredConverted[0 ].getAsTemplate (),
40194020 TemplateLoc, SyntheticTemplateArgs);
40204021 return SemaRef.Context .getTemplateSpecializationType (
40214022 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4065,14 +4066,16 @@ static QualType checkBuiltinTemplateIdType(
40654066 QualType HasNoTypeMember = SugaredConverted[2 ].getAsType ();
40664067 ArrayRef<TemplateArgument> Ts = SugaredConverted[3 ].getPackAsArray ();
40674068 QualType Result = HasNoTypeMember;
4068- if (auto CT = builtinCommonTypeImpl (SemaRef, BaseTemplate, TemplateLoc, Ts);
4069+ if (auto CT =
4070+ builtinCommonTypeImpl (SemaRef, NNS, BaseTemplate, TemplateLoc, Ts);
40694071 !CT.isNull ()) {
40704072 TemplateArgumentListInfo TAs;
40714073 TAs.addArgument (TemplateArgumentLoc (
40724074 TemplateArgument (CT), SemaRef.Context .getTrivialTypeSourceInfo (
40734075 CT, TemplateArgs[1 ].getLocation ())));
40744076
4075- Result = SemaRef.CheckTemplateIdType (HasTypeMember, TemplateLoc, TAs);
4077+ Result =
4078+ SemaRef.CheckTemplateIdType (NNS, HasTypeMember, TemplateLoc, TAs);
40764079 }
40774080 return SemaRef.Context .getTemplateSpecializationType (
40784081 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4220,7 +4223,8 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
42204223 return { FailedCond, Description };
42214224}
42224225
4223- QualType Sema::CheckTemplateIdType (TemplateName Name,
4226+ QualType Sema::CheckTemplateIdType (const NestedNameSpecifier *NNS,
4227+ TemplateName Name,
42244228 SourceLocation TemplateLoc,
42254229 TemplateArgumentListInfo &TemplateArgs) {
42264230 // FIXME: 'getUnderlying' loses SubstTemplateTemplateParm nodes from alias
@@ -4299,9 +4303,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
42994303 if (!AliasTemplate->getDeclContext ()->isFileContext ())
43004304 SavedContext.emplace (*this , AliasTemplate->getDeclContext ());
43014305
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 ());
43054309 if (CanonType.isNull ()) {
43064310 // If this was enable_if and we failed to find the nested type
43074311 // within enable_if in a SFINAE context, dig out the specific
@@ -4338,9 +4342,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
43384342 return QualType ();
43394343 }
43404344 } 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);
43444348 } else if (Name.isDependent () ||
43454349 TemplateSpecializationType::anyDependentTemplateArguments (
43464350 TemplateArgs, CTAI.CanonicalConverted )) {
@@ -4583,7 +4587,8 @@ TypeResult Sema::ActOnTemplateIdType(
45834587 return CreateParsedType (T, TLB.getTypeSourceInfo (Context, T));
45844588 }
45854589
4586- QualType SpecTy = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
4590+ QualType SpecTy = CheckTemplateIdType (SS.getScopeRep (), Template,
4591+ TemplateIILoc, TemplateArgs);
45874592 if (SpecTy.isNull ())
45884593 return true ;
45894594
@@ -4664,7 +4669,8 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
46644669 Diag (TAT->getLocation (), diag::note_declared_at);
46654670 }
46664671
4667- QualType Result = CheckTemplateIdType (Template, TemplateLoc, TemplateArgs);
4672+ QualType Result = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateLoc,
4673+ TemplateArgs);
46684674 if (Result.isNull ())
46694675 return TypeResult (true );
46704676
@@ -11446,7 +11452,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
1144611452 return CreateParsedType (T, Builder.getTypeSourceInfo (Context, T));
1144711453 }
1144811454
11449- QualType T = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
11455+ QualType T = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateIILoc,
11456+ TemplateArgs);
1145011457 if (T.isNull ())
1145111458 return true ;
1145211459
0 commit comments