digitalmars.D.bugs - [Issue 18833] New: [REG 2.073] DMD in some cases forgets to generate
- d-bugmail puremagic.com (65/65) May 06 2018 https://issues.dlang.org/show_bug.cgi?id=18833
https://issues.dlang.org/show_bug.cgi?id=18833 Issue ID: 18833 Summary: [REG 2.073] DMD in some cases forgets to generate wrapping TypeInfo for modifiers on classes Product: D Version: D2 Hardware: All OS: All Status: NEW Keywords: link-failure, rejects-valid Severity: regression Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: schveiguy yahoo.com Given an imported non-root module (e.g. one from a library), that instantiates a template class inside an auto function that is NOT a template, if you try to access a modified typeinfo for that object, it will fail to generate the wrapping TypeInfo. For example a const(MyObject!params). Simplest example: mod1.d: module mod1; class C(T) { } auto foo() { return new C!int; } app.d: import mod1; void main() { const s = foo(); alias T = typeof(s); auto x = typeid(T); } Compile like this: dmd -c mod1.d dmd app.d mod1.o Error: Undefined symbols for architecture x86_64: "__D26TypeInfo_xC4mod1__T1CTiZQf6__initZ", referenced from: __Dmain in app.o ld: symbol(s) not found for architecture x86_64 The missing TypeInfo is for const(C!int) What I think happens is that in order to compile, it has to semantic the foo function, which means it sees that mod1 has already instantiated the C!int template. This is a situation pretty much reserved for auto functions. It requires a template instantiation in a non-root module, that is NOT inside another template. See typinf.d's function isSpeculativeType, where it checks a typeinfo's minst. That minst is set to null inside dsymbolsem.templateInstanceSemantic with this code: // https://issues.dlang.org/show_bug.cgi?id=10920 // If the enclosing function is non-root symbol, // this instance should be speculative. if (!tempinst.tinst && sc.func && sc.func.inNonRoot()) { tempinst.minst = null; } So I don't know how to fix. You don't want to re-instantiate the template, but you still need the wrapping typeinfo. The compiler seems to ignore the type modifier when checking to see if it should emit the typeinfo. --
May 06 2018