Skip to content

Commit a331f8c

Browse files
committed
[flang] Ensure overrides of special procedures
When a derived type declares a generic procedure binding of interest to the runtime library, such as for ASSIGNMENT(=), it overrides any binding that might have been present for the parent type. Fixes #142414.
1 parent f20423f commit a331f8c

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

flang/lib/Semantics/runtime-type-info.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ RuntimeTableBuilder::DescribeSpecialGenerics(const Scope &dtScope,
10611061
specials =
10621062
DescribeSpecialGenerics(*parentScope, thisScope, derivedTypeSpec);
10631063
}
1064-
for (auto pair : dtScope) {
1064+
for (const auto &pair : dtScope) {
10651065
const Symbol &symbol{*pair.second};
10661066
if (const auto *generic{symbol.detailsIf<GenericDetails>()}) {
10671067
DescribeSpecialGeneric(*generic, specials, thisScope, derivedTypeSpec);
@@ -1235,7 +1235,7 @@ void RuntimeTableBuilder::DescribeSpecialProc(
12351235
AddValue(values, specialSchema_, procCompName,
12361236
SomeExpr{evaluate::ProcedureDesignator{specific}});
12371237
// index might already be present in the case of an override
1238-
specials.emplace(*index,
1238+
specials.insert_or_assign(*index,
12391239
evaluate::StructureConstructor{
12401240
DEREF(specialSchema_.AsDerived()), std::move(values)});
12411241
}

flang/test/Lower/namelist.f90

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,20 +125,20 @@ subroutine global_pointer
125125

126126
module mmm
127127
real rrr
128-
namelist /aaa/ rrr
128+
namelist /jkl/ rrr
129129
end
130130

131131
! CHECK-LABEL: c.func @_QPrename_sub
132132
subroutine rename_sub
133-
use mmm, bbb => aaa
133+
use mmm, ghi => jkl
134134
rrr = 3.
135135
! CHECK: %[[V_4:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput
136-
! CHECK: %[[V_5:[0-9]+]] = fir.address_of(@_QMmmmNaaa) : !fir.ref<tuple<!fir.ref<i8>, i64, !fir.ref<!fir.array<1xtuple<!fir.ref<i8>, !fir.ref<!fir.box<none>>>>>, !fir.ref<none>>>
136+
! CHECK: %[[V_5:[0-9]+]] = fir.address_of(@_QMmmmNjkl) : !fir.ref<tuple<!fir.ref<i8>, i64, !fir.ref<!fir.array<1xtuple<!fir.ref<i8>, !fir.ref<!fir.box<none>>>>>, !fir.ref<none>>>
137137
! CHECK: %[[V_6:[0-9]+]] = fir.convert %[[V_5]] : (!fir.ref<tuple<!fir.ref<i8>, i64, !fir.ref<!fir.array<1xtuple<!fir.ref<i8>, !fir.ref<!fir.box<none>>>>>, !fir.ref<none>>>) -> !fir.ref<tuple<>>
138138
! CHECK: %[[V_7:[0-9]+]] = fir.call @_FortranAioOutputNamelist(%[[V_4]], %[[V_6]]) fastmath<contract> : (!fir.ref<i8>, !fir.ref<tuple<>>) -> i1
139139
! CHECK: %[[V_8:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_4]]) fastmath<contract> : (!fir.ref<i8>) -> i32
140-
write(*,bbb)
140+
write(*,ghi)
141141
end
142142

143-
! CHECK-NOT: bbb
144-
! CHECK: fir.string_lit "aaa\00"(4) : !fir.char<1,4>
143+
! CHECK-NOT: ghi
144+
! CHECK: fir.string_lit "jkl\00"(4) : !fir.char<1,4>

flang/test/Semantics/typeinfo13.f90

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
2+
!Ensure ASSIGNMENT(=) overrides are applied to the special procedures table.
3+
module m
4+
type base
5+
contains
6+
procedure :: baseAssign
7+
generic :: assignment(=) => baseAssign
8+
end type
9+
type, extends(base) :: child
10+
contains
11+
procedure :: override
12+
generic :: assignment(=) => override
13+
end type
14+
contains
15+
impure elemental subroutine baseAssign(to, from)
16+
class(base), intent(out) :: to
17+
type(base), intent(in) :: from
18+
end
19+
impure elemental subroutine override(to, from)
20+
class(child), intent(out) :: to
21+
type(child), intent(in) :: from
22+
end
23+
end
24+
25+
!CHECK: .s.child, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(specialbinding) shape: 0_8:0_8 init:[specialbinding::specialbinding(which=2_1,isargdescriptorset=1_1,istypebound=1_1,isargcontiguousset=0_1,proc=override)]
26+
!CHECK: .v.child, SAVE, TARGET (CompilerCreated, ReadOnly): ObjectEntity type: TYPE(binding) shape: 0_8:1_8 init:[binding::binding(proc=baseassign,name=.n.baseassign),binding(proc=override,name=.n.override)]

0 commit comments

Comments
 (0)