@@ -3817,15 +3817,16 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
38173817 }
38183818}
38193819
3820- static QualType builtinCommonTypeImpl (Sema &S, TemplateName BaseTemplate,
3820+ static QualType builtinCommonTypeImpl (Sema &S, const NestedNameSpecifier *NNS,
3821+ TemplateName BaseTemplate,
38213822 SourceLocation TemplateLoc,
38223823 ArrayRef<TemplateArgument> Ts) {
38233824 auto lookUpCommonType = [&](TemplateArgument T1,
38243825 TemplateArgument T2) -> QualType {
38253826 // Don't bother looking for other specializations if both types are
38263827 // builtins - users aren't allowed to specialize for them
38273828 if (T1.getAsType ()->isBuiltinType () && T2.getAsType ()->isBuiltinType ())
3828- return builtinCommonTypeImpl (S, BaseTemplate, TemplateLoc, {T1, T2});
3829+ return builtinCommonTypeImpl (S, NNS, BaseTemplate, TemplateLoc, {T1, T2});
38293830
38303831 TemplateArgumentListInfo Args;
38313832 Args.addArgument (TemplateArgumentLoc (
@@ -3839,7 +3840,7 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
38393840 Sema::ContextRAII TUContext (S, S.Context .getTranslationUnitDecl ());
38403841
38413842 QualType BaseTemplateInst =
3842- S.CheckTemplateIdType (BaseTemplate, TemplateLoc, Args);
3843+ S.CheckTemplateIdType (NNS, BaseTemplate, TemplateLoc, Args);
38433844
38443845 if (SFINAE.hasErrorOccurred ())
38453846 return QualType ();
@@ -3952,8 +3953,8 @@ static QualType builtinCommonTypeImpl(Sema &S, TemplateName BaseTemplate,
39523953}
39533954
39543955static 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,
39573958 ArrayRef<TemplateArgument> CanonicalConverted, SourceLocation TemplateLoc,
39583959 TemplateArgumentListInfo &TemplateArgs) {
39593960 ASTContext &Context = SemaRef.getASTContext ();
@@ -4005,7 +4006,7 @@ static QualType checkBuiltinTemplateIdType(
40054006 // The first template argument will be reused as the template decl that
40064007 // our synthetic template arguments will be applied to.
40074008 QualType Result =
4008- SemaRef.CheckTemplateIdType (SugaredConverted[0 ].getAsTemplate (),
4009+ SemaRef.CheckTemplateIdType (NNS, SugaredConverted[0 ].getAsTemplate (),
40094010 TemplateLoc, SyntheticTemplateArgs);
40104011 return SemaRef.Context .getTemplateSpecializationType (
40114012 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4055,14 +4056,16 @@ static QualType checkBuiltinTemplateIdType(
40554056 QualType HasNoTypeMember = SugaredConverted[2 ].getAsType ();
40564057 ArrayRef<TemplateArgument> Ts = SugaredConverted[3 ].getPackAsArray ();
40574058 QualType Result = HasNoTypeMember;
4058- if (auto CT = builtinCommonTypeImpl (SemaRef, BaseTemplate, TemplateLoc, Ts);
4059+ if (auto CT =
4060+ builtinCommonTypeImpl (SemaRef, NNS, BaseTemplate, TemplateLoc, Ts);
40594061 !CT.isNull ()) {
40604062 TemplateArgumentListInfo TAs;
40614063 TAs.addArgument (TemplateArgumentLoc (
40624064 TemplateArgument (CT), SemaRef.Context .getTrivialTypeSourceInfo (
40634065 CT, TemplateArgs[1 ].getLocation ())));
40644066
4065- Result = SemaRef.CheckTemplateIdType (HasTypeMember, TemplateLoc, TAs);
4067+ Result =
4068+ SemaRef.CheckTemplateIdType (NNS, HasTypeMember, TemplateLoc, TAs);
40664069 }
40674070 return SemaRef.Context .getTemplateSpecializationType (
40684071 Name, TemplateArgs.arguments (), SugaredConverted, CanonicalConverted,
@@ -4210,7 +4213,8 @@ Sema::findFailedBooleanCondition(Expr *Cond) {
42104213 return { FailedCond, Description };
42114214}
42124215
4213- QualType Sema::CheckTemplateIdType (TemplateName Name,
4216+ QualType Sema::CheckTemplateIdType (const NestedNameSpecifier *NNS,
4217+ TemplateName Name,
42144218 SourceLocation TemplateLoc,
42154219 TemplateArgumentListInfo &TemplateArgs) {
42164220 DependentTemplateName *DTN =
@@ -4294,9 +4298,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
42944298 if (!AliasTemplate->getDeclContext ()->isFileContext ())
42954299 SavedContext.emplace (*this , AliasTemplate->getDeclContext ());
42964300
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 ());
43004304 if (CanonType.isNull ()) {
43014305 // If this was enable_if and we failed to find the nested type
43024306 // within enable_if in a SFINAE context, dig out the specific
@@ -4333,9 +4337,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
43334337 return QualType ();
43344338 }
43354339 } 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);
43394343 } else if (Name.isDependent () ||
43404344 TemplateSpecializationType::anyDependentTemplateArguments (
43414345 TemplateArgs, CTAI.CanonicalConverted )) {
@@ -4579,7 +4583,8 @@ TypeResult Sema::ActOnTemplateIdType(
45794583 return CreateParsedType (T, TLB.getTypeSourceInfo (Context, T));
45804584 }
45814585
4582- QualType SpecTy = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
4586+ QualType SpecTy = CheckTemplateIdType (SS.getScopeRep (), Template,
4587+ TemplateIILoc, TemplateArgs);
45834588 if (SpecTy.isNull ())
45844589 return true ;
45854590
@@ -4661,7 +4666,8 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
46614666 Diag (TAT->getLocation (), diag::note_declared_at);
46624667 }
46634668
4664- QualType Result = CheckTemplateIdType (Template, TemplateLoc, TemplateArgs);
4669+ QualType Result = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateLoc,
4670+ TemplateArgs);
46654671 if (Result.isNull ())
46664672 return TypeResult (true );
46674673
@@ -11451,7 +11457,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
1145111457 return CreateParsedType (T, Builder.getTypeSourceInfo (Context, T));
1145211458 }
1145311459
11454- QualType T = CheckTemplateIdType (Template, TemplateIILoc, TemplateArgs);
11460+ QualType T = CheckTemplateIdType (SS.getScopeRep (), Template, TemplateIILoc,
11461+ TemplateArgs);
1145511462 if (T.isNull ())
1145611463 return true ;
1145711464
0 commit comments