diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e1b10978128..b3f0b1c3b17 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2005-04-15 Richard Guenther + + PR fortran/14569 + * gfortran.h (gfc_linebuf): Add truncated field. + * parse.c (next_statement): Handle warning for truncated + lines. + * scanner.c (load_line): Return if line was truncated. + No longer warn for truncated lines. Remove unused parameters. + (load_file): Store load_line return value to linebuf. + (gfc_error_recovery): Do not advance line at the end. + 2005-04-14 Steven G. Kargl * gfortran.h (gfc_real_info): Add subnormal struct member. diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 330cedae269..c266d589c0c 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -481,6 +481,8 @@ typedef struct gfc_linebuf struct gfc_file *file; struct gfc_linebuf *next; + int truncated; + char line[1]; } gfc_linebuf; diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index a3f0ac19539..94bf6d0d28d 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -479,7 +479,13 @@ next_statement (void) gfc_buffer_error (1); if (gfc_at_eol ()) - gfc_advance_line (); + { + if (gfc_option.warn_line_truncation + && gfc_current_locus.lb->truncated) + gfc_warning_now ("Line truncated at %C"); + + gfc_advance_line (); + } gfc_skip_comments (); diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index cab85f4dcfa..5748ef38934 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -631,21 +631,17 @@ gfc_error_recovery (void) if (c == delim) break; if (c == '\n') - goto done; + return; if (c == '\\') { c = next_char (); if (c == '\n') - goto done; + return; } } if (gfc_at_eof ()) break; } - -done: - if (c == '\n') - gfc_advance_line (); } @@ -677,12 +673,14 @@ gfc_gobble_whitespace (void) need be. In fixed mode, we expand a tab that occurs within the statement label region to expand to spaces that leave the next character in - the source region. */ + the source region. + load_line returns wether the line was truncated. */ -static void -load_line (FILE * input, char **pbuf, char *filename, int linenum) +static int +load_line (FILE * input, char **pbuf) { - int c, maxlen, i, trunc_flag, preprocessor_flag; + int c, maxlen, i, preprocessor_flag; + int trunc_flag = 0; static int buflen = 0; char *buffer; @@ -767,15 +765,6 @@ load_line (FILE * input, char **pbuf, char *filename, int linenum) c = fgetc (input); if (c == '\n' || c == EOF) break; - - if (gfc_option.warn_line_truncation - && trunc_flag - && !gfc_is_whitespace (c)) - { - gfc_warning_now ("%s:%d: Line is being truncated", - filename, linenum); - trunc_flag = 0; - } } ungetc ('\n', input); @@ -791,6 +780,8 @@ load_line (FILE * input, char **pbuf, char *filename, int linenum) *buffer++ = ' '; *buffer = '\0'; + + return trunc_flag; } @@ -1034,7 +1025,7 @@ load_file (char *filename, bool initial) for (;;) { - load_line (input, &line, filename, current_file->line); + int trunc = load_line (input, &line); len = strlen (line); if (feof (input) && len == 0) @@ -1066,6 +1057,7 @@ load_file (char *filename, bool initial) b->linenum = current_file->line++; #endif b->file = current_file; + b->truncated = trunc; strcpy (b->line, line); if (line_head == NULL)