(default_conversion): Pass through non-lvalue arrays without any conversion and/or...
authorRichard Stallman <rms@gnu.org>
Fri, 30 Apr 1993 00:54:54 +0000 (00:54 +0000)
committerRichard Stallman <rms@gnu.org>
Fri, 30 Apr 1993 00:54:54 +0000 (00:54 +0000)
(default_conversion):  Pass through non-lvalue arrays
without any conversion and/or error messages.  Such operands are
perfectly OK in many contexts.

(build_conditional_expr): Do default_conversion
before testing for ERROR_MARK.

From-SVN: r4281

gcc/c-typeck.c

index 624c6217700c461231f7a81640a841e8fb15a688..1ee45792c47672f9c97a58940e835bc5965c71ca 100644 (file)
@@ -986,8 +986,8 @@ default_conversion (exp)
       if (!lvalue_p (exp)
          && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
        {
-         error ("invalid use of non-lvalue array");
-         return error_mark_node;
+         /* Non-lvalue arrays do not decay into pointers.  */
+         return exp;
        }
 
       if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
@@ -3560,11 +3560,6 @@ build_conditional_expr (ifexp, op1, op2)
 
   ifexp = truthvalue_conversion (default_conversion (ifexp));
 
-  if (TREE_CODE (ifexp) == ERROR_MARK
-      || TREE_CODE (TREE_TYPE (op1)) == ERROR_MARK
-      || TREE_CODE (TREE_TYPE (op2)) == ERROR_MARK)
-    return error_mark_node;
-
 #if 0 /* Produces wrong result if within sizeof.  */
   /* Don't promote the operands separately if they promote
      the same way.  Return the unpromoted type and let the combined
@@ -3582,13 +3577,18 @@ build_conditional_expr (ifexp, op1, op2)
     }
 #endif
 
-  /* They don't match; promote them both and then try to reconcile them.  */
+  /* Promote both alternatives.  */
 
   if (TREE_CODE (TREE_TYPE (op1)) != VOID_TYPE)
     op1 = default_conversion (op1);
   if (TREE_CODE (TREE_TYPE (op2)) != VOID_TYPE)
     op2 = default_conversion (op2);
 
+  if (TREE_CODE (ifexp) == ERROR_MARK
+      || TREE_CODE (TREE_TYPE (op1)) == ERROR_MARK
+      || TREE_CODE (TREE_TYPE (op2)) == ERROR_MARK)
+    return error_mark_node;
+
   type1 = TREE_TYPE (op1);
   code1 = TREE_CODE (type1);
   type2 = TREE_TYPE (op2);