This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH in Java constant propagation
- From: Per Bothner <per at bothner dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: java at gcc dot gnu dot org
- Date: Wed, 11 Sep 2002 09:18:48 -0700
- Subject: PATCH in Java constant propagation
I believe this fixes the bug that martin.kahlert@infineon.com
reported (subject: Is this a bug?). I *think* it doesn't
break anything else, but I did get a lot of testsuite errors,
so I'm not sure. I looks like I will be inaccessible for a
the rest of the week, so I'd appreciate it if someone could
test it, and if it works, check it in.
--
--Per Bothner
per@bothner.com http://www.bothner.com/per/
* parse.y (fold_constant_for_init): If a VAR_DECL, convert numerical
constant to the type of the field.
(java_complete_tree): Remove now-redundant code.
* parse.y (fold_constant_for_init): 'null' is not a constant expr.
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.393
diff -u -p -r1.393 parse.y
--- parse.y 26 Aug 2002 23:30:02 -0000 1.393
+++ parse.y 11 Sep 2002 15:51:41 -0000
@@ -11514,22 +11393,9 @@ java_complete_tree (node)
&& DECL_INITIAL (node) != NULL_TREE
&& !flag_emit_xref)
{
- tree value = DECL_INITIAL (node);
- DECL_INITIAL (node) = NULL_TREE;
- value = fold_constant_for_init (value, node);
- DECL_INITIAL (node) = value;
+ tree value = fold_constant_for_init (node, node);
if (value != NULL_TREE)
- {
- /* fold_constant_for_init sometimes widens the original type
- of the constant (i.e. byte to int). It's not desirable,
- especially if NODE is a function argument. */
- if ((TREE_CODE (value) == INTEGER_CST
- || TREE_CODE (value) == REAL_CST)
- && TREE_TYPE (node) != TREE_TYPE (value))
- return convert (TREE_TYPE (node), value);
- else
- return value;
- }
+ return value;
}
return node;
}
@@ -16015,8 +15863,10 @@ fold_constant_for_init (node, context)
switch (code)
{
- case STRING_CST:
case INTEGER_CST:
+ if (node == null_pointer_node)
+ return NULL_TREE;
+ case STRING_CST:
case REAL_CST:
return node;
@@ -16089,6 +15939,8 @@ fold_constant_for_init (node, context)
/* Guard against infinite recursion. */
DECL_INITIAL (node) = NULL_TREE;
val = fold_constant_for_init (val, node);
+ if (val != NULL_TREE && TREE_CODE (val) != STRING_CST)
+ val = try_builtin_assignconv (NULL_TREE, TREE_TYPE (node), val);
DECL_INITIAL (node) = val;
return val;