Respect class-specific member operator new in MaybeUninit allocation
diff --git a/gen/src/builtin.rs b/gen/src/builtin.rs
index 62c3527..be70a71 100644
--- a/gen/src/builtin.rs
+++ b/gen/src/builtin.rs
@@ -134,6 +134,34 @@
ifndef::write(out, builtin.opaque, "CXXBRIDGE1_RUST_OPAQUE");
ifndef::write(out, builtin.relocatable, "CXXBRIDGE1_RELOCATABLE");
+ out.begin_block(Block::Namespace("detail"));
+
+ if builtin.maybe_uninit {
+ include.cstddef = true;
+ include.new = true;
+ out.next_section();
+ writeln!(out, "template <typename T, typename = void *>");
+ writeln!(out, "struct operator_new {{");
+ writeln!(
+ out,
+ " void *operator()(size_t sz) {{ return ::operator new(sz); }}",
+ );
+ writeln!(out, "}};");
+ out.next_section();
+ writeln!(out, "template <typename T>");
+ writeln!(
+ out,
+ "struct operator_new<T, decltype(T::operator new(sizeof(T)))> {{",
+ );
+ writeln!(
+ out,
+ " void *operator()(size_t sz) {{ return T::operator new(sz); }}",
+ );
+ writeln!(out, "}};");
+ }
+
+ out.end_block(Block::Namespace("detail"));
+
if builtin.manually_drop {
out.next_section();
include.utility = true;
@@ -149,10 +177,15 @@
}
if builtin.maybe_uninit {
+ include.cstddef = true;
out.next_section();
writeln!(out, "template <typename T>");
writeln!(out, "union MaybeUninit {{");
writeln!(out, " T value;");
+ writeln!(
+ out,
+ " void *operator new(size_t sz) {{ return detail::operator_new<T>{{}}(sz); }}",
+ );
writeln!(out, " MaybeUninit() {{}}");
writeln!(out, " ~MaybeUninit() {{}}");
writeln!(out, "}};");
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 03ebeb5..851b953 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -1540,7 +1540,7 @@
"void cxxbridge1$unique_ptr${}$null(::std::unique_ptr<{}> *ptr) noexcept {{",
instance, inner,
);
- writeln!(out, " new (ptr) ::std::unique_ptr<{}>();", inner);
+ writeln!(out, " ::new (ptr) ::std::unique_ptr<{}>();", inner);
writeln!(out, "}}");
if can_construct_from_value {
out.builtin.maybe_uninit = true;
@@ -1554,7 +1554,7 @@
" {} *uninit = reinterpret_cast<{} *>(new ::rust::MaybeUninit<{}>);",
inner, inner, inner,
);
- writeln!(out, " new (ptr) ::std::unique_ptr<{}>(uninit);", inner);
+ writeln!(out, " ::new (ptr) ::std::unique_ptr<{}>(uninit);", inner);
writeln!(out, " return uninit;");
writeln!(out, "}}");
}
@@ -1563,7 +1563,7 @@
"void cxxbridge1$unique_ptr${}$raw(::std::unique_ptr<{}> *ptr, {} *raw) noexcept {{",
instance, inner, inner,
);
- writeln!(out, " new (ptr) ::std::unique_ptr<{}>(raw);", inner);
+ writeln!(out, " ::new (ptr) ::std::unique_ptr<{}>(raw);", inner);
writeln!(out, "}}");
writeln!(
out,
@@ -1630,7 +1630,7 @@
"void cxxbridge1$shared_ptr${}$null(::std::shared_ptr<{}> *ptr) noexcept {{",
instance, inner,
);
- writeln!(out, " new (ptr) ::std::shared_ptr<{}>();", inner);
+ writeln!(out, " ::new (ptr) ::std::shared_ptr<{}>();", inner);
writeln!(out, "}}");
if can_construct_from_value {
out.builtin.maybe_uninit = true;
@@ -1644,7 +1644,7 @@
" {} *uninit = reinterpret_cast<{} *>(new ::rust::MaybeUninit<{}>);",
inner, inner, inner,
);
- writeln!(out, " new (ptr) ::std::shared_ptr<{}>(uninit);", inner);
+ writeln!(out, " ::new (ptr) ::std::shared_ptr<{}>(uninit);", inner);
writeln!(out, " return uninit;");
writeln!(out, "}}");
}
@@ -1653,7 +1653,7 @@
"void cxxbridge1$shared_ptr${}$clone(const ::std::shared_ptr<{}>& self, ::std::shared_ptr<{}> *ptr) noexcept {{",
instance, inner, inner,
);
- writeln!(out, " new (ptr) ::std::shared_ptr<{}>(self);", inner);
+ writeln!(out, " ::new (ptr) ::std::shared_ptr<{}>(self);", inner);
writeln!(out, "}}");
writeln!(
out,