aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2022-05-30 12:47:32 -0700
committerPeter Klausler <pklausler@nvidia.com>2022-06-03 22:07:44 -0700
commit15faac900d3b4fc17a04b3b9de421fab1bbe33db (patch)
tree204e6423b3a1b4b2bd0da870feaf7b12be7ed9fb
parent72f9c69421fce893ac9b4ca9144b064cddc79cd8 (diff)
downloadllvm-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.cpp7
-rw-r--r--flang/lib/Semantics/mod-file.cpp11
-rw-r--r--flang/test/Semantics/modfile36.f904
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