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();