@@ -779,6 +779,7 @@ class SymbolMapper : public evaluate::AnyTraverse<SymbolMapper, bool> {
779779 return false ;
780780 }
781781 void MapSymbolExprs (Symbol &);
782+ Symbol *CopySymbol (const Symbol *);
782783
783784private:
784785 void MapParamValue (ParamValue ¶m) const { (*this )(param.GetExplicit ()); }
@@ -797,16 +798,44 @@ class SymbolMapper : public evaluate::AnyTraverse<SymbolMapper, bool> {
797798 SymbolAndTypeMappings &map_;
798799};
799800
800- void SymbolMapper::MapSymbolExprs (Symbol &symbol) {
801- if (auto *object{symbol.detailsIf <ObjectEntityDetails>()}) {
802- if (const DeclTypeSpec *type{object->type ()}) {
803- if (const DeclTypeSpec *newType{MapType (*type)}) {
804- object->ReplaceType (*newType);
801+ Symbol *SymbolMapper::CopySymbol (const Symbol *symbol) {
802+ if (symbol) {
803+ if (auto *subp{symbol->detailsIf <SubprogramDetails>()}) {
804+ if (subp->isInterface ()) {
805+ if (auto pair{scope_.try_emplace (symbol->name (), symbol->attrs ())};
806+ pair.second ) {
807+ Symbol ©{*pair.first ->second };
808+ map_.symbolMap [symbol] = ©
809+ copy.set (symbol->test (Symbol::Flag::Subroutine)
810+ ? Symbol::Flag::Subroutine
811+ : Symbol::Flag::Function);
812+ Scope &newScope{scope_.MakeScope (Scope::Kind::Subprogram, ©)};
813+ copy.set_scope (&newScope);
814+ copy.set_details (SubprogramDetails{});
815+ auto &newSubp{copy.get <SubprogramDetails>()};
816+ newSubp.set_isInterface (true );
817+ newSubp.set_isDummy (subp->isDummy ());
818+ newSubp.set_defaultIgnoreTKR (subp->defaultIgnoreTKR ());
819+ MapSubprogramToNewSymbols (*symbol, copy, newScope, &map_);
820+ return ©
821+ }
805822 }
823+ } else if (Symbol * copy{scope_.CopySymbol (*symbol)}) {
824+ map_.symbolMap [symbol] = copy;
825+ return copy;
806826 }
807827 }
828+ return nullptr ;
829+ }
830+
831+ void SymbolMapper::MapSymbolExprs (Symbol &symbol) {
808832 common::visit (
809833 common::visitors{[&](ObjectEntityDetails &object) {
834+ if (const DeclTypeSpec * type{object.type ()}) {
835+ if (const DeclTypeSpec * newType{MapType (*type)}) {
836+ object.ReplaceType (*newType);
837+ }
838+ }
810839 for (ShapeSpec &spec : object.shape ()) {
811840 MapShapeSpec (spec);
812841 }
@@ -892,13 +921,7 @@ const Symbol *SymbolMapper::MapInterface(const Symbol *interface) {
892921 return interface;
893922 } else if (const auto *subp{interface->detailsIf <SubprogramDetails>()};
894923 subp && subp->isInterface ()) {
895- if (Symbol *newSymbol{scope_.CopySymbol (*interface)}) {
896- newSymbol->get <SubprogramDetails>().set_isInterface (true );
897- map_.symbolMap [interface] = newSymbol;
898- Scope &newScope{scope_.MakeScope (Scope::Kind::Subprogram, newSymbol)};
899- MapSubprogramToNewSymbols (*interface, *newSymbol, newScope, &map_);
900- return newSymbol;
901- }
924+ return CopySymbol (interface);
902925 }
903926 }
904927 return nullptr ;
@@ -913,23 +936,24 @@ void MapSubprogramToNewSymbols(const Symbol &oldSymbol, Symbol &newSymbol,
913936 mappings->symbolMap [&oldSymbol] = &newSymbol;
914937 const auto &oldDetails{oldSymbol.get <SubprogramDetails>()};
915938 auto &newDetails{newSymbol.get <SubprogramDetails>()};
939+ SymbolMapper mapper{newScope, *mappings};
916940 for (const Symbol *dummyArg : oldDetails.dummyArgs ()) {
917941 if (!dummyArg) {
918942 newDetails.add_alternateReturn ();
919- } else if (Symbol *copy{newScope .CopySymbol (* dummyArg)}) {
943+ } else if (Symbol * copy{mapper .CopySymbol (dummyArg)}) {
920944 copy->set (Symbol::Flag::Implicit, false );
921945 newDetails.add_dummyArg (*copy);
922946 mappings->symbolMap [dummyArg] = copy;
923947 }
924948 }
925949 if (oldDetails.isFunction ()) {
926950 newScope.erase (newSymbol.name ());
927- if (Symbol *copy{newScope.CopySymbol (oldDetails.result ())}) {
951+ const Symbol &result{oldDetails.result ()};
952+ if (Symbol * copy{mapper.CopySymbol (&result)}) {
928953 newDetails.set_result (*copy);
929- mappings->symbolMap [&oldDetails. result () ] = copy;
954+ mappings->symbolMap [&result] = copy;
930955 }
931956 }
932- SymbolMapper mapper{newScope, *mappings};
933957 for (auto &[_, ref] : newScope) {
934958 mapper.MapSymbolExprs (*ref);
935959 }
0 commit comments