[Issue 12154] New: Address of a member function doesn't tell about this - breaks std.concurrency
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Feb 13 13:52:03 PST 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12154
Summary: Address of a member function doesn't tell about this -
breaks std.concurrency
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: destructionator at gmail.com
--- Comment #0 from Adam D. Ruppe <destructionator at gmail.com> 2014-02-13 13:51:58 PST ---
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.
--
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list