about summary refs log tree commit diff
path: root/third_party/abseil_cpp/absl/status/statusor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/abseil_cpp/absl/status/statusor.cc')
-rw-r--r--third_party/abseil_cpp/absl/status/statusor.cc81
1 files changed, 52 insertions, 29 deletions
diff --git a/third_party/abseil_cpp/absl/status/statusor.cc b/third_party/abseil_cpp/absl/status/statusor.cc
index 2d22adb276d0..b954b45e32c7 100644
--- a/third_party/abseil_cpp/absl/status/statusor.cc
+++ b/third_party/abseil_cpp/absl/status/statusor.cc
@@ -1,48 +1,71 @@
-/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-==============================================================================*/
-
+// Copyright 2020 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 #include "absl/status/statusor.h"
 
+#include <cstdlib>
+#include <utility>
+
 #include "absl/base/internal/raw_logging.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 
-namespace internal_statusor {
+BadStatusOrAccess::BadStatusOrAccess(absl::Status status)
+    : status_(std::move(status)) {}
+
+BadStatusOrAccess::~BadStatusOrAccess() = default;
+const char* BadStatusOrAccess::what() const noexcept {
+  return "Bad StatusOr access";
+}
 
-#define ABSL_STATUSOR_INTERNAL_BAD_OK_MSG "An OK status is not a valid " \
-  "constructor argument to StatusOr<T>"
+const absl::Status& BadStatusOrAccess::status() const { return status_; }
 
-void Helper::HandleInvalidStatusCtorArg(Status* status) {
-  ABSL_RAW_LOG(ERROR, ABSL_STATUSOR_INTERNAL_BAD_OK_MSG);
-  // Fall back to kInternal.
-  *status = InternalError(ABSL_STATUSOR_INTERNAL_BAD_OK_MSG);
+namespace internal_statusor {
+
+void Helper::HandleInvalidStatusCtorArg(absl::Status* status) {
+  const char* kMessage =
+      "An OK status is not a valid constructor argument to StatusOr<T>";
+#ifdef NDEBUG
+  ABSL_INTERNAL_LOG(ERROR, kMessage);
+#else
+  ABSL_INTERNAL_LOG(FATAL, kMessage);
+#endif
+  // In optimized builds, we will fall back to InternalError.
+  *status = absl::InternalError(kMessage);
 }
 
-#undef ABSL_STATUSOR_INTERNAL_BAD_OK_MSG
+void Helper::Crash(const absl::Status& status) {
+  ABSL_INTERNAL_LOG(
+      FATAL,
+      absl::StrCat("Attempting to fetch value instead of handling error ",
+                   status.ToString()));
+}
 
-void Helper::Crash(const Status& status) {
+void ThrowBadStatusOrAccess(absl::Status status) {
 #ifdef ABSL_HAVE_EXCEPTIONS
-  throw status;
+  throw absl::BadStatusOrAccess(std::move(status));
 #else
-  std::string status_debug = status.ToString();
-  ABSL_RAW_LOG(FATAL, "Attempting to fetch value instead of handling error: %s", status_debug.c_str());
-  abort();   // TODO(calabrese) Remove once RAW_LOG FATAL is noreturn.
+  ABSL_INTERNAL_LOG(
+      FATAL,
+      absl::StrCat("Attempting to fetch value instead of handling error ",
+                   status.ToString()));
+  std::abort();
 #endif
 }
-}  // namespace internal_statusor
 
+}  // namespace internal_statusor
 ABSL_NAMESPACE_END
 }  // namespace absl