Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 43 |
Nodes: | 6 (0 / 6) |
Uptime: | 94:23:04 |
Calls: | 290 |
Calls today: | 1 |
Files: | 904 |
Messages: | 76,378 |
The code
#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 any atomic 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"?
1 The following operations perform arithmetic and bitwisecomputations. All of these operations are applicable to an object of any
3 For address types, the result may be an undefined address, but theoperations otherwise have no undefined behavior.