aaron.ballman created this revision. aaron.ballman added reviewers: clang-language-wg, jyknight, libc++. Herald added a project: All. aaron.ballman requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This implements WG14 N2886 (https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm) which removed the macro entirely. (NB the macro was deprecated in C17.) As the paper is not particularly clear on what alternative was picked, here are my notes from the May 2022 meeting: Does WG14 wish to adopt variant 1, change 3.2, 3.3, and 3.4 from N2886 into C23? 14/2/2 (consensus). Does WG14 want to exchange Variant 1 with Variant 2 in N2886 in C23? 9/3/6 (consensus). (There was no sentiment in the room for either Variant 3 or Variant 4 so those were not voted on.) Does WG14 want to integrate change 3.5 in N2886 into C23? 8/1/9 (consensus). Does WG14 want to integrate change 3.6 in N2886 into C23? 2/5/9 (no consensus). I've added the libc++ reviewers to ensure this doesn't negatively impact <atomic> and the clang-vendors group for early awareness about a potentially breaking change. Any code that is broken by the removal can remove the use of `ATOMIC_VAR_INIT` and use regular initialization instead. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D144196 Files: clang/docs/ReleaseNotes.rst clang/lib/Headers/stdatomic.h clang/test/C/C2x/n2886.c clang/www/c_status.html Index: clang/www/c_status.html =================================================================== --- clang/www/c_status.html +++ clang/www/c_status.html @@ -1131,7 +1131,7 @@ <tr> <td>Remove ATOMIC_VAR_INIT v2</td> <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm">N2886</a></td> - <td class="none" align="center">No</td> + <td class="unreleased" align="center">Clang 17</td> </tr> <tr> <td>Require exact-width integer type interfaces v2</td> Index: clang/test/C/C2x/n2886.c =================================================================== --- /dev/null +++ clang/test/C/C2x/n2886.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -verify=okay -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -verify -std=c17 -ffreestanding %s +// RUN: %clang_cc1 -verify -std=c2x -ffreestanding %s + +/* WG14 N2886: yes + * Remove ATOMIC_VAR_INIT v2 + */ + +/* okay-no-diagnostics */ +#include <stdatomic.h> + +_Atomic int a = ATOMIC_VAR_INIT(0); /* #diag */ +#if __STDC_VERSION__ <= 201710L +/* expected-warning@#diag {{macro 'ATOMIC_VAR_INIT' has been marked as deprecated}} + expected-note@stdatomic.h:* {{macro marked 'deprecated' here}} +*/ +#else +/* expected-error@#diag {{use of undeclared identifier 'ATOMIC_VAR_INIT'}} */ +#endif + Index: clang/lib/Headers/stdatomic.h =================================================================== --- clang/lib/Headers/stdatomic.h +++ clang/lib/Headers/stdatomic.h @@ -45,9 +45,16 @@ #define ATOMIC_POINTER_LOCK_FREE __CLANG_ATOMIC_POINTER_LOCK_FREE /* 7.17.2 Initialization */ - +/* FIXME: This is using the placeholder dates Clang produces for these macros + in C2x mode; switch to the correct values once they've been published. */ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ < 202000L) || \ + defined(__cplusplus) +/* ATOMIC_VAR_INIT was removed in C2x, but still remains in C++2b. */ #define ATOMIC_VAR_INIT(value) (value) -#if ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201710L) || \ +#endif + +#if ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201710L && \ + __STDC_VERSION__ < 202000L) || \ (defined(__cplusplus) && __cplusplus >= 202002L)) && \ !defined(_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS) /* ATOMIC_VAR_INIT was deprecated in C17 and C++20. */ Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -77,6 +77,9 @@ - Implemented the ``unreachable`` macro in freestanding ``<stddef.h>`` for `WG14 N2826 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2826.pdf>`_ +- Removed the ``ATOMIC_VAR_INIT`` macro in C2x and later standards modes, which + implements `WG14 N2886 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm>`_ + Non-comprehensive list of changes in this release ------------------------------------------------- - Clang now saves the address of ABI-indirect function parameters on the stack,
Index: clang/www/c_status.html =================================================================== --- clang/www/c_status.html +++ clang/www/c_status.html @@ -1131,7 +1131,7 @@ <tr> <td>Remove ATOMIC_VAR_INIT v2</td> <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm">N2886</a></td> - <td class="none" align="center">No</td> + <td class="unreleased" align="center">Clang 17</td> </tr> <tr> <td>Require exact-width integer type interfaces v2</td> Index: clang/test/C/C2x/n2886.c =================================================================== --- /dev/null +++ clang/test/C/C2x/n2886.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -verify=okay -std=c11 -ffreestanding %s +// RUN: %clang_cc1 -verify -std=c17 -ffreestanding %s +// RUN: %clang_cc1 -verify -std=c2x -ffreestanding %s + +/* WG14 N2886: yes + * Remove ATOMIC_VAR_INIT v2 + */ + +/* okay-no-diagnostics */ +#include <stdatomic.h> + +_Atomic int a = ATOMIC_VAR_INIT(0); /* #diag */ +#if __STDC_VERSION__ <= 201710L +/* expected-warning@#diag {{macro 'ATOMIC_VAR_INIT' has been marked as deprecated}} + expected-note@stdatomic.h:* {{macro marked 'deprecated' here}} +*/ +#else +/* expected-error@#diag {{use of undeclared identifier 'ATOMIC_VAR_INIT'}} */ +#endif + Index: clang/lib/Headers/stdatomic.h =================================================================== --- clang/lib/Headers/stdatomic.h +++ clang/lib/Headers/stdatomic.h @@ -45,9 +45,16 @@ #define ATOMIC_POINTER_LOCK_FREE __CLANG_ATOMIC_POINTER_LOCK_FREE /* 7.17.2 Initialization */ - +/* FIXME: This is using the placeholder dates Clang produces for these macros + in C2x mode; switch to the correct values once they've been published. */ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ < 202000L) || \ + defined(__cplusplus) +/* ATOMIC_VAR_INIT was removed in C2x, but still remains in C++2b. */ #define ATOMIC_VAR_INIT(value) (value) -#if ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201710L) || \ +#endif + +#if ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201710L && \ + __STDC_VERSION__ < 202000L) || \ (defined(__cplusplus) && __cplusplus >= 202002L)) && \ !defined(_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS) /* ATOMIC_VAR_INIT was deprecated in C17 and C++20. */ Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -77,6 +77,9 @@ - Implemented the ``unreachable`` macro in freestanding ``<stddef.h>`` for `WG14 N2826 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2826.pdf>`_ +- Removed the ``ATOMIC_VAR_INIT`` macro in C2x and later standards modes, which + implements `WG14 N2886 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2886.htm>`_ + Non-comprehensive list of changes in this release ------------------------------------------------- - Clang now saves the address of ABI-indirect function parameters on the stack,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits