From: Matthew Beliveau Date: Thu, 1 Aug 2019 18:04:23 +0000 (+0000) Subject: re PR c++/90590 (enumeration value not handled in switch warning for std::ios_base... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ce529ffca708a635f434a99bf082dec2a1ba0446;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0acaa7b66b9..dc06ef46943 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 b5d09e761d7..d671b77a2b0 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 d16e123d61a..6b363ac3e0b 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 00000000000..4e11debb7fa --- /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 00000000000..22f1a7d5d52 --- /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 00000000000..23da97f9d74 --- /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 00000000000..e4f8635576f --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr90590-2.h @@ -0,0 +1,4 @@ +#pragma GCC system_header +struct { + enum { _A } b; +} c;