}
static std::ostream &PutGenericName(std::ostream &os, const Symbol &symbol) {
- if (symbol.get<GenericDetails>().kind() == GenericKind::DefinedOp) {
+ const auto *details{symbol.GetUltimate().detailsIf<GenericDetails>()};
+ if (details && details->kind() == GenericKind::DefinedOp) {
return PutLower(os << "operator(", symbol) << ')';
} else {
return PutLower(os, symbol);
auto &details{symbol.get<UseDetails>()};
auto &use{details.symbol()};
PutLower(uses_ << "use ", details.module());
- PutLower(uses_ << ",only:", symbol);
+ PutGenericName(uses_ << ",only:", symbol);
if (use.name() != symbol.name()) {
- PutLower(uses_ << "=>", use);
+ PutGenericName(uses_ << "=>", use);
}
uses_ << '\n';
PutUseExtraAttr(Attr::VOLATILE, symbol, use);
! limitations under the License.
! Check modfile generation for generic interfaces
-module m
+module m1
interface foo
real function s1(x,y)
real x,y
integer x,y
end function
end
-!Expect: m.mod
-!module m
+!Expect: m1.mod
+!module m1
! interface foo
! procedure::s1
! procedure::s2
! end
!end
+module m1b
+ use m1
+end
+!Expect: m1b.mod
+!module m1b
+! use m1,only:foo
+! use m1,only:s1
+! use m1,only:s2
+! use m1,only:operator(+)
+! use m1,only:bar
+! use m1,only:operator(.bar.)
+! use m1,only:s3
+! use m1,only:s4
+!end
+
+module m1c
+ use m1, only: myfoo => foo
+ use m1, only: operator(.bar.)
+ use m1, only: operator(.mybar.) => operator(.bar.)
+ use m1, only: operator(+)
+end
+!Expect: m1c.mod
+!module m1c
+! use m1,only:myfoo=>foo
+! use m1,only:operator(.bar.)
+! use m1,only:operator(.mybar.)=>operator(.bar.)
+! use m1,only:operator(+)
+!end
+
module m2
interface foo
procedure foo