forked from OSchip/llvm-project
[Sema] Fix diagnostics for one-byte length modifier
In case a char-literal of type int (C/ObjectiveC) corresponds to a format specifier with the %hh length modifier, don't treat the literal as of type char for issuing diagnostics, as otherwise this results in: printf("%hhd", 'e'); warning: format specifies type 'char' but the argument has type 'char'. Differential revision: https://reviews.llvm.org/D97951
This commit is contained in:
parent
46d4d1fea4
commit
4f8e299785
|
@ -8730,8 +8730,11 @@ CheckPrintfHandler::checkFormatExpr(const analyze_printf::PrintfSpecifier &FS,
|
|||
} else if (const CharacterLiteral *CL = dyn_cast<CharacterLiteral>(E)) {
|
||||
// Special case for 'a', which has type 'int' in C.
|
||||
// Note, however, that we do /not/ want to treat multibyte constants like
|
||||
// 'MooV' as characters! This form is deprecated but still exists.
|
||||
if (ExprTy == S.Context.IntTy)
|
||||
// 'MooV' as characters! This form is deprecated but still exists. In
|
||||
// addition, don't treat expressions as of type 'char' if one byte length
|
||||
// modifier is provided.
|
||||
if (ExprTy == S.Context.IntTy &&
|
||||
FS.getLengthModifier().getKind() != LengthModifier::AsChar)
|
||||
if (llvm::isUIntN(S.Context.getCharWidth(), CL->getValue()))
|
||||
ExprTy = S.Context.CharTy;
|
||||
}
|
||||
|
|
|
@ -169,6 +169,12 @@ void test_char(char c, signed char s, unsigned char u, uint8_t n) {
|
|||
|
||||
NSLog(@"%@", 'abcd'); // expected-warning{{format specifies type 'id' but the argument has type 'int'}}
|
||||
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%d"
|
||||
|
||||
NSLog(@"%hhd", 'a'); // expected-warning{{format specifies type 'char' but the argument has type 'int'}}
|
||||
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:15}:"%d"
|
||||
|
||||
NSLog(@"%hhu", 'a'); // expected-warning{{format specifies type 'unsigned char' but the argument has type 'int'}}
|
||||
// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:15}:"%d"
|
||||
}
|
||||
|
||||
void multichar_constants_false_negative() {
|
||||
|
|
Loading…
Reference in New Issue