Hello,

here is a simple patch for error recovery. We already check the arguments earlier, but force_rvalue can replace them with errors.

Bootstrap+testsuite on x86_64-unknown-linux-gnu.

2014-01-01  Marc Glisse  <marc.gli...@inria.fr>

        PR c++/59641
gcc/cp/
        * call.c (build_conditional_expr_1): Check the return value of
        force_rvalue.
gcc/testsuite/
        * g++.dg/cpp0x/pr59641.C: New file.

--
Marc Glisse
Index: gcc/cp/call.c
===================================================================
--- gcc/cp/call.c       (revision 206265)
+++ gcc/cp/call.c       (working copy)
@@ -4395,20 +4395,26 @@ build_conditional_expr_1 (location_t loc
 
   orig_arg2 = arg2;
   orig_arg3 = arg3;
 
   if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (arg1)))
     {
       arg1 = force_rvalue (arg1, complain);
       arg2 = force_rvalue (arg2, complain);
       arg3 = force_rvalue (arg3, complain);
 
+      /* force_rvalue can return error_mark on valid arguments.  */
+      if (error_operand_p (arg1)
+         || error_operand_p (arg2)
+         || error_operand_p (arg3))
+       return error_mark_node;
+
       tree arg1_type = TREE_TYPE (arg1);
       arg2_type = TREE_TYPE (arg2);
       arg3_type = TREE_TYPE (arg3);
 
       if (TREE_CODE (arg2_type) != VECTOR_TYPE
          && TREE_CODE (arg3_type) != VECTOR_TYPE)
        {
          /* Rely on the error messages of the scalar version.  */
          tree scal = build_conditional_expr_1 (loc, integer_one_node,
                                                orig_arg2, orig_arg3, complain);
Index: gcc/testsuite/g++.dg/cpp0x/pr59641.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/pr59641.C        (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/pr59641.C        (working copy)
@@ -0,0 +1,8 @@
+// { dg-options "-std=gnu++11" }
+typedef int T __attribute__((vector_size(2*sizeof(int))));
+
+void foo(T& r, const T& a, const T& b)
+{
+  constexpr T c = a < b; // { dg-error "constant" }
+  r = c ? a : b;
+}

Property changes on: gcc/testsuite/g++.dg/cpp0x/pr59641.C
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Author Date Id Revision URL
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property

Reply via email to