From a3f4eedea750c3d7b322f47306ad4960e9b4a2be Mon Sep 17 00:00:00 2001 From: peter klausler Date: Tue, 14 Jan 2020 15:08:37 -0800 Subject: [PATCH] [flang] Better fix; clean up redundant utilities Original-commit: flang-compiler/f18@531db4932155f53f14805b8a6617e31803ab6435 Reviewed-on: https://github.com/flang-compiler/f18/pull/926 Tree-same-pre-rewrite: false --- flang/lib/semantics/resolve-names.cc | 18 +++++++++++------- flang/lib/semantics/tools.cc | 21 ++++----------------- flang/lib/semantics/tools.h | 1 - 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index 05d0c30..002024a 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -4617,14 +4617,18 @@ bool ConstructVisitor::Pre(const parser::DataStmtObject &x) { common::visitors{ [&](const Indirection &y) { Walk(y.value()); - if (auto expr{AnalyzeExpr(context(), y)}) { - if (auto dataRef{evaluate::ExtractDataRef(*expr)}) { - const_cast(dataRef->GetFirstSymbol()) - .set(Symbol::Flag::InDataStmt); - // TODO check C875-C881 here? - } else { - // TODO C875 error: variable is not a designator + if (const auto *designator{ + std::get_if>( + &y.value().u)}) { + if (const parser::Name * + name{ResolveDesignator(designator->value())}) { + if (name->symbol) { + name->symbol->set(Symbol::Flag::InDataStmt); + } } + // TODO check C874 - C881 + } else { + // TODO report C875 error: variable is not a designator here? } }, [&](const parser::DataImpliedDo &y) { diff --git a/flang/lib/semantics/tools.cc b/flang/lib/semantics/tools.cc index 307e307..18c5c82 100644 --- a/flang/lib/semantics/tools.cc +++ b/flang/lib/semantics/tools.cc @@ -22,25 +22,12 @@ namespace Fortran::semantics { -static const Symbol *FindCommonBlockInScope( - const Scope &scope, const Symbol &object) { - for (const auto &pair : scope.commonBlocks()) { - const Symbol &block{*pair.second}; - if (IsCommonBlockContaining(block, object)) { - return █ - } - } - return nullptr; -} - const Symbol *FindCommonBlockContaining(const Symbol &object) { - for (const Scope *scope{&object.owner()}; !scope->IsGlobal(); - scope = &scope->parent()) { - if (const Symbol * block{FindCommonBlockInScope(*scope, object)}) { - return block; - } + if (const auto *details{object.detailsIf()}) { + return details->commonBlock(); + } else { + return nullptr; } - return nullptr; } const Scope *FindProgramUnitContaining(const Scope &start) { diff --git a/flang/lib/semantics/tools.h b/flang/lib/semantics/tools.h index 6717914..d857654 100644 --- a/flang/lib/semantics/tools.h +++ b/flang/lib/semantics/tools.h @@ -73,7 +73,6 @@ bool IsIntrinsicConcat( const evaluate::DynamicType &, int, const evaluate::DynamicType &, int); bool IsGenericDefinedOp(const Symbol &); -bool IsCommonBlockContaining(const Symbol &block, const Symbol &object); bool DoesScopeContain(const Scope *maybeAncestor, const Scope &maybeDescendent); bool DoesScopeContain(const Scope *, const Symbol &); bool IsUseAssociated(const Symbol &, const Scope &); -- 2.7.4