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;
}