@@ -1467,6 +1467,18 @@ namespace {
1467
1467
}
1468
1468
}
1469
1469
1470
+ static TemplateArgument
1471
+ getTemplateArgumentPackPatternForRewrite (const TemplateArgument &TA) {
1472
+ if (TA.getKind () != TemplateArgument::Pack)
1473
+ return TA;
1474
+ assert (TA.pack_size () == 1 &&
1475
+ " unexpected pack arguments in template rewrite" );
1476
+ TemplateArgument Arg = *TA.pack_begin ();
1477
+ if (Arg.isPackExpansion ())
1478
+ Arg = Arg.getPackExpansionPattern ();
1479
+ return Arg;
1480
+ }
1481
+
1470
1482
// / Transform the given declaration by instantiating a reference to
1471
1483
// / this declaration.
1472
1484
Decl *TransformDecl (SourceLocation Loc, Decl *D);
@@ -1624,7 +1636,7 @@ namespace {
1624
1636
TemplateArgumentLoc Input = SemaRef.getTrivialTemplateArgumentLoc (
1625
1637
pack, QualType (), SourceLocation{});
1626
1638
TemplateArgumentLoc Output;
1627
- if (SemaRef. SubstTemplateArgument (Input, TemplateArgs, Output ))
1639
+ if (TransformTemplateArgument (Input, Output, Uneval ))
1628
1640
return true ; // fails
1629
1641
TArgs.push_back (Output.getArgument ());
1630
1642
}
@@ -2036,11 +2048,7 @@ TemplateName TemplateInstantiator::TransformTemplateName(
2036
2048
if (TemplateArgs.isRewrite ()) {
2037
2049
// We're rewriting the template parameter as a reference to another
2038
2050
// template parameter.
2039
- if (Arg.getKind () == TemplateArgument::Pack) {
2040
- assert (Arg.pack_size () == 1 && Arg.pack_begin ()->isPackExpansion () &&
2041
- " unexpected pack arguments in template rewrite" );
2042
- Arg = Arg.pack_begin ()->getPackExpansionPattern ();
2043
- }
2051
+ Arg = getTemplateArgumentPackPatternForRewrite (Arg);
2044
2052
assert (Arg.getKind () == TemplateArgument::Template &&
2045
2053
" unexpected nontype template argument kind in template rewrite" );
2046
2054
return Arg.getAsTemplate ();
@@ -2121,11 +2129,7 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
2121
2129
if (TemplateArgs.isRewrite ()) {
2122
2130
// We're rewriting the template parameter as a reference to another
2123
2131
// template parameter.
2124
- if (Arg.getKind () == TemplateArgument::Pack) {
2125
- assert (Arg.pack_size () == 1 && Arg.pack_begin ()->isPackExpansion () &&
2126
- " unexpected pack arguments in template rewrite" );
2127
- Arg = Arg.pack_begin ()->getPackExpansionPattern ();
2128
- }
2132
+ Arg = getTemplateArgumentPackPatternForRewrite (Arg);
2129
2133
assert (Arg.getKind () == TemplateArgument::Expression &&
2130
2134
" unexpected nontype template argument kind in template rewrite" );
2131
2135
// FIXME: This can lead to the same subexpression appearing multiple times
@@ -2578,11 +2582,7 @@ TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
2578
2582
if (TemplateArgs.isRewrite ()) {
2579
2583
// We're rewriting the template parameter as a reference to another
2580
2584
// template parameter.
2581
- if (Arg.getKind () == TemplateArgument::Pack) {
2582
- assert (Arg.pack_size () == 1 && Arg.pack_begin ()->isPackExpansion () &&
2583
- " unexpected pack arguments in template rewrite" );
2584
- Arg = Arg.pack_begin ()->getPackExpansionPattern ();
2585
- }
2585
+ Arg = getTemplateArgumentPackPatternForRewrite (Arg);
2586
2586
assert (Arg.getKind () == TemplateArgument::Type &&
2587
2587
" unexpected nontype template argument kind in template rewrite" );
2588
2588
QualType NewT = Arg.getAsType ();
0 commit comments