On 2013-05-27 22:32, Walter Bright wrote:
The usual approach to handling errors in a compiler is to guess at what
the user actually meant, repair the AST according to that guess, then
continue on. Unfortunately, the guess is usually wrong and the result is
cascaded errors, of which only the first is meaningful.
DMD has been gradually switching over to a more novel approach, one that
I haven't seen elsewhere. Once an error is discovered, the AST is marked
as "erroneous". That erroneous state propagates upwards to the root of
the AST, and that any AST that relies on an erroneous AST is itself
erroneous, and no further error messages are emitted for it.
The result should be that only "original sin" errors are reported.
This has already resulted in a great reduction of spurious error
messages, but clearly we have more work to do.
Clang is still a lot better on this than DMD. Take this simple example:
void main ()
{
int a = 3 // Missing semicolon, line 3
int b = 5;
}
Compiling this with DMD gives the following error:
main.d(4): Error: semicolon expected, not 'int'
Where's Clang gives the following error for the same code:
main.c:3:11: error: expected ';' at end of declaration
int a = 3
^
;
1 error generated.
It knows that you most likely meant to put the semicolon on the end of
line 3 instead of the beginning of line 4. It also don't give completely
false spell checking suggestion, like Adam showed:
Error: undefined identifier gf, did you mean template to(T)
--
/Jacob Carlborg