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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits