Index: gcc/cp/cp-gimplify.c =================================================================== --- gcc/cp/cp-gimplify.c (revision 192168) +++ gcc/cp/cp-gimplify.c (working copy) @@ -948,11 +948,12 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, 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 (input_location, + 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) { Index: gcc/gimplify.c =================================================================== --- gcc/gimplify.c (revision 192168) +++ gcc/gimplify.c (working copy) @@ -7475,6 +7475,10 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gi 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)); Index: gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C =================================================================== --- gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C (revision 192168) +++ gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C (working copy) @@ -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" } } Index: gcc/tree-eh.c =================================================================== --- gcc/tree-eh.c (revision 192168) +++ gcc/tree-eh.c (working copy) @@ -1100,6 +1100,7 @@ lower_try_finally_onedest (struct leh_state *state 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 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