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  <ja...@gcc.gnu.org>

    PR fortran/35831
    * interface.c (check_dummy_characteristics): Add checks for several
    attributes.


2013-12-10  Janus Weil  <ja...@gcc.gnu.org>

    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 <ja...@gcc.gnu.org>

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

Reply via email to