[clang] 935f5ee - [clang][Interp] ComplexFloatingToBoolean casts

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 14 04:30:58 PST 2023


Author: Timm Bäder
Date: 2023-12-14T13:17:40+01:00
New Revision: 935f5ee9c9fd6ff358b07fb4ff8e21b77c1a5ce8

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

LOG: [clang][Interp] ComplexFloatingToBoolean casts

Differential Revision: https://reviews.llvm.org/D150654

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 c428446386c04b..fdc84d0a0da005 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -222,7 +222,8 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
     return this->emitNE(PtrT, CE);
   }
 
-  case CK_IntegralComplexToBoolean: {
+  case CK_IntegralComplexToBoolean:
+  case CK_FloatingComplexToBoolean: {
     std::optional<PrimType> ElemT =
         classifyComplexElementType(SubExpr->getType());
     if (!ElemT)
@@ -237,8 +238,14 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
       return false;
     if (!this->emitLoadPop(*ElemT, CE))
       return false;
-    if (!this->emitCast(*ElemT, PT_Bool, CE))
-      return false;
+    if (*ElemT == PT_Float) {
+      if (!this->emitCastFloatingIntegral(PT_Bool, CE))
+        return false;
+    } else {
+      if (!this->emitCast(*ElemT, PT_Bool, CE))
+        return false;
+    }
+
     // We now have the bool value of E[0] on the stack.
     LabelTy LabelTrue = this->getLabel();
     if (!this->jumpTrue(LabelTrue))
@@ -250,8 +257,13 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
       return false;
     if (!this->emitLoadPop(*ElemT, CE))
       return false;
-    if (!this->emitCast(*ElemT, PT_Bool, CE))
-      return false;
+    if (*ElemT == PT_Float) {
+      if (!this->emitCastFloatingIntegral(PT_Bool, CE))
+        return false;
+    } else {
+      if (!this->emitCast(*ElemT, PT_Bool, CE))
+        return false;
+    }
     // Leave the boolean value of E[1] on the stack.
     LabelTy EndLabel = this->getLabel();
     this->jump(EndLabel);

diff  --git a/clang/test/AST/Interp/complex.cpp b/clang/test/AST/Interp/complex.cpp
index dbdbc2f7356e6b..084a63d4701c23 100644
--- a/clang/test/AST/Interp/complex.cpp
+++ b/clang/test/AST/Interp/complex.cpp
@@ -66,4 +66,11 @@ namespace CastToBool {
   static_assert(F5, "");
   constexpr _Complex unsigned char F6 = {0, 0};
   static_assert(!F6, "");
+
+  constexpr _Complex float F7 = {0, 1};
+  static_assert(F7, "");
+  constexpr _Complex float F8 = {1, 0};
+  static_assert(F8, "");
+  constexpr _Complex double F9 = {0, 0};
+  static_assert(!F9, "");
 }


        


More information about the cfe-commits mailing list