[llvm] [STLForwardCompat] Switch transformOptional from direct call to invoke (PR #186333)

Alexander Romanov via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 19 03:36:14 PDT 2026


================
@@ -168,6 +168,51 @@ TEST(TransformTest, TransformCategory) {
   });
 }
 
+// Checks that pointer to member is a valid argument
+TEST(TransformTest, TransformToMember) {
+  struct StructA {
+    int x = 1;
+    int y = 2;
+  };
+  std::optional<StructA> Opt{StructA{}};
+  auto OptX = transformOptional(Opt, &StructA::x);
+  ASSERT_TRUE(OptX.has_value());
+  EXPECT_EQ(*OptX, 1);
+
+  auto OptY = transformOptional(Opt, &StructA::y);
+  ASSERT_TRUE(OptY.has_value());
+  EXPECT_EQ(*OptY, 2);
+
+  Opt = std::nullopt;
+  OptX = transformOptional(Opt, &StructA::x);
+  EXPECT_FALSE(OptX.has_value());
+}
+
+// Checks that pointer to member function is a valid argument
+TEST(TransformTest, TransformToMemberFunc) {
+  struct Foo {
+    int bar() const { return 42; }
+  };
+  std::optional<Foo> Opt{Foo{}};
+  auto OptRes = transformOptional(Opt, &Foo::bar);
+  ASSERT_TRUE(OptRes.has_value());
+  EXPECT_EQ(*OptRes, 42);
+}
+
+// Checks that callable is forwarded properly
+TEST(TransformTest, TransformRvalueRef) {
+  struct Foo {
+    int operator()(int x) && { return 42; }
+    int operator()(int x) & { return 43; }
+  };
+  std::optional<int> Opt = 1;
+  Foo foo;
+  auto Res = transformOptional(Opt, foo);
+  EXPECT_EQ(Res.value_or(0), 43);
+  Res = transformOptional(Opt, std::move(foo));
+  EXPECT_EQ(Res.value_or(0), 42);
----------------
arromanoff wrote:

@kuhar gentle ping

https://github.com/llvm/llvm-project/pull/186333


More information about the llvm-commits mailing list