[llvm-branch-commits] [flang] release/20.x: [flang] Fix missed case of symbol renaming in module file generation (#132475) (PR #133223)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Mar 27 02:36:26 PDT 2025
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
More information about the llvm-branch-commits
mailing list