diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-01-09 15:51:09 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-09 15:51:09 +0100 |
commit | cc83c823a2be3dc48f011c07c9e407af0a7974c0 (patch) | |
tree | 9860db1553f003a5d248886e9631536f697cf020 /gcc/cp | |
parent | fdbff37f390c9bb60794be943acb898159717834 (diff) | |
download | gcc-cc83c823a2be3dc48f011c07c9e407af0a7974c0.zip gcc-cc83c823a2be3dc48f011c07c9e407af0a7974c0.tar.gz gcc-cc83c823a2be3dc48f011c07c9e407af0a7974c0.tar.bz2 |
re PR c/48418 (Bit shift operator >>=)
PR c/48418
* c-common.c (c_fully_fold_internal): Warn for LSHIFT_EXPR and
RSHIFT_EXPR, if orig_op1 isn't INTEGER_CST, op1 is INTEGER_CST
and is either negative or bigger or equal to type precision
of the first operand.
* typeck.c (cp_build_binary_op): For LSHIFT_EXPR and RSHIFT_EXPR,
call maybe_constant_value for the negative or too big shift
count warnings.
* c-c++-common/pr48418.c: New test.
From-SVN: r195051
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 21 |
2 files changed, 21 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4658353..d67a3c4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-01-09 Jakub Jelinek <jakub@redhat.com> + + PR c/48418 + * typeck.c (cp_build_binary_op): For LSHIFT_EXPR and RSHIFT_EXPR, + call maybe_constant_value for the negative or too big shift + count warnings. + 2013-01-09 Paolo Carlini <paolo.carlini@oracle.com> PR c++/55801 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 66fb33a..8642135 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1,7 +1,7 @@ /* Build expressions with type checking for C++ compiler. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, - 2011, 2012 + 2011, 2012, 2013 Free Software Foundation, Inc. Hacked by Michael Tiemann (tiemann@cygnus.com) @@ -4095,10 +4095,13 @@ cp_build_binary_op (location_t location, } else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { + tree const_op1 = maybe_constant_value (op1); + if (TREE_CODE (const_op1) != INTEGER_CST) + const_op1 = op1; result_type = type0; - if (TREE_CODE (op1) == INTEGER_CST) + if (TREE_CODE (const_op1) == INTEGER_CST) { - if (tree_int_cst_lt (op1, integer_zero_node)) + if (tree_int_cst_lt (const_op1, integer_zero_node)) { if ((complain & tf_warning) && c_inhibit_evaluation_warnings == 0) @@ -4106,7 +4109,7 @@ cp_build_binary_op (location_t location, } else { - if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0 + if (compare_tree_int (const_op1, TYPE_PRECISION (type0)) >= 0 && (complain & tf_warning) && c_inhibit_evaluation_warnings == 0) warning (0, "right shift count >= width of type"); @@ -4138,16 +4141,20 @@ cp_build_binary_op (location_t location, } else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) { + tree const_op1 = maybe_constant_value (op1); + if (TREE_CODE (const_op1) != INTEGER_CST) + const_op1 = op1; result_type = type0; - if (TREE_CODE (op1) == INTEGER_CST) + if (TREE_CODE (const_op1) == INTEGER_CST) { - if (tree_int_cst_lt (op1, integer_zero_node)) + if (tree_int_cst_lt (const_op1, integer_zero_node)) { if ((complain & tf_warning) && c_inhibit_evaluation_warnings == 0) warning (0, "left shift count is negative"); } - else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0) + else if (compare_tree_int (const_op1, + TYPE_PRECISION (type0)) >= 0) { if ((complain & tf_warning) && c_inhibit_evaluation_warnings == 0) |