Bug 3292 – ICE(todt.c) when using a named mixin with an initializer as template alias parameter

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
Other
OS
Windows
Creation time
2009-09-03T13:17:00Z
Last change time
2014-04-18T09:12:08Z
Keywords
ice-on-valid-code, patch
Assigned to
nobody
Creator
2korden

Comments

Comment #0 by 2korden — 2009-09-03T13:17:58Z
template Magic() { void* magic = null; // remove = null; and bug disappears } struct Item { mixin Magic A; } struct Foo(alias S) { } void main() { Foo!(Item.A) bar; } Assertion failure: 'type' on line 529 in file 'todt.c'
Comment #1 by clugdbug — 2009-09-16T00:33:45Z
This applies equally to D1.047. It's been present since prehistory (fails identically on DMD0.175).
Comment #2 by clugdbug — 2009-09-29T23:52:44Z
Another variation gives an ICE in optimize.c. Replace void *magic = null; with void* magic = cast(void*)(0); Again, it's because no 'type' is NULL.
Comment #3 by clugdbug — 2009-10-12T01:55:37Z
This is happening because in this situation, when TemplateMixin::semantic() is called, semanticRun is already 3. The members get syntax copied: // Copy the syntax trees from the TemplateDeclaration members = Dsymbol::arraySyntaxCopy(tempdecl->members); But this destroys their type info, and then since semanticRun is 3, semantic2 never gets run, hence semantic() never gets called on the members ---> they have no type. I don't think this mixin should be run at all, if it's already done the semantic3 pass. (Note: I have NOT tested this patch against the DMD test suite). PATCH: Line 4457, in template.c, TemplateMixin::semantic(Scope *sc) if (!semanticRun) semanticRun = 1; + if (semanticRun >1) return; ---------------------------- But I'm not sure if this is the correct place to do this check. Should it be being asked to do the semantic at all? It's being called from AliasDeclaration::semantic(), and I'm not sure why: if (aliassym) { if (aliassym->isTemplateInstance()) { aliassym->semantic(sc); // Is this correct?? } return; }
Comment #4 by Kosmonaut — 2009-10-31T21:24:37Z
Comment #5 by bugzilla — 2009-11-06T11:30:21Z
Fixed dmd 1.051 and 2.036