aboutsummaryrefslogtreecommitdiff
path: root/absl/status/internal/statusor_internal.h
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2024-04-02 07:41:09 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-02 07:42:26 -0700
commitd1dd9cd60a7167bc6e2f34877660e747e5b92842 (patch)
tree0d043a7326084b80538f9e6e722f74682ec3f7b9 /absl/status/internal/statusor_internal.h
parentc02bb5f6dae73df83abc0d960ccf5cf3ab00f24c (diff)
downloadabseil-d1dd9cd60a7167bc6e2f34877660e747e5b92842.tar.gz
abseil-d1dd9cd60a7167bc6e2f34877660e747e5b92842.tar.bz2
abseil-d1dd9cd60a7167bc6e2f34877660e747e5b92842.zip
Add internal traits to absl::StatusOr for lifetimebound detection
This helps compilers that understand `ABSL_ATTRIBUTE_LIFETIME_BOUND` flag constructs such as `absl::StatusOr<std::string_view> str = std::string(...)` as error-prone. PiperOrigin-RevId: 621169918 Change-Id: Id621f63b9da4dc72eb4bd42c62d88bcc15a05243
Diffstat (limited to 'absl/status/internal/statusor_internal.h')
-rw-r--r--absl/status/internal/statusor_internal.h35
1 files changed, 21 insertions, 14 deletions
diff --git a/absl/status/internal/statusor_internal.h b/absl/status/internal/statusor_internal.h
index 1afd3179..414aa300 100644
--- a/absl/status/internal/statusor_internal.h
+++ b/absl/status/internal/statusor_internal.h
@@ -123,13 +123,15 @@ using IsForwardingAssignmentValid = absl::disjunction<
std::is_same<absl::in_place_t, absl::remove_cvref_t<U>>,
IsForwardingAssignmentAmbiguous<T, U>>>>;
-template <bool Explicit, typename T>
-using NegationIf = std::conditional_t<Explicit, absl::negation<T>, T>;
+template <bool Value, typename T>
+using Equality = std::conditional_t<Value, T, absl::negation<T>>;
-template <typename T, typename U, bool Explicit>
+template <bool Explicit, typename T, typename U, bool Lifetimebound>
using IsConstructionValid = absl::conjunction<
+ Equality<Lifetimebound,
+ type_traits_internal::IsLifetimeBoundAssignment<T, U>>,
IsDirectInitializationValid<T, U&&>, std::is_constructible<T, U&&>,
- NegationIf<Explicit, std::is_convertible<U&&, T>>,
+ Equality<!Explicit, std::is_convertible<U&&, T>>,
absl::disjunction<
std::is_same<T, absl::remove_cvref_t<U>>,
absl::conjunction<
@@ -140,8 +142,10 @@ using IsConstructionValid = absl::conjunction<
absl::negation<
internal_statusor::HasConversionOperatorToStatusOr<T, U&&>>>>>;
-template <typename T, typename U>
+template <typename T, typename U, bool Lifetimebound>
using IsAssignmentValid = absl::conjunction<
+ Equality<Lifetimebound,
+ type_traits_internal::IsLifetimeBoundAssignment<T, U>>,
std::is_constructible<T, U&&>, std::is_assignable<T&, U&&>,
absl::disjunction<
std::is_same<T, absl::remove_cvref_t<U>>,
@@ -150,27 +154,30 @@ using IsAssignmentValid = absl::conjunction<
absl::negation<HasConversionOperatorToStatusOr<T, U&&>>>>,
IsForwardingAssignmentValid<T, U&&>>;
-template <typename T, typename U, bool Explicit>
+template <bool Explicit, typename T, typename U>
using IsConstructionFromStatusValid = absl::conjunction<
absl::negation<std::is_same<absl::StatusOr<T>, absl::remove_cvref_t<U>>>,
absl::negation<std::is_same<T, absl::remove_cvref_t<U>>>,
absl::negation<std::is_same<absl::in_place_t, absl::remove_cvref_t<U>>>,
- NegationIf<Explicit, std::is_convertible<U, absl::Status>>,
+ Equality<!Explicit, std::is_convertible<U, absl::Status>>,
std::is_constructible<absl::Status, U>,
absl::negation<HasConversionOperatorToStatusOr<T, U>>>;
-template <typename T, typename U>
-using IsStatusAssignmentValid = IsConstructionFromStatusValid<T, U, false>;
-
-template <typename T, typename U, typename UQ, bool Explicit>
+template <bool Explicit, typename T, typename U, bool Lifetimebound,
+ typename UQ>
using IsConstructionFromStatusOrValid = absl::conjunction<
- absl::negation<std::is_same<T, U>>, std::is_constructible<T, UQ>,
- NegationIf<Explicit, std::is_convertible<UQ, T>>,
+ absl::negation<std::is_same<T, U>>,
+ Equality<Lifetimebound,
+ type_traits_internal::IsLifetimeBoundAssignment<T, U>>,
+ std::is_constructible<T, UQ>,
+ Equality<!Explicit, std::is_convertible<UQ, T>>,
absl::negation<IsConstructibleOrConvertibleFromStatusOr<T, U>>>;
-template <typename T, typename U>
+template <typename T, typename U, bool Lifetimebound>
using IsStatusOrAssignmentValid = absl::conjunction<
absl::negation<std::is_same<T, absl::remove_cvref_t<U>>>,
+ Equality<Lifetimebound,
+ type_traits_internal::IsLifetimeBoundAssignment<T, U>>,
std::is_constructible<T, U>, std::is_assignable<T, U>,
absl::negation<IsConstructibleOrConvertibleOrAssignableFromStatusOr<
T, absl::remove_cvref_t<U>>>>;