@@ -779,6 +779,7 @@ class SymbolMapper : public evaluate::AnyTraverse<SymbolMapper, bool> {
779
779
return false ;
780
780
}
781
781
void MapSymbolExprs (Symbol &);
782
+ Symbol *CopySymbol (const Symbol *);
782
783
783
784
private:
784
785
void MapParamValue (ParamValue ¶m) const { (*this )(param.GetExplicit ()); }
@@ -797,16 +798,44 @@ class SymbolMapper : public evaluate::AnyTraverse<SymbolMapper, bool> {
797
798
SymbolAndTypeMappings &map_;
798
799
};
799
800
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
+ }
805
822
}
823
+ } else if (Symbol * copy{scope_.CopySymbol (*symbol)}) {
824
+ map_.symbolMap [symbol] = copy;
825
+ return copy;
806
826
}
807
827
}
828
+ return nullptr ;
829
+ }
830
+
831
+ void SymbolMapper::MapSymbolExprs (Symbol &symbol) {
808
832
common::visit (
809
833
common::visitors{[&](ObjectEntityDetails &object) {
834
+ if (const DeclTypeSpec * type{object.type ()}) {
835
+ if (const DeclTypeSpec * newType{MapType (*type)}) {
836
+ object.ReplaceType (*newType);
837
+ }
838
+ }
810
839
for (ShapeSpec &spec : object.shape ()) {
811
840
MapShapeSpec (spec);
812
841
}
@@ -892,13 +921,7 @@ const Symbol *SymbolMapper::MapInterface(const Symbol *interface) {
892
921
return interface;
893
922
} else if (const auto *subp{interface->detailsIf <SubprogramDetails>()};
894
923
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);
902
925
}
903
926
}
904
927
return nullptr ;
@@ -913,23 +936,24 @@ void MapSubprogramToNewSymbols(const Symbol &oldSymbol, Symbol &newSymbol,
913
936
mappings->symbolMap [&oldSymbol] = &newSymbol;
914
937
const auto &oldDetails{oldSymbol.get <SubprogramDetails>()};
915
938
auto &newDetails{newSymbol.get <SubprogramDetails>()};
939
+ SymbolMapper mapper{newScope, *mappings};
916
940
for (const Symbol *dummyArg : oldDetails.dummyArgs ()) {
917
941
if (!dummyArg) {
918
942
newDetails.add_alternateReturn ();
919
- } else if (Symbol *copy{newScope .CopySymbol (* dummyArg)}) {
943
+ } else if (Symbol * copy{mapper .CopySymbol (dummyArg)}) {
920
944
copy->set (Symbol::Flag::Implicit, false );
921
945
newDetails.add_dummyArg (*copy);
922
946
mappings->symbolMap [dummyArg] = copy;
923
947
}
924
948
}
925
949
if (oldDetails.isFunction ()) {
926
950
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)}) {
928
953
newDetails.set_result (*copy);
929
- mappings->symbolMap [&oldDetails. result () ] = copy;
954
+ mappings->symbolMap [&result] = copy;
930
955
}
931
956
}
932
- SymbolMapper mapper{newScope, *mappings};
933
957
for (auto &[_, ref] : newScope) {
934
958
mapper.MapSymbolExprs (*ref);
935
959
}
0 commit comments