This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/51754] [OOP] ICE on valid with class arrays
- From: "burnus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 21 Jan 2012 18:28:46 +0000
- Subject: [Bug fortran/51754] [OOP] ICE on valid with class arrays
- Auto-submitted: auto-generated
- References: <bug-51754-4@http.gcc.gnu.org/bugzilla/>
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);