blob: 2713971b95c0665ed1ee07d500db159b747e2d7f [file] [log] [blame]
#include <doctest/doctest.h>
class MoveOnly {
public:
MoveOnly(int iIn) : i(iIn) { }
MoveOnly(MoveOnly&&) = default;
MoveOnly(const MoveOnly&) = delete;
MoveOnly& operator=(MoveOnly&&) = default;
MoveOnly& operator=(const MoveOnly&) = default;
~MoveOnly() = default;
// NOLINTNEXTLINE(readability-make-member-function-const)
operator bool() { // NOT const!
return i == 42;
}
private:
int i;
};
static MoveOnly genType(bool b) {
return { b ? 42 : 0 };
}
TEST_CASE("Move Only Type") {
CHECK(genType(true));
CHECK(genType(false));
MoveOnly a{ 0 };
CHECK(a);
}
struct int_pointer {
int* p = nullptr;
int_pointer() = default;
// non-const ref used in constructor
// we don't want to accidentally construct a dangling pointer from a temporary
int_pointer(int& i) : p(&i) { }
// NOLINTNEXTLINE(readability-make-member-function-const)
explicit operator bool() { return !!p; }
int val() const { return *p; }
};
struct int_holder {
int i;
bool operator==(int_pointer p) const {
if (!p) return false;
return i == p.val();
}
};
DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866) // eval order
TEST_CASE("Impl cast from non-const value") {
int_holder h{ 8 };
int i = 8;
// this comparison is safe
// int_pointer can be implicitly constructed from this int here
CHECK(h == i);
}
DOCTEST_MSVC_SUPPRESS_WARNING_POP