From 64e0fc7a5ad5f32fc85443d3ad5449ee279330db Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 10 Oct 2024 11:10:51 +0800 Subject: [PATCH] fix(system): rename __VA_NARG__ macro __VA_NARG__ is copied from a forum post and is a pretty common implementation with a high chance of causing naming collision Added ESP_ namespace to avoid this. --- components/esp_common/include/esp_macros.h | 31 ++++--------------- .../test_apps/esp_common/main/CMakeLists.txt | 2 +- .../esp_common/main/test_esp_macro.c | 21 +++++++++++++ .../include/esp_private/esp_regdma.h | 4 +-- .../release-5.x/5.4/system.rst | 5 +++ .../release-5.x/5.4/system.rst | 5 +++ tools/idf_py_actions/hints.yml | 3 ++ 7 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 components/esp_common/test_apps/esp_common/main/test_esp_macro.c diff --git a/components/esp_common/include/esp_macros.h b/components/esp_common/include/esp_macros.h index 183c947a44..0893878e7e 100644 --- a/components/esp_common/include/esp_macros.h +++ b/components/esp_common/include/esp_macros.h @@ -50,15 +50,15 @@ extern "C" { /* Count number of arguments of __VA_ARGS__ * - reference https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s * - __GET_NTH_ARG__() takes args >= N (64) but only expand to Nth one (64th) - * - __RSEQ_N__() is reverse sequential to N to add padding to have Nth + * - ESP_RSEQ_N() is reverse sequential to N to add padding to have Nth * position is the same as the number of arguments * - ##__VA_ARGS__ is used to deal with 0 parameter (swallows comma) */ -#ifndef __VA_NARG__ -# define __VA_NARG__(...) __NARG__(_0, ##__VA_ARGS__, __RSEQ_N__()) +#ifndef ESP_VA_NARG +# define ESP_VA_NARG(...) ESP_NARG(_0, ##__VA_ARGS__, ESP_RSEQ_N()) -# define __NARG__(...) __GET_NTH_ARG__(__VA_ARGS__) -# define __GET_NTH_ARG__( \ +# define ESP_NARG(...) ESP_GET_NTH_ARG(__VA_ARGS__) +# define ESP_GET_NTH_ARG( \ _01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \ _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \ _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \ @@ -66,7 +66,7 @@ extern "C" { _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \ _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ _61,_62,_63,N,...) N -# define __RSEQ_N__() \ +# define ESP_RSEQ_N() \ 62,61,60, \ 59,58,57,56,55,54,53,52,51,50, \ 49,48,47,46,45,44,43,42,41,40, \ @@ -80,25 +80,6 @@ extern "C" { #define ESP_UNUSED(x) ((void)(x)) #endif -/* test macros */ -#define foo_args(...) 1 -#define foo_no_args() 2 -#if defined(__cplusplus) && (__cplusplus > 201703L) -#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args __VA_OPT__(,) __VA_ARGS__)(__VA_ARGS__) -#else -#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args, ##__VA_ARGS__)(__VA_ARGS__) -#endif - -ESP_STATIC_ASSERT(foo() == 2, "CHOOSE_MACRO_VA_ARG() result does not match for 0 arguments"); -ESP_STATIC_ASSERT(foo(42) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for 1 argument"); -#if defined(__cplusplus) && (__cplusplus > 201703L) -ESP_STATIC_ASSERT(foo(42, 87) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for n arguments"); -#endif - -#undef foo -#undef foo_args -#undef foo_no_args - #define ESP_INFINITE_LOOP() \ do { \ ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-infinite-loop") \ diff --git a/components/esp_common/test_apps/esp_common/main/CMakeLists.txt b/components/esp_common/test_apps/esp_common/main/CMakeLists.txt index d1e953e638..f45ce0708c 100644 --- a/components/esp_common/test_apps/esp_common/main/CMakeLists.txt +++ b/components/esp_common/test_apps/esp_common/main/CMakeLists.txt @@ -1,4 +1,4 @@ -idf_component_register(SRCS "test_app_main.c" "test_attr.c" +idf_component_register(SRCS "test_app_main.c" "test_attr.c" "test_esp_macro.c" INCLUDE_DIRS "." PRIV_REQUIRES unity esp_mm esp_psram WHOLE_ARCHIVE) diff --git a/components/esp_common/test_apps/esp_common/main/test_esp_macro.c b/components/esp_common/test_apps/esp_common/main/test_esp_macro.c new file mode 100644 index 0000000000..334fa98067 --- /dev/null +++ b/components/esp_common/test_apps/esp_common/main/test_esp_macro.c @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +#include "esp_macros.h" + +/* test macros */ +#define foo_args(...) 1 +#define foo_no_args() 2 +#if defined(__cplusplus) && (__cplusplus > 201703L) +#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args __VA_OPT__(,) __VA_ARGS__)(__VA_ARGS__) +#else +#define foo(...) CHOOSE_MACRO_VA_ARG(foo_args, foo_no_args, ##__VA_ARGS__)(__VA_ARGS__) +#endif + +ESP_STATIC_ASSERT(foo() == 2, "CHOOSE_MACRO_VA_ARG() result does not match for 0 arguments"); +ESP_STATIC_ASSERT(foo(42) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for 1 argument"); +#if defined(__cplusplus) && (__cplusplus > 201703L) +ESP_STATIC_ASSERT(foo(42, 87) == 1, "CHOOSE_MACRO_VA_ARG() result does not match for n arguments"); +#endif diff --git a/components/esp_hw_support/include/esp_private/esp_regdma.h b/components/esp_hw_support/include/esp_private/esp_regdma.h index 9e904997f7..1a082408fd 100644 --- a/components/esp_hw_support/include/esp_private/esp_regdma.h +++ b/components/esp_hw_support/include/esp_private/esp_regdma.h @@ -396,9 +396,9 @@ void *regdma_find_prev_module_link_tail(void *link, void *tail, int entry, uint3 */ void *regdma_find_next_module_link_head(void *link, void *tail, int entry, uint32_t module); -#define regdma_link_init_safe(pcfg, branch, module, ...) regdma_link_init((pcfg), (branch), (module), __VA_NARG__(__VA_ARGS__), ##__VA_ARGS__) +#define regdma_link_init_safe(pcfg, branch, module, ...) regdma_link_init((pcfg), (branch), (module), ESP_VA_NARG(__VA_ARGS__), ##__VA_ARGS__) -#define regdma_link_update_next_safe(link, ...) regdma_link_update_next((link), __VA_NARG__(__VA_ARGS__), ##__VA_ARGS__) +#define regdma_link_update_next_safe(link, ...) regdma_link_update_next((link), ESP_VA_NARG(__VA_ARGS__), ##__VA_ARGS__) #endif // SOC_PAU_SUPPORTED diff --git a/docs/en/migration-guides/release-5.x/5.4/system.rst b/docs/en/migration-guides/release-5.x/5.4/system.rst index e6e0ede015..cddbd0a6bb 100644 --- a/docs/en/migration-guides/release-5.x/5.4/system.rst +++ b/docs/en/migration-guides/release-5.x/5.4/system.rst @@ -3,6 +3,11 @@ System :link_to_translation:`zh_CN:[中文]` +ESP-Common +---------- + +``__VA_NARG__`` and its related macros have been re-named to avoid naming collisions, use the new name with ``ESP`` pre-fix, e.g. ``ESP_VA_NARG`` instead. + Log --- diff --git a/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst b/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst index dbe6984ddd..bb748fef11 100644 --- a/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst +++ b/docs/zh_CN/migration-guides/release-5.x/5.4/system.rst @@ -3,6 +3,11 @@ :link_to_translation:`en:[English]` +ESP-Common +---------- + +``__VA_NARG__`` 及其相关宏已被重新命名以避免命名冲突,请使用带有 ESP 前缀的新名称,例如 ``ESP_VA_NARG``。 + 日志 ------ diff --git a/tools/idf_py_actions/hints.yml b/tools/idf_py_actions/hints.yml index 68181be041..20ff00e2c0 100644 --- a/tools/idf_py_actions/hints.yml +++ b/tools/idf_py_actions/hints.yml @@ -447,3 +447,6 @@ - re: "(error: Total discarded sections size is \\d+ bytes)|(region [`'.\\w]+ overflowed by \\d+ bytes)" hint: "The binary size has exceeded the limit. To resolve the issue consider reducing the binary size.\nYou can explore size optimization techniques in the documentation by running 'idf.py docs -sp api-guides/performance/size.html#reducing-overall-size'.\nNote that the linker performed the dead code elimination." + + re: "implicit declaration of function '__VA_NARG__'" + hint: "__VA_NARG_ has been renamed. Please use ESP_VA_NARG instead"