object-introspection/test/integration/std_smart_ptr.toml
Jake Hillion db289c1a1a tbv2: use std::decay_t with smart pointers
CodeGen v2 permits template parameters to be qualified. This means that if we
call `make_field` with a template parameter it will be qualified. However, we
don't qualify the types when generating meta functions such as `NameProvider`
and `TypeHandler`. This means these qualified types don't match up with the
expected type.

Use `std::decay_t` when forwarding the type to `NameProvider` and `TypeHandler`
so they're always the base type that they were generated with. Most of this is
covered by `make_field`, but there are direct references to `TypeHandler<Ctx,
T>` in a lot of `TypeHandler::type` fields. Fix the problematic types manually
for now, there may need to be a better solution with meta functions for this in
the future.

Test Plan:
- CI
- Added a test for `std::unique_ptr<const uint64_t>` to exercise this. Failed
  before, passes after.
- Added a test for `std::unique_ptr<const std::vector<uint64_t>>` to test a
  non-primitive type. Failed before, passes after.
2024-01-31 17:27:04 +00:00

507 lines
11 KiB
TOML

includes = ["memory", "cstdint"]
definitions = '''
void void_int_deleter(void *void_ptr) {
auto *int_ptr = static_cast<int*>(void_ptr);
delete int_ptr;
}
'''
[cases]
[cases.unique_ptr_uint64_empty]
param_types = ["std::unique_ptr<std::uint64_t>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 0,
"exclusiveSize": 8,
"length": 0,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"size": 8,
"length": 0,
"capacity": 1
}
]
'''
[cases.unique_ptr_const_uint64_empty]
param_types = ["std::unique_ptr<const std::uint64_t>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 0,
"exclusiveSize": 8,
"length": 0,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"length": 0,
"capacity": 1
}
]
'''
[cases.unique_ptr_uint64_present]
param_types = ["std::unique_ptr<std::uint64_t>&"]
setup = "return {std::make_unique<std::uint64_t>(64)};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 8,
"length": 1,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"size": 16,
"length": 1,
"capacity": 1
}
]
'''
[cases.unique_ptr_vector_empty]
param_types = ["std::unique_ptr<std::vector<std::uint64_t>>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 24
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"size": 8,
"length": 0,
"capacity": 1
}
]
'''
[cases.unique_ptr_const_vector_empty]
param_types = ["std::unique_ptr<const std::vector<std::uint64_t>>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 24
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"length": 0,
"capacity": 1
}
]
'''
[cases.unique_ptr_vector_present]
param_types = ["std::unique_ptr<std::vector<std::uint64_t>>&"]
setup = "return {std::make_unique<std::vector<std::uint64_t>>(std::initializer_list<std::uint64_t>({1,2,3,4,5}))};"
expect_json = '''
[
{
"staticSize": 8,
"dynamicSize": 64,
"exclusiveSize": 8,
"length": 1,
"capacity": 1,
"elementStaticSize": 24,
"members": [
{
"staticSize": 24,
"dynamicSize": 40,
"exclusiveSize": 64
}
]
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 8,
"exclusiveSize": 8,
"size": 72,
"length": 1,
"capacity": 1,
"members": [
{
"staticSize": 24,
"exclusiveSize": 24,
"length": 5,
"capacity": 5
}
]
}
]
'''
[cases.unique_ptr_void_empty]
param_types = ["std::unique_ptr<void, decltype(&void_int_deleter)>&"]
setup = "return {std::unique_ptr<void, decltype(&void_int_deleter)>(nullptr, &void_int_deleter)};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 16
}
]
'''
[cases.unique_ptr_void_present]
param_types = ["std::unique_ptr<void, decltype(&void_int_deleter)>&"]
setup = "return {std::unique_ptr<void, decltype(&void_int_deleter)>(new int, &void_int_deleter)};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 16
}
]
'''
[cases.shared_ptr_uint64_empty]
param_types = ["std::shared_ptr<std::uint64_t>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 16,
"length": 0,
"capacity": 1
}
]
'''
[cases.shared_ptr_const_uint64_empty]
param_types = ["std::shared_ptr<const std::uint64_t>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"length": 0,
"capacity": 1
}
]
'''
[cases.shared_ptr_uint64_present]
param_types = ["std::shared_ptr<std::uint64_t>&"]
setup = "return std::make_shared<std::uint64_t>(64);"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 8,
"length": 1,
"capacity": 1,
"elementStaticSize": 8
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 24,
"length": 1,
"capacity": 1,
"members": [
{ "staticSize": 8, "exclusiveSize": 8 }
]
}
]
'''
[cases.shared_ptr_vector_empty]
param_types = ["std::shared_ptr<std::vector<std::uint64_t>>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 24
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 16,
"length": 0,
"capacity": 1
}
]
'''
[cases.shared_ptr_const_vector_empty]
param_types = ["std::shared_ptr<const std::vector<std::uint64_t>>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"length": 0,
"capacity": 1,
"elementStaticSize": 24
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"length": 0,
"capacity": 1
}
]
'''
[cases.shared_ptr_vector_present]
param_types = ["std::shared_ptr<std::vector<std::uint64_t>>&"]
setup = "return std::make_shared<std::vector<std::uint64_t>>(std::initializer_list<std::uint64_t>({1,2,3,4,5}));"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 64,
"length": 1,
"capacity": 1,
"elementStaticSize": 24,
"members": [
{
"staticSize": 24,
"dynamicSize": 40
}
]
}
]
'''
expect_json_v2 = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"size": 80,
"length": 1,
"capacity": 1,
"members": [
{
"staticSize": 24,
"exclusiveSize": 24,
"size": 64,
"length": 5,
"capacity": 5
}
]
}
]
'''
[cases.shared_ptr_void_empty]
param_types = ["std::shared_ptr<void>&"]
setup = "return {nullptr};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"exclusiveSize": 16,
"size": 16
}
]
'''
[cases.shared_ptr_void_present]
param_types = ["std::shared_ptr<void>&"]
setup = "return {std::shared_ptr<void>(new int)};"
expect_json = '''
[
{
"staticSize": 16,
"dynamicSize": 0,
"exclusiveSize": 16,
"size": 16
}
]
'''
[cases.weak_ptr_int64_empty]
param_types = ["std::weak_ptr<std::uint64_t>&"]
setup = "return std::weak_ptr<std::uint64_t>();"
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''
[cases.weak_ptr_int64_void_empty]
param_types = ["std::weak_ptr<void>&"]
setup = "return std::weak_ptr<void>();"
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''
[cases.weak_ptr_int64_present]
param_types = ["std::weak_ptr<std::uint64_t>&"]
setup = '''
static std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
std::weak_ptr<std::uint64_t> weak = shd;
return weak;
'''
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''
[cases.weak_ptr_int64_expired]
param_types = ["std::weak_ptr<std::uint64_t>&"]
setup = '''
std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
std::weak_ptr<std::uint64_t> weak = shd;
return weak;
'''
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''
[cases.weak_ptr_int64_present_chase]
param_types = ["std::weak_ptr<std::uint64_t>&"]
features = ["chase-raw-pointers"]
setup = '''
static std::shared_ptr<std::uint64_t> shd = std::make_shared<std::uint64_t>(0xDEADBEEF);
std::weak_ptr<std::uint64_t> weak = shd;
return weak;
'''
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''
[cases.weak_ptr_int64_expired_chase]
param_types = ["std::weak_ptr<std::uint64_t>&"]
features = ["chase-raw-pointers"]
setup = '''
return std::make_shared<std::uint64_t>(0xDEADBEEF);
'''
expect_json = '''
[
{
"staticSize": 16,
"exclusiveSize": 16,
"dynamicSize": 0,
"NOT": "members"
}
]
'''
expect_json_v2 = '''[{ "staticSize": 16, "exclusiveSize": 16, "size": 16, "members":[]}]'''