Skip to content

Commit b09f079

Browse files
authored
Merge pull request #124 from kdkavanagh/template-typename
Correctly mark has_typename.
2 parents 626cb35 + 6fc9fa1 commit b09f079

File tree

2 files changed

+60
-9
lines changed

2 files changed

+60
-9
lines changed

cxxheaderparser/parser.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,8 +607,9 @@ def _parse_template_decl(self) -> TemplateDecl:
607607
lex.return_token(ptok)
608608
param = self._parse_template_type_parameter(tok, None)
609609
else:
610+
lex.return_token(ptok)
610611
param, _ = self._parse_parameter(
611-
ptok,
612+
tok,
612613
TemplateNonTypeParam,
613614
concept_ok=False,
614615
deduce_this_ok=False,

tests/test_template.py

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,8 @@ def test_template_dependent_nontype_default() -> None:
281281
segments=[
282282
NameSpecifier(name="T"),
283283
NameSpecifier(name="type"),
284-
]
284+
],
285+
has_typename=True,
285286
)
286287
),
287288
name="n",
@@ -1098,7 +1099,7 @@ class concat_iterator
10981099
void_t<decltype(((*std::declval<P>()).*std::declval<F>())(std::declval<T>()...))>>
10991100
: std::true_type {};
11001101
1101-
template <typename T...>
1102+
template <typename... T>
11021103
struct S : public T... {};
11031104
"""
11041105
data = parse_string(content, cleandoc=True)
@@ -1636,12 +1637,9 @@ class concat_iterator
16361637
],
16371638
template=TemplateDecl(
16381639
params=[
1639-
TemplateNonTypeParam(
1640-
type=Type(
1641-
typename=PQName(
1642-
segments=[NameSpecifier(name="T")]
1643-
)
1644-
),
1640+
TemplateTypeParam(
1641+
typekey="typename",
1642+
name="T",
16451643
param_pack=True,
16461644
)
16471645
]
@@ -2417,3 +2415,55 @@ def test_deduction_sizeof_pack() -> None:
24172415
]
24182416
)
24192417
)
2418+
2419+
2420+
def test_template_has_typename() -> None:
2421+
content = """
2422+
template<typename T::Q value>
2423+
void func(typename V::U arg) {}
2424+
"""
2425+
data = parse_string(content, cleandoc=True)
2426+
2427+
assert data == ParsedData(
2428+
namespace=NamespaceScope(
2429+
functions=[
2430+
Function(
2431+
return_type=Type(
2432+
typename=PQName(segments=[FundamentalSpecifier(name="void")])
2433+
),
2434+
name=PQName(segments=[NameSpecifier(name="func")]),
2435+
parameters=[
2436+
Parameter(
2437+
type=Type(
2438+
typename=PQName(
2439+
segments=[
2440+
NameSpecifier(name="V"),
2441+
NameSpecifier(name="U"),
2442+
],
2443+
has_typename=True,
2444+
)
2445+
),
2446+
name="arg",
2447+
)
2448+
],
2449+
has_body=True,
2450+
template=TemplateDecl(
2451+
params=[
2452+
TemplateNonTypeParam(
2453+
type=Type(
2454+
typename=PQName(
2455+
segments=[
2456+
NameSpecifier(name="T"),
2457+
NameSpecifier(name="Q"),
2458+
],
2459+
has_typename=True,
2460+
)
2461+
),
2462+
name="value",
2463+
)
2464+
]
2465+
),
2466+
)
2467+
]
2468+
)
2469+
)

0 commit comments

Comments
 (0)