Author: Aaron Ballman Date: 2024-07-12T06:54:42-04:00 New Revision: 0913547d0e3939cc420e88ecd037240f33736820
URL: https://github.com/llvm/llvm-project/commit/0913547d0e3939cc420e88ecd037240f33736820 DIFF: https://github.com/llvm/llvm-project/commit/0913547d0e3939cc420e88ecd037240f33736820.diff LOG: [C2y] Claim partial conformance to WG14 N3244 (#98525) This paper had several changes within it, and Clang implements some of the changes, but not others. This updates the status accordingly. Added: clang/test/C/C2y/n3244.c Modified: clang/www/c_status.html Removed: ################################################################################ diff --git a/clang/test/C/C2y/n3244.c b/clang/test/C/C2y/n3244.c new file mode 100644 index 0000000000000..c1f62d59d2690 --- /dev/null +++ b/clang/test/C/C2y/n3244.c @@ -0,0 +1,83 @@ +// RUN: %clang_cc1 -std=c2y %s -verify -Wno-gnu-alignof-expression + +/* WG14 N3244: Partial + * Slay Some Earthly Demons I + * + * NB: the committee adopted: + * Annex J Item 21 (including additional change) -- no, we lack explicit documentation + * Annex J Item 56 -- yes + * Annex J Item 57 Option 1 -- yes + * Annex J Item 67 -- no + * Annex J Item 69 (alternative wording for semantics) -- no + */ + +void reg_array(void) { + // Decay of an array with the register storage class specifier has gone from + // explicit undefined behavior to be implementation defined instead. Clang + // does not support this. + register int array[10]; + (void)sizeof(array); // okay + int *vp = array; // expected-error {{address of register variable requested}} + int val = array[0]; // expected-error {{address of register variable requested}} +} + +struct F; // expected-note {{forward declaration of 'struct F'}} +void incomplete_no_linkage(struct F); // okay +void incomplete_no_linkage(struct F f) { // expected-error {{variable has incomplete type 'struct F'}} + struct G g; // expected-error {{variable has incomplete type 'struct G'}} \ + expected-note {{forward declaration of 'struct G'}} + int i[]; // expected-error {{definition of variable with array type needs an explicit size or an initializer}} +} + +void block_scope_non_extern_func_decl(void) { + static void f(void); // expected-error {{function declared in block scope cannot have 'static' storage class}} + extern void g(void); // okay + __private_extern__ void h(void); // okay +} + +// FIXME: this function should be diagnosed as it is never defined in the TU. +extern inline void never_defined_extern_inline(void); + +// While this declaration is fine because the function is defined within the TU. +extern inline void is_defined_extern_inline(void); +extern inline void is_defined_extern_inline(void) {} + +int NoAlignmentOnOriginalDecl; +// FIXME: the original declaration has no alignment specifier, so the +// declaration below should be diagnosed due to the incompatible alignment +// specifier. +_Alignas(8) int NoAlignmentOnOriginalDecl; +_Static_assert(_Alignof(NoAlignmentOnOriginalDecl) == 8, ""); + +_Alignas(8) int AlignmentOnOriginalDecl; // expected-note {{declared with '_Alignas' attribute here}} +// FIXME: this should be accepted because the redeclaration has no alignment +// specifier. +int AlignmentOnOriginalDecl; // expected-error {{'_Alignas' must be specified on definition if it is specified on any declaration}} +_Static_assert(_Alignof(AlignmentOnOriginalDecl) == 8, ""); + +long long CompatibleAlignment; +_Static_assert(_Alignof(CompatibleAlignment) == _Alignof(long long), ""); +_Alignas(_Alignof(long long)) long long CompatibleAlignment; // Okay, alignment is the same as the implied alignment + +_Alignas(_Alignof(long long)) long long CompatibleAlignment2; // expected-note {{declared with '_Alignas' attribute here}} +// FIXME: this should be accepted because the redeclaration has no alignment +// specifier. +long long CompatibleAlignment2; // expected-error {{'_Alignas' must be specified on definition if it is specified on any declaration}} + +// FIXME: this should be accepted because the definition specifies the +// alignment and a subsequent declaration does not specify any alignment. +_Alignas(8) long long DefnWithInit = 12; // expected-note {{declared with '_Alignas' attribute here}} +long long DefnWithInit; // expected-error {{'_Alignas' must be specified on definition if it is specified on any declaration}} + +// This is accepted because the definition has an alignment specifier and the +// subsequent redeclaration does not specify an alignment. +_Alignas(8) long long DefnWithInit2 = 12; +extern long long DefnWithInit2; + +// FIXME: this should be accepted because the definition specifies the +// alignment and a subsequent declaration specifies a compatible alignment. +long long DefnWithInit3 = 12; // expected-error {{'_Alignas' must be specified on definition if it is specified on any declaration}} +_Alignas(_Alignof(long long)) long long DefnWithInit3; // expected-note {{declared with '_Alignas' attribute here}} + +_Alignas(8) int Mismatch; // expected-note {{previous declaration is here}} +_Alignas(16) int Mismatch; // expected-error {{redeclaration has diff erent alignment requirement (16 vs 8)}} diff --git a/clang/www/c_status.html b/clang/www/c_status.html index 890ac1cd92286..1b0cf4065019e 100644 --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -1265,7 +1265,7 @@ <h2 id="c2y">C2y implementation status</h2> <tr> <td>Slay some earthly demons I</td> <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3244.pdf">N3244</a></td> - <td class="unknown" align="center">Unknown</td> + <td class="partial" align="center"> <!-- Voted in: Annex J Item 21 (including additional change) Annex J Item 56 @@ -1273,6 +1273,14 @@ <h2 id="c2y">C2y implementation status</h2> Annex J Item 67 Annex J Item 69 (alternative wording for semantics) --> + <details><summary>Partial</summary> + Clang does not document the implementation-defined behavior for decay + of an array with the register storage class specifier. Clang does not + diagnose an <code>extern inline</code> function with no definition in + the TU. Clang accepts and rejects redeclarations with/without an + alignment specifier, depending on the order of the declarations. + </details> + </td> </tr> <tr> <td>Support ++ and -- on complex values</td> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits