------- Comment #8 from janus at gcc dot gnu dot org 2010-03-07 14:07 -------
(In reply to comment #7)
> This leaves us with the following regressions:
>
> FAIL: gfortran.dg/dynamic_dispatch_1.f03 -O0 (test for excess errors)
> FAIL: gfortran.dg/dynamic_dispatch_3.f03 -O0 (test for excess errors)
> FAIL: gfortran.dg/dynamic_dispatch_4.f03 -O0 (test for excess errors)
> FAIL: gfortran.dg/dynamic_dispatch_6.f03 -O0 (test for excess errors)
>
> due to the error
>
> Error: Type mismatch in argument '...' at (1); passed CLASS(...) to CLASS(...)
These are resolved when adding to the patches in comment #3 and #7 the
following one:
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 157262)
+++ gcc/fortran/resolve.c (working copy)
@@ -5178,18 +5178,17 @@ check_class_members (gfc_symbol *derived)
return;
}
- if (tbp->n.tb->is_generic)
+ /* If we have to match a passed class member, force the actual
+ expression to have the correct type. */
+ if (!tbp->n.tb->nopass)
{
- /* If we have to match a passed class member, force the actual
- expression to have the correct type. */
- if (!tbp->n.tb->nopass)
- {
- if (e->value.compcall.base_object == NULL)
- e->value.compcall.base_object =
- extract_compcall_passed_object (e);
+ if (e->value.compcall.base_object == NULL)
+ e->value.compcall.base_object = extract_compcall_passed_object (e);
- e->value.compcall.base_object->ts.type = BT_DERIVED;
- e->value.compcall.base_object->ts.u.derived = derived;
+ if (!derived->attr.abstract)
+ {
+ e->value.compcall.base_object->ts.type = BT_DERIVED;
+ e->value.compcall.base_object->ts.u.derived = derived;
}
}
I hope that's it now. I'll do another regtest to make sure ...
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43256