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, Fortran] (F2015) Permit ERROR STOP in PURE procedures


It often happens that one wants to debug PURE procedures but as I/O is not permitted, this can be difficult. F2008's IMPURE ELEMENTAL helps a bit not completely.

Fortran 2015 adds another aid â not I/O which is intrinsically impure â but at least ERROR STOP is now permitted.

Attached is this belate Christmas present for Damian and the second F2015 for GCC 5. (The first was "IMPLICIT NONE (external)".)

Build and regtested on x86-64-gnu-linux.
OK for the trunk?

Tobias
gcc/fortran/
2014-12-31  Tobias Burnus  <burnus@net-b.de>

	* match.c (gfc_match_stopcode): Permit error stop in pure
	procedures with F2015.

gcc/testsuite/
2014-12-31  Tobias Burnus  <burnus@net-b.de>

	* gfortran.dg/error_stop_3.f90: New.
	* gfortran.dg/error_stop_4.f90: New.
	* gfortran.dg/coarray_3.f90: Remove a dg-error.

diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index fb68eec..2b4202b 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -2557,7 +2557,8 @@ gfc_match_cycle (void)
 }
 
 
-/* Match a number or character constant after an (ALL) STOP or PAUSE statement.  */
+/* Match a number or character constant after an (ERROR) STOP or PAUSE
+   statement.  */
 
 static match
 gfc_match_stopcode (gfc_statement st)
@@ -2581,9 +2582,18 @@ gfc_match_stopcode (gfc_statement st)
 
   if (gfc_pure (NULL))
     {
-      gfc_error ("%s statement not allowed in PURE procedure at %C",
-		 gfc_ascii_statement (st));
-      goto cleanup;
+      if (st == ST_ERROR_STOP)
+	{
+	  if (!gfc_notify_std (GFC_STD_F2015, "%s statement at %C in PURE "
+			       "procedure", gfc_ascii_statement (st)))
+	    goto cleanup;
+	}
+      else
+	{
+	  gfc_error ("%s statement not allowed in PURE procedure at %C",
+		     gfc_ascii_statement (st));
+	  goto cleanup;
+	}
     }
 
   gfc_unset_implicit_pure (NULL);
diff --git a/gcc/testsuite/gfortran.dg/coarray_3.f90 b/gcc/testsuite/gfortran.dg/coarray_3.f90
index 63c3bd3..aba4eb1 100644
--- a/gcc/testsuite/gfortran.dg/coarray_3.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_3.f90
@@ -79,7 +79,7 @@ pure subroutine pureSub()
   critical ! { dg-error "Image control statement CRITICAL" }
   end critical ! { dg-error "Expecting END SUBROUTINE statement" }
   sync all ! { dg-error "Image control statement SYNC" }
-  error stop ! { dg-error "not allowed in PURE procedure" }
+  error stop
 end subroutine pureSub
 
 
diff --git a/gcc/testsuite/gfortran.dg/error_stop_3.f90 b/gcc/testsuite/gfortran.dg/error_stop_3.f90
new file mode 100644
index 0000000..40fe5de
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/error_stop_3.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! { dg-options "-std=gnu" }
+!
+! F2015 permits ERROR STOP in PURE procedures
+! FIXME: Change to -std=f2015, when available
+!
+pure subroutine foo()
+  error stop "failed"  ! { dg-error "GNU Extension: ERROR STOP statement at .1. in PURE procedure" }
+end
diff --git a/gcc/testsuite/gfortran.dg/error_stop_4.f90 b/gcc/testsuite/gfortran.dg/error_stop_4.f90
new file mode 100644
index 0000000..703a2f2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/error_stop_4.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! { dg-options "-std=f2008ts" }
+!
+! F2015 permits ERROR STOP in PURE procedures
+! FIXME: Change to error_stop_3.f90 to -std=f2015.
+!
+pure subroutine foo()
+  error stop "failed"
+end

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