-
-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
94 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
From 4a368a06afa5929d8674d2e94c2d7cbd6ad85d4e Mon Sep 17 00:00:00 2001 | ||
From: Paul Wicking <paul.wicking@qt.io> | ||
Date: Fri, 13 Sep 2024 14:37:38 +0200 | ||
Subject: [PATCH] QDoc: Adapt to breaking changes in LLVM 19 | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
Due to upstream changes in LLVM 19, QDoc fails to compile when linked | ||
against Clang libraries from this version of LLVM. Three issues arise; | ||
|
||
- Two cases of passing an argument of wrong type to a function. | ||
- One case of accessing a non-existing member of an enumeration. | ||
|
||
One upstream change (see [0]) is responsible for two of the issues: | ||
|
||
- `get_expression_as_string()` is modified such that it correctly | ||
obtains the parameter type when calling | ||
`get_fully_qualified_type_name()`, by appending | ||
`.getArgument().getAsType()` to the call to `getDefaultArgument()`. | ||
- `get_default_value_initializer_as_string()` is modified such that it | ||
correctly passes the source expression to | ||
`get_expression_as_string()`, by appending `.getSourceExpression()` | ||
to the call to `getDefaultArgument()`. | ||
|
||
Both of these changes are is incompatible with QDoc built against | ||
Clang libraries from earlier versions of LLVM, and are therefore | ||
wrapped in #if-ery. | ||
|
||
Finally, LLVM 19 drops a value used in QDoc from the enumeration | ||
`clang::TemplateName::Qualified`, see [1]. The enum value `Fully` is | ||
removed without replacement. The enum is left with two values, | ||
`AsWritten` and `None`. QDoc is modified such that it relies on the | ||
former of the two. This change doesn't cause any change in output from | ||
QDoc when built against Clang libraries from LLVM 17 and 18, and the | ||
change is therefore not wrapped in #if-ery. | ||
|
||
[0] - https://github.com/llvm/llvm-project/commit/e42b799bb28815431f2c5a95f7e13fde3f1b36a1 | ||
[1] - https://github.com/llvm/llvm-project/commit/9c4a716c12920 | ||
|
||
Done-with: Khem Raj <raj.khem@gmail.com> | ||
Fixes: QTBUG-128644 | ||
Pick-to: 6.8 | ||
Change-Id: I34fbb46cf28b5676b4adda5e563d6d59fc40f602 | ||
Reviewed-by: Luca Di Sera <luca.disera@qt.io> | ||
Reviewed-by: Topi Reiniö <topi.reinio@qt.io> | ||
--- | ||
src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp | 13 ++++++++++++- | ||
1 file changed, 12 insertions(+), 1 deletion(-) | ||
|
||
diff --git a/qttools/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp b/qttools/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp | ||
index eb3a781bc..385d651ec 100644 | ||
--- a/qttools/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp | ||
+++ b/qttools/src/qdoc/qdoc/src/qdoc/clangcodeparser.cpp | ||
@@ -207,9 +207,15 @@ static std::string get_expression_as_string(const clang::Expr* expression, const | ||
* If the parameter has no default value the empty string will be returned. | ||
*/ | ||
static std::string get_default_value_initializer_as_string(const clang::TemplateTypeParmDecl* parameter) { | ||
+#if LIBCLANG_VERSION_MAJOR >= 19 | ||
+ return (parameter && parameter->hasDefaultArgument()) ? | ||
+ get_fully_qualified_type_name(parameter->getDefaultArgument().getArgument().getAsType(), parameter->getASTContext()) : | ||
+ ""; | ||
+#else | ||
return (parameter && parameter->hasDefaultArgument()) ? | ||
get_fully_qualified_type_name(parameter->getDefaultArgument(), parameter->getASTContext()) : | ||
""; | ||
+#endif | ||
|
||
} | ||
|
||
@@ -223,8 +229,13 @@ static std::string get_default_value_initializer_as_string(const clang::Template | ||
* If the parameter as no default value the empty string will be returned. | ||
*/ | ||
static std::string get_default_value_initializer_as_string(const clang::NonTypeTemplateParmDecl* parameter) { | ||
+#if LIBCLANG_VERSION_MAJOR >= 19 | ||
+ return (parameter && parameter->hasDefaultArgument()) ? | ||
+ get_expression_as_string(parameter->getDefaultArgument().getSourceExpression(), parameter->getASTContext()) : ""; | ||
+#else | ||
return (parameter && parameter->hasDefaultArgument()) ? | ||
get_expression_as_string(parameter->getDefaultArgument(), parameter->getASTContext()) : ""; | ||
+#endif | ||
|
||
} | ||
|
||
@@ -244,7 +255,7 @@ static std::string get_default_value_initializer_as_string(const clang::Template | ||
const clang::TemplateName template_name = parameter->getDefaultArgument().getArgument().getAsTemplate(); | ||
|
||
llvm::raw_string_ostream ss{default_value}; | ||
- template_name.print(ss, parameter->getASTContext().getPrintingPolicy(), clang::TemplateName::Qualified::Fully); | ||
+ template_name.print(ss, parameter->getASTContext().getPrintingPolicy(), clang::TemplateName::Qualified::AsWritten); | ||
} | ||
|
||
return default_value; |