[Issue 21537] Function pointer* pointer' attributes not covariant when referencing (delegates' are)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Nov 22 14:41:53 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=21537

--- Comment #4 from moonlightsentinel at disroot.org ---
(In reply to Bolpat from comment #3)
> How is a pointer to a function pointer morally different from a pointer to a
> delegate or a pointer to a class object reference?

It isn't.

> If types T and S have a subtyping relationship like T ⊆ S, then const(T)* ⊆
> const(S)*; at least, this is the case when T and S are class types or when T
> and S are delegate types, but fails when T and S are function pointer types.

No, such implicit conversion for pointer are already rejected:

class A {}
class B : A {}

alias SysFP = void function();
alias SafeFP = void function() @safe;

alias SysDG = void delegate();
alias SafeDG = void delegate() @safe;

void main()
{
    {
        A a;
        B b;
        a = b; // Fine
    }{
        A* ap;
        B* bp;
        ap = bp; // Error: cannot implicitly convert expression `bp` of type
`B*` to `A*`
    }{
        SafeFP safeFp;
        SysFP sysFp;
        sysFp = safeFp; // Fine
    }{
        SafeFP* safeFpPtr;
        SysFP* sysFpPtr;
        sysFpPtr = safeFpPtr; // Error: cannot implicitly convert expression
`safeFpPtr` of type `void function() @safe*` to `void function()*`
    }{
        SafeDG safeDg;
        SysDG sysDg;
        sysDg = safeDg; // Fine
    }{
        SafeDG* safeDgPtr;
        SysDG* sysDgPtr;
        sysDgPtr = safeDgPtr; // Error: cannot implicitly convert expression
`safeDgPtr` of type `void delegate() @safe*` to `void delegate()*`
    }
}

--


More information about the Digitalmars-d-bugs mailing list