diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-07-07 17:55:53 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-07-07 17:55:53 +0200 |
commit | 4c3a6ca189d0bf3a62b4f529275e0a666543650c (patch) | |
tree | 6b2f9b6876ae8fbaeef20fec5fcae091d024b66a /gcc | |
parent | 452190fb6ac2ab8706715a14e82d742ae545d6c2 (diff) | |
download | gcc-4c3a6ca189d0bf3a62b4f529275e0a666543650c.zip gcc-4c3a6ca189d0bf3a62b4f529275e0a666543650c.tar.gz gcc-4c3a6ca189d0bf3a62b4f529275e0a666543650c.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/scanner.c | 40 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/badline.f | 4 |
4 files changed, 38 insertions, 16 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8b23d57..45ae28c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2005-07-07 Jakub Jelinek <jakub@redhat.com> + + * 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 <stevenb@suse.de> * primary.c (match_hollerith_constant): Use int, not unsigned int, diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 5aaecdb..b2efd81 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 57e7e08..36a93cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-07-07 Jakub Jelinek <jakub@redhat.com> + + * gfortran.dg/badline.f: New test. + 2005-07-07 Feng Wang <fengwang@nudt.edu.cn> PR fortran/16531 diff --git a/gcc/testsuite/gfortran.dg/badline.f b/gcc/testsuite/gfortran.dg/badline.f new file mode 100644 index 0000000..9787ecd --- /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 } |