I am continuing to make Lit tests C++11 compatible.
This patch contains 3 tests, previously in review D21626.
First two tests involve printf format attributes.
The third test involve thread safety attribute.
Here are the descriptions for each test.
test/SemaCXX/format-strings.cpp
This test verifies format specifiers. This test contains 2 parts. Part 1. C++11 added Scanf floating-point format specifier “a”. http://en.cppreference.com/w/c/io/fscanf The Scanf format specifier “%as” expects type “float *”. However, the actual argument is type “char **”. Change in diagnostics. C++98: warning: 'a' length modifier is not supported by ISO C [-Wformat-non-iso] C++11: warning: format specifies type 'float *' but the argument has type 'char **' [-Wformat] Part 2. Function test_null_format() expects a const char * as its first formal argument, but is instead given a Boolean literal as its first actual argument. Type conversion from const bool to const char * is a Warning in C++98, but an Error in C++11. Change in diagnostics. C++98: warning: initialization of pointer of type 'const char *' to null from a constant boolean expression [-Wbool-conversion] C++11: error: no matching function for call to 'test_null_format' note: candidate function not viable: no known conversion from 'bool' to 'const char *' for 1st argument
test/SemaCXX/printf-cstr.cpp
This tests verifies type mismatches between printf format specifiers and the type of the actual arguments. This test contains 3 types of diagnostic changes. Diagnostics changed for mismatch between “%s” and actual arguments of non-POD class instance. In C++98, non-POD objects are not allowed as variadic arguments. In C++11, non-POD is allowed (5.2.2/7). However, since the format specifier %s expects a char pointer not an object, Clang will issue a Warning on that. If the class has a c_str() method, Clang will issue a accompanying Note to prompt the use to invoke it. Type 1: A class object that has a c_str() method is passed in. In C++98, Clang issues a Warning and an accompanying Note. In C++11, Clang issues a Warning. Expect the following change in diagnostics. (3 instances) C++98: warning: cannot pass non-POD object of type 'HasCStr' to variadic constructor; expected type from format string was 'char *' [-Wnon-pod-varargs] note: did you mean to call the c_str() method? C++11: warning: format specifies type 'char *' but the argument has type 'HasCStr' [-Wformat] Type 2: A class object that does not have a c_str() method is passed in. The accompanying note prompting the user to use the c_str() has no reason be there. Change in Warning diagnostics. (1 instance) C++98: warning: cannot pass non-POD object of type 'HasNoCStr' to variadic function; expected type from format string was 'char *' [-Wnon-pod-varargs] C++11: warning: format specifies type 'char *' but the argument has type 'HasNoCStr' [-Wformat] Type 3: printf format string is passed in as a pointer instead of a string literal. In both C++98 and C++11, Clang is unable to determine type mismatch at compile type. However, in C++98, non-POD type is not allowed inside variadic arguments. (3 instances) C++98: warning: cannot pass object of non-POD type 'HasCStr' through variadic function; call will abort at runtime [-Wnon-pod-varargs] C++11: (None)
test/SemaCXX/warn-thread-safety-parsing.cpp
In C++11, does not issue Errors for thread safety attributes applied to static members. http://clang.llvm.org/docs/ThreadSafetyAnalysis.html This may be a side effect of C++11’s relaxation on in-class member initializers. http://www.stroustrup.com/C++11FAQ.html#member-init Restrict the following diagnostics to C++98. (2 instances each) C++98: error: invalid use of non-static data member 'mu' C++98: error: invalid use of member 'mu' in static member function