diff --git a/flang/lib/Evaluate/variable.cpp b/flang/lib/Evaluate/variable.cpp --- a/flang/lib/Evaluate/variable.cpp +++ b/flang/lib/Evaluate/variable.cpp @@ -562,10 +562,17 @@ template std::optional Designator::GetType() const { if constexpr (IsLengthlessIntrinsicType) { - return {Result::GetType()}; - } else { - return DynamicType::From(GetLastSymbol()); + return Result::GetType(); + } else if (const Symbol * symbol{GetLastSymbol()}) { + return DynamicType::From(*symbol); + } else if constexpr (Result::category == TypeCategory::Character) { + if (const Substring * substring{std::get_if(&u)}) { + const auto *parent{substring->GetParentIf()}; + CHECK(parent); + return DynamicType{TypeCategory::Character, (*parent)->itemBytes()}; + } } + return std::nullopt; } static NamedEntity AsNamedEntity(const SymbolVector &x) { diff --git a/flang/test/Semantics/resolve49.f90 b/flang/test/Semantics/resolve49.f90 --- a/flang/test/Semantics/resolve49.f90 +++ b/flang/test/Semantics/resolve49.f90 @@ -11,6 +11,10 @@ ! Test substring program p2 + type t1(n1,n2) + integer,kind :: n1,n2 + integer :: c2(iachar('ABCDEFGHIJ'(n1:n1))) + end type character :: a(10) character :: b(5) integer :: n @@ -21,6 +25,7 @@ a(n:7) = b a(n+3:) = b a(:n+2) = b + n = iachar(1_'ABCDEFGHIJ'(1:1)) end ! Test pointer assignment with bounds