Symbolic diff uses pointer comparision and diff rules. So when you for example build a coefficientfunction cf = x*x then cf.Diff(x) = (Product rule) x*x.Diff(x) + x.Diff(x) * x = (Pointer comparison) x*1 + 1*x.
The gridfunction doesn't "know" anything about the cf x.
You can build the derivative you want by using the chain rule, for example:
Code:
func = sin(gf)
dfunc = func.Diff(gf) * grad(gf)
Best