From aecb8fe6dbc574dab746fccd6f14e055182c6953 Mon Sep 17 00:00:00 2001 From: Simon Brand Date: Mon, 3 Sep 2018 09:09:47 +0100 Subject: [PATCH] Fix #14 --- CMakeLists.txt | 1 + tests/issues.cpp | 19 +++++++++++++++++++ tl/optional.hpp | 6 +++--- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 tests/issues.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e28de6..63720f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ if(OPTIONAL_ENABLE_TESTS) ${CMAKE_CURRENT_SOURCE_DIR}/tests/constexpr.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/constructors.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/assignment.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/issues.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/bases.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/nullopt.cpp) diff --git a/tests/issues.cpp b/tests/issues.cpp new file mode 100644 index 0000000..50211fe --- /dev/null +++ b/tests/issues.cpp @@ -0,0 +1,19 @@ +#include "catch.hpp" +#include "optional.hpp" +#include + +struct foo{ + int& v() { return i; } + int i = 0; +}; + +int& x(int& i) { i = 42; return i;} + +TEST_CASE("issue 14") { + tl::optional f = foo{}; + auto v = f.map(&foo::v).map(x); + static_assert(std::is_same>::value, "Must return a reference"); + REQUIRE(f->i == 42); + REQUIRE(*v == 42); + REQUIRE((&f->i) == (&*v)); +} diff --git a/tl/optional.hpp b/tl/optional.hpp index 3514d9e..53c5de0 100644 --- a/tl/optional.hpp +++ b/tl/optional.hpp @@ -1639,7 +1639,7 @@ template (f), *std::forward(opt)) - : optional>(nullopt); + : optional(nullopt); } template ())), detail::enable_if_t::value> * = nullptr> -constexpr auto optional_map_impl(Opt &&opt, F &&f) -> optional> { +constexpr auto optional_map_impl(Opt &&opt, F &&f) -> optional { return opt.has_value() ? detail::invoke(std::forward(f), *std::forward(opt)) - : optional>(nullopt); + : optional(nullopt); } template