// RUN: %clang_cc1 -analyze -analyzer-checker=experimental.cplusplus.VirtualCall -analyzer-store region -verify %s

class A {
public:
  A();
  ~A() {};
  
  virtual int foo() = 0;
  virtual void bar() = 0;
  void f() {
    foo(); // expected-warning{{Call pure virtual functions during construction or destruction may leads undefined behaviour}}
  }
};

class B : public A {
public:
  B() {
    foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
  }
  ~B();
  
  virtual int foo();
  virtual void bar() { foo(); }  // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
};

A::A() {
  f();
}

B::~B() {
  this->B::foo(); // no-warning
  this->B::bar();
  this->foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
}

class C : public B {
public:
  C();
  ~C();
  
  virtual int foo();
  void f(int i);
};

C::C() {
  f(foo()); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
}

int main() {
  A *a;
  B *b;
  C *c;
}
