https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118147
Bug ID: 118147 Summary: #pragma GCC diagnostic push causes errors when used in IILE in struct member initializer Product: gcc Version: 4.7.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: llvm at rifkin dot dev Target Milestone: --- This errors: struct F { int f = [] { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wparentheses" return 1; #pragma GCC diagnostic pop } (); }; <source>:3:36: error: file ends in default argument 3 | #pragma GCC diagnostic push | ^ <source>:3:32: error: expected ';' at end of member declaration 3 | #pragma GCC diagnostic push | ^~~~ | ; <source>:3:36: error: expected '}' before end of line 3 | #pragma GCC diagnostic push | ^ <source>:1:10: note: to match this '{' 1 | struct F { | ^ <source>:3:36: error: expected unqualified-id before end of line 3 | #pragma GCC diagnostic push | ^ <source>:5:9: error: expected unqualified-id before 'return' 5 | return 1; | ^~~~~~ <source>:7:5: error: expected declaration before '}' token 7 | } (); | ^ <source>:7:8: error: expected unqualified-id before ')' token 7 | } (); | ^ <source>:8:1: error: expected declaration before '}' token 8 | }; | ^ Compiler returned: 1 Naturally, this does not: int f() { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wparentheses" return 1; #pragma GCC diagnostic pop } This seems to date back to the dawn of C++11 support in gcc, 4.7.1: https://godbolt.org/z/cEqjzsddM. This is causing a problem with a library I maintain, libassert, where a user has run into this bug with the following code struct F{ int f = [&]{ int b = 3; ASSERT(b != b); return b; }(); }; due to ASSERT's expansion including _Pragma("GCC diagnostic push").