diff --git a/flang/lib/Parser/parsing.cpp b/flang/lib/Parser/parsing.cpp index 6b0119008dbf4..3ea14e934b178 100644 --- a/flang/lib/Parser/parsing.cpp +++ b/flang/lib/Parser/parsing.cpp @@ -35,9 +35,12 @@ const SourceFile *Parsing::Prescan(const std::string &path, Options options) { const SourceFile *sourceFile; if (path == "-") { sourceFile = allSources.ReadStandardInput(fileError); + } else if (options.isModuleFile) { + // Don't mess with intrinsic module search path + sourceFile = allSources.Open(path, fileError); } else { - std::optional currentDirectory{"."}; - sourceFile = allSources.Open(path, fileError, std::move(currentDirectory)); + sourceFile = + allSources.Open(path, fileError, "."s /*prepend to search path*/); } if (!fileError.str().empty()) { ProvenanceRange range{allSources.AddCompilerInsertion(path)}; diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index 2ba8918f88473..d97b81786e7fe 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -518,8 +518,14 @@ void ModFileWriter::PutGeneric(const Symbol &symbol) { void ModFileWriter::PutUse(const Symbol &symbol) { auto &details{symbol.get()}; auto &use{details.symbol()}; - uses_ << "use " << GetUsedModule(details).name(); - PutGenericName(uses_ << ",only:", symbol); + const Symbol &module{GetUsedModule(details)}; + if (use.owner().parent().IsIntrinsicModules()) { + uses_ << "use,intrinsic::"; + } else { + uses_ << "use "; + } + uses_ << module.name() << ",only:"; + PutGenericName(uses_, symbol); // Can have intrinsic op with different local-name and use-name // (e.g. `operator(<)` and `operator(.lt.)`) but rename is not allowed if (!IsIntrinsicOp(symbol) && use.name() != symbol.name()) { @@ -953,6 +959,7 @@ Scope *ModFileReader::Read(const SourceName &name, std::remove(options.searchDirectories.begin(), options.searchDirectories.end(), dir); } + options.searchDirectories.insert(options.searchDirectories.begin(), "."s); } if (isIntrinsic.value_or(true)) { for (const auto &dir : context_.intrinsicModuleDirectories()) { diff --git a/flang/test/Semantics/modfile36.f90 b/flang/test/Semantics/modfile36.f90 index b8dff4ce59978..bcdd559ad318c 100644 --- a/flang/test/Semantics/modfile36.f90 +++ b/flang/test/Semantics/modfile36.f90 @@ -14,7 +14,7 @@ subroutine s(x) !module m1 ! interface ! subroutine s(x) -! use iso_c_binding, only: c_ptr +! use,intrinsic::iso_c_binding, only: c_ptr ! type(c_ptr) :: x ! end ! end interface @@ -31,7 +31,7 @@ subroutine s(x) end module !Expect: m2.mod !module m2 -! use iso_c_binding,only:c_ptr +! use,intrinsic::iso_c_binding,only:c_ptr ! interface ! subroutine s(x) ! import::c_ptr