1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify -std=c++11 %s 2*67e74705SXin Li 3*67e74705SXin Li class A { 4*67e74705SXin Li public: 5*67e74705SXin Li A(); ~A()6*67e74705SXin Li ~A() {}; 7*67e74705SXin Li 8*67e74705SXin Li virtual int foo() = 0; 9*67e74705SXin Li virtual void bar() = 0; f()10*67e74705SXin Li void f() { 11*67e74705SXin Li foo(); // expected-warning{{Call pure virtual functions during construction or destruction may leads undefined behaviour}} 12*67e74705SXin Li } 13*67e74705SXin Li }; 14*67e74705SXin Li 15*67e74705SXin Li class B : public A { 16*67e74705SXin Li public: B()17*67e74705SXin Li B() { 18*67e74705SXin Li foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 19*67e74705SXin Li } 20*67e74705SXin Li ~B(); 21*67e74705SXin Li 22*67e74705SXin Li virtual int foo(); bar()23*67e74705SXin Li virtual void bar() { foo(); } // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 24*67e74705SXin Li }; 25*67e74705SXin Li A()26*67e74705SXin LiA::A() { 27*67e74705SXin Li f(); 28*67e74705SXin Li } 29*67e74705SXin Li ~B()30*67e74705SXin LiB::~B() { 31*67e74705SXin Li this->B::foo(); // no-warning 32*67e74705SXin Li this->B::bar(); 33*67e74705SXin Li this->foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 34*67e74705SXin Li } 35*67e74705SXin Li 36*67e74705SXin Li class C : public B { 37*67e74705SXin Li public: 38*67e74705SXin Li C(); 39*67e74705SXin Li ~C(); 40*67e74705SXin Li 41*67e74705SXin Li virtual int foo(); 42*67e74705SXin Li void f(int i); 43*67e74705SXin Li }; 44*67e74705SXin Li C()45*67e74705SXin LiC::C() { 46*67e74705SXin Li f(foo()); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li class D : public B { 50*67e74705SXin Li public: D()51*67e74705SXin Li D() { 52*67e74705SXin Li foo(); // no-warning 53*67e74705SXin Li } ~D()54*67e74705SXin Li ~D() { bar(); } 55*67e74705SXin Li int foo() final; bar()56*67e74705SXin Li void bar() final { foo(); } // no-warning 57*67e74705SXin Li }; 58*67e74705SXin Li 59*67e74705SXin Li class E final : public B { 60*67e74705SXin Li public: E()61*67e74705SXin Li E() { 62*67e74705SXin Li foo(); // no-warning 63*67e74705SXin Li } ~E()64*67e74705SXin Li ~E() { bar(); } 65*67e74705SXin Li int foo() override; 66*67e74705SXin Li }; 67*67e74705SXin Li main()68*67e74705SXin Liint main() { 69*67e74705SXin Li A *a; 70*67e74705SXin Li B *b; 71*67e74705SXin Li C *c; 72*67e74705SXin Li D *d; 73*67e74705SXin Li E *e; 74*67e74705SXin Li } 75*67e74705SXin Li 76*67e74705SXin Li #include "virtualcall.h" 77*67e74705SXin Li 78*67e74705SXin Li #define AS_SYSTEM 79*67e74705SXin Li #include "virtualcall.h" 80*67e74705SXin Li #undef AS_SYSTEM 81