https://github.com/Mr-Anyone created 
https://github.com/llvm/llvm-project/pull/156113

Defer the `CheckBuiltinFunctionCall` to template instantiation.

fixes #153082

>From 151ba2e45b4317d9d01eb1613186772704a3dcb7 Mon Sep 17 00:00:00 2001
From: Vincent <l...@viceroygroup.ca>
Date: Thu, 14 Aug 2025 22:26:28 +0800
Subject: [PATCH] [clang] `__builtin_expect_with_probability` accepts value
 depenent parameter

Defer the `CheckBuiltinFunctionCall` to template instantiation.

fixes #153082
---
 clang/docs/ReleaseNotes.rst                      |  1 +
 clang/lib/Sema/SemaChecking.cpp                  |  3 +++
 .../Sema/builtin-expect-with-probability.cpp     | 16 ++++++++++++++++
 3 files changed, 20 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 9a05eea9de8ac..fd015cea7c3de 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -260,6 +260,7 @@ Bug Fixes in This Version
   cast chain. (#GH149967).
 - Fixed a crash with incompatible pointer to integer conversions in designated
   initializers involving string literals. (#GH154046)
+- ``__builtin_expect_with_probability`` now works with a value dependent 
parameter. (GH153082).
 - Clang now emits a frontend error when a function marked with the `flatten` 
attribute
   calls another function that requires target features not enabled in the 
caller. This
   prevents a fatal error in the backend.
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 6e777fb9aec8e..875a1df747c29 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2855,6 +2855,9 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, 
unsigned BuiltinID,
     SmallVector<PartialDiagnosticAt, 8> Notes;
     Expr::EvalResult Eval;
     Eval.Diag = &Notes;
+    if (ProbArg->isValueDependent() || ProbArg->isTypeDependent())
+      break;
+
     if ((!ProbArg->EvaluateAsConstantExpr(Eval, Context)) ||
         !Eval.Val.isFloat()) {
       Diag(ProbArg->getBeginLoc(), diag::err_probability_not_constant_float)
diff --git a/clang/test/Sema/builtin-expect-with-probability.cpp 
b/clang/test/Sema/builtin-expect-with-probability.cpp
index c55cde84b2548..70101d6a626af 100644
--- a/clang/test/Sema/builtin-expect-with-probability.cpp
+++ b/clang/test/Sema/builtin-expect-with-probability.cpp
@@ -57,3 +57,19 @@ void test(int x, double p) { // expected-note {{declared 
here}}
   dummy = __builtin_expect_with_probability(x > 0, 1, pi);
   expect_taken<S>(x);
 }
+
+namespace gh153082{
+    template <typename T> void f() {
+        (void) __builtin_expect_with_probability(0, 0, ({ 0; }));
+    }
+
+    template <typename T> void more_test_case(long a) {
+        (void)__builtin_expect_with_probability(a, 0, sizeof(T)/3.9);   // 
expected-error {{probability argument to __builtin_expect_with_probability is 
outside the range [0.0, 1.0]}} \
+                                                                        // 
expected-error {{probability argument}}
+    }
+
+    template void more_test_case<short>(long);
+    template void more_test_case<char>(long);
+    template void more_test_case<int>(long); // expected-note {{in 
instantiation of function template specialization 
'gh153082::more_test_case<int>' requested here}}
+    template void more_test_case<long long>(long); // expected-note 
{{instantiation of function template specialization 
'gh153082::more_test_case<long long>' requested here}}
+};

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to