From bb554051056e54cf82993d6680c3f3c2aabaf85b Mon Sep 17 00:00:00 2001 From: jsm28 Date: Fri, 14 Sep 2012 16:59:10 +0000 Subject: [PATCH] c: PR c/54103 * c-typeck.c (build_unary_op): Pass original argument of TRUTH_NOT_EXPR to c_objc_common_truthvalue_conversion, then remove any C_MAYBE_CONST_EXPR, if it has integer operands. (build_binary_op): Pass original arguments of TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR and TRUTH_XOR_EXPR to c_objc_common_truthvalue_conversion, then remove any C_MAYBE_CONST_EXPR, if they have integer operands. Use c_objc_common_truthvalue_conversion not c_common_truthvalue_conversion. (c_objc_common_truthvalue_conversion): Build NE_EXPR directly and call note_integer_operands for arguments with integer operands that are not integer constants. testsuite: * gcc.c-torture/compile/pr54103-1.c, gcc.c-torture/compile/pr54103-2.c, gcc.c-torture/compile/pr54103-3.c, gcc.c-torture/compile/pr54103-4.c, gcc.c-torture/compile/pr54103-5.c, gcc.c-torture/compile/pr54103-6.c: New tests. * gcc.dg/c90-const-expr-8.c: Update expected column number. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191304 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c/ChangeLog | 16 ++++++++++ gcc/c/c-typeck.c | 41 +++++++++++++++++++------ gcc/testsuite/ChangeLog | 11 +++++++ gcc/testsuite/gcc.c-torture/compile/pr54103-1.c | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr54103-2.c | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr54103-3.c | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr54103-4.c | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr54103-5.c | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr54103-6.c | 5 +++ gcc/testsuite/gcc.dg/c90-const-expr-8.c | 2 +- 10 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-1.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-2.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-3.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-4.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-5.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr54103-6.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index f075776..bd6ef8f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,19 @@ +2012-09-14 Joseph Myers + + PR c/54103 + * c-typeck.c (build_unary_op): Pass original argument of + TRUTH_NOT_EXPR to c_objc_common_truthvalue_conversion, then remove + any C_MAYBE_CONST_EXPR, if it has integer operands. + (build_binary_op): Pass original arguments of TRUTH_ANDIF_EXPR, + TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR and TRUTH_XOR_EXPR + to c_objc_common_truthvalue_conversion, then remove any + C_MAYBE_CONST_EXPR, if they have integer operands. Use + c_objc_common_truthvalue_conversion not + c_common_truthvalue_conversion. + (c_objc_common_truthvalue_conversion): Build NE_EXPR directly and + call note_integer_operands for arguments with integer operands + that are not integer constants. + 2012-09-13 Jakub Jelinek PR c/54559 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 2d74da8..628857c 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -3553,7 +3553,13 @@ build_unary_op (location_t location, "wrong type argument to unary exclamation mark"); return error_mark_node; } - arg = c_objc_common_truthvalue_conversion (location, arg); + if (int_operands) + { + arg = c_objc_common_truthvalue_conversion (location, xarg); + arg = remove_c_maybe_const_expr (arg); + } + else + arg = c_objc_common_truthvalue_conversion (location, arg); ret = invert_truthvalue_loc (location, arg); /* If the TRUTH_NOT_EXPR has been folded, reset the location. */ if (EXPR_P (ret) && EXPR_HAS_LOCATION (ret)) @@ -9807,8 +9813,20 @@ build_binary_op (location_t location, enum tree_code code, but that does not mean the operands should be converted to ints! */ result_type = integer_type_node; - op0 = c_common_truthvalue_conversion (location, op0); - op1 = c_common_truthvalue_conversion (location, op1); + if (op0_int_operands) + { + op0 = c_objc_common_truthvalue_conversion (location, orig_op0); + op0 = remove_c_maybe_const_expr (op0); + } + else + op0 = c_objc_common_truthvalue_conversion (location, op0); + if (op1_int_operands) + { + op1 = c_objc_common_truthvalue_conversion (location, orig_op1); + op1 = remove_c_maybe_const_expr (op1); + } + else + op1 = c_objc_common_truthvalue_conversion (location, op1); converted = 1; boolean_op = true; } @@ -10520,12 +10538,17 @@ c_objc_common_truthvalue_conversion (location_t location, tree expr) int_const = (TREE_CODE (expr) == INTEGER_CST && !TREE_OVERFLOW (expr)); int_operands = EXPR_INT_CONST_OPERANDS (expr); - if (int_operands) - expr = remove_c_maybe_const_expr (expr); - - /* ??? Should we also give an error for vectors rather than leaving - those to give errors later? */ - expr = c_common_truthvalue_conversion (location, expr); + if (int_operands && TREE_CODE (expr) != INTEGER_CST) + { + expr = remove_c_maybe_const_expr (expr); + expr = build2 (NE_EXPR, integer_type_node, expr, + convert (TREE_TYPE (expr), integer_zero_node)); + expr = note_integer_operands (expr); + } + else + /* ??? Should we also give an error for vectors rather than leaving + those to give errors later? */ + expr = c_common_truthvalue_conversion (location, expr); if (TREE_CODE (expr) == INTEGER_CST && int_operands && !int_const) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1d61616..ac72d32 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2012-09-14 Joseph Myers + + PR c/54103 + * gcc.c-torture/compile/pr54103-1.c, + gcc.c-torture/compile/pr54103-2.c, + gcc.c-torture/compile/pr54103-3.c, + gcc.c-torture/compile/pr54103-4.c, + gcc.c-torture/compile/pr54103-5.c, + gcc.c-torture/compile/pr54103-6.c: New tests. + * gcc.dg/c90-const-expr-8.c: Update expected column number. + 2012-09-14 Eric Botcazou * gcc.dg/pr44194-1.c: Check that there are no memory accesses left. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c new file mode 100644 index 0000000..d941f3e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c @@ -0,0 +1,5 @@ +void +f (void) +{ + 0 || 0 / 0 ? : 0; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c new file mode 100644 index 0000000..4bd6249 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c @@ -0,0 +1,5 @@ +void +f (void) +{ + 0 / 0 || 0 ? : 0; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c new file mode 100644 index 0000000..9be0b94 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c @@ -0,0 +1,5 @@ +void +f (void) +{ + 1 && 0 / 0 ? : 0; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c new file mode 100644 index 0000000..89ce24c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c @@ -0,0 +1,5 @@ +void +f (void) +{ + 0 / 0 && 1 ? : 0; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c new file mode 100644 index 0000000..9594b28 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c @@ -0,0 +1,5 @@ +void +f (void) +{ + !(0 / 0); +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c new file mode 100644 index 0000000..2b0b0ba --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c @@ -0,0 +1,5 @@ +void +f (void) +{ + 0 || 65536*65536 ? : 0; +} diff --git a/gcc/testsuite/gcc.dg/c90-const-expr-8.c b/gcc/testsuite/gcc.dg/c90-const-expr-8.c index b00bb97..4923bc6 100644 --- a/gcc/testsuite/gcc.dg/c90-const-expr-8.c +++ b/gcc/testsuite/gcc.dg/c90-const-expr-8.c @@ -22,6 +22,6 @@ enum e { E5 = 0 * -INT_MIN, /* { dg-warning "12:integer overflow in expression" } */ /* { dg-error "3:overflow in constant expression" "constant" { target *-*-* } 22 } */ E6 = 0 * !-INT_MIN, /* { dg-warning "13:integer overflow in expression" } */ - /* { dg-error "3:not an integer constant" "constant" { target *-*-* } 24 } */ + /* { dg-error "8:not an integer constant" "constant" { target *-*-* } 24 } */ E7 = INT_MIN % -1 /* Not an overflow. */ }; -- 2.7.4