Bug 17267 – Forward reference error in recursive template

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2017-03-19T09:56:25Z
Last change time
2024-12-13T18:51:52Z
Assigned to
No Owner
Creator
Jack Applegame
Moved to GitHub: dmd#19241 →

Comments

Comment #0 by japplegame — 2017-03-19T09:56:25Z
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
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19241 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB