This code compiles:
struct A(T) {
T* ptr;
void m() {
pragma(msg, T.sizeof);
}
}
struct B {
int i;
A!B a;
}
Following should compile, but doesn't (struct foo.B no size because of forward reference):
// example 1 (struct definition inside function)
struct A(T) {
T* ptr;
void m() {
pragma(msg, T.sizeof);
}
}
void foo() {
static struct B {
int i;
A!B a;
}
}
// example 2 (sizeof outside member function)
struct A(T) {
T* ptr;
pragma(msg, T.sizeof);
}
struct B {
int i;
A!B a;
}
Comment #1 by slavo5150 — 2017-11-25T06:50:30Z
*** Issue 17230 has been marked as a duplicate of this issue. ***
Comment #2 by simen.kjaras — 2017-12-27T10:00:52Z
Another, possibly simplified example:
// Mixed templates
struct S1 {
S2!()* arr;
}
struct S2()
{
// struct S1 no size because of forward reference
private byte[S1.sizeof] payload;
}
It seems to be caused by some ordering issues in DMD, where it tries to calculate the size of S1, notices that it depends on a templated type, and just up and dies.
Note also that these variants compile:
// No templates
struct S3 {
S4* arr;
}
struct S4 {
private byte[S3.sizeof] payload;
}
// All templates
struct S5() {
S6!()* arr;
}
struct S6() {
private byte[S5!().sizeof] payload;
}
S6!() dummy; // Force instantiation
// Mixed templates, revisited
struct S7() {
S8* arr;
}
struct S8
{
private byte[S7!().sizeof] payload;
}
Comment #3 by robert.schadek — 2024-12-13T18:51:52Z