@@ -3826,15 +3826,16 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
38263826 }
38273827}
38283828
3829- static QualType builtinCommonTypeImpl (Sema &S, TemplateName BaseTemplate,
3829+ static QualType builtinCommonTypeImpl (Sema &S, const NestedNameSpecifier *NNS,
3830+ TemplateName BaseTemplate,
38303831 SourceLocation TemplateLoc,
38313832 ArrayRef<TemplateArgument> Ts) {
38323833 auto lookUpCommonType = [&](TemplateArgument T1,
38333834 TemplateArgument T2) -> QualType {
38343835 // Don't bother looking for other specializations if both types are
38353836 // builtins - users aren't allowed to specialize for them
38363837 if (T1.getAsType ()->isBuiltinType () && T2.getAsType ()->isBuiltinType ())
3837- return builtinCommonTypeImpl (S, BaseTemplate, TemplateLoc, {T1, T2});
3838+ return builtinCommonTypeImpl (S, NNS, BaseTemplate, TemplateLoc, {T1, T2});
38383839
38393840 TemplateArgumentListInfo Args;
38403841 Args.addArgument (TemplateArgumentLoc (
@@ -3848,7 +3849,7 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
38483849 Sema::ContextRAII TUContext (S, S.Context .getTranslationUnitDecl ());
38493850
38503851 QualType BaseTemplateInst =
3851- S.CheckTemplateIdType (BaseTemplate, TemplateLoc, Args);
3852+ S.CheckTemplateIdType (NNS, BaseTemplate, TemplateLoc, Args);
38523853
38533854 if (SFINAE.hasErrorOccurred ())
38543855 return QualType ();
@@ -3961,8 +3962,8 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
39613962}
39623963
39633964static 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,
39663967 ArrayRef<TemplateArgument> CanonicalConverted, SourceLocation TemplateLoc,
39673968 TemplateArgumentListInfo &TemplateArgs) {
39683969 ASTContext &Context = SemaRef.getASTContext ();
@@ -4014,7 +4015,7 @@ static QualType checkBuiltinTemplateIdType(
40144015 // The first template argument will be reused as the template decl that
40154016 // our synthetic template arguments will be applied to.
40164017 QualType Result =
4017- SemaRef.CheckTemplateIdType (SugaredConverted[0 ].getAsTemplate (),
4018+ SemaRef.CheckTemplateIdType (NNS, SugaredConverted[0 ].getAsTemplate (),
40184019 TemplateLoc, SyntheticTemplateArgs);
40194020 return SemaRef.Context .getTemplateSpecializationType (
40204021 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4064,14 +4065,16 @@ static QualType checkBuiltinTemplateIdType(
40644065 QualType HasNoTypeMember = SugaredConverted[2 ].getAsType ();
40654066 ArrayRef<TemplateArgument> Ts = SugaredConverted[3 ].getPackAsArray ();
40664067 QualType Result = HasNoTypeMember;
4067- if (auto CT = builtinCommonTypeImpl (SemaRef, BaseTemplate, TemplateLoc, Ts);
4068+ if (auto CT =
4069+ builtinCommonTypeImpl (SemaRef, NNS, BaseTemplate, TemplateLoc, Ts);
40684070 !CT.isNull ()) {
40694071 TemplateArgumentListInfo TAs;
40704072 TAs.addArgument (TemplateArgumentLoc (
40714073 TemplateArgument (CT), SemaRef.Context .getTrivialTypeSourceInfo (
40724074 CT, TemplateArgs[1 ].getLocation ())));
40734075
4074- Result = SemaRef.CheckTemplateIdType (HasTypeMember, TemplateLoc, TAs);
4076+ Result =
4077+ SemaRef.CheckTemplateIdType (NNS, HasTypeMember, TemplateLoc, TAs);
40754078 }
40764079 return SemaRef.Context .getTemplateSpecializationType (
40774080 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4219,7 +4222,8 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
42194222 return { FailedCond, Description };
42204223}
42214224
4222- QualType Sema::CheckTemplateIdType (TemplateName Name,
4225+ QualType Sema::CheckTemplateIdType (const NestedNameSpecifier *NNS,
4226+ TemplateName Name,
42234227 SourceLocation TemplateLoc,
42244228 TemplateArgumentListInfo &TemplateArgs) {
42254229 // FIXME: 'getUnderlying' loses SubstTemplateTemplateParm nodes from alias
@@ -4298,9 +4302,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
42984302 if (!AliasTemplate->getDeclContext ()->isFileContext ())
42994303 SavedContext.emplace (*this , AliasTemplate->getDeclContext ());
43004304
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 ());
43044308 if (CanonType.isNull ()) {
43054309 // If this was enable_if and we failed to find the nested type
43064310 // within enable_if in a SFINAE context, dig out the specific
@@ -4337,9 +4341,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
43374341 return QualType ();
43384342 }
43394343 } 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);
43434347 } else if (Name.isDependent () ||
43444348 TemplateSpecializationType::anyDependentTemplateArguments (
43454349 TemplateArgs, CTAI.CanonicalConverted )) {
@@ -4582,7 +4586,8 @@ TypeResult Sema::ActOnTemplateIdType(
45824586 return CreateParsedType (T, TLB.getTypeSourceInfo (Context, T));
45834587 }
45844588
4585- QualType SpecTy = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
4589+ QualType SpecTy = CheckTemplateIdType (SS.getScopeRep (), Template,
4590+ TemplateIILoc, TemplateArgs);
45864591 if (SpecTy.isNull ())
45874592 return true ;
45884593
@@ -4663,7 +4668,8 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
46634668 Diag (TAT->getLocation (), diag::note_declared_at);
46644669 }
46654670
4666- QualType Result = CheckTemplateIdType (Template, TemplateLoc, TemplateArgs);
4671+ QualType Result = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateLoc,
4672+ TemplateArgs);
46674673 if (Result.isNull ())
46684674 return TypeResult (true );
46694675
@@ -11444,7 +11450,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
1144411450 return CreateParsedType (T, Builder.getTypeSourceInfo (Context, T));
1144511451 }
1144611452
11447- QualType T = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
11453+ QualType T = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateIILoc,
11454+ TemplateArgs);
1144811455 if (T.isNull ())
1144911456 return true ;
1145011457
0 commit comments