summaryrefslogtreecommitdiff
path: root/test/Sema
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2019-09-18 19:05:14 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2019-09-18 19:05:14 +0000
commit7a6d9c12018b01e8d97ccb88367f24d7f38351cc (patch)
tree59c3b6a222dfe7452c9ee64fb42c794bb4884fb7 /test/Sema
parentda7c99cf283cf1773550f372cb50d3320db77e92 (diff)
downloadclang-7a6d9c12018b01e8d97ccb88367f24d7f38351cc.tar.gz
[Sema] Suppress -Wformat diagnostics for bool types when printed using %hhd
Also, add a diagnostic under -Wformat for printing a boolean value as a character. rdar://54579473 Differential revision: https://reviews.llvm.org/D66856 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@372247 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Sema')
-rw-r--r--test/Sema/format-bool.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/Sema/format-bool.c b/test/Sema/format-bool.c
new file mode 100644
index 0000000000..53c2c7fd12
--- /dev/null
+++ b/test/Sema/format-bool.c
@@ -0,0 +1,46 @@
+// RUN: %clang_cc1 -xc %s -verify -DBOOL=_Bool
+// RUN: %clang_cc1 -xc++ %s -verify -DBOOL=bool
+// RUN: %clang_cc1 -xobjective-c %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;
+
+#ifdef __OBJC__
+@interface NSString
++(NSString *)stringWithFormat:(NSString *)fmt, ...
+ __attribute__((format(__NSString__, 1, 2)));
+@end
+
+#define YES __objc_yes
+#define NO __objc_no
+#endif
+
+int main() {
+ p("%d", b);
+ p("%hd", b);
+#ifdef PEDANTIC
+ // expected-warning@-2 {{format specifies type 'short' but the argument has type}}
+#endif
+ p("%hhd", b);
+ p("%u", b);
+ p("%hu", b);
+#ifdef PEDANTIC
+ // expected-warning@-2 {{format specifies type 'unsigned short' but the argument has type}}
+#endif
+ p("%hhu", b);
+ p("%c", b); // expected-warning {{using '%c' format specifier, but argument has boolean value}}
+ p("%lc", b); // expected-warning {{using '%lc' format specifier, but argument has boolean value}}
+ p("%c", 1 == 1); // expected-warning {{using '%c' format specifier, but argument has boolean value}}
+ 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}}
+ p("%lld", b); // expected-warning{{format specifies type 'long long' but the argument has type}}
+
+#ifdef __OBJC__
+ [NSString stringWithFormat: @"%c", 0]; // probably fine?
+ [NSString stringWithFormat: @"%c", NO]; // expected-warning {{using '%c' format specifier, but argument has boolean value}}
+#endif
+}