This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi all, here is a patch for PR 41873, which also fixes a part of PR 41556. The problem was that a check, which prevents abstract interfaces from being called, falsely triggered an error for deferred type-bound procedures with abstract interface. My solution to this may be a bit hackish, but it works very good in practice: To distinguish both cases I simply check certain fields, which are always set for the TBP case, but not for plain abstract interfaces. When working on this PR, I also noticed that the check for calling abstract subroutines was missing completely (only functions were checked), so I also added this (again distinguishing TBPs). The patch regtests without failures on x86_64-unknown-linux-gnu. Ok for trunk? Cheers, Janus 2009-11-04 Janus Weil <janus@gcc.gnu.org> PR fortran/41556 PR fortran/41873 * resolve.c (resolve_function,resolve_call): Prevent abstract interfaces from being called, but allow deferred type-bound procedures with abstract interface. 2009-11-04 Janus Weil <janus@gcc.gnu.org> PR fortran/41556 PR fortran/41873 * gfortran.dg/interface_abstract_4.f90: New test.
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 153911)
+++ gcc/fortran/resolve.c (working copy)
@@ -2526,7 +2526,9 @@ resolve_function (gfc_expr *expr)
return FAILURE;
}
- if (sym && sym->attr.abstract)
+ /* If this ia a deferred TBP with an abstract interface (which may
+ of course be referenced), expr->value.function.name will be set. */
+ if (sym && sym->attr.abstract && !expr->value.function.name)
{
gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
sym->name, &expr->where);
@@ -3138,6 +3140,15 @@ resolve_call (gfc_code *c)
}
}
+ /* If this ia a deferred TBP with an abstract interface
+ (which may of course be referenced), c->expr1 will be set. */
+ if (csym && csym->attr.abstract && !c->expr1)
+ {
+ gfc_error ("ABSTRACT INTERFACE '%s' must not be referenced at %L",
+ csym->name, &c->loc);
+ return FAILURE;
+ }
+
/* Subroutines without the RECURSIVE attribution are not allowed to
* call themselves. */
if (csym && is_illegal_recursion (csym, gfc_current_ns))
Attachment:
interface_abstract_4.f90
Description: Binary data
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |