diff(abs(z), z) returns abs(1, z) and the latter, for a numeric z, is defined only for a nonzero real z.
However, functions such as abs(I+sin(t)) are (real) differentiable for a real t and diff should work. It usually does, but not always.
f:= t -> abs(GAMMA(2*t+I)): # We want D(f)(1)
evalf(%); # Error, (in simpl/abs) abs is not differentiable at non-real arguments
evalf(%); # 0.3808979508 + 1.161104935*I, wrong
The same wrong results are obtained with diff instead of D
diff(f(t),t): # or diff(f(t),t) assuming t::real;
simplify(%); evalf(%); # wrong, should be real
To obtain the correct result, we could use the definition of the derivative:
limit((f(t)-f(1))/(t-1), t=1); evalf(%); # OK
fdiff(f(t), t=1); # numeric, OK
Note that abs(1, GAMMA(2 + I)); returns 1; this is also wrong, it should produce an error because GAMMA(2+I) is not real;
Let's redefine now `diff/abs` and redo the computations.
`diff/abs` := proc(u, z) # implements d/dx |f(x+i*y|) when f is analytic and f(...)<>0
1/abs(u)*( Re(u)*Re(u1) + Im(u)*Im(u1) )
f:= t -> abs(GAMMA(2*t+I));
D(f)(1); evalf(%); # OK now
Now diff works too.
simplify(%); evalf(%); # it works
This is a probably a very old bug which may make diff(u,x) fail for expressions having subespressions abs(...) depending on x.
However it works using assuming x::real, but only if evalc simplifies u.
The problem is actually more serious because diff/ for Re, Im, conjugate should be revized too. Plus some other related things.