llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-flang-semantics Author: None (llvmbot) <details> <summary>Changes</summary> Backport 6df27dd42d827a2468dcf4b4b1ee1a8e8af1a408 Requested by: @<!-- -->pawosm-arm --- Full diff: https://github.com/llvm/llvm-project/pull/133223.diff 3 Files Affected: - (modified) flang/lib/Evaluate/formatting.cpp (+2-1) - (modified) flang/lib/Semantics/mod-file.cpp (+1-1) - (added) flang/test/Semantics/bug132435.f90 (+85) ``````````diff diff --git a/flang/lib/Evaluate/formatting.cpp b/flang/lib/Evaluate/formatting.cpp index f3a53c1f983df..cf0b43bc94c36 100644 --- a/flang/lib/Evaluate/formatting.cpp +++ b/flang/lib/Evaluate/formatting.cpp @@ -129,7 +129,8 @@ llvm::raw_ostream &Constant<Type<TypeCategory::Character, KIND>>::AsFortran( llvm::raw_ostream &EmitVar(llvm::raw_ostream &o, const Symbol &symbol, std::optional<parser::CharBlock> name = std::nullopt) { const auto &renamings{symbol.owner().context().moduleFileOutputRenamings()}; - if (auto iter{renamings.find(&symbol)}; iter != renamings.end()) { + if (auto iter{renamings.find(&symbol.GetUltimate())}; + iter != renamings.end()) { return o << iter->second.ToString(); } else if (name) { return o << name->ToString(); diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index b45f1c060da2f..ea3eae8468b50 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -346,7 +346,7 @@ void ModFileWriter::PrepareRenamings(const Scope &scope) { uses_ << DEREF(sMod->symbol()).name() << ",only:"; if (rename != s->name()) { uses_ << rename << "=>"; - renamings.emplace(&*s, rename); + renamings.emplace(&s->GetUltimate(), rename); } uses_ << s->name() << '\n'; useExtraAttrs_ << "private::" << rename << '\n'; diff --git a/flang/test/Semantics/bug132435.f90 b/flang/test/Semantics/bug132435.f90 new file mode 100644 index 0000000000000..be8b661fcf6cc --- /dev/null +++ b/flang/test/Semantics/bug132435.f90 @@ -0,0 +1,85 @@ +! RUN: %python %S/test_modfile.py %s %flang_fc1 +module m1 + type foo + integer :: c1 = 123 + end type +end + +module m2 + use m1, only: foo + type baz + type(foo) :: d = foo() + end type + type bar + type(baz) :: e = baz() + end type +end + +module m3 + use m1, only: m1foo => foo + type foo + type(m1foo), private :: c2 = m1foo() + end type +end + +module m4 + use m2, only: m3foo => foo + type foo + type(m3foo), private :: c3 = m3foo() + end type +end + +module m5 + use m2, only: m2bar => bar + use m4, only: foo + type blah + type(m2bar) :: f = m2bar() + end type +end + +!Expect: m1.mod +!module m1 +!type::foo +!integer(4)::c1=123_4 +!end type +!end + +!Expect: m2.mod +!module m2 +!use m1,only:foo +!type::baz +!type(foo)::d=foo(c1=123_4) +!end type +!type::bar +!type(baz)::e=baz(d=foo(c1=123_4)) +!end type +!end + +!Expect: m3.mod +!module m3 +!use m1,only:m1foo=>foo +!type::foo +!type(m1foo),private::c2=m1foo(c1=123_4) +!end type +!end + +!Expect: m4.mod +!module m4 +!use m2,only:m3foo=>foo +!type::foo +!type(m3foo),private::c3=m3foo(c1=123_4) +!end type +!end + +!Expect: m5.mod +!module m5 +!use m2,only:m2$foo=>foo +!use m2,only:baz +!use m2,only:m2bar=>bar +!use m4,only:foo +!private::m2$foo +!private::baz +!type::blah +!type(m2bar)::f=m2bar(e=baz(d=m2$foo(c1=123_4))) +!end type +!end `````````` </details> https://github.com/llvm/llvm-project/pull/133223 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits