[flang-commits] [flang] [flang] Improve error messages for module self-USE (PR #122747)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Mon Jan 13 09:18:55 PST 2025
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/122747
A module can't USE itself, either directly within the top-level module or from one of its submodules. Add a test for this case (which we already caught), and improve the diagnostic for the more confusing case involving a submodule.
>From 34bfdabf063d8beba37648db29ae03568bc7193c Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Mon, 13 Jan 2025 09:15:36 -0800
Subject: [PATCH] [flang] Improve error messages for module self-USE
A module can't USE itself, either directly within the top-level
module or from one of its submodules. Add a test for this case
(which we already caught), and improve the diagnostic for the
more confusing case involving a submodule.
---
flang/include/flang/Semantics/tools.h | 1 +
flang/lib/Semantics/resolve-names.cpp | 22 ++++++++++++++++------
flang/lib/Semantics/tools.cpp | 6 ++++++
flang/test/Semantics/self-use.f90 | 27 +++++++++++++++++++++++++++
4 files changed, 50 insertions(+), 6 deletions(-)
create mode 100644 flang/test/Semantics/self-use.f90
diff --git a/flang/include/flang/Semantics/tools.h b/flang/include/flang/Semantics/tools.h
index 96d4dbb2acaa11..1abe6cbffcf2eb 100644
--- a/flang/include/flang/Semantics/tools.h
+++ b/flang/include/flang/Semantics/tools.h
@@ -42,6 +42,7 @@ const Scope &GetProgramUnitOrBlockConstructContaining(const Scope &);
const Scope &GetProgramUnitOrBlockConstructContaining(const Symbol &);
const Scope *FindModuleContaining(const Scope &);
+const Scope *FindModuleOrSubmoduleContaining(const Scope &);
const Scope *FindModuleFileContaining(const Scope &);
const Scope *FindPureProcedureContaining(const Scope &);
const Scope *FindOpenACCConstructContaining(const Scope *);
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 724f1b28078356..f406a80f0cd312 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -3607,13 +3607,23 @@ Scope *ModuleVisitor::FindModule(const parser::Name &name,
ModFileReader reader{context()};
Scope *scope{
reader.Read(name.source, isIntrinsic, ancestor, /*silent=*/false)};
- if (!scope) {
- return nullptr;
- }
- if (DoesScopeContain(scope, currScope())) { // 14.2.2(1)
- Say(name, "Module '%s' cannot USE itself"_err_en_US);
+ if (scope) {
+ if (DoesScopeContain(scope, currScope())) { // 14.2.2(1)
+ std::optional<SourceName> submoduleName;
+ if (const Scope * container{FindModuleOrSubmoduleContaining(currScope())};
+ container && container->IsSubmodule()) {
+ submoduleName = container->GetName();
+ }
+ if (submoduleName) {
+ Say(name.source,
+ "Module '%s' cannot USE itself from its own submodule '%s'"_err_en_US,
+ name.source, *submoduleName);
+ } else {
+ Say(name, "Module '%s' cannot USE itself"_err_en_US);
+ }
+ }
+ Resolve(name, scope->symbol());
}
- Resolve(name, scope->symbol());
return scope;
}
diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 9e180605c1b3bd..e13ee6cfd509d0 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -52,6 +52,12 @@ const Scope *FindModuleContaining(const Scope &start) {
start, [](const Scope &scope) { return scope.IsModule(); });
}
+const Scope *FindModuleOrSubmoduleContaining(const Scope &start) {
+ return FindScopeContaining(start, [](const Scope &scope) {
+ return scope.IsModule() || scope.IsSubmodule();
+ });
+}
+
const Scope *FindModuleFileContaining(const Scope &start) {
return FindScopeContaining(
start, [](const Scope &scope) { return scope.IsModuleFile(); });
diff --git a/flang/test/Semantics/self-use.f90 b/flang/test/Semantics/self-use.f90
new file mode 100644
index 00000000000000..4bc66a24343c6a
--- /dev/null
+++ b/flang/test/Semantics/self-use.f90
@@ -0,0 +1,27 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+module m
+ interface
+ module subroutine separate
+ end
+ end interface
+ contains
+ subroutine modsub
+ !ERROR: Module 'm' cannot USE itself
+ use m
+ end
+end
+
+submodule(m) submod1
+ contains
+ module subroutine separate
+ !ERROR: Module 'm' cannot USE itself from its own submodule 'submod1'
+ !ERROR: Cannot use-associate 'separate'; it is already declared in this scope
+ use m
+ end
+end
+
+submodule(m) submod2
+ !ERROR: Module 'm' cannot USE itself from its own submodule 'submod2'
+ use m
+end
+
More information about the flang-commits
mailing list