aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseExpr.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-05-24 22:31:37 +0000
committerChris Lattner <sabre@nondot.org>2010-05-24 22:31:37 +0000
commit2472882de709cc6096f7113ba0f5f1eebe6cebd2 (patch)
tree76a7c5bc7dea82c0098fdab7ea04ea9fde15cb5d /lib/Parse/ParseExpr.cpp
parent6a143ffd46a339b17ab5b0c9c20bfdb99c5cfee3 (diff)
improve the fixit for the missing : error when parsing ?:. When
there are already two spaces before the token where the : was expected, put the : in between the spaces. This means we get it right in both of these cases: t.c:2:17: error: expected ':' return a ? b c; ^ : t.c:3:16: error: expected ':' return a ? b c; ^ : In the later case, the diagnostic says to insert ": ", in the former case it says to insert ":" between the spaces. This fixes rdar://8007231 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104569 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseExpr.cpp')
-rw-r--r--lib/Parse/ParseExpr.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index b9e632a184..ed27f3bccb 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -315,8 +315,29 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, prec::Level MinPrec) {
// Eat the colon.
ColonLoc = ConsumeToken();
} else {
+ // Otherwise, we're missing a ':'. Assume that this was a typo that the
+ // user forgot. If we're not in a macro instantion, we can suggest a
+ // fixit hint. If there were two spaces before the current token,
+ // suggest inserting the colon in between them, otherwise insert ": ".
+ SourceLocation FILoc = Tok.getLocation();
+ const char *FIText = ": ";
+ if (FILoc.isFileID()) {
+ const SourceManager &SM = PP.getSourceManager();
+ bool IsInvalid = false;
+ const char *SourcePtr =
+ SM.getCharacterData(FILoc.getFileLocWithOffset(-1), &IsInvalid);
+ if (!IsInvalid && *SourcePtr == ' ') {
+ SourcePtr =
+ SM.getCharacterData(FILoc.getFileLocWithOffset(-2), &IsInvalid);
+ if (!IsInvalid && *SourcePtr == ' ') {
+ FILoc = FILoc.getFileLocWithOffset(-1);
+ FIText = ":";
+ }
+ }
+ }
+
Diag(Tok, diag::err_expected_colon)
- << FixItHint::CreateInsertion(Tok.getLocation(), ": ");
+ << FixItHint::CreateInsertion(FILoc, FIText);
Diag(OpToken, diag::note_matching) << "?";
ColonLoc = Tok.getLocation();
}