struct foo; struct bar { foo*[] foos; } The error only occurs when the array is declared as a struct field. When declared as a class member or in a function, there is no error.
I've got some new info on this. The error also occurs outside of structs if the array is initialized: ========= struct foo; void main() { foo*[] foos = []; } ========= Here's the full error spew that I get in both cases: ================== forref.d(3): Error: struct forrref.foo is forward referenced when looking for 't oHash' forref.d(3): Error: struct forrref.foo is forward referenced when looking for 'o pCmp' forref.d(3): Error: struct forrref.foo is forward referenced when looking for 't oString' forref.d(3): Error: struct forrref.foo unknown size forref.d(3): Error: struct forrref.foo no size yet for forward reference forref.d(3): Error: struct forrref.foo unknown size forref.d(3): Error: struct forrref.foo no size yet for forward reference ===================
http://d.puremagic.com/issues/show_bug.cgi?id=10451
Manu meant this: :) http://d.puremagic.com/issues/show_bug.cgi?id=10766
(In reply to comment #3) > Manu meant this: :) > > http://d.puremagic.com/issues/show_bug.cgi?id=10766 Haha, thx ;)
This happens because, eg: array literals are initialised by the GC by calling _d_arrayliteralTX (typeinfo, dim); This requires that the struct has a complete runtime type information about a type. Something that does not get generated for opaque types, which makes this bug not the easiest to fix - and the same is with other array operations which also require typeinfo to be available.
But the compiler doesn't need to know anything about the type to allocate an array of pointers. Surely the compiler can use/share the typeinfo of void* in this case?
(In reply to comment #6) > But the compiler doesn't need to know anything about the type to allocate an > array of pointers. Surely the compiler can use/share the typeinfo of void* in > this case? Sure we could use void* if is your expectation for typeid(foo*).toString to return "void*" =)
Surely it can't be hard to synthesize a named pointer type... unless it's dereferenced, it shouldn't need an actual definition in the typeinfo. So it would just be a stub or dummy typeinfo that's empty?
A possible workaround to this is to create the struct like: struct foo {} Though, in this case it isn't an opaque struct and is merely a struct with no members.
*** Issue 10766 has been marked as a duplicate of this issue. ***
https://github.com/D-Programming-Language/dmd/pull/2594
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/e7d3e97cdaf4653a39f7f9c68a4868ede2c4bb6b fix Issue 10451 - Array of pointers to opaque struct gives forward reference errors. https://github.com/D-Programming-Language/dmd/commit/f2cc07963d2ade375c056b48580d7c638d11f60c Merge pull request #2594 from 9rnsr/fix10451 Issue 10451 - Array of pointers to opaque struct gives forward reference errors.
*** Issue 9795 has been marked as a duplicate of this issue. ***