re GNATS gcj/94 (compiler allows assignment to interface constants)

2000-02-22  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* parse.y (check_final_assignment): Extended to process
	COMPOUND_EXPR.
	(patch_assignment): Have check_final_assignment called only once.

(This fixes the Java PR #94:
 http://sourceware.cygnus.com/ml/java-prs/1999-q4/msg00125.html)

From-SVN: r32396
This commit is contained in:
Alexandre Petit-Bianco 2000-03-08 00:30:06 +00:00 committed by Alexandre Petit-Bianco
parent 15f1a7952b
commit 6632dcdd41
3 changed files with 21 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2000-03-07 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (check_final_assignment): Extended to process
COMPOUND_EXPR.
(patch_assignment): Have check_final_assignment called only once.
2000-03-07 Alexandre Petit-Bianco <apbianco@cygnus.com>
* java-tree.h (IS_INIT_CHECKED): New flag.

View File

@ -11771,6 +11771,10 @@ static int
check_final_assignment (lvalue, wfl)
tree lvalue, wfl;
{
if (TREE_CODE (lvalue) == COMPOUND_EXPR
&& JDECL_P (TREE_OPERAND (lvalue, 1)))
lvalue = TREE_OPERAND (lvalue, 1);
if (JDECL_P (lvalue)
&& FIELD_FINAL (lvalue) && !IS_CLINIT (current_function_decl))
{
@ -11850,7 +11854,7 @@ patch_assignment (node, wfl_op1, wfl_op2)
else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
&& resolve_expression_name (wfl_op1, &llvalue))
{
if (check_final_assignment (llvalue, wfl_op1))
if (!error_found && check_final_assignment (llvalue, wfl_op1))
{
/* What we should do instead is resetting the all the flags
previously set, exchange lvalue for llvalue and continue. */
@ -13516,9 +13520,11 @@ patch_newarray (node)
for (cdim = dims; cdim; cdim = TREE_CHAIN (cdim))
{
type = array_type;
array_type = build_java_array_type (type,
TREE_CODE (cdim) == INTEGER_CST ?
TREE_INT_CST_LOW (cdim) : -1);
array_type
= build_java_array_type (type,
TREE_CODE (cdim) == INTEGER_CST
? (HOST_WIDE_INT) TREE_INT_CST_LOW (cdim)
: -1);
array_type = promote_type (array_type);
}
dims = nreverse (dims);

View File

@ -9081,6 +9081,10 @@ static int
check_final_assignment (lvalue, wfl)
tree lvalue, wfl;
{
if (TREE_CODE (lvalue) == COMPOUND_EXPR
&& JDECL_P (TREE_OPERAND (lvalue, 1)))
lvalue = TREE_OPERAND (lvalue, 1);
if (JDECL_P (lvalue)
&& FIELD_FINAL (lvalue) && !IS_CLINIT (current_function_decl))
{
@ -9160,7 +9164,7 @@ patch_assignment (node, wfl_op1, wfl_op2)
else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION
&& resolve_expression_name (wfl_op1, &llvalue))
{
if (check_final_assignment (llvalue, wfl_op1))
if (!error_found && check_final_assignment (llvalue, wfl_op1))
{
/* What we should do instead is resetting the all the flags
previously set, exchange lvalue for llvalue and continue. */