So there's a struct with a ubyte. To shut up dmd about implicit conversions I added a constructor but it isn't recognized. // this failes immutable int dummy = init(); int init() { uint x; 6: auto p = F(x); return 0; } struct F { ubyte th; this(uint x) { th = cast(ubyte) x; } } // while it works in this case void main() { uint x; auto p = F(x); } $ dmd -c posecells.d DMD v2.055 DEBUG posecells.d(6): Error: cannot implicitly convert expression (x) of type uint to ubyte posecells.d(2): Error: cannot evaluate init() at compile time Weird thing is, if you remove 'int' in front of 'dummy' it magically works.
This isn't a CTFE bug. Reduced test case: uint NINE = 9; typeof(F(NINE)) fails; struct F { ubyte th; this(uint x) { th = cast(ubyte) x; } } This is a forward reference issue. It compiles if you move the declaration of 'fails' past the declaration of F.
*** This issue has been marked as a duplicate of issue 9441 ***