diff options
author | Richard Guenther <rguenther@suse.de> | 2011-05-18 10:36:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-05-18 10:36:45 +0000 |
commit | 51c213f79189dd3527d1f66137c57bc4e68ec2d1 (patch) | |
tree | d9ef4a82dfd135eec5040536e17c442f8e9077e8 /gcc/tree-cfg.c | |
parent | 8f5e543422f5d052c6097e4283e21307445bf7ba (diff) | |
download | gcc-51c213f79189dd3527d1f66137c57bc4e68ec2d1.zip gcc-51c213f79189dd3527d1f66137c57bc4e68ec2d1.tar.gz gcc-51c213f79189dd3527d1f66137c57bc4e68ec2d1.tar.bz2 |
re PR middle-end/48989 (FAIL: gfortran.dg/lto/pr46036 f_lto_pr46036_0.o assemble)
2011-05-18 Richard Guenther <rguenther@suse.de>
PR middle-end/48989
* tree-cfg.c (verify_gimple_assign_unary): Adjust TRUTH op
operand verification.
(verify_gimple_assign_binary): Likewise.
* tree-ssa.c (useless_type_conversion_p): Preserve conversions
to non-1-precision BOOLEAN_TYPEs.
From-SVN: r173854
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 9e74f58..957f1f1 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3350,12 +3350,15 @@ verify_gimple_assign_unary (gimple stmt) return false; case TRUTH_NOT_EXPR: - if (!useless_type_conversion_p (boolean_type_node, rhs1_type)) + /* We require two-valued operand types. */ + if (!(TREE_CODE (rhs1_type) == BOOLEAN_TYPE + || (INTEGRAL_TYPE_P (rhs1_type) + && TYPE_PRECISION (rhs1_type) == 1))) { - error ("invalid types in truth not"); - debug_generic_expr (lhs_type); - debug_generic_expr (rhs1_type); - return true; + error ("invalid types in truth not"); + debug_generic_expr (lhs_type); + debug_generic_expr (rhs1_type); + return true; } break; @@ -3558,10 +3561,13 @@ do_pointer_plus_expr_check: case TRUTH_OR_EXPR: case TRUTH_XOR_EXPR: { - /* We allow only boolean typed or compatible argument and result. */ - if (!useless_type_conversion_p (boolean_type_node, rhs1_type) - || !useless_type_conversion_p (boolean_type_node, rhs2_type) - || !useless_type_conversion_p (boolean_type_node, lhs_type)) + /* We require two-valued operand types. */ + if (!(TREE_CODE (rhs1_type) == BOOLEAN_TYPE + || (INTEGRAL_TYPE_P (rhs1_type) + && TYPE_PRECISION (rhs1_type) == 1)) + || !(TREE_CODE (rhs2_type) == BOOLEAN_TYPE + || (INTEGRAL_TYPE_P (rhs2_type) + && TYPE_PRECISION (rhs2_type) == 1))) { error ("type mismatch in binary truth expression"); debug_generic_expr (lhs_type); @@ -3570,7 +3576,7 @@ do_pointer_plus_expr_check: return true; } - return false; + break; } case LT_EXPR: |