// RUN: %clang_analyze_cc1 -analyzer-checker=webkit.RefCntblBaseVirtualDtor -verify %s struct RefCntblBase { void ref() {} void deref() {} }; struct Derived : RefCntblBase { }; // expected-warning@-1{{Struct 'RefCntblBase' is used as a base of struct 'Derived' but doesn't have virtual destructor}} struct DerivedWithVirtualDtor : RefCntblBase { // expected-warning@-1{{Struct 'RefCntblBase' is used as a base of struct 'DerivedWithVirtualDtor' but doesn't have virtual destructor}} virtual ~DerivedWithVirtualDtor() {} }; template struct DerivedClassTmpl : T { }; typedef DerivedClassTmpl Foo; struct RandomBase {}; struct RandomDerivedClass : RandomBase { }; struct FakeRefCntblBase1 { private: void ref() {} void deref() {} }; struct Quiet1 : FakeRefCntblBase1 {}; struct FakeRefCntblBase2 { protected: void ref() {} void deref() {} }; struct Quiet2 : FakeRefCntblBase2 {}; class FakeRefCntblBase3 { void ref() {} void deref() {} }; struct Quiet3 : FakeRefCntblBase3 {}; struct Quiet4 : private RefCntblBase {}; class Quiet5 : RefCntblBase {}; void foo () { Derived d; }