Author: Timm Bäder
Date: 2024-06-13T13:49:20+02:00
New Revision: ffab938f50fa999f2218976f7de78cf8e4f70d4e

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

LOG: [clang][Interp] Handle BooleanToSignedIntegral casts

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp 
b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index e0500983a31b5..60b1e089e74a6 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -343,6 +343,7 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr 
*CE) {
   }
 
   case CK_IntegralToBoolean:
+  case CK_BooleanToSignedIntegral:
   case CK_IntegralCast: {
     if (DiscardResult)
       return this->discard(SubExpr);
@@ -362,7 +363,12 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const 
CastExpr *CE) {
 
     if (FromT == ToT)
       return true;
-    return this->emitCast(*FromT, *ToT, CE);
+    if (!this->emitCast(*FromT, *ToT, CE))
+      return false;
+
+    if (CE->getCastKind() == CK_BooleanToSignedIntegral)
+      return this->emitNeg(*ToT, CE);
+    return true;
   }
 
   case CK_PointerToBoolean:

diff  --git a/clang/test/AST/Interp/vectors.cpp 
b/clang/test/AST/Interp/vectors.cpp
index 49dae14fcf646..1e0d473cbca5a 100644
--- a/clang/test/AST/Interp/vectors.cpp
+++ b/clang/test/AST/Interp/vectors.cpp
@@ -61,3 +61,12 @@ namespace {
   typedef float __attribute__((vector_size(16))) VI42;
   constexpr VI42 A2 = A; // expected-error {{must be initialized by a constant 
expression}}
 }
+
+namespace BoolToSignedIntegralCast{
+  typedef __attribute__((__ext_vector_type__(4))) unsigned int int4;
+  constexpr int4 intsT = (int4)true;
+  static_assert(intsT[0] == -1, "");// ref-error {{not an integral constant 
expression}}
+  static_assert(intsT[1] == -1, "");// ref-error {{not an integral constant 
expression}}
+  static_assert(intsT[2] == -1, "");// ref-error {{not an integral constant 
expression}}
+  static_assert(intsT[3] == -1, "");// ref-error {{not an integral constant 
expression}}
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to