Add deleted volatile copy-assignment operator in the most derived atomic to fix the Bug 41784.
The root cause: there is an operator=(T) volatile that has better match than the deleted copy-assignment operator of the base class when this is volatile. The compiler sees that right operand of the assignment operator can be converted to T and chooses that path without taking into account the deleted copy-assignment operator of the base class.
The current behavior on libstdc++ is different from what we have in libc++. On the same test compilation fails with libstdc++. Proof: https://godbolt.org/z/nebPYd (everything is the same except the -stdlib option).
I choose the way with explicit definition of copy-assignment for atomic in the most derived class. But probably we can fix that by moving operator=(T) overloads to the base class from both specializations. At first glance, it shouldn't break anything.
Do we have the exact same issue with copy-construction? The following works, but I don't think it should: