Author: Ilya Biryukov Date: 2024-07-23T12:28:59+02:00 New Revision: 363e036ac002d5af4bb82e303052b806a98086a1
URL: https://github.com/llvm/llvm-project/commit/363e036ac002d5af4bb82e303052b806a98086a1 DIFF: https://github.com/llvm/llvm-project/commit/363e036ac002d5af4bb82e303052b806a98086a1.diff LOG: [AST] NFC: add an assertion for invariant of CXXFoldExpr CXXFoldExpr relies on exactly one of the two operands to have unexpanded parameter packs. If this invariant does not holds, results of `getPattern()`, `isLeftFold()` and other related members are incorrect. Asserting this on construction makes debugging the problems easier as the failure is happening closer to the code that contains the error. Also move the constructor to the `.cpp` file to avoid potential ODR violations from having an `assert` in the header in combination with precompiled libraries. Added: Modified: clang/include/clang/AST/ExprCXX.h clang/lib/AST/ExprCXX.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index c2feac525c1ea..f86f1818110e6 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -4854,15 +4854,7 @@ class CXXFoldExpr : public Expr { CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Opcode, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, - std::optional<unsigned> NumExpansions) - : Expr(CXXFoldExprClass, T, VK_PRValue, OK_Ordinary), - LParenLoc(LParenLoc), EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc), - NumExpansions(NumExpansions ? *NumExpansions + 1 : 0), Opcode(Opcode) { - SubExprs[SubExpr::Callee] = Callee; - SubExprs[SubExpr::LHS] = LHS; - SubExprs[SubExpr::RHS] = RHS; - setDependence(computeDependence(this)); - } + std::optional<unsigned> NumExpansions); CXXFoldExpr(EmptyShell Empty) : Expr(CXXFoldExprClass, Empty) {} diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 8d2a1b5611ccc..e2c9643151126 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -1944,3 +1944,22 @@ CXXParenListInitExpr *CXXParenListInitExpr::CreateEmpty(ASTContext &C, alignof(CXXParenListInitExpr)); return new (Mem) CXXParenListInitExpr(Empty, NumExprs); } + +CXXFoldExpr::CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee, + SourceLocation LParenLoc, Expr *LHS, + BinaryOperatorKind Opcode, + SourceLocation EllipsisLoc, Expr *RHS, + SourceLocation RParenLoc, + std::optional<unsigned> NumExpansions) + : Expr(CXXFoldExprClass, T, VK_PRValue, OK_Ordinary), LParenLoc(LParenLoc), + EllipsisLoc(EllipsisLoc), RParenLoc(RParenLoc), + NumExpansions(NumExpansions ? *NumExpansions + 1 : 0), Opcode(Opcode) { + // We rely on asserted invariant to distinguish left and right folds. + assert(((LHS && LHS->containsUnexpandedParameterPack()) != + (RHS && RHS->containsUnexpandedParameterPack())) && + "Exactly one of LHS or RHS should contain an unexpanded pack"); + SubExprs[SubExpr::Callee] = Callee; + SubExprs[SubExpr::LHS] = LHS; + SubExprs[SubExpr::RHS] = RHS; + setDependence(computeDependence(this)); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits