[flang-commits] [flang] [Flang] Revise the fix in PR #81807 to get specific procedure from a potential generic name. (PR #81544)
Daniel Chen via flang-commits
flang-commits at lists.llvm.org
Wed Feb 21 14:37:21 PST 2024
https://github.com/DanielCChen updated https://github.com/llvm/llvm-project/pull/81544
>From a0875cd9636970774091e31395df2b56893e191a Mon Sep 17 00:00:00 2001
From: cdchen-ca <cdchen at ca.ibm.com>
Date: Mon, 12 Feb 2024 17:12:39 -0500
Subject: [PATCH 1/2] [Flang] Revise the fix in PR #81807 to get specific
procedure from a potential generic name.
---
flang/include/flang/Semantics/symbol.h | 13 +++++++++++++
flang/lib/Semantics/resolve-names.cpp | 6 ++++--
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index 4535a92ce3dd8e..0577cba9587d55 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -786,6 +786,9 @@ class Symbol {
inline Symbol &GetUltimate();
inline const Symbol &GetUltimate() const;
+ // Get the specific procedure from a potential generic symbol.
+ inline const Symbol *GetUltimateGeneric() const;
+
inline DeclTypeSpec *GetType();
inline const DeclTypeSpec *GetType() const;
void SetType(const DeclTypeSpec &);
@@ -985,6 +988,16 @@ inline const Symbol &Symbol::GetUltimate() const {
}
}
+inline const Symbol *Symbol::GetUltimateGeneric() const {
+ if (this->has<GenericDetails>())
+ return this;
+ if (const auto *details{detailsIf<UseDetails>()})
+ return details->symbol().GetUltimateGeneric();
+ if (const auto *details{detailsIf<HostAssocDetails>()})
+ return details->symbol().GetUltimateGeneric();
+ return nullptr;
+}
+
inline DeclTypeSpec *Symbol::GetType() {
return const_cast<DeclTypeSpec *>(
const_cast<const Symbol *>(this)->GetType());
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 36deab969456d0..0e21f3dabb6a01 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5644,12 +5644,14 @@ void DeclarationVisitor::Post(const parser::ProcInterface &x) {
NoteInterfaceName(*name);
}
}
+
void DeclarationVisitor::Post(const parser::ProcDecl &x) {
const auto &name{std::get<parser::Name>(x.t)};
const Symbol *procInterface{nullptr};
if (interfaceName_) {
- procInterface = interfaceName_->symbol->has<GenericDetails>()
- ? interfaceName_->symbol->get<GenericDetails>().specific()
+ const Symbol *ultimateGeneric{interfaceName_->symbol->GetUltimateGeneric()};
+ procInterface = ultimateGeneric
+ ? ultimateGeneric->get<GenericDetails>().specific()
: interfaceName_->symbol;
}
auto attrs{HandleSaveName(name.source, GetAttrs())};
>From 37073c3d86a170a7f5bf3cb6f481f1a781b34953 Mon Sep 17 00:00:00 2001
From: cdchen-ca <cdchen at ca.ibm.com>
Date: Tue, 13 Feb 2024 12:17:08 -0500
Subject: [PATCH 2/2] [Flang] Revert the fix of PR #80738 and re-implement it
in a different way by adding a GenericDetails in GetTypeImpl.
---
flang/include/flang/Semantics/symbol.h | 17 ++++-------------
flang/lib/Semantics/resolve-names.cpp | 6 +-----
2 files changed, 5 insertions(+), 18 deletions(-)
diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h
index 0577cba9587d55..595f09b3c5ec82 100644
--- a/flang/include/flang/Semantics/symbol.h
+++ b/flang/include/flang/Semantics/symbol.h
@@ -786,9 +786,6 @@ class Symbol {
inline Symbol &GetUltimate();
inline const Symbol &GetUltimate() const;
- // Get the specific procedure from a potential generic symbol.
- inline const Symbol *GetUltimateGeneric() const;
-
inline DeclTypeSpec *GetType();
inline const DeclTypeSpec *GetType() const;
void SetType(const DeclTypeSpec &);
@@ -988,16 +985,6 @@ inline const Symbol &Symbol::GetUltimate() const {
}
}
-inline const Symbol *Symbol::GetUltimateGeneric() const {
- if (this->has<GenericDetails>())
- return this;
- if (const auto *details{detailsIf<UseDetails>()})
- return details->symbol().GetUltimateGeneric();
- if (const auto *details{detailsIf<HostAssocDetails>()})
- return details->symbol().GetUltimateGeneric();
- return nullptr;
-}
-
inline DeclTypeSpec *Symbol::GetType() {
return const_cast<DeclTypeSpec *>(
const_cast<const Symbol *>(this)->GetType());
@@ -1027,6 +1014,10 @@ inline const DeclTypeSpec *Symbol::GetTypeImpl(int depth) const {
[&](const HostAssocDetails &x) {
return x.symbol().GetTypeImpl(depth);
},
+ [&](const GenericDetails &x) {
+ const Symbol *symbol{x.specific()};
+ return symbol ? symbol->GetTypeImpl(depth) : nullptr;
+ },
[](const auto &) -> const DeclTypeSpec * { return nullptr; },
},
details_);
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 0e21f3dabb6a01..6914f95837f676 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5644,15 +5644,11 @@ void DeclarationVisitor::Post(const parser::ProcInterface &x) {
NoteInterfaceName(*name);
}
}
-
void DeclarationVisitor::Post(const parser::ProcDecl &x) {
const auto &name{std::get<parser::Name>(x.t)};
const Symbol *procInterface{nullptr};
if (interfaceName_) {
- const Symbol *ultimateGeneric{interfaceName_->symbol->GetUltimateGeneric()};
- procInterface = ultimateGeneric
- ? ultimateGeneric->get<GenericDetails>().specific()
- : interfaceName_->symbol;
+ procInterface = interfaceName_->symbol;
}
auto attrs{HandleSaveName(name.source, GetAttrs())};
DerivedTypeDetails *dtDetails{nullptr};
More information about the flang-commits
mailing list