Query about the TREE_TYPE field
Andrew MacLeod
amacleod@redhat.com
Tue Nov 18 15:58:00 GMT 2014
On 11/18/2014 09:40 AM, Jason Merrill wrote:
> On 11/18/2014 09:26 AM, Andrew MacLeod wrote:
>> I was poking around attribs.c while trial running my tree-type-safety
>> stuff, and it triggered something in decl_attributes() that seems fishy
>> to me. It looks like it was part of the fix for
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=35315
>>
>> decl_attributes() can be passed a tree node which is either decl or a
>> type, but we get to this little snippet:
>>
>> if (spec->type_required && DECL_P (*anode))
>> {
>> anode = &TREE_TYPE (*anode);
>> /* Allow ATTR_FLAG_TYPE_IN_PLACE for the type's naming
>> decl. */
>> if (!(TREE_CODE (*anode) == TYPE_DECL
>> && *anode == TYPE_NAME (TYPE_MAIN_VARIANT
>> (TREE_TYPE (*anode)))))
>> flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
>> }
>>
>> anode is changed to point to the TREE_TYPE of the original decl, and
>> *then* checks if it is a TYPE_DECL... That doesnt seem right to me..
>> we can't have a TYPE_DECL as a TREE_TYPE can we?
>
> No.
>
>> is that code suppose to be checking is the original DECL is a TYPE_DECL
>> rather than the TREE_TYPE?
>
> I think so.
>
>> Maybe the assignment to anode should be after the if instead of in front
>> of it?
>
> Probably.
>
> Strange that the 35315 patch fixed the testcase with that change being
> a placebo...
>
> Jason
>
Indeed. The condition is negated, so effectively it becomes an
always true condition and the ATTR_FLAG_TYPE_IN_PLACE is always turned
off when a DECL is passed and a type is required..
maybe that works most/all of the time? huh, that also means the code
is the same as it was before the patch :-P
maybe one of the follow up patches in bugzilla supercede it?
Andrew
More information about the Gcc
mailing list