Annoying std.math issue

monarch_dodra monarchdodra at gmail.com
Thu Mar 27 11:32:03 PDT 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
}
//----

?


More information about the Digitalmars-d mailing list