// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -fblocks -verify -analyzer-config eagerly-assume=false %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -fblocks -analyzer-config c++-template-inlining=false -DNO_INLINE -verify -analyzer-config eagerly-assume=false %s void clang_analyzer_eval(bool); // Do not crash on this templated code which uses a block. typedef void (^my_block)(void); static void useBlock(my_block block){} template class MyClass; typedef MyClass Mf; template class MyClass { public: MyClass() {} MyClass(T a); void I(); private: static const T one; }; template const T MyClass::one = static_cast(1); template inline MyClass::MyClass(T a){} template void MyClass::I() { static MyClass* mPtr = 0; useBlock(^{ mPtr = new MyClass (MyClass::one); }); }; int main(){ Mf m; m.I(); } // template inline unsigned array_lengthof(T (&)[N]) { return N; } void testNonTypeTemplateInstantiation() { const char *S[] = { "a", "b" }; clang_analyzer_eval(array_lengthof(S) == 2); #ifndef NO_INLINE // expected-warning@-2 {{TRUE}} #else // expected-warning@-4 {{UNKNOWN}} #endif } namespace rdar13954714 { template bool blockInTemplate() { return (^() { return VALUE; })(); } // force instantiation template bool blockInTemplate(); template void blockWithStatic() { (void)^() { static int x; return ++x; }; } // force instantiation template void blockWithStatic(); }