forked from OSchip/llvm-project
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
This commit is contained in:
parent
df18c6a9af
commit
f638b97fe0
|
@ -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!
|
||||
|
|
|
@ -30,8 +30,13 @@ void check_string_literal( FILE* fp, const char* s, char *buf, ... ) {
|
|||
__builtin___vsnprintf_chk(buf,2,0,-1,s,ap); // no-warning
|
||||
__builtin___vsnprintf_chk(buf,2,0,-1,global_fmt,ap); // expected-warning {{format string is not a string literal}}
|
||||
|
||||
printf("abc"
|
||||
"%*d", (unsigned) 1, 1); // expected-warning {{field width should have type 'int'}}
|
||||
// rdar://6079877
|
||||
printf("abc"
|
||||
"%*d", (unsigned) 1, 1); // expected-warning {{field width should have type 'int'}}
|
||||
printf("abc\
|
||||
def"
|
||||
"%*d", (unsigned) 1, 1); // expected-warning {{field width should have type 'int'}}
|
||||
|
||||
}
|
||||
|
||||
void check_conditional_literal(const char* s, int i) {
|
||||
|
|
Loading…
Reference in New Issue