Skip to content

Commit e361d44

Browse files
committed
Add additional template specialization tests
1 parent 80fb498 commit e361d44

File tree

2 files changed

+232
-0
lines changed

2 files changed

+232
-0
lines changed

tests/test_fn.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
Array,
55
AutoSpecifier,
66
Function,
7+
FunctionType,
78
FundamentalSpecifier,
89
NameSpecifier,
910
PQName,
@@ -518,3 +519,69 @@ def test_fn_with_impl():
518519
]
519520
)
520521
)
522+
523+
524+
def test_fn_return_std_function():
525+
content = """
526+
std::function<void(int)> fn();
527+
"""
528+
data1 = parse_string(content, cleandoc=True)
529+
530+
content = """
531+
std::function<void((int))> fn();
532+
"""
533+
data2 = parse_string(content, cleandoc=True)
534+
535+
expected = ParsedData(
536+
namespace=NamespaceScope(
537+
functions=[
538+
Function(
539+
return_type=Type(
540+
typename=PQName(
541+
segments=[
542+
NameSpecifier(name="std"),
543+
NameSpecifier(
544+
name="function",
545+
specialization=TemplateSpecialization(
546+
args=[
547+
TemplateArgument(
548+
arg=FunctionType(
549+
return_type=Type(
550+
typename=PQName(
551+
segments=[
552+
FundamentalSpecifier(
553+
name="void"
554+
)
555+
]
556+
)
557+
),
558+
parameters=[
559+
Parameter(
560+
type=Type(
561+
typename=PQName(
562+
segments=[
563+
FundamentalSpecifier(
564+
name="int"
565+
)
566+
]
567+
)
568+
)
569+
)
570+
],
571+
)
572+
)
573+
]
574+
),
575+
),
576+
]
577+
)
578+
),
579+
name=PQName(segments=[NameSpecifier(name="fn")]),
580+
parameters=[],
581+
)
582+
]
583+
)
584+
)
585+
586+
assert data1 == expected
587+
assert data2 == expected

tests/test_template.py

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,3 +1649,168 @@ class concat_iterator
16491649
]
16501650
)
16511651
)
1652+
1653+
1654+
def test_template_specialized_fn_typename():
1655+
content = """
1656+
// clang-format off
1657+
struct T{};
1658+
1659+
template <typename T>
1660+
class C {
1661+
template<>
1662+
void foo<typename ::T>();
1663+
};
1664+
"""
1665+
data = parse_string(content, cleandoc=True)
1666+
1667+
assert data == ParsedData(
1668+
namespace=NamespaceScope(
1669+
classes=[
1670+
ClassScope(
1671+
class_decl=ClassDecl(
1672+
typename=PQName(
1673+
segments=[NameSpecifier(name="T")], classkey="struct"
1674+
)
1675+
)
1676+
),
1677+
ClassScope(
1678+
class_decl=ClassDecl(
1679+
typename=PQName(
1680+
segments=[NameSpecifier(name="C")], classkey="class"
1681+
),
1682+
template=TemplateDecl(
1683+
params=[TemplateTypeParam(typekey="typename", name="T")]
1684+
),
1685+
),
1686+
methods=[
1687+
Method(
1688+
return_type=Type(
1689+
typename=PQName(
1690+
segments=[FundamentalSpecifier(name="void")]
1691+
)
1692+
),
1693+
name=PQName(
1694+
segments=[
1695+
NameSpecifier(
1696+
name="foo",
1697+
specialization=TemplateSpecialization(
1698+
args=[
1699+
TemplateArgument(
1700+
arg=Type(
1701+
typename=PQName(
1702+
segments=[
1703+
NameSpecifier(name=""),
1704+
NameSpecifier(name="T"),
1705+
]
1706+
)
1707+
),
1708+
has_typename=True,
1709+
)
1710+
]
1711+
),
1712+
)
1713+
]
1714+
),
1715+
parameters=[],
1716+
template=TemplateDecl(),
1717+
access="private",
1718+
)
1719+
],
1720+
),
1721+
]
1722+
)
1723+
)
1724+
1725+
1726+
def test_template_specialized_fn_typename_template():
1727+
content = """
1728+
// clang-format off
1729+
template <typename X>
1730+
struct T{};
1731+
1732+
template <typename T>
1733+
class C {
1734+
template<>
1735+
void foo<typename ::template T<int>>();
1736+
};
1737+
"""
1738+
data = parse_string(content, cleandoc=True)
1739+
1740+
assert data == ParsedData(
1741+
namespace=NamespaceScope(
1742+
classes=[
1743+
ClassScope(
1744+
class_decl=ClassDecl(
1745+
typename=PQName(
1746+
segments=[NameSpecifier(name="T")], classkey="struct"
1747+
),
1748+
template=TemplateDecl(
1749+
params=[TemplateTypeParam(typekey="typename", name="X")]
1750+
),
1751+
)
1752+
),
1753+
ClassScope(
1754+
class_decl=ClassDecl(
1755+
typename=PQName(
1756+
segments=[NameSpecifier(name="C")], classkey="class"
1757+
),
1758+
template=TemplateDecl(
1759+
params=[TemplateTypeParam(typekey="typename", name="T")]
1760+
),
1761+
),
1762+
methods=[
1763+
Method(
1764+
return_type=Type(
1765+
typename=PQName(
1766+
segments=[FundamentalSpecifier(name="void")]
1767+
)
1768+
),
1769+
name=PQName(
1770+
segments=[
1771+
NameSpecifier(
1772+
name="foo",
1773+
specialization=TemplateSpecialization(
1774+
args=[
1775+
TemplateArgument(
1776+
arg=Type(
1777+
typename=PQName(
1778+
segments=[
1779+
NameSpecifier(name=""),
1780+
NameSpecifier(
1781+
name="T",
1782+
specialization=TemplateSpecialization(
1783+
args=[
1784+
TemplateArgument(
1785+
arg=Type(
1786+
typename=PQName(
1787+
segments=[
1788+
FundamentalSpecifier(
1789+
name="int"
1790+
)
1791+
]
1792+
)
1793+
)
1794+
)
1795+
]
1796+
),
1797+
),
1798+
]
1799+
)
1800+
),
1801+
has_typename=True,
1802+
)
1803+
]
1804+
),
1805+
)
1806+
]
1807+
),
1808+
parameters=[],
1809+
template=TemplateDecl(),
1810+
access="private",
1811+
)
1812+
],
1813+
),
1814+
]
1815+
)
1816+
)

0 commit comments

Comments
 (0)