It's well-known that the language $A_{TM} = \{\langle M,w\rangle: \text{M is a turing machine that accepts w} \}$ is undecidable.
There's a standard proof that's presented in Sipser's "Introduction to the theory of Computation" (and in a number of other online sources I've checked). It's often claimed that the proof uses Cantor's diagonalisation method. I'm not sure I agree, and I was wondering if I've missed something.
The standard proof proceeds as follows. Assume there's a Turing Machine $T$ that decides $A_{TM}$. If $\langle M \rangle$ is an encoding of some turing machine $M$, we can make a second machine $D$ that rejects $\langle M \rangle$ iff $M$ accepts $\langle M \rangle$ and vice versa. $D$ runs by applying $T$ to $\langle M, \langle M \rangle \rangle$ and negating the output. We then observe that $D$ accepts $\langle M \rangle$ iff $M$ rejects $\langle M \rangle$, and in particular $D$ accepts $\langle D \rangle$ iff $D$ rejects $\langle D \rangle$, a contradiction.
It seems to me that this self-referential argument avoids the need to use diagonalisation. The diagonalisation argument should be something like this:
Let $\{M_1, M_2, ...\}$ be a enumeration of the set of Turing machines. Let $\{w_1, w_2, ... \}$ be an enumeration of all inputs. As above, let $T$ decide $A_{TM}$ and use $T$ to construct a machine $D$ that accepts $w_i$ iff $M_i$ rejects $w_i$. By construction, $D$ is not in our list since it disagrees with all other machines on at least one input. This contradicts the assertion that we had enumerated all Turing machines. Therefore $D$ cannot exist.
Note that we can use any sequence of words here: $w_i$ does not need to be a description of $M_i$, unlike in the self-referential proof. So it seems like we can prove non-existence of $D$ either using self-reference (first proof) or by showing it doesn't live in our enumeration of Turing machines (second proof, diagonalization). Is this correct, or have I made a mistake somewhere?