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]
Other format: [Raw text]

[committed] allow assert in inner class


If you use assert, the compiler generates some code
that includes doing THIS_CLASS.class, which in turn
is implemented by a static helper method named class$.
If THIS_CLASS was an inner class, the compiler would
lose because static methods aren't allowed in inner classes.
The solution (which matches JDK) is to move the class$
helper method to the outer class.

Tested on Fedora and checked into mainline.
--
	--Per Bothner
per@bothner.com   http://per.bothner.com/


2004-02-25  Per Bothner  <per@bothner.com>

	* parse.y (build_assertion):  If we're in an inner class, create the
	class$ helper routine in the outer class.

Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.469
diff -u -p -r1.469 parse.y
--- parse.y	19 Feb 2004 22:39:55 -0000	1.469
+++ parse.y	26 Feb 2004 05:27:18 -0000
@@ -15301,6 +15301,10 @@ build_assertion (int location, tree cond
     {
       tree field, classdollar, id, call;
       tree class_type = TREE_TYPE (klass);
+      tree outer_class = klass;
+      while (INNER_CLASS_DECL_P (outer_class))
+	outer_class = DECL_CONTEXT (outer_class);
+      outer_class = TREE_TYPE (outer_class);
 
       field = add_field (class_type,
 			 get_identifier ("$assertionsDisabled"),
@@ -15309,9 +15313,10 @@ build_assertion (int location, tree cond
       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
       FIELD_SYNTHETIC (field) = 1;
 
-      if (!TYPE_DOT_CLASS (class_type))
-	build_dot_class_method (class_type);
-      classdollar = build_dot_class_method_invocation (class_type, class_type);
+      if (!TYPE_DOT_CLASS (outer_class))
+	build_dot_class_method (outer_class);
+      classdollar
+	= build_dot_class_method_invocation (outer_class, class_type);
 
       /* Call CLASS.desiredAssertionStatus().  */
       id = build_wfl_node (get_identifier ("desiredAssertionStatus"));

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