On Mon, 18 Mar 2013, Richard Biener wrote:

2013-03-17  Marc Glisse  <marc.gli...@inria.fr>

gcc/
        * fold-const.c (fold_cond_expr_with_comparison): Use build_zero_cst.
        VEC_COND_EXPR cannot be lvalues.
        (fold_ternary_loc) <VEC_COND_EXPR>: Call
fold_cond_expr_with_comparison.

gcc/cp/
        * call.c (build_conditional_expr_1): Fold VEC_COND_EXPR.

gcc/testsuite/
        * g++.dg/ext/vector21.C: New testcase.

@@ -4662,21 +4662,22 @@ fold_cond_expr_with_comparison (location
      expressions will be false, so all four give B.  The min()
      and max() versions would give a NaN instead.  */
   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (type))
       && operand_equal_for_comparison_p (arg01, arg2, arg00)
       /* Avoid these transformations if the COND_EXPR may be used
         as an lvalue in the C++ front-end.  PR c++/19199.  */
       && (in_gimple_form
          || (strcmp (lang_hooks.name, "GNU C++") != 0
              && strcmp (lang_hooks.name, "GNU Objective-C++") != 0)
          || ! maybe_lvalue_p (arg1)
-         || ! maybe_lvalue_p (arg2)))
+         || ! maybe_lvalue_p (arg2)
+         || TREE_CODE (TREE_TYPE (arg1)) == VECTOR_TYPE))

You mean that the VEC_COND_EXPRs can never be used as an lvalue in
the C++ frontend?

Yes, as I mention in the ChangeLog. Not just the C++ front-end, it never makes sense to use a VEC_COND_EXPR as an lvalue, it really is just a ternary variant of BIT_AND_EXPR.

Btw, instead of copying this whole block I'd prefer

    case COND_EXPR:
    case VEC_COND_EXPR:
        ... common cases...

        /* ???  Fixup the code below for VEC_COND_EXRP.  */
        if (code == VEC_COND_EXPR)
          break;

Makes sense, I'll rework the patch.

Thanks,

--
Marc Glisse

Reply via email to