re PR fortran/30520 (Conflics checking of VOLATILE attribute needs improvement)

fortran/
2007-01-31  Tobias Burnus  <burnus@net-b.de>

       PR fortran/30520
       * interface.c (compare_actual_formal): Check conformance between
         actual and VOLATILE dummy arguments.
       * symbol.c (gfc_add_volatile): Allow setting of VOLATILE
         multiple times in different scopes.
       * decl.c (gfc_match_volatile): Search symbol in host association.

testsuite/
2007-01-31  Tobias Burnus  <burnus@net-b.de>

       PR fortran/30520
       * gfortran.dg/volatile8.f90: New argument conformance test.
       * gfortran.dg/volatile9.f90: New scope test.

From-SVN: r121379
This commit is contained in:
Tobias Burnus 2007-01-31 10:18:33 +01:00 committed by Tobias Burnus
parent c9cde24cd1
commit 9bce3c1cc4
7 changed files with 175 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2007-01-31 Tobias Burnus <burnus@net-b.de>
PR fortran/30520
* interface.c (compare_actual_formal): Check conformance between
actual and VOLATILE dummy arguments.
* symbol.c (gfc_add_volatile): Allow setting of VOLATILE
multiple times in different scopes.
* decl.c (gfc_match_volatile): Search symbol in host association.
2007-01-31 Kazu Hirata <kazu@codesourcery.com>
* simplify.c, trans-array.c: Fix comment typos.

View File

@ -4221,7 +4221,9 @@ gfc_match_volatile (void)
for(;;)
{
m = gfc_match_symbol (&sym, 0);
/* VOLATILE is special because it can be added to host-associated
symbols locally. */
m = gfc_match_symbol (&sym, 1);
switch (m)
{
case MATCH_YES:

View File

@ -1417,6 +1417,54 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
return 0;
}
/* C1232 (R1221) For an actual argument which is an array section or
an assumed-shape array, the dummy argument shall be an assumed-
shape array, if the dummy argument has the VOLATILE attribute. */
if (f->sym->attr.volatile_
&& a->expr->symtree->n.sym->as
&& a->expr->symtree->n.sym->as->type == AS_ASSUMED_SHAPE
&& !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
{
if (where)
gfc_error ("Assumed-shape actual argument at %L is "
"incompatible with the non-assumed-shape "
"dummy argument '%s' due to VOLATILE attribute",
&a->expr->where,f->sym->name);
return 0;
}
if (f->sym->attr.volatile_
&& a->expr->ref && a->expr->ref->u.ar.type == AR_SECTION
&& !(f->sym->as && f->sym->as->type == AS_ASSUMED_SHAPE))
{
if (where)
gfc_error ("Array-section actual argument at %L is "
"incompatible with the non-assumed-shape "
"dummy argument '%s' due to VOLATILE attribute",
&a->expr->where,f->sym->name);
return 0;
}
/* C1233 (R1221) For an actual argument which is a pointer array, the
dummy argument shall be an assumed-shape or pointer array, if the
dummy argument has the VOLATILE attribute. */
if (f->sym->attr.volatile_
&& a->expr->symtree->n.sym->attr.pointer
&& a->expr->symtree->n.sym->as
&& !(f->sym->as
&& (f->sym->as->type == AS_ASSUMED_SHAPE
|| f->sym->attr.pointer)))
{
if (where)
gfc_error ("Pointer-array actual argument at %L requires "
"an assumed-shape or pointer-array dummy "
"argument '%s' due to VOLATILE attribute",
&a->expr->where,f->sym->name);
return 0;
}
match:
if (a == actual)
na = i;

View File

@ -877,10 +877,14 @@ try
gfc_add_volatile (symbol_attribute * attr, const char *name, locus * where)
{
if (check_used (attr, name, where))
return FAILURE;
/* No check_used needed as 11.2.1 of the F2003 standard allows
that the local identifier made accessible by a use statement can be
given a VOLATILE attribute. */
if (attr->volatile_)
/* TODO: The following allows multiple VOLATILE statements for
use-associated variables and it prevents setting VOLATILE for a host-
associated variable which is already marked as VOLATILE in the host. */
if (attr->volatile_ && !attr->use_assoc)
{
if (gfc_notify_std (GFC_STD_LEGACY,
"Duplicate VOLATILE attribute specified at %L",

View File

@ -1,3 +1,9 @@
2007-01-31 Tobias Burnus <burnus@net-b.de>
PR fortran/30520
* gfortran.dg/volatile8.f90: New argument conformance test.
* gfortran.dg/volatile9.f90: New scope test.
2007-01-30 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/24745

View File

@ -0,0 +1,58 @@
! Check for compatibily of actual arguments
! with dummy arguments marked as volatile
!
! Contributed by Steven Correll.
!
! PR fortran/30520
! { dg-do compile }
subroutine s8()
implicit none
interface
subroutine sub8(dummy8)
integer, volatile, dimension(3) :: dummy8
end subroutine sub8
subroutine sub8a(dummy8a)
integer, volatile, dimension(:) :: dummy8a
end subroutine sub8a
end interface
integer, dimension(8) :: a
call sub8 (a(1:5:2)) ! { dg-error "Array-section actual argument" }
call sub8a(a(1:5:2))
end subroutine s8
subroutine s9(s9dummy)
implicit none
integer, dimension(:) :: s9dummy
interface
subroutine sub9(dummy9)
integer, volatile, dimension(3) :: dummy9
end subroutine sub9
subroutine sub9a(dummy9a)
integer, volatile, dimension(:) :: dummy9a
end subroutine sub9a
end interface
integer, dimension(9) :: a
call sub9 (s9dummy) ! { dg-error "Assumed-shape actual argument" }
call sub9a(s9dummy)
end subroutine s9
subroutine s10()
implicit none
interface
subroutine sub10(dummy10)
integer, volatile, dimension(3) :: dummy10
end subroutine sub10
subroutine sub10a(dummy10a)
integer, volatile, dimension(:) :: dummy10a
end subroutine sub10a
subroutine sub10b(dummy10b)
integer, volatile, dimension(:), pointer :: dummy10b
end subroutine sub10b
end interface
integer, dimension(:), pointer :: a
call sub10 (a) ! { dg-error "Pointer-array actual argument" }
call sub10a(a)
call sub10b(a)
end subroutine s10

View File

@ -0,0 +1,44 @@
! Check for valid VOLATILE uses
!
! Contributed by Steven Correll.
!
! PR fortran/30520
! { dg-do compile }
function f() result(fr)
integer, volatile :: fr
fr = 5
end function f
module mod13
implicit none
integer :: v13
end module mod13
module mod13a
use mod13
implicit none
volatile :: v13
real :: v14
contains
subroutine s13()
volatile :: v13
volatile :: v14
end subroutine s13
end module mod13a
module mod13b
use mod13a
implicit none
volatile :: v13
end module mod13b
subroutine s14()
use mod13a
implicit none
volatile :: v13
end subroutine s14
! { dg-final { cleanup-modules "mod13 mod13a mod13b" } }