fix AggregateOfImpl for domains with std::pair custom corpus

PiperOrigin-RevId: 762052686
diff --git a/domain_tests/BUILD b/domain_tests/BUILD
index d71a93b..2756234 100644
--- a/domain_tests/BUILD
+++ b/domain_tests/BUILD
@@ -25,10 +25,14 @@
         ":domain_testing",
         "@abseil-cpp//absl/container:flat_hash_set",
         "@abseil-cpp//absl/random",
+        "@abseil-cpp//absl/random:bit_gen_ref",
+        "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/types:optional",
         "@abseil-cpp//absl/types:span",
         "@abseil-cpp//absl/types:variant",
         "@com_google_fuzztest//fuzztest:domain_core",
+        "@com_google_fuzztest//fuzztest:serialization",
+        "@com_google_fuzztest//fuzztest:type_support",
         "@googletest//:gtest_main",
     ],
 )
diff --git a/domain_tests/CMakeLists.txt b/domain_tests/CMakeLists.txt
index 703ee49..b7875eb 100644
--- a/domain_tests/CMakeLists.txt
+++ b/domain_tests/CMakeLists.txt
@@ -11,11 +11,15 @@
   DEPS
     fuzztest::domain_testing
     absl::flat_hash_set
+    absl::random_bit_gen_ref
     absl::random_random
     absl::optional
     absl::span
+    absl::status
     absl::variant
     fuzztest::domain_core
+    fuzztest::serialization
+    fuzztest::type_support
     GTest::gmock_main
 )
 
diff --git a/domain_tests/aggregate_combinators_test.cc b/domain_tests/aggregate_combinators_test.cc
index 4e4c175..dd69894 100644
--- a/domain_tests/aggregate_combinators_test.cc
+++ b/domain_tests/aggregate_combinators_test.cc
@@ -17,6 +17,7 @@
 #include <cstdint>
 #include <optional>
 #include <string>
+#include <tuple>
 #include <utility>
 #include <variant>
 #include <vector>
@@ -24,12 +25,16 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/container/flat_hash_set.h"
+#include "absl/random/bit_gen_ref.h"
 #include "absl/random/random.h"
+#include "absl/status/status.h"
 #include "absl/types/optional.h"
 #include "absl/types/span.h"
 #include "absl/types/variant.h"
 #include "./fuzztest/domain_core.h"
 #include "./domain_tests/domain_testing.h"
+#include "./fuzztest/internal/serialization.h"
+#include "./fuzztest/internal/type_support.h"
 
 namespace fuzztest {
 namespace {
@@ -446,5 +451,48 @@
           R"(Invalid value in aggregate >> The value .+ is not InRange\(.+\))")));
 }
 
+TEST(TupleOf, DomainWithCustomPairCorpusType) {
+  class DomainWithCustomPairCorpusType
+      : public fuzztest::domain_implementor::DomainBase<
+            DomainWithCustomPairCorpusType, std::pair<uint8_t, uint8_t>,
+            std::pair<uint64_t, uint64_t>> {
+   public:
+    using corpus_type = DomainWithCustomPairCorpusType::DomainBase::corpus_type;
+    using value_type = DomainWithCustomPairCorpusType::DomainBase::value_type;
+
+    corpus_type Init(absl::BitGenRef prng) { return {0, 0}; }
+
+    void Mutate(corpus_type& val, absl::BitGenRef prng,
+                const domain_implementor::MutationMetadata& metadata,
+                bool only_shrink) {}
+
+    absl::Status ValidateCorpusValue(const corpus_type& value) const {
+      return absl::OkStatus();
+    }
+
+    auto GetPrinter() const { return internal::UnknownPrinter(); }
+
+    value_type GetValue(const corpus_type& v) const { return value_type(v); }
+
+    std::optional<corpus_type> FromValue(const value_type& v) const {
+      return corpus_type(v);
+    }
+
+    std::optional<corpus_type> ParseCorpus(
+        const internal::IRObject& obj) const {
+      return corpus_type{};
+    }
+
+    internal::IRObject SerializeCorpus(const corpus_type& v) const {
+      return internal::IRObject{};
+    }
+  };
+
+  auto domain = TupleOf(DomainWithCustomPairCorpusType{});
+  std::tuple<std::pair<uint8_t, uint8_t>> value{{1, 2}};
+  auto optional_corpus_tuple = domain.FromValue(value);
+  EXPECT_TRUE(optional_corpus_tuple.has_value());
+}
+
 }  // namespace
 }  // namespace fuzztest
diff --git a/fuzztest/internal/domains/aggregate_of_impl.h b/fuzztest/internal/domains/aggregate_of_impl.h
index 4b62083..cd70ca1 100644
--- a/fuzztest/internal/domains/aggregate_of_impl.h
+++ b/fuzztest/internal/domains/aggregate_of_impl.h
@@ -140,7 +140,7 @@
             value, std::integral_constant<int, sizeof...(Inner)>{});
         return [](auto... optional_values) -> std::optional<corpus_type> {
           if ((optional_values.has_value() && ...)) {
-            return std::tuple(*std::move(optional_values)...);
+            return corpus_type(*std::move(optional_values)...);
           } else {
             return std::nullopt;
           }