diff --git a/src/expression.c b/src/expression.c index a5ab1feae3db..2343e83c37e3 100644 --- a/src/expression.c +++ b/src/expression.c @@ -5290,11 +5290,17 @@ Expression *FuncExp::syntaxCopy() fd2 = (*td2->members)[0]->isFuncLiteralDeclaration(); assert(fd2); } - else + else if (fd->semanticRun == PASSinit) { td2 = NULL; fd2 = (FuncLiteralDeclaration *)fd->syntaxCopy(NULL); } + else + { + // Bugzilla 13481: Prevent multiple semantic analysis of lambda body. + td2 = NULL; + fd2 = fd; + } return new FuncExp(loc, fd2, td2); } diff --git a/test/compilable/compile1.d b/test/compilable/compile1.d index 986429957c9c..bb8245b7df39 100644 --- a/test/compilable/compile1.d +++ b/test/compilable/compile1.d @@ -708,3 +708,19 @@ final class C12703 { S12703 s = S12703(1); } + +/***************************************************/ +// 13481 + +mixin template Mix13481(void function() callback) +{ + static this() + { + callback(); + } +} + +void sort13481() { int[] arr; arr.sort; } +mixin Mix13481!(&sort13481); + +mixin Mix13481!({ int[] arr; arr.sort; });