User account creation filtered due to spam.

Bug 40568

Summary: F2008: C_SIZEOF rejected as initialization expression
Product: gcc Reporter: Tobias Burnus <burnus>
Component: fortranAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: dfranke, gcc-bugs
Priority: P3 Keywords: accepts-invalid, rejects-valid
Version: 4.5.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2009-07-05 09:19:02
Bug Depends on:    
Bug Blocks: 32630, 39627, 29962    
Attachments: first steps to bring C_SIZEOF to the ISO_C_BINDING

Description Tobias Burnus 2009-06-27 16:05:36 UTC
C_SIZEOF should be a function in ISO_C_BINDING, however, in gfortran it is a normal intrinsic.

Expected:
- The USE statement works
- Using C_SIZEOF should give an error

use iso_c_binding, only: so => c_sizeof
implicit none
print *, c_sizeof(1)
end
Comment 1 Daniel Franke 2009-12-13 16:19:55 UTC
F2008 allows C_SIZEOF in initialization expressions:
The definition for "specification inquiry" is in Fortran 2008 (7.1.11
Specification expression):
"A specication inquiry is a reference to
(1) an intrinsic inquiry function,
[...]
(4) the function C_SIZEOF from the intrinsic module ISO C BINDING (15.2.3.7)"
 
Currently C_SIZEOF is rejected as init expression as it is not listed as valid inquiry function, neither is CLASS_INQUIRY in intrinsic.c(add_functions) set.
Comment 2 Daniel Franke 2010-05-02 15:21:23 UTC
See also PR36437.
Comment 3 Daniel Franke 2010-05-09 18:11:07 UTC
Created attachment 20612 [details]
first steps to bring C_SIZEOF to the ISO_C_BINDING

Attached patch is a start only. Comments:
 * symbol.c (build_formal_args): wrong parameter generated, probably needs a new gen_*_param function
 * on -std=f2003 there's only a linker error (undefined reference), no F2008-only warning
 * simplification/translation needs to be hijacked from sizeof
Comment 4 Tobias Burnus 2010-06-23 16:45:15 UTC
Cf. PR 40569 for two other module procedures of ISO_C_BINDING
Comment 5 Tobias Burnus 2010-09-25 22:42:38 UTC
Patch for the issue in comment 0: http://gcc.gnu.org/ml/fortran/2010-09/msg00455.html

TODO: Issue mentioned in comment 1: C_SIZEOF in init expressions.
Comment 6 Tobias Burnus 2010-09-26 22:30:52 UTC
Author: burnus
Date: Sun Sep 26 22:30:48 2010
New Revision: 164639

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164639
Log:
2010-09-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * intrinsic.h (gfc_simplify_compiler_options,
        gfc_simplify_compiler_version): New prototypes.
        * intrinsic.c (gfc_intrinsic_function_by_id,
        make_from_module): New functions.
        (gfc_find_function, gfc_find_subroutine, gfc_generic_intrinsic,
        gfc_specific_intrinsic): Don't return module intrinsics.
        (add_functions): Add compiler_options, compiler_version.
        (gfc_intrinsic_func_interface): Also lookup symbol by ISYM ID.
        * symbol.c (std_for_isocbinding_symbol): Add version check for
        NAMED_FUNCTIONS.
        * iso-fortran-env.def: Add compiler_options, compiler_version.
        * iso-c-binding.def: Add c_sizeof.
        * gfortran.h (gfc_intrinsic_sym): Add from_module:1.
        (iso_c_binding_symbol, iso_fortran_env_symbol): Add NAMED_FUNCTIONS.
        (gfc_intrinsic_function_by_id): New prototype.
        * module.c (create_intrinsic_function): New function.
        (import_iso_c_binding_module, use_iso_fortran_env_module): Use it.
        * trans-types.c (init_c_interop_kinds): Add NAMED_FUNCTIONS.
        * resolve.c (resolve_intrinsic): Try also to resolve intrinsics
        by ISYM ID.
        * simplify.c (gfc_simplify_compiler_options,
        gfc_simplify_compiler_version): New functions.

2010-09-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * gfortran.dg/storage_size_2.f08: Fix test.
        * gfortran.dg/c_sizeof_1.f90: Fix test.
        * gfortran.dg/c_sizeof_2.f90: Update dg-error.
        * gfortran.dg/c_sizeof_3.f90: New.
        * gfortran.dg/c_sizeof_4.f90: New.
        * gfortran.dg/iso_c_binding_compiler_1.f90: New.
        * gfortran.dg/iso_c_binding_compiler_2.f90: New.


Added:
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_3.f90
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_4.f90
    trunk/gcc/testsuite/gfortran.dg/iso_c_binding_compiler_1.f90
    trunk/gcc/testsuite/gfortran.dg/iso_c_binding_compiler_2.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/intrinsic.c
    trunk/gcc/fortran/intrinsic.h
    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/simplify.c
    trunk/gcc/fortran/symbol.c
    trunk/gcc/fortran/trans-types.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_1.f90
    trunk/gcc/testsuite/gfortran.dg/c_sizeof_2.f90
    trunk/gcc/testsuite/gfortran.dg/storage_size_2.f08
Comment 7 Tobias Burnus 2010-09-26 22:36:14 UTC
The bug of comment 0 is fixed - I have thus updated the summary.

TODO: Issue mentioned in comment 1:
- Documentation fixes (cf. .texi part of the patch in attachment 20612 [details])
- Function is CLASS_INQUIRY
- ?
Comment 8 Tobias Burnus 2010-09-28 07:44:13 UTC
And expr.c's check_inquiry needs to be updated. I think except for some F95 vs. newer checks, most items should be handled via flags in add_symbol (intrinsic.c) as one easily forgets to update that file ...
Comment 9 Tobias Burnus 2010-09-28 19:51:43 UTC
Author: burnus
Date: Tue Sep 28 19:51:38 2010
New Revision: 164698

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164698
Log:
gcc/
2010-09-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * toplev.h (save_decoded_options, save_decoded_options_count):
        New global variables.
        * toplev.c (save_decoded_options, save_decoded_options_count):
        export variables.

gcc/fortran/
2010-09-28  Tobias Burnus  <burnus@net-b.de>

        PR fortran/40569
        PR fortran/40568
        * intrinsic.c (add_functions): Make compiler_version and
        compiler_options CLASS_INQUIRY.
        * gfortran.h (gfc_get_option_string): New prototype.
        * intrinsic.texi (COMPILER_VERSION, COMPILER_OPTIONS):
        Add documentation.
        (C_SIZEOF): Mark as inquiry function of ISO_C_BINDING.
        (ISO_FORTRAN_ENV): Refer to COMPILER_VERSION and COMPILER_OPTIONS.
        (ISO_C_BINDING): Refer to C_SIZEOF.
        * options.c (gfc_get_option_string): New function.
        * simplify.c (gfc_simplify_compiler_options): Use it.
        (gfc_simplify_compiler_version): Include compiler name.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/intrinsic.c
    trunk/gcc/fortran/intrinsic.texi
    trunk/gcc/fortran/options.c
    trunk/gcc/fortran/simplify.c
    trunk/gcc/toplev.c
    trunk/gcc/toplev.h
Comment 10 Tobias Burnus 2010-09-28 19:53:01 UTC
Close as FIXED (for 4.6).


Separately tracked follow ups:

For simplify of array valued arguments, cf. PR36437.

For updating check_inquiry, cf. PR 45824.
Comment 11 Tobias Burnus 2010-09-28 19:55:45 UTC
Really mark as FIXED.