Fix bug reported by downs. Related to delegate types within tuple template parameters.

This commit is contained in:
Christian Kamm
2008-11-18 17:14:57 +01:00
parent 41d9e79780
commit ccd8810e68
2 changed files with 20 additions and 1 deletions

View File

@@ -2951,6 +2951,11 @@ Type *TypeFunction::semantic(Loc loc, Scope *sc)
{ Argument *arg = Argument::getNth(tf->parameters, i);
Type *t;
// each function needs its own copy of a tuple arg, since
// they mustn't share arg flags like inreg, ...
if (arg->type->ty == Ttuple)
arg->type = arg->type->syntaxCopy();
tf->inuse++;
arg->type = arg->type->semantic(loc,sc);
if (tf->inuse == 1) tf->inuse--;
@@ -3466,7 +3471,7 @@ L1:
}
}
if (t->ty == Ttuple)
*pt = t->syntaxCopy();
*pt = t;
else
*pt = t->merge();
}

View File

@@ -0,0 +1,14 @@
alias char[] string;
template Unstatic(T) { alias T Unstatic; }
template Unstatic(T: T[]) { alias T[] Unstatic; }
template StupleMembers(T...) {
static if (T.length) {
const int id=T[0..$-1].length;
const string str=StupleMembers!(T[0..$-1]).str~"Unstatic!(T["~id.stringof~"]) _"~id.stringof~"; ";
} else const string str="";
}
struct Stuple(T...) {
mixin(StupleMembers!(T).str);
}
Stuple!(string, void delegate(float)) foo;