[clang] [clang][bytecode] Check overflow ops for block pointers (PR #165221)

Timm Baeder via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 27 02:42:40 PDT 2025


https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/165221

We can't save the result in a non-block pointer.

Fixes https://github.com/llvm/llvm-project/issues/165076

>From a639fe31f3fd84ba5dd513ff943b459f40ed76c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 27 Oct 2025 10:41:01 +0100
Subject: [PATCH] [clang][bytecode] Check overflow ops for block pointers

We can't save the result in a non-block pointer.

Fixes https://github.com/llvm/llvm-project/issues/165076
---
 clang/lib/AST/ByteCode/InterpBuiltin.cpp      | 2 +-
 clang/test/AST/ByteCode/builtin-functions.cpp | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index d0b97a18e1815..aec150a9f0781 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -749,7 +749,7 @@ static bool interp__builtin_overflowop(InterpState &S, CodePtr OpPC,
                                        const CallExpr *Call,
                                        unsigned BuiltinOp) {
   const Pointer &ResultPtr = S.Stk.pop<Pointer>();
-  if (ResultPtr.isDummy())
+  if (ResultPtr.isDummy() || !ResultPtr.isBlockPointer())
     return false;
 
   PrimType RHST = *S.getContext().classify(Call->getArg(1)->getType());
diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp
index 0b7d51be8d824..2c47e2971f4a1 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -1853,3 +1853,8 @@ namespace InitParam {
 }
 
 #endif
+
+namespace SAddOverflowInt {
+  int a;
+  void foo(void) { a *= __builtin_sadd_overflow(1, 2, 0); }
+}



More information about the cfe-commits mailing list