diff --git a/orc-rt/include/orc-rt/SimplePackedSerialization.h b/orc-rt/include/orc-rt/SimplePackedSerialization.h index 4c1343c70cf27..7ac1cf2367dca 100644 --- a/orc-rt/include/orc-rt/SimplePackedSerialization.h +++ b/orc-rt/include/orc-rt/SimplePackedSerialization.h @@ -599,16 +599,12 @@ template class SPSExpected; /// See SPSSerializableError for more details. template struct SPSSerializableExpected { SPSSerializableExpected() = default; - SPSSerializableExpected(Expected E) { + explicit SPSSerializableExpected(Expected E) { if (E) Val = decltype(Val)(std::in_place_index<0>, std::move(*E)); else Val = decltype(Val)(std::in_place_index<1>, toString(E.takeError())); } - SPSSerializableExpected(Error E) { - assert(E && "Cannot create Expected from Error::success()"); - Val = decltype(Val)(std::in_place_index<1>, toString(std::move(E))); - } Expected toExpected() { if (Val.index() == 0) @@ -621,12 +617,17 @@ template struct SPSSerializableExpected { template SPSSerializableExpected toSPSSerializableExpected(Expected E) { - return std::move(E); + return SPSSerializableExpected(std::move(E)); +} + +template +SPSSerializableExpected toSPSSerializableExpected(T Val) { + return SPSSerializableExpected(std::move(Val)); } template SPSSerializableExpected toSPSSerializableExpected(Error E) { - return std::move(E); + return SPSSerializableExpected(std::move(E)); } template diff --git a/orc-rt/unittests/SimplePackedSerializationTest.cpp b/orc-rt/unittests/SimplePackedSerializationTest.cpp index 09cc168d88645..8b4a8d2f64d56 100644 --- a/orc-rt/unittests/SimplePackedSerializationTest.cpp +++ b/orc-rt/unittests/SimplePackedSerializationTest.cpp @@ -223,7 +223,7 @@ TEST(SimplePackedSerializationTest, SerializeErrorFailure) { EXPECT_EQ(toString(SE.toError()), std::string("test error message")); } -TEST(SimplePackedSerializationTest, SerializeExpectedSuccess) { +TEST(SimplePackedSerializationTest, SerializeExpectedSuccessViaExpected) { auto B = spsSerialize>>( toSPSSerializableExpected(Expected(42U))); if (!B) { @@ -243,6 +243,26 @@ TEST(SimplePackedSerializationTest, SerializeExpectedSuccess) { ADD_FAILURE() << "Unexpected failure value"; } +TEST(SimplePackedSerializationTest, SerializeExpectedSuccessViaValue) { + auto B = spsSerialize>>( + toSPSSerializableExpected(uint32_t(42U))); + if (!B) { + ADD_FAILURE() << "Unexpected failure to serialize expected-success value"; + return; + } + SPSSerializableExpected SE; + if (!spsDeserialize>>(*B, SE)) { + ADD_FAILURE() << "Unexpected failure to deserialize expected-success value"; + return; + } + + auto E = SE.toExpected(); + if (E) + EXPECT_EQ(*E, 42U); + else + ADD_FAILURE() << "Unexpected failure value"; +} + TEST(SimplePackedSerializationTest, SerializeExpectedFailure) { auto B = spsSerialize>>( toSPSSerializableExpected(