[PATCH] D132136: [clang] Perform implicit lvalue-to-rvalue cast with new interpreter
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 18 07:11:22 PDT 2022
tbaeder created this revision.
tbaeder added reviewers: erichkeane, aaron.ballman, shafik, tahonermann.
Herald added a project: All.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Extra bonus patch.
The EvaluateAsRValue() documentation mentions that an implicit
lvalue-to-rvalue cast is being performed if the result is an lvalue.
However, that was not being done if the new constant interpreter was in
use.
Just always do it.
This touches `ExprConstant.cpp`, but is a NFC patch if the new constant interpreter is not in use.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D132136
Files:
clang/lib/AST/ExprConstant.cpp
clang/test/AST/Interp/literals.cpp
Index: clang/test/AST/Interp/literals.cpp
===================================================================
--- clang/test/AST/Interp/literals.cpp
+++ clang/test/AST/Interp/literals.cpp
@@ -9,10 +9,8 @@
constexpr int number = 10;
static_assert(number == 10, "");
-static_assert(number != 10, ""); // expected-error{{failed}}
-#ifdef REFERENCE
- // expected-note at -2{{evaluates to}}
-#endif
+static_assert(number != 10, ""); // expected-error{{failed}} \
+ // expected-note{{evaluates to}}
constexpr bool getTrue() { return true; }
constexpr bool getFalse() { return false; }
Index: clang/lib/AST/ExprConstant.cpp
===================================================================
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -14934,25 +14934,27 @@
/// lvalue-to-rvalue cast if it is an lvalue.
static bool EvaluateAsRValue(EvalInfo &Info, const Expr *E, APValue &Result) {
assert(!E->isValueDependent());
+
+ if (E->getType().isNull())
+ return false;
+
+ if (!CheckLiteralType(Info, E))
+ return false;
+
if (Info.EnableNewConstInterp) {
if (!Info.Ctx.getInterpContext().evaluateAsRValue(Info, E, Result))
return false;
} else {
- if (E->getType().isNull())
- return false;
-
- if (!CheckLiteralType(Info, E))
- return false;
-
if (!::Evaluate(Result, Info, E))
return false;
+ }
- if (E->isGLValue()) {
- LValue LV;
- LV.setFrom(Info.Ctx, Result);
- if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result))
- return false;
- }
+ // Implicit lvalue-to-rvalue cast.
+ if (E->isGLValue()) {
+ LValue LV;
+ LV.setFrom(Info.Ctx, Result);
+ if (!handleLValueToRValueConversion(Info, E, E->getType(), LV, Result))
+ return false;
}
// Check this core constant expression is a constant expression.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132136.453651.patch
Type: text/x-patch
Size: 1922 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220818/ffa0542b/attachment.bin>
More information about the cfe-commits
mailing list