aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorTang Ching-Hui <nicholas@cs.nthu.edu.tw>2001-12-02 18:44:54 +0800
committerBryce McKinlay <bryce@gcc.gnu.org>2001-12-02 10:44:54 +0000
commitb736dee60789f2353beeda8aed5b980659712c65 (patch)
tree28bf1e5a9de0c8886fdbcffd97a6273ddb87c033 /gcc/java
parent41543739cd3813a7e593fc4f61b558ecf6cffaf3 (diff)
downloadgcc-b736dee60789f2353beeda8aed5b980659712c65.zip
gcc-b736dee60789f2353beeda8aed5b980659712c65.tar.gz
gcc-b736dee60789f2353beeda8aed5b980659712c65.tar.bz2
re PR java/3096 (GCJ does not increment)
2001-12-02 Tang Ching-Hui <nicholas@cs.nthu.edu.tw> Alexandre Petit-Bianco <apbianco@redhat.com> * expr.c: call save_expr on array for correct evaluation order, modified comment, fixed indentation. * parse.y: (patch_assignment): Correctly extract the array base from the tree generate by build_java_arrayaccess, added comments. (patch_array_ref): Remove SAVE_EXPR on ARRAY_REF. Fixes PR java/3096, PR java/3803, PR java/3965. Co-Authored-By: Alexandre Petit-Bianco <apbianco@redhat.com> From-SVN: r47525
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog10
-rw-r--r--gcc/java/expr.c17
-rw-r--r--gcc/java/parse.y22
3 files changed, 30 insertions, 19 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 1c0f009..a7d9bc8 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,13 @@
+2001-12-02 Tang Ching-Hui <nicholas@cs.nthu.edu.tw>
+ Alexandre Petit-Bianco <apbianco@redhat.com>
+
+ * expr.c: call save_expr on array for correct evaluation order,
+ modified comment, fixed indentation.
+ * parse.y: (patch_assignment): Correctly extract the array base
+ from the tree generate by build_java_arrayaccess, added comments.
+ (patch_array_ref): Remove SAVE_EXPR on ARRAY_REF.
+ Fixes PR java/3096, PR java/3803, PR java/3965.
+
2001-12-01 Neil Booth <neil@daikokuya.demon.co.uk>
* expr.c (expand_byte_code): Remove trailing periods from messages.
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 182d247..0d3c61d 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -798,14 +798,21 @@ build_java_arrayaccess (array, type, index)
TREE_SIDE_EFFECTS( throw ) = 1;
}
}
-
+
+ /* The SAVE_EXPR is for correct evaluation order. It would be
+ cleaner to use force_evaluation_order (see comment there), but
+ that is difficult when we also have to deal with bounds
+ checking. The SAVE_EXPR is not necessary to do that when we're
+ not checking for array bounds. */
+ if (TREE_SIDE_EFFECTS (index) && throw)
+ throw = build (COMPOUND_EXPR, int_type_node, save_expr (array), throw);
+
node = build1 (INDIRECT_REF, type,
fold (build (PLUS_EXPR, ptr_type_node,
- java_check_reference (array, flag_check_references),
+ java_check_reference (array,
+ flag_check_references),
(throw ? build (COMPOUND_EXPR, int_type_node,
- throw, arith )
- : arith))));
-
+ throw, arith ) : arith))));
return node;
}
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 3b9900d..f63faa3 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -12940,10 +12940,13 @@ patch_assignment (node, wfl_op1)
/* We can have a SAVE_EXPR here when doing String +=. */
if (TREE_CODE (op) == SAVE_EXPR)
op = TREE_OPERAND (op, 0);
- if (flag_bounds_check)
- base = TREE_OPERAND (TREE_OPERAND (op, 1), 0);
- else
- base = TREE_OPERAND (op, 0);
+ /* We can have a COMPOUND_EXPR here when doing bounds check. */
+ if (TREE_CODE (op) == COMPOUND_EXPR)
+ op = TREE_OPERAND (op, 1);
+ base = TREE_OPERAND (op, 0);
+ /* Strip the last PLUS_EXPR to obtain the base. */
+ if (TREE_CODE (base) == PLUS_EXPR)
+ base = TREE_OPERAND (base, 0);
}
/* Build the invocation of _Jv_CheckArrayStore */
@@ -14592,16 +14595,7 @@ patch_array_ref (node)
TREE_OPERAND (node, 1) = index;
}
else
- {
- /* The save_expr is for correct evaluation order. It would be cleaner
- to use force_evaluation_order (see comment there), but that is
- difficult when we also have to deal with bounds checking. */
- if (TREE_SIDE_EFFECTS (index))
- array = save_expr (array);
- node = build_java_arrayaccess (array, array_type, index);
- if (TREE_SIDE_EFFECTS (index))
- node = build (COMPOUND_EXPR, array_type, array, node);
- }
+ node = build_java_arrayaccess (array, array_type, index);
TREE_TYPE (node) = array_type;
return node;
}