[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