[multiple changes]

Sat Jul  3 22:26:32 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed
 	CALL_EXPR, to avoid order of evaluation changes.
Fri Jul  2 17:44:08 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* parse.y (qualify_ambiguous_name): Do not use
 	IDENTIFIER_LOCAL_VALUE when name is a STRING_CST.
Thu Jul  1 23:31:16 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* check-init.c (check_init): Handle MAX_EXPR.
	* expr.c (force_evaluation_order): Force method call arguments to
 	be evaluated in left-to-right order.
	* parse.y (qualify_ambiguous_name): Loop again to qualify
 	NEW_ARRAY_EXPR properly.
Wed Jun 30 17:27:58 1999  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* parse.y (patch_invoke): Resolve unresolved invoked method
 	returned type.
	(qualify_ambiguous_name): STRING_CST to qualify expression for
 	type name resolution.

From-SVN: r27998
This commit is contained in:
Alexandre Petit-Bianco 1999-07-07 13:11:03 +00:00 committed by Alexandre Petit-Bianco
parent 44a6ce434c
commit 1a6d4fb73c
5 changed files with 83 additions and 24 deletions

View File

@ -1,3 +1,28 @@
Sat Jul 3 22:26:32 1999 Alexandre Petit-Bianco <apbianco@cygnus.com>
* expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed
CALL_EXPR, to avoid order of evaluation changes.
Fri Jul 2 17:44:08 1999 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (qualify_ambiguous_name): Do not use
IDENTIFIER_LOCAL_VALUE when name is a STRING_CST.
Thu Jul 1 23:31:16 1999 Alexandre Petit-Bianco <apbianco@cygnus.com>
* check-init.c (check_init): Handle MAX_EXPR.
* expr.c (force_evaluation_order): Force method call arguments to
be evaluated in left-to-right order.
* parse.y (qualify_ambiguous_name): Loop again to qualify
NEW_ARRAY_EXPR properly.
Wed Jun 30 17:27:58 1999 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (patch_invoke): Resolve unresolved invoked method
returned type.
(qualify_ambiguous_name): STRING_CST to qualify expression for
type name resolution.
1999-06-24 Andrew Haley <aph@cygnus.com> 1999-06-24 Andrew Haley <aph@cygnus.com>
* class.c (finish_class): Whenever a deferred method is * class.c (finish_class): Whenever a deferred method is

View File

@ -643,6 +643,7 @@ check_init (exp, before)
case GE_EXPR: case GE_EXPR:
case LT_EXPR: case LT_EXPR:
case LE_EXPR: case LE_EXPR:
case MAX_EXPR:
case ARRAY_REF: case ARRAY_REF:
binop: binop:
check_init (TREE_OPERAND (exp, 0), before); check_init (TREE_OPERAND (exp, 0), before);

View File

@ -2578,6 +2578,10 @@ process_jvm_instruction (PC, byte_ops, length)
We fix this by using save_expr. This forces the sub-operand to be We fix this by using save_expr. This forces the sub-operand to be
copied into a fresh virtual register, copied into a fresh virtual register,
For method invocation, we modify the arguments so that a
left-to-right order evaluation is performed. Saved expressions
will, in CALL_EXPR order, be reused when the call will be expanded.
*/ */
tree tree
@ -2593,19 +2597,30 @@ force_evaluation_order (node)
} }
else if (TREE_CODE (node) == CALL_EXPR || TREE_CODE (node) == NEW_CLASS_EXPR) else if (TREE_CODE (node) == CALL_EXPR || TREE_CODE (node) == NEW_CLASS_EXPR)
{ {
tree last_side_effecting_arg = NULL_TREE; tree arg, cmp;
tree arg = TREE_OPERAND (node, 1);
for (; arg != NULL_TREE; arg = TREE_CHAIN (arg)) if (!TREE_OPERAND (node, 1))
return node;
/* This reverses the evaluation order. This is a desired effect. */
for (cmp = NULL_TREE, arg = TREE_OPERAND (node, 1);
arg; arg = TREE_CHAIN (arg))
{ {
if (TREE_SIDE_EFFECTS (TREE_VALUE (arg))) tree saved = save_expr (TREE_VALUE (arg));
last_side_effecting_arg = arg; cmp = (cmp == NULL_TREE ? saved :
build (COMPOUND_EXPR, void_type_node, cmp, saved));
TREE_VALUE (arg) = saved;
} }
arg = TREE_OPERAND (node, 1);
for (; arg != NULL_TREE; arg = TREE_CHAIN (arg)) if (cmp && TREE_CODE (cmp) == COMPOUND_EXPR)
TREE_SIDE_EFFECTS (cmp) = 1;
if (cmp)
{ {
if (arg == last_side_effecting_arg) cmp = save_expr (build (COMPOUND_EXPR, TREE_TYPE (node), cmp, node));
break; CAN_COMPLETE_NORMALLY (cmp) = CAN_COMPLETE_NORMALLY (node);
TREE_VALUE (arg) = save_expr (TREE_VALUE (arg)); TREE_SIDE_EFFECTS (cmp) = 1;
node = cmp;
} }
} }
return node; return node;

View File

@ -2212,7 +2212,7 @@ static const short yycheck[] = { 3,
#define YYPURE 1 #define YYPURE 1
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* -*-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, /* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@ -2229,7 +2229,7 @@ static const short yycheck[] = { 3,
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software 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 /* As a special exception, when this file is copied by Bison into a
Bison output file, you may use that output file without restriction. Bison output file, you may use that output file without restriction.
@ -2363,8 +2363,10 @@ int yydebug; /* nonzero means print parse trace */
/* Prevent warning if -Wstrict-prototypes. */ /* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__ #ifdef __GNUC__
#ifndef YYPARSE_PARAM
int yyparse (void); int yyparse (void);
#endif #endif
#endif
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
@ -2405,7 +2407,7 @@ __yy_memcpy (char *to, char *from, int count)
#endif #endif
#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 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *. into yyparse. The argument should have type void *.
@ -4694,7 +4696,7 @@ case 495:
break;} break;}
} }
/* the action file gets copied in in place of this dollarsign */ /* 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; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
@ -9813,6 +9815,11 @@ patch_invoke (patch, method, args)
if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) && if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t)) TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta)); TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
/* Resolve unresolved returned type isses */
t = TREE_TYPE (TREE_TYPE (method));
if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
resolve_and_layout (TREE_TYPE (t), NULL);
if (flag_emit_class_files || flag_emit_xref) if (flag_emit_class_files || flag_emit_xref)
func = method; func = method;
@ -10223,7 +10230,7 @@ qualify_ambiguous_name (id)
break; break;
case NEW_ARRAY_EXPR: case NEW_ARRAY_EXPR:
qual = TREE_CHAIN (qual); qual = TREE_CHAIN (qual);
new_array_found = 1; again = new_array_found = 1;
continue; continue;
case NEW_CLASS_EXPR: case NEW_CLASS_EXPR:
case CONVERT_EXPR: case CONVERT_EXPR:
@ -10301,7 +10308,8 @@ qualify_ambiguous_name (id)
declaration or parameter declaration, then it is an expression declaration or parameter declaration, then it is an expression
name. We don't carry this test out if we're in the context of the name. We don't carry this test out if we're in the context of the
use of SUPER or THIS */ use of SUPER or THIS */
if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name))) if (!this_found && !super_found &&
TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
{ {
RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1; RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
QUAL_RESOLUTION (qual) = decl; QUAL_RESOLUTION (qual) = decl;
@ -10318,15 +10326,17 @@ qualify_ambiguous_name (id)
QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl); QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
} }
/* We reclassify NAME as a type name if: /* We reclassify NAME as yielding to a type name resolution if:
- NAME is a class/interface declared within the compilation - NAME is a class/interface declared within the compilation
unit containing NAME, unit containing NAME,
- NAME is imported via a single-type-import declaration, - NAME is imported via a single-type-import declaration,
- NAME is declared in an another compilation unit of the package - NAME is declared in an another compilation unit of the package
of the compilation unit containing NAME, of the compilation unit containing NAME,
- NAME is declared by exactly on type-import-on-demand declaration - NAME is declared by exactly on type-import-on-demand declaration
of the compilation unit containing NAME. */ of the compilation unit containing NAME.
else if ((decl = resolve_and_layout (name, NULL_TREE))) - NAME is actually a STRING_CST. */
else if (TREE_CODE (name) == STRING_CST ||
(decl = resolve_and_layout (name, NULL_TREE)))
{ {
RESOLVE_TYPE_NAME_P (qual_wfl) = 1; RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
QUAL_RESOLUTION (qual) = decl; QUAL_RESOLUTION (qual) = decl;

View File

@ -7228,6 +7228,11 @@ patch_invoke (patch, method, args)
if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) && if (JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_VALUE (ta))) &&
TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t)) TREE_TYPE (TREE_VALUE (ta)) != TREE_VALUE (t))
TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta)); TREE_VALUE (ta) = convert (TREE_VALUE (t), TREE_VALUE (ta));
/* Resolve unresolved returned type isses */
t = TREE_TYPE (TREE_TYPE (method));
if (TREE_CODE (t) == POINTER_TYPE && !CLASS_LOADED_P (TREE_TYPE (t)))
resolve_and_layout (TREE_TYPE (t), NULL);
if (flag_emit_class_files || flag_emit_xref) if (flag_emit_class_files || flag_emit_xref)
func = method; func = method;
@ -7638,7 +7643,7 @@ qualify_ambiguous_name (id)
break; break;
case NEW_ARRAY_EXPR: case NEW_ARRAY_EXPR:
qual = TREE_CHAIN (qual); qual = TREE_CHAIN (qual);
new_array_found = 1; again = new_array_found = 1;
continue; continue;
case NEW_CLASS_EXPR: case NEW_CLASS_EXPR:
case CONVERT_EXPR: case CONVERT_EXPR:
@ -7716,7 +7721,8 @@ qualify_ambiguous_name (id)
declaration or parameter declaration, then it is an expression declaration or parameter declaration, then it is an expression
name. We don't carry this test out if we're in the context of the name. We don't carry this test out if we're in the context of the
use of SUPER or THIS */ use of SUPER or THIS */
if (!this_found && !super_found && (decl = IDENTIFIER_LOCAL_VALUE (name))) if (!this_found && !super_found &&
TREE_CODE (name) != STRING_CST && (decl = IDENTIFIER_LOCAL_VALUE (name)))
{ {
RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1; RESOLVE_EXPRESSION_NAME_P (qual_wfl) = 1;
QUAL_RESOLUTION (qual) = decl; QUAL_RESOLUTION (qual) = decl;
@ -7733,15 +7739,17 @@ qualify_ambiguous_name (id)
QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl); QUAL_RESOLUTION (qual) = (new_array_found ? NULL_TREE : decl);
} }
/* We reclassify NAME as a type name if: /* We reclassify NAME as yielding to a type name resolution if:
- NAME is a class/interface declared within the compilation - NAME is a class/interface declared within the compilation
unit containing NAME, unit containing NAME,
- NAME is imported via a single-type-import declaration, - NAME is imported via a single-type-import declaration,
- NAME is declared in an another compilation unit of the package - NAME is declared in an another compilation unit of the package
of the compilation unit containing NAME, of the compilation unit containing NAME,
- NAME is declared by exactly on type-import-on-demand declaration - NAME is declared by exactly on type-import-on-demand declaration
of the compilation unit containing NAME. */ of the compilation unit containing NAME.
else if ((decl = resolve_and_layout (name, NULL_TREE))) - NAME is actually a STRING_CST. */
else if (TREE_CODE (name) == STRING_CST ||
(decl = resolve_and_layout (name, NULL_TREE)))
{ {
RESOLVE_TYPE_NAME_P (qual_wfl) = 1; RESOLVE_TYPE_NAME_P (qual_wfl) = 1;
QUAL_RESOLUTION (qual) = decl; QUAL_RESOLUTION (qual) = decl;