diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 2 | ||||
-rw-r--r-- | gcc/cp/init.c | 16 | ||||
-rw-r--r-- | gcc/gimple.c | 1 | ||||
-rw-r--r-- | gcc/gimplify.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr31246-2.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr31246.C | 9 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 2 |
10 files changed, 60 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8140cc3c439..60d0e7e394b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-07-08 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c++/31246 + * gimplify.c (gimplify_expr): Propagate no_warning flag when + gimplifying. + * gimple (gimple_build_call_from_tree): Likewise. + * tree-cfg.c (remove_useless_stmts_warn_notreached): Check + no_warning flag before warning. + 2009-07-07 Manuel López-Ibáñez <manu@gcc.gnu.org> * tree.c (set_expr_locus): Remove. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 051faf6e622..3919397dfcc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2009-07-08 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c++/31246 + * init.c (build_new_1): Set TREE_NO_WARNING for compiler-generated + code. + * cp-gimplify.c (genericize_eh_spec_block): Likewise. + + 2009-07-07 Jason Merrill <jason@redhat.com> PR c++/35828 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 29f4f382e5c..fc30c06b62f 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -153,6 +153,8 @@ genericize_eh_spec_block (tree *stmt_p) tree failure = build_call_n (call_unexpected_node, 1, build_exc_ptr ()); *stmt_p = build_gimple_eh_filter_tree (body, allowed, failure); + TREE_NO_WARNING (*stmt_p) = true; + TREE_NO_WARNING (TREE_OPERAND (*stmt_p, 1)) = true; } /* Genericize an IF_STMT by turning it into a COND_EXPR. */ diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 96dd6c1dfad..68ffe3a3dd0 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2185,8 +2185,14 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, else if (stable) /* This is much simpler if we were able to preevaluate all of the arguments to the constructor call. */ - init_expr = build2 (TRY_CATCH_EXPR, void_type_node, - init_expr, cleanup); + { + /* CLEANUP is compiler-generated, so no diagnostics. */ + TREE_NO_WARNING (cleanup) = true; + init_expr = build2 (TRY_CATCH_EXPR, void_type_node, + init_expr, cleanup); + /* Likewise, this try-catch is compiler-generated. */ + TREE_NO_WARNING (init_expr) = true; + } else /* Ack! First we allocate the memory. Then we set our sentry variable to true, and expand a cleanup that deletes the @@ -2206,6 +2212,9 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, sentry = TARGET_EXPR_SLOT (begin); + /* CLEANUP is compiler-generated, so no diagnostics. */ + TREE_NO_WARNING (cleanup) = true; + TARGET_EXPR_CLEANUP (begin) = build3 (COND_EXPR, void_type_node, sentry, cleanup, void_zero_node); @@ -2217,8 +2226,9 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, = build2 (COMPOUND_EXPR, void_type_node, begin, build2 (COMPOUND_EXPR, void_type_node, init_expr, end)); + /* Likewise, this is compiler-generated. */ + TREE_NO_WARNING (init_expr) = true; } - } } else diff --git a/gcc/gimple.c b/gcc/gimple.c index 4f18b78aee6..56108312431 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -357,6 +357,7 @@ gimple_build_call_from_tree (tree t) gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t)); gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t)); gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t)); + gimple_set_no_warning (call, TREE_NO_WARNING (t)); return call; } diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 032228d2a28..b20c8ac3e5e 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -6787,6 +6787,7 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, gimplify_and_add (EH_FILTER_FAILURE (*expr_p), &failure); ehf = gimple_build_eh_filter (EH_FILTER_TYPES (*expr_p), failure); + gimple_set_no_warning (ehf, TREE_NO_WARNING (*expr_p)); gimple_eh_filter_set_must_not_throw (ehf, EH_FILTER_MUST_NOT_THROW (*expr_p)); gimplify_seq_add_stmt (pre_p, ehf); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f35f440fd9..d063cbb38ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-07-08 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c++/31246 + * g++.dg/warn/pr31246.C: New. + * g++.dg/warn/pr31246-2.C: New. + 2009-07-07 Jason Merrill <jason@redhat.com> PR c++/35828 diff --git a/gcc/testsuite/g++.dg/warn/pr31246-2.C b/gcc/testsuite/g++.dg/warn/pr31246-2.C new file mode 100644 index 00000000000..c9a4cae7e84 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr31246-2.C @@ -0,0 +1,9 @@ +// PR 31246 +// { dg-do compile } +// { dg-options "-Wunreachable-code" } +#include <new> + +int* get_ptr(void* ptr) +{ + return new(ptr) int(); +} diff --git a/gcc/testsuite/g++.dg/warn/pr31246.C b/gcc/testsuite/g++.dg/warn/pr31246.C new file mode 100644 index 00000000000..f3603af4787 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr31246.C @@ -0,0 +1,9 @@ +// PR 31246 +// { dg-do compile } +// { dg-options "-Wunreachable-code -D_GLIBCXX_DEBUG" } +#include <vector> + +int main() +{ + std::vector<int>::iterator a; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index f18bb978487..dd38134802b 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1638,6 +1638,8 @@ remove_useless_stmts_warn_notreached (gimple_seq stmts) { gimple stmt = gsi_stmt (gsi); + if (gimple_no_warning_p (stmt)) return false; + if (gimple_has_location (stmt)) { location_t loc = gimple_location (stmt); |