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