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.
* check-init.c (check_init): Test and set IS_INIT_CHECKED.
* parse.y (patch_string): Call force_evaluation_order on the
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))
{
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. */
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);
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))
{
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. */