diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-02-18 18:34:12 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-02-18 18:34:12 +0000 |
| commit | f638b97fe06a36e3b6de5ce1705ac4181cbf6f9b (patch) | |
| tree | a9d8bb2756d003a572a2fb119ebe6371e25c53a7 /clang/lib | |
| parent | df18c6a9af34550404058f80f9d2e74b42bb4a74 (diff) | |
| download | bcm5719-llvm-f638b97fe06a36e3b6de5ce1705ac4181cbf6f9b.tar.gz bcm5719-llvm-f638b97fe06a36e3b6de5ce1705ac4181cbf6f9b.zip | |
use the full spelling of a string literal token so that trigraphs
and escaped newlines don't throw off the offset computation.
On this testcase:
printf("abc\
def"
"%*d", (unsigned) 1, 1);
Before:
t.m:5:5: warning: field width should have type 'int', but argument has type 'unsigned int'
def"
^
after:
t.m:6:12: warning: field width should have type 'int', but argument has type 'unsigned int'
"%*d", (unsigned) 1, 1);
^ ~~~~~~~~~~~~
llvm-svn: 64930
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f469684e503..6ffca1b7b87 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -31,6 +31,8 @@ SourceLocation Sema::getLocationOfStringLiteralByte(const StringLiteral *SL, unsigned ByteNo) const { assert(!SL->isWide() && "This doesn't work for wide strings yet"); + llvm::SmallString<32> SpellingBuffer; + // Loop over all of the tokens in this string until we find the one that // contains the byte we're looking for. unsigned TokNo = 0; @@ -61,8 +63,13 @@ SourceLocation Sema::getLocationOfStringLiteralByte(const StringLiteral *SL, Token TheTok; TheLexer.LexFromRawLexer(TheTok); + // Get the spelling of the token to remove trigraphs and escaped newlines. + SpellingBuffer.resize(TheTok.getLength()); + const char *SpellingPtr = &SpellingBuffer[0]; + unsigned TokLen = PP.getSpelling(TheTok, SpellingPtr); + // The length of the string is the token length minus the two quotes. - unsigned TokNumBytes = TheTok.getLength()-2; + unsigned TokNumBytes = TokLen-2; // If we found the token we're looking for, return the location. // FIXME: This should consider character escapes! |

