@@ -5205,7 +5205,7 @@ bool Sema::CheckTemplateArgument(
52055205 SmallVectorImpl<TemplateArgument> &SugaredConverted,
52065206 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
52075207 CheckTemplateArgumentKind CTAK, bool PartialOrdering,
5208- bool *MatchedPackOnParmToNonPackOnArg) {
5208+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg) {
52095209 // Check template type parameters.
52105210 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
52115211 return CheckTemplateTypeArgument (TTP, Arg, SugaredConverted,
@@ -5260,8 +5260,9 @@ bool Sema::CheckTemplateArgument(
52605260 Expr *E = Arg.getArgument ().getAsExpr ();
52615261 TemplateArgument SugaredResult, CanonicalResult;
52625262 unsigned CurSFINAEErrors = NumSFINAEErrors;
5263- ExprResult Res = CheckTemplateArgument (NTTP, NTTPType, E, SugaredResult,
5264- CanonicalResult, CTAK);
5263+ ExprResult Res =
5264+ CheckTemplateArgument (NTTP, NTTPType, E, SugaredResult,
5265+ CanonicalResult, PartialOrderingTTP, CTAK);
52655266 if (Res.isInvalid ())
52665267 return true ;
52675268 // If the current template argument causes an error, give up now.
@@ -5326,7 +5327,8 @@ bool Sema::CheckTemplateArgument(
53265327
53275328 TemplateArgument SugaredResult, CanonicalResult;
53285329 E = CheckTemplateArgument (NTTP, NTTPType, E.get (), SugaredResult,
5329- CanonicalResult, CTAK_Specified);
5330+ CanonicalResult, /* PartialOrderingTTP=*/ false ,
5331+ CTAK_Specified);
53305332 if (E.isInvalid ())
53315333 return true ;
53325334
@@ -5585,11 +5587,11 @@ bool Sema::CheckTemplateArgumentList(
55855587 getExpandedPackSize (*Param))
55865588 Arg = Arg.getPackExpansionPattern ();
55875589 TemplateArgumentLoc NewArgLoc (Arg, ArgLoc.getLocInfo ());
5588- if (CheckTemplateArgument (*Param, NewArgLoc, Template, TemplateLoc,
5589- RAngleLoc, SugaredArgumentPack. size () ,
5590- SugaredConverted, CanonicalConverted ,
5591- CTAK_Specified, /* PartialOrdering=*/ false ,
5592- MatchedPackOnParmToNonPackOnArg))
5590+ if (CheckTemplateArgument (
5591+ *Param, NewArgLoc, Template, TemplateLoc, RAngleLoc ,
5592+ SugaredArgumentPack. size (), SugaredConverted ,
5593+ CanonicalConverted, CTAK_Specified, /* PartialOrdering=*/ false ,
5594+ /* PartialOrderingTTP= */ true , MatchedPackOnParmToNonPackOnArg))
55935595 return true ;
55945596 Arg = NewArgLoc.getArgument ();
55955597 CanonicalConverted.back ().setIsDefaulted (
@@ -5601,11 +5603,11 @@ bool Sema::CheckTemplateArgumentList(
56015603 TemplateArgumentLoc (TemplateArgument::CreatePackCopy (Context, Args),
56025604 ArgLoc.getLocInfo ());
56035605 } else {
5604- if (CheckTemplateArgument (*Param, ArgLoc, Template, TemplateLoc,
5605- RAngleLoc, SugaredArgumentPack. size () ,
5606- SugaredConverted, CanonicalConverted ,
5607- CTAK_Specified, /* PartialOrdering=*/ false ,
5608- MatchedPackOnParmToNonPackOnArg))
5606+ if (CheckTemplateArgument (
5607+ *Param, ArgLoc, Template, TemplateLoc, RAngleLoc ,
5608+ SugaredArgumentPack. size (), SugaredConverted ,
5609+ CanonicalConverted, CTAK_Specified, /* PartialOrdering=*/ false ,
5610+ PartialOrderingTTP, MatchedPackOnParmToNonPackOnArg))
56095611 return true ;
56105612 CanonicalConverted.back ().setIsDefaulted (
56115613 clang::isSubstitutedDefaultArgument (Context, ArgLoc.getArgument (),
@@ -5753,6 +5755,7 @@ bool Sema::CheckTemplateArgumentList(
57535755 if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
57545756 SugaredConverted, CanonicalConverted,
57555757 CTAK_Specified, /* PartialOrdering=*/ false ,
5758+ /* PartialOrderingTTP=*/ false ,
57565759 /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
57575760 return true ;
57585761
@@ -6740,6 +6743,7 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
67406743 QualType ParamType, Expr *Arg,
67416744 TemplateArgument &SugaredConverted,
67426745 TemplateArgument &CanonicalConverted,
6746+ bool PartialOrderingTTP,
67436747 CheckTemplateArgumentKind CTAK) {
67446748 SourceLocation StartLoc = Arg->getBeginLoc ();
67456749
@@ -6930,17 +6934,21 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
69306934 IsConvertedConstantExpression = false ;
69316935 }
69326936
6933- if (getLangOpts ().CPlusPlus17 ) {
6937+ if (getLangOpts ().CPlusPlus17 || PartialOrderingTTP ) {
69346938 // C++17 [temp.arg.nontype]p1:
69356939 // A template-argument for a non-type template parameter shall be
69366940 // a converted constant expression of the type of the template-parameter.
69376941 APValue Value;
69386942 ExprResult ArgResult;
69396943 if (IsConvertedConstantExpression) {
6940- ArgResult = BuildConvertedConstantExpression (Arg, ParamType,
6941- CCEK_TemplateArg, Param);
6942- if (ArgResult.isInvalid ())
6944+ ArgResult = BuildConvertedConstantExpression (
6945+ Arg, ParamType,
6946+ PartialOrderingTTP ? CCEK_InjectedTTP : CCEK_TemplateArg, Param);
6947+ assert (!ArgResult.isUnset ());
6948+ if (ArgResult.isInvalid ()) {
6949+ NoteTemplateParameterLocation (*Param);
69436950 return ExprError ();
6951+ }
69446952 } else {
69456953 ArgResult = Arg;
69466954 }
0 commit comments