[PATCH v3] clear VLA bounds in attribute access (PR 97172)
Martin Sebor
msebor@gmail.com
Thu Jan 28 21:01:08 GMT 2021
On 1/28/21 2:22 AM, Jakub Jelinek wrote:
> On Thu, Jan 28, 2021 at 09:31:46AM +0100, Richard Biener via Gcc-patches wrote:
>> + if (TREE_CODE (bound) == PLUS_EXPR
>> + && integer_all_onesp (TREE_OPERAND (bound, 1)))
>> + {
>> + bound = TREE_OPERAND (bound, 0);
>> + if (TREE_CODE (bound) == NOP_EXPR)
>> + bound = TREE_OPERAND (bound, 0);
>> + }
>>
>> so it either does or does not strip a -1 but has no indication on
>> whether it did that? That looks fragile and broken.
>
> Yeah. Plus again STRIP_NOPs in there should be used. But certainly it
> needs to remember whether there was + -1 or not and compensate for it.
>
>> The free-lang-data parts are OK.
>
> But is fld the right spot to do it?
> If it is only the FE that emits the warnings, shouldn't it be stripped
> already before gimplification so that it isn't actually corrupted?
>
> I mean in c_parse_final_cleanups or c_common_parse_file depending on
> if it is just C or C++ too?
I've been asking for a good place to do it since December and
free_lang_data was the only suggestion. I even mentioned it
to you this Tuesday. c_parse_final_cleanups looks like a better
place but I don't understand why you've waited until now to point
me to it.
>
> Plus, if the expressions in the attribute don't contain SAVE_EXPRs, why
> there isn't unshare_expr called on them (and if they do, I don't see how
> it would be guaranteed, can't one e.g. do
> int bar (void);
> void foo (int n, int a[n + 1][bar () + 2], int b[sizeof (a[0]) + 32])
> {
> }
> ?) the unsharing variant I've pasted into the PR.
I'm not sure what you're asking here or if you're just repeating
the same question we went over in November when I posted the first
patch to unshare the expressions. In that thread, after I explained
that the expressions in the attribute aren't evaluated, you ultimately
agreed it wasn't necessary:
https://gcc.gnu.org/pipermail/gcc-patches/2020-November/559953.html
The front end wraps each VLA bound that needs to be evaluated in
a SAVE_EXPR (and, as Joseph points out in the same thread, if
there are more of them, they're wrapped in a COMPOUND_EXPR). But
the attribute doesn't use these SAVE_EXPRs -- instead, it uses
the expressions before they're wrapped. This wasn't a choice I
made deliberately. I just didn't know about the COMPOUND_EXPR
wrapped bounds.
Martin
More information about the Gcc-patches
mailing list