[GDC] Evaluation order: Please update the dmd backend
Johannes Pfau
nospam at example.com
Wed Apr 2 01:48:33 PDT 2014
Am Wed, 02 Apr 2014 07:47:23 +0000
schrieb "Sarath Kodali" <sarath at dummy.com>:
> On Tuesday, 1 April 2014 at 22:04:43 UTC, Timon Gehr wrote:
> > On 04/01/2014 08:40 PM, Sarath Kodali wrote:
> >> ...
> >>
> >> The evaluation order of assign operators should not be LTR as
> >> they have
> >> right associativity. In "a = b = c", c has to be evaluated
> >> first, then b
> >> and then a. Similarly, in "a = b + c", "b+c" has to be
> >> evaluated first
> >> before a is evaluated. Otherwise it will be very confusing,
> >> that in some
> >> cases it is LTR and in some it is RTL.
> >
> > Note that this is after a paragraph that suggests to make
> > evaluation in some cases LTR and in some RTL.
> >
>
> There are 2 evaluation orders that need to be considered while
> evaluating expressions - the evaluation order of operators and
> the the evaluation order of operands of an operator. The
> evaluation order of operators is well defined and is done
> according to its precedence and associativity. However the
> evaluation order of operands for some of the binary operators is
> not defined. D left it undefined for assign operator. So in
> "a=b", the compiler can choose to evaluate a first and then b.
> However in "a=b=c", "b=c" has to be evaluated first due to right
> associativity of '=' operator. Similarly in "a=b+c", "b+c" has to
> be evaluated first due to higher precedence of + operator over =
> operator. In both these cases, the right operand of = operator
> is evaluated first and then the left operand. So it naturally
> follows that even in the unspecified case (a=b), the right
> operand should be evaluated first so that it is consistent with
> other cases of = operator. All this means, the evaluation order
> of operands also should be according to the associativity of its
> operator. You can test this with other right or left associative
> binary operators.
In a=b=c you have to do assignment b=c first, then assign a=b. But we're
talking about _side effects_ here, i.e. a() = b() = c(). And you can
evaluate the side effects in LTR order:
a() = b() = c();
==>
auto tmp1 = &a();
auto tmp2 = &b();
*tmp2 = c();
*tmp1 = *tmp2;
http://dpaste.dzfl.pl/19c118b7d368
More information about the Digitalmars-d
mailing list