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