Currently, when preprocessing Fortran files, gfortran calls cpp with the -P option, which prevents it to emit line number information. The reason for this is that, at the moment, the Fortran front end cannot process these directives. However, for debugging purposes it's paramount that this infomation is emitted by cpp and interpreted by the Fortran front end; without it, line numbers in debugging records will refer to the lines in the preprocessed source, not the original.
Confirmed.
I have a patch for this, ported from Andy's tree. Waiting for my copyright assignment.
Patch here: http://gcc.gnu.org/ml/fortran/2004-05/msg00106.html
Subject: Bug 13702 CVSROOT: /cvs/gcc Module name: gcc Changes by: tobi@gcc.gnu.org 2004-05-15 17:31:32 Modified files: gcc/fortran : ChangeLog error.c gfortran.h lang-specs.h match.c module.c parse.c scanner.c trans-decl.c trans-io.c trans.c Log message: PR fortran/13702 (Port from g95) * gfortran.h (gfc_linebuf): New typedef. (linebuf): Remove. (gfc_file): Revamped, use new gfc_linebuf. (locus): Revamped, use new types. (gfc_current_file): Remove. (gfc_current_form, gfc_source_file): New global variables. * match.c (gfc_match_space, gfc_match_strings): Use gfc_current_form to find source form. * module.c (gfc_dump_module): Use gfc_source_file when printing module header. * error.c (show_locus, show_loci) Use new data structures to print locus. * scanner.c (first_file, first_duplicated_file, gfc_current_file): Remove. (file_head, current_file, gfc_current_form, line_head, line_tail, gfc_current_locus1, gfc_source_file): New global variables. (gfc_scanner_init1): Set new global variables. (gfc_scanner_done1): Free new data structures. (gfc_current_locus): Return pointer to gfc_current_locus1. (gfc_set_locus): Set gfc_current_locus1. (gfc_at_eof): Set new variables. (gfc_at_bol, gfc_at_eol, gfc_advance_line, gfc_next_char): Adapt to new locus structure. (gfc_check_include): Remove. (skip_free_comments, skip_fixed_comments): Use gfc_current_locus1. (gfc_skip_comments): Use gfc_current_form, find locus with gfc_current_locus1. (gfc_next_char): Use gfc_current_form. (gfc_peek_char, gfc_gobble_whitespace): Use gfc_current_locus1. (load_line): Use gfc_current_form. Recognize ^Z as EOF. Fix comment formatting. (get_file): New function. (preprocessor_line, include_line): New functions. (load_file): Move down, rewrite to match new data structures. (gfc_new_file): Rewrite to match new data structures. * parse.c (next_statement): Remove code which is now useless. Use gfc_source_form and gfc_source_file where appropriate. * trans-decl.c (gfc_get_label_decl): adapt to new data structures when determining locus of frontend code. * trans-io.c (set_error_locus): Same. * trans.c (gfc_get_backend_locus, gfc_set_backend_locus): Likewise. * lang-specs.h (@f77-cpp-input, @f95-cpp-input): Remove '-P' from preprocessor flags. (all): Add missing initializers. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/ChangeLog.diff?cvsroot=gcc&r1=1.16&r2=1.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/error.c.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/gfortran.h.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/lang-specs.h.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/match.c.diff?cvsroot=gcc&r1=1.5&r2=1.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/module.c.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/parse.c.diff?cvsroot=gcc&r1=1.5&r2=1.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/scanner.c.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-decl.c.diff?cvsroot=gcc&r1=1.5&r2=1.6 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-io.c.diff?cvsroot=gcc&r1=1.4&r2=1.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans.c.diff?cvsroot=gcc&r1=1.4&r2=1.5
Fixed by the above commit.