[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