http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60689
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- when the object is bigger than the wordsize the generic __atomic_exchange gets expanded incorrectly $ g++11 aa.cc -DN=4 -m32 $ g++11 aa.cc -DN=5 -m32 aa.cc: In function ‘int main()’: aa.cc:10:49: error: invalid conversion from ‘S*’ to ‘unsigned int’ [-fpermissive] __atomic_exchange(&a, &b, &c, __ATOMIC_SEQ_CST); ^ aa.cc:10:49: error: invalid conversion from ‘int’ to ‘void*’ [-fpermissive] aa.cc:10:49: error: too few arguments to function ‘void __atomic_exchange(unsigned int, volatile void*, void*, void*, int)’ <built-in>: note: declared here