1
1
// RUN: %check_clang_tidy -std=c++20 %s misc-coroutine-hostile-raii %t \
2
2
// RUN: -config="{CheckOptions: {\
3
3
// RUN: misc-coroutine-hostile-raii.RAIITypesList: 'my::Mutex; ::my::other::Mutex', \
4
- // RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 'safe::awaitable; ::my::other ::awaitable' \
4
+ // RUN: misc-coroutine-hostile-raii.AllowedAwaitablesList: 'safe::awaitable; ::transformable ::awaitable' \
5
5
// RUN: }}"
6
6
7
7
namespace std {
@@ -136,6 +136,9 @@ ReturnObject scopedLockableTest() {
136
136
absl::Mutex no_warning_5;
137
137
}
138
138
139
+ // ================================================================================
140
+ // Safe awaitable
141
+ // ================================================================================
139
142
namespace safe {
140
143
struct awaitable {
141
144
bool await_ready () noexcept { return false ; }
@@ -150,6 +153,32 @@ ReturnObject RAIISafeSuspendTest() {
150
153
co_await other{};
151
154
}
152
155
156
+ // ================================================================================
157
+ // Safe transformable awaitable
158
+ // ================================================================================
159
+ struct transformable { struct awaitable {}; };
160
+ using alias_transformable_awaitable = transformable::awaitable;
161
+ struct UseTransformAwaitable {
162
+ struct promise_type {
163
+ UseTransformAwaitable get_return_object () { return {}; }
164
+ std::suspend_always initial_suspend () { return {}; }
165
+ std::suspend_always final_suspend () noexcept { return {}; }
166
+ void unhandled_exception () {}
167
+ std::suspend_always await_transform (transformable::awaitable) { return {}; }
168
+ };
169
+ };
170
+
171
+ auto retAwaitable () { return transformable::awaitable{}; }
172
+ UseTransformAwaitable RAIISafeSuspendTest2 () {
173
+ absl::Mutex a;
174
+ co_await retAwaitable ();
175
+ co_await transformable::awaitable{};
176
+ co_await alias_transformable_awaitable{};
177
+ }
178
+
179
+ // ================================================================================
180
+ // Lambdas
181
+ // ================================================================================
153
182
void lambda () {
154
183
absl::Mutex no_warning;
155
184
auto lambda = []() -> ReturnObject {
@@ -164,6 +193,9 @@ void lambda() {
164
193
absl::Mutex no_warning_2;
165
194
}
166
195
196
+ // ================================================================================
197
+ // Denylisted RAII
198
+ // ================================================================================
167
199
template <class T >
168
200
ReturnObject raii_in_template (){
169
201
T a;
0 commit comments