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); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
