Improve error recovery when we see ':' and expect a ';'.

I, at least, make this typo all the time.

llvm-svn: 113243
This commit is contained in:
John McCall 2010-09-07 18:31:03 +00:00
parent 4f5d4b4a6e
commit 1ca73da0e6
3 changed files with 27 additions and 1 deletions

View File

@ -133,6 +133,13 @@ SourceLocation Parser::MatchRHSPunctuation(tok::TokenKind RHSTok,
return R;
}
static bool IsCommonTypo(tok::TokenKind ExpectedTok, const Token &Tok) {
switch (ExpectedTok) {
case tok::semi: return Tok.is(tok::colon); // : for ;
default: return false;
}
}
/// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
/// input. If so, it is consumed and false is returned.
///
@ -146,6 +153,19 @@ bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
return false;
}
// Detect common single-character typos and resume.
if (IsCommonTypo(ExpectedTok, Tok)) {
SourceLocation Loc = Tok.getLocation();
Diag(Loc, DiagID)
<< Msg
<< FixItHint::CreateReplacement(SourceRange(Loc),
getTokenSimpleSpelling(ExpectedTok));
ConsumeAnyToken();
// Pretend there wasn't a problem.
return false;
}
const char *Spelling = 0;
SourceLocation EndLoc = PP.getLocForEndOfToken(PrevTokLocation);
if (EndLoc.isValid() &&

View File

@ -3,6 +3,6 @@
// Test features and error recovery for objc interfaces.
@interface INTF
- (int*) foo2 __attribute__((deprecated)) : (int) x1 __attribute__((deprecated)); // expected-error {{expected ';' after method prototype}}
- (int*) foo2 __attribute__((deprecated)) : (int) x1 __attribute__((deprecated)); // expected-error {{expected ';' after method prototype}} expected-error {{method type specifier must start with '-' or '+'}}
@end

View File

@ -78,3 +78,9 @@ void foo() {
// rdar://7980651
typedef int intptr_t; // expected-note {{'intptr_t' declared here}}
void bar(intptr y); // expected-error {{unknown type name 'intptr'; did you mean 'intptr_t'?}}
void test1(void) {
int x = 2: // expected-error {{expected ';' at end of declaration}}
int y = x;
int z = y;
}