1// RUN: %check_clang_tidy -std=c++20 %s cppcoreguidelines-avoid-reference-coroutine-parameters %t --
2
3// NOLINTBEGIN
4namespace std {
5 template <typename T, typename... Args>
6 struct coroutine_traits {
7 using promise_type = typename T::promise_type;
8 };
9 template <typename T = void>
10 struct coroutine_handle;
11 template <>
12 struct coroutine_handle<void> {
13 coroutine_handle() noexcept;
14 coroutine_handle(decltype(nullptr)) noexcept;
15 static constexpr coroutine_handle from_address(void*);
16 };
17 template <typename T>
18 struct coroutine_handle {
19 coroutine_handle() noexcept;
20 coroutine_handle(decltype(nullptr)) noexcept;
21 static constexpr coroutine_handle from_address(void*);
22 operator coroutine_handle<>() const noexcept;
23 };
24} // namespace std
25
26struct Awaiter {
27 bool await_ready() noexcept;
28 void await_suspend(std::coroutine_handle<>) noexcept;
29 void await_resume() noexcept;
30};
31
32struct Coro {
33 struct promise_type {
34 Awaiter initial_suspend();
35 Awaiter final_suspend() noexcept;
36 void return_void();
37 Coro get_return_object();
38 void unhandled_exception();
39 };
40};
41// NOLINTEND
42
43struct Obj {};
44
45Coro no_args() {
46 co_return;
47}
48
49Coro no_references(int x, int* y, Obj z, const Obj w) {
50 co_return;
51}
52
53Coro accepts_references(int& x, const int &y) {
54 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
55 // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
56 co_return;
57}
58
59Coro accepts_references_and_non_references(int& x, int y) {
60 // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
61 co_return;
62}
63
64Coro accepts_references_to_objects(Obj& x) {
65 // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
66 co_return;
67}
68
69Coro non_coro_accepts_references(int& x) {
70 if (x);
71 return Coro{};
72}
73
74void defines_a_lambda() {
75 auto NoArgs = [](int x) -> Coro { co_return; };
76
77 auto NoReferences = [](int x) -> Coro { co_return; };
78
79 auto WithReferences = [](int& x) -> Coro { co_return; };
80 // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
81
82 auto WithReferences2 = [](int&) -> Coro { co_return; };
83 // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
84}
85
86void coroInFunctionWithReference(int&) {
87 auto SampleCoro = [](int x) -> Coro { co_return; };
88}
89
90Coro lambdaWithReferenceInCoro() {
91 auto SampleLambda = [](int& x) {};
92 co_return;
93}
94
95using MyIntegerRef = int&;
96Coro coroWithReferenceBehindTypedef(MyIntegerRef ref) {
97// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
98 co_return;
99}
100

source code of clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/avoid-reference-coroutine-parameters.cpp