diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-09-24 07:42:03 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-09-24 07:42:03 +0200 |
commit | be1f1ed97b2e41073dc1775d6f13e7597eb22664 (patch) | |
tree | 7fc5f24d161e97648b35a60ab0f7dcfe64b15cf2 /gcc/fortran/trans-decl.c | |
parent | 2b3a48378862f67ffea656516857c1517dae7658 (diff) | |
download | gcc-be1f1ed97b2e41073dc1775d6f13e7597eb22664.zip gcc-be1f1ed97b2e41073dc1775d6f13e7597eb22664.tar.gz gcc-be1f1ed97b2e41073dc1775d6f13e7597eb22664.tar.bz2 |
re PR fortran/40571 (F2008: ISO_FORTRAN_ENV: Missing constants)
2010-09-24 Tobias Burnus <burnus@net-b.de>
PR fortran/40571
* iso-fortran-env.def: Add NAMED_KINDARRAY with
character_kinds, integer_kinds, logical_kinds and
real_kinds.
* gfortran.h: Add them to iso_fortran_env_symbol.
* libgfortran.h: Rename GFC_INQUIRE_INTERNAL_UNIT to
LIBERROR_INQUIRE_INTERNAL_UNIT and move it from
libgfortran_stat_codes to libgfortran_error_codes.
* module.c (create_int_parameter_array): New function.
(use_iso_fortran_env_module): Use it for
NAMED_KINDARRAY of iso-fortran-env.def.
* trans-decl.c (gfc_get_symbol_decl): Parameter
arrays of intrinsics modules become local static variables.
* intrinsic.texi (ISO_FORTRAN_ENV): Add character_kinds,
integer_kinds, logical_kinds and real_kinds.
2010-09-24 Tobias Burnus <burnus@net-b.de>
PR fortran/40571
* gfortran.dg/iso_fortran_env_7.f90: New.
From-SVN: r164581
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 0ff297f..d15d673 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1044,6 +1044,7 @@ gfc_get_symbol_decl (gfc_symbol * sym) tree length = NULL_TREE; tree attributes; int byref; + bool intrinsic_array_parameter = false; gcc_assert (sym->attr.referenced || sym->attr.use_assoc @@ -1181,6 +1182,12 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (sym->attr.intrinsic) internal_error ("intrinsic variable which isn't a procedure"); + /* Special case for array-valued named constants from intrinsic + procedures; those are inlined. */ + if (sym->attr.use_assoc && sym->from_intmod && sym->attr.dimension + && sym->attr.flavor == FL_PARAMETER) + intrinsic_array_parameter = true; + /* Create string length decl first so that they can be used in the type declaration. */ if (sym->ts.type == BT_CHARACTER) @@ -1200,7 +1207,7 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (sym->module) { gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym)); - if (sym->attr.use_assoc) + if (sym->attr.use_assoc && !intrinsic_array_parameter) DECL_IGNORED_P (decl) = 1; } @@ -1226,7 +1233,7 @@ gfc_get_symbol_decl (gfc_symbol * sym) && !sym->attr.data && !sym->attr.allocatable && (sym->value && !sym->ns->proc_name->attr.is_main_program) - && !sym->attr.use_assoc)) + && !(sym->attr.use_assoc && !intrinsic_array_parameter))) gfc_defer_symbol_init (sym); gfc_finish_var_decl (decl, sym); @@ -1280,7 +1287,14 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (sym->attr.assign) gfc_add_assign_aux_vars (sym); - if (TREE_STATIC (decl) && !sym->attr.use_assoc + if (intrinsic_array_parameter) + { + TREE_STATIC (decl) = 1; + DECL_EXTERNAL (decl) = 0; + } + + if (TREE_STATIC (decl) + && !(sym->attr.use_assoc && !intrinsic_array_parameter) && (sym->attr.save || sym->ns->proc_name->attr.is_main_program || gfc_option.flag_max_stack_var_size == 0 || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)) |