• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2012 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This is a "No Compile Test" suite.
6// http://dev.chromium.org/developers/testing/no-compile-tests
7
8#include "base/memory/weak_ptr.h"
9
10namespace base {
11
12struct Producer {
13  WeakPtr<Producer> AsWeakPtr() {
14    return weak_ptr_factory_.GetWeakPtr();
15  }
16  WeakPtrFactory<Producer> weak_ptr_factory_{this};
17};
18struct DerivedProducer : Producer {};
19struct OtherDerivedProducer : Producer {};
20struct Unrelated {};
21struct DerivedUnrelated : Unrelated {};
22
23void DowncastDisallowed() {
24  Producer f;
25  WeakPtr<Producer> ptr = f.AsWeakPtr();
26  {
27    WeakPtr<DerivedProducer> derived_ptr = ptr;  // expected-error {{no viable conversion from 'WeakPtr<Producer>' to 'WeakPtr<DerivedProducer>'}}
28  }
29  {
30    WeakPtr<DerivedProducer> derived_ptr =
31        static_cast<WeakPtr<DerivedProducer> >(ptr);  // expected-error {{no matching conversion for static_cast from 'WeakPtr<Producer>' to 'WeakPtr<DerivedProducer>'}}
32  }
33}
34
35void RefDowncastDisallowed() {
36  Producer f;
37  WeakPtr<Producer> ptr = f.AsWeakPtr();
38  {
39    WeakPtr<DerivedProducer>& derived_ptr = ptr;  // expected-error {{non-const lvalue reference to type 'WeakPtr<DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<Producer>'}}
40  }
41  {
42    WeakPtr<DerivedProducer>& derived_ptr =
43        static_cast<WeakPtr<DerivedProducer>&>(ptr);  // expected-error {{non-const lvalue reference to type 'WeakPtr<DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<Producer>'}}
44  }
45}
46
47void VendingMutablePtrsFromConstFactoryDisallowed() {
48  {
49    Unrelated unrelated;
50    const WeakPtrFactory<const Unrelated> factory(&unrelated);
51    factory.GetMutableWeakPtr();  // expected-error {{invalid reference to function 'GetMutableWeakPtr': constraints not satisfied}}
52  }
53}
54
55void UnauthorizedBindToCurrentSequenceDisallowed() {
56  Unrelated unrelated;
57  WeakPtrFactory<Unrelated> factory(&unrelated);
58  factory.BindToCurrentSequence(
59      subtle::BindWeakPtrFactoryPassKey());  // expected-error {{calling a private constructor of class 'base::subtle::BindWeakPtrFactoryPassKey'}}
60}
61
62}  // namespace base
63