aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Petit-Bianco <apbianco@cygnus.com>1998-12-02 16:47:33 +0000
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>1998-12-02 08:47:33 -0800
commitc3f2a47690422e93b39ec550779d6d65a875e5b1 (patch)
tree3e321e2c7e839540f047092abbe1068975523ae7 /gcc
parent226592de983de618cb54a5985a92bdf8e3e77540 (diff)
downloadgcc-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')
-rw-r--r--gcc/java/ChangeLog9
-rw-r--r--gcc/java/class.c1
-rw-r--r--gcc/java/parse.c23
-rw-r--r--gcc/java/parse.y23
4 files changed, 40 insertions, 16 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index e3b33a2..c597e10 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,12 @@
+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.
+
Tue Dec 1 13:53:24 1998 Alexandre Petit-Bianco <apbianco@cygnus.com>
* class.c (layout_class_method): Don't report error on non-static
diff --git a/gcc/java/class.c b/gcc/java/class.c
index dedff9e..8deff6e 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -1578,6 +1578,7 @@ layout_class_method (this_class, super_class, method_decl, dtable_count)
else
DECL_NAME (method_decl) = get_identifier (p);
DECL_CONSTRUCTOR_P (method_decl) = 1;
+ build_java_argument_signature (TREE_TYPE (method_decl));
}
else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl))
{
diff --git a/gcc/java/parse.c b/gcc/java/parse.c
index 3683f98..6d1feb0 100644
--- a/gcc/java/parse.c
+++ b/gcc/java/parse.c
@@ -6969,7 +6969,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 */
@@ -6983,11 +6983,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'",
@@ -9234,6 +9233,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. */
@@ -9367,10 +9370,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 "
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 "