diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index ae9231d5d08f814d4be89c340824153f854be374..142975f90a649986fb2aca48ad91bd7e6b10706b 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,8 @@ +Mon Nov 1 01:32:48 1999 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * parse.y (resolve_qualified_expression_name): Prevent `this' + from being before the superclass constructor has been called. + Sat Oct 30 21:35:13 1999 Todd T. Fries <todd@lighthouse.fries.net> * check-init.c: Fix typo in comment. diff --git a/gcc/java/parse.c b/gcc/java/parse.c index 8ab288840841998c1507d9a6d0422a110c48c93e..d97838244785d92709b13515fd779104a4092dcf 100644 --- a/gcc/java/parse.c +++ b/gcc/java/parse.c @@ -2238,7 +2238,7 @@ static const short yycheck[] = { 3, #define YYPURE 1 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/cygnus/gnupro-98r1/share/bison.simple" +#line 3 "/usr/share/misc/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. @@ -2255,7 +2255,7 @@ static const short yycheck[] = { 3, You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. @@ -2389,8 +2389,10 @@ int yydebug; /* nonzero means print parse trace */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ +#ifndef YYPARSE_PARAM int yyparse (void); #endif +#endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) @@ -2431,7 +2433,7 @@ __yy_memcpy (char *to, char *from, int count) #endif #endif -#line 196 "/usr/cygnus/gnupro-98r1/share/bison.simple" +#line 196 "/usr/share/misc/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. @@ -4718,7 +4720,7 @@ case 495: break;} } /* the action file gets copied in in place of this dollarsign */ -#line 498 "/usr/cygnus/gnupro-98r1/share/bison.simple" +#line 498 "/usr/share/misc/bison.simple" yyvsp -= yylen; yyssp -= yylen; @@ -9310,6 +9312,12 @@ resolve_qualified_expression_name (wfl, found_decl, where_found, type_found) (wfl, "Keyword `this' used outside allowed context"); return 1; } + if (ctxp->explicit_constructor_p) + { + parse_error_context (wfl, "Can't reference `this' before the " + "superclass constructor has been called"); + return 1; + } /* We have to generate code for intermediate acess */ *where_found = decl = current_this; *type_found = type = QUAL_DECL_TYPE (decl); @@ -11317,7 +11325,7 @@ complete_function_arguments (node) int flag = 0; tree cn; - ctxp->explicit_constructor_p += (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0); + ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0); for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn)) { tree wfl = TREE_VALUE (cn), parm, temp; @@ -11337,7 +11345,7 @@ complete_function_arguments (node) TREE_VALUE (cn) = parm; } - ctxp->explicit_constructor_p -= (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0); + ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0); return flag; } diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 8773014d152b303d64fd3d4c94cd74d48e0a6400..aa53706971780cc9ad0f027b0359c0ffc08f5fda 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -6725,6 +6725,12 @@ resolve_qualified_expression_name (wfl, found_decl, where_found, type_found) (wfl, "Keyword `this' used outside allowed context"); return 1; } + if (ctxp->explicit_constructor_p) + { + parse_error_context (wfl, "Can't reference `this' before the " + "superclass constructor has been called"); + return 1; + } /* We have to generate code for intermediate acess */ *where_found = decl = current_this; *type_found = type = QUAL_DECL_TYPE (decl); @@ -8732,7 +8738,7 @@ complete_function_arguments (node) int flag = 0; tree cn; - ctxp->explicit_constructor_p += (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0); + ctxp->explicit_constructor_p += (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0); for (cn = TREE_OPERAND (node, 1); cn; cn = TREE_CHAIN (cn)) { tree wfl = TREE_VALUE (cn), parm, temp; @@ -8752,7 +8758,7 @@ complete_function_arguments (node) TREE_VALUE (cn) = parm; } - ctxp->explicit_constructor_p -= (CALL_THIS_CONSTRUCTOR_P (node) ? 1 : 0); + ctxp->explicit_constructor_p -= (CALL_EXPLICIT_CONSTRUCTOR_P (node) ? 1 : 0); return flag; }