MitalAshok wrote:

Here's one scenario where it could make a difference in codegen 
<https://godbolt.org/z/dxvjzsWKr>:

```c++
// Header
struct X;
extern X x;
void f(X&);
inline void g() {
    f(x);
}
inline void h() {
    f(*__builtin_launder(__builtin_addressof(x)));
}

// Source
struct X {
    virtual void mem() { __builtin_printf("X::mem()\n"); }
};
void f(X& x) {
    x.mem();
}
void(*p[2])() = { g, h };  // Force inline functions to be generated
```

Even though Clang currently doesn't do this optimization, with 
`-fstrict-vtable-pointers`, `g()` is allowed to to devirtualise the call.

Also, we can't "complete" the type at all. See 
<https://github.com/llvm/llvm-project/pull/91070/files#diff-a8ef8d65dd30e14c0c43287a86c22b072ad29d04e85c2807602de9bcf2a26af1R160-R164>,
 where the template is not allowed to be instantiated by `launder`.

Maybe we could delay the code-gen to the end of the TU to see if it's completed 
by then? I do think it's an incredibly rare situation for some incomplete type 
to be `std::launder`ed and then later completed in the same TU.


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

Reply via email to