The dump_macro() function fails to correctly output the definitions of macros that contain the string operator '#', the concatenation operator '##' and any macro parameter in the definition token list. For example, the following macros: #define STRING(x) #x #define CONCAT(x,y) x ## y are output like so: #define STRING(x) unhandled token type '21' #define CONCAT(x, y) unhandled token type '22' unhandled token type '23' unhandled token type '22' Add the code necessary to handle those token types to the dump_macros() function and add the above macros to the 'dump-macros.c' test file. Signed-off-by: Ramsay Jones <ramsay@xxxxxxxxxxxxxxxxxxxx> --- pre-process.c | 7 +++++++ validation/preprocessor/dump-macros.c | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/pre-process.c b/pre-process.c index 8abd5e6..eca7ab5 100644 --- a/pre-process.c +++ b/pre-process.c @@ -2196,6 +2196,13 @@ static void dump_macro(struct symbol *sym) switch (token_type(token)) { case TOKEN_UNTAINT: break; + case TOKEN_STR_ARGUMENT: + printf("#%s", show_token(args[token->argnum])); + break; + case TOKEN_CONCAT: + printf("## "); + break; + case TOKEN_QUOTED_ARGUMENT: case TOKEN_MACRO_ARGUMENT: token = args[token->argnum]; /* fall-through */ diff --git a/validation/preprocessor/dump-macros.c b/validation/preprocessor/dump-macros.c index 4dbb962..5a96464 100644 --- a/validation/preprocessor/dump-macros.c +++ b/validation/preprocessor/dump-macros.c @@ -6,6 +6,9 @@ #define DEF xyz #define NYDEF ydef + +#define STRING(x) #x +#define CONCAT(x,y) x ## y /* * check-name: dump-macros * check-command: sparse -E -dD -DIJK=ijk -UNDEF -UNYDEF $file @@ -15,4 +18,6 @@ check-output-pattern(1): #define __CHECKER__ 1 check-output-contains: #define IJK ijk check-output-contains: #define DEF xyz check-output-contains: #define NYDEF ydef +check-output-contains: #define STRING(x) #x +check-output-contains: #define CONCAT(x, y) x ## y */ -- 2.19.0