On 11/19/2017 03:26 PM, Martin Sebor wrote:
>>> I have seen it in the early IL but this late I couldn't come
>>> up with a test case where such a loop would be necessary.
>>> The COMPONENT_REF always refers to the member array. If you
>>> can show me an example to test with I'll add the handling if
>>> possible. There are cases where it isn't, such as in
>>>
>>> struct A { char a[4] __attribute__ ((nonstring)); } *pa;
>>>
>>> strlen (pa->a + 1);
>>>
>>> where pa->a is represented as a MEM_REF (char[4], pa, 1) with
>>> the member information having been lost in translation. (This
>>> is the same problem that I had solved for the -Warray-bounds
>>> warning for out-of bounds offsets by implementing it in
>>> tree-ssa-forwprop.c: because that's where the member is folded
>>> into a reference to the base object.)
>> Set up a nested structure then reference it like a.b.c.d.
>
> I did that. From my reply to Jakub:
>
> https://gcc.gnu.org/ml/gcc-patches/2017-11/msg01671.html
>
> with
>
> struct A { char a[4], b[4] __attribute__ ((nonstring)); };
> struct B { struct A a; };
> struct C { struct B b; };
>
> void f (struct C *p)
> {
> __builtin_strcpy (p->b.a.a, p->b.a.b);
> }
>
> in get_attr_nonstring_decl() where EXPR is p->a.b.b it is
> a COMPONENT_REF (COMPONENT_REF (..,), FIELD_DECL (b)). I.e.,
> the outermost FIELD_DECL is the one of interest.
>
> The code extracts TREE_OPERAND (decl, 1) from this outermost
> COMPONENT_REF, which is FIELD_DECL (b).
>
> What test case gives a structure where it's necessary to loop
> over the components to get at the field? I can't think of one.
Bah. It's so damn easy to forget that the outermost COMPONENT_REF
refers to the last component in the expression.
Can you incorporate the lazy initialization from Jakub and commit?
Jeff