Bug 12154 – Address of a member function doesn't tell about this - breaks std.concurrency
Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-02-13T13:51:00Z
Last change time
2014-02-15T07:18:59Z
Assigned to
nobody
Creator
destructionator
Comments
Comment #0 by destructionator — 2014-02-13T13:51:58Z
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 by maxim — 2014-02-14T09:09:19Z
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 by yebblies — 2014-02-15T07:18:59Z
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 ***