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.)