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.
------------------------------------------------------------------------
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"));