xref: /aosp_15_r20/external/cronet/base/memory/weak_ptr_nocompile.nc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 : SupportsWeakPtr<Producer> {};
13struct DerivedProducer : Producer {};
14struct OtherDerivedProducer : Producer {};
15struct MultiplyDerivedProducer : Producer,
16                                 SupportsWeakPtr<MultiplyDerivedProducer> {};
17struct Unrelated {};
18struct DerivedUnrelated : Unrelated {};
19
20void DowncastDisallowed() {
21  Producer f;
22  WeakPtr<Producer> ptr = f.AsWeakPtr();
23  {
24    WeakPtr<DerivedProducer> derived_ptr = ptr;  // expected-error {{no viable conversion from 'WeakPtr<Producer>' to 'WeakPtr<DerivedProducer>'}}
25  }
26  {
27    WeakPtr<DerivedProducer> derived_ptr =
28        static_cast<WeakPtr<DerivedProducer> >(ptr);  // expected-error {{no matching conversion for static_cast from 'WeakPtr<Producer>' to 'WeakPtr<DerivedProducer>'}}
29  }
30}
31
32void RefDowncastDisallowed() {
33  Producer f;
34  WeakPtr<Producer> ptr = f.AsWeakPtr();
35  {
36    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>'}}
37  }
38  {
39    WeakPtr<DerivedProducer>& derived_ptr =
40        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>'}}
41  }
42}
43
44void AsWeakPtrDowncastDisallowed() {
45  Producer f;
46  WeakPtr<DerivedProducer> ptr =
47      SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f);  // expected-error {{no matching function for call to 'StaticAsWeakPtr'}}
48}
49
50void UnsafeDowncastViaAsWeakPtrDisallowed() {
51  Producer f;
52  {
53    WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f);  // expected-error {{no viable conversion from 'WeakPtr<base::Producer>' to 'WeakPtr<DerivedProducer>'}}
54  }
55  {
56    WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);  // expected-error {{no matching function for call to 'AsWeakPtr'}}
57  }
58  {
59    WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f);  // expected-error {{no viable conversion from 'WeakPtr<base::Producer>' to 'WeakPtr<DerivedProducer>'}}
60  }
61}
62
63void UnsafeSidecastViaAsWeakPtrDisallowed() {
64  DerivedProducer f;
65  {
66    WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f);  // expected-error {{no viable conversion from 'WeakPtr<base::DerivedProducer>' to 'WeakPtr<OtherDerivedProducer>'}}
67  }
68  {
69    WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);  // expected-error {{no viable conversion from 'WeakPtr<base::DerivedProducer>' to 'WeakPtr<OtherDerivedProducer>'}}
70  }
71  {
72    WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f);  // expected-error {{no matching function for call to 'AsWeakPtr'}}
73  }
74}
75
76void UnrelatedCastViaAsWeakPtrDisallowed() {
77  DerivedProducer f;
78  {
79    WeakPtr<Unrelated> ptr = AsWeakPtr(&f);  // expected-error {{no viable conversion from 'WeakPtr<base::DerivedProducer>' to 'WeakPtr<Unrelated>'}}
80  }
81  {
82    WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f);  // expected-error {{no matching function for call to 'AsWeakPtr'}}
83  }
84}
85
86void AsWeakPtrWithoutSupportsWeakPtrDisallowed() {
87  {
88    Unrelated f;
89    WeakPtr<Unrelated> ptr = AsWeakPtr(&f);  // expected-error@*:* {{AsWeakPtr argument must inherit from SupportsWeakPtr}}
90    // expected-error@*:* {{no viable constructor or deduction guide for deduction of template arguments of 'ExtractSinglyInheritedBase'}}
91    // expected-error@*:* {{static_cast from 'base::Unrelated *' to 'SupportsWeakPtr<Base> *' (aka 'SupportsWeakPtr<int> *'), which are not related by inheritance, is not allowed}}
92  }
93  {
94    DerivedUnrelated f;
95    WeakPtr<Unrelated> ptr = AsWeakPtr(&f);  // expected-error@*:* {{AsWeakPtr argument must inherit from SupportsWeakPtr}}
96    // expected-error@*:* {{no viable constructor or deduction guide for deduction of template arguments of 'ExtractSinglyInheritedBase'}}
97    // expected-error@*:* {{static_cast from 'base::DerivedUnrelated *' to 'SupportsWeakPtr<Base> *' (aka 'SupportsWeakPtr<int> *'), which are not related by inheritance, is not allowed}}
98  }
99}
100
101void AsWeakPtrWithAmbiguousAncestorsDisallowed() {
102  MultiplyDerivedProducer f;
103  WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f);  // expected-error@*:* {{no viable constructor or deduction guide for deduction of template arguments of 'ExtractSinglyInheritedBase'}}
104  // expected-error@*:* {{static_cast from 'base::MultiplyDerivedProducer *' to 'SupportsWeakPtr<Base> *' (aka 'SupportsWeakPtr<int> *'), which are not related by inheritance, is not allowed}}
105}
106
107void VendingMutablePtrsFromConstFactoryDisallowed() {
108  {
109    Unrelated unrelated;
110    const WeakPtrFactory<const Unrelated> factory(&unrelated);
111    factory.GetMutableWeakPtr();  // expected-error {{invalid reference to function 'GetMutableWeakPtr': constraints not satisfied}}
112  }
113}
114
115void UnauthorizedBindToCurrentSequenceDisallowed() {
116  Unrelated unrelated;
117  WeakPtrFactory<Unrelated> factory(&unrelated);
118  factory.BindToCurrentSequence(
119      subtle::BindWeakPtrFactoryPassKey());  // expected-error {{calling a private constructor of class 'base::subtle::BindWeakPtrFactoryPassKey'}}
120}
121
122}  // namespace base
123