D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
ICE(todt.c) when using a named mixin with an initializer as template alias parameter |
Product: |
D
|
Reporter: |
Koroskin Denis <2korden> |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
normal
|
CC: |
bugzilla, clugdbug, Kosmonaut
|
Priority: |
P2
|
Keywords: |
ice-on-valid-code, patch |
Version: |
D1 (retired) |
Hardware: |
Other |
OS: |
Windows |
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'
This applies equally to D1.047. It's been present since prehistory (fails identically on DMD0.175).
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.
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 5
Walter Bright
2009年11月06日 11:30:21 UTC
Fixed dmd 1.051 and 2.036