https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86259
Davin McCall <davmac at davmac dot org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |davmac at davmac dot org
--- Comment #19 from Davin McCall <davmac at davmac dot org> ---
(In reply to [email protected] from comment #16)
> On Mon, 25 Jun 2018, glisse at gcc dot gnu.org wrote:
>
> As a general comment I find it disturbing that the user
> is required to write (char *)&s2 + offsetof(S, a) instead
> of plain &s2.a
Even worse, the proposal doesn't mention the provenance of "offsetof" at all.
If the result of offsetof has no provenance even the long form won't work. That
seems like a big oversight to me. Also, code doing something like the following
can't be terribly uncommon:
type struct { int a; int b; } s;
s s_o;
// start with address of contained member:
char *b_cp = &s_o.b;
// subtract its offset:
char *s_o_cp = b_cp - offsetof(s,b);
s * s_o_p = (s *) s_o_cp;
// access the containing object:
s s2 = *s_o_p;
It would only work generally if an offsetof result is given wildcard
provenance.