Author: Timm Baeder
Date: 2025-04-26T07:11:30+02:00
New Revision: b8f5e3c573577a388f2674a88901faf760bca8a6

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

LOG: [clang][bytecode] Diagnose PointerToIntegral casts (#137444)

Always emit the diagnostic, but permit the cast.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Interp.h
    clang/test/AST/ByteCode/cxx11.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index e2f2e735dc838..63a1f3e8033b7 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2362,8 +2362,12 @@ template <PrimType Name, class T = typename 
PrimConv<Name>::T>
 bool CastPointerIntegral(InterpState &S, CodePtr OpPC) {
   const Pointer &Ptr = S.Stk.pop<Pointer>();
 
+  S.CCEDiag(S.Current->getSource(OpPC), diag::note_constexpr_invalid_cast)
+      << diag::ConstexprInvalidCastKind::ThisConversionOrReinterpret
+      << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
+
   if (!CheckPointerToIntegralCast(S, OpPC, Ptr, T::bitWidth()))
-    return false;
+    return Invalid(S, OpPC);
 
   S.Stk.push<T>(T::from(Ptr.getIntegerRepresentation()));
   return true;

diff  --git a/clang/test/AST/ByteCode/cxx11.cpp 
b/clang/test/AST/ByteCode/cxx11.cpp
index 18806801bdd33..88e195c36b583 100644
--- a/clang/test/AST/ByteCode/cxx11.cpp
+++ b/clang/test/AST/ByteCode/cxx11.cpp
@@ -221,3 +221,15 @@ namespace PseudoDtor {
   static_assert(f() == 0, ""); // both-error {{constant expression}} \
                                // expected-note {{in call to}}
 }
+
+namespace IntToPtrCast {
+  typedef __INTPTR_TYPE__ intptr_t;
+
+  constexpr intptr_t f(intptr_t x) {
+    return (((x) >> 21) * 8);
+  }
+
+  extern "C" int foo;
+  constexpr intptr_t i = f((intptr_t)&foo - 10); // both-error{{constexpr 
variable 'i' must be initialized by a constant expression}} \
+                                                 // 
both-note{{reinterpret_cast}}
+}


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

Reply via email to