On Fri, 26 Apr 2007, Geoffrey Keating wrote:
> This seems reasonable to me, but maybe it would be simpler to write
>
> If there are one or more incomplete structure or union types which
> cannot all be completed without producing undefined behaviour, the
> behaviour is undefined.
>
> if that gives the same effect (which I think it does)?
That suffers somewhat from the vagueness that afflicts this area (what
rearrangements of translation units are permitted in completing the
types?). I considered some other examples and decided that what I wanted
was unifiability even in some cases that don't involve incomplete types.
For example:
// TU 1
void
f (void)
{
struct s { int a; };
extern struct s a, b;
}
void
g (void)
{
struct s { int a; };
extern struct s c, d;
}
// TU 2
void
h (void)
{
struct s { int a; };
extern struct s a, c;
}
void
i (void)
{
struct s { int a; };
extern struct s b, d;
}
Here, each object individually has compatible types in the two translation
units - but "a" and "b" have compatible complete types within TU 1, but
incompatible complete types withing TU 2.
I didn't feel it should be necessary to unify two incompatible types from
the same translation unit (even if they'd be compatible in different
translation units), nor to split the uses of a single type within a
translation unit into two or more distinct and incompatible types.
--
Joseph S. Myers
[EMAIL PROTECTED]