From cf8b198dacfec9bfd583f641e41a882a263916e2 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sun, 23 May 2021 00:53:54 +0200 Subject: [PATCH] Fix issue in M_LET: if the INIT/INIT_SET/INIT_WITH uses the macro M_IF, it may be not expanded in some cases (since the M_CALL_* is used itself within an expanded tainted M_IF). Fix this by calling M_CALL_* outside the expanded M_IF. --- m-core.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/m-core.h b/m-core.h index f043a854..f924baeb 100644 --- a/m-core.h +++ b/m-core.h @@ -3400,16 +3400,15 @@ m_core_parse2_enum (const char str[], const char **endptr) for(;cont;cont = false) // 5. Dispatch the right LET in function of having or not arguments #define M_LETI_SINGLE(data, name) \ - M_IF(M_PARENTHESIS_P(name))( \ - M_LETI_SINGLE2_SET(M_PAIR_1 data, M_PAIR_2 data, M_RET_ARG1 name, M_SKIPI_1 name), \ - M_LETI_SINGLE2(M_PAIR_1 data, M_PAIR_2 data, name)) + M_IF(M_PARENTHESIS_P(name))(M_LETI_SINGLE2_SET,M_LETI_SINGLE2) \ + (M_PAIR_1 data, M_PAIR_2 data, name, M_RET_ARG1 name, M_SKIPI_1 name) // 6a. Define without argument ==> use the INIT operator -#define M_LETI_SINGLE2(cont, oplist, name) \ +#define M_LETI_SINGLE2(cont, oplist, name, ...) \ for(M_GET_TYPE oplist name; \ cont && (M_CALL_INIT(oplist, name), true); \ (M_CALL_CLEAR(oplist, name), cont = false)) // 6b. Define with arguments ==> use the INIT_SET or INIT_WITH operator (if defined). -#define M_LETI_SINGLE2_SET(cont, oplist, name, ...) \ +#define M_LETI_SINGLE2_SET(cont, oplist, params, name, ...) \ for(M_GET_TYPE oplist name; \ cont && (M_LETI_SINGLE2_INIT(oplist, name, __VA_ARGS__), true); \ (M_CALL_CLEAR(oplist, name), cont = false))