Bug 5184 – throw ClassName.templatedStaticMethod(...) cannot be parsed

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
Windows
Creation time
2010-11-07T01:18:00Z
Last change time
2015-06-09T05:11:49Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
kiki

Attachments

IDFilenameSummaryContent-TypeSize
941patch.txtA patch to fix the issuetext/plain631

Comments

Comment #0 by kiki — 2010-11-07T01:18:51Z
The following code doesn't compile (in dmd 2.050 and 1.065), but I think it should. class Factory { static Exception create(T)(T x) { return new Exception("whatever"); } } void main() { throw Factory.create(123); } Error message is the following: > test.d(11): Error: type Factory is not an expression Either one of the changes dissolves the compilation failure: - Changing the method declaration into a non-template create(int x) - Decomposing the throw statement as auto e = Factory.create(123); throw e; The combination of throw+static+template seems causing a trouble.
Comment #1 by kiki — 2011-04-09T02:10:36Z
Created attachment 941 A patch to fix the issue What was happening was: 1. Factory.create(123) is desugared into CommaExp: (Factory, Factory.create(123)). This is done in CallExp::semantic when the method is static template method. I'm not at all sure but is this for keeping side-effects for some cases? 2. In e2ir.c TypeExp::toElem emits the compilation error; it tries to compile lhs and rhs into IR, but TypeExp cannot be compiled to IR. The patch modifies the first point. If the expression is "TYPE . SOMETHING", the CommaExp insertion is disabled. FYI, the problematic error is issued only inside ThrowStatement, because in ThrowStatement::semantic, exp->optimize() is not called. In, e.g., ReturnStatement::semantic optimizes away the TypeExp before toIR convertion, so it won't cause any problem. (I don't know the reason why.)
Comment #2 by k.hara.pg — 2011-12-17T22:12:22Z