ned14 / pcpp

A C99 preprocessor written in pure Python
Other
215 stars 39 forks source link

## with empty macro argument is wrong. #91

Open mrolle45 opened 8 months ago

mrolle45 commented 8 months ago

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.

ned14 commented 8 months ago

Thanks for the BR