This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: A question about TYPE_ARG_TYPES
Kazu Hirata wrote:
> Hi Ian,
>
>>> I keep finding places in GCC sources that check whether a member of
>>> TYPE_ARG_TYPES is 0. For example,
>>>
>>> for (link = TYPE_ARG_TYPES (function_or_method_type);
>>> link && TREE_VALUE (link);
>>> link = TREE_CHAIN (link))
>>> gen_type_die (TREE_VALUE (link), context_die);
>>>
>>> Notice that TREE_VALUE (link) is part of the loop condition.
>>>
>>> Now, do we ever allow a NULL in TYPE_ARG_TYPES? If so, what does that
>>> mean? My guess is that soneone was trying to be cautious about
>>> encountering a NULL in TYPE_ARG_TYPES. (If that's the case, we should
>>> be using gcc_assert instead.)
>>
>>
>> Just guessing here, but what happens with an old-style function
>> definition in C?
>>
>> void f();
>
> AFAIK, that gets TYPE_ARG_TYPES (...) == NULL, so we don't even get to
> evaluate TREE_VALUE (TYPE_ARG_TYPES (...)).
>
> On IRC, Daniel Berlin claims that there are some weird cases where
> TREE_VALUE (TYPE_ARG_TYPES (...)) is NULL. I'll keep putting gcc_assert
> to see what happens.
That may be the difference between "void f()" (where TYPE_ARG_TYPES
might be NULL) and "void f(...)" (where TREE_VALUE (TYPE_ARG_TYPES)
would be NULL). The latter, as Daniel says, is not valid C, but perhaps
we used to accept it.
--
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713