Hi all,
here is a straightforward patch for a rather old PR, which deals with
argument checking. The patch at hand fixes one of the outstanding todo
items of the PR (see comment 17), namely extending the attribute
checking of dummy arguments. It adds checks for the four missing
attributes (asynchronous, contiguous, value, volatile). The relevant
standard reference is F08:12.3.2.
Included is also a test case and a fix for one testsuite case which
was rejected with the patch.
Regtested on x86_64-unknown-linux-gnu. Ok for trunk?
Cheers,
Janus
2013-12-10 Janus Weil <[email protected]>
PR fortran/35831
* interface.c (check_dummy_characteristics): Add checks for several
attributes.
2013-12-10 Janus Weil <[email protected]>
PR fortran/35831
* gfortran.dg/c_by_val_5.f90: Modified.
* gfortran.dg/dummy_procedure_10.f90: New.
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c (revision 205870)
+++ gcc/fortran/interface.c (working copy)
@@ -1114,9 +1114,38 @@ check_dummy_characteristics (gfc_symbol *s1, gfc_s
return false;
}
- /* FIXME: Do more comprehensive testing of attributes, like e.g.
- ASYNCHRONOUS, CONTIGUOUS, VALUE, VOLATILE, etc. */
+ /* Check ASYNCHRONOUS attribute. */
+ if (s1->attr.asynchronous != s2->attr.asynchronous)
+ {
+ snprintf (errmsg, err_len, "ASYNCHRONOUS mismatch in argument '%s'",
+ s1->name);
+ return false;
+ }
+ /* Check CONTIGUOUS attribute. */
+ if (s1->attr.contiguous != s2->attr.contiguous)
+ {
+ snprintf (errmsg, err_len, "CONTIGUOUS mismatch in argument '%s'",
+ s1->name);
+ return false;
+ }
+
+ /* Check VALUE attribute. */
+ if (s1->attr.value != s2->attr.value)
+ {
+ snprintf (errmsg, err_len, "VALUE mismatch in argument '%s'",
+ s1->name);
+ return false;
+ }
+
+ /* Check VOLATILE attribute. */
+ if (s1->attr.volatile_ != s2->attr.volatile_)
+ {
+ snprintf (errmsg, err_len, "VOLATILE mismatch in argument '%s'",
+ s1->name);
+ return false;
+ }
+
/* Check interface of dummy procedures. */
if (s1->attr.flavor == FL_PROCEDURE)
{
Index: gcc/testsuite/gfortran.dg/c_by_val_5.f90
===================================================================
--- gcc/testsuite/gfortran.dg/c_by_val_5.f90 (revision 205870)
+++ gcc/testsuite/gfortran.dg/c_by_val_5.f90 (working copy)
@@ -23,7 +23,7 @@ module x
! "external" only.
interface
subroutine bmp_write(nx)
- integer :: nx
+ integer, value :: nx
end subroutine bmp_write
end interface
contains
! { dg-do compile }
!
! PR 35831: [F95] Shape mismatch check missing for dummy procedure argument
!
! Contributed by Janus Weil <[email protected]>
program test_attributes
call tester1 (a1) ! { dg-error "ASYNCHRONOUS mismatch in argument" }
call tester2 (a2) ! { dg-error "CONTIGUOUS mismatch in argument" }
call tester3 (a1) ! { dg-error "VALUE mismatch in argument" }
call tester4 (a1) ! { dg-error "VOLATILE mismatch in argument" }
contains
subroutine a1(aa)
real :: aa
end subroutine
subroutine a2(bb)
real :: bb(:)
end subroutine
subroutine tester1 (f1)
interface
subroutine f1 (a)
real, asynchronous :: a
end subroutine
end interface
end subroutine
subroutine tester2 (f2)
interface
subroutine f2 (b)
real, contiguous :: b(:)
end subroutine
end interface
end subroutine
subroutine tester3 (f3)
interface
subroutine f3 (c)
real, value :: c
end subroutine
end interface
end subroutine
subroutine tester4 (f4)
interface
subroutine f4 (d)
real, volatile :: d
end subroutine
end interface
end subroutine
end