summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-20 18:41:46 +0000
committerChris Lattner <sabre@nondot.org>2008-04-20 18:41:46 +0000
commit48a9b9beeb4ceaaa0db42a095021dd12d8482a94 (patch)
tree073fc722971bb34576378f106e1ffe71b28a13ff /clang/lib
parent6b056058296d68c995748628318d27c6263babb3 (diff)
downloadbcm5719-llvm-48a9b9beeb4ceaaa0db42a095021dd12d8482a94.tar.gz
bcm5719-llvm-48a9b9beeb4ceaaa0db42a095021dd12d8482a94.zip
when emitting diagnostics about some character in a numeric
literal, indicate what character the error is about or where it would be. For example: pr2241.c:1:17: error: exponent has no digits float f[] = { 1e , 1ee0 }; ^ llvm-svn: 49996
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Lex/LiteralSupport.cpp46
1 files changed, 26 insertions, 20 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp
index 7d775dc8554..c52946fca57 100644
--- a/clang/lib/Lex/LiteralSupport.cpp
+++ b/clang/lib/Lex/LiteralSupport.cpp
@@ -229,14 +229,16 @@ NumericLiteralParser(const char *begin, const char *end,
saw_exponent = true;
if (*s == '+' || *s == '-') s++; // sign
const char *first_non_digit = SkipDigits(s);
- if (first_non_digit == s) {
- Diag(TokLoc, diag::err_exponent_has_no_digits);
- return;
- } else {
+ if (first_non_digit != s) {
s = first_non_digit;
+ } else {
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_exponent_has_no_digits);
+ return;
}
} else if (saw_period) {
- Diag(TokLoc, diag::err_hexconstant_requires_exponent);
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_hexconstant_requires_exponent);
return;
}
} else if (*s == 'b' || *s == 'B') {
@@ -248,7 +250,8 @@ NumericLiteralParser(const char *begin, const char *end,
if (s == ThisTokEnd) {
// Done.
} else if (isxdigit(*s)) {
- Diag(TokLoc, diag::err_invalid_binary_digit, std::string(s, s+1));
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_invalid_binary_digit, std::string(s, s+1));
return;
}
PP.Diag(TokLoc, diag::ext_binary_literal);
@@ -262,8 +265,8 @@ NumericLiteralParser(const char *begin, const char *end,
if (s == ThisTokEnd) {
// Done.
} else if (isxdigit(*s) && !(*s == 'e' || *s == 'E')) {
- TokLoc = PP.AdvanceToTokenCharacter(TokLoc, s-begin);
- Diag(TokLoc, diag::err_invalid_octal_digit, std::string(s, s+1));
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_invalid_octal_digit, std::string(s, s+1));
return;
} else if (*s == '.') {
s++;
@@ -277,11 +280,12 @@ NumericLiteralParser(const char *begin, const char *end,
saw_exponent = true;
if (*s == '+' || *s == '-') s++; // sign
const char *first_non_digit = SkipDigits(s);
- if (first_non_digit == s) {
- Diag(TokLoc, diag::err_exponent_has_no_digits);
- return;
- } else {
+ if (first_non_digit != s) {
s = first_non_digit;
+ } else {
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_exponent_has_no_digits);
+ return;
}
}
}
@@ -291,7 +295,8 @@ NumericLiteralParser(const char *begin, const char *end,
if (s == ThisTokEnd) {
// Done.
} else if (isxdigit(*s) && !(*s == 'e' || *s == 'E')) {
- Diag(TokLoc, diag::err_invalid_decimal_digit, std::string(s, s+1));
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_invalid_decimal_digit, std::string(s, s+1));
return;
} else if (*s == '.') {
s++;
@@ -303,11 +308,12 @@ NumericLiteralParser(const char *begin, const char *end,
saw_exponent = true;
if (*s == '+' || *s == '-') s++; // sign
const char *first_non_digit = SkipDigits(s);
- if (first_non_digit == s) {
- Diag(TokLoc, diag::err_exponent_has_no_digits);
- return;
- } else {
+ if (first_non_digit != s) {
s = first_non_digit;
+ } else {
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ diag::err_exponent_has_no_digits);
+ return;
}
}
}
@@ -393,9 +399,9 @@ NumericLiteralParser(const char *begin, const char *end,
// Report an error if there are any.
if (s != ThisTokEnd) {
- TokLoc = PP.AdvanceToTokenCharacter(TokLoc, s-begin);
- Diag(TokLoc, isFPConstant ? diag::err_invalid_suffix_float_constant :
- diag::err_invalid_suffix_integer_constant,
+ Diag(PP.AdvanceToTokenCharacter(TokLoc, s-begin),
+ isFPConstant ? diag::err_invalid_suffix_float_constant :
+ diag::err_invalid_suffix_integer_constant,
std::string(SuffixBegin, ThisTokEnd));
return;
}
OpenPOWER on IntegriCloud