Index: tools/clang/plugins/tests/base_refcounted.cpp |
diff --git a/tools/clang/plugins/tests/base_refcounted.cpp b/tools/clang/plugins/tests/base_refcounted.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46e8975c597c46558be8728c094bf68d8db310fa |
--- /dev/null |
+++ b/tools/clang/plugins/tests/base_refcounted.cpp |
@@ -0,0 +1,79 @@ |
+// 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. |
+ |
+#include "base_refcounted.h" |
+ |
+#include <cstddef> |
+ |
+namespace { |
+ |
+// Unsafe; should error. |
+class AnonymousDerivedProtectedToPublicInImpl |
+ : public ProtectedRefCountedVirtualDtorInHeader { |
+ public: |
+ AnonymousDerivedProtectedToPublicInImpl() {} |
+ ~AnonymousDerivedProtectedToPublicInImpl() override {} |
+}; |
+ |
+// Unsafe; but we should only warn on the base class. |
+class AnonymousDerivedProtectedOnDerived |
+ : public ProtectedRefCountedDtorInHeader { |
+ protected: |
+ ~AnonymousDerivedProtectedOnDerived() {} |
+}; |
+ |
+} // namespace |
+ |
+// Unsafe; should error. |
+class PublicRefCountedDtorInImpl |
+ : public base::RefCounted<PublicRefCountedDtorInImpl> { |
+ public: |
+ PublicRefCountedDtorInImpl() {} |
+ ~PublicRefCountedDtorInImpl() {} |
+ |
+ private: |
+ friend class base::RefCounted<PublicRefCountedDtorInImpl>; |
+}; |
+ |
+class Foo { |
+ public: |
+ class BarInterface { |
+ protected: |
+ virtual ~BarInterface() {} |
+ }; |
+ |
+ typedef base::RefCounted<BarInterface> RefCountedBar; |
+ typedef RefCountedBar AnotherTypedef; |
+}; |
+ |
+class Baz { |
+ public: |
+ typedef typename Foo::AnotherTypedef MyLocalTypedef; |
+}; |
+ |
+// Unsafe; should error. |
+class UnsafeTypedefChainInImpl : public Baz::MyLocalTypedef { |
+ public: |
+ UnsafeTypedefChainInImpl() {} |
+ ~UnsafeTypedefChainInImpl() {} |
+}; |
+ |
+int main() { |
+ PublicRefCountedDtorInHeader bad; |
+ PublicRefCountedDtorInImpl also_bad; |
+ |
+ ProtectedRefCountedDtorInHeader* even_badder = NULL; |
+ PrivateRefCountedDtorInHeader* private_ok = NULL; |
+ |
+ DerivedProtectedToPublicInHeader still_bad; |
+ PublicRefCountedThreadSafeDtorInHeader another_bad_variation; |
+ AnonymousDerivedProtectedToPublicInImpl and_this_is_bad_too; |
+ ImplicitDerivedProtectedToPublicInHeader bad_yet_again; |
+ UnsafeTypedefChainInImpl and_again_this_is_bad; |
+ |
+ WebKitPublicDtorInHeader ignored; |
+ WebKitDerivedPublicDtorInHeader still_ignored; |
+ |
+ return 0; |
+} |