Commit c3f2a476 by Alexandre Petit-Bianco Committed by Alexandre Petit-Bianco

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
parent 226592de
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> 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 * class.c (layout_class_method): Don't report error on non-static
......
...@@ -1578,6 +1578,7 @@ layout_class_method (this_class, super_class, method_decl, dtable_count) ...@@ -1578,6 +1578,7 @@ layout_class_method (this_class, super_class, method_decl, dtable_count)
else else
DECL_NAME (method_decl) = get_identifier (p); DECL_NAME (method_decl) = get_identifier (p);
DECL_CONSTRUCTOR_P (method_decl) = 1; DECL_CONSTRUCTOR_P (method_decl) = 1;
build_java_argument_signature (TREE_TYPE (method_decl));
} }
else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl)) else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl))
{ {
......
...@@ -6969,7 +6969,7 @@ check_method_redefinition (class, method) ...@@ -6969,7 +6969,7 @@ check_method_redefinition (class, method)
{ {
tree redef, name; tree redef, name;
tree cl = DECL_NAME (method); 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 /* decl name of artificial <clinit> and <finit> doesn't need to be fixed and
checked */ checked */
...@@ -6983,11 +6983,10 @@ check_method_redefinition (class, method) ...@@ -6983,11 +6983,10 @@ check_method_redefinition (class, method)
for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef)) for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
{ {
struct lang_type *t = TYPE_LANG_SPECIFIC (TREE_TYPE (redef)); if (redef == method)
if (! t || (redef == method))
break; break;
if (DECL_NAME (redef) == name && sig == t->signature) if (DECL_NAME (redef) == name
&& sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef)))
{ {
parse_error_context parse_error_context
(cl, "Duplicate %s declaration `%s'", (cl, "Duplicate %s declaration `%s'",
...@@ -9234,6 +9233,10 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) ...@@ -9234,6 +9233,10 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super)
field = resolve_field_access (wfl, NULL, &type); field = resolve_field_access (wfl, NULL, &type);
if (field == error_mark_node) if (field == error_mark_node)
PATCH_METHOD_RETURN_ERROR (); 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 /* 2- Do the layout of the class where the last field
was found, so we can search it. */ was found, so we can search it. */
...@@ -9367,10 +9370,14 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) ...@@ -9367,10 +9370,14 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super)
is_static_flag = METHOD_STATIC (list); is_static_flag = METHOD_STATIC (list);
/* In the context of an explicit constructor invocation, we can't invoke /* In the context of an explicit constructor invocation, we can't
any method relying on `this' */ 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 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 parse_error_context
(wfl, "Can't reference `this' before the superclass constructor has " (wfl, "Can't reference `this' before the superclass constructor has "
......
...@@ -4364,7 +4364,7 @@ check_method_redefinition (class, method) ...@@ -4364,7 +4364,7 @@ check_method_redefinition (class, method)
{ {
tree redef, name; tree redef, name;
tree cl = DECL_NAME (method); 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 /* decl name of artificial <clinit> and <finit> doesn't need to be fixed and
checked */ checked */
...@@ -4378,11 +4378,10 @@ check_method_redefinition (class, method) ...@@ -4378,11 +4378,10 @@ check_method_redefinition (class, method)
for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef)) for (redef = TYPE_METHODS (class); redef; redef = TREE_CHAIN (redef))
{ {
struct lang_type *t = TYPE_LANG_SPECIFIC (TREE_TYPE (redef)); if (redef == method)
if (! t || (redef == method))
break; break;
if (DECL_NAME (redef) == name && sig == t->signature) if (DECL_NAME (redef) == name
&& sig == TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (redef)))
{ {
parse_error_context parse_error_context
(cl, "Duplicate %s declaration `%s'", (cl, "Duplicate %s declaration `%s'",
...@@ -6629,6 +6628,10 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) ...@@ -6629,6 +6628,10 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super)
field = resolve_field_access (wfl, NULL, &type); field = resolve_field_access (wfl, NULL, &type);
if (field == error_mark_node) if (field == error_mark_node)
PATCH_METHOD_RETURN_ERROR (); 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 /* 2- Do the layout of the class where the last field
was found, so we can search it. */ was found, so we can search it. */
...@@ -6762,10 +6765,14 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super) ...@@ -6762,10 +6765,14 @@ patch_method_invocation (patch, primary, where, is_static, ret_decl, super)
is_static_flag = METHOD_STATIC (list); is_static_flag = METHOD_STATIC (list);
/* In the context of an explicit constructor invocation, we can't invoke /* In the context of an explicit constructor invocation, we can't
any method relying on `this' */ 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 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 parse_error_context
(wfl, "Can't reference `this' before the superclass constructor has " (wfl, "Can't reference `this' before the superclass constructor has "
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment