https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121685
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org
--- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> ---
> Note that LLVM happily hoists this load, creating wrong-code.
So LLVM does a load here?
std::vector<int> v; // size == 0
alignas(std::vector<int>) char c;
fun(v, reinterpret_cast<std::vector<int>&>(c));
Looking at the wording for reinterpret_cast I'm not actually sure if that cast
is valid, because the reinterpret_cast<T&>(x) is defined in terms of
*reinterpret_cast<T*>(&x) and the indirection with * would be undefined. So
maybe we can assume that doesn't happen.
For this case:
std::vector<int> v; // size == 0
auto ptr = new std::vector<int>;
auto& ref = *ptr;
delete ptr;
fun(v, ref);
I think the call is UB because we need to bind the m_mcowner reference
parameter to the object that ref refers to, but there is no such object now.
But I'm not confident about either of those, so CC jason for clarification.