Lionel Sambuc 0a6a1f1d05 NetBSD re-synchronization of the source tree
This brings our tree to NetBSD 7.0, as found on -current on the
10-10-2015.

This updates:
 - LLVM to 3.6.1
 - GCC to GCC 5.1
 - Replace minix/commands/zdump with usr.bin/zdump
 - external/bsd/libelf has moved to /external/bsd/elftoolchain/
 - Import ctwm
 - Drop sprintf from libminc

Change-Id: I149836ac18e9326be9353958bab9b266efb056f0
2016-01-13 20:32:14 +01:00

81 lines
1.5 KiB
C++

// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.cplusplus.VirtualCall -analyzer-store region -verify -std=c++11 %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}}
}
class D : public B {
public:
D() {
foo(); // no-warning
}
~D() { bar(); }
int foo() final;
void bar() final { foo(); } // no-warning
};
class E final : public B {
public:
E() {
foo(); // no-warning
}
~E() { bar(); }
int foo() override;
};
int main() {
A *a;
B *b;
C *c;
D *d;
E *e;
}
#include "virtualcall.h"
#define AS_SYSTEM
#include "virtualcall.h"
#undef AS_SYSTEM