https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88897
--- Comment #3 from Rafael Avila de Espindola <rafael at espindo dot la> --- (In reply to Andrew Pinski from comment #2) > Some of the time, the uninitialized is due to using the object after the > lifetime of the object has gone out of scope. I have not checked if that is > the case here but I would not be suprised. Thanks! This may very well be the case. This reduces further to struct deleter { deleter(deleter &&x) {} deleter(deleter &) = default; }; struct temporary_buffer { temporary_buffer(temporary_buffer &) = default; char *_buffer = nullptr; deleter _deleter; }; void foo123(temporary_buffer); struct future_state { union any { any() {} temporary_buffer value; } _u; void forward_to() { foo123(_u.value); } }; void then3() { future_state _local_state; _local_state.forward_to(); } which has a real uninitialized use. I am looking again at the unreduced test case to see if that was the original issue. More context in the warning message would have been awesome! :-)