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