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();

`