Everywhere else uninit is an opt-out from ZII and the bytes are whatever they were: a garbage f64 is a garbage number. A union is the one type where that is qualitatively worse. Its tag steers control flow, a tag no case names falls past every comparison in a match, and the block after those comparisons is unreachable -- which LLVM is entitled to assume cannot happen. So the one place where garbage becomes "the optimiser may do anything" is refused by name, with the zeroed form, which is a real case, named beside it. (.x u) on a union said "Shape is not a struct, so it has no fields", which is true and unhelpful. A union's fields belong to a case and which case is being held is what the tag says, so they are reached by match, whose arms bind the fields of the case they matched. The message says that.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%