[PATCH] PR18327: -Wsystem-headers introduces build errors

Alp Toker alp at nuanti.com
Thu Jan 9 15:33:01 PST 2014


On 09/01/2014 23:26, Richard Smith wrote:
> On Thu, Jan 9, 2014 at 3:18 PM, Marshall Clow <mclow.lists at gmail.com 
> <mailto:mclow.lists at gmail.com>> wrote:
>
>
>     On Jan 9, 2014, at 2:51 PM, Richard Smith <richard at metafoo.co.uk
>     <mailto:richard at metafoo.co.uk>> wrote:
>
>>     On Thu, Jan 9, 2014 at 2:39 PM, Marshall Clow
>>     <mclow.lists at gmail.com <mailto:mclow.lists at gmail.com>> wrote:
>>
>>         On Jan 9, 2014, at 2:20 PM, Richard Smith
>>         <richard at metafoo.co.uk <mailto:richard at metafoo.co.uk>> wrote:
>>
>>>         On Thu, Jan 9, 2014 at 7:25 AM, Alp Toker <alp at nuanti.com
>>>         <mailto:alp at nuanti.com>> wrote:
>>>
>>>             It's not fair on the user or the system header
>>>             maintainers to bring up unexpected errors with this flag.
>>>
>>>
>>>         I don't think this is clear. If the code in the system
>>>         header is ill-formed, I would expect the system header
>>>         maintainers to be *grateful* that we flag it as an error and
>>>         not just as a warning. But I'll wait to hear what they have
>>>         to say about that.
>>
>>         A few points, in no particular order:
>>
>>         * If we have ill-formed code in system headers, I would
>>         expect it to fail to compile whether the user specifies
>>         -Wsystem-headers or not.
>>
>>
>>     And yet in some cases we don't, because we deliberately support
>>     some flavors of broken system headers.
>>     Given that, would you want -Wsystem-headers to make such code
>>     produce an error or only a warning?
>
>     Eww.
>
>     First - is any of that code in libc++?
>     Second, there’s two audiences that I think are affected here, and
>     they have different needs:
>     * People trying to use the system headers. These people are, in
>     general, unable/unwilling to change them. Giving them
>     warnings/errors is just noise.
>     * People who are working on the system headers. They need to see
>     the warnings.
>
>
>>
>>         * If a user has a clean build, and then rebuilds with
>>         -Wsystem-headers, I would expect to get warnings - not
>>         errors. [ Isn’t that what PR18327 is all about? ]
>>
>>
>>     Do you expect this because the flag starts with -W?
>
>     Yes.
>
>>     (Maybe that's the problem here -- it's *not* a warning flag in
>>     the sense that the other -W flags are. But that's not
>>     unprecedented -- nor is -Werror.)
>
>
>>         * There are some “interesting” language features which are
>>         only enabled for system headers, and cause warnings if used
>>         in user code.
>>         [ User-defined suffixes that do not start with an underscore,
>>         for example. ]
>>
>>
>>     This is a really great example, thanks.
>
>     Note that putting something like this in your source file gives
>     you a warning;
>
>         std::complex<long double> operator"" ilx(long double __im)
>         {
>             return { 0.0l, __im };
>         }
>
>     $ clang11 junk.cpp
>     junk.cpp:5:31: warning: user-defined literal suffixes not starting
>     with '_' are
>           reserved; no literal will invoke this operator
>     [-Wuser-defined-literals]
>         std::complex<long double> operator"" ilx(long double __im)
>                                   ^
>     1 warning generated.
>
>
>>     So it seems there are at least three different classes of errors
>>     that we might think about producing in system headers:
>>
>>      1) warnings that the user has turned into errors with -Werror or
>>     -Werror=foo
>>      2) errors for ill-formed code that we suppress by default in
>>     system headers as a workaround for a system header bug
>>      3) errors for code that is ill-formed outside system headers but
>>     valid within system headers (using reserved names, adding names
>>     to namespace std, that sort of thing)
>>
>>     With -Wsystem-headers enabled, I think (1) should be an error,
>>     (3) should remain suppressed (not even a warning), and (2) should
>>     be either a warning or an error (and your first two bullets don't
>>     give me a clear idea of which way these cases should go).
>
>     Agreed for #1 and #3.
>     And for #2, I’d like to see a warning;  “This is code we wouldn’t
>     allow outside a system header, but we do so here”
>
>     I don’t see the point of making #2 an error.
>     For most people (who can’t fix it), it’s just a hassle.
>     For system developers, they can read warning output just as well
>     as error output.
>
>
> OK, so I think this is Alp's original patch plus a change to treat #1 
> as an error. As you observe, -Wuser-defined-literals is currently not 
> an error outside of a system header, so perhaps we have no diagnostics 
> in case #3 at the moment, but it's something to keep in mind for the 
> future.

Sounds good. I'll add the extra check to make sure -Werror / -Werror=foo 
is respected in system headers and follow up here.

Alp.


-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list