r342565 - Sema: handle `wint_t` more carefully for printf checking
Saleem Abdulrasool via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 19 11:13:34 PDT 2018
Author: compnerd
Date: Wed Sep 19 11:13:34 2018
New Revision: 342565
URL: http://llvm.org/viewvc/llvm-project?rev=342565&view=rev
Log:
Sema: handle `wint_t` more carefully for printf checking
In the case that `win_t` is an `unsigned short` (e.g. on Windows), we would
previously incorrectly diagnose the conversion because we would immediately
promote the argument type from `wint_t` (aka `unsigned short`) to `int` before
checking if the type matched. This should repair the Windows hosted bots.
Modified:
cfe/trunk/lib/Analysis/FormatString.cpp
cfe/trunk/test/Sema/format-strings-ms.c
cfe/trunk/test/Sema/format-strings.c
Modified: cfe/trunk/lib/Analysis/FormatString.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/FormatString.cpp?rev=342565&r1=342564&r2=342565&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/FormatString.cpp (original)
+++ cfe/trunk/lib/Analysis/FormatString.cpp Wed Sep 19 11:13:34 2018
@@ -406,12 +406,14 @@ ArgType::matchesType(ASTContext &C, Qual
}
case WIntTy: {
+ QualType WInt = C.getCanonicalType(C.getWIntType()).getUnqualifiedType();
- QualType PromoArg =
- argTy->isPromotableIntegerType()
- ? C.getPromotedIntegerType(argTy) : argTy;
+ if (C.getCanonicalType(argTy).getUnqualifiedType() == WInt)
+ return Match;
- QualType WInt = C.getCanonicalType(C.getWIntType()).getUnqualifiedType();
+ QualType PromoArg = argTy->isPromotableIntegerType()
+ ? C.getPromotedIntegerType(argTy)
+ : argTy;
PromoArg = C.getCanonicalType(PromoArg).getUnqualifiedType();
// If the promoted argument is the corresponding signed type of the
Modified: cfe/trunk/test/Sema/format-strings-ms.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings-ms.c?rev=342565&r1=342564&r2=342565&view=diff
==============================================================================
--- cfe/trunk/test/Sema/format-strings-ms.c (original)
+++ cfe/trunk/test/Sema/format-strings-ms.c Wed Sep 19 11:13:34 2018
@@ -13,7 +13,6 @@ void non_iso_warning_test(__int32 i32, _
printf("%I32d", i32); // expected-warning{{'I32' length modifier is not supported by ISO C}}
printf("%I64d", i64); // expected-warning{{'I64' length modifier is not supported by ISO C}}
printf("%wc", c); // expected-warning{{'w' length modifier is not supported by ISO C}}
- // expected-warning at -1{{format specifies type 'wint_t' (aka 'unsigned short') but the argument has type 'wchar_t' (aka 'unsigned short')}}
printf("%Z", p); // expected-warning{{'Z' conversion specifier is not supported by ISO C}}
}
@@ -36,7 +35,7 @@ void unsigned_test() {
}
void w_test(wchar_t c, wchar_t *s) {
- printf("%wc", c); // expected-warning{{format specifies type 'wint_t' (aka 'unsigned short') but the argument has type 'wchar_t' (aka 'unsigned short')}}
+ printf("%wc", c);
printf("%wC", c);
printf("%C", c);
printf("%ws", s);
Modified: cfe/trunk/test/Sema/format-strings.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/format-strings.c?rev=342565&r1=342564&r2=342565&view=diff
==============================================================================
--- cfe/trunk/test/Sema/format-strings.c (original)
+++ cfe/trunk/test/Sema/format-strings.c Wed Sep 19 11:13:34 2018
@@ -401,7 +401,11 @@ void bug7377_bad_length_mod_usage() {
void pr7981(wint_t c, wchar_t c2) {
printf("%lc", c); // no-warning
printf("%lc", 1.0); // expected-warning{{the argument has type 'double'}}
+#if __WINT_WIDTH__ == 4
printf("%lc", (char) 1); // no-warning
+#else
+ printf("%lc", (char) 1); // expected-warning{{the argument has type 'char'}}
+#endif
printf("%lc", &c); // expected-warning{{the argument has type 'wint_t *'}}
// If wint_t and wchar_t are the same width and wint_t is signed where
// wchar_t is unsigned, an implicit conversion isn't possible.
More information about the cfe-commits
mailing list