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 SambucB *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 SambucB *f() { 45*0a6a1f1dSLionel Sambuc return new B(); 46*0a6a1f1dSLionel Sambuc } 47*0a6a1f1dSLionel Sambuc } 48