http://bugzilla.gdcproject.org/show_bug.cgi?id=231
Johannes Pfau <johannesp...@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ibuc...@gdcproject.org, | |johannesp...@gmail.com --- Comment #1 from Johannes Pfau <johannesp...@gmail.com> --- I've tracked this down: widget.d -------------------------------------- interface ImplementorIF { void* getImplementorStruct(); void* getStruct(); } template ImplementorT() { void* getImplementorStruct() { return null; } } class Widget : ImplementorIF { mixin ImplementorT; void* getStruct() { return null; } } -------------------------------------- range.d -------------------------------------- import Widget; class Range : Widget { void* getStruct() { return null; } } void main() {} -------------------------------------- gdc range.d widget.d The problem is our thunk emission. We call toObjfile in FuncDeclaration::toThunkSymbol, DMD does not. This code was initially added in cbd6d919559697bba6bb210acc2761ae43dbaf8a to fix issue 27. Back then we had a output_declaration_p check in toObjfile that prevented emitting getImplementorStruct. 9766ddee234a3db05b24d071bd15987373d962f5 changed the output_declaration_p check into a simple gcc_attribute_p(this) check which caused this regression. I wonder how dmd handles issue 27 without calling toObjfile and whether we should do the same thing. If we have to keep calling toObjfile I think we need to re-add this code to toObjfile: -------------------------------------- FuncDeclaration *fd = dsym->isFuncDeclaration(); if (fd != NULL) { for (FuncDeclaration *fdp = fd; fdp != NULL;) { if (!fdp->isInstantiated() && fdp->inNonRoot()) return false; if (!fdp->isNested()) break; fdp = fdp->toParent2()->isFuncDeclaration(); } } if (!flag_emit_templates) return !D_DECL_IS_TEMPLATE (dsym->toSymbol()->Stree); -------------------------------------- What do you think, Iain? -- You are receiving this mail because: You are watching all bug changes.