[PATCH] c++: Fix invalid -Wduplicated-cond warning [PR94265]
Patrick Palka
ppalka@redhat.com
Wed Mar 25 12:52:47 GMT 2020
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.
Tested on x86_64-pc-linux-gnu, does this look OK?
gcc/cp/ChangeLog:
PR c++/94265
* parser.c (cp_parser_selection_statement) [RID_IF]: Invalidate the
current condition chain if the if-statement has a non-empty
init-statement.
gcc/testsuite/ChangeLog:
PR c++/94265
* g++.dg/warn/Wduplicated-cond1.C: New test.
---
gcc/cp/parser.c | 7 +++++++
gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C | 16 ++++++++++++++++
2 files changed, 23 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C
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/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)
+ { }
+}
--
2.26.0.rc1.11.g30e9940356
More information about the Gcc-patches
mailing list