1*67e74705SXin Li // RUN: %clang --analyze -std=c++11 %s -Xclang -verify -o /dev/null 2*67e74705SXin Li test_static_assert()3*67e74705SXin Livoid test_static_assert() { 4*67e74705SXin Li static_assert(sizeof(void *) == sizeof(void*), "test_static_assert"); 5*67e74705SXin Li } 6*67e74705SXin Li test_analyzer_working()7*67e74705SXin Livoid test_analyzer_working() { 8*67e74705SXin Li int *p = 0; 9*67e74705SXin Li *p = 0xDEADBEEF; // expected-warning {{null}} 10*67e74705SXin Li } 11*67e74705SXin Li 12*67e74705SXin Li // Test that pointer-to-member functions don't cause the analyzer 13*67e74705SXin Li // to crash. 14*67e74705SXin Li struct RDar10243398 { 15*67e74705SXin Li void bar(int x); 16*67e74705SXin Li }; 17*67e74705SXin Li 18*67e74705SXin Li typedef void (RDar10243398::*RDar10243398MemberFn)(int x); 19*67e74705SXin Li test_rdar10243398(RDar10243398 * p)20*67e74705SXin Livoid test_rdar10243398(RDar10243398 *p) { 21*67e74705SXin Li RDar10243398MemberFn q = &RDar10243398::bar; 22*67e74705SXin Li ((*p).*(q))(1); 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li // Tests for CXXTemporaryObjectExpr. 26*67e74705SXin Li struct X { 27*67e74705SXin Li X( int *ip, int ); 28*67e74705SXin Li }; 29*67e74705SXin Li 30*67e74705SXin Li // Test to see if CXXTemporaryObjectExpr is being handled. tempobj1()31*67e74705SXin Liint tempobj1() 32*67e74705SXin Li { 33*67e74705SXin Li int j; 34*67e74705SXin Li int i; 35*67e74705SXin Li X a = X( &j, 1 ); 36*67e74705SXin Li 37*67e74705SXin Li return i; // expected-warning {{Undefined or garbage value returned to caller}} 38*67e74705SXin Li } 39*67e74705SXin Li 40*67e74705SXin Li // Test to see if CXXTemporaryObjectExpr invalidates arguments. tempobj2()41*67e74705SXin Liint tempobj2() 42*67e74705SXin Li { 43*67e74705SXin Li int j; 44*67e74705SXin Li X a = X( &j, 1 ); 45*67e74705SXin Li 46*67e74705SXin Li return j; // no-warning 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li 50*67e74705SXin Li // Test for correct handling of C++ ForRange statement. test1()51*67e74705SXin Livoid test1() { 52*67e74705SXin Li int array[2] = { 1, 2 }; 53*67e74705SXin Li int j = 0; 54*67e74705SXin Li for ( int i : array ) 55*67e74705SXin Li j += i; 56*67e74705SXin Li int *p = 0; 57*67e74705SXin Li *p = 0xDEADBEEF; // expected-warning {{null}} 58*67e74705SXin Li } 59*67e74705SXin Li test2()60*67e74705SXin Livoid test2() { 61*67e74705SXin Li int array[2] = { 1, 2 }; 62*67e74705SXin Li int j = 0; 63*67e74705SXin Li for (int i : array) 64*67e74705SXin Li j += i; 65*67e74705SXin Li if (j == 3) 66*67e74705SXin Li return; 67*67e74705SXin Li int *p = 0; 68*67e74705SXin Li *p = 0xDEADBEEF; // no-warning 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li // Do not crash on the following when constructing the 72*67e74705SXin Li // callgraph. 73*67e74705SXin Li struct RDar11178609 { 74*67e74705SXin Li ~RDar11178609() = delete; 75*67e74705SXin Li }; 76*67e74705SXin Li 77*67e74705SXin Li // Tests that dynamic_cast handles references to C++ classes. Previously 78*67e74705SXin Li // this crashed. 79*67e74705SXin Li class rdar11817693_BaseBase {}; 80*67e74705SXin Li class rdar11817693_BaseInterface {}; 81*67e74705SXin Li class rdar11817693_Base : public rdar11817693_BaseBase, public rdar11817693_BaseInterface {}; 82*67e74705SXin Li class rdar11817693 : public rdar11817693_Base { 83*67e74705SXin Li virtual void operator=(const rdar11817693_BaseBase& src); 84*67e74705SXin Li void operator=(const rdar11817693& src); 85*67e74705SXin Li }; operator =(const rdar11817693 & src)86*67e74705SXin Livoid rdar11817693::operator=(const rdar11817693& src) { 87*67e74705SXin Li operator=(dynamic_cast<const rdar11817693_BaseBase&>(src)); 88*67e74705SXin Li } 89*67e74705SXin Li 90