Skip to content

Commit 31ec633

Browse files
[clang-tidy] Fix bugs in misc-coroutine-hostile-raii check (#167947)
1. Handle transformed awaitables for `AllowedCallees`, which generate temporaries and weren't being handled by #167778. 1. Fix name mismatches in `storeOptions`.
1 parent 8fce476 commit 31ec633

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

clang-tools-extra/clang-tidy/misc/CoroutineHostileRAIICheck.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ static auto typeWithNameIn(const std::vector<StringRef> &Names) {
6767
hasCanonicalType(hasDeclaration(namedDecl(hasAnyName(Names)))));
6868
}
6969

70+
static auto functionWithNameIn(const std::vector<StringRef> &Names) {
71+
auto Call = callExpr(callee(functionDecl(hasAnyName(Names))));
72+
return anyOf(expr(cxxBindTemporaryExpr(has(Call))), expr(Call));
73+
}
74+
7075
CoroutineHostileRAIICheck::CoroutineHostileRAIICheck(StringRef Name,
7176
ClangTidyContext *Context)
7277
: ClangTidyCheck(Name, Context),
@@ -83,9 +88,8 @@ void CoroutineHostileRAIICheck::registerMatchers(MatchFinder *Finder) {
8388
hasAttr(attr::Kind::ScopedLockable)))))
8489
.bind("scoped-lockable");
8590
auto OtherRAII = varDecl(typeWithNameIn(RAIITypesList)).bind("raii");
86-
auto AllowedSuspend = awaitable(
87-
anyOf(typeWithNameIn(AllowedAwaitablesList),
88-
callExpr(callee(functionDecl(hasAnyName(AllowedCallees))))));
91+
auto AllowedSuspend = awaitable(anyOf(typeWithNameIn(AllowedAwaitablesList),
92+
functionWithNameIn(AllowedCallees)));
8993
Finder->addMatcher(
9094
expr(anyOf(coawaitExpr(unless(AllowedSuspend)), coyieldExpr()),
9195
forEachPrevStmt(
@@ -113,9 +117,9 @@ void CoroutineHostileRAIICheck::storeOptions(
113117
ClangTidyOptions::OptionMap &Opts) {
114118
Options.store(Opts, "RAIITypesList",
115119
utils::options::serializeStringList(RAIITypesList));
116-
Options.store(Opts, "SafeAwaitableList",
120+
Options.store(Opts, "AllowedAwaitablesList",
117121
utils::options::serializeStringList(AllowedAwaitablesList));
118-
Options.store(Opts, "SafeCallees",
122+
Options.store(Opts, "AllowedCallees",
119123
utils::options::serializeStringList(AllowedCallees));
120124
}
121125
} // namespace clang::tidy::misc

clang-tools-extra/test/clang-tidy/checkers/misc/coroutine-hostile-raii.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// RUN: -config="{CheckOptions: {\
33
// RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; ::my::other::Mutex', \
44
// RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 'safe::awaitable; ::transformable::awaitable', \
5-
// RUN: misc-coroutine-hostile-raii.AllowedCallees: 'safe::AwaitFunc; ::safe::Obj::AwaitMethod' \
5+
// RUN: misc-coroutine-hostile-raii.AllowedCallees: 'safe::AwaitFunc; ::safe::Obj::AwaitMethod; retExemptedAwaitable' \
66
// RUN: }}"
77

88
namespace std {
@@ -163,7 +163,10 @@ ReturnObject RAIISafeSuspendTest() {
163163
// ================================================================================
164164
// Safe transformable awaitable
165165
// ================================================================================
166-
struct transformable { struct awaitable{}; };
166+
struct transformable {
167+
struct awaitable{};
168+
struct unsafe_awaitable{};
169+
};
167170
using alias_transformable_awaitable = transformable::awaitable;
168171
struct UseTransformAwaitable {
169172
struct promise_type {
@@ -172,13 +175,18 @@ struct UseTransformAwaitable {
172175
std::suspend_always final_suspend() noexcept { return {}; }
173176
void unhandled_exception() {}
174177
std::suspend_always await_transform(transformable::awaitable) { return {}; }
178+
std::suspend_always await_transform(transformable::unsafe_awaitable) {
179+
return {};
180+
}
175181
};
176182
};
177183

178184
auto retAwaitable() { return transformable::awaitable{}; }
185+
auto retExemptedAwaitable() { return transformable::unsafe_awaitable{}; }
179186
UseTransformAwaitable RAIISafeSuspendTest2() {
180187
absl::Mutex a;
181188
co_await retAwaitable();
189+
co_await retExemptedAwaitable();
182190
co_await transformable::awaitable{};
183191
co_await alias_transformable_awaitable{};
184192
}

0 commit comments

Comments
 (0)