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) {
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<ObjectEntityDetails>()}) {
+ return details->commonBlock();
+ } else {
+ return nullptr;
}
- return nullptr;
}
const Scope *FindProgramUnitContaining(const Scope &start) {
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 &);