1// Copyright 2018 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/observer_list.h" 9 10#include <memory> 11#include <string> 12#include <type_traits> 13 14namespace base { 15 16void CannotUseCheckedObserverInUncheckedList() { 17 struct Observer : public CheckedObserver { 18 void OnObserve() {} 19 }; 20 ObserverList<Observer>::Unchecked list; 21 for (auto& observer : list) // expected-error@base/observer_list_internal.h:* {{CheckedObserver classes must not use ObserverList<T>::Unchecked}} 22 observer.OnObserve(); 23} 24 25void CannotUseUncheckedObserverInCheckedList() { 26 struct UncheckedObserver { 27 void OnObserve() {} 28 }; 29 ObserverList<UncheckedObserver> list; 30 for (auto& observer : list) // expected-error@base/observer_list_internal.h:* {{Observers should inherit from base::CheckedObserver.}} 31 observer.OnObserve(); // expected-error@*:* {{static_cast from 'base::CheckedObserver *' to 'UncheckedObserver *', which are not related by inheritance, is not allowed}} 32} 33 34// This test ensures that passing move-only types to ObserverList::Notify() 35// fails compilation. 36void NotifyWithMoveOnlyArgsFails() { 37 // std::unique_ptr is move-only. 38 auto str = std::make_unique<std::string>("123"); 39 40 struct TestObserverWithArgs : public CheckedObserver { 41 void Observe(int, std::unique_ptr<std::string>) {} 42 }; 43 44 ObserverList<TestObserverWithArgs> list; 45 // expected-error@* {{no matching member function for call to 'Notify'}} 46 list.Notify(&TestObserverWithArgs::Observe, 10, str); 47 48 // expected-error@* {{no matching member function for call to 'Notify'}} 49 list.Notify(&TestObserverWithArgs::Observe, 10, std::move(str)); 50} 51 52} // namespace base 53