Skip to content

Commit c34b918

Browse files
committed
Avoid layering violation
1 parent f9d44b9 commit c34b918

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

clang/include/clang/AST/ExprCXX.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4326,6 +4326,8 @@ class SizeOfPackExpr final
43264326
/// Retrieve the parameter pack.
43274327
NamedDecl *getPack() const { return Pack; }
43284328

4329+
void setPack(NamedDecl *NewPack) { Pack = NewPack; }
4330+
43294331
/// Retrieve the length of the parameter pack.
43304332
///
43314333
/// This routine may only be invoked when the expression is not

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,21 +1731,21 @@ namespace {
17311731
return inherited::TransformLambdaBody(E, Body);
17321732
}
17331733

1734-
ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
1735-
NamedDecl *Pack, SourceLocation PackLoc,
1736-
SourceLocation RParenLoc,
1737-
std::optional<unsigned> Length,
1738-
ArrayRef<TemplateArgument> PartialArgs) {
1739-
Decl *NewPack = Pack;
1734+
ExprResult TransformSizeOfPackExpr(SizeOfPackExpr *E) {
1735+
ExprResult Transformed = inherited::TransformSizeOfPackExpr(E);
1736+
if (!Transformed.isUsable())
1737+
return Transformed;
1738+
auto *TransformedExpr = cast<SizeOfPackExpr>(Transformed.get());
17401739
if (SemaRef.CodeSynthesisContexts.back().Kind ==
1741-
Sema::CodeSynthesisContext::ConstraintNormalization) {
1742-
NewPack = TransformDecl(PackLoc, Pack);
1740+
Sema::CodeSynthesisContext::ConstraintNormalization &&
1741+
TransformedExpr->getPack() == E->getPack()) {
1742+
Decl *NewPack =
1743+
TransformDecl(E->getPackLoc(), TransformedExpr->getPack());
17431744
if (!NewPack)
17441745
return ExprError();
1746+
TransformedExpr->setPack(cast<NamedDecl>(NewPack));
17451747
}
1746-
return inherited::RebuildSizeOfPackExpr(OperatorLoc,
1747-
cast<NamedDecl>(NewPack), PackLoc,
1748-
RParenLoc, Length, PartialArgs);
1748+
return TransformedExpr;
17491749
}
17501750

17511751
ExprResult TransformRequiresExpr(RequiresExpr *E) {

0 commit comments

Comments
 (0)