// 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 <stddef.h> 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; }