[clang] cc8fa1e - [clang][Interp][NFC] Refactor lvalue-to-rvalue conversion code
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Sat Jun 8 21:33:42 PDT 2024
Author: Timm Bäder
Date: 2024-06-09T06:32:12+02:00
New Revision: cc8fa1e9206aa69197c891ca2f17b64340c5a6aa
URL: https://github.com/llvm/llvm-project/commit/cc8fa1e9206aa69197c891ca2f17b64340c5a6aa
DIFF: https://github.com/llvm/llvm-project/commit/cc8fa1e9206aa69197c891ca2f17b64340c5a6aa.diff
LOG: [clang][Interp][NFC] Refactor lvalue-to-rvalue conversion code
Really perform the conversion always if the flag is set and don't make
it dependent on whether we're checking the result for initialization.
Added:
Modified:
clang/lib/AST/Interp/EvalEmitter.cpp
clang/lib/AST/Interp/EvaluationResult.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/EvalEmitter.cpp b/clang/lib/AST/Interp/EvalEmitter.cpp
index f6191d8ed6345..025b46b3d7886 100644
--- a/clang/lib/AST/Interp/EvalEmitter.cpp
+++ b/clang/lib/AST/Interp/EvalEmitter.cpp
@@ -40,7 +40,7 @@ void EvalEmitter::cleanup() { S.cleanup(); }
EvaluationResult EvalEmitter::interpretExpr(const Expr *E,
bool ConvertResultToRValue) {
S.setEvalLocation(E->getExprLoc());
- this->ConvertResultToRValue = ConvertResultToRValue;
+ this->ConvertResultToRValue = ConvertResultToRValue && !isa<ConstantExpr>(E);
this->CheckFullyInitialized = isa<ConstantExpr>(E);
EvalResult.setSource(E);
@@ -56,10 +56,14 @@ EvaluationResult EvalEmitter::interpretExpr(const Expr *E,
EvaluationResult EvalEmitter::interpretDecl(const VarDecl *VD,
bool CheckFullyInitialized) {
this->CheckFullyInitialized = CheckFullyInitialized;
- this->ConvertResultToRValue =
- VD->getAnyInitializer() &&
- (VD->getAnyInitializer()->getType()->isAnyComplexType() ||
- VD->getAnyInitializer()->getType()->isVectorType());
+
+ if (const Expr *Init = VD->getAnyInitializer()) {
+ QualType T = VD->getType();
+ this->ConvertResultToRValue = !Init->isGLValue() && !T->isPointerType() &&
+ !T->isObjCObjectPointerType();
+ } else
+ this->ConvertResultToRValue = false;
+
EvalResult.setSource(VD);
if (!this->visitDecl(VD) && EvalResult.empty())
@@ -138,6 +142,10 @@ template <> bool EvalEmitter::emitRet<PT_Ptr>(const SourceInfo &Info) {
return true;
const Pointer &Ptr = S.Stk.pop<Pointer>();
+
+ if (CheckFullyInitialized && !EvalResult.checkFullyInitialized(S, Ptr))
+ return false;
+
// Implicitly convert lvalue to rvalue, if requested.
if (ConvertResultToRValue) {
if (std::optional<APValue> V = Ptr.toRValue(Ctx)) {
@@ -146,17 +154,7 @@ template <> bool EvalEmitter::emitRet<PT_Ptr>(const SourceInfo &Info) {
return false;
}
} else {
- if (CheckFullyInitialized) {
- if (!EvalResult.checkFullyInitialized(S, Ptr))
- return false;
-
- std::optional<APValue> RValueResult = Ptr.toRValue(Ctx);
- if (!RValueResult)
- return false;
- EvalResult.setValue(*RValueResult);
- } else {
- EvalResult.setValue(Ptr.toAPValue());
- }
+ EvalResult.setValue(Ptr.toAPValue());
}
return true;
diff --git a/clang/lib/AST/Interp/EvaluationResult.cpp b/clang/lib/AST/Interp/EvaluationResult.cpp
index 29977232975fc..387e3dc88bff2 100644
--- a/clang/lib/AST/Interp/EvaluationResult.cpp
+++ b/clang/lib/AST/Interp/EvaluationResult.cpp
@@ -151,9 +151,12 @@ bool EvaluationResult::checkFullyInitialized(InterpState &S,
if (const Record *R = Ptr.getRecord())
return CheckFieldsInitialized(S, InitLoc, Ptr, R);
- const auto *CAT =
- cast<ConstantArrayType>(Ptr.getType()->getAsArrayTypeUnsafe());
- return CheckArrayInitialized(S, InitLoc, Ptr, CAT);
+
+ if (const auto *CAT = dyn_cast_if_present<ConstantArrayType>(
+ Ptr.getType()->getAsArrayTypeUnsafe()))
+ return CheckArrayInitialized(S, InitLoc, Ptr, CAT);
+
+ return true;
}
} // namespace interp
More information about the cfe-commits
mailing list