[flang-commits] [flang] [flang] Fix module file generation when generic shadows derived type (PR #78618)

via flang-commits flang-commits at lists.llvm.org
Thu Jan 18 12:28:37 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

<details>
<summary>Changes</summary>

Fortran allows the name of a generic interface to be the same as the name of a derived type or specific procedure.  When this happens, it causes the code in module file generation to miss the symbol of a derived type when scanning for symbols in initialization expressions that need to be imported.  Fix.

---
Full diff: https://github.com/llvm/llvm-project/pull/78618.diff


2 Files Affected:

- (modified) flang/lib/Semantics/mod-file.cpp (+7) 
- (added) flang/test/Semantics/modfile62.f90 (+31) 


``````````diff
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index ffdc3155f9a221..d7d8b6ea0d44b2 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -183,6 +183,13 @@ static void HarvestInitializerSymbols(
       if (symbol->scope()) {
         HarvestInitializerSymbols(set, *symbol->scope());
       }
+    } else if (const auto &generic{symbol->detailsIf<GenericDetails>()};
+               generic && generic->derivedType()) {
+      const Symbol &dtSym{*generic->derivedType()};
+      CHECK(dtSym.has<DerivedTypeDetails>());
+      if (dtSym.scope()) {
+        HarvestInitializerSymbols(set, *dtSym.scope());
+      }
     } else if (IsNamedConstant(*symbol) || scope.IsDerivedType()) {
       if (const auto *object{symbol->detailsIf<ObjectEntityDetails>()}) {
         if (object->init()) {
diff --git a/flang/test/Semantics/modfile62.f90 b/flang/test/Semantics/modfile62.f90
new file mode 100644
index 00000000000000..8a145bd4606047
--- /dev/null
+++ b/flang/test/Semantics/modfile62.f90
@@ -0,0 +1,31 @@
+! RUN: %python %S/test_modfile.py %s %flang_fc1
+module m
+  use iso_c_binding, only: c_ptr, c_null_ptr
+  type foo
+    type(c_ptr) :: p = c_null_ptr
+  end type
+  interface foo ! same name as derived type
+    procedure f
+  end interface
+ contains
+  type(foo) function f()
+  end
+end
+
+!Expect: m.mod
+!module m
+!use,intrinsic::__fortran_builtins,only:__builtin_c_ptr
+!use,intrinsic::iso_c_binding,only:c_ptr
+!use,intrinsic::iso_c_binding,only:c_null_ptr
+!private::__builtin_c_ptr
+!type::foo
+!type(c_ptr)::p=__builtin_c_ptr(__address=0_8)
+!end type
+!interface foo
+!procedure::f
+!end interface
+!contains
+!function f()
+!type(foo)::f
+!end
+!end

``````````

</details>


https://github.com/llvm/llvm-project/pull/78618


More information about the flang-commits mailing list