Skip to content

Commit ddadba4

Browse files
committed
Fix error in template specialization with qualified arguments
1 parent bff6839 commit ddadba4

File tree

7 files changed

+51
-6
lines changed

7 files changed

+51
-6
lines changed

breathe/renderer/filter.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,12 @@ def allow(self, node_stack) -> bool:
475475
name = self.name_accessor(node_stack)
476476

477477
try:
478-
namespace, name = name.rsplit("::", 1)
478+
# strip out any template arguments before splitting on '::', to
479+
# avoid errors if a template specialization has qualified arguments
480+
# (see examples/specific/cpp_ns_template_specialization)
481+
cleaned_name, sep, rest = name.partition("<")
482+
namespace, name = cleaned_name.rsplit("::", 1)
483+
name += sep + rest
479484
except ValueError:
480485
namespace, name = "", name
481486

breathe/renderer/sphinxrenderer.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -1021,12 +1021,15 @@ def visit_class(self, node) -> List[Node]:
10211021
# Defer to domains specific directive.
10221022

10231023
names = self.get_qualification()
1024-
# TODO: this breaks if it's a template specialization
1025-
# and one of the arguments contain '::'
1024+
# strip out any template arguments before splitting on '::', to
1025+
# avoid errors if a template specialization has qualified arguments
1026+
# (see examples/specific/cpp_ns_template_specialization)
1027+
cleaned_name, sep, rest = nodeDef.compoundname.partition("<")
10261028
if self.nesting_level == 0:
1027-
names.extend(nodeDef.compoundname.split("::"))
1029+
names.extend(cleaned_name.split("::"))
10281030
else:
1029-
names.append(nodeDef.compoundname.split("::")[-1])
1031+
names.append(cleaned_name.split("::")[-1])
1032+
names[-1] += sep + rest
10301033
decls = [
10311034
self.create_template_prefix(nodeDef),
10321035
self.join_nested_name(names),

documentation/source/conf.py

+1
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
"cpp_function_lookup": "../../examples/specific/cpp_function_lookup/xml/",
233233
"cpp_friendclass": "../../examples/specific/cpp_friendclass/xml/",
234234
"cpp_inherited_members": "../../examples/specific/cpp_inherited_members/xml/",
235+
"cpp_ns_template_specialization": "../../examples/specific/cpp_ns_template_specialization/xml/",
235236
"cpp_trailing_return_type": "../../examples/specific/cpp_trailing_return_type/xml/",
236237
"cpp_constexpr_hax": "../../examples/specific/cpp_constexpr_hax/xml/",
237238
"xrefsect": "../../examples/specific/xrefsect/xml/",

documentation/source/specific.rst

+8
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,14 @@ C++ Inherited Members
239239
.. doxygenclass:: B
240240
:project: cpp_inherited_members
241241

242+
C++ Template Specialization with Namespace
243+
------------------------------------------
244+
245+
.. cpp:namespace:: @ex_specific_cpp_ns_template_specialization
246+
247+
.. doxygenfile:: cpp_ns_template_specialization.h
248+
:project: cpp_ns_template_specialization
249+
242250
C++ Trailing Return Type
243251
------------------------
244252

examples/specific/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ projects = nutshell alias rst inline namespacefile array inheritance \
2626
enum define interface xrefsect tables \
2727
cpp_anon cpp_concept cpp_enum cpp_union cpp_function cpp_friendclass \
2828
cpp_inherited_members cpp_trailing_return_type cpp_constexpr_hax \
29-
cpp_function_lookup \
29+
cpp_function_lookup cpp_ns_template_specialization \
3030
c_file c_struct c_enum c_typedef c_macro c_union membergroups \
3131
simplesect code_blocks dot_graphs
3232

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
PROJECT_NAME = "C++ Template Specialization with Namespace"
2+
OUTPUT_DIRECTORY = cpp_ns_template_specialization
3+
GENERATE_LATEX = NO
4+
GENERATE_MAN = NO
5+
GENERATE_RTF = NO
6+
CASE_SENSE_NAMES = NO
7+
INPUT = cpp_ns_template_specialization.h
8+
QUIET = YES
9+
JAVADOC_AUTOBRIEF = YES
10+
GENERATE_HTML = NO
11+
GENERATE_XML = YES
12+
13+
WARN_IF_UNDOCUMENTED = NO
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace ns1 {
2+
struct Foo {
3+
int value;
4+
};
5+
} // namespace ns1
6+
7+
namespace ns2 {
8+
template <class U> struct Trait {
9+
static constexpr bool valid = false;
10+
};
11+
12+
template <> struct Trait<ns1::Foo> {
13+
static constexpr bool valid = true;
14+
};
15+
} // namespace ns2

0 commit comments

Comments
 (0)