brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 4df872e Raw
100 lines · cpp
1// RUN: %check_clang_tidy -std=c++20 %s cppcoreguidelines-avoid-reference-coroutine-parameters %t --2 3// NOLINTBEGIN4namespace 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 std25 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// NOLINTEND42 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