[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