From 51a0633604f735234b6221a866c0f5bf66665e06 Mon Sep 17 00:00:00 2001 From: Kittywhiskers Van Gogh <6098974-kittywhiskers@users.noreply.gitlab.com> Date: Thu, 25 Jun 2020 17:25:31 -0400 Subject: [PATCH] Merge #19387: add lifetimebound attribute https://github.com/bitcoin/bitcoin/pull/19387/commits/1d58cc7cb040a70f768b632f294db4e0797d3a34 --- src/span.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/span.h b/src/span.h index befcec5ad5892b..88a078e902ead9 100644 --- a/src/span.h +++ b/src/span.h @@ -18,6 +18,16 @@ #define ASSERT_IF_DEBUG(x) #endif +#if defined(__clang__) +#if __has_attribute(lifetimebound) +#define SPAN_ATTR_LIFETIMEBOUND [[clang::lifetimebound]] +#else +#define SPAN_ATTR_LIFETIMEBOUND +#endif +#else +#define SPAN_ATTR_LIFETIMEBOUND +#endif + /** A Span is an object that can refer to a contiguous sequence of objects. * * It implements a subset of C++20's std::span. @@ -87,14 +97,14 @@ class Span * Note that this restriction does not exist when converting arrays or other Spans (see above). */ template - constexpr Span(V& other, + constexpr Span(V& other SPAN_ATTR_LIFETIMEBOUND, typename std::enable_if::value && std::is_convertible().data())>::type (*)[], C (*)[]>::value && std::is_convertible().size()), std::size_t>::value, std::nullptr_t>::type = nullptr) : m_data(other.data()), m_size(other.size()){} template - constexpr Span(const V& other, + constexpr Span(const V& other SPAN_ATTR_LIFETIMEBOUND, typename std::enable_if::value && std::is_convertible().data())>::type (*)[], C (*)[]>::value && std::is_convertible().size()), std::size_t>::value, std::nullptr_t>::type = nullptr) @@ -154,9 +164,9 @@ class Span /** MakeSpan for arrays: */ template Span constexpr MakeSpan(A (&a)[N]) { return Span(a, N); } /** MakeSpan for temporaries / rvalue references, only supporting const output. */ -template constexpr auto MakeSpan(V&& v) -> typename std::enable_if::value, Span::type>>::type { return std::forward(v); } +template constexpr auto MakeSpan(V&& v SPAN_ATTR_LIFETIMEBOUND) -> typename std::enable_if::value, Span::type>>::type { return std::forward(v); } /** MakeSpan for (lvalue) references, supporting mutable output. */ -template constexpr auto MakeSpan(V& v) -> Span::type> { return v; } +template constexpr auto MakeSpan(V& v SPAN_ATTR_LIFETIMEBOUND) -> Span::type> { return v; } /** Pop the last element off a span, and return a reference to that element. */ template