Thread overview
static immutable and lambdas inside struct or class. Is that bug or not?
Aug 14, 2016
Uranuz
Aug 14, 2016
ag0aep6g
Aug 14, 2016
Uranuz
August 14, 2016
Greatings!
I need help with these lines bellow. I don't understand why it doesn't compile. Is it bug somewhere in Phobos or compiler? Or just I wrote smth wrong?
//---------
struct A
{
	import std.algorithm: map;
	import std.array: array;
	import std.typecons: tuple;
	
	
	static immutable aaa = [
		tuple("1", "one"),
		tuple("2", "two"),
		tuple("3", "three")
	];
	
	static immutable bbb = aaa.map!( a => a[0] ).array;
	
}

void main()
{
	A a = A();
}

//---------

Compilation output:
/opt/compilers/dmd2/include/std/algorithm/iteration.d(455): Error: this.__lambda6 has no value

You could test it here: https://dpaste.dzfl.pl/67a8cda8f2a8
August 14, 2016
On 08/14/2016 04:27 PM, Uranuz wrote:
> Greatings!
> I need help with these lines bellow. I don't understand why it doesn't
> compile. Is it bug somewhere in Phobos or compiler? Or just I wrote smth
> wrong?
> //---------
> struct A
> {
>     import std.algorithm: map;
>     import std.array: array;
>     import std.typecons: tuple;
>
>
>     static immutable aaa = [
>         tuple("1", "one"),
>         tuple("2", "two"),
>         tuple("3", "three")
>     ];
>
>     static immutable bbb = aaa.map!( a => a[0] ).array;
>
> }
>
> void main()
> {
>     A a = A();
> }
>
> //---------
>
> Compilation output:
> /opt/compilers/dmd2/include/std/algorithm/iteration.d(455): Error:
> this.__lambda6 has no value
>
> You could test it here: https://dpaste.dzfl.pl/67a8cda8f2a8

Looks like a compiler bug, since it works without the struct:

----
import std.algorithm: map;
import std.array: array;
import std.typecons: tuple;


immutable aaa = [
	tuple("1", "one"),
	tuple("2", "two"),
	tuple("3", "three")
];

immutable bbb = aaa.map!( a => a[0] ).array;
----

And that's essentially the same thing.

It has already been filed:
https://issues.dlang.org/show_bug.cgi?id=15908

For a workaround, it works when you explicitly state the type of the parameter:

----
struct A
{
    import std.algorithm: map;
    import std.array: array;
    import std.typecons: tuple, Tuple;


    static immutable aaa = [
        tuple("1", "one"),
        tuple("2", "two"),
        tuple("3", "three")
    ];

    alias Tup = Tuple!(string, string);
    static immutable bbb = aaa.map!( (Tup a) => a[0] ).array;
}
----
August 14, 2016
On Sunday, 14 August 2016 at 15:53:21 UTC, ag0aep6g wrote:
> On 08/14/2016 04:27 PM, Uranuz wrote:
>> [...]
>
> Looks like a compiler bug, since it works without the struct:
>
> ----
> import std.algorithm: map;
> import std.array: array;
> import std.typecons: tuple;
>
>
> immutable aaa = [
> 	tuple("1", "one"),
> 	tuple("2", "two"),
> 	tuple("3", "three")
> ];
>
> immutable bbb = aaa.map!( a => a[0] ).array;
> ----
>
> And that's essentially the same thing.
>
> It has already been filed:
> https://issues.dlang.org/show_bug.cgi?id=15908
>
> For a workaround, it works when you explicitly state the type of the parameter:
>
> ----
> struct A
> {
>     import std.algorithm: map;
>     import std.array: array;
>     import std.typecons: tuple, Tuple;
>
>
>     static immutable aaa = [
>         tuple("1", "one"),
>         tuple("2", "two"),
>         tuple("3", "three")
>     ];
>
>     alias Tup = Tuple!(string, string);
>     static immutable bbb = aaa.map!( (Tup a) => a[0] ).array;
> }
> ----

OK. I just declared alias for predicate outside struct to workaround. Maybe compiler trying to get context when attemting to infer arguments for some reason, but fails. Or something else...