xref: /aosp_15_r20/external/clang/test/Analysis/virtualcall.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify -std=c++11 %s
2*67e74705SXin Li 
3*67e74705SXin Li class A {
4*67e74705SXin Li public:
5*67e74705SXin Li   A();
~A()6*67e74705SXin Li   ~A() {};
7*67e74705SXin Li 
8*67e74705SXin Li   virtual int foo() = 0;
9*67e74705SXin Li   virtual void bar() = 0;
f()10*67e74705SXin Li   void f() {
11*67e74705SXin Li     foo(); // expected-warning{{Call pure virtual functions during construction or destruction may leads undefined behaviour}}
12*67e74705SXin Li   }
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li class B : public A {
16*67e74705SXin Li public:
B()17*67e74705SXin Li   B() {
18*67e74705SXin Li     foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
19*67e74705SXin Li   }
20*67e74705SXin Li   ~B();
21*67e74705SXin Li 
22*67e74705SXin Li   virtual int foo();
bar()23*67e74705SXin Li   virtual void bar() { foo(); }  // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
24*67e74705SXin Li };
25*67e74705SXin Li 
A()26*67e74705SXin Li A::A() {
27*67e74705SXin Li   f();
28*67e74705SXin Li }
29*67e74705SXin Li 
~B()30*67e74705SXin Li B::~B() {
31*67e74705SXin Li   this->B::foo(); // no-warning
32*67e74705SXin Li   this->B::bar();
33*67e74705SXin Li   this->foo(); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li class C : public B {
37*67e74705SXin Li public:
38*67e74705SXin Li   C();
39*67e74705SXin Li   ~C();
40*67e74705SXin Li 
41*67e74705SXin Li   virtual int foo();
42*67e74705SXin Li   void f(int i);
43*67e74705SXin Li };
44*67e74705SXin Li 
C()45*67e74705SXin Li C::C() {
46*67e74705SXin Li   f(foo()); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}}
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li class D : public B {
50*67e74705SXin Li public:
D()51*67e74705SXin Li   D() {
52*67e74705SXin Li     foo(); // no-warning
53*67e74705SXin Li   }
~D()54*67e74705SXin Li   ~D() { bar(); }
55*67e74705SXin Li   int foo() final;
bar()56*67e74705SXin Li   void bar() final { foo(); } // no-warning
57*67e74705SXin Li };
58*67e74705SXin Li 
59*67e74705SXin Li class E final : public B {
60*67e74705SXin Li public:
E()61*67e74705SXin Li   E() {
62*67e74705SXin Li     foo(); // no-warning
63*67e74705SXin Li   }
~E()64*67e74705SXin Li   ~E() { bar(); }
65*67e74705SXin Li   int foo() override;
66*67e74705SXin Li };
67*67e74705SXin Li 
main()68*67e74705SXin Li int main() {
69*67e74705SXin Li   A *a;
70*67e74705SXin Li   B *b;
71*67e74705SXin Li   C *c;
72*67e74705SXin Li   D *d;
73*67e74705SXin Li   E *e;
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li #include "virtualcall.h"
77*67e74705SXin Li 
78*67e74705SXin Li #define AS_SYSTEM
79*67e74705SXin Li #include "virtualcall.h"
80*67e74705SXin Li #undef AS_SYSTEM
81