https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104147
Bug ID: 104147 Summary: C preprocessor may remove the standard required whitespace between the preprocessing tokens Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: pavel.morozkin at gmail dot com Target Milestone: --- Sample code: #define X(x,y) x y #define STR_(x) #x #define STR(x) STR_(x) STR(X(Y,Y)) Invocations: $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P "Y Y" $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "YY" Also 1: Somehow gcc takes into account the whitespace between `,` and `Y`: $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" -D"Z=STR(X(Y,Y))" "YY" $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" -D"Z=STR(X(Y, Y))" "Y Y" Also 2: This: STR(X(Y, Y)) leads to: $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "Y Y" However, this: STR(X(Y ,Y)) leads to: $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "YY" The whitespace is required by the standard.