xref: /minix3/external/bsd/llvm/dist/clang/test/SemaCXX/devirtualize-vtable-marking.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -verify -std=c++11 %s
2*0a6a1f1dSLionel Sambuc 
3*0a6a1f1dSLionel Sambuc template <typename T> struct OwnPtr {
4*0a6a1f1dSLionel Sambuc   T *p;
~OwnPtrOwnPtr5*0a6a1f1dSLionel Sambuc   ~OwnPtr() {
6*0a6a1f1dSLionel Sambuc     // expected-error@+1 {{invalid application of 'sizeof'}}
7*0a6a1f1dSLionel Sambuc     static_assert(sizeof(T) > 0, "incomplete T");
8*0a6a1f1dSLionel Sambuc     delete p;
9*0a6a1f1dSLionel Sambuc   }
10*0a6a1f1dSLionel Sambuc };
11*0a6a1f1dSLionel Sambuc 
12*0a6a1f1dSLionel Sambuc namespace use_vtable_for_vcall {
13*0a6a1f1dSLionel Sambuc struct Incomplete; // expected-note {{forward declaration}}
14*0a6a1f1dSLionel Sambuc struct A {
~Ause_vtable_for_vcall::A15*0a6a1f1dSLionel Sambuc   virtual ~A() {}
muse_vtable_for_vcall::A16*0a6a1f1dSLionel Sambuc   virtual void m() {}
17*0a6a1f1dSLionel Sambuc };
18*0a6a1f1dSLionel Sambuc struct B : A { // expected-note {{in instantiation}}
19*0a6a1f1dSLionel Sambuc   B();
muse_vtable_for_vcall::B20*0a6a1f1dSLionel Sambuc   virtual void m() { }
m2use_vtable_for_vcall::B21*0a6a1f1dSLionel Sambuc   virtual void m2() { static_cast<A *>(this)->m(); }
22*0a6a1f1dSLionel Sambuc   OwnPtr<Incomplete> m_sqlError;
23*0a6a1f1dSLionel Sambuc };
24*0a6a1f1dSLionel Sambuc 
f()25*0a6a1f1dSLionel Sambuc B *f() {
26*0a6a1f1dSLionel Sambuc   return new B();
27*0a6a1f1dSLionel Sambuc }
28*0a6a1f1dSLionel Sambuc }
29*0a6a1f1dSLionel Sambuc 
30*0a6a1f1dSLionel Sambuc namespace dont_mark_qualified_vcall {
31*0a6a1f1dSLionel Sambuc struct Incomplete;
32*0a6a1f1dSLionel Sambuc struct A {
~Adont_mark_qualified_vcall::A33*0a6a1f1dSLionel Sambuc   virtual ~A() {}
mdont_mark_qualified_vcall::A34*0a6a1f1dSLionel Sambuc   virtual void m() {}
35*0a6a1f1dSLionel Sambuc };
36*0a6a1f1dSLionel Sambuc struct B : A {
37*0a6a1f1dSLionel Sambuc   B();
38*0a6a1f1dSLionel Sambuc   // Previously we would mark B's vtable referenced to devirtualize this call to
39*0a6a1f1dSLionel Sambuc   // A::m, even though it's not a virtual call.
mdont_mark_qualified_vcall::B40*0a6a1f1dSLionel Sambuc   virtual void m() { A::m(); }
41*0a6a1f1dSLionel Sambuc   OwnPtr<Incomplete> m_sqlError;
42*0a6a1f1dSLionel Sambuc };
43*0a6a1f1dSLionel Sambuc 
f()44*0a6a1f1dSLionel Sambuc B *f() {
45*0a6a1f1dSLionel Sambuc   return new B();
46*0a6a1f1dSLionel Sambuc }
47*0a6a1f1dSLionel Sambuc }
48