Andrew Haley wrote:
> Yuri Pudgorodsky writes:
>  > 
>  > > We can say something like:
>  > >
>  > > "In GNU C, you may cast a function pointer of one type to a function
>  > > pointer of another type.  If you use a function pointer to call a
>  > > function, and the dynamic type of the function pointed to by the
>  > > function pointer is not the same as indicated by the static type of the
>  > > function pointer, then the results of the call are unspecified.  In
>  > > general, if the types are not too different 
> 
> s/not too different/compatible/
> 
> "not too different" has no meaning, whereas "compatible" is defined in
> Section 6.2.7.

But, at least in C++, the official meaning of compatible is not the
meaning we want.  For example, "int *" and "long *" are not compatible
-- but, in this context, we want to say that this will work.

> We need to do this because we use type-based alias analysis in gcc.

Yes, I remember adding that feature. :-) :-)

> If we permit incompatible
> types to be casted in function calls, we make a hole in alias
> analysis.

Yes, users who lie will lose.  The only thing we're trying to do here is
behave a bit more gracefully.  Introducing a call to __builtin_trap is
pretty brutal; instead, we want to say "we can't promise this is going
to work, but if you want to try, go ahead..."

-- 
Mark Mitchell
CodeSourcery
[EMAIL PROTECTED]
(650) 331-3385 x713

Reply via email to