For example, int *= double fails if the type of its result is inferred (auto, typeof etc.):
----------
void main()
{
int var;
auto res = (var *= 1.5); // (4)
}
----------
% dmd -o- -c test.d
test.d(4): Error: cast(double)var is not an lvalue
test.d(4): Error: cannot implicitly convert expression (cast(double)var *= 1.5) of type double to int
----------
The same error occurs with addition +=, subtraction -= and division /=.
Besides, modulus %= works fine:
----------
void main()
{
int var;
auto res = (var %= 1.5); // okay
}
----------