https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645

--- Comment #19 from joseph at codesourcery dot com <joseph at codesourcery dot 
com> ---
Given

  GnmExprBinary res;
  GnmExpr const *expr = (GnmExpr *)&res;

the C standard does not define where the result of the conversion points; 
all that's defined is that if converted directly back to GnmExprBinary * 
(not via some sequence of intermediate types) it compares equal to the 
original pointer, if the original pointer was sufficiently aligned for 
GnmExpr * (and it is likely the latter type has stricter alignment 
requirements than GnmExprBinary *).

The effect is that the pointer resulting from the conversion cannot be 
dereferenced, only compared and converted back.

It is these limits on what pointer conversions are defined, together with 
the direct rules on what types of lvalues may access an object, that 
restrict aliasing in C.

Reply via email to