aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-decl.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-09-24 07:42:03 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2010-09-24 07:42:03 +0200
commitbe1f1ed97b2e41073dc1775d6f13e7597eb22664 (patch)
tree7fc5f24d161e97648b35a60ab0f7dcfe64b15cf2 /gcc/fortran/trans-decl.c
parent2b3a48378862f67ffea656516857c1517dae7658 (diff)
downloadgcc-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.c20
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))