D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 12154 - Address of a member function doesn't tell about this - breaks std.concurrency
Summary: Address of a member function doesn't tell about this - breaks std.concurrency
Status: RESOLVED DUPLICATE of issue 3720
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-02-13 13:51 UTC by Adam D. Ruppe
Modified: 2014-02-15 07:18 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Adam D. Ruppe 2014-02-13 13:51:58 UTC
http://stackoverflow.com/questions/21765885/the-this-pointer-and-message-receiving-in-d/21766122#21766122


Currently, this compiles:

class Foo {
        void bar(int) {}
}

static assert(is(typeof(&Foo.bar) == void function(int)));


But if you actually try to use it, you get a problem:

void main() {
        void function(int) fn = &Foo.bar;
        fn(10);
}
$ ./test52
Segmentation fault


Being a non-static member variable, it expects a context pointer to be passed to it as well, but there's no indication of that in the returned type.

I think it should actually be typed void function(int, Foo); or something like that. Otherwise, generic code that tries to look at the type, std.concurrency.receive for example, can try to blindly use it and get runtime crashes where i think it should be a type system error.

It also cannot be a delegate at this point because the context pointer is unknown.


The exception is if you are already in a non-static method and refer to it:

class Foo {
        void bar(int a) {
                import std.stdio;
                writeln(a);
        }
}
class Baz : Foo {
        override void bar(int) {
                Foo.bar(1); // calls the method from the super class
        }
}


In this case, the address-of operator already yields void delegate(int a) - which works and makes sense.
Comment 1 Maxim Fomin 2014-02-14 09:09:19 UTC
There is issue devoted to that funcptr property of delegate should return function prototype for which first arguement is delegate context pointer (probably void*). This is essentially duplicate (but test case should be added), unfortunately I cannot find number now.
Comment 2 yebblies 2014-02-15 07:18:59 UTC
This is issue 3720, the delegate one is issue 2672.

I'm starting to think `&Type.nonstaticfunc` should only be valid inside typeof, and otherwise give a 'need this to access ...' error.

*** This issue has been marked as a duplicate of issue 3720 ***