Commit a88a266c by Steven G. Kargl Committed by Jerry DeLisle

re PR fortran/32223 (Backslash handling inconsistent)

2007-06-07  Steven G. Kargl  <kargl@gcc.gnu.org>
	    Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR fortran/32223
	* match.c (gfc_match_special_char): New function.  Match special char.
	Add handling '\0'.
	* match.h: Add prototype.
	* io.c (next_char): Use it.
	* primary.c (next_string_char): Ditto.

Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org>

From-SVN: r125557
parent 294e1a5b
2007-06-07 Steven G. Kargl <kargl@gcc.gnu.org>
Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/32223
* match.c (gfc_match_special_char): New function. Match special char.
Add handling '\0'.
* match.h: Add prototype.
* io.c (next_char): Use it.
* primary.c (next_string_char): Ditto.
2007-06-06 Steven G. Kargl <kargl@gcc.gnu.org> 2007-06-06 Steven G. Kargl <kargl@gcc.gnu.org>
* decl.c: Miscellaneous whitespace fixes. * decl.c: Miscellaneous whitespace fixes.
......
...@@ -141,40 +141,17 @@ next_char (int in_string) ...@@ -141,40 +141,17 @@ next_char (int in_string)
if (gfc_option.flag_backslash && c == '\\') if (gfc_option.flag_backslash && c == '\\')
{ {
int tmp;
locus old_locus = gfc_current_locus; locus old_locus = gfc_current_locus;
switch (gfc_next_char_literal (1)) /* Use a temp variable to avoid side effects from gfc_match_special_char
{ since it uses an int * for its argument. */
case 'a': tmp = (int)c;
c = '\a';
break;
case 'b':
c = '\b';
break;
case 't':
c = '\t';
break;
case 'f':
c = '\f';
break;
case 'n':
c = '\n';
break;
case 'r':
c = '\r';
break;
case 'v':
c = '\v';
break;
case '\\':
c = '\\';
break;
default: if (gfc_match_special_char (&tmp) == MATCH_NO)
/* Unknown backslash codes are simply not expanded. */ gfc_current_locus = old_locus;
gfc_current_locus = old_locus;
break; c = (char)tmp;
}
if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings) if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
gfc_warning ("Extension: backslash character at %C"); gfc_warning ("Extension: backslash character at %C");
......
...@@ -64,6 +64,56 @@ mstring intrinsic_operators[] = { ...@@ -64,6 +64,56 @@ mstring intrinsic_operators[] = {
/******************** Generic matching subroutines ************************/ /******************** Generic matching subroutines ************************/
/* See if the next character is a special character that has
escaped by a \ via the -fbackslash option. */
match
gfc_match_special_char (int *c)
{
match m;
m = MATCH_YES;
switch (gfc_next_char_literal (1))
{
case 'a':
*c = '\a';
break;
case 'b':
*c = '\b';
break;
case 't':
*c = '\t';
break;
case 'f':
*c = '\f';
break;
case 'n':
*c = '\n';
break;
case 'r':
*c = '\r';
break;
case 'v':
*c = '\v';
break;
case '\\':
*c = '\\';
break;
case '0':
*c = '\0';
break;
default:
/* Unknown backslash codes are simply not expanded. */
m = MATCH_NO;
break;
}
return m;
}
/* In free form, match at least one space. Always matches in fixed /* In free form, match at least one space. Always matches in fixed
form. */ form. */
......
...@@ -39,6 +39,7 @@ extern gfc_st_label *gfc_statement_label; ...@@ -39,6 +39,7 @@ extern gfc_st_label *gfc_statement_label;
/* match.c. */ /* match.c. */
/* Generic match subroutines. */ /* Generic match subroutines. */
match gfc_match_special_char (int *);
match gfc_match_space (void); match gfc_match_space (void);
match gfc_match_eos (void); match gfc_match_eos (void);
match gfc_match_small_literal_int (int *, int *); match gfc_match_small_literal_int (int *, int *);
......
...@@ -732,38 +732,8 @@ next_string_char (char delimiter) ...@@ -732,38 +732,8 @@ next_string_char (char delimiter)
{ {
old_locus = gfc_current_locus; old_locus = gfc_current_locus;
switch (gfc_next_char_literal (1)) if (gfc_match_special_char (&c) == MATCH_NO)
{ gfc_current_locus = old_locus;
case 'a':
c = '\a';
break;
case 'b':
c = '\b';
break;
case 't':
c = '\t';
break;
case 'f':
c = '\f';
break;
case 'n':
c = '\n';
break;
case 'r':
c = '\r';
break;
case 'v':
c = '\v';
break;
case '\\':
c = '\\';
break;
default:
/* Unknown backslash codes are simply not expanded */
gfc_current_locus = old_locus;
break;
}
if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings) if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
gfc_warning ("Extension: backslash character at %C"); gfc_warning ("Extension: backslash character at %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