diff --git a/cxxheaderparser/parser.py b/cxxheaderparser/parser.py index 6314a4b..14caae9 100644 --- a/cxxheaderparser/parser.py +++ b/cxxheaderparser/parser.py @@ -607,8 +607,9 @@ def _parse_template_decl(self) -> TemplateDecl: lex.return_token(ptok) param = self._parse_template_type_parameter(tok, None) else: + lex.return_token(ptok) param, _ = self._parse_parameter( - ptok, + tok, TemplateNonTypeParam, concept_ok=False, deduce_this_ok=False, diff --git a/tests/test_template.py b/tests/test_template.py index 2a13b66..b7bb7dc 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -281,7 +281,8 @@ def test_template_dependent_nontype_default() -> None: segments=[ NameSpecifier(name="T"), NameSpecifier(name="type"), - ] + ], + has_typename=True, ) ), name="n", @@ -1098,7 +1099,7 @@ class concat_iterator void_t()).*std::declval())(std::declval()...))>> : std::true_type {}; - template + template struct S : public T... {}; """ data = parse_string(content, cleandoc=True) @@ -1636,12 +1637,9 @@ class concat_iterator ], template=TemplateDecl( params=[ - TemplateNonTypeParam( - type=Type( - typename=PQName( - segments=[NameSpecifier(name="T")] - ) - ), + TemplateTypeParam( + typekey="typename", + name="T", param_pack=True, ) ] @@ -2417,3 +2415,55 @@ def test_deduction_sizeof_pack() -> None: ] ) ) + + +def test_template_has_typename() -> None: + content = """ + template + void func(typename V::U arg) {} + """ + data = parse_string(content, cleandoc=True) + + assert data == ParsedData( + namespace=NamespaceScope( + functions=[ + Function( + return_type=Type( + typename=PQName(segments=[FundamentalSpecifier(name="void")]) + ), + name=PQName(segments=[NameSpecifier(name="func")]), + parameters=[ + Parameter( + type=Type( + typename=PQName( + segments=[ + NameSpecifier(name="V"), + NameSpecifier(name="U"), + ], + has_typename=True, + ) + ), + name="arg", + ) + ], + has_body=True, + template=TemplateDecl( + params=[ + TemplateNonTypeParam( + type=Type( + typename=PQName( + segments=[ + NameSpecifier(name="T"), + NameSpecifier(name="Q"), + ], + has_typename=True, + ) + ), + name="value", + ) + ] + ), + ) + ] + ) + )