1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify -std=c++11 %s
2 
3 class A {
4 public:
5   A();
~A()6   ~A() {};
7 
8   virtual int foo() = 0;
9   virtual void bar() = 0;
f()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:
B()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();
bar()23   virtual void bar() { foo(); }  // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
24 };
25 
A()26 A::A() {
27   f();
28 }
29 
~B()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 
C()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 class D : public B {
50 public:
D()51   D() {
52     foo(); // no-warning
53   }
~D()54   ~D() { bar(); }
55   int foo() final;
bar()56   void bar() final { foo(); } // no-warning
57 };
58 
59 class E final : public B {
60 public:
E()61   E() {
62     foo(); // no-warning
63   }
~E()64   ~E() { bar(); }
65   int foo() override;
66 };
67 
main()68 int main() {
69   A *a;
70   B *b;
71   C *c;
72   D *d;
73   E *e;
74 }
75 
76 #include "virtualcall.h"
77 
78 #define AS_SYSTEM
79 #include "virtualcall.h"
80 #undef AS_SYSTEM
81