- From ea8e7f07321bf7e624086f5b57f0a8d91eadb062 Mon Sep 17 00:00:00 2001
- From: Thorsten Scherer <t.scherer@eckelmann.de>
- Date: Mon, 4 Nov 2019 17:06:59 +0100
- Subject: [PATCH] corelib: fix FTBS with GCC9
- issue: ptxdist-2018.11 refused to build reporting lots of errors like
- this one.
- qfiledialog.cpp:3158:27: error: 'class Ui_QFileDialog' has no
- member named 'treeView'
- solution: a patch of debians qt-kde-team
- url: https://salsa.debian.org/qt-kde-team/qt/qt4-x11/blob/0d4a3dd61ccb156dee556c214dbe91c04d44a717/debian/patches/gcc9-qforeach.patch
- From c35a3f519007af44c3b364b9af86f6a336f6411b Mon Sep 17 00:00:00 2001
- From: Thiago Macieira <thiago.macieira@intel.com>
- Date: Tue, 11 Feb 2014 16:17:46 -0800
- Subject: [PATCH] Redo the Q_FOREACH loop control without GCC statement
- expressions
- It's possible to do without them, which probably makes the number of
- supported compilers a lot bigger: they just need to support decltype()
- or __typeof__.
- That includes the Intel compiler. The old code was also apparently
- working, but no one had realized the old workaround for some old version
- was still in place.
- The loop overhead is more or less the same. I have not done benchmarks,
- but inspection of the generated assembly shows more or less the same
- number of instructions.
- Change-Id: I32d499c84a6ddd19d994b49f17a469acb5c3a3f1
- Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
- Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
- Backported to Qt 4
- ---
- src/corelib/global/qglobal.h | 20 +++++++++++++++-----
- 1 file changed, 15 insertions(+), 5 deletions(-)
- diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
- index 20d88328cbcd..34ba4c2d99f3 100644
- --- a/src/corelib/global/qglobal.h
- +++ b/src/corelib/global/qglobal.h
- @@ -2482,22 +2482,32 @@ typedef uint Flags;
- #endif /* Q_NO_TYPESAFE_FLAGS */
- -#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_RVCT)
- +#if (defined(Q_CC_GNU) && !defined(Q_CC_RVCT))
- /* make use of typeof-extension */
- template <typename T>
- class QForeachContainer {
- public:
- - inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { }
- + inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { }
- const T c;
- int brk;
- typename T::const_iterator i, e;
- + int control;
- };
- +// Explanation of the control word:
- +// - it's initialized to 1
- +// - that means both the inner and outer loops start
- +// - if there were no breaks, at the end of the inner loop, it's set to 0, which
- +// causes it to exit (the inner loop is run exactly once)
- +// - at the end of the outer loop, it's inverted, so it becomes 1 again, allowing
- +// the outer loop to continue executing
- +// - if there was a break inside the inner loop, it will exit with control still
- +// set to 1; in that case, the outer loop will invert it to 0 and will exit too
- #define Q_FOREACH(variable, container) \
- for (QForeachContainer<__typeof__(container)> _container_(container); \
- - !_container_.brk && _container_.i != _container_.e; \
- - __extension__ ({ ++_container_.brk; ++_container_.i; })) \
- - for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
- + _container_.control && _container_.i != _container_.e; \
- + ++_container_.i, _container_.control ^= 1) \
- + for (variable = *_container_.i; _container_.control; _container_.control = 0)
- #else
- --
- 2.23.0
corelib: fix FTBS with GCC9
Posted by Anonymous on Thu 10th Sep 2020 07:49
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.