[PATCH] D142328: [clang][Interp] Fix compound assign operator types
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 25 01:12:45 PST 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGde3a3cb987f1: [clang][Interp] Fix compound assign operator types (authored by tbaeder).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142328/new/
https://reviews.llvm.org/D142328
Files:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp
===================================================================
--- clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -498,10 +498,13 @@
const CompoundAssignOperator *E) {
const Expr *LHS = E->getLHS();
const Expr *RHS = E->getRHS();
- std::optional<PrimType> LT = classify(E->getLHS()->getType());
- std::optional<PrimType> RT = classify(E->getRHS()->getType());
+ std::optional<PrimType> LHSComputationT =
+ classify(E->getComputationLHSType());
+ std::optional<PrimType> LT = classify(LHS->getType());
+ std::optional<PrimType> RT = classify(E->getComputationResultType());
+ std::optional<PrimType> ResultT = classify(E->getType());
- if (!LT || !RT)
+ if (!LT || !RT || !ResultT || !LHSComputationT)
return false;
assert(!E->getType()->isPointerType() &&
@@ -512,29 +515,36 @@
return false;
if (!this->emitLoad(*LT, E))
return false;
+ // If necessary, cast LHS to its computation type.
+ if (*LT != *LHSComputationT) {
+ if (!this->emitCast(*LT, *LHSComputationT, E))
+ return false;
+ }
+
if (!visit(RHS))
return false;
// Perform operation.
switch (E->getOpcode()) {
case BO_AddAssign:
- if (!this->emitAdd(*LT, E))
+ if (!this->emitAdd(*LHSComputationT, E))
return false;
break;
case BO_SubAssign:
- if (!this->emitSub(*LT, E))
+ if (!this->emitSub(*LHSComputationT, E))
return false;
break;
case BO_MulAssign:
case BO_DivAssign:
case BO_RemAssign:
+
case BO_ShlAssign:
- if (!this->emitShl(*LT, *RT, E))
+ if (!this->emitShl(*LHSComputationT, *RT, E))
return false;
break;
case BO_ShrAssign:
- if (!this->emitShr(*LT, *RT, E))
+ if (!this->emitShr(*LHSComputationT, *RT, E))
return false;
break;
case BO_AndAssign:
@@ -544,10 +554,16 @@
llvm_unreachable("Unimplemented compound assign operator");
}
+ // And now cast from LHSComputationT to ResultT.
+ if (*ResultT != *LHSComputationT) {
+ if (!this->emitCast(*LHSComputationT, *ResultT, E))
+ return false;
+ }
+
// And store the result in LHS.
if (DiscardResult)
- return this->emitStorePop(*LT, E);
- return this->emitStore(*LT, E);
+ return this->emitStorePop(*ResultT, E);
+ return this->emitStore(*ResultT, E);
}
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142328.492020.patch
Type: text/x-patch
Size: 2464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230125/0ae87794/attachment.bin>
More information about the cfe-commits
mailing list