diff options
author | Alexandre Petit-Bianco <apbianco@cygnus.com> | 1998-12-02 16:47:33 +0000 |
---|---|---|
committer | Alexandre Petit-Bianco <apbianco@gcc.gnu.org> | 1998-12-02 08:47:33 -0800 |
commit | c3f2a47690422e93b39ec550779d6d65a875e5b1 (patch) | |
tree | 3e321e2c7e839540f047092abbe1068975523ae7 /gcc/java/parse.y | |
parent | 226592de983de618cb54a5985a92bdf8e3e77540 (diff) | |
download | gcc-c3f2a47690422e93b39ec550779d6d65a875e5b1.zip gcc-c3f2a47690422e93b39ec550779d6d65a875e5b1.tar.gz gcc-c3f2a47690422e93b39ec550779d6d65a875e5b1.tar.bz2 |
class.c (layout_class_method): Call build_java_argument_signature on constructors too.
Wed Dec 2 15:52:25 1998 Alexandre Petit-Bianco <apbianco@cygnus.com>
* class.c (layout_class_method): Call build_java_argument_signature
on constructors too.
* parse.y (check_method_redefinition): Use TYPE_ARGUMENT_SIGNATURE.
(patch_method_invocation): Define a primary when resolving an
expression name. Augmented comment on code checking illegal `this'
usage. Loosened it test by accepting NEW_CLASS_EXPR.
From-SVN: r24065
Diffstat (limited to 'gcc/java/parse.y')
-rw-r--r-- | gcc/java/parse.y | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/gcc/java/parse.y b/gcc/java/parse.y index aa9d076..807ed9c 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -4364,7 +4364,7 @@ check_method_redefinition (class, method) { tree redef, name; tree cl = DECL_NAME (method); - tree sig = TYPE_LANG_SPECIFIC (TREE_TYPE (method))->signature; + tree sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method)); /* decl name of artificial <clinit> and <finit> doesn't need to be fixed and checked */ @@ -4378,11 +4378,10 @@ check_method_redefinition (class, method) for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef)) { - struct lang_type *t = TYPE_LANG_SPECIFIC (TREE_TYPE (redef)); - - if (! t || (redef == method)) + if (redef == method) break; - if (DECL_NAME (redef) == name && sig == t->signature) + if (DECL_NAME (redef) == name + && sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef))) { parse_error_context (cl, "Duplicate %s declaration `%s'", @@ -6629,6 +6628,10 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) field = resolve_field_access (wfl, NULL, &type); if (field == error_mark_node) PATCH_METHOD_RETURN_ERROR (); + /* field is used in lieu of a primary. It alows us not to + report errors on erroneous use of `this' in + constructors. */ + primary = field; /* 2- Do the layout of the class where the last field was found, so we can search it. */ @@ -6762,10 +6765,14 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) is_static_flag = METHOD_STATIC (list); - /* In the context of an explicit constructor invocation, we can't invoke - any method relying on `this' */ + /* In the context of an explicit constructor invocation, we can't + invoke any method relying on `this'. Exceptions are: we're + invoking a static function, primary exists and is not the current + this, we're creating a new object. */ if (ctxp->explicit_constructor_p - && !is_static_flag && (!primary || primary == current_this)) + && !is_static_flag + && (!primary || primary == current_this) + && (TREE_CODE (patch) != NEW_CLASS_EXPR)) { parse_error_context (wfl, "Can't reference `this' before the superclass constructor has " |