https://github.com/Backl1ght updated https://github.com/llvm/llvm-project/pull/97146
>From 7e14846e93df9f86b994c526b0da1f729c9b7cd4 Mon Sep 17 00:00:00 2001 From: Backl1ght <backlight....@gmail.com> Date: Sat, 29 Jun 2024 15:26:21 +0800 Subject: [PATCH 1/2] fix --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/AST/ExprConstant.cpp | 2 +- clang/test/SemaCXX/eval-crashes.cpp | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f6431a76b38de..ad129da506b64 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -967,6 +967,7 @@ Bug Fixes to C++ Support - Fixed an assertion failure about invalid conversion when calling lambda. (#GH96205). - Fixed a bug where the first operand of binary ``operator&`` would be transformed as if it was the operand of the address of operator. (#GH97483). +- Fixed an assertion failure about constant expression did not evaluate to integer. (#GH96670). Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 374a3acf7aa26..0ccdc5eaabeef 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -15858,7 +15858,7 @@ static bool FastEvaluateAsRValue(const Expr *Exp, Expr::EvalResult &Result, } if (const auto *CE = dyn_cast<ConstantExpr>(Exp)) { - if (CE->hasAPValueResult()) { + if (CE->hasAPValueResult() && !CE->getAPValueResult().isLValue()) { Result.Val = CE->getAPValueResult(); IsConst = true; return true; diff --git a/clang/test/SemaCXX/eval-crashes.cpp b/clang/test/SemaCXX/eval-crashes.cpp index 017df977b26b7..0865dafe4bf92 100644 --- a/clang/test/SemaCXX/eval-crashes.cpp +++ b/clang/test/SemaCXX/eval-crashes.cpp @@ -61,3 +61,13 @@ struct array { array() : data(*new int[1][2]) {} }; } + +namespace GH96670 { +inline constexpr long ullNil = -1; + +template<typename T = long, const T &Nil = ullNil> +struct Test {}; + +inline constexpr long lNil = -1; +Test<long, lNil> c; +} >From 247ea9d7257abd284823ec1ef61d79b3102fc89c Mon Sep 17 00:00:00 2001 From: Backl1ght <backlight....@gmail.com> Date: Sat, 29 Jun 2024 16:42:07 +0800 Subject: [PATCH 2/2] address comments --- clang/docs/ReleaseNotes.rst | 3 ++- clang/lib/AST/ExprConstant.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ad129da506b64..d60c6fbf15d56 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -967,7 +967,8 @@ Bug Fixes to C++ Support - Fixed an assertion failure about invalid conversion when calling lambda. (#GH96205). - Fixed a bug where the first operand of binary ``operator&`` would be transformed as if it was the operand of the address of operator. (#GH97483). -- Fixed an assertion failure about constant expression did not evaluate to integer. (#GH96670). +- Fixed an assertion failure about a constant expression which is a known integer but is not + evaluated to an integer. (#GH96670). Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 0ccdc5eaabeef..e0c9ef68cb448 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -15858,10 +15858,13 @@ static bool FastEvaluateAsRValue(const Expr *Exp, Expr::EvalResult &Result, } if (const auto *CE = dyn_cast<ConstantExpr>(Exp)) { - if (CE->hasAPValueResult() && !CE->getAPValueResult().isLValue()) { - Result.Val = CE->getAPValueResult(); - IsConst = true; - return true; + if (CE->hasAPValueResult()) { + APValue APV = CE->getAPValueResult(); + if (!APV.isLValue()) { + Result.Val = std::move(APV); + IsConst = true; + return true; + } } // The SubExpr is usually just an IntegerLiteral. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits