[dmd 2.066-b1] std.range.array with shared objects and AA rehash

Meta via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 7 08:34:32 PDT 2014


On Monday, 7 July 2014 at 09:53:22 UTC, NCrashed wrote:
> I am using ranges (wrapped in InputRangeObject for use in 
> interfaces) of shared objects, with new beta some cases are 
> broken:
> ```
> import std.range;
>
> class A {}
>
> InputRange!(shared A) foo()
> {
> 	return [new A].inputRangeObject;
> }
>
> void bar()
> {
> 	auto res = foo.array;
> }
>
> void main() {}
> ```
> Fails with:
> ```
> source/app.d(7): Error: cannot implicitly convert expression 
> (inputRangeObject([new A])) of type 
> std.range.InputRangeObject!(A[]).InputRangeObject to 
> std.range.InputRange!(shared(A)).InputRange
> /usr/include/dmd/phobos/std/conv.d(3914): Error: cannot 
> implicitly convert expression (arg) of type shared(A) to app.A
> /usr/include/dmd/phobos/std/array.d(2476): Error: template 
> instance std.conv.emplaceRef!(shared(A)).emplaceRef!(shared(A)) 
> error instantiating
> /usr/include/dmd/phobos/std/array.d(64):        instantiated 
> from here: put!(shared(A))
> source/app.d(12):        instantiated from here: 
> array!(InputRange!(shared(A)))
> ```
>
> And also AA starts behave strange in shared context:
> ```
> shared string[][string] map;
>
> void main()
> {
> 	map.rehash;
> }
> ```
> My AA is stored in shared class, the shared is inferred 
> implicitly. Also following workaround works:
> ```
> void main()
> {
> 	(cast(shared(string[])[string])map).rehash;
> }
> ```
>
> Is this behavior a bug, or it works as expected?

I don't know about your second problem, but the fix for your 
first problem is to construct a shared A. You're trying to create 
a normal A and have it implicitly casted to shared, which the 
compiler won't do.

InputRange!(shared A) foo()
{
         //"new shared A" instead of "new A"
	return [new shared A].inputRangeObject;
}


More information about the Digitalmars-d-learn mailing list