// RUN: %check_clang_tidy -std=c++20 %s cppcoreguidelines-avoid-reference-coroutine-parameters %t --
// NOLINTBEGIN
namespace std {
template <typename T, typename... Args>
struct coroutine_traits {
using promise_type = typename T::promise_type;
};
template <typename T = void>
struct coroutine_handle;
template <>
struct coroutine_handle<void> {
coroutine_handle() noexcept;
coroutine_handle(decltype(nullptr)) noexcept;
static constexpr coroutine_handle from_address(void*);
};
template <typename T>
struct coroutine_handle {
coroutine_handle() noexcept;
coroutine_handle(decltype(nullptr)) noexcept;
static constexpr coroutine_handle from_address(void*);
operator coroutine_handle<>() const noexcept;
};
} // namespace std
struct Awaiter {
bool await_ready() noexcept;
void await_suspend(std::coroutine_handle<>) noexcept;
void await_resume() noexcept;
};
struct Coro {
struct promise_type {
Awaiter initial_suspend();
Awaiter final_suspend() noexcept;
void return_void();
Coro get_return_object();
void unhandled_exception();
};
};
// NOLINTEND
struct Obj {};
Coro no_args() {
co_return;
}
Coro no_references(int x, int* y, Obj z, const Obj w) {
co_return;
}
Coro accepts_references(int& x, const int &y) {
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
// CHECK-MESSAGES: :[[@LINE-2]]:33: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
co_return;
}
Coro accepts_references_and_non_references(int& x, int y) {
// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
co_return;
}
Coro accepts_references_to_objects(Obj& x) {
// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
co_return;
}
Coro non_coro_accepts_references(int& x) {
if (x);
return Coro{};
}
void defines_a_lambda() {
auto NoArgs = [](int x) -> Coro { co_return; };
auto NoReferences = [](int x) -> Coro { co_return; };
auto WithReferences = [](int& x) -> Coro { co_return; };
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
auto WithReferences2 = [](int&) -> Coro { co_return; };
// CHECK-MESSAGES: :[[@LINE-1]]:29: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
}
void coroInFunctionWithReference(int&) {
auto SampleCoro = [](int x) -> Coro { co_return; };
}
Coro lambdaWithReferenceInCoro() {
auto SampleLambda = [](int& x) {};
co_return;
}
using MyIntegerRef = int&;
Coro coroWithReferenceBehindTypedef(MyIntegerRef ref) {
// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: coroutine parameters should not be references [cppcoreguidelines-avoid-reference-coroutine-parameters]
co_return;
}