Add rvalue ref-qualified PosixErrorOr<T>::ValueOrDie() overloads.

This allows ValueOrDie() to be called on PosixErrorOr rvalues (e.g.
temporaries) holding move-only types without extraneous std::move()s.

PiperOrigin-RevId: 225098036
Change-Id: I662862e4f3562141f941845fc6e197edb27ce29b
This commit is contained in:
Jamie Liu 2018-12-11 17:04:42 -08:00 committed by Shentubot
parent 24c1158b9c
commit a2c868a098
3 changed files with 23 additions and 9 deletions

View File

@ -126,7 +126,7 @@ SignalTestResult ItimerSignalTest(int id, clock_t main_clock,
sa.sa_handler = &SignalTestSignalHandler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
auto sigaction_cleanup = std::move(ScopedSigaction(signal, sa).ValueOrDie());
auto sigaction_cleanup = ScopedSigaction(signal, sa).ValueOrDie();
int socketfds[2];
TEST_PCHECK(socketpair(AF_UNIX, SOCK_STREAM, 0, socketfds) == 0);
@ -167,7 +167,7 @@ SignalTestResult ItimerSignalTest(int id, clock_t main_clock,
struct itimerval timer = {};
timer.it_value = absl::ToTimeval(kPeriod);
timer.it_interval = absl::ToTimeval(kPeriod);
auto cleanup_itimer = std::move(ScopedItimer(id, timer).ValueOrDie());
auto cleanup_itimer = ScopedItimer(id, timer).ValueOrDie();
// Unblock th1.
//

View File

@ -103,8 +103,10 @@ class ABSL_MUST_USE_RESULT PosixErrorOr {
bool ok() const;
// Returns a reference to our current value, or CHECK-fails if !this->ok().
const T& ValueOrDie() const;
T& ValueOrDie();
const T& ValueOrDie() const&;
T& ValueOrDie() &;
const T&& ValueOrDie() const&&;
T&& ValueOrDie() &&;
// Ignores any errors. This method does nothing except potentially suppress
// complaints from any tools that are checking that errors are not dropped on
@ -179,17 +181,29 @@ bool PosixErrorOr<T>::ok() const {
}
template <typename T>
const T& PosixErrorOr<T>::ValueOrDie() const {
const T& PosixErrorOr<T>::ValueOrDie() const& {
TEST_CHECK(absl::holds_alternative<T>(value_));
return absl::get<T>(value_);
}
template <typename T>
T& PosixErrorOr<T>::ValueOrDie() {
T& PosixErrorOr<T>::ValueOrDie() & {
TEST_CHECK(absl::holds_alternative<T>(value_));
return absl::get<T>(value_);
}
template <typename T>
const T&& PosixErrorOr<T>::ValueOrDie() const&& {
TEST_CHECK(absl::holds_alternative<T>(value_));
return std::move(absl::get<T>(value_));
}
template <typename T>
T&& PosixErrorOr<T>::ValueOrDie() && {
TEST_CHECK(absl::holds_alternative<T>(value_));
return std::move(absl::get<T>(value_));
}
extern ::std::ostream& operator<<(::std::ostream& os, const PosixError& e);
template <typename T>
@ -399,7 +413,7 @@ IsPosixErrorOkAndHolds(InnerMatcher&& inner_matcher) {
if (!posixerroror.ok()) { \
return (posixerroror.error()); \
} \
lhs = std::move(posixerroror.ValueOrDie())
lhs = std::move(posixerroror).ValueOrDie()
#define EXPECT_NO_ERRNO(expression) \
EXPECT_THAT(expression, IsPosixErrorOkMatcher())
@ -419,7 +433,7 @@ IsPosixErrorOkAndHolds(InnerMatcher&& inner_matcher) {
({ \
auto _expr_result = (expr); \
ASSERT_NO_ERRNO(_expr_result); \
std::move(_expr_result.ValueOrDie()); \
std::move(_expr_result).ValueOrDie(); \
})
} // namespace testing

View File

@ -115,7 +115,7 @@ MATCHER_P(ContainsMappings, mappings,
return false;
}
auto maps = std::move(maps_or.ValueOrDie());
auto maps = std::move(maps_or).ValueOrDie();
// Does maps contain all elements in mappings? The comparator ignores
// the major, minor, and inode fields.