// Copyright 2018 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/observer_list.h" #include #include #include namespace base { void CannotUseCheckedObserverInUncheckedList() { struct Observer : public CheckedObserver { void OnObserve() {} }; ObserverList::Unchecked list; for (auto& observer : list) // expected-error@base/observer_list_internal.h:* {{CheckedObserver classes must not use ObserverList::Unchecked}} observer.OnObserve(); } void CannotUseUncheckedObserverInCheckedList() { struct UncheckedObserver { void OnObserve() {} }; ObserverList list; for (auto& observer : list) // expected-error@base/observer_list_internal.h:* {{Observers should inherit from base::CheckedObserver.}} observer.OnObserve(); // expected-error@*:* {{static_cast from 'base::CheckedObserver *' to 'UncheckedObserver *', which are not related by inheritance, is not allowed}} } // This test ensures that passing move-only types to ObserverList::Notify() // fails compilation. void NotifyWithMoveOnlyArgsFails() { // std::unique_ptr is move-only. auto str = std::make_unique("123"); struct TestObserverWithArgs : public CheckedObserver { void Observe(int, std::unique_ptr) {} }; ObserverList list; // expected-error@* {{no matching member function for call to 'Notify'}} list.Notify(&TestObserverWithArgs::Observe, 10, str); // expected-error@* {{no matching member function for call to 'Notify'}} list.Notify(&TestObserverWithArgs::Observe, 10, std::move(str)); } } // namespace base