It's not just data races, it's things like iterator invalidation, non-overlapping memcpy
, and alias-based optimizations more generally.
See also this recent topic for some conversation on how being single threaded isn't enough, even if there was an interest in creating a single-threaded Rust dialect (which there generally isn't).