Thread overview
[Issue 4312] New: std.traits.ReturnType no longer accepts function literals
Jun 14, 2010
Rob Jacques
Jun 16, 2010
Shin Fujishiro
May 26, 2011
Andrej Mitrovic
May 27, 2011
Rob Jacques
May 27, 2011
kennytm@gmail.com
May 27, 2011
Rob Jacques
May 27, 2011
kennytm@gmail.com
May 27, 2011
Rob Jacques
June 14, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4312

           Summary: std.traits.ReturnType no longer accepts function
                    literals
           Product: D
           Version: future
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Keywords: rejects-valid
          Severity: regression
          Priority: P2
         Component: Phobos
        AssignedTo: nobody@puremagic.com
        ReportedBy: sandford@jhu.edu


--- Comment #0 from Rob Jacques <sandford@jhu.edu> 2010-06-14 08:43:52 PDT ---
std.traits.ReturnType no longer accepts function literals. Here is a simplified test case:

void main(string[] args) {
    writeln(  (ReturnType!( function(int a){return a;} )).stringof );
    return;
}

Results in the error:

Error: function std.traits.__funcliteral1 cannot access frame of function __funcliteral1

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
June 16, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4312


Shin Fujishiro <rsinfu@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rsinfu@gmail.com
            Version|future                      |D2
         Depends on|                            |4333, 4217
         AssignedTo|nobody@puremagic.com        |rsinfu@gmail.com
         OS/Version|Windows                     |All


--- Comment #1 from Shin Fujishiro <rsinfu@gmail.com> 2010-06-16 14:12:20 PDT ---
The cause of this regression is bug 4333.  Bug 4217 is also related.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 26, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich@gmail.com


--- Comment #2 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2011-05-26 14:12:31 PDT ---
I can't reproduce this on 2.053, it compiles and runs. Can you confirm?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312



--- Comment #3 from Rob Jacques <sandford@jhu.edu> 2011-05-26 19:27:18 PDT ---
I can confirm that non-nested function literals now compile. (i.e. the original
bug report) But nested function literals don't compile (DMD 2.053):

void main(string[] args) {
    int b;
    writeln(  (ReturnType!( function(int a){return a+b;} )).stringof );
}

Error: function hello.main.__funcliteral1 cannot access frame of function D main

Not too sure if this is a separate issue or not.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312


kennytm@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kennytm@gmail.com


--- Comment #4 from kennytm@gmail.com 2011-05-26 23:41:38 PDT ---
(In reply to comment #3)
> I can confirm that non-nested function literals now compile. (i.e. the original
> bug report) But nested function literals don't compile (DMD 2.053):
> 
> void main(string[] args) {
>     int b;
>     writeln(  (ReturnType!( function(int a){return a+b;} )).stringof );
> }
> 
> Error: function hello.main.__funcliteral1 cannot access frame of function D main
> 
> Not too sure if this is a separate issue or not.

This is expected. A function literal cannot form a closure. You need a delegate.

--------------------------
void main() {
    int b;
    auto c = function(int a){return a+b;};
}
--------------------------
x.d(6): Error: function x.main.__funcliteral1 cannot access frame of function D
main
--------------------------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312



--- Comment #5 from Rob Jacques <sandford@jhu.edu> 2011-05-27 06:46:29 PDT ---
I'm not defining a closure. I'm defining a nested function literal. And given that the following compiles:

void main()
{
    int b;
    int funcliteral(int a){return a+b;}
    writeln(  (ReturnType!funcliteral).stringof );
}

I would also expect

void main(string[] args) {
    int b;
    writeln(  (ReturnType!( function(int a){return a+b;} )).stringof );
}

to work. But, as you pointed out, this isn't a problem with ReturnType anymore.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312



--- Comment #6 from kennytm@gmail.com 2011-05-27 07:16:28 PDT ---
(In reply to comment #5)
> I'm not defining a closure. I'm defining a nested function literal. And given that the following compiles:
> 
> void main()
> {
>     int b;
>     int funcliteral(int a){return a+b;}
>     writeln(  (ReturnType!funcliteral).stringof );
> }
> 

That's because the '&' of that 'funcliteral' is a delegate. Try it:
---------------------------------
void main() {
    void f() {};
    static void g() {};
    pragma(msg, typeof(&f));   // void delegate()
    pragma(msg, typeof(&g));   // void function()
}
---------------------------------

And the following also does not compile:
---------------------------------
void main() {
    int b;
    static int func(int a) { return a+b; }
}
---------------------------------
x.d(6): Error: function x.main.func cannot access frame of function D main
---------------------------------

See http://d-programming-language.org/expression.html#FunctionLiteral.

> I would also expect
> 
> void main(string[] args) {
>     int b;
>     writeln(  (ReturnType!( function(int a){return a+b;} )).stringof );
> }
> 
> to work. But, as you pointed out, this isn't a problem with ReturnType anymore.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=4312


Rob Jacques <sandford@jhu.edu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |WORKSFORME


--- Comment #7 from Rob Jacques <sandford@jhu.edu> 2011-05-27 07:33:12 PDT ---
Ah. Thank you. I think then that we can close this bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------