1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/memory/weak_ptr.h"
6
7namespace base {
8
9struct Producer : SupportsWeakPtr<Producer> {};
10struct DerivedProducer : Producer {};
11struct OtherDerivedProducer : Producer {};
12struct MultiplyDerivedProducer : Producer,
13                                 SupportsWeakPtr<MultiplyDerivedProducer> {};
14struct Unrelated {};
15struct DerivedUnrelated : Unrelated {};
16
17#if defined(NCTEST_AUTO_DOWNCAST)  // [r"invalid conversion from"]
18
19void WontCompile() {
20  Producer f;
21  WeakPtr<Producer> ptr = f.AsWeakPtr();
22  WeakPtr<DerivedProducer> derived_ptr = ptr;
23}
24
25#elif defined(NCTEST_STATIC_DOWNCAST)  // [r"invalid conversion from"]
26
27void WontCompile() {
28  Producer f;
29  WeakPtr<Producer> ptr = f.AsWeakPtr();
30  WeakPtr<DerivedProducer> derived_ptr =
31      static_cast<WeakPtr<DerivedProducer> >(ptr);
32}
33
34#elif defined(NCTEST_AUTO_REF_DOWNCAST)  // [r"invalid initialization of reference"]
35
36void WontCompile() {
37  Producer f;
38  WeakPtr<Producer> ptr = f.AsWeakPtr();
39  WeakPtr<DerivedProducer>& derived_ptr = ptr;
40}
41
42#elif defined(NCTEST_STATIC_REF_DOWNCAST)  // [r"invalid static_cast"]
43
44void WontCompile() {
45  Producer f;
46  WeakPtr<Producer> ptr = f.AsWeakPtr();
47  WeakPtr<DerivedProducer>& derived_ptr =
48      static_cast<WeakPtr<DerivedProducer>&>(ptr);
49}
50
51#elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST)  // [r"no matching function"]
52
53void WontCompile() {
54  Producer f;
55  WeakPtr<DerivedProducer> ptr =
56      SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f);
57}
58
59#elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST)  // [r"invalid conversion from"]
60
61void WontCompile() {
62  Producer f;
63  WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f);
64}
65
66#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST)  // [r"no matching function"]
67
68void WontCompile() {
69  Producer f;
70  WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
71}
72
73#elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST)  // [r"invalid conversion from"]
74
75void WontCompile() {
76  Producer f; 
77  WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f);
78}
79
80#elif defined(NCTEST_UNSAFE_HELPER_CAST)  // [r"cannot convert"]
81
82void WontCompile() {
83  DerivedProducer f;
84  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f);
85}
86
87#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST)  // [r"no matching function"]
88
89void WontCompile() {
90  DerivedProducer f;
91  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f);
92}
93
94#elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST)  // [r"cannot convert"]
95
96void WontCompile() {
97  DerivedProducer f;
98  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
99}
100
101#elif defined(NCTEST_UNRELATED_HELPER)  // [r"cannot convert"]
102
103void WontCompile() {
104  DerivedProducer f;
105  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
106}
107
108#elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER)  // [r"no matching function"]
109
110void WontCompile() {
111  DerivedProducer f;
112  WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f);
113}
114
115#elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER)  // [r"size of array is negative"]
116
117void WontCompile() {
118  Unrelated f;
119  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
120}
121
122#elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER)  // [r"size of array is negative"]
123
124void WontCompile() {
125  DerivedUnrelated f;
126  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
127}
128
129#elif defined(NCTEST_AMBIGUOUS_ANCESTORS)  // [r"ambiguous base"]
130
131void WontCompile() {
132  MultiplyDerivedProducer f;
133  WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f);
134}
135
136#endif
137
138}
139