From: Per Bothner Date: Tue, 2 Feb 1999 12:06:59 +0000 (-0800) Subject: parse.y (patch_method_invocation): Handle calling static methods... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bccaf73a0589a218b90f430c3471cd12ebcdf97e;p=gcc.git parse.y (patch_method_invocation): Handle calling static methods... d * parse.y (patch_method_invocation): Handle calling static methods, even in the form EXPR.METHOD(ARGS), not just TYPE.METHOD(ARGS). * parse.y (java_complete_lhs): Don't complain about unreachable exit condition in a do-while statement. From-SVN: r24968 --- diff --git a/gcc/java/parse.c b/gcc/java/parse.c index 1579499d7f4..5f9ad6ef56e 100644 --- a/gcc/java/parse.c +++ b/gcc/java/parse.c @@ -9270,6 +9270,7 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) tree list; int is_static_flag = 0; int is_super_init = 0; + tree this_arg = NULL_TREE; /* Should be overriden if everything goes well. Otherwise, if something fails, it should keep this value. It stop the @@ -9367,7 +9368,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) identifier, args); /* 4- Add the field as an argument */ - args = tree_cons (NULL_TREE, field, nreverse (args)); + args = nreverse (args); + this_arg = field; } /* IDENTIFIER_WFL will be used to report any problem further */ @@ -9462,8 +9464,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) returned by the object allocator. If method is resolved as a primary, use the primary otherwise use the current THIS. */ args = nreverse (args); - if (!METHOD_STATIC (list) && TREE_CODE (patch) != NEW_CLASS_EXPR) - args = tree_cons (NULL_TREE, primary ? primary : current_this, args); + if (TREE_CODE (patch) != NEW_CLASS_EXPR) + this_arg = primary ? primary : current_this; } /* Merge point of all resolution schemes. If we have nothing, this @@ -9488,6 +9490,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) check_deprecation (wfl, list); is_static_flag = METHOD_STATIC (list); + if (! METHOD_STATIC (list) && this_arg != NULL_TREE) + args = tree_cons (NULL_TREE, this_arg, args); /* In the context of an explicit constructor invocation, we can't invoke any method relying on `this'. Exceptions are: we're @@ -10365,10 +10369,18 @@ java_complete_lhs (node) TREE_OPERAND (node, 0) = nn = java_complete_tree (TREE_OPERAND (node, 0)); if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK - && TREE_OPERAND (node, 1) != empty_stmt_node) - { - SET_WFL_OPERATOR (wfl_operator, node, wfl_op2); - parse_error_context (wfl_operator, "Unreachable statement"); + && wfl_op2 != empty_stmt_node) + { + /* An unreachable condition in a do-while statement + is *not* (technically) an unreachable statement. */ + nn = wfl_op2; + if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION) + nn = EXPR_WFL_NODE (nn); + if (TREE_CODE (nn) != EXIT_EXPR) + { + SET_WFL_OPERATOR (wfl_operator, node, wfl_op2); + parse_error_context (wfl_operator, "Unreachable statement"); + } } TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node) diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 73c56b1de74..ac8f03e245e 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -6632,6 +6632,7 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) tree list; int is_static_flag = 0; int is_super_init = 0; + tree this_arg = NULL_TREE; /* Should be overriden if everything goes well. Otherwise, if something fails, it should keep this value. It stop the @@ -6729,7 +6730,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) identifier, args); /* 4- Add the field as an argument */ - args = tree_cons (NULL_TREE, field, nreverse (args)); + args = nreverse (args); + this_arg = field; } /* IDENTIFIER_WFL will be used to report any problem further */ @@ -6824,8 +6826,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) returned by the object allocator. If method is resolved as a primary, use the primary otherwise use the current THIS. */ args = nreverse (args); - if (!METHOD_STATIC (list) && TREE_CODE (patch) != NEW_CLASS_EXPR) - args = tree_cons (NULL_TREE, primary ? primary : current_this, args); + if (TREE_CODE (patch) != NEW_CLASS_EXPR) + this_arg = primary ? primary : current_this; } /* Merge point of all resolution schemes. If we have nothing, this @@ -6850,6 +6852,8 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl) check_deprecation (wfl, list); is_static_flag = METHOD_STATIC (list); + if (! METHOD_STATIC (list) && this_arg != NULL_TREE) + args = tree_cons (NULL_TREE, this_arg, args); /* In the context of an explicit constructor invocation, we can't invoke any method relying on `this'. Exceptions are: we're @@ -7727,10 +7731,18 @@ java_complete_lhs (node) TREE_OPERAND (node, 0) = nn = java_complete_tree (TREE_OPERAND (node, 0)); if (! CAN_COMPLETE_NORMALLY (nn) && TREE_CODE (nn) != ERROR_MARK - && TREE_OPERAND (node, 1) != empty_stmt_node) - { - SET_WFL_OPERATOR (wfl_operator, node, wfl_op2); - parse_error_context (wfl_operator, "Unreachable statement"); + && wfl_op2 != empty_stmt_node) + { + /* An unreachable condition in a do-while statement + is *not* (technically) an unreachable statement. */ + nn = wfl_op2; + if (TREE_CODE (nn) == EXPR_WITH_FILE_LOCATION) + nn = EXPR_WFL_NODE (nn); + if (TREE_CODE (nn) != EXIT_EXPR) + { + SET_WFL_OPERATOR (wfl_operator, node, wfl_op2); + parse_error_context (wfl_operator, "Unreachable statement"); + } } TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node)