aaron.ballman marked 2 inline comments as done. aaron.ballman added inline comments.
================ Comment at: clang/docs/ReleaseNotes.rst:159-164 + - The ``ATOMIC_VAR_INIT`` macro from ``<stdatomic.h>`` is now diagnosed as + deprecated in both C (C17 and later) and C++ (C++20 and later), and + ``ATOMIC_FLAG_INIT`` is now diagnosed as deprecated in C++ (C++20 and later). + The diagnostic can be disabled by defining the + ``_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS`` macro prior to including the + header. ---------------- Quuxplusone wrote: > IIUC, `<stdatomic.h>` is not relevant to C++20; libc++'s `<atomic>` even > `#error`s if you include both `<stdatomic.h>` and `<atomic>` in the same TU. > Defining `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS` won't affect the warnings > in C++20; for those you need `_LIBCPP_DISABLE_DEPRECATION_WARNINGS`. > C++20 isn't relevant to this section on "C Language Changes in Clang"; > arguably it could be listed under "C++ Language Changes in Clang," except > that D115995 didn't change anything about //Clang//. So I think it's fine not > to mention D115995 anywhere in this file. The point I was trying to make is that including `<stdatomic.h>` in C++20 and later mode will diagnose these as deprecated, independent of `<atomic>`. I did this on the assumption that they're just as useless coming from `<stdatomic.h>` as they are coming from `<atomic>`, so they should also be diagnosed. I could make this more clear by mentioning `<atomic>` explicitly in the release note. As for whether this should be listed under the C++ section... meh. I'm not certain it matters that much as this is about the C header file. I can mention it in the C++ section though. ================ Comment at: clang/docs/UsersManual.rst:1128-1130 + #include <stdint.h> // May include Clang CRT deprecation warnings + #define _CLANG_DISABLE_CRT_DEPRECATION_WARNINGS + #include <stdatomic.h> // Clang CRT deprecation warnings are disabled ---------------- Quuxplusone wrote: > It is //probably// sketchy to advise people to change the setting of > `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS` over the lifetime of a single TU. > If `<stdint.h>` transitively includes `<stdatomic.h>`, this won't work. (Of > course that's unlikely in this //specific// case, but in general, IMHO we > shouldn't train people to think that this will always work.) > (In fact, `<stdatomic.h>` transitively includes `<stdint.h>`!) > We should train the programmer to think of > `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS` as all-or-nothing: set it in your > build system, or set it at the very top of the TU. Thanks for the feedback, I've adjusted the text. ================ Comment at: clang/lib/Headers/stdatomic.h:42-47 #define ATOMIC_VAR_INIT(value) (value) +#if __STDC_VERSION__ >= 201710L || __cplusplus >= 202002L +/* ATOMIC_VAR_INIT was deprecated in C17 and C++20. */ +#pragma clang deprecated(ATOMIC_VAR_INIT) +#endif #define atomic_init __c11_atomic_init ---------------- Quuxplusone wrote: > aaron.ballman wrote: > > Quuxplusone wrote: > > > Hmm, I do think there ought to be some way for the C++20 programmer to > > > suppress the deprecation warning for these macros (specifically, not just > > > via `-Wno-deprecated` in their whole project). For deprecations in the > > > C++ standard library, libc++ offers an all-or-nothing flag: basically > > > you'd do > > > ``` > > > #if (__STDC_VERSION__ >= 201710L || __cplusplus >= 202002L) && > > > !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) > > > /* ATOMIC_VAR_INIT was deprecated in C17 and C++20. */ > > > #pragma clang deprecated(ATOMIC_VAR_INIT) > > > #endif > > > ``` > > > (This also makes it easy for libcxx/test/ to suppress the deprecation > > > warning for the purposes of testing.) > > > > > > However, I'm not sure if it's appropriate to mention > > > `_LIBCPP_DISABLE_DEPRECATION_WARNINGS` in this header located in > > > clang/lib/Headers/ instead of libcxx/include/. Someone else will have to > > > make that call. > > > > > > It might be that the only way for the programmer (or libcxx/test/) to > > > work around the warning will be for them to pass `-Wno-deprecated` > > > globally; IMO that is suboptimal but quite far from disastrous. > > I think this is a reasonable idea. Microsoft has macros for a similar > > purpose with `_CRT_SECURE_NO_WARNINGS` (IIRC). I would not want to use > > `_LIBCPP_` for this purpose, but I could imagine it's useful to add > > something like `_CLANG_DISABLE_DEPRECATION_WARNINGS`. (I'm guessing we > > don't want per-deprecation granularity on the macro, but if we needed > > something like that, I think we could add it.) > > > > I went ahead and added `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS` to the > > next version of the patch, and documented it in the release notes and > > user's manual. We can quibble over the name if you have better suggestions. > Re `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS`: This naming scheme looks novel > — I don't see any other `_CLANG_{DIS,EN}ABLE.*` macros in > `clang/lib/Headers/` — but that might just be because its purpose is also > novel. I'm not saying it's a good idea, but I don't object to it nor have any > particularly better idea. > > Btw, where above I said `-Wno-deprecated`, it turns out that > `-Wno-deprecated-pragma` is slightly finer-grained. Also, I'm like 95% sure > that C++ is totally covered by D115995, which means whatever you do here is > relevant only to C17, which means I have no personal stake in its ergonomics. > :) > but that might just be because its purpose is also novel. I'm not saying it's > a good idea, but I don't object to it nor have any particularly better idea. Yes, it is novel. This is our first foray down this path. > Also, I'm like 95% sure that C++ is totally covered by D115995, which means > whatever you do here is relevant only to C17, which means I have no personal > stake in its ergonomics. :) Not quite. It still matters for a C++ TU that includes `<stdatomic.h>` directly rather than `<atomic>`, which is still possible. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D112221/new/ https://reviews.llvm.org/D112221 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits