templates.cpp revision 69a0e5021c5c49a34aa25cd89b1e613a52097e65
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -verify %s 2 3void clang_analyzer_eval(bool); 4 5// Do not crash on this templated code which uses a block. 6typedef void (^my_block)(void); 7static void useBlock(my_block block){} 8template<class T> class MyClass; 9typedef MyClass<float> Mf; 10 11template<class T> 12class MyClass 13{ 14public: 15 MyClass() {} 16 MyClass(T a); 17 void I(); 18private: 19 static const T one; 20}; 21 22template<class T> const T MyClass<T>::one = static_cast<T>(1); 23template<class T> inline MyClass<T>::MyClass(T a){} 24template<class T> void MyClass<T>::I() { 25 static MyClass<T>* mPtr = 0; 26 useBlock(^{ mPtr = new MyClass<T> (MyClass<T>::one); }); 27}; 28int main(){ 29 Mf m; 30 m.I(); 31} 32 33 34// <rdar://problem/11949235> 35template<class T, unsigned N> 36inline unsigned array_lengthof(T (&)[N]) { 37 return N; 38} 39 40void testNonTypeTemplateInstantiation() { 41 const char *S[] = { "a", "b" }; 42 clang_analyzer_eval(array_lengthof(S) == 2); // expected-warning{{TRUE}} 43} 44 45