lichray wrote:

> Perhaps we could provide a builtin function that takes an object pointer and 
> a pointer-to-member-function and returns a devirtualized 
> pointer-to-member-function (or returns the original PMF if it wasn't a 
> pointer to a virtual function)? Unlike the GCC extension, that kind of 
> interface can actually work in general.

I suggest viewing the demands at the same time and taking a leveled approach:

1. invoking base implementation via a handle
2. saving a snapshot of a pending virtual call (delegate)
3. resolve virtual call on one object, apply the results on other objects

Each level is less safe than the previous one. 1 slightly troubles Liskov 
substitution, 2 doesn't work before the object establishes the runtime type 
[(in a 
constructor)](https://discourse.llvm.org/t/rfc-implement-gcc-bound-pmf-in-clang/85951/5?u=lichray),
 and 3 can apply the call to objects without such a runtime type.

1 is addressed by [p2825](https://wg21.link/p2825).

C++26 `std::function_ref` (with `nontype<pmf>`) can address 2 at the cost of a 
thunk, usually optimized by sibling call optimization, and safe to use, but you 
can argue that "simply" assigning from the bit pattern of a C++Builder 
`__closure` object may just be what user wants.

The dynamic portion of GCC's bound method can address 3, but the feature can 
also be deemed a building block of `__closure`.

Imagine that you can evaluate `p->mem_fn`, literally a pending virtual call, 
and get a struct of two members, this will allow the use of structured binding:

```cpp
auto [bpf, pobj] = p->mem_fn;
```

Then, to fulfill 3, we only need a way to package the components back into such 
a struct to substitute the `pobj` with a pointer to a different object:

```cpp
auto rebound_method = decltype(p->mem_fn){ bpf, pother };
rebound_method();
```

This option is explored by C folks in 
[n2862](https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2862.pdf). In which 
paper, the rebinding procedure is done by the `wide_set_context` API.

https://github.com/llvm/llvm-project/pull/135649
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to