[PATCH] PR18327: -Wsystem-headers introduces build errors
Richard Smith
richard at metafoo.co.uk
Thu Jan 9 14:20:27 PST 2014
On Thu, Jan 9, 2014 at 7:25 AM, Alp Toker <alp at nuanti.com> wrote:
>
> On 09/01/2014 03:29, Richard Smith wrote:
>
>> On Wed, Jan 8, 2014 at 5:53 PM, David Wiberg <dwiberg at gmail.com <mailto:
>> dwiberg at gmail.com>> wrote:
>>
>> 2014/1/8 Richard Smith <richard at metafoo.co.uk
>> <mailto:richard at metafoo.co.uk>>:
>>
>> > On Tue, Jan 7, 2014 at 8:33 PM, Alp Toker <alp at nuanti.com
>> <mailto:alp at nuanti.com>> wrote:
>> >>
>> >>
>> >> On 08/01/2014 04:21, Argyrios Kyrtzidis wrote:
>> >>>
>> >>> On Jan 7, 2014, at 7:56 PM, Alp Toker <alp at nuanti.com
>> <mailto:alp at nuanti.com>> wrote:
>> >>>
>> >>>> On 08/01/2014 01:48, Argyrios Kyrtzidis wrote:
>> >>>>>
>> >>>>> On Jan 6, 2014, at 1:47 PM, Richard Smith
>> <richard at metafoo.co.uk <mailto:richard at metafoo.co.uk>
>> >>>>> <mailto:richard at metafoo.co.uk
>>
>> <mailto:richard at metafoo.co.uk>>> wrote:
>> >>>>>
>> >>>>>> One view on this is simply: -Wsystem-headers means "don't
>> give system
>> >>>>>> headers special treatment when emitting diagnostics”.
>> >>>>>
>> >>>>> This is it exactly. “Treat all headers like normal headers"
>> >>>>
>> >>>> We don't have a flag to treat all headers as normal headers
>> at the
>> >>>> moment. It'd be very simple to implement compared to
>> -Wsystem-headers which
>> >>>> somewhat intricate.
>> >>>
>> >>> Could you elaborate, AFAICT '-Wsystem-headers' is treated
>> specially, it's
>> >>> outside the diagnostic group machinery, and acts essentially
>> as a flag.
>> >>> If you'd like to have something like '-fwarn-on-system-headers' or
>> >>> something instead, that's another discussion, but as far as
>> the PR is
>> >>> concerned I don't see why we need to change what
>> -Wsystem-headers is
>> >>> currently doing.
>> >>
>> >>
>> >> PR18327 reports a valid corner-case bug in the way a very small
>> number
>> >> (around 8 in total) diagnostics are upgraded from
>> warnings/extensions to
>> >> errors, and then were forgetting to downgrade them back to
>> warnings as all
>> >> the other diagnostics are seen. So it's just an implementation
>> detail that
>> >> was leaking and manifesting as errors in a context where it
>> should have been
>> >> impossible.
>> >
>> >
>> > These diagnostics are set up as 'errors that we suppress in
>> system headers'
>> > (they're suppressed because they actually happen in some system
>> headers).
>> >
>> > If the viewpoint is that '-Wsystem-headers' means 'don't suppress
>> > diagnostics in system headers', then issuing errors in these
>> cases seems
>> > correct to me. If the viewpoint is that '-Wsystem-headers' means
>> 'warn on
>> > problems in system headers', then issuing warnings, not errors,
>> in these
>> > cases seems correct. It depends on what the user of the flag
>> intends it to
>> > mean.
>> If an error has been downgraded for system headers I don't think it
>> makes sense if -Wsystem-headers (which in the user's manual is
>> described as "Enables warnings from system headers.") causes the build
>> to fail. How is a system library developer supposed to check for
>> warnings if it isn't possible to enable warnings without breaking the
>> build?
>>
>>
>> They're supposed to fix their code so it's valid C++ =) (and they can use
>> the warning flag name we list, to turn the error off).
>>
>> > I think the former option makes a little more sense for system
>> header
>> > developers -- if their system headers contain ill-formed code,
>> they probably
>> > want to know about that with more urgency than if their system
>> headers
>> > merely contain dubious code. But we still don't know what the
>> person who
>> > filed the original PR was trying to do, and maybe there's a use
>> case where
>> > the latter view makes more sense.
>> The use case for me was that I was looking at a bug report and when
>> reducing a test case I ended up finding a problem in lib\Headers. When
>> enabling -Wsystem-headers the build failed early instead of completing
>> and producing a warning to point me in the right direction.
>>
>>
>> OK, and because the error caused your build to fail, it was harder for
>> you to perform the reduction? That's an interesting situation, but it seems
>> pretty easy to work around once you know what's happening. I'm still on the
>> fence here.
>>
>
> Hi Richard,
>
> I've taken a step back to look at this in context.
>
> David Wiberg's end-user use case appears entirely reasonable to me,
I agree. He can achieve his use case with -Wsystem-headers
-Wno-error=invalid-constexpr.
> and there's a strong expectation that -Wsystem-headers shouldn't introduce
> errors in valid system header code.
I don't think this has been demonstrated. We have only one report of a user
being surprised here, and at least one Clang developer believes the current
behavior is appropriate.
> 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.
> In this case, the problem was that the flag was inadvertently disabling a
> system header workaround that you introduced, and that's not really the
> purpose of the flag to disable compatibility features. It does appear just
> to be a bug that my patch resolves.
>
> We absolutely should have a -fno-system-headers that simply disables
> special handling of system headers and it'll be an invaluable tool for
> standard library developers. But this is not the right flag for that.
>
> -Wsystem-headers should have minimal impact beyond doing "what it says on
> the tin" so that interested developers can explore the system header
> workarounds and warnings safely without risking a broken build.
>
> Anything else will draw unwanted problem reports against the standard
> library implementation.
>
> For these reasons I'm happy with my original patch as a conservatively
> correct step in the right direction.
>
> Some background: I've realized after discussions with the libc++
> developers that a small change like this can be a headache for system
> header developers. This has made me very conscious that we take care to
> preserve any workarounds and not silently upgrade them to hard errors in
> user code that ordinary developers will encounter.
>
> So I see it as part of the unspoken contract we have with the libc++ team
> to fix this in the conservative way I outlined in PR18327, such that the
> flag doesn't introduce errors for code that's otherwise accepted.
>
> Alp.
>
>
>
> >> Remember that this flag doesn't control the very many
>> isInSystemHeader()
>> >> and isInSystemMacro() checks that happen earlier than the
>> diagnostic
>> >> machinery. A -fno-system-headers flag to just disable the whole
>> system
>> >> header machinery would be separately useful though, agreed.
>> >
>> >
>> > I agree. If we want this flag to mean 'there are no system
>> headers', it does
>> > not go far enough.
>> >
>> >>
>> >>
>> >> Alp.
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>>
>> >>>> Alp.
>> >>>>
>> >>>>>> That would seem to make perfect sense to people developing
>> system
>> >>>>>> headers, and is our current behavior. What is the use case
>> that leads to
>> >>>>>> enabling -Wsystem-headers but not wanting that to lead to
>> errors? PR18327
>> >>>>>> doesn't make that obvious.
>> >>>>>
>> >>>>> Not sure I’m following that report, if one doesn’t like that
>> that
>> >>>>> diagnostic is by default mapped to an error, maybe map it to
>> a warning on
>> >>>>> the command-line or discuss whether it should not be mapped
>> to error by
>> >>>>> default ?
>> >>>>> I don’t see a need to complicate what -Wsystem-headers does.
>> >>>>>
>> >>>> --
>> >>>> http://www.nuanti.com
>> >>>> the browser experts
>> >>>>
>> >>
>> >> --
>> >> http://www.nuanti.com
>> >> the browser experts
>> >>
>> >
>> >
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
>> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> >
>>
>>
> --
> http://www.nuanti.com
> the browser experts
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140109/4aa2f2ed/attachment.html>
More information about the cfe-commits
mailing list