Commit 4c3a6ca1 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 452190fb
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> 2005-07-07 Steven Bosscher <stevenb@suse.de>
* primary.c (match_hollerith_constant): Use int, not unsigned int, * primary.c (match_hollerith_constant): Use int, not unsigned int,
......
...@@ -839,15 +839,13 @@ preprocessor_line (char *c) ...@@ -839,15 +839,13 @@ preprocessor_line (char *c)
line = atoi (c); line = atoi (c);
/* Set new line number. */ c = strchr (c, ' ');
current_file->line = line;
c = strchr (c, ' ');
if (c == NULL) if (c == NULL)
/* No file name given. */ {
return; /* No file name given. Set new line number. */
current_file->line = line;
return;
}
/* Skip spaces. */ /* Skip spaces. */
while (*c == ' ' || *c == '\t') while (*c == ' ' || *c == '\t')
...@@ -880,7 +878,7 @@ preprocessor_line (char *c) ...@@ -880,7 +878,7 @@ preprocessor_line (char *c)
/* Get flags. */ /* Get flags. */
flag[1] = flag[2] = flag[3] = flag[4] = flag[5] = false; flag[1] = flag[2] = flag[3] = flag[4] = flag[5] = false;
for (;;) for (;;)
...@@ -895,24 +893,32 @@ preprocessor_line (char *c) ...@@ -895,24 +893,32 @@ preprocessor_line (char *c)
if (1 <= i && i <= 4) if (1 <= i && i <= 4)
flag[i] = true; flag[i] = true;
} }
/* Interpret flags. */ /* Interpret flags. */
if (flag[1] || flag[3]) /* Starting new file. */ if (flag[1] || flag[3]) /* Starting new file. */
{ {
f = get_file (filename, LC_RENAME); f = get_file (filename, LC_RENAME);
f->up = current_file; f->up = current_file;
current_file = f; current_file = f;
} }
if (flag[2]) /* Ending current file. */ 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 /* The name of the file can be a temporary file produced by
cpp. Replace the name if it is different. */ cpp. Replace the name if it is different. */
if (strcmp (current_file->filename, filename) != 0) if (strcmp (current_file->filename, filename) != 0)
{ {
gfc_free (current_file->filename); gfc_free (current_file->filename);
...@@ -920,10 +926,12 @@ preprocessor_line (char *c) ...@@ -920,10 +926,12 @@ preprocessor_line (char *c)
strcpy (current_file->filename, filename); strcpy (current_file->filename, filename);
} }
/* Set new line number. */
current_file->line = line;
return; return;
bad_cpp_line: 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->filename, current_file->line);
current_file->line++; current_file->line++;
} }
......
2005-07-07 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/badline.f: New test.
2005-07-07 Feng Wang <fengwang@nudt.edu.cn> 2005-07-07 Feng Wang <fengwang@nudt.edu.cn>
PR fortran/16531 PR fortran/16531
......
subroutine foo
# 18 "src/badline.F" 2
end
! { dg-warning "left but not entered" "" { target *-*-* } 2 }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment