https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90617
Bug ID: 90617 Summary: GCC 9 miscompiles Qt4 "foreach" macro Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bastian.beisc...@rwth-aachen.de Target Milestone: --- Created attachment 46410 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46410&action=edit preprocessed qt4.C source. The following piece of code, which uses Qt 4.8.7: #include <QList> #include <iostream> int main(int argc, char** argv) { QList<int> list; list.append(1); list.append(2); list.append(3); foreach(int x, list) { std::cout << x << std::endl; } return 0; } Compiled with gcc 9.1.0 like this: $ g++ -I/usr/include/qt4 -I/usr/include/qt4/QtCore -lQtCore -o qt4 qt4.C does not execute the "foreach" loop correctly. $ ./qt4 1 Only the first list element is printed. This is a regression with respect to GCC 8.3.0: $ g++-8 -I/usr/include/qt4 -I/usr/include/qt4/QtCore -lQtCore -o qt4 qt4.C $ ./qt4 1 2 3 The preprocessed sources of qt4.C are attached as 'qt4.i'. I managed to construct a reproducer (based on the Qt foreach macro) which is short and does not use Qt: #include <iostream> #include <vector> template <typename T> class ForeachContainer { public: inline ForeachContainer(const T& t) : c(t) , brk(0) , i(c.begin()) , e(c.end()) { } const T c; int brk; typename T::const_iterator i, e; }; int main() { std::vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); for (ForeachContainer<std::vector<int>> _container_(v); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) { for (int x = *_container_.i; ; __extension__ ({--_container_.brk; break;})) { std::cout << "x = " << x << std::endl; } } return 0; } $ g++ -g -o mini9 mini.C $ ./mini9 x = 0 $ g++-8 -g -o mini8 mini.C $ ./mini8 x = 0 x = 1 x = 2 Admittedly, the code is ugly, but that's what is in Qt 4.8.7.