Fortran 2008 adds the two inquiry subroutines, which return a string. In GCC the version string is in "version.h": extern const char version_string[]; The options string has to constructed manually; the question is whether one wants to skip certain options. Optimally, one would record exactly those options passed to "gfortran" and not all those options passed to "f951". The middle end has -frecord-gcc-switches and -fverbose-asm; cf. toplev.c's print_switch_values.
Do not forget to update intrinsic.texi! For the missing constants in ISO_FORTRAN_ENV, see PR 40571
Cf. PR 40568 for "C_SIZEOF", a F2008 module procedure of ISO_C_BINDING
First part of an implementation. TODO: (a) Use a module rather than the normal name space. (b) Get the command line options; cf. http://gcc.gnu.org/ml/gcc-patches/2010-09/msg02006.html --- intrinsic.c (Revision 164618) +++ intrinsic.c (Arbeitskopie) @@ -2613,0 +2615,6 @@ add_functions (void) + +/* MOVE TO MODULE: ISO_FORTRAN_ENV. */ + add_sym_0 ("compiler_options", GFC_ISYM_COMPILER_VERSION, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER, + 1, GFC_STD_F2008, NULL, gfc_simplify_compiler_options, NULL); + add_sym_0 ("compiler_version", GFC_ISYM_COMPILER_VERSION, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER, + 1, GFC_STD_F2008, NULL, gfc_simplify_compiler_version, NULL); --- simplify.c (Revision 164618) +++ simplify.c @@ -29,2 +29,3 @@ along with GCC; see the file COPYING3. #include "constructor.h" +#include "version.h" /* For version_string. */ @@ -6735 +6736,17 @@ gfc_convert_char_constant (gfc_expr *e, } + + +gfc_expr * +gfc_simplify_compiler_options (void) +{ + return NULL; +} + + +gfc_expr * +gfc_simplify_compiler_version (void) +{ + return gfc_get_character_expr (gfc_default_character_kind, + &gfc_current_locus, version_string, + strlen (version_string)); +}
Patch: http://gcc.gnu.org/ml/fortran/2010-09/msg00455.html
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
Basic implementation works. Remains to do: (a) COMPILER_OPTIONS(): Return a more useful string than "" (b) "-Wall" gives a bogus warning: Warning: Type specified for intrinsic function 'compiler_version' at (1) is ignored for use iso_fortran_env, only: compiler_version print *,compiler_version() end
(In reply to comment #6) > Basic implementation works. Remains to do: ... (c) CLASS_INQUIRY instead of CLASS_IMPURE?
(In reply to comment #7) > (In reply to comment #6) > > Basic implementation works. Remains to do: > ... > (c) CLASS_INQUIRY instead of CLASS_IMPURE? (d) Documentation in intrinsic.texi
this is nice... can this be used in an initialization expression ? MODULE X CHARACTER(LEN=100), PARAMETER :: module_compile_info=compiler_version()//compiler_options() END MODULE
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
Close as FIXED (for 4.6). Separately tracked follow ups: For updating check_inquiry, cf. PR 45824. For the bogus warning, cf. PR 45823 (In reply to comment #9) > this is nice... can this be used in an initialization expression ? > > CHARACTER(LEN=100), PARAMETER :: module_compile_info = & > compiler_version()//compiler_options() Yes, but you need to add "use iso_fortran_env".
Really mark as FIXED.