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

Reply via email to