aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-03-25 12:32:43 -0400
committerPatrick Palka <ppalka@redhat.com>2020-03-25 12:33:12 -0400
commitc7a252ba2d0a08397d8fc6d6dc7db34f90f76acb (patch)
tree7e34c9ee867c9b4b8a85e029608cd0bd476c87f6 /gcc/cp
parent05c13c439903eb78f109bcab62fd9a74f03a3c9b (diff)
downloadgcc-c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb.zip
gcc-c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb.tar.gz
gcc-c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb.tar.bz2
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.
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c7
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d9f87ec..34ccb9f 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 cbd5510..0536365 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);
}