http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57926
--- Comment #4 from Andrew Macleod <amacleod at redhat dot com> --- Short answer.. I'm not a sure, but it appears to be a g++ thing. I looks like g++ is using ARRAY_TYPE instead of POINTER_TYPE. the 4.8 branch does the same thing, but it does seem odd to me. That means anywhere in the compiler that uses POINTER_TYPE_P() is not going to trigger true for an array in c++... Going back to gcc 4.6 which only had __sync operations, the same issue exists: <x220:/home/compilers/gcc-4_6-branch/build/gcc>cat t.cpp long int Mutex[1]; int AcquireLogMutex(void) { return(__sync_fetch_and_add(Mutex, 1)); } int main() {} <x220:/home/compilers/gcc-4_6-branch/build/gcc>./cc1plus t.cpp int AcquireLogMutex() t.cpp:5:38: error: incompatible type for argument 1 of ‘__sync_fetch_and_add’ Im stunned this has never been tripped over. I can fix it in the atomic code, but I don't know what that means to other languages since I've never paid attention to the detailed meaning of ARRAY_TYPE vs POINTER_TYPE. Just allowing the ARRAY_TYPE objects to pass the existing atomic tests of POINTER_TYPE_P or POINTER_TYPE appears to generate all the correct code and errors for atomics, so I guess thats is the way to go...? there are only a couple of places the check is made.