[PATCH] D144196: [C2x] Remove the ATOMIC_VAR_INIT macro from stdatomic.h

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 16 08:29:50 PST 2023


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 at 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,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144196.498030.patch
Type: text/x-patch
Size: 3106 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230216/671dc856/attachment.bin>


More information about the cfe-commits mailing list