This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Fri, Jul 8, 2016 at 9:42 AM, Jakub Jelinek <jakub@redhat.com> wrote: > On Thu, Jul 07, 2016 at 03:18:13PM -0400, Jason Merrill wrote: >> How about this? I also have a patch to handle assignment order >> entirely in the front end, but my impression has been that you wanted >> to make this change for other reasons as well. > > So what exactly is supposed to be the evaluation order for function calls > with lhs in C++17? > Reading > http://en.cppreference.com/w/cpp/language/eval_order > I'm confused. > struct S { S (); ~S (); ... }; > S s[1024]; > typedef S (*fn) (int, int); > fn a[1024]; > void foo (int *i, int *j, int *k, int *l) > { > s[i[0]++] = (a[j[0]++]) (k[0]++, l[0]++); > } > So, j[0]++ needs to happen first, then k[0]++ and l[0]++ (indeterminately > sequenced), but what about the function call vs. i[0]++? > > There is the rule that for E1 = E2 all side-effects of E2 happen before all > side-effects of E1. > > I mean, if the function return type is a gimple reg type, then I see no > problem in honoring that, the function call returns a temporary, then the > side-effects of the lhs are evaluated and then it is stored to that lvalue. > > But, if the return type is non-POD, then we need to pass the address of the > lhs as invisible reference to the function call, how can we do it if we > can't yet evaluate the side-effects of the lhs? > > Perhaps better testcase is: > > int bar (int); > void baz () > { > s[bar (0)] = (a[bar (1)]) (bar (2), 0); > } > > In which order all the 4 calls are made? > > What the patch you've posted does is that it gimplifies from_p first, > and gimplify_call_expr will first evaluate bar (1), then bar (2), > but then it is a CALL_EXPR; then it gimplifies the lhs, i.e. bar (0) > call, and finally the indirect call. As we discussed in IRC, to get the required semantics the front-end needs to prevent this gimplifier optimization, as in this patch. The second patch changes -fargs-in-order to -fstrong-eval-order and removes the ordering of function arguments. Tested x86_64-pc-linux-gnu, applying to trunk.
Attachment:
fe-gimplify-modify.diff
Description: Text document
Attachment:
strong-eval-order.diff
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |