I'm not sure I understand the safety of function pointers vs. the addresses of functions. The code below illustrates the issue.

I was under the impression that pointers are not allowed in safe code. Naturally, I took that to also mean that function pointers are not allowed in safe code. Indeed, I haven't been able to pass a function pointer to a safe function. However, I am able to take the address of a function and pass that as a parameter. It seems to work fine for taking the address of functions and templates (so long as I !)

import std.stdio : writeln;
import std.traits;
import std.math;

void function_safety(T)(T fp)
{
        if (functionAttributes!fp & FunctionAttribute.safe)
                writeln("fp is safe");
        else if (functionAttributes!fp & FunctionAttribute.trusted)
                writeln("fp is trusted");
        else if (functionAttributes!fp & FunctionAttribute.system)
                writeln("fp is system");
        else
                writeln("fp is neither safe nor trusted nor system");
}

void main()
{
        function_safety(&cbrt);  //prints fp is trusted
        real function(real) fp = &cbrt;
        function_safety(fp);     //prints fp is system
}

One other related issue. The code above works for some parts of std.math, but it doesn't for all of it. I thought it was that some of them are defined in other places, so I used static import and tried
function_safety(&std.math.cos);
but I'm still getting this error (other people seem to have an issue with linking and getting it, but I'm not making any other change and shouldn't need to link anything).

OPTLINK (R) for Win32  Release 8.00.17
Copyright (C) Digital Mars 1989-2013  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
[path]\AppData\Local\Temp\.rdmd\rdmd-testing_fp_template_purity.d-A5DD
C99AC50E1539BAB8627648C9740B\objs\testing_fp_template_purity.exe.obj(testing_fp_
template_purity.exe)
 Error 42: Symbol Undefined _D3std4math3cosFNaNbNiNfeZe
--- errorlevel 1

Reply via email to