Right now in master, <type_traits> contains the implementation of swap(T&, T&), a forward-declaration of swap(T(&)[N], T(&)[N]), and the implementation of iter_swap in terms of ADL swap. Then, <utility> (which includes <type_traits>) contains the implementation of swap(T(&)[N], T(&)[N]) in terms of std::swap_ranges, plus the implementation of swap_ranges.
This means that when the user's program does #include <type_traits>, they get a declaration but no definition for swap(T(&)[N], T(&)[N]) — not technically wrong, not a bug, but mildly surprising. Also, this seems to mean that changing the enable_if business on swap(T(&)[N], T(&)[N]) would count as an ABI break (if only for user programs that fail to include-what-they-use and thus technically are non-conforming IIUC).
Most importantly, it means that when I want to modify swap (say, to add another overload specifically for trivially relocatable types), there are two headers to modify instead of just one. :)
After this patch, <type_traits> contains the implementation of swap(T&, T&); the implementation of swap(T(&)[N], T(&)[N]) in terms of std::swap_ranges; the implementation of swap_ranges; and the implementation of iter_swap in terms of ADL swap. It's a one-stop swap shop! Then <utility> simply includes <type_traits>, as before.
I don't intend this patch to have any observable effect for users.
I would just say:
and leave it at that.