diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -94,6 +94,9 @@ - Implemented the ``unreachable`` macro in freestanding ```` for `WG14 N2826 `_ +- Removed the ``ATOMIC_VAR_INIT`` macro in C2x and later standards modes, which + implements `WG14 N2886 `_ + Non-comprehensive list of changes in this release ------------------------------------------------- - Clang now saves the address of ABI-indirect function parameters on the stack, diff --git a/clang/lib/Headers/stdatomic.h b/clang/lib/Headers/stdatomic.h --- a/clang/lib/Headers/stdatomic.h +++ b/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. */ diff --git a/clang/test/C/C2x/n2886.c b/clang/test/C/C2x/n2886.c new file mode 100644 --- /dev/null +++ b/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 + +_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 + diff --git a/clang/www/c_status.html b/clang/www/c_status.html --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -1131,7 +1131,7 @@ Remove ATOMIC_VAR_INIT v2 N2886 - No + Clang 17 Require exact-width integer type interfaces v2