aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/decl.c
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2005-03-18 13:59:06 +0000
committerAndrew Haley <aph@gcc.gnu.org>2005-03-18 13:59:06 +0000
commit6726a1f593aadde5bc0e1a54dff1f72700585d8e (patch)
tree85e37a6b722fcabced66fe8621a1b9c73fdcc322 /gcc/java/decl.c
parentbcb34aa3dd4fa492255c0166b1777610962368bb (diff)
downloadgcc-6726a1f593aadde5bc0e1a54dff1f72700585d8e.zip
gcc-6726a1f593aadde5bc0e1a54dff1f72700585d8e.tar.gz
gcc-6726a1f593aadde5bc0e1a54dff1f72700585d8e.tar.bz2
re PR java/20522 (ICE in update_aliases, at java/decl.c:163)
2005-03-18 Andrew Haley <aph@redhat.com> PR java/20522 * decl.c (update_aliases): Don't update variables that are about to die. (maybe_poplevels): Add comment. From-SVN: r96683
Diffstat (limited to 'gcc/java/decl.c')
-rw-r--r--gcc/java/decl.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index 720b632..2f9da97 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -149,7 +149,10 @@ update_aliases (tree decl, int index, int pc)
&& LOCAL_SLOT_P (tmp) == 0
&& (pc == -1
|| (pc >= DECL_LOCAL_START_PC (tmp)
- && pc <= DECL_LOCAL_END_PC (tmp)))
+ && pc < DECL_LOCAL_END_PC (tmp)))
+ /* This test is < (rather than <=) because there's no point
+ updating an alias that's about to die at the end of this
+ instruction. */
&& (tmp_type == decl_type
|| (INTEGRAL_TYPE_P (tmp_type)
&& INTEGRAL_TYPE_P (decl_type)
@@ -1741,6 +1744,12 @@ maybe_poplevels (int pc)
current_pc = pc;
#endif
+ /* FIXME: I'm pretty sure that this is wrong. Variable scopes are
+ inclusive, so a variable is live if pc == end_pc. Here, we
+ terminate a range if the current pc is equal to the end of the
+ range, and this is *before* we have generated code for the
+ instruction at end_pc. We're closing a binding level one
+ instruction too early.*/
while (current_binding_level->end_pc <= pc)
poplevel (1, 0, 0);
}