+2011-01-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/38536
+ * resolve.c (gfc_iso_c_func_interface): For C_LOC,
+ check for array sections followed by component references
+ which are illegal. Also check for coindexed arguments.
+
2011-01-22 Tobias Burnus <burnus@net-b.de>
PR fortran/47399
}
else if (sym->intmod_sym_id == ISOCBINDING_LOC)
{
+ gfc_ref *ref;
+ bool seen_section;
+
/* Make sure we have either the target or pointer attribute. */
if (!arg_attr.target && !arg_attr.pointer)
{
retval = FAILURE;
}
+ if (gfc_is_coindexed (args->expr))
+ {
+ gfc_error_now ("Coindexed argument not permitted"
+ " in '%s' call at %L", name,
+ &(args->expr->where));
+ retval = FAILURE;
+ }
+
+ /* Follow references to make sure there are no array
+ sections. */
+ seen_section = false;
+
+ for (ref=args->expr->ref; ref; ref = ref->next)
+ {
+ if (ref->type == REF_ARRAY)
+ {
+ if (ref->u.ar.type == AR_SECTION)
+ seen_section = true;
+
+ if (ref->u.ar.type != AR_ELEMENT)
+ {
+ gfc_ref *r;
+ for (r = ref->next; r; r=r->next)
+ if (r->type == REF_COMPONENT)
+ {
+ gfc_error_now ("Array section not permitted"
+ " in '%s' call at %L", name,
+ &(args->expr->where));
+ retval = FAILURE;
+ break;
+ }
+ }
+ }
+ }
+
+ if (seen_section && retval == SUCCESS)
+ gfc_warning ("Array section in '%s' call at %L", name,
+ &(args->expr->where));
+
/* See if we have interoperable type and type param. */
if (verify_c_interop (arg_ts) == SUCCESS
|| gfc_check_any_c_kind (arg_ts) == SUCCESS)
+2011-01-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/38536
+ * gfortran.dg/c_loc_tests_16.f90: New test.
+
2011-01-22 Tobias Burnus <burnus@net-b.de>
PR fortran/47399
PR tree-optimization/47053
* g++.dg/pr47053.C: New test.
-
+
2011-01-21 Jason Merrill <jason@redhat.com>
PR c++/47041
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+! PR 38536 - array sections as arguments to c_loc are illegal.
+ use iso_c_binding
+ type, bind(c) :: t1
+ integer(c_int) :: i(5)
+ end type t1
+ type, bind(c):: t2
+ type(t1) :: t(5)
+ end type t2
+ type, bind(c) :: t3
+ type(t1) :: t(5,5)
+ end type t3
+
+ type(t2), target :: tt
+ type(t3), target :: ttt
+ integer(c_int), target :: n(3)
+ integer(c_int), target :: x[*]
+ type(C_PTR) :: p
+
+ p = c_loc(tt%t%i(1)) ! { dg-error "Array section not permitted" }
+ p = c_loc(n(1:2)) ! { dg-warning "Array section" }
+ p = c_loc(ttt%t(5,1:2)%i(1)) ! { dg-error "Array section not permitted" }
+ p = c_loc(x[1]) ! { dg-error "Coindexed argument not permitted" }
+ end