re PR java/14853 (Assignment to final field permitted when compiling to native)
authorTom Tromey <tromey@redhat.com>
Mon, 6 Dec 2004 15:32:38 +0000 (15:32 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 6 Dec 2004 15:32:38 +0000 (15:32 +0000)
PR java/14853:
* java-tree.h (extract_field_decl): Declare.
* parse.y (extract_field_decl): Renamed from
strip_out_static_field_access_decl.  No longer static.
* check-init.c (get_variable_decl): Unwrap COMPOUND_EXPRs.

From-SVN: r91778

gcc/java/ChangeLog
gcc/java/check-init.c
gcc/java/java-tree.h
gcc/java/parse.y

index 805c5e008b18de533daf662c1ada9d7eceeef247..724403ab1162bdc3256c73e44d09f8a6e6f1e408 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-06  Tom Tromey  <tromey@redhat.com>
+
+       PR java/14853:
+       * java-tree.h (extract_field_decl): Declare.
+       * parse.y (extract_field_decl): Renamed from
+       strip_out_static_field_access_decl.  No longer static.
+       * check-init.c (get_variable_decl): Unwrap COMPOUND_EXPRs.
+
 2004-12-03  Tom Tromey  <tromey@redhat.com>
 
        * lang.c (flag_new_verifier): Define.
index 05692b0a4c208c039d99ed229b5c7c2244983ad0..e124ffc5eefc01a8dd5b1d6a3c2cead7dcf64145 100644 (file)
@@ -164,6 +164,11 @@ static void check_final_reassigned (tree, words);
 static tree
 get_variable_decl (tree exp)
 {
+  /* A static field can be wrapped in a COMPOUND_EXPR where the first
+     argument initializes the class.  */
+  if (TREE_CODE (exp) == COMPOUND_EXPR)
+    exp = extract_field_decl (exp);
+
   if (TREE_CODE (exp) == VAR_DECL)
     {
       if (! TREE_STATIC (exp) ||  FIELD_FINAL (exp))
index 54cf01bbc0c54d0a89b1236c6fd12c76b9d3d80e..843e5f7009879ce0394403781bb31d0bcb5b41a7 100644 (file)
@@ -1922,4 +1922,6 @@ extern tree build_expr_wfl              PARAMS ((tree, const char *, int, int));
 extern void java_genericize            PARAMS ((tree));
 extern int java_gimplify_expr          PARAMS ((tree *, tree *, tree *));
 
+extern tree extract_field_decl (tree);
+
 #endif /* ! GCC_JAVA_TREE_H */
index 2634de98f4f82980fa374cb53451bc5d27205045..815b51eae17eeffad785ec4d740b571af8bb4b61 100644 (file)
@@ -277,7 +277,6 @@ static tree maybe_build_array_element_wfl (tree);
 static int array_constructor_check_entry (tree, tree);
 static const char *purify_type_name (const char *);
 static tree fold_constant_for_init (tree, tree);
-static tree strip_out_static_field_access_decl (tree);
 static jdeplist *reverse_jdep_list (struct parser_ctxt *);
 static void static_ref_err (tree, tree, tree);
 static void parser_add_interface (tree, tree, tree);
@@ -9678,12 +9677,12 @@ resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
   return field_ref;
 }
 
-/* If NODE is an access to f static field, strip out the class
+/* If NODE is an access to a static field, strip out the class
    initialization part and return the field decl, otherwise, return
    NODE. */
 
-static tree
-strip_out_static_field_access_decl (tree node)
+tree
+extract_field_decl (tree node)
 {
   if (TREE_CODE (node) == COMPOUND_EXPR)
     {
@@ -14260,7 +14259,7 @@ patch_unaryop (tree node, tree wfl_op)
     case PREINCREMENT_EXPR:
       /* 15.14.2 Prefix Decrement Operator -- */
     case PREDECREMENT_EXPR:
-      op = decl = strip_out_static_field_access_decl (op);
+      op = decl = extract_field_decl (op);
       outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
       /* We might be trying to change an outer field accessed using
          access method. */