From 0b130278a0eb1250e66d57e3c74253d4f0080106 Mon Sep 17 00:00:00 2001 From: Tim Keith Date: Fri, 6 Mar 2020 17:05:04 -0800 Subject: [PATCH] [flang] Fix handling of DataRef when analyzing CoindexedNamedObject As we loop through the Components, maintain a pointer to the current DataRef rather than moving it. This is more efficient and the previous behavior caused illegal memory accesses. Original-commit: flang-compiler/f18@cede2971ff863b8dd6a2c8727f6566a444ac7a52 Reviewed-on: https://github.com/flang-compiler/f18/pull/1050 Tree-same-pre-rewrite: false --- flang/lib/Semantics/expression.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 2e13b21..dd016f9 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -1023,22 +1023,23 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::StructureComponent &sc) { } MaybeExpr ExpressionAnalyzer::Analyze(const parser::CoindexedNamedObject &x) { - if (auto dataRef{ExtractDataRef(Analyze(x.base))}) { + if (auto maybeDataRef{ExtractDataRef(Analyze(x.base))}) { + DataRef *dataRef{&*maybeDataRef}; std::vector subscripts; SymbolVector reversed; if (auto *aRef{std::get_if(&dataRef->u)}) { subscripts = std::move(aRef->subscript()); reversed.push_back(aRef->GetLastSymbol()); if (Component * component{aRef->base().UnwrapComponent()}) { - *dataRef = std::move(component->base()); + dataRef = &component->base(); } else { - dataRef.reset(); + dataRef = nullptr; } } if (dataRef) { while (auto *component{std::get_if(&dataRef->u)}) { reversed.push_back(component->GetLastSymbol()); - *dataRef = std::move(component->base()); + dataRef = &component->base(); } if (auto *baseSym{std::get_if(&dataRef->u)}) { reversed.push_back(*baseSym); @@ -2502,7 +2503,7 @@ bool ExpressionAnalyzer::EnforceTypeConstraint(parser::CharBlock at, const MaybeExpr &result, TypeCategory category, bool defaultKind) { if (result) { if (auto type{result->GetType()}) { - if (type->category() != category) { // C885 + if (type->category() != category) { // C885 Say(at, "Must have %s type, but is %s"_err_en_US, ToUpperCase(EnumToString(category)), ToUpperCase(type->AsFortran())); -- 2.7.4