struct S { static void g() { } }
auto f(string m)() { return &__traits(getMember, S.init, m); }
// Error: delegates are only for non-static functions
static if (__traits(compiles, f!"g"())) { }
Marked as critical since there's no real workaround (that I'm aware of)...
Comment #1 by clugdbug — 2012-10-19T04:14:25Z
The error is not coming from __traits(compiles), it happens while generating the obj file.
If you compile with dmd -c -o-
then no error occurs.
The error message itself should I think be regarded as an internal compiler error.
Here's the root cause.
struct S { static void g() { } static int w;}
void main()
{
S s;
auto k = &s.g;
pragma(msg, typeof(&s.g));
}
This compiles with -c -o-
According to the pragma, &s.g is a delegate. But, since g is a static function, it cannot be a valid delegate. The error is detected only at the glue layer.
I believe that &s.g should be a function pointer, and s should be ignored,
since already:
int *x = &s.w; // accepted, s is ignored
s.g(); // accepted, s is ignored.
This would mean the __traits in the original code would continue to return true, but the function f!"g"() would actually be valid and would return a function pointer, not a delegate.
Comment #2 by github-bugzilla — 2012-10-20T20:27:21Z