diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-09-27 00:30:48 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-09-27 00:30:48 +0200 |
commit | d000aa67bc4dce06a1436d6b3fbab8134ce38d34 (patch) | |
tree | f28e0b9963e89079003a4eeca7f1c08e9b8a5a35 /gcc/fortran/module.c | |
parent | 414e8be2b09d9a50d39d8c6d48ebc0a95f6e2040 (diff) | |
download | gcc-d000aa67bc4dce06a1436d6b3fbab8134ce38d34.zip gcc-d000aa67bc4dce06a1436d6b3fbab8134ce38d34.tar.gz gcc-d000aa67bc4dce06a1436d6b3fbab8134ce38d34.tar.bz2 |
re PR fortran/40569 (F2008: Support COMPILER_OPTIONS() / COMPILER_VERSION())
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.
From-SVN: r164639
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r-- | gcc/fortran/module.c | 95 |
1 files changed, 90 insertions, 5 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 5c1e5c7..c90fe0d 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -5207,6 +5207,38 @@ gfc_dump_module (const char *name, int dump_flag) } +static void +create_intrinsic_function (const char *name, gfc_isym_id id, + const char *modname, intmod_id module) +{ + gfc_intrinsic_sym *isym; + gfc_symtree *tmp_symtree; + gfc_symbol *sym; + + tmp_symtree = gfc_find_symtree (gfc_current_ns->sym_root, name); + if (tmp_symtree) + { + if (strcmp (modname, tmp_symtree->n.sym->module) == 0) + return; + gfc_error ("Symbol '%s' already declared", name); + } + + gfc_get_sym_tree (name, gfc_current_ns, &tmp_symtree, false); + sym = tmp_symtree->n.sym; + + isym = gfc_intrinsic_function_by_id (id); + gcc_assert (isym); + + sym->attr.flavor = FL_PROCEDURE; + sym->attr.intrinsic = 1; + + sym->module = gfc_get_string (modname); + sym->attr.use_assoc = 1; + sym->from_intmod = module; + sym->intmod_sym_id = id; +} + + /* Import the intrinsic ISO_C_BINDING module, generating symbols in the current namespace for all named constants, pointer types, and procedures in the module unless the only clause was used or a rename @@ -5252,14 +5284,45 @@ import_iso_c_binding_module (void) { u->found = 1; found = true; - generate_isocbinding_symbol (iso_c_module_name, - (iso_c_binding_symbol) i, - u->local_name); + switch (i) + { +#define NAMED_FUNCTION(a,b,c,d) \ + case a: \ + create_intrinsic_function (u->local_name[0] ? u->local_name \ + : u->use_name, \ + (gfc_isym_id) c, \ + iso_c_module_name, \ + INTMOD_ISO_C_BINDING); \ + break; +#include "iso-c-binding.def" +#undef NAMED_FUNCTION + + default: + generate_isocbinding_symbol (iso_c_module_name, + (iso_c_binding_symbol) i, + u->local_name[0] ? u->local_name + : u->use_name); + } } if (!found && !only_flag) - generate_isocbinding_symbol (iso_c_module_name, - (iso_c_binding_symbol) i, NULL); + switch (i) + { +#define NAMED_FUNCTION(a,b,c,d) \ + case a: \ + if ((gfc_option.allow_std & d) == 0) \ + continue; \ + create_intrinsic_function (b, (gfc_isym_id) c, \ + iso_c_module_name, \ + INTMOD_ISO_C_BINDING); \ + break; +#include "iso-c-binding.def" +#undef NAMED_FUNCTION + + default: + generate_isocbinding_symbol (iso_c_module_name, + (iso_c_binding_symbol) i, NULL); + } } for (u = gfc_rename_list; u; u = u->next) @@ -5367,6 +5430,9 @@ use_iso_fortran_env_module (void) #define NAMED_KINDARRAY(a,b,c,d) { a, b, 0, d }, #include "iso-fortran-env.def" #undef NAMED_KINDARRAY +#define NAMED_FUNCTION(a,b,c,d) { a, b, c, d }, +#include "iso-fortran-env.def" +#undef NAMED_FUNCTION { ISOFORTRANENV_INVALID, NULL, -1234, 0 } }; i = 0; @@ -5448,6 +5514,16 @@ use_iso_fortran_env_module (void) #include "iso-fortran-env.def" #undef NAMED_KINDARRAY +#define NAMED_FUNCTION(a,b,c,d) \ + case a: +#include "iso-fortran-env.def" +#undef NAMED_FUNCTION + create_intrinsic_function (u->local_name[0] ? u->local_name + : u->use_name, + (gfc_isym_id) symbol[i].value, mod, + INTMOD_ISO_FORTRAN_ENV); + break; + default: gcc_unreachable (); } @@ -5491,6 +5567,15 @@ use_iso_fortran_env_module (void) #include "iso-fortran-env.def" #undef NAMED_KINDARRAY +#define NAMED_FUNCTION(a,b,c,d) \ + case a: +#include "iso-fortran-env.def" +#undef NAMED_FUNCTION + create_intrinsic_function (symbol[i].name, + (gfc_isym_id) symbol[i].value, mod, + INTMOD_ISO_FORTRAN_ENV); + break; + default: gcc_unreachable (); } |