Hello world, after some thought, I think the PR can be fixed by something far less invasive than my previous patch.
The new version of the patch simply issues an error for a non-printable character (which should never be legal). Anything else should be caught by other error reporting routines. OK for trunk? Regards Thomas 2017-10-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/82372 * fortran/scanner.c (last_error_char): New global variable. (gfc_scanner_init_1): Set last_error_char to NULL. (gfc_gooble_whitespace): If a character not printable or not newline, issue an error. 2017-10-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/82372 * gfortran.dg/illegal_char.f90: New test.
Index: scanner.c =================================================================== --- scanner.c (Revision 253530) +++ scanner.c (Arbeitskopie) @@ -80,6 +80,7 @@ static struct gfc_file_change size_t file_changes_cur, file_changes_count; size_t file_changes_allocated; +static gfc_char_t *last_error_char; /* Functions dealing with our wide characters (gfc_char_t) and sequences of such characters. */ @@ -269,6 +270,7 @@ gfc_scanner_init_1 (void) continue_line = 0; end_flag = 0; + last_error_char = NULL; } @@ -1700,6 +1702,14 @@ gfc_gobble_whitespace (void) } while (gfc_is_whitespace (c)); + if (!ISPRINT(c) && c != '\n' && last_error_char != gfc_current_locus.nextc) + { + char buf[20]; + last_error_char = gfc_current_locus.nextc; + snprintf (buf, 20, "%2.2X", c); + gfc_error_now ("Invalid character 0x%s at %C", buf); + } + gfc_current_locus = old_loc; }
#include "illegal_char.f90"