method static-ness has no effect on the type?
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Aug 8 03:05:58 PDT 2016
On 08/08/2016 10:30 AM, Cauterite wrote:
> See: https://dpaste.dzfl.pl/2ec6780d4b25
That code is short enough to post it here directly. For easier
reference, this is it:
----
struct S {
void f1() {
auto x = &this;
};
static void f2() {
static assert(!__traits(compiles, {auto x = &this;}));
};
};
static assert(is(typeof(S.f1) == typeof(S.f2))); // ?
static assert(is(typeof(&S.f1) == typeof(&S.f2))); // ?
static assert(!__traits(isStaticFunction, S.f1));
static assert(__traits(isStaticFunction, S.f2));
void main() {
// call f2;
S.init.f2();
// mov [ebp-4], S.init;
// lea eax, [ebp-4];
// call f1;
S.init.f1();
};
----
(Aside: no semicolons after function/struct declarations in D.)
> We have two methods defined, f1 and f2, where f2 is static but they have
> otherwise identical signatures.
> We can see from the disassembly that f1 receives a `this` pointer while
> f2 does not.
> Yet, typeof(&f1) == typeof(&f2). This makes no sense, how can the
> compiler even know whether to pass a `this` pointer when both methods
> have same type?
The first assert compares the return types of f1 and f2. They both
return `void`, so everything's fine there.
The second assert is a bit more surprising. `&S.f1` is considered a
function, but `&S.init.f1` is a delegate. Obviously, you can't get a
proper delegate from just the type. You need an instance of the struct
for that. So having `&S.f1` be a delegate would be weird, too.
I don't know why `&S.f1` is allowed at all. Maybe there is a good
reason, but it also allows bad stuff like this:
----
struct S
{
void f1(int x) { import std.stdio; writeln(x); }
}
void main()
{
void function(int x) f = &S.f1;
f(42); /* prints garbage */
}
----
This even works in @safe code. It also works when using .funcptr to get
the function pointer from a delegate. I'v filed an issue:
https://issues.dlang.org/show_bug.cgi?id=16365
More information about the Digitalmars-d-learn
mailing list