| // 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; |
| } |