From: Bryce McKinlay Date: Mon, 18 Dec 2000 21:15:52 +0000 (+0000) Subject: Fix for PRs gcj/312 and gcj/253: X-Git-Tag: prereleases/libstdc++-2.92~2146 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c1eacb709f2f0ea4ad783e146ac95e21111022fd;p=thirdparty%2Fgcc.git Fix for PRs gcj/312 and gcj/253: * parse.y (valid_ref_assignconv_cast_p): Load classes for source and dest if they arn't already. * class.c (layout_class): Call maybe_layout_super_class on superinterfaces also, but only if compiling from bytecode. From-SVN: r38363 --- diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index af55e5b1f42a..0f71e7f8e186 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2000-12-17 Bryce McKinlay + + Fix for PRs gcj/312 and gcj/253: + * parse.y (valid_ref_assignconv_cast_p): Load classes for source and + dest if they arn't already. + * class.c (layout_class): Call maybe_layout_super_class on + superinterfaces also, but only if compiling from bytecode. + 2000-12-15 Tom Tromey * jcf-parse.c (jcf_parse_source): Set wfl_operator if not already diff --git a/gcc/java/class.c b/gcc/java/class.c index 00cf42e6e809..92dd0b971cd9 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1841,6 +1841,35 @@ layout_class (this_class) layout_type (this_class); + /* Also recursively load/layout any superinterfaces, but only if class was + loaded from bytecode. The source parser will take care of this itself. */ + if (!CLASS_FROM_SOURCE_P (this_class)) + { + tree basetype_vec = TYPE_BINFO_BASETYPES (this_class); + + if (basetype_vec) + { + int n = TREE_VEC_LENGTH (basetype_vec) - 1; + int i; + for (i = n; i > 0; i--) + { + tree vec_elt = TREE_VEC_ELT (basetype_vec, i); + tree super_interface = BINFO_TYPE (vec_elt); + + tree maybe_super_interface + = maybe_layout_super_class (super_interface, NULL_TREE); + if (maybe_super_interface == NULL + || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK) + { + TYPE_SIZE (this_class) = error_mark_node; + CLASS_BEING_LAIDOUT (this_class) = 0; + list = TREE_CHAIN (list); + return; + } + } + } + } + /* Convert the size back to an SI integer value */ TYPE_SIZE_UNIT (this_class) = fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class))); diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 7a23e72b96d1..ec09a49de2c6 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -12778,6 +12778,20 @@ valid_ref_assignconv_cast_p (source, dest, cast) source = TREE_TYPE (source); if (TREE_CODE (dest) == POINTER_TYPE) dest = TREE_TYPE (dest); + + /* If source and dest are being compiled from bytecode, they may need to + be loaded. */ + if (CLASS_P (source) && !CLASS_LOADED_P (source)) + { + load_class (source, 1); + safe_layout_class (source); + } + if (CLASS_P (dest) && !CLASS_LOADED_P (dest)) + { + load_class (dest, 1); + safe_layout_class (dest); + } + /* Case where SOURCE is a class type */ if (TYPE_CLASS_P (source)) {