[email protected] (Ian Lance Taylor) wrote on 21.01.06 in <[EMAIL PROTECTED]>:
> "Dave Korn" <[EMAIL PROTECTED]> writes:
>
> > I think he's saying that _this_ one might generate invalid code:
> >
> > void test(void)
> > {
> > union { int i; double d; } u;
> > int *ip;
> > double *dp;
> > int ii;
> > double dd;
> >
> > dp = &u.d;
> > ip = &u.i;
> > *ip = 15;
> > ii = *ip;
> > *dp = 1.5;
> > dd = *dp;
> > printf("ii=%d dd=%f\n", ii, dd);
> > }
>
> That function is valid too.
>
> Here is an example of an invalid function:
>
> void test(void)
> {
> union { int i; double d; } u;
> int *ip;
> double *dp;
> int ii;
> double dd;
>
> dp = &u.d;
> ip = &u.i;
> *ip = 15;
> *dp = 1.5;
> ii = *ip;
> dd = *dp;
> printf("ii=%d dd=%f\n", ii, dd);
> }
And of course(?), stack slot sharing is supposed to be like the first two
examples, not the last.
Hmm. I think I begin to see what this is about. RTL AA (if I got this
right) gets confused when two vars at the same address *can't* be
distinguished by type, so that would be
void test(void)
{
union { int i1; int i2; } u;
int *ip1;
int *ip2;
int ii1;
int ii2;
ip1 = &u.i1;
ip2 = &u.i2;
*ip1 = 15;
ii1 = *ip1;
*ip2 = 17;
ii2 = *ip2;
printf("ii1=%d ii2=%d\n", ii1, ii2);
}
Hmm. I don't know if ISO allows *that* ... though I can see how it might
arise naturally.
MfG Kai