[clang] [clang] Add regression tests for narrowing with is_constant_evaluated. (PR #142885)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 4 18:40:11 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Eli Friedman (efriedma-quic)

<details>
<summary>Changes</summary>

As discussed in #<!-- -->142707, in the context of determining whether a conversion is a narrowing conversion, is_constant_evaluation should be false, even it's a subexpression of a manifestly constant-evaluated expression.

---
Full diff: https://github.com/llvm/llvm-project/pull/142885.diff


1 Files Affected:

- (modified) clang/test/SemaCXX/builtin-is-constant-evaluated.cpp (+11) 


``````````diff
diff --git a/clang/test/SemaCXX/builtin-is-constant-evaluated.cpp b/clang/test/SemaCXX/builtin-is-constant-evaluated.cpp
index a1c003c85f732..c775fe71069df 100644
--- a/clang/test/SemaCXX/builtin-is-constant-evaluated.cpp
+++ b/clang/test/SemaCXX/builtin-is-constant-evaluated.cpp
@@ -143,3 +143,14 @@ namespace fold_initializer {
   const float A::f = __builtin_is_constant_evaluated();
   static_assert(fold(A::f == 1.0f));
 }
+
+namespace narrowing {
+  struct X { unsigned u; };
+  constexpr int f(X x) {return x.u;}
+  void g() {
+    static_assert(f({0xFFFFFFFFLL + __builtin_is_constant_evaluated()}) == 0);
+    f({0x100000000LL - __builtin_is_constant_evaluated()}); // expected-error {{constant expression evaluates to 4294967296}} \
+    // expected-warning {{implicit conversion}} \
+    // expected-note {{insert an explicit cast to silence this issue}}
+  }
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/142885


More information about the cfe-commits mailing list