diff options
author | Peter Klausler <pklausler@nvidia.com> | 2022-05-30 12:47:32 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2022-06-03 22:07:44 -0700 |
commit | 15faac900d3b4fc17a04b3b9de421fab1bbe33db (patch) | |
tree | 204e6423b3a1b4b2bd0da870feaf7b12be7ed9fb | |
parent | 72f9c69421fce893ac9b4ca9144b064cddc79cd8 (diff) | |
download | llvm-15faac900d3b4fc17a04b3b9de421fab1bbe33db.zip llvm-15faac900d3b4fc17a04b3b9de421fab1bbe33db.tar.gz llvm-15faac900d3b4fc17a04b3b9de421fab1bbe33db.tar.bz2 |
[flang] Distinguish intrinsic module USE in module files; correct search paths
In the USE statements that f18 emits to module files, ensure that symbols
from intrinsic modules are marked as such on their USE statements. And
ensure that the current working directory (".") cannot override the intrinsic
module search path when trying to locate an intrinsic module.
Differential Revision: https://reviews.llvm.org/D127019
-rw-r--r-- | flang/lib/Parser/parsing.cpp | 7 | ||||
-rw-r--r-- | flang/lib/Semantics/mod-file.cpp | 11 | ||||
-rw-r--r-- | flang/test/Semantics/modfile36.f90 | 4 |
3 files changed, 16 insertions, 6 deletions
diff --git a/flang/lib/Parser/parsing.cpp b/flang/lib/Parser/parsing.cpp index 6b01190..3ea14e9 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<std::string> 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 2ba8918..d97b817 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<UseDetails>()}; 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 b8dff4c..bcdd559 100644 --- a/flang/test/Semantics/modfile36.f90 +++ b/flang/test/Semantics/modfile36.f90 @@ -14,7 +14,7 @@ end module !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 @@ module m2 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 |