Skip to content

Commit

Permalink
Allow forward declared template methods
Browse files Browse the repository at this point in the history
  • Loading branch information
virtuald committed Oct 2, 2023
1 parent cc47d67 commit 4d16552
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
3 changes: 2 additions & 1 deletion cxxheaderparser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -1864,7 +1864,8 @@ def _parse_function(
self.visitor.on_class_method(state, method)
else:
assert isinstance(state, (ExternBlockState, NamespaceBlockState))
if not method.has_body:
# only template specializations can be declared without a body here
if not method.has_body and not method.template:
raise self._parse_error(None, expected="Method body")
self.visitor.on_method_impl(state, method)

Expand Down
40 changes: 40 additions & 0 deletions tests/test_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -1987,3 +1987,43 @@ def test_extern_template() -> None:
},
)
)


def test_fwd_declared_method() -> None:
content = """
// forward declaration for specialized template function
template <> Clazz<A>::Clazz();
"""
data = parse_string(content, cleandoc=True)

assert data == ParsedData(
namespace=NamespaceScope(
method_impls=[
Method(
return_type=None,
name=PQName(
segments=[
NameSpecifier(
name="Clazz",
specialization=TemplateSpecialization(
args=[
TemplateArgument(
arg=Type(
typename=PQName(
segments=[NameSpecifier(name="A")]
)
)
)
]
),
),
NameSpecifier(name="Clazz"),
]
),
parameters=[],
template=TemplateDecl(),
constructor=True,
)
]
)
)

0 comments on commit 4d16552

Please sign in to comment.