c.opt (Wdangling-else): New option.
authorMarek Polacek <polacek@redhat.com>
Wed, 4 May 2016 16:00:33 +0000 (16:00 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 4 May 2016 16:00:33 +0000 (16:00 +0000)
* c.opt (Wdangling-else): New option.

* c-parser.c (c_parser_if_statement): Replace OPT_Wparentheses with
OPT_Wdangling_else.

* parser.c (cp_parser_selection_statement): Replace OPT_Wparentheses
with OPT_Wdangling_else.

* doc/invoke.texi: Document -Wdangling-else.

* c-c++-common/Wdangling-else-1.c: New test.
* c-c++-common/Wdangling-else-2.c: New test.
* c-c++-common/Wdangling-else-3.c: New test.

From-SVN: r235885

12 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wdangling-else-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/Wdangling-else-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/Wdangling-else-3.c [new file with mode: 0644]

index c99daeb457f4a46450629d7dea1d373356f47d2c..17390ab74718138c56491499fce84a36de32f3c8 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-04  Marek Polacek  <polacek@redhat.com>
+
+       * doc/invoke.texi: Document -Wdangling-else.
+
 2016-05-04  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config.gcc: Error out when conflicting multilib is detected.  Do not
index 09a72e39e864b7f93cb10eaca6380a3357ac98ba..e1ba43945c64dc9a9504946189d032e58e698e50 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-04  Marek Polacek  <polacek@redhat.com>
+
+       * c.opt (Wdangling-else): New option.
+
 2016-05-03  Marek Polacek  <polacek@redhat.com>
 
        PR c/70859
index 05bfa7cbc6f4b77e64fadf50aafdd40df63620cf..bdc6ee0f83bc948323ba47460bd0e458b3b0f4fa 100644 (file)
@@ -370,6 +370,10 @@ Wctor-dtor-privacy
 C++ ObjC++ Var(warn_ctor_dtor_privacy) Warning
 Warn when all constructors and destructors are private.
 
+Wdangling-else
+C ObjC C++ ObjC++ Var(warn_dangling_else) Warning LangEnabledBy(C ObjC C++ ObjC++,Wparentheses)
+Warn about dangling else.
+
 Wdate-time
 C ObjC C++ ObjC++ CPP(warn_date_time) CppReason(CPP_W_DATE_TIME) Var(cpp_warn_date_time) Init(0) Warning
 Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage.
index 517a8c6c02ec3fbe4c3790bf94cdcdcfa9490eaa..1e77ef5e40f125215c6161d747e9a1b3cb8ee428 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-04  Marek Polacek  <polacek@redhat.com>
+
+       * c-parser.c (c_parser_if_statement): Replace OPT_Wparentheses with
+       OPT_Wdangling_else.
+
 2016-05-04  Marek Polacek  <polacek@redhat.com>
 
        PR c/48778
index 701ab45ff891b75c6005e255612fd319c9db8cec..d275f8ef594a45cba9ae3907843b4268749adb40 100644 (file)
@@ -5542,7 +5542,7 @@ c_parser_if_statement (c_parser *parser, bool *if_p, vec<tree> *chain)
       /* Diagnose an ambiguous else if if-then-else is nested inside
         if-then.  */
       if (nested_if)
-       warning_at (loc, OPT_Wparentheses,
+       warning_at (loc, OPT_Wdangling_else,
                    "suggest explicit braces to avoid ambiguous %<else%>");
 
       if (warn_duplicated_cond)
index b7375189214821074cf25252f2735df3ed9b877c..74df11011fcaefe0c3ae42dc0bbb351b09b84061 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-04  Marek Polacek  <polacek@redhat.com>
+
+       * parser.c (cp_parser_selection_statement): Replace OPT_Wparentheses
+       with OPT_Wdangling_else.
+
 2016-05-03  Martin Sebor  <msebor@redhat.com>
 
        PR c++/66561
index c4941a0599692ae818f54e1b73f6058894d352a1..da2ee3cf1dc5a98ad5bda0c00c1a91a6a2e315ff 100644 (file)
@@ -10951,7 +10951,7 @@ cp_parser_selection_statement (cp_parser* parser, bool *if_p,
                   statement which does have an else clause.  We warn
                   about the potential ambiguity.  */
                if (nested_if)
-                 warning_at (EXPR_LOCATION (statement), OPT_Wparentheses,
+                 warning_at (EXPR_LOCATION (statement), OPT_Wdangling_else,
                              "suggest explicit braces to avoid ambiguous"
                              " %<else%>");
                if (warn_duplicated_cond)
index 46729db7ac586402fae588a97ad9fa2c0f18fbaa..96df18e4c31f2530b31ce6014348d04e6f2f85b9 100644 (file)
@@ -257,7 +257,8 @@ Objective-C and Objective-C++ Dialects}.
 -Wc90-c99-compat -Wc99-c11-compat @gol
 -Wc++-compat -Wc++11-compat -Wc++14-compat -Wcast-align  -Wcast-qual  @gol
 -Wchar-subscripts -Wclobbered  -Wcomment -Wconditionally-supported  @gol
--Wconversion -Wcoverage-mismatch -Wno-cpp -Wdate-time -Wdelete-incomplete @gol
+-Wconversion -Wcoverage-mismatch -Wno-cpp -Wdangling-else -Wdate-time @gol
+-Wdelete-incomplete @gol
 -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init @gol
 -Wdisabled-optimization @gol
 -Wno-discarded-qualifiers -Wno-discarded-array-qualifiers @gol
@@ -3976,46 +3977,6 @@ Also warn if a comparison like @code{x<=y<=z} appears; this is
 equivalent to @code{(x<=y ? 1 : 0) <= z}, which is a different
 interpretation from that of ordinary mathematical notation.
 
-Also warn about constructions where there may be confusion to which
-@code{if} statement an @code{else} branch belongs.  Here is an example of
-such a case:
-
-@smallexample
-@group
-@{
-  if (a)
-    if (b)
-      foo ();
-  else
-    bar ();
-@}
-@end group
-@end smallexample
-
-In C/C++, every @code{else} branch belongs to the innermost possible
-@code{if} statement, which in this example is @code{if (b)}.  This is
-often not what the programmer expected, as illustrated in the above
-example by indentation the programmer chose.  When there is the
-potential for this confusion, GCC issues a warning when this flag
-is specified.  To eliminate the warning, add explicit braces around
-the innermost @code{if} statement so there is no way the @code{else}
-can belong to the enclosing @code{if}.  The resulting code
-looks like this:
-
-@smallexample
-@group
-@{
-  if (a)
-    @{
-      if (b)
-        foo ();
-      else
-        bar ();
-    @}
-@}
-@end group
-@end smallexample
-
 Also warn for dangerous uses of the GNU extension to
 @code{?:} with omitted middle operand. When the condition
 in the @code{?}: operator is a boolean expression, the omitted value is
@@ -5148,6 +5109,51 @@ compiler doesn't give this warning for types defined in the main .C
 file, as those are unlikely to have multiple definitions.
 @option{-Wsubobject-linkage} is enabled by default.
 
+@item -Wdangling-else
+@opindex Wdangling-else
+@opindex Wno-dangling-else
+Warn about constructions where there may be confusion to which
+@code{if} statement an @code{else} branch belongs.  Here is an example of
+such a case:
+
+@smallexample
+@group
+@{
+  if (a)
+    if (b)
+      foo ();
+  else
+    bar ();
+@}
+@end group
+@end smallexample
+
+In C/C++, every @code{else} branch belongs to the innermost possible
+@code{if} statement, which in this example is @code{if (b)}.  This is
+often not what the programmer expected, as illustrated in the above
+example by indentation the programmer chose.  When there is the
+potential for this confusion, GCC issues a warning when this flag
+is specified.  To eliminate the warning, add explicit braces around
+the innermost @code{if} statement so there is no way the @code{else}
+can belong to the enclosing @code{if}.  The resulting code
+looks like this:
+
+@smallexample
+@group
+@{
+  if (a)
+    @{
+      if (b)
+        foo ();
+      else
+        bar ();
+    @}
+@}
+@end group
+@end smallexample
+
+This warning is enabled by @option{-Wparentheses}.
+
 @item -Wdate-time
 @opindex Wdate-time
 @opindex Wno-date-time
index 06a1f0766f7e3715f92eb93155fe800ab83eb0b4..fdf961d72ff23f753bf9b9c1a7f108cff4f885ca 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-04  Marek Polacek  <polacek@redhat.com>
+
+       * c-c++-common/Wdangling-else-1.c: New test.
+       * c-c++-common/Wdangling-else-2.c: New test.
+       * c-c++-common/Wdangling-else-3.c: New test.
+
 2016-05-04  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * gcc.target/mips/mips16-attributes.c: Skip if -mmicromips
diff --git a/gcc/testsuite/c-c++-common/Wdangling-else-1.c b/gcc/testsuite/c-c++-common/Wdangling-else-1.c
new file mode 100644 (file)
index 0000000..28a5a8f
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wdangling-else" } */
+
+void bar (int);
+void
+foo (int a, int b)
+{
+  if (a) /* { dg-warning "suggest explicit braces to avoid ambiguous" } */
+    if (b)
+      bar (1);
+  else
+    bar (2);
+}
diff --git a/gcc/testsuite/c-c++-common/Wdangling-else-2.c b/gcc/testsuite/c-c++-common/Wdangling-else-2.c
new file mode 100644 (file)
index 0000000..87ea1ab
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wparentheses" } */
+
+void bar (int);
+void
+foo (int a, int b)
+{
+  if (a) /* { dg-warning "suggest explicit braces to avoid ambiguous" } */
+    if (b)
+      bar (1);
+  else
+    bar (2);
+}
diff --git a/gcc/testsuite/c-c++-common/Wdangling-else-3.c b/gcc/testsuite/c-c++-common/Wdangling-else-3.c
new file mode 100644 (file)
index 0000000..0dae0d5
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wparentheses -Wno-dangling-else" } */
+
+void bar (int);
+void
+foo (int a, int b)
+{
+  if (a) /* { dg-bogus "suggest explicit braces to avoid ambiguous" } */
+    if (b)
+      bar (1);
+  else
+    bar (2);
+}