re PR fortran/34872 (Spurious error in snapshot of 01/18/08: Statement at (1) is...
authorPaul Thomas <pault@gcc.gnu.org>
Thu, 24 Jan 2008 08:40:38 +0000 (08:40 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Thu, 24 Jan 2008 08:40:38 +0000 (08:40 +0000)
2008-01-24  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/34872
* parse.c (next_statement) : If ST_GET_FCN_CHARACTERISTICS  is
seen, check for a statement label and, if present, delete it
and set the locus to the start of the statement.

2008-01-24  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/34872
* gfortran.dg/function_charlen_3.f: New test.

From-SVN: r131777

gcc/fortran/ChangeLog
gcc/fortran/parse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/function_charlen_3.f [new file with mode: 0644]

index 35fd98e..0a984c3 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-24  Paul Thomas  <pault@gcc.gnu.org>\r
+\r
+       PR fortran/34872\r
+       * parse.c (next_statement) : If ST_GET_FCN_CHARACTERISTICS  is\r
+       seen, check for a statement label and, if present, delete it\r
+       and set the locus to the start of the statement.\r
+\r
 2008-01-22  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/34875
index 64d8c33..20777fd 100644 (file)
@@ -795,7 +795,7 @@ static gfc_statement
 next_statement (void)
 {
   gfc_statement st;
-
+  locus old_locus;
   gfc_new_block = NULL;
 
   for (;;)
@@ -824,6 +824,8 @@ next_statement (void)
       if (gfc_define_undef_line ())
        continue;
 
+      old_locus = gfc_current_locus;
+
       st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free ();
 
       if (st != ST_NONE)
@@ -832,6 +834,13 @@ next_statement (void)
 
   gfc_buffer_error (0);
 
+  if (st == ST_GET_FCN_CHARACTERISTICS && gfc_statement_label != NULL)
+    {
+      gfc_free_st_label (gfc_statement_label);
+      gfc_statement_label = NULL;
+      gfc_current_locus = old_locus;
+    }
+
   if (st != ST_NONE)
     check_statement_label (st);
 
index fe9442a..ce0ce9a 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-24  Paul Thomas  <pault@gcc.gnu.org>\r
+\r
+       PR fortran/34872\r
+       * gfortran.dg/function_charlen_3.f: New test.\r
+
 2008-01-23  Michael Matz  <matz@suse.de>
 
        PR debug/34895
diff --git a/gcc/testsuite/gfortran.dg/function_charlen_3.f b/gcc/testsuite/gfortran.dg/function_charlen_3.f
new file mode 100644 (file)
index 0000000..dd4417a
--- /dev/null
@@ -0,0 +1,18 @@
+C { dg-do compile }
+C Tests the fix for the regression PR34872, in which the re-matching of
+C the function declaration made a mess if the first executable statement
+C had a label.
+      CHARACTER FUNCTION s()
+   10 CONTINUE
+      GOTO 10
+      s = ' '
+      END FUNCTION s
+
+      CHARACTER FUNCTION t()
+   10 format ("q")
+      write (t, 10)
+      END FUNCTION t
+
+      character t
+      if (t() .ne. "q") call abort ()
+      end