Skip to content

## with empty macro argument is wrong. #91

@mrolle45

Description

@mrolle45

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions