def test_pointer_to_member() -> None: content = """ class Class { }; int Class::* intPtr; int (Class::* intReturnFuncPtr)(); void (Class::* intParamFuncPtr)(int); void (Class::* varargFuncPtr)(...); template int takesFunc(void (*func)(TArgs...)); template int takesMemberFunc(TObject& object, void (TObject::* func)(TArgs...)); """ data = parse_string(content, cleandoc=True) assert data == ParsedData( namespace=NamespaceScope( classes=[ ClassScope( class_decl=ClassDecl( typename=PQName( segments=[NameSpecifier(name="Class")], classkey="class" ) ) ) ], functions=[ Function( return_type=Type( typename=PQName(segments=[FundamentalSpecifier(name="int")]) ), name=PQName(segments=[NameSpecifier(name="takesFunc")]), parameters=[ Parameter( type=Pointer( ptr_to=FunctionType( return_type=Type( typename=PQName( segments=[FundamentalSpecifier(name="void")] ) ), parameters=[ Parameter( type=Type( typename=PQName( segments=[ NameSpecifier(name="TArgs") ] ) ), param_pack=True, ) ], ) ), name="func", ) ], template=TemplateDecl( params=[ TemplateTypeParam( typekey="typename", name="TArgs", param_pack=True ) ] ), ), Function( return_type=Type( typename=PQName(segments=[FundamentalSpecifier(name="int")]) ), name=PQName(segments=[NameSpecifier(name="takesMemberFunc")]), parameters=[ Parameter( type=Reference( ref_to=Type( typename=PQName( segments=[NameSpecifier(name="TObject")] ) ) ), name="object", ), Parameter( type=PointerToMember( base_type=Type(typename=NameSpecifier(name="TObject")), ptr_to=FunctionType( return_type=Type( typename=PQName( segments=[FundamentalSpecifier(name="void")] ) ), parameters=[ Parameter( type=Type( typename=PQName( segments=[ NameSpecifier(name="TArgs") ] ) ), param_pack=True, ) ], ), ), name="func", ), ], template=TemplateDecl( params=[ TemplateTypeParam(typekey="typename", name="TObject"), TemplateTypeParam( typekey="typename", name="TArgs", param_pack=True ), ] ), ), ], variables=[ Variable( name=PQName(segments=[NameSpecifier(name="intPtr")]), type=PointerToMember( base_type=Type(typename=NameSpecifier(name="Class")), ptr_to=Type( typename=PQName(segments=[FundamentalSpecifier(name="int")]) ), ), ), Variable( name=PQName(segments=[NameSpecifier(name="intReturnFuncPtr")]), type=PointerToMember( base_type=Type(typename=NameSpecifier(name="Class")), ptr_to=FunctionType( return_type=Type( typename=PQName( segments=[FundamentalSpecifier(name="int")] ) ), parameters=[], ), ), ), Variable( name=PQName(segments=[NameSpecifier(name="intParamFuncPtr")]), type=PointerToMember( base_type=Type(typename=NameSpecifier(name="Class")), ptr_to=FunctionType( return_type=Type( typename=PQName( segments=[FundamentalSpecifier(name="void")] ) ), parameters=[ Parameter( type=Type( typename=PQName( segments=[FundamentalSpecifier(name="int")] ) ) ) ], ), ), ), Variable( name=PQName(segments=[NameSpecifier(name="varargFuncPtr")]), type=PointerToMember( base_type=Type(typename=NameSpecifier(name="Class")), ptr_to=FunctionType( return_type=Type( typename=PQName( segments=[FundamentalSpecifier(name="void")] ) ), parameters=[], vararg=True, ), ), ), ], ) )