mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 08:36:06 +00:00
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:
parent
4f5d4b4a6e
commit
1ca73da0e6
@ -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() &&
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user