digitalmars.D - Annoying std.math issue
- H. S. Teoh (20/20) Mar 27 2014 Some time ago, Iain Buclaw kindly added non-asm implementations of math
- monarch_dodra (17/44) Mar 27 2014 //----
Some time ago, Iain Buclaw kindly added non-asm implementations of math functions in std.math. However, CTFE still seems unable to correctly evaluate certain functions like atan2: import std.math; enum x = atan2(1.0, 2.0); Compiler output: /usr/src/d/phobos/std/math.d(856): Error: asm statements cannot be interpreted at compile time /usr/src/d/phobos/std/math.d(917): called from here: atan2(cast(real)y, cast(real)x) test.d(2): called from here: atan2(1.00000, 2.00000) Looking at std/math.d, it appears that version=InlineAsm_X86_Any is defined, which leads to the asm implementation of atan2, which CTFE can't interpret. However, right below that block is an else block containing a D implementation of atan2 that AFAICT *can* be interpreted in CTFE. So it would appear that version=InlineAsm_X86_Any should be suppressed during CTFE? But I'm not sure how this could be done in the compiler. In any case, it's an annoying limitation. :-( T -- Never step over a puddle, always step around it. Chances are that whatever made it is still dripping.
Mar 27 2014
On Thursday, 27 March 2014 at 18:18:25 UTC, H. S. Teoh wrote:Some time ago, Iain Buclaw kindly added non-asm implementations of math functions in std.math. However, CTFE still seems unable to correctly evaluate certain functions like atan2: import std.math; enum x = atan2(1.0, 2.0); Compiler output: /usr/src/d/phobos/std/math.d(856): Error: asm statements cannot be interpreted at compile time /usr/src/d/phobos/std/math.d(917): called from here: atan2(cast(real)y, cast(real)x) test.d(2): called from here: atan2(1.00000, 2.00000) Looking at std/math.d, it appears that version=InlineAsm_X86_Any is defined, which leads to the asm implementation of atan2, which CTFE can't interpret. However, right below that block is an else block containing a D implementation of atan2 that AFAICT *can* be interpreted in CTFE. So it would appear that version=InlineAsm_X86_Any should be suppressed during CTFE? But I'm not sure how this could be done in the compiler. In any case, it's an annoying limitation. :-( T//---- auto atan(double x) { version(InlineAsm_X86_Any) if (!__ctfe) { asm { ... } return; } Fall back non-InlineAsm_X86_Any and ctfe } //---- ?
Mar 27 2014