Commit 598dc594 by Steven G. Kargl

re PR fortran/63514 (functions containing volatile are considered pure)

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

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


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

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

From-SVN: r261360
parent 1ae28fc3
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/63514
* symbol.c (gfc_add_volatile): Enforce F2008:C1282 and F2018:C1588.
2018-06-08 Thomas Koenig <tkoenig@gcc.gnu.org> 2018-06-08 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85631 PR fortran/85631
......
...@@ -1349,6 +1349,20 @@ gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where) ...@@ -1349,6 +1349,20 @@ gfc_add_volatile (symbol_attribute *attr, const char *name, locus *where)
where)) where))
return false; 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_ = 1;
attr->volatile_ns = gfc_current_ns; attr->volatile_ns = gfc_current_ns;
return check_conflict (attr, name, where); return check_conflict (attr, name, where);
......
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/63514
* gfortran.dg/pr63514.f90: New test.
2018-06-08 Thomas Koenig <tkoenig@gcc.gnu.org> 2018-06-08 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85631 PR fortran/85631
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment