<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113270>113270</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Other differences with GCC involving consecutive ## tokens. See #113236.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mrolle45
</td>
</tr>
</table>
<pre>
When defining NDEBUG in a Debug build of clang, I found some important differences with GCC.
Input
``` c
#define FOO(a,b,c) ;b########c,b##########c,a########a,a##########a,\
b##a##a##a##c,b##a##a##a##a##c,a##a##a##a##a,a##a##a##a##a##a
FOO(,y,z)
FOO(x,y,z)
```
clang -E produces
``` c
;y####z,y####z,##,##, yz,yz,,
;y####z,y####z,x####x,x####x, yxxxz,yxxxxz,xxxxx,xxxxxx
```
gcc -E produces
``` c
;yz,yz,,, yz,yz,,
;yz,yz,xx,xx, yxxxz,yxxxxz,xxxxx,xxxxxx
```
It is apparent (without reading the actual GCC source code) that when it sees `####`, this is treated exactly the same as `##a##` with `a` being an empty parameter.
On the other hand, clang treats the second `##` as an ordinary token.
### Suggestion
When a parameter is empty, it would be simpler (and less error-prone) to make an actual placeholder token and follow the rules in the C standard for pasting. Likewise, consecutive `##` tokens should be separated by a placeholder. The only special cases you need are for the actual pasting of two tokens and the removal of placeholders later. A placeholder only remains after pasting in a case like `a##a` or `a##a##a`.
Similarly, use a placeholder for `__VA_OPT__( tokens... )` when `__VA_ARGS__` is empty.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVU2P4zYM_TXKhdjAkfN58GE2s1ksUHSKzrY9BrTNxOrIkiHJSby_vqDsfGEy7aJAENmkRL73SFrovdobokzMPovZ8wjbUFmX1c5qTdPZKLdll_1VkYGSdsoos4dfn798_uMrKAMIz5S3e8hbpUuwOyg0mr2Qa_gGO9uaErytCVTdWBfQBCjVbkeOTEEejipU8HW9HovkWSRP_f8307QBBss86X9QDAaZRhAEm5cXIZco5DoXcl0IuQKRfs6FTB_-in7jY-d1C37kxH9zXreI2boHCvnF-H65AfPQj-8AfbT8l79fIqJeMCHXnZDrH0Kubs2nd_aL9Le1icWFT1-gcbZsC_IflIlL0d1q86OPf284v1wfoIsbe-eg5E-FOt0aTo8M0J1Op3j2NDzwejqvp4es90XxE2wZ4R3uj4lcrEPm_wtsGJUAygM2DToyAYRc8kTZNoAjLHlQQ0WARWhR85yBt60rCApbEg9MqDDAkSdbBfBEHjjBbVfz6xpCpTxnCo4wUAl0wiLoLkb3WBPgzUm8HO3nW8wT5JecGBAaoLoJHTTosKZA7m74X0wMakNFDio0Jafvuy4m931OKqwpb8DOE4aABqwrlUHXQbBvZO5CX0jBa7vfkw_Kmt4Tv214RcRUI0hOrgIcbatLyAm8qhtNjoVGU4Im74Gcs-5T46zpJbVQ4xsxlkH3RmNBldUluR4V8Nmd1doeIxvXavL8LeWXNfiApkTHWxw06IMy-zHAL-qNjspTFMQaT0Ub1IHuRYjxPfjqgpiYFdcs75jiFcsY4DsrbXQHvqFCoYYCPXnobAuGqAR0FEHcNNGAhz_04WjP-ZhQZEK1PaBm700mDxpDTPh0J0ZM7ahGxSF2LPw5fLxYGA1o9UZ9Cw3NNU_AujvLxXFX7ldVK41OxyK2nu7ZR15inmy3fz5tX377vt0KuRzojMdj4M8gNzB3xnnb0-9fX7dbNp_7Y0g4KrO0XKUrHFE2WcjVbLFKlumoyiYF4jxNJjlO57vlbDVPp2U6S-S0nObpLtmNVCYTOZ0kUibzdJmkY6JFucgnOa5WabpYLsQ0YYH0WOtDPbZuP1Let5RNJqlcJCONOWkfL24pDR0heoWUfI-7jA99ytu9F9NEKx_8NUxQQVP2Eufs0ZUMyhysPnAx7rqtn6BBKIBXijaGk87Ho9bprAqh8SJ9EnIj5GavQtXm48LWQm44-7DwxPxNRRByEzF7ITcDqUMm_wkAAP__IQF-Bw">