The specification says: The expression: a op= b is rewritten as: a.opOpAssign!("op")(b) A similar statement is made about opIndexOpAssign. However, what actually happens is that the template parameter is set to "op=", as this program shows: struct S { void opIndexOpAssign(string op)(int x, int i) { pragma (msg, op); } void opOpAssign(string op)(int x) { pragma(msg, op); } } void main() { S s; s[1] += 2; s += 3; } This prints the following on compilation: += +=
The documentation has been fixed for opOpAssign, but not for opIndexOpAssign or opSliceOpAssign.
Downgrading importance since, apparently, the spec is wrong and not the compiler.
The spec was right all along, and the compiler was fixed with DMD 2.047.