diff options
author | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-24 16:40:32 +0000 |
---|---|---|
committer | dnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-24 16:40:32 +0000 |
commit | 100b67dab1b474045ad0fe0136894bf545caa23e (patch) | |
tree | 771c35c481fdb2bb880ce72ab481848d5c8a4fa6 | |
parent | 2aeab935658057b970d1e341010359c6648eaa8e (diff) | |
download | gcc-100b67dab1b474045ad0fe0136894bf545caa23e.tar.gz |
http://gcc.gnu.org/ml/gcc-patches/2008-02/msg01094.html
PR 33738
* tree-vrp.c (vrp_evaluate_conditional): With
-Wtype-limits, emit a warning when comparing against a
constant outside the natural range of OP0's type.
* c.opt (Wtype-limits): Move ...
* common.opt (Wtype-limits): ... here.
testsuite/ChangeLog
PR 33738
* g++.dg/warn/pr33738.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132591 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/c.opt | 4 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr33738.C | 26 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 42 |
6 files changed, 90 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d159ee770f..989cada2eed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2008-02-24 Diego Novillo <dnovillo@google.com> + + http://gcc.gnu.org/ml/gcc-patches/2008-02/msg01094.html + + PR 33738 + * tree-vrp.c (vrp_evaluate_conditional): With + -Wtype-limits, emit a warning when comparing against a + constant outside the natural range of OP0's type. + * c.opt (Wtype-limits): Move ... + * common.opt (Wtype-limits): ... here. + 2008-02-24 Edmar Wienskoski <edmar@freescale.com> * config.gcc (powerpc*-*-*): Add new cores e300c2 and e300c3. diff --git a/gcc/c.opt b/gcc/c.opt index 94f0398419d..72165b96660 100644 --- a/gcc/c.opt +++ b/gcc/c.opt @@ -123,10 +123,6 @@ Wall C ObjC C++ ObjC++ Warning Enable most warning messages -Wtype-limits -C ObjC C++ ObjC++ Var(warn_type_limits) Init(-1) Warning -Warn if a comparison is always true or always false due to the limited range of the data type - Wassign-intercept ObjC ObjC++ Var(warn_assign_intercept) Warning Warn whenever an Objective-C assignment is being intercepted by the garbage collector diff --git a/gcc/common.opt b/gcc/common.opt index ea48ba7d760..3a64d2a1a83 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -193,6 +193,10 @@ Wsystem-headers Common Var(warn_system_headers) Warning Do not suppress warnings from system headers +Wtype-limits +Common Var(warn_type_limits) Init(-1) Warning +Warn if a comparison is always true or always false due to the limited range of the data type + Wuninitialized Common Var(warn_uninitialized) Warning Warn about uninitialized automatic variables diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0a0259b2dff..6fc79d4130f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-02-24 Diego Novillo <dnovillo@google.com> + + http://gcc.gnu.org/ml/gcc-patches/2008-02/msg01094.html + + PR 33738 + * g++.dg/warn/pr33738.C: New. + 2008-02-24 Richard Sandiford <rsandifo@nildram.co.uk> * gcc.c-torture/execute/nest-align-1.x: New file. diff --git a/gcc/testsuite/g++.dg/warn/pr33738.C b/gcc/testsuite/g++.dg/warn/pr33738.C new file mode 100644 index 00000000000..8847b6e342c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr33738.C @@ -0,0 +1,26 @@ +// { dg-do run } +// { dg-options "-O2 -Wtype-limits" } +extern void link_error (void); + +enum Alpha { + ZERO = 0, ONE, TWO, THREE +}; + +Alpha a2; + +int m1 = -1; +int GetM1() { + return m1; +} + +int main() { + a2 = static_cast<Alpha>(GetM1()); + if (a2 == -1) { // { dg-warning "always false due" } + link_error (); + } + if (-1 == a2) { // { dg-warning "always false due" } + link_error (); + } + return 0; +} + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index f9615d1f815..eaeaea08902 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5077,6 +5077,48 @@ vrp_evaluate_conditional (tree cond, tree stmt) } } + if (warn_type_limits + && ret + && TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison) + { + /* If the comparison is being folded and the operand on the LHS + is being compared against a constant value that is outside of + the natural range of OP0's type, then the predicate will + always fold regardless of the value of OP0. If -Wtype-limits + was specified, emit a warning. */ + const char *warnmsg = NULL; + tree op0 = TREE_OPERAND (cond, 0); + tree op1 = TREE_OPERAND (cond, 1); + tree type = TREE_TYPE (op0); + value_range_t *vr0 = get_value_range (op0); + + if (vr0->type != VR_VARYING + && INTEGRAL_TYPE_P (type) + && vrp_val_is_min (vr0->min) + && vrp_val_is_max (vr0->max) + && is_gimple_min_invariant (op1)) + { + if (integer_zerop (ret)) + warnmsg = G_("comparison always false due to limited range of " + "data type"); + else + warnmsg = G_("comparison always true due to limited range of " + "data type"); + } + + if (warnmsg) + { + location_t locus; + + if (!EXPR_HAS_LOCATION (stmt)) + locus = input_location; + else + locus = EXPR_LOCATION (stmt); + + warning (OPT_Wtype_limits, "%H%s", &locus, warnmsg); + } + } + return ret; } |