https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79775
--- Comment #3 from felix <felix.von.s at posteo dot de> ---
A particularly amusing variant of this bug occurs with the following code:
struct x { struct x **xx; };
int y = __builtin_offsetof(struct x, xx->xx);
which gives the warning
$ gcc xx.c
xx.c:3:40: error: ‘*0->xx’ is a pointer; did you mean to use ‘->’?
int y = __builtin_offsetof(struct x, xx->xx);
^~
->
mentioning `*0`, which doesn't appear in the source code at all. Similarly for
C++:
$ g++ xx.c
xx.c:3:42: error: request for member ‘xx’ in ‘*((x*)0)->x::xx’, which is of
pointer type ‘x*’ (maybe you meant to use ‘->’ ?)
int y = __builtin_offsetof(struct x, xx->xx);
^~
Compare The Other Compiler, which refuses to parse `->` inside
`__builtin_offsetof` altogether:
$ clang xx.c
xx.c:3:40: error: expected ')'
int y = __builtin_offsetof(struct x, xx->xx);
^
xx.c:3:27: note: to match this '('
int y = __builtin_offsetof(struct x, xx->xx);
^
1 error generated.
I assume GCC parses it in order to have a more user-friendly ‘cannot apply
‘offsetof’ to a non constant address’ error, but I'm not sure if this is worth
it.