diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00a61de7628..a7d550fa976 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-10-10 Dehao Chen + + * tree-eh.c (lower_try_finally_onedest): Set correct location for + deallocator. + * gimplify.c (gimplify_expr): Set correct location for TRY stmt. + 2012-10-10 Oleg Endo PR target/52480 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5d091838d92..68ebb96a7c3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2012-10-10 Dehao Chen + + * cp-gimplify.c (cp_genericize_r): Set location for TRY expr. + 2012-10-09 Lawrence Crowl * Make-lang.in (class.o): Add dependence on hash-table.h. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 6178993fe89..f715e963c49 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -948,11 +948,12 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) to lower this construct before scanning it, so we need to lower these before doing anything else. */ else if (TREE_CODE (stmt) == CLEANUP_STMT) - *stmt_p = build2 (CLEANUP_EH_ONLY (stmt) ? TRY_CATCH_EXPR - : TRY_FINALLY_EXPR, - void_type_node, - CLEANUP_BODY (stmt), - CLEANUP_EXPR (stmt)); + *stmt_p = build2_loc (EXPR_LOCATION (stmt), + CLEANUP_EH_ONLY (stmt) ? TRY_CATCH_EXPR + : TRY_FINALLY_EXPR, + void_type_node, + CLEANUP_BODY (stmt), + CLEANUP_EXPR (stmt)); else if (TREE_CODE (stmt) == IF_STMT) { diff --git a/gcc/gimplify.c b/gcc/gimplify.c index a871e7d4c0c..979715ab95e 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -7475,6 +7475,10 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, TREE_CODE (*expr_p) == TRY_FINALLY_EXPR ? GIMPLE_TRY_FINALLY : GIMPLE_TRY_CATCH); + if (LOCATION_LOCUS (saved_location) != UNKNOWN_LOCATION) + gimple_set_location (try_, saved_location); + else + gimple_set_location (try_, EXPR_LOCATION (save_expr)); if (TREE_CODE (*expr_p) == TRY_CATCH_EXPR) gimple_try_set_catch_is_cleanup (try_, TRY_CATCH_IS_CLEANUP (*expr_p)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9d2fbd4f52..a5a27a87fd3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-10-10 Dehao Chen + + * g++.dg/debug/dwarf2/deallocator.C: Cover more deallocator cases. + 2012-10-10 Oleg Endo PR target/52480 diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C b/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C index eab38a3ade2..405739311a9 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C @@ -18,6 +18,7 @@ int bar(); void foo(int i) { + t test_outside; for (int j = 0; j < 10; j++) { t test; @@ -28,6 +29,18 @@ void foo(int i) return; } } + if (i) + { + t test; + if (i == 10) + { + test.bar(); + } + } + test_outside.foo(); return; } -// { dg-final { scan-assembler "deallocator.C:28" } } +// { dg-final { scan-assembler "deallocator.C:29" } } +// { dg-final { scan-assembler "deallocator.C:31" } } +// { dg-final { scan-assembler "deallocator.C:38" } } +// { dg-final { scan-assembler "deallocator.C:41" } } diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 94ed459f6f1..b4be50c6fd3 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -1100,6 +1100,7 @@ lower_try_finally_onedest (struct leh_state *state, struct leh_tf_state *tf) struct goto_queue_node *q, *qe; gimple x; gimple_seq finally; + gimple_stmt_iterator gsi; tree finally_label; location_t loc = gimple_location (tf->try_finally_expr); @@ -1120,6 +1121,17 @@ lower_try_finally_onedest (struct leh_state *state, struct leh_tf_state *tf) lower_eh_constructs_1 (state, &finally); + for (gsi = gsi_start (finally); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + if (LOCATION_LOCUS (gimple_location (stmt)) == UNKNOWN_LOCATION) + { + tree block = gimple_block (stmt); + gimple_set_location (stmt, gimple_location (tf->try_finally_expr)); + gimple_set_block (stmt, block); + } + } + if (tf->may_throw) { /* Only reachable via the exception edge. Add the given label to