[flang] Better fix; clean up redundant utilities
authorpeter klausler <pklausler@nvidia.com>
Tue, 14 Jan 2020 23:08:37 +0000 (15:08 -0800)
committerpeter klausler <pklausler@nvidia.com>
Tue, 14 Jan 2020 23:08:37 +0000 (15:08 -0800)
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
flang/lib/semantics/tools.cc
flang/lib/semantics/tools.h

index 05d0c30..002024a 100644 (file)
@@ -4617,14 +4617,18 @@ bool ConstructVisitor::Pre(const parser::DataStmtObject &x) {
       common::visitors{
           [&](const Indirection<parser::Variable> &y) {
             Walk(y.value());
-            if (auto expr{AnalyzeExpr(context(), y)}) {
-              if (auto dataRef{evaluate::ExtractDataRef(*expr)}) {
-                const_cast<Symbol &>(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<Indirection<parser::Designator>>(
+                        &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) {
index 307e307..18c5c82 100644 (file)
 
 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 &block;
-    }
-  }
-  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<ObjectEntityDetails>()}) {
+    return details->commonBlock();
+  } else {
+    return nullptr;
   }
-  return nullptr;
 }
 
 const Scope *FindProgramUnitContaining(const Scope &start) {
index 6717914..d857654 100644 (file)
@@ -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 &);