[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-04 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



--- Comment #9 from Tobias Burnus burnus at gcc dot gnu.org 2013-04-04 
07:37:01 UTC ---

Author: burnus

Date: Thu Apr  4 07:22:24 2013

New Revision: 197468



URL: http://gcc.gnu.org/viewcvs?rev=197468root=gccview=rev

Log:

2013-04-04  Tobias Burnus  bur...@net-b.de



PR fortran/50269

* gcc/fortran/check.c (is_c_interoperable,

gfc_check_c_loc): Correct c_loc array checking

for Fortran 2003 and Fortran 2008.



2013-04-04  Tobias Burnus  bur...@net-b.de



PR fortran/50269

* gfortran.dg/c_loc_test_21.f90: New.

* gfortran.dg/c_loc_test_19.f90: Update dg-error.

* gfortran.dg/c_loc_tests_10.f03: Update dg-error.

* gfortran.dg/c_loc_tests_11.f03: Update dg-error.

* gfortran.dg/c_loc_tests_4.f03: Update dg-error.

* gfortran.dg/c_loc_tests_16.f90:  Update dg-error.





Added:

trunk/gcc/testsuite/gfortran.dg/c_loc_test_21.f90

Modified:

trunk/gcc/fortran/ChangeLog

trunk/gcc/fortran/check.c

trunk/gcc/testsuite/ChangeLog

trunk/gcc/testsuite/gfortran.dg/c_loc_test_19.f90

trunk/gcc/testsuite/gfortran.dg/c_loc_tests_10.f03

trunk/gcc/testsuite/gfortran.dg/c_loc_tests_11.f03

trunk/gcc/testsuite/gfortran.dg/c_loc_tests_16.f90

trunk/gcc/testsuite/gfortran.dg/c_loc_tests_4.f03


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-04 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



Tobias Burnus burnus at gcc dot gnu.org changed:



   What|Removed |Added



 Status|NEW |RESOLVED

 Resolution||FIXED



--- Comment #10 from Tobias Burnus burnus at gcc dot gnu.org 2013-04-04 
07:41:20 UTC ---

FIXED on the 4.9 trunk.



I have now updated some constraint checks, hopefully, -std=f2003/f2008/f2008ts

are now handled correctly.





Missing is a check whether the argument is not contiguous. But that's tracked

elsewhere. (Note: The standard does not demand simply contiguous but only

contiguous arrays - thus, the compiler can only reject simple-to-detect

noncontiguous arrays.)


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-02 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



Tobias Burnus burnus at gcc dot gnu.org changed:



   What|Removed |Added



 Status|RESOLVED|NEW

   Last reconfirmed||2013-04-02

 Resolution|FIXED   |

 Ever Confirmed|0   |1



--- Comment #7 from Tobias Burnus burnus at gcc dot gnu.org 2013-04-02 
07:52:26 UTC ---

REOPEN



(In reply to comment #5)

 Is this going to be ported back to earlier releases? It's kind of a biggie for

 me...



Probably not - it is a rather large change - and, hence, it might cause

regressions.





(In reply to comment #6)

 Are we sure? When running the code example given in comment #1, I get a

 segfault.



Yes, something seems to be still broken.





 Moreover, the following subroutine won't compile when using the '-std=f2008'

 flag:

   real, intent(in), contiguous, target :: a(:)

   b = C_LOC(a)

 

 The error message is:

 test_contig.f90:9.12:

   b = C_LOC(a)

 1

 Error: TS 29113: Noninteroperable array at (1) as argument to C_LOC: Only

 explicit-size and assumed-size arrays are interoperable

 

 My understanding of the F2008 standard is that assumed-shape arrays with the

 contiguous attribute are interoperable





Well, Fortran 2008 has:



A Fortran variable that is a named array is interoperable if and only if its

type and type parameters are interoperable, it is not a coarray, it is of

explicit shape or assumed size, and if it is of type character its length is

not

^^

assumed or declared by an expression that is not a constant expression.

(15.3.6 Interoperability of array variables)





Thus, it is definitely not interoperable. But the real question is whether it

is permitted for C_LOC. From 15.2.3.6 C_LOC(X):



Argument. X shall have either the POINTER or TARGET attribute. It shall not be

a coindexed object. It shall either be a variable with interoperable type and

kind type parameters, or be a scalar, nonpolymorphic variable with no length

type parameters. If it is allocatable, it shall be allocated. If it is a

pointer, it shall be associated. If it is an array, it shall be contiguous and

have nonzero size. It shall not be a zero-length string.







I think the crucial part is: with interoperable type and kind type parameter

- which is different to the other intrinsics, which require an interoperable

data entity. Thus, it seems to be permitted in C_LOC.





Thanks for testing.


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-02 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



--- Comment #8 from Tobias Burnus burnus at gcc dot gnu.org 2013-04-02 
13:28:00 UTC ---

(In reply to comment #7)

 (In reply to comment #6)

  Are we sure? When running the code example given in comment #1, I get a

  segfault.

 Yes, something seems to be still broken.



Actually, the compiler generates the correct code. The problem with the test

case of comment 0 and comment 1 is that b is a pointer but never allocated.



It works if one either removes pointer from the declaration of b or adds an

allocate(b).


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-01 Thread townsend at astro dot wisc.edu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



Rich Townsend townsend at astro dot wisc.edu changed:



   What|Removed |Added



 CC||townsend at astro dot

   ||wisc.edu



--- Comment #5 from Rich Townsend townsend at astro dot wisc.edu 2013-04-01 
15:30:54 UTC ---

(In reply to comment #4)

 FIXED on the 4.9 trunk.



Is this going to be ported back to earlier releases? It's kind of a biggie for

me...


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-04-01 Thread townsend at astro dot wisc.edu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



--- Comment #6 from Rich Townsend townsend at astro dot wisc.edu 2013-04-01 
22:24:35 UTC ---

(In reply to comment #4)

 FIXED on the 4.9 trunk.



Are we sure? When running the code example given in comment #1, I get a

segfault.



Moreover, the following subroutine won't compile when using the '-std=f2008'

flag:



subroutine test_contig (a)

  use ISO_C_BINDING

  real, intent(in), contiguous, target :: a(:)

  type(C_PTR) :: b

  b = C_LOC(a)

end subroutine test_contig



The error message is:



test_contig.f90:9.12:



  b = C_LOC(a)

1

Error: TS 29113: Noninteroperable array at (1) as argument to C_LOC: Only

explicit-size and assumed-size arrays are interoperable



My understanding of the F2008 standard is that assumed-shape arrays with the

contiguous attribute are interoperable -- hence, I'm not sure this error

message is correct. If I change the std flag to f2008ts, then the routine

compiles OK; but the TS extension shouldn't be required here.



gfortran -v:



Using built-in specs.

COLLECT_GCC=/Applications/madsdk/bin/gfortran.exec

COLLECT_LTO_WRAPPER=/Applications/madsdk/libexec/gcc/x86_64-apple-darwin11.4.2/4.9.0/lto-wrapper

Target: x86_64-apple-darwin11.4.2

Configured with: ./configure CC='gcc -D_FORTIFY_SOURCE=0'

--build=x86_64-apple-darwin11.4.2 --prefix=/Applications/madsdk

--with-gmp=/Applications/madsdk --with-mpfr=/Applications/madsdk

--with-mpc=/Applications/madsdk --enable-languages=c,c++,fortran

--disable-multilib

Thread model: posix

gcc version 4.9.0 20130401 (experimental) (GCC)


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-03-25 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



Tobias Burnus burnus at gcc dot gnu.org changed:



   What|Removed |Added



 CC||burnus at gcc dot gnu.org



--- Comment #3 from Tobias Burnus burnus at gcc dot gnu.org 2013-03-25 
15:53:57 UTC ---

Author: burnus

Date: Mon Mar 25 15:40:26 2013

New Revision: 197053



URL: http://gcc.gnu.org/viewcvs?rev=197053root=gccview=rev

Log:

2013-03-25  Tobias Burnus  bur...@net-b.de



PR fortran/38536

PR fortran/38813

PR fortran/38894

PR fortran/39288

PR fortran/40963

PR fortran/45824

PR fortran/47023

PR fortran/47034

PR fortran/49023

PR fortran/50269

PR fortran/50612

PR fortran/52426

PR fortran/54263

PR fortran/55343

PR fortran/55444

PR fortran/55574

PR fortran/56079

PR fortran/56378

* check.c (gfc_var_strlen): Properly handle 0-sized string.

(gfc_check_c_sizeof): Use is_c_interoperable, add checks.

(is_c_interoperable, gfc_check_c_associated, gfc_check_c_f_pointer,

gfc_check_c_f_procpointer, gfc_check_c_funloc, gfc_check_c_loc): New

functions.

* expr.c (check_inquiry): Add c_sizeof, compiler_version and

compiler_options.

(gfc_check_pointer_assign): Refine function result check.

gfortran.h (gfc_isym_id): Add GFC_ISYM_C_ASSOCIATED,

GFC_ISYM_C_F_POINTER, GFC_ISYM_C_F_PROCPOINTER, GFC_ISYM_C_FUNLOC,

GFC_ISYM_C_LOC.

(iso_fortran_env_symbol, iso_c_binding_symbol): Handle

NAMED_SUBROUTINE.

(generate_isocbinding_symbol): Update prototype.

(get_iso_c_sym): Remove.

(gfc_isym_id_by_intmod, gfc_isym_id_by_intmod_sym): New prototypes.

* intrinsic.c (gfc_intrinsic_subroutine_by_id): New function.

(gfc_intrinsic_sub_interface): Use it.

(add_functions, add_subroutines): Add missing C-binding intrinsics.

(gfc_intrinsic_func_interface): Add special case for c_loc.

gfc_isym_id_by_intmod, gfc_isym_id_by_intmod_sym): New functions.

(gfc_intrinsic_func_interface, gfc_intrinsic_sub_interface): Use them.

* intrinsic.h (gfc_check_c_associated, gfc_check_c_f_pointer,

gfc_check_c_f_procpointer, gfc_check_c_funloc, gfc_check_c_loc,

gfc_resolve_c_loc, gfc_resolve_c_funloc): New prototypes.

* iresolve.c (gfc_resolve_c_loc, gfc_resolve_c_funloc): New

functions.

* iso-c-binding.def: Split PROCEDURE into NAMED_SUBROUTINE and

NAMED_FUNCTION.

* iso-fortran-env.def: Add NAMED_SUBROUTINE for completeness.

* module.c (create_intrinsic_function): Support subroutines and

derived-type results.

(use_iso_fortran_env_module): Update calls.

(import_iso_c_binding_module): Ditto; update calls to

generate_isocbinding_symbol.

* resolve.c (find_arglists): Skip for intrinsic symbols.

(gfc_resolve_intrinsic): Find intrinsic subs via id.

(is_scalar_expr_ptr, gfc_iso_c_func_interface,

set_name_and_label, gfc_iso_c_sub_interface): Remove.

(resolve_function, resolve_specific_s0): Remove calls to those.

(resolve_structure_cons): Fix handling.

* symbol.c (gen_special_c_interop_ptr): Update c_ptr/c_funptr

generation.

(gen_cptr_param, gen_fptr_param, gen_shape_param,

build_formal_args, get_iso_c_sym): Remove.

(std_for_isocbinding_symbol): Handle NAMED_SUBROUTINE.

(generate_isocbinding_symbol): Support hidden symbols and

using c_ptr/c_funptr symtrees for nullptr defs.

* target-memory.c (gfc_target_encode_expr): Fix handling

of c_ptr/c_funptr.

* trans-expr.c (conv_isocbinding_procedure): Remove.

(gfc_conv_procedure_call): Remove call to it.

(gfc_trans_subcomponent_assign, gfc_conv_expr): Update handling

of c_ptr/c_funptr.

* trans-intrinsic.c (conv_isocbinding_function,

conv_isocbinding_subroutine): New.

(gfc_conv_intrinsic_function, gfc_conv_intrinsic_subroutine):

Call them.

* trans-io.c (transfer_expr): Fix handling of c_ptr/c_funptr.

* trans-types.c (gfc_typenode_for_spec,

gfc_get_derived_type): Ditto.

(gfc_init_c_interop_kinds): Handle NAMED_SUBROUTINE.



2013-03-25  Tobias Burnus  bur...@net-b.de



PR fortran/38536

PR fortran/38813

PR fortran/38894

PR fortran/39288

PR fortran/40963

PR fortran/45824

PR fortran/47023

PR fortran/47034

PR fortran/49023

PR fortran/50269

PR fortran/50612

PR fortran/52426

PR fortran/54263

PR 

[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2013-03-25 Thread burnus at gcc dot gnu.org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269



Tobias Burnus burnus at gcc dot gnu.org changed:



   What|Removed |Added



 Status|UNCONFIRMED |RESOLVED

 Resolution||FIXED



--- Comment #4 from Tobias Burnus burnus at gcc dot gnu.org 2013-03-25 
17:49:21 UTC ---

FIXED on the 4.9 trunk.


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2011-09-01 Thread kargl at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269

kargl at gcc dot gnu.org changed:

   What|Removed |Added

 CC||kargl at gcc dot gnu.org

--- Comment #1 from kargl at gcc dot gnu.org 2011-09-01 20:24:42 UTC ---
This allows the code to compile, but one then gets a segfault
or the right answer depending on memory layout.  I think
trans-expr.c(conv_isocbinding_procedure) needs to be updated
as well, but don't know what needs to be done (yet).

Index: resolve.c
===
--- resolve.c   (revision 178329)
+++ resolve.c   (working copy)
@@ -2809,7 +2809,8 @@ gfc_iso_c_func_interface (gfc_symbol *sy
 interoperable.  */
  if (args_sym  args_sym-attr.dimension)
{
- if (args_sym-as-type == AS_ASSUMED_SHAPE)
+ if (args_sym-as-type == AS_ASSUMED_SHAPE
+  args-expr-ref-u.ar.type != AR_ELEMENT)
{
  gfc_error (Assumed-shape array '%s' at %L 
 cannot be an argument to the 


troutmask:sgk[215] gfc4x -o z foo.f90  ./z
 Calling test()
c_loc(aa)  = 140737488344288
troutmask:sgk[216] gfc4x -o z foo.f90  ./z
Segmentation fault (core dumped)

program gf
   use iso_c_binding
   real(c_double), dimension(1:10), target :: a
!   a = 42
!   print *, 'Calling test()'
   call test(a)
   contains
  subroutine test(aa)
real(c_double), dimension(:), target :: aa
type(c_ptr), pointer :: b
b = c_loc(aa(1))
print '(A,I0)', 'c_loc(aa)  = ', b
  end subroutine test
end program gf


[Bug fortran/50269] Wrongly rejects element of assumed-shape array in C_LOC

2011-09-01 Thread burnus at gcc dot gnu.org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50269

--- Comment #2 from Tobias Burnus burnus at gcc dot gnu.org 2011-09-01 
21:10:05 UTC ---
(In reply to comment #1)
 This allows the code to compile, but one then gets a segfault
 or the right answer depending on memory layout.  I think
 trans-expr.c(conv_isocbinding_procedure) needs to be updated
 as well, but don't know what needs to be done (yet).

It might be that it accesses the descriptor instead of desc.data.


 - if (args_sym-as-type == AS_ASSUMED_SHAPE)
 + if (args_sym-as-type == AS_ASSUMED_SHAPE
 +  args-expr-ref-u.ar.type != AR_ELEMENT)
 {
   gfc_error (Assumed-shape array '%s' at %L 
  cannot be an argument to the 

I think one should use the opportunity to update it to Fortran 2008, which
allows also assumed/deferred-shape arrays - if they are contiguous:

F2008, 15.2.3.6 C LOC (X):

Argument. X shall have either the POINTER or TARGET attribute. It shall not be
a coindexed object. It shall either be a variable with interoperable type and
kind type parameters, or be a scalar, nonpolymorphic variable with no length
type parameters. If it is allocatable, it shall be allocated. If it is a
pointer, it shall be associated. If it is an array, it shall be contiguous and
have nonzero size. It shall not be a zero-length string.


Note: It talks about contiguous and not simply contiguous, which means that
it is not compile-time checkable (unless strides are used or a vector index). I
think there is also a coindexed check missing.


Fortran 2003 had in 15.1.2.5 C LOC (X):

Argument. X shall either
 (1) have interoperable type and type parameters and be
   (a) a variable that has the TARGET attribute and is interoperable,
   (b) an allocated allocatable variable that has the TARGET attribute
   and is not an array of zero size, or
   (c) an associated scalar pointer, or
 (2) be a nonpolymorphic scalar, have no length type parameters, and be
   (a) a nonallocatable, nonpointer variable that has the TARGET attribute,
   (b) an allocated allocatable variable that has the TARGET attribute, or
   (c) an associated pointer.