https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70436

--- Comment #4 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Here's a prototype that seems to do the job.  Whenever we see an unbraced if,
increment the counter.  Whenever we see a compound statement, reset the
counter.  Whenever we see an else, warn if counter > 1 and then decrement the
counter.

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2f80856..3ad7196 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -10738,6 +10738,8 @@ cp_parser_expression_statement (cp_parser* parser, tree
in_statement_expr)

    Returns a tree representing the statement.  */

+static int num_unbraced_if_statements;
+
 static tree
 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
                              int bcs_flags, bool function_body)
@@ -10747,6 +10749,7 @@ cp_parser_compound_statement (cp_parser *parser, tree
in_statement_expr,
   /* Consume the `{'.  */
   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
     return error_mark_node;
+  num_unbraced_if_statements = 0;
   if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
       && !function_body && cxx_dialect < cxx14)
     pedwarn (input_location, OPT_Wpedantic,
@@ -10874,6 +10877,7 @@ cp_parser_selection_statement (cp_parser* parser, bool
*if_p,
            bool nested_if;
            unsigned char in_statement;

+           num_unbraced_if_statements++;
            /* Add the condition.  */
            finish_if_stmt_cond (condition, statement);

@@ -10898,6 +10902,9 @@ cp_parser_selection_statement (cp_parser* parser, bool
*if_p,
                  = get_token_indent_info (cp_lexer_peek_token
(parser->lexer));
                /* Consume the `else' keyword.  */
                cp_lexer_consume_token (parser->lexer);
+               if (num_unbraced_if_statements > 1)
+                 warning_at (input_location, 0, "dangling else");
+               num_unbraced_if_statements--;
                if (warn_duplicated_cond)
                  {
                    if (cp_lexer_next_token_is_keyword (parser->lexer,
@@ -11953,6 +11960,7 @@ cp_parser_already_scoped_statement (cp_parser* parser,
     }
   else
     {
+      num_unbraced_if_statements = 0;
       /* Avoid calling cp_parser_compound_statement, so that we
         don't create a new scope.  Do everything else by hand.  */
       cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);

Reply via email to