[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