|  | // 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 | 
|  | } | 
|  |  | 
|  | 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>(); | 
|  | } |