OSDN Git Service

Fix for PR java/5941:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 May 2002 03:32:01 +0000 (03:32 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 May 2002 03:32:01 +0000 (03:32 +0000)
* parse.y (finish_for_loop): Set SUPPRESS_UNREACHABLE_ERROR for
loop update expression.
(java_complete_lhs): Use SUPPRESS_UNREACHABLE_ERROR.
* java-tree.h (SUPPRESS_UNREACHABLE_ERROR): New macro.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53247 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/java-tree.h
gcc/java/parse.y

index a4b7a38..6f74998 100644 (file)
@@ -1,3 +1,11 @@
+2002-05-06  Tom Tromey  <tromey@redhat.com>
+
+       Fix for PR java/5941:
+       * parse.y (finish_for_loop): Set SUPPRESS_UNREACHABLE_ERROR for
+       loop update expression.
+       (java_complete_lhs): Use SUPPRESS_UNREACHABLE_ERROR.
+       * java-tree.h (SUPPRESS_UNREACHABLE_ERROR): New macro.
+
 2002-05-04  Mark Wielaard  <mark@klomp.org>
 
        For PR java/6519:
index f591b5f..e0dbe48 100644 (file)
@@ -43,6 +43,7 @@ struct JCF;
    0: IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P (in IDENTIFIER_NODE)
       RESOLVE_EXPRESSION_NAME_P (in EXPR_WITH_FILE_LOCATION)
       FOR_LOOP_P (in LOOP_EXPR)
+      SUPPRESS_UNREACHABLE_ERROR (for other _EXPR nodes)
       ANONYMOUS_CLASS_P (in RECORD_TYPE)
       ARG_FINAL_P (in TREE_LIST)
    1: CLASS_HAS_SUPER_FLAG (in TREE_VEC).
@@ -1503,6 +1504,12 @@ extern tree *type_map;
    declared with the final modifier */
 #define ARG_FINAL_P(NODE) TREE_LANG_FLAG_0 (NODE)
 
+/* True if NODE (some kind of EXPR, but not a WFL) should not give an
+   error if it is found to be unreachable.  This can only be applied
+   to those EXPRs which can be used as the update expression of a
+   `for' loop.  In particular it can't be set on a LOOP_EXPR.  */
+#define SUPPRESS_UNREACHABLE_ERROR(NODE) TREE_LANG_FLAG_0 (NODE)
+
 /* True if EXPR (a WFL in that case) resolves into a package name */
 #define RESOLVE_PACKAGE_NAME_P(WFL) TREE_LANG_FLAG_3 (WFL)
 
index c45ff1e..526850d 100644 (file)
@@ -11842,7 +11842,17 @@ java_complete_lhs (node)
              if (TREE_CODE (nn) != EXIT_EXPR)
                {
                  SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
-                 parse_error_context (wfl_operator, "Unreachable statement");
+                 if (SUPPRESS_UNREACHABLE_ERROR (nn))
+                   {
+                     /* Perhaps this warning should have an
+                        associated flag.  The code being compiled is
+                        pedantically correct, but useless.  */
+                     parse_warning_context (wfl_operator,
+                                            "Unreachable statement");
+                   }
+                 else
+                   parse_error_context (wfl_operator,
+                                        "Unreachable statement");
                }
            }
          TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1));
@@ -14981,7 +14991,22 @@ finish_for_loop (location, condition, update, body)
   /* Put the condition and the loop body in place */
   tree loop = finish_loop_body (location, condition, body, 0);
   /* LOOP is the current loop which has been now popped of the loop
-     stack. Install the update block */
+     stack.  Mark the update block as reachable and install it.  We do
+     this because the (current interpretation of the) JLS requires
+     that the update expression be considered reachable even if the
+     for loop's body doesn't complete normally.  */
+  if (update != NULL_TREE && update != empty_stmt_node)
+    {
+      tree up2 = update;
+      if (TREE_CODE (up2) == EXPR_WITH_FILE_LOCATION)
+       up2 = EXPR_WFL_NODE (up2);
+      /* Try to detect constraint violations.  These would be
+        programming errors somewhere.  */
+      if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
+         | TREE_CODE (up2) == LOOP_EXPR)
+       abort ();
+      SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
+    }
   LOOP_EXPR_BODY_UPDATE_BLOCK (LOOP_EXPR_BODY (loop)) = update;
   return loop;
 }