This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Patch for fortran/30278
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Sat, 30 Dec 2006 16:46:36 -0800
- Subject: Patch for fortran/30278
I've updated Steven's patch with a testcase and also the
issuing of warnings in the non -std=gnu cases. I'll
commit this on 1 Jan 07 if no one objects.
2006-12-30 Steven Bosscher <stevenb.gcc@gmail.com>
Steven G. Kargl <kargl@gcc.gnu,org>
* testsuite/gfortran.dg/backslash_3.f: New test.
* 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
--
Steve
Index: testsuite/gfortran.dg/backslash_3.f
===================================================================
--- testsuite/gfortran.dg/backslash_3.f (revision 0)
+++ testsuite/gfortran.dg/backslash_3.f (revision 0)
@@ -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
Index: fortran/io.c
===================================================================
--- fortran/io.c (revision 120287)
+++ fortran/io.c (working copy)
@@ -137,10 +137,51 @@ next_char (int in_string)
c = gfc_next_char_literal (in_string);
if (c == '\n')
c = '\0';
+ }
+
+ 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;
- if (mode == MODE_COPY)
- *format_string++ = c;
+ 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;
Index: fortran/primary.c
===================================================================
--- fortran/primary.c (revision 120287)
+++ fortran/primary.c (working copy)
@@ -766,6 +766,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)
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