// 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;
}