On Fri, Nov 20, 2020 at 02:30:43PM -0700, Martin Sebor wrote: > VLA parameter bounds can involve any other expressions, including > function calls. It's those rather than other parameters that also > trigger the problem (at least in the test cases I've seen). > > When/how would the unsharing cause the expression to be evaluated > multiple times? And if/when it did, would simply wrapping the whole > expression in a SAVE_EXPR be the right way to avoid it or would it > need to be more involved than that?
Well, unshare_expr just doesn't unshare SAVE_EXPRs, it only ensures that the trees inside of them aren't shared with something else (aka unshares the subtrees the first time it sees the SAVE_EXPR), but doesn't unshare the SAVE_EXPR node itself and doesn't walk children the second and following time. So, the question is whether you are creating the attributes before the SAVE_EXPRs are added to the bounds or after it, and whether when evaluating the (unshared) expressions in there you always place it after something initialized those SAVE_EXPRs first. The SAVE_EXPRs are essential, so that the functions aren't called multiple times. Jakub