aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/class.c
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2004-07-10 05:38:15 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2004-07-10 06:38:15 +0100
commitd3ecb597b35d5b8c4176a0b60c10cbfdb40ace8b (patch)
treebcd4a6d234666cbea3ddc05897321cf2a6b159ef /gcc/java/class.c
parenta7e5372d6a8e2f12b6d9a15f71d5ad0794e6507f (diff)
downloadgcc-d3ecb597b35d5b8c4176a0b60c10cbfdb40ace8b.zip
gcc-d3ecb597b35d5b8c4176a0b60c10cbfdb40ace8b.tar.gz
gcc-d3ecb597b35d5b8c4176a0b60c10cbfdb40ace8b.tar.bz2
re PR java/8618 (call to private constructor allowed for anonymous inner class)
2004-07-09 Bryce McKinlay <mckinlay@redhat.com> PR java/8618 * parse.y (create_anonymous_class): Remove 'location' argument. Use the WFL from TYPE_NAME to get line number for the decl. Fix comment. (craft_constructor): Inherit access flags for implicit constructor from the enclosing class. (create_class): Fix comment typo. (resolve_qualified_expression_name): Pass type of qualifier to not_accessible_p, not the type in which target field was found. (not_accessible_p): Handle inner classes. Expand protected qualifier-subtype check to enclosing instances, but don't apply this check to static members. Allow protected access to inner classes of a subtype. Allow private access within common enclosing context. (build_super_invocation): Get WFL line number info from current class decl. (build_incomplete_class_ref): Update for new create_anonymous_class signature. * parse.h (INNER_ENCLOSING_SCOPE_CHECK): Use common_enclosing_instance_p. * class.c (common_enclosing_context_p): New. Determine if types share a common enclosing context, even across static contexts. (common_enclosing_instance_p): Renamed from common_enclosing_context_p. Determines if types share a common non-static enclosing instance. * java-tree.h (common_enclosing_instance_p): Declare. * jcf-write.c (get_method_access_flags): New. Surpress private flag for inner class constructors. (generate_classfile): Use get_method_access_flags. From-SVN: r84443
Diffstat (limited to 'gcc/java/class.c')
-rw-r--r--gcc/java/class.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/java/class.c b/gcc/java/class.c
index 90f2789..1273b62 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -587,12 +587,34 @@ enclosing_context_p (tree type1, tree type2)
return 0;
}
-/* Return 1 iff there exists a common enclosing context between TYPE1
- and TYPE2. */
+
+/* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
+ nesting level. */
int
common_enclosing_context_p (tree type1, tree type2)
{
+ for (type1; type1;
+ type1 = (INNER_CLASS_TYPE_P (type1) ?
+ TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
+ {
+ tree current;
+ for (current = type2; current;
+ current = (INNER_CLASS_TYPE_P (current) ?
+ TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
+ NULL_TREE))
+ if (type1 == current)
+ return 1;
+ }
+ return 0;
+}
+
+/* Return 1 iff there exists a common enclosing "this" between TYPE1
+ and TYPE2, without crossing any static context. */
+
+int
+common_enclosing_instance_p (tree type1, tree type2)
+{
if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
return 0;