[Sema] -Wformat-pedantic only for NSInteger/NSUInteger %tu/%td on Darwin
authorAlex Lorenz <arphaman@gmail.com>
Thu, 5 Jul 2018 22:51:11 +0000 (22:51 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Thu, 5 Jul 2018 22:51:11 +0000 (22:51 +0000)
commitb2043ac72a1f1623fad47806f3e7881b7e70dcb4
treee1972081da0b015aca74159a9d9a87fda5f42b21
parentbd09f772eb6f636ff75aad9d86a72460c6e08477
[Sema] -Wformat-pedantic only for NSInteger/NSUInteger %tu/%td on Darwin

The '%tu'/'%td' as formatting specifiers have been used to print out the
NSInteger/NSUInteger values for a long time. Typically their ABI matches, but that's
not the case on watchOS. The ABI difference boils down to the following:

- Regular 32-bit darwin targets (like armv7) use 'ptrdiff_t' of type 'int',
  which matches 'NSInteger'.
- WatchOS arm target (armv7k) uses 'ptrdiff_t' of type 'long', which doesn't
  match 'NSInteger' of type 'int'.

Because of this ABI difference these specifiers trigger -Wformat warnings only
for watchOS builds, which is really inconvenient for cross-platform code.

This patch avoids this -Wformat warning for '%tu'/'%td' and NS[U]Integer only,
and instead uses the new -Wformat-pedantic warning that JF introduced in
https://reviews.llvm.org/D47290. This is acceptable because Darwin guarantees that,
despite the watchOS ABI differences, sizeof(ptrdiff_t) == sizeof(NS[U]Integer),
and alignof(ptrdiff_t) == alignof(NS[U]Integer) so the warning is therefore noisy
for pedantic reasons.

I'll update public documentation to ensure that this behaviour is properly
communicated.

rdar://41739204

Differential Revision: https://reviews.llvm.org/D48852

llvm-svn: 336396
clang/include/clang/Analysis/Analyses/FormatString.h
clang/lib/Analysis/PrintfFormatString.cpp
clang/lib/Sema/SemaChecking.cpp
clang/test/SemaObjC/format-size-spec-nsinteger.m