// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This is a "No Compile Test" suite. // http://dev.chromium.org/developers/testing/no-compile-tests #include "base/memory/weak_ptr.h" namespace base { struct Producer { WeakPtr AsWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } WeakPtrFactory weak_ptr_factory_{this}; }; struct DerivedProducer : Producer {}; struct OtherDerivedProducer : Producer {}; struct Unrelated {}; struct DerivedUnrelated : Unrelated {}; void DowncastDisallowed() { Producer f; WeakPtr ptr = f.AsWeakPtr(); { WeakPtr derived_ptr = ptr; // expected-error {{no viable conversion from 'WeakPtr' to 'WeakPtr'}} } { WeakPtr derived_ptr = static_cast >(ptr); // expected-error {{no matching conversion for static_cast from 'WeakPtr' to 'WeakPtr'}} } } void RefDowncastDisallowed() { Producer f; WeakPtr ptr = f.AsWeakPtr(); { WeakPtr& derived_ptr = ptr; // expected-error {{non-const lvalue reference to type 'WeakPtr' cannot bind to a value of unrelated type 'WeakPtr'}} } { WeakPtr& derived_ptr = static_cast&>(ptr); // expected-error {{non-const lvalue reference to type 'WeakPtr' cannot bind to a value of unrelated type 'WeakPtr'}} } } void VendingMutablePtrsFromConstFactoryDisallowed() { { Unrelated unrelated; const WeakPtrFactory factory(&unrelated); factory.GetMutableWeakPtr(); // expected-error {{invalid reference to function 'GetMutableWeakPtr': constraints not satisfied}} } } void UnauthorizedBindToCurrentSequenceDisallowed() { Unrelated unrelated; WeakPtrFactory factory(&unrelated); factory.BindToCurrentSequence( subtle::BindWeakPtrFactoryPassKey()); // expected-error {{calling a private constructor of class 'base::subtle::BindWeakPtrFactoryPassKey'}} } } // namespace base