From 427f6cec9c82ea688d821fd2e8d05197d8a1792f Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 20 Jan 2011 16:56:25 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/debug/pr46583.C | 40 ++++++++++++++++++++++++++++ gcc/tree-ssa-live.c | 15 +++++++---- 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/debug/pr46583.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af3cd28f837..dcc35306501 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-01-20 Alexandre Oliva + + PR debug/46583 + * tree-ssa-live.c (remove_unused_scope_block_p): Keep type decls. + 2011-01-20 Jakub Jelinek PR debug/47283 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cba5291348b..baf5732df07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-20 Alexandre Oliva + + PR debug/46583 + * g++.dg/debug/pr46583.C: New. + 2011-01-20 Jakub Jelinek PR debug/47283 diff --git a/gcc/testsuite/g++.dg/debug/pr46583.C b/gcc/testsuite/g++.dg/debug/pr46583.C new file mode 100644 index 00000000000..a4e94238ece --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46583.C @@ -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 < >()); +} diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index 7a6cafa0d28..0fa906b79c7 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -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. */ - - else if (debug_info_level == DINFO_LEVEL_NORMAL + 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 (TREE_CODE (*t) == TYPE_DECL + || debug_info_level == DINFO_LEVEL_NORMAL || debug_info_level == DINFO_LEVEL_VERBOSE) ; else -- 2.30.2