D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 11647 - Different D sequence point rules
Summary: Different D sequence point rules
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P4 enhancement
Assignee: No Owner
URL:
Keywords: spec
Depends on:
Blocks:
 
Reported: 2013-11-30 04:11 UTC by bearophile_hugs
Modified: 2024-12-13 18:14 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2013-11-30 04:11:14 UTC
Wrong C code:


#include <stdio.h>
int main(){
    int i = 0;
    int a[] = {10,20,30};
    int r = 1 * a[i++] + 2 * a[i++] + 3 * a[i++];
    printf("%d\n", r); 
    return 0;
}


Clang gives on that code:

warning: multiple unsequenced modifications to 'i' [-Wunsequenced]


GCC 4.8.0 gives on that code:
test.c: In function 'main':
test.c:5:46: warning: operation on 'i' may be undefined [-Wsequence-point]
     int r = 1 * a[i++] + 2 * a[i++] + 3 * a[i++];
                                              ^
test.c:5:46: warning: operation on 'i' may be undefined [-Wsequence-point]


This similar D code compiles and prints "140":

void main() {
    import std.stdio;
    int i = 0;
    auto a = [10, 20, 30];
    int r = 1 * a[i++] + 2 * a[i++] + 3 * a[i++];
    r.writeln;
}


I suggest to statically forbid such D code, or to make it defined and deterministic on all D compilers. (From my coding experience, I find that kind of code often confusing for the programmer too, I refactor away that kind of code, so probably I'd like it to be forbidden).


More info:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n925.htm
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n926.htm
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n927.htm
Comment 1 dlangBugzillaToGithub 2024-12-13 18:14:45 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/dmd/issues/18729

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB