On Thu, Dec 06, 2018 at 08:02:43PM +0100, Thomas Koenig wrote: > Hi Steve, > > >>> PR fortran/88139 > >>> * dump-parse-tree.c (write_proc): Alternate return. > >> I dissent with this patch. The introduced error is meaningless and, as > >> mentioned by comment #3 in the PR, avoiding the ICE in dump-parse-tree > >> is not directly the issue. The code should be rejected in parsing. In > >> gcc-8.1 the invalid code is accepted (without an ICE) even without the > >> -fc-prototypes flag: I haven't finished building the compiler with > >> your changes yet to see whether that is still true afterwards, but at > >> least the test case doesn't try this, so I strongly suspect the patch > >> is incomplete to fix the PR. > > > > Comment #3 does not contain a patch to fix the problem elsewhere. > > I know :-) > > > In F2003, 15.2.6 "Interoperability of procedures and procedure interfaces", > > I cannot find a prohibition on an alternate return in a subroutine > > interface with BIND(C). > > I also does not allow this, and does not offer a valid interpretation > of what it should mean. > > If it has a meaning, it should be translatable into something prescribed > by the standard with -fc-prototypes. > > I have assigned the error to myself, so I will not forget to fix > it before the gcc 9 release.
I think it comes down to F2018, 18.3.7, where one has A Fortran procedure interface is interoperable with a C functioni prototype if (1) ... (2) ... (3) ... (4) ... (5) any dummy argument without the VALUE attribute corresponds to a formal parameter of the prototype that is of a pointer type, and either (4 bullets which cannot be satisfied). I suppose we should check what other compilers do on the testcase, but I only have access to gfortran. BTW, write_proc() starts to write out the prototype before the argument list is checked. If the current gfc_error is trigger, you get void foo (Error: Cannot convert %qs to interoperable type... I think you want to scan the formal argument list for errors before writing out "void foo (". -- Steve