Skip to content

Commit

Permalink
Fixes dereferencing operator issue microsoft#517 introduced in PR mic…
Browse files Browse the repository at this point in the history
…rosoft#513 (microsoft#516)

* Fixes issue with dereferencing operator issue microsoft#491 introduced in PR microsoft#513

dereferencing operator added in PR#513 returned a copy of the object
instead of reference to it.
Adding decltype(auto) as return type of operator* fixes this issue.

* added more tests for not_null::operator*
  • Loading branch information
Alexey Malov authored and Neil MacIntosh committed May 31, 2017
1 parent 30595c1 commit 247c425
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 13 deletions.
2 changes: 1 addition & 1 deletion include/gsl/gsl
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public:

constexpr operator T() const { return get(); }
constexpr T operator->() const { return get(); }
constexpr auto operator*() const { return *get(); }
constexpr decltype(auto) operator*() const { return *get(); }

// prevents compilation when someone attempts to assign a null pointer constant
not_null(std::nullptr_t) = delete;
Expand Down
49 changes: 37 additions & 12 deletions tests/notnull_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,16 @@ std::string operator>=(CustomPtr<T> const& lhs, CustomPtr<U> const& rhs)
: "false";
}

struct NonCopyableNonMovable
{
NonCopyableNonMovable() = default;
NonCopyableNonMovable(const NonCopyableNonMovable&) = delete;
NonCopyableNonMovable& operator=(const NonCopyableNonMovable&) = delete;
NonCopyableNonMovable(NonCopyableNonMovable&&) = delete;
NonCopyableNonMovable& operator=(NonCopyableNonMovable&&) = delete;
};


SUITE(NotNullTests)
{

Expand Down Expand Up @@ -253,18 +263,33 @@ SUITE(NotNullTests)

TEST(TestNotNullDereferenceOperator)
{
auto sp1 = std::make_shared<int>(42);

using NotNullSp1 = not_null<decltype(sp1)>;

CHECK(*NotNullSp1(sp1) == *sp1);

int ints[1] = {42};
CustomPtr<int> p1(&ints[0]);

using NotNull1 = not_null<decltype(p1)>;
CHECK(*NotNull1(p1) == 42);
}
{
auto sp1 = std::make_shared<NonCopyableNonMovable>();

using NotNullSp1 = not_null<decltype(sp1)>;
CHECK(typeid(*sp1) == typeid(*NotNullSp1(sp1)));
CHECK(std::addressof(*NotNullSp1(sp1)) == std::addressof(*sp1));
}

{
int ints[1] = { 42 };
CustomPtr<int> p1(&ints[0]);

using NotNull1 = not_null<decltype(p1)>;
CHECK(typeid(*NotNull1(p1)) == typeid(*p1));
CHECK(*NotNull1(p1) == 42);
*NotNull1(p1) = 43;
CHECK(ints[0] == 43);
}

{
int v = 42;
gsl::not_null<int*> p(&v);
CHECK(typeid(*p) == typeid(*(&v)));
*p = 43;
CHECK(v == 43);
}
}
}

int main(int, const char* []) { return UnitTest::RunAllTests(); }

0 comments on commit 247c425

Please sign in to comment.