[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:
parent
44a6ce434c
commit
1a6d4fb73c
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user