diff options
author | Tom Tromey <tromey@redhat.com> | 2005-06-27 18:40:16 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2005-06-27 18:40:16 +0000 |
commit | 4ebe7d9317b79fcd68fcec3e5cbdb502abe8152d (patch) | |
tree | 5bdfeb3073dddff148a77228a8e3565890e2e858 /gcc/java | |
parent | d994b336c8da5c111a9ebd095fad9e969be7f439 (diff) | |
download | gcc-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/java')
-rw-r--r-- | gcc/java/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/java/parse.y | 38 |
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: |