[Issue 11647] New: Different D sequence point rules
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Nov 30 04:11:21 PST 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11647
Summary: Different D sequence point rules
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: bearophile_hugs at eml.cc
--- Comment #0 from bearophile_hugs at eml.cc 2013-11-30 04:11:14 PST ---
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
--
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list