@@ -144,19 +144,34 @@ void Scope::add_crayPointer(const SourceName &name, Symbol &pointer) {
144144}
145145
146146Symbol &Scope::MakeCommonBlock (SourceName name, SourceName location) {
147- const auto it{commonBlocks_.find (name)};
148- if (it != commonBlocks_.end ()) {
149- return *it->second ;
147+ if (auto *cb{FindCommonBlock (name)}) {
148+ return *cb;
150149 } else {
151150 Symbol &symbol{MakeSymbol (
152151 name, Attrs{}, CommonBlockDetails{name.empty () ? location : name})};
153152 commonBlocks_.emplace (name, symbol);
154153 return symbol;
155154 }
156155}
157- Symbol *Scope::FindCommonBlock (const SourceName &name) const {
158- const auto it{commonBlocks_.find (name)};
159- return it != commonBlocks_.end () ? &*it->second : nullptr ;
156+
157+ Symbol *Scope::FindCommonBlockInVisibleScopes (const SourceName &name) const {
158+ if (Symbol * cb{FindCommonBlock (name)}) {
159+ return cb;
160+ } else if (Symbol * cb{FindCommonBlockUse (name)}) {
161+ return &cb->GetUltimate ();
162+ } else if (IsSubmodule ()) {
163+ if (const Scope *parent{
164+ symbol_ ? symbol_->get <ModuleDetails>().parent () : nullptr }) {
165+ if (auto *cb{parent->FindCommonBlockInVisibleScopes (name)}) {
166+ return cb;
167+ }
168+ }
169+ } else if (!IsTopLevel () && parent_) {
170+ if (auto *cb{parent_->FindCommonBlockInVisibleScopes (name)}) {
171+ return cb;
172+ }
173+ }
174+ return nullptr ;
160175}
161176
162177Scope *Scope::FindSubmodule (const SourceName &name) const {
@@ -167,6 +182,31 @@ Scope *Scope::FindSubmodule(const SourceName &name) const {
167182 return &*it->second ;
168183 }
169184}
185+
186+ bool Scope::AddCommonBlockUse (
187+ const SourceName &name, Attrs attrs, Symbol &cbUltimate) {
188+ CHECK (cbUltimate.has <CommonBlockDetails>());
189+ // Make a symbol, but don't add it to the Scope, since it needs to
190+ // be added to the USE-associated COMMON blocks
191+ Symbol &useCB{MakeSymbol (name, attrs, UseDetails{name, cbUltimate})};
192+ return commonBlockUses_.emplace (name, useCB).second ;
193+ }
194+
195+ Symbol *Scope::FindCommonBlock (const SourceName &name) const {
196+ if (const auto it{commonBlocks_.find (name)}; it != commonBlocks_.end ()) {
197+ return &*it->second ;
198+ }
199+ return nullptr ;
200+ }
201+
202+ Symbol *Scope::FindCommonBlockUse (const SourceName &name) const {
203+ if (const auto it{commonBlockUses_.find (name)};
204+ it != commonBlockUses_.end ()) {
205+ return &*it->second ;
206+ }
207+ return nullptr ;
208+ }
209+
170210bool Scope::AddSubmodule (const SourceName &name, Scope &submodule) {
171211 return submodules_.emplace (name, submodule).second ;
172212}
0 commit comments