70#define ATTR_UNUSED __attribute__((__unused__))
74#define _DEFER_CONCAT_IMPL(a, b) a##b
75#define _DEFER_CONCAT(a, b) _DEFER_CONCAT_IMPL(a, b)
91 Deferrer(F&& func) : f(std::forward<F>(func)) {}
93 Deferrer(
const Deferrer&) =
delete;
94 Deferrer& operator=(
const Deferrer&) =
delete;
103Deferrer<F> operator+(DeferHelper, F&& f) {
104 return Deferrer<F>(std::forward<F>(f));
109#define defer auto _DEFER_CONCAT(__defer_var_, __COUNTER__) = DeferHelper() + [&]()
117#elif defined(__GNUC__) && !defined(__clang__)
136#define __DEFER(N) __DEFER_(N)
137#define __DEFER_(N) __DEFER__(_DEFER_CONCAT(__defer_fn_, N), _DEFER_CONCAT(__defer_var_, N))
149#define __DEFER__(F, V) \
151 [[gnu::cleanup(F)]] ATTR_UNUSED int V; \
152 auto void F(int* _unused ATTR_UNUSED)
162#define defer __DEFER(__COUNTER__)
170#elif defined(__clang__)
197typedef void (^defer_block)(void);
203static inline void __defer_cleanup(defer_block* ptr) {
210#define _DEFER_CONCAT_IMPL(a, b) a##b
211#define _DEFER_CONCAT(a, b) _DEFER_CONCAT_IMPL(a, b)
224 __attribute__((cleanup(__defer_cleanup))) ATTR_UNUSED defer_block _DEFER_CONCAT(__defer_var_, __COUNTER__) = ^
232#elif defined(_MSC_VER)
268#elif defined(_MSC_VER)
277#error "Unsupported compiler"