mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[misc-coroutine-hostile-raii] Use getOperand instead of getCommonExpr. (#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.
This commit is contained in:
parent
9d476e1e1a
commit
729657d6e1
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
|
||||
absl::Mutex no_warning_5;
|
||||
}
|
||||
|
||||
// ================================================================================
|
||||
// Safe awaitable
|
||||
// ================================================================================
|
||||
namespace safe {
|
||||
struct awaitable {
|
||||
bool await_ready() noexcept { return false; }
|
||||
@ -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 {
|
||||
@ -164,6 +193,9 @@ void lambda() {
|
||||
absl::Mutex no_warning_2;
|
||||
}
|
||||
|
||||
// ================================================================================
|
||||
// Denylisted RAII
|
||||
// ================================================================================
|
||||
template<class T>
|
||||
ReturnObject raii_in_template(){
|
||||
T a;
|
||||
|
Loading…
Reference in New Issue
Block a user