summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-02-24 19:57:17 +0100
committerLiang Qi <liang.qi@qt.io>2017-02-24 20:01:42 +0100
commitde49839df8abfba1f3ed3c36ef3177e4a9d6ef00 (patch)
tree71e777ca1e33c58edd9149821e970495ef4b75b2
parente6234535929c67e7fbfa1ad7ce88f37df0b68d45 (diff)
parent4d3781b640e8fb0a04e96b2d05199247556b8d86 (diff)
Merge remote-tracking branch 'origin/5.8' into 5.9
Conflicts: mkspecs/features/moc.prf Change-Id: Ia71c8e3b3185f7c999bf226d0675051b10b8740b
-rw-r--r--config_help.txt20
-rw-r--r--configure.json8
-rw-r--r--examples/network/network.pro1
-rw-r--r--mkspecs/features/data/configure.json5
-rw-r--r--mkspecs/features/moc.prf2
-rw-r--r--mkspecs/features/qmake_use.prf22
-rw-r--r--mkspecs/features/qt_configure.prf282
-rw-r--r--mkspecs/features/qt_helper_lib.prf1
-rw-r--r--mkspecs/features/qt_module_pris.prf2
-rw-r--r--mkspecs/linux-icc/qmake.conf2
-rw-r--r--mkspecs/macx-icc/qmake.conf4
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java3
-rw-r--r--src/concurrent/qtconcurrentfunctionwrappers.h84
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp4
-rw-r--r--src/corelib/global/qfeatures.txt956
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp96
-rw-r--r--src/corelib/io/qloggingregistry.cpp22
-rw-r--r--src/corelib/io/qloggingregistry_p.h1
-rw-r--r--src/corelib/io/qprocess_win.cpp3
-rw-r--r--src/corelib/io/qurl.cpp6
-rw-r--r--src/corelib/kernel/qeventdispatcher_cf.mm5
-rw-r--r--src/corelib/kernel/qeventdispatcher_cf_p.h9
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp5
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h11
-rw-r--r--src/corelib/plugin/qlibrary.cpp1
-rw-r--r--src/corelib/plugin/qlibrary_p.h13
-rw-r--r--src/corelib/plugin/qpluginloader.cpp2
-rw-r--r--src/corelib/thread/qreadwritelock.cpp6
-rw-r--r--src/corelib/tools/qfreelist_p.h4
-rw-r--r--src/corelib/tools/qlocale.cpp1
-rw-r--r--src/corelib/tools/qrect.cpp6
-rw-r--r--src/corelib/tools/qtimezone.cpp14
-rw-r--r--src/corelib/tools/qvarlengtharray.h20
-rw-r--r--src/gui/configure.json7
-rw-r--r--src/gui/text/qtextdocument_p.cpp2
-rw-r--r--src/gui/text/qtextformat.cpp17
-rw-r--r--src/gui/text/qtextformat_p.h5
-rw-r--r--src/network/configure.json34
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp14
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp14
-rw-r--r--src/network/ssl/ssl.pri16
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp3
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglcontext.cpp4
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.mm4
-rw-r--r--src/plugins/platforms/vnc/qvncclient.cpp6
-rw-r--r--src/plugins/platforms/vnc/qvncscreen.cpp7
-rw-r--r--src/plugins/platforms/vnc/qvncscreen.h2
-rw-r--r--src/sql/configure.json7
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm7
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp2
-rw-r--r--src/widgets/widgets/qdockwidget.cpp13
-rw-r--r--src/widgets/widgets/qdockwidget_p.h1
-rw-r--r--src/widgets/widgets/qmainwindowlayout.cpp9
-rw-r--r--tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro3
-rw-r--r--tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp74
-rw-r--r--tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro3
-rw-r--r--tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp104
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp2
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp74
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro2
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro2
-rw-r--r--tests/auto/corelib/tools/qdate/tst_qdate.cpp3
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp28
-rw-r--r--tests/auto/corelib/tools/qtime/tst_qtime.cpp16
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp17
-rw-r--r--tests/auto/gui/text/qtextformat/tst_qtextformat.cpp28
-rw-r--r--tests/auto/network/ssl/qsslsocket/qsslsocket.pro6
-rw-r--r--tests/manual/manual.pro2
69 files changed, 901 insertions, 1259 deletions
diff --git a/config_help.txt b/config_help.txt
index 2f6c63ae91..317ba61031 100644
--- a/config_help.txt
+++ b/config_help.txt
@@ -1,8 +1,10 @@
Usage: configure [options] [assignments]
Configure understands variable assignments like VAR=value on the command line.
-These override any values possibly obtained from pkg-config. The variables
-are mentioned in the descriptions of the options they relate to.
+Each uppercased library name (obtainable with -list-libraries) supports the
+suffixes _INCDIR, _LIBDIR, _PREFIX (INCDIR=PREFIX/include, LIBDIR=PREFIX/lib),
+_LIBS, and - on Windows and Darwin - _LIBS_DEBUG and _LIBS_RELEASE. E.g.,
+ICU_PREFIX=/opt/icu42 ICU_LIBS="-licui18n -licuuc -licudata".
It is also possible to manipulate any QMAKE_* variable, to amend the values
from the mkspec for the build of Qt itself, e.g., QMAKE_CXXFLAGS+=-g3.
@@ -62,6 +64,13 @@ Configure meta:
Use this after installing missing dependencies.
-recheck-all ......... Discard all cached configure test results.
+ -feature-<feature> ... Enable <feature>
+ -no-feature-<feature> Disable <feature> [none]
+ -list-features ....... List available features. Note that some features
+ have dedicated command line options as well.
+
+ -list-libraries ...... List possible external dependencies.
+
Build options:
-opensource .......... Build the Open-Source Edition of Qt
@@ -188,9 +197,6 @@ Component selection:
[default on Android and Windows]
-dbus-linked ......... Build Qt D-Bus and link to libdbus-1 [auto]
-dbus-runtime ........ Build Qt D-Bus and dynamically load libdbus-1 [no]
- DBUS_PATH= DBUS_HOST_PATH=
- -feature-<feature> ... Enable <feature>. The available features are described
- in src/corelib/global/qfeatures.txt. [all enabled]
-accessibility ....... Enable accessibility support [yes]
Note: Disabling accessibility is not recommended.
-qml-debug ........... Enable QML debugging support [yes]
@@ -210,7 +216,6 @@ Core options:
-pcre ................ Select used libpcre2 [system/qt]
-pps ................. Enable PPS support [auto] (QNX only)
-zlib ................ Select used zlib [system/qt]
- ZLIB_LIBS=
Logging backends:
-journald .......... Enable journald support [no] (Unix only)
@@ -223,8 +228,6 @@ Network options:
-no-openssl .......... Do not use OpenSSL [default on Apple and WinRT]
-openssl-linked ...... Use OpenSSL and link to libssl [no]
-openssl-runtime ..... Use OpenSSL and dynamically load libssl [auto]
- OPENSSL_PATH= OPENSSL_LIBS=, and on Windows also
- OPENSSL_LIBS_DEBUG= OPENSSL_LIBS_RELEASE=
-securetransport ..... Use SecureTransport [auto] (Apple only)
-sctp ................ Enable SCTP support [no]
@@ -292,5 +295,4 @@ Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite2 sqlite tds
[all auto]
- MYSQL_PATH= PSQL_LIBS= SYBASE= SYBASE_LIBS=
-sqlite .............. Select used sqlite3 [system/qt]
diff --git a/configure.json b/configure.json
index 987fabc2ea..c5be88856d 100644
--- a/configure.json
+++ b/configure.json
@@ -20,8 +20,7 @@
"commandline": {
"assignments": {
"DBUS_HOST_PATH": "host_dbus.prefix",
- "DBUS_PATH": "dbus.prefix",
- "ZLIB_LIBS": "zlib.libs"
+ "DBUS_PATH": "dbus.prefix"
},
"custom": "qmakeArgs",
"options": {
@@ -990,7 +989,10 @@
},
"qml-debug": {
"label": "QML debugging",
- "output": [ { "type": "publicQtConfig", "negative": true } ]
+ "output": [
+ "privateFeature",
+ { "type": "publicQtConfig", "negative": true }
+ ]
},
"compile_examples": {
"label": "Compile examples",
diff --git a/examples/network/network.pro b/examples/network/network.pro
index 3a269f16ae..d64b16c760 100644
--- a/examples/network/network.pro
+++ b/examples/network/network.pro
@@ -30,7 +30,6 @@ qtHaveModule(widgets) {
}
qtConfig(openssl): SUBDIRS += securesocketclient
- qtConfig(openssl-linked): SUBDIRS += securesocketclient
qtConfig(sctp): SUBDIRS += multistreamserver multistreamclient
}
diff --git a/mkspecs/features/data/configure.json b/mkspecs/features/data/configure.json
index 98ccde1ee3..38623d46a4 100644
--- a/mkspecs/features/data/configure.json
+++ b/mkspecs/features/data/configure.json
@@ -12,7 +12,10 @@
"recheck": { "type": "void", "name": "cache_use", "value": "positive" },
"recheck-all": { "type": "void", "name": "cache_use", "value": "none" },
- "redo": { "type": "redo" }
+ "redo": { "type": "redo" },
+
+ "list-features": "void",
+ "list-libraries": "void"
}
}
}
diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf
index 9719241612..15eb38af31 100644
--- a/mkspecs/features/moc.prf
+++ b/mkspecs/features/moc.prf
@@ -27,7 +27,7 @@ win32:count(MOC_INCLUDEPATH, 40, >) {
# QNX's compiler sets "gcc" config, but does not support the -dM option;
# UIKit builds are always multi-arch due to simulator_and_device (unless
# -sdk is used) so this feature cannot possibly work.
-if(gcc|intel_icl|msvc):!rim_qcc:!uikit:if(!macos|count(QMAKE_APPLE_DEVICE_ARCHS, 1)) {
+if(gcc|intel_icl|msvc):!rim_qcc:!uikit:!no_moc_predefs:if(!macos|count(QMAKE_APPLE_DEVICE_ARCHS, 1)) {
moc_predefs.name = "Generate moc_predefs.h"
moc_predefs.CONFIG = no_link
gcc: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -dM -E -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
diff --git a/mkspecs/features/qmake_use.prf b/mkspecs/features/qmake_use.prf
index 9b6c67ccc2..f81d1cece4 100644
--- a/mkspecs/features/qmake_use.prf
+++ b/mkspecs/features/qmake_use.prf
@@ -5,25 +5,19 @@ for(ever) {
use = $$split(use, /)
name = $$take_first(use)
nu = $$upper($$name)
- debug: \
- libs = $$eval(QMAKE_LIBS_$${nu}_DEBUG)
- else: \
- libs = $$eval(QMAKE_LIBS_$${nu}_RELEASE)
- libs += $$eval(QMAKE_LIBS_$$nu)
- libdir = $$eval(QMAKE_LIBDIR_$$nu)
- defines = $$eval(QMAKE_DEFINES_$${nu})
- includes = $$eval(QMAKE_INCDIR_$${nu})
-
- isEmpty(libs):isEmpty(defines):isEmpty(includes): \
+ !defined(QMAKE_LIBS_$$nu, var): \
error("Library '$$name' is not defined.")
!contains(use, nolink) {
- QMAKE_LIBDIR += $$libdir
- LIBS$${suffix} += $$libs
+ QMAKE_LIBDIR += $$eval(QMAKE_LIBDIR_$$nu)
+ debug: \
+ LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu)
+ else: \
+ LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu)
}
!contains(use, linkonly) {
- DEFINES += $$defines
- INCLUDEPATH += $$includes
+ DEFINES += $$eval(QMAKE_DEFINES_$${nu})
+ INCLUDEPATH += $$eval(QMAKE_INCDIR_$${nu})
}
}
!isEmpty(suffix): break()
diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf
index 78731595b0..e2e1a5a762 100644
--- a/mkspecs/features/qt_configure.prf
+++ b/mkspecs/features/qt_configure.prf
@@ -401,6 +401,7 @@ defineReplace(qtConfPrepareArgs) {
}
defineTest(qtConfSetupLibraries) {
+ asspfx = $${currentConfig}.commandline.assignments
for (l, $${currentConfig}.libraries._KEYS_) {
lpfx = $${currentConfig}.libraries.$${l}
# 'export' may be omitted, in which case it falls back to the library's name
@@ -408,6 +409,15 @@ defineTest(qtConfSetupLibraries) {
$${lpfx}.export = $$l
export($${lpfx}.export)
}
+ # 'export' may also be empty, but we need a derived identifier
+ alias = $$eval($${lpfx}.export)
+ isEmpty(alias): alias = $$l
+ $${lpfx}.alias = $$alias
+ export($${lpfx}.alias)
+ # make it easy to refer to the library by its export name.
+ $${currentConfig}.exports._KEYS_ += $$alias
+ $${currentConfig}.exports.$$alias += $$l
+ export($${currentConfig}.exports.$$alias)
isEmpty($${lpfx}.sources._KEYS_): \
error("Library $$l defines no sources")
for (s, $${lpfx}.sources._KEYS_) {
@@ -427,10 +437,33 @@ defineTest(qtConfSetupLibraries) {
}
}
}
+ $${currentConfig}.exports._KEYS_ = $$unique($${currentConfig}.exports._KEYS_)
+ export($${currentConfig}.exports._KEYS_)
+
+ for (alias, $${currentConfig}.exports._KEYS_) {
+ ua = $$upper($$alias)
+ $${asspfx}._KEYS_ += \
+ $${ua}_PREFIX $${ua}_INCDIR $${ua}_LIBDIR \
+ $${ua}_LIBS $${ua}_LIBS_DEBUG $${ua}_LIBS_RELEASE
+ uapfx = $${asspfx}.$${ua}
+ $${uapfx}_PREFIX = $${alias}.prefix
+ $${uapfx}_INCDIR = $${alias}.incdir
+ $${uapfx}_LIBDIR = $${alias}.libdir
+ $${uapfx}_LIBS = $${alias}.libs
+ $${uapfx}_LIBS_DEBUG = $${alias}.libs.debug
+ $${uapfx}_LIBS_RELEASE = $${alias}.libs.release
+ export($${uapfx}_PREFIX)
+ export($${uapfx}_INCDIR)
+ export($${uapfx}_LIBDIR)
+ export($${uapfx}_LIBS)
+ export($${uapfx}_LIBS_DEBUG)
+ export($${uapfx}_LIBS_RELEASE)
+ }
+ export($${asspfx}._KEYS_)
# reverse mapping for assignments on command line.
- for (a, $${currentConfig}.commandline.assignments._KEYS_) {
- apfx = $${currentConfig}.commandline.assignments.$${a}
+ for (a, $${asspfx}._KEYS_) {
+ apfx = $${asspfx}.$${a}
ra = config.commandline.rev_assignments.$$eval($$apfx)
$$ra = $$a
export($$ra)
@@ -444,9 +477,13 @@ defineTest(qtConfLibrary_inline) {
!defined($${1}.libs, var): \
error("'inline' source in library '$$lib' does not specify 'libs'.")
+ # if multiple libraries provide the same export, it makes sense
+ # to make them recognize the same input variables.
+ input = $$eval($${2}.alias)
+
# direct libs. overwrites inline libs.
- defined(config.input.$${lib}.libs, var) {
- $${1}.libs = $$eval(config.input.$${lib}.libs)
+ defined(config.input.$${input}.libs, var) {
+ $${1}.libs = $$eval(config.input.$${input}.libs)
export($${1}.libs)
}
@@ -455,7 +492,7 @@ defineTest(qtConfLibrary_inline) {
any = false
all = true
for (b, $${1}.builds._KEYS_) {
- iv = $${lib}.libs.$${b}
+ iv = $${input}.libs.$${b}
vars += $$eval(config.commandline.rev_assignments.$${iv})
defined(config.input.$${iv}, var) {
$${1}.builds.$${b}.libs = $$eval(config.input.$${iv})
@@ -471,7 +508,7 @@ defineTest(qtConfLibrary_inline) {
}
# prefix. prepends to (possibly overwritten) inline libs.
- prefix = $$val_escape(config.input.$${lib}.prefix)
+ prefix = $$val_escape(config.input.$${input}.prefix)
!isEmpty(prefix) {
$${1}.includedir = $$prefix/include
export($${1}.includedir)
@@ -479,6 +516,18 @@ defineTest(qtConfLibrary_inline) {
export($${1}.libs)
}
+ incdir = $$val_escape(config.input.$${input}.incdir)
+ !isEmpty(incdir) {
+ $${1}.includedir = $$incdir
+ export($${1}.includedir)
+ }
+
+ libdir = $$val_escape(config.input.$${input}.libdir)
+ !isEmpty(libdir) {
+ $${1}.libs = "-L$$libdir $$eval($${1}.libs)"
+ export($${1}.libs)
+ }
+
return(true)
}
@@ -562,14 +611,20 @@ defineReplace(qtConfLibraryArgs) {
}
defineTest(qtConfExportLibrary) {
- isEmpty(2): return()
- !$$qtConfEvaluate($$eval($${1}.export)): return()
+ lpfx = $${currentConfig}.libraries.$$1
+ alias = $$eval($${lpfx}.alias)
+ $${currentConfig}.found.$$alias = $$1
+ export($${currentConfig}.found.$$alias)
+ name = $$eval($${lpfx}.export)
+ isEmpty(name): return()
+ spfx = $${lpfx}.sources.$$eval($${lpfx}.source)
+ !$$qtConfEvaluate($$eval($${spfx}.export)): return()
output = privatePro
- eval(libs = $$eval($${1}.libs))
- eval(cflags = $$eval($${1}.cflags))
- eval(includes = $$eval($${1}.includedir))
+ eval(libs = $$eval($${spfx}.libs))
+ eval(cflags = $$eval($${spfx}.cflags))
+ eval(includes = $$eval($${spfx}.includedir))
# Split $$cflags into stuff that goes into DEFINES, INCLUDEPATH, and other stuff.
defines =
@@ -588,30 +643,46 @@ defineTest(qtConfExportLibrary) {
}
}
!isEmpty(ignored): \
- qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$2'.")
+ qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$name'.")
- NAME = $$upper($$2)
- !isEmpty(libs): qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
- for (b, $${1}.builds._KEYS_): \
+ NAME = $$upper($$name)
+ # LIBS is emitted even if empty, as this allows the library to be "seen".
+ qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
+ for (b, $${spfx}.builds._KEYS_): \
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$${NAME}_$$upper($$b), \
- $$eval($${1}.builds.$${b}))
+ $$eval($${spfx}.builds.$${b}))
!isEmpty(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines)
!isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes)
!isEmpty($${currentConfig}.module): \
- qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$2)
+ qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$name)
}
defineTest(qtConfHandleLibrary) {
lpfx = $${currentConfig}.libraries.$$1
defined($${lpfx}.result, var): return()
+ alias = $$eval($${lpfx}.alias)
+ !isEmpty($${currentConfig}.found.$$alias) {
+ # this happening indicates a logic error in the conditions
+ # of the feature(s) referring to this library.
+ # note that this does not look across module boundaries, as
+ # multiple modules may know the same libraries; de-duplication
+ # happens via the cache (obviously, this assumes identical
+ # definitions and logic).
+ error("A library exporting '$$alias' was already found.")
+ }
+
qtConfEnsureTestTypeDeps("library")
- qtConfTestPrepare_compile($$lpfx)
+ !qtConfTestPrepare_compile($$lpfx) {
+ $${lpfx}.result = false
+ export($${lpfx}.result)
+ return()
+ }
use_args = $$eval($${lpfx}.literal_args)
qtConfLoadResult($${lpfx}, $$1) {
$$eval($${lpfx}.result): \
- qtConfExportLibrary($${lpfx}.sources.$$eval($${lpfx}.source), $$eval($${lpfx}.export))
+ qtConfExportLibrary($$1)
return()
}
@@ -634,14 +705,14 @@ defineTest(qtConfHandleLibrary) {
next()
}
- !$${call}($$spfx) {
+ !$${call}($$spfx, $$lpfx) {
qtLog(" => source produced no result.")
next()
}
# if the library defines a test, use it to verify the source.
!isEmpty($${lpfx}.test) {
- $${lpfx}.literal_args = $$use_args $$qtConfLibraryArgs($$spfx)
+ $${lpfx}.literal_args = $$qtConfLibraryArgs($$spfx) $$use_args
$${lpfx}.host = $$eval($${spfx}.host)
!qtConfTest_compile($$lpfx) {
qtLog(" => source failed verification.")
@@ -657,11 +728,12 @@ defineTest(qtConfHandleLibrary) {
for (b, $${spfx}.builds._KEYS_): \
$${lpfx}.cache += sources.$${s}.builds.$${b}
- # immediately output the library as well.
- qtConfExportLibrary($${spfx}, $$eval($${lpfx}.export))
-
$${lpfx}.source = $$s
export($${lpfx}.source)
+
+ # immediately output the library as well.
+ qtConfExportLibrary($$1)
+
result = true
break()
}
@@ -679,27 +751,76 @@ defineTest(qtConfTest_library) {
}
defineTest(qtConfTestPrepare_compile) {
- for (u, $$list($$eval($${1}.use))) {
+ !isEmpty($${1}.use._KEYS_) {
+ uses =
+ for (k, $${1}.use._KEYS_) {
+ use = $$eval($${1}.use.$${k}.lib)
+ isEmpty(use): \
+ error("'use' entry $$k in test $$1 lacks 'lib' field.")
+ !$$qtConfEvaluate($$eval($${1}.use.$${k}.condition)): \
+ next()
+ uses += $$use
+ }
+ } else {
+ uses = $$split($${1}.use)
+ }
+ for (u, uses) {
libConfig =
- contains($${currentConfig}.libraries._KEYS_, $$u) {
- libConfig = $${currentConfig}
+ exports = $$eval($${currentConfig}.exports.$$u)
+ !isEmpty(exports) {
+ # using a local library by exported name.
+ ru = $$eval($${currentConfig}.found.$$u)
+ !isEmpty(ru) {
+ # if it was already found, all is good.
+ u = $$ru
+ } else: count(exports, 1) {
+ # otherwise, if there is only one option, ensure it's resolved.
+ u = $$exports
+ qtConfHandleLibrary($$u)
+ } else {
+ # otherwise, verify that all options were resolved.
+ for (x, exports) {
+ isEmpty($${currentConfig}.libraries.$${x}.result) {
+ # the higher-level logic is in the features, which we cannot
+ # infer from here. so the only option is failing.
+ error("Test $$1 refers to yet unresolved library export '$$u'")
+ }
+ }
+ return(false)
+ }
+ libConfig = $$currentConfig
+ } else: contains($${currentConfig}.libraries._KEYS_, $$u) {
+ # using a local library by real name. this should be the exception.
qtConfHandleLibrary($$u)
+ libConfig = $$currentConfig
} else {
- for (d, QMAKE_CONFIG_DEPS) {
- contains($${d}.libraries._KEYS_, $$u) {
- libConfig = $$d
- break()
+ for (d, QMAKE_LIBRARY_DEPS) {
+ exports = $$eval($${d}.exports.$$u)
+ !isEmpty(exports) {
+ # using a foreign library by exported name.
+ # foreign libraries may be external (if they are from a different
+ # repository and the build is modular), and using these by real
+ # name is impossible. so for consistency, uses by real name are
+ # limited to local libraries.
+ ru = $$eval($${d}.found.$$u)
+ !isEmpty(ru) {
+ u = $$ru
+ libConfig = $$d
+ break()
+ }
+ for (x, exports) {
+ isEmpty($${d}.libraries.$${x}.result): \
+ error("Test $$1 refers to unresolved library export '$$u' in '$$d'")
+ }
+ return(false)
}
}
}
isEmpty(libConfig) {
nu = $$upper($$u)
- libs = $$eval(QMAKE_LIBS_$$nu) $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$${nu}_RELEASE)
- defines = $$eval(QMAKE_DEFINES_$${nu})
- includes = $$eval(QMAKE_INCDIR_$${nu})
-
- isEmpty(libs):isEmpty(defines):isEmpty(includes): \
+ !defined(QMAKE_LIBS_$$nu, var): \
error("Test $$1 tries to use undeclared library '$$u'")
+ # using an external library by exported name.
$${1}.literal_args += $$system_quote(QMAKE_USE += $$u)
} else {
lpfx = $${libConfig}.libraries.$${u}
@@ -1252,14 +1373,14 @@ defineTest(qtConfProcessFeatures) {
# reporting
#
-QT_CONF_REPORT_PADDING = "........................................"
-
-defineTest(qtConfReportPadded) {
- pad = $$num_add($$str_size($$QT_CONF_REPORT_PADDING), -$$str_size($${1}))
+defineReplace(qtConfPadCols) {
+ pad = $$num_add($$str_size($$2), -$$str_size($${1}))
lessThan(pad, 0): pad = 0
- str = "$$1 $$str_member($$QT_CONF_REPORT_PADDING, 0, $$pad)"
+ return("$$1 $$str_member($$2, 0, $$pad) $$3")
+}
- qtConfAddReport("$$str $${2}")
+defineTest(qtConfReportPadded) {
+ qtConfAddReport($$qtConfPadCols($$1, "........................................", $$2))
}
defineReplace(qtConfCollectFeatures) {
@@ -1749,8 +1870,6 @@ for(ever) {
jsonFile = $$thisDir/configure.json
priFile = $$thisDir/configure.pri
- allConfigs += $$currentConfig
-
# load configuration data
configure_data = $$cat($$jsonFile, blob)
!parseJson(configure_data, $$currentConfig): \
@@ -1758,25 +1877,88 @@ for(ever) {
exists($$priFile): \
!include($$priFile): error()
+ # only configs which contain more than just subconfigs are saved for later.
+ $${currentConfig}._KEYS_ -= subconfigs
+ !isEmpty($${currentConfig}._KEYS_) {
+ allConfigs += $$currentConfig
+ contains($${currentConfig}._KEYS_, libraries) {
+ qtConfSetupLibraries()
+ # this ensures that references in QMAKE_LIBRARY_DEPS are unique.
+ qtConfSetModuleName()
+ ex = $$eval(config.modules.$${currentModule})
+ !isEmpty(ex): \
+ error("Module $$currentModule is claimed by both $$currentConfig and $${ex}.")
+ config.modules.$${currentModule} = $$currentConfig
+ }
+ }
+
# prepend all subconfigs to files to keep a depth first search order
subconfigs =
for(n, $${currentConfig}.subconfigs._KEYS_) {
subconfig = $$eval($${currentConfig}.subconfigs.$${n})
name = $$basename(subconfig)
+ ex = $$eval(config.$${name}.dir)
+ !isEmpty(ex): \
+ error("Basename clash between $$thisDir/$$subconfig and $${ex}.")
config.$${name}.dir = $$thisDir/$$subconfig
subconfigs += $$name
}
configsToProcess = $$subconfigs $$configsToProcess
}
-for (currentConfig, allConfigs): \
- qtConfSetupLibraries()
-
QMAKE_SAVED_ARGS = $$QMAKE_EXTRA_ARGS
QMAKE_REDO_CONFIG = false
qtConfParseCommandLine()
qtConfCheckErrors()
+!isEmpty(config.input.list-features) {
+ all_ft =
+ for (currentConfig, allConfigs) {
+ for (k, $${currentConfig}.features._KEYS_) {
+ pp = $$eval($${currentConfig}.features.$${k}.purpose)
+ !isEmpty(pp) {
+ all_ft += $$qtConfPadCols($$k, ".......................", \
+ $$section(pp, $$escape_expand(\\n), 0, 0))
+ }
+ }
+ }
+ all_ft = $$sorted(all_ft)
+ logn()
+ for (ft, all_ft): \
+ logn($$ft)
+ error()
+}
+
+!isEmpty(config.input.list-libraries) {
+ logn()
+ for (currentConfig, allConfigs) {
+ !isEmpty($${currentConfig}.exports._KEYS_) {
+ !isEmpty($${currentConfig}.module): \
+ logn($$eval($${currentConfig}.module):)
+ else: \
+ logn($$section(currentConfig, ., -1):)
+ all_xp =
+ for (xport, $${currentConfig}.exports._KEYS_) {
+ libs = $$eval($${currentConfig}.exports.$$xport)
+ isEqual($${currentConfig}.libraries.$$first(libs).export, "") { # not isEmpty()!
+ !isEmpty(config.input.verbose): \
+ all_xp += "$$xport!"
+ } else {
+ out = "$$xport"
+ !isEmpty(config.input.verbose):!isEqual(xport, $$libs): \
+ out += "($$libs)"
+ all_xp += "$$out"
+ }
+ }
+ all_xp = $$sorted(all_xp)
+ all_xp ~= s,^([^!]*)!$,(\\1),g
+ for (xp, all_xp): \
+ logn(" $$xp")
+ }
+ }
+ error()
+}
+
for (currentConfig, allConfigs) {
qtConfSetModuleName()
qtConfSetupModuleOutputs()
@@ -1833,11 +2015,15 @@ for (currentConfig, allConfigs) {
# correctly setup dependencies
QMAKE_CONFIG_DEPS = global global_private
+ QMAKE_LIBRARY_DEPS = $$eval(config.modules.global)
!isEmpty($${currentConfig}.module) {
for (d, $${currentConfig}.depends._KEYS_) {
dep = $$replace($${currentConfig}.depends.$$d, -private$, _private)
- dep *= $$replace(dep, _private$, )
+ gdep = $$replace(dep, _private$, )
+ dep *= $$gdep
QMAKE_CONFIG_DEPS += $$dep
+ !isEqual(gdep, $$dep): \ # libraries are in the private module.
+ QMAKE_LIBRARY_DEPS += $$eval(config.modules.$$gdep)
}
}
diff --git a/mkspecs/features/qt_helper_lib.prf b/mkspecs/features/qt_helper_lib.prf
index 99ba0c6877..b3e49e4626 100644
--- a/mkspecs/features/qt_helper_lib.prf
+++ b/mkspecs/features/qt_helper_lib.prf
@@ -42,6 +42,7 @@ THE_TARGET = $$qt5LibraryTarget($$TARGET)
darwin: MODULE_DEBUG_LIBS = -L$$DESTDIR -l$${TARGET}_debug
MODULE_RELEASE_LIBS = -L$$DESTDIR -l$$TARGET
MODULE_PRI_CONT += \
+ "QMAKE_LIBS_$${ucmodule} =" \ # Needed for the module to be recognized.
"QMAKE_LIBS_$${ucmodule}_DEBUG = $$val_escape(MODULE_DEBUG_LIBS)" \
"QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_RELEASE_LIBS)"
} else {
diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf
index 77bedb1d7f..72d676da6f 100644
--- a/mkspecs/features/qt_module_pris.prf
+++ b/mkspecs/features/qt_module_pris.prf
@@ -59,7 +59,7 @@ defineReplace(qtExportLibsForModule) {
QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE \
QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME
for (var, vars) {
- !isEmpty($$var): \
+ defined($$var, var): \
result += "$$var = $$val_escape($$var)"
}
}
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 4822d2a0e0..196e33432c 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -16,7 +16,7 @@ QMAKE_CFLAGS_APP = -fPIC
QMAKE_CFLAGS_DEPS = -M
QMAKE_CFLAGS_WARN_ON = -w1 -Wall -Wcheck -wd1572,873,2259,2261,3373
QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE = -O2 -ansi-alias -fstrict-aliasing
+QMAKE_CFLAGS_RELEASE = -O2
QMAKE_CFLAGS_DEBUG = -O0 -g
QMAKE_CFLAGS_SHLIB = -fPIC
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index 533f9cd86d..bb454377ef 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -16,8 +16,8 @@ QMAKE_CFLAGS =
QMAKE_CFLAGS_DEPS = -M
QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125,2259,2261,3280,3373
QMAKE_CFLAGS_WARN_OFF = -w
-QMAKE_CFLAGS_RELEASE =
-QMAKE_CFLAGS_DEBUG = -g
+QMAKE_CFLAGS_RELEASE = -O2
+QMAKE_CFLAGS_DEBUG = -g -O0
QMAKE_CFLAGS_SHLIB = -fPIC
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index bfdbaed43f..e0878f078f 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -276,6 +276,9 @@ public class QtActivityDelegate
if (m_softInputMode != 0) {
m_activity.getWindow().setSoftInputMode(m_softInputMode);
+ final boolean softInputIsHidden = (m_softInputMode & WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) != 0;
+ if (softInputIsHidden)
+ return;
} else {
if (height > visibleHeight)
m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
diff --git a/src/concurrent/qtconcurrentfunctionwrappers.h b/src/concurrent/qtconcurrentfunctionwrappers.h
index a08be69123..111933410b 100644
--- a/src/concurrent/qtconcurrentfunctionwrappers.h
+++ b/src/concurrent/qtconcurrentfunctionwrappers.h
@@ -192,6 +192,32 @@ QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func
return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
}
+#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+template <typename T, typename U>
+QtConcurrent::FunctionWrapper1<T, U> createFunctionWrapper(T (*func)(U) noexcept)
+{
+ return QtConcurrent::FunctionWrapper1<T, U>(func);
+}
+
+template <typename T, typename C>
+QtConcurrent::MemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() noexcept)
+{
+ return QtConcurrent::MemberFunctionWrapper<T, C>(func);
+}
+
+template <typename T, typename C, typename U>
+QtConcurrent::MemberFunctionWrapper1<T, C, U> createFunctionWrapper(T (C::*func)(U) noexcept)
+{
+ return QtConcurrent::MemberFunctionWrapper1<T, C, U>(func);
+}
+
+template <typename T, typename C>
+QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() const noexcept)
+{
+ return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
+}
+#endif
+
struct PushBackWrapper
{
typedef void result_type;
@@ -231,6 +257,20 @@ struct ReduceResultType<T(C::*)(U)>
typedef C ResultType;
};
+#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+template <class U, class V>
+struct ReduceResultType<void(*)(U&,V) noexcept>
+{
+ typedef U ResultType;
+};
+
+template <class T, class C, class U>
+struct ReduceResultType<T(C::*)(U) noexcept>
+{
+ typedef C ResultType;
+};
+#endif
+
template <class InputSequence, class MapFunctor>
struct MapResultType
{
@@ -249,6 +289,20 @@ struct MapResultType<void, T(C::*)() const>
typedef T ResultType;
};
+#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+template <class U, class V>
+struct MapResultType<void, U (*)(V) noexcept>
+{
+ typedef U ResultType;
+};
+
+template <class T, class C>
+struct MapResultType<void, T(C::*)() const noexcept>
+{
+ typedef T ResultType;
+};
+#endif
+
#ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
template <template <typename> class InputSequence, typename MapFunctor, typename T>
@@ -269,6 +323,21 @@ struct MapResultType<InputSequence<T>, U(C::*)() const>
typedef InputSequence<U> ResultType;
};
+#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+
+template <template <typename> class InputSequence, class T, class U, class V>
+struct MapResultType<InputSequence<T>, U (*)(V) noexcept>
+{
+ typedef InputSequence<U> ResultType;
+};
+
+template <template <typename> class InputSequence, class T, class U, class C>
+struct MapResultType<InputSequence<T>, U(C::*)() const noexcept>
+{
+ typedef InputSequence<U> ResultType;
+};
+#endif
+
#endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER
template <class MapFunctor>
@@ -289,6 +358,21 @@ struct MapResultType<QStringList, U(C::*)() const>
typedef QList<U> ResultType;
};
+#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
+
+template <class U, class V>
+struct MapResultType<QStringList, U (*)(V) noexcept>
+{
+ typedef QList<U> ResultType;
+};
+
+template <class U, class C>
+struct MapResultType<QStringList, U(C::*)() const noexcept>
+{
+ typedef QList<U> ResultType;
+};
+#endif
+
} // namespace QtPrivate.
#endif //Q_QDOC
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
index 1c7f9d4b54..4bdaa4d657 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp
@@ -55,6 +55,6 @@ QRect r2(QPoint(100, 200), QSize(11, 16));
//! [1]
-QRectF r1(100, 200, 11, 16);
-QRectF r2(QPoint(100, 200), QSize(11, 16));
+QRectF r1(100.0, 200.1, 11.2, 16.3);
+QRectF r2(QPointF(100.0, 200.1), QSizeF(11.2, 16.3));
//! [1]
diff --git a/src/corelib/global/qfeatures.txt b/src/corelib/global/qfeatures.txt
deleted file mode 100644
index 458f87ec16..0000000000
--- a/src/corelib/global/qfeatures.txt
+++ /dev/null
@@ -1,956 +0,0 @@
-# Generic entry format
-#Feature: UPPERCASENAME (for the #define)
-#Description: One sentence description of what this does.
-#Section: Categorization
-#Requires: UPPERCASENAME...
-#Name: CamelCaseName (often a class name)
-#SeeAlso: UPPERCASENAME... (currently unused)
-
-# Kernel
-
-Feature: PROPERTIES
-Description: Supports scripting Qt-based applications.
-Section: Kernel
-Requires:
-Name: Properties
-
-Feature: TEXTHTMLPARSER
-Description: Parser for HTML
-Section: Kernel
-Requires:
-Name: HtmlParser
-
-Feature: TEXTODFWRITER
-Description: Provides an ODF writer
-Section: Kernel
-Requires: XMLSTREAMWRITER
-Name: OdfWriter
-
-Feature: CSSPARSER
-Description: Parser for Style Sheets
-Section: Kernel
-Requires:
-Name: CssParser
-
-Feature: REGULAREXPRESSION
-Description: Perl-compatible regular expression APIs
-Section: Kernel
-Requires:
-Name: QRegularExpression
-
-Feature: CONCURRENT
-Description: Provides a high-level multi-threaded APIs
-Section: Kernel
-Requires:
-Name: QtConcurrent
-
-Feature: DRAGANDDROP
-Description: Supports the drag and drop mechansim.
-Section: Kernel
-Requires: IMAGEFORMAT_XPM
-Name: Drag and drop
-
-Feature: SESSIONMANAGER
-Description: Supports session management.
-Section: Kernel
-Requires:
-Name: Session Manager
-
-Feature: SHORTCUT
-Description: Supports keyboard accelerators and shortcuts.
-Section: Kernel
-Requires:
-Name: QShortcut
-
-Feature: ACTION
-Description: Supports widget actions.
-Section: Kernel
-Requires:
-Name: QAction
-
-Feature: CURSOR
-Description: Supports mouse cursors.
-Section: Kernel
-Requires:
-Name: QCursor
-
-Feature: CLIPBOARD
-Description: Supports cut and paste operations.
-Section: Kernel
-Requires:
-Name: QClipboard
-
-Feature: WHEELEVENT
-Description: Supports wheel events.
-Section: Kernel
-Requires:
-Name: QWheelEvent
-
-Feature: TABLETEVENT
-Description: Supports tablet events.
-Section: Kernel
-Requires:
-Name: QTabletEvent
-
-Feature: EFFECTS
-Description: Supports special widget effects (e.g. fading and scrolling).
-Section: Kernel
-Requires:
-Name: Effects
-
-Feature: SHAREDMEMORY
-Description: Provides access to a shared memory segment.
-Section: Kernel
-Requires:
-Name: QSharedMemory
-
-Feature: SYSTEMSEMAPHORE
-Description: Provides a general counting system semaphore.
-Section: Kernel
-Requires: SHAREDMEMORY
-Name: QSystemSemaphore
-
-Feature: XMLSTREAM
-Description: Provides a simple streaming API for XML.
-Section: Kernel
-Requires:
-Name: XML Streaming APIs
-
-Feature: XMLSTREAMREADER
-Description: Provides a well-formed XML parser with a simple streaming API.
-Section: Kernel
-Requires: XMLSTREAM
-Name: QXmlStreamReader
-
-Feature: XMLSTREAMWRITER
-Description: Provides a XML writer with a simple streaming API.
-Section: Kernel
-Requires: XMLSTREAM
-Name: QXmlStreamWriter
-
-Feature: IM
-Description: Inputmethods with QInputContext
-Section: Kernel
-Requires: LIBRARY
-Name: QInputContext
-
-# Data structures
-
-Feature: TEXTDATE
-Description: Supports month and day names in dates.
-Section: Data structures
-Requires:
-Name: Text Date
-
-Feature: DATESTRING
-Description: Supports convertion between dates and strings.
-Section: Data structures
-Requires: TEXTDATE
-Name: QDate/QTime/QDateTime
-
-# File I/O
-
-Feature: PROCESS
-Description: Supports external process invocation.
-Section: File I/O
-Requires:
-Name: QProcess
-
-Feature: TEMPORARYFILE
-Description: Provides an I/O device that operates on temporary files.
-Section: File I/O
-Requires:
-Name: QTemporaryFile
-
-Feature: LIBRARY
-Description: Supports a shared library wrapper.
-Section: File I/O
-Requires:
-Name: QLibrary
-
-Feature: SETTINGS
-Description: Supports persistent application settings.
-Section: File I/O
-Requires:
-Name: QSettings
-
-Feature: DOM
-Description: Supports the Document Object Model.
-Section: File I/O
-Requires:
-Name: Document Object Model
-
-Feature: FILESYSTEMMODEL
-Description: Provides a data model for the local filesystem.
-Section: File I/O
-Requires:
-Name: QFileSystemModel
-
-Feature: FILESYSTEMWATCHER
-Description: Provides an interface for monitoring files and directories for modications.
-Section: File I/O
-Requires:
-Name: QFileSystemWatcher
-
-Feature: FILESYSTEMITERATOR
-Description: Provides fast file-system iteration.
-Section: File I/O
-Requires:
-Name: QFileSystemIterator
-
-# Widgets
-
-Feature: TREEWIDGET
-Description: Supports views using tree models.
-Section: Widgets
-Requires: TREEVIEW
-Name: QTreeWidget
-
-Feature: LISTWIDGET
-Description: Supports item-based list widgets.
-Section: Widgets
-Requires: LISTVIEW
-Name: QListWidget
-
-Feature: TABLEWIDGET
-Description: Supports item-based table views.
-Section: Widgets
-Requires: TABLEVIEW
-Name: QTableWidget
-
-Feature: DATETIMEEDIT
-Description: Supports editing dates and times.
-Section: Widgets
-Requires: CALENDARWIDGET DATESTRING
-Name: QDateTimeEdit
-
-Feature: STACKEDWIDGET
-Description: Supports stacked widgets.
-Section: Widgets
-Requires:
-Name: QStackedWidget
-
-Feature: TEXTBROWSER
-Description: Supports HTML document browsing.
-Section: Widgets
-Requires: TEXTEDIT
-Name: QTextBrowser
-
-Feature: SPLASHSCREEN
-Description: Supports splash screens that can be shown during application startup.
-Section: Widgets
-Requires:
-Name: Splash screen widget
-
-Feature: SPLITTER
-Description: Supports user controlled splitter widgets.
-Section: Widgets
-Requires: RUBBERBAND
-Name: QSplitter
-
-Feature: LCDNUMBER
-Description: Supports LCD-like digits.
-Section: Widgets
-Requires:
-Name: QLCDNumber
-
-Feature: MENU
-Description: Supports popup-menus.
-Section: Widgets
-Requires: ACTION
-Name: QMenu
-
-Feature: LINEEDIT
-Description: Supports single-line edits.
-Section: Widgets
-Requires:
-Name: QLineEdit
-
-Feature: SPINBOX
-Description: Supports spin boxes handling integers and discrete sets of values.
-Section: Widgets
-Requires: SPINWIDGET LINEEDIT VALIDATOR
-Name: QSpinBox
-
-Feature: TABBAR
-Description: Supports tab bars, e.g. for use in tabbed dialogs.
-Section: Widgets
-Requires: TOOLBUTTON
-Name: QTabBar
-
-Feature: TABWIDGET
-Description: Supports stacking tabbed widgets.
-Section: Widgets
-Requires: TABBAR STACKEDWIDGET
-Name: QTabWidget
-
-Feature: COMBOBOX
-Description: Supports comboboxes presenting a list of options to the user.
-Section: Widgets
-Requires: LINEEDIT STANDARDITEMMODEL LISTVIEW
-Name: QComboBox
-
-Feature: FONTCOMBOBOX
-Description: Supports a combobox that lets the user select a font family.
-Section: Widgets
-Requires: COMBOBOX STRINGLISTMODEL
-Name: QFontComboBox
-
-Feature: TOOLBUTTON
-Description: Supports quick-access buttons to commands and options.
-Section: Widgets
-Requires: ACTION
-Name: QToolButton
-
-Feature: TOOLBAR
-Description: Supports movable panels containing a set of controls.
-Section: Widgets
-Requires: MAINWINDOW
-Name: QToolBar
-
-Feature: TOOLBOX
-Description: Supports columns of tabbed widget items.
-Section: Widgets
-Requires: TOOLBUTTON SCROLLAREA
-Name: QToolBox
-
-Feature: GROUPBOX
-Description: Supports group box frames.
-Section: Widgets
-Requires:
-Name: QGroupBox
-
-Feature: BUTTONGROUP
-Description: Supports organizing groups of button widgets.
-Section: Widgets
-Requires: GROUPBOX
-Name: QButtonGroup
-
-Feature: MAINWINDOW
-Description: Supports main application windows.
-Section: Widgets
-Requires: MENU RESIZEHANDLER TOOLBUTTON
-Name: QMainWindow
-
-Feature: DOCKWIDGET
-Description: Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop.
-Section: Widgets
-Requires: RUBBERBAND MAINWINDOW
-Name: QDockwidget
-
-Feature: MDIAREA
-Description: Provides an area in which MDI windows are displayed.
-Section: Widgets
-Requires: SCROLLAREA
-Name: QMdiArea
-
-Feature: RESIZEHANDLER
-Description: Supports an internal resize handler.
-Section: Widgets
-Requires:
-Name: Resize Handler
-
-Feature: STATUSBAR
-Description: Supports presentation of status information.
-Section: Widgets
-Requires:
-Name: QStatusBar
-
-Feature: MENUBAR
-Description: Supports pull-down menu items.
-Section: Widgets
-Requires: MENU TOOLBUTTON
-Name: QMenuBar
-
-Feature: CONTEXTMENU
-Description: Supports pop-up menus on right mouse click
-Section: Widgets
-Requires: MENU
-Name: Context menu
-
-Feature: PROGRESSBAR
-Description: Supports presentation of operation progress.
-Section: Widgets
-Requires:
-Name: QProgressBar
-
-Feature: SLIDER
-Description: Supports sliders controlling a bounded value.
-Section: Widgets
-Requires:
-Name: QSlider
-
-Feature: SCROLLBAR
-Description: Supports scrollbars allowing the user access parts of a document that is larger than the widget used to display it.
-Section: Widgets
-Requires: SLIDER
-Name: QScrollBar
-
-Feature: DIAL
-Description: Supports rounded range control, e.g. like a speedometer.
-Section: Widgets
-Requires: SLIDER
-Name: QDial
-
-Feature: SCROLLAREA
-Description: Supports scrolling views onto widgets.
-Section: Widgets
-Requires: SCROLLBAR
-Name: QScrollArea
-
-Feature: GRAPHICSVIEW
-Description: Supports the graphicsview classes.
-Section: Widgets
-Requires: SCROLLAREA
-Name: QGraphicsView
-
-Feature: GRAPHICSEFFECT
-Description: Supports the graphicseffect classes.
-Section: Widgets
-Requires: GRAPHICSVIEW
-Name: QGraphicsEffect
-
-Feature: SPINWIDGET
-Description: Supports spinbox control widgets.
-Section: Widgets
-Requires:
-Name: Spin Widget
-
-Feature: TEXTEDIT
-Description: Supports rich text editing.
-Section: Widgets
-Requires: SCROLLAREA PROPERTIES
-Name: QTextEdit
-
-Feature: SYNTAXHIGHLIGHTER
-Description: Supports custom syntax highlighting.
-Section: Widgets
-Requires: TEXTEDIT
-Name: QSyntaxHighlighter
-
-Feature: RUBBERBAND
-Description: Supports using rubberbands to indicate selections and boundaries.
-Section: Widgets
-Requires:
-Name: QRubberBand
-
-Feature: TOOLTIP
-Description: Supports presentation of tooltips.
-Section: Widgets
-Requires:
-Name: QToolTip
-
-Feature: STATUSTIP
-Description: Supports status tip functionality and events.
-Section: Widgets
-Requires:
-Name: Status Tip
-
-Feature: WHATSTHIS
-Description: Supports displaying "What's this" help.
-Section: Widgets
-Requires: TOOLBUTTON
-Name: QWhatsThis
-
-Feature: VALIDATOR
-Description: Supports validation of input text.
-Section: Widgets
-Requires:
-Name: QValidator
-
-Feature: SIZEGRIP
-Description: Supports corner-grips for resizing a top-level windows.
-Section: Widgets
-Requires:
-Name: QSizeGrip
-
-Feature: CALENDARWIDGET
-Description: Provides a monthly based calendar widget allowing the user to select a date.
-Section: Widgets
-Requires: TABLEVIEW MENU TEXTDATE SPINBOX TOOLBUTTON
-Name: QCalendarWidget
-
-Feature: PRINTPREVIEWWIDGET
-Description: Provides a widget for previewing page layouts for printer output.
-Section: Widgets
-Requires: GRAPHICSVIEW PRINTER MAINWINDOW
-Name: QPrintPreviewWidget
-
-Feature: KEYSEQUENCEEDIT
-Description: Provides a widget for editing QKeySequences
-Section: Widgets
-Requires: LINEEDIT SHORTCUT
-Name: QKeySequenceEdit
-
-# Dialogs
-
-Feature: MESSAGEBOX
-Description: Supports message boxes displaying
-informative messages and simple questions.
-Section: Dialogs
-Requires:
-Name: QMessageBox
-
-Feature: COLORDIALOG
-Description: Supports a dialog widget for specifying colors.
-Section: Dialogs
-Requires: SPINBOX
-Name: QColorDialog
-
-Feature: FILEDIALOG
-Description: Supports a dialog widget for selecting files or directories.
-Section: Dialogs
-Requires: FILESYSTEMMODEL TREEVIEW COMBOBOX TOOLBUTTON BUTTONGROUP TOOLTIP SPLITTER STACKEDWIDGET PROXYMODEL
-Name: QFileDialog
-
-Feature: FONTDIALOG
-Description: Supports a dialog widget for selecting fonts.
-Section: Dialogs
-Requires: STRINGLISTMODEL COMBOBOX VALIDATOR GROUPBOX
-Name: QFontDialog
-
-Feature: PRINTDIALOG
-Description: Supports a dialog widget for specifying printer configuration.
-Section: Dialogs
-Requires: PRINTER COMBOBOX BUTTONGROUP SPINBOX TABWIDGET
-Name: QPrintDialog
-
-Feature: PRINTPREVIEWDIALOG
-Description: Provides a dialog for previewing and configuring page layouts for printer output.
-Section: Dialogs
-Requires: PRINTPREVIEWWIDGET PRINTDIALOG TOOLBAR
-Name: QPrintPreviewDialog
-
-Feature: PROGRESSDIALOG
-Description: Supports feedback on the progress of a slow operation.
-Section: Dialogs
-Requires: PROGRESSBAR
-Name: QProgressDialog
-
-Feature: INPUTDIALOG
-Description: Supports a simple convenience dialog to get a single value from the user.
-Section: Dialogs
-Requires: COMBOBOX SPINBOX STACKEDWIDGET
-Name: QInputDialog
-
-Feature: ERRORMESSAGE
-Description: Supports an error message display dialog.
-Section: Dialogs
-Requires: TEXTEDIT
-Name: QErrorMessage
-
-Feature: WIZARD
-Description: Provides a framework for wizards.
-Section: Dialogs
-Requires: PROPERTIES
-Name: QWizard
-
-# ItemViews
-
-Feature: ITEMVIEWS
-Description: Supports the model/view architecture managing the relationship between data and the way it is presented to the user.
-Section: ItemViews
-Requires: RUBBERBAND SCROLLAREA
-Name: The Model/View Framework
-
-Feature: DIRMODEL
-Description: Supports a data model for the local filesystem.
-Section: ItemViews
-Requires: ITEMVIEWS FILESYSTEMMODEL
-Name: QDirModel
-
-Feature: STANDARDITEMMODEL
-Description: Supports a generic model for storing custom data.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QStandardItemModel
-
-Feature: PROXYMODEL
-Description: Supports processing of data passed between another model and a view.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QAbstractProxyModel
-
-Feature: SORTFILTERPROXYMODEL
-Description: Supports sorting and filtering of data passed between another model and a view.
-Section: ItemViews
-Requires: PROXYMODEL
-Name: QSortFilterProxyModel
-
-Feature: IDENTITYPROXYMODEL
-Description: Supports proxying a source model unmodified.
-Section: ItemViews
-Requires: PROXYMODEL
-Name: QIdentityProxyModel
-
-Feature: STRINGLISTMODEL
-Description: Supports a model that supplies strings to views.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QStringListModel
-
-Feature: LISTVIEW
-Description: Supports a list or icon view onto a model.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QListView
-
-Feature: TABLEVIEW
-Description: Supports a default model/view implementation of a table view.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QTableView
-
-Feature: TREEVIEW
-Description: Supports a default model/view implementation of a tree view.
-Section: ItemViews
-Requires: ITEMVIEWS
-Name: QTreeView
-
-Feature: DATAWIDGETMAPPER
-Description: Provides mapping between a section of a data model to widgets.
-Section: ItemViews
-Requires: ITEMVIEWS PROPERTIES
-Name: QDataWidgetMapper
-
-Feature: COLUMNVIEW
-Description: Provides a model/view implementation of a column view.
-Section: ItemViews
-Requires: LISTVIEW
-Name: QColumnView
-
-# Styles
-
-Feature: STYLE_WINDOWS
-Description: Supports a Microsoft Windows-like look and feel.
-Section: Styles
-Requires:
-Name: QWindowsStyle
-
-Feature: STYLE_FUSION
-Description: Supports a modern platform independent widget style.
-Section: Styles
-Requires: IMAGEFORMAT_XPM
-Name: QFusionStyle
-
-Feature: STYLE_WINDOWSXP
-Description: Supports a Microsoft WindowsXP-like look and feel.
-Section: Styles
-Requires: STYLE_WINDOWS
-Name: QWindowsXPStyle
-
-Feature: STYLE_WINDOWSVISTA
-Description: Supports a Microsoft WindowsVista-like look and feel.
-Section: Styles
-Requires: STYLE_WINDOWSXP
-Name: QWindowsVistaStyle
-
-Feature: STYLE_WINDOWSCE
-Description: WindowsCE look and feel
-Section: Styles
-Requires: STYLE_WINDOWS IMAGEFORMAT_XPM
-Name: QWindowsCEStyle
-
-Feature: STYLE_WINDOWSMOBILE
-Description: WindowsMobile look and feel
-Section: Styles
-Requires: STYLE_WINDOWS IMAGEFORMAT_XPM
-Name: QWindowsMobileStyle
-
-Feature: STYLE_STYLESHEET
-Description:
-Section: Styles
-Requires: STYLE_WINDOWS PROPERTIES CSSPARSER
-Name: QStyleSheetStyle
-
-# Images
-
-Feature: IMAGEFORMATPLUGIN
-Description: Supports writing an image format plugin.
-Section: Images
-Requires: LIBRARY
-Name: QImageIOPlugin
-
-Feature: MOVIE
-Description: Supports animated images.
-Section: Images
-Requires:
-Name: QMovie
-
-Feature: IMAGEFORMAT_BMP
-Description: Supports Microsoft's Bitmap image file format.
-Section: Images
-Requires:
-Name: BMP Image Format
-
-Feature: IMAGEFORMAT_PPM
-Description: Supports the Portable Pixmap image file format.
-Section: Images
-Requires:
-Name: PPM Image Format
-
-Feature: IMAGEFORMAT_XBM
-Description: Supports the X11 Bitmap image file format.
-Section: Images
-Requires:
-Name: XBM Image Format
-
-Feature: IMAGEFORMAT_XPM
-Description: Supports the X11 Pixmap image file format.
-Section: Images
-Requires:
-Name: XPM Image Format
-
-Feature: IMAGEFORMAT_PNG
-Description: Supports the Portable Network Graphics image file format.
-Section: Images
-Requires:
-Name: PNG Image Format
-
-Feature: IMAGEFORMAT_JPEG
-Description: Supports the Joint Photographic Experts Group image file format.
-Section: Images
-Requires:
-Name: JPEG Image Format
-
-Feature: IMAGE_HEURISTIC_MASK
-Description: Supports creating a 1-bpp heuristic mask for images.
-Section: Images
-Requires:
-Name: QImage::createHeuristicMask()
-
-Feature: IMAGE_TEXT
-Description: Supports image file text strings.
-Section: Images
-Requires:
-Name: Image Text
-
-# Painting
-
-Feature: PICTURE
-Description: Supports recording and replaying QPainter commands.
-Section: Painting
-Requires:
-Name: QPicture
-
-Feature: COLORNAMES
-Description: Supports color names such as "red", used by QColor and by some HTML documents.
-Section: Painting
-Requires:
-Name: Color Names
-
-Feature: PDF
-Description: Supports pdf format
-Section: Painting
-Requires: TEMPORARYFILE
-Name: QPdf
-
-Feature: PRINTER
-Description: Supports printing
-Section: Painting
-Requires: PICTURE TEMPORARYFILE PDF
-Name: QPrinter
-
-Feature: CUPS
-Description Supports the Common UNIX Printing System
-Section: Painting
-Requires: PRINTER LIBRARY
-Name: Common UNIX Printing System
-
-Feature: PAINT_DEBUG
-Description: Debug painting with the environment variables QT_FLUSH_UPDATE and QT_FLUSH_PAINT
-Section: Painting
-Requires:
-Name: Painting Debug Utilities
-
-# Fonts
-
-Feature: FREETYPE
-Description: Supports the FreeType 2 font engine (and its supported font formats).
-Section: Fonts
-Requires:
-Name: Freetype Font Engine
-
-# Internationalization
-
-Feature: TRANSLATION
-Description: Supports translations using QObject::tr().
-Section: Internationalization
-Requires:
-Name: Translation
-
-Feature: TEXTCODEC
-Description: Supports conversions between text encodings.
-Section: Internationalization
-Requires:
-Name: QTextCodec
-
-Feature: CODECS
-Description: Supports non-unicode text conversions.
-Section: Internationalization
-Requires: TEXTCODEC
-Name: Codecs
-
-Feature: BIG_CODECS
-Description: Supports big codecs, e.g. CJK.
-Section: Internationalization
-Requires: TEXTCODEC
-Name: Big Codecs
-
-Feature: ICONV
-Description: Supports conversions between text encodings using iconv.
-Section: Internationalization
-Requires: TEXTCODEC
-Name: iconv
-
-# Networking
-
-Feature: FTP
-Description: Supports FTP file access.
-Section: Networking
-Requires: TEXTDATE
-Name: File Transfer Protocol
-
-Feature: HTTP
-Description: Supports HTTP file access.
-Section: Networking
-Requires:
-Name: Hyper Text Transfer Protocol
-
-Feature: UDPSOCKET
-Description: Supports User Datagram Protocol sockets.
-Section: Networking
-Requires:
-Name: QUdpSocket
-
-Feature: NETWORKPROXY
-Description: Supports configuring network layer proxy support to the Qt network classes.
-Section: Networking
-Requires:
-Name: QNetworkProxy
-
-Feature: SOCKS5
-Description: Supports SOCKS v5 network proxy.
-Section: Networking
-Requires: NETWORKPROXY
-Name: SOCKS5
-
-Feature: NETWORKINTERFACE
-Description: Supports listing the host's IP addresses and network interfaces
-Section: Networking
-Requires:
-Name: QNetworkInterface
-
-Feature: NETWORKDISKCACHE
-Description: Supports a disk cache for network resources
-Section: Networking
-Requires: TEMPORARYFILE
-Name: QNetworkDiskCache
-
-Feature: BEARERMANAGEMENT
-Description: Provides bearer management support
-Section: Networking
-Requires: LIBRARY NETWORKINTERFACE PROPERTIES
-Name: Bearer Management
-
-Feature: LOCALSERVER
-Description: Supports a local socket based server
-Section: Networking
-Requires: TEMPORARYFILE
-Name: QLocalServer
-
-# Utilities
-
-Feature: COMPLETER
-Description: Provides completions based on an item model.
-Section: Utilities
-Requires: PROXYMODEL
-Name: QCompleter
-
-Feature: FSCOMPLETER
-Description: Provides completions based on an item model.
-Section: Utilities
-Requires: FILESYSTEMMODEL COMPLETER
-Name: QCompleter
-
-Feature: DESKTOPSERVICES
-Description: Provides methods for accessing common desktop services.
-Section: Utilities
-Requires:
-Name: QDesktopServices
-
-Feature: MIMETYPE
-Description: Describes types of file or data, represented by a MIME type string.
-Section: Utilities
-Requires:
-Name: QMimeType
-
-Feature: SYSTEMTRAYICON
-Description: Provides an icon for an application in the system tray.
-Section: Utilities
-Requires:
-Name: QSystemTrayIcon
-
-Feature: UNDOCOMMAND
-Description: Applies (redo or) undo of a single change in a document.
-Section: Utilities
-Requires:
-Name: QUndoCommand
-
-Feature: UNDOSTACK
-Description: Provides the ability to (redo or) undo a list of changes in a document.
-Section: Utilities
-Requires: UNDOCOMMAND
-Name: QUndoStack
-
-Feature: UNDOGROUP
-Description:
-Section: Utilities
-Requires: UNDOSTACK
-Name: QUndoGroup
-
-Feature: UNDOVIEW
-Description: A widget which shows the contents of an undo stack.
-Section: Utilities
-Requires: UNDOSTACK LISTVIEW
-Name: QUndoView
-
-Feature: ACCESSIBILITY
-Description: Provides accessibility support.
-Section: Utilities
-Requires: PROPERTIES MENUBAR
-Name: Accessibility
-
-Feature: ANIMATION
-Description: Provides a framework for animations.
-Section: Utilities
-Requires: PROPERTIES
-Name: Animation
-
-Feature: STATEMACHINE
-Description: Provides hierarchical finite state machines.
-Section: Utilities
-Requires: PROPERTIES
-Name: State machine
-
-Feature: GESTURES
-Description: Provides a framework for gestures.
-Section: Utilities
-Requires:
-Name: Gesture
-
-# D-Bus
-
-Feature: DBUS
-Description: Provides classes for D-Bus.
-Section: D-Bus
-Requires: PROPERTIES XMLSTREAMREADER
-Name: Qt D-Bus module
-
-# XML Patterns
-
-Feature: XMLSCHEMA
-Description: Provides XML schema validation.
-Section: Xml Patterns
-Requires:
-Name: XML Schema APIs
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 40eadfb3e6..3cb412e47c 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -553,45 +553,75 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
return data.hasFlags(what);
}
+// Note: if \a shouldMkdirFirst is false, we assume the caller did try to mkdir
+// before calling this function.
+static bool createDirectoryWithParents(const QByteArray &nativeName, bool shouldMkdirFirst = true)
+{
+ // helper function to check if a given path is a directory, since mkdir can
+ // fail if the dir already exists (it may have been created by another
+ // thread or another process)
+ const auto isDir = [](const QByteArray &nativeName) {
+ QT_STATBUF st;
+ return QT_STAT(nativeName.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR;
+ };
+
+ if (shouldMkdirFirst && QT_MKDIR(nativeName, 0777) == 0)
+ return true;
+ if (errno == EEXIST)
+ return isDir(nativeName);
+ if (errno != ENOENT)
+ return false;
+
+ // mkdir failed because the parent dir doesn't exist, so try to create it
+ int slash = nativeName.lastIndexOf('/');
+ if (slash < 1)
+ return false;
+
+ QByteArray parentNativeName = nativeName.left(slash);
+ if (!createDirectoryWithParents(parentNativeName))
+ return false;
+
+ // try again
+ if (QT_MKDIR(nativeName, 0777) == 0)
+ return true;
+ return errno == EEXIST && isDir(nativeName);
+}
+
//static
bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
{
QString dirName = entry.filePath();
- if (createParents) {
- dirName = QDir::cleanPath(dirName);
- for (int oldslash = -1, slash=0; slash != -1; oldslash = slash) {
- slash = dirName.indexOf(QDir::separator(), oldslash+1);
- if (slash == -1) {
- if (oldslash == dirName.length())
- break;
- slash = dirName.length();
- }
- if (slash) {
- const QByteArray chunk = QFile::encodeName(dirName.left(slash));
- if (QT_MKDIR(chunk.constData(), 0777) != 0) {
- if (errno == EEXIST
-#if defined(Q_OS_QNX)
- // On QNX the QNet (VFS paths of other hosts mounted under a directory
- // such as /net) mountpoint returns ENOENT, despite existing. stat()
- // on the QNet mountpoint returns successfully and reports S_IFDIR.
- || errno == ENOENT
-#endif
- ) {
- QT_STATBUF st;
- if (QT_STAT(chunk.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR)
- continue;
- }
- return false;
- }
- }
- }
+
+ // Darwin doesn't support trailing /'s, so remove for everyone
+ while (dirName.size() > 1 && dirName.endsWith(QLatin1Char('/')))
+ dirName.chop(1);
+
+ // try to mkdir this directory
+ QByteArray nativeName = QFile::encodeName(dirName);
+ if (QT_MKDIR(nativeName, 0777) == 0)
return true;
+ if (!createParents)
+ return false;
+
+ // we need the cleaned path in order to create the parents
+ // and we save errno just in case encodeName needs to load codecs
+ int savedErrno = errno;
+ bool pathChanged;
+ {
+ QString cleanName = QDir::cleanPath(dirName);
+
+ // Check if the cleaned name is the same or not. If we were given a
+ // path with resolvable "../" sections, cleanPath will remove them, but
+ // this may change the target dir if one of those segments was a
+ // symlink. This operation depends on cleanPath's optimization of
+ // returning the original string if it didn't modify anything.
+ pathChanged = !dirName.isSharedWith(cleanName);
+ if (pathChanged)
+ nativeName = QFile::encodeName(cleanName);
}
-#if defined(Q_OS_DARWIN) // Mac X doesn't support trailing /'s
- if (dirName.endsWith(QLatin1Char('/')))
- dirName.chop(1);
-#endif
- return (QT_MKDIR(QFile::encodeName(dirName).constData(), 0777) == 0);
+
+ errno = savedErrno;
+ return createDirectoryWithParents(nativeName, pathChanged);
}
//static
diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp
index b8d1919ee6..4f7bc95330 100644
--- a/src/corelib/io/qloggingregistry.cpp
+++ b/src/corelib/io/qloggingregistry.cpp
@@ -276,10 +276,11 @@ static QVector<QLoggingRule> loadRulesFromFile(const QString &filePath)
*/
void QLoggingRegistry::init()
{
+ QVector<QLoggingRule> er, qr, cr;
// get rules from environment
const QByteArray rulesFilePath = qgetenv("QT_LOGGING_CONF");
if (!rulesFilePath.isEmpty())
- envRules = loadRulesFromFile(QFile::decodeName(rulesFilePath));
+ er = loadRulesFromFile(QFile::decodeName(rulesFilePath));
const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n');
if (!rulesSrc.isEmpty()) {
@@ -287,7 +288,7 @@ void QLoggingRegistry::init()
QLoggingSettingsParser parser;
parser.setSection(QStringLiteral("Rules"));
parser.setContent(stream);
- envRules += parser.rules();
+ er += parser.rules();
}
const QString configFileName = QStringLiteral("qtlogging.ini");
@@ -296,17 +297,22 @@ void QLoggingRegistry::init()
// get rules from Qt data configuration path
const QString qtConfigPath
= QDir(QLibraryInfo::location(QLibraryInfo::DataPath)).absoluteFilePath(configFileName);
- qtConfigRules = loadRulesFromFile(qtConfigPath);
+ qr = loadRulesFromFile(qtConfigPath);
#endif
// get rules from user's/system configuration
const QString envPath = QStandardPaths::locate(QStandardPaths::GenericConfigLocation,
QString::fromLatin1("QtProject/") + configFileName);
if (!envPath.isEmpty())
- configRules = loadRulesFromFile(envPath);
+ cr = loadRulesFromFile(envPath);
+
+ const QMutexLocker locker(&registryMutex);
+
+ envRules = std::move(er);
+ qtConfigRules = std::move(qr);
+ configRules = std::move(cr);
if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) {
- QMutexLocker locker(&registryMutex);
updateRules();
}
}
@@ -347,11 +353,11 @@ void QLoggingRegistry::setApiRules(const QString &content)
parser.setSection(QStringLiteral("Rules"));
parser.setContent(content);
- QMutexLocker locker(&registryMutex);
-
if (qtLoggingDebug())
debugMsg("Loading logging rules set by QLoggingCategory::setFilterRules ...");
+ const QMutexLocker locker(&registryMutex);
+
apiRules = parser.rules();
updateRules();
@@ -405,6 +411,8 @@ QLoggingRegistry *QLoggingRegistry::instance()
/*!
\internal
Updates category settings according to rules.
+
+ As a category filter, it is run with registryMutex held.
*/
void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat)
{
diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h
index 5197da1ba4..23740c4955 100644
--- a/src/corelib/io/qloggingregistry_p.h
+++ b/src/corelib/io/qloggingregistry_p.h
@@ -129,6 +129,7 @@ private:
QMutex registryMutex;
+ // protected by mutex:
QVector<QLoggingRule> qtConfigRules;
QVector<QLoggingRule> configRules;
QVector<QLoggingRule> envRules;
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index fcdf13fddb..aa69e9e1db 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -844,7 +844,8 @@ static bool startDetachedUacPrompt(const QString &programIn, const QStringList &
SHELLEXECUTEINFOW shellExecuteExInfo;
memset(&shellExecuteExInfo, 0, sizeof(SHELLEXECUTEINFOW));
shellExecuteExInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
- shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI;
+ shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI | SEE_MASK_CLASSNAME;
+ shellExecuteExInfo.lpClass = L"exefile";
shellExecuteExInfo.lpVerb = L"runas";
const QString program = QDir::toNativeSeparators(programIn);
shellExecuteExInfo.lpFile = reinterpret_cast<LPCWSTR>(program.utf16());
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index a6372b75f6..18ad59f1cb 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -4169,10 +4169,10 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto
return url;
}
- QUrl url = QUrl(trimmedString, QUrl::TolerantMode);
+ QUrl url = QUrl(userInput, QUrl::TolerantMode);
// Check both QUrl::isRelative (to detect full URLs) and QDir::isAbsolutePath (since on Windows drive letters can be interpreted as schemes)
- if (url.isRelative() && !QDir::isAbsolutePath(trimmedString)) {
- QFileInfo fileInfo(QDir(workingDirectory), trimmedString);
+ if (url.isRelative() && !QDir::isAbsolutePath(userInput)) {
+ QFileInfo fileInfo(QDir(workingDirectory), userInput);
if ((options & AssumeLocalFile) || fileInfo.exists())
return QUrl::fromLocalFile(fileInfo.absoluteFilePath());
}
diff --git a/src/corelib/kernel/qeventdispatcher_cf.mm b/src/corelib/kernel/qeventdispatcher_cf.mm
index 27eb3d0337..608dea5426 100644
--- a/src/corelib/kernel/qeventdispatcher_cf.mm
+++ b/src/corelib/kernel/qeventdispatcher_cf.mm
@@ -44,7 +44,6 @@
#include <QtCore/qthread.h>
#include <QtCore/private/qcoreapplication_p.h>
#include <QtCore/private/qcore_unix_p.h>
-#include <QtCore/private/qcore_mac_p.h>
#include <QtCore/private/qthread_p.h>
#include <limits>
@@ -59,11 +58,13 @@
QT_USE_NAMESPACE
-@interface RunLoopModeTracker : NSObject {
+@interface QT_MANGLE_NAMESPACE(RunLoopModeTracker) : NSObject {
QStack<CFStringRef> m_runLoopModes;
}
@end
+QT_NAMESPACE_ALIAS_OBJC_CLASS(RunLoopModeTracker);
+
@implementation RunLoopModeTracker
- (id) init
diff --git a/src/corelib/kernel/qeventdispatcher_cf_p.h b/src/corelib/kernel/qeventdispatcher_cf_p.h
index e6581e2bac..8a234ebc40 100644
--- a/src/corelib/kernel/qeventdispatcher_cf_p.h
+++ b/src/corelib/kernel/qeventdispatcher_cf_p.h
@@ -90,14 +90,11 @@
#include <QtCore/qabstracteventdispatcher.h>
#include <QtCore/private/qtimerinfo_unix_p.h>
#include <QtCore/private/qcfsocketnotifier_p.h>
+#include <QtCore/private/qcore_mac_p.h>
#include <QtCore/qdebug.h>
#include <CoreFoundation/CoreFoundation.h>
-#ifdef __OBJC__
-@class RunLoopModeTracker;
-#else
-typedef struct objc_object RunLoopModeTracker;
-#endif
+Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(RunLoopModeTracker));
QT_BEGIN_NAMESPACE
@@ -253,7 +250,7 @@ private:
RunLoopSource<> m_postedEventsRunLoopSource;
RunLoopObserver<> m_runLoopActivityObserver;
- RunLoopModeTracker *m_runLoopModeTracker;
+ QT_MANGLE_NAMESPACE(RunLoopModeTracker) *m_runLoopModeTracker;
QTimerInfoList m_timerInfoList;
CFRunLoopTimerRef m_runLoopTimer;
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index 959421bf52..5c0acce4c3 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -296,12 +296,15 @@ QMimeGlobMatchResult QMimeBinaryProvider::findByFileName(const QString &fileName
const QString lowerFileName = fileName.toLower();
// TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
+ // Check literals (e.g. "Makefile")
matchGlobList(result, cacheFile, cacheFile->getUint32(PosLiteralListOffset), fileName);
+ // Check complex globs (e.g. "callgrind.out[0-9]*")
matchGlobList(result, cacheFile, cacheFile->getUint32(PosGlobListOffset), fileName);
+ // Check the very common *.txt cases with the suffix tree
const int reverseSuffixTreeOffset = cacheFile->getUint32(PosReverseSuffixTreeOffset);
const int numRoots = cacheFile->getUint32(reverseSuffixTreeOffset);
const int firstRootOffset = cacheFile->getUint32(reverseSuffixTreeOffset + 4);
- matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, fileName.length() - 1, false);
+ matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, lowerFileName.length() - 1, false);
if (result.m_matchingMimeTypes.isEmpty())
matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, fileName, fileName.length() - 1, true);
}
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index 0876d141c4..70a934c976 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -57,11 +57,22 @@
#include "QtCore/qobject.h"
#include "QtCore/qstringlist.h"
#include "QtCore/qjsonobject.h"
+#include "QtCore/qjsondocument.h"
#include "QtCore/qmap.h"
+#include "QtCore/qendian.h"
#include "private/qlibrary_p.h"
QT_BEGIN_NAMESPACE
+inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
+{
+ raw += strlen("QTMETADATA ");
+ // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
+ // but doesn't include the size of the header (8 bytes)
+ QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
+ return QJsonDocument::fromBinaryData(json);
+}
+
class QFactoryLoaderPrivate;
class Q_CORE_EXPORT QFactoryLoader : public QObject
{
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 96cf5371f9..a4a654cd88 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -42,6 +42,7 @@
#ifndef QT_NO_LIBRARY
+#include "qfactoryloader_p.h"
#include "qlibrary_p.h"
#include <qstringlist.h>
#include <qfile.h>
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index f883e74843..7147ff6ca2 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -58,25 +58,12 @@
#include "QtCore/qstringlist.h"
#include "QtCore/qplugin.h"
#include "QtCore/qsharedpointer.h"
-#include "QtCore/qjsonobject.h"
-#include "QtCore/qjsondocument.h"
-#include "QtCore/qendian.h"
#ifdef Q_OS_WIN
# include "QtCore/qt_windows.h"
#endif
QT_BEGIN_NAMESPACE
-// Needed also in case of QT_NO_LIBRARY, for static plugin loading.
-inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
-{
- raw += strlen("QTMETADATA ");
- // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
- // but doesn't include the size of the header (8 bytes)
- QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
- return QJsonDocument::fromBinaryData(json);
-}
-
#ifndef QT_NO_LIBRARY
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index 4ec4e43952..6723877ad5 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -43,7 +43,7 @@
#include "qcoreapplication.h"
#include "qpluginloader.h"
#include <qfileinfo.h>
-#include "qlibrary_p.h"
+#include "qfactoryloader_p.h"
#include "qdebug.h"
#include "qdir.h"
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 6302a3a515..42befc4b80 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -392,13 +392,13 @@ bool QReadWriteLock::tryLockForWrite(int timeout)
*/
void QReadWriteLock::unlock()
{
- QReadWriteLockPrivate *d = d_ptr.load();
+ QReadWriteLockPrivate *d = d_ptr.loadAcquire();
while (true) {
Q_ASSERT_X(d, "QReadWriteLock::unlock()", "Cannot unlock an unlocked lock");
// Fast case: no contention: (no waiters, no other readers)
if (quintptr(d) <= 2) { // 1 or 2 (StateLockedForRead or StateLockedForWrite)
- if (!d_ptr.testAndSetRelease(d, nullptr, d))
+ if (!d_ptr.testAndSetOrdered(d, nullptr, d))
continue;
return;
}
@@ -407,7 +407,7 @@ void QReadWriteLock::unlock()
Q_ASSERT(quintptr(d) > (1U<<4)); //otherwise that would be the fast case
// Just decrease the reader's count.
auto val = reinterpret_cast<QReadWriteLockPrivate *>(quintptr(d) - (1U<<4));
- if (!d_ptr.testAndSetRelease(d, val, d))
+ if (!d_ptr.testAndSetOrdered(d, val, d))
continue;
return;
}
diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h
index c3efc41d62..a8d1132d06 100644
--- a/src/corelib/tools/qfreelist_p.h
+++ b/src/corelib/tools/qfreelist_p.h
@@ -237,7 +237,7 @@ inline int QFreeList<T, ConstantsType>::next()
int id, newid, at;
ElementType *v;
do {
- id = _next.load();
+ id = _next.loadAcquire();
at = id & ConstantsType::IndexMask;
const int block = blockfor(at);
@@ -254,7 +254,7 @@ inline int QFreeList<T, ConstantsType>::next()
}
newid = v[at].next.load() | (id & ~ConstantsType::IndexMask);
- } while (!_next.testAndSetRelaxed(id, newid));
+ } while (!_next.testAndSetRelease(id, newid));
// qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)",
// id & ConstantsType::IndexMask,
// newid & ConstantsType::IndexMask,
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index cdda5292e7..ae4befcb9c 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -594,7 +594,6 @@ static QLocalePrivate *c_private()
*/
QSystemLocale::QSystemLocale()
{
- delete _systemLocale;
_systemLocale = this;
if (system_data)
diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp
index 4b6183646b..895b6b9701 100644
--- a/src/corelib/tools/qrect.cpp
+++ b/src/corelib/tools/qrect.cpp
@@ -1323,8 +1323,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
rendering.
A QRectF can be constructed with a set of left, top, width and
- height integers, or from a QPoint and a QSize. The following code
- creates two identical rectangles.
+ height coordinates, or from a QPointF and a QSizeF. The following
+ code creates two identical rectangles.
\snippet code/src_corelib_tools_qrect.cpp 1
@@ -1344,7 +1344,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
translated copy of this rectangle.
The size() function returns the rectange's dimensions as a
- QSize. The dimensions can also be retrieved separately using the
+ QSizeF. The dimensions can also be retrieved separately using the
width() and height() functions. To manipulate the dimensions use
the setSize(), setWidth() or setHeight() functions. Alternatively,
the size can be changed by applying either of the functions
diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp
index 359c2d0bdb..ec2f7c4af6 100644
--- a/src/corelib/tools/qtimezone.cpp
+++ b/src/corelib/tools/qtimezone.cpp
@@ -674,9 +674,9 @@ bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const
QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
{
if (hasTransitions())
- return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
+ return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
else
- return d->invalidOffsetData();
+ return QTimeZonePrivate::invalidOffsetData();
}
/*!
@@ -712,9 +712,9 @@ bool QTimeZone::hasTransitions() const
QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
{
if (hasTransitions())
- return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
+ return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
else
- return d->invalidOffsetData();
+ return QTimeZonePrivate::invalidOffsetData();
}
/*!
@@ -733,9 +733,9 @@ QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime)
QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
{
if (hasTransitions())
- return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
+ return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
else
- return d->invalidOffsetData();
+ return QTimeZonePrivate::invalidOffsetData();
}
/*!
@@ -755,7 +755,7 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
toDateTime.toMSecsSinceEpoch());
list.reserve(plist.count());
for (const QTimeZonePrivate::Data &pdata : plist)
- list.append(d->toOffsetData(pdata));
+ list.append(QTimeZonePrivate::toOffsetData(pdata));
}
return list;
}
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index 25f5176c22..ae2c75e7df 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -146,15 +146,25 @@ public:
T value(int i, const T &defaultValue) const;
inline void append(const T &t) {
- if (s == a) // i.e. s != 0
+ if (s == a) { // i.e. s != 0
+ T copy(t);
realloc(s, s<<1);
- const int idx = s++;
- if (QTypeInfo<T>::isComplex) {
- new (ptr + idx) T(t);
+ const int idx = s++;
+ if (QTypeInfo<T>::isComplex) {
+ new (ptr + idx) T(std::move(copy));
+ } else {
+ ptr[idx] = std::move(copy);
+ }
} else {
- ptr[idx] = t;
+ const int idx = s++;
+ if (QTypeInfo<T>::isComplex) {
+ new (ptr + idx) T(t);
+ } else {
+ ptr[idx] = t;
+ }
}
}
+
void append(const T *buf, int size);
inline QVarLengthArray<T, Prealloc> &operator<<(const T &t)
{ append(t); return *this; }
diff --git a/src/gui/configure.json b/src/gui/configure.json
index 52ccb60024..4de560753d 100644
--- a/src/gui/configure.json
+++ b/src/gui/configure.json
@@ -161,9 +161,10 @@
"test": "unix/libpng",
"sources": [
{ "type": "pkgConfig", "args": "libpng" },
- { "libs": "-llibpng -lzdll", "condition": "config.msvc" },
- { "libs": "-lpng -lz", "condition": "!config.msvc" }
- ]
+ { "libs": "-llibpng", "condition": "config.msvc" },
+ { "libs": "-lpng", "condition": "!config.msvc" }
+ ],
+ "use": "zlib"
},
"mirclient": {
"label": "Mir client libraries",
diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp
index 7107c7c26e..7341fa8e83 100644
--- a/src/gui/text/qtextdocument_p.cpp
+++ b/src/gui/text/qtextdocument_p.cpp
@@ -265,7 +265,7 @@ void QTextDocumentPrivate::clear()
unreachableCharacterCount = 0;
modifiedState = 0;
modified = false;
- formats = QTextFormatCollection();
+ formats.clear();
int len = fragments.length();
fragments.clear();
blocks.clear();
diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp
index 39fec032dc..36e0a77bd0 100644
--- a/src/gui/text/qtextformat.cpp
+++ b/src/gui/text/qtextformat.cpp
@@ -3371,22 +3371,15 @@ QTextTableCellFormat::QTextTableCellFormat(const QTextFormat &fmt)
// ------------------------------------------------------
-
-QTextFormatCollection::QTextFormatCollection(const QTextFormatCollection &rhs)
-{
- formats = rhs.formats;
- objFormats = rhs.objFormats;
-}
-
-QTextFormatCollection &QTextFormatCollection::operator=(const QTextFormatCollection &rhs)
+QTextFormatCollection::~QTextFormatCollection()
{
- formats = rhs.formats;
- objFormats = rhs.objFormats;
- return *this;
}
-QTextFormatCollection::~QTextFormatCollection()
+void QTextFormatCollection::clear()
{
+ formats.clear();
+ objFormats.clear();
+ hashes.clear();
}
int QTextFormatCollection::indexForFormat(const QTextFormat &format)
diff --git a/src/gui/text/qtextformat_p.h b/src/gui/text/qtextformat_p.h
index f05bfaff71..3557c17a97 100644
--- a/src/gui/text/qtextformat_p.h
+++ b/src/gui/text/qtextformat_p.h
@@ -63,8 +63,7 @@ public:
QTextFormatCollection() {}
~QTextFormatCollection();
- QTextFormatCollection(const QTextFormatCollection &rhs);
- QTextFormatCollection &operator=(const QTextFormatCollection &rhs);
+ void clear();
inline QTextFormat objectFormat(int objectIndex) const
{ return format(objectFormatIndex(objectIndex)); }
@@ -104,6 +103,8 @@ public:
private:
QFont defaultFnt;
+
+ Q_DISABLE_COPY(QTextFormatCollection)
};
QT_END_NAMESPACE
diff --git a/src/network/configure.json b/src/network/configure.json
index 1e08aa7c49..7bd3f6164a 100644
--- a/src/network/configure.json
+++ b/src/network/configure.json
@@ -7,9 +7,6 @@
"commandline": {
"assignments": {
- "OPENSSL_LIBS": "openssl.libs",
- "OPENSSL_LIBS_DEBUG": "openssl.libs.debug",
- "OPENSSL_LIBS_RELEASE": "openssl.libs.release",
"OPENSSL_PATH": "openssl.prefix"
},
"options": {
@@ -46,13 +43,24 @@
"-lproxy"
]
},
+ "openssl_headers": {
+ "label": "OpenSSL Headers",
+ "export": "openssl",
+ "test": "unix/openssl",
+ "sources": [
+ {
+ "comment": "placeholder for OPENSSL_PATH",
+ "libs": ""
+ }
+ ]
+ },
"openssl": {
- "label": "OpenSSL Libraries",
- "export": "",
+ "label": "OpenSSL",
+ "test": "unix/openssl",
"sources": [
{ "type": "openssl" },
{
- "comment": "placeholder for OPENSSL_LIBS{,_{DEBUG,RELEASE}}",
+ "comment": "placeholder for OPENSSL_{PATH,LIBS{,_{DEBUG,RELEASE}}}",
"libs": "",
"builds": {
"debug": "",
@@ -92,11 +100,6 @@
"test": "unix/ipv6ifname",
"use": "network"
},
- "openssl": {
- "label": "OpenSSL",
- "type": "compile",
- "test": "unix/openssl"
- },
"sctp": {
"label": "SCTP support",
"type": "compile",
@@ -138,7 +141,7 @@
"enable": "input.openssl == 'yes' || input.openssl == 'linked' || input.openssl == 'runtime'",
"disable": "input.openssl == 'no' || input.ssl == 'no'",
"autoDetect": "!config.winrt",
- "condition": "!features.securetransport && tests.openssl",
+ "condition": "!features.securetransport && (features.openssl-linked || libs.openssl_headers)",
"output": [
"privateFeature",
{ "type": "publicQtConfig", "condition": "!features.openssl-linked" },
@@ -149,14 +152,9 @@
"label": " Qt directly linked to OpenSSL",
"enable": "input.openssl == 'linked'",
"disable": "input.openssl != 'linked'",
- "condition": "features.openssl && libs.openssl",
+ "condition": "!features.securetransport && libs.openssl",
"output": [
"privateFeature",
- { "type": "varAssign", "name": "OPENSSL_LIBS", "value": "libs.openssl.libs", "eval": "true" },
- { "type": "varAssign", "name": "OPENSSL_LIBS_DEBUG", "value": "libs.openssl.builds.debug.libs",
- "eval": "true", "condition": "config.win32" },
- { "type": "varAssign", "name": "OPENSSL_LIBS_RELEASE", "value": "libs.openssl.builds.release.libs",
- "eval": "true", "condition": "config.win32" },
{ "type": "define", "name": "QT_LINKED_OPENSSL" }
]
},
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index d1efc21e09..e140b33ce9 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -679,10 +679,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (interface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = interface.addressEntries();
- if (!addressEntries.isEmpty()) {
- QHostAddress firstIP = addressEntries.first().ip();
- mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
- } else {
+ bool found = false;
+ for (const QNetworkAddressEntry &entry : addressEntries) {
+ const QHostAddress ip = entry.ip();
+ if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
+ mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 80147b47ba..28aea6be3d 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -955,10 +955,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (iface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries();
- if (!addressEntries.isEmpty()) {
- QHostAddress firstIP = addressEntries.first().ip();
- mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
- } else {
+ bool found = false;
+ for (const QNetworkAddressEntry &entry : addressEntries) {
+ const QHostAddress ip = entry.ip();
+ if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
+ mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;
diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri
index 79351017a6..52ce2eeade 100644
--- a/src/network/ssl/ssl.pri
+++ b/src/network/ssl/ssl.pri
@@ -56,7 +56,7 @@ qtConfig(ssl) {
ssl/qsslellipticcurve_dummy.cpp
}
- qtConfig(openssl)|qtConfig(openssl-linked) {
+ qtConfig(openssl) {
HEADERS += ssl/qsslcontext_openssl_p.h \
ssl/qsslsocket_openssl_p.h \
ssl/qsslsocket_openssl_symbols_p.h
@@ -79,16 +79,10 @@ qtConfig(ssl) {
# - libs in <OPENSSL_DIR>\lib\VC\static
# - configure: -openssl -openssl-linked -I <OPENSSL_DIR>\include -L <OPENSSL_DIR>\lib\VC\static OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_DEBUG="-lssleay32MDd -llibeay32MDd" OPENSSL_LIBS_RELEASE="-lssleay32MD -llibeay32MD"
- include($$OUT_PWD/qtnetwork-config.pri)
-
- CONFIG(debug, debug|release) {
- LIBS_PRIVATE += $$OPENSSL_LIBS_DEBUG
- } else {
- LIBS_PRIVATE += $$OPENSSL_LIBS_RELEASE
- }
-
- QMAKE_CXXFLAGS += $$OPENSSL_CFLAGS
- LIBS_PRIVATE += $$OPENSSL_LIBS
+ qtConfig(openssl-linked): \
+ QMAKE_USE_FOR_PRIVATE += openssl
+ else: \
+ QMAKE_USE_FOR_PRIVATE += openssl/nolink
win32: LIBS_PRIVATE += -lcrypt32
}
}
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index 736c66ebc0..0a55f689c6 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -572,7 +572,8 @@ QString QIBusPlatformInputContextPrivate::getSocketPath()
if (debug)
qDebug() << "host=" << host << "displayNumber" << displayNumber;
- return QDir::homePath() + QLatin1String("/.config/ibus/bus/") +
+ return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) +
+ QLatin1String("/ibus/bus/") +
QLatin1String(QDBusConnection::localMachineId()) +
QLatin1Char('-') + QString::fromLocal8Bit(host) + QLatin1Char('-') + QString::fromLocal8Bit(displayNumber);
}
diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp
index d9ecdfac3d..d3810329c5 100644
--- a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp
+++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp
@@ -100,10 +100,6 @@ bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
bool ret = QEGLPlatformContext::makeCurrent(surface);
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
- const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
- if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0)
- ctx_d->workaround_missingPrecisionQualifiers = true;
-
if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround())
ctx_d->workaround_brokenFBOReadBack = true;
diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm
index de4fa95530..c71e80d191 100644
--- a/src/plugins/platforms/cocoa/qcocoadrag.mm
+++ b/src/plugins/platforms/cocoa/qcocoadrag.mm
@@ -201,6 +201,10 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const
dpr = sourceWindow->devicePixelRatio();
}
#endif
+ else {
+ if (const QWindow *focusWindow = qApp->focusWindow())
+ dpr = focusWindow->devicePixelRatio();
+ }
pm = QPixmap(width * dpr, height * dpr);
pm.setDevicePixelRatio(dpr);
QPainter p(&pm);
diff --git a/src/plugins/platforms/vnc/qvncclient.cpp b/src/plugins/platforms/vnc/qvncclient.cpp
index dae3e83f37..58dcfc9b51 100644
--- a/src/plugins/platforms/vnc/qvncclient.cpp
+++ b/src/plugins/platforms/vnc/qvncclient.cpp
@@ -142,7 +142,7 @@ void QVncClient::convertPixels(char *dst, const char *src, int count) const
case 16: {
quint16 p = *reinterpret_cast<const quint16*>(src);
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- if (swapBytes)
+ if (m_swapBytes)
p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8);
#endif
r = (p >> 11) & 0x1f;
@@ -484,7 +484,7 @@ void QVncClient::setPixelFormat()
m_sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!m_pixelFormat.bigEndian;
m_needConversion = pixelConversionNeeded();
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- m_swapBytes = qvnc_screen->swapBytes();
+ m_swapBytes = server()->screen()->swapBytes();
#endif
}
}
@@ -639,7 +639,7 @@ bool QVncClient::pixelConversionNeeded() const
return true;
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- if (qvnc_screen->swapBytes())
+ if (server()->screen()->swapBytes())
return true;
#endif
diff --git a/src/plugins/platforms/vnc/qvncscreen.cpp b/src/plugins/platforms/vnc/qvncscreen.cpp
index 91a8933dba..75c8bedff7 100644
--- a/src/plugins/platforms/vnc/qvncscreen.cpp
+++ b/src/plugins/platforms/vnc/qvncscreen.cpp
@@ -43,6 +43,7 @@
#include <QtFbSupport/private/qfbcursor_p.h>
#include <QtGui/QPainter>
+#include <QtGui/QScreen>
#include <QtCore/QRegularExpression>
@@ -172,14 +173,18 @@ QPixmap QVncScreen::grabWindow(WId wid, int x, int y, int width, int height) con
}
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
-bool QVNCScreen::swapBytes() const
+bool QVncScreen::swapBytes() const
{
+ return false;
+
+ /* TODO
if (depth() != 16)
return false;
if (screen())
return screen()->frameBufferLittleEndian();
return frameBufferLittleEndian();
+ */
}
#endif
diff --git a/src/plugins/platforms/vnc/qvncscreen.h b/src/plugins/platforms/vnc/qvncscreen.h
index c0a22ed140..b2dd89a2ed 100644
--- a/src/plugins/platforms/vnc/qvncscreen.h
+++ b/src/plugins/platforms/vnc/qvncscreen.h
@@ -75,7 +75,7 @@ public:
void clearDirty() { dirtyRegion = QRegion(); }
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- bool swapBytes() const
+ bool swapBytes() const;
#endif
QStringList mArgs;
diff --git a/src/sql/configure.json b/src/sql/configure.json
index 72671b6df9..45b3fd9dd1 100644
--- a/src/sql/configure.json
+++ b/src/sql/configure.json
@@ -8,7 +8,6 @@
"commandline": {
"assignments": {
"MYSQL_PATH": "mysql.prefix",
- "PSQL_LIBS": "psql.libs",
"SYBASE": "tds.prefix",
"SYBASE_LIBS": "tds.libs"
},
@@ -115,8 +114,10 @@
"test": "unix/sqlite",
"sources": [
{ "type": "pkgConfig", "args": "sqlite3" },
- { "libs": "-lsqlite3", "condition": "config.win32" },
- { "libs": "-lsqlite3 -lz", "condition": "!config.win32" }
+ "-lsqlite3"
+ ],
+ "use": [
+ { "lib": "zlib", "condition": "!config.win32" }
]
}
},
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index cc895e2c33..f884a1c279 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -6669,12 +6669,7 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt,
break;
}
case CT_Menu: {
- QStyleHintReturnMask menuMask;
- QStyleOption myOption = *opt;
- myOption.rect.setSize(sz);
- if (proxy()->styleHint(SH_Menu_Mask, &myOption, widget, &menuMask)) {
- sz = menuMask.region.boundingRect().size();
- }
+ sz = csz;
break; }
case CT_HeaderSection:{
const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt);
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index b33f2dc798..8d9280ebb5 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -2092,7 +2092,7 @@ void QDockAreaLayoutInfo::reparentWidgets(QWidget *parent)
const QDockAreaLayoutItem &item = item_list.at(i);
if (item.flags & QDockAreaLayoutItem::GapItem)
continue;
- if (!item.widgetItem && item.skip())
+ if (item.skip())
continue;
if (item.subinfo)
item.subinfo->reparentWidgets(parent);
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp
index aa5d809431..307a261a43 100644
--- a/src/widgets/widgets/qdockwidget.cpp
+++ b/src/widgets/widgets/qdockwidget.cpp
@@ -1026,6 +1026,12 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event)
}
}
+void QDockWidgetPrivate::recalculatePressPos(QResizeEvent *event)
+{
+ qreal ratio = event->oldSize().width() / (1.0 * event->size().width());
+ state->pressPos.setX(state->pressPos.x() / ratio);
+}
+
/*! \internal
Called when the QDockWidget or the QDockWidgetGroupWindow is moved
*/
@@ -1542,6 +1548,13 @@ bool QDockWidget::event(QEvent *event)
// if the mainwindow is plugging us, we don't want to update undocked geometry
if (isFloating() && layout != 0 && layout->pluggingWidget != this)
d->undockedGeometry = geometry();
+
+ // Usually the window won't get resized while it's being moved, but it can happen,
+ // for example on Windows when moving to a screen with bigger scale factor
+ // (and Qt::AA_EnableHighDpiScaling is enabled). If that happens we should
+ // update state->pressPos, otherwise it will be outside the window when the window shrinks.
+ if (d->state && d->state->dragging)
+ d->recalculatePressPos(static_cast<QResizeEvent*>(event));
break;
default:
break;
diff --git a/src/widgets/widgets/qdockwidget_p.h b/src/widgets/widgets/qdockwidget_p.h
index 94a3ad3b34..84bf8efacf 100644
--- a/src/widgets/widgets/qdockwidget_p.h
+++ b/src/widgets/widgets/qdockwidget_p.h
@@ -118,6 +118,7 @@ public:
void startDrag(bool group = true);
void endDrag(bool abort = false);
void moveEvent(QMoveEvent *event);
+ void recalculatePressPos(QResizeEvent *event);
void unplug(const QRect &rect);
void plug(const QRect &rect);
diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp
index 68ca571acf..640154063e 100644
--- a/src/widgets/widgets/qmainwindowlayout.cpp
+++ b/src/widgets/widgets/qmainwindowlayout.cpp
@@ -2195,10 +2195,8 @@ void QMainWindowLayout::animationFinished(QWidget *widget)
}
if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) {
- if (currentHoveredFloat) {
- dw->setParent(currentHoveredFloat);
- dw->show();
- }
+ dw->setParent(currentHoveredFloat ? currentHoveredFloat.data() : parentWidget());
+ dw->show();
dw->d_func()->plug(currentGapRect);
}
#endif
@@ -2380,7 +2378,8 @@ QLayoutItem *QMainWindowLayout::unplug(QWidget *widget, bool group)
// We are unplugging a dock widget from a floating window.
if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) {
dw->d_func()->unplug(widget->geometry());
- return 0;
+ int index = widget->parentWidget()->layout()->indexOf(widget);
+ return widget->parentWidget()->layout()->itemAt(index);
}
}
}
diff --git a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
index 3af207ae5a..fd8fd0a74a 100644
--- a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
+++ b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
@@ -3,3 +3,6 @@ TARGET = tst_qtconcurrentmap
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmap.cpp
DEFINES += QT_STRICT_ITERATORS
+
+# Force C++17 if available
+contains(QT_CONFIG, c++1z): CONFIG += c++1z
diff --git a/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp b/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp
index 25ac952396..96656a6dff 100644
--- a/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp
+++ b/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp
@@ -48,6 +48,7 @@ private slots:
void blocking_mappedReduced();
void assignResult();
void functionOverloads();
+ void noExceptFunctionOverloads();
#ifndef QT_NO_EXCEPTIONS
void exceptions();
#endif
@@ -2025,6 +2026,16 @@ int fn(int &i)
return i;
}
+int fnConstNoExcept(const int &i) Q_DECL_NOTHROW
+{
+ return i;
+}
+
+int fnNoExcept(int &i) Q_DECL_NOTHROW
+{
+ return i;
+}
+
QString changeTypeConst(const int &)
{
return QString();
@@ -2035,6 +2046,16 @@ QString changeType(int &)
return QString();
}
+QString changeTypeConstNoExcept(const int &) Q_DECL_NOTHROW
+{
+ return QString();
+}
+
+QString changeTypeNoExcept(int &) Q_DECL_NOTHROW
+{
+ return QString();
+}
+
int changeTypeQStringListConst(const QStringList &)
{
return 0;
@@ -2045,6 +2066,16 @@ int changeTypeQStringList(QStringList &)
return 0;
}
+int changeTypeQStringListConstNoExcept(const QStringList &) Q_DECL_NOTHROW
+{
+ return 0;
+}
+
+int changeTypeQStringListNoExcept(QStringList &) Q_DECL_NOTHROW
+{
+ return 0;
+}
+
class MemFnTester
{
public:
@@ -2069,6 +2100,26 @@ public:
{
return QString();
}
+
+ MemFnTester fnNoExcept() Q_DECL_NOTHROW
+ {
+ return MemFnTester();
+ }
+
+ MemFnTester fnConstNoExcept() const Q_DECL_NOTHROW
+ {
+ return MemFnTester();
+ }
+
+ QString changeTypeNoExcept() Q_DECL_NOTHROW
+ {
+ return QString();
+ }
+
+ QString changeTypeConstNoExcept() const Q_DECL_NOTHROW
+ {
+ return QString();
+ }
};
Q_DECLARE_METATYPE(QVector<MemFnTester>);
@@ -2097,6 +2148,29 @@ void tst_QtConcurrentMap::functionOverloads()
QtConcurrent::blockingMapped<QList<QString> >(constMemFnTesterList, &MemFnTester::changeTypeConst);
}
+void tst_QtConcurrentMap::noExceptFunctionOverloads()
+{
+ QList<int> intList;
+ const QList<int> constIntList;
+ QList<MemFnTester> classList;
+ const QList<MemFnTester> constMemFnTesterList;
+
+ QtConcurrent::mapped(intList, fnConstNoExcept);
+ QtConcurrent::mapped(constIntList, fnConstNoExcept);
+ QtConcurrent::mapped(classList, &MemFnTester::fnConstNoExcept);
+ QtConcurrent::mapped(constMemFnTesterList, &MemFnTester::fnConstNoExcept);
+
+ QtConcurrent::blockingMapped<QVector<int> >(intList, fnConstNoExcept);
+ QtConcurrent::blockingMapped<QVector<int> >(constIntList, fnConstNoExcept);
+ QtConcurrent::blockingMapped<QVector<MemFnTester> >(classList, &MemFnTester::fnConstNoExcept);
+ QtConcurrent::blockingMapped<QVector<MemFnTester> >(constMemFnTesterList, &MemFnTester::fnConstNoExcept);
+
+ QtConcurrent::blockingMapped<QList<QString> >(intList, changeTypeConstNoExcept);
+ QtConcurrent::blockingMapped<QList<QString> >(constIntList, changeTypeConstNoExcept);
+ QtConcurrent::blockingMapped<QList<QString> >(classList, &MemFnTester::changeTypeConstNoExcept);
+ QtConcurrent::blockingMapped<QList<QString> >(constMemFnTesterList, &MemFnTester::changeTypeConstNoExcept);
+}
+
QAtomicInt currentInstanceCount;
QAtomicInt peakInstanceCount;
class InstanceCounter
diff --git a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
index f60462f9ed..44891b7ba5 100644
--- a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
+++ b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
@@ -2,3 +2,6 @@ CONFIG += testcase
TARGET = tst_qtconcurrentrun
QT = core testlib concurrent
SOURCES = tst_qtconcurrentrun.cpp
+
+# Force C++17 if available
+contains(QT_CONFIG, c++1z): CONFIG += c++1z
diff --git a/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp b/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
index bd53aa69fe..4e3668d72e 100644
--- a/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
+++ b/tests/auto/concurrent/qtconcurrentrun/tst_qtconcurrentrun.cpp
@@ -123,6 +123,28 @@ public:
int operator()(int in) const { return in; }
};
+class ANoExcept
+{
+public:
+ int member0() Q_DECL_NOTHROW { return 10; }
+ int member1(int in) Q_DECL_NOTHROW { return in; }
+
+ typedef int result_type;
+ int operator()() Q_DECL_NOTHROW { return 10; }
+ int operator()(int in) Q_DECL_NOTHROW { return in; }
+};
+
+class AConstNoExcept
+{
+public:
+ int member0() const Q_DECL_NOTHROW { return 10; }
+ int member1(int in) const Q_DECL_NOTHROW { return in; }
+
+ typedef int result_type;
+ int operator()() const Q_DECL_NOTHROW { return 10; }
+ int operator()(int in) const Q_DECL_NOTHROW { return in; }
+};
+
void tst_QtConcurrentRun::returnValue()
{
QThreadPool pool;
@@ -214,6 +236,88 @@ void tst_QtConcurrentRun::returnValue()
QCOMPARE(f.result(), 20);
f = run(&pool, &aConst, 20);
QCOMPARE(f.result(), 20);
+
+ ANoExcept aNoExcept;
+ f = run(&aNoExcept, &ANoExcept::member0);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, &aNoExcept, &ANoExcept::member0);
+ QCOMPARE(f.result(), 10);
+
+ f = run(&aNoExcept, &ANoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, &aNoExcept, &ANoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(aNoExcept, &ANoExcept::member0);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, aNoExcept, &ANoExcept::member0);
+ QCOMPARE(f.result(), 10);
+
+ f = run(aNoExcept, &ANoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, aNoExcept, &ANoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(aNoExcept);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, aNoExcept);
+ QCOMPARE(f.result(), 10);
+
+ f = run(&aNoExcept);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, &aNoExcept);
+ QCOMPARE(f.result(), 10);
+
+ f = run(aNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, aNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(&aNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, &aNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+
+ const AConstNoExcept aConstNoExcept = AConstNoExcept();
+ f = run(&aConstNoExcept, &AConstNoExcept::member0);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, &aConstNoExcept, &AConstNoExcept::member0);
+ QCOMPARE(f.result(), 10);
+
+ f = run(&aConstNoExcept, &AConstNoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, &aConstNoExcept, &AConstNoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(aConstNoExcept, &AConstNoExcept::member0);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, aConstNoExcept, &AConstNoExcept::member0);
+ QCOMPARE(f.result(), 10);
+
+ f = run(aConstNoExcept, &AConstNoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, aConstNoExcept, &AConstNoExcept::member1, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(aConstNoExcept);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, aConstNoExcept);
+ QCOMPARE(f.result(), 10);
+
+ f = run(&aConstNoExcept);
+ QCOMPARE(f.result(), 10);
+ f = run(&pool, &aConstNoExcept);
+ QCOMPARE(f.result(), 10);
+
+ f = run(aConstNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, aConstNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+
+ f = run(&aConstNoExcept, 20);
+ QCOMPARE(f.result(), 20);
+ f = run(&pool, &aConstNoExcept, 20);
+ QCOMPARE(f.result(), 20);
}
struct TestClass
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index 49ee8eb32c..b64de488ed 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -353,7 +353,7 @@ void tst_QDir::mkdir_data()
<< QDir::currentPath() + "/testdir/two/three";
QTest::newRow("data0") << dirs.at(0) << true;
QTest::newRow("data1") << dirs.at(1) << false;
- QTest::newRow("data2") << dirs.at(2) << false;
+ QTest::newRow("data2") << dirs.at(2) << false; // note: requires data1 to have been run!
// Ensure that none of these directories already exist
QDir dir;
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 994427ba12..ee18151e4a 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -46,6 +46,7 @@ class tst_QUrl : public QObject
Q_OBJECT
private slots:
+ void initTestCase();
void effectiveTLDs_data();
void effectiveTLDs();
void getSetCheck();
@@ -182,8 +183,15 @@ private slots:
private:
void testThreadingHelper();
+
+ QTemporaryDir m_tempDir;
};
+void tst_QUrl::initTestCase()
+{
+ QVERIFY2(m_tempDir.isValid(), qPrintable(m_tempDir.errorString()));
+}
+
// Testing get/set functions
void tst_QUrl::getSetCheck()
{
@@ -3062,49 +3070,59 @@ void tst_QUrl::fromUserInputWithCwd_data()
// Null
QTest::newRow("null") << QString() << QString() << QUrl() << QUrl();
- // Existing file
- QDirIterator it(QDir::currentPath(), QDir::NoDotDot | QDir::AllEntries);
- int c = 0;
- while (it.hasNext()) {
- it.next();
- QUrl url = QUrl::fromLocalFile(it.filePath());
- if (it.fileName() == QLatin1String(".")) {
- url = QUrl::fromLocalFile(QDir::currentPath()
+ // Use a tempdir with files, for testing specific file names
+ // We use canonicalPath() on the dir path because ::getcwd() canonicalizes,
+ // so we get a canonical base path for URLs with "." as working directory.
+ const QString base = QDir(m_tempDir.path()).canonicalPath();
+ QDir::setCurrent(base); // for the tests that use "." as working dir
+
+ // "."
+ {
+ const QUrl url = QUrl::fromLocalFile(base
#ifdef Q_OS_WINRT
+ QLatin1Char('/')
#endif
); // fromUserInput cleans the path
- }
- QTest::newRow(("file-" + QByteArray::number(c)).constData())
- << it.fileName() << QDir::currentPath() << url << url;
- QTest::newRow(("file-" + QByteArray::number(c) + "-dot").constData())
- << it.fileName() << QStringLiteral(".") << url << url;
- ++c;
+ QTest::newRow("dot-in-path") << "." << base << url << url;
+ QTest::newRow("dot-in-dot") << "." << QStringLiteral(".") << url << url;
+ }
+
+ // Existing files
+ for (const char *fileName : {"file.txt", "file#a.txt", "file .txt", "file.txt "}) {
+ const QString filePath = base + '/' + fileName;
+ QFile file(filePath);
+ QVERIFY2(file.open(QIODevice::WriteOnly), qPrintable(filePath));
+ file.write("Hello world\n");
+
+ const QUrl url = QUrl::fromLocalFile(filePath);
+ QTest::newRow(fileName) << fileName << base << url << url;
+ QTest::newRow(QByteArray(fileName) + "-in-dot") << fileName << QStringLiteral(".") << url << url;
}
+
#ifndef Q_OS_WINRT // WinRT cannot cd outside current / sandbox
- QDir parent = QDir::current();
+ QDir parent(base);
QVERIFY(parent.cdUp());
QUrl parentUrl = QUrl::fromLocalFile(parent.path());
- QTest::newRow("dotdot") << ".." << QDir::currentPath() << parentUrl << parentUrl;
+ QTest::newRow("dotdot") << ".." << base << parentUrl << parentUrl;
#endif
- QTest::newRow("nonexisting") << "nonexisting" << QDir::currentPath() << QUrl("http://nonexisting") << QUrl::fromLocalFile(QDir::currentPath() + "/nonexisting");
- QTest::newRow("short-url") << "example.org" << QDir::currentPath() << QUrl("http://example.org") << QUrl::fromLocalFile(QDir::currentPath() + "/example.org");
- QTest::newRow("full-url") << "http://example.org" << QDir::currentPath() << QUrl("http://example.org") << QUrl("http://example.org");
- QTest::newRow("absolute") << "/doesnotexist.txt" << QDir::currentPath() << QUrl("file:///doesnotexist.txt") << QUrl("file:///doesnotexist.txt");
+ QTest::newRow("nonexisting") << "nonexisting" << base << QUrl("http://nonexisting") << QUrl::fromLocalFile(base + "/nonexisting");
+ QTest::newRow("short-url") << "example.org" << base << QUrl("http://example.org") << QUrl::fromLocalFile(base + "/example.org");
+ QTest::newRow("full-url") << "http://example.org" << base << QUrl("http://example.org") << QUrl("http://example.org");
+ QTest::newRow("absolute") << "/doesnotexist.txt" << base << QUrl("file:///doesnotexist.txt") << QUrl("file:///doesnotexist.txt");
#ifdef Q_OS_WIN
- QTest::newRow("windows-absolute") << "c:/doesnotexist.txt" << QDir::currentPath() << QUrl("file:///c:/doesnotexist.txt") << QUrl("file:///c:/doesnotexist.txt");
+ QTest::newRow("windows-absolute") << "c:/doesnotexist.txt" << base << QUrl("file:///c:/doesnotexist.txt") << QUrl("file:///c:/doesnotexist.txt");
#endif
// IPv4 & IPv6
// same as fromUserInput, but needs retesting
- QTest::newRow("ipv4-1") << "127.0.0.1" << QDir::currentPath() << QUrl("http://127.0.0.1") << QUrl::fromLocalFile(QDir::currentPath() + "/127.0.0.1");
- QTest::newRow("ipv6-0") << "::" << QDir::currentPath() << QUrl("http://[::]") << QUrl("http://[::]");
- QTest::newRow("ipv6-1") << "::1" << QDir::currentPath() << QUrl("http://[::1]") << QUrl("http://[::1]");
- QTest::newRow("ipv6-2") << "1::1" << QDir::currentPath() << QUrl("http://[1::1]") << QUrl("http://[1::1]");
- QTest::newRow("ipv6-3") << "1::" << QDir::currentPath() << QUrl("http://[1::]") << QUrl("http://[1::]");
- QTest::newRow("ipv6-4") << "c::" << QDir::currentPath() << QUrl("http://[c::]") << QUrl("http://[c::]");
- QTest::newRow("ipv6-5") << "c:f00:ba4::" << QDir::currentPath() << QUrl("http://[c:f00:ba4::]") << QUrl("http://[c:f00:ba4::]");
+ QTest::newRow("ipv4-1") << "127.0.0.1" << base << QUrl("http://127.0.0.1") << QUrl::fromLocalFile(base + "/127.0.0.1");
+ QTest::newRow("ipv6-0") << "::" << base << QUrl("http://[::]") << QUrl("http://[::]");
+ QTest::newRow("ipv6-1") << "::1" << base << QUrl("http://[::1]") << QUrl("http://[::1]");
+ QTest::newRow("ipv6-2") << "1::1" << base << QUrl("http://[1::1]") << QUrl("http://[1::1]");
+ QTest::newRow("ipv6-3") << "1::" << base << QUrl("http://[1::]") << QUrl("http://[1::]");
+ QTest::newRow("ipv6-4") << "c::" << base << QUrl("http://[c::]") << QUrl("http://[c::]");
+ QTest::newRow("ipv6-5") << "c:f00:ba4::" << base << QUrl("http://[c:f00:ba4::]") << QUrl("http://[c:f00:ba4::]");
}
void tst_QUrl::fromUserInputWithCwd()
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
index 8058d3c897..2edb94d542 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp
@@ -307,6 +307,7 @@ void tst_QMimeDatabase::mimeTypesForFileName_data()
QTest::newRow("txtfoobar, 0 hit") << "foo.foobar" << QStringList();
QTest::newRow("m, 2 hits") << "foo.m" << (QStringList() << "text/x-matlab" << "text/x-objcsrc");
QTest::newRow("sub, 3 hits") << "foo.sub" << (QStringList() << "text/x-microdvd" << "text/x-mpsub" << "text/x-subviewer");
+ QTest::newRow("non_ascii") << QString::fromUtf8("AİİA.pdf") << (QStringList() << "application/pdf");
}
void tst_QMimeDatabase::mimeTypesForFileName()
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
index 132f01092a..44ef12db29 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
@@ -7,6 +7,8 @@ TARGET = $$qtLibraryTarget(plugin1)
DESTDIR = ../bin
winrt:include(../winrt.pri)
+!qtConfig(library): DEFINES += QT_STATICPLUGIN
+
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
index b47ed91535..5689919108 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
@@ -7,6 +7,8 @@ TARGET = $$qtLibraryTarget(plugin2)
DESTDIR = ../bin
winrt:include(../winrt.pri)
+!qtConfig(library): DEFINES += QT_STATICPLUGIN
+
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
index 0e189ba7aa..f88eac1a9f 100644
--- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp
+++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
@@ -1033,7 +1033,8 @@ void tst_QDate::fromStringFormat_data()
QTest::addColumn<QString>("format");
QTest::addColumn<QDate>("expected");
- //get localized names
+ // Undo this (inline the C-locale versions) for ### Qt 6
+ // Get localized names:
QString january = QDate::longMonthName(1);
QString february = QDate::longMonthName(2);
QString march = QDate::longMonthName(3);
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index b81f3d356d..5eec44dffd 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -31,6 +31,9 @@
#include <time.h>
#include <qdatetime.h>
#include <private/qdatetime_p.h>
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+# include <locale.h>
+#endif
#ifdef Q_OS_WIN
# include <qt_windows.h>
@@ -185,6 +188,14 @@ Q_DECLARE_METATYPE(Qt::DateFormat)
tst_QDateTime::tst_QDateTime()
{
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ // Some tests depend on C locale - BF&I it with belt *and* braces:
+ qputenv("LC_ALL", "C");
+ setlocale(LC_ALL, "C");
+ // Need to do this as early as possible, before anything accesses the
+ // QSystemLocale singleton; once it exists, there's no changing it.
+#endif // remove for ### Qt 6
+
/*
Due to some jurisdictions changing their zones and rules, it's possible
for a non-CET zone to accidentally match CET at a few tested moments but
@@ -2332,13 +2343,6 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::addColumn<QString>("format");
QTest::addColumn<QDateTime>("expected");
- QString january = QDate::longMonthName(1);
- QString oct = QDate::shortMonthName(10);
- QString december = QDate::longMonthName(12);
- QString thu = QDate::shortDayName(4);
- QString fri = QDate::shortDayName(5);
- QString date = "10 " + oct + " 10";
-
QTest::newRow("data0") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data1") << QString("1020") << QString("sss") << invalidDateTime();
QTest::newRow("data2") << QString("1010") << QString("sss") << QDateTime(defDate(), QTime(0, 0, 10));
@@ -2349,16 +2353,14 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::newRow("data7") << QString("foo") << QString("ap") << invalidDateTime();
// Day non-conflict should not hide earlier year conflict (1963-03-01 was a
// Friday; asking for Thursday moves this, without conflict, to the 7th):
- QTest::newRow("data8") << QString("77 03 1963 " + thu) << QString("yy MM yyyy ddd") << invalidDateTime();
+ QTest::newRow("data8") << QString("77 03 1963 Thu") << QString("yy MM yyyy ddd") << invalidDateTime();
QTest::newRow("data9") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data10") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
- QTest::newRow("data11") << date << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
- date = fri + QLatin1Char(' ') + december + " 3 2004";
- QTest::newRow("data12") << date << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
+ QTest::newRow("data11") << QString("10 Oct 10") << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
+ QTest::newRow("data12") << QString("Fri December 3 2004") << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
QTest::newRow("data13") << QString("30.02.2004") << QString("dd.MM.yyyy") << invalidDateTime();
QTest::newRow("data14") << QString("32.01.2004") << QString("dd.MM.yyyy") << invalidDateTime();
- date = thu + QLatin1Char(' ') + january + " 2004";
- QTest::newRow("data15") << date << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
+ QTest::newRow("data15") << QString("Thu January 2004") << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
QTest::newRow("data16") << QString("2005-06-28T07:57:30.001Z")
<< QString("yyyy-MM-ddThh:mm:ss.zZ")
<< QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 1));
diff --git a/tests/auto/corelib/tools/qtime/tst_qtime.cpp b/tests/auto/corelib/tools/qtime/tst_qtime.cpp
index 059e1e519b..71bf39fc4e 100644
--- a/tests/auto/corelib/tools/qtime/tst_qtime.cpp
+++ b/tests/auto/corelib/tools/qtime/tst_qtime.cpp
@@ -28,10 +28,26 @@
#include <QtTest/QtTest>
#include "qdatetime.h"
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+# include <locale.h>
+#endif
class tst_QTime : public QObject
{
Q_OBJECT
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+public:
+ tst_QTime()
+ {
+ // Some tests depend on C locale - BF&I it with belt *and* braces:
+ qputenv("LC_ALL", "C");
+ setlocale(LC_ALL, "C");
+ // Need to instantiate as early as possible, before anything accesses
+ // the QSystemLocale singleton; once it exists, there's no changing it.
+ }
+#endif // remove for ### Qt 6
+
private slots:
void msecsTo_data();
void msecsTo();
diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
index 7fc44343a5..0806ad1318 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
+++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
@@ -77,8 +77,21 @@ struct Foo
void tst_QVarLengthArray::append()
{
- QVarLengthArray<QString> v;
- v.append(QString("hello"));
+ QVarLengthArray<QString, 2> v;
+ v.append(QString("1"));
+ v.append(v.front());
+ QCOMPARE(v.capacity(), 2);
+ // transition from prealloc to heap:
+ v.append(v.front());
+ QVERIFY(v.capacity() > 2);
+ QCOMPARE(v.front(), v.back());
+ while (v.size() < v.capacity())
+ v.push_back(v[0]);
+ QCOMPARE(v.back(), v.front());
+ QCOMPARE(v.size(), v.capacity());
+ // transition from heap to larger heap:
+ v.push_back(v.front());
+ QCOMPARE(v.back(), v.front());
QVarLengthArray<int> v2; // rocket!
v2.append(5);
diff --git a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp
index 71ee980de1..b8afd6a447 100644
--- a/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp
+++ b/tests/auto/gui/text/qtextformat/tst_qtextformat.cpp
@@ -60,6 +60,7 @@ private slots:
void setFont();
void setFont_collection_data();
void setFont_collection();
+ void clearCollection();
};
/*! \internal
@@ -640,5 +641,32 @@ void tst_QTextFormat::setFont_collection()
}
}
+void tst_QTextFormat::clearCollection()
+{
+ QTextFormatCollection collection;
+ QFont f;
+ f.setUnderline(true);
+ collection.setDefaultFont(f);
+ QTextCharFormat charFormat;
+ charFormat.setFontStyleHint(QFont::SansSerif);
+ int formatIndex = collection.indexForFormat(charFormat);
+ QCOMPARE(formatIndex, 0);
+ QTextCharFormat charFormat2;
+ charFormat2.setUnderlineStyle(QTextCharFormat::SingleUnderline);
+ int formatIndex2 = collection.indexForFormat(charFormat2);
+ QCOMPARE(formatIndex2, 1);
+ QCOMPARE(collection.formats.count(), 2);
+ QCOMPARE(collection.hashes.count(), 2);
+ QCOMPARE(collection.defaultFont(), f);
+
+ collection.clear();
+ QCOMPARE(collection.formats.count(), 0);
+ QCOMPARE(collection.hashes.count(), 0);
+ QCOMPARE(collection.indexForFormat(charFormat2), 0);
+ QCOMPARE(collection.formats.count(), 1);
+ QCOMPARE(collection.hashes.count(), 1);
+ QCOMPARE(collection.defaultFont(), f); // kept, QTextDocument::clear or setPlainText should not reset the font set by setDefaultFont
+}
+
QTEST_MAIN(tst_QTextFormat)
#include "tst_qtextformat.moc"
diff --git a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
index 5c92ca833a..4ccf0f24b0 100644
--- a/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
+++ b/tests/auto/network/ssl/qsslsocket/qsslsocket.pro
@@ -14,12 +14,6 @@ win32 {
}
}
-# OpenSSL support
-qtConfig(openssl)|qtConfig(openssl-linked) {
- # Add optional SSL libs
- LIBS += $$OPENSSL_LIBS
-}
-
DEFINES += SRCDIR=\\\"$$PWD/\\\"
requires(qtConfig(private_tests))
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 8367994509..a93a003dff 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -54,7 +54,7 @@ dialogs \
windowtransparency \
unc
-!qtConfig(openssl):!qtConfig(openssl-linked): SUBDIRS -= qssloptions
+!qtConfig(openssl): SUBDIRS -= qssloptions
qtConfig(opengl) {
SUBDIRS += qopengltextureblitter