Hello.

I've been watching the sources of aliasing in gcc and found one
comment, that seemed to me a bit strange. In file `gcc/alias.c' in
function `get_alias_set':

>   /* From the former common C and C++ langhook implementation:
>
>      Unfortunately, there is no canonical form of a pointer type.
>      In particular, if we have `typedef int I', then `int *', and
>      `I *' are different types.  So, we have to pick a canonical
>      representative.  We do this below.
>
>      Technically, this approach is actually more conservative that
>      it needs to be.  In particular, `const int *' and `int *'
>      should be in different alias sets, according to the C and C++
>      standard, since their types are not the same, and so,
>      technically, an `int **' and `const int **' cannot point at
>      the same thing.

Please, can you explain the following:

According to the standard

> A typedef declaration does not introduce a new type, only a synonym for the 
> type so specified.

So, as I understand in this case `I *' and `int *' should be equal types?


Also, according to the issue 6.5 (7), we cat access to an object value
with expression that has

> a qualified version of a type compatible with the effective type of the object

So, `const int *' can legally point to the `int *' but not in reverse
order, and that's why `const int *' and `int *' should be in different
alias sets?


Alex.

Reply via email to