Alberto Lozano Alelu <ale...@gmail.com> a écrit:

> When I get a typedef, I would like to show the definition. I use:
>
> tree v_next_type=DECL_ORIGINAL_TYPE(TYPE_NAME(v_type));
>
> But this expression isn't always correct.

You are correct.  There are times where typedefs are thrown away
(stripped) and only the underlying type is kept.

To my knowledge, this is done when in a template instantiation the
argument is a typedef.  For instance:

    template<class T>
    struct S {
      T p; //#1
    };
    typedef int tint0;
    typedef int tint1;

    S<tint0> s0; //#2
    S<tint1> s1; //#3

At #2, tint0 is stripped (and thus becomes int) when we build the
instantiation S<tint0>.  So what is built is really S<int>.  Then when
we are to build S<tint1> at #3, we strip tint1 to get int, and so we
don't build a new S<int> type, we just re-use the one we already have.

So for the instantiation S<tint0>, when you look at type type of p at
#1, you get int.  Not tint0.

I believe this is done to save resources.  It's more efficient to have
just one S<int> in the system, rather than having S<tint0>, S<tint1>
and S<int>.

Unfortunately, there is no easy way around this at the moment.

Otherwise, outside of the context of template arguments, I think we
pretty much keep typedefs around.

-- 
                Dodji

Reply via email to