PATCHES two small java/parse.y fixes

Per Bothner bothner@cygnus.com
Tue Feb 2 12:11:00 GMT 1999


I checked these into egcs.
	--Per Bothner
Cygnus Solutions     bothner@cygnus.com     http://www.cygnus.com/~bothner

Mon Feb  1 20:44:47 1999  Per Bothner  <bothner@cygnus.com>

	* 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.

Index: parse.y
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/java/parse.y,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -p -r1.45 -r1.46
--- parse.y	1999/01/23 20:46:59	1.45
+++ parse.y	1999/02/02 12:06:55	1.46
@@ -6632,6 +6632,7 @@ patch_method_invocation (patch, primary,
   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,
 				       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,
 	 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,
   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)
+	  && wfl_op2 != empty_stmt_node)
 	{
-	  SET_WFL_OPERATOR (wfl_operator, node, wfl_op2);
-	  parse_error_context (wfl_operator, "Unreachable statement");
+	  /* 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)


More information about the Gcc-patches mailing list