From 9feb20e58128ae7e8d208847ce989b65cdfcf5bc Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 4 Nov 2019 16:37:11 +0100 Subject: [PATCH 1/6] Remove convert_ARGB_PM_to_ARGB It was only used by conversions to indexed8 and mono, and is slower than the generic conversion which is optimized. Change-Id: I0480c5a1b5fa2de7e3c87fd621064dace46e5945 Reviewed-by: Eirik Aavitsland --- src/gui/image/qimage_conversions.cpp | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index 7cd71644a3..8f33a13b95 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -851,30 +851,6 @@ static bool convert_A2RGB30_PM_to_ARGB_inplace(QImageData *data, Qt::ImageConver return true; } -static void convert_ARGB_PM_to_ARGB(QImageData *dest, const QImageData *src) -{ - Q_ASSERT(src->format == QImage::Format_ARGB32_Premultiplied || src->format == QImage::Format_RGBA8888_Premultiplied); - Q_ASSERT(dest->format == QImage::Format_ARGB32 || dest->format == QImage::Format_RGBA8888); - Q_ASSERT(src->width == dest->width); - Q_ASSERT(src->height == dest->height); - - const int src_pad = (src->bytes_per_line >> 2) - src->width; - const int dest_pad = (dest->bytes_per_line >> 2) - dest->width; - const QRgb *src_data = (QRgb *) src->data; - QRgb *dest_data = (QRgb *) dest->data; - - for (int i = 0; i < src->height; ++i) { - const QRgb *end = src_data + src->width; - while (src_data < end) { - *dest_data = qUnpremultiply(*src_data); - ++src_data; - ++dest_data; - } - src_data += src_pad; - dest_data += dest_pad; - } -} - static void convert_RGBA_to_RGB(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags) { Q_ASSERT(src->format == QImage::Format_RGBA8888 || src->format == QImage::Format_RGBX8888); @@ -1541,7 +1517,7 @@ static void convert_X_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageC static void convert_ARGB_PM_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags) { QScopedPointer tmp(QImageData::create(QSize(src->width, src->height), QImage::Format_ARGB32)); - convert_ARGB_PM_to_ARGB(tmp.data(), src); + convert_generic(tmp.data(), src, Qt::AutoColor); dither_to_Mono(dst, tmp.data(), flags, false); } @@ -1821,7 +1797,7 @@ static void convert_RGB_to_Indexed8(QImageData *dst, const QImageData *src, Qt:: static void convert_ARGB_PM_to_Indexed8(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags) { QScopedPointer tmp(QImageData::create(QSize(src->width, src->height), QImage::Format_ARGB32)); - convert_ARGB_PM_to_ARGB(tmp.data(), src); + convert_generic(tmp.data(), src, Qt::AutoColor); convert_RGB_to_Indexed8(dst, tmp.data(), flags); } From 00c869a5c605d7f82146c5a1d3f4f80ca706ca16 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 26 Nov 2019 15:09:58 +0100 Subject: [PATCH 2/6] Fix lancelot PaintCommands for reuse Some structures needed to be cleaned for the reuse to be safe. Reusing it cuts down on the overhead in lancebench. Also uniqueness of block names are now enforced, and the common pattern of "end_block blockName" could now be parsed if not always commented out by begin_block handling. Change-Id: I0daf6445292383aaab9392550d0842e0a654ad27 Reviewed-by: Eirik Aavitsland --- tests/auto/other/lancelot/paintcommands.cpp | 15 ++++++++--- .../auto/other/lancelot/scripts/filltest.qps | 26 +++++++++---------- .../other/lancelot/scripts/perspectives2.qps | 14 +++++----- .../painting/lancebench/tst_lancebench.cpp | 20 +++++++------- 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/auto/other/lancelot/paintcommands.cpp index 215a4c2a29..7430c93a8e 100644 --- a/tests/auto/other/lancelot/paintcommands.cpp +++ b/tests/auto/other/lancelot/paintcommands.cpp @@ -230,9 +230,9 @@ void PaintCommands::staticInit() "begin_block ", "begin_block blockName"); DECL_PAINTCOMMAND("end_block", command_end_block, - "^end_block$", - "end_block", - "end_block"); + "^end_block\\s*(\\w*)$", + "end_block [blockName]", + "end_block blockName"); DECL_PAINTCOMMAND("repeat_block", command_repeat_block, "^repeat_block\\s+(\\w*)$", "repeat_block ", @@ -744,6 +744,13 @@ void PaintCommands::runCommands() if (height <= 0) height = 800; + m_pathMap.clear(); + m_imageMap.clear(); + m_pixmapMap.clear(); + m_regionMap.clear(); + m_gradientStops.clear(); + m_blockMap.clear(); + // paint background if (m_checkers_background) { QPixmap pm(20, 20); @@ -901,6 +908,8 @@ void PaintCommands::command_begin_block(QRegularExpressionMatch re) const QString &blockName = re.captured(1); if (m_verboseMode) printf(" -(lance) begin_block (%s)\n", qPrintable(blockName)); + if (m_blockMap.contains(blockName)) + qFatal("Two blocks named (%s)", qPrintable(blockName)); m_commands[m_currentCommandIndex] = QLatin1String("# begin block (") + blockName + QLatin1Char(')'); QStringList newBlock; diff --git a/tests/auto/other/lancelot/scripts/filltest.qps b/tests/auto/other/lancelot/scripts/filltest.qps index 2eeba2ecf6..112ffc85be 100644 --- a/tests/auto/other/lancelot/scripts/filltest.qps +++ b/tests/auto/other/lancelot/scripts/filltest.qps @@ -133,7 +133,7 @@ setPen nopen translate 50 0 -begin_block rects +begin_block rects2 drawPath rect drawRect 0 20 10 10 drawImage img 0 40 @@ -154,59 +154,59 @@ translate 10 20 rotate 90 drawRect 0 0 10 10 restore -end_block rects +end_block rects2 setPen red drawText -5 -10 "0.0" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.1" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.2" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.3" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.4" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.5" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.6" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.7" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.8" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "0.9" setPen nopen translate 40 0.1 -repeat_block rects +repeat_block rects2 setPen red drawText -5 -10 "1.0" setPen nopen @@ -410,4 +410,4 @@ drawText 0 0 "outline/fill consistency" setPen red setBrush green translate 80 -30 -drawPolygon [13.6965 -99.1837 -71.4767 13.823 32.4596 -33.1847] \ No newline at end of file +drawPolygon [13.6965 -99.1837 -71.4767 13.823 32.4596 -33.1847] diff --git a/tests/auto/other/lancelot/scripts/perspectives2.qps b/tests/auto/other/lancelot/scripts/perspectives2.qps index 2f6d1d653c..6762e21af4 100644 --- a/tests/auto/other/lancelot/scripts/perspectives2.qps +++ b/tests/auto/other/lancelot/scripts/perspectives2.qps @@ -8,7 +8,7 @@ image_convertToFormat zebra_png zebra ARGB32_Premultiplied translate 75 100 # standard draw -begin_block row +begin_block row1 drawImage zebra -50 -50 translate 90 0 @@ -136,12 +136,12 @@ save rotate_y 180 drawImage zebra -50 -50 restore -end_block +end_block row1 resetMatrix translate 75 280 setRenderHint SmoothPixmapTransform -repeat_block row +repeat_block row1 resetMatrix setPen black @@ -162,7 +162,7 @@ setRenderHint SmoothPixmapTransform false translate 75 100 # standard draw -begin_block row +begin_block row2 drawImage dome -50 -50 translate 90 0 @@ -290,13 +290,13 @@ save rotate_y 180 drawImage dome -50 -50 restore -end_block +end_block row2 resetMatrix translate 0 400 translate 75 280 setRenderHint SmoothPixmapTransform -repeat_block row +repeat_block row2 resetMatrix setPen black @@ -306,4 +306,4 @@ drawText 0 0 "Fast Pixmap Transform" resetMatrix translate 0 400 translate 300 210 -drawText 0 0 "Smooth Pixmap Transform" \ No newline at end of file +drawText 0 0 "Smooth Pixmap Transform" diff --git a/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp index d26ac016b9..bd0889bf4a 100644 --- a/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp +++ b/tests/benchmarks/gui/painting/lancebench/tst_lancebench.cpp @@ -305,17 +305,17 @@ void tst_LanceBench::runTestSuite(GraphicsEngine engine, QImage::Format format, void tst_LanceBench::paint(QPaintDevice *device, GraphicsEngine engine, QImage::Format format, const QStringList &script, const QString &filePath) { + PaintCommands pcmd(script, 800, 800, format); + switch (engine) { + case OpenGL: + pcmd.setType(OpenGLBufferType); // version/profile is communicated through the context's format() + break; + case Raster: + pcmd.setType(ImageType); + break; + } + pcmd.setFilePath(filePath); QBENCHMARK { - PaintCommands pcmd(script, 800, 800, format); - switch (engine) { - case OpenGL: - pcmd.setType(OpenGLBufferType); // version/profile is communicated through the context's format() - break; - case Raster: - pcmd.setType(ImageType); - break; - } - pcmd.setFilePath(filePath); QPainter p(device); pcmd.setPainter(&p); pcmd.runCommands(); From f881d00a4f37fcf244be8f93235b9c970aa1a9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Wed, 5 Dec 2018 12:34:52 +0100 Subject: [PATCH 3/6] QWindowsFontDatabase: Check preferred family names for all fonts The code was initially introduced in 9204b8c31ea1b5f0c05870c5b5d74c33b1a4f622 but getting the names were conditioned on whether or not Windows identified it as a truetype font. This excluded cases which had preferred names embedded but was not truetype fonts. To fix that we run the code unconditionally. [ChangeLog][Windows] Fixed a bug where some fonts would not be accessible by referencing their typographic name. Fixes: QTBUG-78556 Change-Id: I8823684b09cce3b1b8722b1e609a5bb49b13da13 Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Allan Sandfeld Jensen --- .../windows/qwindowsfontdatabase.cpp | 22 ++++++------- .../windows/qwindowsfontdatabase_ft.cpp | 20 ++++++------ .../auto/gui/text/qfontdatabase/testdata.qrc | 1 + .../text/qfontdatabase/tst_qfontdatabase.cpp | 29 ++++++++++++++++++ tests/auto/shared/resources/testfont_open.otf | Bin 0 -> 62676 bytes 5 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 tests/auto/shared/resources/testfont_open.otf diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index 011476cf13..36a94724c1 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1069,18 +1069,16 @@ static bool addFontToDatabase(QString familyName, QString subFamilyName; QString subFamilyStyle; - if (ttf) { - // Look-up names registered in the font - QFontNames canonicalNames = qt_getCanonicalFontNames(logFont); - if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) - englishName = canonicalNames.name; - if (!canonicalNames.preferredName.isEmpty()) { - subFamilyName = familyName; - subFamilyStyle = styleName; - faceName = familyName; // Remember the original name for later lookups - familyName = canonicalNames.preferredName; - styleName = canonicalNames.preferredStyle; - } + // Look-up names registered in the font + QFontNames canonicalNames = qt_getCanonicalFontNames(logFont); + if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) + englishName = canonicalNames.name; + if (!canonicalNames.preferredName.isEmpty()) { + subFamilyName = familyName; + subFamilyStyle = styleName; + faceName = familyName; // Remember the original name for later lookups + familyName = canonicalNames.preferredName; + styleName = canonicalNames.preferredStyle; } QSupportedWritingSystems writingSystems; diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp index a6b7fcf31e..5c2742d295 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp @@ -215,17 +215,15 @@ static bool addFontToDatabase(QString familyName, QString subFamilyName; QString subFamilyStyle; - if (ttf) { - // Look-up names registered in the font - QFontNames canonicalNames = qt_getCanonicalFontNames(logFont); - if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) - englishName = canonicalNames.name; - if (!canonicalNames.preferredName.isEmpty()) { - subFamilyName = familyName; - subFamilyStyle = styleName; - familyName = canonicalNames.preferredName; - styleName = canonicalNames.preferredStyle; - } + // Look-up names registered in the font + QFontNames canonicalNames = qt_getCanonicalFontNames(logFont); + if (qt_localizedName(familyName) && !canonicalNames.name.isEmpty()) + englishName = canonicalNames.name; + if (!canonicalNames.preferredName.isEmpty()) { + subFamilyName = familyName; + subFamilyStyle = styleName; + familyName = canonicalNames.preferredName; + styleName = canonicalNames.preferredStyle; } QSupportedWritingSystems writingSystems; diff --git a/tests/auto/gui/text/qfontdatabase/testdata.qrc b/tests/auto/gui/text/qfontdatabase/testdata.qrc index 224e845601..a590099b20 100644 --- a/tests/auto/gui/text/qfontdatabase/testdata.qrc +++ b/tests/auto/gui/text/qfontdatabase/testdata.qrc @@ -4,5 +4,6 @@ ../../../shared/resources/testfont.ttf ../../../shared/resources/testfont_condensed.ttf ../../../shared/resources/testfont_italic.ttf + ../../../shared/resources/testfont_open.otf diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index 2b69801b59..12e8083622 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -76,6 +76,9 @@ private slots: void rasterFonts(); void smoothFonts(); + void registerOpenTypePreferredNamesSystem(); + void registerOpenTypePreferredNamesApplication(); + private: QString m_ledFont; QString m_testFont; @@ -440,5 +443,31 @@ void tst_QFontDatabase::smoothFonts() QVERIFY(!QFontDatabase().isBitmapScalable(font.family())); } +void tst_QFontDatabase::registerOpenTypePreferredNamesSystem() +{ + QFontDatabase db; + // This font family was picked because it was the only one I had installed which showcased the + // problem + if (!db.hasFamily(QString::fromLatin1("Source Code Pro ExtraLight"))) + QSKIP("Source Code Pro ExtraLight is not installed"); + + QStringList styles = db.styles(QString::fromLatin1("Source Code Pro")); + QVERIFY(styles.contains(QLatin1String("ExtraLight"))); +} + +void tst_QFontDatabase::registerOpenTypePreferredNamesApplication() +{ + QFontDatabase db; + + int id = QFontDatabase::addApplicationFont(QString::fromLatin1(":/testfont_open.otf")); + if (id == -1) + QSKIP("Skip the test since app fonts are not supported on this system"); + + QStringList styles = db.styles(QString::fromLatin1("QtBidiTestFont")); + QVERIFY(styles.contains(QLatin1String("Open"))); + + QFontDatabase::removeApplicationFont(id); +} + QTEST_MAIN(tst_QFontDatabase) #include "tst_qfontdatabase.moc" diff --git a/tests/auto/shared/resources/testfont_open.otf b/tests/auto/shared/resources/testfont_open.otf new file mode 100644 index 0000000000000000000000000000000000000000..0f7950f2dd3ecc0faa38070dd90fc02bfe3aeaff GIT binary patch literal 62676 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 Ko78;se%jl$~UXmC0CT2lBi|)O7;~= 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 Date: Fri, 29 Nov 2019 10:55:03 +0100 Subject: [PATCH 4/6] Silence MSVC build of Qt for Python MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enclose QAssociativeIterableImpl::advanceImpl within QT_WARNING_DISABLE_DEPRECATED, fixing numerous warnings: MSVC\14.23.28105\include\xutility(727): warning C4996: 'QHash::const_iterator::operator --': was declared deprecated include\QtCore\../../src/corelib/tools/qhash.h(432): note: see declaration of 'QHash::const_iterator::operator --' include\QtCore\../../src/corelib/kernel/qmetatype.h(1217): note: see reference to function template instantiation 'void std::advance::const_iterator,int>(_InIt &,_Diff)' being compiled with [ _InIt=QHash::const_iterator, _Diff=int ] include\QtCore\../../src/corelib/kernel/qmetatype.h(1253): note: see reference to function template instantiation 'void QtMetaTypePrivate::QAssociativeIterableImpl::advanceImpl(void **,int)' being compiled with [T=QVariantHash] include\QtCore\../../src/corelib/kernel/qvariant.h(793): note: see reference to function template instantiation 'QtMetaTypePrivate::QAssociativeIterableImpl::QAssociativeIterableImpl(const T *)' being compiled with[T=QVariantHash] Amends dbb54805f63f9ed68d84fe090d608872f16170d2. Change-Id: Ieb875eaa943100ce1941cb1473b35892330c3889 Reviewed-by: MÃ¥rten Nordheim --- src/corelib/kernel/qmetatype.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index d41f7ee80e..240828bc9a 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1212,9 +1212,12 @@ public: { IteratorOwner::assign(iterator, static_cast(container)->find(*static_cast(p))); } + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED // Hits on the deprecated QHash::iterator::operator--() template static void advanceImpl(void **p, int step) { std::advance(*static_cast(*p), step); } + QT_WARNING_POP template static void beginImpl(const void *container, void **iterator) From 57f44068394d015b8f6d6428c91385b2a4f81897 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 29 Nov 2019 12:27:54 +0100 Subject: [PATCH 5/6] Remove QFlags(0), QFlags() does the same and is not deprecated Change-Id: I254d37d37f5583e0f7a76fb42b83d234afa29b77 Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/eglfs/api/qeglfscontext.cpp | 2 +- src/plugins/platforms/eglfs/api/qeglfswindow.cpp | 3 +-- src/plugins/platforms/vnc/qvncclient.cpp | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp index c5cef34d8e..c10b6facbb 100644 --- a/src/plugins/platforms/eglfs/api/qeglfscontext.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfscontext.cpp @@ -52,7 +52,7 @@ QT_BEGIN_NAMESPACE QEglFSContext::QEglFSContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, EGLConfig *config, const QVariant &nativeHandle) : QEGLPlatformContext(format, share, display, config, nativeHandle, - qt_egl_device_integration()->supportsSurfacelessContexts() ? Flags(0) : QEGLPlatformContext::NoSurfaceless), + qt_egl_device_integration()->supportsSurfacelessContexts() ? Flags() : QEGLPlatformContext::NoSurfaceless), m_tempWindow(0) { } diff --git a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp index e6b25c02fd..3457be116a 100644 --- a/src/plugins/platforms/eglfs/api/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/api/qeglfswindow.cpp @@ -66,8 +66,7 @@ QEglFSWindow::QEglFSWindow(QWindow *w) #endif m_winId(0), m_surface(EGL_NO_SURFACE), - m_window(0), - m_flags(0) + m_window(0) { } diff --git a/src/plugins/platforms/vnc/qvncclient.cpp b/src/plugins/platforms/vnc/qvncclient.cpp index 3a373a5e4b..2450f7dad5 100644 --- a/src/plugins/platforms/vnc/qvncclient.cpp +++ b/src/plugins/platforms/vnc/qvncclient.cpp @@ -65,7 +65,6 @@ QVncClient::QVncClient(QTcpSocket *clientSocket, QVncServer *server) , m_cutTextPending(0) , m_supportHextile(false) , m_wantUpdate(false) - , m_keymod(0) , m_dirtyCursor(false) , m_updatePending(false) , m_protocolVersion(V3_3) From 4e9e9c2c17afa472fb8ae04fc36d9605863f8b83 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Fri, 27 Sep 2019 09:18:46 +0200 Subject: [PATCH 6/6] INTEGRITY: remove constexpr support It doesn't seem to be working correctly with array of literal types, blocking the patch refactoring the webgradient support: 10171: "painting/webgradients.cpp", line 79: error #28: expression must have a constant value Change-Id: I9ddd768d24ef79dd7a69e23c91988d891e41d4b9 Reviewed-by: Thiago Macieira --- src/corelib/global/qcompilerdetection.h | 1 - src/corelib/thread/qbasicatomic.h | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index e47f284a42..aab5625d00 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -365,7 +365,6 @@ # define Q_COMPILER_ATTRIBUTES # define Q_COMPILER_AUTO_FUNCTION # define Q_COMPILER_CLASS_ENUM -# define Q_COMPILER_CONSTEXPR # define Q_COMPILER_DECLTYPE # define Q_COMPILER_DEFAULT_MEMBERS # define Q_COMPILER_DELETE_MEMBERS diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h index 9804e60119..c9c95cf6ce 100644 --- a/src/corelib/thread/qbasicatomic.h +++ b/src/corelib/thread/qbasicatomic.h @@ -47,9 +47,9 @@ # include // If C++11 atomics are supported, use them! -// Note that constexpr support is sometimes disabled in QNX builds but its -// library has . -#elif defined(Q_COMPILER_ATOMICS) && (defined(Q_COMPILER_CONSTEXPR) || defined(Q_OS_QNX)) +// Note that constexpr support is sometimes disabled in QNX or INTEGRITY builds, +// but their libraries have . +#elif defined(Q_COMPILER_ATOMICS) && (defined(Q_COMPILER_CONSTEXPR) || defined(Q_OS_QNX) || defined(Q_OS_INTEGRITY)) # include // We only support one fallback: MSVC, because even on version 2015, it lacks full constexpr support