aaron.ballman added a comment.

In D67023#1656453 <https://reviews.llvm.org/D67023#1656453>, @jfb wrote:

> In D67023#1654704 <https://reviews.llvm.org/D67023#1654704>, @aaron.ballman 
> wrote:
>
> > In D67023#1654070 <https://reviews.llvm.org/D67023#1654070>, @jfb wrote:
> >
> > > I refer you to http://wg21.link/p0883
> > >  I don’t think this diagnostic should be added to clang until p0883 is 
> > > fully implemented, even just for C. Otherwise we leave users with no 
> > > portable way to do the right thing without diagnostic.
> >
> >
> > P0883 has not been adopted, that I can tell (it has strong support, but 
> > isn't [expected to be] a part of C++2a)?
>
>
> I think it'll make it in as an NB comment.
>
> > Also, this functionality is implemented by libc++ and libstdc++, so I'm not 
> > certain what you mean by "until p0883 is fully implemented" or why that 
> > paper would be implemented "even just for C". Are you suggesting to gate 
> > this deprecation for C functionality based on what C++ standard library 
> > implementations are doing?
>
> Yes, because atomics are already hard enough to use correctly between C and 
> C++.


I don't see why that should preclude us from diagnosing C code. Not everyone 
shares C and C++ code, and C developers should be alerted to this deprecation 
independent of what C++ is doing.

> Once we've fixed C++ I'd like the diagnostic to be the same for both (modulo 
> which standard it's deprecated in). I think we should add the diagnostic for 
> C and C++ at the same time, and we should make sure there's no libc++ nor 
> clang work required before diagnosing.

Given that C has already made this decision, it seems like the tail wagging the 
dog to wait for C++ to maybe adopt the same thing as part of an NB comment.

>> I'm sorry if I'm being dense here, but I am still not seeing the issue 
>> you're concerned by. C has already deprecated this feature and is planning 
>> to remove it shortly. I am diagnosing that fact in C, which seems perfectly 
>> appropriate to do regardless of what C++ is doing in this space.
>> 
>> Users have a portable way to write their code already because 
>> `ATOMIC_VAR_INIT` does not do any special magic and no implementation 
>> requires a user to use it to achieve portable atomic initialization 
>> semantics. If they get the diagnostic (which only triggers in C mode and 
>> only if the macro was defined in stdatomic.h), they should remove the use of 
>> `ATOMIC_VAR_INIT` from their code, or disable the deprecation diagnostic. If 
>> neither of those options appeals to the user, they can write something along 
>> the lines of:
>> 
>>   _Atomic(int) i = 
>>   #if defined(__cplusplus)
>>   ATOMIC_VAR_INIT(12);
>>   #else
>>   12;
>>   #endif
>> 
>> 
>> (not that I think anyone will want to write that, but strict adherence to a 
>> broken part of both standards does not seem like something we want to 
>> encourage anyway -- this is deprecated functionality, so the whole point is 
>> to discourage its use.)
> 
> Is this correct for all implementations of `_Atomic` and `std::atomic` that 
> clang supports, including non-lock-free types? We should make sure before 
> diagnosing.

Let me put it another way: code that does not work with `= 12` will similarly 
not work with `= ATOMIC_VAR_INIT(12)` because the two are identical (modulo a 
`ParenExpr`) after preprocessing. So yes, I believe this is "correct" for all 
implementations of `_Atomic` and `std::atomic` that Clang supports insomuch as 
it's bug-for-bug-or-lack-thereof compatible.

I feel like we're going in circles, so perhaps if I explained my problem a 
different way, it will resonate more. I am worried about C developers writing C 
code against a C compiler when the C committee has deprecated `ATOMIC_VAR_INIT` 
and want to diagnose this situation in C mode. What I hear you being concerned 
with is: what about C++ developers? I've pointed out that they have several 
options if they really want full portability to any compiler in C or C++ mode, 
but beyond that, I am not concerned about C++ developers. They have 
`ATOMIC_VAR_INIT` and will until such time as WG21 decides to deprecate it, at 
which point I would like to diagnose in C++ mode as well.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67023/new/

https://reviews.llvm.org/D67023



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to