[Bug c++/66211] [5/6 Regression] Rvalue conversion in ternary operator causes internal compiler error

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed May 20 08:19:00 GMT 2015


--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we fold (and did fold before) 1 > 0 ? x : y to (float) x (thus an rvalue).
Then later we call ocp_convert on that requesting a conversion to int which

810           converted = fold_if_not_in_template (convert_to_integer (type,

where convert_to_integer ends up just doing

910             return build1 (FIX_TRUNC_EXPR, type, expr);

and fold then applying the simplification

   /* If we are converting an integer to a floating-point that can
      represent it exactly and back to an integer, we can skip the
      floating-point conversion.  */
   (if (inside_int && inter_float && final_int &&
        (unsigned) significand_size (TYPE_MODE (inter_type))
        >= inside_prec - !inside_unsignedp)
    (convert @0))))))


(for cvt (convert view_convert float fix_trunc)
  (cvt @0)
  (if ((GIMPLE && useless_type_conversion_p (type, TREE_TYPE (@0)))
       || (GENERIC && type == TREE_TYPE (@0)))

where wrapping the result as (non_lvalue @0) fixes the regression.  The bug
is of course the C++ frontend folding stuff too early (and too aggressive)

But for GCC 5 the above might be a good-enough workaround (eventually
we can conditionalize building non_lvalue exprs to non-C-frontends).

More information about the Gcc-bugs mailing list