summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTopi Reinio <topi.reinio@qt.io>2023-08-17 19:25:59 +0000
committerTopi Reinio <topi.reinio@qt.io>2023-08-22 07:01:46 +0000
commit5c73f697368fa41ca842fea178933a47bfa82349 (patch)
tree213dac2e8e7b31199bd737a019a980030ebb0293
parent276bf3c3f45867f2968cad6092f9848d931a6062 (diff)
qdoc: Fix missing arguments in Node::signature() output
As part of a previous cleanup commit 4c3108e5c2, an overload of Node::signature() was introduced. This overload took two arguments, but it was not overridden by FunctionNode, causing the base implementation to be called at multiple call sites. This base implementation simply called Node::plainName(), causing a plain function name to be listed instead of the full signature that includes argument types and names. Remove the problematic overload, and modify the remaining signature() to accept a single argument; a new flag type that controls the parts to include in the reconstructed signature. This makes the call site code more readable, compared to three boolean arguments. Add a test case for the \reentrant command as this problem (missing arguments in the signature) was associated with its output. Fixes: QTBUG-115116 Change-Id: I70352532297b25b4c38249c0a724050cad47b07f (cherry picked from commit e47cb8bb01dd450d00937520022f25dd3d34dde0) Reviewed-by: Paul Wicking <paul.wicking@qt.io>
-rw-r--r--src/qdoc/docbookgenerator.cpp6
-rw-r--r--src/qdoc/functionnode.cpp30
-rw-r--r--src/qdoc/functionnode.h3
-rw-r--r--src/qdoc/generator.cpp5
-rw-r--r--src/qdoc/node.cpp16
-rw-r--r--src/qdoc/node.h13
-rw-r--r--src/qdoc/qdocindexfiles.cpp2
-rw-r--r--src/qdoc/tagfilewriter.cpp2
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/docbook/testqdoc-test.xml15
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/html/testqdoc-test.webxml4
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/ignoresince/testqdoc-test.html5
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/properties/testcpp.index5
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/scopedenum-docbook/testqdoc-test.xml15
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/scopedenum/testqdoc-test.html5
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/template/testqdoc-test.html5
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/testcpp.index5
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/testqdoc-test.html5
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/testcpp/classlists.qdoc5
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/testcpp/testcpp.cpp2
19 files changed, 109 insertions, 39 deletions
diff --git a/src/qdoc/docbookgenerator.cpp b/src/qdoc/docbookgenerator.cpp
index 756570dd1..305bb81c8 100644
--- a/src/qdoc/docbookgenerator.cpp
+++ b/src/qdoc/docbookgenerator.cpp
@@ -3006,7 +3006,7 @@ void DocBookGenerator::generateSignatureList(const NodeList &nodes)
m_writer->writeStartElement(dbNamespace, "para");
generateSimpleLink(currentGenerator()->fullDocumentLocation(*n),
- (*n)->signature(false, true));
+ (*n)->signature(Node::SignaturePlain));
m_writer->writeEndElement(); // para
newLine();
@@ -3429,7 +3429,7 @@ void DocBookGenerator::generateReimplementsClause(const FunctionNode *fn)
m_writer->writeStartElement(dbNamespace, "para");
m_writer->writeCharacters("Reimplements: ");
QString fullName =
- overrides->parent()->name() + "::" + overrides->signature(false, true);
+ overrides->parent()->name() + "::" + overrides->signature(Node::SignaturePlain);
generateFullName(overrides->parent(), fullName, overrides);
m_writer->writeCharacters(".");
m_writer->writeEndElement(); // para
@@ -3877,7 +3877,7 @@ void DocBookGenerator::generateDocBookSynopsis(const Node *node)
associatedProperties.join(QLatin1Char(',')));
}
- QString signature = functionNode->signature(false, false);
+ QString signature = functionNode->signature(Node::SignatureReturnType);
// 'const' is already part of FunctionNode::signature()
if (functionNode->isFinal())
signature += " final";
diff --git a/src/qdoc/functionnode.cpp b/src/qdoc/functionnode.cpp
index f212fdb47..03785801f 100644
--- a/src/qdoc/functionnode.cpp
+++ b/src/qdoc/functionnode.cpp
@@ -410,24 +410,34 @@ bool FunctionNode::isDeprecated() const
*/
/*!
- Reconstructs and returns the function's signature. If \a values
- is \c true, the default values of the parameters are included.
- The return type is included unless \a noReturnType is \c true.
- Function templates are prefixed with \c {template <parameter_list>}
- if \a templateParams is \c true.
+ Reconstructs and returns the function's signature.
+
+ Specific parts of the signature are included according to
+ flags in \a options:
+
+ \value Node::SignaturePlain
+ Plain signature
+ \value Node::SignatureDefaultValues
+ Include any default argument values
+ \value Node::SignatureReturnType
+ Include return type
+ \value Node::SignatureTemplateParams
+ Include \c {template <parameter_list>} if one exists
*/
-QString FunctionNode::signature(bool values, bool noReturnType, bool templateParams) const
+QString FunctionNode::signature(Node::SignatureOptions options) const
{
QStringList elements;
- if (templateParams)
+ if (options & Node::SignatureTemplateParams)
elements << templateDecl();
- if (!noReturnType)
+ if (options & Node::SignatureReturnType)
elements << m_returnType;
elements.removeAll(QString());
if (!isMacroWithoutParams()) {
- elements << name() + QLatin1Char('(') + m_parameters.signature(values) + QLatin1Char(')');
+ elements << name() + QLatin1Char('(')
+ + m_parameters.signature(options & Node::SignatureDefaultValues)
+ + QLatin1Char(')');
if (!isMacro()) {
if (isConst())
elements << QStringLiteral("const");
@@ -497,7 +507,7 @@ bool FunctionNode::isIgnored() const
|| name() == QLatin1String("d_func")) {
return true;
}
- QString s = signature(false, false);
+ QString s = signature(Node::SignatureReturnType);
if (s.contains(QLatin1String("enum_type")) && s.contains(QLatin1String("operator|")))
return true;
}
diff --git a/src/qdoc/functionnode.h b/src/qdoc/functionnode.h
index 64f22307e..e720f1522 100644
--- a/src/qdoc/functionnode.h
+++ b/src/qdoc/functionnode.h
@@ -108,8 +108,7 @@ public:
[[nodiscard]] const Parameters &parameters() const { return m_parameters; }
[[nodiscard]] bool isPrivateSignal() const { return m_parameters.isPrivateSignal(); }
void setParameters(const QString &signature) { m_parameters.set(signature); }
- [[nodiscard]] QString signature(bool values, bool noReturnType,
- bool templateParams = false) const override;
+ [[nodiscard]] QString signature(Node::SignatureOptions options) const override;
[[nodiscard]] const QString &overridesThis() const { return m_overridesThis; }
[[nodiscard]] const QList<PropertyNode *> &associatedProperties() const { return m_associatedProperties; }
diff --git a/src/qdoc/generator.cpp b/src/qdoc/generator.cpp
index d368dfa98..5da779781 100644
--- a/src/qdoc/generator.cpp
+++ b/src/qdoc/generator.cpp
@@ -112,7 +112,7 @@ void Generator::appendSignature(Text &text, const Node *node)
{
text << Atom(Atom::LinkNode, CodeMarker::stringForNode(node))
<< Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK)
- << Atom(Atom::String, node->signature(false, true))
+ << Atom(Atom::String, node->signature(Node::SignaturePlain))
<< Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK);
}
@@ -1130,7 +1130,8 @@ void Generator::generateReimplementsClause(const FunctionNode *fn, CodeMarker *m
Text text;
text << Atom::ParaLeft << "Reimplements: ";
QString fullName =
- overrides->parent()->name() + "::" + overrides->signature(false, true);
+ overrides->parent()->name()
+ + "::" + overrides->signature(Node::SignaturePlain);
appendFullName(text, overrides->parent(), fullName, overrides);
text << "." << Atom::ParaRight;
generateText(text, fn, marker);
diff --git a/src/qdoc/node.cpp b/src/qdoc/node.cpp
index c3c8ac4e8..10b09238c 100644
--- a/src/qdoc/node.cpp
+++ b/src/qdoc/node.cpp
@@ -68,7 +68,8 @@ bool Node::nodeNameLessThan(const Node *n1, const Node *n2)
const auto *f2 = static_cast<const FunctionNode *>(n2);
LT_RETURN_IF_NOT_EQUAL(f1->isConst(), f2->isConst());
- LT_RETURN_IF_NOT_EQUAL(f1->signature(false, false), f2->signature(false, false));
+ LT_RETURN_IF_NOT_EQUAL(f1->signature(Node::SignatureReturnType),
+ f2->signature(Node::SignatureReturnType));
}
LT_RETURN_IF_NOT_EQUAL(n1->nodeType(), n2->nodeType());
@@ -474,7 +475,7 @@ QString Node::plainSignature() const
QString fullName;
const Node *node = this;
while (node) {
- fullName.prepend(node->signature(false, true));
+ fullName.prepend(node->signature(Node::SignaturePlain));
if (node->parent()->name().isEmpty())
break;
fullName.prepend(QLatin1String("::"));
@@ -1015,15 +1016,14 @@ void Node::setDeprecatedSince(const QString &sinceVersion)
Sets this node's Genus to \a t.
*/
-/*! \fn QString Node::signature(bool values, bool noReturnType, bool templateParams) const
+/*! \fn QString Node::signature(Node::SignatureOptions options) const
- If this node is a FunctionNode, this function returns the function's
- signature, including default values if \a values is \c true,
- function's return type if \a noReturnType is \c false, and
- prefixed with 'template <parameter_list>' for function templates
- if templateParams is \true.
+ Specific parts of the signature are included according to flags in
+ \a options.
If this node is not a FunctionNode, this function returns plainName().
+
+ \sa FunctionNode::signature()
*/
/*! \fn const QString &Node::fileNameBase() const
diff --git a/src/qdoc/node.h b/src/qdoc/node.h
index 85643add6..9c1bef439 100644
--- a/src/qdoc/node.h
+++ b/src/qdoc/node.h
@@ -99,6 +99,14 @@ public:
ThreadSafe
};
+ enum SignatureOption : unsigned char {
+ SignaturePlain = 0x0,
+ SignatureDefaultValues = 0x1,
+ SignatureReturnType = 0x2,
+ SignatureTemplateParams = 0x4
+ };
+ Q_DECLARE_FLAGS(SignatureOptions, SignatureOption)
+
enum LinkType : unsigned char { StartLink, NextLink, PreviousLink, ContentsLink };
enum FlagValue { FlagValueDefault = -1, FlagValueFalse = 0, FlagValueTrue = 1 };
@@ -186,8 +194,7 @@ public:
QString plainFullName(const Node *relative = nullptr) const;
[[nodiscard]] QString plainSignature() const;
QString fullName(const Node *relative = nullptr) const;
- [[nodiscard]] virtual QString signature(bool, bool) const { return plainName(); }
- [[nodiscard]] virtual QString signature(bool, bool, bool) const { return plainName(); }
+ [[nodiscard]] virtual QString signature(Node::SignatureOptions) const { return plainName(); }
[[nodiscard]] const QString &fileNameBase() const { return m_fileNameBase; }
[[nodiscard]] bool hasFileNameBase() const { return !m_fileNameBase.isEmpty(); }
@@ -334,6 +341,8 @@ private:
QString m_deprecatedSince {};
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(Node::SignatureOptions)
+
QT_END_NAMESPACE
#endif
diff --git a/src/qdoc/qdocindexfiles.cpp b/src/qdoc/qdocindexfiles.cpp
index 6631eb3af..74de90835 100644
--- a/src/qdoc/qdocindexfiles.cpp
+++ b/src/qdoc/qdocindexfiles.cpp
@@ -1247,7 +1247,7 @@ void QDocIndexFiles::generateFunctionSection(QXmlStreamWriter &writer, FunctionN
index file, but it is not read back in by qdoc. However,
we need it for the webxml generator.
*/
- QString signature = fn->signature(false, false);
+ QString signature = fn->signature(Node::SignatureReturnType);
// 'const' is already part of FunctionNode::signature()
if (fn->isFinal())
signature += " final";
diff --git a/src/qdoc/tagfilewriter.cpp b/src/qdoc/tagfilewriter.cpp
index bef0c693d..53cfcc599 100644
--- a/src/qdoc/tagfilewriter.cpp
+++ b/src/qdoc/tagfilewriter.cpp
@@ -205,7 +205,7 @@ void TagFileWriter::generateTagFileMembers(QXmlStreamWriter &writer, const Aggre
m_generator->fullDocumentLocation(node, false).split(QLatin1Char('#'));
writer.writeTextElement("anchorfile", pieces[0]);
writer.writeTextElement("anchor", pieces[1]);
- QString signature = functionNode->signature(false, false);
+ QString signature = functionNode->signature(Node::SignatureReturnType);
signature = signature.mid(signature.indexOf(QChar('('))).trimmed();
if (functionNode->isConst())
signature += " const";
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/docbook/testqdoc-test.xml b/tests/auto/qdoc/generatedoutput/expected_output/docbook/testqdoc-test.xml
index 9186b87a1..86a0790b0 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/docbook/testqdoc-test.xml
+++ b/tests/auto/qdoc/generatedoutput/expected_output/docbook/testqdoc-test.xml
@@ -8,6 +8,15 @@
<db:abstract>
<db:para>A class in a namespace.</db:para>
<db:para>This class was introduced in Qt 2.0.</db:para>
+<db:note>
+<db:para>All functions in this class are <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link> with the following exceptions:</db:para>
+<db:para>These functions are not <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link>:</db:para>
+<db:itemizedlist>
+<db:listitem>
+<db:para><db:link xlink:href="testqdoc-test.xml#someFunctionDefaultArg">someFunctionDefaultArg(int i, bool b)</db:link></db:para>
+</db:listitem>
+</db:itemizedlist>
+</db:note>
</db:abstract>
</db:info>
<db:variablelist>
@@ -216,10 +225,12 @@
<db:synopsisinfo role="signature">void someFunctionDefaultArg(int i, bool b)</db:synopsisinfo>
<db:synopsisinfo role="access">public</db:synopsisinfo>
<db:synopsisinfo role="status">active</db:synopsisinfo>
-<db:synopsisinfo role="threadsafeness">unspecified</db:synopsisinfo>
+<db:synopsisinfo role="threadsafeness">non-reentrant</db:synopsisinfo>
</db:methodsynopsis>
<db:para>Function that takes a parameter <db:code role="parameter">i</db:code> and <db:code role="parameter">b</db:code>.</db:para>
-</db:section>
+<db:warning>
+<db:para>This function is not <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link>.</db:para>
+</db:warning></db:section>
<db:section xml:id="virtualFun">
<db:title>[virtual] void Test::virtualFun()</db:title>
<db:methodsynopsis>
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/html/testqdoc-test.webxml b/tests/auto/qdoc/generatedoutput/expected_output/html/testqdoc-test.webxml
index 38a1c6817..a8c4faffc 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/html/testqdoc-test.webxml
+++ b/tests/auto/qdoc/generatedoutput/expected_output/html/testqdoc-test.webxml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<WebXML>
<document>
- <class name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
+ <class threadsafety="reentrant" name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
<description>
<brief>A class in a namespace.</brief>
</description>
@@ -99,7 +99,7 @@
<para>Function that takes a parameter <argument>v</argument>. Also returns the value of <argument>v</argument>.</para>
</description>
</function>
- <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
+ <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" threadsafety="non-reentrant" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
<parameter type="int" name="i" default=""/>
<parameter type="bool" name="b" default="false"/>
<description>
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/ignoresince/testqdoc-test.html b/tests/auto/qdoc/generatedoutput/expected_output/ignoresince/testqdoc-test.html
index 368591c64..62e5a0e13 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/ignoresince/testqdoc-test.html
+++ b/tests/auto/qdoc/generatedoutput/expected_output/ignoresince/testqdoc-test.html
@@ -41,6 +41,10 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<li><a href="testqdoc-test-obsolete.html">Deprecated members</a></li>
<li>Test is part of <a href="cpptypes.html">Test C++ Types</a>.</li>
</ul>
+<p><b>Note:</b> All functions in this class are <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a> with the following exceptions:</p>
+<ul>
+<li><a href="testqdoc-test.html#someFunctionDefaultArg" translate="no">someFunctionDefaultArg</a>(int i, bool b)</li>
+</ul>
<h2 id="public-types">Public Types</h2>
<div class="table"><table class="alignedsummary" translate="no">
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="testqdoc-test.html#SomeType-typedef" translate="no">SomeType</a></b></td></tr>
@@ -129,6 +133,7 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<!-- $$$someFunctionDefaultArg[overload1]$$$someFunctionDefaultArgintbool -->
<h3 class="fn" translate="no" id="someFunctionDefaultArg"><code translate="no">[since 2.0] </code><span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false)</h3>
<p>Function that takes a parameter <i translate="no">i</i> and <i translate="no">b</i>.</p>
+<p><b>Warning:</b> This function is not <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a>.</p>
<p>This function was introduced in Qt 2.0.</p>
<!-- @@@someFunctionDefaultArg -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/properties/testcpp.index b/tests/auto/qdoc/generatedoutput/expected_output/properties/testcpp.index
index a159c898d..71b625a9e 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/properties/testcpp.index
+++ b/tests/auto/qdoc/generatedoutput/expected_output/properties/testcpp.index
@@ -21,7 +21,7 @@
<namespace name="TestQDoc" href="testqdoc.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" module="TestCPP" brief="A namespace">
<contents name="usage" title="Usage" level="1"/>
<function name="QDOCTEST_MACRO" href="testqdoc.html#QDOCTEST_MACRO" status="active" access="public" documented="true" related="0" meta="macrowithoutparams" virtual="non" const="false" static="false" final="false" override="false" type="" signature="QDOCTEST_MACRO"/>
- <class name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
+ <class threadsafety="reentrant" name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
<function name="QDOCTEST_MACRO2" href="testqdoc-test.html#QDOCTEST_MACRO2" status="active" access="public" documented="true" related="1" since="Test 1.1" meta="macrowithparams" virtual="non" const="false" static="false" final="false" override="false" type="" brief="A macro with argument x" signature="QDOCTEST_MACRO2(int &amp;x)" groups="testgroup">
<parameter type="int &amp;" name="x" default=""/>
</function>
@@ -53,7 +53,7 @@
<parameter type="int" name="" default=""/>
<parameter type="int" name="v" default="0"/>
</function>
- <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
+ <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" threadsafety="non-reentrant" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
<parameter type="int" name="i" default=""/>
<parameter type="bool" name="b" default="false"/>
</function>
@@ -109,6 +109,7 @@
<qmlclass name="TheType" href="qml-thetype.html" status="active" access="public" location="properties.qdoc" documented="true" title="TheType" fulltitle="TheType" subtitle="">
<qmlproperty name="name" fullname="TheType::name" href="qml-thetype.html#name-prop" status="active" access="public" location="properties.qdoc" documented="true" type="string" attached="false" writable="false" brief="Read-only status of this property is resolved from Q_PROPERTY"/>
</qmlclass>
+ <page name="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" status="active" location="classlists.qdoc" documented="true" subtype="externalpage" title="reentrant" fulltitle="reentrant" subtitle=""/>
<group name="cpptypes" href="cpptypes.html" status="active" location="classlists.qdoc" documented="true" seen="true" title="Test C++ Types"/>
<group name="testgroup" href="testgroup.html" status="internal" seen="false" title=""/>
<module name="TestCPP" href="testcpp-module.html" status="active" since="2.0" documented="true" seen="true" title="QDoc Test C++ Classes" brief="A test module page">
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/scopedenum-docbook/testqdoc-test.xml b/tests/auto/qdoc/generatedoutput/expected_output/scopedenum-docbook/testqdoc-test.xml
index e693982f3..a9cc63306 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/scopedenum-docbook/testqdoc-test.xml
+++ b/tests/auto/qdoc/generatedoutput/expected_output/scopedenum-docbook/testqdoc-test.xml
@@ -8,6 +8,15 @@
<db:abstract>
<db:para>A class in a namespace.</db:para>
<db:para>This class was introduced in Qt 2.0.</db:para>
+<db:note>
+<db:para>All functions in this class are <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link> with the following exceptions:</db:para>
+<db:para>These functions are not <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link>:</db:para>
+<db:itemizedlist>
+<db:listitem>
+<db:para><db:link xlink:href="testqdoc-test.xml#someFunctionDefaultArg">someFunctionDefaultArg(int i, bool b)</db:link></db:para>
+</db:listitem>
+</db:itemizedlist>
+</db:note>
</db:abstract>
</db:info>
<db:variablelist>
@@ -342,10 +351,12 @@
<db:synopsisinfo role="signature">void someFunctionDefaultArg(int i, bool b)</db:synopsisinfo>
<db:synopsisinfo role="access">public</db:synopsisinfo>
<db:synopsisinfo role="status">active</db:synopsisinfo>
-<db:synopsisinfo role="threadsafeness">unspecified</db:synopsisinfo>
+<db:synopsisinfo role="threadsafeness">non-reentrant</db:synopsisinfo>
</db:methodsynopsis>
<db:para>Function that takes a parameter <db:code role="parameter">i</db:code> and <db:code role="parameter">b</db:code>.</db:para>
-</db:section>
+<db:warning>
+<db:para>This function is not <db:link xlink:href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</db:link>.</db:para>
+</db:warning></db:section>
<db:section xml:id="virtualFun">
<db:title>[virtual] void Test::virtualFun()</db:title>
<db:methodsynopsis>
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/scopedenum/testqdoc-test.html b/tests/auto/qdoc/generatedoutput/expected_output/scopedenum/testqdoc-test.html
index 9027d5d44..a8d0799d4 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/scopedenum/testqdoc-test.html
+++ b/tests/auto/qdoc/generatedoutput/expected_output/scopedenum/testqdoc-test.html
@@ -41,6 +41,10 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<li><a href="testqdoc-test-obsolete.html">Deprecated members</a></li>
<li>Test is part of <a href="cpptypes.html">Test C++ Types</a>.</li>
</ul>
+<p><b>Note:</b> All functions in this class are <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a> with the following exceptions:</p>
+<ul>
+<li><a href="testqdoc-test.html#someFunctionDefaultArg" translate="no">someFunctionDefaultArg</a>(int i, bool b)</li>
+</ul>
<h2 id="public-types">Public Types</h2>
<div class="table"><table class="alignedsummary" translate="no">
<tr><td class="memItemLeft rightAlign topAlign"> enum </td><td class="memItemRight bottomAlign"><b><a href="testqdoc-test.html#ClassicEnum-enum" translate="no">ClassicEnum</a></b> { Yee, Haw, Howdy, Partner }</td></tr>
@@ -148,6 +152,7 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<!-- $$$someFunctionDefaultArg[overload1]$$$someFunctionDefaultArgintbool -->
<h3 class="fn" translate="no" id="someFunctionDefaultArg"><span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false)</h3>
<p>Function that takes a parameter <i translate="no">i</i> and <i translate="no">b</i>.</p>
+<p><b>Warning:</b> This function is not <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a>.</p>
<!-- @@@someFunctionDefaultArg -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
<h3 class="fn" translate="no" id="virtualFun"><code translate="no">[virtual] </code><span class="type">void</span> Test::<span class="name">virtualFun</span>()</h3>
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/template/testqdoc-test.html b/tests/auto/qdoc/generatedoutput/expected_output/template/testqdoc-test.html
index a52a987ed..cbe201447 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/template/testqdoc-test.html
+++ b/tests/auto/qdoc/generatedoutput/expected_output/template/testqdoc-test.html
@@ -41,6 +41,10 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<li><a href="testqdoc-test-obsolete.html">Deprecated members</a></li>
<li>Test is part of <a href="cpptypes.html">Test C++ Types</a>.</li>
</ul>
+<p><b>Note:</b> All functions in this class are <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a> with the following exceptions:</p>
+<ul>
+<li><a href="testqdoc-test.html#someFunctionDefaultArg" translate="no">someFunctionDefaultArg</a>(int i, bool b)</li>
+</ul>
<h2 id="public-types">Public Types</h2>
<div class="table"><table class="alignedsummary" translate="no">
<tr><td class="memItemLeft rightAlign topAlign"> struct </td><td class="memItemRight bottomAlign"><b><a href="testqdoc-test-struct.html" translate="no">Struct</a></b></td></tr>
@@ -139,6 +143,7 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<!-- $$$someFunctionDefaultArg[overload1]$$$someFunctionDefaultArgintbool -->
<h3 class="fn" translate="no" id="someFunctionDefaultArg"><span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false)</h3>
<p>Function that takes a parameter <i translate="no">i</i> and <i translate="no">b</i>.</p>
+<p><b>Warning:</b> This function is not <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a>.</p>
<!-- @@@someFunctionDefaultArg -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
<h3 class="fn" translate="no" id="virtualFun"><code translate="no">[virtual] </code><span class="type">void</span> Test::<span class="name">virtualFun</span>()</h3>
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/testcpp.index b/tests/auto/qdoc/generatedoutput/expected_output/testcpp.index
index cda202ac8..3509e2834 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/testcpp.index
+++ b/tests/auto/qdoc/generatedoutput/expected_output/testcpp.index
@@ -20,7 +20,7 @@
<namespace name="TestQDoc" href="testqdoc.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" module="TestCPP" brief="A namespace">
<contents name="usage" title="Usage" level="1"/>
<function name="QDOCTEST_MACRO" href="testqdoc.html#QDOCTEST_MACRO" status="active" access="public" documented="true" related="0" meta="macrowithoutparams" virtual="non" const="false" static="false" final="false" override="false" type="" signature="QDOCTEST_MACRO"/>
- <class name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
+ <class threadsafety="reentrant" name="Test" fullname="TestQDoc::Test" href="testqdoc-test.html" status="active" access="public" location="testcpp.h" since="2.0" documented="true" groups="cpptypes,testgroup" module="TestCPP" brief="A class in a namespace">
<function name="QDOCTEST_MACRO2" href="testqdoc-test.html#QDOCTEST_MACRO2" status="active" access="public" documented="true" related="1" since="Test 1.1" meta="macrowithparams" virtual="non" const="false" static="false" final="false" override="false" type="" brief="A macro with argument x" signature="QDOCTEST_MACRO2(int &amp;x)" groups="testgroup">
<parameter type="int &amp;" name="x" default=""/>
</function>
@@ -52,7 +52,7 @@
<parameter type="int" name="" default=""/>
<parameter type="int" name="v" default="0"/>
</function>
- <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
+ <function name="someFunctionDefaultArg" fullname="TestQDoc::Test::someFunctionDefaultArg" href="testqdoc-test.html#someFunctionDefaultArg" threadsafety="non-reentrant" status="active" access="public" location="testcpp.h" documented="true" meta="plain" virtual="non" const="false" static="false" final="false" override="false" type="void" signature="void someFunctionDefaultArg(int i, bool b)" groups="testgroup">
<parameter type="int" name="i" default=""/>
<parameter type="bool" name="b" default="false"/>
</function>
@@ -67,6 +67,7 @@
<typedef name="NotTypedef" fullname="TestQDoc::TestDerived::NotTypedef" href="testqdoc-testderived.html#NotTypedef-typedef" status="active" access="public" location="testcpp.h" documented="true" aliasedtype="int"/>
</class>
</namespace>
+ <page name="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" status="active" location="classlists.qdoc" documented="true" subtype="externalpage" title="reentrant" fulltitle="reentrant" subtitle=""/>
<group name="cpptypes" href="cpptypes.html" status="active" location="classlists.qdoc" documented="true" seen="true" title="Test C++ Types"/>
<group name="testgroup" href="testgroup.html" status="internal" seen="false" title=""/>
<module name="TestCPP" href="testcpp-module.html" status="active" since="2.0" documented="true" seen="true" title="QDoc Test C++ Classes" brief="A test module page">
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/testqdoc-test.html b/tests/auto/qdoc/generatedoutput/expected_output/testqdoc-test.html
index 345a97221..81e2782cb 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/testqdoc-test.html
+++ b/tests/auto/qdoc/generatedoutput/expected_output/testqdoc-test.html
@@ -41,6 +41,10 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<li><a href="testqdoc-test-obsolete.html">Deprecated members</a></li>
<li>Test is part of <a href="cpptypes.html">Test C++ Types</a>.</li>
</ul>
+<p><b>Note:</b> All functions in this class are <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a> with the following exceptions:</p>
+<ul>
+<li><a href="testqdoc-test.html#someFunctionDefaultArg" translate="no">someFunctionDefaultArg</a>(int i, bool b)</li>
+</ul>
<h2 id="public-types">Public Types</h2>
<div class="table"><table class="alignedsummary" translate="no">
<tr><td class="memItemLeft rightAlign topAlign"> </td><td class="memItemRight bottomAlign"><b><a href="testqdoc-test.html#SomeType-typedef" translate="no">SomeType</a></b></td></tr>
@@ -128,6 +132,7 @@ target_link_libraries(mytarget PRIVATE Qt6::QDocTest)</td></tr>
<!-- $$$someFunctionDefaultArg[overload1]$$$someFunctionDefaultArgintbool -->
<h3 class="fn" translate="no" id="someFunctionDefaultArg"><span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false)</h3>
<p>Function that takes a parameter <i translate="no">i</i> and <i translate="no">b</i>.</p>
+<p><b>Warning:</b> This function is not <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command" translate="no">reentrant</a>.</p>
<!-- @@@someFunctionDefaultArg -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
<h3 class="fn" translate="no" id="virtualFun"><code translate="no">[virtual] </code><span class="type">void</span> Test::<span class="name">virtualFun</span>()</h3>
diff --git a/tests/auto/qdoc/generatedoutput/testdata/testcpp/classlists.qdoc b/tests/auto/qdoc/generatedoutput/testdata/testcpp/classlists.qdoc
index 8f6e9b6b7..89ed2a1b5 100644
--- a/tests/auto/qdoc/generatedoutput/testdata/testcpp/classlists.qdoc
+++ b/tests/auto/qdoc/generatedoutput/testdata/testcpp/classlists.qdoc
@@ -41,3 +41,8 @@
\generatelist testgroup
*/
+
+/*!
+ \externalpage https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command
+ \title reentrant
+*/
diff --git a/tests/auto/qdoc/generatedoutput/testdata/testcpp/testcpp.cpp b/tests/auto/qdoc/generatedoutput/testdata/testcpp/testcpp.cpp
index 68bd598d5..61ba19fdb 100644
--- a/tests/auto/qdoc/generatedoutput/testdata/testcpp/testcpp.cpp
+++ b/tests/auto/qdoc/generatedoutput/testdata/testcpp/testcpp.cpp
@@ -70,6 +70,7 @@ namespace TestQDoc {
\endif
\ingroup testgroup
\ingroup cpptypes
+ \reentrant
*/
/*!
@@ -143,6 +144,7 @@ void Test::anotherObsoleteMember()
}
/*!
+ \nonreentrant
Function that takes a parameter \a i and \a b.
\if defined(test_ignoresince)
\since 2.0