Nathan-Huckleberry created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Nathan-Huckleberry added a reviewer: rsmith. Nathan-Huckleberry added a subscriber: nickdesaulniers.
Link: https://bugs.llvm.org/show_bug.cgi?id=41467 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D66186 Files: clang/lib/AST/FormatString.cpp clang/test/FixIt/format.m clang/test/Sema/format-strings-enum-fixed-type.cpp clang/test/Sema/format-strings.c Index: clang/test/Sema/format-strings.c =================================================================== --- clang/test/Sema/format-strings.c +++ clang/test/Sema/format-strings.c @@ -277,8 +277,8 @@ void should_understand_small_integers() { printf("%hhu", (short) 10); // expected-warning{{format specifies type 'unsigned char' but the argument has type 'short'}} - printf("%hu\n", (unsigned char) 1); // expected-warning{{format specifies type 'unsigned short' but the argument has type 'unsigned char'}} - printf("%hu\n", (uint8_t)1); // expected-warning{{format specifies type 'unsigned short' but the argument has type 'uint8_t'}} + printf("%hu\n", (unsigned char)1); + printf("%hu\n", (uint8_t)1); } void test11(void *p, char *s) { Index: clang/test/Sema/format-strings-enum-fixed-type.cpp =================================================================== --- clang/test/Sema/format-strings-enum-fixed-type.cpp +++ clang/test/Sema/format-strings-enum-fixed-type.cpp @@ -80,9 +80,9 @@ printf("%hhd", CharConstant); // no-warning // This is not correct but it is safe. We warn because '%hd' shows intent. - printf("%hd", input); // expected-warning{{format specifies type 'short' but the argument has underlying type 'char'}} - printf("%hd", CharConstant); // expected-warning{{format specifies type 'short'}} - + printf("%hd", input); // no-warning + printf("%hd", CharConstant); // no-warning + // This is not correct but it matches the promotion rules (and is safe). printf("%d", input); // no-warning printf("%d", CharConstant); // no-warning Index: clang/test/FixIt/format.m =================================================================== --- clang/test/FixIt/format.m +++ clang/test/FixIt/format.m @@ -205,9 +205,7 @@ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%f" // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:16-[[@LINE-2]]:16}:"(unichar)" - NSLog(@"%C", (char)0x260300); // expected-warning{{format specifies type 'unichar' (aka 'unsigned short') but the argument has type 'char'}} - // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" - // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:16-[[@LINE-2]]:22}:"(unichar)" + NSLog(@"%C", (char)0x260300); NSLog(@"%C", 'a'); // expected-warning{{format specifies type 'unichar' (aka 'unsigned short') but the argument has type 'char'}} // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" Index: clang/lib/AST/FormatString.cpp =================================================================== --- clang/lib/AST/FormatString.cpp +++ clang/lib/AST/FormatString.cpp @@ -386,8 +386,10 @@ case BuiltinType::SChar: case BuiltinType::Char_U: case BuiltinType::UChar: - return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match - : NoMatch; + return T == C.UnsignedCharTy || T == C.SignedCharTy || + T == C.UnsignedShortTy || T == C.ShortTy + ? Match + : NoMatch; case BuiltinType::Short: return T == C.UnsignedShortTy ? Match : NoMatch; case BuiltinType::UShort:
Index: clang/test/Sema/format-strings.c =================================================================== --- clang/test/Sema/format-strings.c +++ clang/test/Sema/format-strings.c @@ -277,8 +277,8 @@ void should_understand_small_integers() { printf("%hhu", (short) 10); // expected-warning{{format specifies type 'unsigned char' but the argument has type 'short'}} - printf("%hu\n", (unsigned char) 1); // expected-warning{{format specifies type 'unsigned short' but the argument has type 'unsigned char'}} - printf("%hu\n", (uint8_t)1); // expected-warning{{format specifies type 'unsigned short' but the argument has type 'uint8_t'}} + printf("%hu\n", (unsigned char)1); + printf("%hu\n", (uint8_t)1); } void test11(void *p, char *s) { Index: clang/test/Sema/format-strings-enum-fixed-type.cpp =================================================================== --- clang/test/Sema/format-strings-enum-fixed-type.cpp +++ clang/test/Sema/format-strings-enum-fixed-type.cpp @@ -80,9 +80,9 @@ printf("%hhd", CharConstant); // no-warning // This is not correct but it is safe. We warn because '%hd' shows intent. - printf("%hd", input); // expected-warning{{format specifies type 'short' but the argument has underlying type 'char'}} - printf("%hd", CharConstant); // expected-warning{{format specifies type 'short'}} - + printf("%hd", input); // no-warning + printf("%hd", CharConstant); // no-warning + // This is not correct but it matches the promotion rules (and is safe). printf("%d", input); // no-warning printf("%d", CharConstant); // no-warning Index: clang/test/FixIt/format.m =================================================================== --- clang/test/FixIt/format.m +++ clang/test/FixIt/format.m @@ -205,9 +205,7 @@ // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%f" // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:16-[[@LINE-2]]:16}:"(unichar)" - NSLog(@"%C", (char)0x260300); // expected-warning{{format specifies type 'unichar' (aka 'unsigned short') but the argument has type 'char'}} - // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" - // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:16-[[@LINE-2]]:22}:"(unichar)" + NSLog(@"%C", (char)0x260300); NSLog(@"%C", 'a'); // expected-warning{{format specifies type 'unichar' (aka 'unsigned short') but the argument has type 'char'}} // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:13}:"%c" Index: clang/lib/AST/FormatString.cpp =================================================================== --- clang/lib/AST/FormatString.cpp +++ clang/lib/AST/FormatString.cpp @@ -386,8 +386,10 @@ case BuiltinType::SChar: case BuiltinType::Char_U: case BuiltinType::UChar: - return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match - : NoMatch; + return T == C.UnsignedCharTy || T == C.SignedCharTy || + T == C.UnsignedShortTy || T == C.ShortTy + ? Match + : 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