On 7/9/2014 1:13 AM, Brian Schott wrote:
There is no ambiguity in the grammar. "catch (A) { ... }" is not valid. The spec
requires that you give the exception a name. A spec compliant D compiler MUST
parse your example code with the LastCatch rule. The fact that DMD does what it
does is a bug that has been documented for over a year.[1]
Sorry, I misunderstood. The relevant grammar is
https://dlang.org/statement#TryStatement :
Catches:
LastCatch
Catch
Catch Catches
LastCatch:
catch NoScopeNonEmptyStatement
Catch:
catch ( CatchParameter ) NoScopeNonEmptyStatement
CatchParameter:
BasicType Identifier
What the parser can do is do a lookahead on the ( ) to see if it matches the
'BasicType Identifier' grammar. Parser::isDeclaration() can be pressed into
service to do that. This should resolve the issue without breaking code.
BTW, the reason for LastCatch is that it long predates the splitting of
exceptions into the separate Error and Exception forks.