1 // RUN: %check_clang_tidy -std=c++20 %s cppcoreguidelines-avoid-reference-coroutine-parameters %t 2 3 // NOLINTBEGIN 4 namespace 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 26 struct Awaiter { 27 bool await_ready() noexcept; 28 void await_suspend(std::coroutine_handle<>) noexcept; 29 void await_resume() noexcept; 30 }; 31 32 struct 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 43 struct Obj {}; 44 45 Coro no_args() { 46 co_return; 47 } 48 49 Coro no_references(int x, int* y, Obj z, const Obj w) { 50 co_return; 51 } 52 53 Coro 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 59 Coro 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 64 Coro 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 69 Coro non_coro_accepts_references(int& x) { 70 if (x); 71 return Coro{}; 72 } 73 74 void 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