================ @@ -145,6 +145,110 @@ TEST(LlvmLibcTypeTraitsTest, integral_constant) { EXPECT_EQ((integral_constant<int, 4>::value), 4); } +namespace invoke_detail { + +enum State { INIT = 0, A_APPLY_CALLED, B_APPLY_CALLED }; + +struct A { + State state = INIT; + virtual ~A() {} + virtual void apply() { state = A_APPLY_CALLED; } +}; + +struct B : public A { + virtual ~B() {} + virtual void apply() { state = B_APPLY_CALLED; } +}; + +void free_function() {} +int free_function_return_5() { return 5; } +int free_function_passtrough(int value) { return value; } + +struct Delegate { + int (*ptr)(int) = &free_function_passtrough; +}; + +template <int tag> struct Tag { + static int value() { return tag; } +}; + +struct Functor { + auto operator()() & { return Tag<0>(); } + auto operator()() const & { return Tag<1>(); } + auto operator()() && { return Tag<2>(); } + auto operator()() const && { return Tag<3>(); } +}; + +} // namespace invoke_detail + +TEST(LlvmLibcTypeTraitsTest, invoke) { + using namespace invoke_detail; + { // member function call + A a; + EXPECT_EQ(a.state, INIT); + invoke(&A::apply, a); + EXPECT_EQ(a.state, A_APPLY_CALLED); + } + { // overriden member function call + B b; + EXPECT_EQ(b.state, INIT); + invoke(&A::apply, b); + EXPECT_EQ(b.state, B_APPLY_CALLED); + } + { // free function + invoke(&free_function); + EXPECT_EQ(invoke(&free_function_return_5), 5); + EXPECT_EQ(invoke(&free_function_passtrough, 1), 1); + } + { // pointer member function call + Delegate d; + EXPECT_EQ(invoke(&Delegate::ptr, d, 2), 2); + } + { // Functor with several ref qualifier ---------------- legrosbuffle wrote:
qualifiers https://github.com/llvm/llvm-project/pull/65750 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits