@@ -144,19 +144,58 @@ 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{FindCB (name)}) {
148+ if (cb->has <UseDetails>()) {
149+ // COMMON blocks could be re-declared. Example:
150+ // module test
151+ // integer :: a
152+ // common /blk/ a
153+ // end module test
154+ // program main
155+ // use test ! Initially get /blk/ with UseDetails
156+ // integer :: a1
157+ // common /blk/ a1 ! Update with CommonBlockDetails
158+ // end program main
159+ // Reset details with real COMMON block details.
160+ cb->set_details (CommonBlockDetails{name.empty () ? location : name},
161+ /* force*/ true );
162+ }
163+ return *cb;
150164 } else {
151165 Symbol &symbol{MakeSymbol (
152166 name, Attrs{}, CommonBlockDetails{name.empty () ? location : name})};
153167 commonBlocks_.emplace (name, symbol);
154168 return symbol;
155169 }
156170}
171+
157172Symbol *Scope::FindCommonBlock (const SourceName &name) const {
158- const auto it{commonBlocks_.find (name)};
159- return it != commonBlocks_.end () ? &*it->second : nullptr ;
173+ if (auto *cb{FindCB (name)}) {
174+ // Ensure this COMMON block is not USE-associated
175+ if (cb->has <UseDetails>()) {
176+ cb = nullptr ;
177+ }
178+ return cb;
179+ }
180+ return nullptr ;
181+ }
182+
183+ Symbol *Scope::FindCommonBlockInScopes (const SourceName &name) const {
184+ if (auto *cb{FindCB (name)}) {
185+ return &cb->GetUltimate ();
186+ } else if (IsSubmodule ()) {
187+ if (const Scope *parent{
188+ symbol_ ? symbol_->get <ModuleDetails>().parent () : nullptr }) {
189+ if (auto *cb{parent->FindCommonBlockInScopes (name)}) {
190+ return &cb->GetUltimate ();
191+ }
192+ }
193+ } else if (!IsTopLevel () && parent_) {
194+ if (auto *cb{parent_->FindCommonBlockInScopes (name)}) {
195+ return &cb->GetUltimate ();
196+ }
197+ }
198+ return nullptr ;
160199}
161200
162201Scope *Scope::FindSubmodule (const SourceName &name) const {
@@ -167,6 +206,11 @@ Scope *Scope::FindSubmodule(const SourceName &name) const {
167206 return &*it->second ;
168207 }
169208}
209+
210+ bool Scope::AddCommonBlock (const SourceName &name, Symbol &cbSymbol) {
211+ return commonBlocks_.emplace (name, cbSymbol).second ;
212+ }
213+
170214bool Scope::AddSubmodule (const SourceName &name, Scope &submodule) {
171215 return submodules_.emplace (name, submodule).second ;
172216}
0 commit comments