Commit 5a06474c by Jerry DeLisle

re PR fortran/19262 (more than thirty-nine continuation lines should issue a std-warn)

2006-10-02  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

    PR fortran/19262
    * gfortran.h (gfc_option_t): Add max_continue_fixed and max_continue_free.
    * options.c (gfc_init_options): Initialize fixed form and free form
    consecutive continuation line limits.
    * scanner.c (gfc_scanner_init_1): Initialize continue_line
    and continue_count. (gfc_next_char_literal): Count the number of
    continuation lines in the current statement and warn if
    limit is exceeded.

2006-10-02  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

    PR fortran/19260
    * scanner.c (gfc_next_char_literal): Add check for missing '&'
    and warn if in_string, otherwise return ' '.

From-SVN: r117384
parent 2834a5fe
2006-10-02 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/19262
* gfortran.h (gfc_option_t): Add max_continue_fixed and max_continue_free.
* options.c (gfc_init_options): Initialize fixed form and free form
consecutive continuation line limits.
* scanner.c (gfc_scanner_init_1): Initialize continue_line
and continue_count. (gfc_next_char_literal): Count the number of
continuation lines in the current statement and warn if
limit is exceeded.
2006-10-02 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/19260
* scanner.c (gfc_next_char_literal): Add check for missing '&'
and warn if in_string, otherwise return ' '.
2006-10-02 Francois-Xavier Coudert <coudert@clipper.ens.fr> 2006-10-02 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/29210 PR fortran/29210
......
...@@ -1613,6 +1613,8 @@ typedef struct ...@@ -1613,6 +1613,8 @@ typedef struct
emits a fatal error. */ emits a fatal error. */
int fixed_line_length; /* maximum line length in fixed-form. */ int fixed_line_length; /* maximum line length in fixed-form. */
int free_line_length; /* maximum line length in free-form. */ int free_line_length; /* maximum line length in free-form. */
int max_continue_fixed;
int max_continue_free;
int max_identifier_length; int max_identifier_length;
int verbose; int verbose;
......
...@@ -48,6 +48,8 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED, ...@@ -48,6 +48,8 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
gfc_option.source_form = FORM_UNKNOWN; gfc_option.source_form = FORM_UNKNOWN;
gfc_option.fixed_line_length = -1; gfc_option.fixed_line_length = -1;
gfc_option.free_line_length = -1; gfc_option.free_line_length = -1;
gfc_option.max_continue_fixed = 19;
gfc_option.max_continue_free = 39;
gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN; gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
gfc_option.verbose = 0; gfc_option.verbose = 0;
...@@ -586,6 +588,8 @@ gfc_handle_option (size_t scode, const char *arg, int value) ...@@ -586,6 +588,8 @@ gfc_handle_option (size_t scode, const char *arg, int value)
gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77 gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F77
| GFC_STD_F2003 | GFC_STD_F95; | GFC_STD_F2003 | GFC_STD_F95;
gfc_option.warn_std = GFC_STD_F95_OBS; gfc_option.warn_std = GFC_STD_F95_OBS;
gfc_option.max_continue_fixed = 255;
gfc_option.max_continue_free = 255;
gfc_option.max_identifier_length = 63; gfc_option.max_identifier_length = 63;
gfc_option.warn_ampersand = 1; gfc_option.warn_ampersand = 1;
break; break;
......
...@@ -61,6 +61,7 @@ static gfc_directorylist *include_dirs; ...@@ -61,6 +61,7 @@ static gfc_directorylist *include_dirs;
static gfc_file *file_head, *current_file; static gfc_file *file_head, *current_file;
static int continue_flag, end_flag, openmp_flag; static int continue_flag, end_flag, openmp_flag;
static int continue_count, continue_line;
static locus openmp_locus; static locus openmp_locus;
gfc_source_form gfc_current_form; gfc_source_form gfc_current_form;
...@@ -71,6 +72,7 @@ const char *gfc_source_file; ...@@ -71,6 +72,7 @@ const char *gfc_source_file;
static FILE *gfc_src_file; static FILE *gfc_src_file;
static char *gfc_src_preprocessor_lines[2]; static char *gfc_src_preprocessor_lines[2];
extern int pedantic;
/* Main scanner initialization. */ /* Main scanner initialization. */
...@@ -81,6 +83,9 @@ gfc_scanner_init_1 (void) ...@@ -81,6 +83,9 @@ gfc_scanner_init_1 (void)
line_head = NULL; line_head = NULL;
line_tail = NULL; line_tail = NULL;
continue_count = 0;
continue_line = 0;
end_flag = 0; end_flag = 0;
} }
...@@ -585,7 +590,10 @@ gfc_next_char_literal (int in_string) ...@@ -585,7 +590,10 @@ gfc_next_char_literal (int in_string)
restart: restart:
c = next_char (); c = next_char ();
if (gfc_at_end ()) if (gfc_at_end ())
return c; {
continue_count = 0;
return c;
}
if (gfc_current_form == FORM_FREE) if (gfc_current_form == FORM_FREE)
{ {
...@@ -644,8 +652,22 @@ restart: ...@@ -644,8 +652,22 @@ restart:
else else
gfc_advance_line (); gfc_advance_line ();
/* We've got a continuation line and need to find where it continues. /* We've got a continuation line. If we are on the very next line after
First eat any comment lines. */ the last continuation, increment the continuation line count and
check whether the limit has been exceeded. */
if (gfc_current_locus.lb->linenum == continue_line + 1)
{
if (++continue_count == gfc_option.max_continue_free)
{
if (gfc_notification_std (GFC_STD_GNU)
|| pedantic)
gfc_warning ("Limit of %d continuations exceeded in statement at %C",
gfc_option.max_continue_free);
}
}
continue_line = gfc_current_locus.lb->linenum;
/* Now find where it continues. First eat any comment lines. */
gfc_skip_comments (); gfc_skip_comments ();
if (prev_openmp_flag != openmp_flag) if (prev_openmp_flag != openmp_flag)
...@@ -681,10 +703,18 @@ restart: ...@@ -681,10 +703,18 @@ restart:
if (c != '&') if (c != '&')
{ {
if (in_string && gfc_option.warn_ampersand) if (in_string)
gfc_warning ("Missing '&' in continued character constant at %C"); {
if (gfc_option.warn_ampersand)
gfc_current_locus.nextc--; gfc_warning_now ("Missing '&' in continued character constant at %C");
gfc_current_locus.nextc--;
}
else
{
c = ' ';
gfc_current_locus = old_loc;
goto done;
}
} }
} }
else else
...@@ -738,6 +768,23 @@ restart: ...@@ -738,6 +768,23 @@ restart:
c = next_char (); c = next_char ();
if (c == '0' || c == ' ' || c == '\n') if (c == '0' || c == ' ' || c == '\n')
goto not_continuation; goto not_continuation;
/* We've got a continuation line. If we are on the very next line after
the last continuation, increment the continuation line count and
check whether the limit has been exceeded. */
if (gfc_current_locus.lb->linenum == continue_line + 1)
{
if (++continue_count == gfc_option.max_continue_fixed)
{
if (gfc_notification_std (GFC_STD_GNU)
|| pedantic)
gfc_warning ("Limit of %d continuations exceeded in statement at %C",
gfc_option.max_continue_fixed);
}
}
if (continue_line < gfc_current_locus.lb->linenum)
continue_line = gfc_current_locus.lb->linenum;
} }
/* Ready to read first character of continuation line, which might /* Ready to read first character of continuation line, which might
...@@ -749,6 +796,8 @@ not_continuation: ...@@ -749,6 +796,8 @@ not_continuation:
gfc_current_locus = old_loc; gfc_current_locus = old_loc;
done: done:
if (c == '\n')
continue_count = 0;
continue_flag = 0; continue_flag = 0;
return c; return c;
} }
......
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