[flang-commits] [flang] 9f5f2eb - [flang] Accept %KIND type parameter inquiries on %RE, %IM, &c.
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Apr 15 20:26:52 PDT 2022
Author: Peter Klausler
Date: 2022-04-15T20:22:03-07:00
New Revision: 9f5f2eb2a1085d49afbf9e6912086c6a3b5e6a95
URL: https://github.com/llvm/llvm-project/commit/9f5f2eb2a1085d49afbf9e6912086c6a3b5e6a95
DIFF: https://github.com/llvm/llvm-project/commit/9f5f2eb2a1085d49afbf9e6912086c6a3b5e6a95.diff
LOG: [flang] Accept %KIND type parameter inquiries on %RE,%IM, &c.
The x%KIND inquiry needs to be supported when 'x' is itself
a complex part reference or a type parameter inquiry.
Differential Revision: https://reviews.llvm.org/D123733
Added:
Modified:
flang/lib/Semantics/expression.cpp
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index e276fbbd6cb17..bb8e6a534d960 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -1067,7 +1067,8 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::StructureComponent &sc) {
}
} else if (auto *details{sym->detailsIf<semantics::MiscDetails>()}) {
// special part-ref: %re, %im, %kind, %len
- // Type errors are detected and reported in semantics.
+ // Type errors on the base of %re/%im/%len are detected and
+ // reported in name resolution.
using MiscKind = semantics::MiscDetails::Kind;
MiscKind kind{details->kind()};
if (kind == MiscKind::ComplexPartRe || kind == MiscKind::ComplexPartIm) {
@@ -1088,7 +1089,6 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::StructureComponent &sc) {
}
} else if (kind == MiscKind::KindParamInquiry ||
kind == MiscKind::LenParamInquiry) {
- // Convert x%KIND -> intrinsic KIND(x), x%LEN -> intrinsic LEN(x)
ActualArgument arg{std::move(*base)};
SetArgSourceLocation(arg, name);
return MakeFunctionRef(name, ActualArguments{std::move(arg)});
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 85b5f3a9c6080..8fd25bd8cdd9c 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -6431,6 +6431,18 @@ const parser::Name *DeclarationVisitor::FindComponent(
if (!base || !base->symbol) {
return nullptr;
}
+ if (auto *misc{base->symbol->detailsIf<MiscDetails>()}) {
+ if (component.source == "kind") {
+ if (misc->kind() == MiscDetails::Kind::ComplexPartRe ||
+ misc->kind() == MiscDetails::Kind::ComplexPartIm ||
+ misc->kind() == MiscDetails::Kind::KindParamInquiry ||
+ misc->kind() == MiscDetails::Kind::LenParamInquiry) {
+ // x%{re,im,kind,len}%kind
+ MakePlaceholder(component, MiscDetails::Kind::KindParamInquiry);
+ return &component;
+ }
+ }
+ }
auto &symbol{base->symbol->GetUltimate()};
if (!symbol.has<AssocEntityDetails>() && !ConvertToObjectEntity(symbol)) {
SayWithDecl(*base, symbol,
@@ -6442,25 +6454,24 @@ const parser::Name *DeclarationVisitor::FindComponent(
return nullptr; // should have already reported error
}
if (const IntrinsicTypeSpec * intrinsic{type->AsIntrinsic()}) {
- auto name{component.ToString()};
auto category{intrinsic->category()};
MiscDetails::Kind miscKind{MiscDetails::Kind::None};
- if (name == "kind") {
+ if (component.source == "kind") {
miscKind = MiscDetails::Kind::KindParamInquiry;
} else if (category == TypeCategory::Character) {
- if (name == "len") {
+ if (component.source == "len") {
miscKind = MiscDetails::Kind::LenParamInquiry;
}
} else if (category == TypeCategory::Complex) {
- if (name == "re") {
+ if (component.source == "re") {
miscKind = MiscDetails::Kind::ComplexPartRe;
- } else if (name == "im") {
+ } else if (component.source == "im") {
miscKind = MiscDetails::Kind::ComplexPartIm;
}
}
if (miscKind != MiscDetails::Kind::None) {
MakePlaceholder(component, miscKind);
- return nullptr;
+ return &component;
}
} else if (const DerivedTypeSpec * derived{type->AsDerived()}) {
if (const Scope * scope{derived->scope()}) {
More information about the flang-commits
mailing list