michael@0: // Copyright (c) 2012 The Chromium Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: michael@0: #ifndef BASE_REFCOUNTED_H_ michael@0: #define BASE_REFCOUNTED_H_ michael@0: michael@0: namespace base { michael@0: michael@0: template michael@0: class RefCounted { michael@0: public: michael@0: RefCounted() {} michael@0: ~RefCounted() {} michael@0: }; michael@0: michael@0: template michael@0: class RefCountedThreadSafe { michael@0: public: michael@0: RefCountedThreadSafe() {} michael@0: ~RefCountedThreadSafe() {} michael@0: }; michael@0: michael@0: } // namespace base michael@0: michael@0: // Ignore classes whose inheritance tree ends in WebKit's RefCounted base michael@0: // class. Though prone to error, this pattern is very prevalent in WebKit michael@0: // code, so do not issue any warnings. michael@0: namespace WebKit { michael@0: michael@0: template michael@0: class RefCounted { michael@0: public: michael@0: RefCounted() {} michael@0: ~RefCounted() {} michael@0: }; michael@0: michael@0: } // namespace WebKit michael@0: michael@0: // Unsafe; should error. michael@0: class PublicRefCountedDtorInHeader michael@0: : public base::RefCounted { michael@0: public: michael@0: PublicRefCountedDtorInHeader() {} michael@0: ~PublicRefCountedDtorInHeader() {} michael@0: michael@0: private: michael@0: friend class base::RefCounted; michael@0: }; michael@0: michael@0: // Unsafe; should error. michael@0: class PublicRefCountedThreadSafeDtorInHeader michael@0: : public base::RefCountedThreadSafe< michael@0: PublicRefCountedThreadSafeDtorInHeader> { michael@0: public: michael@0: PublicRefCountedThreadSafeDtorInHeader() {} michael@0: ~PublicRefCountedThreadSafeDtorInHeader() {} michael@0: michael@0: private: michael@0: friend class base::RefCountedThreadSafe< michael@0: PublicRefCountedThreadSafeDtorInHeader>; michael@0: }; michael@0: michael@0: // Safe; should not have errors. michael@0: class ProtectedRefCountedDtorInHeader michael@0: : public base::RefCounted { michael@0: public: michael@0: ProtectedRefCountedDtorInHeader() {} michael@0: michael@0: protected: michael@0: ~ProtectedRefCountedDtorInHeader() {} michael@0: michael@0: private: michael@0: friend class base::RefCounted; michael@0: }; michael@0: michael@0: // Safe; should not have errors. michael@0: class PrivateRefCountedDtorInHeader michael@0: : public base::RefCounted { michael@0: public: michael@0: PrivateRefCountedDtorInHeader() {} michael@0: michael@0: private: michael@0: ~PrivateRefCountedDtorInHeader() {} michael@0: friend class base::RefCounted; michael@0: }; michael@0: michael@0: // Unsafe; A grandchild class ends up exposing their parent and grandparent's michael@0: // destructors. michael@0: class DerivedProtectedToPublicInHeader michael@0: : public ProtectedRefCountedDtorInHeader { michael@0: public: michael@0: DerivedProtectedToPublicInHeader() {} michael@0: ~DerivedProtectedToPublicInHeader() {} michael@0: }; michael@0: michael@0: // Unsafe; A grandchild ends up implicitly exposing their parent and michael@0: // grantparent's destructors. michael@0: class ImplicitDerivedProtectedToPublicInHeader michael@0: : public ProtectedRefCountedDtorInHeader { michael@0: public: michael@0: ImplicitDerivedProtectedToPublicInHeader() {} michael@0: }; michael@0: michael@0: // Unsafe-but-ignored; should not have errors. michael@0: class WebKitPublicDtorInHeader michael@0: : public WebKit::RefCounted { michael@0: public: michael@0: WebKitPublicDtorInHeader() {} michael@0: ~WebKitPublicDtorInHeader() {} michael@0: }; michael@0: michael@0: // Unsafe-but-ignored; should not have errors. michael@0: class WebKitDerivedPublicDtorInHeader michael@0: : public WebKitPublicDtorInHeader { michael@0: public: michael@0: WebKitDerivedPublicDtorInHeader() {} michael@0: ~WebKitDerivedPublicDtorInHeader() {} michael@0: }; michael@0: michael@0: #endif // BASE_REFCOUNTED_H_