Thread overview
Traits question and compiler crash
Apr 14, 2015
Filippo Fantini
Apr 14, 2015
anonymous
Apr 14, 2015
Filippo Fantini
Apr 14, 2015
Filippo Fantini
April 14, 2015
Hello everyone!

I'm new to D.
While playing with around with traits,
I ended up writing this short example:


module test;

class Foo
{
    private int _value = 21;

    void foo()
    {
        import std.traits;

        alias funs = MemberFunctionsTuple!( typeof( this ), "bar" );

        version( crash )
	{
            void function( string ) b = &funs[ 0 ];
            b( "world" );
        }

        funs[ 0 ]( "world" );
    }

    void bar( string s )
    {
        import std.stdio;
        writeln( "hello ", s, "! ", _value );
    }
}

void main()
{
    auto f = new Foo();
    f.foo();
}


My first question is why building this with
dmd test.d

the line:
funs[ 0 ]( "world" );

does not crash, as I would expect because there's no this pointer to access _value when calling the member function.


The second question is why when building with:
dmd -version=crash test.d

the compiler just crashes instead.


These experiments were done with DMD v2.067.0 on Ubuntu x64 and on Windows x64.

Thank you!

April 14, 2015
On Tuesday, 14 April 2015 at 09:24:04 UTC, Filippo Fantini wrote:
> Hello everyone!
>
> I'm new to D.
> While playing with around with traits,
> I ended up writing this short example:
>
>
> module test;
>
> class Foo
> {
>     private int _value = 21;
>
>     void foo()
>     {
>         import std.traits;
>
>         alias funs = MemberFunctionsTuple!( typeof( this ), "bar" );
>
>         version( crash )
> 	{
>             void function( string ) b = &funs[ 0 ];
>             b( "world" );
>         }
>
>         funs[ 0 ]( "world" );
>     }
>
>     void bar( string s )
>     {
>         import std.stdio;
>         writeln( "hello ", s, "! ", _value );
>     }
> }
>
> void main()
> {
>     auto f = new Foo();
>     f.foo();
> }
>
>
> My first question is why building this with
> dmd test.d
>
> the line:
> funs[ 0 ]( "world" );
>
> does not crash, as I would expect because there's no this pointer to access _value when calling the member function.

That's the same as `Foo.bar("world");`, which also works. The this pointer is passed even though the call does not show it. I don't know if or where this is specified, but I'm pretty sure it's supposed to work like this.

> The second question is why when building with:
> dmd -version=crash test.d
>
> the compiler just crashes instead.

Every compiler crash is a bug. Please report it at <http://issues.dlang.org/>.
April 14, 2015
On Tuesday, 14 April 2015 at 10:43:16 UTC, anonymous wrote:
> On Tuesday, 14 April 2015 at 09:24:04 UTC, Filippo Fantini wrote:
>> Hello everyone!
>>
>> I'm new to D.
>> While playing with around with traits,
>> I ended up writing this short example:
>>
>>
>> module test;
>>
>> class Foo
>> {
>>    private int _value = 21;
>>
>>    void foo()
>>    {
>>        import std.traits;
>>
>>        alias funs = MemberFunctionsTuple!( typeof( this ), "bar" );
>>
>>        version( crash )
>> 	{
>>            void function( string ) b = &funs[ 0 ];
>>            b( "world" );
>>        }
>>
>>        funs[ 0 ]( "world" );
>>    }
>>
>>    void bar( string s )
>>    {
>>        import std.stdio;
>>        writeln( "hello ", s, "! ", _value );
>>    }
>> }
>>
>> void main()
>> {
>>    auto f = new Foo();
>>    f.foo();
>> }
>>
>>
>> My first question is why building this with
>> dmd test.d
>>
>> the line:
>> funs[ 0 ]( "world" );
>>
>> does not crash, as I would expect because there's no this pointer to access _value when calling the member function.
>
> That's the same as `Foo.bar("world");`, which also works. The this pointer is passed even though the call does not show it. I don't know if or where this is specified, but I'm pretty sure it's supposed to work like this.
>
>> The second question is why when building with:
>> dmd -version=crash test.d
>>
>> the compiler just crashes instead.
>
> Every compiler crash is a bug. Please report it at <http://issues.dlang.org/>.


Thanks.
I've created an issue:
<https://issues.dlang.org/show_bug.cgi?id=14448/>
April 14, 2015
correct link:

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