From bc2874c902997772cb649232f182d4908605a7ee Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 6 Apr 2000 05:29:30 +0000 Subject: [PATCH] re GNATS gcj/140 (gcj permits assignment to array length) Fix for PR gcj/140: * parse.y (check_final_assignment): Recognize assignments to the `length' field of an array when generating class files. From-SVN: r32960 --- gcc/java/ChangeLog | 6 ++++++ gcc/java/parse.c | 14 ++++++++++---- gcc/java/parse.y | 14 ++++++++++---- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 63c7f08bfbd..8123c230f75 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,9 @@ +2000-04-05 Tom Tromey + + Fix for PR gcj/140: + * parse.y (check_final_assignment): Recognize assignments to the + `length' field of an array when generating class files. + 2000-04-05 Alexandre Petit-Bianco * class.c (decl_hash): Prototype removed. diff --git a/gcc/java/parse.c b/gcc/java/parse.c index e15e5718204..f65e21fccf1 100644 --- a/gcc/java/parse.c +++ b/gcc/java/parse.c @@ -14053,10 +14053,16 @@ check_final_assignment (lvalue, wfl) && JDECL_P (TREE_OPERAND (lvalue, 1))) lvalue = TREE_OPERAND (lvalue, 1); - if (TREE_CODE (lvalue) == FIELD_DECL - && FIELD_FINAL (lvalue) - && !DECL_CLINIT_P (current_function_decl) - && !DECL_FINIT_P (current_function_decl)) + /* When generating class files, references to the `length' field + look a bit different. */ + if ((flag_emit_class_files + && TREE_CODE (lvalue) == COMPONENT_REF + && TYPE_ARRAY_P (TREE_TYPE (TREE_OPERAND (lvalue, 0))) + && FIELD_FINAL (TREE_OPERAND (lvalue, 1))) + || (TREE_CODE (lvalue) == FIELD_DECL + && FIELD_FINAL (lvalue) + && !DECL_CLINIT_P (current_function_decl) + && !DECL_FINIT_P (current_function_decl))) { parse_error_context (wfl, "Can't assign a value to the final variable `%s'", diff --git a/gcc/java/parse.y b/gcc/java/parse.y index cac9a3a9121..17e74c2dd59 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -11421,10 +11421,16 @@ check_final_assignment (lvalue, wfl) && JDECL_P (TREE_OPERAND (lvalue, 1))) lvalue = TREE_OPERAND (lvalue, 1); - if (TREE_CODE (lvalue) == FIELD_DECL - && FIELD_FINAL (lvalue) - && !DECL_CLINIT_P (current_function_decl) - && !DECL_FINIT_P (current_function_decl)) + /* When generating class files, references to the `length' field + look a bit different. */ + if ((flag_emit_class_files + && TREE_CODE (lvalue) == COMPONENT_REF + && TYPE_ARRAY_P (TREE_TYPE (TREE_OPERAND (lvalue, 0))) + && FIELD_FINAL (TREE_OPERAND (lvalue, 1))) + || (TREE_CODE (lvalue) == FIELD_DECL + && FIELD_FINAL (lvalue) + && !DECL_CLINIT_P (current_function_decl) + && !DECL_FINIT_P (current_function_decl))) { parse_error_context (wfl, "Can't assign a value to the final variable `%s'", -- 2.30.2