[llvm] [orc-rt] Simplify construction of SPSSerializableExpected from values. (PR #157796)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 9 21:51:48 PDT 2025


https://github.com/lhames created https://github.com/llvm/llvm-project/pull/157796

Adds an overload of toSPSSerializableExpected that takes a plain T value and returns an SPSSerializableExpected<T>. This will reduce some boilerplate when creating SPSSerializableExpected values.

>From 6b243aff40da010b9398d2e8fd9d6c7c6201e125 Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Wed, 10 Sep 2025 14:43:44 +1000
Subject: [PATCH] [orc-rt] Simplify construction of SPSSerializableExpected
 from values.

Adds an overload of toSPSSerializableExpected that takes a plain T value and
returns an SPSSerializableExpected<T>. This will reduce some boilerplate when
creating SPSSerializableExpected values.
---
 .../orc-rt/SimplePackedSerialization.h        | 15 +++++++------
 .../SimplePackedSerializationTest.cpp         | 22 ++++++++++++++++++-
 2 files changed, 29 insertions(+), 8 deletions(-)

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 <typename SPSTagT> class SPSExpected;
 /// See SPSSerializableError for more details.
 template <typename T> struct SPSSerializableExpected {
   SPSSerializableExpected() = default;
-  SPSSerializableExpected(Expected<T> E) {
+  explicit SPSSerializableExpected(Expected<T> 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<T> toExpected() {
     if (Val.index() == 0)
@@ -621,12 +617,17 @@ template <typename T> struct SPSSerializableExpected {
 
 template <typename T>
 SPSSerializableExpected<T> toSPSSerializableExpected(Expected<T> E) {
-  return std::move(E);
+  return SPSSerializableExpected<T>(std::move(E));
+}
+
+template <typename T>
+SPSSerializableExpected<T> toSPSSerializableExpected(T Val) {
+  return SPSSerializableExpected<T>(std::move(Val));
 }
 
 template <typename T>
 SPSSerializableExpected<T> toSPSSerializableExpected(Error E) {
-  return std::move(E);
+  return SPSSerializableExpected<T>(std::move(E));
 }
 
 template <typename SPSTagT, typename T>
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<SPSArgList<SPSExpected<uint32_t>>>(
       toSPSSerializableExpected(Expected<uint32_t>(42U)));
   if (!B) {
@@ -243,6 +243,26 @@ TEST(SimplePackedSerializationTest, SerializeExpectedSuccess) {
     ADD_FAILURE() << "Unexpected failure value";
 }
 
+TEST(SimplePackedSerializationTest, SerializeExpectedSuccessViaValue) {
+  auto B = spsSerialize<SPSArgList<SPSExpected<uint32_t>>>(
+      toSPSSerializableExpected(uint32_t(42U)));
+  if (!B) {
+    ADD_FAILURE() << "Unexpected failure to serialize expected-success value";
+    return;
+  }
+  SPSSerializableExpected<uint32_t> SE;
+  if (!spsDeserialize<SPSArgList<SPSExpected<uint32_t>>>(*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<SPSArgList<SPSExpected<uint32_t>>>(
       toSPSSerializableExpected<uint32_t>(



More information about the llvm-commits mailing list