erik.pilkington created this revision. erik.pilkington added reviewers: aaron.ballman, Nathan-Huckleberry. Herald added subscribers: ributzka, dexonsmith, jkorous. Herald added a project: clang.
Instead, emit them under -Wformat-pedantic. This is particularly important for us because we have a lot of code that uses `%hhd` to print BOOL values, since on macOS BOOL is a typedef for signed char, and we emit fix-its recommending `%hhd` to print it. Now that this code is compiled on a target where BOOL is a typedef for `_Bool`, we're getting these -Wformat warnings. These aren't all that useful. rdar://problem/54579473 Clang should not warn when using %hhd or %hd format specifiers on BOOL values Repository: rC Clang https://reviews.llvm.org/D66856 Files: clang/lib/AST/FormatString.cpp clang/test/Sema/format-bool.c Index: clang/test/Sema/format-bool.c =================================================================== --- /dev/null +++ clang/test/Sema/format-bool.c @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool +// RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool +// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool -Wformat-pedantic -DPEDANTIC +// RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool -Wformat-pedantic -DPEDANTIC + +__attribute__((format(__printf__, 1, 2))) +int p(const char *fmt, ...); + +BOOL b; + +int main() { + p("%d", b); + p("%hd", b); + p("%hhd", b); +#ifdef PEDANTIC + // expected-warning@-3 {{format specifies type 'short' but the argument has type}} + // expected-warning@-3 {{format specifies type 'char' but the argument has type}} +#endif + p("%u", b); + p("%hu", b); + p("%hhu", b); +#ifdef PEDANTIC + // expected-warning@-3 {{format specifies type 'unsigned short' but the argument has type}} + // expected-warning@-3 {{format specifies type 'unsigned char' but the argument has type}} +#endif + p("%c", b); + p("%f", b); // expected-warning{{format specifies type 'double' but the argument has type}} + p("%ld", b); // expected-warning{{format specifies type 'long' but the argument has type}} +} Index: clang/lib/AST/FormatString.cpp =================================================================== --- clang/lib/AST/FormatString.cpp +++ clang/lib/AST/FormatString.cpp @@ -360,7 +360,9 @@ case BuiltinType::UChar: case BuiltinType::Char_U: return Match; - } + case BuiltinType::Bool: + return NoMatchPedantic; + } return NoMatch; } @@ -390,6 +392,11 @@ return NoMatchPedantic; return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match : NoMatch; + case BuiltinType::Bool: + if (T == C.UnsignedShortTy || T == C.ShortTy || + T == C.UnsignedCharTy || T == C.SignedCharTy) + return NoMatchPedantic; + return NoMatch; case BuiltinType::Short: return T == C.UnsignedShortTy ? Match : NoMatch; case BuiltinType::UShort:
Index: clang/test/Sema/format-bool.c =================================================================== --- /dev/null +++ clang/test/Sema/format-bool.c @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool +// RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool +// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool -Wformat-pedantic -DPEDANTIC +// RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool -Wformat-pedantic -DPEDANTIC + +__attribute__((format(__printf__, 1, 2))) +int p(const char *fmt, ...); + +BOOL b; + +int main() { + p("%d", b); + p("%hd", b); + p("%hhd", b); +#ifdef PEDANTIC + // expected-warning@-3 {{format specifies type 'short' but the argument has type}} + // expected-warning@-3 {{format specifies type 'char' but the argument has type}} +#endif + p("%u", b); + p("%hu", b); + p("%hhu", b); +#ifdef PEDANTIC + // expected-warning@-3 {{format specifies type 'unsigned short' but the argument has type}} + // expected-warning@-3 {{format specifies type 'unsigned char' but the argument has type}} +#endif + p("%c", b); + p("%f", b); // expected-warning{{format specifies type 'double' but the argument has type}} + p("%ld", b); // expected-warning{{format specifies type 'long' but the argument has type}} +} Index: clang/lib/AST/FormatString.cpp =================================================================== --- clang/lib/AST/FormatString.cpp +++ clang/lib/AST/FormatString.cpp @@ -360,7 +360,9 @@ case BuiltinType::UChar: case BuiltinType::Char_U: return Match; - } + case BuiltinType::Bool: + return NoMatchPedantic; + } return NoMatch; } @@ -390,6 +392,11 @@ return NoMatchPedantic; return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match : NoMatch; + case BuiltinType::Bool: + if (T == C.UnsignedShortTy || T == C.ShortTy || + T == C.UnsignedCharTy || T == C.SignedCharTy) + return NoMatchPedantic; + return NoMatch; case BuiltinType::Short: return T == C.UnsignedShortTy ? Match : NoMatch; case BuiltinType::UShort:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits