diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index 10f5703615..88b16b94cd 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -677,25 +677,18 @@ populate( // isn’t regular so we pick up their members/docs. if (config_->inheritBaseMembers != PublicSettings::BaseMemberInheritance::Never) { - if (auto const* baseDecl = BT->getAsCXXRecordDecl()) + if (auto const* baseDecl = BT->getAsCXXRecordDecl(); + baseDecl && baseDecl->isCompleteDefinition()) { - if (auto const* baseDef = baseDecl->getDefinition(); - baseDef) + if (auto* baseInfo = find(baseDecl); + !baseInfo + || (baseInfo->Extraction != ExtractionMode::Regular + && traversedRecordsForBaseClassExtraction_ + .emplace(baseDecl) + .second)) { - if (auto const* baseInfo = find(baseDef); - baseInfo) - { - if (baseInfo->Extraction != ExtractionMode::Regular) - { - ScopeExitRestore s(mode_, TraversalMode::BaseClass); - traverse(baseDef); - } - } - else - { - ScopeExitRestore s(mode_, TraversalMode::BaseClass); - traverse(baseDef); - } + ScopeExitRestore s(mode_, TraversalMode::BaseClass); + traverse(baseDecl); } } } diff --git a/src/lib/AST/ASTVisitor.hpp b/src/lib/AST/ASTVisitor.hpp index c36c87839c..4fa15dfaf1 100644 --- a/src/lib/AST/ASTVisitor.hpp +++ b/src/lib/AST/ASTVisitor.hpp @@ -101,6 +101,17 @@ class ASTVisitor */ UndocumentedSymbolSet undocumented_; + /* + A set of records already traversed for base class extraction + + When traversing base classes in BaseClass traversal mode, + we need to avoid traversing the same record multiple times. + This set keeps track of records that have already been + traversed for base class extraction. + */ + std::unordered_set + traversedRecordsForBaseClassExtraction_; + /* Struct to hold pre-processed file information. This struct stores information about a file, including its full path, diff --git a/test-files/golden-tests/symbols/record/forward-declared-member.adoc b/test-files/golden-tests/symbols/record/forward-declared-member.adoc new file mode 100644 index 0000000000..9d8ab7e930 --- /dev/null +++ b/test-files/golden-tests/symbols/record/forward-declared-member.adoc @@ -0,0 +1,50 @@ += Reference +:mrdocs: + +[#index] +== Global namespace + +=== Namespaces + +[cols=1] +|=== +| Name +| link:#fmt[`fmt`] +|=== + +[#fmt] +== fmt + +=== Types + +[cols=1] +|=== +| Name +| link:#fmt-path[`path`] +|=== + +[#fmt-path] +== link:#fmt[fmt]::path + +=== Synopsis + +Declared in `<forward‐declared‐member.cpp>` + +[source,cpp,subs="verbatim,replacements,macros,-callouts"] +---- +struct path + : std::path +---- + +=== Base Classes + +[cols="1,4"] +|=== +|Name|Description + +| `std::path` +| +|=== + + +[.small]#Created with https://www.mrdocs.com[MrDocs]# diff --git a/test-files/golden-tests/symbols/record/forward-declared-member.cpp b/test-files/golden-tests/symbols/record/forward-declared-member.cpp new file mode 100644 index 0000000000..91362eda4f --- /dev/null +++ b/test-files/golden-tests/symbols/record/forward-declared-member.cpp @@ -0,0 +1,9 @@ +namespace std { + class path { + struct _Cmpt; + }; + struct path::_Cmpt : path {}; +} // namespace std +namespace fmt { + struct path : std::path {}; +} // namespace fmt diff --git a/test-files/golden-tests/symbols/record/forward-declared-member.html b/test-files/golden-tests/symbols/record/forward-declared-member.html new file mode 100644 index 0000000000..4510fc3234 --- /dev/null +++ b/test-files/golden-tests/symbols/record/forward-declared-member.html @@ -0,0 +1,89 @@ + + +Reference + + + +
+

Reference

+
+
+

+Global Namespace# +

+
+

+Namespaces

+ + + + + + + + + + +
Name
fmt
+ +
+
+
+

+fmt# +

+
+

+Types

+ + + + + + + + + + +
Name
path
+ +
+
+
+

+fmt::path# +

+
+
+

+Synopsis

+
+Declared in <forward-declared-member.cpp>
+
struct path
+    : std::path
+
+
+

+Base Classes

+ + + + + + + + + + +
NameDescription
std::path
+
+ + +
+ +
+ + + \ No newline at end of file diff --git a/test-files/golden-tests/symbols/record/forward-declared-member.xml b/test-files/golden-tests/symbols/record/forward-declared-member.xml new file mode 100644 index 0000000000..d2001cafcc --- /dev/null +++ b/test-files/golden-tests/symbols/record/forward-declared-member.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/test-files/golden-tests/symbols/record/forward-declared-member.yml b/test-files/golden-tests/symbols/record/forward-declared-member.yml new file mode 100644 index 0000000000..dd1c18100e --- /dev/null +++ b/test-files/golden-tests/symbols/record/forward-declared-member.yml @@ -0,0 +1,2 @@ +include-symbols: + - 'fmt::**'