xref: /aosp_15_r20/external/cronet/base/functional/callback_nocompile.nc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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