This was created by checking out qttools and checking out the kf5
patches from kde.  For more details of those, see
https://dot.kde.org/2021/04/06/announcing-kdes-qt-5-patch-collection

 from kde:
 git clone https://invent.kde.org/qt/qt/qttools
 cd qttools
 git checkout -t origin/5.15
 git format-patch origin/5.15.2..origin/kde/5.15

To update for new patches, git pull and then rerun git format-patch.

Last updated: 2021-01-25

 Following patches commented:
 patch 01 would change the version to 5.15.3
 patch 04 already applied
 patch 06 already applied
 patch 15 would create a changes file for 5.12.10

#From dbe0567470db2b369a9fdb28d9fbac38be3e2d60 Mon Sep 17 00:00:00 2001
#From: Jani Heikkinen <jani.heikkinen@qt.io>
#Date: Tue, 27 Oct 2020 07:48:33 +0200
#Subject: [PATCH 01/17] Bump version
#
#Change-Id: I2d37f96c6b9f32d7e32b13ad09bc7f7555f04b99
#---
# .qmake.conf | 2 +-
# 1 file changed, 1 insertion(+), 1 deletion(-)
#
#diff --git a/.qmake.conf b/.qmake.conf
#index 6ec606e7..05561703 100644
#--- a/.qmake.conf
#+++ b/.qmake.conf
#@@ -2,4 +2,4 @@ load(qt_build_config)
# 
# DEFINES += QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST
# 
#-MODULE_VERSION = 5.15.2
#+MODULE_VERSION = 5.15.3
#-- 
#2.33.0

From b92c477f27832710cdfe20b24088b37f6f44c392 Mon Sep 17 00:00:00 2001
From: Ralf Habacker <ralf.habacker@freenet.de>
Date: Tue, 29 Sep 2020 20:09:51 +0200
Subject: [PATCH 02/17] qtpaths: Add missing location types

Task-number: QTBUG-87058
Change-Id: I58926eec16f51640f0a1cbc390167346b42290a8
(cherry picked from commit bc75dce3583962d46983aa22c971ce85b9bd4af5)
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
---
 src/qtpaths/qtpaths.cpp | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/qtpaths/qtpaths.cpp b/src/qtpaths/qtpaths.cpp
index 340a2ac4..eaff69e8 100644
--- a/src/qtpaths/qtpaths.cpp
+++ b/src/qtpaths/qtpaths.cpp
@@ -89,20 +89,26 @@ static const struct StringEnum {
     const char *stringvalue;
     QStandardPaths::StandardLocation enumvalue;
 } lookupTableData[] = {
+    { "AppConfigLocation", QStandardPaths::AppConfigLocation },
+    { "AppDataLocation", QStandardPaths::AppDataLocation },
+    { "AppLocalDataLocation", QStandardPaths::AppLocalDataLocation },
     { "ApplicationsLocation", QStandardPaths::ApplicationsLocation },
+    { "CacheLocation", QStandardPaths::CacheLocation },
+    { "ConfigLocation", QStandardPaths::ConfigLocation },
+    { "DataLocation", QStandardPaths::DataLocation },
     { "DesktopLocation", QStandardPaths::DesktopLocation },
     { "DocumentsLocation", QStandardPaths::DocumentsLocation },
+    { "DownloadLocation", QStandardPaths::DownloadLocation },
     { "FontsLocation", QStandardPaths::FontsLocation },
-    { "MusicLocation", QStandardPaths::MusicLocation },
-    { "MoviesLocation", QStandardPaths::MoviesLocation },
-    { "PicturesLocation", QStandardPaths::PicturesLocation },
-    { "HomeLocation", QStandardPaths::HomeLocation },
     { "GenericCacheLocation", QStandardPaths::GenericCacheLocation },
+    { "GenericConfigLocation", QStandardPaths::GenericConfigLocation },
     { "GenericDataLocation", QStandardPaths::GenericDataLocation },
+    { "HomeLocation", QStandardPaths::HomeLocation },
+    { "MoviesLocation", QStandardPaths::MoviesLocation },
+    { "MusicLocation", QStandardPaths::MusicLocation },
+    { "PicturesLocation", QStandardPaths::PicturesLocation },
     { "RuntimeLocation", QStandardPaths::RuntimeLocation },
-    { "ConfigLocation", QStandardPaths::ConfigLocation },
-    { "GenericConfigLocation", QStandardPaths::GenericConfigLocation },
-    { "DownloadLocation", QStandardPaths::DownloadLocation }
+    { "TempLocation", QStandardPaths::TempLocation }
 };
 
 /**
-- 
2.33.0

From 4a4995a7952fa5d274488ce019d24a2af1f884fb Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Tue, 27 Oct 2020 09:19:08 +0100
Subject: [PATCH 03/17] qdoc: Avoid duplicates in \sincelist

Related non-members appear twice in the node tree; when processing
children of an aggregate, skip nodes that do not report the aggregate
as their parent.

Task-number: QTBUG-87866
Change-Id: Id06dcfe9ab4ce4d0ef18b69506fa82c2df9e85b0
(cherry picked from commit ff92f335d5223af55542753f6ce5da382a1d2cd9)
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
---
 src/qdoc/node.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/qdoc/node.cpp b/src/qdoc/node.cpp
index 82306eee..29985a8b 100644
--- a/src/qdoc/node.cpp
+++ b/src/qdoc/node.cpp
@@ -2749,6 +2749,8 @@ void Aggregate::findAllAttributions(NodeMultiMap &attributions)
 void Aggregate::findAllSince()
 {
     for (auto *node : qAsConst(children_)) {
+        if (node->isRelatedNonmember() && node->parent() != this)
+            continue;
         QString sinceString = node->since();
         // Insert a new entry into each map for each new since string found.
         if (!node->isPrivate() && !sinceString.isEmpty()) {
-- 
2.33.0

#From fb1c13fd5068a5679e548c52548975de0901fa28 Mon Sep 17 00:00:00 2001
#From: Antti Kokko <antti.kokko@qt.io>
#Date: Tue, 27 Oct 2020 10:02:12 +0200
#Subject: [PATCH 04/17] Add changes file for Qt 5.15.2
#
#- 67dd99b072fb96359f077e766067c0f218a64eba qdoc: Fix incorrect loop when processing tagged \fn parameters
#- 13c294c3bd61810ea7040691894e2c38f6f096ae Add changes file for Qt 5.15.1
#+ 2d557b1c5c4d2da8d307519835a0b97287891a9c winrtrunner: Remove Windows Phone support
#+ 61c794846f3db82a10e5505397adb1b19bd21076 Use operator| to compose key sequences
#+ 2cea79cfbb237c1f4bdc10619a1ddbdc5c49b39b qtattributionsscanner: Linkify dejacode URN's for LicenseId
#+ a8708a3ee64dbf46a83ef572620758c26e2fc0de Qt Designer: Fix build of the QPrinter-related code
#+ 97f4de3866cbf389ebc318c5b7fa923b28ffbe53 QDoc: Upgrade building with Clang 10
#+ c73abc317a7970740aabfb5a11b0af3970a577e0 Fix static build of assistant
#+ 3c9315592180e8ae0404bccd4a843bac977c589c Assistant: fix build with QT_NO_CLIPBOARD
#+ 0aad0fa07bfc27c71df27ab433916166b87148b7 Assistant: Use new config system for cursor
#+ 0833db3f366eb59f08d4497dc424dd46b08da7ae QtHelp: Fix documentsFor() when not using filter engine
#+ 5cd1c07e5d88c3c8521c1af45d47b519d6e1faba Designer: Fix a crash on startup when built without clipboard
#+ f3180b6eb650598ca937943d6cd66da13335d9de Revert "macdeployqt: Don't copy .prl files into the Resources folder"
#+ 79aff793613f031b5757c3e1e6f176436c4a532f Bump version
#+ fe43e6779ea1a6f64869fedc0a0880e89e01bfaa qdoc: DocBook generator: Remove code for encoding special characters
#+ ffedf9cf7e6c52d8b59af47b21e7a29ee23720ec qdoc: DocBook generator: Correctly handle enum classes
#+ 72b5a4dcae9e9be4a6d66884d3cc0bfb2d692477 qdoc: Fix broken links generated by \sincelist
#+ 4aa4e4f727233d8b620b2d591311c90cb8bed39b Add macdeployqt autotest
#
#Change-Id: I336f58e71b941f821a2070a885013b5fbea33e68
#Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
#Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
#Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
#(cherry picked from commit cb05caa294addee97311a5620659efc49c534425)
#Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
#---
# dist/changes-5.15.2 | 72 +++++++++++++++++++++++++++++++++++++++++++++
# 1 file changed, 72 insertions(+)
# create mode 100644 dist/changes-5.15.2
#
#diff --git a/dist/changes-5.15.2 b/dist/changes-5.15.2
#new file mode 100644
#index 00000000..fe9d8378
#--- /dev/null
#+++ b/dist/changes-5.15.2
#@@ -0,0 +1,72 @@
#+Qt 5.15.2 is a bug-fix release. It maintains both forward and backward
#+compatibility (source and binary) with Qt 5.15.1.
#+
#+For more details, refer to the online documentation included in this
#+distribution. The documentation is also available online:
#+
#+  https://doc.qt.io/qt-5.15/index.html
#+
#+The Qt version 5.15 series is binary compatible with the 5.14.x series.
#+Applications compiled for 5.14 will continue to run with 5.15.
#+
#+Some of the changes listed in this file include issue tracking numbers
#+corresponding to tasks in the Qt Bug Tracker:
#+
#+  https://bugreports.qt.io/
#+
#+Each of these identifiers can be entered in the bug tracker to obtain more
#+information about a particular change.
#+
#+****************************************************************************
#+*                   Important Behavior Changes                             *
#+****************************************************************************
#+
#+****************************************************************************
#+*                          Library                                         *
#+****************************************************************************
#+
#+ - [QTBUG-87802] qdoc: Fix broken links generated by \sincelist
#+   The combination of single-exec mode and outputting to subdirectories
#+   (offline mode) made \sincelist generate href's to new classes and
#+   functions that are missing the target subdirectory. This happened
#+   because we did not pass the relative node to the function(s) that
#+   generate that list - proper link resolution requires a check if the
#+   page containing the \sincelist command comes from a different doc
#+   module, and the relative node is used for that.
#+   The bug was: qdoc: \sincelist generates broken links in certain
#+   conditions
#+ - [QTBUG-84703] qdoc: DocBook generator: Correctly handle enum classes
#+   While commit 46f71fcc fixed handling of enum classes for the code
#+   parser and marker, the DocBook generator has some dedicated code that
#+   also needs to be amended.
#+   The bug was: qdoc: DocBook generator: scoped enums not handled
#+   correctly
#+ - [QTBUG-86988] qdoc: DocBook generator: Remove code for encoding special characters
#+   QXmlStreamWriter already handles this for us.
#+   The bug was: qdoc: DocBook output format: XML special characters are
#+   escaped twice
#+ - [QTBUG-86759] Revert "macdeployqt: Don't copy .prl files into the Resources folder"
#+   This was skipping other files from Resources/ as well, such as
#+   “en-GB.pak” and “QtWebEngineProcess”. This reverts commit
#+   aabba72f7965e06e2e6ed960d8cf8078249dac8c.
#+   The bug was: Missing QtWebEngineProcess Application in application
#+   frameworks
#+ - [QTBUG-84727] QtHelp: Fix documentsFor() when not using filter engine
#+   The bug was: QHelpIndexWidget does not emit documentActivated or
#+   documentsActivated
#+ - [QTBUG-86598] Assistant: fix build with QT_NO_CLIPBOARD
#+   The bug was: Assistant fails to compile if QT_NO_CLIPBOARD is defined
#+ - [QTBUG-86477] Fix static build of assistant
#+   The bug was: [REG 5.15.0->5.15.1] assistant not build when building
#+   whole Qt statically
#+ - [QTBUG-86293] winrtrunner: Remove Windows Phone support
#+   Windows Phone has not been supported for a while now. With newer
#+   Windows versions the functionality causes issues. On build 1909 the
#+   application hangs in CoUninitialize when called with --list-devices
#+   and in build 2004 the needed classes are not registered at all.
#+   The bug was: "winrtrunner --list-devices" hangs
#+ - [QTBUG-86188] qdoc: Fix incorrect loop when processing tagged \fn parameters
#+   This fixes ASSERT: "uint(i) < uint(size())" in file
#+   qt5/qtbase/src/corelib/text/qstring.h, line 1067
#+   The bug was: qdoc: Crash when using a tagged \fn command
#+
#-- 
#2.33.0

From c7d34b9090d5b08310e27be17f46b23a24d9d7cb Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@qt.io>
Date: Mon, 26 Oct 2020 17:24:59 +0100
Subject: [PATCH 05/17] qt5_create_translation: Fix handling of directory
 dependencies

lupdate supports whole directories as sources. Anyhow, in this
case we cannot just declare the directory as dependency; it will
force lupdate to re-run every time and emit a warning:

warning MSB8064: Custom build for item "..." succeeded, but specified dependency "<the directory specified as a source>" does not exist. This may cause incremental builds to work incorrectly.

The patch checks if each specified source is a directory, and if so:
* Generates globbing expressions for the list of extensions to be used.
* Search the specified directory for matching files.
* Add those files to the list of dependencies to give to CMake instead
  of the directory itself.

The list of source file extensions is derived from lupdate defaults,
but can be tweaked by a new '-extensions' argument.

Original patch done by Chris Djali.

Fixes: QTBUG-86192
Change-Id: Icc22be4f3ee096361ac319208261cdc8191d9adf
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 2834bebc9e6ba9bf0577db1d7da42a52e622adc6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/linguist/Qt5LinguistToolsMacros.cmake | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/linguist/Qt5LinguistToolsMacros.cmake b/src/linguist/Qt5LinguistToolsMacros.cmake
index ab271d56..2e700bba 100644
--- a/src/linguist/Qt5LinguistToolsMacros.cmake
+++ b/src/linguist/Qt5LinguistToolsMacros.cmake
@@ -41,6 +41,17 @@ function(QT5_CREATE_TRANSLATION _qm_files)
     set(_lupdate_files ${_LUPDATE_UNPARSED_ARGUMENTS})
     set(_lupdate_options ${_LUPDATE_OPTIONS})
 
+    if("-extensions" IN_LIST _lupdate_options)
+        list(FIND ${_lupdate_options} "-extensions" _extensions_index)
+        math(EXPR _extensions_index "${_extensions_index} + 1")
+        list(GET ${_lupdate_options} ${_extensions_index} _extensions_list)
+        string(REPLACE "," ";" _extensions_list "${_extensions_list}")
+        list(TRANSFORM _extensions_list STRIP)
+        list(TRANSFORM _extensions_list REPLACE "^\." "")
+        list(TRANSFORM _extensions_list PREPEND "*.")
+    else()
+        set(_extensions_list "*.java;*.jui;*.ui;*.c;*.c++;*.cc;*.cpp;*.cxx;*.ch;*.h;*.h++;*.hh;*.hpp;*.hxx;*.js;*.qs;*.qml;*.qrc")
+    endif()
     set(_my_sources)
     set(_my_tsfiles)
     foreach(_file ${_lupdate_files})
@@ -59,8 +70,16 @@ function(QT5_CREATE_TRANSLATION _qm_files)
           get_filename_component(_ts_name ${_ts_file} NAME)
           set(_ts_lst_file "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_ts_name}_lst_file")
           set(_lst_file_srcs)
+          set(_dependencies)
           foreach(_lst_file_src ${_my_sources})
               set(_lst_file_srcs "${_lst_file_src}\n${_lst_file_srcs}")
+              if(IS_DIRECTORY ${_lst_file_src})
+                  list(TRANSFORM _extensions_list PREPEND "${_lst_file_src}/" OUTPUT_VARIABLE _directory_glob)
+                  file(GLOB_RECURSE _directory_contents CONFIGURE_DEPENDS ${_directory_glob})
+                  list(APPEND _dependencies ${_directory_contents})
+              else()
+                  list(APPEND _dependencies "${_lst_file_src}")
+              endif()
           endforeach()
 
           get_directory_property(_inc_DIRS INCLUDE_DIRECTORIES)
@@ -74,7 +93,7 @@ function(QT5_CREATE_TRANSLATION _qm_files)
         add_custom_command(OUTPUT ${_ts_file}
             COMMAND ${Qt5_LUPDATE_EXECUTABLE}
             ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file}
-            DEPENDS ${_my_sources}
+            DEPENDS ${_dependencies}
             BYPRODUCTS ${_ts_lst_file} VERBATIM)
     endforeach()
     qt5_add_translation(${_qm_files} ${_my_tsfiles})
-- 
2.33.0

#From ca9cef2f6a9282cdfbdb8d2c46c4508c6da936bd Mon Sep 17 00:00:00 2001
#From: Edward Welbourne <edward.welbourne@qt.io>
#Date: Thu, 22 Oct 2020 19:11:38 +0200
#Subject: [PATCH 06/17] Clear out deprecated QLocale::Language values
#
#CLDR provides no Bihari locale data, so we're retiring it.
#Tagalog is now called Filipino.
#Various aliases mentioned in comments are going away.
#
#Task-number: QTBUG-88167
#Change-Id: Ie31353911be2de908f53e9b84d6b819677ad946b
#Reviewed-by: Lars Knoll <lars.knoll@qt.io>
#(cherry picked from commit 7268647fd5f911303a507fd5cc7c3feb48bb253f)
#Reviewed-by: Robert Loehning <robert.loehning@qt.io>
#---
# src/linguist/shared/numerus.cpp | 8 ++------
# 1 file changed, 2 insertions(+), 6 deletions(-)
#
#diff --git a/src/linguist/shared/numerus.cpp b/src/linguist/shared/numerus.cpp
#index 6a1ca813..5b489523 100644
#--- a/src/linguist/shared/numerus.cpp
#+++ b/src/linguist/shared/numerus.cpp
#@@ -162,7 +162,6 @@ static const QLocale::Language englishStyleLanguages[] = {
#     QLocale::Bashkir,
#     QLocale::Basque,
#     QLocale::Bengali,
#-    QLocale::Bihari,
#     QLocale::Bulgarian,
#     QLocale::Catalan,
#     QLocale::Cornish,
#@@ -206,7 +205,7 @@ static const QLocale::Language englishStyleLanguages[] = {
#     // Missing: Nahuatl,
#     QLocale::Nepali,
#     QLocale::NorthernSotho,
#-    QLocale::NorwegianBokmal, // same as Norwegian
#+    QLocale::NorwegianBokmal,
#     QLocale::NorwegianNynorsk,
#     QLocale::Occitan,
#     QLocale::Oriya,
#@@ -232,7 +231,6 @@ static const QLocale::Language englishStyleLanguages[] = {
#     QLocale::Tsonga,
#     QLocale::Tswana,
#     QLocale::Turkmen,
#-    // QLocale::Twi, // mapped to Akan
#     QLocale::Uigur,
#     QLocale::Urdu,
#     QLocale::Uzbek,
#@@ -278,13 +276,11 @@ static const QLocale::Language russianStyleLanguages[] = {
#     QLocale::Croatian,
#     QLocale::Russian,
#     QLocale::Serbian,
#-    // QLocale::SerboCroatian, // deprecated, mapped to Serbian
#     QLocale::Ukrainian,
#     EOL
# };
# static const QLocale::Language polishLanguage[] = { QLocale::Polish, EOL };
# static const QLocale::Language romanianLanguages[] = {
#-    // QLocale::Moldavian, // deprecated, mapped to Romanian
#     QLocale::Romanian,
#     EOL
# };
#@@ -292,7 +288,7 @@ static const QLocale::Language slovenianLanguage[] = { QLocale::Slovenian, EOL }
# static const QLocale::Language malteseLanguage[] = { QLocale::Maltese, EOL };
# static const QLocale::Language welshLanguage[] = { QLocale::Welsh, EOL };
# static const QLocale::Language arabicLanguage[] = { QLocale::Arabic, EOL };
#-static const QLocale::Language tagalogLanguage[] = { QLocale::Tagalog, EOL };
+static const QLocale::Language tagalogLanguage[] = { QLocale::Filipino, EOL };
# 
# static const QLocale::Country frenchStyleCountries[] = {
#     // keep synchronized with frenchStyleLanguages
#-- 
#2.33.0

From 6dc0f1f51ab4fbc907650713d8310126ffb0af3a Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@qt.io>
Date: Sun, 1 Nov 2020 21:37:48 +0100
Subject: [PATCH 07/17] CMake: Fix usage of qt_create_translation in a CTest

Commit 1b006ab3d8954 declared an input file generated by CMake as a
BYPRODUCT of the consuming file to fix a policy warning CMP0058.
Anyhow, this is technically incorrect, since the file is actually not produced,
but consumed by the lupdate command. The incorrect fix also had the
side-effect that ninja clean did remove the file, which prevents the use
of the macro in CTest.

Just remove the BYPRODUCT declaration. The file is written by
CMake, so it actually doesn't need neither to be listed in DEPENDENCIES
nor in BYPRODUCT.

Task-number: QTBUG-71354
Change-Id: I7e5677f2bbd84b8a9fffdcb73465dfae6012ceb5
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 3101eae233f1f5031c5c814d70dedbc7986e7db8)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/linguist/Qt5LinguistToolsMacros.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/linguist/Qt5LinguistToolsMacros.cmake b/src/linguist/Qt5LinguistToolsMacros.cmake
index 2e700bba..3138aae4 100644
--- a/src/linguist/Qt5LinguistToolsMacros.cmake
+++ b/src/linguist/Qt5LinguistToolsMacros.cmake
@@ -94,7 +94,7 @@ function(QT5_CREATE_TRANSLATION _qm_files)
             COMMAND ${Qt5_LUPDATE_EXECUTABLE}
             ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file}
             DEPENDS ${_dependencies}
-            BYPRODUCTS ${_ts_lst_file} VERBATIM)
+            VERBATIM)
     endforeach()
     qt5_add_translation(${_qm_files} ${_my_tsfiles})
     set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
-- 
2.33.0

From 02eed75d1661371fb76b496dfd08cbd198737b35 Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Thu, 12 Nov 2020 09:52:53 +0100
Subject: [PATCH 08/17] qdoc: Handle JSON as plain text

The JavaScript code marker failed to handle JSON snippets; drop
the advertised support for it, parsing JSON as plain text.
This is OK as there's typically no types to link to or
highlighting needed for JSON data.

Fixes: QTBUG-81596
Change-Id: I004fcbe97a66ff5a33c4c443a24d16107aacb4c8
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
(cherry picked from commit d54cfd5ade5c18ed66a1defa337ca3f6aea2ab1a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/qdoc/jscodemarker.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/qdoc/jscodemarker.cpp b/src/qdoc/jscodemarker.cpp
index b3c675d5..0e1eb226 100644
--- a/src/qdoc/jscodemarker.cpp
+++ b/src/qdoc/jscodemarker.cpp
@@ -78,16 +78,16 @@ bool JsCodeMarker::recognizeCode(const QString &code)
  */
 bool JsCodeMarker::recognizeExtension(const QString &ext)
 {
-    return ext == "js" || ext == "json";
+    return ext == "js";
 }
 
 /*!
-  Returns \c true if the \a language is recognized. We recognize JavaScript,
-  ECMAScript and JSON.
+  Returns \c true if the \a language is recognized. We recognize JavaScript and
+  ECMAScript.
  */
 bool JsCodeMarker::recognizeLanguage(const QString &language)
 {
-    return language == "JavaScript" || language == "ECMAScript" || language == "JSON";
+    return language == "JavaScript" || language == "ECMAScript";
 }
 
 /*!
-- 
2.33.0

From 6f90d0a98c7af008bc5675bd6e79967fde124d21 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@qt.io>
Date: Mon, 16 Nov 2020 07:58:50 +0100
Subject: [PATCH 09/17] Doc: Document attribution argument
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Attribution pages got introduced in commit d3f3e98ee.

Also order the arguments alphabetically.

Change-Id: I14d54067b803bf6a788676a45fec7969486187be
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
(cherry picked from commit 3d97baa9535a7dc4dedd883d1c1fa2a2a0e6d1c6)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/qdoc/doc/qdoc-manual-topiccmds.qdoc | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/qdoc/doc/qdoc-manual-topiccmds.qdoc b/src/qdoc/doc/qdoc-manual-topiccmds.qdoc
index 0837648b..7d906ce6 100644
--- a/src/qdoc/doc/qdoc-manual-topiccmds.qdoc
+++ b/src/qdoc/doc/qdoc-manual-topiccmds.qdoc
@@ -930,22 +930,24 @@
 
     \list
 
+    \li api - This is the type of page used for C++ class references and
+    QML type references. You should never use this one for the pages
+    you write, because this one is reserved for QDoc.
+
+    \li attribution - A page describing (code) attributions.
+
+    \li example - A page that describes a working example.
+
     \li faq - A frequently asked question.
 
     \li howto - A user guide on how to use some components of the
     software.
 
-    \li example - A page that describes a working example.
-
     \li overview - For text pages that provide an overview of some
     important subject.
 
     \li tutorial - For text pages that are part of a tutorial.
 
-    \li api - This is the type of page used for C++ class references and
-    QML type references. You should never use this one for the pages
-    you write, because this one is reserved for QDoc.
-
     \endlist
 
     The page title is set using the \l {title-command} {\\title}
-- 
2.33.0

From 023a0b18777540459dbaf43cc8698429b5a05bfe Mon Sep 17 00:00:00 2001
From: Ralf Habacker <ralf.habacker@freenet.de>
Date: Wed, 11 Nov 2020 01:09:38 +0100
Subject: [PATCH 10/17] Replace prefined application name by a generic name

If the path returned from a call to a method of the QStandardPaths
class contains the application name 'qtpaths' it is replaced by
'<APPNAME>' to output this generic name.

Task-number: QTBUG-87058
Change-Id: I7a9e848f42bf94ef4bbd4757e77ccfeefa8dfa9f
Reviewed-by: David Faure <david.faure@kdab.com>
(cherry picked from commit 8e642309ffd57637eed2841971f1d938662232b6)
---
 src/qtpaths/qtpaths.cpp | 112 +++++++++++++++++++++-------------------
 1 file changed, 60 insertions(+), 52 deletions(-)

diff --git a/src/qtpaths/qtpaths.cpp b/src/qtpaths/qtpaths.cpp
index eaff69e8..9a9c9057 100644
--- a/src/qtpaths/qtpaths.cpp
+++ b/src/qtpaths/qtpaths.cpp
@@ -79,36 +79,44 @@ Q_NORETURN static void error(const QString &message)
     ::exit(EXIT_FAILURE);
 }
 
-
-/*
- * NOTE: that DataLocation and CacheLocation are missing as
- * they don't really make sense for a utility like this because
- * they include the application name.
- */
-static const struct StringEnum {
+class StringEnum {
+public:
     const char *stringvalue;
     QStandardPaths::StandardLocation enumvalue;
-} lookupTableData[] = {
-    { "AppConfigLocation", QStandardPaths::AppConfigLocation },
-    { "AppDataLocation", QStandardPaths::AppDataLocation },
-    { "AppLocalDataLocation", QStandardPaths::AppLocalDataLocation },
-    { "ApplicationsLocation", QStandardPaths::ApplicationsLocation },
-    { "CacheLocation", QStandardPaths::CacheLocation },
-    { "ConfigLocation", QStandardPaths::ConfigLocation },
-    { "DataLocation", QStandardPaths::DataLocation },
-    { "DesktopLocation", QStandardPaths::DesktopLocation },
-    { "DocumentsLocation", QStandardPaths::DocumentsLocation },
-    { "DownloadLocation", QStandardPaths::DownloadLocation },
-    { "FontsLocation", QStandardPaths::FontsLocation },
-    { "GenericCacheLocation", QStandardPaths::GenericCacheLocation },
-    { "GenericConfigLocation", QStandardPaths::GenericConfigLocation },
-    { "GenericDataLocation", QStandardPaths::GenericDataLocation },
-    { "HomeLocation", QStandardPaths::HomeLocation },
-    { "MoviesLocation", QStandardPaths::MoviesLocation },
-    { "MusicLocation", QStandardPaths::MusicLocation },
-    { "PicturesLocation", QStandardPaths::PicturesLocation },
-    { "RuntimeLocation", QStandardPaths::RuntimeLocation },
-    { "TempLocation", QStandardPaths::TempLocation }
+    bool hasappname;
+
+    /**
+    * Replace application name by generic name if requested
+    */
+    QString mapName(const QString &s) const
+    {
+        return hasappname ? QString(s).replace("qtpaths", "<APPNAME>") : s;
+    }
+};
+
+static const StringEnum lookupTableData[] = {
+    { "AppConfigLocation", QStandardPaths::AppConfigLocation, true },
+    { "AppDataLocation", QStandardPaths::AppDataLocation, true },
+    { "AppLocalDataLocation", QStandardPaths::AppLocalDataLocation, true },
+    { "ApplicationsLocation", QStandardPaths::ApplicationsLocation, false },
+    { "CacheLocation", QStandardPaths::CacheLocation, true },
+    { "ConfigLocation", QStandardPaths::ConfigLocation, false },
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+    { "DataLocation", QStandardPaths::DataLocation, true },
+#endif
+    { "DesktopLocation", QStandardPaths::DesktopLocation, false },
+    { "DocumentsLocation", QStandardPaths::DocumentsLocation, false },
+    { "DownloadLocation", QStandardPaths::DownloadLocation, false },
+    { "FontsLocation", QStandardPaths::FontsLocation, false },
+    { "GenericCacheLocation", QStandardPaths::GenericCacheLocation, false },
+    { "GenericConfigLocation", QStandardPaths::GenericConfigLocation, false },
+    { "GenericDataLocation", QStandardPaths::GenericDataLocation, false },
+    { "HomeLocation", QStandardPaths::HomeLocation, false },
+    { "MoviesLocation", QStandardPaths::MoviesLocation, false },
+    { "MusicLocation", QStandardPaths::MusicLocation, false },
+    { "PicturesLocation", QStandardPaths::PicturesLocation, false },
+    { "RuntimeLocation", QStandardPaths::RuntimeLocation, false },
+    { "TempLocation", QStandardPaths::TempLocation, false }
 };
 
 /**
@@ -124,14 +132,14 @@ static QStringList types()
 }
 
 /**
- * Tries to parse the location string into a StandardLocation or alternatively
+ * Tries to arse the location string into a reference to a StringEnum entry or alternatively
  * calls \ref error with a error message
  */
-static QStandardPaths::StandardLocation parseLocationOrError(const QString &locationString)
+static const StringEnum &parseLocationOrError(const QString &locationString)
 {
     for (const StringEnum &se : lookupTableData)
         if (locationString == QLatin1String(se.stringvalue))
-            return se.enumvalue;
+            return se;
 
     QString message = QCoreApplication::translate("qtpaths", "Unknown location: %1");
     error(message.arg(locationString));
@@ -252,21 +260,21 @@ int main(int argc, char **argv)
     }
 
     if (parser.isSet(display)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(display));
-        QString text = QStandardPaths::displayName(location);
-        results << text;
+        const StringEnum &location = parseLocationOrError(parser.value(display));
+        QString text = QStandardPaths::displayName(location.enumvalue);
+        results << location.mapName(text);
     }
 
     if (parser.isSet(paths)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(paths));
-        QStringList paths = QStandardPaths::standardLocations(location);
-        results << paths.join(pathsep);
+        const StringEnum &location = parseLocationOrError(parser.value(paths));
+        QStringList paths = QStandardPaths::standardLocations(location.enumvalue);
+        results << location.mapName(paths.join(pathsep));
     }
 
     if (parser.isSet(writablePath)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(writablePath));
-        QString path = QStandardPaths::writableLocation(location);
-        results << path;
+        const StringEnum &location = parseLocationOrError(parser.value(writablePath));
+        QString path = QStandardPaths::writableLocation(location.enumvalue);
+        results << location.mapName(path);
     }
 
     if (parser.isSet(findExe)) {
@@ -276,31 +284,31 @@ int main(int argc, char **argv)
     }
 
     if (parser.isSet(locateDir)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateDir));
+        const StringEnum &location = parseLocationOrError(parser.value(locateDir));
         QString searchitem = searchStringOrError(&parser);
-        QString path = QStandardPaths::locate(location, searchitem, QStandardPaths::LocateDirectory);
-        results << path;
+        QString path = QStandardPaths::locate(location.enumvalue, searchitem, QStandardPaths::LocateDirectory);
+        results << location.mapName(path);
     }
 
     if (parser.isSet(locateFile)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateFile));
+        const StringEnum &location = parseLocationOrError(parser.value(locateFile));
         QString searchitem = searchStringOrError(&parser);
-        QString path = QStandardPaths::locate(location, searchitem, QStandardPaths::LocateFile);
-        results << path;
+        QString path = QStandardPaths::locate(location.enumvalue, searchitem, QStandardPaths::LocateFile);
+        results << location.mapName(path);
     }
 
     if (parser.isSet(locateDirs)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateDirs));
+        const StringEnum &location = parseLocationOrError(parser.value(locateDirs));
         QString searchitem = searchStringOrError(&parser);
-        QStringList paths = QStandardPaths::locateAll(location, searchitem, QStandardPaths::LocateDirectory);
-        results << paths.join(pathsep);
+        QStringList paths = QStandardPaths::locateAll(location.enumvalue, searchitem, QStandardPaths::LocateDirectory);
+        results << location.mapName(paths.join(pathsep));
     }
 
     if (parser.isSet(locateFiles)) {
-        QStandardPaths::StandardLocation location = parseLocationOrError(parser.value(locateFiles));
+        const StringEnum &location = parseLocationOrError(parser.value(locateFiles));
         QString searchitem = searchStringOrError(&parser);
-        QStringList paths = QStandardPaths::locateAll(location, searchitem, QStandardPaths::LocateFile);
-        results << paths.join(pathsep);
+        QStringList paths = QStandardPaths::locateAll(location.enumvalue, searchitem, QStandardPaths::LocateFile);
+        results << location.mapName(paths.join(pathsep));
     }
     if (results.isEmpty()) {
         parser.showHelp();
-- 
2.33.0

From e8bfcf7696af6bc4811ce2d66c4f199579f3456c Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Thu, 4 Jun 2020 20:48:09 +0200
Subject: [PATCH 11/17] qdoc: DocBook generator: Fix \headerfile generation

Header files were missing content when using the DocBook output format.

Fixes: QTBUG-84224
Change-Id: I625ff2a4b14d69f6df0f706cfd4fdbef2cd7fd7f
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
(cherry picked from commit 3297d012680e083b25a4740229f9fe77c4fdbc17)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/qdoc/docbookgenerator.cpp                 | 10 +--
 .../headerfile-docbook/testheader.xml         | 70 ++++++++++++++++++-
 2 files changed, 75 insertions(+), 5 deletions(-)

diff --git a/src/qdoc/docbookgenerator.cpp b/src/qdoc/docbookgenerator.cpp
index 3e4f03cf..82893be9 100644
--- a/src/qdoc/docbookgenerator.cpp
+++ b/src/qdoc/docbookgenerator.cpp
@@ -2436,12 +2436,10 @@ void DocBookGenerator::generateCppReferencePage(Node *node)
     QString title;
     QString rawTitle;
     QString fullTitle;
-    const NamespaceNode *ns = nullptr;
     if (aggregate->isNamespace()) {
         rawTitle = aggregate->plainName();
         fullTitle = aggregate->plainFullName();
         title = rawTitle + " Namespace";
-        ns = static_cast<const NamespaceNode *>(aggregate);
     } else if (aggregate->isClass()) {
         rawTitle = aggregate->plainName();
         QString templateDecl = node->templateDecl();
@@ -2449,6 +2447,8 @@ void DocBookGenerator::generateCppReferencePage(Node *node)
             fullTitle = QString("%1 %2 ").arg(templateDecl, aggregate->typeWord(false));
         fullTitle += aggregate->plainFullName();
         title = rawTitle + QLatin1Char(' ') + aggregate->typeWord(true);
+    } else if (aggregate->isHeader()) {
+        title = fullTitle = rawTitle = aggregate->fullTitle();
     }
 
     QString subtitleText;
@@ -2479,8 +2479,10 @@ void DocBookGenerator::generateCppReferencePage(Node *node)
     }
 
     Sections sections(const_cast<Aggregate *>(aggregate));
-    SectionVector *sectionVector =
-            ns ? &sections.stdDetailsSections() : &sections.stdCppClassDetailsSections();
+    auto *sectionVector =
+            (aggregate->isNamespace() || aggregate->isHeader()) ?
+                    &sections.stdDetailsSections() :
+                    &sections.stdCppClassDetailsSections();
     SectionVector::ConstIterator section = sectionVector->constBegin();
     while (section != sectionVector->constEnd()) {
         bool headerGenerated = false;
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/headerfile-docbook/testheader.xml b/tests/auto/qdoc/generatedoutput/expected_output/headerfile-docbook/testheader.xml
index f3461fb1..afa0b20a 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/headerfile-docbook/testheader.xml
+++ b/tests/auto/qdoc/generatedoutput/expected_output/headerfile-docbook/testheader.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <db:article xmlns:db="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.2" xml:lang="en">
 <db:info>
-<db:title></db:title>
+<db:title>&lt;TestHeader&gt; - Test Header</db:title>
 <db:productname>HeaderFile</db:productname>
 <db:titleabbrev>HeaderFile Reference Documentation</db:titleabbrev>
 <db:abstract>
@@ -19,4 +19,72 @@
 <db:section xml:id="details">
 <db:title>Detailed Description</db:title>
 </db:section>
+<db:section xml:id="type-documentation">
+<db:title>Type Documentation</db:title>
+<db:section xml:id="Globals-enum">
+<db:title>enum Globals</db:title>
+<db:enumsynopsis>
+<db:enumname>Globals</db:enumname>
+<db:synopsisinfo db:role="access">public</db:synopsisinfo>
+<db:synopsisinfo db:role="status">active</db:synopsisinfo>
+<db:synopsisinfo db:role="threadsafeness">unspecified</db:synopsisinfo>
+<db:synopsisinfo db:role="module">HeaderFile</db:synopsisinfo>
+<db:enumitem db:enumidentifier="Glo" db:enumvalue="0"/>
+<db:enumitem db:enumidentifier="Bal" db:enumvalue="1"/>
+</db:enumsynopsis>
+<db:informaltable>
+<db:thead>
+<db:tr>
+<db:th>Constant</db:th>
+<db:th>Description</db:th>
+</db:tr>
+</db:thead>
+<db:tr>
+<db:td>
+<db:para><db:code>Glo</db:code></db:para>
+</db:td>
+<db:td><db:code>0</db:code></db:td>
+</db:tr>
+<db:tr>
+<db:td>
+<db:para><db:code>Bal</db:code></db:para>
+</db:td>
+<db:td><db:code>1</db:code></db:td>
+</db:tr>
+</db:informaltable>
+</db:section>
+</db:section>
+<db:section xml:id="variable-documentation">
+<db:title>Variable Documentation</db:title>
+<db:section xml:id="globalVar-var">
+<db:title>const int globalVar</db:title>
+<db:fieldsynopsis>
+<db:type>const int</db:type>
+<db:varname>globalVar</db:varname>
+<db:synopsisinfo db:role="access">public</db:synopsisinfo>
+<db:synopsisinfo db:role="status">active</db:synopsisinfo>
+<db:synopsisinfo db:role="threadsafeness">unspecified</db:synopsisinfo>
+<db:synopsisinfo db:role="module">HeaderFile</db:synopsisinfo>
+</db:fieldsynopsis>
+<db:para>Global variable.</db:para>
+</db:section>
+</db:section>
+<db:section xml:id="function-documentation">
+<db:title>Function Documentation</db:title>
+<db:section xml:id="globalFunc">
+<db:title>void globalFunc()</db:title>
+<db:methodsynopsis>
+<db:void/>
+<db:methodname>globalFunc</db:methodname>
+<db:void/>
+<db:synopsisinfo db:role="meta">plain</db:synopsisinfo>
+<db:synopsisinfo db:role="signature">void globalFunc()</db:synopsisinfo>
+<db:synopsisinfo db:role="access">public</db:synopsisinfo>
+<db:synopsisinfo db:role="status">active</db:synopsisinfo>
+<db:synopsisinfo db:role="threadsafeness">unspecified</db:synopsisinfo>
+<db:synopsisinfo db:role="module">HeaderFile</db:synopsisinfo>
+</db:methodsynopsis>
+<db:para>Global function.</db:para>
+</db:section>
+</db:section>
 </db:article>
-- 
2.33.0

From b9142ba7617b183b90741e00cde7a50877449d08 Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Tue, 18 Aug 2020 17:41:26 +0200
Subject: [PATCH 12/17] qdoc: Skip ignored entries in .qhp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Classes marked with \dontdocument do not generate a class reference
page. Skip them when generating the Qt Help project file.

Fixes: QTBUG-86101
Change-Id: Ica80b505f1f23de0dd0ae59272903e1d19eadf93
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
(cherry picked from commit 7615656ced26a132c6894c080563e74d503be3c7)
---
 src/qdoc/helpprojectwriter.cpp                |  2 +-
 .../dontdocument/dontdocument.qhp             | 55 +++++++++++++++++++
 .../dontdocument/dontdocument.qdocconf        | 14 +++++
 .../generatedoutput/tst_generatedoutput.cpp   |  3 +-
 4 files changed, 72 insertions(+), 2 deletions(-)
 create mode 100644 tests/auto/qdoc/generatedoutput/expected_output/dontdocument/dontdocument.qhp

diff --git a/src/qdoc/helpprojectwriter.cpp b/src/qdoc/helpprojectwriter.cpp
index d411802d..c534d399 100644
--- a/src/qdoc/helpprojectwriter.cpp
+++ b/src/qdoc/helpprojectwriter.cpp
@@ -234,7 +234,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project, QXmlStreamWriter &
     if (!node->url().isEmpty() && !(project.includeIndexNodes && !node->url().startsWith("http")))
         return false;
 
-    if (node->isPrivate() || node->isInternal())
+    if (node->isPrivate() || node->isInternal() || node->isDontDocument())
         return false;
 
     if (node->name().isEmpty())
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/dontdocument/dontdocument.qhp b/tests/auto/qdoc/generatedoutput/expected_output/dontdocument/dontdocument.qhp
new file mode 100644
index 00000000..098200a9
--- /dev/null
+++ b/tests/auto/qdoc/generatedoutput/expected_output/dontdocument/dontdocument.qhp
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<QtHelpProject version="1.0">
+    <namespace>org.qt-project.dontdocument.001</namespace>
+    <virtualFolder>test</virtualFolder>
+    <metaData name="version" value=""/>
+    <filterSection>
+        <toc>
+            <section ref="testcpp-module.html" title="QDoc Test C++ Classes">
+                <section ref="testcpp-module.html" title="Classes">
+                    <section ref="seenclass.html" title="SeenClass Class Reference"/>
+                    <section ref="testqdoc-test.html" title="TestQDoc::Test Class Reference">
+                        <section ref="testqdoc-test-members.html" title="List of all members"/>
+                        <section ref="testqdoc-test-obsolete.html" title="Obsolete members"/>
+                    </section>
+                    <section ref="testqdoc-testderived.html" title="TestQDoc::TestDerived Class Reference">
+                        <section ref="testqdoc-testderived-members.html" title="List of all members"/>
+                    </section>
+                </section>
+            </section>
+        </toc>
+        <keywords>
+            <keyword name="Classes" id="Classes" ref="classes.html"/>
+            <keyword name="QDOCTEST_MACRO" id="QDOCTEST_MACRO" ref="testqdoc.html#QDOCTEST_MACRO"/>
+            <keyword name="QDOCTEST_MACRO2" id="QDOCTEST_MACRO2" ref="testqdoc-test.html#QDOCTEST_MACRO2"/>
+            <keyword name="QDoc Test C++ Classes" id="QDoc Test C++ Classes" ref="testcpp-module.html"/>
+            <keyword name="SeenClass" id="SeenClass" ref="seenclass.html"/>
+            <keyword name="Test" id="TestQDoc::Test" ref="testqdoc-test.html"/>
+            <keyword name="Test::SomeType" id="Test::SomeType" ref="testqdoc-test.html#SomeType-typedef"/>
+            <keyword name="TestDerived" id="TestQDoc::TestDerived" ref="testqdoc-testderived.html"/>
+            <keyword name="TestDerived::DerivedType" id="TestDerived::DerivedType" ref="testqdoc-testderived.html#DerivedType-alias"/>
+            <keyword name="TestDerived::NotTypedef" id="TestDerived::NotTypedef" ref="testqdoc-testderived.html#NotTypedef-alias"/>
+            <keyword name="TestQDoc" id="TestQDoc" ref="testqdoc.html"/>
+            <keyword name="anotherObsoleteMember" id="Test::anotherObsoleteMember" ref="testqdoc-test-obsolete.html#anotherObsoleteMember"/>
+            <keyword name="deprecatedMember" id="Test::deprecatedMember" ref="testqdoc-test-obsolete.html#deprecatedMember"/>
+            <keyword name="inlineFunction" id="Test::inlineFunction" ref="testqdoc-test.html#inlineFunction"/>
+            <keyword name="obsoleteMember" id="Test::obsoleteMember" ref="testqdoc-test-obsolete.html#obsoleteMember"/>
+            <keyword name="overload" id="Test::overload" ref="testqdoc-test.html#overload"/>
+            <keyword name="someFunction" id="Test::someFunction" ref="testqdoc-test.html#someFunction"/>
+            <keyword name="someFunctionDefaultArg" id="Test::someFunctionDefaultArg" ref="testqdoc-test.html#someFunctionDefaultArg"/>
+            <keyword name="virtualFun" id="Test::virtualFun" ref="testqdoc-test.html#virtualFun"/>
+            <keyword name="virtualFun" id="TestDerived::virtualFun" ref="testqdoc-testderived.html#virtualFun"/>
+        </keywords>
+        <files>
+            <file>classes.html</file>
+            <file>seenclass.html</file>
+            <file>testcpp-module.html</file>
+            <file>testqdoc-test-members.html</file>
+            <file>testqdoc-test-obsolete.html</file>
+            <file>testqdoc-test.html</file>
+            <file>testqdoc-testderived-members.html</file>
+            <file>testqdoc-testderived.html</file>
+            <file>testqdoc.html</file>
+        </files>
+    </filterSection>
+</QtHelpProject>
diff --git a/tests/auto/qdoc/generatedoutput/testdata/dontdocument/dontdocument.qdocconf b/tests/auto/qdoc/generatedoutput/testdata/dontdocument/dontdocument.qdocconf
index 117920e5..ef45f50a 100644
--- a/tests/auto/qdoc/generatedoutput/testdata/dontdocument/dontdocument.qdocconf
+++ b/tests/auto/qdoc/generatedoutput/testdata/dontdocument/dontdocument.qdocconf
@@ -3,5 +3,19 @@ include(../configs/testcpp.qdocconf)
 headers += dont.h
 sources += dont.cpp test.qdoc
 
+qhp.projects                    = DontDocument
+
+qhp.DontDocument.file           = dontdocument.qhp
+qhp.DontDocument.namespace      = org.qt-project.dontdocument.001
+qhp.DontDocument.virtualFolder  = test
+qhp.DontDocument.indexTitle     = QDoc Test C++ Classes
+qhp.DontDocument.indexRoot      =
+
+qhp.DontDocument.subprojects                        = classes
+qhp.DontDocument.subprojects.classes.title          = Classes
+qhp.DontDocument.subprojects.classes.indexTitle     = QDoc Test C++ Classes
+qhp.DontDocument.subprojects.classes.selectors      = class
+qhp.DontDocument.subprojects.classes.sortPages      = true
+
 HTML.nosubdirs = true
 HTML.outputsubdir = dontdocument
diff --git a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
index fd68159a..a83ba337 100644
--- a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
+++ b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
@@ -349,7 +349,8 @@ void tst_generatedOutput::dontDocument()
 {
     testAndCompare("testdata/dontdocument/dontdocument.qdocconf",
                    "dontdocument/classes.html "
-                   "dontdocument/seenclass.html");
+                   "dontdocument/seenclass.html "
+                   "dontdocument/dontdocument.qhp");
 }
 
 void tst_generatedOutput::inheritedQmlPropertyGroups()
-- 
2.33.0

From e293716c211468da779e65b8860430c055de78fa Mon Sep 17 00:00:00 2001
From: Topi Reinio <topi.reinio@qt.io>
Date: Wed, 18 Nov 2020 11:37:07 +0100
Subject: [PATCH 13/17] qdoc: Avoid excess warnings for undocumented namespaces

There is no need to generate a warning for an undocumented namespace
that is documented in another module.

Fixes: QTBUG-88603
Change-Id: Ibcaecad32a165776cd32290c823948570e3556cf
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
(cherry picked from commit 9eb640775743efe477d7791f7440a313447b9f61)
---
 src/qdoc/htmlgenerator.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/qdoc/htmlgenerator.cpp b/src/qdoc/htmlgenerator.cpp
index a554f1ac..24735237 100644
--- a/src/qdoc/htmlgenerator.cpp
+++ b/src/qdoc/htmlgenerator.cpp
@@ -1286,8 +1286,12 @@ void HtmlGenerator::generateCppReferencePage(Aggregate *aggregate, CodeMarker *m
         QString command = "documentation";
         if (aggregate->isClassNode())
             command = "\'\\class\' comment";
-        aggregate->location().warning(
-                tr("No %1 for '%2'").arg(command).arg(aggregate->plainSignature()));
+        if (!ns || ns->isDocumentedHere()) {
+            aggregate->location().warning(
+                    tr("No %1 for '%2'")
+                        .arg(command)
+                        .arg(aggregate->plainSignature()));
+        }
     } else {
         generateExtractionMark(aggregate, DetailedDescriptionMark);
         out() << "<div class=\"descr\">\n" // QTBUG-9504
-- 
2.33.0

From 5da6e2e3708cb0b655894dd58030ecc04ef3bd97 Mon Sep 17 00:00:00 2001
From: Li Xinwei <1326710505@qq.com>
Date: Fri, 27 Nov 2020 18:19:37 +0800
Subject: [PATCH 14/17] Fix qdbusviewer.exe missing version and copyright
 information

The rc file of qdbusviewer.exe should be generated by the build system.

Change-Id: I038d5a092d95089b5f7ff36e48c2657dea230772
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
(cherry picked from commit 3385dea6e3b69c76fa3a1ec176eee3d84d20f7b8)
---
 src/qdbus/qdbusviewer/qdbusviewer.pro | 2 +-
 src/qdbus/qdbusviewer/qdbusviewer.rc  | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)
 delete mode 100644 src/qdbus/qdbusviewer/qdbusviewer.rc

diff --git a/src/qdbus/qdbusviewer/qdbusviewer.pro b/src/qdbus/qdbusviewer/qdbusviewer.pro
index 02ec7a2d..07a47cd4 100644
--- a/src/qdbus/qdbusviewer/qdbusviewer.pro
+++ b/src/qdbus/qdbusviewer/qdbusviewer.pro
@@ -23,7 +23,7 @@ mac {
 }
 
 win32 {
-    RC_FILE = qdbusviewer.rc
+    RC_ICONS = images/qdbusviewer.ico
 }
 
 load(qt_app)
diff --git a/src/qdbus/qdbusviewer/qdbusviewer.rc b/src/qdbus/qdbusviewer/qdbusviewer.rc
deleted file mode 100644
index c4b1d60b..00000000
--- a/src/qdbus/qdbusviewer/qdbusviewer.rc
+++ /dev/null
@@ -1 +0,0 @@
-IDI_ICON1		ICON		DISCARDABLE	"images/qdbusviewer.ico"
-- 
2.33.0

#From 09db9653fac365821f56f4bf3db0e446180d2de0 Mon Sep 17 00:00:00 2001
#From: Antti Kokko <antti.kokko@qt.io>
#Date: Thu, 15 Oct 2020 09:53:19 +0300
#Subject: [PATCH 15/17] Add changes file for Qt 5.12.10
#
#Change-Id: Ib792058f1915a7737bd893769ec17dc3fde983bf
#Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
#(cherry picked from commit 1d665e7f4ac2a426e702c2935f11aa160e27bddb)
#Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
#---
# dist/changes-5.12.10 | 26 ++++++++++++++++++++++++++
# 1 file changed, 26 insertions(+)
# create mode 100644 dist/changes-5.12.10
#
#diff --git a/dist/changes-5.12.10 b/dist/changes-5.12.10
#new file mode 100644
#index 00000000..95c6a0b2
#--- /dev/null
#+++ b/dist/changes-5.12.10
#@@ -0,0 +1,26 @@
#+Qt 5.12.10 is a bug-fix release. It maintains both forward and backward
#+compatibility (source and binary) with Qt 5.12.9.
#+
#+For more details, refer to the online documentation included in this
#+distribution. The documentation is also available online:
#+
#+  https://doc.qt.io/qt-5.12/index.html
#+
#+The Qt version 5.12 series is binary compatible with the 5.11.x series.
#+Applications compiled for 5.11 will continue to run with 5.12.
#+
#+Some of the changes listed in this file include issue tracking numbers
#+corresponding to tasks in the Qt Bug Tracker:
#+
#+  https://bugreports.qt.io/
#+
#+Each of these identifiers can be entered in the bug tracker to obtain more
#+information about a particular change.
#+
#+****************************************************************************
#+*                   Important Behavior Changes                             *
#+****************************************************************************
#+
#+****************************************************************************
#+*                          Library                                         *
#+****************************************************************************
#-- 
#2.33.0

From 6c462cdcfc9fcca9c060fce034c3e3507d8830b6 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@qt.io>
Date: Mon, 30 Nov 2020 11:13:34 +0100
Subject: [PATCH 16/17] CMake: Fix handling of -extensions argument

Do not expand _lupdate_options for list commands; depending on the
content, this might cause CMake to treat it's content as separate
elements.

Also avoid IN_LIST; it was only introduced in CMake 3.3, while Qt 5.15
still also supports CMake 3.1, 3.2. Anyhow, we can as well just directly
list(FIND...).

Amends 2834bebc9e6ba9bf0577db1d7da42a52e622adc6

Change-Id: Ib4c73956477803cc8ec2f4048ffbab8daf2136e5
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Craig Scott <craig.scott@qt.io>
(cherry picked from commit 71ed18ed4b07c47e42f60c770bf7f5b4f8be4b20)
---
 src/linguist/Qt5LinguistToolsMacros.cmake | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/linguist/Qt5LinguistToolsMacros.cmake b/src/linguist/Qt5LinguistToolsMacros.cmake
index 3138aae4..20fb1493 100644
--- a/src/linguist/Qt5LinguistToolsMacros.cmake
+++ b/src/linguist/Qt5LinguistToolsMacros.cmake
@@ -41,10 +41,10 @@ function(QT5_CREATE_TRANSLATION _qm_files)
     set(_lupdate_files ${_LUPDATE_UNPARSED_ARGUMENTS})
     set(_lupdate_options ${_LUPDATE_OPTIONS})
 
-    if("-extensions" IN_LIST _lupdate_options)
-        list(FIND ${_lupdate_options} "-extensions" _extensions_index)
+    list(FIND _lupdate_options "-extensions" _extensions_index)
+    if(_extensions_index GREATER -1)
         math(EXPR _extensions_index "${_extensions_index} + 1")
-        list(GET ${_lupdate_options} ${_extensions_index} _extensions_list)
+        list(GET _lupdate_options ${_extensions_index} _extensions_list)
         string(REPLACE "," ";" _extensions_list "${_extensions_list}")
         list(TRANSFORM _extensions_list STRIP)
         list(TRANSFORM _extensions_list REPLACE "^\." "")
-- 
2.33.0

From 33693a928986006d79c1ee743733cde5966ac402 Mon Sep 17 00:00:00 2001
From: Kai Pastor <dg0yt@darc.de>
Date: Thu, 15 Oct 2020 07:48:49 +0200
Subject: [PATCH 17/17] Clamp registered collection time-stamp to
 SOURCE_DATE_EPOCH if set

Task-number: QTBUG-62697
Change-Id: I73cc41db9c57d050783e963896f9696c294126c3
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
(cherry picked from commit b463cd691b533ee31d602b2226b90d3c528b6a94)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
 src/assistant/help/qhelpcollectionhandler.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/assistant/help/qhelpcollectionhandler.cpp b/src/assistant/help/qhelpcollectionhandler.cpp
index 69782d45..d7b319d1 100644
--- a/src/assistant/help/qhelpcollectionhandler.cpp
+++ b/src/assistant/help/qhelpcollectionhandler.cpp
@@ -2197,7 +2197,15 @@ bool QHelpCollectionHandler::registerIndexTable(const QHelpDBReader::IndexTable
     m_query->addBindValue(fileName);
     const QFileInfo fi(absoluteDocPath(fileName));
     m_query->addBindValue(fi.size());
-    m_query->addBindValue(fi.lastModified().toString(Qt::ISODate));
+    QDateTime lastModified = fi.lastModified();
+    if (qEnvironmentVariableIsSet("SOURCE_DATE_EPOCH")) {
+        const QString sourceDateEpochStr = qEnvironmentVariable("SOURCE_DATE_EPOCH");
+        bool ok;
+        const qlonglong sourceDateEpoch = sourceDateEpochStr.toLongLong(&ok);
+        if (ok && sourceDateEpoch < lastModified.toSecsSinceEpoch())
+            lastModified.setSecsSinceEpoch(sourceDateEpoch);
+    }
+    m_query->addBindValue(lastModified.toString(Qt::ISODate));
     if (!m_query->exec())
         return false;
 
-- 
2.33.0

