diff options
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 1 | ||||
-rw-r--r-- | test/SemaCXX/format-strings.cpp | 11 |
2 files changed, 12 insertions, 0 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index a44633d5d7..be326880d5 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -1381,6 +1381,7 @@ bool Sema::SemaCheckStringLiteral(const Expr *E, Expr **Args, inFunctionCall); } + case Stmt::GNUNullExprClass: case Stmt::IntegerLiteralClass: // Technically -Wformat-nonliteral does not warn about this case. // The behavior of printf and friends in this case is implementation diff --git a/test/SemaCXX/format-strings.cpp b/test/SemaCXX/format-strings.cpp index 8b0b00d04e..456167dfc9 100644 --- a/test/SemaCXX/format-strings.cpp +++ b/test/SemaCXX/format-strings.cpp @@ -39,3 +39,14 @@ void h(int *i) { printf(foo.gettext("%d"), i); // expected-warning{{format specifies type 'int' but the argument has type 'int *'}} printf(Foo::gettext_static("%d"), i); // expected-warning{{format specifies type 'int' but the argument has type 'int *'}} } + +// Test handling __null for format string literal checking. +extern "C" { + int test_null_format(const char *format, ...) __attribute__((__format__ (__printf__, 1, 2))); +} + +void rdar8269537(const char *f) +{ + test_null_format(__null); // no-warning + test_null_format(f); // expected-warning {{not a string literal}} +} |