https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120978
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The way I read the standard is the following: during phase 4: Preprocessing directives are executed, And it is invalid for `#` or the `##` operator to be outside of `the replacement list of a function-like macro,` as far as I can tell during phase 4. Because otherwise it would mean: ``` [[ignored( #)]]int main(){} ``` Would be invalid C while: ``` [[ignored(#)]]int main(){} ``` Would be valid. That is white space of a return would matter which I am not sure is the expected behavior at all.