Struct assignment, possible DMD bug?

Maxim Fomin maxim at maxim-fomin.ru
Sat Sep 29 09:26:06 PDT 2012


On Saturday, 29 September 2012 at 16:05:03 UTC, ixid wrote:
> This behaviour seems inconsistent and unintuitive:
>
> void main() {
> 	int[3] a = [1,2,3];
> 	a = [4, a[0], 6];
>
> 	struct S {
> 		int a, b, c;
> 	}
>
> 	S s = S(1,2,3);
> 	s = S(4, s.a, 6);
>
> 	assert(a == [4,1,6]);
> 	assert(s == S(4,4,6));
> }
>
> Setting the struct writes s.a before evaluating it while the 
> reverse is true of the array assignment. Using DMD 2.0.60. GDC 
> does what I'd expect and gives both as 4,1,6.

I think this is notorious "i = ++i + ++i".
Statement s = S(4, s.a, 6) writes to s object and simultaneously 
reads it.
http://dlang.org/expression.html states that assign expression is 
evaluated in implementation defined-manner and it is an error to 
depend on things like this.


More information about the Digitalmars-d-learn mailing list