c-parser.c (c_parser_switch_statement): Add IF_P argument, parse it through to c_pars...
authorJakub Jelinek <jakub@redhat.com>
Thu, 5 May 2016 13:26:59 +0000 (15:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 5 May 2016 13:26:59 +0000 (15:26 +0200)
* c-parser.c (c_parser_switch_statement): Add IF_P argument,
parse it through to c_parser_c99_block_statement.
(c_parser_statement_after_labels): Adjust c_parser_switch_statement
caller.

* parser.c (cp_parser_selection_statement): For RID_SWITCH,
pass if_p instead of NULL to cp_parser_implicitly_scoped_statement.

* c-c++-common/Wdangling-else-4.c: New test.

From-SVN: r235920

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wdangling-else-4.c [new file with mode: 0644]

index 1e77ef5e40f125215c6161d747e9a1b3cb8ee428..49c9064854f566debe1c1f91af85802d8def3d10 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-parser.c (c_parser_switch_statement): Add IF_P argument,
+       parse it through to c_parser_c99_block_statement.
+       (c_parser_statement_after_labels): Adjust c_parser_switch_statement
+       caller.
+
 2016-05-04  Marek Polacek  <polacek@redhat.com>
 
        * c-parser.c (c_parser_if_statement): Replace OPT_Wparentheses with
index d275f8ef594a45cba9ae3907843b4268749adb40..6523c08d63f0975c6f7bce2578a5ed7a9727f9e8 100644 (file)
@@ -1305,7 +1305,7 @@ static void c_parser_statement (c_parser *, bool *);
 static void c_parser_statement_after_labels (c_parser *, bool *,
                                             vec<tree> * = NULL);
 static void c_parser_if_statement (c_parser *, bool *, vec<tree> *);
-static void c_parser_switch_statement (c_parser *);
+static void c_parser_switch_statement (c_parser *, bool *);
 static void c_parser_while_statement (c_parser *, bool, bool *);
 static void c_parser_do_statement (c_parser *, bool);
 static void c_parser_for_statement (c_parser *, bool, bool *);
@@ -5138,7 +5138,7 @@ c_parser_statement_after_labels (c_parser *parser, bool *if_p,
          c_parser_if_statement (parser, if_p, chain);
          break;
        case RID_SWITCH:
-         c_parser_switch_statement (parser);
+         c_parser_switch_statement (parser, if_p);
          break;
        case RID_WHILE:
          c_parser_while_statement (parser, false, if_p);
@@ -5570,7 +5570,7 @@ c_parser_if_statement (c_parser *parser, bool *if_p, vec<tree> *chain)
 */
 
 static void
-c_parser_switch_statement (c_parser *parser)
+c_parser_switch_statement (c_parser *parser, bool *if_p)
 {
   struct c_expr ce;
   tree block, expr, body, save_break;
@@ -5605,7 +5605,7 @@ c_parser_switch_statement (c_parser *parser)
   c_start_case (switch_loc, switch_cond_loc, expr, explicit_cast_p);
   save_break = c_break_label;
   c_break_label = NULL_TREE;
-  body = c_parser_c99_block_statement (parser, NULL/*if??*/);
+  body = c_parser_c99_block_statement (parser, if_p);
   c_finish_case (body, ce.original_type);
   if (c_break_label)
     {
index 74df11011fcaefe0c3ae42dc0bbb351b09b84061..9006b341a7a3d34f7d1013db5088c40995583115 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * parser.c (cp_parser_selection_statement): For RID_SWITCH,
+       pass if_p instead of NULL to cp_parser_implicitly_scoped_statement.
+
 2016-05-04  Marek Polacek  <polacek@redhat.com>
 
        * parser.c (cp_parser_selection_statement): Replace OPT_Wparentheses
index da2ee3cf1dc5a98ad5bda0c00c1a91a6a2e315ff..f4c6f74b3d06fb1361fa2062581cc80138e3e944 100644 (file)
@@ -10978,7 +10978,7 @@ cp_parser_selection_statement (cp_parser* parser, bool *if_p,
            in_statement = parser->in_statement;
            parser->in_switch_statement_p = true;
            parser->in_statement |= IN_SWITCH_STMT;
-           cp_parser_implicitly_scoped_statement (parser, NULL,
+           cp_parser_implicitly_scoped_statement (parser, if_p,
                                                   guard_tinfo);
            parser->in_switch_statement_p = in_switch_statement_p;
            parser->in_statement = in_statement;
index ea73617155fcb2606782ac535e76f8f801e10358..7eefd9445a3b79025d2a92c128e79122b3a918f9 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-c++-common/Wdangling-else-4.c: New test.
+
 2016-05-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/70906
diff --git a/gcc/testsuite/c-c++-common/Wdangling-else-4.c b/gcc/testsuite/c-c++-common/Wdangling-else-4.c
new file mode 100644 (file)
index 0000000..12cc140
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-Wdangling-else" } */
+
+void bar (int);
+
+void
+foo (int a, int b, int c)
+{
+  if (a)       /* { dg-warning "suggest explicit braces to avoid ambiguous .else." } */
+    switch (b)
+      case 0:
+       if (c)
+         bar (1);
+  else
+    bar (2);
+}
+
+void
+baz (int a, int b, int c)
+{
+  if (a)
+    switch (b)
+      {
+      case 0:
+       if (c)
+         bar (1);
+      }
+  else
+    bar (2);
+}
+