Bug 8257 – __traits(compiles) gives compile error

Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-06-16T19:11:00Z
Last change time
2015-06-09T05:11:55Z
Assigned to
nobody
Creator
wfunction

Comments

Comment #0 by wfunction — 2012-06-16T19:11:34Z
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
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/95d00b2f0ae25d74e0091d17d5537232b8339fd4 Fix issue 8257 __traits(compiles) gives compile error & v.staticfunc is a function pointer, not a delegate. Change it into (v, &typeof(v).staticfunc) https://github.com/D-Programming-Language/dmd/commit/349edf2f8fa130d49ce2361aad2ffa03f6cd55a7 Merge pull request #1194 from donc/bug8257_delegate_nonstatic 8257 x.staticfunc() is a function pointer, not a delegate