189 lines
7.7 KiB
Python
189 lines
7.7 KiB
Python
def test_pointer_to_member() -> None:
|
|
content = """
|
|
class Class
|
|
{
|
|
|
|
};
|
|
|
|
int Class::* intPtr;
|
|
int (Class::* intReturnFuncPtr)();
|
|
void (Class::* intParamFuncPtr)(int);
|
|
void (Class::* varargFuncPtr)(...);
|
|
|
|
template<typename... TArgs>
|
|
int takesFunc(void (*func)(TArgs...));
|
|
|
|
template<typename TObject, typename... TArgs>
|
|
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,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
)
|
|
|