> Those issues should be fixed by the attached patch, which relaxes
> strictness of logical operations in tree-cfg.c file.
Thanks.
> 2011-05-14 Kai Tietz
>
> * tree-cfg.c (verify_gimple_assign_unary): Don't enforce
> boolean_type_node
> compatible lhs/rhs types for logical expression.
> (verify_gimple_assign_binary): Likewise.
- /* 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))
+ /* The gimplify code ensures that just boolean_type_node types
+ are present, but ADA and FORTRAN using artificial gimple generation
+ code which is producing non-gimplify compatible trees. So we need
+ to allow here any kind of integral typed argument and result. */
+ if (!INTEGRAL_TYPE_P (rhs1_type)
+ || !INTEGRAL_TYPE_P (rhs2_type)
+ || !INTEGRAL_TYPE_P (lhs_type))
What does "artificial gimple generation code" mean exactly? The only thing
different in Ada is the definition of boolean_type_node which isn't compatible
with the C definition (its precision is 8 instead of 1). That's all.
For Ada, you can just do:
Index: tree-cfg.c
===================================================================
--- tree-cfg.c (revision 173756)
+++ tree-cfg.c (working copy)
@@ -3350,7 +3350,7 @@ verify_gimple_assign_unary (gimple stmt)
return false;
case TRUTH_NOT_EXPR:
- if (!useless_type_conversion_p (boolean_type_node, rhs1_type))
+ if (TREE_CODE (rhs1_type) != BOOLEAN_TYPE)
{
error ("invalid types in truth not");
debug_generic_expr (lhs_type);
@@ -3558,10 +3558,10 @@ 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 allow only boolean-typed argument and result. */
+ if (TREE_CODE (rhs1_type) != BOOLEAN_TYPE
+ || TREE_CODE (rhs2_type) != BOOLEAN_TYPE
+ || TREE_CODE (lhs_type) != BOOLEAN_TYPE)
{
error ("type mismatch in binary truth expression");
debug_generic_expr (lhs_type);
--
Eric Botcazou