Patchwork [Fortran] Permit allocatable/pointer attributes with BIND(C)

login
register
mail settings
Submitter Tobias Burnus
Date April 30, 2013, 2:53 p.m.
Message ID <517FDAF6.2060006@net-b.de>
Download mbox | patch
Permalink /patch/240634/
State New
Headers show

Comments

Tobias Burnus - April 30, 2013, 2:53 p.m.
TS29113 permits the allocatable/pointer attribute with BIND(C); this 
patch allows it now with -std=f2008ts.

While the TS allows it also for scalars, this patch only permits it for 
arrays. The reason is that TS29113 requires the use of the array 
descriptor - and adding the support for scalars is something I would 
like to defer until the new descriptor is ready. (Similarly for 
character(len=:) and character(len=*) dummy arguments with Bind(C), 
which also use the array descriptor.)

Build and regtested on x86-84-gnu-linux.
OK for the trunk?

Tobias

PS: Admittedly, this feature is only of limited use on the trunk; 
however, for Fortran-dev, it is very useful.
Thomas Koenig - May 4, 2013, 5:03 p.m.
Hi Tobias,

> TS29113 permits the allocatable/pointer attribute with BIND(C); this
> patch allows it now with -std=f2008ts.


> Build and regtested on x86-84-gnu-linux.
> OK for the trunk?

OK. Thanks for the patch!

	Thomas

Patch

2013-04-30  Tobias Burnus  <burnus@net-b.de>

	* decl.c (gfc_verify_c_interop_param): Permit allocatable
	and pointer with -std=f2008ts.

2013-04-30  Tobias Burnus  <burnus@net-b.de>

	* gfortran.dg/bind_c_array_params.f03: Update dg-error.
	* gfortran.dg/bind_c_usage_27.f90: New.
	* gfortran.dg/bind_c_usage_28.f90: New.

diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index f9891c9..0187911 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1061,20 +1061,27 @@  gfc_verify_c_interop_param (gfc_symbol *sym)
 	  /* We have to make sure that any param to a bind(c) routine does
 	     not have the allocatable, pointer, or optional attributes,
 	     according to J3/04-007, section 5.1.  */
-	  if (sym->attr.allocatable == 1)
-	    {
-	      gfc_error ("Variable '%s' at %L cannot have the "
-			 "ALLOCATABLE attribute because procedure '%s'"
-			 " is BIND(C)", sym->name, &(sym->declared_at),
-			 sym->ns->proc_name->name);
-	      retval = false;
-	    }
+	  if (sym->attr.allocatable == 1
+	      && !gfc_notify_std (GFC_STD_F2008_TS, "Variable '%s' at %L with "
+				  "ALLOCATABLE attribute in procedure '%s' "
+				  "with BIND(C)", sym->name,
+				  &(sym->declared_at),
+				  sym->ns->proc_name->name))
+	    retval = false;
+
+	  if (sym->attr.pointer == 1
+	      && !gfc_notify_std (GFC_STD_F2008_TS, "Variable '%s' at %L with "
+				  "POINTER attribute in procedure '%s' "
+				  "with BIND(C)", sym->name,
+				  &(sym->declared_at),
+				  sym->ns->proc_name->name))
+	    retval = false;
 
-	  if (sym->attr.pointer == 1)
+	  if ((sym->attr.allocatable || sym->attr.pointer) && !sym->as)
 	    {
-	      gfc_error ("Variable '%s' at %L cannot have the "
-			 "POINTER attribute because procedure '%s'"
-			 " is BIND(C)", sym->name, &(sym->declared_at),
+	      gfc_error ("Scalar variable '%s' at %L with POINTER or "
+			 "ALLOCATABLE in procedure '%s' with BIND(C) is not yet"
+			 " supported", sym->name, &(sym->declared_at),
 			 sym->ns->proc_name->name);
 	      retval = false;
 	    }
diff --git a/gcc/testsuite/gfortran.dg/bind_c_array_params.f03 b/gcc/testsuite/gfortran.dg/bind_c_array_params.f03
index 810f642..0e9903c 100644
--- a/gcc/testsuite/gfortran.dg/bind_c_array_params.f03
+++ b/gcc/testsuite/gfortran.dg/bind_c_array_params.f03
@@ -9,7 +9,7 @@  contains
     integer(c_int), dimension(:) :: assumed_array
   end subroutine sub0
 
-  subroutine sub1(deferred_array) bind(c) ! { dg-error "cannot" } 
+  subroutine sub1(deferred_array) bind(c) ! { dg-error "TS 29113: Variable 'deferred_array' at .1. with POINTER attribute in procedure 'sub1' with BIND.C." }
     integer(c_int), pointer :: deferred_array(:)
   end subroutine sub1
 end module bind_c_array_params
--- /dev/null	2013-04-30 09:21:48.687062896 +0200
+++ gcc/gcc/testsuite/gfortran.dg/bind_c_usage_27.f90	2013-04-30 16:13:02.245613916 +0200
@@ -0,0 +1,17 @@ 
+! { dg-do compile }
+! { dg-options "-std=f2008ts" }
+!
+! Contributed by Reinhold Bader
+! 
+use iso_c_binding
+type, bind(C) :: cstruct
+  integer :: i
+end type
+interface
+     subroutine psub(this, that) bind(c, name='Psub')
+       import :: c_float, cstruct
+       real(c_float), pointer  :: this(:)
+       type(cstruct), allocatable  :: that(:)
+     end subroutine psub
+  end interface
+end
--- /dev/null	2013-04-30 09:21:48.687062896 +0200
+++ gcc/gcc/testsuite/gfortran.dg/bind_c_usage_28.f90	2013-04-30 16:23:42.150000958 +0200
@@ -0,0 +1,20 @@ 
+! { dg-do compile }
+! { dg-options "-std=f2008" }
+!
+! Contributed by Reinhold Bader
+! 
+use iso_c_binding
+type, bind(C) :: cstruct
+  integer :: i
+end type
+interface
+     subroutine psub(this) bind(c, name='Psub') ! { dg-error "TS 29113: Variable 'this' at .1. with POINTER attribute in procedure 'psub' with BIND.C." }
+       import :: c_float, cstruct
+       real(c_float), pointer  :: this(:)
+     end subroutine psub
+     subroutine psub2(that) bind(c, name='Psub2') ! { dg-error "TS 29113: Variable 'that' at .1. with ALLOCATABLE attribute in procedure 'psub2' with BIND.C." }
+       import :: c_float, cstruct
+       type(cstruct), allocatable  :: that(:)
+     end subroutine psub2
+  end interface
+end