From ce529ffca708a635f434a99bf082dec2a1ba0446 Mon Sep 17 00:00:00 2001 From: Matthew Beliveau Date: Thu, 1 Aug 2019 18:04:23 +0000 Subject: [PATCH] re PR c++/90590 (enumeration value not handled in switch warning for std::ios_base::seek_dir) 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. From-SVN: r273980 --- gcc/ChangeLog | 6 ++++++ gcc/c-family/c-warn.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/c-c++-common/pr90590-1.c | 15 +++++++++++++++ gcc/testsuite/c-c++-common/pr90590-1.h | 2 ++ gcc/testsuite/c-c++-common/pr90590-2.c | 11 +++++++++++ gcc/testsuite/c-c++-common/pr90590-2.h | 4 ++++ 7 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/pr90590-1.c create mode 100644 gcc/testsuite/c-c++-common/pr90590-1.h create mode 100644 gcc/testsuite/c-c++-common/pr90590-2.c create mode 100644 gcc/testsuite/c-c++-common/pr90590-2.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0acaa7b..dc06ef4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-08-01 Matthew Beliveau + + PR c++/90590 + * c-warn.c (c_do_switch_warnings): Suppress warning for enumerators + with reserved names that are in a system header. + 2019-08-01 Uroš Bizjak * config/i386/mmx.md (vec_extractv2si_0): Add (r,x) alternative. diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index b5d09e7..d671b77 100644 --- a/gcc/c-family/c-warn.c +++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d16e123..6b363ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-08-01 Matthew Beliveau + + PR c++/90590 + * 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. + 2019-08-01 Marek Polacek PR c++/90805 - detect narrowing in case values. diff --git a/gcc/testsuite/c-c++-common/pr90590-1.c b/gcc/testsuite/c-c++-common/pr90590-1.c new file mode 100644 index 0000000..4e11deb --- /dev/null +++ b/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 a/gcc/testsuite/c-c++-common/pr90590-1.h b/gcc/testsuite/c-c++-common/pr90590-1.h new file mode 100644 index 0000000..22f1a7d --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr90590-1.h @@ -0,0 +1,2 @@ +#pragma GCC system_header +enum E { _A, _B, _C }; diff --git a/gcc/testsuite/c-c++-common/pr90590-2.c b/gcc/testsuite/c-c++-common/pr90590-2.c new file mode 100644 index 0000000..23da97f --- /dev/null +++ b/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 a/gcc/testsuite/c-c++-common/pr90590-2.h b/gcc/testsuite/c-c++-common/pr90590-2.h new file mode 100644 index 0000000..e4f8635 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr90590-2.h @@ -0,0 +1,4 @@ +#pragma GCC system_header +struct { + enum { _A } b; +} c; -- 2.7.4