[PATCH] PR18327: -Wsystem-headers introduces build errors
Richard Smith
metafoo at gmail.com
Wed Jan 29 15:25:30 PST 2014
On Wed Jan 29 2014 at 1:45:22 PM, Alp Toker <alp at nuanti.com> wrote:
>
> 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.
>
> Status update: I did implement those semantics and it doesn't make as
> much sense in practice as we'd hoped.
>
> The problem is that many conventional flags such as a -Werror build or
> specific -Werror upgrades will now consistently cause system headers to
> break the build, so it's no better than where we started, and arguably
> worse.
>
> As a result I'm back with proposing the original patch for PR18327 as-is
> with more confidence. It's the only mode I've found through several
> iterations that adds informational/educational value in a way that users
> and system header developers can safely consume.
>
> (There is good news though, I've got some good cleanups and fixes out of
> the investigation that I'll post separately, especially in the area of
> "explaining" the source of diagnostics which is currently a hack in ToT.)
>
> Richard, does that work for you?
I don't think I'm following. Without your patch, -Werror -Wsystem-headers
was an error; why is it bad for it to stay that way?
-Werror is the way users say "I want a broken build if you find a warning".
This change seems to break that.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140129/0f62e381/attachment.html>
More information about the cfe-commits
mailing list