• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify %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 
main()49 int main() {
50   A *a;
51   B *b;
52   C *c;
53 }
54