1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/webrtc/trunk/tools/clang/plugins/tests/base_refcounted.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,121 @@ 1.4 +// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 + 1.8 +#ifndef BASE_REFCOUNTED_H_ 1.9 +#define BASE_REFCOUNTED_H_ 1.10 + 1.11 +namespace base { 1.12 + 1.13 +template <typename T> 1.14 +class RefCounted { 1.15 + public: 1.16 + RefCounted() {} 1.17 + ~RefCounted() {} 1.18 +}; 1.19 + 1.20 +template <typename T> 1.21 +class RefCountedThreadSafe { 1.22 + public: 1.23 + RefCountedThreadSafe() {} 1.24 + ~RefCountedThreadSafe() {} 1.25 +}; 1.26 + 1.27 +} // namespace base 1.28 + 1.29 +// Ignore classes whose inheritance tree ends in WebKit's RefCounted base 1.30 +// class. Though prone to error, this pattern is very prevalent in WebKit 1.31 +// code, so do not issue any warnings. 1.32 +namespace WebKit { 1.33 + 1.34 +template <typename T> 1.35 +class RefCounted { 1.36 + public: 1.37 + RefCounted() {} 1.38 + ~RefCounted() {} 1.39 +}; 1.40 + 1.41 +} // namespace WebKit 1.42 + 1.43 +// Unsafe; should error. 1.44 +class PublicRefCountedDtorInHeader 1.45 + : public base::RefCounted<PublicRefCountedDtorInHeader> { 1.46 + public: 1.47 + PublicRefCountedDtorInHeader() {} 1.48 + ~PublicRefCountedDtorInHeader() {} 1.49 + 1.50 + private: 1.51 + friend class base::RefCounted<PublicRefCountedDtorInHeader>; 1.52 +}; 1.53 + 1.54 +// Unsafe; should error. 1.55 +class PublicRefCountedThreadSafeDtorInHeader 1.56 + : public base::RefCountedThreadSafe< 1.57 + PublicRefCountedThreadSafeDtorInHeader> { 1.58 + public: 1.59 + PublicRefCountedThreadSafeDtorInHeader() {} 1.60 + ~PublicRefCountedThreadSafeDtorInHeader() {} 1.61 + 1.62 + private: 1.63 + friend class base::RefCountedThreadSafe< 1.64 + PublicRefCountedThreadSafeDtorInHeader>; 1.65 +}; 1.66 + 1.67 +// Safe; should not have errors. 1.68 +class ProtectedRefCountedDtorInHeader 1.69 + : public base::RefCounted<ProtectedRefCountedDtorInHeader> { 1.70 + public: 1.71 + ProtectedRefCountedDtorInHeader() {} 1.72 + 1.73 + protected: 1.74 + ~ProtectedRefCountedDtorInHeader() {} 1.75 + 1.76 + private: 1.77 + friend class base::RefCounted<ProtectedRefCountedDtorInHeader>; 1.78 +}; 1.79 + 1.80 +// Safe; should not have errors. 1.81 +class PrivateRefCountedDtorInHeader 1.82 + : public base::RefCounted<PrivateRefCountedDtorInHeader> { 1.83 + public: 1.84 + PrivateRefCountedDtorInHeader() {} 1.85 + 1.86 + private: 1.87 + ~PrivateRefCountedDtorInHeader() {} 1.88 + friend class base::RefCounted<PrivateRefCountedDtorInHeader>; 1.89 +}; 1.90 + 1.91 +// Unsafe; A grandchild class ends up exposing their parent and grandparent's 1.92 +// destructors. 1.93 +class DerivedProtectedToPublicInHeader 1.94 + : public ProtectedRefCountedDtorInHeader { 1.95 + public: 1.96 + DerivedProtectedToPublicInHeader() {} 1.97 + ~DerivedProtectedToPublicInHeader() {} 1.98 +}; 1.99 + 1.100 +// Unsafe; A grandchild ends up implicitly exposing their parent and 1.101 +// grantparent's destructors. 1.102 +class ImplicitDerivedProtectedToPublicInHeader 1.103 + : public ProtectedRefCountedDtorInHeader { 1.104 + public: 1.105 + ImplicitDerivedProtectedToPublicInHeader() {} 1.106 +}; 1.107 + 1.108 +// Unsafe-but-ignored; should not have errors. 1.109 +class WebKitPublicDtorInHeader 1.110 + : public WebKit::RefCounted<WebKitPublicDtorInHeader> { 1.111 + public: 1.112 + WebKitPublicDtorInHeader() {} 1.113 + ~WebKitPublicDtorInHeader() {} 1.114 +}; 1.115 + 1.116 +// Unsafe-but-ignored; should not have errors. 1.117 +class WebKitDerivedPublicDtorInHeader 1.118 + : public WebKitPublicDtorInHeader { 1.119 + public: 1.120 + WebKitDerivedPublicDtorInHeader() {} 1.121 + ~WebKitDerivedPublicDtorInHeader() {} 1.122 +}; 1.123 + 1.124 +#endif // BASE_REFCOUNTED_H_