This reverts commit d618f1c3b12effd0c2bdb7d02108d3551f389d3d. This commit wasn't reviewed ahead of time and significant concerns were raised immediately after it landed. According to our developer policy this warrants immediate revert of the commit. https://llvm.org/docs/DeveloperPolicy.html#patch-reversion-policy Differential Revision: https://reviews.llvm.org/D155509
73 lines
1.6 KiB
C++
73 lines
1.6 KiB
C++
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -fblocks -verify -analyzer-config eagerly-assume=false %s
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -fblocks -analyzer-config c++-template-inlining=false -DNO_INLINE -verify -analyzer-config eagerly-assume=false %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
|
|
}
|
|
|
|
namespace rdar13954714 {
|
|
template <bool VALUE>
|
|
bool blockInTemplate() {
|
|
return (^() {
|
|
return VALUE;
|
|
})();
|
|
}
|
|
|
|
// force instantiation
|
|
template bool blockInTemplate<true>();
|
|
|
|
template <bool VALUE>
|
|
void blockWithStatic() {
|
|
(void)^() {
|
|
static int x;
|
|
return ++x;
|
|
};
|
|
}
|
|
|
|
// force instantiation
|
|
template void blockWithStatic<true>();
|
|
}
|