@@ -3053,11 +3053,16 @@ void ModuleVisitor::DoAddUse(SourceName location, SourceName localName,
30533053 const Symbol &useUltimate{useSymbol.GetUltimate ()};
30543054 const auto *useGeneric{useUltimate.detailsIf <GenericDetails>()};
30553055 if (localSymbol->has <UnknownDetails>()) {
3056- if (useGeneric && useGeneric->specific () &&
3057- IsProcedurePointer (*useGeneric->specific ())) {
3058- // We are use-associating a generic that shadows a procedure pointer.
3059- // Local references that might be made to that procedure pointer should
3060- // use a UseDetails symbol for proper data addressing. So create an
3056+ if (useGeneric &&
3057+ ((useGeneric->specific () &&
3058+ IsProcedurePointer (*useGeneric->specific ())) ||
3059+ (useGeneric->derivedType () &&
3060+ useUltimate.name () != localSymbol->name ()))) {
3061+ // We are use-associating a generic that either shadows a procedure
3062+ // pointer or shadows a derived type of the same name.
3063+ // Local references that might be made to the procedure pointer should
3064+ // use a UseDetails symbol for proper data addressing, and a derived
3065+ // type needs to be in scope with the renamed name. So create an
30613066 // empty local generic now into which the use-associated generic may
30623067 // be copied.
30633068 localSymbol->set_details (GenericDetails{});
@@ -3153,9 +3158,15 @@ void ModuleVisitor::DoAddUse(SourceName location, SourceName localName,
31533158 if (!useDerivedType) {
31543159 combinedDerivedType = localDerivedType;
31553160 } else if (!localDerivedType) {
3156- combinedDerivedType = useDerivedType;
3161+ if (useDerivedType->name () == localName) {
3162+ combinedDerivedType = useDerivedType;
3163+ } else {
3164+ Symbol &combined{currScope ().MakeSymbol (localName,
3165+ useDerivedType->attrs (), UseDetails{localName, *useDerivedType})};
3166+ combinedDerivedType = &combined;
3167+ }
31573168 } else {
3158- const Scope *localScope{localDerivedType->scope ()};
3169+ const Scope *localScope{localDerivedType->GetUltimate (). scope ()};
31593170 const Scope *useScope{useDerivedType->GetUltimate ().scope ()};
31603171 if (localScope && useScope && localScope->derivedTypeSpec () &&
31613172 useScope->derivedTypeSpec () &&
@@ -6776,9 +6787,7 @@ std::optional<DerivedTypeSpec> DeclarationVisitor::ResolveDerivedType(
67766787 }
67776788 if (CheckUseError (name)) {
67786789 return std::nullopt ;
6779- }
6780- symbol = &symbol->GetUltimate ();
6781- if (symbol->has <DerivedTypeDetails>()) {
6790+ } else if (symbol->GetUltimate ().has <DerivedTypeDetails>()) {
67826791 return DerivedTypeSpec{name.source , *symbol};
67836792 } else {
67846793 Say (name, " '%s' is not a derived type" _err_en_US);
@@ -7120,12 +7129,10 @@ bool ConstructVisitor::Pre(const parser::DataStmtValue &x) {
71207129 auto &mutableData{const_cast <parser::DataStmtConstant &>(data)};
71217130 if (auto *elem{parser::Unwrap<parser::ArrayElement>(mutableData)}) {
71227131 if (const auto *name{std::get_if<parser::Name>(&elem->base .u )}) {
7123- if (const Symbol * symbol{FindSymbol (*name)}) {
7124- const Symbol &ultimate{symbol->GetUltimate ()};
7125- if (ultimate.has <DerivedTypeDetails>()) {
7126- mutableData.u = elem->ConvertToStructureConstructor (
7127- DerivedTypeSpec{name->source , ultimate});
7128- }
7132+ if (const Symbol * symbol{FindSymbol (*name)};
7133+ symbol && symbol->GetUltimate ().has <DerivedTypeDetails>()) {
7134+ mutableData.u = elem->ConvertToStructureConstructor (
7135+ DerivedTypeSpec{name->source , *symbol});
71297136 }
71307137 }
71317138 }
0 commit comments