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

Reply via email to