OSDN Git Service

2007-01-26 Steven Bosscher <stevenb.gcc@gmail.com>
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jan 2007 23:36:11 +0000 (23:36 +0000)
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jan 2007 23:36:11 +0000 (23:36 +0000)
        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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121218 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/io.c
gcc/fortran/primary.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/backslash_3.f [new file with mode: 0644]

index 5c2b184..641d50d 100644 (file)
@@ -1,3 +1,10 @@
+2007-01-26  Steven Bosscher  <stevenb.gcc@gmail.com>
+           Steven G. Kargl <kargl@gcc.gnu.org>
+
+       * 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  <burnus@net-b.de>
 
        * lang-specs.h: Add support for .f03 and .F03 extensions.
 2007-01-26  Tobias Burnus  <burnus@net-b.de>
 
        * lang-specs.h: Add support for .f03 and .F03 extensions.
index 312bb39..8c17b3a 100644 (file)
@@ -137,11 +137,52 @@ next_char (int in_string)
       c = gfc_next_char_literal (in_string);
       if (c == '\n')
        c = '\0';
       c = gfc_next_char_literal (in_string);
       if (c == '\n')
        c = '\0';
+    }
+
+  if (gfc_option.flag_backslash && c == '\\')
+    {
+      locus old_locus = gfc_current_locus;
 
 
-      if (mode == MODE_COPY)
-       *format_string++ = c;
+      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;
 }
   c = TOUPPER (c);
   return c;
 }
index a2f70a0..64cc5e4 100644 (file)
@@ -764,6 +764,9 @@ next_string_char (char delimiter)
          gfc_current_locus = old_locus;
          break;
        }
          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)
     }
 
   if (c != delimiter)
index bfa9388..536b038 100644 (file)
@@ -1,3 +1,7 @@
+2007-01-26  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       * gfortran.dg/backslash_3.f: New test.
+
 2007-01-26  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/pr23382.c: Fix typo.
 2007-01-26  Richard Guenther  <rguenther@suse.de>
 
        * 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 (file)
index 0000000..08c86f3
--- /dev/null
@@ -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