Simple implementation of __FUNCTION

r_m_r r_m_r at mailinator.com
Tue Nov 6 03:18:50 PST 2012


I don't know how I missed this thread. I was having the same 
'forward reference' error and after a brief chat on #D IRC, 
thought it might be a compiler bug and reported it as such: 
http://d.puremagic.com/issues/show_bug.cgi?id=8963 . Should I 
close this issue?

Any thoughts on possible workarounds?

BTW I've been 'mixing'-in this template in all my functions (for 
debugging):

//---- Code ---
import std.traits : PIT=ParameterIdentifierTuple;

template dbg(string msg)
{
     const char[] dbg = "writeln( src(\"DBG\",
                                     __traits(identifier, 
__traits(parent, {})) ~
                                     
_params_join([PIT!(__traits(parent,{}))]),
                                     " ~ msg ~ "
                                     )
                                );" ;
}
//----- Code ---

Its working great except for the "auto"-return functions.

rmr

On Tuesday, 6 November 2012 at 07:46:47 UTC, Don Clugston wrote:
> On 06/11/12 07:09, Rob T wrote:
>> On Friday, 2 November 2012 at 22:33:37 UTC, Rob T wrote:
>>> I discovered it fails to compile when inside a function with 
>>> "auto" as
>>> the return type.
>>>
>>> auto test()
>>> {
>>>   throw new Exception(  mixin(__FUNCTION) );
>>>   return 0;
>>> }
>>>
>>> Error: forward reference to test
>>>
>>> but this works
>>>
>>> int test()
>>> {
>>>   throw new Exception(  mixin(__FUNCTION) );
>>>   return 0;
>>> }
>>>
>>> So we're kinda sunk for inclusion in phobos unless this error 
>>> can be
>>> resolved.
>>>
>>> I'll try the enum idea to see if that works.
>>>
>>> --rt
>>
>> An update on this problem. I found out that the error when 
>> using auto as
>> return type has nothing to do with the mixin. The compiler 
>> error
>> persists when you take mixin out and put in the __traits( ... 
>> ) code
>> directly.
>>
>> Does anyone else think that this is a compiler bug? If it is a 
>> bug then
>> I'll report it in the bug tracker.
>>
>> --rt
>
> It fails because you're asking for the full function name, 
> before its type has been determined. (There's no real return 
> type 'auto', 'auto' just means 'work it out for me').
>
> I don't think this is a bug. Although it might be solvable in 
> this particular example, in general it's a circular dependency.
>
> eg, if you do:
>
> auto foo()
> {
>    static if (__FUNCTION == "int foo()") { return 'a' }
>    return 0;
> }
> if __FUNCTION is "int foo()" then it will return a char, which 
> means its signature is "char foo()". This is a contradiction.




More information about the Digitalmars-d mailing list