http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51754
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org --- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-01-21 18:28:46 UTC --- TODO: The ICE for the valid code (gfc_conv_descriptor_offset). This comment is for the second issue: (In reply to comment #0) > If I remove the "allocatable" I instead get: > $ gfortran -c test.F90 -o test.o > f951: internal compiler error: Segmentation fault Draft patch - for some reason, two error messages are printed for the line class(componentB), dimension(:) :: componentB The change in gfc_default_initializer fixes the initial issue (and causes the duplicated error message be printed in resolve.c) [Before, resolve was not reached as the function was already called during variable declaration.] -- The other parts are to avoid later segfault ("error recovery"). --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3761,3 +3761,9 @@ gfc_default_initializer (gfc_typespec *ts) - if (comp->initializer || comp->attr.allocatable - || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable)) - break; + { + if (comp->ts.type == BT_CLASS && !comp->attr.class_ok) + return NULL; + + if (comp->initializer || comp->attr.allocatable + || (comp->ts.type == BT_CLASS + && CLASS_DATA (comp)->attr.allocatable)) + break; + } --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -2020 +2020 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag, - else if (component->ts.type == BT_CLASS + else if (component->ts.type == BT_CLASS && component->attr.class_ok @@ -2188 +2188 @@ gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts) - if (comp->ts.type == BT_CLASS) + if (comp->ts.type == BT_CLASS && comp->attr.class_ok) --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -4836,2 +4836,2 @@ gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2) - bool is_class1 = (ts1->type == BT_CLASS); - bool is_class2 = (ts2->type == BT_CLASS); + bool is_class1 = (ts1->type == BT_CLASS && ts1->u.derived->attr.class_ok); + bool is_class2 = (ts2->type == BT_CLASS && ts2->u.derived->attr.class_ok);