Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify %s
      2 
      3 class A {
      4 public:
      5   A();
      6   ~A() {};
      7 
      8   virtual int foo() = 0;
      9   virtual void bar() = 0;
     10   void f() {
     11     foo(); // expected-warning{{Call pure virtual functions during construction or destruction may leads undefined behaviour}}
     12   }
     13 };
     14 
     15 class B : public A {
     16 public:
     17   B() {
     18     foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
     19   }
     20   ~B();
     21 
     22   virtual int foo();
     23   virtual void bar() { foo(); }  // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
     24 };
     25 
     26 A::A() {
     27   f();
     28 }
     29 
     30 B::~B() {
     31   this->B::foo(); // no-warning
     32   this->B::bar();
     33   this->foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
     34 }
     35 
     36 class C : public B {
     37 public:
     38   C();
     39   ~C();
     40 
     41   virtual int foo();
     42   void f(int i);
     43 };
     44 
     45 C::C() {
     46   f(foo()); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
     47 }
     48 
     49 int main() {
     50   A *a;
     51   B *b;
     52   C *c;
     53 }
     54