[flang-commits] [flang] 3411263 - [flang] Ensure USE associations of shadowed procedures are emitted to module files

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Thu Oct 6 11:27:08 PDT 2022


Author: Peter Klausler
Date: 2022-10-06T11:25:50-07:00
New Revision: 3411263dde4f3c49356b8433336f25a73dc4844c

URL: https://github.com/llvm/llvm-project/commit/3411263dde4f3c49356b8433336f25a73dc4844c
DIFF: https://github.com/llvm/llvm-project/commit/3411263dde4f3c49356b8433336f25a73dc4844c.diff

LOG: [flang] Ensure USE associations of shadowed procedures are emitted to module files

When a generic interface in a module shadows a procedure of the same name that
has been brought into scope via USE association, ensure that that USE association is
not lost when the module file is written.

Differential Revision: https://reviews.llvm.org/D135207

Added: 
    flang/test/Semantics/modfile52.f90

Modified: 
    flang/lib/Semantics/resolve-names.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 51e07675c0321..e748e41908e1f 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -2829,7 +2829,7 @@ void ModuleVisitor::DoAddUse(SourceName location, SourceName localName,
       } else {
         return;
       }
-    } else if (&useUltimate == &BypassGeneric(localUltimate)) {
+    } else if (&useUltimate == &BypassGeneric(localUltimate).GetUltimate()) {
       return; // nothing to do; used subprogram is local's specific
     }
   } else if (useGeneric) {
@@ -3230,7 +3230,7 @@ void InterfaceVisitor::CheckGenericProcedures(Symbol &generic) {
     SayDerivedType(generic.name(),
         "Generic interface '%s' may only contain functions due to derived type"
         " with same name"_err_en_US,
-        *details.derivedType()->scope());
+        *details.derivedType()->GetUltimate().scope());
   }
   generic.set(isFunction ? Symbol::Flag::Function : Symbol::Flag::Subroutine);
 }
@@ -7259,9 +7259,9 @@ void ResolveNamesVisitor::CreateGeneric(const parser::GenericSpec &x) {
       }
     } else if (ultimate.has<SubprogramDetails>() ||
         ultimate.has<SubprogramNameDetails>()) {
-      genericDetails.set_specific(ultimate);
+      genericDetails.set_specific(*existing);
     } else if (ultimate.has<DerivedTypeDetails>()) {
-      genericDetails.set_derivedType(ultimate);
+      genericDetails.set_derivedType(*existing);
     } else {
       SayAlreadyDeclared(symbolName, *existing);
       return;

diff  --git a/flang/test/Semantics/modfile52.f90 b/flang/test/Semantics/modfile52.f90
new file mode 100644
index 0000000000000..cec00cb8a38c7
--- /dev/null
+++ b/flang/test/Semantics/modfile52.f90
@@ -0,0 +1,59 @@
+! RUN: %python %S/test_modfile.py %s %flang_fc1
+! Ensure that procedure name or derived type name that has been shadowed
+! behind a generic interface gets its proper USE statement in a module file.
+module m1
+ contains
+  subroutine foo
+  end subroutine
+end module
+module m2
+  use m1
+  interface foo
+    procedure foo
+  end interface
+end module
+module m3
+  type foo
+  end type
+end module
+module m4
+  use m4
+  interface foo
+    procedure bar
+  end interface
+ contains
+  integer function bar
+  end function
+end module
+
+!Expect: m1.mod
+!module m1
+!contains
+!subroutine foo()
+!end
+!end
+
+!Expect: m2.mod
+!module m2
+!use m1,only:foo
+!interface foo
+!procedure::foo
+!end interface
+!end
+
+!Expect: m3.mod
+!module m3
+!type::foo
+!end type
+!end
+
+!Expect: m4.mod
+!module m4
+!interface foo
+!procedure::bar
+!end interface
+!contains
+!function bar()
+!integer(4)::bar
+!end
+!end


        


More information about the flang-commits mailing list