Enforce F2008:C1282 and F2018:C1588

Message ID 20180608185144.GA7431@troutmask.apl.washington.edu
State New
Headers show
Series
  • Enforce F2008:C1282 and F2018:C1588
Related show

Commit Message

Steve Kargl June 8, 2018, 6:52 p.m.
The attached patch adresses part of an issue raised in
PR fortran/63514 by enforcing F2008:C1282 and F2018:C1588.
Regression tested on x86_64-*-freebsd.  OK to commit?

PS: the actual underlying point of PR fortran/63514 is bogus,
and I recommend that it be closed with WONTFIX.


2018-06-08  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/63514
	* symbol.c (gfc_add_volatile): Enforce F2008:C1282 and F2018:C1588.


2018-06-08  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/63514
	* gfortran.dg/pr63514.f90: New test.


-- 
Steve

Comments

Thomas Koenig June 10, 2018, 12:29 p.m. | #1
Hi Steve,

> The attached patch adresses part of an issue raised in

> PR fortran/63514 by enforcing F2008:C1282 and F2018:C1588.

> Regression tested on x86_64-*-freebsd.  OK to commit?


OK. Thanks!

> PS: the actual underlying point of PR fortran/63514 is bogus,

> and I recommend that it be closed with WONTFIX.


I concur.

Regards

	Thomas

Patch

Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c	(revision 261285)
+++ gcc/fortran/symbol.c	(working copy)
@@ -1349,6 +1349,20 @@  gfc_add_volatile (symbol_attribute *attr, const char *
 			 where))
       return false;
 
+  /* F2008:  C1282 A designator of a variable with the VOLATILE attribute
+     shall not appear in a pure subprogram.
+
+     F2018: C1588 A local variable of a pure subprogram, or of a BLOCK
+     construct within a pure subprogram, shall not have the SAVE or
+     VOLATILE attribute.  */
+  if (gfc_pure (NULL))
+    {
+      gfc_error ("VOLATILE attribute at %L cannot be specified in a "
+		 "PURE procedure", where);
+      return false;
+    }
+
+
   attr->volatile_ = 1;
   attr->volatile_ns = gfc_current_ns;
   return check_conflict (attr, name, where);
Index: gcc/testsuite/gfortran.dg/pr63514.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr63514.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr63514.f90	(working copy)
@@ -0,0 +1,41 @@ 
+! { dg-do compile }
+! PR fortran/63514.f90
+program foo
+
+   implicit none
+
+   integer, volatile :: n
+
+   n = 0
+
+   call bar
+   call bah
+
+   contains
+
+   subroutine bar
+      integer k
+      integer, volatile :: m
+      block
+         integer, save :: i
+         integer, volatile :: j
+         i = 42
+         j = 2 * i
+         k = i + j + n
+      end block
+   end subroutine bar
+
+   pure subroutine bah
+      integer k
+      integer, volatile :: m     ! { dg-error "cannot be specified in a PURE" }
+      block
+         integer, save :: i      ! { dg-error "cannot be specified in a PURE" }
+         integer, volatile :: j  ! { dg-error "cannot be specified in a PURE" }
+         i = 42                  ! { dg-error "has no IMPLICIT type" }
+         j = 2 * i               ! { dg-error "has no IMPLICIT type" }
+         k = i + j + n
+      end block
+      m = k * m                  ! { dg-error "has no IMPLICIT type" }
+   end subroutine bah
+
+end program foo