ping

On Tue, Jul 16, 2019 at 8:40 AM Marek Polacek <pola...@redhat.com> wrote:
>
> On Mon, Jul 15, 2019 at 09:47:26AM -0400, Matthew Beliveau wrote:
> > Okay I kept the TYPE_MAIN_VARIANT and dropped the accidental new line!
> > Hopefully this should be fine!
>
> CCing Joseph as this is c-family/ stuff.
>
> > Bootstrapped/regtested on x86_64-linux, ok for trunk?
> >
> > 2019-07-12  Matthew Beliveau  <mbeli...@redhat.com>
> >
> >       PR c++/90590
> >       * c-warn.c (c_do_switch_warnings): Suppress warning for enumerators
> >       with reserved names that are in a system header.
> >
> >       * c-c++-common/pr90590-1.c: New test.
> >       * c-c++-common/pr90590-1.h: New test.
> >       * c-c++-common/pr90590-2.c: New test.
> >       * c-c++-common/pr90590-2.h: New test.
> >
> > diff --git gcc/c-family/c-warn.c gcc/c-family/c-warn.c
> > index b5d09e761d7..51c54a283e5 100644
> > --- gcc/c-family/c-warn.c
> > +++ gcc/c-family/c-warn.c
> > @@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
> >  #include "gcc-rich-location.h"
> >  #include "gimplify.h"
> >  #include "c-family/c-indentation.h"
> > +#include "c-family/c-spellcheck.h"
> >  #include "calls.h"
> >  #include "stor-layout.h"
> >
> > @@ -1628,6 +1629,15 @@ c_do_switch_warnings (splay_tree cases, location_t 
> > switch_location,
> >        if (cond && tree_int_cst_compare (cond, value))
> >       continue;
> >
> > +      /* If the enumerator is defined in a system header and uses a 
> > reserved
> > +      name, then we continue to avoid throwing a warning.  */
> > +      location_t loc = DECL_SOURCE_LOCATION
> > +         (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (type)));
> > +      if (in_system_header_at (loc)
> > +       && name_reserved_for_implementation_p
> > +           (IDENTIFIER_POINTER (TREE_PURPOSE (chain))))
> > +     continue;
> > +
> >        /* If there is a default_node, the only relevant option is
> >        Wswitch-enum.  Otherwise, if both are enabled then we prefer
> >        to warn using -Wswitch because -Wswitch is enabled by -Wall
> > diff --git gcc/testsuite/c-c++-common/pr90590-1.c 
> > gcc/testsuite/c-c++-common/pr90590-1.c
> > new file mode 100644
> > index 00000000000..4e11debb7fa
> > --- /dev/null
> > +++ gcc/testsuite/c-c++-common/pr90590-1.c
> > @@ -0,0 +1,15 @@
> > +// PR c++/90590
> > +// { dg-options -Wswitch }
> > +#include "pr90590-1.h"
> > +
> > +void
> > +g ()
> > +{
> > +  enum E e = _A;
> > +  switch (e) // { dg-bogus "enumeration value '_C' not handled in switch" }
> > +    {
> > +    case _A:
> > +    case _B:
> > +      break;
> > +    }
> > +}
> > diff --git gcc/testsuite/c-c++-common/pr90590-1.h 
> > gcc/testsuite/c-c++-common/pr90590-1.h
> > new file mode 100644
> > index 00000000000..22f1a7d5d52
> > --- /dev/null
> > +++ gcc/testsuite/c-c++-common/pr90590-1.h
> > @@ -0,0 +1,2 @@
> > +#pragma GCC system_header
> > +enum E { _A, _B, _C };
> > diff --git gcc/testsuite/c-c++-common/pr90590-2.c 
> > gcc/testsuite/c-c++-common/pr90590-2.c
> > new file mode 100644
> > index 00000000000..23da97f9d74
> > --- /dev/null
> > +++ gcc/testsuite/c-c++-common/pr90590-2.c
> > @@ -0,0 +1,11 @@
> > +// PR c++/90590
> > +// { dg-options -Wswitch }
> > +
> > +#include "pr90590-2.h"
> > +
> > +void
> > +fn ()
> > +{
> > +  switch (c.b) // { dg-bogus "enumeration value" }
> > +    ;
> > +}
> > diff --git gcc/testsuite/c-c++-common/pr90590-2.h 
> > gcc/testsuite/c-c++-common/pr90590-2.h
> > new file mode 100644
> > index 00000000000..e4f8635576f
> > --- /dev/null
> > +++ gcc/testsuite/c-c++-common/pr90590-2.h
> > @@ -0,0 +1,4 @@
> > +#pragma GCC system_header
> > +struct {
> > +  enum { _A } b;
> > +} c;
>
>
> Marek

Reply via email to