From 898c673e0835a2df395dd2476ac8ee8972d6380b Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Fri, 24 Feb 2023 13:52:41 -0500 Subject: [PATCH] [C2x] Remove the ATOMIC_VAR_INIT macro from stdatomic.h 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) Any code that is broken by the removal can remove the use of ATOMIC_VAR_INIT and use regular initialization instead. Differential Revision: https://reviews.llvm.org/D144196 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Headers/stdatomic.h | 11 +++++++++-- clang/test/C/C2x/n2886.c | 20 ++++++++++++++++++++ clang/www/c_status.html | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 clang/test/C/C2x/n2886.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index d7413de..0397ba0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -94,6 +94,9 @@ C2x Feature Support - 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 index 0f893be..48b3ab9 100644 --- a/clang/lib/Headers/stdatomic.h +++ b/clang/lib/Headers/stdatomic.h @@ -45,9 +45,16 @@ extern "C" { #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 index 0000000..ce733ab --- /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 index ee0f116..f8cd9f1 100644 --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -1131,7 +1131,7 @@ conformance.

Remove ATOMIC_VAR_INIT v2 N2886 - No + Clang 17 Require exact-width integer type interfaces v2 -- 2.7.4