diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -322,7 +322,11 @@ if (n++ > 0) { os << ','; } - os << dummy->name(); + if (dummy) { + os << dummy->name(); + } else { + os << "*"; + } } os << ')'; PutAttrs(os, bindAttrs, details.bindName(), " "s, ""s); @@ -825,7 +829,9 @@ const auto &details{symbol_.get()}; isInterface_ = details.isInterface(); for (const Symbol *dummyArg : details.dummyArgs()) { - DoSymbol(DEREF(dummyArg)); + if (dummyArg) { + DoSymbol(*dummyArg); + } } if (details.isFunction()) { DoSymbol(details.result()); diff --git a/flang/test/Semantics/modfile04.f90 b/flang/test/Semantics/modfile04.f90 --- a/flang/test/Semantics/modfile04.f90 +++ b/flang/test/Semantics/modfile04.f90 @@ -39,6 +39,15 @@ end end +! Module with a subroutine with alternate returns +module m3 +contains + subroutine altReturn(arg1, arg2, *, *) + real :: arg1 + real :: arg2 + end subroutine +end module m3 + !Expect: m1.mod !module m1 !type::t @@ -73,3 +82,12 @@ !complex(4)::x !end !end + +!Expect: m3.mod +!module m3 +!contains +!subroutine altreturn(arg1,arg2,*,*) +!real(4)::arg1 +!real(4)::arg2 +!end +!end