re PR c/27721 (ICE using += with a function)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Sat, 5 Aug 2006 23:26:38 +0000 (23:26 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Sat, 5 Aug 2006 23:26:38 +0000 (23:26 +0000)
PR c/27721
* c-typeck.c (build_modify_expr): Test earlier for non-lvalues.

* gcc.dg/lvalue-4.c: New test.

From-SVN: r115955

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lvalue-4.c [new file with mode: 0644]

index 72e1d462d56a46189ad1f900806b33b20e3a716e..0cbdf6d928e57f991806244000985d345ee636b0 100644 (file)
@@ -1,5 +1,8 @@
 2006-08-05  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+       PR c/27721
+       * c-typeck.c (build_modify_expr): Test earlier for non-lvalues.
+
        PR c/28136
        * c-parser.c (c_parser_postfix_expression_after_paren_type): Robustify.
 
index 31dadc6ebeb8ce377d294a2662f0f1fbb09d3050..ff27c973094005f09d0f5eed1ec4896114257e42 100644 (file)
@@ -3668,6 +3668,9 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
   if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
     return error_mark_node;
 
+  if (!lvalue_or_else (lhs, lv_assign))
+    return error_mark_node;
+
   STRIP_TYPE_NOPS (rhs);
 
   newrhs = rhs;
@@ -3681,9 +3684,6 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
       newrhs = build_binary_op (modifycode, lhs, rhs, 1);
     }
 
-  if (!lvalue_or_else (lhs, lv_assign))
-    return error_mark_node;
-
   /* Give an error for storing in something that is 'const'.  */
 
   if (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
index 99bbfc50309f9d6fde6e022e634c0df2db213d9f..89f1d4a6e31d8cd8dc04babf233470eb17bf5cbd 100644 (file)
@@ -1,5 +1,8 @@
 2006-08-05  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+       PR c/27721
+       * gcc.dg/lvalue-4.c: New test.
+
        PR c/28136
        * gcc.dg/init-bad-5.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/lvalue-4.c b/gcc/testsuite/gcc.dg/lvalue-4.c
new file mode 100644 (file)
index 0000000..bc92901
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR c/27721 */
+/* { dg-do compile } */
+
+void foo()
+{
+  int i();
+  i += 0;  /* { dg-error "lvalue required" } */
+}