From: Pete Steinfeld Date: Tue, 26 May 2020 22:12:15 +0000 (-0700) Subject: [flang] Fixed crash on forward referenced `len` parameter X-Git-Tag: llvmorg-12-init~4092 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1746c8ed2660c83895c79de94453f44f8e729a94;p=platform%2Fupstream%2Fllvm.git [flang] Fixed crash on forward referenced `len` parameter Summary: Using a forward reference to define a `len` parameter causes a crash. The underlying cause was that a previously declared type had an erroneous expression for its `LEN` param value. When this expression was referenced to evaluate a subsequent expression, bad things happened. I fixed this by putting in code to detect this case. Reviewers: tskeith, klausler, DavidTruby Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D80593 --- diff --git a/flang/lib/Evaluate/variable.cpp b/flang/lib/Evaluate/variable.cpp index c7b261d..3a6cf56 100644 --- a/flang/lib/Evaluate/variable.cpp +++ b/flang/lib/Evaluate/variable.cpp @@ -257,8 +257,14 @@ DescriptorInquiry::DescriptorInquiry(NamedEntity &&base, Field field, int dim) static std::optional> SymbolLEN(const Symbol &sym) { if (auto dyType{DynamicType::From(sym)}) { if (const semantics::ParamValue * len{dyType->charLength()}) { - if (auto intExpr{len->GetExplicit()}) { - return ConvertToType(*std::move(intExpr)); + if (len->isExplicit()) { + if (auto intExpr{len->GetExplicit()}) { + return ConvertToType(*std::move(intExpr)); + } else { + // There was an error constructing this symbol's type. It should + // have a length expression, but we couldn't retrieve it + return std::nullopt; + } } else { return Expr{ DescriptorInquiry{NamedEntity{sym}, DescriptorInquiry::Field::Len}}; diff --git a/flang/test/Semantics/resolve91.f90 b/flang/test/Semantics/resolve91.f90 index f55ca86..0a375b873a 100644 --- a/flang/test/Semantics/resolve91.f90 +++ b/flang/test/Semantics/resolve91.f90 @@ -44,3 +44,10 @@ module m4 real, dimension(:), pointer :: realArray => localArray end type end module m4 + +module m5 + !ERROR: Actual argument for 'string=' has bad type 'REAL(4)' + character(len=len(a)) :: b + !ERROR: The type of 'a' has already been implicitly declared + character(len=len(b)) :: a +end module m5