https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92621
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org --- Comment #19 from Tobias Burnus <burnus at gcc dot gnu.org> --- Created attachment 51289 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51289&action=edit Patch - Free memory in the callee The attached patch frees the memory in the callee, however: * integer, allocatable – those are passed as 'integer **dummy' I believe those should be passed as CFI descriptor -> runs into the assert. * In the Fortran caller, the freeing is not needed if the the implementation is in Fortran as the callee frees this. In principle, something like the following should work (trans-expr; there is one case for scalar and one for arrays): @@ -6541 +6548,3 @@ gfc_conv_procedure_call - && fsym->attr.intent == INTENT_OUT) + && fsym->attr.intent == INTENT_OUT + && (!sym->attr.is_bind_c + || sym->attr.if_source != IFSRC_DECL)) However, that does not work – and shows that the gfortran → CFI conversion is completely broken: void * cfi.0; if (cfi.0 != 0B) { __builtin_free (cfi.0); That's uninitialized memory :-( * Also broken is that the data type for BIND(C) uses the Fortran array descriptor and not the CFI one – it is currently only used as pointer and later cast to void* but still that's pretty bad :-( * * * I have still to look at José's patches. * * * In any case, I think that the TYPE handling needs to be fixed first, followed by moving _gfortran_gfc_desc_to_cfi_desc (and cfi→gfc) from libgfortran to the front end to generate proper context-aware in-line code.