aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMatthew Beliveau <mbelivea@redhat.com>2019-08-01 18:04:23 +0000
committerMatthew Beliveau <mbelivea@gcc.gnu.org>2019-08-01 18:04:23 +0000
commitce529ffca708a635f434a99bf082dec2a1ba0446 (patch)
treeb19701c7330848dda616d6fafc0d5fdaff5f5fd8 /gcc
parent2c726f944444e62eae732dcc704479096796187b (diff)
downloadgcc-ce529ffca708a635f434a99bf082dec2a1ba0446.zip
gcc-ce529ffca708a635f434a99bf082dec2a1ba0446.tar.gz
gcc-ce529ffca708a635f434a99bf082dec2a1ba0446.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-family/c-warn.c10
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/c-c++-common/pr90590-1.c15
-rw-r--r--gcc/testsuite/c-c++-common/pr90590-1.h2
-rw-r--r--gcc/testsuite/c-c++-common/pr90590-2.c11
-rw-r--r--gcc/testsuite/c-c++-common/pr90590-2.h4
7 files changed, 56 insertions, 0 deletions
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 <mbelivea@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.
+
2019-08-01 Uroš Bizjak <ubizjak@gmail.com>
* 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 <mbelivea@redhat.com>
+
+ 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 <polacek@redhat.com>
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;