[PATCH] D25820: [Sema][Objective-C] Formatting warnings should see through Objective-C message sends
Alex Lorenz via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 21 03:44:52 PDT 2016
arphaman updated this revision to Diff 75408.
arphaman marked an inline comment as done.
arphaman added a comment.
The updated patch includes positive test cases.
Repository:
rL LLVM
https://reviews.llvm.org/D25820
Files:
lib/Sema/SemaChecking.cpp
test/SemaObjC/format-strings-objc.m
Index: test/SemaObjC/format-strings-objc.m
===================================================================
--- test/SemaObjC/format-strings-objc.m
+++ test/SemaObjC/format-strings-objc.m
@@ -264,3 +264,41 @@
NSLog(@"%2$[tt]@ %1$[tt]@", @"Foo", @"Bar"); // no-warning
NSLog(@"%2$[tt]@ %1$[tt]s", @"Foo", @"Bar"); // expected-warning {{object format flags cannot be used with 's' conversion specifier}}
}
+
+// rdar://23622446
+ at interface RD23622446_Tester: NSObject
+
++ (void)stringWithFormat:(const char *)format, ... __attribute__((format(__printf__, 1, 2)));
+
+ at end
+
+ at implementation RD23622446_Tester
+
+__attribute__ ((format_arg(1)))
+const char *rd23622446(const char *format) {
+ return format;
+}
+
++ (void)stringWithFormat:(const char *)format, ... {
+ return;
+}
+
+- (const char *)test:(const char *)format __attribute__ ((format_arg(1))) {
+ return format;
+}
+
+- (NSString *)str:(NSString *)format __attribute__ ((format_arg(1))) {
+ return format;
+}
+
+- (void)foo {
+ [RD23622446_Tester stringWithFormat:rd23622446("%u"), 1, 2]; // expected-warning {{data argument not used by format string}}
+ [RD23622446_Tester stringWithFormat:[self test: "%u"], 1, 2]; // expected-warning {{data argument not used by format string}}
+ [RD23622446_Tester stringWithFormat:[self test: "%s %s"], "name"]; // expected-warning {{more '%' conversions than data arguments}}
+ NSLog([self str: @"%@ %@"], @"name"); // expected-warning {{more '%' conversions than data arguments}}
+ [RD23622446_Tester stringWithFormat:rd23622446("%d"), 1]; // ok
+ [RD23622446_Tester stringWithFormat:[self test: "%d %d"], 1, 2]; // ok
+ NSLog([self str: @"%@"], @"string"); // ok
+}
+
+ at end
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -4481,6 +4481,20 @@
return SLCT_NotALiteral;
}
+ case Stmt::ObjCMessageExprClass: {
+ const auto *ME = cast<ObjCMessageExpr>(E);
+ if (const auto *ND = ME->getMethodDecl()) {
+ if (const auto *FA = ND->getAttr<FormatArgAttr>()) {
+ unsigned ArgIndex = FA->getFormatIdx();
+ const Expr *Arg = ME->getArg(ArgIndex - 1);
+ return checkFormatStringExpr(
+ S, Arg, Args, HasVAListArg, format_idx, firstDataArg, Type,
+ CallType, InFunctionCall, CheckedVarArgs, UncoveredArg, Offset);
+ }
+ }
+
+ return SLCT_NotALiteral;
+ }
case Stmt::ObjCStringLiteralClass:
case Stmt::StringLiteralClass: {
const StringLiteral *StrE = nullptr;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25820.75408.patch
Type: text/x-patch
Size: 2575 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161021/c752315a/attachment.bin>
More information about the cfe-commits
mailing list