[Issue 14694] Functions nested within functions need their body in the generated .di file
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jun 17 03:07:39 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14694
Vladimir Panteleev <thecybershadow at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |thecybershadow at gmail.com
--- Comment #2 from Vladimir Panteleev <thecybershadow at gmail.com> ---
(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).
--
More information about the Digitalmars-d-bugs
mailing list