On Tuesday, 7 July 2015 at 19:54:19 UTC, jmh530 wrote:
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.

No, pointers are fine. It's pointer arithmetic that's considered unsafe.

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 !)

So long as you exclamation mark? Huh?

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;

You're explicitly typing that as `real function(real)` which is not an @safe type. Add @safe and you're good to go:

real function(real) @safe fp = &cbrt;
function_safety(fp); /* prints "fp is safe" */

Or let the compiler infer things:

auto fp = &cbrt;
function_safety(fp); /* prints "fp is trusted" */

        function_safety(fp);     //prints fp is system
}

Reply via email to