aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2005-06-27 18:40:16 +0000
committerTom Tromey <tromey@gcc.gnu.org>2005-06-27 18:40:16 +0000
commit4ebe7d9317b79fcd68fcec3e5cbdb502abe8152d (patch)
tree5bdfeb3073dddff148a77228a8e3565890e2e858 /gcc
parentd994b336c8da5c111a9ebd095fad9e969be7f439 (diff)
downloadgcc-4ebe7d9317b79fcd68fcec3e5cbdb502abe8152d.zip
gcc-4ebe7d9317b79fcd68fcec3e5cbdb502abe8152d.tar.gz
gcc-4ebe7d9317b79fcd68fcec3e5cbdb502abe8152d.tar.bz2
PR java/21540, PR java/13788:
gcc/java/: PR java/21540, PR java/13788: * parse.y (java_complete_lhs) <CASE_EXPR>: Use fold_constant_for_init. (patch_binop): Added 'folding' argument. Updated all callers. (patch_unaryop) <NOP_EXPR>: New case. (fold_constant_for_init) <NOP_EXPR>: Likewise. (fold_constant_for_init) <COND_EXPR>: Fix sense of test. libjava/: PR java/21540, PR java/13788: * testsuite/libjava.compile/pr21540.java: New file. * testsuite/libjava.compile/pr13788.java: New file. * testsuite/libjava.jacks/jacks.xfail: Updated. From-SVN: r101358
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog10
-rw-r--r--gcc/java/parse.y38
2 files changed, 34 insertions, 14 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 229845e..239e2b7 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,13 @@
+2005-06-27 Tom Tromey <tromey@redhat.com>
+
+ PR java/21540, PR java/13788:
+ * parse.y (java_complete_lhs) <CASE_EXPR>: Use
+ fold_constant_for_init.
+ (patch_binop): Added 'folding' argument. Updated all callers.
+ (patch_unaryop) <NOP_EXPR>: New case.
+ (fold_constant_for_init) <NOP_EXPR>: Likewise.
+ (fold_constant_for_init) <COND_EXPR>: Fix sense of test.
+
2005-06-25 Jan Hubicka <jh@suse.cz>
* builtins.c (define_builtin): Accept new flags parameter.
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index 2ca332d..0a513b1 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -161,7 +161,7 @@ static tree build_new_invocation (tree, tree);
static tree build_assignment (int, int, tree, tree);
static tree build_binop (enum tree_code, int, tree, tree);
static tree patch_assignment (tree, tree);
-static tree patch_binop (tree, tree, tree);
+static tree patch_binop (tree, tree, tree, int);
static tree build_unaryop (int, int, tree);
static tree build_incdec (int, int, tree, int);
static tree patch_unaryop (tree, tree);
@@ -11791,8 +11791,13 @@ java_complete_lhs (tree node)
/* First, the case expression must be constant. Values of final
fields are accepted. */
+ nn = fold_constant_for_init (cn, NULL_TREE);
+ if (nn != NULL_TREE)
+ cn = nn;
+
cn = fold (cn);
- if ((TREE_CODE (cn) == COMPOUND_EXPR || TREE_CODE (cn) == COMPONENT_REF)
+ if ((TREE_CODE (cn) == COMPOUND_EXPR
+ || TREE_CODE (cn) == COMPONENT_REF)
&& JDECL_P (TREE_OPERAND (cn, 1))
&& FIELD_FINAL (TREE_OPERAND (cn, 1))
&& DECL_INITIAL (TREE_OPERAND (cn, 1)))
@@ -12303,12 +12308,12 @@ java_complete_lhs (tree node)
TREE_OPERAND (node, 1) = nn;
}
- return patch_binop (node, wfl_op1, wfl_op2);
+ return patch_binop (node, wfl_op1, wfl_op2, 0);
case INSTANCEOF_EXPR:
wfl_op1 = TREE_OPERAND (node, 0);
COMPLETE_CHECK_OP_0 (node);
- return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1));
+ return patch_binop (node, wfl_op1, TREE_OPERAND (node, 1), 0);
case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
@@ -13442,7 +13447,7 @@ java_refold (tree t)
of remaining nodes and detects more errors in certain cases. */
static tree
-patch_binop (tree node, tree wfl_op1, tree wfl_op2)
+patch_binop (tree node, tree wfl_op1, tree wfl_op2, int folding)
{
tree op1 = TREE_OPERAND (node, 0);
tree op2 = TREE_OPERAND (node, 1);
@@ -13624,16 +13629,14 @@ patch_binop (tree node, tree wfl_op1, tree wfl_op2)
build_int_cst (NULL_TREE, 0x3f)));
/* The >>> operator is a >> operating on unsigned quantities */
- if (code == URSHIFT_EXPR && ! flag_emit_class_files)
+ if (code == URSHIFT_EXPR && (folding || ! flag_emit_class_files))
{
tree to_return;
tree utype = java_unsigned_type (prom_type);
op1 = convert (utype, op1);
- TREE_SET_CODE (node, RSHIFT_EXPR);
- TREE_OPERAND (node, 0) = op1;
- TREE_OPERAND (node, 1) = op2;
- TREE_TYPE (node) = utype;
- to_return = convert (prom_type, node);
+
+ to_return = fold_build2 (RSHIFT_EXPR, utype, op1, op2);
+ to_return = convert (prom_type, to_return);
/* Copy the original value of the COMPOUND_ASSIGN_P flag */
COMPOUND_ASSIGN_P (to_return) = COMPOUND_ASSIGN_P (node);
TREE_SIDE_EFFECTS (to_return)
@@ -14413,6 +14416,12 @@ patch_unaryop (tree node, tree wfl_op)
return value;
}
break;
+
+ case NOP_EXPR:
+ /* This can only happen when the type is already known. */
+ gcc_assert (TREE_TYPE (node) != NULL_TREE);
+ prom_type = TREE_TYPE (node);
+ break;
}
if (error_found)
@@ -16214,13 +16223,14 @@ fold_constant_for_init (tree node, tree context)
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 1) = val;
- return patch_binop (node, op0, op1);
+ return patch_binop (node, op0, op1, 1);
case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
case TRUTH_NOT_EXPR:
case BIT_NOT_EXPR:
case CONVERT_EXPR:
+ case NOP_EXPR:
op0 = TREE_OPERAND (node, 0);
val = fold_constant_for_init (op0, context);
if (val == NULL_TREE || ! TREE_CONSTANT (val))
@@ -16246,8 +16256,8 @@ fold_constant_for_init (tree node, tree context)
if (val == NULL_TREE || ! TREE_CONSTANT (val))
return NULL_TREE;
TREE_OPERAND (node, 2) = val;
- return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 1)
- : TREE_OPERAND (node, 2);
+ return integer_zerop (TREE_OPERAND (node, 0)) ? TREE_OPERAND (node, 2)
+ : TREE_OPERAND (node, 1);
case VAR_DECL:
case FIELD_DECL: