[clang] cb8e936 - [clang][Interp] Implement ~ operator for complex values

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Sun Jun 9 05:29:26 PDT 2024


Author: Timm Bäder
Date: 2024-06-09T14:29:12+02:00
New Revision: cb8e9360d821f4fb03d571940a7e09d750d2cf2f

URL: https://github.com/llvm/llvm-project/commit/cb8e9360d821f4fb03d571940a7e09d750d2cf2f
DIFF: https://github.com/llvm/llvm-project/commit/cb8e9360d821f4fb03d571940a7e09d750d2cf2f.diff

LOG: [clang][Interp] Implement ~ operator for complex values

Added: 
    

Modified: 
    clang/lib/AST/Interp/ByteCodeExprGen.cpp
    clang/test/AST/Interp/complex.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index ff2b51e3fb6fa..5eecc6921a062 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3827,6 +3827,18 @@ bool ByteCodeExprGen<Emitter>::VisitComplexUnaryOperator(
     // we sometimes have to do the lvalue-to-rvalue conversion here manually.
     return this->emitArrayElemPop(classifyPrim(E->getType()), 1, E);
 
+  case UO_Not: // ~x
+    if (!this->visit(SubExpr))
+      return false;
+    // Negate the imaginary component.
+    if (!this->emitArrayElem(ElemT, 1, E))
+      return false;
+    if (!this->emitNeg(ElemT, E))
+      return false;
+    if (!this->emitInitElem(ElemT, 1, E))
+      return false;
+    return DiscardResult ? this->emitPopPtr(E) : true;
+
   default:
     return this->emitInvalid(E);
   }

diff  --git a/clang/test/AST/Interp/complex.cpp b/clang/test/AST/Interp/complex.cpp
index 09cb620d7b7c3..ea54df38a9eb8 100644
--- a/clang/test/AST/Interp/complex.cpp
+++ b/clang/test/AST/Interp/complex.cpp
@@ -115,6 +115,8 @@ static_assert(__imag(Doubles[2]) == 0.0, "");
 static_assert(__real(Doubles[3]) == 0.0, "");
 static_assert(__imag(Doubles[3]) == 0.0, "");
 
+static_assert(~(0.5 + 1.5j) == (0.5 + -1.5j), "");
+
 void func(void) {
   __complex__ int arr;
   _Complex int result;


        


More information about the cfe-commits mailing list