Skip to content

Commit 1a7cd29

Browse files
committed
Fix parsing of explicit instantiations of function templates
- Fixes #102
1 parent 562b5cc commit 1a7cd29

2 files changed

Lines changed: 71 additions & 1 deletion

File tree

cxxheaderparser/parser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,9 @@ def _parse_template_instantiation(
795795

796796
tok = self.lex.token_if("class", "struct")
797797
if not tok:
798-
raise self._parse_error(tok)
798+
tok = self.lex.token()
799+
self._parse_declarations(tok, doxygen, TemplateDecl())
800+
return
799801

800802
atok = self.lex.token_if_in_set(self._attribute_start_tokens)
801803
if atok:

tests/test_template.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,74 @@ class C {
18161816
)
18171817

18181818

1819+
def test_template_function_instantiation() -> None:
1820+
content = """
1821+
template <typename T> T tFunction(T val);
1822+
template <typename T> T tFunction(T val) { return val; }
1823+
template bool tFunction(bool val);
1824+
"""
1825+
data = parse_string(content, cleandoc=True)
1826+
1827+
assert data == ParsedData(
1828+
namespace=NamespaceScope(
1829+
functions=[
1830+
Function(
1831+
return_type=Type(
1832+
typename=PQName(segments=[NameSpecifier(name="T")])
1833+
),
1834+
name=PQName(segments=[NameSpecifier(name="tFunction")]),
1835+
parameters=[
1836+
Parameter(
1837+
type=Type(
1838+
typename=PQName(segments=[NameSpecifier(name="T")])
1839+
),
1840+
name="val",
1841+
)
1842+
],
1843+
template=TemplateDecl(
1844+
params=[TemplateTypeParam(typekey="typename", name="T")]
1845+
),
1846+
),
1847+
Function(
1848+
return_type=Type(
1849+
typename=PQName(segments=[NameSpecifier(name="T")])
1850+
),
1851+
name=PQName(segments=[NameSpecifier(name="tFunction")]),
1852+
parameters=[
1853+
Parameter(
1854+
type=Type(
1855+
typename=PQName(segments=[NameSpecifier(name="T")])
1856+
),
1857+
name="val",
1858+
)
1859+
],
1860+
has_body=True,
1861+
template=TemplateDecl(
1862+
params=[TemplateTypeParam(typekey="typename", name="T")]
1863+
),
1864+
),
1865+
Function(
1866+
return_type=Type(
1867+
typename=PQName(segments=[FundamentalSpecifier(name="bool")])
1868+
),
1869+
name=PQName(segments=[NameSpecifier(name="tFunction")]),
1870+
parameters=[
1871+
Parameter(
1872+
type=Type(
1873+
typename=PQName(
1874+
segments=[FundamentalSpecifier(name="bool")]
1875+
)
1876+
),
1877+
name="val",
1878+
)
1879+
],
1880+
template=TemplateDecl(),
1881+
),
1882+
]
1883+
)
1884+
)
1885+
1886+
18191887
def test_template_instantiation() -> None:
18201888
content = """
18211889
template class MyClass<1,2>;

0 commit comments

Comments
 (0)