Added template argument deduction for not_null (#689)

* Added template  argument deduction for not_null

This allows compilers with c++17 support to infer template
instantiation types when calling not_null constructor:

    int foo(not_null<const int*> x);

    int main()
    {
        int t = 0;
        not_null x{ &t };
        return foo(not_null{ &t });
    }

* replaced deduction guides by a simple constructor

* Updated tests

* fixed check for availability of std::byte

* testing c++1z on clang

* fixed cmakelists extra endif

* include cstddef header for clang and gcc in pointers

* fixed a typo

* fix missing nullptr_t type

* fixed typo in CMakeLists.tst

* change approach to c++17 testing, step one: revert cmake testing, update clang5.0 package

removed using latest c++ due to clang5.0 failing,
update clang5.0 travis config to use llvm-toolchain-trusty-5.0

* addressed comments
This commit is contained in:
Anna Gringauze
2018-06-07 13:36:56 -07:00
committed by GitHub
parent 75ad0c1b40
commit cb2d1af89a
4 changed files with 80 additions and 4 deletions
+59
View File
@@ -112,6 +112,7 @@ struct NonCopyableNonMovable
};
bool helper(not_null<int*> p) { return *p == 12; }
bool helper_const(not_null<const int*> p) { return *p == 12; }
TEST_CASE("TestNotNullConstructors")
{
@@ -328,4 +329,62 @@ TEST_CASE("TestNotNullCustomPtrComparison")
CHECK((NotNull2(p2) >= NotNull1(p1)) == (p2 >= p1));
}
#if defined(__cplusplus) && (__cplusplus >= 201703L)
TEST_CASE("TestNotNullConstructorTypeDeduction")
{
{
int i = 42;
not_null x{&i};
helper(not_null{&i});
helper_const(not_null{&i});
CHECK(*x == 42);
}
{
int i = 42;
int* p = &i;
not_null x{p};
helper(not_null{p});
helper_const(not_null{p});
CHECK(*x == 42);
}
{
auto workaround_macro = []() {
int* p1 = nullptr;
not_null x{p1};
};
CHECK_THROWS_AS(workaround_macro(), fail_fast);
}
{
auto workaround_macro = []() {
const int* p1 = nullptr;
not_null x{p1};
};
CHECK_THROWS_AS(workaround_macro(), fail_fast);
}
{
int* p = nullptr;
CHECK_THROWS_AS(helper(not_null{p}), fail_fast);
CHECK_THROWS_AS(helper_const(not_null{p}), fail_fast);
}
#ifdef CONFIRM_COMPILATION_ERRORS
{
not_null x{nullptr};
helper(not_null{nullptr});
helper_const(not_null{nullptr});
}
#endif
}
#endif // #if defined(__cplusplus) && (__cplusplus >= 201703L)
static_assert(std::is_nothrow_move_constructible<not_null<void *>>::value, "not_null must be no-throw move constructible");