From c7a252ba2d0a08397d8fc6d6dc7db34f90f76acb Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Wed, 25 Mar 2020 12:32:43 -0400 Subject: [PATCH] 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) : 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. --- 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(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wduplicated-cond1.C 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 + + PR c++/94265 + * parser.c (cp_parser_selection_statement) : Invalidate the + current condition chain when the if-statement has a non-empty + init-statement. + 2020-03-25 Iain Sandoe 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 + + PR c++/94265 + * g++.dg/warn/Wduplicated-cond1.C: New test. + 2020-03-25 Martin Sebor 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) + { } +} -- 2.30.2