[GDC] Evaluation order: Please update the dmd backend

Sarath Kodali sarath at dummy.com
Wed Apr 2 07:30:53 PDT 2014


On Wednesday, 2 April 2014 at 08:50:17 UTC, Johannes Pfau wrote:
> 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

Once the evaluation order of an operator is defined, it should be 
consistent in all the cases. Otherwise it will be very confusing 
to the programmer.

- Sarath


More information about the Digitalmars-d mailing list