https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110057
user202729 <user202729 at protonmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |user202729 at protonmail dot
com
--- Comment #11 from user202729 <user202729 at protonmail dot com> ---
One way this could be implemented is the following.
* implement built-in `__builtin_vptr(object)` and `__builtin_vptr(Type)` that
obtains the pointer to the vtable (or NULL if the object type has no virtual
method)
* in the implementation `vector.pop_back()` etc., add the the following:
if (__builtin_vptr(this->_M_impl._M_finish) != __builtin_vptr(_Tp))
__builtin_unreachable();
* the optimizer should be able to figure out the rest.
What do you think about this approach?
--------
Alternatively, we can also use the existing `typeid()` --- although the
optimizer is not smart enough to optimize the following code yet.
```
#include<cstdio>
#include<typeinfo>
struct Base{
Base() {}
virtual void f(){ std::printf("Base\n"); }
};
struct Derived final: Base{
Derived() {}
virtual void f(){ std::printf("Derived\n"); }
};
void f(Base* b){
if(!b or typeid(*b)!=typeid(Base)) __builtin_unreachable();
b->f();
}
```