Bug 14694 – Functions nested within functions need their body in the generated .di file

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2015-06-12T20:50:11Z
Last change time
2022-10-10T05:19:44Z
Assigned to
No Owner
Creator
Andrei Alexandrescu
Blocks
14680

Comments

Comment #0 by andrei — 2015-06-12T20:50:11Z
Obvious in retrospect. Repro picked from std.array: inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) @trusted pure nothrow { alias U = inout(T); static U* max(U* a, U* b) nothrow { return a > b ? a : b; } static U* min(U* a, U* b) nothrow { return a < b ? a : b; } auto b = max(r1.ptr, r2.ptr); auto e = min(r1.ptr + r1.length, r2.ptr + r2.length); return b < e ? b[0 .. e - b] : null; } After .di generation: pure nothrow @trusted inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) { alias U = inout(T); static nothrow U* max(U* a, U* b); static nothrow U* min(U* a, U* b); auto b = max(r1.ptr, r2.ptr); auto e = min(r1.ptr + r1.length, r2.ptr + r2.length); return b < e ? b[0..e - b] : null; } Obviously that's not going to work for more than one reason :o).
Comment #1 by bugzilla — 2015-06-17T09:58:49Z
(In reply to Andrei Alexandrescu from comment #0) > Obviously that's not going to work for more than one reason :o). Instead of asking people to carefully examine moderately complex code looking for a mistake, and wondering how many and which you mean, please be explicit.
Comment #2 by dlang-bugzilla — 2015-06-17T10:07:39Z
(In reply to Walter Bright from comment #1) > Instead of asking people to carefully examine moderately complex code > looking for a mistake, and wondering how many and which you mean, please be > explicit. Is it not obvious? Here: (In reply to Andrei Alexandrescu from comment #0) > Obvious in retrospect. Repro picked from std.array: > > inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) @trusted pure nothrow > { > alias U = inout(T); > static U* max(U* a, U* b) nothrow { return a > b ? a : b; } > static U* min(U* a, U* b) nothrow { return a < b ? a : b; } These two nested functions (min and max) have a body. > > auto b = max(r1.ptr, r2.ptr); > auto e = min(r1.ptr + r1.length, r2.ptr + r2.length); > return b < e ? b[0 .. e - b] : null; > } > > After .di generation: > > pure nothrow @trusted inout(T)[] overlap(T)(inout(T)[] r1, inout(T)[] r2) > { > alias U = inout(T); > static nothrow U* max(U* a, U* b); > static nothrow U* min(U* a, U* b); Here, the bodies of the nested functions was stripped. > auto b = max(r1.ptr, r2.ptr); > auto e = min(r1.ptr + r1.length, r2.ptr + r2.length); > return b < e ? b[0..e - b] : null; > } > > Obviously that's not going to work for more than one reason :o).
Comment #3 by andrei — 2015-06-17T14:49:48Z
(In reply to Walter Bright from comment #1) > (In reply to Andrei Alexandrescu from comment #0) > > Obviously that's not going to work for more than one reason :o). > > Instead of asking people to carefully examine moderately complex code > looking for a mistake, and wondering how many and which you mean, please be > explicit. Well it won't work because it's impossible to define a nested function outside the function it's in. So the definition must go there.
Comment #4 by razvan.nitu1305 — 2022-10-06T08:47:53Z