Order of evaluation - aka hidden undefined behaviours.
Iain Buclaw
ibuclaw at ubuntu.com
Wed Sep 26 04:45:50 PDT 2012
On Wednesday, 26 September 2012 at 08:12:16 UTC, Walter Bright
wrote:
> On 9/26/2012 12:36 AM, Iain Buclaw wrote:
>> On Tuesday, 25 September 2012 at 23:39:39 UTC, Walter Bright
>> wrote:
>>> On 9/25/2012 3:58 PM, Iain Buclaw wrote:
>>>> The problem here is that the array operation A[] = B[] + C[]
>>>> gets transformed
>>>> into an extern(C) call. And because there's no strict rules
>>>> in place over the
>>>> order of which it's parameters are evaluated, it could go
>>>> either way (LTR, or
>>>> RTL).
>>>>
>>>> Serious note: This test is bogus as this and similar other
>>>> failing tests on
>>>> non-x86 platforms are not at all obvious to the users who
>>>> get issues. So what
>>>> are we to do about it?
>>>
>>> D needs to move towards a defined order of evaluation. I
>>> understand that
>>> there's a problem when using parts of a C compiler that feels
>>> free to reorder
>>> within the C rules. It's something we have to deal with
>>> sooner or later, by
>>> either:
>>>
>>> 1. adjusting the C optimizer so it follows D rules for D code
>>>
>>> 2. assigning terms to temporaries that are executed in a
>>> specific order by C
>>> rules
>>
>>
>> Indeed, but where does that leave code that gets compiled down
>> to a extern(C) call?
>
> C functions all seem to evaluate their args right-to-left, even
> though the C Standard doesn't specify that. So we should be all
> right by simply defining that D do it that way for C functions.
>
> It doesn't actually matter what order D does things, we just
> have to pick one. And so we might as well pick one that C
> compilers naturally do anyway.
>
Speaking as a generalisation, no that is not true. C functions
for x86/x86_64 all seem to evaluate their args right-to-left.
However - and this may be different from compiler to compiler -
GCC at least does left-to-right evaluation for everything else
(ARM, SPARC, etc) because that is the order that arguments are
pushed onto the stack for those architecture backends.
If right-to-left should be the strict standard to follow for
extern(C), then document this behaviour as part of the
specification, and I'll implement it. :~)
Regards
Iain
More information about the Digitalmars-d
mailing list