C_F_POINTER wrongly accepts a SHAPE= for scalar pointers use iso_c_binding type(c_ptr) :: cp integer, pointer :: p call c_f_pointer (cp, p, shape=[2]) end
Something like the following should do. --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -3544,3 +3547,12 @@ gfc_iso_c_sub_interface (gfc_code *c, gfc_symbol *sym) gfc_procedure_use() (called above to sort actual args). */ - if (c->ext.actual->next->expr->rank != 0) + if (c->ext.actual->next->next + && c->ext.actual->next->next->expr + && c->ext.actual->next->expr->rank == 0) + { + gfc_error ("Unexpected SHAPE argument at %L with scalar FPTR " + "in call to C_F_POINTER", + &c->ext.actual->next->next->expr->where); + m = MATCH_ERROR; + } + else if (c->ext.actual->next->expr->rank != 0) {
Author: burnus Date: Mon Mar 25 15:40:26 2013 New Revision: 197053 URL: http://gcc.gnu.org/viewcvs?rev=197053&root=gcc&view=rev Log: 2013-03-25 Tobias Burnus <burnus@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 <burnus@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 * gfortran.dg/c_assoc_2.f03: Update dg-error wording. * gfortran.dg/c_f_pointer_shape_test.f90: Ditto. * gfortran.dg/c_f_pointer_shape_tests_3.f03: Ditto. * gfortran.dg/c_f_pointer_tests_5.f90: Ditto. * gfortran.dg/c_funloc_tests_2.f03: Ditto. * gfortran.dg/c_funloc_tests_5.f03: Ditto. * gfortran.dg/c_funloc_tests_6.f90: Ditto. * gfortran.dg/c_loc_tests_10.f03: Add -std=f2008. * gfortran.dg/c_loc_tests_11.f03: Ditto, update dg-error. * gfortran.dg/c_loc_tests_16.f90: Ditto. * gfortran.dg/c_loc_tests_4.f03: Ditto. * gfortran.dg/c_loc_tests_15.f90: Update dg-error wording. * gfortran.dg/c_loc_tests_3.f03: Valid since F2003 TC5. * gfortran.dg/c_loc_tests_8.f03: Ditto. * gfortran.dg/c_ptr_tests_14.f90: Update scan-tree-dump-times. * gfortran.dg/c_ptr_tests_15.f90: Ditto. * gfortran.dg/c_sizeof_1.f90: Fix invalid code. * gfortran.dg/iso_c_binding_init_expr.f03: Update dg-error wording. * gfortran.dg/pr32601_1.f03: Ditto. * gfortran.dg/storage_size_2.f08: Remove dg-error. * gfortran.dg/blockdata_7.f90: New. * gfortran.dg/c_assoc_4.f90: New. * gfortran.dg/c_f_pointer_tests_6.f90: New. * gfortran.dg/c_f_pointer_tests_7.f90: New. * gfortran.dg/c_funloc_tests_8.f90: New. * gfortran.dg/c_loc_test_17.f90: New. * gfortran.dg/c_loc_test_18.f90: New. * gfortran.dg/c_loc_test_19.f90: New. * gfortran.dg/c_loc_test_20.f90: New. * gfortran.dg/c_sizeof_5.f90: New. * gfortran.dg/iso_c_binding_rename_3.f90: New. * gfortran.dg/transfer_resolve_2.f90: New. * gfortran.dg/transfer_resolve_3.f90: New. * gfortran.dg/transfer_resolve_4.f90: New. * gfortran.dg/pr32601.f03: Update dg-error. * gfortran.dg/c_ptr_tests_13.f03: Update dg-error. * gfortran.dg/c_ptr_tests_9.f03: Fix test case. Added: trunk/gcc/testsuite/gfortran.dg/blockdata_7.f90 trunk/gcc/testsuite/gfortran.dg/c_assoc_4.f90 trunk/gcc/testsuite/gfortran.dg/c_f_pointer_tests_6.f90 trunk/gcc/testsuite/gfortran.dg/c_f_pointer_tests_7.f90 trunk/gcc/testsuite/gfortran.dg/c_funloc_tests_8.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_test_17.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_test_18.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_test_19.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_test_20.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_tests_17.f90 trunk/gcc/testsuite/gfortran.dg/c_sizeof_5.f90 trunk/gcc/testsuite/gfortran.dg/iso_c_binding_rename_3.f90 trunk/gcc/testsuite/gfortran.dg/transfer_resolve_2.f90 trunk/gcc/testsuite/gfortran.dg/transfer_resolve_3.f90 trunk/gcc/testsuite/gfortran.dg/transfer_resolve_4.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/check.c trunk/gcc/fortran/expr.c trunk/gcc/fortran/gfortran.h trunk/gcc/fortran/intrinsic.c trunk/gcc/fortran/intrinsic.h trunk/gcc/fortran/iresolve.c trunk/gcc/fortran/iso-c-binding.def trunk/gcc/fortran/iso-fortran-env.def trunk/gcc/fortran/module.c trunk/gcc/fortran/resolve.c trunk/gcc/fortran/symbol.c trunk/gcc/fortran/target-memory.c trunk/gcc/fortran/trans-expr.c trunk/gcc/fortran/trans-intrinsic.c trunk/gcc/fortran/trans-io.c trunk/gcc/fortran/trans-types.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/c_assoc_2.f03 trunk/gcc/testsuite/gfortran.dg/c_f_pointer_shape_test.f90 trunk/gcc/testsuite/gfortran.dg/c_f_pointer_shape_tests_3.f03 trunk/gcc/testsuite/gfortran.dg/c_f_pointer_tests_5.f90 trunk/gcc/testsuite/gfortran.dg/c_funloc_tests_2.f03 trunk/gcc/testsuite/gfortran.dg/c_funloc_tests_5.f03 trunk/gcc/testsuite/gfortran.dg/c_funloc_tests_6.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_15.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_tests_16.f90 trunk/gcc/testsuite/gfortran.dg/c_loc_tests_3.f03 trunk/gcc/testsuite/gfortran.dg/c_loc_tests_4.f03 trunk/gcc/testsuite/gfortran.dg/c_loc_tests_8.f03 trunk/gcc/testsuite/gfortran.dg/c_ptr_tests_13.f03 trunk/gcc/testsuite/gfortran.dg/c_ptr_tests_14.f90 trunk/gcc/testsuite/gfortran.dg/c_ptr_tests_15.f90 trunk/gcc/testsuite/gfortran.dg/c_ptr_tests_9.f03 trunk/gcc/testsuite/gfortran.dg/c_sizeof_1.f90 trunk/gcc/testsuite/gfortran.dg/iso_c_binding_init_expr.f03 trunk/gcc/testsuite/gfortran.dg/pr32601.f03 trunk/gcc/testsuite/gfortran.dg/pr32601_1.f03 trunk/gcc/testsuite/gfortran.dg/storage_size_2.f08
FIXED on the 4.9 trunk.