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