1// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify %s 2 3class A { 4public: 5 A(); 6 ~A() {}; 7 8 virtual int foo() = 0; 9 virtual void bar() = 0; 10 void f() { 11 foo(); // expected-warning{{Call pure virtual functions during construction or destruction may leads undefined behaviour}} 12 } 13}; 14 15class B : public A { 16public: 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(); 23 virtual void bar() { foo(); } // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 24}; 25 26A::A() { 27 f(); 28} 29 30B::~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 36class C : public B { 37public: 38 C(); 39 ~C(); 40 41 virtual int foo(); 42 void f(int i); 43}; 44 45C::C() { 46 f(foo()); // expected-warning{{Call virtual functions during construction or destruction will never go to a more derived class}} 47} 48 49int main() { 50 A *a; 51 B *b; 52 C *c; 53} 54 55#include "virtualcall.h" 56 57#define AS_SYSTEM 58#include "virtualcall.h" 59#undef AS_SYSTEM 60