From 4c3a6ca189d0bf3a62b4f529275e0a666543650c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 7 Jul 2005 17:55:53 +0200 Subject: [PATCH] scanner.c (preprocessor_line): Only set current_file->line when errors have not been encountered. * scanner.c (preprocessor_line): Only set current_file->line when errors have not been encountered. Warn and don't crash if a file leave preprocessor line has no corresponding entering line. Formatting. * gfortran.dg/badline.f: New test. From-SVN: r101717 --- gcc/fortran/ChangeLog | 6 +++++ gcc/fortran/scanner.c | 40 +++++++++++++++++------------ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gfortran.dg/badline.f | 4 +++ 4 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/badline.f diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8b23d570e9c..45ae28c327f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2005-07-07 Jakub Jelinek + + * scanner.c (preprocessor_line): Only set current_file->line when errors + have not been encountered. Warn and don't crash if a file leave + preprocessor line has no corresponding entering line. Formatting. + 2005-07-07 Steven Bosscher * primary.c (match_hollerith_constant): Use int, not unsigned int, diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 5aaecdb2ed9..b2efd81cf8b 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -839,15 +839,13 @@ preprocessor_line (char *c) line = atoi (c); - /* Set new line number. */ - current_file->line = line; - - c = strchr (c, ' '); + c = strchr (c, ' '); if (c == NULL) - /* No file name given. */ - return; - - + { + /* No file name given. Set new line number. */ + current_file->line = line; + return; + } /* Skip spaces. */ while (*c == ' ' || *c == '\t') @@ -880,7 +878,7 @@ preprocessor_line (char *c) /* Get flags. */ - + flag[1] = flag[2] = flag[3] = flag[4] = flag[5] = false; for (;;) @@ -895,24 +893,32 @@ preprocessor_line (char *c) if (1 <= i && i <= 4) flag[i] = true; } - + /* Interpret flags. */ - + if (flag[1] || flag[3]) /* Starting new file. */ { f = get_file (filename, LC_RENAME); f->up = current_file; current_file = f; } - + if (flag[2]) /* Ending current file. */ { - current_file = current_file->up; + if (strcmp (current_file->filename, filename) != 0) + { + gfc_warning_now ("%s:%d: file %s left but not entered", + current_file->filename, current_file->line, + filename); + return; + } + if (current_file->up) + current_file = current_file->up; } - + /* The name of the file can be a temporary file produced by cpp. Replace the name if it is different. */ - + if (strcmp (current_file->filename, filename) != 0) { gfc_free (current_file->filename); @@ -920,10 +926,12 @@ preprocessor_line (char *c) strcpy (current_file->filename, filename); } + /* Set new line number. */ + current_file->line = line; return; bad_cpp_line: - gfc_warning_now ("%s:%d: Illegal preprocessor directive", + gfc_warning_now ("%s:%d: Illegal preprocessor directive", current_file->filename, current_file->line); current_file->line++; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 57e7e08f945..36a93cd17c1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-07-07 Jakub Jelinek + + * gfortran.dg/badline.f: New test. + 2005-07-07 Feng Wang PR fortran/16531 diff --git a/gcc/testsuite/gfortran.dg/badline.f b/gcc/testsuite/gfortran.dg/badline.f new file mode 100644 index 00000000000..9787ecd9519 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/badline.f @@ -0,0 +1,4 @@ + subroutine foo +# 18 "src/badline.F" 2 + end +! { dg-warning "left but not entered" "" { target *-*-* } 2 } -- 2.30.2