// 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 ProtectedRefCountedDtorInHeader {
 public:
  AnonymousDerivedProtectedToPublicInImpl() {}
  ~AnonymousDerivedProtectedToPublicInImpl() {}
};

}  // 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* protected_ok = 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;
}
