diff --git a/flang/include/flang/Semantics/scope.h b/flang/include/flang/Semantics/scope.h --- a/flang/include/flang/Semantics/scope.h +++ b/flang/include/flang/Semantics/scope.h @@ -52,7 +52,7 @@ using EquivalenceSet = std::vector; class Scope { - using mapType = std::map>; + using mapType = std::map; public: ENUM_CLASS(Kind, Global, Module, MainProgram, Subprogram, BlockData, @@ -110,7 +110,7 @@ // Return symbols in declaration order (the iterators above are in name order) SymbolVector GetSymbols() const; - std::vector> GetSymbols(); + MutableSymbolVector GetSymbols(); iterator find(const SourceName &name); const_iterator find(const SourceName &name) const { @@ -147,7 +147,10 @@ // Make a copy of a symbol in this scope; nullptr if one is already there Symbol *CopySymbol(const Symbol &); - const std::list &equivalenceSets() const; + std::list &equivalenceSets() { return equivalenceSets_; } + const std::list &equivalenceSets() const { + return equivalenceSets_; + } void add_equivalenceSet(EquivalenceSet &&); // Cray pointers are saved as map of pointee name -> pointer symbol const mapType &crayPointers() const { return crayPointers_; } diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -35,6 +35,8 @@ using SymbolRef = common::Reference; using SymbolVector = std::vector; +using MutableSymbolRef = common::Reference; +using MutableSymbolVector = std::vector; // A module or submodule. class ModuleDetails { @@ -299,13 +301,14 @@ class CommonBlockDetails { public: - const SymbolVector &objects() const { return objects_; } - void add_object(const Symbol &object) { objects_.emplace_back(object); } + MutableSymbolVector &objects() { return objects_; } + const MutableSymbolVector &objects() const { return objects_; } + void add_object(Symbol &object) { objects_.emplace_back(object); } MaybeExpr bindName() const { return bindName_; } void set_bindName(MaybeExpr &&expr) { bindName_ = std::move(expr); } private: - SymbolVector objects_; + MutableSymbolVector objects_; MaybeExpr bindName_; }; @@ -736,8 +739,7 @@ } inline bool operator<(SymbolRef x, SymbolRef y) { return *x < *y; } -inline bool operator<( - common::Reference x, common::Reference y) { +inline bool operator<(MutableSymbolRef x, MutableSymbolRef y) { return *x < *y; } using SymbolSet = std::set; diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -243,8 +243,8 @@ [&](const CommonBlockDetails &x) { decls_ << "common/" << symbol.name(); char sep = '/'; - for (const Symbol &object : x.objects()) { - decls_ << sep << object.name(); + for (const auto &object : x.objects()) { + decls_ << sep << object->name(); sep = ','; } decls_ << '\n'; @@ -875,8 +875,8 @@ } }, [this](const CommonBlockDetails &details) { - for (const Symbol &object : details.objects()) { - DoSymbol(object); + for (const auto &object : details.objects()) { + DoSymbol(*object); } }, [](const auto &) {}, diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4340,9 +4340,8 @@ " common block name '%s'"_err_en_US); } } else { - for (const Symbol &object : - symbol->get().objects()) { - SetSaveAttr(*const_cast(&object)); + for (auto &object : symbol->get().objects()) { + SetSaveAttr(*object); } } } @@ -6656,11 +6655,9 @@ // 2.15.3 When a named common block appears in a list, it has the // same meaning as if every explicit member of the common block // appeared in the list - for (const Symbol &object : - symbol->get().objects()) { - Symbol &mutableObject{const_cast(object)}; + for (auto &object : symbol->get().objects()) { if (auto *resolvedObject{ - ResolveOmp(mutableObject, ompFlag, currScope())}) { + ResolveOmp(*object, ompFlag, currScope())}) { AddToContextObjectWithDSA(*resolvedObject, ompFlag); } } diff --git a/flang/lib/Semantics/scope.cpp b/flang/lib/Semantics/scope.cpp --- a/flang/lib/Semantics/scope.cpp +++ b/flang/lib/Semantics/scope.cpp @@ -62,7 +62,7 @@ template static std::vector> GetSortedSymbols( - std::map> symbols) { + std::map symbols) { std::vector> result; result.reserve(symbols.size()); for (auto &pair : symbols) { @@ -72,7 +72,7 @@ return result; } -std::vector> Scope::GetSymbols() { +MutableSymbolVector Scope::GetSymbols() { return GetSortedSymbols(symbols_); } SymbolVector Scope::GetSymbols() const { @@ -145,9 +145,6 @@ } } -const std::list &Scope::equivalenceSets() const { - return equivalenceSets_; -} void Scope::add_equivalenceSet(EquivalenceSet &&set) { equivalenceSets_.emplace_back(std::move(set)); } diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -435,8 +435,8 @@ }, [&](const CommonBlockDetails &x) { os << ':'; - for (const Symbol &object : x.objects()) { - os << ' ' << object.name(); + for (const auto &object : x.objects()) { + os << ' ' << object->name(); } }, [&](const FinalProcDetails &) {},