Skip to content

Commit

Permalink
[misc-coroutine-hostile-raii] Use getOperand instead of getCommonExpr. (
Browse files Browse the repository at this point in the history
#79206)

We were previously allowlisting awaitable types returned by
`await_transform` instead of the type of the operand of the `co_await`
expression.

This previously used to give false positives and not respect the
`AllowedAwaitablesList` flag when `await_transform` is used. See added
test cases for such examples.
  • Loading branch information
usx95 committed Jan 23, 2024
1 parent 9d476e1 commit 729657d
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ AST_MATCHER_P(Stmt, forEachPrevStmt, ast_matchers::internal::Matcher<Stmt>,
// Matches the expression awaited by the `co_await`.
AST_MATCHER_P(CoawaitExpr, awaitable, ast_matchers::internal::Matcher<Expr>,
InnerMatcher) {
if (Expr *E = Node.getCommonExpr())
if (Expr *E = Node.getOperand())
return InnerMatcher.matches(*E, Finder, Builder);
return false;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// RUN: %check_clang_tidy -std=c++20 %s misc-coroutine-hostile-raii %t \
// RUN: -config="{CheckOptions: {\
// RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; ::my::other::Mutex', \
// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 'safe::awaitable; ::my::other::awaitable' \
// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 'safe::awaitable; ::transformable::awaitable' \
// RUN: }}"

namespace std {
Expand Down Expand Up @@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
absl::Mutex no_warning_5;
}

// ================================================================================
// Safe awaitable
// ================================================================================
namespace safe {
struct awaitable {
bool await_ready() noexcept { return false; }
Expand All @@ -150,6 +153,32 @@ ReturnObject RAIISafeSuspendTest() {
co_await other{};
}

// ================================================================================
// Safe transformable awaitable
// ================================================================================
struct transformable { struct awaitable{}; };
using alias_transformable_awaitable = transformable::awaitable;
struct UseTransformAwaitable {
struct promise_type {
UseTransformAwaitable get_return_object() { return {}; }
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void unhandled_exception() {}
std::suspend_always await_transform(transformable::awaitable) { return {}; }
};
};

auto retAwaitable() { return transformable::awaitable{}; }
UseTransformAwaitable RAIISafeSuspendTest2() {
absl::Mutex a;
co_await retAwaitable();
co_await transformable::awaitable{};
co_await alias_transformable_awaitable{};
}

// ================================================================================
// Lambdas
// ================================================================================
void lambda() {
absl::Mutex no_warning;
auto lambda = []() -> ReturnObject {
Expand All @@ -164,6 +193,9 @@ void lambda() {
absl::Mutex no_warning_2;
}

// ================================================================================
// Denylisted RAII
// ================================================================================
template<class T>
ReturnObject raii_in_template(){
T a;
Expand Down

0 comments on commit 729657d

Please sign in to comment.