Chromium Code Reviews| 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..06ef4f1ec1e76856231bc51c9eb1266acf30ae55 |
| --- /dev/null |
| +++ b/tools/clang/plugins/tests/base_refcounted.h |
| @@ -0,0 +1,120 @@ |
| +// 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 { |
| + |
| +// Define a 'dummy' set of refcounting templates |
|
Nico
2012/04/13 22:40:55
useless comment, remove
|
| +template <typename T> |
| +class RefCounted { |
| + public: |
| + RefCounted() {} |
| + ~RefCounted() {} |
| +}; |
| + |
| +template <typename T> |
| +class RefCountedThreadSafe { |
| + public: |
| + RefCountedThreadSafe() {} |
| + ~RefCountedThreadSafe() {} |
| +}; |
| + |
| +} // namespace base |
| + |
| +// However, WebKit ref-counted classes should be ignored. |
|
Nico
2012/04/13 22:40:55
You might want to explain somewhere why (say, in t
|
| +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_ |