blob: faa5c1a762094c1104b80ea1616f669f82b8cbab [file] [log] [blame]
Jordan Rose69a0e502012-07-27 01:15:02 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -verify %s
Jordan Rose81fb50e2012-09-10 21:27:35 +00002// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -fblocks -analyzer-config c++-template-inlining=false -DNO_INLINE -verify %s
Jordan Rose69a0e502012-07-27 01:15:02 +00003
4void clang_analyzer_eval(bool);
Anna Zaks45246a72012-05-14 22:38:24 +00005
6// Do not crash on this templated code which uses a block.
7typedef void (^my_block)(void);
8static void useBlock(my_block block){}
9template<class T> class MyClass;
10typedef MyClass<float> Mf;
11
12template<class T>
13class MyClass
14{
15public:
16 MyClass() {}
17 MyClass(T a);
18 void I();
19private:
20 static const T one;
21};
22
23template<class T> const T MyClass<T>::one = static_cast<T>(1);
24template<class T> inline MyClass<T>::MyClass(T a){}
25template<class T> void MyClass<T>::I() {
26 static MyClass<T>* mPtr = 0;
27 useBlock(^{ mPtr = new MyClass<T> (MyClass<T>::one); });
28};
29int main(){
30 Mf m;
31 m.I();
32}
Jordan Rose69a0e502012-07-27 01:15:02 +000033
34
35// <rdar://problem/11949235>
36template<class T, unsigned N>
37inline unsigned array_lengthof(T (&)[N]) {
38 return N;
39}
40
41void testNonTypeTemplateInstantiation() {
42 const char *S[] = { "a", "b" };
Jordan Rose81fb50e2012-09-10 21:27:35 +000043 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
Jordan Rose69a0e502012-07-27 01:15:02 +000049}
50