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