Commit 3f24be8e authored by Mounir Lamouri's avatar Mounir Lamouri Committed by Commit Bot

base::Optional: do not use T::new() but ::new.

This is also adding unit tests that check that the default ctor is not
called.

Bug: 798708
Change-Id: Ib8efb330d10517cb539fa4617e3f4fb3723d1dc0
Reviewed-on: https://chromium-review.googlesource.com/848715
Commit-Queue: Mounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatardanakj <danakj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#526804}
parent 0342a791
......@@ -134,7 +134,7 @@ class OptionalBase {
template <class... Args>
void Init(Args&&... args) {
DCHECK(storage_.is_null_);
new (&storage_.value_) T(std::forward<Args>(args)...);
::new (&storage_.value_) T(std::forward<Args>(args)...);
storage_.is_null_ = false;
}
......
......@@ -104,6 +104,25 @@ class NonTriviallyDestructible {
~NonTriviallyDestructible() {}
};
class DeletedDefaultConstructor {
public:
DeletedDefaultConstructor() = delete;
DeletedDefaultConstructor(int foo) : foo_(foo) {}
int foo() const { return foo_; }
private:
int foo_;
};
class DeleteNewOperators {
public:
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
void* operator new[](size_t) = delete;
void* operator new[](size_t, void*) = delete;
};
} // anonymous namespace
static_assert(std::is_trivially_destructible<Optional<int>>::value,
......@@ -1535,4 +1554,21 @@ TEST(OptionalTest, AssignFromRValue) {
EXPECT_EQ(1, a->move_ctors_count());
}
TEST(OptionalTest, DontCallDefaultCtor) {
Optional<DeletedDefaultConstructor> a;
EXPECT_FALSE(a.has_value());
a = base::make_optional<DeletedDefaultConstructor>(42);
EXPECT_TRUE(a.has_value());
EXPECT_EQ(42, a->foo());
}
TEST(OptionalTest, DontCallNewMemberFunction) {
Optional<DeleteNewOperators> a;
EXPECT_FALSE(a.has_value());
a = DeleteNewOperators();
EXPECT_TRUE(a.has_value());
}
} // namespace base
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment