std.container.array of struct inside a struct fails
Anton Fediushin via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jul 14 09:12:05 PDT 2017
This code:
-----
import std.container.array;
struct Test {
Array!Test t;
}
-----
Fails with an error:
-----
/usr/include/dlang/dmd/std/traits.d(2404): Error: struct
arrayissue.Test no size because of forward reference
/usr/include/dlang/dmd/std/traits.d(3462): Error: template
instance std.traits.FieldTypeTuple!(Test) error instantiating
/usr/include/dlang/dmd/std/container/array.d(276):
instantiated from here: hasElaborateDestructor!(Test)
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/container/array.d(280): Error:
template instance std.traits.hasIndirections!(Test) error
instantiating
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/traits.d(2613): Error: template
instance std.traits.RepresentationTypeTuple!(Test) error
instantiating
/usr/include/dlang/dmd/std/traits.d(2934): instantiated
from here: hasRawAliasing!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1362):
instantiated from here: hasAliasing!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1206):
instantiated from here: moveEmplace!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1200): ...
(3 instantiations, -v to show) ...
/usr/include/dlang/dmd/std/container/array.d(487):
instantiated from here: RangeT!(Array!(Test))
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/traits.d(2934): Error: template
instance std.traits.hasObjects!(Test) error instantiating
/usr/include/dlang/dmd/std/algorithm/mutation.d(1362):
instantiated from here: hasAliasing!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1206):
instantiated from here: moveEmplace!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1200):
instantiated from here: moveImpl!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1162): ...
(2 instantiations, -v to show) ...
/usr/include/dlang/dmd/std/container/array.d(487):
instantiated from here: RangeT!(Array!(Test))
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1372): Error:
template instance std.traits.hasElaborateAssign!(Test) error
instantiating
/usr/include/dlang/dmd/std/algorithm/mutation.d(1206):
instantiated from here: moveEmplace!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1200):
instantiated from here: moveImpl!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1162):
instantiated from here: trustedMoveImpl!(Test)
/usr/include/dlang/dmd/std/container/array.d(148): ... (1
instantiations, -v to show) ...
/usr/include/dlang/dmd/std/container/array.d(487):
instantiated from here: RangeT!(Array!(Test))
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1379): Error:
template instance std.traits.hasElaborateCopyConstructor!(Test)
error instantiating
/usr/include/dlang/dmd/std/algorithm/mutation.d(1206):
instantiated from here: moveEmplace!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1200):
instantiated from here: moveImpl!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1162):
instantiated from here: trustedMoveImpl!(Test)
/usr/include/dlang/dmd/std/container/array.d(148): ... (1
instantiations, -v to show) ...
/usr/include/dlang/dmd/std/container/array.d(487):
instantiated from here: RangeT!(Array!(Test))
arrayissue.d(4): instantiated from here: Array!(Test)
-----
But if I use `Test[] t;` instead, everything is fine.
Also, same code with `class` instead of `struct` works fine, and
using `union` produces this error message:
-----
/usr/include/dlang/dmd/std/traits.d(2404): Error: union
arrayissue.Test no size because of forward reference
/usr/include/dlang/dmd/std/traits.d(3025): Error: template
instance std.traits.FieldTypeTuple!(Test) error instantiating
/usr/include/dlang/dmd/std/container/array.d(280):
instantiated from here: hasIndirections!(Test)
arrayissue.d(4): instantiated from here: Array!(Test)
/usr/include/dlang/dmd/std/traits.d(2613): Error: template
instance std.traits.RepresentationTypeTuple!(Test) error
instantiating
/usr/include/dlang/dmd/std/traits.d(2934): instantiated
from here: hasRawAliasing!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1362):
instantiated from here: hasAliasing!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1206):
instantiated from here: moveEmplace!(Test)
/usr/include/dlang/dmd/std/algorithm/mutation.d(1200): ...
(3 instantiations, -v to show) ...
/usr/include/dlang/dmd/std/container/array.d(487):
instantiated from here: RangeT!(Array!(Test))
arrayissue.d(4): instantiated from here: Array!(Test)
----
So, is it a bug, which should be fixed or it cannot be
implemented at all? In this case it should be documented.
More information about the Digitalmars-d-learn
mailing list