1*6777b538SAndroid Build Coastguard Worker// Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker// This is a "No Compile Test" suite. 6*6777b538SAndroid Build Coastguard Worker// http://dev.chromium.org/developers/testing/no-compile-tests 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#include <utility> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker#include "base/functional/callback.h" 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workernamespace base { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workervoid ComparingDifferentCallbackTypes() { 15*6777b538SAndroid Build Coastguard Worker // Comparing callbacks requires that they be the same type. 16*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void()> c1; 17*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int()> c2; 18*6777b538SAndroid Build Coastguard Worker c1 == c2; // expected-error {{invalid operands to binary expression ('RepeatingCallback<void ()>' and 'RepeatingCallback<int ()>')}} 19*6777b538SAndroid Build Coastguard Worker} 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Workervoid ConvertingSuperclassReturn() { 22*6777b538SAndroid Build Coastguard Worker // A callback that returns a `Derived` should not be implicitly converted to a 23*6777b538SAndroid Build Coastguard Worker // callback that returns a `Base`. This is technically safe, but it surprises 24*6777b538SAndroid Build Coastguard Worker // users and generally means the author is doing something other than what 25*6777b538SAndroid Build Coastguard Worker // they intended. 26*6777b538SAndroid Build Coastguard Worker struct Base {}; 27*6777b538SAndroid Build Coastguard Worker struct Derived : public Base {}; 28*6777b538SAndroid Build Coastguard Worker RepeatingCallback<Derived()> cb_derived; 29*6777b538SAndroid Build Coastguard Worker RepeatingCallback<Base()> cb_base = cb_derived; // expected-error {{no viable conversion from 'RepeatingCallback<Derived ()>' to 'RepeatingCallback<Base ()>'}} 30*6777b538SAndroid Build Coastguard Worker cb_base = cb_derived; // expected-error {{no viable overloaded '='}} 31*6777b538SAndroid Build Coastguard Worker} 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Workervoid ChainingWithTypeMismatch() { 34*6777b538SAndroid Build Coastguard Worker // Calling `.Then()` requires that the return type of the first callback be 35*6777b538SAndroid Build Coastguard Worker // convertible to the arg type of the second callback. 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // non-void -> incompatible non-void 38*6777b538SAndroid Build Coastguard Worker OnceCallback<int*()> returns_ptr_int_once; 39*6777b538SAndroid Build Coastguard Worker OnceCallback<void(float*)> takes_ptr_float_once; 40*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int*()> returns_ptr_int_repeating; 41*6777b538SAndroid Build Coastguard Worker // Using distinct return types causes distinct `RepeatingCallback` template 42*6777b538SAndroid Build Coastguard Worker // instantiations, so we get assertion failures below where we expect. 43*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void(float*)> takes_ptr_float_repeating1; 44*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int(float*)> takes_ptr_float_repeating2; 45*6777b538SAndroid Build Coastguard Worker std::move(returns_ptr_int_once).Then(std::move(takes_ptr_float_once)); // expected-error@*:* {{|then| callback's parameter must be constructible from return type of |this|.}} 46*6777b538SAndroid Build Coastguard Worker returns_ptr_int_repeating.Then(takes_ptr_float_repeating1); // expected-error@*:* {{|then| callback's parameter must be constructible from return type of |this|.}} 47*6777b538SAndroid Build Coastguard Worker std::move(returns_ptr_int_repeating).Then(std::move(takes_ptr_float_repeating2)); // expected-error@*:* {{|then| callback's parameter must be constructible from return type of |this|.}} 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // void -> non-void 50*6777b538SAndroid Build Coastguard Worker OnceCallback<void()> returns_void_once; 51*6777b538SAndroid Build Coastguard Worker OnceCallback<void(float)> takes_float_once; 52*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void()> returns_void_repeating; 53*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void(float)> takes_float_repeating1; 54*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int(float)> takes_float_repeating2; 55*6777b538SAndroid Build Coastguard Worker std::move(returns_void_once).Then(std::move(takes_float_once)); // expected-error@*:* {{|then| callback cannot accept parameters if |this| has a void return type.}} 56*6777b538SAndroid Build Coastguard Worker returns_void_repeating.Then(takes_float_repeating1); // expected-error@*:* {{|then| callback cannot accept parameters if |this| has a void return type.}} 57*6777b538SAndroid Build Coastguard Worker std::move(returns_void_repeating).Then(std::move(takes_float_repeating2)); // expected-error@*:* {{|then| callback cannot accept parameters if |this| has a void return type.}} 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // non-void -> void 60*6777b538SAndroid Build Coastguard Worker OnceCallback<int()> returns_int_once; 61*6777b538SAndroid Build Coastguard Worker OnceCallback<void()> takes_void_once; 62*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int()> returns_int_repeating; 63*6777b538SAndroid Build Coastguard Worker RepeatingCallback<void()> takes_void_repeating1; 64*6777b538SAndroid Build Coastguard Worker RepeatingCallback<int()> takes_void_repeating2; 65*6777b538SAndroid Build Coastguard Worker std::move(returns_int_once).Then(std::move(takes_void_once)); // expected-error@*:* {{|then| callback must accept exactly one parameter if |this| has a non-void return type.}} 66*6777b538SAndroid Build Coastguard Worker returns_int_repeating.Then(takes_void_repeating1); // expected-error@*:* {{|then| callback must accept exactly one parameter if |this| has a non-void return type.}} 67*6777b538SAndroid Build Coastguard Worker std::move(returns_int_repeating).Then(std::move(takes_void_repeating2)); // expected-error@*:* {{|then| callback must accept exactly one parameter if |this| has a non-void return type.}} 68*6777b538SAndroid Build Coastguard Worker} 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker} // namespace base 71