I recently was adding a compilation error to compilation-error-regexp-alist, and needed to use a custom function to determine the line number. By inspection I was able to see that all the primary fields (file, line, line-end, col, col-end) can take either a subexpression number (for the regexp) or a function. However `line` is handled differently then all the rest. If you define a function for line, it ignores all your other fields and calls a legacy function handler in compilation-parse-errors. It looks like this is to support "old compile.el" from 2003. I see a lot of code marked obsolete since 24.1.
I was wondering what is your policy on removing obsolete content. I think it would be a much better for current users if "line" was handled like all the other fields instead of reverting the entire error to legacy mode in an undocumented way.