<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/116720>116720</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Incorrect paste of placeholder with '##'.
        </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>
    If a macro definition contains `x ## ##` and `x` is a parameter and the macro is called with an empty argument, then clang ignores the `x ##` when expanding the macro, leaving just `##`.  It then tries to paste `##` after the preceding token!
To avoid confusion, let **paste** be a ## token in an odd numbered position in a sequence of ## tokens, and let **hashhash** be a ## token in an even numbered position in a sequence of ## tokens.
In most cases, clang treats **hashhash** as an ordinary token, not as a paste operator.
But if `x` is a parameter for an empty argument, `foo x ## bar foo x ## ## bar foo x ## ## ## bar ` is expanded to `foo bar foo ## bar foo ## ## bar`.  clang interprets this as `foo bar foo `**paste**` bar foo `**hashhash**` bar`.  The result output is `foo bar foobar foo ## bar`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVE2PozoQ_DXm0toIDIFw4JDdVaTc9w80uAHvMzbPbjI7__7JQOYr8zTaQwRyd1dVVwpjCHqwRI04fhfHnwkuPDrfTN4ZQ8UxaZ16bq49IEzYeQeKem01a2ehc5ZR2wCiTP-AkLmQ-f4QZQpo1VqJ7zoAwoweJ2Lya4lH2iF1gA6NIQVPmkdACzTN_Azoh2Uiy0L-iN0WOoN2AD1Y5ymsAG-YI81T7KI_M1ql7fBKEREM4S0e_l4Cx7mXqQPAlTcC9joCO5gxML3rAuyj8gg5e-poI3D_kBUyE-lPkZ5_OcCb0yoa0y9BO7vxMgh5FvK8gm6v0BLg3bIVBbSNmzulwC5TS54UzC5sTscaBPp3IdsRuP7dZIgs0dFXphHDGH9fkNGN7F-zHbZlrxYmFxg6DLQq2P4c9oQcPpeBYd3QK23RP9_N-wHW8VrbXXczeWTnd6LvC4Pu_y9JvfOfB0aUae8cvOSyxdj85uCL8zflnXbLFamYjx39PvwB6wFiS9keX8vkZ08cExy3CQ9oMXYfAhM1PNTf-7u3bFy_RgJPYTEMbuE5eviR51F8HE1Uk6s6rzGhJqvyrK7qvDwmY5OnbXtseyxOaVmorlBVXedpVlVl32NdpYluZCqLLMvqNJOyOB5KUlSqU5Fl8kTdCUWR0oTaHIy5TQfnh0SHsFCTZWUl08RgSyas95CUlp5grQop47Xkmzj0rV2GIIrU6MDhFYY1G2qutnPeU8f3HPUwG-xodEaR3-4WIav9i5bVIVm8aUbmOYj8LORFyMugeVzaQ-cmIS8Rf398m737TR0LeVlVBSEvu-xbI_8LAAD__7DWorY">