On Fri, 04 May 2012 10:19:08 -0400, H. S. Teoh <hst...@quickfur.ath.cx> wrote:

Argh... this is really annoying. So I tried all sorts of combinations of
function pointer syntax in order to get the correct type for a ref
function that returns const(T), but couldn't. So I decided to let the
language tell me itself what the type is:

        import std.stdio;
        struct S {}
        ref const(S) func() { ... }
        void main() {
                auto fp = &func;
                writeln(typeid(fp));
        }

This program outputs:

        const(test.S)()*

This is a bug in druntime. It should *never* print shit like this, we got rid of C-style function pointers.

try this instead when printing a type instead of typeid:

writeln(typeof(fp).stringof);

This can even be used at compile time:

pragma(msg, typeof(fp).stringof);

Result is:

const(S) function() ref

So let's try it!

void main()
{
   const(S) function() ref fp = &func;
}

typeidbug.d(6): no identifier for declarator const(S) function()
typeidbug.d(6): semicolon expected, not 'ref'

bleh, tried this too:

alias const(S) function() ref T;
...
T fp = &func;

typeidbug.d(4): found 'ref' when expecting '('
typeidbug.d(4): found ';' when expecting ')'
typeidbug.d(5): no identifier for declarator const(S) function(T)
typeidbug.d(5): semicolon expected to close alias declaration

this does work though:

alias typeof(&func) T;

So this type cannot be manually written, due to parsing ambiguities for ref.

So we got two bugs here:

1. you cannot manually write the type of such a function.
2. typeid(&func).toString() returns crap.

-Steve

Reply via email to