re PR tree-optimization/46583 (-fcompare-debug failure with -O -fno-inline -fipa-cp -fipa-cp-clone)

gcc/ChangeLog:
PR debug/46583
* tree-ssa-live.c (remove_unused_scope_block_p): Keep type decls.
gcc/testsuite/ChangeLog:
PR debug/46583
* g++.dg/debug/pr46583.C: New.

From-SVN: r169058
This commit is contained in:
Alexandre Oliva 2011-01-20 16:56:25 +00:00 committed by Alexandre Oliva
parent 583ac69ceb
commit 427f6cec9c
4 changed files with 59 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2011-01-20 Alexandre Oliva <aoliva@redhat.com>
PR debug/46583
* tree-ssa-live.c (remove_unused_scope_block_p): Keep type decls.
2011-01-20 Jakub Jelinek <jakub@redhat.com>
PR debug/47283

View File

@ -1,3 +1,8 @@
2011-01-20 Alexandre Oliva <aoliva@redhat.com>
PR debug/46583
* g++.dg/debug/pr46583.C: New.
2011-01-20 Jakub Jelinek <jakub@redhat.com>
PR debug/47283

View File

@ -0,0 +1,40 @@
// PR debug/46583
// { dg-do compile }
// { dg-options "-O -fno-inline -fipa-cp -fipa-cp-clone -fcompare-debug" }
template < typename = unsigned long >struct A
{
unsigned long elems[3];
unsigned long *begin ()
{
return 0;
}
};
void
bar (unsigned long *a1, unsigned long, unsigned long *a3, unsigned const &)
{
*a3 = *a1;
}
A < >operatorM (A < >a1, unsigned long a2)
{
typedef A < >G;
G a3;
bar (a1.begin (), a2, a3.begin (), 0);
return a3;
}
struct B
{
B (A < >m):n (operatorM (m, 1))
{
}
A < >n;
};
void
foo ()
{
B (A < >());
}

View File

@ -490,11 +490,16 @@ remove_unused_scope_block_p (tree scope)
can be considered dead. We only want to keep around blocks user can
breakpoint into and ask about value of optimized out variables.
Similarly we need to keep around types at least until all variables of
all nested blocks are gone. We track no information on whether given
type is used or not. */
Similarly we need to keep around types at least until all
variables of all nested blocks are gone. We track no
information on whether given type is used or not, so we have
to keep them even when not emitting debug information,
otherwise we may end up remapping variables and their (local)
types in different orders depending on whether debug
information is being generated. */
else if (debug_info_level == DINFO_LEVEL_NORMAL
else if (TREE_CODE (*t) == TYPE_DECL
|| debug_info_level == DINFO_LEVEL_NORMAL
|| debug_info_level == DINFO_LEVEL_VERBOSE)
;
else