[clang] b82c7e7 - [C2y] Claim conformance to WG14 N3525 (#166824)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 6 11:20:20 PST 2025
Author: Aaron Ballman
Date: 2025-11-06T14:20:16-05:00
New Revision: b82c7e7819b3ef405838a82c6fda537d37a21dbf
URL: https://github.com/llvm/llvm-project/commit/b82c7e7819b3ef405838a82c6fda537d37a21dbf
DIFF: https://github.com/llvm/llvm-project/commit/b82c7e7819b3ef405838a82c6fda537d37a21dbf.diff
LOG: [C2y] Claim conformance to WG14 N3525 (#166824)
The paper is ensuring that a static_assert operand can not be deferred
until runtime; it must accept an integer constant expression which is
resolved at compile time.
Note, Clang extends what it considers to be a valid integer constant
expression, so this also verifies the expected extension diagnostics.
Added:
clang/test/C/C2y/n3525.c
Modified:
clang/www/c_status.html
Removed:
################################################################################
diff --git a/clang/test/C/C2y/n3525.c b/clang/test/C/C2y/n3525.c
new file mode 100644
index 0000000000000..428df23c79ba2
--- /dev/null
+++ b/clang/test/C/C2y/n3525.c
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -verify -std=c2y -Wall -pedantic %s
+// RUN: %clang_cc1 -verify -std=c23 -Wall -pedantic %s
+
+/* WG14 N3525: Yes
+ * static_assert without UB
+ *
+ * Ensures that a static_assert declaration cannot defer to runtime; it must
+ * take an integer constant expression that is resolved at compile time.
+ *
+ * Note: implementations are free to extend what is a valid integer constant
+ * expression, and Clang (and GCC) does so. So this test is validating that
+ * we quietly accept a pasing assertion, loudly reject a failing assertion, and
+ * issue a pedantic diagnostic for the extension case.
+ */
+
+static_assert(1); // Okay
+
+static_assert(0); // expected-error {{static assertion failed}}
+
+extern int a;
+static_assert(1 || a); // expected-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}}
+
+static_assert(a); // expected-error {{static assertion expression is not an integral constant expression}}
+static_assert(0 || a); // expected-error {{static assertion expression is not an integral constant expression}}
+
+// Note, there is no CodeGen test for this; we have existing tests for the ICE
+// extension, so the pedantic warning is sufficient to verify we're not
+// emitting code which reads 'a' in '1 || a' because of the folding, and
+// there's no way to generate code for reading 'a' in '0 || a' because of the
+// error.
diff --git a/clang/www/c_status.html b/clang/www/c_status.html
index 80a52f791dfcf..2c1f6f4140a91 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -344,7 +344,7 @@ <h2 id="c2y">C2y implementation status</h2>
<tr>
<td>static_assert without UB</td>
<td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3525.htm">N3525</a></td>
- <td class="unknown" align="center">Unknown</td>
+ <td class="full" align="center">Yes</td>
</tr>
<tr>
<td>Allow calling static inline within extern inline</td>
More information about the cfe-commits
mailing list