103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/ref_counted.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)struct Foo : public base::RefCounted<Foo> {
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int dummy;
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class Bar {
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Foo* TestFunction();
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_refptr<Foo> CreateFoo();
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// An example of an unsafe conversion--the scoped_refptr will be destroyed by
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// the time function returns, since it's a temporary, so the returned raw
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// pointer may point to a deleted object.
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)Foo* Bar::TestFunction() {
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return CreateFoo();
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
23