aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
index cf489eb2e..ee34b29ae 100644
--- a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
@@ -247,8 +247,16 @@ bool BuilderPrivate::addClass(const CXCursor &cursor, CodeModel::ClassType t)
if (isClassCursor(semPar)) {
const CursorClassHash::const_iterator it = m_cursorClassHash.constFind(semPar);
if (it == m_cursorClassHash.constEnd()) {
- const QString message = QStringLiteral("Unable to find parent of inner class ") + className;
- const Diagnostic d(message, cursor, CXDiagnostic_Error);
+ QString message;
+ QTextStream(&message) << "Unable to find containing class \""
+ << getCursorSpelling(semPar) << "\" of inner class \""
+ << className << "\".";
+ // PYSIDE-1501: Has been observed to fail for inner class of
+ // template with separated implementation where a forward
+ // declaration of the outer template is reported (Boost).
+ const auto severity = semPar.kind == CXCursor_ClassTemplate
+ ? CXDiagnostic_Warning : CXDiagnostic_Error;
+ const Diagnostic d(message, cursor, severity);
qWarning() << d;
m_baseVisitor->appendDiagnostic(d);
return false;
@@ -965,16 +973,17 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor)
case CXCursor_ClassDecl:
case CXCursor_UnionDecl:
case CXCursor_StructDecl:
- if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0)
+ if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0
+ || !d->addClass(cursor, codeModelClassTypeFromCursor(cursor.kind))) {
return Skip;
- if (!d->addClass(cursor, codeModelClassTypeFromCursor(cursor.kind)))
- return Error;
+ }
break;
case CXCursor_ClassTemplate:
case CXCursor_ClassTemplatePartialSpecialization:
- if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0)
+ if (d->m_withinFriendDecl || clang_isCursorDefinition(cursor) == 0
+ || !d->addClass(cursor, CodeModel::Class)) {
return Skip;
- d->addClass(cursor, CodeModel::Class);
+ }
d->m_currentClass->setName(d->m_currentClass->name() + templateBrackets());
d->m_scope.back() += templateBrackets();
break;