release/20.x: [Clang] Remove the PackExpansion restrictions for rewri… · llvm/llvm-project@3007684 (original) (raw)
`@@ -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();
`