This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Java: Solving the Java net PR #12


This patch solves the Java net PR #12
(http://sourceware.cygnus.com/ml/java-prs/1999-q3/msg00001.html)

Exceptions thrown by methods invoked through qualified expressions are
now checked.

This patch will break building libgcj if you don't update its sources
up to http://sourceware.cygnus.com/ml/java-patches/1999-q3/msg00048.html

./A

Tue Jul 20 13:20:05 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>

        * parse.y (resolve_and_layout): Check methods only once.
        (resolve_qualified_expression_name): Verify thrown exceptions
        compatibility.
        (check_thrown_exceptions): Reject exceptions thrown in
        initializer. Error message tuned.

Index: parse.y
===================================================================
RCS file: /cvs/egcs/egcs/gcc/java/parse.y,v
retrieving revision 1.94
diff -u -p -r1.94 parse.y
--- parse.y	1999/07/07 13:11:03	1.94
+++ parse.y	1999/07/20 20:51:42
@@ -4335,7 +4335,9 @@ resolve_and_layout (something, cl)
 
   /* Resolve and layout if necessary */
   layout_class_methods (TREE_TYPE (decl));
-  if (CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))
+  /* Check methods, but only once */
+  if (CLASS_FROM_SOURCE_P (TREE_TYPE (decl)) 
+      && !CLASS_LOADED_P (TREE_TYPE (decl)))
     CHECK_METHODS (decl);
   if (TREE_TYPE (decl) != current_class && !CLASS_LOADED_P (TREE_TYPE (decl)))
     safe_layout_class (TREE_TYPE (decl));
@@ -6431,6 +6433,8 @@ resolve_qualified_expression_name (wfl, 
   for (q = EXPR_WFL_QUALIFICATION (wfl); q; q = TREE_CHAIN (q))
     {
       tree qual_wfl = QUAL_WFL (q);
+      tree ret_decl;		/* for EH checking */
+      int location;		/* for EH checking */
 
       /* 15.10.1 Field Access Using a Primary */
       switch (TREE_CODE (qual_wfl))
@@ -6449,14 +6453,21 @@ resolve_qualified_expression_name (wfl, 
 	  /* And code for the function call */
 	  if (complete_function_arguments (qual_wfl))
 	    return 1;
+	  
 	  if (from_super && TREE_CODE (qual_wfl) == CALL_EXPR)
 	    CALL_USING_SUPER (qual_wfl) = 1;
-	  *where_found = 
-	    patch_method_invocation (qual_wfl, decl, type, &is_static, NULL);
+	  location = (TREE_CODE (qual_wfl) == CALL_EXPR ?
+		      EXPR_WFL_LINECOL (TREE_OPERAND (qual_wfl, 0)) : 0);
+	  *where_found = patch_method_invocation (qual_wfl, decl, type, 
+						  &is_static, &ret_decl);
 	  if (*where_found == error_mark_node)
 	    return 1;
 	  *type_found = type = QUAL_DECL_TYPE (*where_found);
 
+	  /* EH check */
+	  if (location)
+	    check_thrown_exceptions (location, ret_decl);
+
 	  /* If the previous call was static and this one is too,
 	     build a compound expression to hold the two (because in
 	     that case, previous function calls aren't transported as
@@ -11453,11 +11464,20 @@ check_thrown_exceptions (location, decl)
 	  continue;
 #endif
 	EXPR_WFL_LINECOL (wfl_operator) = location;
-	parse_error_context 
-	  (wfl_operator, "Exception `%s' must be caught, or it must be "
-	   "declared in the `throws' clause of `%s'", 
-	   lang_printable_name (TREE_VALUE (throws), 0),
-	   IDENTIFIER_POINTER (DECL_NAME (current_function_decl)));
+	if (DECL_NAME (current_function_decl) == finit_identifier_node)
+	  parse_error_context
+            (wfl_operator, "Exception `%s' can't be thrown in initializer",
+	     lang_printable_name (TREE_VALUE (throws), 0));
+	else 
+	  {
+	    parse_error_context 
+	      (wfl_operator, "Exception `%s' must be caught, or it must be "
+	       "declared in the `throws' clause of `%s'", 
+	       lang_printable_name (TREE_VALUE (throws), 0),
+	       (DECL_NAME (current_function_decl) == init_identifier_node ?
+		IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))) :
+		IDENTIFIER_POINTER (DECL_NAME (current_function_decl))));
+	  }
       }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]