http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49165

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-05-25 
19:47:52 UTC ---
--- gimplify.c (revision 174199)
+++ gimplify.c (working copy)
@@ -2848,7 +2848,7 @@
     default:
       /* Other expressions that get here must have boolean values, but
          might need to be converted to the appropriate mode.  */
-      if (type == boolean_type_node)
+      if (type == boolean_type_node || type == void_type_node)
         return expr;
       return fold_convert_loc (loc, boolean_type_node, expr);
     }
fixes the ICE, but we error out then still during gimplification:
error: using result of function returning ‘void’
I think the only problematic case is when one COND_EXPR arm is THROW_EXPR (i.e.
void_type_node) and the other one has gimple reg type.  Either the FE
(genericization or during gimplification) should replace THROW_EXPR with
COMPOUND_EXPR <THROW_EXPR, <fold_convert <type, integer_zero_node>>>, or
gimplifier needs to special case it in some places.  Is the only possibility to
create COND_EXPR in C++ with void_type_node on one arm and some other type on
the other arm and COND_EXPR itself a throw?

Reply via email to