fix format specifier fixit for printf("%ld", "foo");

It should reset the length modifier (unless it's a wchar_t string).

llvm-svn: 146252
This commit is contained in:
Hans Wennborg 2011-12-09 10:51:29 +00:00
parent 222c66db38
commit 2027de3be9
2 changed files with 7 additions and 1 deletions

View File

@ -366,6 +366,8 @@ bool PrintfSpecifier::fixType(QualType QT, const LangOptions &LangOpt) {
// Set the long length modifier for wide characters
if (QT->getPointeeType()->isWideCharType())
LM.setKind(LengthModifier::AsWideChar);
else
LM.setKind(LengthModifier::None);
return true;
}

View File

@ -42,7 +42,7 @@ void test() {
// Bad length modifiers
printf("%hhs", "foo");
printf("%1$zp", (void *)0);
// Perserve the original formatting for unsigned integers.
unsigned long val = 42;
printf("%X", val);
@ -57,6 +57,9 @@ void test() {
printf("%f", (intmax_t) 42);
printf("%f", (uintmax_t) 42);
printf("%f", (ptrdiff_t) 42);
// string
printf("%ld", "foo");
}
// Validate the fixes...
@ -83,3 +86,4 @@ void test() {
// CHECK: printf("%jd", (intmax_t) 42);
// CHECK: printf("%ju", (uintmax_t) 42);
// CHECK: printf("%td", (ptrdiff_t) 42);
// CHECK: printf("%s", "foo");