Commit 486e8c0c by Tom Tromey Committed by Tom Tromey

re PR java/5941 (incorrect "Unreachable statement" error)

	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.

From-SVN: r53247
parent 61e0b50f
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:
......
......@@ -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)
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment