This is a (heavy-handed) solution to PR13724 -- until we know we can do a good job inlining the STL, it's best to be consistent and not generate more false positives than we did before. We can selectively whitelist certain parts of the 'std' namespace that are known to be safe. This is controlled by analyzer config option 'c++-stdlib-inlining', which can be set to "true" or "false". This commit also adds control for whether or not to inline any templated functions (member or non-member), under the config option 'c++-template-inlining'. This option is currently on by default. llvm-svn: 163548
51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -verify %s
|
|
// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -analyzer-config c++-template-inlining=false -DNO_INLINE -verify %s
|
|
|
|
void clang_analyzer_eval(bool);
|
|
|
|
// Do not crash on this templated code which uses a block.
|
|
typedef void (^my_block)(void);
|
|
static void useBlock(my_block block){}
|
|
template<class T> class MyClass;
|
|
typedef MyClass<float> Mf;
|
|
|
|
template<class T>
|
|
class MyClass
|
|
{
|
|
public:
|
|
MyClass() {}
|
|
MyClass(T a);
|
|
void I();
|
|
private:
|
|
static const T one;
|
|
};
|
|
|
|
template<class T> const T MyClass<T>::one = static_cast<T>(1);
|
|
template<class T> inline MyClass<T>::MyClass(T a){}
|
|
template<class T> void MyClass<T>::I() {
|
|
static MyClass<T>* mPtr = 0;
|
|
useBlock(^{ mPtr = new MyClass<T> (MyClass<T>::one); });
|
|
};
|
|
int main(){
|
|
Mf m;
|
|
m.I();
|
|
}
|
|
|
|
|
|
// <rdar://problem/11949235>
|
|
template<class T, unsigned N>
|
|
inline unsigned array_lengthof(T (&)[N]) {
|
|
return N;
|
|
}
|
|
|
|
void testNonTypeTemplateInstantiation() {
|
|
const char *S[] = { "a", "b" };
|
|
clang_analyzer_eval(array_lengthof(S) == 2);
|
|
#ifndef NO_INLINE
|
|
// expected-warning@-2 {{TRUE}}
|
|
#else
|
|
// expected-warning@-4 {{UNKNOWN}}
|
|
#endif
|
|
}
|
|
|