public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Matthew Beliveau <mbelivea@redhat.com>
To: Marek Polacek <polacek@redhat.com>
Cc: Jason Merrill <jason@redhat.com>, gcc-patches@gcc.gnu.org
Subject: Re: [C++ PATCH] PR c++/90590 Suppress warning for enumeration value not handled in switch warning
Date: Mon, 15 Jul 2019 14:17:00 -0000	[thread overview]
Message-ID: <CAOrE4X3va=fUPEvGbHWv=QW7CqyTGCchVDK+G=9XyS+KbLZARA@mail.gmail.com> (raw)
In-Reply-To: <20190712224930.GT5989@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3589 bytes --]

Okay I kept the TYPE_MAIN_VARIANT and dropped the accidental new line!
Hopefully this should be fine!

On Fri, Jul 12, 2019 at 6:49 PM Marek Polacek <polacek@redhat.com> wrote:
>
> On Fri, Jul 12, 2019 at 02:38:59PM -0400, Marek Polacek wrote:
> > On Fri, Jul 12, 2019 at 02:34:37PM -0400, Matthew Beliveau wrote:
> > > @@ -1628,6 +1629,16 @@ 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)));
> >
> > As I mentioned before, I wonder if we can get away without the
> > TYPE_MAIN_VARIANT here.
>
> Ah, without TYPE_MAIN_VARIANT there's this ICEs:
>
> /opt/notnfs/polacek/gcc/libstdc++-v3/src/c++11/debug.cc: In function ‘void {anonymous}::print_field({anonymous}::PrintContext&, const _Parameter&, const char*)’:
> /opt/notnfs/polacek/gcc/libstdc++-v3/src/c++11/debug.cc:791:5: internal compiler error: Segmentation fault
>   791 |     }
>       |     ^
> 0xf31def crash_signal
>         /opt/notnfs/polacek/gcc/gcc/toplev.c:326
> 0xaaa579 contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*)
>         /opt/notnfs/polacek/gcc/gcc/tree.h:3330
> 0xaaa579 c_do_switch_warnings(splay_tree_s*, unsigned int, tree_node*, tree_node*, bool)
>         /opt/notnfs/polacek/gcc/gcc/c-family/c-warn.c:1634
> 0x8ab61f pop_switch()
>         /opt/notnfs/polacek/gcc/gcc/cp/decl.c:3567
> 0x9e0af4 finish_switch_stmt(tree_node*)
>         /opt/notnfs/polacek/gcc/gcc/cp/semantics.c:1229
> 0x95764d cp_parser_selection_statement
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:11964
> 0x95764d cp_parser_statement
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:11186
> 0x958770 cp_parser_statement_seq_opt
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:11667
> 0x958847 cp_parser_compound_statement
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:11621
> 0x971990 cp_parser_function_body
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:22651
> 0x971990 cp_parser_ctor_initializer_opt_and_function_body
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:22702
> 0x972216 cp_parser_function_definition_after_declarator
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:28016
> 0x972fae cp_parser_function_definition_from_specifiers_and_declarator
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:27932
> 0x972fae cp_parser_init_declarator
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:20288
> 0x954ecf cp_parser_simple_declaration
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:13546
> 0x9798a2 cp_parser_declaration
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:13243
> 0x97a46c cp_parser_declaration_seq_opt
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:13119
> 0x97a46c cp_parser_namespace_body
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:19335
> 0x97a46c cp_parser_namespace_definition
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:19313
> 0x9799b3 cp_parser_declaration
>         /opt/notnfs/polacek/gcc/gcc/cp/parser.c:13223
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <https://gcc.gnu.org/bugs/> for instructions.
>
> So seems like we need it after all.  Sorry about that.
>
> Marek

[-- Attachment #2: pr90590f.patch --]
[-- Type: text/x-patch, Size: 2882 bytes --]

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2019-07-12  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.

	* 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;

  reply	other threads:[~2019-07-15 13:47 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-09 15:53 Matthew Beliveau
2019-07-09 17:48 ` Marek Polacek
2019-07-09 21:23 ` Jason Merrill
2019-07-12 18:39   ` Matthew Beliveau
2019-07-12 18:41     ` Marek Polacek
2019-07-12 23:00       ` Marek Polacek
2019-07-15 14:17         ` Matthew Beliveau [this message]
2019-07-16 12:42           ` Marek Polacek
2019-07-23 15:33             ` Matthew Beliveau
2019-07-30 19:46               ` Matthew Beliveau
2019-07-31 18:58           ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAOrE4X3va=fUPEvGbHWv=QW7CqyTGCchVDK+G=9XyS+KbLZARA@mail.gmail.com' \
    --to=mbelivea@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    --cc=polacek@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).