release/20.x: [Clang] Fix various bugs in alias CTAD transform · llvm/llvm-project@c86df91 (original) (raw)

`@@ -3660,6 +3660,9 @@ class TreeTransform {

`

3660

3660

` return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());

`

3661

3661

` }

`

3662

3662

``

``

3663

`+

std::optional

`

``

3664

`+

ComputeSizeOfPackExprWithoutSubstitution(ArrayRef PackArgs);

`

``

3665

+

3663

3666

` /// Build a new expression to compute the length of a parameter pack.

`

3664

3667

` ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,

`

3665

3668

` SourceLocation PackLoc,

`

`@@ -15877,6 +15880,49 @@ TreeTransform::TransformPackExpansionExpr(PackExpansionExpr *E) {

`

15877

15880

` E->getNumExpansions());

`

15878

15881

`}

`

15879

15882

``

``

15883

`+

template

`

``

15884

`+

std::optional

`

``

15885

`+

TreeTransform::ComputeSizeOfPackExprWithoutSubstitution(

`

``

15886

`+

ArrayRef PackArgs) {

`

``

15887

`+

std::optional Result = 0;

`

``

15888

`+

for (const TemplateArgument &Arg : PackArgs) {

`

``

15889

`+

if (!Arg.isPackExpansion()) {

`

``

15890

`+

Result = *Result + 1;

`

``

15891

`+

continue;

`

``

15892

`+

}

`

``

15893

+

``

15894

`+

TemplateArgumentLoc ArgLoc;

`

``

15895

`+

InventTemplateArgumentLoc(Arg, ArgLoc);

`

``

15896

+

``

15897

`+

// Find the pattern of the pack expansion.

`

``

15898

`+

SourceLocation Ellipsis;

`

``

15899

`+

std::optional OrigNumExpansions;

`

``

15900

`+

TemplateArgumentLoc Pattern =

`

``

15901

`+

getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,

`

``

15902

`+

OrigNumExpansions);

`

``

15903

+

``

15904

`+

// Substitute under the pack expansion. Do not expand the pack (yet).

`

``

15905

`+

TemplateArgumentLoc OutPattern;

`

``

15906

`+

Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);

`

``

15907

`+

if (getDerived().TransformTemplateArgument(Pattern, OutPattern,

`

``

15908

`+

/Uneval/ true))

`

``

15909

`+

return true;

`

``

15910

+

``

15911

`+

// See if we can determine the number of arguments from the result.

`

``

15912

`+

std::optional NumExpansions =

`

``

15913

`+

getSema().getFullyPackExpandedSize(OutPattern.getArgument());

`

``

15914

`+

if (!NumExpansions) {

`

``

15915

`+

// No: we must be in an alias template expansion, and we're going to

`

``

15916

`+

// need to actually expand the packs.

`

``

15917

`+

Result = std::nullopt;

`

``

15918

`+

break;

`

``

15919

`+

}

`

``

15920

+

``

15921

`+

Result = *Result + *NumExpansions;

`

``

15922

`+

}

`

``

15923

`+

return Result;

`

``

15924

`+

}

`

``

15925

+

15880

15926

`template

`

15881

15927

`ExprResult

`

15882

15928

`TreeTransform::TransformSizeOfPackExpr(SizeOfPackExpr *E) {

`

`@@ -15942,42 +15988,8 @@ TreeTransform::TransformSizeOfPackExpr(SizeOfPackExpr *E) {

`

15942

15988

` }

`

15943

15989

``

15944

15990

` // Try to compute the result without performing a partial substitution.

`

15945

``

`-

std::optional Result = 0;

`

15946

``

`-

for (const TemplateArgument &Arg : PackArgs) {

`

15947

``

`-

if (!Arg.isPackExpansion()) {

`

15948

``

`-

Result = *Result + 1;

`

15949

``

`-

continue;

`

15950

``

`-

}

`

15951

``

-

15952

``

`-

TemplateArgumentLoc ArgLoc;

`

15953

``

`-

InventTemplateArgumentLoc(Arg, ArgLoc);

`

15954

``

-

15955

``

`-

// Find the pattern of the pack expansion.

`

15956

``

`-

SourceLocation Ellipsis;

`

15957

``

`-

std::optional OrigNumExpansions;

`

15958

``

`-

TemplateArgumentLoc Pattern =

`

15959

``

`-

getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,

`

15960

``

`-

OrigNumExpansions);

`

15961

``

-

15962

``

`-

// Substitute under the pack expansion. Do not expand the pack (yet).

`

15963

``

`-

TemplateArgumentLoc OutPattern;

`

15964

``

`-

Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);

`

15965

``

`-

if (getDerived().TransformTemplateArgument(Pattern, OutPattern,

`

15966

``

`-

/Uneval/ true))

`

15967

``

`-

return true;

`

15968

``

-

15969

``

`-

// See if we can determine the number of arguments from the result.

`

15970

``

`-

std::optional NumExpansions =

`

15971

``

`-

getSema().getFullyPackExpandedSize(OutPattern.getArgument());

`

15972

``

`-

if (!NumExpansions) {

`

15973

``

`-

// No: we must be in an alias template expansion, and we're going to need

`

15974

``

`-

// to actually expand the packs.

`

15975

``

`-

Result = std::nullopt;

`

15976

``

`-

break;

`

15977

``

`-

}

`

15978

``

-

15979

``

`-

Result = *Result + *NumExpansions;

`

15980

``

`-

}

`

``

15991

`+

std::optional Result =

`

``

15992

`+

getDerived().ComputeSizeOfPackExprWithoutSubstitution(PackArgs);

`

15981

15993

``

15982

15994

` // Common case: we could determine the number of expansions without

`

15983

15995

` // substituting.

`