[gcc/devel/c++-coroutines] c++: Fix invalid -Wduplicated-cond warning [PR94265]

Iain D Sandoe iains@gcc.gnu.org
Wed Mar 25 20:47:26 GMT 2020


https://gcc.gnu.org/g:c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb

commit c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed Mar 25 12:32:43 2020 -0400

    c++: Fix invalid -Wduplicated-cond warning [PR94265]
    
    This fixes a false-positive warning from -Wduplicate-cond in the presence of an
    if-statement with a non-empty init-statement.  Precisely determining whether a
    non-empty init-statement has side effects seems tricky and error-prone, so this
    patch takes the route of unconditionally invalidating the condition chain when
    it encounters such an if-statement.
    
    gcc/cp/ChangeLog:
    
            PR c++/94265
            * parser.c (cp_parser_selection_statement) <case RID_IF>: Invalidate the
            current condition chain when the if-statement has a non-empty
            init-statement.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/94265
            * g++.dg/warn/Wduplicated-cond1.C: New test.

Diff:
---
 gcc/cp/ChangeLog                              |  7 +++++++
 gcc/cp/parser.c                               |  7 +++++++
 gcc/testsuite/ChangeLog                       |  5 +++++
 gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C | 16 ++++++++++++++++
 4 files changed, 35 insertions(+)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d9f87eca649..34ccb9fa4c0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2020-03-25  Patrick Palka  <ppalka@redhat.com>
+
+	PR c++/94265
+	* parser.c (cp_parser_selection_statement) <case RID_IF>: Invalidate the
+	current condition chain when the if-statement has a non-empty
+	init-statement.
+
 2020-03-25  Iain Sandoe  <iain@sandoe.co.uk>
 
 	PR c++/94319
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index cbd5510a8fb..05363653691 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -11934,6 +11934,13 @@ cp_parser_selection_statement (cp_parser* parser, bool *if_p,
 	      pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
 		       "init-statement in selection statements only available "
 		       "with %<-std=c++17%> or %<-std=gnu++17%>");
+	    if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
+	      {
+		/* A non-empty init-statement can have arbitrary side
+		   effects.  */
+		delete chain;
+		chain = NULL;
+	      }
 	    cp_parser_init_statement (parser, &decl);
 	  }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7f2d5908713..ddfdaa6da2f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-03-25  Patrick Palka  <ppalka@redhat.com>
+
+	PR c++/94265
+	* g++.dg/warn/Wduplicated-cond1.C: New test.
+
 2020-03-25  Martin Sebor  <msebor@redhat.com>
 
 	PR tree-optimization/94131
diff --git a/gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C b/gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C
new file mode 100644
index 00000000000..e85920aaedf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C
@@ -0,0 +1,16 @@
+// PR c++/94265
+// { dg-do compile { target c++17 } }
+// { dg-additional-options "-Wduplicated-cond" }
+
+void
+foo ()
+{
+  if (int a = 0; a)
+  { }
+  else if (a = 5; a) // { dg-message "previously used here" }
+  { }
+  else if (; a) // { dg-warning "duplicated .if. condition" }
+  { }
+  else if (int b = ++a; a)
+  { }
+}


More information about the Gcc-cvs mailing list