From 6f300105d21e1f3bf7f0f92c2564c29f0cab8fb9 Mon Sep 17 00:00:00 2001 From: Tim Keith Date: Mon, 11 May 2020 13:28:05 -0700 Subject: [PATCH] [flang] Fix bug with IMPORT of USE of USE When a module contained an import of a use-association of a use-association, we weren't recognizing that the symbols was needed. The fix is the follow all of the use-associations using `GetUltimate()`. Differential Revision: https://reviews.llvm.org/D79737 --- flang/lib/Semantics/mod-file.cpp | 2 +- flang/test/Semantics/modfile36.f90 | 41 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 flang/test/Semantics/modfile36.f90 diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index d5b754816640..ca1704e8012c 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -833,7 +833,7 @@ void SubprogramSymbolCollector::Collect() { for (const auto &pair : scope_) { const Symbol &symbol{*pair.second}; if (const auto *useDetails{symbol.detailsIf()}) { - if (useSet_.count(useDetails->symbol()) > 0) { + if (useSet_.count(useDetails->symbol().GetUltimate()) > 0) { need_.push_back(symbol); } } diff --git a/flang/test/Semantics/modfile36.f90 b/flang/test/Semantics/modfile36.f90 new file mode 100644 index 000000000000..b111d9eb7a6e --- /dev/null +++ b/flang/test/Semantics/modfile36.f90 @@ -0,0 +1,41 @@ +! RUN: %S/test_modfile.sh %s %t %f18 + +! Check modfile that contains import of use-assocation of another use-association. + +module m1 + interface + subroutine s(x) + use, intrinsic :: iso_c_binding, only: c_ptr + type(c_ptr) :: x + end subroutine + end interface +end module +!Expect: m1.mod +!module m1 +! interface +! subroutine s(x) +! use iso_c_binding, only: c_ptr +! type(c_ptr) :: x +! end +! end interface +!end + +module m2 + use, intrinsic :: iso_c_binding, only: c_ptr + interface + subroutine s(x) + import :: c_ptr + type(c_ptr) :: x + end subroutine + end interface +end module +!Expect: m2.mod +!module m2 +! use iso_c_binding,only:c_ptr +! interface +! subroutine s(x) +! import::c_ptr +! type(c_ptr)::x +! end +! end interface +!end