From 7792bd8a9001f514e3b05d2c6d9e0813e8ef7d8e Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 12 Mar 2012 19:29:38 +0000 Subject: [PATCH] re PR c++/52299 (GCC warns on compile time division by zero erroneously) /cp 2012-03-12 Paolo Carlini PR c++/52299 * pt.c (tsubst_copy_and_build, case COND_EXPR): Avoid bogus division by zero warnings. /testsuite 2012-03-12 Paolo Carlini PR c++/52299 * g++.dg/warn/Wdiv-by-zero-bogus.C: New. From-SVN: r185264 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/pt.c | 34 ++++++++++++++++--- gcc/testsuite/ChangeLog | 7 +++- .../g++.dg/warn/Wdiv-by-zero-bogus.C | 30 ++++++++++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24e629fe8cd..1a3ac83ac77 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-03-12 Paolo Carlini + + PR c++/52299 + * pt.c (tsubst_copy_and_build, case COND_EXPR): Avoid bogus + division by zero warnings. + 2012-03-08 Paolo Carlini * typeck.c (build_array_ref, cp_build_addr_expr_1, convert_ptrmem, diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4980c19ae06..54d540d0f52 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13943,11 +13943,35 @@ tsubst_copy_and_build (tree t, } case COND_EXPR: - return build_x_conditional_expr - (RECUR (TREE_OPERAND (t, 0)), - RECUR (TREE_OPERAND (t, 1)), - RECUR (TREE_OPERAND (t, 2)), - complain); + { + tree cond = RECUR (TREE_OPERAND (t, 0)); + tree exp1, exp2; + + if (TREE_CODE (cond) == INTEGER_CST) + { + if (integer_zerop (cond)) + { + ++c_inhibit_evaluation_warnings; + exp1 = RECUR (TREE_OPERAND (t, 1)); + --c_inhibit_evaluation_warnings; + exp2 = RECUR (TREE_OPERAND (t, 2)); + } + else + { + exp1 = RECUR (TREE_OPERAND (t, 1)); + ++c_inhibit_evaluation_warnings; + exp2 = RECUR (TREE_OPERAND (t, 2)); + --c_inhibit_evaluation_warnings; + } + } + else + { + exp1 = RECUR (TREE_OPERAND (t, 1)); + exp2 = RECUR (TREE_OPERAND (t, 2)); + } + + return build_x_conditional_expr (cond, exp1, exp2, complain); + } case PSEUDO_DTOR_EXPR: return finish_pseudo_destructor_expr diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 130a23fad71..90b11974359 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-03-12 Paolo Carlini + + PR c++/52299 + * g++.dg/warn/Wdiv-by-zero-bogus.C: New. + 2012-03-12 Bill Schmidt PR tree-optimization/46728 @@ -18,7 +23,7 @@ * gcc.target/avr/torture/addr-space-0.h: New test. * gcc.target/avr/torture/addr-space-1.h: New test. * gcc.target/avr/torture/addr-space-x.h: New test. - + 2012-03-12 Andrew Pinski * gcc.dg/tree-ssa/phi-opt-7.c: New testcase. diff --git a/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C new file mode 100644 index 00000000000..2157df30cbf --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-bogus.C @@ -0,0 +1,30 @@ +// PR c++/52299 + +template +struct test0 { + static const unsigned a_ + = x ? 10 / x : 10; +}; + +template +struct test1 { + static const unsigned a_ + = !x ? 10 : 10 / x; +}; + +template +struct test2 { + static const unsigned a_ + = x ? 10 / x : 10; +}; + +template +struct test3 { + static const unsigned a_ + = !x ? 10 : 10 / x; +}; + +unsigned i0 = test0<0>::a_; +unsigned i1 = test1<0>::a_; +unsigned i2 = test2::a_; +unsigned i3 = test3::a_;