Commit b2abe7ad by Dino Radakovic Committed by Copybara-Service

Make `absl::StatusOr::AssignStatus` public. Recommend against using it outside…

Make `absl::StatusOr::AssignStatus` public. Recommend against using it outside of generic programming

PiperOrigin-RevId: 529484669
Change-Id: I9889a9f7a7fa7dc6ef8c731f1b583a74e6afd2cf
parent 3d604bc6
...@@ -612,6 +612,21 @@ class StatusOr : private internal_statusor::StatusOrData<T>, ...@@ -612,6 +612,21 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
return this->data_; return this->data_;
} }
// StatusOr<T>::AssignStatus()
//
// Sets the status of `absl::StatusOr<T>` to the given non-ok status value.
//
// NOTE: We recommend using the constructor and `operator=` where possible.
// This method is intended for use in generic programming, to enable setting
// the status of a `StatusOr<T>` when `T` may be `Status`. In that case, the
// constructor and `operator=` would assign into the inner value of type
// `Status`, rather than status of the `StatusOr` (b/280392796).
//
// REQUIRES: !Status(std::forward<U>(v)).ok(). This requirement is DCHECKed.
// In optimized builds, passing absl::OkStatus() here will have the effect
// of passing absl::StatusCode::kInternal as a fallback.
using internal_statusor::StatusOrData<T>::AssignStatus;
private: private:
using internal_statusor::StatusOrData<T>::Assign; using internal_statusor::StatusOrData<T>::Assign;
template <typename U> template <typename U>
......
...@@ -1844,4 +1844,37 @@ TEST(StatusOr, AssignmentFromTypeConvertibleToStatus) { ...@@ -1844,4 +1844,37 @@ TEST(StatusOr, AssignmentFromTypeConvertibleToStatus) {
} }
} }
TEST(StatusOr, StatusAssignmentFromStatusError) {
absl::StatusOr<absl::Status> statusor;
statusor.AssignStatus(absl::CancelledError());
EXPECT_FALSE(statusor.ok());
EXPECT_EQ(statusor.status(), absl::CancelledError());
}
#if GTEST_HAS_DEATH_TEST
TEST(StatusOr, StatusAssignmentFromStatusOk) {
EXPECT_DEBUG_DEATH(
{
absl::StatusOr<absl::Status> statusor;
// This will DCHECK.
statusor.AssignStatus(absl::OkStatus());
// In optimized mode, we are actually going to get error::INTERNAL for
// status here, rather than crashing, so check that.
EXPECT_FALSE(statusor.ok());
EXPECT_EQ(statusor.status().code(), absl::StatusCode::kInternal);
},
"An OK status is not a valid constructor argument to StatusOr<T>");
}
#endif
TEST(StatusOr, StatusAssignmentFromTypeConvertibleToStatus) {
CustomType<MyType, kConvToStatus> v;
absl::StatusOr<MyType> statusor;
statusor.AssignStatus(v);
EXPECT_FALSE(statusor.ok());
EXPECT_EQ(statusor.status(), static_cast<absl::Status>(v));
}
} // namespace } // namespace
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment