https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64626
--- Comment #1 from Ben Longbons <b.r.longbons at gmail dot com> --- Demostration that gcc correctly preprocesses the other tokens: #define JOIN(a, b) a##b JOIN(.., .) // error about pasting . and . #define JOIN3(a, b, c) a##b##c JOIN3(%:%, :, %:) // successfully results in %: %:%: // (though note that the order of evaluation of ## is unspecified so if b##c were evaluated first a compliant implementation could fail to paste :%:)