Well, it doesn't. At least, not in general. It reports the location based on where the panic starts, not at an arbitrary depth above that. If you want to see more than the immediate parent of the panic, you can run your program with RUST_BACKTRACE=1 in the environment variables, and check the call stack.
If you want the c function specifically to be skipped when reporting panic location, you need to change the code a bit.
#[track_caller] causes the tagged function to be ignored when determining "where" a panic started. Note that this doesn't work on closures (at least, not yet), so c has to be a named function.