diff options
author | Janus Weil <janus@gcc.gnu.org> | 2016-12-13 15:28:17 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2016-12-13 15:28:17 +0100 |
commit | e4e659b947e64c015681361cbae571bf130d4c17 (patch) | |
tree | 16886e0e5dffba38ef9799f2e00573929fd4f3b8 /gcc/fortran/trans-io.c | |
parent | 68a08b7792102aa2851232eec19f5f68047d21ae (diff) | |
download | gcc-e4e659b947e64c015681361cbae571bf130d4c17.zip gcc-e4e659b947e64c015681361cbae571bf130d4c17.tar.gz gcc-e4e659b947e64c015681361cbae571bf130d4c17.tar.bz2 |
re PR fortran/78737 ([OOP] linking error with deferred, undefined user-defined derived-type I/O)
2016-12-13 Janus Weil <janus@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/78737
* gfortran.h (gfc_find_typebound_dtio_proc): New prototype.
* interface.c (gfc_compare_interfaces): Whitespace fix.
(gfc_find_typebound_dtio_proc): New function.
(gfc_find_specific_dtio_proc): Use it. Improve error recovery.
* trans-io.c (get_dtio_proc): Implement polymorphic calls to DTIO
procedures.
2016-12-13 Janus Weil <janus@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/78737
* gfortran.dg/dtio_19.f90: New test case.
Co-Authored-By: Paul Thomas <pault@gcc.gnu.org>
From-SVN: r243609
Diffstat (limited to 'gcc/fortran/trans-io.c')
-rw-r--r-- | gcc/fortran/trans-io.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 253a5ac..b60685e 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -2181,15 +2181,37 @@ get_dtio_proc (gfc_typespec * ts, gfc_code * code, gfc_symbol **dtio_sub) } if (ts->type == BT_DERIVED) - derived = ts->u.derived; - else - derived = ts->u.derived->components->ts.u.derived; + { + derived = ts->u.derived; + *dtio_sub = gfc_find_specific_dtio_proc (derived, last_dt == WRITE, + formatted); + + if (*dtio_sub) + return gfc_build_addr_expr (NULL, gfc_get_symbol_decl (*dtio_sub)); + } + else if (ts->type == BT_CLASS) + { + gfc_symtree *tb_io_st; - *dtio_sub = gfc_find_specific_dtio_proc (derived, last_dt == WRITE, - formatted); + derived = ts->u.derived->components->ts.u.derived; + tb_io_st = gfc_find_typebound_dtio_proc (derived, + last_dt == WRITE, formatted); + if (tb_io_st) + { + gfc_se se; + gfc_expr *expr = gfc_find_and_cut_at_last_class_ref (code->expr1); + gfc_add_vptr_component (expr); + gfc_add_component_ref (expr, + tb_io_st->n.tb->u.generic->specific_st->name); + *dtio_sub = tb_io_st->n.tb->u.generic->specific->u.specific->n.sym; + gfc_init_se (&se, NULL); + se.want_pointer = 1; + gfc_conv_expr (&se, expr); + gfc_free_expr (expr); + return se.expr; + } + } - if (*dtio_sub) - return gfc_build_addr_expr (NULL, gfc_get_symbol_decl (*dtio_sub)); return NULL_TREE; |