[Bug c/63645] Incorrect code generation
joseph at codesourcery dot com
gcc-bugzilla@gcc.gnu.org
Mon Oct 27 18:46:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645
--- Comment #24 from joseph at codesourcery dot com <joseph at codesourcery dot com> ---
On Mon, 27 Oct 2014, terra at gnome dot org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645
>
> --- Comment #22 from M Welinder <terra at gnome dot org> ---
> >Given
> >
> > GnmExprBinary res;
> > GnmExpr const *expr = (GnmExpr *)&res;
> >
> >the C standard does not define where the result of the conversion points;
>
> How do you read C99's Section 6.5 #7, then?
It only applies if you have validly obtained lvalues of different types
referring to overlapping objects.
Sometimes pointer conversions will obtain those; sometimes they won't.
The C model of pointer conversions is *not* "pointers point to a
particular byte address, and conversions just change the type but not the
byte address". It's much more restricted that that. Unless there are
particular statements in the C standard that say what the resulting
pointer points to (e.g. the statements about conversion from a pointer to
a structure to a pointer to its first member, and back, *when you have a
structure object in the first place*, or about conversions to pointers to
character type), the result is not specified.
But if you have a union between float and int, take a pointer to the first
member, and cast that pointer to type float *, there is no guarantee that
the result is a pointer to the float member, absent a specific statement
that defines the result of such a conversion (whereas if you cast
indirectly, first to a pointer to the union then to float *, you would get
a pointer to the float member). And even when you have pointers to the
two members of the union, you are still restricted in using them together
(see DR#236) - that is the point at which 6.5#7 comes in. But a simple
cast from int * to float * doesn't even get that far - the value of the
result is unspecified beyond what you get on converting it back to int *.
More information about the Gcc-bugs
mailing list