[clang] 103469b - [clang][Interp] Implement more easy _Complex unary operators
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 12 01:00:21 PDT 2024
Author: Timm Bäder
Date: 2024-03-12T08:51:12+01:00
New Revision: 103469b5f7467d5df15799c2d8ad150729bc33bd
URL: https://github.com/llvm/llvm-project/commit/103469b5f7467d5df15799c2d8ad150729bc33bd
DIFF: https://github.com/llvm/llvm-project/commit/103469b5f7467d5df15799c2d8ad150729bc33bd.diff
LOG: [clang][Interp] Implement more easy _Complex unary operators
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index da4a8f88f1396a..86304a54473cea 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3138,16 +3138,17 @@ bool ByteCodeExprGen<Emitter>::VisitComplexUnaryOperator(
return this->discard(SubExpr);
std::optional<PrimType> ResT = classify(E);
+ auto prepareResult = [=]() -> bool {
+ if (!ResT && !Initializing) {
+ std::optional<unsigned> LocalIndex =
+ allocateLocal(SubExpr, /*IsExtended=*/false);
+ if (!LocalIndex)
+ return false;
+ return this->emitGetPtrLocal(*LocalIndex, E);
+ }
- // Prepare storage for result.
- if (!ResT && !Initializing) {
- std::optional<unsigned> LocalIndex =
- allocateLocal(SubExpr, /*IsExtended=*/false);
- if (!LocalIndex)
- return false;
- if (!this->emitGetPtrLocal(*LocalIndex, E))
- return false;
- }
+ return true;
+ };
// The offset of the temporary, if we created one.
unsigned SubExprOffset = ~0u;
@@ -3167,6 +3168,8 @@ bool ByteCodeExprGen<Emitter>::VisitComplexUnaryOperator(
switch (E->getOpcode()) {
case UO_Minus:
+ if (!prepareResult())
+ return false;
if (!createTemp())
return false;
for (unsigned I = 0; I != 2; ++I) {
@@ -3179,7 +3182,9 @@ bool ByteCodeExprGen<Emitter>::VisitComplexUnaryOperator(
}
break;
- case UO_AddrOf:
+ case UO_Plus: // +x
+ case UO_AddrOf: // &x
+ case UO_Deref: // *x
return this->delegate(SubExpr);
case UO_LNot:
More information about the cfe-commits
mailing list