1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -analyzer-config c++-template-inlining=false -DNO_INLINE -verify %s 3*67e74705SXin Li 4*67e74705SXin Li void clang_analyzer_eval(bool); 5*67e74705SXin Li 6*67e74705SXin Li // Do not crash on this templated code which uses a block. 7*67e74705SXin Li typedef void (^my_block)(void); useBlock(my_block block)8*67e74705SXin Listatic void useBlock(my_block block){} 9*67e74705SXin Li template<class T> class MyClass; 10*67e74705SXin Li typedef MyClass<float> Mf; 11*67e74705SXin Li 12*67e74705SXin Li template<class T> 13*67e74705SXin Li class MyClass 14*67e74705SXin Li { 15*67e74705SXin Li public: MyClass()16*67e74705SXin Li MyClass() {} 17*67e74705SXin Li MyClass(T a); 18*67e74705SXin Li void I(); 19*67e74705SXin Li private: 20*67e74705SXin Li static const T one; 21*67e74705SXin Li }; 22*67e74705SXin Li 23*67e74705SXin Li template<class T> const T MyClass<T>::one = static_cast<T>(1); MyClass(T a)24*67e74705SXin Litemplate<class T> inline MyClass<T>::MyClass(T a){} I()25*67e74705SXin Litemplate<class T> void MyClass<T>::I() { 26*67e74705SXin Li static MyClass<T>* mPtr = 0; 27*67e74705SXin Li useBlock(^{ mPtr = new MyClass<T> (MyClass<T>::one); }); 28*67e74705SXin Li }; main()29*67e74705SXin Liint main(){ 30*67e74705SXin Li Mf m; 31*67e74705SXin Li m.I(); 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li 35*67e74705SXin Li // <rdar://problem/11949235> 36*67e74705SXin Li template<class T, unsigned N> array_lengthof(T (&)[N])37*67e74705SXin Liinline unsigned array_lengthof(T (&)[N]) { 38*67e74705SXin Li return N; 39*67e74705SXin Li } 40*67e74705SXin Li testNonTypeTemplateInstantiation()41*67e74705SXin Livoid testNonTypeTemplateInstantiation() { 42*67e74705SXin Li const char *S[] = { "a", "b" }; 43*67e74705SXin Li clang_analyzer_eval(array_lengthof(S) == 2); 44*67e74705SXin Li #ifndef NO_INLINE 45*67e74705SXin Li // expected-warning@-2 {{TRUE}} 46*67e74705SXin Li #else 47*67e74705SXin Li // expected-warning@-4 {{UNKNOWN}} 48*67e74705SXin Li #endif 49*67e74705SXin Li } 50*67e74705SXin Li 51*67e74705SXin Li namespace rdar13954714 { 52*67e74705SXin Li template <bool VALUE> blockInTemplate()53*67e74705SXin Li bool blockInTemplate() { 54*67e74705SXin Li return (^() { 55*67e74705SXin Li return VALUE; 56*67e74705SXin Li })(); 57*67e74705SXin Li } 58*67e74705SXin Li 59*67e74705SXin Li // force instantiation 60*67e74705SXin Li template bool blockInTemplate<true>(); 61*67e74705SXin Li 62*67e74705SXin Li template <bool VALUE> blockWithStatic()63*67e74705SXin Li void blockWithStatic() { 64*67e74705SXin Li (void)^() { 65*67e74705SXin Li static int x; 66*67e74705SXin Li return ++x; 67*67e74705SXin Li }; 68*67e74705SXin Li } 69*67e74705SXin Li 70*67e74705SXin Li // force instantiation 71*67e74705SXin Li template void blockWithStatic<true>(); 72*67e74705SXin Li } 73