ldionne added a comment.

In D120244#3538660 <https://reviews.llvm.org/D120244#3538660>, @aaron.ballman 
wrote:

> In D120244#3538380 <https://reviews.llvm.org/D120244#3538380>, @ldionne wrote:
>
>> We've started having several internal user complaints because their system 
>> headers are suddenly triggering a warning for using `<stdbool.h>`. This 
>> seems to be caused by the fact that `#warning` is surfaced to users even 
>> when the `#warning` is present in a system header (which makes sense, 
>> because otherwise there would be no way to issue a `#warning` from a system 
>> header). This ends up causing problems because users have no way to suppress 
>> the warning in the system headers they use without also disabling 
>> deprecation warnings in their own code. Is this intended? Instead, it seems 
>> to me like what we'd want is some way to mark the header as deprecated such 
>> that Clang will not flag uses of `<stdbool.h>` from within system headers, 
>> but will flag them from user code. This would be consistent with how the 
>> deprecated attributes work for classes and functions.
>>
>> Thoughts?
>
> This is what `_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS` is for. We documented 
> it here: 
> https://clang.llvm.org/docs/UsersManual.html#controlling-deprecation-diagnostics-in-clang-provided-c-runtime-headers
>  but the basic idea is, if that's defined before including the header, we 
> don't issue those warnings. Does that suffice?

Well, the problem is that a user that is using some system header like 
`Foundation.h` (which includes `<stdbool.h>`) will be forced to define 
`_CLANG_DISABLE_CRT_DEPRECATION_WARNINGS`, which has two drawbacks:

1. It's annoying to them because they never used `<stdbool.h>` in their own code
2. It turns off deprecation warnings in their own code as well

In other words, the fact that this `#warning` gets out of system headers means 
that it's going to "spam" users who have no control over what their system 
headers are doing. So while the long-long term fix is for all system headers 
(like `Foundation.h`) to be C2x friendly and not include `<stdbool.h>` in newer 
standard modes, the current migration path involves a lot of spammy warnings 
for end users in the meantime. Since such a migration may or may not happen 
completely everywhere, it also means that this is probably not a "bite the 
bullet for 3 months" situation.

FWIW, although libc++ is fairly aggressive on marking functions and classes as 
deprecated, we do not try to warn for *headers* that are deprecated, because 
there is no satisfying way of doing so right now. Personally, my opinion is 
that unless we have a way to mark headers as deprecated in a way that the 
compiler can understand the semantics and have it behave roughly like a 
"deprecated attribute but on a header" (which means that this warning would 
behave just like all other compiler warnings w.r.t. system headers), it is not 
a great idea to do this. I'm very keen on deprecating stuff, however I think 
this `#warning` is not the right tool for it, because of the downsides I 
mentioned.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D120244

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

Reply via email to