blob: 135e0342596c4cb0b99685def121dcdaf75b8970 [file] [log] [blame]
David Blaikie44d95b52011-12-09 18:32:50 +00001// RUN: %clang_cc1 %s -fsyntax-only -verify -Wweak-vtables -Wweak-template-vtables
Anders Carlsson1610b812010-02-06 02:27:10 +00002
3struct A { // expected-warning {{'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}}
4 virtual void f() { }
5};
6
7template<typename T> struct B {
8 virtual void f() { }
9};
10
11namespace {
12 struct C {
13 virtual void f() { }
14 };
15}
16
17void f() {
18 struct A {
19 virtual void f() { }
20 };
Douglas Gregor6fb745b2010-05-13 16:44:06 +000021
22 A *a;
23 a->f();
24}
25
26// Use the vtables
27void uses(A &a, B<int> &b, C &c) {
28 a.f();
29 b.f();
30 c.f();
Chris Lattner83e7a782010-04-07 22:58:06 +000031}
Douglas Gregora120d012011-09-23 19:04:03 +000032
33// <rdar://problem/9979458>
34class Parent {
35public:
36 Parent() {}
37 virtual ~Parent();
38 virtual void * getFoo() const = 0;
39};
40
41class Derived : public Parent {
42public:
43 Derived();
44 void * getFoo() const;
45};
46
47class VeryDerived : public Derived { // expected-warning{{'VeryDerived' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}}
48public:
49 void * getFoo() const { return 0; }
50};
51
52Parent::~Parent() {}
53
54void uses(Parent &p, Derived &d, VeryDerived &vd) {
55 p.getFoo();
56 d.getFoo();
57 vd.getFoo();
58}
David Blaikie44d95b52011-12-09 18:32:50 +000059
60template<typename T> struct TemplVirt {
61 virtual void f();
62};
63
64template class TemplVirt<float>; // expected-warning{{explicit template instantiation 'TemplVirt<float>' will emit a vtable in every translation unit}}
65
66template<> struct TemplVirt<bool> {
67 virtual void f();
68};
69
70template<> struct TemplVirt<long> { // expected-warning{{'TemplVirt<long>' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}}
71 virtual void f() {}
72};
73
74void uses(TemplVirt<float>& f, TemplVirt<bool>& b, TemplVirt<long>& l) {
75 f.f();
76 b.f();
77 l.f();
78}