[clang] edfa97a - [C99] Claim conformance to "new block scopes for selection and iteration statements"

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 25 11:20:55 PDT 2024


Author: Aaron Ballman
Date: 2024-03-25T14:20:45-04:00
New Revision: edfa97a8fbd5d8a763c30b083771c679d6a51a31

URL: https://github.com/llvm/llvm-project/commit/edfa97a8fbd5d8a763c30b083771c679d6a51a31
DIFF: https://github.com/llvm/llvm-project/commit/edfa97a8fbd5d8a763c30b083771c679d6a51a31.diff

LOG: [C99] Claim conformance to "new block scopes for selection and iteration statements"

I was unable to definitively locate a document number for this, but it
is potentially WG14 N759 based on the description in the C99 rationale
document.

We do implement the C89 and C99 scope rules for iteration and selection
statements, so claiming conformance here.

Added: 
    clang/test/C/C99/block-scopes.c

Modified: 
    clang/www/c_status.html

Removed: 
    


################################################################################
diff  --git a/clang/test/C/C99/block-scopes.c b/clang/test/C/C99/block-scopes.c
new file mode 100644
index 00000000000000..589047df3e52bc
--- /dev/null
+++ b/clang/test/C/C99/block-scopes.c
@@ -0,0 +1,34 @@
+// RUN: %clang_cc1 -std=c89 -verify %s
+// RUN: %clang_cc1 -std=c99 -verify %s
+// RUN: %clang_cc1 -std=c11 -verify %s
+// RUN: %clang_cc1 -std=c17 -verify %s
+// RUN: %clang_cc1 -std=c23 -verify %s
+
+// expected-no-diagnostics
+
+/* WG14 ???: yes
+ * new block scopes for selection and iteration statements
+ *
+ * This is referenced in the C99 front matter as new changes to C99, but it is
+ * not clear which document number introduced the changes. It's possible this
+ * is WG14 N759, based on discussion in the C99 rationale document that claims
+ * these changes were made in response to surprising issues with the lifetime
+ * of compound literals in compound statements vs non-compound statements.
+ */
+
+enum {a, b};
+void 
diff erent(void) {
+  if (sizeof(enum {b, a}) != sizeof(int))
+    _Static_assert(a == 1, "");
+  /* In C89, the 'b' found here would have been from the enum declaration in
+   * the controlling expression of the selection statement, not from the global
+   * declaration. In C99 and later, that enumeration is scoped to the 'if'
+   * statement and the global declaration is what's found.
+   */
+  #if __STDC_VERSION__ >= 199901L
+    _Static_assert(b == 1, "");
+  #else
+    _Static_assert(b == 0, "");
+  #endif
+}
+

diff  --git a/clang/www/c_status.html b/clang/www/c_status.html
index 435897277c493b..60f48aba2788e0 100644
--- a/clang/www/c_status.html
+++ b/clang/www/c_status.html
@@ -260,7 +260,7 @@ <h2 id="c99">C99 implementation status</h2>
     <tr>
       <td>new block scopes for selection and iteration statements</td>
       <td>Unknown</td>
-      <td class="unknown" align="center">Unknown</td>
+      <td class="full" align="center">Yes</td>
     </tr>
     <tr>
       <td>integer constant type rules</td>


        


More information about the cfe-commits mailing list