This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]