pcpp icon indicating copy to clipboard operation
pcpp copied to clipboard

## with empty macro argument is wrong.

Open mrolle45 opened this issue 2 years ago • 1 comments

C99 Standard 6.10.3.3 (the ## operator) says that the name of an empty argument should be replaced with a placeholder, before performing the operator. Concatenating a placeholder with another token (possibly another placeholder) results in the other token. Placeholders are discarded after all ## operators have been performed.

The code in preprocessor.py simply removes the empty argument's name from the replacement text, causing the next or previous token to be used instead of a placeholder.

Examples:

#define greet(x, y) Hello x ## y
greet(Abe, Lincoln)            -> Hello, AbeLincoln
greet(Abe, )                   -> Error: ## at the end of the replacement text, not Hello Abe
greet(, Lincoln)               -> HelloLincoln, not Hello Lincoln

The fix is to simply follow the Standard strictly, and make a temporary token whose value is an empty string and which has a different type which would allow it to be later removed from the results.

mrolle45 avatar Jan 17 '24 07:01 mrolle45

Thanks for the BR

ned14 avatar Jan 17 '24 18:01 ned14