Andrey Tarasevich
2024-12-27 22:28:03 UTC
Reply
Permalink#include <stdatomic.h>
#include <stdio.h>
int main()
{
int v[2], *_Atomic p = v;
atomic_fetch_add(&p, 1);
printf("%tu\n", (char *) p - (char *) v);
}
GCC prints 1 (https://godbolt.org/z/55Pjcnd3Y), while Clang prints 4
(https://godbolt.org/z/e4x6z85fe). Obviously, Clang performed the
"proper" pointer arithmetic, while GCC ignored the pointer type.
Which one is correct here?
7.17.7.5 says (https://port70.net/~nsz/c/c11/n1570.html#7.17.7.5)
1 The following operations perform arithmetic and bitwise
computations. All of these operations are applicable to an object of anyatomic integer type. None of these operations is applicable to atomic_bool.
Is this wording intended to restrict these operations to integer types only?
But later 7.17.7.5 also says
3 For address types, the result may be an undefined address, but the
operations otherwise have no undefined behavior.However, I was unable to find any mention of "address types" anywhere
else in the standard. This is the only spot in the entire document
mentioning "address types". What types are "address types"?
--
Best regards,
Andrey
Best regards,
Andrey