@@ -5261,27 +5261,25 @@ bool Sema::CheckTemplateTypeArgument(
5261
5261
// / \param Converted the list of template arguments provided for template
5262
5262
// / parameters that precede \p Param in the template parameter list.
5263
5263
// / \returns the substituted template argument, or NULL if an error occurred.
5264
- static TypeSourceInfo *
5265
- SubstDefaultTemplateArgument (Sema &SemaRef,
5266
- TemplateDecl *Template,
5267
- SourceLocation TemplateLoc,
5268
- SourceLocation RAngleLoc,
5269
- TemplateTypeParmDecl *Param,
5270
- SmallVectorImpl<TemplateArgument> &Converted) {
5264
+ static TypeSourceInfo *SubstDefaultTemplateArgument (
5265
+ Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc,
5266
+ SourceLocation RAngleLoc, TemplateTypeParmDecl *Param,
5267
+ ArrayRef<TemplateArgument> SugaredConverted,
5268
+ ArrayRef<TemplateArgument> CanonicalConverted) {
5271
5269
TypeSourceInfo *ArgType = Param->getDefaultArgumentInfo ();
5272
5270
5273
5271
// If the argument type is dependent, instantiate it now based
5274
5272
// on the previously-computed template arguments.
5275
5273
if (ArgType->getType ()->isInstantiationDependentType ()) {
5276
- Sema::InstantiatingTemplate Inst (SemaRef, TemplateLoc,
5277
- Param, Template, Converted ,
5274
+ Sema::InstantiatingTemplate Inst (SemaRef, TemplateLoc, Param, Template,
5275
+ SugaredConverted ,
5278
5276
SourceRange (TemplateLoc, RAngleLoc));
5279
5277
if (Inst.isInvalid ())
5280
5278
return nullptr ;
5281
5279
5282
5280
// Only substitute for the innermost template argument list.
5283
- MultiLevelTemplateArgumentList TemplateArgLists (Template, Converted ,
5284
- /* Final=*/ false );
5281
+ MultiLevelTemplateArgumentList TemplateArgLists (Template, SugaredConverted ,
5282
+ /* Final=*/ true );
5285
5283
for (unsigned i = 0 , e = Param->getDepth (); i != e; ++i)
5286
5284
TemplateArgLists.addOuterTemplateArguments (None);
5287
5285
@@ -5320,22 +5318,20 @@ SubstDefaultTemplateArgument(Sema &SemaRef,
5320
5318
// / parameters that precede \p Param in the template parameter list.
5321
5319
// /
5322
5320
// / \returns the substituted template argument, or NULL if an error occurred.
5323
- static ExprResult
5324
- SubstDefaultTemplateArgument (Sema &SemaRef,
5325
- TemplateDecl *Template,
5326
- SourceLocation TemplateLoc,
5327
- SourceLocation RAngleLoc,
5328
- NonTypeTemplateParmDecl *Param,
5329
- SmallVectorImpl<TemplateArgument> &Converted) {
5330
- Sema::InstantiatingTemplate Inst (SemaRef, TemplateLoc,
5331
- Param, Template, Converted,
5321
+ static ExprResult SubstDefaultTemplateArgument (
5322
+ Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc,
5323
+ SourceLocation RAngleLoc, NonTypeTemplateParmDecl *Param,
5324
+ ArrayRef<TemplateArgument> SugaredConverted,
5325
+ ArrayRef<TemplateArgument> CanonicalConverted) {
5326
+ Sema::InstantiatingTemplate Inst (SemaRef, TemplateLoc, Param, Template,
5327
+ SugaredConverted,
5332
5328
SourceRange (TemplateLoc, RAngleLoc));
5333
5329
if (Inst.isInvalid ())
5334
5330
return ExprError ();
5335
5331
5336
5332
// Only substitute for the innermost template argument list.
5337
- MultiLevelTemplateArgumentList TemplateArgLists (Template, Converted ,
5338
- /* Final=*/ false );
5333
+ MultiLevelTemplateArgumentList TemplateArgLists (Template, SugaredConverted ,
5334
+ /* Final=*/ true );
5339
5335
for (unsigned i = 0 , e = Param->getDepth (); i != e; ++i)
5340
5336
TemplateArgLists.addOuterTemplateArguments (None);
5341
5337
@@ -5370,23 +5366,21 @@ SubstDefaultTemplateArgument(Sema &SemaRef,
5370
5366
// / source-location information) that precedes the template name.
5371
5367
// /
5372
5368
// / \returns the substituted template argument, or NULL if an error occurred.
5373
- static TemplateName
5374
- SubstDefaultTemplateArgument (Sema &SemaRef,
5375
- TemplateDecl *Template,
5376
- SourceLocation TemplateLoc,
5377
- SourceLocation RAngleLoc,
5378
- TemplateTemplateParmDecl *Param,
5379
- SmallVectorImpl<TemplateArgument> &Converted,
5380
- NestedNameSpecifierLoc &QualifierLoc) {
5369
+ static TemplateName SubstDefaultTemplateArgument (
5370
+ Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc,
5371
+ SourceLocation RAngleLoc, TemplateTemplateParmDecl *Param,
5372
+ ArrayRef<TemplateArgument> SugaredConverted,
5373
+ ArrayRef<TemplateArgument> CanonicalConverted,
5374
+ NestedNameSpecifierLoc &QualifierLoc) {
5381
5375
Sema::InstantiatingTemplate Inst (
5382
- SemaRef, TemplateLoc, TemplateParameter (Param), Template, Converted,
5383
- SourceRange (TemplateLoc, RAngleLoc));
5376
+ SemaRef, TemplateLoc, TemplateParameter (Param), Template,
5377
+ SugaredConverted, SourceRange (TemplateLoc, RAngleLoc));
5384
5378
if (Inst.isInvalid ())
5385
5379
return TemplateName ();
5386
5380
5387
5381
// Only substitute for the innermost template argument list.
5388
- MultiLevelTemplateArgumentList TemplateArgLists (Template, Converted ,
5389
- /* Final=*/ false );
5382
+ MultiLevelTemplateArgumentList TemplateArgLists (Template, SugaredConverted ,
5383
+ /* Final=*/ true );
5390
5384
for (unsigned i = 0 , e = Param->getDepth (); i != e; ++i)
5391
5385
TemplateArgLists.addOuterTemplateArguments (None);
5392
5386
@@ -5410,26 +5404,21 @@ SubstDefaultTemplateArgument(Sema &SemaRef,
5410
5404
// / If the given template parameter has a default template
5411
5405
// / argument, substitute into that default template argument and
5412
5406
// / return the corresponding template argument.
5413
- TemplateArgumentLoc
5414
- Sema::SubstDefaultTemplateArgumentIfAvailable (TemplateDecl *Template,
5415
- SourceLocation TemplateLoc,
5416
- SourceLocation RAngleLoc,
5417
- Decl *Param,
5418
- SmallVectorImpl<TemplateArgument>
5419
- &Converted,
5420
- bool &HasDefaultArg) {
5407
+ TemplateArgumentLoc Sema::SubstDefaultTemplateArgumentIfAvailable (
5408
+ TemplateDecl *Template, SourceLocation TemplateLoc,
5409
+ SourceLocation RAngleLoc, Decl *Param,
5410
+ ArrayRef<TemplateArgument> SugaredConverted,
5411
+ ArrayRef<TemplateArgument> CanonicalConverted, bool &HasDefaultArg) {
5421
5412
HasDefaultArg = false ;
5422
5413
5423
5414
if (TemplateTypeParmDecl *TypeParm = dyn_cast<TemplateTypeParmDecl>(Param)) {
5424
5415
if (!hasReachableDefaultArgument (TypeParm))
5425
5416
return TemplateArgumentLoc ();
5426
5417
5427
5418
HasDefaultArg = true ;
5428
- TypeSourceInfo *DI = SubstDefaultTemplateArgument (*this , Template,
5429
- TemplateLoc,
5430
- RAngleLoc,
5431
- TypeParm,
5432
- Converted);
5419
+ TypeSourceInfo *DI = SubstDefaultTemplateArgument (
5420
+ *this , Template, TemplateLoc, RAngleLoc, TypeParm, SugaredConverted,
5421
+ CanonicalConverted);
5433
5422
if (DI)
5434
5423
return TemplateArgumentLoc (TemplateArgument (DI->getType ()), DI);
5435
5424
@@ -5442,11 +5431,9 @@ Sema::SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template,
5442
5431
return TemplateArgumentLoc ();
5443
5432
5444
5433
HasDefaultArg = true ;
5445
- ExprResult Arg = SubstDefaultTemplateArgument (*this , Template,
5446
- TemplateLoc,
5447
- RAngleLoc,
5448
- NonTypeParm,
5449
- Converted);
5434
+ ExprResult Arg = SubstDefaultTemplateArgument (
5435
+ *this , Template, TemplateLoc, RAngleLoc, NonTypeParm, SugaredConverted,
5436
+ CanonicalConverted);
5450
5437
if (Arg.isInvalid ())
5451
5438
return TemplateArgumentLoc ();
5452
5439
@@ -5461,12 +5448,9 @@ Sema::SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template,
5461
5448
5462
5449
HasDefaultArg = true ;
5463
5450
NestedNameSpecifierLoc QualifierLoc;
5464
- TemplateName TName = SubstDefaultTemplateArgument (*this , Template,
5465
- TemplateLoc,
5466
- RAngleLoc,
5467
- TempTempParm,
5468
- Converted,
5469
- QualifierLoc);
5451
+ TemplateName TName = SubstDefaultTemplateArgument (
5452
+ *this , Template, TemplateLoc, RAngleLoc, TempTempParm, SugaredConverted,
5453
+ CanonicalConverted, QualifierLoc);
5470
5454
if (TName.isNull ())
5471
5455
return TemplateArgumentLoc ();
5472
5456
@@ -5562,13 +5546,13 @@ bool Sema::CheckTemplateArgument(
5562
5546
!Template->getDeclContext ()->isDependentContext ()) {
5563
5547
// Do substitution on the type of the non-type template parameter.
5564
5548
InstantiatingTemplate Inst (*this , TemplateLoc, Template, NTTP,
5565
- CanonicalConverted ,
5549
+ SugaredConverted ,
5566
5550
SourceRange (TemplateLoc, RAngleLoc));
5567
5551
if (Inst.isInvalid ())
5568
5552
return true ;
5569
5553
5570
- MultiLevelTemplateArgumentList MLTAL (Template, CanonicalConverted ,
5571
- /* Final=*/ false );
5554
+ MultiLevelTemplateArgumentList MLTAL (Template, SugaredConverted ,
5555
+ /* Final=*/ true );
5572
5556
// If the parameter is a pack expansion, expand this slice of the pack.
5573
5557
if (auto *PET = NTTPType->getAs <PackExpansionType>()) {
5574
5558
Sema::ArgumentPackSubstitutionIndexRAII SubstIndex (*this ,
@@ -5733,7 +5717,7 @@ bool Sema::CheckTemplateArgument(
5733
5717
Params =
5734
5718
SubstTemplateParams (Params, CurContext,
5735
5719
MultiLevelTemplateArgumentList (
5736
- Template, CanonicalConverted , /* Final=*/ false ));
5720
+ Template, SugaredConverted , /* Final=*/ true ));
5737
5721
if (!Params)
5738
5722
return true ;
5739
5723
}
@@ -6012,7 +5996,8 @@ bool Sema::CheckTemplateArgumentList(
6012
5996
NewArgs);
6013
5997
6014
5998
TypeSourceInfo *ArgType = SubstDefaultTemplateArgument (
6015
- *this , Template, TemplateLoc, RAngleLoc, TTP, CanonicalConverted);
5999
+ *this , Template, TemplateLoc, RAngleLoc, TTP, SugaredConverted,
6000
+ CanonicalConverted);
6016
6001
if (!ArgType)
6017
6002
return true ;
6018
6003
@@ -6025,7 +6010,8 @@ bool Sema::CheckTemplateArgumentList(
6025
6010
NewArgs);
6026
6011
6027
6012
ExprResult E = SubstDefaultTemplateArgument (
6028
- *this , Template, TemplateLoc, RAngleLoc, NTTP, CanonicalConverted);
6013
+ *this , Template, TemplateLoc, RAngleLoc, NTTP, SugaredConverted,
6014
+ CanonicalConverted);
6029
6015
if (E.isInvalid ())
6030
6016
return true ;
6031
6017
@@ -6041,8 +6027,8 @@ bool Sema::CheckTemplateArgumentList(
6041
6027
6042
6028
NestedNameSpecifierLoc QualifierLoc;
6043
6029
TemplateName Name = SubstDefaultTemplateArgument (
6044
- *this , Template, TemplateLoc, RAngleLoc, TempParm, CanonicalConverted ,
6045
- QualifierLoc);
6030
+ *this , Template, TemplateLoc, RAngleLoc, TempParm, SugaredConverted ,
6031
+ CanonicalConverted, QualifierLoc);
6046
6032
if (Name.isNull ())
6047
6033
return true ;
6048
6034
@@ -6056,7 +6042,7 @@ bool Sema::CheckTemplateArgumentList(
6056
6042
// template here, we just create this object to put a note into the
6057
6043
// context stack.
6058
6044
InstantiatingTemplate Inst (*this , RAngleLoc, Template, *Param,
6059
- CanonicalConverted ,
6045
+ SugaredConverted ,
6060
6046
SourceRange (TemplateLoc, RAngleLoc));
6061
6047
if (Inst.isInvalid ())
6062
6048
return true ;
0 commit comments