Bug 6769 – [CTFE] AA.keys doesn't compile when -inline is used

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-10-05T01:39:00Z
Last change time
2011-10-05T20:39:02Z
Assigned to
nobody
Creator
clugdbug

Comments

Comment #0 by clugdbug — 2011-10-05T01:39:45Z
This is an extremely ugly issue which broke the autotester. The problem is the templated AA inside object.di. It performs some nasty casts to void[], then calls the runtime. To avoid this, the CTFE engine intercepts all AA built-in functions at a higher level. But, the inliner really fouls things up, because it optimizes away the functions which the CTFE engine tries to recognize. Minimal test case for 2.055 static assert({ int[int] w= [1:2]; return w.keys.length; }()==1); This works OK, as long as -inline isn't used. But with -inline, it gives: c:\dmd\windows\bin\..\..\src\druntime\import\object.di(378): Error: _aaKeys cann ot be interpreted at compile time, because it has no available source code test.d(6): Error: cannot evaluate delegate @system uint() { int[int] w = [1:2]; return (ref AssociativeArray!(int,int) this = w; , (assert(&this,"null this") , (void[] a = _aaKeys(this.p,4u); , *& a))).length; } () at compile time ------- Note that the member variable 'p' is void *. The whole thing is a disgusting cast-fest.
Comment #1 by bugzilla — 2011-10-05T20:39:02Z