aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2013-10-03 18:13:54 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2013-10-03 16:13:54 +0000
commit2284b03444d6845ce6402db37f4ec43f6c755f77 (patch)
tree626a1783dbadedeb04e9dc7b74807b9ad23cc8c7 /gcc/fold-const.c
parent0609bdf2114919b570e7a3c4ab273fdf16262a4b (diff)
downloadgcc-2284b03444d6845ce6402db37f4ec43f6c755f77.zip
gcc-2284b03444d6845ce6402db37f4ec43f6c755f77.tar.gz
gcc-2284b03444d6845ce6402db37f4ec43f6c755f77.tar.bz2
re PR c++/19476 (Missed null checking elimination with new)
2013-10-03 Marc Glisse <marc.glisse@inria.fr> PR c++/19476 gcc/c-family/ * c.opt (fcheck-new): Move to common.opt. gcc/ * common.opt (fcheck-new): Moved from c.opt. Make it 'Common'. * calls.c (alloca_call_p): Use get_callee_fndecl. * fold-const.c (tree_expr_nonzero_warnv_p): Handle operator new. * tree-vrp.c (gimple_stmt_nonzero_warnv_p, stmt_interesting_for_vrp): Likewise. (vrp_visit_stmt): Remove duplicated code. gcc/testsuite/ * g++.dg/tree-ssa/pr19476-1.C: New file. * g++.dg/tree-ssa/pr19476-2.C: Likewise. * g++.dg/tree-ssa/pr19476-3.C: Likewise. * g++.dg/tree-ssa/pr19476-4.C: Likewise. From-SVN: r203163
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index fc29291..03d62f5 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -16222,7 +16222,15 @@ tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
strict_overflow_p);
case CALL_EXPR:
- return alloca_call_p (t);
+ {
+ tree fndecl = get_callee_fndecl (t);
+ if (!fndecl) return false;
+ if (flag_delete_null_pointer_checks && !flag_check_new
+ && DECL_IS_OPERATOR_NEW (fndecl)
+ && !TREE_NOTHROW (fndecl))
+ return true;
+ return alloca_call_p (t);
+ }
default:
break;