1*61c4878aSAndroid Build Coastguard Worker# Copyright 2024 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker# 3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker# the License at 6*61c4878aSAndroid Build Coastguard Worker# 7*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker# 9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker# the License. 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Worker# DO NOT EDIT! This file is generated by generate_fuchsia_patch.py. 16*61c4878aSAndroid Build Coastguard Worker# 17*61c4878aSAndroid Build Coastguard Worker# To make changes, update and run ./generate_fuchsia_patch.py. 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Worker# Patch the fit::function implementation for use in Pigweed: 20*61c4878aSAndroid Build Coastguard Worker# 21*61c4878aSAndroid Build Coastguard Worker# - Use PW_ASSERT instead of __builtin_abort. 22*61c4878aSAndroid Build Coastguard Worker# - Temporarily disable sanitizers when invoking a function for b/241567321. 23*61c4878aSAndroid Build Coastguard Worker# 24*61c4878aSAndroid Build Coastguard Workerdiff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h 25*61c4878aSAndroid Build Coastguard Worker--- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h 26*61c4878aSAndroid Build Coastguard Worker+++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/function.h 27*61c4878aSAndroid Build Coastguard Worker@@ -18,6 +18,8 @@ 28*61c4878aSAndroid Build Coastguard Worker #include <utility> 29*61c4878aSAndroid Build Coastguard Worker 30*61c4878aSAndroid Build Coastguard Worker #include "../nullable.h" 31*61c4878aSAndroid Build Coastguard Worker+#include "pw_assert/assert.h" 32*61c4878aSAndroid Build Coastguard Worker+#include "pw_preprocessor/compiler.h" 33*61c4878aSAndroid Build Coastguard Worker 34*61c4878aSAndroid Build Coastguard Worker namespace fit { 35*61c4878aSAndroid Build Coastguard Worker namespace internal { 36*61c4878aSAndroid Build Coastguard Worker@@ -88,7 +90,7 @@ inline const void* unshared_target_type_id(void* /*bits*/, const void* impl_ops) 37*61c4878aSAndroid Build Coastguard Worker // elsewhere in the header as an inline variable. 38*61c4878aSAndroid Build Coastguard Worker template <typename Unused = void> 39*61c4878aSAndroid Build Coastguard Worker struct null_target { 40*61c4878aSAndroid Build Coastguard Worker- static void invoke(void* /*bits*/) { __builtin_abort(); } 41*61c4878aSAndroid Build Coastguard Worker+ static void invoke(void* /*bits*/) { PW_ASSERT(false); } 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker static const target_ops<void> ops; 44*61c4878aSAndroid Build Coastguard Worker 45*61c4878aSAndroid Build Coastguard Worker@@ -510,7 +512,8 @@ class function_base<inline_target_size, require_inline, Result(Args...), Allocat 46*61c4878aSAndroid Build Coastguard Worker // Note that fit::callback will release the target immediately after 47*61c4878aSAndroid Build Coastguard Worker // invoke() (also affecting any share()d copies). 48*61c4878aSAndroid Build Coastguard Worker // Aborts if the function's target is empty. 49*61c4878aSAndroid Build Coastguard Worker- Result invoke(Args... args) const { 50*61c4878aSAndroid Build Coastguard Worker+ // TODO: b/241567321 - Remove "no sanitize" after pw_protobuf is fixed. 51*61c4878aSAndroid Build Coastguard Worker+ Result invoke(Args... args) const PW_NO_SANITIZE("function") { 52*61c4878aSAndroid Build Coastguard Worker // Down cast the ops to the derived type that this function was instantiated 53*61c4878aSAndroid Build Coastguard Worker // with, which includes the invoke function. 54*61c4878aSAndroid Build Coastguard Worker // 55*61c4878aSAndroid Build Coastguard Worker@@ -540,7 +543,7 @@ class function_base<inline_target_size, require_inline, Result(Args...), Allocat 56*61c4878aSAndroid Build Coastguard Worker template <typename SharedFunction> 57*61c4878aSAndroid Build Coastguard Worker void copy_shared_target_to(SharedFunction& copy) { 58*61c4878aSAndroid Build Coastguard Worker copy.destroy_target(); 59*61c4878aSAndroid Build Coastguard Worker- assert(base::ops() == &shared_target_type<SharedFunction>::ops); 60*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(base::ops() == &shared_target_type<SharedFunction>::ops); 61*61c4878aSAndroid Build Coastguard Worker shared_target_type<SharedFunction>::copy_shared_ptr(base::bits(), copy.bits()); 62*61c4878aSAndroid Build Coastguard Worker copy.set_ops(base::ops()); 63*61c4878aSAndroid Build Coastguard Worker } 64*61c4878aSAndroid Build Coastguard Worker@@ -570,7 +573,7 @@ class function_base<inline_target_size, require_inline, Result(Args...), Allocat 65*61c4878aSAndroid Build Coastguard Worker void check_target_type() const { 66*61c4878aSAndroid Build Coastguard Worker if (target_type<Callable>::ops.target_type_id(nullptr, &target_type<Callable>::ops) != 67*61c4878aSAndroid Build Coastguard Worker base::target_type_id()) { 68*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 69*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 70*61c4878aSAndroid Build Coastguard Worker } 71*61c4878aSAndroid Build Coastguard Worker } 72*61c4878aSAndroid Build Coastguard Worker }; 73*61c4878aSAndroid Build Coastguard Workerdiff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/result.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/result.h 74*61c4878aSAndroid Build Coastguard Worker--- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/result.h 75*61c4878aSAndroid Build Coastguard Worker+++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/internal/result.h 76*61c4878aSAndroid Build Coastguard Worker@@ -14,6 +14,11 @@ 77*61c4878aSAndroid Build Coastguard Worker #include <type_traits> 78*61c4878aSAndroid Build Coastguard Worker #include <utility> 79*61c4878aSAndroid Build Coastguard Worker 80*61c4878aSAndroid Build Coastguard Worker+#include "pw_preprocessor/compiler.h" 81*61c4878aSAndroid Build Coastguard Worker+ 82*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTICS_PUSH(); 83*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTIC_CLANG(ignored, "-Wshadow-field-in-constructor"); 84*61c4878aSAndroid Build Coastguard Worker+ 85*61c4878aSAndroid Build Coastguard Worker namespace fit { 86*61c4878aSAndroid Build Coastguard Worker 87*61c4878aSAndroid Build Coastguard Worker // Forward declarations. 88*61c4878aSAndroid Build Coastguard Worker@@ -60,7 +65,7 @@ struct template_matcher { 89*61c4878aSAndroid Build Coastguard Worker }; 90*61c4878aSAndroid Build Coastguard Worker 91*61c4878aSAndroid Build Coastguard Worker template <typename T, template <typename...> class U, typename = bool> 92*61c4878aSAndroid Build Coastguard Worker-struct is_match : decltype(template_matcher<U>::match(std::declval<T>())) {}; 93*61c4878aSAndroid Build Coastguard Worker+struct is_match : decltype(template_matcher<U>::match(std::declval<T>())){}; 94*61c4878aSAndroid Build Coastguard Worker 95*61c4878aSAndroid Build Coastguard Worker template <typename T, template <typename...> class U> 96*61c4878aSAndroid Build Coastguard Worker struct is_match<T, U, requires_conditions<std::is_void<T>>> : std::false_type {}; 97*61c4878aSAndroid Build Coastguard Worker@@ -441,4 +446,6 @@ using storage = storage_type<storage_class_trait<E, Ts...>, E, Ts...>; 98*61c4878aSAndroid Build Coastguard Worker } // namespace internal 99*61c4878aSAndroid Build Coastguard Worker } // namespace fit 100*61c4878aSAndroid Build Coastguard Worker 101*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTICS_POP(); 102*61c4878aSAndroid Build Coastguard Worker+ 103*61c4878aSAndroid Build Coastguard Worker #endif // LIB_FIT_INTERNAL_RESULT_H_ 104*61c4878aSAndroid Build Coastguard Workerdiff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h 105*61c4878aSAndroid Build Coastguard Worker--- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h 106*61c4878aSAndroid Build Coastguard Worker+++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/nullable.h 107*61c4878aSAndroid Build Coastguard Worker@@ -11,6 +11,8 @@ 108*61c4878aSAndroid Build Coastguard Worker #include <type_traits> 109*61c4878aSAndroid Build Coastguard Worker #include <utility> 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker+#include "pw_assert/assert.h" 112*61c4878aSAndroid Build Coastguard Worker+ 113*61c4878aSAndroid Build Coastguard Worker namespace fit { 114*61c4878aSAndroid Build Coastguard Worker 115*61c4878aSAndroid Build Coastguard Worker // Determines whether a type can be compared with nullptr. 116*61c4878aSAndroid Build Coastguard Worker@@ -130,25 +132,25 @@ class nullable<T, true> final { 117*61c4878aSAndroid Build Coastguard Worker if (has_value()) { 118*61c4878aSAndroid Build Coastguard Worker return value_; 119*61c4878aSAndroid Build Coastguard Worker } 120*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 121*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 122*61c4878aSAndroid Build Coastguard Worker } 123*61c4878aSAndroid Build Coastguard Worker constexpr const T& value() const& { 124*61c4878aSAndroid Build Coastguard Worker if (has_value()) { 125*61c4878aSAndroid Build Coastguard Worker return value_; 126*61c4878aSAndroid Build Coastguard Worker } 127*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 128*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 129*61c4878aSAndroid Build Coastguard Worker } 130*61c4878aSAndroid Build Coastguard Worker constexpr T&& value() && { 131*61c4878aSAndroid Build Coastguard Worker if (has_value()) { 132*61c4878aSAndroid Build Coastguard Worker return std::move(value_); 133*61c4878aSAndroid Build Coastguard Worker } 134*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 135*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 136*61c4878aSAndroid Build Coastguard Worker } 137*61c4878aSAndroid Build Coastguard Worker constexpr const T&& value() const&& { 138*61c4878aSAndroid Build Coastguard Worker if (has_value()) { 139*61c4878aSAndroid Build Coastguard Worker return std::move(value_); 140*61c4878aSAndroid Build Coastguard Worker } 141*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 142*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 143*61c4878aSAndroid Build Coastguard Worker } 144*61c4878aSAndroid Build Coastguard Worker 145*61c4878aSAndroid Build Coastguard Worker template <typename U = T> 146*61c4878aSAndroid Build Coastguard Workerdiff --git a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h 147*61c4878aSAndroid Build Coastguard Worker--- a/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h 148*61c4878aSAndroid Build Coastguard Worker+++ b/third_party/fuchsia/repo/sdk/lib/fit/include/lib/fit/result.h 149*61c4878aSAndroid Build Coastguard Worker@@ -55,6 +55,12 @@ 150*61c4878aSAndroid Build Coastguard Worker // // fit::result with a different "success" vluae type (or 151*61c4878aSAndroid Build Coastguard Worker // // fit::result<E>). 152*61c4878aSAndroid Build Coastguard Worker 153*61c4878aSAndroid Build Coastguard Worker+#include "pw_assert/assert.h" 154*61c4878aSAndroid Build Coastguard Worker+#include "pw_preprocessor/compiler.h" 155*61c4878aSAndroid Build Coastguard Worker+ 156*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTICS_PUSH(); 157*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTIC_CLANG(ignored, "-Wshadow-field-in-constructor"); 158*61c4878aSAndroid Build Coastguard Worker+ 159*61c4878aSAndroid Build Coastguard Worker namespace fit { 160*61c4878aSAndroid Build Coastguard Worker 161*61c4878aSAndroid Build Coastguard Worker // Convenience type to indicate failure without elaboration. 162*61c4878aSAndroid Build Coastguard Worker@@ -286,25 +292,25 @@ class [[nodiscard]] result<E, T> { 163*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 164*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.error; 165*61c4878aSAndroid Build Coastguard Worker } 166*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 167*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 168*61c4878aSAndroid Build Coastguard Worker } 169*61c4878aSAndroid Build Coastguard Worker constexpr const E& error_value() const& { 170*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 171*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.error; 172*61c4878aSAndroid Build Coastguard Worker } 173*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 174*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 175*61c4878aSAndroid Build Coastguard Worker } 176*61c4878aSAndroid Build Coastguard Worker constexpr E&& error_value() && { 177*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 178*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.error); 179*61c4878aSAndroid Build Coastguard Worker } 180*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 181*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 182*61c4878aSAndroid Build Coastguard Worker } 183*61c4878aSAndroid Build Coastguard Worker constexpr const E&& error_value() const&& { 184*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 185*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.error); 186*61c4878aSAndroid Build Coastguard Worker } 187*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 188*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 189*61c4878aSAndroid Build Coastguard Worker } 190*61c4878aSAndroid Build Coastguard Worker 191*61c4878aSAndroid Build Coastguard Worker // Moves the underlying error and returns it as an instance of fit::error, simplifying 192*61c4878aSAndroid Build Coastguard Worker@@ -315,7 +321,7 @@ class [[nodiscard]] result<E, T> { 193*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 194*61c4878aSAndroid Build Coastguard Worker return error<E>(std::move(storage_.error_or_value.error)); 195*61c4878aSAndroid Build Coastguard Worker } 196*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 197*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 198*61c4878aSAndroid Build Coastguard Worker } 199*61c4878aSAndroid Build Coastguard Worker 200*61c4878aSAndroid Build Coastguard Worker // Accessors for the underlying value. 201*61c4878aSAndroid Build Coastguard Worker@@ -325,25 +331,25 @@ class [[nodiscard]] result<E, T> { 202*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 203*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.value; 204*61c4878aSAndroid Build Coastguard Worker } 205*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 206*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 207*61c4878aSAndroid Build Coastguard Worker } 208*61c4878aSAndroid Build Coastguard Worker constexpr const T& value() const& { 209*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 210*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.value; 211*61c4878aSAndroid Build Coastguard Worker } 212*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 213*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 214*61c4878aSAndroid Build Coastguard Worker } 215*61c4878aSAndroid Build Coastguard Worker constexpr T&& value() && { 216*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 217*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.value); 218*61c4878aSAndroid Build Coastguard Worker } 219*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 220*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 221*61c4878aSAndroid Build Coastguard Worker } 222*61c4878aSAndroid Build Coastguard Worker constexpr const T&& value() const&& { 223*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 224*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.value); 225*61c4878aSAndroid Build Coastguard Worker } 226*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 227*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 228*61c4878aSAndroid Build Coastguard Worker } 229*61c4878aSAndroid Build Coastguard Worker 230*61c4878aSAndroid Build Coastguard Worker // Moves the underlying value and returns it as an instance of fit::success, simplifying 231*61c4878aSAndroid Build Coastguard Worker@@ -354,7 +360,7 @@ class [[nodiscard]] result<E, T> { 232*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 233*61c4878aSAndroid Build Coastguard Worker return success<T>(std::move(storage_.error_or_value.value)); 234*61c4878aSAndroid Build Coastguard Worker } 235*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 236*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 237*61c4878aSAndroid Build Coastguard Worker } 238*61c4878aSAndroid Build Coastguard Worker 239*61c4878aSAndroid Build Coastguard Worker // Contingent accessors for the underlying value. 240*61c4878aSAndroid Build Coastguard Worker@@ -383,13 +389,13 @@ class [[nodiscard]] result<E, T> { 241*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 242*61c4878aSAndroid Build Coastguard Worker return ::fit::internal::arrow_operator<T>::forward(storage_.error_or_value.value); 243*61c4878aSAndroid Build Coastguard Worker } 244*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 245*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 246*61c4878aSAndroid Build Coastguard Worker } 247*61c4878aSAndroid Build Coastguard Worker constexpr decltype(auto) operator->() const { 248*61c4878aSAndroid Build Coastguard Worker if (is_ok()) { 249*61c4878aSAndroid Build Coastguard Worker return ::fit::internal::arrow_operator<T>::forward(storage_.error_or_value.value); 250*61c4878aSAndroid Build Coastguard Worker } 251*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 252*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 253*61c4878aSAndroid Build Coastguard Worker } 254*61c4878aSAndroid Build Coastguard Worker 255*61c4878aSAndroid Build Coastguard Worker // Accessors for the underlying value. This is a syntax sugar for value(). 256*61c4878aSAndroid Build Coastguard Worker@@ -412,7 +418,7 @@ class [[nodiscard]] result<E, T> { 257*61c4878aSAndroid Build Coastguard Worker storage_.error_or_value.error += std::move(error.value_); 258*61c4878aSAndroid Build Coastguard Worker return *this; 259*61c4878aSAndroid Build Coastguard Worker } 260*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 261*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 262*61c4878aSAndroid Build Coastguard Worker } 263*61c4878aSAndroid Build Coastguard Worker 264*61c4878aSAndroid Build Coastguard Worker // Maps a result<E, T> to a result<E2, T> by transforming the error through 265*61c4878aSAndroid Build Coastguard Worker@@ -523,25 +529,25 @@ class [[nodiscard]] result<E> { 266*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 267*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.error; 268*61c4878aSAndroid Build Coastguard Worker } 269*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 270*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 271*61c4878aSAndroid Build Coastguard Worker } 272*61c4878aSAndroid Build Coastguard Worker constexpr const E& error_value() const& { 273*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 274*61c4878aSAndroid Build Coastguard Worker return storage_.error_or_value.error; 275*61c4878aSAndroid Build Coastguard Worker } 276*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 277*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 278*61c4878aSAndroid Build Coastguard Worker } 279*61c4878aSAndroid Build Coastguard Worker constexpr E&& error_value() && { 280*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 281*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.error); 282*61c4878aSAndroid Build Coastguard Worker } 283*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 284*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 285*61c4878aSAndroid Build Coastguard Worker } 286*61c4878aSAndroid Build Coastguard Worker constexpr const E&& error_value() const&& { 287*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 288*61c4878aSAndroid Build Coastguard Worker return std::move(storage_.error_or_value.error); 289*61c4878aSAndroid Build Coastguard Worker } 290*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 291*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 292*61c4878aSAndroid Build Coastguard Worker } 293*61c4878aSAndroid Build Coastguard Worker 294*61c4878aSAndroid Build Coastguard Worker // Moves the underlying error and returns it as an instance of fit::error, simplifying 295*61c4878aSAndroid Build Coastguard Worker@@ -552,7 +558,7 @@ class [[nodiscard]] result<E> { 296*61c4878aSAndroid Build Coastguard Worker if (is_error()) { 297*61c4878aSAndroid Build Coastguard Worker return error<E>(std::move(storage_.error_or_value.error)); 298*61c4878aSAndroid Build Coastguard Worker } 299*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 300*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 301*61c4878aSAndroid Build Coastguard Worker } 302*61c4878aSAndroid Build Coastguard Worker 303*61c4878aSAndroid Build Coastguard Worker // Augments the error value of the result with the given value. The operator E::operator+=(F) must 304*61c4878aSAndroid Build Coastguard Worker@@ -566,7 +572,7 @@ class [[nodiscard]] result<E> { 305*61c4878aSAndroid Build Coastguard Worker storage_.error_or_value.error += std::move(error.value_); 306*61c4878aSAndroid Build Coastguard Worker return *this; 307*61c4878aSAndroid Build Coastguard Worker } 308*61c4878aSAndroid Build Coastguard Worker- __builtin_abort(); 309*61c4878aSAndroid Build Coastguard Worker+ PW_ASSERT(false); 310*61c4878aSAndroid Build Coastguard Worker } 311*61c4878aSAndroid Build Coastguard Worker 312*61c4878aSAndroid Build Coastguard Worker // Maps a result<E, T> to a result<E2, T> by transforming the error through 313*61c4878aSAndroid Build Coastguard Worker@@ -801,4 +807,6 @@ constexpr bool operator>=(const T& lhs, const result<F, U>& rhs) { 314*61c4878aSAndroid Build Coastguard Worker 315*61c4878aSAndroid Build Coastguard Worker } // namespace fit 316*61c4878aSAndroid Build Coastguard Worker 317*61c4878aSAndroid Build Coastguard Worker+PW_MODIFY_DIAGNOSTICS_POP(); 318*61c4878aSAndroid Build Coastguard Worker+ 319*61c4878aSAndroid Build Coastguard Worker #endif // LIB_FIT_RESULT_H_ 320*61c4878aSAndroid Build Coastguard Workerdiff --git a/third_party/fuchsia/repo/sdk/lib/fit/test/function_tests.cc b/third_party/fuchsia/repo/sdk/lib/fit/test/function_tests.cc 321*61c4878aSAndroid Build Coastguard Worker--- a/third_party/fuchsia/repo/sdk/lib/fit/test/function_tests.cc 322*61c4878aSAndroid Build Coastguard Worker+++ b/third_party/fuchsia/repo/sdk/lib/fit/test/function_tests.cc 323*61c4878aSAndroid Build Coastguard Worker@@ -4,7 +4,6 @@ 324*61c4878aSAndroid Build Coastguard Worker 325*61c4878aSAndroid Build Coastguard Worker #include <lib/fit/function.h> 326*61c4878aSAndroid Build Coastguard Worker #include <lib/stdcompat/bit.h> 327*61c4878aSAndroid Build Coastguard Worker-#include <zircon/compiler.h> 328*61c4878aSAndroid Build Coastguard Worker 329*61c4878aSAndroid Build Coastguard Worker #include <algorithm> 330*61c4878aSAndroid Build Coastguard Worker #include <array> 331*61c4878aSAndroid Build Coastguard Worker@@ -15,6 +14,8 @@ 332*61c4878aSAndroid Build Coastguard Worker 333*61c4878aSAndroid Build Coastguard Worker #include <zxtest/zxtest.h> 334*61c4878aSAndroid Build Coastguard Worker 335*61c4878aSAndroid Build Coastguard Worker+#include "pw_polyfill/language_feature_macros.h" 336*61c4878aSAndroid Build Coastguard Worker+ 337*61c4878aSAndroid Build Coastguard Worker namespace { 338*61c4878aSAndroid Build Coastguard Worker 339*61c4878aSAndroid Build Coastguard Worker using ::std::size_t; 340*61c4878aSAndroid Build Coastguard Worker@@ -1029,8 +1030,8 @@ TEST(FunctionTests, callback_with_custom_allocator) { 341*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(1, cbheapdestroy); 342*61c4878aSAndroid Build Coastguard Worker } 343*61c4878aSAndroid Build Coastguard Worker 344*61c4878aSAndroid Build Coastguard Worker-__CONSTINIT const fit::function<void()> kDefaultConstructed; 345*61c4878aSAndroid Build Coastguard Worker-__CONSTINIT const fit::function<void()> kNullptrConstructed(nullptr); 346*61c4878aSAndroid Build Coastguard Worker+PW_CONSTINIT const fit::function<void()> kDefaultConstructed; 347*61c4878aSAndroid Build Coastguard Worker+PW_CONSTINIT const fit::function<void()> kNullptrConstructed(nullptr); 348*61c4878aSAndroid Build Coastguard Worker 349*61c4878aSAndroid Build Coastguard Worker TEST(FunctionTests, null_constructors_are_constexpr) { 350*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(kDefaultConstructed, nullptr); 351