// tok.d import tok2; class B{ A a; void b(){ a.call!(MOTHER)("HI MUM"); } } // tok2.d class A{ void call(string s){ } } //__EOF__ okay, compile like so: $ dmd tok tok2 Error: identifier 'MOTHER' is not defined $ dmd tok2 tok Error: identifier 'MOTHER' is not defined dmd: func.c:135: virtual void FuncDeclaration::semantic(Scope*): Assertion `semanticRun <= 1' failed. Aborted
Reduced test case. --- test.d ---------------- import test2; void b(){ test2.call!(); } --- test2.d --------------- void call(){ } --------------------------- assert func.c(133) semanticRun <= 1 This is a regression: it worked on DMD 2.026, but failed on 2.030 and later. Fails on the current D1, as well. When doing a DotIdExpTemplate call, it doesn't check that thing it's calling is actually a template.
PATCH against DMD2.036. Passes the DMD test suite + phobos unittests. Expression.c, DotTemplateInstanceExp::semantic(). Ensure it's a template BEFORE running the semantic pass. Index: expression.c =================================================================== --- expression.c (revision 234) +++ expression.c (working copy) @@ -6082,6 +6082,14 @@ goto Lerr; } s = s2; + + td = s->toAlias()->isTemplateDeclaration(); + if (!td) + { + error("%s is not a template", id->toChars()); + goto Lerr; + } + s->semantic(sc); s = s->toAlias(); td = s->isTemplateDeclaration();
Fixed dmd 1.053 and 2.037