[clang] [Clang][ExprConstant] fix constant expression did not evaluate to integer (PR #97146)
Zhikai Zeng via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 6 01:28:11 PDT 2024
https://github.com/Backl1ght updated https://github.com/llvm/llvm-project/pull/97146
>From 804c18269ab0c8018834a89f286e05c7e479ed42 Mon Sep 17 00:00:00 2001
From: Backl1ght <backlight.zzk at 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 f72cad6f736b2555ac15f169b7d8614b2649c7f9 Mon Sep 17 00:00:00 2001
From: Backl1ght <backlight.zzk at 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.
More information about the cfe-commits
mailing list