diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -1067,7 +1067,8 @@ } } else if (auto *details{sym->detailsIf()}) { // 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 @@ } } 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 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -6431,6 +6431,18 @@ if (!base || !base->symbol) { return nullptr; } + if (auto *misc{base->symbol->detailsIf()}) { + 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() && !ConvertToObjectEntity(symbol)) { SayWithDecl(*base, symbol, @@ -6442,25 +6454,24 @@ 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()}) {