diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5c2b184d6d0..641d50dca5d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-01-26 Steven Bosscher + Steven G. Kargl + + * fortran/io.c (next_char): Deal with backslash escaped characters. + Issue warnings in non -std=gnu cases. + * fortran/primary.c (next_string_char): Issue warnings in non + 2007-01-26 Tobias Burnus * lang-specs.h: Add support for .f03 and .F03 extensions. diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index 312bb39b3d9..8c17b3a8584 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -137,11 +137,52 @@ next_char (int in_string) c = gfc_next_char_literal (in_string); if (c == '\n') c = '\0'; - - if (mode == MODE_COPY) - *format_string++ = c; } + if (gfc_option.flag_backslash && c == '\\') + { + locus old_locus = gfc_current_locus; + + 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; + + default: + /* Unknown backslash codes are simply not expanded. */ + gfc_current_locus = old_locus; + break; + } + + if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings) + gfc_warning ("Extension: backslash character at %C"); + } + + if (mode == MODE_COPY) + *format_string++ = c; + c = TOUPPER (c); return c; } diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index a2f70a07f93..64cc5e44f8d 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -764,6 +764,9 @@ next_string_char (char delimiter) gfc_current_locus = old_locus; break; } + + if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings) + gfc_warning ("Extension: backslash character at %C"); } if (c != delimiter) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bfa9388ed85..536b038c6b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-01-26 Steven G. Kargl + + * gfortran.dg/backslash_3.f: New test. + 2007-01-26 Richard Guenther * gcc.dg/tree-ssa/pr23382.c: Fix typo. diff --git a/gcc/testsuite/gfortran.dg/backslash_3.f b/gcc/testsuite/gfortran.dg/backslash_3.f new file mode 100644 index 00000000000..08c86f36d62 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/backslash_3.f @@ -0,0 +1,25 @@ +C { dg-do run } +C PR fortran/30278 + program a + character(len=1), parameter :: c1 = char(8), c2 = char(92) + character(len=35) str1, str2 + character(len=37) :: str4, str3 + + open(10, status='scratch') + write(10, 100) + rewind(10) + read(10,'(A34)') str1 + str2 = 'Does ' // c1 // 'ackslash result in ' // c1 // 'ackslash' + if (str1 .ne. str2) call abort + + rewind(10) + write (10, 200) + rewind(10) + read(10,'(A37)') str3 + str4 = 'Does ' //c2// 'backslash result in ' //c2// 'backslash' + if (str3 .ne. str4) call abort + + stop + 100 format ('Does \backslash result in \backslash') + 200 format ('Does \\backslash result in \\backslash') + end