[Bug fortran/78661] [OOP] Namelist output missing object designator under DTIO
janus at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Dec 17 15:27:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78661
--- Comment #8 from janus at gcc dot gnu.org ---
This patch seems to produce the correct dump for the example in comment 7:
Index: gcc/fortran/trans-io.c
===================================================================
--- gcc/fortran/trans-io.c (revision 243773)
+++ gcc/fortran/trans-io.c (working copy)
@@ -1713,6 +1713,32 @@ transfer_namelist_element (stmtblock_t * block, co
vtable = gfc_build_addr_expr (pvoid_type_node, vtable);
}
}
+ else if (ts->type == BT_CLASS)
+ {
+ gfc_symbol *derived = ts->u.derived->components->ts.u.derived;
+ gfc_symtree *tb_io_st = gfc_find_typebound_dtio_proc (derived,
+ last_dt == WRITE,
true);
+ if (tb_io_st)
+ {
+ gfc_se se;
+ gfc_symtree *st = gfc_find_symtree (sym->ns->sym_root, sym->name);
+ // build vtable expr
+ gfc_expr *expr = gfc_get_variable_expr (st);
+ gfc_add_vptr_component (expr);
+ gfc_init_se (&se, NULL);
+ se.want_pointer = 1;
+ gfc_conv_expr (&se, expr);
+ vtable = se.expr;
+ // build dtio expr
+ gfc_add_component_ref (expr,
+ tb_io_st->n.tb->u.generic->specific_st->name);
+ gfc_init_se (&se, NULL);
+ se.want_pointer = 1;
+ gfc_conv_expr (&se, expr);
+ gfc_free_expr (expr);
+ dtio_proc = se.expr;
+ }
+ }
if (ts->type == BT_CHARACTER)
tmp = ts->u.cl->backend_decl;
The library call with this looks like:
_gfortran_st_set_nml_dtio_var (&dt_parm.3, &x, &"x"[1]{lb: 1 sz: 1}, 0, 0, 56,
x._vptr->write_formatted, (struct __vtype_m_T *) x._vptr);
That seems correct to me, but still the output is wrong:
&NML
X=�
/
So I guess something in the library still fails, and I already have a suspicion
...
More information about the Gcc-bugs
mailing list