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