This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch gimplifier]: Make sure TRUTH_NOT_EXPR has boolean_type_node type and argument
- From: Kai Tietz <ktietz70 at googlemail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Guenther <richard dot guenther at gmail dot com>
- Date: Fri, 13 May 2011 13:31:41 +0200
- Subject: [patch gimplifier]: Make sure TRUTH_NOT_EXPR has boolean_type_node type and argument
Hello,
this patch adds a check to
ChangeLog
2011-05-13 Kai Tietz
* gimplify.c (gimplify_expr): Make sure operand is boolified.
* tree-cfg.c (verify_gimple_assign_unary): Check for boolean
compatible type
for TRUTH_NOT_EXPR.
Bootstrapped for x86_64-pc-linux-gnu (multilib). Ok for apply?
Index: tree-cfg.c
===================================================================
--- tree-cfg.c (revision 173725)
+++ tree-cfg.c (working copy)
@@ -3342,6 +3342,14 @@
return false;
case TRUTH_NOT_EXPR:
+ if (!useless_type_conversion_p (boolean_type_node, rhs1_type)
+ || !useless_type_conversion_p (boolean_type_node, lhs_type))
+ {
+ error ("invalid types in truth not");
+ debug_generic_expr (lhs_type);
+ debug_generic_expr (rhs1_type);
+ return true;
+ }
case NEGATE_EXPR:
case ABS_EXPR:
case BIT_NOT_EXPR:
Index: gimplify.c
===================================================================
--- gimplify.c (revision 173726)
+++ gimplify.c (working copy)
@@ -6754,14 +6754,18 @@
}
case TRUTH_NOT_EXPR:
- if (TREE_TYPE (*expr_p) != boolean_type_node)
- {
- tree type = TREE_TYPE (*expr_p);
- *expr_p = fold_convert (type, gimple_boolify (*expr_p));
- ret = GS_OK;
- break;
- }
+ {
+ tree org_type = TREE_TYPE (*expr_p);
+ *expr_p = gimple_boolify (*expr_p);
+ if (org_type != boolean_type_node)
+ {
+ *expr_p = fold_convert (org_type, *expr_p);
+ ret = GS_OK;
+ break;
+ }
+ }
+
ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
is_gimple_val, fb_rvalue);
recalculate_side_effects (*expr_p);