Actually, I think `op2` is a ufunc, right? So you could also pass it `casting='unsafe'` and instead of tmp as output argument, pass in `arr` as output argument. Then the ufunc machinery will do the casting for you. It might be a bit slower for small arrays, but should perform better for large ones. Just wondering if we want to avoid the unnecessary copy in most cases that `arr` is already the same type as `tmp`, something along the lines of the old `ret_int` might actually have some merit, since you could just use `arr` as `tmp` in most cases.