Metalang99 1.13.3
Full-blown preprocessor metaprogramming
stmt.h
Go to the documentation of this file.
1
33#ifndef ML99_STMT_H
34#define ML99_STMT_H
35
36#include <metalang99/util.h>
37
57#define ML99_INTRODUCE_VAR_TO_STMT(...) ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(__VA_ARGS__)
58
84#define ML99_INTRODUCE_NON_NULL_PTR_TO_STMT(ty, name, init) \
85 ML99_PRIV_SHADOWS(for (ty *name = (init); name != 0; name = 0))
86
106#define ML99_CHAIN_EXPR_STMT(expr) \
107 ML99_PRIV_SHADOWS(for (int ml99_priv_expr_stmt_break = ((expr), 0); \
108 ml99_priv_expr_stmt_break != 1; \
109 ml99_priv_expr_stmt_break = 1))
110
114#define ML99_CHAIN_EXPR_STMT_AFTER(expr) \
115 ML99_PRIV_SHADOWS(for (int ml99_priv_expr_stmt_after_break = 0; \
116 ml99_priv_expr_stmt_after_break != 1; \
117 ((expr), ml99_priv_expr_stmt_after_break = 1)))
118
140#define ML99_SUPPRESS_UNUSED_BEFORE_STMT(expr) ML99_CHAIN_EXPR_STMT((void)expr)
141
142#ifndef DOXYGEN_IGNORE
143
144// See <https://github.com/Hirrolot/metalang99/issues/25>.
145#ifdef __cplusplus
146#define ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(...) \
147 ML99_PRIV_SHADOWS(for (__VA_ARGS__, \
148 *ml99_priv_break_arr[] = {0, 0}, \
149 **ml99_priv_break = &ml99_priv_break_arr[0]; \
150 ml99_priv_break == &ml99_priv_break_arr[0]; \
151 ml99_priv_break++))
152#else
153#define ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(...) \
154 ML99_PRIV_SHADOWS(for (__VA_ARGS__, *ml99_priv_break = (void *)0; \
155 ml99_priv_break != (void *)1; \
156 ml99_priv_break = (void *)1))
157#endif
158
159#define ML99_PRIV_SHADOWS(...) \
160 ML99_CLANG_PRAGMA("clang diagnostic push") \
161 ML99_CLANG_PRAGMA("clang diagnostic ignored \"-Wshadow\"") \
162 __VA_ARGS__ \
163 ML99_CLANG_PRAGMA("clang diagnostic pop")
164
165#endif // DOXYGEN_IGNORE
166
167#endif // ML99_STMT_H
Utilitary stuff.