@@ -789,8 +789,8 @@ class ModuleVisitor : public virtual ScopeHandler {
789
789
SourceName, SourceName, Symbol &localSymbol, const Symbol &useSymbol);
790
790
void AddUse (const GenericSpecInfo &);
791
791
// If appropriate, erase a previously USE-associated symbol
792
- void EraseRenamedSymbol (const Symbol & );
793
- // Record a name appearing in a USE rename clause
792
+ void EraseRenamedUse (const Symbol * );
793
+ // Record a name appearing as the target of a USE rename clause
794
794
void AddUseRename (const SourceName &name) {
795
795
useRenames_.emplace (std::make_pair (name, useModuleScope_));
796
796
}
@@ -2775,11 +2775,8 @@ bool ModuleVisitor::Pre(const parser::Only &x) {
2775
2775
bool ModuleVisitor::Pre (const parser::Rename::Names &x) {
2776
2776
const auto &localName{std::get<0 >(x.t )};
2777
2777
const auto &useName{std::get<1 >(x.t )};
2778
- AddUseRename (useName.source );
2779
2778
SymbolRename rename{AddUse (localName.source , useName.source )};
2780
- if (rename.use && localName.source != useName.source ) {
2781
- EraseRenamedSymbol (*rename.use );
2782
- }
2779
+ AddUseRename (useName.source );
2783
2780
Resolve (useName, rename.use );
2784
2781
Resolve (localName, rename.local );
2785
2782
return false ;
@@ -2797,9 +2794,6 @@ bool ModuleVisitor::Pre(const parser::Rename::Operators &x) {
2797
2794
" Logical constant '%s' may not be used as a defined operator" _err_en_US);
2798
2795
} else {
2799
2796
SymbolRename rename{AddUse (localInfo.symbolName (), useInfo.symbolName ())};
2800
- if (rename.use ) {
2801
- EraseRenamedSymbol (*rename.use );
2802
- }
2803
2797
useInfo.Resolve (rename.use );
2804
2798
localInfo.Resolve (rename.local );
2805
2799
}
@@ -2910,17 +2904,20 @@ static bool ConvertToUseError(
2910
2904
}
2911
2905
}
2912
2906
2913
- // If a symbol has previously been USE-associated and did not appear in a USE
2914
- // ONLY clause, erase it from the current scope. This is needed when a name
2915
- // appears in a USE rename clause.
2916
- void ModuleVisitor::EraseRenamedSymbol (const Symbol &useSymbol) {
2917
- const SourceName &name{useSymbol.name ()};
2907
+ // If a symbol has previously been USE-associated and did not appear in
2908
+ // an ONLY clause or renaming, erase it from the current scope. This is
2909
+ // necessary when a name appears as the target of a later USE rename clause.
2910
+ void ModuleVisitor::EraseRenamedUse (const Symbol *useSymbol) {
2911
+ if (!useSymbol) {
2912
+ return ;
2913
+ }
2914
+ const SourceName &name{useSymbol->name ()};
2918
2915
if (const Symbol * symbol{FindInScope (name)}) {
2919
- if (auto *useDetails{symbol->detailsIf <UseDetails>()}) {
2916
+ if (const auto *useDetails{symbol->detailsIf <UseDetails>()}) {
2920
2917
const Symbol &moduleSymbol{useDetails->symbol ()};
2921
2918
if (moduleSymbol.name () == name &&
2922
- moduleSymbol.owner () == useSymbol. owner () && IsUseRenamed (name) &&
2923
- !IsUseOnly (name)) {
2919
+ moduleSymbol.owner () == useSymbol-> owner () && ! IsUseOnly (name) &&
2920
+ !IsUseRenamed (name)) {
2924
2921
EraseSymbol (*symbol);
2925
2922
}
2926
2923
}
@@ -2930,7 +2927,7 @@ void ModuleVisitor::EraseRenamedSymbol(const Symbol &useSymbol) {
2930
2927
void ModuleVisitor::DoAddUse (SourceName location, SourceName localName,
2931
2928
Symbol &localSymbol, const Symbol &useSymbol) {
2932
2929
if (localName != useSymbol.name ()) {
2933
- EraseRenamedSymbol ( useSymbol);
2930
+ EraseRenamedUse (& useSymbol);
2934
2931
}
2935
2932
if (auto *details{localSymbol.detailsIf <UseErrorDetails>()}) {
2936
2933
details->add_occurrence (location, *useModuleScope_);
0 commit comments