Bug 3469 – ICE(func.c): Regression. Calling non-template function as a template, from another module

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
Other
OS
All
Creation time
2009-11-02T18:35:00Z
Last change time
2014-04-18T09:12:08Z
Keywords
ice-on-invalid-code, patch
Assigned to
nobody
Creator
ellery-newcomer

Comments

Comment #0 by ellery-newcomer — 2009-11-02T18:35:20Z
// 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
Comment #1 by clugdbug — 2009-11-03T01:05:18Z
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.
Comment #2 by clugdbug — 2009-11-03T03:45:48Z
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();
Comment #3 by bugzilla — 2009-12-06T00:46:48Z
Fixed dmd 1.053 and 2.037