about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2018-01-23T17·07-0800
committerJohn Olson <jolson@google.com>2018-01-23T23·05-0500
commitdcf112f07409003c325f9cbd4b1dda509acc2359 (patch)
treeefba63881185cc623d34b3bc18ff254b084e8d96
parent787891a3882795cee0364e8a0f0dda315578d155 (diff)
Changes imported from Abseil "staging" branch:
  - d7810aa3eadf258776b9c4914df3b3db68791829 absl::optional<T>::value_or(U) now enforces copy/move by Matt Armstrong <marmstrong@google.com>
  - 3cc15e447c1851a91dd88e537e5f74faece605a3 Use ABSL_EXCEPTIONS_FLAG instead of -fexceptions in absl/... by Jon Cohen <cohenjon@google.com>

GitOrigin-RevId: d7810aa3eadf258776b9c4914df3b3db68791829
Change-Id: Ib40e22678944b633e734af790449871630f0eeab
-rw-r--r--absl/container/BUILD.bazel5
-rw-r--r--absl/types/optional.h8
2 files changed, 11 insertions, 2 deletions
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel
index 295f41250590..8bdf63122aba 100644
--- a/absl/container/BUILD.bazel
+++ b/absl/container/BUILD.bazel
@@ -18,6 +18,7 @@ load(
     "//absl:copts.bzl",
     "ABSL_DEFAULT_COPTS",
     "ABSL_TEST_COPTS",
+    "ABSL_EXCEPTIONS_FLAG",
 )
 
 package(default_visibility = ["//visibility:public"])
@@ -40,7 +41,7 @@ cc_library(
 cc_test(
     name = "fixed_array_test",
     srcs = ["fixed_array_test.cc"],
-    copts = ABSL_TEST_COPTS + ["-fexceptions"],
+    copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
     deps = [
         ":fixed_array",
         "//absl/base:exception_testing",
@@ -76,7 +77,7 @@ cc_library(
 cc_test(
     name = "inlined_vector_test",
     srcs = ["inlined_vector_test.cc"],
-    copts = ABSL_TEST_COPTS + ["-fexceptions"],
+    copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
     deps = [
         ":inlined_vector",
         ":test_instance_tracker",
diff --git a/absl/types/optional.h b/absl/types/optional.h
index ef8255915746..9858a9749766 100644
--- a/absl/types/optional.h
+++ b/absl/types/optional.h
@@ -849,12 +849,20 @@ class optional : private optional_internal::optional_data<T>,
   // is empty.
   template <typename U>
   constexpr T value_or(U&& v) const& {
+    static_assert(std::is_copy_constructible<value_type>::value,
+                  "optional<T>::value_or: T must by copy constructible");
+    static_assert(std::is_convertible<U&&, value_type>::value,
+                  "optional<T>::value_or: U must be convertible to T");
     return static_cast<bool>(*this)
                ? **this
                : static_cast<T>(absl::forward<U>(v));
   }
   template <typename U>
   T value_or(U&& v) && {  // NOLINT(build/c++11)
+    static_assert(std::is_move_constructible<value_type>::value,
+                  "optional<T>::value_or: T must by copy constructible");
+    static_assert(std::is_convertible<U&&, value_type>::value,
+                  "optional<T>::value_or: U must be convertible to T");
     return static_cast<bool>(*this) ? std::move(**this)
                                     : static_cast<T>(std::forward<U>(v));
   }