aboutsummaryrefslogtreecommitdiff
path: root/lib/Lex/Preprocessor.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-05-05 06:45:50 +0000
committerChris Lattner <sabre@nondot.org>2008-05-05 06:45:50 +0000
commit8ed3044a33679cbfa0617d465a50ec557d671ed7 (patch)
tree4cbdd69798308e86a27e5edd339d53c714e7ce50 /lib/Lex/Preprocessor.cpp
parent9e66ba6d1c1c0e11b261e3b20ff02b999621021a (diff)
Neil pointed out that clang doesn't generate ranges from diagnostics
related to pp-expressions. Doing so is pretty simple and this patch implements it, yielding nice diagnostics like: t.c:2:7: error: division by zero in preprocessor expression #if 1 / (0 + 0) ~ ^ ~~~~~~~ t.c:5:14: error: expected ')' in preprocessor expression #if (412 + 42 ~~~~~~~~^ t.c:5:5: error: to match this '(' #if (412 + 42 ^ t.c:10:10: warning: left side of operator converted from negative value to unsigned: -42 to 18446744073709551574 #if (-42 + 0U) / -2 ~~~ ^ ~~ t.c:10:16: warning: right side of operator converted from negative value to unsigned: -2 to 18446744073709551614 #if (-42 + 0U) / -2 ~~~~~~~~~~ ^ ~~ 5 diagnostics generated. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50638 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/Preprocessor.cpp')
-rw-r--r--lib/Lex/Preprocessor.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index 9240a0aa7f..89073276a9 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -124,6 +124,26 @@ void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1);
}
+void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
+ const std::string &Msg,
+ const SourceRange &R1, const SourceRange &R2) {
+ SourceRange R[] = {R1, R2};
+ Diags.Report(getFullLoc(Loc), DiagID, &Msg, 1, R, 2);
+}
+
+
+void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
+ const SourceRange &R) {
+ Diags.Report(getFullLoc(Loc), DiagID, 0, 0, &R, 1);
+}
+
+void Preprocessor::Diag(SourceLocation Loc, unsigned DiagID,
+ const SourceRange &R1, const SourceRange &R2) {
+ SourceRange R[] = {R1, R2};
+ Diags.Report(getFullLoc(Loc), DiagID, 0, 0, R, 2);
+}
+
+
void Preprocessor::DumpToken(const Token &Tok, bool DumpFlags) const {
llvm::cerr << tok::getTokenName(Tok.getKind()) << " '"
<< getSpelling(Tok) << "'";