Commit da920d0c by Jakub Jelinek

tree: Fix -fcompare-debug issues due to protected_set_expr_location [PR94323]

The following testcase FAILs since recently when the C++ FE started calling
protected_set_expr_location more often.
With -g, it is called on a STATEMENT_LIST that contains a DEBUG_BEGIN_STMT
and CLEANUP_POINT_EXPR, and as STATEMENT_LISTs have !CAN_HAVE_LOCATION_P,
nothing is set.  Without -g, it is called instead on the CLEANUP_POINT_EXPR
directly and changes its location.

The following patch recurses on the single non-DEBUG_BEGIN_STMT statement
of a STATEMENT_LIST if any to make the two behave the same.

2020-03-26  Jakub Jelinek  <jakub@redhat.com>

	PR debug/94323
	* tree.c (protected_set_expr_location): Recurse on STATEMENT_LIST
	that contains exactly one non-DEBUG_BEGIN_STMT statement.

	* g++.dg/debug/pr94323.C: New test.
parent d6730f06
2020-03-26 Jakub Jelinek <jakub@redhat.com>
PR debug/94323
* tree.c (protected_set_expr_location): Recurse on STATEMENT_LIST
that contains exactly one non-DEBUG_BEGIN_STMT statement.
PR debug/94281
* gimple.h (gimple_seq_first_nondebug_stmt): New function.
(gimple_seq_last_nondebug_stmt): Don't return NULL if seq contains
......
2020-03-26 Jakub Jelinek <jakub@redhat.com>
PR debug/94323
* g++.dg/debug/pr94323.C: New test.
2020-03-26 Martin Liska <mliska@suse.cz>
PR testsuite/94334
......
// PR debug/94323
// { dg-do compile }
// { dg-options "-O2 -fcompare-debug" }
volatile int a;
void
foo ()
{
({
a;
});
}
......@@ -5146,6 +5146,33 @@ protected_set_expr_location (tree t, location_t loc)
{
if (CAN_HAVE_LOCATION_P (t))
SET_EXPR_LOCATION (t, loc);
else if (t && TREE_CODE (t) == STATEMENT_LIST)
{
/* With -gstatement-frontiers we could have a STATEMENT_LIST with
DEBUG_BEGIN_STMT(s) and only a single other stmt, which with
-g wouldn't be present and we'd have that single other stmt
directly instead. */
struct tree_statement_list_node *n = STATEMENT_LIST_HEAD (t);
if (!n)
return;
while (TREE_CODE (n->stmt) == DEBUG_BEGIN_STMT)
{
n = n->next;
if (!n)
return;
}
tree t2 = n->stmt;
do
{
n = n->next;
if (!n)
{
protected_set_expr_location (t2, loc);
return;
}
}
while (TREE_CODE (n->stmt) == DEBUG_BEGIN_STMT);
}
}
/* Data used when collecting DECLs and TYPEs for language data removal. */
......
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