This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: subreg question
On Thu, 2001-12-13 at 12:43, Daniel Jacobowitz wrote:
> On Thu, Dec 13, 2001 at 12:39:03PM -0800, Dale Johannesen wrote:
> >
> > On Thursday, December 13, 2001, at 12:28 PM, Daniel Jacobowitz wrote:
> >
> > >On Thu, Dec 13, 2001 at 12:21:33PM -0800, Dale Johannesen wrote:
> > >>
> > >>On Thursday, December 13, 2001, at 10:16 AM, Aldy Hernandez wrote:
> > >>
> > >>>>>>>>"Dale" == Dale Johannesen <dalej@apple.com> writes:
> > >>>
> > >>>>What cases of subreg are supposed to be handled exactly?
> > >>>>double x(float y) {
> > >>>> double z;
> > >>>> *((float *)&z) = y; <-- boo!
> > >>>> return z; }
> > >>>
> > >>>i believe this is invalid code, hence implementation dependent. You
> > >>>can't access an lvalue as a different type as it was declared.
> > >>
> > >>I don't see why not. (C89) 3.3.4 says the cast might produce an invalid
> > >>pointer if it's not aligned properly, which is not the case here.
> > >>Other than that I don't find any relevant restriction in the standard.
> > >>What did you have in mind?
> > >>(FWIW, gcc doesn't warn about this even with -pedantic.)
> > >
> > >It's not an invalid pointer. It doesn't alias with Z, though.
> >
> > Why not?
>
> The C standard's aliasing rules. *((float *)&z) is an object of type
> float; double is a different type than float; z is an object of type
> double; *((float *)&z) and z can not alias.
agreed. be that as it may dale, if the compiler is crashing, it's a
bug, so it needs to be fixed :)
aldy