https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61856
Bug ID: 61856 Summary: Ternary operator in an NSDMI causes double evaluation Product: gcc Version: 4.10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ville.voutilainen at gmail dot com First test: #include <iostream> #ifdef OK struct ostream { } cout; bool operator<<(ostream&, const char* s) { __builtin_printf("%s", s); return true; } #else using std::cout; #endif struct X { int a = (cout<<"hmm\n") ? 1 : 2;}; int main() { X x; } With -DOK, this prints "hmm" once, otherwise it prints "hmm" twice. This suggested that perhaps the problem is specific to iostream, but wrapping the NSDMI into a lambda fixes the double evaluation: #include <iostream> #ifdef OK struct ostream { } cout; bool operator<<(ostream&, const char* s) { __builtin_printf("%s", s); return true; } #else using std::cout; #endif struct X { int a = ([]{return bool(cout<<"hmm\n");}()) ? 1 : 2;}; int main() { X x; } Simpler cases like just incrementing a global variable in the ternary operator seem to work fine: #include <iostream> int global_x = 0; struct X { int a = (global_x++) ? 1 : 2;}; int main() { X x; std::cout << global_x << std::endl; } Perhaps this is some weird gimplification bug.