Bug 1123 – We can change Struct.init

Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
All
OS
All
Creation time
2007-04-11T11:06:00Z
Last change time
2012-01-29T19:32:41Z
Keywords
accepts-invalid
Assigned to
nobody
Creator
s180m

Comments

Comment #0 by s180m — 2007-04-11T11:06:06Z
struct Matrix { double e = 1.; Matrix scale(double r){e*=r;return *this;} const Matrix Identity = {10.}; } void main(){ for(int i;i<5;i++){ printf("%f\n",Matrix.Identity.scale(.9).e); } printf("\n"); for(int i;i<5;i++){ printf("%f\n",Matrix.init.scale(.9).e); } } ----------------- 9.000000 8.100000 7.290000 6.561000 5.904900 0.900000 0.810000 0.729000 0.656100 0.590490
Comment #1 by thomas-dloop — 2007-04-25T12:58:15Z
That is again a case where the compiler didn't put unchangeable content (Identitiy and init) readonly section but read-write section. On Linux "init" is in a readonly section and thus the second loop segfaults. It would be nice if the compiler enforced/checked read-write rights.
Comment #2 by yebblies — 2012-01-29T19:32:41Z
Currently both D1 and D2 (1.068 & 2.058) compilers print: 9.000000 9.000000 9.000000 9.000000 9.000000 0.900000 0.900000 0.900000 0.900000 0.900000 As .init creates a temporary this is correct.