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