Commit c7a252ba by Patrick Palka

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.
parent 05c13c43
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
......
......@@ -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);
}
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
......
// 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)
{ }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment