diff --git a/dmd/mtype.c b/dmd/mtype.c index 5bcaa9e3..f8ec367a 100644 --- a/dmd/mtype.c +++ b/dmd/mtype.c @@ -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(); } diff --git a/tests/mini/compile_delegatetuple.d b/tests/mini/compile_delegatetuple.d new file mode 100644 index 00000000..2416c796 --- /dev/null +++ b/tests/mini/compile_delegatetuple.d @@ -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;