> 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

Reply via email to