[clang] 1588368 - [clang][Interp] Fix casting pointers to int128
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 22 05:39:58 PDT 2024
Author: Timm Bäder
Date: 2024-04-22T14:39:24+02:00
New Revision: 15883684a72cf6c64d856a11f8cd10b3a332dbcf
URL: https://github.com/llvm/llvm-project/commit/15883684a72cf6c64d856a11f8cd10b3a332dbcf
DIFF: https://github.com/llvm/llvm-project/commit/15883684a72cf6c64d856a11f8cd10b3a332dbcf.diff
LOG: [clang][Interp] Fix casting pointers to int128
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/lib/AST/Interp/Interp.h
clang/lib/AST/Interp/Opcodes.td
clang/test/AST/Interp/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index d406ac332ae26d..8cd0c198d9a844 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -194,6 +194,12 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
return false;
PrimType T = classifyPrim(CE->getType());
+ if (T == PT_IntAP)
+ return this->emitCastPointerIntegralAP(Ctx.getBitWidth(CE->getType()),
+ CE);
+ if (T == PT_IntAPS)
+ return this->emitCastPointerIntegralAPS(Ctx.getBitWidth(CE->getType()),
+ CE);
return this->emitCastPointerIntegral(T, CE);
}
diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index cebedf59e0593f..d593d764d85a49 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1833,6 +1833,32 @@ bool CastPointerIntegral(InterpState &S, CodePtr OpPC) {
return true;
}
+static inline bool CastPointerIntegralAP(InterpState &S, CodePtr OpPC,
+ uint32_t BitWidth) {
+ const Pointer &Ptr = S.Stk.pop<Pointer>();
+
+ const SourceInfo &E = S.Current->getSource(OpPC);
+ S.CCEDiag(E, diag::note_constexpr_invalid_cast)
+ << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
+
+ S.Stk.push<IntegralAP<false>>(
+ IntegralAP<false>::from(Ptr.getIntegerRepresentation(), BitWidth));
+ return true;
+}
+
+static inline bool CastPointerIntegralAPS(InterpState &S, CodePtr OpPC,
+ uint32_t BitWidth) {
+ const Pointer &Ptr = S.Stk.pop<Pointer>();
+
+ const SourceInfo &E = S.Current->getSource(OpPC);
+ S.CCEDiag(E, diag::note_constexpr_invalid_cast)
+ << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
+
+ S.Stk.push<IntegralAP<true>>(
+ IntegralAP<true>::from(Ptr.getIntegerRepresentation(), BitWidth));
+ return true;
+}
+
//===----------------------------------------------------------------------===//
// Zero, Nullptr
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td
index e17be3afd25729..0a6c976f9b5b76 100644
--- a/clang/lib/AST/Interp/Opcodes.td
+++ b/clang/lib/AST/Interp/Opcodes.td
@@ -664,10 +664,19 @@ def CastFloatingIntegralAPS : Opcode {
}
def CastPointerIntegral : Opcode {
- let Types = [AluTypeClass];
- let Args = [];
+ let Types = [FixedSizeIntegralTypeClass];
let HasGroup = 1;
}
+def CastPointerIntegralAP : Opcode {
+ let Types = [];
+ let HasGroup = 0;
+ let Args = [ArgUint32];
+}
+def CastPointerIntegralAPS : Opcode {
+ let Types = [];
+ let HasGroup = 0;
+ let Args = [ArgUint32];
+}
def DecayPtr : Opcode {
let Types = [PtrTypeClass, PtrTypeClass];
diff --git a/clang/test/AST/Interp/c.c b/clang/test/AST/Interp/c.c
index 5ae9b1dc7bff86..a5951158ed0e0d 100644
--- a/clang/test/AST/Interp/c.c
+++ b/clang/test/AST/Interp/c.c
@@ -257,3 +257,9 @@ int Y __attribute__((annotate(
42,
(struct TestStruct) { .a = 1, .b = 2 }
)));
+
+#ifdef __SIZEOF_INT128__
+const int *p = &b;
+const __int128 K = (__int128)(int*)0;
+const unsigned __int128 KU = (unsigned __int128)(int*)0;
+#endif
More information about the cfe-commits
mailing list