Bug 10451 – Array of pointers to opaque struct gives forward reference errors.
Status
RESOLVED
Resolution
FIXED
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-06-23T08:42:00Z
Last change time
2013-10-02T05:56:44Z
Keywords
pull
Assigned to
nobody
Creator
aldacron
Comments
Comment #0 by aldacron — 2013-06-23T08:42:23Z
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.
Comment #1 by aldacron — 2013-08-11T07:23:09Z
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
===================
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.
Comment #6 by turkeyman — 2013-09-18T04:39:28Z
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?
Comment #7 by ibuclaw — 2013-09-18T05:41:37Z
(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*" =)
Comment #8 by turkeyman — 2013-09-18T05:46:42Z
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?
Comment #9 by grogan.colin — 2013-09-18T05:48:42Z
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.
Comment #10 by k.hara.pg — 2013-09-28T23:02:28Z
*** Issue 10766 has been marked as a duplicate of this issue. ***