[clang] 25b4d1e - [clang][bytecode] Don't evaluate builtin_assume argument (#175740)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 13 03:34:02 PST 2026
Author: Timm Baeder
Date: 2026-01-13T12:33:58+01:00
New Revision: 25b4d1e1de765982d6c3ca552e8fae1631714ddd
URL: https://github.com/llvm/llvm-project/commit/25b4d1e1de765982d6c3ca552e8fae1631714ddd
DIFF: https://github.com/llvm/llvm-project/commit/25b4d1e1de765982d6c3ca552e8fae1631714ddd.diff
LOG: [clang][bytecode] Don't evaluate builtin_assume argument (#175740)
This is what the current interpreter does.
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/lib/AST/ByteCode/InterpBuiltin.cpp
clang/test/AST/ByteCode/builtins.cpp
clang/test/Parser/MicrosoftExtensions.c
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 0a0a5dd5c47c8..21f8db06919ed 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -5156,6 +5156,10 @@ bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E,
return false;
} break;
+ case Builtin::BI__assume:
+ case Builtin::BI__builtin_assume:
+ // Argument is not evaluated.
+ break;
default:
if (!Context::isUnevaluatedBuiltin(BuiltinID)) {
// Put arguments on the stack.
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index c6d4a9d63b383..1975349051781 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -248,12 +248,13 @@ static bool interp__builtin_is_constant_evaluated(InterpState &S, CodePtr OpPC,
return true;
}
-// __builtin_assume(int)
+// __builtin_assume
+// __assume (MS extension)
static bool interp__builtin_assume(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame,
const CallExpr *Call) {
+ // Nothing to be done here since the argument is NOT evaluated.
assert(Call->getNumArgs() == 1);
- discard(S.Stk, *S.getContext().classify(Call->getArg(0)));
return true;
}
diff --git a/clang/test/AST/ByteCode/builtins.cpp b/clang/test/AST/ByteCode/builtins.cpp
index 33b703c24cb51..30d34ecd8374f 100644
--- a/clang/test/AST/ByteCode/builtins.cpp
+++ b/clang/test/AST/ByteCode/builtins.cpp
@@ -3,9 +3,6 @@
// RUN: %clang_cc1 -verify=ref %s -Wno-constant-evaluated -fms-extensions
// RUN: %clang_cc1 -verify=ref %s -Wno-constant-evaluated %s -fms-extensions -emit-llvm -o - | FileCheck %s
-// expected-no-diagnostics
-// ref-no-diagnostics
-
using size_t = decltype(sizeof(int));
namespace std {
@@ -32,6 +29,14 @@ constexpr bool assume() {
}
static_assert(assume(), "");
+constexpr int assumeArgIsUnevaluated() {
+ int a = 0;
+ __builtin_assume(++a); // expected-warning {{assumption is ignored because it contains (potential) side-effects}} \
+ // ref-warning {{assumption is ignored because it contains (potential) side-effects}}
+ return a;
+}
+static_assert(assumeArgIsUnevaluated() == 0, "");
+
void test_builtin_os_log(void *buf, int i, const char *data) {
constexpr int len = __builtin_os_log_format_buffer_size("%d %{public}s %{private}.16P", i, data, data);
static_assert(len > 0, "Expect len > 0");
diff --git a/clang/test/Parser/MicrosoftExtensions.c b/clang/test/Parser/MicrosoftExtensions.c
index 619f90990212c..e298895a8300f 100644
--- a/clang/test/Parser/MicrosoftExtensions.c
+++ b/clang/test/Parser/MicrosoftExtensions.c
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 -triple i386-mingw32 -fsyntax-only -Wno-missing-declarations -verify -fms-extensions %s
+// RUN: %clang_cc1 -triple i386-mingw32 -fsyntax-only -Wno-missing-declarations -verify -fms-extensions %s
+// RUN: %clang_cc1 -triple i386-mingw32 -fsyntax-only -Wno-missing-declarations -verify -fms-extensions %s -fexperimental-new-constant-interpreter
+
__stdcall int func0(void);
int __stdcall func(void);
typedef int (__cdecl *tptr)(void);
More information about the cfe-commits
mailing list