diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c6be6130a80..57c9142ba94 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2008-01-22 Tobias Burnus + + PR fortran/34899 + * scanner.c (load_line): Support continuation lines. + * invoke.texi (-Wtabs): Document this. + 2008-01-22 Paul Thomas PR fortran/34896 diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 22dd8983acd..0a67785d299 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -499,10 +499,11 @@ A TRANSFER specifies a source that is shorter than the destination. @cindex warnings, tabs @cindex tabulators By default, tabs are accepted as whitespace, but tabs are not members -of the Fortran Character Set. @option{-Wno-tabs} will cause a warning -to be issued if a tab is encountered. Note, @option{-Wno-tabs} is active -for @option{-pedantic}, @option{-std=f95}, @option{-std=f2003}, and -@option{-Wall}. +of the Fortran Character Set. For continuation lines, a tab followed +by a digit between 1 and 9 is supported. @option{-Wno-tabs} will cause +a warning to be issued if a tab is encountered. Note, @option{-Wno-tabs} +is active for @option{-pedantic}, @option{-std=f95}, @option{-std=f2003}, +and @option{-Wall}. @item -Wunderflow @opindex @code{Wunderflow} diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index da4c37b155e..9bbb06581c9 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -1106,6 +1106,7 @@ load_line (FILE *input, char **pbuf, int *pbuflen) int trunc_flag = 0, seen_comment = 0; int seen_printable = 0, seen_ampersand = 0; char *buffer; + bool found_tab = false; /* Determine the maximum allowed line length. */ if (gfc_current_form == FORM_FREE) @@ -1184,17 +1185,30 @@ load_line (FILE *input, char **pbuf, int *pbuflen) && (c == '*' || c == 'c' || c == 'd')) seen_comment = 1; - if (gfc_current_form == FORM_FIXED && c == '\t' && i <= 6) + /* Vendor extension: "1" marks a continuation line. */ + if (found_tab) { + found_tab = false; + if (c >= '1' && c <= '9') + { + *(buffer-1) = c; + continue; + } + } + + if (gfc_current_form == FORM_FIXED && c == '\t' && i < 6) + { + found_tab = true; + if (!gfc_option.warn_tabs && seen_comment == 0 && current_line != linenum) { linenum = current_line; - gfc_warning_now ("Nonconforming tab character in column 1 " - "of line %d", linenum); + gfc_warning_now ("Nonconforming tab character in column %d " + "of line %d", i+1, linenum); } - while (i <= 6) + while (i < 6) { *buffer++ = ' '; i++; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3095a15f76..7e4fd057f0a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-01-22 Tobias Burnus + + PR fortran/34899 + * gfortran.dg/tab_continuation.f: New. + 2008-01-22 Paul Thomas PR fortran/34896 diff --git a/gcc/testsuite/gfortran.dg/tab_continuation.f b/gcc/testsuite/gfortran.dg/tab_continuation.f new file mode 100644 index 00000000000..448cd20864e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/tab_continuation.f @@ -0,0 +1,15 @@ +! { dg-do compile } +! +! PR fortran/34899 +! +! Allow 1 to 9 as continuation marker, which is a very common +! vendor extension. +! + PARAMETER (LUMIN=11,LUMAX=20,MAPMAX=256,NPLANEMAX=999) + INTEGER NAXIS(0:MAPMAX,LUMIN:LUMAX),NAXIS1(0:MAPMAX,LUMIN:LUMAX), + 1NAXIS2(0:MAPMAX,LUMIN:LUMAX),NAXIS3(0:MAPMAX,LUMIN:LUMAX) + end +! { dg-warning "Nonconforming tab character in column 1 of line 8" "Nonconforming tab" {target "*-*-*"} 0 } +! { dg-warning "Nonconforming tab character in column 1 of line 9" "Nonconforming tab" {target "*-*-*"} 0 } +! { dg-warning "Nonconforming tab character in column 1 of line 10" "Nonconforming tab" {target "*-*-*"} 0 } +! { dg-warning "Nonconforming tab character in column 1 of line 11" "Nonconforming tab" {target "*-*-*"} 0 }