Home | History | Annotate | Line # | Download | only in fortran
      1  1.1  mrg /* Backend function setup
      2  1.1  mrg    Copyright (C) 2002-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Paul Brook
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg the terms of the GNU General Public License as published by the Free
      9  1.1  mrg Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg /* trans-decl.cc -- Handling of backend function and variable decls, etc */
     22  1.1  mrg 
     23  1.1  mrg #include "config.h"
     24  1.1  mrg #include "system.h"
     25  1.1  mrg #include "coretypes.h"
     26  1.1  mrg #include "target.h"
     27  1.1  mrg #include "function.h"
     28  1.1  mrg #include "tree.h"
     29  1.1  mrg #include "gfortran.h"
     30  1.1  mrg #include "gimple-expr.h"	/* For create_tmp_var_raw.  */
     31  1.1  mrg #include "trans.h"
     32  1.1  mrg #include "stringpool.h"
     33  1.1  mrg #include "cgraph.h"
     34  1.1  mrg #include "fold-const.h"
     35  1.1  mrg #include "stor-layout.h"
     36  1.1  mrg #include "varasm.h"
     37  1.1  mrg #include "attribs.h"
     38  1.1  mrg #include "dumpfile.h"
     39  1.1  mrg #include "toplev.h"	/* For announce_function.  */
     40  1.1  mrg #include "debug.h"
     41  1.1  mrg #include "constructor.h"
     42  1.1  mrg #include "trans-types.h"
     43  1.1  mrg #include "trans-array.h"
     44  1.1  mrg #include "trans-const.h"
     45  1.1  mrg /* Only for gfc_trans_code.  Shouldn't need to include this.  */
     46  1.1  mrg #include "trans-stmt.h"
     47  1.1  mrg #include "gomp-constants.h"
     48  1.1  mrg #include "gimplify.h"
     49  1.1  mrg #include "omp-general.h"
     50  1.1  mrg #include "attr-fnspec.h"
     51  1.1  mrg 
     52  1.1  mrg #define MAX_LABEL_VALUE 99999
     53  1.1  mrg 
     54  1.1  mrg 
     55  1.1  mrg /* Holds the result of the function if no result variable specified.  */
     56  1.1  mrg 
     57  1.1  mrg static GTY(()) tree current_fake_result_decl;
     58  1.1  mrg static GTY(()) tree parent_fake_result_decl;
     59  1.1  mrg 
     60  1.1  mrg 
     61  1.1  mrg /* Holds the variable DECLs for the current function.  */
     62  1.1  mrg 
     63  1.1  mrg static GTY(()) tree saved_function_decls;
     64  1.1  mrg static GTY(()) tree saved_parent_function_decls;
     65  1.1  mrg 
     66  1.1  mrg /* Holds the variable DECLs that are locals.  */
     67  1.1  mrg 
     68  1.1  mrg static GTY(()) tree saved_local_decls;
     69  1.1  mrg 
     70  1.1  mrg /* The namespace of the module we're currently generating.  Only used while
     71  1.1  mrg    outputting decls for module variables.  Do not rely on this being set.  */
     72  1.1  mrg 
     73  1.1  mrg static gfc_namespace *module_namespace;
     74  1.1  mrg 
     75  1.1  mrg /* The currently processed procedure symbol.  */
     76  1.1  mrg static gfc_symbol* current_procedure_symbol = NULL;
     77  1.1  mrg 
     78  1.1  mrg /* The currently processed module.  */
     79  1.1  mrg static struct module_htab_entry *cur_module;
     80  1.1  mrg 
     81  1.1  mrg /* With -fcoarray=lib: For generating the registering call
     82  1.1  mrg    of static coarrays.  */
     83  1.1  mrg static bool has_coarray_vars;
     84  1.1  mrg static stmtblock_t caf_init_block;
     85  1.1  mrg 
     86  1.1  mrg 
     87  1.1  mrg /* List of static constructor functions.  */
     88  1.1  mrg 
     89  1.1  mrg tree gfc_static_ctors;
     90  1.1  mrg 
     91  1.1  mrg 
     92  1.1  mrg /* Whether we've seen a symbol from an IEEE module in the namespace.  */
     93  1.1  mrg static int seen_ieee_symbol;
     94  1.1  mrg 
     95  1.1  mrg /* Function declarations for builtin library functions.  */
     96  1.1  mrg 
     97  1.1  mrg tree gfor_fndecl_pause_numeric;
     98  1.1  mrg tree gfor_fndecl_pause_string;
     99  1.1  mrg tree gfor_fndecl_stop_numeric;
    100  1.1  mrg tree gfor_fndecl_stop_string;
    101  1.1  mrg tree gfor_fndecl_error_stop_numeric;
    102  1.1  mrg tree gfor_fndecl_error_stop_string;
    103  1.1  mrg tree gfor_fndecl_runtime_error;
    104  1.1  mrg tree gfor_fndecl_runtime_error_at;
    105  1.1  mrg tree gfor_fndecl_runtime_warning_at;
    106  1.1  mrg tree gfor_fndecl_os_error_at;
    107  1.1  mrg tree gfor_fndecl_generate_error;
    108  1.1  mrg tree gfor_fndecl_set_args;
    109  1.1  mrg tree gfor_fndecl_set_fpe;
    110  1.1  mrg tree gfor_fndecl_set_options;
    111  1.1  mrg tree gfor_fndecl_set_convert;
    112  1.1  mrg tree gfor_fndecl_set_record_marker;
    113  1.1  mrg tree gfor_fndecl_set_max_subrecord_length;
    114  1.1  mrg tree gfor_fndecl_ctime;
    115  1.1  mrg tree gfor_fndecl_fdate;
    116  1.1  mrg tree gfor_fndecl_ttynam;
    117  1.1  mrg tree gfor_fndecl_in_pack;
    118  1.1  mrg tree gfor_fndecl_in_unpack;
    119  1.1  mrg tree gfor_fndecl_associated;
    120  1.1  mrg tree gfor_fndecl_system_clock4;
    121  1.1  mrg tree gfor_fndecl_system_clock8;
    122  1.1  mrg tree gfor_fndecl_ieee_procedure_entry;
    123  1.1  mrg tree gfor_fndecl_ieee_procedure_exit;
    124  1.1  mrg 
    125  1.1  mrg /* Coarray run-time library function decls.  */
    126  1.1  mrg tree gfor_fndecl_caf_init;
    127  1.1  mrg tree gfor_fndecl_caf_finalize;
    128  1.1  mrg tree gfor_fndecl_caf_this_image;
    129  1.1  mrg tree gfor_fndecl_caf_num_images;
    130  1.1  mrg tree gfor_fndecl_caf_register;
    131  1.1  mrg tree gfor_fndecl_caf_deregister;
    132  1.1  mrg tree gfor_fndecl_caf_get;
    133  1.1  mrg tree gfor_fndecl_caf_send;
    134  1.1  mrg tree gfor_fndecl_caf_sendget;
    135  1.1  mrg tree gfor_fndecl_caf_get_by_ref;
    136  1.1  mrg tree gfor_fndecl_caf_send_by_ref;
    137  1.1  mrg tree gfor_fndecl_caf_sendget_by_ref;
    138  1.1  mrg tree gfor_fndecl_caf_sync_all;
    139  1.1  mrg tree gfor_fndecl_caf_sync_memory;
    140  1.1  mrg tree gfor_fndecl_caf_sync_images;
    141  1.1  mrg tree gfor_fndecl_caf_stop_str;
    142  1.1  mrg tree gfor_fndecl_caf_stop_numeric;
    143  1.1  mrg tree gfor_fndecl_caf_error_stop;
    144  1.1  mrg tree gfor_fndecl_caf_error_stop_str;
    145  1.1  mrg tree gfor_fndecl_caf_atomic_def;
    146  1.1  mrg tree gfor_fndecl_caf_atomic_ref;
    147  1.1  mrg tree gfor_fndecl_caf_atomic_cas;
    148  1.1  mrg tree gfor_fndecl_caf_atomic_op;
    149  1.1  mrg tree gfor_fndecl_caf_lock;
    150  1.1  mrg tree gfor_fndecl_caf_unlock;
    151  1.1  mrg tree gfor_fndecl_caf_event_post;
    152  1.1  mrg tree gfor_fndecl_caf_event_wait;
    153  1.1  mrg tree gfor_fndecl_caf_event_query;
    154  1.1  mrg tree gfor_fndecl_caf_fail_image;
    155  1.1  mrg tree gfor_fndecl_caf_failed_images;
    156  1.1  mrg tree gfor_fndecl_caf_image_status;
    157  1.1  mrg tree gfor_fndecl_caf_stopped_images;
    158  1.1  mrg tree gfor_fndecl_caf_form_team;
    159  1.1  mrg tree gfor_fndecl_caf_change_team;
    160  1.1  mrg tree gfor_fndecl_caf_end_team;
    161  1.1  mrg tree gfor_fndecl_caf_sync_team;
    162  1.1  mrg tree gfor_fndecl_caf_get_team;
    163  1.1  mrg tree gfor_fndecl_caf_team_number;
    164  1.1  mrg tree gfor_fndecl_co_broadcast;
    165  1.1  mrg tree gfor_fndecl_co_max;
    166  1.1  mrg tree gfor_fndecl_co_min;
    167  1.1  mrg tree gfor_fndecl_co_reduce;
    168  1.1  mrg tree gfor_fndecl_co_sum;
    169  1.1  mrg tree gfor_fndecl_caf_is_present;
    170  1.1  mrg tree gfor_fndecl_caf_random_init;
    171  1.1  mrg 
    172  1.1  mrg 
    173  1.1  mrg /* Math functions.  Many other math functions are handled in
    174  1.1  mrg    trans-intrinsic.cc.  */
    175  1.1  mrg 
    176  1.1  mrg gfc_powdecl_list gfor_fndecl_math_powi[4][3];
    177  1.1  mrg tree gfor_fndecl_math_ishftc4;
    178  1.1  mrg tree gfor_fndecl_math_ishftc8;
    179  1.1  mrg tree gfor_fndecl_math_ishftc16;
    180  1.1  mrg 
    181  1.1  mrg 
    182  1.1  mrg /* String functions.  */
    183  1.1  mrg 
    184  1.1  mrg tree gfor_fndecl_compare_string;
    185  1.1  mrg tree gfor_fndecl_concat_string;
    186  1.1  mrg tree gfor_fndecl_string_len_trim;
    187  1.1  mrg tree gfor_fndecl_string_index;
    188  1.1  mrg tree gfor_fndecl_string_scan;
    189  1.1  mrg tree gfor_fndecl_string_verify;
    190  1.1  mrg tree gfor_fndecl_string_trim;
    191  1.1  mrg tree gfor_fndecl_string_minmax;
    192  1.1  mrg tree gfor_fndecl_adjustl;
    193  1.1  mrg tree gfor_fndecl_adjustr;
    194  1.1  mrg tree gfor_fndecl_select_string;
    195  1.1  mrg tree gfor_fndecl_compare_string_char4;
    196  1.1  mrg tree gfor_fndecl_concat_string_char4;
    197  1.1  mrg tree gfor_fndecl_string_len_trim_char4;
    198  1.1  mrg tree gfor_fndecl_string_index_char4;
    199  1.1  mrg tree gfor_fndecl_string_scan_char4;
    200  1.1  mrg tree gfor_fndecl_string_verify_char4;
    201  1.1  mrg tree gfor_fndecl_string_trim_char4;
    202  1.1  mrg tree gfor_fndecl_string_minmax_char4;
    203  1.1  mrg tree gfor_fndecl_adjustl_char4;
    204  1.1  mrg tree gfor_fndecl_adjustr_char4;
    205  1.1  mrg tree gfor_fndecl_select_string_char4;
    206  1.1  mrg 
    207  1.1  mrg 
    208  1.1  mrg /* Conversion between character kinds.  */
    209  1.1  mrg tree gfor_fndecl_convert_char1_to_char4;
    210  1.1  mrg tree gfor_fndecl_convert_char4_to_char1;
    211  1.1  mrg 
    212  1.1  mrg 
    213  1.1  mrg /* Other misc. runtime library functions.  */
    214  1.1  mrg tree gfor_fndecl_iargc;
    215  1.1  mrg tree gfor_fndecl_kill;
    216  1.1  mrg tree gfor_fndecl_kill_sub;
    217  1.1  mrg tree gfor_fndecl_is_contiguous0;
    218  1.1  mrg 
    219  1.1  mrg 
    220  1.1  mrg /* Intrinsic functions implemented in Fortran.  */
    221  1.1  mrg tree gfor_fndecl_sc_kind;
    222  1.1  mrg tree gfor_fndecl_si_kind;
    223  1.1  mrg tree gfor_fndecl_sr_kind;
    224  1.1  mrg 
    225  1.1  mrg /* BLAS gemm functions.  */
    226  1.1  mrg tree gfor_fndecl_sgemm;
    227  1.1  mrg tree gfor_fndecl_dgemm;
    228  1.1  mrg tree gfor_fndecl_cgemm;
    229  1.1  mrg tree gfor_fndecl_zgemm;
    230  1.1  mrg 
    231  1.1  mrg /* RANDOM_INIT function.  */
    232  1.1  mrg tree gfor_fndecl_random_init;      /* libgfortran, 1 image only.  */
    233  1.1  mrg 
    234  1.1  mrg static void
    235  1.1  mrg gfc_add_decl_to_parent_function (tree decl)
    236  1.1  mrg {
    237  1.1  mrg   gcc_assert (decl);
    238  1.1  mrg   DECL_CONTEXT (decl) = DECL_CONTEXT (current_function_decl);
    239  1.1  mrg   DECL_NONLOCAL (decl) = 1;
    240  1.1  mrg   DECL_CHAIN (decl) = saved_parent_function_decls;
    241  1.1  mrg   saved_parent_function_decls = decl;
    242  1.1  mrg }
    243  1.1  mrg 
    244  1.1  mrg void
    245  1.1  mrg gfc_add_decl_to_function (tree decl)
    246  1.1  mrg {
    247  1.1  mrg   gcc_assert (decl);
    248  1.1  mrg   TREE_USED (decl) = 1;
    249  1.1  mrg   DECL_CONTEXT (decl) = current_function_decl;
    250  1.1  mrg   DECL_CHAIN (decl) = saved_function_decls;
    251  1.1  mrg   saved_function_decls = decl;
    252  1.1  mrg }
    253  1.1  mrg 
    254  1.1  mrg static void
    255  1.1  mrg add_decl_as_local (tree decl)
    256  1.1  mrg {
    257  1.1  mrg   gcc_assert (decl);
    258  1.1  mrg   TREE_USED (decl) = 1;
    259  1.1  mrg   DECL_CONTEXT (decl) = current_function_decl;
    260  1.1  mrg   DECL_CHAIN (decl) = saved_local_decls;
    261  1.1  mrg   saved_local_decls = decl;
    262  1.1  mrg }
    263  1.1  mrg 
    264  1.1  mrg 
    265  1.1  mrg /* Build a  backend label declaration.  Set TREE_USED for named labels.
    266  1.1  mrg    The context of the label is always the current_function_decl.  All
    267  1.1  mrg    labels are marked artificial.  */
    268  1.1  mrg 
    269  1.1  mrg tree
    270  1.1  mrg gfc_build_label_decl (tree label_id)
    271  1.1  mrg {
    272  1.1  mrg   /* 2^32 temporaries should be enough.  */
    273  1.1  mrg   static unsigned int tmp_num = 1;
    274  1.1  mrg   tree label_decl;
    275  1.1  mrg   char *label_name;
    276  1.1  mrg 
    277  1.1  mrg   if (label_id == NULL_TREE)
    278  1.1  mrg     {
    279  1.1  mrg       /* Build an internal label name.  */
    280  1.1  mrg       ASM_FORMAT_PRIVATE_NAME (label_name, "L", tmp_num++);
    281  1.1  mrg       label_id = get_identifier (label_name);
    282  1.1  mrg     }
    283  1.1  mrg   else
    284  1.1  mrg     label_name = NULL;
    285  1.1  mrg 
    286  1.1  mrg   /* Build the LABEL_DECL node. Labels have no type.  */
    287  1.1  mrg   label_decl = build_decl (input_location,
    288  1.1  mrg 			   LABEL_DECL, label_id, void_type_node);
    289  1.1  mrg   DECL_CONTEXT (label_decl) = current_function_decl;
    290  1.1  mrg   SET_DECL_MODE (label_decl, VOIDmode);
    291  1.1  mrg 
    292  1.1  mrg   /* We always define the label as used, even if the original source
    293  1.1  mrg      file never references the label.  We don't want all kinds of
    294  1.1  mrg      spurious warnings for old-style Fortran code with too many
    295  1.1  mrg      labels.  */
    296  1.1  mrg   TREE_USED (label_decl) = 1;
    297  1.1  mrg 
    298  1.1  mrg   DECL_ARTIFICIAL (label_decl) = 1;
    299  1.1  mrg   return label_decl;
    300  1.1  mrg }
    301  1.1  mrg 
    302  1.1  mrg 
    303  1.1  mrg /* Set the backend source location of a decl.  */
    304  1.1  mrg 
    305  1.1  mrg void
    306  1.1  mrg gfc_set_decl_location (tree decl, locus * loc)
    307  1.1  mrg {
    308  1.1  mrg   DECL_SOURCE_LOCATION (decl) = gfc_get_location (loc);
    309  1.1  mrg }
    310  1.1  mrg 
    311  1.1  mrg 
    312  1.1  mrg /* Return the backend label declaration for a given label structure,
    313  1.1  mrg    or create it if it doesn't exist yet.  */
    314  1.1  mrg 
    315  1.1  mrg tree
    316  1.1  mrg gfc_get_label_decl (gfc_st_label * lp)
    317  1.1  mrg {
    318  1.1  mrg   if (lp->backend_decl)
    319  1.1  mrg     return lp->backend_decl;
    320  1.1  mrg   else
    321  1.1  mrg     {
    322  1.1  mrg       char label_name[GFC_MAX_SYMBOL_LEN + 1];
    323  1.1  mrg       tree label_decl;
    324  1.1  mrg 
    325  1.1  mrg       /* Validate the label declaration from the front end.  */
    326  1.1  mrg       gcc_assert (lp != NULL && lp->value <= MAX_LABEL_VALUE);
    327  1.1  mrg 
    328  1.1  mrg       /* Build a mangled name for the label.  */
    329  1.1  mrg       sprintf (label_name, "__label_%.6d", lp->value);
    330  1.1  mrg 
    331  1.1  mrg       /* Build the LABEL_DECL node.  */
    332  1.1  mrg       label_decl = gfc_build_label_decl (get_identifier (label_name));
    333  1.1  mrg 
    334  1.1  mrg       /* Tell the debugger where the label came from.  */
    335  1.1  mrg       if (lp->value <= MAX_LABEL_VALUE)	/* An internal label.  */
    336  1.1  mrg 	gfc_set_decl_location (label_decl, &lp->where);
    337  1.1  mrg       else
    338  1.1  mrg 	DECL_ARTIFICIAL (label_decl) = 1;
    339  1.1  mrg 
    340  1.1  mrg       /* Store the label in the label list and return the LABEL_DECL.  */
    341  1.1  mrg       lp->backend_decl = label_decl;
    342  1.1  mrg       return label_decl;
    343  1.1  mrg     }
    344  1.1  mrg }
    345  1.1  mrg 
    346  1.1  mrg /* Return the name of an identifier.  */
    347  1.1  mrg 
    348  1.1  mrg static const char *
    349  1.1  mrg sym_identifier (gfc_symbol *sym)
    350  1.1  mrg {
    351  1.1  mrg   if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0)
    352  1.1  mrg     return "MAIN__";
    353  1.1  mrg   else
    354  1.1  mrg     return sym->name;
    355  1.1  mrg }
    356  1.1  mrg 
    357  1.1  mrg /* Convert a gfc_symbol to an identifier of the same name.  */
    358  1.1  mrg 
    359  1.1  mrg static tree
    360  1.1  mrg gfc_sym_identifier (gfc_symbol * sym)
    361  1.1  mrg {
    362  1.1  mrg   return get_identifier (sym_identifier (sym));
    363  1.1  mrg }
    364  1.1  mrg 
    365  1.1  mrg /* Construct mangled name from symbol name.   */
    366  1.1  mrg 
    367  1.1  mrg static const char *
    368  1.1  mrg mangled_identifier (gfc_symbol *sym)
    369  1.1  mrg {
    370  1.1  mrg   gfc_symbol *proc = sym->ns->proc_name;
    371  1.1  mrg   static char name[3*GFC_MAX_MANGLED_SYMBOL_LEN + 14];
    372  1.1  mrg   /* Prevent the mangling of identifiers that have an assigned
    373  1.1  mrg      binding label (mainly those that are bind(c)).  */
    374  1.1  mrg 
    375  1.1  mrg   if (sym->attr.is_bind_c == 1 && sym->binding_label)
    376  1.1  mrg     return sym->binding_label;
    377  1.1  mrg 
    378  1.1  mrg   if (!sym->fn_result_spec
    379  1.1  mrg       || (sym->module && !(proc && proc->attr.flavor == FL_PROCEDURE)))
    380  1.1  mrg     {
    381  1.1  mrg       if (sym->module == NULL)
    382  1.1  mrg 	return sym_identifier (sym);
    383  1.1  mrg       else
    384  1.1  mrg 	snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
    385  1.1  mrg     }
    386  1.1  mrg   else
    387  1.1  mrg     {
    388  1.1  mrg       /* This is an entity that is actually local to a module procedure
    389  1.1  mrg 	 that appears in the result specification expression.  Since
    390  1.1  mrg 	 sym->module will be a zero length string, we use ns->proc_name
    391  1.1  mrg 	 to provide the module name instead. */
    392  1.1  mrg       if (proc && proc->module)
    393  1.1  mrg 	snprintf (name, sizeof name, "__%s_MOD__%s_PROC_%s",
    394  1.1  mrg 		  proc->module, proc->name, sym->name);
    395  1.1  mrg       else
    396  1.1  mrg 	snprintf (name, sizeof name, "__%s_PROC_%s",
    397  1.1  mrg 		  proc->name, sym->name);
    398  1.1  mrg     }
    399  1.1  mrg 
    400  1.1  mrg   return name;
    401  1.1  mrg }
    402  1.1  mrg 
    403  1.1  mrg /* Get mangled identifier, adding the symbol to the global table if
    404  1.1  mrg    it is not yet already there.  */
    405  1.1  mrg 
    406  1.1  mrg static tree
    407  1.1  mrg gfc_sym_mangled_identifier (gfc_symbol * sym)
    408  1.1  mrg {
    409  1.1  mrg   tree result;
    410  1.1  mrg   gfc_gsymbol *gsym;
    411  1.1  mrg   const char *name;
    412  1.1  mrg 
    413  1.1  mrg   name = mangled_identifier (sym);
    414  1.1  mrg   result = get_identifier (name);
    415  1.1  mrg 
    416  1.1  mrg   gsym = gfc_find_gsymbol (gfc_gsym_root, name);
    417  1.1  mrg   if (gsym == NULL)
    418  1.1  mrg     {
    419  1.1  mrg       gsym = gfc_get_gsymbol (name, false);
    420  1.1  mrg       gsym->ns = sym->ns;
    421  1.1  mrg       gsym->sym_name = sym->name;
    422  1.1  mrg     }
    423  1.1  mrg 
    424  1.1  mrg   return result;
    425  1.1  mrg }
    426  1.1  mrg 
    427  1.1  mrg /* Construct mangled function name from symbol name.  */
    428  1.1  mrg 
    429  1.1  mrg static tree
    430  1.1  mrg gfc_sym_mangled_function_id (gfc_symbol * sym)
    431  1.1  mrg {
    432  1.1  mrg   int has_underscore;
    433  1.1  mrg   char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
    434  1.1  mrg 
    435  1.1  mrg   /* It may be possible to simply use the binding label if it's
    436  1.1  mrg      provided, and remove the other checks.  Then we could use it
    437  1.1  mrg      for other things if we wished.  */
    438  1.1  mrg   if ((sym->attr.is_bind_c == 1 || sym->attr.is_iso_c == 1) &&
    439  1.1  mrg       sym->binding_label)
    440  1.1  mrg     /* use the binding label rather than the mangled name */
    441  1.1  mrg     return get_identifier (sym->binding_label);
    442  1.1  mrg 
    443  1.1  mrg   if ((sym->module == NULL || sym->attr.proc == PROC_EXTERNAL
    444  1.1  mrg       || (sym->module != NULL && (sym->attr.external
    445  1.1  mrg 	    || sym->attr.if_source == IFSRC_IFBODY)))
    446  1.1  mrg       && !sym->attr.module_procedure)
    447  1.1  mrg     {
    448  1.1  mrg       /* Main program is mangled into MAIN__.  */
    449  1.1  mrg       if (sym->attr.is_main_program)
    450  1.1  mrg 	return get_identifier ("MAIN__");
    451  1.1  mrg 
    452  1.1  mrg       /* Intrinsic procedures are never mangled.  */
    453  1.1  mrg       if (sym->attr.proc == PROC_INTRINSIC)
    454  1.1  mrg 	return get_identifier (sym->name);
    455  1.1  mrg 
    456  1.1  mrg       if (flag_underscoring)
    457  1.1  mrg 	{
    458  1.1  mrg 	  has_underscore = strchr (sym->name, '_') != 0;
    459  1.1  mrg 	  if (flag_second_underscore && has_underscore)
    460  1.1  mrg 	    snprintf (name, sizeof name, "%s__", sym->name);
    461  1.1  mrg 	  else
    462  1.1  mrg 	    snprintf (name, sizeof name, "%s_", sym->name);
    463  1.1  mrg 	  return get_identifier (name);
    464  1.1  mrg 	}
    465  1.1  mrg       else
    466  1.1  mrg 	return get_identifier (sym->name);
    467  1.1  mrg     }
    468  1.1  mrg   else
    469  1.1  mrg     {
    470  1.1  mrg       snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name);
    471  1.1  mrg       return get_identifier (name);
    472  1.1  mrg     }
    473  1.1  mrg }
    474  1.1  mrg 
    475  1.1  mrg 
    476  1.1  mrg void
    477  1.1  mrg gfc_set_decl_assembler_name (tree decl, tree name)
    478  1.1  mrg {
    479  1.1  mrg   tree target_mangled = targetm.mangle_decl_assembler_name (decl, name);
    480  1.1  mrg   SET_DECL_ASSEMBLER_NAME (decl, target_mangled);
    481  1.1  mrg }
    482  1.1  mrg 
    483  1.1  mrg 
    484  1.1  mrg /* Returns true if a variable of specified size should go on the stack.  */
    485  1.1  mrg 
    486  1.1  mrg int
    487  1.1  mrg gfc_can_put_var_on_stack (tree size)
    488  1.1  mrg {
    489  1.1  mrg   unsigned HOST_WIDE_INT low;
    490  1.1  mrg 
    491  1.1  mrg   if (!INTEGER_CST_P (size))
    492  1.1  mrg     return 0;
    493  1.1  mrg 
    494  1.1  mrg   if (flag_max_stack_var_size < 0)
    495  1.1  mrg     return 1;
    496  1.1  mrg 
    497  1.1  mrg   if (!tree_fits_uhwi_p (size))
    498  1.1  mrg     return 0;
    499  1.1  mrg 
    500  1.1  mrg   low = TREE_INT_CST_LOW (size);
    501  1.1  mrg   if (low > (unsigned HOST_WIDE_INT) flag_max_stack_var_size)
    502  1.1  mrg     return 0;
    503  1.1  mrg 
    504  1.1  mrg /* TODO: Set a per-function stack size limit.  */
    505  1.1  mrg 
    506  1.1  mrg   return 1;
    507  1.1  mrg }
    508  1.1  mrg 
    509  1.1  mrg 
    510  1.1  mrg /* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
    511  1.1  mrg    an expression involving its corresponding pointer.  There are
    512  1.1  mrg    2 cases; one for variable size arrays, and one for everything else,
    513  1.1  mrg    because variable-sized arrays require one fewer level of
    514  1.1  mrg    indirection.  */
    515  1.1  mrg 
    516  1.1  mrg static void
    517  1.1  mrg gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
    518  1.1  mrg {
    519  1.1  mrg   tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
    520  1.1  mrg   tree value;
    521  1.1  mrg 
    522  1.1  mrg   /* Parameters need to be dereferenced.  */
    523  1.1  mrg   if (sym->cp_pointer->attr.dummy)
    524  1.1  mrg     ptr_decl = build_fold_indirect_ref_loc (input_location,
    525  1.1  mrg 					ptr_decl);
    526  1.1  mrg 
    527  1.1  mrg   /* Check to see if we're dealing with a variable-sized array.  */
    528  1.1  mrg   if (sym->attr.dimension
    529  1.1  mrg       && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
    530  1.1  mrg     {
    531  1.1  mrg       /* These decls will be dereferenced later, so we don't dereference
    532  1.1  mrg 	 them here.  */
    533  1.1  mrg       value = convert (TREE_TYPE (decl), ptr_decl);
    534  1.1  mrg     }
    535  1.1  mrg   else
    536  1.1  mrg     {
    537  1.1  mrg       ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
    538  1.1  mrg 			  ptr_decl);
    539  1.1  mrg       value = build_fold_indirect_ref_loc (input_location,
    540  1.1  mrg 				       ptr_decl);
    541  1.1  mrg     }
    542  1.1  mrg 
    543  1.1  mrg   SET_DECL_VALUE_EXPR (decl, value);
    544  1.1  mrg   DECL_HAS_VALUE_EXPR_P (decl) = 1;
    545  1.1  mrg   GFC_DECL_CRAY_POINTEE (decl) = 1;
    546  1.1  mrg }
    547  1.1  mrg 
    548  1.1  mrg 
    549  1.1  mrg /* Finish processing of a declaration without an initial value.  */
    550  1.1  mrg 
    551  1.1  mrg static void
    552  1.1  mrg gfc_finish_decl (tree decl)
    553  1.1  mrg {
    554  1.1  mrg   gcc_assert (TREE_CODE (decl) == PARM_DECL
    555  1.1  mrg 	      || DECL_INITIAL (decl) == NULL_TREE);
    556  1.1  mrg 
    557  1.1  mrg   if (!VAR_P (decl))
    558  1.1  mrg     return;
    559  1.1  mrg 
    560  1.1  mrg   if (DECL_SIZE (decl) == NULL_TREE
    561  1.1  mrg       && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
    562  1.1  mrg     layout_decl (decl, 0);
    563  1.1  mrg 
    564  1.1  mrg   /* A few consistency checks.  */
    565  1.1  mrg   /* A static variable with an incomplete type is an error if it is
    566  1.1  mrg      initialized. Also if it is not file scope. Otherwise, let it
    567  1.1  mrg      through, but if it is not `extern' then it may cause an error
    568  1.1  mrg      message later.  */
    569  1.1  mrg   /* An automatic variable with an incomplete type is an error.  */
    570  1.1  mrg 
    571  1.1  mrg   /* We should know the storage size.  */
    572  1.1  mrg   gcc_assert (DECL_SIZE (decl) != NULL_TREE
    573  1.1  mrg 	      || (TREE_STATIC (decl)
    574  1.1  mrg 		  ? (!DECL_INITIAL (decl) || !DECL_CONTEXT (decl))
    575  1.1  mrg 		  : DECL_EXTERNAL (decl)));
    576  1.1  mrg 
    577  1.1  mrg   /* The storage size should be constant.  */
    578  1.1  mrg   gcc_assert ((!DECL_EXTERNAL (decl) && !TREE_STATIC (decl))
    579  1.1  mrg 	      || !DECL_SIZE (decl)
    580  1.1  mrg 	      || TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST);
    581  1.1  mrg }
    582  1.1  mrg 
    583  1.1  mrg 
    584  1.1  mrg /* Handle setting of GFC_DECL_SCALAR* on DECL.  */
    585  1.1  mrg 
    586  1.1  mrg void
    587  1.1  mrg gfc_finish_decl_attrs (tree decl, symbol_attribute *attr)
    588  1.1  mrg {
    589  1.1  mrg   if (!attr->dimension && !attr->codimension)
    590  1.1  mrg     {
    591  1.1  mrg       /* Handle scalar allocatable variables.  */
    592  1.1  mrg       if (attr->allocatable)
    593  1.1  mrg 	{
    594  1.1  mrg 	  gfc_allocate_lang_decl (decl);
    595  1.1  mrg 	  GFC_DECL_SCALAR_ALLOCATABLE (decl) = 1;
    596  1.1  mrg 	}
    597  1.1  mrg       /* Handle scalar pointer variables.  */
    598  1.1  mrg       if (attr->pointer)
    599  1.1  mrg 	{
    600  1.1  mrg 	  gfc_allocate_lang_decl (decl);
    601  1.1  mrg 	  GFC_DECL_SCALAR_POINTER (decl) = 1;
    602  1.1  mrg 	}
    603  1.1  mrg       if (attr->target)
    604  1.1  mrg 	{
    605  1.1  mrg 	  gfc_allocate_lang_decl (decl);
    606  1.1  mrg 	  GFC_DECL_SCALAR_TARGET (decl) = 1;
    607  1.1  mrg 	}
    608  1.1  mrg     }
    609  1.1  mrg }
    610  1.1  mrg 
    611  1.1  mrg 
    612  1.1  mrg /* Apply symbol attributes to a variable, and add it to the function scope.  */
    613  1.1  mrg 
    614  1.1  mrg static void
    615  1.1  mrg gfc_finish_var_decl (tree decl, gfc_symbol * sym)
    616  1.1  mrg {
    617  1.1  mrg   tree new_type;
    618  1.1  mrg 
    619  1.1  mrg   /* Set DECL_VALUE_EXPR for Cray Pointees.  */
    620  1.1  mrg   if (sym->attr.cray_pointee)
    621  1.1  mrg     gfc_finish_cray_pointee (decl, sym);
    622  1.1  mrg 
    623  1.1  mrg   /* TREE_ADDRESSABLE means the address of this variable is actually needed.
    624  1.1  mrg      This is the equivalent of the TARGET variables.
    625  1.1  mrg      We also need to set this if the variable is passed by reference in a
    626  1.1  mrg      CALL statement.  */
    627  1.1  mrg   if (sym->attr.target)
    628  1.1  mrg     TREE_ADDRESSABLE (decl) = 1;
    629  1.1  mrg 
    630  1.1  mrg   /* If it wasn't used we wouldn't be getting it.  */
    631  1.1  mrg   TREE_USED (decl) = 1;
    632  1.1  mrg 
    633  1.1  mrg   if (sym->attr.flavor == FL_PARAMETER
    634  1.1  mrg       && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
    635  1.1  mrg     TREE_READONLY (decl) = 1;
    636  1.1  mrg 
    637  1.1  mrg   /* Chain this decl to the pending declarations.  Don't do pushdecl()
    638  1.1  mrg      because this would add them to the current scope rather than the
    639  1.1  mrg      function scope.  */
    640  1.1  mrg   if (current_function_decl != NULL_TREE)
    641  1.1  mrg     {
    642  1.1  mrg       if (sym->ns->proc_name
    643  1.1  mrg 	  && (sym->ns->proc_name->backend_decl == current_function_decl
    644  1.1  mrg 	      || sym->result == sym))
    645  1.1  mrg 	gfc_add_decl_to_function (decl);
    646  1.1  mrg       else if (sym->ns->proc_name
    647  1.1  mrg 	       && sym->ns->proc_name->attr.flavor == FL_LABEL)
    648  1.1  mrg 	/* This is a BLOCK construct.  */
    649  1.1  mrg 	add_decl_as_local (decl);
    650  1.1  mrg       else if (sym->ns->omp_affinity_iterators)
    651  1.1  mrg 	/* This is a block-local iterator.  */
    652  1.1  mrg 	add_decl_as_local (decl);
    653  1.1  mrg       else
    654  1.1  mrg 	gfc_add_decl_to_parent_function (decl);
    655  1.1  mrg     }
    656  1.1  mrg 
    657  1.1  mrg   if (sym->attr.cray_pointee)
    658  1.1  mrg     return;
    659  1.1  mrg 
    660  1.1  mrg   if(sym->attr.is_bind_c == 1 && sym->binding_label)
    661  1.1  mrg     {
    662  1.1  mrg       /* We need to put variables that are bind(c) into the common
    663  1.1  mrg 	 segment of the object file, because this is what C would do.
    664  1.1  mrg 	 gfortran would typically put them in either the BSS or
    665  1.1  mrg 	 initialized data segments, and only mark them as common if
    666  1.1  mrg 	 they were part of common blocks.  However, if they are not put
    667  1.1  mrg 	 into common space, then C cannot initialize global Fortran
    668  1.1  mrg 	 variables that it interoperates with and the draft says that
    669  1.1  mrg 	 either Fortran or C should be able to initialize it (but not
    670  1.1  mrg 	 both, of course.) (J3/04-007, section 15.3).  */
    671  1.1  mrg       TREE_PUBLIC(decl) = 1;
    672  1.1  mrg       DECL_COMMON(decl) = 1;
    673  1.1  mrg       if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used)
    674  1.1  mrg 	{
    675  1.1  mrg 	  DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
    676  1.1  mrg 	  DECL_VISIBILITY_SPECIFIED (decl) = true;
    677  1.1  mrg 	}
    678  1.1  mrg     }
    679  1.1  mrg 
    680  1.1  mrg   /* If a variable is USE associated, it's always external.  */
    681  1.1  mrg   if (sym->attr.use_assoc || sym->attr.used_in_submodule)
    682  1.1  mrg     {
    683  1.1  mrg       DECL_EXTERNAL (decl) = 1;
    684  1.1  mrg       TREE_PUBLIC (decl) = 1;
    685  1.1  mrg     }
    686  1.1  mrg   else if (sym->fn_result_spec && !sym->ns->proc_name->module)
    687  1.1  mrg     {
    688  1.1  mrg 
    689  1.1  mrg       if (sym->ns->proc_name->attr.if_source != IFSRC_DECL)
    690  1.1  mrg 	DECL_EXTERNAL (decl) = 1;
    691  1.1  mrg       else
    692  1.1  mrg 	TREE_STATIC (decl) = 1;
    693  1.1  mrg 
    694  1.1  mrg       TREE_PUBLIC (decl) = 1;
    695  1.1  mrg     }
    696  1.1  mrg   else if (sym->module && !sym->attr.result && !sym->attr.dummy)
    697  1.1  mrg     {
    698  1.1  mrg       /* TODO: Don't set sym->module for result or dummy variables.  */
    699  1.1  mrg       gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
    700  1.1  mrg 
    701  1.1  mrg       TREE_PUBLIC (decl) = 1;
    702  1.1  mrg       TREE_STATIC (decl) = 1;
    703  1.1  mrg       if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used)
    704  1.1  mrg 	{
    705  1.1  mrg 	  DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
    706  1.1  mrg 	  DECL_VISIBILITY_SPECIFIED (decl) = true;
    707  1.1  mrg 	}
    708  1.1  mrg     }
    709  1.1  mrg 
    710  1.1  mrg   /* Derived types are a bit peculiar because of the possibility of
    711  1.1  mrg      a default initializer; this must be applied each time the variable
    712  1.1  mrg      comes into scope it therefore need not be static.  These variables
    713  1.1  mrg      are SAVE_NONE but have an initializer.  Otherwise explicitly
    714  1.1  mrg      initialized variables are SAVE_IMPLICIT and explicitly saved are
    715  1.1  mrg      SAVE_EXPLICIT.  */
    716  1.1  mrg   if (!sym->attr.use_assoc
    717  1.1  mrg 	&& (sym->attr.save != SAVE_NONE || sym->attr.data
    718  1.1  mrg 	    || (sym->value && sym->ns->proc_name->attr.is_main_program)
    719  1.1  mrg 	    || (flag_coarray == GFC_FCOARRAY_LIB
    720  1.1  mrg 		&& sym->attr.codimension && !sym->attr.allocatable)))
    721  1.1  mrg     TREE_STATIC (decl) = 1;
    722  1.1  mrg 
    723  1.1  mrg   /* If derived-type variables with DTIO procedures are not made static
    724  1.1  mrg      some bits of code referencing them get optimized away.
    725  1.1  mrg      TODO Understand why this is so and fix it.  */
    726  1.1  mrg   if (!sym->attr.use_assoc
    727  1.1  mrg       && ((sym->ts.type == BT_DERIVED
    728  1.1  mrg            && sym->ts.u.derived->attr.has_dtio_procs)
    729  1.1  mrg 	  || (sym->ts.type == BT_CLASS
    730  1.1  mrg 	      && CLASS_DATA (sym)->ts.u.derived->attr.has_dtio_procs)))
    731  1.1  mrg     TREE_STATIC (decl) = 1;
    732  1.1  mrg 
    733  1.1  mrg   /* Treat asynchronous variables the same as volatile, for now.  */
    734  1.1  mrg   if (sym->attr.volatile_ || sym->attr.asynchronous)
    735  1.1  mrg     {
    736  1.1  mrg       TREE_THIS_VOLATILE (decl) = 1;
    737  1.1  mrg       TREE_SIDE_EFFECTS (decl) = 1;
    738  1.1  mrg       new_type = build_qualified_type (TREE_TYPE (decl), TYPE_QUAL_VOLATILE);
    739  1.1  mrg       TREE_TYPE (decl) = new_type;
    740  1.1  mrg     }
    741  1.1  mrg 
    742  1.1  mrg   /* Keep variables larger than max-stack-var-size off stack.  */
    743  1.1  mrg   if (!(sym->ns->proc_name && sym->ns->proc_name->attr.recursive)
    744  1.1  mrg       && !sym->attr.automatic
    745  1.1  mrg       && !sym->attr.associate_var
    746  1.1  mrg       && sym->attr.save != SAVE_EXPLICIT
    747  1.1  mrg       && sym->attr.save != SAVE_IMPLICIT
    748  1.1  mrg       && INTEGER_CST_P (DECL_SIZE_UNIT (decl))
    749  1.1  mrg       && !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
    750  1.1  mrg 	 /* Put variable length auto array pointers always into stack.  */
    751  1.1  mrg       && (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
    752  1.1  mrg 	  || sym->attr.dimension == 0
    753  1.1  mrg 	  || sym->as->type != AS_EXPLICIT
    754  1.1  mrg 	  || sym->attr.pointer
    755  1.1  mrg 	  || sym->attr.allocatable)
    756  1.1  mrg       && !DECL_ARTIFICIAL (decl))
    757  1.1  mrg     {
    758  1.1  mrg       if (flag_max_stack_var_size > 0
    759  1.1  mrg 	  && !(sym->ns->proc_name
    760  1.1  mrg 	       && sym->ns->proc_name->attr.is_main_program))
    761  1.1  mrg 	gfc_warning (OPT_Wsurprising,
    762  1.1  mrg 		     "Array %qs at %L is larger than limit set by "
    763  1.1  mrg 		     "%<-fmax-stack-var-size=%>, moved from stack to static "
    764  1.1  mrg 		     "storage. This makes the procedure unsafe when called "
    765  1.1  mrg 		     "recursively, or concurrently from multiple threads. "
    766  1.1  mrg 		     "Consider increasing the %<-fmax-stack-var-size=%> "
    767  1.1  mrg 		     "limit (or use %<-frecursive%>, which implies "
    768  1.1  mrg 		     "unlimited %<-fmax-stack-var-size%>) - or change the "
    769  1.1  mrg 		     "code to use an ALLOCATABLE array. If the variable is "
    770  1.1  mrg 		     "never accessed concurrently, this warning can be "
    771  1.1  mrg 		     "ignored, and the variable could also be declared with "
    772  1.1  mrg 		     "the SAVE attribute.",
    773  1.1  mrg 		     sym->name, &sym->declared_at);
    774  1.1  mrg 
    775  1.1  mrg       TREE_STATIC (decl) = 1;
    776  1.1  mrg 
    777  1.1  mrg       /* Because the size of this variable isn't known until now, we may have
    778  1.1  mrg          greedily added an initializer to this variable (in build_init_assign)
    779  1.1  mrg          even though the max-stack-var-size indicates the variable should be
    780  1.1  mrg          static. Therefore we rip out the automatic initializer here and
    781  1.1  mrg          replace it with a static one.  */
    782  1.1  mrg       gfc_symtree *st = gfc_find_symtree (sym->ns->sym_root, sym->name);
    783  1.1  mrg       gfc_code *prev = NULL;
    784  1.1  mrg       gfc_code *code = sym->ns->code;
    785  1.1  mrg       while (code && code->op == EXEC_INIT_ASSIGN)
    786  1.1  mrg         {
    787  1.1  mrg           /* Look for an initializer meant for this symbol.  */
    788  1.1  mrg           if (code->expr1->symtree == st)
    789  1.1  mrg             {
    790  1.1  mrg               if (prev)
    791  1.1  mrg                 prev->next = code->next;
    792  1.1  mrg               else
    793  1.1  mrg                 sym->ns->code = code->next;
    794  1.1  mrg 
    795  1.1  mrg               break;
    796  1.1  mrg             }
    797  1.1  mrg 
    798  1.1  mrg           prev = code;
    799  1.1  mrg           code = code->next;
    800  1.1  mrg         }
    801  1.1  mrg       if (code && code->op == EXEC_INIT_ASSIGN)
    802  1.1  mrg         {
    803  1.1  mrg           /* Keep the init expression for a static initializer.  */
    804  1.1  mrg           sym->value = code->expr2;
    805  1.1  mrg           /* Cleanup the defunct code object, without freeing the init expr.  */
    806  1.1  mrg           code->expr2 = NULL;
    807  1.1  mrg           gfc_free_statement (code);
    808  1.1  mrg           free (code);
    809  1.1  mrg         }
    810  1.1  mrg     }
    811  1.1  mrg 
    812  1.1  mrg   /* Handle threadprivate variables.  */
    813  1.1  mrg   if (sym->attr.threadprivate
    814  1.1  mrg       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
    815  1.1  mrg     set_decl_tls_model (decl, decl_default_tls_model (decl));
    816  1.1  mrg 
    817  1.1  mrg   gfc_finish_decl_attrs (decl, &sym->attr);
    818  1.1  mrg }
    819  1.1  mrg 
    820  1.1  mrg 
    821  1.1  mrg /* Allocate the lang-specific part of a decl.  */
    822  1.1  mrg 
    823  1.1  mrg void
    824  1.1  mrg gfc_allocate_lang_decl (tree decl)
    825  1.1  mrg {
    826  1.1  mrg   if (DECL_LANG_SPECIFIC (decl) == NULL)
    827  1.1  mrg     DECL_LANG_SPECIFIC (decl) = ggc_cleared_alloc<struct lang_decl> ();
    828  1.1  mrg }
    829  1.1  mrg 
    830  1.1  mrg /* Remember a symbol to generate initialization/cleanup code at function
    831  1.1  mrg    entry/exit.  */
    832  1.1  mrg 
    833  1.1  mrg static void
    834  1.1  mrg gfc_defer_symbol_init (gfc_symbol * sym)
    835  1.1  mrg {
    836  1.1  mrg   gfc_symbol *p;
    837  1.1  mrg   gfc_symbol *last;
    838  1.1  mrg   gfc_symbol *head;
    839  1.1  mrg 
    840  1.1  mrg   /* Don't add a symbol twice.  */
    841  1.1  mrg   if (sym->tlink)
    842  1.1  mrg     return;
    843  1.1  mrg 
    844  1.1  mrg   last = head = sym->ns->proc_name;
    845  1.1  mrg   p = last->tlink;
    846  1.1  mrg 
    847  1.1  mrg   /* Make sure that setup code for dummy variables which are used in the
    848  1.1  mrg      setup of other variables is generated first.  */
    849  1.1  mrg   if (sym->attr.dummy)
    850  1.1  mrg     {
    851  1.1  mrg       /* Find the first dummy arg seen after us, or the first non-dummy arg.
    852  1.1  mrg          This is a circular list, so don't go past the head.  */
    853  1.1  mrg       while (p != head
    854  1.1  mrg              && (!p->attr.dummy || p->dummy_order > sym->dummy_order))
    855  1.1  mrg         {
    856  1.1  mrg           last = p;
    857  1.1  mrg           p = p->tlink;
    858  1.1  mrg         }
    859  1.1  mrg     }
    860  1.1  mrg   /* Insert in between last and p.  */
    861  1.1  mrg   last->tlink = sym;
    862  1.1  mrg   sym->tlink = p;
    863  1.1  mrg }
    864  1.1  mrg 
    865  1.1  mrg 
    866  1.1  mrg /* Used in gfc_get_symbol_decl and gfc_get_derived_type to obtain the
    867  1.1  mrg    backend_decl for a module symbol, if it all ready exists.  If the
    868  1.1  mrg    module gsymbol does not exist, it is created.  If the symbol does
    869  1.1  mrg    not exist, it is added to the gsymbol namespace.  Returns true if
    870  1.1  mrg    an existing backend_decl is found.  */
    871  1.1  mrg 
    872  1.1  mrg bool
    873  1.1  mrg gfc_get_module_backend_decl (gfc_symbol *sym)
    874  1.1  mrg {
    875  1.1  mrg   gfc_gsymbol *gsym;
    876  1.1  mrg   gfc_symbol *s;
    877  1.1  mrg   gfc_symtree *st;
    878  1.1  mrg 
    879  1.1  mrg   gsym =  gfc_find_gsymbol (gfc_gsym_root, sym->module);
    880  1.1  mrg 
    881  1.1  mrg   if (!gsym || (gsym->ns && gsym->type == GSYM_MODULE))
    882  1.1  mrg     {
    883  1.1  mrg       st = NULL;
    884  1.1  mrg       s = NULL;
    885  1.1  mrg 
    886  1.1  mrg       /* Check for a symbol with the same name. */
    887  1.1  mrg       if (gsym)
    888  1.1  mrg 	gfc_find_symbol (sym->name, gsym->ns, 0, &s);
    889  1.1  mrg 
    890  1.1  mrg       if (!s)
    891  1.1  mrg 	{
    892  1.1  mrg 	  if (!gsym)
    893  1.1  mrg 	    {
    894  1.1  mrg 	      gsym = gfc_get_gsymbol (sym->module, false);
    895  1.1  mrg 	      gsym->type = GSYM_MODULE;
    896  1.1  mrg 	      gsym->ns = gfc_get_namespace (NULL, 0);
    897  1.1  mrg 	    }
    898  1.1  mrg 
    899  1.1  mrg 	  st = gfc_new_symtree (&gsym->ns->sym_root, sym->name);
    900  1.1  mrg 	  st->n.sym = sym;
    901  1.1  mrg 	  sym->refs++;
    902  1.1  mrg 	}
    903  1.1  mrg       else if (gfc_fl_struct (sym->attr.flavor))
    904  1.1  mrg 	{
    905  1.1  mrg 	  if (s && s->attr.flavor == FL_PROCEDURE)
    906  1.1  mrg 	    {
    907  1.1  mrg 	      gfc_interface *intr;
    908  1.1  mrg 	      gcc_assert (s->attr.generic);
    909  1.1  mrg 	      for (intr = s->generic; intr; intr = intr->next)
    910  1.1  mrg 		if (gfc_fl_struct (intr->sym->attr.flavor))
    911  1.1  mrg 		  {
    912  1.1  mrg 		    s = intr->sym;
    913  1.1  mrg 		    break;
    914  1.1  mrg 		  }
    915  1.1  mrg     	    }
    916  1.1  mrg 
    917  1.1  mrg           /* Normally we can assume that s is a derived-type symbol since it
    918  1.1  mrg              shares a name with the derived-type sym. However if sym is a
    919  1.1  mrg              STRUCTURE, it may in fact share a name with any other basic type
    920  1.1  mrg              variable. If s is in fact of derived type then we can continue
    921  1.1  mrg              looking for a duplicate type declaration.  */
    922  1.1  mrg           if (sym->attr.flavor == FL_STRUCT && s->ts.type == BT_DERIVED)
    923  1.1  mrg             {
    924  1.1  mrg               s = s->ts.u.derived;
    925  1.1  mrg             }
    926  1.1  mrg 
    927  1.1  mrg 	  if (gfc_fl_struct (s->attr.flavor) && !s->backend_decl)
    928  1.1  mrg             {
    929  1.1  mrg               if (s->attr.flavor == FL_UNION)
    930  1.1  mrg                 s->backend_decl = gfc_get_union_type (s);
    931  1.1  mrg               else
    932  1.1  mrg                 s->backend_decl = gfc_get_derived_type (s);
    933  1.1  mrg             }
    934  1.1  mrg 	  gfc_copy_dt_decls_ifequal (s, sym, true);
    935  1.1  mrg 	  return true;
    936  1.1  mrg 	}
    937  1.1  mrg       else if (s->backend_decl)
    938  1.1  mrg 	{
    939  1.1  mrg 	  if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
    940  1.1  mrg 	    gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
    941  1.1  mrg 				       true);
    942  1.1  mrg 	  else if (sym->ts.type == BT_CHARACTER)
    943  1.1  mrg 	    sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
    944  1.1  mrg 	  sym->backend_decl = s->backend_decl;
    945  1.1  mrg 	  return true;
    946  1.1  mrg 	}
    947  1.1  mrg     }
    948  1.1  mrg   return false;
    949  1.1  mrg }
    950  1.1  mrg 
    951  1.1  mrg 
    952  1.1  mrg /* Create an array index type variable with function scope.  */
    953  1.1  mrg 
    954  1.1  mrg static tree
    955  1.1  mrg create_index_var (const char * pfx, int nest)
    956  1.1  mrg {
    957  1.1  mrg   tree decl;
    958  1.1  mrg 
    959  1.1  mrg   decl = gfc_create_var_np (gfc_array_index_type, pfx);
    960  1.1  mrg   if (nest)
    961  1.1  mrg     gfc_add_decl_to_parent_function (decl);
    962  1.1  mrg   else
    963  1.1  mrg     gfc_add_decl_to_function (decl);
    964  1.1  mrg   return decl;
    965  1.1  mrg }
    966  1.1  mrg 
    967  1.1  mrg 
    968  1.1  mrg /* Create variables to hold all the non-constant bits of info for a
    969  1.1  mrg    descriptorless array.  Remember these in the lang-specific part of the
    970  1.1  mrg    type.  */
    971  1.1  mrg 
    972  1.1  mrg static void
    973  1.1  mrg gfc_build_qualified_array (tree decl, gfc_symbol * sym)
    974  1.1  mrg {
    975  1.1  mrg   tree type;
    976  1.1  mrg   int dim;
    977  1.1  mrg   int nest;
    978  1.1  mrg   gfc_namespace* procns;
    979  1.1  mrg   symbol_attribute *array_attr;
    980  1.1  mrg   gfc_array_spec *as;
    981  1.1  mrg   bool is_classarray = IS_CLASS_ARRAY (sym);
    982  1.1  mrg 
    983  1.1  mrg   type = TREE_TYPE (decl);
    984  1.1  mrg   array_attr = is_classarray ? &CLASS_DATA (sym)->attr : &sym->attr;
    985  1.1  mrg   as = is_classarray ? CLASS_DATA (sym)->as : sym->as;
    986  1.1  mrg 
    987  1.1  mrg   /* We just use the descriptor, if there is one.  */
    988  1.1  mrg   if (GFC_DESCRIPTOR_TYPE_P (type))
    989  1.1  mrg     return;
    990  1.1  mrg 
    991  1.1  mrg   gcc_assert (GFC_ARRAY_TYPE_P (type));
    992  1.1  mrg   procns = gfc_find_proc_namespace (sym->ns);
    993  1.1  mrg   nest = (procns->proc_name->backend_decl != current_function_decl)
    994  1.1  mrg 	 && !sym->attr.contained;
    995  1.1  mrg 
    996  1.1  mrg   if (array_attr->codimension && flag_coarray == GFC_FCOARRAY_LIB
    997  1.1  mrg       && as->type != AS_ASSUMED_SHAPE
    998  1.1  mrg       && GFC_TYPE_ARRAY_CAF_TOKEN (type) == NULL_TREE)
    999  1.1  mrg     {
   1000  1.1  mrg       tree token;
   1001  1.1  mrg       tree token_type = build_qualified_type (pvoid_type_node,
   1002  1.1  mrg 					      TYPE_QUAL_RESTRICT);
   1003  1.1  mrg 
   1004  1.1  mrg       if (sym->module && (sym->attr.use_assoc
   1005  1.1  mrg 			  || sym->ns->proc_name->attr.flavor == FL_MODULE))
   1006  1.1  mrg 	{
   1007  1.1  mrg 	  tree token_name
   1008  1.1  mrg 		= get_identifier (gfc_get_string (GFC_PREFIX ("caf_token%s"),
   1009  1.1  mrg 			IDENTIFIER_POINTER (gfc_sym_mangled_identifier (sym))));
   1010  1.1  mrg 	  token = build_decl (DECL_SOURCE_LOCATION (decl), VAR_DECL, token_name,
   1011  1.1  mrg 			      token_type);
   1012  1.1  mrg 	  if (sym->attr.use_assoc)
   1013  1.1  mrg 	    DECL_EXTERNAL (token) = 1;
   1014  1.1  mrg 	  else
   1015  1.1  mrg 	    TREE_STATIC (token) = 1;
   1016  1.1  mrg 
   1017  1.1  mrg 	  TREE_PUBLIC (token) = 1;
   1018  1.1  mrg 
   1019  1.1  mrg 	  if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used)
   1020  1.1  mrg 	    {
   1021  1.1  mrg 	      DECL_VISIBILITY (token) = VISIBILITY_HIDDEN;
   1022  1.1  mrg 	      DECL_VISIBILITY_SPECIFIED (token) = true;
   1023  1.1  mrg 	    }
   1024  1.1  mrg 	}
   1025  1.1  mrg       else
   1026  1.1  mrg 	{
   1027  1.1  mrg 	  token = gfc_create_var_np (token_type, "caf_token");
   1028  1.1  mrg 	  TREE_STATIC (token) = 1;
   1029  1.1  mrg 	}
   1030  1.1  mrg 
   1031  1.1  mrg       GFC_TYPE_ARRAY_CAF_TOKEN (type) = token;
   1032  1.1  mrg       DECL_ARTIFICIAL (token) = 1;
   1033  1.1  mrg       DECL_NONALIASED (token) = 1;
   1034  1.1  mrg 
   1035  1.1  mrg       if (sym->module && !sym->attr.use_assoc)
   1036  1.1  mrg 	{
   1037  1.1  mrg 	  pushdecl (token);
   1038  1.1  mrg 	  DECL_CONTEXT (token) = sym->ns->proc_name->backend_decl;
   1039  1.1  mrg 	  gfc_module_add_decl (cur_module, token);
   1040  1.1  mrg 	}
   1041  1.1  mrg       else if (sym->attr.host_assoc
   1042  1.1  mrg 	       && TREE_CODE (DECL_CONTEXT (current_function_decl))
   1043  1.1  mrg 	       != TRANSLATION_UNIT_DECL)
   1044  1.1  mrg 	gfc_add_decl_to_parent_function (token);
   1045  1.1  mrg       else
   1046  1.1  mrg 	gfc_add_decl_to_function (token);
   1047  1.1  mrg     }
   1048  1.1  mrg 
   1049  1.1  mrg   for (dim = 0; dim < GFC_TYPE_ARRAY_RANK (type); dim++)
   1050  1.1  mrg     {
   1051  1.1  mrg       if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
   1052  1.1  mrg 	{
   1053  1.1  mrg 	  GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
   1054  1.1  mrg 	  suppress_warning (GFC_TYPE_ARRAY_LBOUND (type, dim));
   1055  1.1  mrg 	}
   1056  1.1  mrg       /* Don't try to use the unknown bound for assumed shape arrays.  */
   1057  1.1  mrg       if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
   1058  1.1  mrg 	  && (as->type != AS_ASSUMED_SIZE
   1059  1.1  mrg 	      || dim < GFC_TYPE_ARRAY_RANK (type) - 1))
   1060  1.1  mrg 	{
   1061  1.1  mrg 	  GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
   1062  1.1  mrg 	  suppress_warning (GFC_TYPE_ARRAY_UBOUND (type, dim));
   1063  1.1  mrg 	}
   1064  1.1  mrg 
   1065  1.1  mrg       if (GFC_TYPE_ARRAY_STRIDE (type, dim) == NULL_TREE)
   1066  1.1  mrg 	{
   1067  1.1  mrg 	  GFC_TYPE_ARRAY_STRIDE (type, dim) = create_index_var ("stride", nest);
   1068  1.1  mrg 	  suppress_warning (GFC_TYPE_ARRAY_STRIDE (type, dim));
   1069  1.1  mrg 	}
   1070  1.1  mrg     }
   1071  1.1  mrg   for (dim = GFC_TYPE_ARRAY_RANK (type);
   1072  1.1  mrg        dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type); dim++)
   1073  1.1  mrg     {
   1074  1.1  mrg       if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
   1075  1.1  mrg 	{
   1076  1.1  mrg 	  GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
   1077  1.1  mrg 	  suppress_warning (GFC_TYPE_ARRAY_LBOUND (type, dim));
   1078  1.1  mrg 	}
   1079  1.1  mrg       /* Don't try to use the unknown ubound for the last coarray dimension.  */
   1080  1.1  mrg       if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
   1081  1.1  mrg           && dim < GFC_TYPE_ARRAY_RANK (type) + GFC_TYPE_ARRAY_CORANK (type) - 1)
   1082  1.1  mrg 	{
   1083  1.1  mrg 	  GFC_TYPE_ARRAY_UBOUND (type, dim) = create_index_var ("ubound", nest);
   1084  1.1  mrg 	  suppress_warning (GFC_TYPE_ARRAY_UBOUND (type, dim));
   1085  1.1  mrg 	}
   1086  1.1  mrg     }
   1087  1.1  mrg   if (GFC_TYPE_ARRAY_OFFSET (type) == NULL_TREE)
   1088  1.1  mrg     {
   1089  1.1  mrg       GFC_TYPE_ARRAY_OFFSET (type) = gfc_create_var_np (gfc_array_index_type,
   1090  1.1  mrg 							"offset");
   1091  1.1  mrg       suppress_warning (GFC_TYPE_ARRAY_OFFSET (type));
   1092  1.1  mrg 
   1093  1.1  mrg       if (nest)
   1094  1.1  mrg 	gfc_add_decl_to_parent_function (GFC_TYPE_ARRAY_OFFSET (type));
   1095  1.1  mrg       else
   1096  1.1  mrg 	gfc_add_decl_to_function (GFC_TYPE_ARRAY_OFFSET (type));
   1097  1.1  mrg     }
   1098  1.1  mrg 
   1099  1.1  mrg   if (GFC_TYPE_ARRAY_SIZE (type) == NULL_TREE
   1100  1.1  mrg       && as->type != AS_ASSUMED_SIZE)
   1101  1.1  mrg     {
   1102  1.1  mrg       GFC_TYPE_ARRAY_SIZE (type) = create_index_var ("size", nest);
   1103  1.1  mrg       suppress_warning (GFC_TYPE_ARRAY_SIZE (type));
   1104  1.1  mrg     }
   1105  1.1  mrg 
   1106  1.1  mrg   if (POINTER_TYPE_P (type))
   1107  1.1  mrg     {
   1108  1.1  mrg       gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (type)));
   1109  1.1  mrg       gcc_assert (TYPE_LANG_SPECIFIC (type)
   1110  1.1  mrg 		  == TYPE_LANG_SPECIFIC (TREE_TYPE (type)));
   1111  1.1  mrg       type = TREE_TYPE (type);
   1112  1.1  mrg     }
   1113  1.1  mrg 
   1114  1.1  mrg   if (! COMPLETE_TYPE_P (type) && GFC_TYPE_ARRAY_SIZE (type))
   1115  1.1  mrg     {
   1116  1.1  mrg       tree size, range;
   1117  1.1  mrg 
   1118  1.1  mrg       size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
   1119  1.1  mrg 			      GFC_TYPE_ARRAY_SIZE (type), gfc_index_one_node);
   1120  1.1  mrg       range = build_range_type (gfc_array_index_type, gfc_index_zero_node,
   1121  1.1  mrg 				size);
   1122  1.1  mrg       TYPE_DOMAIN (type) = range;
   1123  1.1  mrg       layout_type (type);
   1124  1.1  mrg     }
   1125  1.1  mrg 
   1126  1.1  mrg   if (TYPE_NAME (type) != NULL_TREE && as->rank > 0
   1127  1.1  mrg       && GFC_TYPE_ARRAY_UBOUND (type, as->rank - 1) != NULL_TREE
   1128  1.1  mrg       && VAR_P (GFC_TYPE_ARRAY_UBOUND (type, as->rank - 1)))
   1129  1.1  mrg     {
   1130  1.1  mrg       tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
   1131  1.1  mrg 
   1132  1.1  mrg       for (dim = 0; dim < as->rank - 1; dim++)
   1133  1.1  mrg 	{
   1134  1.1  mrg 	  gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
   1135  1.1  mrg 	  gtype = TREE_TYPE (gtype);
   1136  1.1  mrg 	}
   1137  1.1  mrg       gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE);
   1138  1.1  mrg       if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL)
   1139  1.1  mrg 	TYPE_NAME (type) = NULL_TREE;
   1140  1.1  mrg     }
   1141  1.1  mrg 
   1142  1.1  mrg   if (TYPE_NAME (type) == NULL_TREE)
   1143  1.1  mrg     {
   1144  1.1  mrg       tree gtype = TREE_TYPE (type), rtype, type_decl;
   1145  1.1  mrg 
   1146  1.1  mrg       for (dim = as->rank - 1; dim >= 0; dim--)
   1147  1.1  mrg 	{
   1148  1.1  mrg 	  tree lbound, ubound;
   1149  1.1  mrg 	  lbound = GFC_TYPE_ARRAY_LBOUND (type, dim);
   1150  1.1  mrg 	  ubound = GFC_TYPE_ARRAY_UBOUND (type, dim);
   1151  1.1  mrg 	  rtype = build_range_type (gfc_array_index_type, lbound, ubound);
   1152  1.1  mrg 	  gtype = build_array_type (gtype, rtype);
   1153  1.1  mrg 	  /* Ensure the bound variables aren't optimized out at -O0.
   1154  1.1  mrg 	     For -O1 and above they often will be optimized out, but
   1155  1.1  mrg 	     can be tracked by VTA.  Also set DECL_NAMELESS, so that
   1156  1.1  mrg 	     the artificial lbound.N or ubound.N DECL_NAME doesn't
   1157  1.1  mrg 	     end up in debug info.  */
   1158  1.1  mrg 	  if (lbound
   1159  1.1  mrg 	      && VAR_P (lbound)
   1160  1.1  mrg 	      && DECL_ARTIFICIAL (lbound)
   1161  1.1  mrg 	      && DECL_IGNORED_P (lbound))
   1162  1.1  mrg 	    {
   1163  1.1  mrg 	      if (DECL_NAME (lbound)
   1164  1.1  mrg 		  && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
   1165  1.1  mrg 			     "lbound") != 0)
   1166  1.1  mrg 		DECL_NAMELESS (lbound) = 1;
   1167  1.1  mrg 	      DECL_IGNORED_P (lbound) = 0;
   1168  1.1  mrg 	    }
   1169  1.1  mrg 	  if (ubound
   1170  1.1  mrg 	      && VAR_P (ubound)
   1171  1.1  mrg 	      && DECL_ARTIFICIAL (ubound)
   1172  1.1  mrg 	      && DECL_IGNORED_P (ubound))
   1173  1.1  mrg 	    {
   1174  1.1  mrg 	      if (DECL_NAME (ubound)
   1175  1.1  mrg 		  && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
   1176  1.1  mrg 			     "ubound") != 0)
   1177  1.1  mrg 		DECL_NAMELESS (ubound) = 1;
   1178  1.1  mrg 	      DECL_IGNORED_P (ubound) = 0;
   1179  1.1  mrg 	    }
   1180  1.1  mrg 	}
   1181  1.1  mrg       TYPE_NAME (type) = type_decl = build_decl (input_location,
   1182  1.1  mrg 						 TYPE_DECL, NULL, gtype);
   1183  1.1  mrg       DECL_ORIGINAL_TYPE (type_decl) = gtype;
   1184  1.1  mrg     }
   1185  1.1  mrg }
   1186  1.1  mrg 
   1187  1.1  mrg 
   1188  1.1  mrg /* For some dummy arguments we don't use the actual argument directly.
   1189  1.1  mrg    Instead we create a local decl and use that.  This allows us to perform
   1190  1.1  mrg    initialization, and construct full type information.  */
   1191  1.1  mrg 
   1192  1.1  mrg static tree
   1193  1.1  mrg gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
   1194  1.1  mrg {
   1195  1.1  mrg   tree decl;
   1196  1.1  mrg   tree type;
   1197  1.1  mrg   gfc_array_spec *as;
   1198  1.1  mrg   symbol_attribute *array_attr;
   1199  1.1  mrg   char *name;
   1200  1.1  mrg   gfc_packed packed;
   1201  1.1  mrg   int n;
   1202  1.1  mrg   bool known_size;
   1203  1.1  mrg   bool is_classarray = IS_CLASS_ARRAY (sym);
   1204  1.1  mrg 
   1205  1.1  mrg   /* Use the array as and attr.  */
   1206  1.1  mrg   as = is_classarray ? CLASS_DATA (sym)->as : sym->as;
   1207  1.1  mrg   array_attr = is_classarray ? &CLASS_DATA (sym)->attr : &sym->attr;
   1208  1.1  mrg 
   1209  1.1  mrg   /* The dummy is returned for pointer, allocatable or assumed rank arrays.
   1210  1.1  mrg      For class arrays the information if sym is an allocatable or pointer
   1211  1.1  mrg      object needs to be checked explicitly (IS_CLASS_ARRAY can be false for
   1212  1.1  mrg      too many reasons to be of use here).  */
   1213  1.1  mrg   if ((sym->ts.type != BT_CLASS && sym->attr.pointer)
   1214  1.1  mrg       || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.class_pointer)
   1215  1.1  mrg       || array_attr->allocatable
   1216  1.1  mrg       || (as && as->type == AS_ASSUMED_RANK))
   1217  1.1  mrg     return dummy;
   1218  1.1  mrg 
   1219  1.1  mrg   /* Add to list of variables if not a fake result variable.
   1220  1.1  mrg      These symbols are set on the symbol only, not on the class component.  */
   1221  1.1  mrg   if (sym->attr.result || sym->attr.dummy)
   1222  1.1  mrg     gfc_defer_symbol_init (sym);
   1223  1.1  mrg 
   1224  1.1  mrg   /* For a class array the array descriptor is in the _data component, while
   1225  1.1  mrg      for a regular array the TREE_TYPE of the dummy is a pointer to the
   1226  1.1  mrg      descriptor.  */
   1227  1.1  mrg   type = TREE_TYPE (is_classarray ? gfc_class_data_get (dummy)
   1228  1.1  mrg 				  : TREE_TYPE (dummy));
   1229  1.1  mrg   /* type now is the array descriptor w/o any indirection.  */
   1230  1.1  mrg   gcc_assert (TREE_CODE (dummy) == PARM_DECL
   1231  1.1  mrg 	  && POINTER_TYPE_P (TREE_TYPE (dummy)));
   1232  1.1  mrg 
   1233  1.1  mrg   /* Do we know the element size?  */
   1234  1.1  mrg   known_size = sym->ts.type != BT_CHARACTER
   1235  1.1  mrg 	  || INTEGER_CST_P (sym->ts.u.cl->backend_decl);
   1236  1.1  mrg 
   1237  1.1  mrg   if (known_size && !GFC_DESCRIPTOR_TYPE_P (type))
   1238  1.1  mrg     {
   1239  1.1  mrg       /* For descriptorless arrays with known element size the actual
   1240  1.1  mrg          argument is sufficient.  */
   1241  1.1  mrg       gfc_build_qualified_array (dummy, sym);
   1242  1.1  mrg       return dummy;
   1243  1.1  mrg     }
   1244  1.1  mrg 
   1245  1.1  mrg   if (GFC_DESCRIPTOR_TYPE_P (type))
   1246  1.1  mrg     {
   1247  1.1  mrg       /* Create a descriptorless array pointer.  */
   1248  1.1  mrg       packed = PACKED_NO;
   1249  1.1  mrg 
   1250  1.1  mrg       /* Even when -frepack-arrays is used, symbols with TARGET attribute
   1251  1.1  mrg 	 are not repacked.  */
   1252  1.1  mrg       if (!flag_repack_arrays || sym->attr.target)
   1253  1.1  mrg 	{
   1254  1.1  mrg 	  if (as->type == AS_ASSUMED_SIZE)
   1255  1.1  mrg 	    packed = PACKED_FULL;
   1256  1.1  mrg 	}
   1257  1.1  mrg       else
   1258  1.1  mrg 	{
   1259  1.1  mrg 	  if (as->type == AS_EXPLICIT)
   1260  1.1  mrg 	    {
   1261  1.1  mrg 	      packed = PACKED_FULL;
   1262  1.1  mrg 	      for (n = 0; n < as->rank; n++)
   1263  1.1  mrg 		{
   1264  1.1  mrg 		  if (!(as->upper[n]
   1265  1.1  mrg 			&& as->lower[n]
   1266  1.1  mrg 			&& as->upper[n]->expr_type == EXPR_CONSTANT
   1267  1.1  mrg 			&& as->lower[n]->expr_type == EXPR_CONSTANT))
   1268  1.1  mrg 		    {
   1269  1.1  mrg 		      packed = PACKED_PARTIAL;
   1270  1.1  mrg 		      break;
   1271  1.1  mrg 		    }
   1272  1.1  mrg 		}
   1273  1.1  mrg 	    }
   1274  1.1  mrg 	  else
   1275  1.1  mrg 	    packed = PACKED_PARTIAL;
   1276  1.1  mrg 	}
   1277  1.1  mrg 
   1278  1.1  mrg       /* For classarrays the element type is required, but
   1279  1.1  mrg 	 gfc_typenode_for_spec () returns the array descriptor.  */
   1280  1.1  mrg       type = is_classarray ? gfc_get_element_type (type)
   1281  1.1  mrg 			   : gfc_typenode_for_spec (&sym->ts);
   1282  1.1  mrg       type = gfc_get_nodesc_array_type (type, as, packed,
   1283  1.1  mrg 					!sym->attr.target);
   1284  1.1  mrg     }
   1285  1.1  mrg   else
   1286  1.1  mrg     {
   1287  1.1  mrg       /* We now have an expression for the element size, so create a fully
   1288  1.1  mrg 	 qualified type.  Reset sym->backend decl or this will just return the
   1289  1.1  mrg 	 old type.  */
   1290  1.1  mrg       DECL_ARTIFICIAL (sym->backend_decl) = 1;
   1291  1.1  mrg       sym->backend_decl = NULL_TREE;
   1292  1.1  mrg       type = gfc_sym_type (sym);
   1293  1.1  mrg       packed = PACKED_FULL;
   1294  1.1  mrg     }
   1295  1.1  mrg 
   1296  1.1  mrg   ASM_FORMAT_PRIVATE_NAME (name, IDENTIFIER_POINTER (DECL_NAME (dummy)), 0);
   1297  1.1  mrg   decl = build_decl (input_location,
   1298  1.1  mrg 		     VAR_DECL, get_identifier (name), type);
   1299  1.1  mrg 
   1300  1.1  mrg   DECL_ARTIFICIAL (decl) = 1;
   1301  1.1  mrg   DECL_NAMELESS (decl) = 1;
   1302  1.1  mrg   TREE_PUBLIC (decl) = 0;
   1303  1.1  mrg   TREE_STATIC (decl) = 0;
   1304  1.1  mrg   DECL_EXTERNAL (decl) = 0;
   1305  1.1  mrg 
   1306  1.1  mrg   /* Avoid uninitialized warnings for optional dummy arguments.  */
   1307  1.1  mrg   if ((sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.optional)
   1308  1.1  mrg       || sym->attr.optional)
   1309  1.1  mrg     suppress_warning (decl);
   1310  1.1  mrg 
   1311  1.1  mrg   /* We should never get deferred shape arrays here.  We used to because of
   1312  1.1  mrg      frontend bugs.  */
   1313  1.1  mrg   gcc_assert (as->type != AS_DEFERRED);
   1314  1.1  mrg 
   1315  1.1  mrg   if (packed == PACKED_PARTIAL)
   1316  1.1  mrg     GFC_DECL_PARTIAL_PACKED_ARRAY (decl) = 1;
   1317  1.1  mrg   else if (packed == PACKED_FULL)
   1318  1.1  mrg     GFC_DECL_PACKED_ARRAY (decl) = 1;
   1319  1.1  mrg 
   1320  1.1  mrg   gfc_build_qualified_array (decl, sym);
   1321  1.1  mrg 
   1322  1.1  mrg   if (DECL_LANG_SPECIFIC (dummy))
   1323  1.1  mrg     DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (dummy);
   1324  1.1  mrg   else
   1325  1.1  mrg     gfc_allocate_lang_decl (decl);
   1326  1.1  mrg 
   1327  1.1  mrg   GFC_DECL_SAVED_DESCRIPTOR (decl) = dummy;
   1328  1.1  mrg 
   1329  1.1  mrg   if (sym->ns->proc_name->backend_decl == current_function_decl
   1330  1.1  mrg       || sym->attr.contained)
   1331  1.1  mrg     gfc_add_decl_to_function (decl);
   1332  1.1  mrg   else
   1333  1.1  mrg     gfc_add_decl_to_parent_function (decl);
   1334  1.1  mrg 
   1335  1.1  mrg   return decl;
   1336  1.1  mrg }
   1337  1.1  mrg 
   1338  1.1  mrg /* Return a constant or a variable to use as a string length.  Does not
   1339  1.1  mrg    add the decl to the current scope.  */
   1340  1.1  mrg 
   1341  1.1  mrg static tree
   1342  1.1  mrg gfc_create_string_length (gfc_symbol * sym)
   1343  1.1  mrg {
   1344  1.1  mrg   gcc_assert (sym->ts.u.cl);
   1345  1.1  mrg   gfc_conv_const_charlen (sym->ts.u.cl);
   1346  1.1  mrg 
   1347  1.1  mrg   if (sym->ts.u.cl->backend_decl == NULL_TREE)
   1348  1.1  mrg     {
   1349  1.1  mrg       tree length;
   1350  1.1  mrg       const char *name;
   1351  1.1  mrg 
   1352  1.1  mrg       /* The string length variable shall be in static memory if it is either
   1353  1.1  mrg 	 explicitly SAVED, a module variable or with -fno-automatic. Only
   1354  1.1  mrg 	 relevant is "len=:" - otherwise, it is either a constant length or
   1355  1.1  mrg 	 it is an automatic variable.  */
   1356  1.1  mrg       bool static_length = sym->attr.save
   1357  1.1  mrg 			   || sym->ns->proc_name->attr.flavor == FL_MODULE
   1358  1.1  mrg 			   || (flag_max_stack_var_size == 0
   1359  1.1  mrg 			       && sym->ts.deferred && !sym->attr.dummy
   1360  1.1  mrg 			       && !sym->attr.result && !sym->attr.function);
   1361  1.1  mrg 
   1362  1.1  mrg       /* Also prefix the mangled name. We need to call GFC_PREFIX for static
   1363  1.1  mrg 	 variables as some systems do not support the "." in the assembler name.
   1364  1.1  mrg 	 For nonstatic variables, the "." does not appear in assembler.  */
   1365  1.1  mrg       if (static_length)
   1366  1.1  mrg 	{
   1367  1.1  mrg 	  if (sym->module)
   1368  1.1  mrg 	    name = gfc_get_string (GFC_PREFIX ("%s_MOD_%s"), sym->module,
   1369  1.1  mrg 				   sym->name);
   1370  1.1  mrg 	  else
   1371  1.1  mrg 	    name = gfc_get_string (GFC_PREFIX ("%s"), sym->name);
   1372  1.1  mrg 	}
   1373  1.1  mrg       else if (sym->module)
   1374  1.1  mrg 	name = gfc_get_string (".__%s_MOD_%s", sym->module, sym->name);
   1375  1.1  mrg       else
   1376  1.1  mrg 	name = gfc_get_string (".%s", sym->name);
   1377  1.1  mrg 
   1378  1.1  mrg       length = build_decl (input_location,
   1379  1.1  mrg 			   VAR_DECL, get_identifier (name),
   1380  1.1  mrg 			   gfc_charlen_type_node);
   1381  1.1  mrg       DECL_ARTIFICIAL (length) = 1;
   1382  1.1  mrg       TREE_USED (length) = 1;
   1383  1.1  mrg       if (sym->ns->proc_name->tlink != NULL)
   1384  1.1  mrg 	gfc_defer_symbol_init (sym);
   1385  1.1  mrg 
   1386  1.1  mrg       sym->ts.u.cl->backend_decl = length;
   1387  1.1  mrg 
   1388  1.1  mrg       if (static_length)
   1389  1.1  mrg 	TREE_STATIC (length) = 1;
   1390  1.1  mrg 
   1391  1.1  mrg       if (sym->ns->proc_name->attr.flavor == FL_MODULE
   1392  1.1  mrg 	  && (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used))
   1393  1.1  mrg 	TREE_PUBLIC (length) = 1;
   1394  1.1  mrg     }
   1395  1.1  mrg 
   1396  1.1  mrg   gcc_assert (sym->ts.u.cl->backend_decl != NULL_TREE);
   1397  1.1  mrg   return sym->ts.u.cl->backend_decl;
   1398  1.1  mrg }
   1399  1.1  mrg 
   1400  1.1  mrg /* If a variable is assigned a label, we add another two auxiliary
   1401  1.1  mrg    variables.  */
   1402  1.1  mrg 
   1403  1.1  mrg static void
   1404  1.1  mrg gfc_add_assign_aux_vars (gfc_symbol * sym)
   1405  1.1  mrg {
   1406  1.1  mrg   tree addr;
   1407  1.1  mrg   tree length;
   1408  1.1  mrg   tree decl;
   1409  1.1  mrg 
   1410  1.1  mrg   gcc_assert (sym->backend_decl);
   1411  1.1  mrg 
   1412  1.1  mrg   decl = sym->backend_decl;
   1413  1.1  mrg   gfc_allocate_lang_decl (decl);
   1414  1.1  mrg   GFC_DECL_ASSIGN (decl) = 1;
   1415  1.1  mrg   length = build_decl (input_location,
   1416  1.1  mrg 		       VAR_DECL, create_tmp_var_name (sym->name),
   1417  1.1  mrg 		       gfc_charlen_type_node);
   1418  1.1  mrg   addr = build_decl (input_location,
   1419  1.1  mrg 		     VAR_DECL, create_tmp_var_name (sym->name),
   1420  1.1  mrg 		     pvoid_type_node);
   1421  1.1  mrg   gfc_finish_var_decl (length, sym);
   1422  1.1  mrg   gfc_finish_var_decl (addr, sym);
   1423  1.1  mrg   /*  STRING_LENGTH is also used as flag. Less than -1 means that
   1424  1.1  mrg       ASSIGN_ADDR cannot be used. Equal -1 means that ASSIGN_ADDR is the
   1425  1.1  mrg       target label's address. Otherwise, value is the length of a format string
   1426  1.1  mrg       and ASSIGN_ADDR is its address.  */
   1427  1.1  mrg   if (TREE_STATIC (length))
   1428  1.1  mrg     DECL_INITIAL (length) = build_int_cst (gfc_charlen_type_node, -2);
   1429  1.1  mrg   else
   1430  1.1  mrg     gfc_defer_symbol_init (sym);
   1431  1.1  mrg 
   1432  1.1  mrg   GFC_DECL_STRING_LEN (decl) = length;
   1433  1.1  mrg   GFC_DECL_ASSIGN_ADDR (decl) = addr;
   1434  1.1  mrg }
   1435  1.1  mrg 
   1436  1.1  mrg 
   1437  1.1  mrg static tree
   1438  1.1  mrg add_attributes_to_decl (symbol_attribute sym_attr, tree list)
   1439  1.1  mrg {
   1440  1.1  mrg   unsigned id;
   1441  1.1  mrg   tree attr;
   1442  1.1  mrg 
   1443  1.1  mrg   for (id = 0; id < EXT_ATTR_NUM; id++)
   1444  1.1  mrg     if (sym_attr.ext_attr & (1 << id) && ext_attr_list[id].middle_end_name)
   1445  1.1  mrg       {
   1446  1.1  mrg 	attr = build_tree_list (
   1447  1.1  mrg 		 get_identifier (ext_attr_list[id].middle_end_name),
   1448  1.1  mrg 				 NULL_TREE);
   1449  1.1  mrg 	list = chainon (list, attr);
   1450  1.1  mrg       }
   1451  1.1  mrg 
   1452  1.1  mrg   tree clauses = NULL_TREE;
   1453  1.1  mrg 
   1454  1.1  mrg   if (sym_attr.oacc_routine_lop != OACC_ROUTINE_LOP_NONE)
   1455  1.1  mrg     {
   1456  1.1  mrg       omp_clause_code code;
   1457  1.1  mrg       switch (sym_attr.oacc_routine_lop)
   1458  1.1  mrg 	{
   1459  1.1  mrg 	case OACC_ROUTINE_LOP_GANG:
   1460  1.1  mrg 	  code = OMP_CLAUSE_GANG;
   1461  1.1  mrg 	  break;
   1462  1.1  mrg 	case OACC_ROUTINE_LOP_WORKER:
   1463  1.1  mrg 	  code = OMP_CLAUSE_WORKER;
   1464  1.1  mrg 	  break;
   1465  1.1  mrg 	case OACC_ROUTINE_LOP_VECTOR:
   1466  1.1  mrg 	  code = OMP_CLAUSE_VECTOR;
   1467  1.1  mrg 	  break;
   1468  1.1  mrg 	case OACC_ROUTINE_LOP_SEQ:
   1469  1.1  mrg 	  code = OMP_CLAUSE_SEQ;
   1470  1.1  mrg 	  break;
   1471  1.1  mrg 	case OACC_ROUTINE_LOP_NONE:
   1472  1.1  mrg 	case OACC_ROUTINE_LOP_ERROR:
   1473  1.1  mrg 	default:
   1474  1.1  mrg 	  gcc_unreachable ();
   1475  1.1  mrg 	}
   1476  1.1  mrg       tree c = build_omp_clause (UNKNOWN_LOCATION, code);
   1477  1.1  mrg       OMP_CLAUSE_CHAIN (c) = clauses;
   1478  1.1  mrg       clauses = c;
   1479  1.1  mrg 
   1480  1.1  mrg       tree dims = oacc_build_routine_dims (clauses);
   1481  1.1  mrg       list = oacc_replace_fn_attrib_attr (list, dims);
   1482  1.1  mrg     }
   1483  1.1  mrg 
   1484  1.1  mrg   if (sym_attr.oacc_routine_nohost)
   1485  1.1  mrg     {
   1486  1.1  mrg       tree c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_NOHOST);
   1487  1.1  mrg       OMP_CLAUSE_CHAIN (c) = clauses;
   1488  1.1  mrg       clauses = c;
   1489  1.1  mrg     }
   1490  1.1  mrg 
   1491  1.1  mrg   if (sym_attr.omp_device_type != OMP_DEVICE_TYPE_UNSET)
   1492  1.1  mrg     {
   1493  1.1  mrg       tree c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_DEVICE_TYPE);
   1494  1.1  mrg       switch (sym_attr.omp_device_type)
   1495  1.1  mrg 	{
   1496  1.1  mrg 	case OMP_DEVICE_TYPE_HOST:
   1497  1.1  mrg 	  OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_HOST;
   1498  1.1  mrg 	  break;
   1499  1.1  mrg 	case OMP_DEVICE_TYPE_NOHOST:
   1500  1.1  mrg 	  OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_NOHOST;
   1501  1.1  mrg 	  break;
   1502  1.1  mrg 	case OMP_DEVICE_TYPE_ANY:
   1503  1.1  mrg 	  OMP_CLAUSE_DEVICE_TYPE_KIND (c) = OMP_CLAUSE_DEVICE_TYPE_ANY;
   1504  1.1  mrg 	  break;
   1505  1.1  mrg 	default:
   1506  1.1  mrg 	  gcc_unreachable ();
   1507  1.1  mrg 	}
   1508  1.1  mrg       OMP_CLAUSE_CHAIN (c) = clauses;
   1509  1.1  mrg       clauses = c;
   1510  1.1  mrg     }
   1511  1.1  mrg 
   1512  1.1  mrg   if (sym_attr.omp_declare_target_link
   1513  1.1  mrg       || sym_attr.oacc_declare_link)
   1514  1.1  mrg     list = tree_cons (get_identifier ("omp declare target link"),
   1515  1.1  mrg 		      clauses, list);
   1516  1.1  mrg   else if (sym_attr.omp_declare_target
   1517  1.1  mrg 	   || sym_attr.oacc_declare_create
   1518  1.1  mrg 	   || sym_attr.oacc_declare_copyin
   1519  1.1  mrg 	   || sym_attr.oacc_declare_deviceptr
   1520  1.1  mrg 	   || sym_attr.oacc_declare_device_resident)
   1521  1.1  mrg     list = tree_cons (get_identifier ("omp declare target"),
   1522  1.1  mrg 		      clauses, list);
   1523  1.1  mrg 
   1524  1.1  mrg   return list;
   1525  1.1  mrg }
   1526  1.1  mrg 
   1527  1.1  mrg 
   1528  1.1  mrg static void build_function_decl (gfc_symbol * sym, bool global);
   1529  1.1  mrg 
   1530  1.1  mrg 
   1531  1.1  mrg /* Return the decl for a gfc_symbol, create it if it doesn't already
   1532  1.1  mrg    exist.  */
   1533  1.1  mrg 
   1534  1.1  mrg tree
   1535  1.1  mrg gfc_get_symbol_decl (gfc_symbol * sym)
   1536  1.1  mrg {
   1537  1.1  mrg   tree decl;
   1538  1.1  mrg   tree length = NULL_TREE;
   1539  1.1  mrg   tree attributes;
   1540  1.1  mrg   int byref;
   1541  1.1  mrg   bool intrinsic_array_parameter = false;
   1542  1.1  mrg   bool fun_or_res;
   1543  1.1  mrg 
   1544  1.1  mrg   gcc_assert (sym->attr.referenced
   1545  1.1  mrg 	      || sym->attr.flavor == FL_PROCEDURE
   1546  1.1  mrg 	      || sym->attr.use_assoc
   1547  1.1  mrg 	      || sym->attr.used_in_submodule
   1548  1.1  mrg 	      || sym->ns->proc_name->attr.if_source == IFSRC_IFBODY
   1549  1.1  mrg 	      || (sym->module && sym->attr.if_source != IFSRC_DECL
   1550  1.1  mrg 		  && sym->backend_decl));
   1551  1.1  mrg 
   1552  1.1  mrg   if (sym->attr.dummy && sym->ns->proc_name->attr.is_bind_c
   1553  1.1  mrg       && is_CFI_desc (sym, NULL))
   1554  1.1  mrg     {
   1555  1.1  mrg       gcc_assert (sym->backend_decl && (sym->ts.type != BT_CHARACTER
   1556  1.1  mrg 					|| sym->ts.u.cl->backend_decl));
   1557  1.1  mrg       return sym->backend_decl;
   1558  1.1  mrg     }
   1559  1.1  mrg 
   1560  1.1  mrg   if (sym->ns && sym->ns->proc_name && sym->ns->proc_name->attr.function)
   1561  1.1  mrg     byref = gfc_return_by_reference (sym->ns->proc_name);
   1562  1.1  mrg   else
   1563  1.1  mrg     byref = 0;
   1564  1.1  mrg 
   1565  1.1  mrg   /* Make sure that the vtab for the declared type is completed.  */
   1566  1.1  mrg   if (sym->ts.type == BT_CLASS)
   1567  1.1  mrg     {
   1568  1.1  mrg       gfc_component *c = CLASS_DATA (sym);
   1569  1.1  mrg       if (!c->ts.u.derived->backend_decl)
   1570  1.1  mrg 	{
   1571  1.1  mrg 	  gfc_find_derived_vtab (c->ts.u.derived);
   1572  1.1  mrg 	  gfc_get_derived_type (sym->ts.u.derived);
   1573  1.1  mrg 	}
   1574  1.1  mrg     }
   1575  1.1  mrg 
   1576  1.1  mrg   /* PDT parameterized array components and string_lengths must have the
   1577  1.1  mrg      'len' parameters substituted for the expressions appearing in the
   1578  1.1  mrg      declaration of the entity and memory allocated/deallocated.  */
   1579  1.1  mrg   if ((sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
   1580  1.1  mrg       && sym->param_list != NULL
   1581  1.1  mrg       && gfc_current_ns == sym->ns
   1582  1.1  mrg       && !(sym->attr.use_assoc || sym->attr.dummy))
   1583  1.1  mrg     gfc_defer_symbol_init (sym);
   1584  1.1  mrg 
   1585  1.1  mrg   /* Dummy PDT 'len' parameters should be checked when they are explicit.  */
   1586  1.1  mrg   if ((sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
   1587  1.1  mrg       && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
   1588  1.1  mrg       && sym->param_list != NULL
   1589  1.1  mrg       && sym->attr.dummy)
   1590  1.1  mrg     gfc_defer_symbol_init (sym);
   1591  1.1  mrg 
   1592  1.1  mrg   /* All deferred character length procedures need to retain the backend
   1593  1.1  mrg      decl, which is a pointer to the character length in the caller's
   1594  1.1  mrg      namespace and to declare a local character length.  */
   1595  1.1  mrg   if (!byref && sym->attr.function
   1596  1.1  mrg 	&& sym->ts.type == BT_CHARACTER
   1597  1.1  mrg 	&& sym->ts.deferred
   1598  1.1  mrg 	&& sym->ts.u.cl->passed_length == NULL
   1599  1.1  mrg 	&& sym->ts.u.cl->backend_decl
   1600  1.1  mrg 	&& TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
   1601  1.1  mrg     {
   1602  1.1  mrg       sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
   1603  1.1  mrg       gcc_assert (POINTER_TYPE_P (TREE_TYPE (sym->ts.u.cl->passed_length)));
   1604  1.1  mrg       sym->ts.u.cl->backend_decl = build_fold_indirect_ref (sym->ts.u.cl->backend_decl);
   1605  1.1  mrg     }
   1606  1.1  mrg 
   1607  1.1  mrg   fun_or_res = byref && (sym->attr.result
   1608  1.1  mrg 			 || (sym->attr.function && sym->ts.deferred));
   1609  1.1  mrg   if ((sym->attr.dummy && ! sym->attr.function) || fun_or_res)
   1610  1.1  mrg     {
   1611  1.1  mrg       /* Return via extra parameter.  */
   1612  1.1  mrg       if (sym->attr.result && byref
   1613  1.1  mrg 	  && !sym->backend_decl)
   1614  1.1  mrg 	{
   1615  1.1  mrg 	  sym->backend_decl =
   1616  1.1  mrg 	    DECL_ARGUMENTS (sym->ns->proc_name->backend_decl);
   1617  1.1  mrg 	  /* For entry master function skip over the __entry
   1618  1.1  mrg 	     argument.  */
   1619  1.1  mrg 	  if (sym->ns->proc_name->attr.entry_master)
   1620  1.1  mrg 	    sym->backend_decl = DECL_CHAIN (sym->backend_decl);
   1621  1.1  mrg 	}
   1622  1.1  mrg 
   1623  1.1  mrg       /* Dummy variables should already have been created.  */
   1624  1.1  mrg       gcc_assert (sym->backend_decl);
   1625  1.1  mrg 
   1626  1.1  mrg       /* However, the string length of deferred arrays must be set.  */
   1627  1.1  mrg       if (sym->ts.type == BT_CHARACTER
   1628  1.1  mrg 	  && sym->ts.deferred
   1629  1.1  mrg 	  && sym->attr.dimension
   1630  1.1  mrg 	  && sym->attr.allocatable)
   1631  1.1  mrg 	gfc_defer_symbol_init (sym);
   1632  1.1  mrg 
   1633  1.1  mrg       if (sym->attr.pointer && sym->attr.dimension && sym->ts.type != BT_CLASS)
   1634  1.1  mrg 	GFC_DECL_PTR_ARRAY_P (sym->backend_decl) = 1;
   1635  1.1  mrg 
   1636  1.1  mrg       /* Create a character length variable.  */
   1637  1.1  mrg       if (sym->ts.type == BT_CHARACTER)
   1638  1.1  mrg 	{
   1639  1.1  mrg 	  /* For a deferred dummy, make a new string length variable.  */
   1640  1.1  mrg 	  if (sym->ts.deferred
   1641  1.1  mrg 		&&
   1642  1.1  mrg 	     (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl))
   1643  1.1  mrg 	    sym->ts.u.cl->backend_decl = NULL_TREE;
   1644  1.1  mrg 
   1645  1.1  mrg 	  if (sym->ts.deferred && byref)
   1646  1.1  mrg 	    {
   1647  1.1  mrg 	      /* The string length of a deferred char array is stored in the
   1648  1.1  mrg 		 parameter at sym->ts.u.cl->backend_decl as a reference and
   1649  1.1  mrg 		 marked as a result.  Exempt this variable from generating a
   1650  1.1  mrg 		 temporary for it.  */
   1651  1.1  mrg 	      if (sym->attr.result)
   1652  1.1  mrg 		{
   1653  1.1  mrg 		  /* We need to insert a indirect ref for param decls.  */
   1654  1.1  mrg 		  if (sym->ts.u.cl->backend_decl
   1655  1.1  mrg 		      && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL)
   1656  1.1  mrg 		    {
   1657  1.1  mrg 		      sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
   1658  1.1  mrg 		      sym->ts.u.cl->backend_decl =
   1659  1.1  mrg 			build_fold_indirect_ref (sym->ts.u.cl->backend_decl);
   1660  1.1  mrg 		    }
   1661  1.1  mrg 		}
   1662  1.1  mrg 	      /* For all other parameters make sure, that they are copied so
   1663  1.1  mrg 		 that the value and any modifications are local to the routine
   1664  1.1  mrg 		 by generating a temporary variable.  */
   1665  1.1  mrg 	      else if (sym->attr.function
   1666  1.1  mrg 		       && sym->ts.u.cl->passed_length == NULL
   1667  1.1  mrg 		       && sym->ts.u.cl->backend_decl)
   1668  1.1  mrg 		{
   1669  1.1  mrg 		  sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl;
   1670  1.1  mrg 		  if (POINTER_TYPE_P (TREE_TYPE (sym->ts.u.cl->passed_length)))
   1671  1.1  mrg 		    sym->ts.u.cl->backend_decl
   1672  1.1  mrg 			= build_fold_indirect_ref (sym->ts.u.cl->backend_decl);
   1673  1.1  mrg 		  else
   1674  1.1  mrg 		    sym->ts.u.cl->backend_decl = NULL_TREE;
   1675  1.1  mrg 		}
   1676  1.1  mrg 	    }
   1677  1.1  mrg 
   1678  1.1  mrg 	  if (sym->ts.u.cl->backend_decl == NULL_TREE)
   1679  1.1  mrg 	    length = gfc_create_string_length (sym);
   1680  1.1  mrg 	  else
   1681  1.1  mrg 	    length = sym->ts.u.cl->backend_decl;
   1682  1.1  mrg 	  if (VAR_P (length) && DECL_FILE_SCOPE_P (length))
   1683  1.1  mrg 	    {
   1684  1.1  mrg 	      /* Add the string length to the same context as the symbol.  */
   1685  1.1  mrg 	      if (DECL_CONTEXT (length) == NULL_TREE)
   1686  1.1  mrg 		{
   1687  1.1  mrg 		  if (sym->backend_decl == current_function_decl
   1688  1.1  mrg 		      || (DECL_CONTEXT (sym->backend_decl)
   1689  1.1  mrg 			  == current_function_decl))
   1690  1.1  mrg 		    gfc_add_decl_to_function (length);
   1691  1.1  mrg 		  else
   1692  1.1  mrg 		    gfc_add_decl_to_parent_function (length);
   1693  1.1  mrg 		}
   1694  1.1  mrg 
   1695  1.1  mrg 	      gcc_assert (sym->backend_decl == current_function_decl
   1696  1.1  mrg 			  ? DECL_CONTEXT (length) == current_function_decl
   1697  1.1  mrg 			  : (DECL_CONTEXT (sym->backend_decl)
   1698  1.1  mrg 			     == DECL_CONTEXT (length)));
   1699  1.1  mrg 
   1700  1.1  mrg 	      gfc_defer_symbol_init (sym);
   1701  1.1  mrg 	    }
   1702  1.1  mrg 	}
   1703  1.1  mrg 
   1704  1.1  mrg       /* Use a copy of the descriptor for dummy arrays.  */
   1705  1.1  mrg       if ((sym->attr.dimension || sym->attr.codimension)
   1706  1.1  mrg          && !TREE_USED (sym->backend_decl))
   1707  1.1  mrg         {
   1708  1.1  mrg 	  decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
   1709  1.1  mrg 	  /* Prevent the dummy from being detected as unused if it is copied.  */
   1710  1.1  mrg 	  if (sym->backend_decl != NULL && decl != sym->backend_decl)
   1711  1.1  mrg 	    DECL_ARTIFICIAL (sym->backend_decl) = 1;
   1712  1.1  mrg 	  sym->backend_decl = decl;
   1713  1.1  mrg 	}
   1714  1.1  mrg 
   1715  1.1  mrg       /* Returning the descriptor for dummy class arrays is hazardous, because
   1716  1.1  mrg 	 some caller is expecting an expression to apply the component refs to.
   1717  1.1  mrg 	 Therefore the descriptor is only created and stored in
   1718  1.1  mrg 	 sym->backend_decl's GFC_DECL_SAVED_DESCRIPTOR.  The caller is then
   1719  1.1  mrg 	 responsible to extract it from there, when the descriptor is
   1720  1.1  mrg 	 desired.  */
   1721  1.1  mrg       if (IS_CLASS_ARRAY (sym)
   1722  1.1  mrg 	  && (!DECL_LANG_SPECIFIC (sym->backend_decl)
   1723  1.1  mrg 	      || !GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl)))
   1724  1.1  mrg 	{
   1725  1.1  mrg 	  decl = gfc_build_dummy_array_decl (sym, sym->backend_decl);
   1726  1.1  mrg 	  /* Prevent the dummy from being detected as unused if it is copied.  */
   1727  1.1  mrg 	  if (sym->backend_decl != NULL && decl != sym->backend_decl)
   1728  1.1  mrg 	    DECL_ARTIFICIAL (sym->backend_decl) = 1;
   1729  1.1  mrg 	  sym->backend_decl = decl;
   1730  1.1  mrg 	}
   1731  1.1  mrg 
   1732  1.1  mrg       TREE_USED (sym->backend_decl) = 1;
   1733  1.1  mrg       if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
   1734  1.1  mrg 	gfc_add_assign_aux_vars (sym);
   1735  1.1  mrg 
   1736  1.1  mrg       if (sym->ts.type == BT_CLASS && sym->backend_decl)
   1737  1.1  mrg 	GFC_DECL_CLASS(sym->backend_decl) = 1;
   1738  1.1  mrg 
   1739  1.1  mrg      return sym->backend_decl;
   1740  1.1  mrg     }
   1741  1.1  mrg 
   1742  1.1  mrg   if (sym->result == sym && sym->attr.assign
   1743  1.1  mrg       && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
   1744  1.1  mrg     gfc_add_assign_aux_vars (sym);
   1745  1.1  mrg 
   1746  1.1  mrg   if (sym->backend_decl)
   1747  1.1  mrg     return sym->backend_decl;
   1748  1.1  mrg 
   1749  1.1  mrg   /* Special case for array-valued named constants from intrinsic
   1750  1.1  mrg      procedures; those are inlined.  */
   1751  1.1  mrg   if (sym->attr.use_assoc && sym->attr.flavor == FL_PARAMETER
   1752  1.1  mrg       && (sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
   1753  1.1  mrg 	  || sym->from_intmod == INTMOD_ISO_C_BINDING))
   1754  1.1  mrg     intrinsic_array_parameter = true;
   1755  1.1  mrg 
   1756  1.1  mrg   /* If use associated compilation, use the module
   1757  1.1  mrg      declaration.  */
   1758  1.1  mrg   if ((sym->attr.flavor == FL_VARIABLE
   1759  1.1  mrg        || sym->attr.flavor == FL_PARAMETER)
   1760  1.1  mrg       && (sym->attr.use_assoc || sym->attr.used_in_submodule)
   1761  1.1  mrg       && !intrinsic_array_parameter
   1762  1.1  mrg       && sym->module
   1763  1.1  mrg       && gfc_get_module_backend_decl (sym))
   1764  1.1  mrg     {
   1765  1.1  mrg       if (sym->ts.type == BT_CLASS && sym->backend_decl)
   1766  1.1  mrg 	GFC_DECL_CLASS(sym->backend_decl) = 1;
   1767  1.1  mrg       return sym->backend_decl;
   1768  1.1  mrg     }
   1769  1.1  mrg 
   1770  1.1  mrg   if (sym->attr.flavor == FL_PROCEDURE)
   1771  1.1  mrg     {
   1772  1.1  mrg       /* Catch functions. Only used for actual parameters,
   1773  1.1  mrg 	 procedure pointers and procptr initialization targets.  */
   1774  1.1  mrg       if (sym->attr.use_assoc
   1775  1.1  mrg 	  || sym->attr.used_in_submodule
   1776  1.1  mrg 	  || sym->attr.intrinsic
   1777  1.1  mrg 	  || sym->attr.if_source != IFSRC_DECL)
   1778  1.1  mrg 	{
   1779  1.1  mrg 	  decl = gfc_get_extern_function_decl (sym);
   1780  1.1  mrg 	}
   1781  1.1  mrg       else
   1782  1.1  mrg 	{
   1783  1.1  mrg 	  if (!sym->backend_decl)
   1784  1.1  mrg 	    build_function_decl (sym, false);
   1785  1.1  mrg 	  decl = sym->backend_decl;
   1786  1.1  mrg 	}
   1787  1.1  mrg       return decl;
   1788  1.1  mrg     }
   1789  1.1  mrg 
   1790  1.1  mrg   if (sym->attr.intrinsic)
   1791  1.1  mrg     gfc_internal_error ("intrinsic variable which isn't a procedure");
   1792  1.1  mrg 
   1793  1.1  mrg   /* Create string length decl first so that they can be used in the
   1794  1.1  mrg      type declaration.  For associate names, the target character
   1795  1.1  mrg      length is used. Set 'length' to a constant so that if the
   1796  1.1  mrg      string length is a variable, it is not finished a second time.  */
   1797  1.1  mrg   if (sym->ts.type == BT_CHARACTER)
   1798  1.1  mrg     {
   1799  1.1  mrg       if (sym->attr.associate_var
   1800  1.1  mrg 	  && sym->ts.deferred
   1801  1.1  mrg 	  && sym->assoc && sym->assoc->target
   1802  1.1  mrg 	  && ((sym->assoc->target->expr_type == EXPR_VARIABLE
   1803  1.1  mrg 	       && sym->assoc->target->symtree->n.sym->ts.type != BT_CHARACTER)
   1804  1.1  mrg 	      || sym->assoc->target->expr_type != EXPR_VARIABLE))
   1805  1.1  mrg 	sym->ts.u.cl->backend_decl = NULL_TREE;
   1806  1.1  mrg 
   1807  1.1  mrg       if (sym->attr.associate_var
   1808  1.1  mrg 	  && sym->ts.u.cl->backend_decl
   1809  1.1  mrg 	  && (VAR_P (sym->ts.u.cl->backend_decl)
   1810  1.1  mrg 	      || TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL))
   1811  1.1  mrg 	length = gfc_index_zero_node;
   1812  1.1  mrg       else
   1813  1.1  mrg 	length = gfc_create_string_length (sym);
   1814  1.1  mrg     }
   1815  1.1  mrg 
   1816  1.1  mrg   /* Create the decl for the variable.  */
   1817  1.1  mrg   decl = build_decl (gfc_get_location (&sym->declared_at),
   1818  1.1  mrg 		     VAR_DECL, gfc_sym_identifier (sym), gfc_sym_type (sym));
   1819  1.1  mrg 
   1820  1.1  mrg   /* Add attributes to variables.  Functions are handled elsewhere.  */
   1821  1.1  mrg   attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
   1822  1.1  mrg   decl_attributes (&decl, attributes, 0);
   1823  1.1  mrg 
   1824  1.1  mrg   /* Symbols from modules should have their assembler names mangled.
   1825  1.1  mrg      This is done here rather than in gfc_finish_var_decl because it
   1826  1.1  mrg      is different for string length variables.  */
   1827  1.1  mrg   if (sym->module || sym->fn_result_spec)
   1828  1.1  mrg     {
   1829  1.1  mrg       gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
   1830  1.1  mrg       if (sym->attr.use_assoc && !intrinsic_array_parameter)
   1831  1.1  mrg 	DECL_IGNORED_P (decl) = 1;
   1832  1.1  mrg     }
   1833  1.1  mrg 
   1834  1.1  mrg   if (sym->attr.select_type_temporary)
   1835  1.1  mrg     {
   1836  1.1  mrg       DECL_ARTIFICIAL (decl) = 1;
   1837  1.1  mrg       DECL_IGNORED_P (decl) = 1;
   1838  1.1  mrg     }
   1839  1.1  mrg 
   1840  1.1  mrg   if (sym->attr.dimension || sym->attr.codimension)
   1841  1.1  mrg     {
   1842  1.1  mrg       /* Create variables to hold the non-constant bits of array info.  */
   1843  1.1  mrg       gfc_build_qualified_array (decl, sym);
   1844  1.1  mrg 
   1845  1.1  mrg       if (sym->attr.contiguous
   1846  1.1  mrg 	  || ((sym->attr.allocatable || !sym->attr.dummy) && !sym->attr.pointer))
   1847  1.1  mrg 	GFC_DECL_PACKED_ARRAY (decl) = 1;
   1848  1.1  mrg     }
   1849  1.1  mrg 
   1850  1.1  mrg   /* Remember this variable for allocation/cleanup.  */
   1851  1.1  mrg   if (sym->attr.dimension || sym->attr.allocatable || sym->attr.codimension
   1852  1.1  mrg       || (sym->ts.type == BT_CLASS &&
   1853  1.1  mrg 	  (CLASS_DATA (sym)->attr.dimension
   1854  1.1  mrg 	   || CLASS_DATA (sym)->attr.allocatable))
   1855  1.1  mrg       || (sym->ts.type == BT_DERIVED
   1856  1.1  mrg 	  && (sym->ts.u.derived->attr.alloc_comp
   1857  1.1  mrg 	      || (!sym->attr.pointer && !sym->attr.artificial && !sym->attr.save
   1858  1.1  mrg 		  && !sym->ns->proc_name->attr.is_main_program
   1859  1.1  mrg 		  && gfc_is_finalizable (sym->ts.u.derived, NULL))))
   1860  1.1  mrg       /* This applies a derived type default initializer.  */
   1861  1.1  mrg       || (sym->ts.type == BT_DERIVED
   1862  1.1  mrg 	  && sym->attr.save == SAVE_NONE
   1863  1.1  mrg 	  && !sym->attr.data
   1864  1.1  mrg 	  && !sym->attr.allocatable
   1865  1.1  mrg 	  && (sym->value && !sym->ns->proc_name->attr.is_main_program)
   1866  1.1  mrg 	  && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
   1867  1.1  mrg     gfc_defer_symbol_init (sym);
   1868  1.1  mrg 
   1869  1.1  mrg   if (sym->ts.type == BT_CHARACTER
   1870  1.1  mrg       && sym->attr.allocatable
   1871  1.1  mrg       && !sym->attr.dimension
   1872  1.1  mrg       && sym->ts.u.cl && sym->ts.u.cl->length
   1873  1.1  mrg       && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE)
   1874  1.1  mrg     gfc_defer_symbol_init (sym);
   1875  1.1  mrg 
   1876  1.1  mrg   /* Associate names can use the hidden string length variable
   1877  1.1  mrg      of their associated target.  */
   1878  1.1  mrg   if (sym->ts.type == BT_CHARACTER
   1879  1.1  mrg       && TREE_CODE (length) != INTEGER_CST
   1880  1.1  mrg       && TREE_CODE (sym->ts.u.cl->backend_decl) != INDIRECT_REF)
   1881  1.1  mrg     {
   1882  1.1  mrg       length = fold_convert (gfc_charlen_type_node, length);
   1883  1.1  mrg       gfc_finish_var_decl (length, sym);
   1884  1.1  mrg       if (!sym->attr.associate_var
   1885  1.1  mrg 	  && TREE_CODE (length) == VAR_DECL
   1886  1.1  mrg 	  && sym->value && sym->value->expr_type != EXPR_NULL
   1887  1.1  mrg 	  && sym->value->ts.u.cl->length)
   1888  1.1  mrg 	{
   1889  1.1  mrg 	  gfc_expr *len = sym->value->ts.u.cl->length;
   1890  1.1  mrg 	  DECL_INITIAL (length) = gfc_conv_initializer (len, &len->ts,
   1891  1.1  mrg 							TREE_TYPE (length),
   1892  1.1  mrg 							false, false, false);
   1893  1.1  mrg 	  DECL_INITIAL (length) = fold_convert (gfc_charlen_type_node,
   1894  1.1  mrg 						DECL_INITIAL (length));
   1895  1.1  mrg 	}
   1896  1.1  mrg       else
   1897  1.1  mrg 	gcc_assert (!sym->value || sym->value->expr_type == EXPR_NULL);
   1898  1.1  mrg     }
   1899  1.1  mrg 
   1900  1.1  mrg   gfc_finish_var_decl (decl, sym);
   1901  1.1  mrg 
   1902  1.1  mrg   if (sym->ts.type == BT_CHARACTER)
   1903  1.1  mrg     /* Character variables need special handling.  */
   1904  1.1  mrg     gfc_allocate_lang_decl (decl);
   1905  1.1  mrg 
   1906  1.1  mrg   if (sym->assoc && sym->attr.subref_array_pointer)
   1907  1.1  mrg     sym->attr.pointer = 1;
   1908  1.1  mrg 
   1909  1.1  mrg   if (sym->attr.pointer && sym->attr.dimension
   1910  1.1  mrg       && !sym->ts.deferred
   1911  1.1  mrg       && !(sym->attr.select_type_temporary
   1912  1.1  mrg 	   && !sym->attr.subref_array_pointer))
   1913  1.1  mrg     GFC_DECL_PTR_ARRAY_P (decl) = 1;
   1914  1.1  mrg 
   1915  1.1  mrg   if (sym->ts.type == BT_CLASS)
   1916  1.1  mrg     GFC_DECL_CLASS(decl) = 1;
   1917  1.1  mrg 
   1918  1.1  mrg   sym->backend_decl = decl;
   1919  1.1  mrg 
   1920  1.1  mrg   if (sym->attr.assign)
   1921  1.1  mrg     gfc_add_assign_aux_vars (sym);
   1922  1.1  mrg 
   1923  1.1  mrg   if (intrinsic_array_parameter)
   1924  1.1  mrg     {
   1925  1.1  mrg       TREE_STATIC (decl) = 1;
   1926  1.1  mrg       DECL_EXTERNAL (decl) = 0;
   1927  1.1  mrg     }
   1928  1.1  mrg 
   1929  1.1  mrg   if (TREE_STATIC (decl)
   1930  1.1  mrg       && !(sym->attr.use_assoc && !intrinsic_array_parameter)
   1931  1.1  mrg       && (sym->attr.save || sym->ns->proc_name->attr.is_main_program
   1932  1.1  mrg 	  || !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
   1933  1.1  mrg 	  || sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
   1934  1.1  mrg       && (flag_coarray != GFC_FCOARRAY_LIB
   1935  1.1  mrg 	  || !sym->attr.codimension || sym->attr.allocatable)
   1936  1.1  mrg       && !(sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type)
   1937  1.1  mrg       && !(sym->ts.type == BT_CLASS
   1938  1.1  mrg 	   && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type))
   1939  1.1  mrg     {
   1940  1.1  mrg       /* Add static initializer. For procedures, it is only needed if
   1941  1.1  mrg 	 SAVE is specified otherwise they need to be reinitialized
   1942  1.1  mrg 	 every time the procedure is entered. The TREE_STATIC is
   1943  1.1  mrg 	 in this case due to -fmax-stack-var-size=.  */
   1944  1.1  mrg 
   1945  1.1  mrg       DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
   1946  1.1  mrg 				    TREE_TYPE (decl), sym->attr.dimension
   1947  1.1  mrg 				    || (sym->attr.codimension
   1948  1.1  mrg 					&& sym->attr.allocatable),
   1949  1.1  mrg 				    sym->attr.pointer || sym->attr.allocatable
   1950  1.1  mrg 				    || sym->ts.type == BT_CLASS,
   1951  1.1  mrg 				    sym->attr.proc_pointer);
   1952  1.1  mrg     }
   1953  1.1  mrg 
   1954  1.1  mrg   if (!TREE_STATIC (decl)
   1955  1.1  mrg       && POINTER_TYPE_P (TREE_TYPE (decl))
   1956  1.1  mrg       && !sym->attr.pointer
   1957  1.1  mrg       && !sym->attr.allocatable
   1958  1.1  mrg       && !sym->attr.proc_pointer
   1959  1.1  mrg       && !sym->attr.select_type_temporary)
   1960  1.1  mrg     DECL_BY_REFERENCE (decl) = 1;
   1961  1.1  mrg 
   1962  1.1  mrg   if (sym->attr.associate_var)
   1963  1.1  mrg     GFC_DECL_ASSOCIATE_VAR_P (decl) = 1;
   1964  1.1  mrg 
   1965  1.1  mrg   /* We only longer mark __def_init as read-only if it actually has an
   1966  1.1  mrg      initializer, it does not needlessly take up space in the
   1967  1.1  mrg      read-only section and can go into the BSS instead, see PR 84487.
   1968  1.1  mrg      Marking this as artificial means that OpenMP will treat this as
   1969  1.1  mrg      predetermined shared.  */
   1970  1.1  mrg 
   1971  1.1  mrg   bool def_init = startswith (sym->name, "__def_init");
   1972  1.1  mrg 
   1973  1.1  mrg   if (sym->attr.vtab || def_init)
   1974  1.1  mrg     {
   1975  1.1  mrg       DECL_ARTIFICIAL (decl) = 1;
   1976  1.1  mrg       if (def_init && sym->value)
   1977  1.1  mrg 	TREE_READONLY (decl) = 1;
   1978  1.1  mrg     }
   1979  1.1  mrg 
   1980  1.1  mrg   return decl;
   1981  1.1  mrg }
   1982  1.1  mrg 
   1983  1.1  mrg 
   1984  1.1  mrg /* Substitute a temporary variable in place of the real one.  */
   1985  1.1  mrg 
   1986  1.1  mrg void
   1987  1.1  mrg gfc_shadow_sym (gfc_symbol * sym, tree decl, gfc_saved_var * save)
   1988  1.1  mrg {
   1989  1.1  mrg   save->attr = sym->attr;
   1990  1.1  mrg   save->decl = sym->backend_decl;
   1991  1.1  mrg 
   1992  1.1  mrg   gfc_clear_attr (&sym->attr);
   1993  1.1  mrg   sym->attr.referenced = 1;
   1994  1.1  mrg   sym->attr.flavor = FL_VARIABLE;
   1995  1.1  mrg 
   1996  1.1  mrg   sym->backend_decl = decl;
   1997  1.1  mrg }
   1998  1.1  mrg 
   1999  1.1  mrg 
   2000  1.1  mrg /* Restore the original variable.  */
   2001  1.1  mrg 
   2002  1.1  mrg void
   2003  1.1  mrg gfc_restore_sym (gfc_symbol * sym, gfc_saved_var * save)
   2004  1.1  mrg {
   2005  1.1  mrg   sym->attr = save->attr;
   2006  1.1  mrg   sym->backend_decl = save->decl;
   2007  1.1  mrg }
   2008  1.1  mrg 
   2009  1.1  mrg 
   2010  1.1  mrg /* Declare a procedure pointer.  */
   2011  1.1  mrg 
   2012  1.1  mrg static tree
   2013  1.1  mrg get_proc_pointer_decl (gfc_symbol *sym)
   2014  1.1  mrg {
   2015  1.1  mrg   tree decl;
   2016  1.1  mrg   tree attributes;
   2017  1.1  mrg 
   2018  1.1  mrg   if (sym->module || sym->fn_result_spec)
   2019  1.1  mrg     {
   2020  1.1  mrg       const char *name;
   2021  1.1  mrg       gfc_gsymbol *gsym;
   2022  1.1  mrg 
   2023  1.1  mrg       name = mangled_identifier (sym);
   2024  1.1  mrg       gsym = gfc_find_gsymbol (gfc_gsym_root, name);
   2025  1.1  mrg       if (gsym != NULL)
   2026  1.1  mrg 	{
   2027  1.1  mrg 	  gfc_symbol *s;
   2028  1.1  mrg 	  gfc_find_symbol (sym->name, gsym->ns, 0, &s);
   2029  1.1  mrg 	  if (s && s->backend_decl)
   2030  1.1  mrg 	    return s->backend_decl;
   2031  1.1  mrg 	}
   2032  1.1  mrg     }
   2033  1.1  mrg 
   2034  1.1  mrg   decl = sym->backend_decl;
   2035  1.1  mrg   if (decl)
   2036  1.1  mrg     return decl;
   2037  1.1  mrg 
   2038  1.1  mrg   decl = build_decl (input_location,
   2039  1.1  mrg 		     VAR_DECL, get_identifier (sym->name),
   2040  1.1  mrg 		     build_pointer_type (gfc_get_function_type (sym)));
   2041  1.1  mrg 
   2042  1.1  mrg   if (sym->module)
   2043  1.1  mrg     {
   2044  1.1  mrg       /* Apply name mangling.  */
   2045  1.1  mrg       gfc_set_decl_assembler_name (decl, gfc_sym_mangled_identifier (sym));
   2046  1.1  mrg       if (sym->attr.use_assoc)
   2047  1.1  mrg 	DECL_IGNORED_P (decl) = 1;
   2048  1.1  mrg     }
   2049  1.1  mrg 
   2050  1.1  mrg   if ((sym->ns->proc_name
   2051  1.1  mrg       && sym->ns->proc_name->backend_decl == current_function_decl)
   2052  1.1  mrg       || sym->attr.contained)
   2053  1.1  mrg     gfc_add_decl_to_function (decl);
   2054  1.1  mrg   else if (sym->ns->proc_name->attr.flavor != FL_MODULE)
   2055  1.1  mrg     gfc_add_decl_to_parent_function (decl);
   2056  1.1  mrg 
   2057  1.1  mrg   sym->backend_decl = decl;
   2058  1.1  mrg 
   2059  1.1  mrg   /* If a variable is USE associated, it's always external.  */
   2060  1.1  mrg   if (sym->attr.use_assoc)
   2061  1.1  mrg     {
   2062  1.1  mrg       DECL_EXTERNAL (decl) = 1;
   2063  1.1  mrg       TREE_PUBLIC (decl) = 1;
   2064  1.1  mrg     }
   2065  1.1  mrg   else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE)
   2066  1.1  mrg     {
   2067  1.1  mrg       /* This is the declaration of a module variable.  */
   2068  1.1  mrg       TREE_PUBLIC (decl) = 1;
   2069  1.1  mrg       if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used)
   2070  1.1  mrg 	{
   2071  1.1  mrg 	  DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
   2072  1.1  mrg 	  DECL_VISIBILITY_SPECIFIED (decl) = true;
   2073  1.1  mrg 	}
   2074  1.1  mrg       TREE_STATIC (decl) = 1;
   2075  1.1  mrg     }
   2076  1.1  mrg 
   2077  1.1  mrg   if (!sym->attr.use_assoc
   2078  1.1  mrg 	&& (sym->attr.save != SAVE_NONE || sym->attr.data
   2079  1.1  mrg 	      || (sym->value && sym->ns->proc_name->attr.is_main_program)))
   2080  1.1  mrg     TREE_STATIC (decl) = 1;
   2081  1.1  mrg 
   2082  1.1  mrg   if (TREE_STATIC (decl) && sym->value)
   2083  1.1  mrg     {
   2084  1.1  mrg       /* Add static initializer.  */
   2085  1.1  mrg       DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
   2086  1.1  mrg 						  TREE_TYPE (decl),
   2087  1.1  mrg 						  sym->attr.dimension,
   2088  1.1  mrg 						  false, true);
   2089  1.1  mrg     }
   2090  1.1  mrg 
   2091  1.1  mrg   /* Handle threadprivate procedure pointers.  */
   2092  1.1  mrg   if (sym->attr.threadprivate
   2093  1.1  mrg       && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
   2094  1.1  mrg     set_decl_tls_model (decl, decl_default_tls_model (decl));
   2095  1.1  mrg 
   2096  1.1  mrg   attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
   2097  1.1  mrg   decl_attributes (&decl, attributes, 0);
   2098  1.1  mrg 
   2099  1.1  mrg   return decl;
   2100  1.1  mrg }
   2101  1.1  mrg 
   2102  1.1  mrg 
   2103  1.1  mrg /* Get a basic decl for an external function.  */
   2104  1.1  mrg 
   2105  1.1  mrg tree
   2106  1.1  mrg gfc_get_extern_function_decl (gfc_symbol * sym, gfc_actual_arglist *actual_args,
   2107  1.1  mrg 			      const char *fnspec)
   2108  1.1  mrg {
   2109  1.1  mrg   tree type;
   2110  1.1  mrg   tree fndecl;
   2111  1.1  mrg   tree attributes;
   2112  1.1  mrg   gfc_expr e;
   2113  1.1  mrg   gfc_intrinsic_sym *isym;
   2114  1.1  mrg   gfc_expr argexpr;
   2115  1.1  mrg   char s[GFC_MAX_SYMBOL_LEN + 23]; /* "_gfortran_f2c_specific" and '\0'.  */
   2116  1.1  mrg   tree name;
   2117  1.1  mrg   tree mangled_name;
   2118  1.1  mrg   gfc_gsymbol *gsym;
   2119  1.1  mrg 
   2120  1.1  mrg   if (sym->backend_decl)
   2121  1.1  mrg     return sym->backend_decl;
   2122  1.1  mrg 
   2123  1.1  mrg   /* We should never be creating external decls for alternate entry points.
   2124  1.1  mrg      The procedure may be an alternate entry point, but we don't want/need
   2125  1.1  mrg      to know that.  */
   2126  1.1  mrg   gcc_assert (!(sym->attr.entry || sym->attr.entry_master));
   2127  1.1  mrg 
   2128  1.1  mrg   if (sym->attr.proc_pointer)
   2129  1.1  mrg     return get_proc_pointer_decl (sym);
   2130  1.1  mrg 
   2131  1.1  mrg   /* See if this is an external procedure from the same file.  If so,
   2132  1.1  mrg      return the backend_decl.  If we are looking at a BIND(C)
   2133  1.1  mrg      procedure and the symbol is not BIND(C), or vice versa, we
   2134  1.1  mrg      haven't found the right procedure.  */
   2135  1.1  mrg 
   2136  1.1  mrg   if (sym->binding_label)
   2137  1.1  mrg     {
   2138  1.1  mrg       gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label);
   2139  1.1  mrg       if (gsym && !gsym->bind_c)
   2140  1.1  mrg 	gsym = NULL;
   2141  1.1  mrg     }
   2142  1.1  mrg   else if (sym->module == NULL)
   2143  1.1  mrg     {
   2144  1.1  mrg       gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
   2145  1.1  mrg       if (gsym && gsym->bind_c)
   2146  1.1  mrg 	gsym = NULL;
   2147  1.1  mrg     }
   2148  1.1  mrg   else
   2149  1.1  mrg     {
   2150  1.1  mrg       /* Procedure from a different module.  */
   2151  1.1  mrg       gsym = NULL;
   2152  1.1  mrg     }
   2153  1.1  mrg 
   2154  1.1  mrg   if (gsym && !gsym->defined)
   2155  1.1  mrg     gsym = NULL;
   2156  1.1  mrg 
   2157  1.1  mrg   /* This can happen because of C binding.  */
   2158  1.1  mrg   if (gsym && gsym->ns && gsym->ns->proc_name
   2159  1.1  mrg       && gsym->ns->proc_name->attr.flavor == FL_MODULE)
   2160  1.1  mrg     goto module_sym;
   2161  1.1  mrg 
   2162  1.1  mrg   if ((!sym->attr.use_assoc || sym->attr.if_source != IFSRC_DECL)
   2163  1.1  mrg       && !sym->backend_decl
   2164  1.1  mrg       && gsym && gsym->ns
   2165  1.1  mrg       && ((gsym->type == GSYM_SUBROUTINE) || (gsym->type == GSYM_FUNCTION))
   2166  1.1  mrg       && (gsym->ns->proc_name->backend_decl || !sym->attr.intrinsic))
   2167  1.1  mrg     {
   2168  1.1  mrg       if (!gsym->ns->proc_name->backend_decl)
   2169  1.1  mrg 	{
   2170  1.1  mrg 	  /* By construction, the external function cannot be
   2171  1.1  mrg 	     a contained procedure.  */
   2172  1.1  mrg 	  locus old_loc;
   2173  1.1  mrg 
   2174  1.1  mrg 	  gfc_save_backend_locus (&old_loc);
   2175  1.1  mrg 	  push_cfun (NULL);
   2176  1.1  mrg 
   2177  1.1  mrg 	  gfc_create_function_decl (gsym->ns, true);
   2178  1.1  mrg 
   2179  1.1  mrg 	  pop_cfun ();
   2180  1.1  mrg 	  gfc_restore_backend_locus (&old_loc);
   2181  1.1  mrg 	}
   2182  1.1  mrg 
   2183  1.1  mrg       /* If the namespace has entries, the proc_name is the
   2184  1.1  mrg 	 entry master.  Find the entry and use its backend_decl.
   2185  1.1  mrg 	 otherwise, use the proc_name backend_decl.  */
   2186  1.1  mrg       if (gsym->ns->entries)
   2187  1.1  mrg 	{
   2188  1.1  mrg 	  gfc_entry_list *entry = gsym->ns->entries;
   2189  1.1  mrg 
   2190  1.1  mrg 	  for (; entry; entry = entry->next)
   2191  1.1  mrg 	    {
   2192  1.1  mrg 	      if (strcmp (gsym->name, entry->sym->name) == 0)
   2193  1.1  mrg 		{
   2194  1.1  mrg 	          sym->backend_decl = entry->sym->backend_decl;
   2195  1.1  mrg 		  break;
   2196  1.1  mrg 		}
   2197  1.1  mrg 	    }
   2198  1.1  mrg 	}
   2199  1.1  mrg       else
   2200  1.1  mrg 	sym->backend_decl = gsym->ns->proc_name->backend_decl;
   2201  1.1  mrg 
   2202  1.1  mrg       if (sym->backend_decl)
   2203  1.1  mrg 	{
   2204  1.1  mrg 	  /* Avoid problems of double deallocation of the backend declaration
   2205  1.1  mrg 	     later in gfc_trans_use_stmts; cf. PR 45087.  */
   2206  1.1  mrg 	  if (sym->attr.if_source != IFSRC_DECL && sym->attr.use_assoc)
   2207  1.1  mrg 	    sym->attr.use_assoc = 0;
   2208  1.1  mrg 
   2209  1.1  mrg 	  return sym->backend_decl;
   2210  1.1  mrg 	}
   2211  1.1  mrg     }
   2212  1.1  mrg 
   2213  1.1  mrg   /* See if this is a module procedure from the same file.  If so,
   2214  1.1  mrg      return the backend_decl.  */
   2215  1.1  mrg   if (sym->module)
   2216  1.1  mrg     gsym =  gfc_find_gsymbol (gfc_gsym_root, sym->module);
   2217  1.1  mrg 
   2218  1.1  mrg module_sym:
   2219  1.1  mrg   if (gsym && gsym->ns
   2220  1.1  mrg       && (gsym->type == GSYM_MODULE
   2221  1.1  mrg 	  || (gsym->ns->proc_name && gsym->ns->proc_name->attr.flavor == FL_MODULE)))
   2222  1.1  mrg     {
   2223  1.1  mrg       gfc_symbol *s;
   2224  1.1  mrg 
   2225  1.1  mrg       s = NULL;
   2226  1.1  mrg       if (gsym->type == GSYM_MODULE)
   2227  1.1  mrg 	gfc_find_symbol (sym->name, gsym->ns, 0, &s);
   2228  1.1  mrg       else
   2229  1.1  mrg 	gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &s);
   2230  1.1  mrg 
   2231  1.1  mrg       if (s && s->backend_decl)
   2232  1.1  mrg 	{
   2233  1.1  mrg 	  if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
   2234  1.1  mrg 	    gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
   2235  1.1  mrg 				       true);
   2236  1.1  mrg 	  else if (sym->ts.type == BT_CHARACTER)
   2237  1.1  mrg 	    sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
   2238  1.1  mrg 	  sym->backend_decl = s->backend_decl;
   2239  1.1  mrg 	  return sym->backend_decl;
   2240  1.1  mrg 	}
   2241  1.1  mrg     }
   2242  1.1  mrg 
   2243  1.1  mrg   if (sym->attr.intrinsic)
   2244  1.1  mrg     {
   2245  1.1  mrg       /* Call the resolution function to get the actual name.  This is
   2246  1.1  mrg          a nasty hack which relies on the resolution functions only looking
   2247  1.1  mrg 	 at the first argument.  We pass NULL for the second argument
   2248  1.1  mrg 	 otherwise things like AINT get confused.  */
   2249  1.1  mrg       isym = gfc_find_function (sym->name);
   2250  1.1  mrg       gcc_assert (isym->resolve.f0 != NULL);
   2251  1.1  mrg 
   2252  1.1  mrg       memset (&e, 0, sizeof (e));
   2253  1.1  mrg       e.expr_type = EXPR_FUNCTION;
   2254  1.1  mrg 
   2255  1.1  mrg       memset (&argexpr, 0, sizeof (argexpr));
   2256  1.1  mrg       gcc_assert (isym->formal);
   2257  1.1  mrg       argexpr.ts = isym->formal->ts;
   2258  1.1  mrg 
   2259  1.1  mrg       if (isym->formal->next == NULL)
   2260  1.1  mrg 	isym->resolve.f1 (&e, &argexpr);
   2261  1.1  mrg       else
   2262  1.1  mrg 	{
   2263  1.1  mrg 	  if (isym->formal->next->next == NULL)
   2264  1.1  mrg 	    isym->resolve.f2 (&e, &argexpr, NULL);
   2265  1.1  mrg 	  else
   2266  1.1  mrg 	    {
   2267  1.1  mrg 	      if (isym->formal->next->next->next == NULL)
   2268  1.1  mrg 		isym->resolve.f3 (&e, &argexpr, NULL, NULL);
   2269  1.1  mrg 	      else
   2270  1.1  mrg 		{
   2271  1.1  mrg 		  /* All specific intrinsics take less than 5 arguments.  */
   2272  1.1  mrg 		  gcc_assert (isym->formal->next->next->next->next == NULL);
   2273  1.1  mrg 		  isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
   2274  1.1  mrg 		}
   2275  1.1  mrg 	    }
   2276  1.1  mrg 	}
   2277  1.1  mrg 
   2278  1.1  mrg       if (flag_f2c
   2279  1.1  mrg 	  && ((e.ts.type == BT_REAL && e.ts.kind == gfc_default_real_kind)
   2280  1.1  mrg 	      || e.ts.type == BT_COMPLEX))
   2281  1.1  mrg 	{
   2282  1.1  mrg 	  /* Specific which needs a different implementation if f2c
   2283  1.1  mrg 	     calling conventions are used.  */
   2284  1.1  mrg 	  sprintf (s, "_gfortran_f2c_specific%s", e.value.function.name);
   2285  1.1  mrg 	}
   2286  1.1  mrg       else
   2287  1.1  mrg 	sprintf (s, "_gfortran_specific%s", e.value.function.name);
   2288  1.1  mrg 
   2289  1.1  mrg       name = get_identifier (s);
   2290  1.1  mrg       mangled_name = name;
   2291  1.1  mrg     }
   2292  1.1  mrg   else
   2293  1.1  mrg     {
   2294  1.1  mrg       name = gfc_sym_identifier (sym);
   2295  1.1  mrg       mangled_name = gfc_sym_mangled_function_id (sym);
   2296  1.1  mrg     }
   2297  1.1  mrg 
   2298  1.1  mrg   type = gfc_get_function_type (sym, actual_args, fnspec);
   2299  1.1  mrg 
   2300  1.1  mrg   fndecl = build_decl (input_location,
   2301  1.1  mrg 		       FUNCTION_DECL, name, type);
   2302  1.1  mrg 
   2303  1.1  mrg   /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
   2304  1.1  mrg      TREE_PUBLIC specifies whether a function is globally addressable (i.e.
   2305  1.1  mrg      the opposite of declaring a function as static in C).  */
   2306  1.1  mrg   DECL_EXTERNAL (fndecl) = 1;
   2307  1.1  mrg   TREE_PUBLIC (fndecl) = 1;
   2308  1.1  mrg 
   2309  1.1  mrg   attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
   2310  1.1  mrg   decl_attributes (&fndecl, attributes, 0);
   2311  1.1  mrg 
   2312  1.1  mrg   gfc_set_decl_assembler_name (fndecl, mangled_name);
   2313  1.1  mrg 
   2314  1.1  mrg   /* Set the context of this decl.  */
   2315  1.1  mrg   if (0 && sym->ns && sym->ns->proc_name)
   2316  1.1  mrg     {
   2317  1.1  mrg       /* TODO: Add external decls to the appropriate scope.  */
   2318  1.1  mrg       DECL_CONTEXT (fndecl) = sym->ns->proc_name->backend_decl;
   2319  1.1  mrg     }
   2320  1.1  mrg   else
   2321  1.1  mrg     {
   2322  1.1  mrg       /* Global declaration, e.g. intrinsic subroutine.  */
   2323  1.1  mrg       DECL_CONTEXT (fndecl) = NULL_TREE;
   2324  1.1  mrg     }
   2325  1.1  mrg 
   2326  1.1  mrg   /* Set attributes for PURE functions. A call to PURE function in the
   2327  1.1  mrg      Fortran 95 sense is both pure and without side effects in the C
   2328  1.1  mrg      sense.  */
   2329  1.1  mrg   if (sym->attr.pure || sym->attr.implicit_pure)
   2330  1.1  mrg     {
   2331  1.1  mrg       if (sym->attr.function && !gfc_return_by_reference (sym))
   2332  1.1  mrg 	DECL_PURE_P (fndecl) = 1;
   2333  1.1  mrg       /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
   2334  1.1  mrg 	 parameters and don't use alternate returns (is this
   2335  1.1  mrg 	 allowed?). In that case, calls to them are meaningless, and
   2336  1.1  mrg 	 can be optimized away. See also in build_function_decl().  */
   2337  1.1  mrg       TREE_SIDE_EFFECTS (fndecl) = 0;
   2338  1.1  mrg     }
   2339  1.1  mrg 
   2340  1.1  mrg   /* Mark non-returning functions.  */
   2341  1.1  mrg   if (sym->attr.noreturn)
   2342  1.1  mrg       TREE_THIS_VOLATILE(fndecl) = 1;
   2343  1.1  mrg 
   2344  1.1  mrg   sym->backend_decl = fndecl;
   2345  1.1  mrg 
   2346  1.1  mrg   if (DECL_CONTEXT (fndecl) == NULL_TREE)
   2347  1.1  mrg     pushdecl_top_level (fndecl);
   2348  1.1  mrg 
   2349  1.1  mrg   if (sym->formal_ns
   2350  1.1  mrg       && sym->formal_ns->proc_name == sym)
   2351  1.1  mrg     {
   2352  1.1  mrg       if (sym->formal_ns->omp_declare_simd)
   2353  1.1  mrg 	gfc_trans_omp_declare_simd (sym->formal_ns);
   2354  1.1  mrg       if (flag_openmp)
   2355  1.1  mrg 	gfc_trans_omp_declare_variant (sym->formal_ns);
   2356  1.1  mrg     }
   2357  1.1  mrg 
   2358  1.1  mrg   return fndecl;
   2359  1.1  mrg }
   2360  1.1  mrg 
   2361  1.1  mrg 
   2362  1.1  mrg /* Create a declaration for a procedure.  For external functions (in the C
   2363  1.1  mrg    sense) use gfc_get_extern_function_decl.  HAS_ENTRIES is true if this is
   2364  1.1  mrg    a master function with alternate entry points.  */
   2365  1.1  mrg 
   2366  1.1  mrg static void
   2367  1.1  mrg build_function_decl (gfc_symbol * sym, bool global)
   2368  1.1  mrg {
   2369  1.1  mrg   tree fndecl, type, attributes;
   2370  1.1  mrg   symbol_attribute attr;
   2371  1.1  mrg   tree result_decl;
   2372  1.1  mrg   gfc_formal_arglist *f;
   2373  1.1  mrg 
   2374  1.1  mrg   bool module_procedure = sym->attr.module_procedure
   2375  1.1  mrg 			  && sym->ns
   2376  1.1  mrg 			  && sym->ns->proc_name
   2377  1.1  mrg 			  && sym->ns->proc_name->attr.flavor == FL_MODULE;
   2378  1.1  mrg 
   2379  1.1  mrg   gcc_assert (!sym->attr.external || module_procedure);
   2380  1.1  mrg 
   2381  1.1  mrg   if (sym->backend_decl)
   2382  1.1  mrg     return;
   2383  1.1  mrg 
   2384  1.1  mrg   /* Set the line and filename.  sym->declared_at seems to point to the
   2385  1.1  mrg      last statement for subroutines, but it'll do for now.  */
   2386  1.1  mrg   gfc_set_backend_locus (&sym->declared_at);
   2387  1.1  mrg 
   2388  1.1  mrg   /* Allow only one nesting level.  Allow public declarations.  */
   2389  1.1  mrg   gcc_assert (current_function_decl == NULL_TREE
   2390  1.1  mrg 	      || DECL_FILE_SCOPE_P (current_function_decl)
   2391  1.1  mrg 	      || (TREE_CODE (DECL_CONTEXT (current_function_decl))
   2392  1.1  mrg 		  == NAMESPACE_DECL));
   2393  1.1  mrg 
   2394  1.1  mrg   type = gfc_get_function_type (sym);
   2395  1.1  mrg   fndecl = build_decl (input_location,
   2396  1.1  mrg 		       FUNCTION_DECL, gfc_sym_identifier (sym), type);
   2397  1.1  mrg 
   2398  1.1  mrg   attr = sym->attr;
   2399  1.1  mrg 
   2400  1.1  mrg   /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
   2401  1.1  mrg      TREE_PUBLIC specifies whether a function is globally addressable (i.e.
   2402  1.1  mrg      the opposite of declaring a function as static in C).  */
   2403  1.1  mrg   DECL_EXTERNAL (fndecl) = 0;
   2404  1.1  mrg 
   2405  1.1  mrg   if (sym->attr.access == ACCESS_UNKNOWN && sym->module
   2406  1.1  mrg       && (sym->ns->default_access == ACCESS_PRIVATE
   2407  1.1  mrg 	  || (sym->ns->default_access == ACCESS_UNKNOWN
   2408  1.1  mrg 	      && flag_module_private)))
   2409  1.1  mrg     sym->attr.access = ACCESS_PRIVATE;
   2410  1.1  mrg 
   2411  1.1  mrg   if (!current_function_decl
   2412  1.1  mrg       && !sym->attr.entry_master && !sym->attr.is_main_program
   2413  1.1  mrg       && (sym->attr.access != ACCESS_PRIVATE || sym->binding_label
   2414  1.1  mrg 	  || sym->attr.public_used))
   2415  1.1  mrg     TREE_PUBLIC (fndecl) = 1;
   2416  1.1  mrg 
   2417  1.1  mrg   if (sym->attr.referenced || sym->attr.entry_master)
   2418  1.1  mrg     TREE_USED (fndecl) = 1;
   2419  1.1  mrg 
   2420  1.1  mrg   attributes = add_attributes_to_decl (attr, NULL_TREE);
   2421  1.1  mrg   decl_attributes (&fndecl, attributes, 0);
   2422  1.1  mrg 
   2423  1.1  mrg   /* Figure out the return type of the declared function, and build a
   2424  1.1  mrg      RESULT_DECL for it.  If this is a subroutine with alternate
   2425  1.1  mrg      returns, build a RESULT_DECL for it.  */
   2426  1.1  mrg   result_decl = NULL_TREE;
   2427  1.1  mrg   /* TODO: Shouldn't this just be TREE_TYPE (TREE_TYPE (fndecl)).  */
   2428  1.1  mrg   if (attr.function)
   2429  1.1  mrg     {
   2430  1.1  mrg       if (gfc_return_by_reference (sym))
   2431  1.1  mrg 	type = void_type_node;
   2432  1.1  mrg       else
   2433  1.1  mrg 	{
   2434  1.1  mrg 	  if (sym->result != sym)
   2435  1.1  mrg 	    result_decl = gfc_sym_identifier (sym->result);
   2436  1.1  mrg 
   2437  1.1  mrg 	  type = TREE_TYPE (TREE_TYPE (fndecl));
   2438  1.1  mrg 	}
   2439  1.1  mrg     }
   2440  1.1  mrg   else
   2441  1.1  mrg     {
   2442  1.1  mrg       /* Look for alternate return placeholders.  */
   2443  1.1  mrg       int has_alternate_returns = 0;
   2444  1.1  mrg       for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
   2445  1.1  mrg 	{
   2446  1.1  mrg 	  if (f->sym == NULL)
   2447  1.1  mrg 	    {
   2448  1.1  mrg 	      has_alternate_returns = 1;
   2449  1.1  mrg 	      break;
   2450  1.1  mrg 	    }
   2451  1.1  mrg 	}
   2452  1.1  mrg 
   2453  1.1  mrg       if (has_alternate_returns)
   2454  1.1  mrg 	type = integer_type_node;
   2455  1.1  mrg       else
   2456  1.1  mrg 	type = void_type_node;
   2457  1.1  mrg     }
   2458  1.1  mrg 
   2459  1.1  mrg   result_decl = build_decl (input_location,
   2460  1.1  mrg 			    RESULT_DECL, result_decl, type);
   2461  1.1  mrg   DECL_ARTIFICIAL (result_decl) = 1;
   2462  1.1  mrg   DECL_IGNORED_P (result_decl) = 1;
   2463  1.1  mrg   DECL_CONTEXT (result_decl) = fndecl;
   2464  1.1  mrg   DECL_RESULT (fndecl) = result_decl;
   2465  1.1  mrg 
   2466  1.1  mrg   /* Don't call layout_decl for a RESULT_DECL.
   2467  1.1  mrg      layout_decl (result_decl, 0);  */
   2468  1.1  mrg 
   2469  1.1  mrg   /* TREE_STATIC means the function body is defined here.  */
   2470  1.1  mrg   TREE_STATIC (fndecl) = 1;
   2471  1.1  mrg 
   2472  1.1  mrg   /* Set attributes for PURE functions. A call to a PURE function in the
   2473  1.1  mrg      Fortran 95 sense is both pure and without side effects in the C
   2474  1.1  mrg      sense.  */
   2475  1.1  mrg   if (attr.pure || attr.implicit_pure)
   2476  1.1  mrg     {
   2477  1.1  mrg       /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
   2478  1.1  mrg 	 including an alternate return. In that case it can also be
   2479  1.1  mrg 	 marked as PURE. See also in gfc_get_extern_function_decl().  */
   2480  1.1  mrg       if (attr.function && !gfc_return_by_reference (sym))
   2481  1.1  mrg 	DECL_PURE_P (fndecl) = 1;
   2482  1.1  mrg       TREE_SIDE_EFFECTS (fndecl) = 0;
   2483  1.1  mrg     }
   2484  1.1  mrg 
   2485  1.1  mrg 
   2486  1.1  mrg   /* Layout the function declaration and put it in the binding level
   2487  1.1  mrg      of the current function.  */
   2488  1.1  mrg 
   2489  1.1  mrg   if (global)
   2490  1.1  mrg     pushdecl_top_level (fndecl);
   2491  1.1  mrg   else
   2492  1.1  mrg     pushdecl (fndecl);
   2493  1.1  mrg 
   2494  1.1  mrg   /* Perform name mangling if this is a top level or module procedure.  */
   2495  1.1  mrg   if (current_function_decl == NULL_TREE)
   2496  1.1  mrg     gfc_set_decl_assembler_name (fndecl, gfc_sym_mangled_function_id (sym));
   2497  1.1  mrg 
   2498  1.1  mrg   sym->backend_decl = fndecl;
   2499  1.1  mrg }
   2500  1.1  mrg 
   2501  1.1  mrg 
   2502  1.1  mrg /* Create the DECL_ARGUMENTS for a procedure.
   2503  1.1  mrg    NOTE: The arguments added here must match the argument type created by
   2504  1.1  mrg    gfc_get_function_type ().  */
   2505  1.1  mrg 
   2506  1.1  mrg static void
   2507  1.1  mrg create_function_arglist (gfc_symbol * sym)
   2508  1.1  mrg {
   2509  1.1  mrg   tree fndecl;
   2510  1.1  mrg   gfc_formal_arglist *f;
   2511  1.1  mrg   tree typelist, hidden_typelist;
   2512  1.1  mrg   tree arglist, hidden_arglist;
   2513  1.1  mrg   tree type;
   2514  1.1  mrg   tree parm;
   2515  1.1  mrg 
   2516  1.1  mrg   fndecl = sym->backend_decl;
   2517  1.1  mrg 
   2518  1.1  mrg   /* Build formal argument list. Make sure that their TREE_CONTEXT is
   2519  1.1  mrg      the new FUNCTION_DECL node.  */
   2520  1.1  mrg   arglist = NULL_TREE;
   2521  1.1  mrg   hidden_arglist = NULL_TREE;
   2522  1.1  mrg   typelist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
   2523  1.1  mrg 
   2524  1.1  mrg   if (sym->attr.entry_master)
   2525  1.1  mrg     {
   2526  1.1  mrg       type = TREE_VALUE (typelist);
   2527  1.1  mrg       parm = build_decl (input_location,
   2528  1.1  mrg 			 PARM_DECL, get_identifier ("__entry"), type);
   2529  1.1  mrg 
   2530  1.1  mrg       DECL_CONTEXT (parm) = fndecl;
   2531  1.1  mrg       DECL_ARG_TYPE (parm) = type;
   2532  1.1  mrg       TREE_READONLY (parm) = 1;
   2533  1.1  mrg       gfc_finish_decl (parm);
   2534  1.1  mrg       DECL_ARTIFICIAL (parm) = 1;
   2535  1.1  mrg 
   2536  1.1  mrg       arglist = chainon (arglist, parm);
   2537  1.1  mrg       typelist = TREE_CHAIN (typelist);
   2538  1.1  mrg     }
   2539  1.1  mrg 
   2540  1.1  mrg   if (gfc_return_by_reference (sym))
   2541  1.1  mrg     {
   2542  1.1  mrg       tree type = TREE_VALUE (typelist), length = NULL;
   2543  1.1  mrg 
   2544  1.1  mrg       if (sym->ts.type == BT_CHARACTER)
   2545  1.1  mrg 	{
   2546  1.1  mrg 	  /* Length of character result.  */
   2547  1.1  mrg 	  tree len_type = TREE_VALUE (TREE_CHAIN (typelist));
   2548  1.1  mrg 
   2549  1.1  mrg 	  length = build_decl (input_location,
   2550  1.1  mrg 			       PARM_DECL,
   2551  1.1  mrg 			       get_identifier (".__result"),
   2552  1.1  mrg 			       len_type);
   2553  1.1  mrg 	  if (POINTER_TYPE_P (len_type))
   2554  1.1  mrg 	    {
   2555  1.1  mrg 	      sym->ts.u.cl->passed_length = length;
   2556  1.1  mrg 	      TREE_USED (length) = 1;
   2557  1.1  mrg 	    }
   2558  1.1  mrg 	  else if (!sym->ts.u.cl->length)
   2559  1.1  mrg 	    {
   2560  1.1  mrg 	      sym->ts.u.cl->backend_decl = length;
   2561  1.1  mrg 	      TREE_USED (length) = 1;
   2562  1.1  mrg 	    }
   2563  1.1  mrg 	  gcc_assert (TREE_CODE (length) == PARM_DECL);
   2564  1.1  mrg 	  DECL_CONTEXT (length) = fndecl;
   2565  1.1  mrg 	  DECL_ARG_TYPE (length) = len_type;
   2566  1.1  mrg 	  TREE_READONLY (length) = 1;
   2567  1.1  mrg 	  DECL_ARTIFICIAL (length) = 1;
   2568  1.1  mrg 	  gfc_finish_decl (length);
   2569  1.1  mrg 	  if (sym->ts.u.cl->backend_decl == NULL
   2570  1.1  mrg 	      || sym->ts.u.cl->backend_decl == length)
   2571  1.1  mrg 	    {
   2572  1.1  mrg 	      gfc_symbol *arg;
   2573  1.1  mrg 	      tree backend_decl;
   2574  1.1  mrg 
   2575  1.1  mrg 	      if (sym->ts.u.cl->backend_decl == NULL)
   2576  1.1  mrg 		{
   2577  1.1  mrg 		  tree len = build_decl (input_location,
   2578  1.1  mrg 					 VAR_DECL,
   2579  1.1  mrg 					 get_identifier ("..__result"),
   2580  1.1  mrg 					 gfc_charlen_type_node);
   2581  1.1  mrg 		  DECL_ARTIFICIAL (len) = 1;
   2582  1.1  mrg 		  TREE_USED (len) = 1;
   2583  1.1  mrg 		  sym->ts.u.cl->backend_decl = len;
   2584  1.1  mrg 		}
   2585  1.1  mrg 
   2586  1.1  mrg 	      /* Make sure PARM_DECL type doesn't point to incomplete type.  */
   2587  1.1  mrg 	      arg = sym->result ? sym->result : sym;
   2588  1.1  mrg 	      backend_decl = arg->backend_decl;
   2589  1.1  mrg 	      /* Temporary clear it, so that gfc_sym_type creates complete
   2590  1.1  mrg 		 type.  */
   2591  1.1  mrg 	      arg->backend_decl = NULL;
   2592  1.1  mrg 	      type = gfc_sym_type (arg);
   2593  1.1  mrg 	      arg->backend_decl = backend_decl;
   2594  1.1  mrg 	      type = build_reference_type (type);
   2595  1.1  mrg 	    }
   2596  1.1  mrg 	}
   2597  1.1  mrg 
   2598  1.1  mrg       parm = build_decl (input_location,
   2599  1.1  mrg 			 PARM_DECL, get_identifier ("__result"), type);
   2600  1.1  mrg 
   2601  1.1  mrg       DECL_CONTEXT (parm) = fndecl;
   2602  1.1  mrg       DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
   2603  1.1  mrg       TREE_READONLY (parm) = 1;
   2604  1.1  mrg       DECL_ARTIFICIAL (parm) = 1;
   2605  1.1  mrg       gfc_finish_decl (parm);
   2606  1.1  mrg 
   2607  1.1  mrg       arglist = chainon (arglist, parm);
   2608  1.1  mrg       typelist = TREE_CHAIN (typelist);
   2609  1.1  mrg 
   2610  1.1  mrg       if (sym->ts.type == BT_CHARACTER)
   2611  1.1  mrg 	{
   2612  1.1  mrg 	  gfc_allocate_lang_decl (parm);
   2613  1.1  mrg 	  arglist = chainon (arglist, length);
   2614  1.1  mrg 	  typelist = TREE_CHAIN (typelist);
   2615  1.1  mrg 	}
   2616  1.1  mrg     }
   2617  1.1  mrg 
   2618  1.1  mrg   hidden_typelist = typelist;
   2619  1.1  mrg   for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
   2620  1.1  mrg     if (f->sym != NULL)	/* Ignore alternate returns.  */
   2621  1.1  mrg       hidden_typelist = TREE_CHAIN (hidden_typelist);
   2622  1.1  mrg 
   2623  1.1  mrg   for (f = gfc_sym_get_dummy_args (sym); f; f = f->next)
   2624  1.1  mrg     {
   2625  1.1  mrg       char name[GFC_MAX_SYMBOL_LEN + 2];
   2626  1.1  mrg 
   2627  1.1  mrg       /* Ignore alternate returns.  */
   2628  1.1  mrg       if (f->sym == NULL)
   2629  1.1  mrg 	continue;
   2630  1.1  mrg 
   2631  1.1  mrg       type = TREE_VALUE (typelist);
   2632  1.1  mrg 
   2633  1.1  mrg       if (f->sym->ts.type == BT_CHARACTER
   2634  1.1  mrg 	  && (!sym->attr.is_bind_c || sym->attr.entry_master))
   2635  1.1  mrg 	{
   2636  1.1  mrg 	  tree len_type = TREE_VALUE (hidden_typelist);
   2637  1.1  mrg 	  tree length = NULL_TREE;
   2638  1.1  mrg 	  if (!f->sym->ts.deferred)
   2639  1.1  mrg 	    gcc_assert (len_type == gfc_charlen_type_node);
   2640  1.1  mrg 	  else
   2641  1.1  mrg 	    gcc_assert (POINTER_TYPE_P (len_type));
   2642  1.1  mrg 
   2643  1.1  mrg 	  strcpy (&name[1], f->sym->name);
   2644  1.1  mrg 	  name[0] = '_';
   2645  1.1  mrg 	  length = build_decl (input_location,
   2646  1.1  mrg 			       PARM_DECL, get_identifier (name), len_type);
   2647  1.1  mrg 
   2648  1.1  mrg 	  hidden_arglist = chainon (hidden_arglist, length);
   2649  1.1  mrg 	  DECL_CONTEXT (length) = fndecl;
   2650  1.1  mrg 	  DECL_ARTIFICIAL (length) = 1;
   2651  1.1  mrg 	  DECL_ARG_TYPE (length) = len_type;
   2652  1.1  mrg 	  TREE_READONLY (length) = 1;
   2653  1.1  mrg 	  gfc_finish_decl (length);
   2654  1.1  mrg 
   2655  1.1  mrg 	  /* Marking the length DECL_HIDDEN_STRING_LENGTH will lead
   2656  1.1  mrg 	     to tail calls being disabled.  Only do that if we
   2657  1.1  mrg 	     potentially have broken callers.  */
   2658  1.1  mrg 	  if (flag_tail_call_workaround
   2659  1.1  mrg 	      && f->sym->ts.u.cl
   2660  1.1  mrg 	      && f->sym->ts.u.cl->length
   2661  1.1  mrg 	      && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT
   2662  1.1  mrg 	      && (flag_tail_call_workaround == 2
   2663  1.1  mrg 		  || f->sym->ns->implicit_interface_calls))
   2664  1.1  mrg 	    DECL_HIDDEN_STRING_LENGTH (length) = 1;
   2665  1.1  mrg 
   2666  1.1  mrg 	  /* Remember the passed value.  */
   2667  1.1  mrg           if (!f->sym->ts.u.cl ||  f->sym->ts.u.cl->passed_length)
   2668  1.1  mrg             {
   2669  1.1  mrg 	      /* This can happen if the same type is used for multiple
   2670  1.1  mrg 		 arguments. We need to copy cl as otherwise
   2671  1.1  mrg 		 cl->passed_length gets overwritten.  */
   2672  1.1  mrg 	      f->sym->ts.u.cl = gfc_new_charlen (f->sym->ns, f->sym->ts.u.cl);
   2673  1.1  mrg             }
   2674  1.1  mrg 	  f->sym->ts.u.cl->passed_length = length;
   2675  1.1  mrg 
   2676  1.1  mrg 	  /* Use the passed value for assumed length variables.  */
   2677  1.1  mrg 	  if (!f->sym->ts.u.cl->length)
   2678  1.1  mrg 	    {
   2679  1.1  mrg 	      TREE_USED (length) = 1;
   2680  1.1  mrg 	      gcc_assert (!f->sym->ts.u.cl->backend_decl);
   2681  1.1  mrg 	      f->sym->ts.u.cl->backend_decl = length;
   2682  1.1  mrg 	    }
   2683  1.1  mrg 
   2684  1.1  mrg 	  hidden_typelist = TREE_CHAIN (hidden_typelist);
   2685  1.1  mrg 
   2686  1.1  mrg 	  if (f->sym->ts.u.cl->backend_decl == NULL
   2687  1.1  mrg 	      || f->sym->ts.u.cl->backend_decl == length)
   2688  1.1  mrg 	    {
   2689  1.1  mrg 	      if (POINTER_TYPE_P (len_type))
   2690  1.1  mrg 		f->sym->ts.u.cl->backend_decl
   2691  1.1  mrg 		  = build_fold_indirect_ref_loc (input_location, length);
   2692  1.1  mrg 	      else if (f->sym->ts.u.cl->backend_decl == NULL)
   2693  1.1  mrg 		gfc_create_string_length (f->sym);
   2694  1.1  mrg 
   2695  1.1  mrg 	      /* Make sure PARM_DECL type doesn't point to incomplete type.  */
   2696  1.1  mrg 	      if (f->sym->attr.flavor == FL_PROCEDURE)
   2697  1.1  mrg 		type = build_pointer_type (gfc_get_function_type (f->sym));
   2698  1.1  mrg 	      else
   2699  1.1  mrg 		type = gfc_sym_type (f->sym);
   2700  1.1  mrg 	    }
   2701  1.1  mrg 	}
   2702  1.1  mrg       /* For noncharacter scalar intrinsic types, VALUE passes the value,
   2703  1.1  mrg 	 hence, the optional status cannot be transferred via a NULL pointer.
   2704  1.1  mrg 	 Thus, we will use a hidden argument in that case.  */
   2705  1.1  mrg       else if (f->sym->attr.optional && f->sym->attr.value
   2706  1.1  mrg 	       && !f->sym->attr.dimension && f->sym->ts.type != BT_CLASS
   2707  1.1  mrg 	       && !gfc_bt_struct (f->sym->ts.type))
   2708  1.1  mrg 	{
   2709  1.1  mrg           tree tmp;
   2710  1.1  mrg           strcpy (&name[1], f->sym->name);
   2711  1.1  mrg           name[0] = '_';
   2712  1.1  mrg           tmp = build_decl (input_location,
   2713  1.1  mrg 			    PARM_DECL, get_identifier (name),
   2714  1.1  mrg 			    boolean_type_node);
   2715  1.1  mrg 
   2716  1.1  mrg           hidden_arglist = chainon (hidden_arglist, tmp);
   2717  1.1  mrg           DECL_CONTEXT (tmp) = fndecl;
   2718  1.1  mrg           DECL_ARTIFICIAL (tmp) = 1;
   2719  1.1  mrg           DECL_ARG_TYPE (tmp) = boolean_type_node;
   2720  1.1  mrg           TREE_READONLY (tmp) = 1;
   2721  1.1  mrg           gfc_finish_decl (tmp);
   2722  1.1  mrg 
   2723  1.1  mrg 	  hidden_typelist = TREE_CHAIN (hidden_typelist);
   2724  1.1  mrg 	}
   2725  1.1  mrg 
   2726  1.1  mrg       /* For non-constant length array arguments, make sure they use
   2727  1.1  mrg 	 a different type node from TYPE_ARG_TYPES type.  */
   2728  1.1  mrg       if (f->sym->attr.dimension
   2729  1.1  mrg 	  && type == TREE_VALUE (typelist)
   2730  1.1  mrg 	  && TREE_CODE (type) == POINTER_TYPE
   2731  1.1  mrg 	  && GFC_ARRAY_TYPE_P (type)
   2732  1.1  mrg 	  && f->sym->as->type != AS_ASSUMED_SIZE
   2733  1.1  mrg 	  && ! COMPLETE_TYPE_P (TREE_TYPE (type)))
   2734  1.1  mrg 	{
   2735  1.1  mrg 	  if (f->sym->attr.flavor == FL_PROCEDURE)
   2736  1.1  mrg 	    type = build_pointer_type (gfc_get_function_type (f->sym));
   2737  1.1  mrg 	  else
   2738  1.1  mrg 	    type = gfc_sym_type (f->sym);
   2739  1.1  mrg 	}
   2740  1.1  mrg 
   2741  1.1  mrg       if (f->sym->attr.proc_pointer)
   2742  1.1  mrg         type = build_pointer_type (type);
   2743  1.1  mrg 
   2744  1.1  mrg       if (f->sym->attr.volatile_)
   2745  1.1  mrg 	type = build_qualified_type (type, TYPE_QUAL_VOLATILE);
   2746  1.1  mrg 
   2747  1.1  mrg       /* Build the argument declaration. For C descriptors, we use a
   2748  1.1  mrg 	 '_'-prefixed name for the parm_decl and inside the proc the
   2749  1.1  mrg 	 sym->name. */
   2750  1.1  mrg       tree parm_name;
   2751  1.1  mrg       if (sym->attr.is_bind_c && is_CFI_desc (f->sym, NULL))
   2752  1.1  mrg 	{
   2753  1.1  mrg 	  strcpy (&name[1], f->sym->name);
   2754  1.1  mrg 	  name[0] = '_';
   2755  1.1  mrg 	  parm_name = get_identifier (name);
   2756  1.1  mrg 	}
   2757  1.1  mrg       else
   2758  1.1  mrg 	parm_name = gfc_sym_identifier (f->sym);
   2759  1.1  mrg       parm = build_decl (input_location, PARM_DECL, parm_name, type);
   2760  1.1  mrg 
   2761  1.1  mrg       if (f->sym->attr.volatile_)
   2762  1.1  mrg 	{
   2763  1.1  mrg 	  TREE_THIS_VOLATILE (parm) = 1;
   2764  1.1  mrg 	  TREE_SIDE_EFFECTS (parm) = 1;
   2765  1.1  mrg 	}
   2766  1.1  mrg 
   2767  1.1  mrg       /* Fill in arg stuff.  */
   2768  1.1  mrg       DECL_CONTEXT (parm) = fndecl;
   2769  1.1  mrg       DECL_ARG_TYPE (parm) = TREE_VALUE (typelist);
   2770  1.1  mrg       /* All implementation args except for VALUE are read-only.  */
   2771  1.1  mrg       if (!f->sym->attr.value)
   2772  1.1  mrg 	TREE_READONLY (parm) = 1;
   2773  1.1  mrg       if (POINTER_TYPE_P (type)
   2774  1.1  mrg 	  && (!f->sym->attr.proc_pointer
   2775  1.1  mrg 	      && f->sym->attr.flavor != FL_PROCEDURE))
   2776  1.1  mrg 	DECL_BY_REFERENCE (parm) = 1;
   2777  1.1  mrg       if (f->sym->attr.optional)
   2778  1.1  mrg 	{
   2779  1.1  mrg 	  gfc_allocate_lang_decl (parm);
   2780  1.1  mrg 	  GFC_DECL_OPTIONAL_ARGUMENT (parm) = 1;
   2781  1.1  mrg 	}
   2782  1.1  mrg 
   2783  1.1  mrg       gfc_finish_decl (parm);
   2784  1.1  mrg       gfc_finish_decl_attrs (parm, &f->sym->attr);
   2785  1.1  mrg 
   2786  1.1  mrg       f->sym->backend_decl = parm;
   2787  1.1  mrg 
   2788  1.1  mrg       /* Coarrays which are descriptorless or assumed-shape pass with
   2789  1.1  mrg 	 -fcoarray=lib the token and the offset as hidden arguments.  */
   2790  1.1  mrg       if (flag_coarray == GFC_FCOARRAY_LIB
   2791  1.1  mrg 	  && ((f->sym->ts.type != BT_CLASS && f->sym->attr.codimension
   2792  1.1  mrg 	       && !f->sym->attr.allocatable)
   2793  1.1  mrg 	      || (f->sym->ts.type == BT_CLASS
   2794  1.1  mrg 		  && CLASS_DATA (f->sym)->attr.codimension
   2795  1.1  mrg 		  && !CLASS_DATA (f->sym)->attr.allocatable)))
   2796  1.1  mrg 	{
   2797  1.1  mrg 	  tree caf_type;
   2798  1.1  mrg 	  tree token;
   2799  1.1  mrg 	  tree offset;
   2800  1.1  mrg 
   2801  1.1  mrg 	  gcc_assert (f->sym->backend_decl != NULL_TREE
   2802  1.1  mrg 		      && !sym->attr.is_bind_c);
   2803  1.1  mrg 	  caf_type = f->sym->ts.type == BT_CLASS
   2804  1.1  mrg 		     ? TREE_TYPE (CLASS_DATA (f->sym)->backend_decl)
   2805  1.1  mrg 		     : TREE_TYPE (f->sym->backend_decl);
   2806  1.1  mrg 
   2807  1.1  mrg 	  token = build_decl (input_location, PARM_DECL,
   2808  1.1  mrg 			      create_tmp_var_name ("caf_token"),
   2809  1.1  mrg 			      build_qualified_type (pvoid_type_node,
   2810  1.1  mrg 						    TYPE_QUAL_RESTRICT));
   2811  1.1  mrg 	  if ((f->sym->ts.type != BT_CLASS
   2812  1.1  mrg 	       && f->sym->as->type != AS_DEFERRED)
   2813  1.1  mrg 	      || (f->sym->ts.type == BT_CLASS
   2814  1.1  mrg 		  && CLASS_DATA (f->sym)->as->type != AS_DEFERRED))
   2815  1.1  mrg 	    {
   2816  1.1  mrg 	      gcc_assert (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL
   2817  1.1  mrg 			  || GFC_DECL_TOKEN (f->sym->backend_decl) == NULL_TREE);
   2818  1.1  mrg 	      if (DECL_LANG_SPECIFIC (f->sym->backend_decl) == NULL)
   2819  1.1  mrg 		gfc_allocate_lang_decl (f->sym->backend_decl);
   2820  1.1  mrg 	      GFC_DECL_TOKEN (f->sym->backend_decl) = token;
   2821  1.1  mrg 	    }
   2822  1.1  mrg           else
   2823  1.1  mrg 	    {
   2824  1.1  mrg 	      gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) == NULL_TREE);
   2825  1.1  mrg 	      GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) = token;
   2826  1.1  mrg 	    }
   2827  1.1  mrg 
   2828  1.1  mrg 	  DECL_CONTEXT (token) = fndecl;
   2829  1.1  mrg 	  DECL_ARTIFICIAL (token) = 1;
   2830  1.1  mrg 	  DECL_ARG_TYPE (token) = TREE_VALUE (typelist);
   2831  1.1  mrg 	  TREE_READONLY (token) = 1;
   2832  1.1  mrg 	  hidden_arglist = chainon (hidden_arglist, token);
   2833  1.1  mrg 	  hidden_typelist = TREE_CHAIN (hidden_typelist);
   2834  1.1  mrg 	  gfc_finish_decl (token);
   2835  1.1  mrg 
   2836  1.1  mrg 	  offset = build_decl (input_location, PARM_DECL,
   2837  1.1  mrg 			       create_tmp_var_name ("caf_offset"),
   2838  1.1  mrg 			       gfc_array_index_type);
   2839  1.1  mrg 
   2840  1.1  mrg 	  if ((f->sym->ts.type != BT_CLASS
   2841  1.1  mrg 	       && f->sym->as->type != AS_DEFERRED)
   2842  1.1  mrg 	      || (f->sym->ts.type == BT_CLASS
   2843  1.1  mrg 		  && CLASS_DATA (f->sym)->as->type != AS_DEFERRED))
   2844  1.1  mrg 	    {
   2845  1.1  mrg 	      gcc_assert (GFC_DECL_CAF_OFFSET (f->sym->backend_decl)
   2846  1.1  mrg 					       == NULL_TREE);
   2847  1.1  mrg 	      GFC_DECL_CAF_OFFSET (f->sym->backend_decl) = offset;
   2848  1.1  mrg 	    }
   2849  1.1  mrg 	  else
   2850  1.1  mrg 	    {
   2851  1.1  mrg 	      gcc_assert (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) == NULL_TREE);
   2852  1.1  mrg 	      GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) = offset;
   2853  1.1  mrg 	    }
   2854  1.1  mrg 	  DECL_CONTEXT (offset) = fndecl;
   2855  1.1  mrg 	  DECL_ARTIFICIAL (offset) = 1;
   2856  1.1  mrg 	  DECL_ARG_TYPE (offset) = TREE_VALUE (typelist);
   2857  1.1  mrg 	  TREE_READONLY (offset) = 1;
   2858  1.1  mrg 	  hidden_arglist = chainon (hidden_arglist, offset);
   2859  1.1  mrg 	  hidden_typelist = TREE_CHAIN (hidden_typelist);
   2860  1.1  mrg 	  gfc_finish_decl (offset);
   2861  1.1  mrg 	}
   2862  1.1  mrg 
   2863  1.1  mrg       arglist = chainon (arglist, parm);
   2864  1.1  mrg       typelist = TREE_CHAIN (typelist);
   2865  1.1  mrg     }
   2866  1.1  mrg 
   2867  1.1  mrg   /* Add the hidden string length parameters, unless the procedure
   2868  1.1  mrg      is bind(C).  */
   2869  1.1  mrg   if (!sym->attr.is_bind_c)
   2870  1.1  mrg     arglist = chainon (arglist, hidden_arglist);
   2871  1.1  mrg 
   2872  1.1  mrg   gcc_assert (hidden_typelist == NULL_TREE
   2873  1.1  mrg               || TREE_VALUE (hidden_typelist) == void_type_node);
   2874  1.1  mrg   DECL_ARGUMENTS (fndecl) = arglist;
   2875  1.1  mrg }
   2876  1.1  mrg 
   2877  1.1  mrg /* Do the setup necessary before generating the body of a function.  */
   2878  1.1  mrg 
   2879  1.1  mrg static void
   2880  1.1  mrg trans_function_start (gfc_symbol * sym)
   2881  1.1  mrg {
   2882  1.1  mrg   tree fndecl;
   2883  1.1  mrg 
   2884  1.1  mrg   fndecl = sym->backend_decl;
   2885  1.1  mrg 
   2886  1.1  mrg   /* Let GCC know the current scope is this function.  */
   2887  1.1  mrg   current_function_decl = fndecl;
   2888  1.1  mrg 
   2889  1.1  mrg   /* Let the world know what we're about to do.  */
   2890  1.1  mrg   announce_function (fndecl);
   2891  1.1  mrg 
   2892  1.1  mrg   if (DECL_FILE_SCOPE_P (fndecl))
   2893  1.1  mrg     {
   2894  1.1  mrg       /* Create RTL for function declaration.  */
   2895  1.1  mrg       rest_of_decl_compilation (fndecl, 1, 0);
   2896  1.1  mrg     }
   2897  1.1  mrg 
   2898  1.1  mrg   /* Create RTL for function definition.  */
   2899  1.1  mrg   make_decl_rtl (fndecl);
   2900  1.1  mrg 
   2901  1.1  mrg   allocate_struct_function (fndecl, false);
   2902  1.1  mrg 
   2903  1.1  mrg   /* function.cc requires a push at the start of the function.  */
   2904  1.1  mrg   pushlevel ();
   2905  1.1  mrg }
   2906  1.1  mrg 
   2907  1.1  mrg /* Create thunks for alternate entry points.  */
   2908  1.1  mrg 
   2909  1.1  mrg static void
   2910  1.1  mrg build_entry_thunks (gfc_namespace * ns, bool global)
   2911  1.1  mrg {
   2912  1.1  mrg   gfc_formal_arglist *formal;
   2913  1.1  mrg   gfc_formal_arglist *thunk_formal;
   2914  1.1  mrg   gfc_entry_list *el;
   2915  1.1  mrg   gfc_symbol *thunk_sym;
   2916  1.1  mrg   stmtblock_t body;
   2917  1.1  mrg   tree thunk_fndecl;
   2918  1.1  mrg   tree tmp;
   2919  1.1  mrg   locus old_loc;
   2920  1.1  mrg 
   2921  1.1  mrg   /* This should always be a toplevel function.  */
   2922  1.1  mrg   gcc_assert (current_function_decl == NULL_TREE);
   2923  1.1  mrg 
   2924  1.1  mrg   gfc_save_backend_locus (&old_loc);
   2925  1.1  mrg   for (el = ns->entries; el; el = el->next)
   2926  1.1  mrg     {
   2927  1.1  mrg       vec<tree, va_gc> *args = NULL;
   2928  1.1  mrg       vec<tree, va_gc> *string_args = NULL;
   2929  1.1  mrg 
   2930  1.1  mrg       thunk_sym = el->sym;
   2931  1.1  mrg 
   2932  1.1  mrg       build_function_decl (thunk_sym, global);
   2933  1.1  mrg       create_function_arglist (thunk_sym);
   2934  1.1  mrg 
   2935  1.1  mrg       trans_function_start (thunk_sym);
   2936  1.1  mrg 
   2937  1.1  mrg       thunk_fndecl = thunk_sym->backend_decl;
   2938  1.1  mrg 
   2939  1.1  mrg       gfc_init_block (&body);
   2940  1.1  mrg 
   2941  1.1  mrg       /* Pass extra parameter identifying this entry point.  */
   2942  1.1  mrg       tmp = build_int_cst (gfc_array_index_type, el->id);
   2943  1.1  mrg       vec_safe_push (args, tmp);
   2944  1.1  mrg 
   2945  1.1  mrg       if (thunk_sym->attr.function)
   2946  1.1  mrg 	{
   2947  1.1  mrg 	  if (gfc_return_by_reference (ns->proc_name))
   2948  1.1  mrg 	    {
   2949  1.1  mrg 	      tree ref = DECL_ARGUMENTS (current_function_decl);
   2950  1.1  mrg 	      vec_safe_push (args, ref);
   2951  1.1  mrg 	      if (ns->proc_name->ts.type == BT_CHARACTER)
   2952  1.1  mrg 		vec_safe_push (args, DECL_CHAIN (ref));
   2953  1.1  mrg 	    }
   2954  1.1  mrg 	}
   2955  1.1  mrg 
   2956  1.1  mrg       for (formal = gfc_sym_get_dummy_args (ns->proc_name); formal;
   2957  1.1  mrg 	   formal = formal->next)
   2958  1.1  mrg 	{
   2959  1.1  mrg 	  /* Ignore alternate returns.  */
   2960  1.1  mrg 	  if (formal->sym == NULL)
   2961  1.1  mrg 	    continue;
   2962  1.1  mrg 
   2963  1.1  mrg 	  /* We don't have a clever way of identifying arguments, so resort to
   2964  1.1  mrg 	     a brute-force search.  */
   2965  1.1  mrg 	  for (thunk_formal = gfc_sym_get_dummy_args (thunk_sym);
   2966  1.1  mrg 	       thunk_formal;
   2967  1.1  mrg 	       thunk_formal = thunk_formal->next)
   2968  1.1  mrg 	    {
   2969  1.1  mrg 	      if (thunk_formal->sym == formal->sym)
   2970  1.1  mrg 		break;
   2971  1.1  mrg 	    }
   2972  1.1  mrg 
   2973  1.1  mrg 	  if (thunk_formal)
   2974  1.1  mrg 	    {
   2975  1.1  mrg 	      /* Pass the argument.  */
   2976  1.1  mrg 	      DECL_ARTIFICIAL (thunk_formal->sym->backend_decl) = 1;
   2977  1.1  mrg 	      vec_safe_push (args, thunk_formal->sym->backend_decl);
   2978  1.1  mrg 	      if (formal->sym->ts.type == BT_CHARACTER)
   2979  1.1  mrg 		{
   2980  1.1  mrg 		  tmp = thunk_formal->sym->ts.u.cl->backend_decl;
   2981  1.1  mrg 		  vec_safe_push (string_args, tmp);
   2982  1.1  mrg 		}
   2983  1.1  mrg 	    }
   2984  1.1  mrg 	  else
   2985  1.1  mrg 	    {
   2986  1.1  mrg 	      /* Pass NULL for a missing argument.  */
   2987  1.1  mrg 	      vec_safe_push (args, null_pointer_node);
   2988  1.1  mrg 	      if (formal->sym->ts.type == BT_CHARACTER)
   2989  1.1  mrg 		{
   2990  1.1  mrg 		  tmp = build_int_cst (gfc_charlen_type_node, 0);
   2991  1.1  mrg 		  vec_safe_push (string_args, tmp);
   2992  1.1  mrg 		}
   2993  1.1  mrg 	    }
   2994  1.1  mrg 	}
   2995  1.1  mrg 
   2996  1.1  mrg       /* Call the master function.  */
   2997  1.1  mrg       vec_safe_splice (args, string_args);
   2998  1.1  mrg       tmp = ns->proc_name->backend_decl;
   2999  1.1  mrg       tmp = build_call_expr_loc_vec (input_location, tmp, args);
   3000  1.1  mrg       if (ns->proc_name->attr.mixed_entry_master)
   3001  1.1  mrg 	{
   3002  1.1  mrg 	  tree union_decl, field;
   3003  1.1  mrg 	  tree master_type = TREE_TYPE (ns->proc_name->backend_decl);
   3004  1.1  mrg 
   3005  1.1  mrg 	  union_decl = build_decl (input_location,
   3006  1.1  mrg 				   VAR_DECL, get_identifier ("__result"),
   3007  1.1  mrg 				   TREE_TYPE (master_type));
   3008  1.1  mrg 	  DECL_ARTIFICIAL (union_decl) = 1;
   3009  1.1  mrg 	  DECL_EXTERNAL (union_decl) = 0;
   3010  1.1  mrg 	  TREE_PUBLIC (union_decl) = 0;
   3011  1.1  mrg 	  TREE_USED (union_decl) = 1;
   3012  1.1  mrg 	  layout_decl (union_decl, 0);
   3013  1.1  mrg 	  pushdecl (union_decl);
   3014  1.1  mrg 
   3015  1.1  mrg 	  DECL_CONTEXT (union_decl) = current_function_decl;
   3016  1.1  mrg 	  tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   3017  1.1  mrg 				 TREE_TYPE (union_decl), union_decl, tmp);
   3018  1.1  mrg 	  gfc_add_expr_to_block (&body, tmp);
   3019  1.1  mrg 
   3020  1.1  mrg 	  for (field = TYPE_FIELDS (TREE_TYPE (union_decl));
   3021  1.1  mrg 	       field; field = DECL_CHAIN (field))
   3022  1.1  mrg 	    if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
   3023  1.1  mrg 		thunk_sym->result->name) == 0)
   3024  1.1  mrg 	      break;
   3025  1.1  mrg 	  gcc_assert (field != NULL_TREE);
   3026  1.1  mrg 	  tmp = fold_build3_loc (input_location, COMPONENT_REF,
   3027  1.1  mrg 				 TREE_TYPE (field), union_decl, field,
   3028  1.1  mrg 				 NULL_TREE);
   3029  1.1  mrg 	  tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   3030  1.1  mrg 			     TREE_TYPE (DECL_RESULT (current_function_decl)),
   3031  1.1  mrg 			     DECL_RESULT (current_function_decl), tmp);
   3032  1.1  mrg 	  tmp = build1_v (RETURN_EXPR, tmp);
   3033  1.1  mrg 	}
   3034  1.1  mrg       else if (TREE_TYPE (DECL_RESULT (current_function_decl))
   3035  1.1  mrg 	       != void_type_node)
   3036  1.1  mrg 	{
   3037  1.1  mrg 	  tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   3038  1.1  mrg 			     TREE_TYPE (DECL_RESULT (current_function_decl)),
   3039  1.1  mrg 			     DECL_RESULT (current_function_decl), tmp);
   3040  1.1  mrg 	  tmp = build1_v (RETURN_EXPR, tmp);
   3041  1.1  mrg 	}
   3042  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   3043  1.1  mrg 
   3044  1.1  mrg       /* Finish off this function and send it for code generation.  */
   3045  1.1  mrg       DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
   3046  1.1  mrg       tmp = getdecls ();
   3047  1.1  mrg       poplevel (1, 1);
   3048  1.1  mrg       BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
   3049  1.1  mrg       DECL_SAVED_TREE (thunk_fndecl)
   3050  1.1  mrg 	= fold_build3_loc (DECL_SOURCE_LOCATION (thunk_fndecl), BIND_EXPR,
   3051  1.1  mrg 			   void_type_node, tmp, DECL_SAVED_TREE (thunk_fndecl),
   3052  1.1  mrg 			   DECL_INITIAL (thunk_fndecl));
   3053  1.1  mrg 
   3054  1.1  mrg       /* Output the GENERIC tree.  */
   3055  1.1  mrg       dump_function (TDI_original, thunk_fndecl);
   3056  1.1  mrg 
   3057  1.1  mrg       /* Store the end of the function, so that we get good line number
   3058  1.1  mrg 	 info for the epilogue.  */
   3059  1.1  mrg       cfun->function_end_locus = input_location;
   3060  1.1  mrg 
   3061  1.1  mrg       /* We're leaving the context of this function, so zap cfun.
   3062  1.1  mrg 	 It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
   3063  1.1  mrg 	 tree_rest_of_compilation.  */
   3064  1.1  mrg       set_cfun (NULL);
   3065  1.1  mrg 
   3066  1.1  mrg       current_function_decl = NULL_TREE;
   3067  1.1  mrg 
   3068  1.1  mrg       cgraph_node::finalize_function (thunk_fndecl, true);
   3069  1.1  mrg 
   3070  1.1  mrg       /* We share the symbols in the formal argument list with other entry
   3071  1.1  mrg 	 points and the master function.  Clear them so that they are
   3072  1.1  mrg 	 recreated for each function.  */
   3073  1.1  mrg       for (formal = gfc_sym_get_dummy_args (thunk_sym); formal;
   3074  1.1  mrg 	   formal = formal->next)
   3075  1.1  mrg 	if (formal->sym != NULL)  /* Ignore alternate returns.  */
   3076  1.1  mrg 	  {
   3077  1.1  mrg 	    formal->sym->backend_decl = NULL_TREE;
   3078  1.1  mrg 	    if (formal->sym->ts.type == BT_CHARACTER)
   3079  1.1  mrg 	      formal->sym->ts.u.cl->backend_decl = NULL_TREE;
   3080  1.1  mrg 	  }
   3081  1.1  mrg 
   3082  1.1  mrg       if (thunk_sym->attr.function)
   3083  1.1  mrg 	{
   3084  1.1  mrg 	  if (thunk_sym->ts.type == BT_CHARACTER)
   3085  1.1  mrg 	    thunk_sym->ts.u.cl->backend_decl = NULL_TREE;
   3086  1.1  mrg 	  if (thunk_sym->result->ts.type == BT_CHARACTER)
   3087  1.1  mrg 	    thunk_sym->result->ts.u.cl->backend_decl = NULL_TREE;
   3088  1.1  mrg 	}
   3089  1.1  mrg     }
   3090  1.1  mrg 
   3091  1.1  mrg   gfc_restore_backend_locus (&old_loc);
   3092  1.1  mrg }
   3093  1.1  mrg 
   3094  1.1  mrg 
   3095  1.1  mrg /* Create a decl for a function, and create any thunks for alternate entry
   3096  1.1  mrg    points. If global is true, generate the function in the global binding
   3097  1.1  mrg    level, otherwise in the current binding level (which can be global).  */
   3098  1.1  mrg 
   3099  1.1  mrg void
   3100  1.1  mrg gfc_create_function_decl (gfc_namespace * ns, bool global)
   3101  1.1  mrg {
   3102  1.1  mrg   /* Create a declaration for the master function.  */
   3103  1.1  mrg   build_function_decl (ns->proc_name, global);
   3104  1.1  mrg 
   3105  1.1  mrg   /* Compile the entry thunks.  */
   3106  1.1  mrg   if (ns->entries)
   3107  1.1  mrg     build_entry_thunks (ns, global);
   3108  1.1  mrg 
   3109  1.1  mrg   /* Now create the read argument list.  */
   3110  1.1  mrg   create_function_arglist (ns->proc_name);
   3111  1.1  mrg 
   3112  1.1  mrg   if (ns->omp_declare_simd)
   3113  1.1  mrg     gfc_trans_omp_declare_simd (ns);
   3114  1.1  mrg 
   3115  1.1  mrg   /* Handle 'declare variant' directives.  The applicable directives might
   3116  1.1  mrg      be declared in a parent namespace, so this needs to be called even if
   3117  1.1  mrg      there are no local directives.  */
   3118  1.1  mrg   if (flag_openmp)
   3119  1.1  mrg     gfc_trans_omp_declare_variant (ns);
   3120  1.1  mrg }
   3121  1.1  mrg 
   3122  1.1  mrg /* Return the decl used to hold the function return value.  If
   3123  1.1  mrg    parent_flag is set, the context is the parent_scope.  */
   3124  1.1  mrg 
   3125  1.1  mrg tree
   3126  1.1  mrg gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
   3127  1.1  mrg {
   3128  1.1  mrg   tree decl;
   3129  1.1  mrg   tree length;
   3130  1.1  mrg   tree this_fake_result_decl;
   3131  1.1  mrg   tree this_function_decl;
   3132  1.1  mrg 
   3133  1.1  mrg   char name[GFC_MAX_SYMBOL_LEN + 10];
   3134  1.1  mrg 
   3135  1.1  mrg   if (parent_flag)
   3136  1.1  mrg     {
   3137  1.1  mrg       this_fake_result_decl = parent_fake_result_decl;
   3138  1.1  mrg       this_function_decl = DECL_CONTEXT (current_function_decl);
   3139  1.1  mrg     }
   3140  1.1  mrg   else
   3141  1.1  mrg     {
   3142  1.1  mrg       this_fake_result_decl = current_fake_result_decl;
   3143  1.1  mrg       this_function_decl = current_function_decl;
   3144  1.1  mrg     }
   3145  1.1  mrg 
   3146  1.1  mrg   if (sym
   3147  1.1  mrg       && sym->ns->proc_name->backend_decl == this_function_decl
   3148  1.1  mrg       && sym->ns->proc_name->attr.entry_master
   3149  1.1  mrg       && sym != sym->ns->proc_name)
   3150  1.1  mrg     {
   3151  1.1  mrg       tree t = NULL, var;
   3152  1.1  mrg       if (this_fake_result_decl != NULL)
   3153  1.1  mrg 	for (t = TREE_CHAIN (this_fake_result_decl); t; t = TREE_CHAIN (t))
   3154  1.1  mrg 	  if (strcmp (IDENTIFIER_POINTER (TREE_PURPOSE (t)), sym->name) == 0)
   3155  1.1  mrg 	    break;
   3156  1.1  mrg       if (t)
   3157  1.1  mrg 	return TREE_VALUE (t);
   3158  1.1  mrg       decl = gfc_get_fake_result_decl (sym->ns->proc_name, parent_flag);
   3159  1.1  mrg 
   3160  1.1  mrg       if (parent_flag)
   3161  1.1  mrg 	this_fake_result_decl = parent_fake_result_decl;
   3162  1.1  mrg       else
   3163  1.1  mrg 	this_fake_result_decl = current_fake_result_decl;
   3164  1.1  mrg 
   3165  1.1  mrg       if (decl && sym->ns->proc_name->attr.mixed_entry_master)
   3166  1.1  mrg 	{
   3167  1.1  mrg 	  tree field;
   3168  1.1  mrg 
   3169  1.1  mrg 	  for (field = TYPE_FIELDS (TREE_TYPE (decl));
   3170  1.1  mrg 	       field; field = DECL_CHAIN (field))
   3171  1.1  mrg 	    if (strcmp (IDENTIFIER_POINTER (DECL_NAME (field)),
   3172  1.1  mrg 		sym->name) == 0)
   3173  1.1  mrg 	      break;
   3174  1.1  mrg 
   3175  1.1  mrg 	  gcc_assert (field != NULL_TREE);
   3176  1.1  mrg 	  decl = fold_build3_loc (input_location, COMPONENT_REF,
   3177  1.1  mrg 				  TREE_TYPE (field), decl, field, NULL_TREE);
   3178  1.1  mrg 	}
   3179  1.1  mrg 
   3180  1.1  mrg       var = create_tmp_var_raw (TREE_TYPE (decl), sym->name);
   3181  1.1  mrg       if (parent_flag)
   3182  1.1  mrg 	gfc_add_decl_to_parent_function (var);
   3183  1.1  mrg       else
   3184  1.1  mrg 	gfc_add_decl_to_function (var);
   3185  1.1  mrg 
   3186  1.1  mrg       SET_DECL_VALUE_EXPR (var, decl);
   3187  1.1  mrg       DECL_HAS_VALUE_EXPR_P (var) = 1;
   3188  1.1  mrg       GFC_DECL_RESULT (var) = 1;
   3189  1.1  mrg 
   3190  1.1  mrg       TREE_CHAIN (this_fake_result_decl)
   3191  1.1  mrg 	  = tree_cons (get_identifier (sym->name), var,
   3192  1.1  mrg 		       TREE_CHAIN (this_fake_result_decl));
   3193  1.1  mrg       return var;
   3194  1.1  mrg     }
   3195  1.1  mrg 
   3196  1.1  mrg   if (this_fake_result_decl != NULL_TREE)
   3197  1.1  mrg     return TREE_VALUE (this_fake_result_decl);
   3198  1.1  mrg 
   3199  1.1  mrg   /* Only when gfc_get_fake_result_decl is called by gfc_trans_return,
   3200  1.1  mrg      sym is NULL.  */
   3201  1.1  mrg   if (!sym)
   3202  1.1  mrg     return NULL_TREE;
   3203  1.1  mrg 
   3204  1.1  mrg   if (sym->ts.type == BT_CHARACTER)
   3205  1.1  mrg     {
   3206  1.1  mrg       if (sym->ts.u.cl->backend_decl == NULL_TREE)
   3207  1.1  mrg 	length = gfc_create_string_length (sym);
   3208  1.1  mrg       else
   3209  1.1  mrg 	length = sym->ts.u.cl->backend_decl;
   3210  1.1  mrg       if (VAR_P (length) && DECL_CONTEXT (length) == NULL_TREE)
   3211  1.1  mrg 	gfc_add_decl_to_function (length);
   3212  1.1  mrg     }
   3213  1.1  mrg 
   3214  1.1  mrg   if (gfc_return_by_reference (sym))
   3215  1.1  mrg     {
   3216  1.1  mrg       decl = DECL_ARGUMENTS (this_function_decl);
   3217  1.1  mrg 
   3218  1.1  mrg       if (sym->ns->proc_name->backend_decl == this_function_decl
   3219  1.1  mrg 	  && sym->ns->proc_name->attr.entry_master)
   3220  1.1  mrg 	decl = DECL_CHAIN (decl);
   3221  1.1  mrg 
   3222  1.1  mrg       TREE_USED (decl) = 1;
   3223  1.1  mrg       if (sym->as)
   3224  1.1  mrg 	decl = gfc_build_dummy_array_decl (sym, decl);
   3225  1.1  mrg     }
   3226  1.1  mrg   else
   3227  1.1  mrg     {
   3228  1.1  mrg       sprintf (name, "__result_%.20s",
   3229  1.1  mrg 	       IDENTIFIER_POINTER (DECL_NAME (this_function_decl)));
   3230  1.1  mrg 
   3231  1.1  mrg       if (!sym->attr.mixed_entry_master && sym->attr.function)
   3232  1.1  mrg 	decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
   3233  1.1  mrg 			   VAR_DECL, get_identifier (name),
   3234  1.1  mrg 			   gfc_sym_type (sym));
   3235  1.1  mrg       else
   3236  1.1  mrg 	decl = build_decl (DECL_SOURCE_LOCATION (this_function_decl),
   3237  1.1  mrg 			   VAR_DECL, get_identifier (name),
   3238  1.1  mrg 			   TREE_TYPE (TREE_TYPE (this_function_decl)));
   3239  1.1  mrg       DECL_ARTIFICIAL (decl) = 1;
   3240  1.1  mrg       DECL_EXTERNAL (decl) = 0;
   3241  1.1  mrg       TREE_PUBLIC (decl) = 0;
   3242  1.1  mrg       TREE_USED (decl) = 1;
   3243  1.1  mrg       GFC_DECL_RESULT (decl) = 1;
   3244  1.1  mrg       TREE_ADDRESSABLE (decl) = 1;
   3245  1.1  mrg 
   3246  1.1  mrg       layout_decl (decl, 0);
   3247  1.1  mrg       gfc_finish_decl_attrs (decl, &sym->attr);
   3248  1.1  mrg 
   3249  1.1  mrg       if (parent_flag)
   3250  1.1  mrg 	gfc_add_decl_to_parent_function (decl);
   3251  1.1  mrg       else
   3252  1.1  mrg 	gfc_add_decl_to_function (decl);
   3253  1.1  mrg     }
   3254  1.1  mrg 
   3255  1.1  mrg   if (parent_flag)
   3256  1.1  mrg     parent_fake_result_decl = build_tree_list (NULL, decl);
   3257  1.1  mrg   else
   3258  1.1  mrg     current_fake_result_decl = build_tree_list (NULL, decl);
   3259  1.1  mrg 
   3260  1.1  mrg   if (sym->attr.assign)
   3261  1.1  mrg     DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
   3262  1.1  mrg 
   3263  1.1  mrg   return decl;
   3264  1.1  mrg }
   3265  1.1  mrg 
   3266  1.1  mrg 
   3267  1.1  mrg /* Builds a function decl.  The remaining parameters are the types of the
   3268  1.1  mrg    function arguments.  Negative nargs indicates a varargs function.  */
   3269  1.1  mrg 
   3270  1.1  mrg static tree
   3271  1.1  mrg build_library_function_decl_1 (tree name, const char *spec,
   3272  1.1  mrg 			       tree rettype, int nargs, va_list p)
   3273  1.1  mrg {
   3274  1.1  mrg   vec<tree, va_gc> *arglist;
   3275  1.1  mrg   tree fntype;
   3276  1.1  mrg   tree fndecl;
   3277  1.1  mrg   int n;
   3278  1.1  mrg 
   3279  1.1  mrg   /* Library functions must be declared with global scope.  */
   3280  1.1  mrg   gcc_assert (current_function_decl == NULL_TREE);
   3281  1.1  mrg 
   3282  1.1  mrg   /* Create a list of the argument types.  */
   3283  1.1  mrg   vec_alloc (arglist, abs (nargs));
   3284  1.1  mrg   for (n = abs (nargs); n > 0; n--)
   3285  1.1  mrg     {
   3286  1.1  mrg       tree argtype = va_arg (p, tree);
   3287  1.1  mrg       arglist->quick_push (argtype);
   3288  1.1  mrg     }
   3289  1.1  mrg 
   3290  1.1  mrg   /* Build the function type and decl.  */
   3291  1.1  mrg   if (nargs >= 0)
   3292  1.1  mrg     fntype = build_function_type_vec (rettype, arglist);
   3293  1.1  mrg   else
   3294  1.1  mrg     fntype = build_varargs_function_type_vec (rettype, arglist);
   3295  1.1  mrg   if (spec)
   3296  1.1  mrg     {
   3297  1.1  mrg       tree attr_args = build_tree_list (NULL_TREE,
   3298  1.1  mrg 					build_string (strlen (spec), spec));
   3299  1.1  mrg       tree attrs = tree_cons (get_identifier ("fn spec"),
   3300  1.1  mrg 			      attr_args, TYPE_ATTRIBUTES (fntype));
   3301  1.1  mrg       fntype = build_type_attribute_variant (fntype, attrs);
   3302  1.1  mrg     }
   3303  1.1  mrg   fndecl = build_decl (input_location,
   3304  1.1  mrg 		       FUNCTION_DECL, name, fntype);
   3305  1.1  mrg 
   3306  1.1  mrg   /* Mark this decl as external.  */
   3307  1.1  mrg   DECL_EXTERNAL (fndecl) = 1;
   3308  1.1  mrg   TREE_PUBLIC (fndecl) = 1;
   3309  1.1  mrg 
   3310  1.1  mrg   pushdecl (fndecl);
   3311  1.1  mrg 
   3312  1.1  mrg   rest_of_decl_compilation (fndecl, 1, 0);
   3313  1.1  mrg 
   3314  1.1  mrg   return fndecl;
   3315  1.1  mrg }
   3316  1.1  mrg 
   3317  1.1  mrg /* Builds a function decl.  The remaining parameters are the types of the
   3318  1.1  mrg    function arguments.  Negative nargs indicates a varargs function.  */
   3319  1.1  mrg 
   3320  1.1  mrg tree
   3321  1.1  mrg gfc_build_library_function_decl (tree name, tree rettype, int nargs, ...)
   3322  1.1  mrg {
   3323  1.1  mrg   tree ret;
   3324  1.1  mrg   va_list args;
   3325  1.1  mrg   va_start (args, nargs);
   3326  1.1  mrg   ret = build_library_function_decl_1 (name, NULL, rettype, nargs, args);
   3327  1.1  mrg   va_end (args);
   3328  1.1  mrg   return ret;
   3329  1.1  mrg }
   3330  1.1  mrg 
   3331  1.1  mrg /* Builds a function decl.  The remaining parameters are the types of the
   3332  1.1  mrg    function arguments.  Negative nargs indicates a varargs function.
   3333  1.1  mrg    The SPEC parameter specifies the function argument and return type
   3334  1.1  mrg    specification according to the fnspec function type attribute.  */
   3335  1.1  mrg 
   3336  1.1  mrg tree
   3337  1.1  mrg gfc_build_library_function_decl_with_spec (tree name, const char *spec,
   3338  1.1  mrg 					   tree rettype, int nargs, ...)
   3339  1.1  mrg {
   3340  1.1  mrg   tree ret;
   3341  1.1  mrg   va_list args;
   3342  1.1  mrg   va_start (args, nargs);
   3343  1.1  mrg   if (flag_checking)
   3344  1.1  mrg     {
   3345  1.1  mrg       attr_fnspec fnspec (spec, strlen (spec));
   3346  1.1  mrg       fnspec.verify ();
   3347  1.1  mrg     }
   3348  1.1  mrg   ret = build_library_function_decl_1 (name, spec, rettype, nargs, args);
   3349  1.1  mrg   va_end (args);
   3350  1.1  mrg   return ret;
   3351  1.1  mrg }
   3352  1.1  mrg 
   3353  1.1  mrg static void
   3354  1.1  mrg gfc_build_intrinsic_function_decls (void)
   3355  1.1  mrg {
   3356  1.1  mrg   tree gfc_int4_type_node = gfc_get_int_type (4);
   3357  1.1  mrg   tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
   3358  1.1  mrg   tree gfc_int8_type_node = gfc_get_int_type (8);
   3359  1.1  mrg   tree gfc_pint8_type_node = build_pointer_type (gfc_int8_type_node);
   3360  1.1  mrg   tree gfc_int16_type_node = gfc_get_int_type (16);
   3361  1.1  mrg   tree gfc_logical4_type_node = gfc_get_logical_type (4);
   3362  1.1  mrg   tree pchar1_type_node = gfc_get_pchar_type (1);
   3363  1.1  mrg   tree pchar4_type_node = gfc_get_pchar_type (4);
   3364  1.1  mrg 
   3365  1.1  mrg   /* String functions.  */
   3366  1.1  mrg   gfor_fndecl_compare_string = gfc_build_library_function_decl_with_spec (
   3367  1.1  mrg 	get_identifier (PREFIX("compare_string")), ". . R . R ",
   3368  1.1  mrg 	integer_type_node, 4, gfc_charlen_type_node, pchar1_type_node,
   3369  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node);
   3370  1.1  mrg   DECL_PURE_P (gfor_fndecl_compare_string) = 1;
   3371  1.1  mrg   TREE_NOTHROW (gfor_fndecl_compare_string) = 1;
   3372  1.1  mrg 
   3373  1.1  mrg   gfor_fndecl_concat_string = gfc_build_library_function_decl_with_spec (
   3374  1.1  mrg 	get_identifier (PREFIX("concat_string")), ". . W . R . R ",
   3375  1.1  mrg 	void_type_node, 6, gfc_charlen_type_node, pchar1_type_node,
   3376  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node,
   3377  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node);
   3378  1.1  mrg   TREE_NOTHROW (gfor_fndecl_concat_string) = 1;
   3379  1.1  mrg 
   3380  1.1  mrg   gfor_fndecl_string_len_trim = gfc_build_library_function_decl_with_spec (
   3381  1.1  mrg 	get_identifier (PREFIX("string_len_trim")), ". . R ",
   3382  1.1  mrg 	gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar1_type_node);
   3383  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_len_trim) = 1;
   3384  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_len_trim) = 1;
   3385  1.1  mrg 
   3386  1.1  mrg   gfor_fndecl_string_index = gfc_build_library_function_decl_with_spec (
   3387  1.1  mrg 	get_identifier (PREFIX("string_index")), ". . R . R . ",
   3388  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
   3389  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
   3390  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_index) = 1;
   3391  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_index) = 1;
   3392  1.1  mrg 
   3393  1.1  mrg   gfor_fndecl_string_scan = gfc_build_library_function_decl_with_spec (
   3394  1.1  mrg 	get_identifier (PREFIX("string_scan")), ". . R . R . ",
   3395  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
   3396  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
   3397  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_scan) = 1;
   3398  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_scan) = 1;
   3399  1.1  mrg 
   3400  1.1  mrg   gfor_fndecl_string_verify = gfc_build_library_function_decl_with_spec (
   3401  1.1  mrg 	get_identifier (PREFIX("string_verify")), ". . R . R . ",
   3402  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar1_type_node,
   3403  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node, gfc_logical4_type_node);
   3404  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_verify) = 1;
   3405  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_verify) = 1;
   3406  1.1  mrg 
   3407  1.1  mrg   gfor_fndecl_string_trim = gfc_build_library_function_decl_with_spec (
   3408  1.1  mrg 	get_identifier (PREFIX("string_trim")), ". W w . R ",
   3409  1.1  mrg 	void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
   3410  1.1  mrg 	build_pointer_type (pchar1_type_node), gfc_charlen_type_node,
   3411  1.1  mrg 	pchar1_type_node);
   3412  1.1  mrg 
   3413  1.1  mrg   gfor_fndecl_string_minmax = gfc_build_library_function_decl_with_spec (
   3414  1.1  mrg 	get_identifier (PREFIX("string_minmax")), ". W w . R ",
   3415  1.1  mrg 	void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
   3416  1.1  mrg 	build_pointer_type (pchar1_type_node), integer_type_node,
   3417  1.1  mrg 	integer_type_node);
   3418  1.1  mrg 
   3419  1.1  mrg   gfor_fndecl_adjustl = gfc_build_library_function_decl_with_spec (
   3420  1.1  mrg 	get_identifier (PREFIX("adjustl")), ". W . R ",
   3421  1.1  mrg 	void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
   3422  1.1  mrg 	pchar1_type_node);
   3423  1.1  mrg   TREE_NOTHROW (gfor_fndecl_adjustl) = 1;
   3424  1.1  mrg 
   3425  1.1  mrg   gfor_fndecl_adjustr = gfc_build_library_function_decl_with_spec (
   3426  1.1  mrg 	get_identifier (PREFIX("adjustr")), ". W . R ",
   3427  1.1  mrg 	void_type_node, 3, pchar1_type_node, gfc_charlen_type_node,
   3428  1.1  mrg 	pchar1_type_node);
   3429  1.1  mrg   TREE_NOTHROW (gfor_fndecl_adjustr) = 1;
   3430  1.1  mrg 
   3431  1.1  mrg   gfor_fndecl_select_string =  gfc_build_library_function_decl_with_spec (
   3432  1.1  mrg 	get_identifier (PREFIX("select_string")), ". R . R . ",
   3433  1.1  mrg 	integer_type_node, 4, pvoid_type_node, integer_type_node,
   3434  1.1  mrg 	pchar1_type_node, gfc_charlen_type_node);
   3435  1.1  mrg   DECL_PURE_P (gfor_fndecl_select_string) = 1;
   3436  1.1  mrg   TREE_NOTHROW (gfor_fndecl_select_string) = 1;
   3437  1.1  mrg 
   3438  1.1  mrg   gfor_fndecl_compare_string_char4 = gfc_build_library_function_decl_with_spec (
   3439  1.1  mrg 	get_identifier (PREFIX("compare_string_char4")), ". . R . R ",
   3440  1.1  mrg 	integer_type_node, 4, gfc_charlen_type_node, pchar4_type_node,
   3441  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node);
   3442  1.1  mrg   DECL_PURE_P (gfor_fndecl_compare_string_char4) = 1;
   3443  1.1  mrg   TREE_NOTHROW (gfor_fndecl_compare_string_char4) = 1;
   3444  1.1  mrg 
   3445  1.1  mrg   gfor_fndecl_concat_string_char4 = gfc_build_library_function_decl_with_spec (
   3446  1.1  mrg 	get_identifier (PREFIX("concat_string_char4")), ". . W . R . R ",
   3447  1.1  mrg 	void_type_node, 6, gfc_charlen_type_node, pchar4_type_node,
   3448  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node, gfc_charlen_type_node,
   3449  1.1  mrg 	pchar4_type_node);
   3450  1.1  mrg   TREE_NOTHROW (gfor_fndecl_concat_string_char4) = 1;
   3451  1.1  mrg 
   3452  1.1  mrg   gfor_fndecl_string_len_trim_char4 = gfc_build_library_function_decl_with_spec (
   3453  1.1  mrg 	get_identifier (PREFIX("string_len_trim_char4")), ". . R ",
   3454  1.1  mrg 	gfc_charlen_type_node, 2, gfc_charlen_type_node, pchar4_type_node);
   3455  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_len_trim_char4) = 1;
   3456  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_len_trim_char4) = 1;
   3457  1.1  mrg 
   3458  1.1  mrg   gfor_fndecl_string_index_char4 = gfc_build_library_function_decl_with_spec (
   3459  1.1  mrg 	get_identifier (PREFIX("string_index_char4")), ". . R . R . ",
   3460  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
   3461  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
   3462  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_index_char4) = 1;
   3463  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_index_char4) = 1;
   3464  1.1  mrg 
   3465  1.1  mrg   gfor_fndecl_string_scan_char4 = gfc_build_library_function_decl_with_spec (
   3466  1.1  mrg 	get_identifier (PREFIX("string_scan_char4")), ". . R . R . ",
   3467  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
   3468  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
   3469  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_scan_char4) = 1;
   3470  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_scan_char4) = 1;
   3471  1.1  mrg 
   3472  1.1  mrg   gfor_fndecl_string_verify_char4 = gfc_build_library_function_decl_with_spec (
   3473  1.1  mrg 	get_identifier (PREFIX("string_verify_char4")), ". . R . R . ",
   3474  1.1  mrg 	gfc_charlen_type_node, 5, gfc_charlen_type_node, pchar4_type_node,
   3475  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node, gfc_logical4_type_node);
   3476  1.1  mrg   DECL_PURE_P (gfor_fndecl_string_verify_char4) = 1;
   3477  1.1  mrg   TREE_NOTHROW (gfor_fndecl_string_verify_char4) = 1;
   3478  1.1  mrg 
   3479  1.1  mrg   gfor_fndecl_string_trim_char4 = gfc_build_library_function_decl_with_spec (
   3480  1.1  mrg 	get_identifier (PREFIX("string_trim_char4")), ". W w . R ",
   3481  1.1  mrg 	void_type_node, 4, build_pointer_type (gfc_charlen_type_node),
   3482  1.1  mrg 	build_pointer_type (pchar4_type_node), gfc_charlen_type_node,
   3483  1.1  mrg 	pchar4_type_node);
   3484  1.1  mrg 
   3485  1.1  mrg   gfor_fndecl_string_minmax_char4 = gfc_build_library_function_decl_with_spec (
   3486  1.1  mrg 	get_identifier (PREFIX("string_minmax_char4")), ". W w . R ",
   3487  1.1  mrg 	void_type_node, -4, build_pointer_type (gfc_charlen_type_node),
   3488  1.1  mrg 	build_pointer_type (pchar4_type_node), integer_type_node,
   3489  1.1  mrg 	integer_type_node);
   3490  1.1  mrg 
   3491  1.1  mrg   gfor_fndecl_adjustl_char4 = gfc_build_library_function_decl_with_spec (
   3492  1.1  mrg 	get_identifier (PREFIX("adjustl_char4")), ". W . R ",
   3493  1.1  mrg 	void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
   3494  1.1  mrg 	pchar4_type_node);
   3495  1.1  mrg   TREE_NOTHROW (gfor_fndecl_adjustl_char4) = 1;
   3496  1.1  mrg 
   3497  1.1  mrg   gfor_fndecl_adjustr_char4 = gfc_build_library_function_decl_with_spec (
   3498  1.1  mrg 	get_identifier (PREFIX("adjustr_char4")), ". W . R ",
   3499  1.1  mrg 	void_type_node, 3, pchar4_type_node, gfc_charlen_type_node,
   3500  1.1  mrg 	pchar4_type_node);
   3501  1.1  mrg   TREE_NOTHROW (gfor_fndecl_adjustr_char4) = 1;
   3502  1.1  mrg 
   3503  1.1  mrg   gfor_fndecl_select_string_char4 = gfc_build_library_function_decl_with_spec (
   3504  1.1  mrg 	get_identifier (PREFIX("select_string_char4")), ". R . R . ",
   3505  1.1  mrg 	integer_type_node, 4, pvoid_type_node, integer_type_node,
   3506  1.1  mrg 	pvoid_type_node, gfc_charlen_type_node);
   3507  1.1  mrg   DECL_PURE_P (gfor_fndecl_select_string_char4) = 1;
   3508  1.1  mrg   TREE_NOTHROW (gfor_fndecl_select_string_char4) = 1;
   3509  1.1  mrg 
   3510  1.1  mrg 
   3511  1.1  mrg   /* Conversion between character kinds.  */
   3512  1.1  mrg 
   3513  1.1  mrg   gfor_fndecl_convert_char1_to_char4 = gfc_build_library_function_decl_with_spec (
   3514  1.1  mrg 	get_identifier (PREFIX("convert_char1_to_char4")), ". w . R ",
   3515  1.1  mrg 	void_type_node, 3, build_pointer_type (pchar4_type_node),
   3516  1.1  mrg 	gfc_charlen_type_node, pchar1_type_node);
   3517  1.1  mrg 
   3518  1.1  mrg   gfor_fndecl_convert_char4_to_char1 = gfc_build_library_function_decl_with_spec (
   3519  1.1  mrg 	get_identifier (PREFIX("convert_char4_to_char1")), ". w . R ",
   3520  1.1  mrg 	void_type_node, 3, build_pointer_type (pchar1_type_node),
   3521  1.1  mrg 	gfc_charlen_type_node, pchar4_type_node);
   3522  1.1  mrg 
   3523  1.1  mrg   /* Misc. functions.  */
   3524  1.1  mrg 
   3525  1.1  mrg   gfor_fndecl_ttynam = gfc_build_library_function_decl_with_spec (
   3526  1.1  mrg 	get_identifier (PREFIX("ttynam")), ". W . . ",
   3527  1.1  mrg 	void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
   3528  1.1  mrg 	integer_type_node);
   3529  1.1  mrg 
   3530  1.1  mrg   gfor_fndecl_fdate = gfc_build_library_function_decl_with_spec (
   3531  1.1  mrg 	get_identifier (PREFIX("fdate")), ". W . ",
   3532  1.1  mrg 	void_type_node, 2, pchar_type_node, gfc_charlen_type_node);
   3533  1.1  mrg 
   3534  1.1  mrg   gfor_fndecl_ctime = gfc_build_library_function_decl_with_spec (
   3535  1.1  mrg 	get_identifier (PREFIX("ctime")), ". W . . ",
   3536  1.1  mrg 	void_type_node, 3, pchar_type_node, gfc_charlen_type_node,
   3537  1.1  mrg 	gfc_int8_type_node);
   3538  1.1  mrg 
   3539  1.1  mrg   gfor_fndecl_random_init = gfc_build_library_function_decl (
   3540  1.1  mrg 	get_identifier (PREFIX("random_init")),
   3541  1.1  mrg 	void_type_node, 3, gfc_logical4_type_node, gfc_logical4_type_node,
   3542  1.1  mrg 	gfc_int4_type_node);
   3543  1.1  mrg 
   3544  1.1  mrg  // gfor_fndecl_caf_rand_init is defined in the lib-coarray section below.
   3545  1.1  mrg 
   3546  1.1  mrg   gfor_fndecl_sc_kind = gfc_build_library_function_decl_with_spec (
   3547  1.1  mrg 	get_identifier (PREFIX("selected_char_kind")), ". . R ",
   3548  1.1  mrg 	gfc_int4_type_node, 2, gfc_charlen_type_node, pchar_type_node);
   3549  1.1  mrg   DECL_PURE_P (gfor_fndecl_sc_kind) = 1;
   3550  1.1  mrg   TREE_NOTHROW (gfor_fndecl_sc_kind) = 1;
   3551  1.1  mrg 
   3552  1.1  mrg   gfor_fndecl_si_kind = gfc_build_library_function_decl_with_spec (
   3553  1.1  mrg 	get_identifier (PREFIX("selected_int_kind")), ". R ",
   3554  1.1  mrg 	gfc_int4_type_node, 1, pvoid_type_node);
   3555  1.1  mrg   DECL_PURE_P (gfor_fndecl_si_kind) = 1;
   3556  1.1  mrg   TREE_NOTHROW (gfor_fndecl_si_kind) = 1;
   3557  1.1  mrg 
   3558  1.1  mrg   gfor_fndecl_sr_kind = gfc_build_library_function_decl_with_spec (
   3559  1.1  mrg 	get_identifier (PREFIX("selected_real_kind2008")), ". R R ",
   3560  1.1  mrg 	gfc_int4_type_node, 3, pvoid_type_node, pvoid_type_node,
   3561  1.1  mrg 	pvoid_type_node);
   3562  1.1  mrg   DECL_PURE_P (gfor_fndecl_sr_kind) = 1;
   3563  1.1  mrg   TREE_NOTHROW (gfor_fndecl_sr_kind) = 1;
   3564  1.1  mrg 
   3565  1.1  mrg   gfor_fndecl_system_clock4 = gfc_build_library_function_decl (
   3566  1.1  mrg 	get_identifier (PREFIX("system_clock_4")),
   3567  1.1  mrg 	void_type_node, 3, gfc_pint4_type_node, gfc_pint4_type_node,
   3568  1.1  mrg 	gfc_pint4_type_node);
   3569  1.1  mrg 
   3570  1.1  mrg   gfor_fndecl_system_clock8 = gfc_build_library_function_decl (
   3571  1.1  mrg 	get_identifier (PREFIX("system_clock_8")),
   3572  1.1  mrg 	void_type_node, 3, gfc_pint8_type_node, gfc_pint8_type_node,
   3573  1.1  mrg 	gfc_pint8_type_node);
   3574  1.1  mrg 
   3575  1.1  mrg   /* Power functions.  */
   3576  1.1  mrg   {
   3577  1.1  mrg     tree ctype, rtype, itype, jtype;
   3578  1.1  mrg     int rkind, ikind, jkind;
   3579  1.1  mrg #define NIKINDS 3
   3580  1.1  mrg #define NRKINDS 4
   3581  1.1  mrg     static int ikinds[NIKINDS] = {4, 8, 16};
   3582  1.1  mrg     static int rkinds[NRKINDS] = {4, 8, 10, 16};
   3583  1.1  mrg     char name[PREFIX_LEN + 12]; /* _gfortran_pow_?n_?n */
   3584  1.1  mrg 
   3585  1.1  mrg     for (ikind=0; ikind < NIKINDS; ikind++)
   3586  1.1  mrg       {
   3587  1.1  mrg 	itype = gfc_get_int_type (ikinds[ikind]);
   3588  1.1  mrg 
   3589  1.1  mrg 	for (jkind=0; jkind < NIKINDS; jkind++)
   3590  1.1  mrg 	  {
   3591  1.1  mrg 	    jtype = gfc_get_int_type (ikinds[jkind]);
   3592  1.1  mrg 	    if (itype && jtype)
   3593  1.1  mrg 	      {
   3594  1.1  mrg 		sprintf (name, PREFIX("pow_i%d_i%d"), ikinds[ikind],
   3595  1.1  mrg 			ikinds[jkind]);
   3596  1.1  mrg 		gfor_fndecl_math_powi[jkind][ikind].integer =
   3597  1.1  mrg 		  gfc_build_library_function_decl (get_identifier (name),
   3598  1.1  mrg 		    jtype, 2, jtype, itype);
   3599  1.1  mrg 		TREE_READONLY (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
   3600  1.1  mrg 		TREE_NOTHROW (gfor_fndecl_math_powi[jkind][ikind].integer) = 1;
   3601  1.1  mrg 	      }
   3602  1.1  mrg 	  }
   3603  1.1  mrg 
   3604  1.1  mrg 	for (rkind = 0; rkind < NRKINDS; rkind ++)
   3605  1.1  mrg 	  {
   3606  1.1  mrg 	    rtype = gfc_get_real_type (rkinds[rkind]);
   3607  1.1  mrg 	    if (rtype && itype)
   3608  1.1  mrg 	      {
   3609  1.1  mrg 		sprintf (name, PREFIX("pow_r%d_i%d"),
   3610  1.1  mrg 			 gfc_type_abi_kind (BT_REAL, rkinds[rkind]),
   3611  1.1  mrg 			 ikinds[ikind]);
   3612  1.1  mrg 		gfor_fndecl_math_powi[rkind][ikind].real =
   3613  1.1  mrg 		  gfc_build_library_function_decl (get_identifier (name),
   3614  1.1  mrg 		    rtype, 2, rtype, itype);
   3615  1.1  mrg 		TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
   3616  1.1  mrg 		TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].real) = 1;
   3617  1.1  mrg 	      }
   3618  1.1  mrg 
   3619  1.1  mrg 	    ctype = gfc_get_complex_type (rkinds[rkind]);
   3620  1.1  mrg 	    if (ctype && itype)
   3621  1.1  mrg 	      {
   3622  1.1  mrg 		sprintf (name, PREFIX("pow_c%d_i%d"),
   3623  1.1  mrg 			 gfc_type_abi_kind (BT_REAL, rkinds[rkind]),
   3624  1.1  mrg 			 ikinds[ikind]);
   3625  1.1  mrg 		gfor_fndecl_math_powi[rkind][ikind].cmplx =
   3626  1.1  mrg 		  gfc_build_library_function_decl (get_identifier (name),
   3627  1.1  mrg 		    ctype, 2,ctype, itype);
   3628  1.1  mrg 		TREE_READONLY (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
   3629  1.1  mrg 		TREE_NOTHROW (gfor_fndecl_math_powi[rkind][ikind].cmplx) = 1;
   3630  1.1  mrg 	      }
   3631  1.1  mrg 	  }
   3632  1.1  mrg       }
   3633  1.1  mrg #undef NIKINDS
   3634  1.1  mrg #undef NRKINDS
   3635  1.1  mrg   }
   3636  1.1  mrg 
   3637  1.1  mrg   gfor_fndecl_math_ishftc4 = gfc_build_library_function_decl (
   3638  1.1  mrg 	get_identifier (PREFIX("ishftc4")),
   3639  1.1  mrg 	gfc_int4_type_node, 3, gfc_int4_type_node, gfc_int4_type_node,
   3640  1.1  mrg 	gfc_int4_type_node);
   3641  1.1  mrg   TREE_READONLY (gfor_fndecl_math_ishftc4) = 1;
   3642  1.1  mrg   TREE_NOTHROW (gfor_fndecl_math_ishftc4) = 1;
   3643  1.1  mrg 
   3644  1.1  mrg   gfor_fndecl_math_ishftc8 = gfc_build_library_function_decl (
   3645  1.1  mrg 	get_identifier (PREFIX("ishftc8")),
   3646  1.1  mrg 	gfc_int8_type_node, 3, gfc_int8_type_node, gfc_int4_type_node,
   3647  1.1  mrg 	gfc_int4_type_node);
   3648  1.1  mrg   TREE_READONLY (gfor_fndecl_math_ishftc8) = 1;
   3649  1.1  mrg   TREE_NOTHROW (gfor_fndecl_math_ishftc8) = 1;
   3650  1.1  mrg 
   3651  1.1  mrg   if (gfc_int16_type_node)
   3652  1.1  mrg     {
   3653  1.1  mrg       gfor_fndecl_math_ishftc16 = gfc_build_library_function_decl (
   3654  1.1  mrg 	get_identifier (PREFIX("ishftc16")),
   3655  1.1  mrg 	gfc_int16_type_node, 3, gfc_int16_type_node, gfc_int4_type_node,
   3656  1.1  mrg 	gfc_int4_type_node);
   3657  1.1  mrg       TREE_READONLY (gfor_fndecl_math_ishftc16) = 1;
   3658  1.1  mrg       TREE_NOTHROW (gfor_fndecl_math_ishftc16) = 1;
   3659  1.1  mrg     }
   3660  1.1  mrg 
   3661  1.1  mrg   /* BLAS functions.  */
   3662  1.1  mrg   {
   3663  1.1  mrg     tree pint = build_pointer_type (integer_type_node);
   3664  1.1  mrg     tree ps = build_pointer_type (gfc_get_real_type (gfc_default_real_kind));
   3665  1.1  mrg     tree pd = build_pointer_type (gfc_get_real_type (gfc_default_double_kind));
   3666  1.1  mrg     tree pc = build_pointer_type (gfc_get_complex_type (gfc_default_real_kind));
   3667  1.1  mrg     tree pz = build_pointer_type
   3668  1.1  mrg 		(gfc_get_complex_type (gfc_default_double_kind));
   3669  1.1  mrg 
   3670  1.1  mrg     gfor_fndecl_sgemm = gfc_build_library_function_decl
   3671  1.1  mrg 			  (get_identifier
   3672  1.1  mrg 			     (flag_underscoring ? "sgemm_" : "sgemm"),
   3673  1.1  mrg 			   void_type_node, 15, pchar_type_node,
   3674  1.1  mrg 			   pchar_type_node, pint, pint, pint, ps, ps, pint,
   3675  1.1  mrg 			   ps, pint, ps, ps, pint, integer_type_node,
   3676  1.1  mrg 			   integer_type_node);
   3677  1.1  mrg     gfor_fndecl_dgemm = gfc_build_library_function_decl
   3678  1.1  mrg 			  (get_identifier
   3679  1.1  mrg 			     (flag_underscoring ? "dgemm_" : "dgemm"),
   3680  1.1  mrg 			   void_type_node, 15, pchar_type_node,
   3681  1.1  mrg 			   pchar_type_node, pint, pint, pint, pd, pd, pint,
   3682  1.1  mrg 			   pd, pint, pd, pd, pint, integer_type_node,
   3683  1.1  mrg 			   integer_type_node);
   3684  1.1  mrg     gfor_fndecl_cgemm = gfc_build_library_function_decl
   3685  1.1  mrg 			  (get_identifier
   3686  1.1  mrg 			     (flag_underscoring ? "cgemm_" : "cgemm"),
   3687  1.1  mrg 			   void_type_node, 15, pchar_type_node,
   3688  1.1  mrg 			   pchar_type_node, pint, pint, pint, pc, pc, pint,
   3689  1.1  mrg 			   pc, pint, pc, pc, pint, integer_type_node,
   3690  1.1  mrg 			   integer_type_node);
   3691  1.1  mrg     gfor_fndecl_zgemm = gfc_build_library_function_decl
   3692  1.1  mrg 			  (get_identifier
   3693  1.1  mrg 			     (flag_underscoring ? "zgemm_" : "zgemm"),
   3694  1.1  mrg 			   void_type_node, 15, pchar_type_node,
   3695  1.1  mrg 			   pchar_type_node, pint, pint, pint, pz, pz, pint,
   3696  1.1  mrg 			   pz, pint, pz, pz, pint, integer_type_node,
   3697  1.1  mrg 			   integer_type_node);
   3698  1.1  mrg   }
   3699  1.1  mrg 
   3700  1.1  mrg   /* Other functions.  */
   3701  1.1  mrg   gfor_fndecl_iargc = gfc_build_library_function_decl (
   3702  1.1  mrg 	get_identifier (PREFIX ("iargc")), gfc_int4_type_node, 0);
   3703  1.1  mrg   TREE_NOTHROW (gfor_fndecl_iargc) = 1;
   3704  1.1  mrg 
   3705  1.1  mrg   gfor_fndecl_kill_sub = gfc_build_library_function_decl (
   3706  1.1  mrg 	get_identifier (PREFIX ("kill_sub")), void_type_node,
   3707  1.1  mrg 	3, gfc_int4_type_node, gfc_int4_type_node, gfc_pint4_type_node);
   3708  1.1  mrg 
   3709  1.1  mrg   gfor_fndecl_kill = gfc_build_library_function_decl (
   3710  1.1  mrg 	get_identifier (PREFIX ("kill")), gfc_int4_type_node,
   3711  1.1  mrg 	2, gfc_int4_type_node, gfc_int4_type_node);
   3712  1.1  mrg 
   3713  1.1  mrg   gfor_fndecl_is_contiguous0 = gfc_build_library_function_decl_with_spec (
   3714  1.1  mrg 	get_identifier (PREFIX("is_contiguous0")), ". R ",
   3715  1.1  mrg 	gfc_int4_type_node, 1, pvoid_type_node);
   3716  1.1  mrg   DECL_PURE_P (gfor_fndecl_is_contiguous0) = 1;
   3717  1.1  mrg   TREE_NOTHROW (gfor_fndecl_is_contiguous0) = 1;
   3718  1.1  mrg }
   3719  1.1  mrg 
   3720  1.1  mrg 
   3721  1.1  mrg /* Make prototypes for runtime library functions.  */
   3722  1.1  mrg 
   3723  1.1  mrg void
   3724  1.1  mrg gfc_build_builtin_function_decls (void)
   3725  1.1  mrg {
   3726  1.1  mrg   tree gfc_int8_type_node = gfc_get_int_type (8);
   3727  1.1  mrg 
   3728  1.1  mrg   gfor_fndecl_stop_numeric = gfc_build_library_function_decl (
   3729  1.1  mrg 	get_identifier (PREFIX("stop_numeric")),
   3730  1.1  mrg 	void_type_node, 2, integer_type_node, boolean_type_node);
   3731  1.1  mrg   /* STOP doesn't return.  */
   3732  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
   3733  1.1  mrg 
   3734  1.1  mrg   gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
   3735  1.1  mrg 	get_identifier (PREFIX("stop_string")), ". R . . ",
   3736  1.1  mrg 	void_type_node, 3, pchar_type_node, size_type_node,
   3737  1.1  mrg 	boolean_type_node);
   3738  1.1  mrg   /* STOP doesn't return.  */
   3739  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_stop_string) = 1;
   3740  1.1  mrg 
   3741  1.1  mrg   gfor_fndecl_error_stop_numeric = gfc_build_library_function_decl (
   3742  1.1  mrg         get_identifier (PREFIX("error_stop_numeric")),
   3743  1.1  mrg         void_type_node, 2, integer_type_node, boolean_type_node);
   3744  1.1  mrg   /* ERROR STOP doesn't return.  */
   3745  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_error_stop_numeric) = 1;
   3746  1.1  mrg 
   3747  1.1  mrg   gfor_fndecl_error_stop_string = gfc_build_library_function_decl_with_spec (
   3748  1.1  mrg 	get_identifier (PREFIX("error_stop_string")), ". R . . ",
   3749  1.1  mrg 	void_type_node, 3, pchar_type_node, size_type_node,
   3750  1.1  mrg 	boolean_type_node);
   3751  1.1  mrg   /* ERROR STOP doesn't return.  */
   3752  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_error_stop_string) = 1;
   3753  1.1  mrg 
   3754  1.1  mrg   gfor_fndecl_pause_numeric = gfc_build_library_function_decl (
   3755  1.1  mrg 	get_identifier (PREFIX("pause_numeric")),
   3756  1.1  mrg 	void_type_node, 1, gfc_int8_type_node);
   3757  1.1  mrg 
   3758  1.1  mrg   gfor_fndecl_pause_string = gfc_build_library_function_decl_with_spec (
   3759  1.1  mrg 	get_identifier (PREFIX("pause_string")), ". R . ",
   3760  1.1  mrg 	void_type_node, 2, pchar_type_node, size_type_node);
   3761  1.1  mrg 
   3762  1.1  mrg   gfor_fndecl_runtime_error = gfc_build_library_function_decl_with_spec (
   3763  1.1  mrg 	get_identifier (PREFIX("runtime_error")), ". R ",
   3764  1.1  mrg 	void_type_node, -1, pchar_type_node);
   3765  1.1  mrg   /* The runtime_error function does not return.  */
   3766  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_runtime_error) = 1;
   3767  1.1  mrg 
   3768  1.1  mrg   gfor_fndecl_runtime_error_at = gfc_build_library_function_decl_with_spec (
   3769  1.1  mrg 	get_identifier (PREFIX("runtime_error_at")), ". R R ",
   3770  1.1  mrg 	void_type_node, -2, pchar_type_node, pchar_type_node);
   3771  1.1  mrg   /* The runtime_error_at function does not return.  */
   3772  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_runtime_error_at) = 1;
   3773  1.1  mrg 
   3774  1.1  mrg   gfor_fndecl_runtime_warning_at = gfc_build_library_function_decl_with_spec (
   3775  1.1  mrg 	get_identifier (PREFIX("runtime_warning_at")), ". R R ",
   3776  1.1  mrg 	void_type_node, -2, pchar_type_node, pchar_type_node);
   3777  1.1  mrg 
   3778  1.1  mrg   gfor_fndecl_generate_error = gfc_build_library_function_decl_with_spec (
   3779  1.1  mrg 	get_identifier (PREFIX("generate_error")), ". R . R ",
   3780  1.1  mrg 	void_type_node, 3, pvoid_type_node, integer_type_node,
   3781  1.1  mrg 	pchar_type_node);
   3782  1.1  mrg 
   3783  1.1  mrg   gfor_fndecl_os_error_at = gfc_build_library_function_decl_with_spec (
   3784  1.1  mrg 	get_identifier (PREFIX("os_error_at")), ". R R ",
   3785  1.1  mrg 	void_type_node, -2, pchar_type_node, pchar_type_node);
   3786  1.1  mrg   /* The os_error_at function does not return.  */
   3787  1.1  mrg   TREE_THIS_VOLATILE (gfor_fndecl_os_error_at) = 1;
   3788  1.1  mrg 
   3789  1.1  mrg   gfor_fndecl_set_args = gfc_build_library_function_decl (
   3790  1.1  mrg 	get_identifier (PREFIX("set_args")),
   3791  1.1  mrg 	void_type_node, 2, integer_type_node,
   3792  1.1  mrg 	build_pointer_type (pchar_type_node));
   3793  1.1  mrg 
   3794  1.1  mrg   gfor_fndecl_set_fpe = gfc_build_library_function_decl (
   3795  1.1  mrg 	get_identifier (PREFIX("set_fpe")),
   3796  1.1  mrg 	void_type_node, 1, integer_type_node);
   3797  1.1  mrg 
   3798  1.1  mrg   gfor_fndecl_ieee_procedure_entry = gfc_build_library_function_decl (
   3799  1.1  mrg 	get_identifier (PREFIX("ieee_procedure_entry")),
   3800  1.1  mrg 	void_type_node, 1, pvoid_type_node);
   3801  1.1  mrg 
   3802  1.1  mrg   gfor_fndecl_ieee_procedure_exit = gfc_build_library_function_decl (
   3803  1.1  mrg 	get_identifier (PREFIX("ieee_procedure_exit")),
   3804  1.1  mrg 	void_type_node, 1, pvoid_type_node);
   3805  1.1  mrg 
   3806  1.1  mrg   /* Keep the array dimension in sync with the call, later in this file.  */
   3807  1.1  mrg   gfor_fndecl_set_options = gfc_build_library_function_decl_with_spec (
   3808  1.1  mrg 	get_identifier (PREFIX("set_options")), ". . R ",
   3809  1.1  mrg 	void_type_node, 2, integer_type_node,
   3810  1.1  mrg 	build_pointer_type (integer_type_node));
   3811  1.1  mrg 
   3812  1.1  mrg   gfor_fndecl_set_convert = gfc_build_library_function_decl (
   3813  1.1  mrg 	get_identifier (PREFIX("set_convert")),
   3814  1.1  mrg 	void_type_node, 1, integer_type_node);
   3815  1.1  mrg 
   3816  1.1  mrg   gfor_fndecl_set_record_marker = gfc_build_library_function_decl (
   3817  1.1  mrg 	get_identifier (PREFIX("set_record_marker")),
   3818  1.1  mrg 	void_type_node, 1, integer_type_node);
   3819  1.1  mrg 
   3820  1.1  mrg   gfor_fndecl_set_max_subrecord_length = gfc_build_library_function_decl (
   3821  1.1  mrg 	get_identifier (PREFIX("set_max_subrecord_length")),
   3822  1.1  mrg 	void_type_node, 1, integer_type_node);
   3823  1.1  mrg 
   3824  1.1  mrg   gfor_fndecl_in_pack = gfc_build_library_function_decl_with_spec (
   3825  1.1  mrg 	get_identifier (PREFIX("internal_pack")), ". r ",
   3826  1.1  mrg 	pvoid_type_node, 1, pvoid_type_node);
   3827  1.1  mrg 
   3828  1.1  mrg   gfor_fndecl_in_unpack = gfc_build_library_function_decl_with_spec (
   3829  1.1  mrg 	get_identifier (PREFIX("internal_unpack")), ". w R ",
   3830  1.1  mrg 	void_type_node, 2, pvoid_type_node, pvoid_type_node);
   3831  1.1  mrg 
   3832  1.1  mrg   gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
   3833  1.1  mrg 	get_identifier (PREFIX("associated")), ". R R ",
   3834  1.1  mrg 	integer_type_node, 2, ppvoid_type_node, ppvoid_type_node);
   3835  1.1  mrg   DECL_PURE_P (gfor_fndecl_associated) = 1;
   3836  1.1  mrg   TREE_NOTHROW (gfor_fndecl_associated) = 1;
   3837  1.1  mrg 
   3838  1.1  mrg   /* Coarray library calls.  */
   3839  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB)
   3840  1.1  mrg     {
   3841  1.1  mrg       tree pint_type, pppchar_type;
   3842  1.1  mrg 
   3843  1.1  mrg       pint_type = build_pointer_type (integer_type_node);
   3844  1.1  mrg       pppchar_type
   3845  1.1  mrg 	= build_pointer_type (build_pointer_type (pchar_type_node));
   3846  1.1  mrg 
   3847  1.1  mrg       gfor_fndecl_caf_init = gfc_build_library_function_decl_with_spec (
   3848  1.1  mrg 	get_identifier (PREFIX("caf_init")), ". W W ",
   3849  1.1  mrg 	void_type_node, 2, pint_type, pppchar_type);
   3850  1.1  mrg 
   3851  1.1  mrg       gfor_fndecl_caf_finalize = gfc_build_library_function_decl (
   3852  1.1  mrg 	get_identifier (PREFIX("caf_finalize")), void_type_node, 0);
   3853  1.1  mrg 
   3854  1.1  mrg       gfor_fndecl_caf_this_image = gfc_build_library_function_decl (
   3855  1.1  mrg 	get_identifier (PREFIX("caf_this_image")), integer_type_node,
   3856  1.1  mrg 	1, integer_type_node);
   3857  1.1  mrg 
   3858  1.1  mrg       gfor_fndecl_caf_num_images = gfc_build_library_function_decl (
   3859  1.1  mrg 	get_identifier (PREFIX("caf_num_images")), integer_type_node,
   3860  1.1  mrg 	2, integer_type_node, integer_type_node);
   3861  1.1  mrg 
   3862  1.1  mrg       gfor_fndecl_caf_register = gfc_build_library_function_decl_with_spec (
   3863  1.1  mrg 	get_identifier (PREFIX("caf_register")), ". . . W w w w . ",
   3864  1.1  mrg 	void_type_node, 7,
   3865  1.1  mrg 	size_type_node, integer_type_node, ppvoid_type_node, pvoid_type_node,
   3866  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   3867  1.1  mrg 
   3868  1.1  mrg       gfor_fndecl_caf_deregister = gfc_build_library_function_decl_with_spec (
   3869  1.1  mrg 	get_identifier (PREFIX("caf_deregister")), ". W . w w . ",
   3870  1.1  mrg 	void_type_node, 5,
   3871  1.1  mrg 	ppvoid_type_node, integer_type_node, pint_type, pchar_type_node,
   3872  1.1  mrg 	size_type_node);
   3873  1.1  mrg 
   3874  1.1  mrg       gfor_fndecl_caf_get = gfc_build_library_function_decl_with_spec (
   3875  1.1  mrg 	get_identifier (PREFIX("caf_get")), ". r . . r r w . . . w ",
   3876  1.1  mrg 	void_type_node, 10,
   3877  1.1  mrg 	pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
   3878  1.1  mrg 	pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node,
   3879  1.1  mrg 	boolean_type_node, pint_type);
   3880  1.1  mrg 
   3881  1.1  mrg       gfor_fndecl_caf_send = gfc_build_library_function_decl_with_spec (
   3882  1.1  mrg 	get_identifier (PREFIX("caf_send")), ". r . . w r r . . . w ",
   3883  1.1  mrg 	void_type_node, 11,
   3884  1.1  mrg 	pvoid_type_node, size_type_node, integer_type_node, pvoid_type_node,
   3885  1.1  mrg 	pvoid_type_node, pvoid_type_node, integer_type_node, integer_type_node,
   3886  1.1  mrg 	boolean_type_node, pint_type, pvoid_type_node);
   3887  1.1  mrg 
   3888  1.1  mrg       gfor_fndecl_caf_sendget = gfc_build_library_function_decl_with_spec (
   3889  1.1  mrg 	get_identifier (PREFIX("caf_sendget")), ". r . . w r r . . r r . . . w ",
   3890  1.1  mrg 	void_type_node,	14, pvoid_type_node, size_type_node, integer_type_node,
   3891  1.1  mrg 	pvoid_type_node, pvoid_type_node, pvoid_type_node, size_type_node,
   3892  1.1  mrg 	integer_type_node, pvoid_type_node, pvoid_type_node, integer_type_node,
   3893  1.1  mrg 	integer_type_node, boolean_type_node, integer_type_node);
   3894  1.1  mrg 
   3895  1.1  mrg       gfor_fndecl_caf_get_by_ref = gfc_build_library_function_decl_with_spec (
   3896  1.1  mrg 	get_identifier (PREFIX("caf_get_by_ref")), ". r . w r . . . . w . ",
   3897  1.1  mrg 	void_type_node,
   3898  1.1  mrg 	10, pvoid_type_node, integer_type_node, pvoid_type_node,
   3899  1.1  mrg 	pvoid_type_node, integer_type_node, integer_type_node,
   3900  1.1  mrg 	boolean_type_node, boolean_type_node, pint_type, integer_type_node);
   3901  1.1  mrg 
   3902  1.1  mrg       gfor_fndecl_caf_send_by_ref = gfc_build_library_function_decl_with_spec (
   3903  1.1  mrg 	get_identifier (PREFIX("caf_send_by_ref")), ". r . r r . . . . w . ",
   3904  1.1  mrg 	void_type_node,	10, pvoid_type_node, integer_type_node, pvoid_type_node,
   3905  1.1  mrg 	pvoid_type_node, integer_type_node, integer_type_node,
   3906  1.1  mrg 	boolean_type_node, boolean_type_node, pint_type, integer_type_node);
   3907  1.1  mrg 
   3908  1.1  mrg       gfor_fndecl_caf_sendget_by_ref
   3909  1.1  mrg 	  = gfc_build_library_function_decl_with_spec (
   3910  1.1  mrg 	    get_identifier (PREFIX("caf_sendget_by_ref")),
   3911  1.1  mrg 	    ". r . r r . r . . . w w . . ",
   3912  1.1  mrg 	    void_type_node, 13, pvoid_type_node, integer_type_node,
   3913  1.1  mrg 	    pvoid_type_node, pvoid_type_node, integer_type_node,
   3914  1.1  mrg 	    pvoid_type_node, integer_type_node, integer_type_node,
   3915  1.1  mrg 	    boolean_type_node, pint_type, pint_type, integer_type_node,
   3916  1.1  mrg 	    integer_type_node);
   3917  1.1  mrg 
   3918  1.1  mrg       gfor_fndecl_caf_sync_all = gfc_build_library_function_decl_with_spec (
   3919  1.1  mrg 	get_identifier (PREFIX("caf_sync_all")), ". w w . ", void_type_node,
   3920  1.1  mrg 	3, pint_type, pchar_type_node, size_type_node);
   3921  1.1  mrg 
   3922  1.1  mrg       gfor_fndecl_caf_sync_memory = gfc_build_library_function_decl_with_spec (
   3923  1.1  mrg 	get_identifier (PREFIX("caf_sync_memory")), ". w w . ", void_type_node,
   3924  1.1  mrg 	3, pint_type, pchar_type_node, size_type_node);
   3925  1.1  mrg 
   3926  1.1  mrg       gfor_fndecl_caf_sync_images = gfc_build_library_function_decl_with_spec (
   3927  1.1  mrg 	get_identifier (PREFIX("caf_sync_images")), ". . r w w . ", void_type_node,
   3928  1.1  mrg 	5, integer_type_node, pint_type, pint_type,
   3929  1.1  mrg 	pchar_type_node, size_type_node);
   3930  1.1  mrg 
   3931  1.1  mrg       gfor_fndecl_caf_error_stop = gfc_build_library_function_decl (
   3932  1.1  mrg 	get_identifier (PREFIX("caf_error_stop")),
   3933  1.1  mrg 	void_type_node, 1, integer_type_node);
   3934  1.1  mrg       /* CAF's ERROR STOP doesn't return.  */
   3935  1.1  mrg       TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop) = 1;
   3936  1.1  mrg 
   3937  1.1  mrg       gfor_fndecl_caf_error_stop_str = gfc_build_library_function_decl_with_spec (
   3938  1.1  mrg 	get_identifier (PREFIX("caf_error_stop_str")), ". r . ",
   3939  1.1  mrg 	void_type_node, 2, pchar_type_node, size_type_node);
   3940  1.1  mrg       /* CAF's ERROR STOP doesn't return.  */
   3941  1.1  mrg       TREE_THIS_VOLATILE (gfor_fndecl_caf_error_stop_str) = 1;
   3942  1.1  mrg 
   3943  1.1  mrg       gfor_fndecl_caf_stop_numeric = gfc_build_library_function_decl (
   3944  1.1  mrg 	get_identifier (PREFIX("caf_stop_numeric")),
   3945  1.1  mrg 	void_type_node, 1, integer_type_node);
   3946  1.1  mrg       /* CAF's STOP doesn't return.  */
   3947  1.1  mrg       TREE_THIS_VOLATILE (gfor_fndecl_caf_stop_numeric) = 1;
   3948  1.1  mrg 
   3949  1.1  mrg       gfor_fndecl_caf_stop_str = gfc_build_library_function_decl_with_spec (
   3950  1.1  mrg 	get_identifier (PREFIX("caf_stop_str")), ". r . ",
   3951  1.1  mrg 	void_type_node, 2, pchar_type_node, size_type_node);
   3952  1.1  mrg       /* CAF's STOP doesn't return.  */
   3953  1.1  mrg       TREE_THIS_VOLATILE (gfor_fndecl_caf_stop_str) = 1;
   3954  1.1  mrg 
   3955  1.1  mrg       gfor_fndecl_caf_atomic_def = gfc_build_library_function_decl_with_spec (
   3956  1.1  mrg 	get_identifier (PREFIX("caf_atomic_define")), ". r . . w w . . ",
   3957  1.1  mrg 	void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node,
   3958  1.1  mrg 	pvoid_type_node, pint_type, integer_type_node, integer_type_node);
   3959  1.1  mrg 
   3960  1.1  mrg       gfor_fndecl_caf_atomic_ref = gfc_build_library_function_decl_with_spec (
   3961  1.1  mrg 	get_identifier (PREFIX("caf_atomic_ref")), ". r . . w w . . ",
   3962  1.1  mrg 	void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node,
   3963  1.1  mrg 	pvoid_type_node, pint_type, integer_type_node, integer_type_node);
   3964  1.1  mrg 
   3965  1.1  mrg       gfor_fndecl_caf_atomic_cas = gfc_build_library_function_decl_with_spec (
   3966  1.1  mrg 	get_identifier (PREFIX("caf_atomic_cas")), ". r . . w r r w . . ",
   3967  1.1  mrg 	void_type_node, 9, pvoid_type_node, size_type_node, integer_type_node,
   3968  1.1  mrg 	pvoid_type_node, pvoid_type_node, pvoid_type_node, pint_type,
   3969  1.1  mrg 	integer_type_node, integer_type_node);
   3970  1.1  mrg 
   3971  1.1  mrg       gfor_fndecl_caf_atomic_op = gfc_build_library_function_decl_with_spec (
   3972  1.1  mrg 	get_identifier (PREFIX("caf_atomic_op")), ". . r . . r w w . . ",
   3973  1.1  mrg 	void_type_node, 9, integer_type_node, pvoid_type_node, size_type_node,
   3974  1.1  mrg 	integer_type_node, pvoid_type_node, pvoid_type_node, pint_type,
   3975  1.1  mrg 	integer_type_node, integer_type_node);
   3976  1.1  mrg 
   3977  1.1  mrg       gfor_fndecl_caf_lock = gfc_build_library_function_decl_with_spec (
   3978  1.1  mrg 	get_identifier (PREFIX("caf_lock")), ". r . . w w w . ",
   3979  1.1  mrg 	void_type_node, 7, pvoid_type_node, size_type_node, integer_type_node,
   3980  1.1  mrg 	pint_type, pint_type, pchar_type_node, size_type_node);
   3981  1.1  mrg 
   3982  1.1  mrg       gfor_fndecl_caf_unlock = gfc_build_library_function_decl_with_spec (
   3983  1.1  mrg 	get_identifier (PREFIX("caf_unlock")), ". r . . w w . ",
   3984  1.1  mrg 	void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node,
   3985  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   3986  1.1  mrg 
   3987  1.1  mrg       gfor_fndecl_caf_event_post = gfc_build_library_function_decl_with_spec (
   3988  1.1  mrg 	get_identifier (PREFIX("caf_event_post")), ". r . . w w . ",
   3989  1.1  mrg 	void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node,
   3990  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   3991  1.1  mrg 
   3992  1.1  mrg       gfor_fndecl_caf_event_wait = gfc_build_library_function_decl_with_spec (
   3993  1.1  mrg 	get_identifier (PREFIX("caf_event_wait")), ". r . . w w . ",
   3994  1.1  mrg 	void_type_node, 6, pvoid_type_node, size_type_node, integer_type_node,
   3995  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   3996  1.1  mrg 
   3997  1.1  mrg       gfor_fndecl_caf_event_query = gfc_build_library_function_decl_with_spec (
   3998  1.1  mrg 	get_identifier (PREFIX("caf_event_query")), ". r . . w w ",
   3999  1.1  mrg 	void_type_node, 5, pvoid_type_node, size_type_node, integer_type_node,
   4000  1.1  mrg 	pint_type, pint_type);
   4001  1.1  mrg 
   4002  1.1  mrg       gfor_fndecl_caf_fail_image = gfc_build_library_function_decl (
   4003  1.1  mrg 	get_identifier (PREFIX("caf_fail_image")), void_type_node, 0);
   4004  1.1  mrg       /* CAF's FAIL doesn't return.  */
   4005  1.1  mrg       TREE_THIS_VOLATILE (gfor_fndecl_caf_fail_image) = 1;
   4006  1.1  mrg 
   4007  1.1  mrg       gfor_fndecl_caf_failed_images
   4008  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4009  1.1  mrg 	    get_identifier (PREFIX("caf_failed_images")), ". w . r ",
   4010  1.1  mrg 	    void_type_node, 3, pvoid_type_node, ppvoid_type_node,
   4011  1.1  mrg 	    integer_type_node);
   4012  1.1  mrg 
   4013  1.1  mrg       gfor_fndecl_caf_form_team
   4014  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4015  1.1  mrg 	    get_identifier (PREFIX("caf_form_team")), ". . W . ",
   4016  1.1  mrg 	    void_type_node, 3, integer_type_node, ppvoid_type_node,
   4017  1.1  mrg 	    integer_type_node);
   4018  1.1  mrg 
   4019  1.1  mrg       gfor_fndecl_caf_change_team
   4020  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4021  1.1  mrg 	    get_identifier (PREFIX("caf_change_team")), ". w . ",
   4022  1.1  mrg 	    void_type_node, 2, ppvoid_type_node,
   4023  1.1  mrg 	    integer_type_node);
   4024  1.1  mrg 
   4025  1.1  mrg       gfor_fndecl_caf_end_team
   4026  1.1  mrg 	= gfc_build_library_function_decl (
   4027  1.1  mrg 	    get_identifier (PREFIX("caf_end_team")), void_type_node, 0);
   4028  1.1  mrg 
   4029  1.1  mrg       gfor_fndecl_caf_get_team
   4030  1.1  mrg 	= gfc_build_library_function_decl (
   4031  1.1  mrg 	    get_identifier (PREFIX("caf_get_team")),
   4032  1.1  mrg 	    void_type_node, 1, integer_type_node);
   4033  1.1  mrg 
   4034  1.1  mrg       gfor_fndecl_caf_sync_team
   4035  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4036  1.1  mrg 	    get_identifier (PREFIX("caf_sync_team")), ". r . ",
   4037  1.1  mrg 	    void_type_node, 2, ppvoid_type_node,
   4038  1.1  mrg 	    integer_type_node);
   4039  1.1  mrg 
   4040  1.1  mrg       gfor_fndecl_caf_team_number
   4041  1.1  mrg       	= gfc_build_library_function_decl_with_spec (
   4042  1.1  mrg 	    get_identifier (PREFIX("caf_team_number")), ". r ",
   4043  1.1  mrg       	    integer_type_node, 1, integer_type_node);
   4044  1.1  mrg 
   4045  1.1  mrg       gfor_fndecl_caf_image_status
   4046  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4047  1.1  mrg 	    get_identifier (PREFIX("caf_image_status")), ". . r ",
   4048  1.1  mrg 	    integer_type_node, 2, integer_type_node, ppvoid_type_node);
   4049  1.1  mrg 
   4050  1.1  mrg       gfor_fndecl_caf_stopped_images
   4051  1.1  mrg 	= gfc_build_library_function_decl_with_spec (
   4052  1.1  mrg 	    get_identifier (PREFIX("caf_stopped_images")), ". w r r ",
   4053  1.1  mrg 	    void_type_node, 3, pvoid_type_node, ppvoid_type_node,
   4054  1.1  mrg 	    integer_type_node);
   4055  1.1  mrg 
   4056  1.1  mrg       gfor_fndecl_co_broadcast = gfc_build_library_function_decl_with_spec (
   4057  1.1  mrg 	get_identifier (PREFIX("caf_co_broadcast")), ". w . w w . ",
   4058  1.1  mrg 	void_type_node, 5, pvoid_type_node, integer_type_node,
   4059  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   4060  1.1  mrg 
   4061  1.1  mrg       gfor_fndecl_co_max = gfc_build_library_function_decl_with_spec (
   4062  1.1  mrg 	get_identifier (PREFIX("caf_co_max")), ". w . w w . . ",
   4063  1.1  mrg 	void_type_node, 6, pvoid_type_node, integer_type_node,
   4064  1.1  mrg 	pint_type, pchar_type_node, integer_type_node, size_type_node);
   4065  1.1  mrg 
   4066  1.1  mrg       gfor_fndecl_co_min = gfc_build_library_function_decl_with_spec (
   4067  1.1  mrg 	get_identifier (PREFIX("caf_co_min")), ". w . w w . . ",
   4068  1.1  mrg 	void_type_node, 6, pvoid_type_node, integer_type_node,
   4069  1.1  mrg 	pint_type, pchar_type_node, integer_type_node, size_type_node);
   4070  1.1  mrg 
   4071  1.1  mrg       gfor_fndecl_co_reduce = gfc_build_library_function_decl_with_spec (
   4072  1.1  mrg 	get_identifier (PREFIX("caf_co_reduce")), ". w r . . w w . . ",
   4073  1.1  mrg 	void_type_node, 8, pvoid_type_node,
   4074  1.1  mrg 	build_pointer_type (build_varargs_function_type_list (void_type_node,
   4075  1.1  mrg 							      NULL_TREE)),
   4076  1.1  mrg 	integer_type_node, integer_type_node, pint_type, pchar_type_node,
   4077  1.1  mrg 	integer_type_node, size_type_node);
   4078  1.1  mrg 
   4079  1.1  mrg       gfor_fndecl_co_sum = gfc_build_library_function_decl_with_spec (
   4080  1.1  mrg 	get_identifier (PREFIX("caf_co_sum")), ". w . w w . ",
   4081  1.1  mrg 	void_type_node, 5, pvoid_type_node, integer_type_node,
   4082  1.1  mrg 	pint_type, pchar_type_node, size_type_node);
   4083  1.1  mrg 
   4084  1.1  mrg       gfor_fndecl_caf_is_present = gfc_build_library_function_decl_with_spec (
   4085  1.1  mrg 	get_identifier (PREFIX("caf_is_present")), ". r . r ",
   4086  1.1  mrg 	integer_type_node, 3, pvoid_type_node, integer_type_node,
   4087  1.1  mrg 	pvoid_type_node);
   4088  1.1  mrg 
   4089  1.1  mrg       gfor_fndecl_caf_random_init = gfc_build_library_function_decl (
   4090  1.1  mrg 	    get_identifier (PREFIX("caf_random_init")),
   4091  1.1  mrg 	    void_type_node, 2, logical_type_node, logical_type_node);
   4092  1.1  mrg     }
   4093  1.1  mrg 
   4094  1.1  mrg   gfc_build_intrinsic_function_decls ();
   4095  1.1  mrg   gfc_build_intrinsic_lib_fndecls ();
   4096  1.1  mrg   gfc_build_io_library_fndecls ();
   4097  1.1  mrg }
   4098  1.1  mrg 
   4099  1.1  mrg 
   4100  1.1  mrg /* Evaluate the length of dummy character variables.  */
   4101  1.1  mrg 
   4102  1.1  mrg static void
   4103  1.1  mrg gfc_trans_dummy_character (gfc_symbol *sym, gfc_charlen *cl,
   4104  1.1  mrg 			   gfc_wrapped_block *block)
   4105  1.1  mrg {
   4106  1.1  mrg   stmtblock_t init;
   4107  1.1  mrg 
   4108  1.1  mrg   gfc_finish_decl (cl->backend_decl);
   4109  1.1  mrg 
   4110  1.1  mrg   gfc_start_block (&init);
   4111  1.1  mrg 
   4112  1.1  mrg   /* Evaluate the string length expression.  */
   4113  1.1  mrg   gfc_conv_string_length (cl, NULL, &init);
   4114  1.1  mrg 
   4115  1.1  mrg   gfc_trans_vla_type_sizes (sym, &init);
   4116  1.1  mrg 
   4117  1.1  mrg   gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
   4118  1.1  mrg }
   4119  1.1  mrg 
   4120  1.1  mrg 
   4121  1.1  mrg /* Allocate and cleanup an automatic character variable.  */
   4122  1.1  mrg 
   4123  1.1  mrg static void
   4124  1.1  mrg gfc_trans_auto_character_variable (gfc_symbol * sym, gfc_wrapped_block * block)
   4125  1.1  mrg {
   4126  1.1  mrg   stmtblock_t init;
   4127  1.1  mrg   tree decl;
   4128  1.1  mrg   tree tmp;
   4129  1.1  mrg 
   4130  1.1  mrg   gcc_assert (sym->backend_decl);
   4131  1.1  mrg   gcc_assert (sym->ts.u.cl && sym->ts.u.cl->length);
   4132  1.1  mrg 
   4133  1.1  mrg   gfc_init_block (&init);
   4134  1.1  mrg 
   4135  1.1  mrg   /* Evaluate the string length expression.  */
   4136  1.1  mrg   gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
   4137  1.1  mrg 
   4138  1.1  mrg   gfc_trans_vla_type_sizes (sym, &init);
   4139  1.1  mrg 
   4140  1.1  mrg   decl = sym->backend_decl;
   4141  1.1  mrg 
   4142  1.1  mrg   /* Emit a DECL_EXPR for this variable, which will cause the
   4143  1.1  mrg      gimplifier to allocate storage, and all that good stuff.  */
   4144  1.1  mrg   tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl), decl);
   4145  1.1  mrg   gfc_add_expr_to_block (&init, tmp);
   4146  1.1  mrg 
   4147  1.1  mrg   gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
   4148  1.1  mrg }
   4149  1.1  mrg 
   4150  1.1  mrg /* Set the initial value of ASSIGN statement auxiliary variable explicitly.  */
   4151  1.1  mrg 
   4152  1.1  mrg static void
   4153  1.1  mrg gfc_trans_assign_aux_var (gfc_symbol * sym, gfc_wrapped_block * block)
   4154  1.1  mrg {
   4155  1.1  mrg   stmtblock_t init;
   4156  1.1  mrg 
   4157  1.1  mrg   gcc_assert (sym->backend_decl);
   4158  1.1  mrg   gfc_start_block (&init);
   4159  1.1  mrg 
   4160  1.1  mrg   /* Set the initial value to length. See the comments in
   4161  1.1  mrg      function gfc_add_assign_aux_vars in this file.  */
   4162  1.1  mrg   gfc_add_modify (&init, GFC_DECL_STRING_LEN (sym->backend_decl),
   4163  1.1  mrg 		  build_int_cst (gfc_charlen_type_node, -2));
   4164  1.1  mrg 
   4165  1.1  mrg   gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
   4166  1.1  mrg }
   4167  1.1  mrg 
   4168  1.1  mrg static void
   4169  1.1  mrg gfc_trans_vla_one_sizepos (tree *tp, stmtblock_t *body)
   4170  1.1  mrg {
   4171  1.1  mrg   tree t = *tp, var, val;
   4172  1.1  mrg 
   4173  1.1  mrg   if (t == NULL || t == error_mark_node)
   4174  1.1  mrg     return;
   4175  1.1  mrg   if (TREE_CONSTANT (t) || DECL_P (t))
   4176  1.1  mrg     return;
   4177  1.1  mrg 
   4178  1.1  mrg   if (TREE_CODE (t) == SAVE_EXPR)
   4179  1.1  mrg     {
   4180  1.1  mrg       if (SAVE_EXPR_RESOLVED_P (t))
   4181  1.1  mrg 	{
   4182  1.1  mrg 	  *tp = TREE_OPERAND (t, 0);
   4183  1.1  mrg 	  return;
   4184  1.1  mrg 	}
   4185  1.1  mrg       val = TREE_OPERAND (t, 0);
   4186  1.1  mrg     }
   4187  1.1  mrg   else
   4188  1.1  mrg     val = t;
   4189  1.1  mrg 
   4190  1.1  mrg   var = gfc_create_var_np (TREE_TYPE (t), NULL);
   4191  1.1  mrg   gfc_add_decl_to_function (var);
   4192  1.1  mrg   gfc_add_modify (body, var, unshare_expr (val));
   4193  1.1  mrg   if (TREE_CODE (t) == SAVE_EXPR)
   4194  1.1  mrg     TREE_OPERAND (t, 0) = var;
   4195  1.1  mrg   *tp = var;
   4196  1.1  mrg }
   4197  1.1  mrg 
   4198  1.1  mrg static void
   4199  1.1  mrg gfc_trans_vla_type_sizes_1 (tree type, stmtblock_t *body)
   4200  1.1  mrg {
   4201  1.1  mrg   tree t;
   4202  1.1  mrg 
   4203  1.1  mrg   if (type == NULL || type == error_mark_node)
   4204  1.1  mrg     return;
   4205  1.1  mrg 
   4206  1.1  mrg   type = TYPE_MAIN_VARIANT (type);
   4207  1.1  mrg 
   4208  1.1  mrg   if (TREE_CODE (type) == INTEGER_TYPE)
   4209  1.1  mrg     {
   4210  1.1  mrg       gfc_trans_vla_one_sizepos (&TYPE_MIN_VALUE (type), body);
   4211  1.1  mrg       gfc_trans_vla_one_sizepos (&TYPE_MAX_VALUE (type), body);
   4212  1.1  mrg 
   4213  1.1  mrg       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
   4214  1.1  mrg 	{
   4215  1.1  mrg 	  TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
   4216  1.1  mrg 	  TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
   4217  1.1  mrg 	}
   4218  1.1  mrg     }
   4219  1.1  mrg   else if (TREE_CODE (type) == ARRAY_TYPE)
   4220  1.1  mrg     {
   4221  1.1  mrg       gfc_trans_vla_type_sizes_1 (TREE_TYPE (type), body);
   4222  1.1  mrg       gfc_trans_vla_type_sizes_1 (TYPE_DOMAIN (type), body);
   4223  1.1  mrg       gfc_trans_vla_one_sizepos (&TYPE_SIZE (type), body);
   4224  1.1  mrg       gfc_trans_vla_one_sizepos (&TYPE_SIZE_UNIT (type), body);
   4225  1.1  mrg 
   4226  1.1  mrg       for (t = TYPE_NEXT_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
   4227  1.1  mrg 	{
   4228  1.1  mrg 	  TYPE_SIZE (t) = TYPE_SIZE (type);
   4229  1.1  mrg 	  TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
   4230  1.1  mrg 	}
   4231  1.1  mrg     }
   4232  1.1  mrg }
   4233  1.1  mrg 
   4234  1.1  mrg /* Make sure all type sizes and array domains are either constant,
   4235  1.1  mrg    or variable or parameter decls.  This is a simplified variant
   4236  1.1  mrg    of gimplify_type_sizes, but we can't use it here, as none of the
   4237  1.1  mrg    variables in the expressions have been gimplified yet.
   4238  1.1  mrg    As type sizes and domains for various variable length arrays
   4239  1.1  mrg    contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
   4240  1.1  mrg    time, without this routine gimplify_type_sizes in the middle-end
   4241  1.1  mrg    could result in the type sizes being gimplified earlier than where
   4242  1.1  mrg    those variables are initialized.  */
   4243  1.1  mrg 
   4244  1.1  mrg void
   4245  1.1  mrg gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)
   4246  1.1  mrg {
   4247  1.1  mrg   tree type = TREE_TYPE (sym->backend_decl);
   4248  1.1  mrg 
   4249  1.1  mrg   if (TREE_CODE (type) == FUNCTION_TYPE
   4250  1.1  mrg       && (sym->attr.function || sym->attr.result || sym->attr.entry))
   4251  1.1  mrg     {
   4252  1.1  mrg       if (! current_fake_result_decl)
   4253  1.1  mrg 	return;
   4254  1.1  mrg 
   4255  1.1  mrg       type = TREE_TYPE (TREE_VALUE (current_fake_result_decl));
   4256  1.1  mrg     }
   4257  1.1  mrg 
   4258  1.1  mrg   while (POINTER_TYPE_P (type))
   4259  1.1  mrg     type = TREE_TYPE (type);
   4260  1.1  mrg 
   4261  1.1  mrg   if (GFC_DESCRIPTOR_TYPE_P (type))
   4262  1.1  mrg     {
   4263  1.1  mrg       tree etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
   4264  1.1  mrg 
   4265  1.1  mrg       while (POINTER_TYPE_P (etype))
   4266  1.1  mrg 	etype = TREE_TYPE (etype);
   4267  1.1  mrg 
   4268  1.1  mrg       gfc_trans_vla_type_sizes_1 (etype, body);
   4269  1.1  mrg     }
   4270  1.1  mrg 
   4271  1.1  mrg   gfc_trans_vla_type_sizes_1 (type, body);
   4272  1.1  mrg }
   4273  1.1  mrg 
   4274  1.1  mrg 
   4275  1.1  mrg /* Initialize a derived type by building an lvalue from the symbol
   4276  1.1  mrg    and using trans_assignment to do the work. Set dealloc to false
   4277  1.1  mrg    if no deallocation prior the assignment is needed.  */
   4278  1.1  mrg void
   4279  1.1  mrg gfc_init_default_dt (gfc_symbol * sym, stmtblock_t * block, bool dealloc)
   4280  1.1  mrg {
   4281  1.1  mrg   gfc_expr *e;
   4282  1.1  mrg   tree tmp;
   4283  1.1  mrg   tree present;
   4284  1.1  mrg 
   4285  1.1  mrg   gcc_assert (block);
   4286  1.1  mrg 
   4287  1.1  mrg   /* Initialization of PDTs is done elsewhere.  */
   4288  1.1  mrg   if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_type)
   4289  1.1  mrg     return;
   4290  1.1  mrg 
   4291  1.1  mrg   gcc_assert (!sym->attr.allocatable);
   4292  1.1  mrg   gfc_set_sym_referenced (sym);
   4293  1.1  mrg   e = gfc_lval_expr_from_sym (sym);
   4294  1.1  mrg   tmp = gfc_trans_assignment (e, sym->value, false, dealloc);
   4295  1.1  mrg   if (sym->attr.dummy && (sym->attr.optional
   4296  1.1  mrg 			  || sym->ns->proc_name->attr.entry_master))
   4297  1.1  mrg     {
   4298  1.1  mrg       present = gfc_conv_expr_present (sym);
   4299  1.1  mrg       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
   4300  1.1  mrg 			tmp, build_empty_stmt (input_location));
   4301  1.1  mrg     }
   4302  1.1  mrg   gfc_add_expr_to_block (block, tmp);
   4303  1.1  mrg   gfc_free_expr (e);
   4304  1.1  mrg }
   4305  1.1  mrg 
   4306  1.1  mrg 
   4307  1.1  mrg /* Initialize INTENT(OUT) derived type dummies.  As well as giving
   4308  1.1  mrg    them their default initializer, if they do not have allocatable
   4309  1.1  mrg    components, they have their allocatable components deallocated.  */
   4310  1.1  mrg 
   4311  1.1  mrg static void
   4312  1.1  mrg init_intent_out_dt (gfc_symbol * proc_sym, gfc_wrapped_block * block)
   4313  1.1  mrg {
   4314  1.1  mrg   stmtblock_t init;
   4315  1.1  mrg   gfc_formal_arglist *f;
   4316  1.1  mrg   tree tmp;
   4317  1.1  mrg   tree present;
   4318  1.1  mrg 
   4319  1.1  mrg   gfc_init_block (&init);
   4320  1.1  mrg   for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next)
   4321  1.1  mrg     if (f->sym && f->sym->attr.intent == INTENT_OUT
   4322  1.1  mrg 	&& !f->sym->attr.pointer
   4323  1.1  mrg 	&& f->sym->ts.type == BT_DERIVED)
   4324  1.1  mrg       {
   4325  1.1  mrg 	tmp = NULL_TREE;
   4326  1.1  mrg 
   4327  1.1  mrg 	/* Note: Allocatables are excluded as they are already handled
   4328  1.1  mrg 	   by the caller.  */
   4329  1.1  mrg 	if (!f->sym->attr.allocatable
   4330  1.1  mrg 	    && gfc_is_finalizable (f->sym->ts.u.derived, NULL))
   4331  1.1  mrg 	  {
   4332  1.1  mrg 	    stmtblock_t block;
   4333  1.1  mrg 	    gfc_expr *e;
   4334  1.1  mrg 
   4335  1.1  mrg 	    gfc_init_block (&block);
   4336  1.1  mrg 	    f->sym->attr.referenced = 1;
   4337  1.1  mrg 	    e = gfc_lval_expr_from_sym (f->sym);
   4338  1.1  mrg 	    gfc_add_finalizer_call (&block, e);
   4339  1.1  mrg 	    gfc_free_expr (e);
   4340  1.1  mrg 	    tmp = gfc_finish_block (&block);
   4341  1.1  mrg 	  }
   4342  1.1  mrg 
   4343  1.1  mrg 	if (tmp == NULL_TREE && !f->sym->attr.allocatable
   4344  1.1  mrg 	    && f->sym->ts.u.derived->attr.alloc_comp && !f->sym->value)
   4345  1.1  mrg 	  tmp = gfc_deallocate_alloc_comp (f->sym->ts.u.derived,
   4346  1.1  mrg 					   f->sym->backend_decl,
   4347  1.1  mrg 					   f->sym->as ? f->sym->as->rank : 0);
   4348  1.1  mrg 
   4349  1.1  mrg 	if (tmp != NULL_TREE && (f->sym->attr.optional
   4350  1.1  mrg 				 || f->sym->ns->proc_name->attr.entry_master))
   4351  1.1  mrg 	  {
   4352  1.1  mrg 	    present = gfc_conv_expr_present (f->sym);
   4353  1.1  mrg 	    tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
   4354  1.1  mrg 			      present, tmp, build_empty_stmt (input_location));
   4355  1.1  mrg 	  }
   4356  1.1  mrg 
   4357  1.1  mrg 	if (tmp != NULL_TREE)
   4358  1.1  mrg 	  gfc_add_expr_to_block (&init, tmp);
   4359  1.1  mrg 	else if (f->sym->value && !f->sym->attr.allocatable)
   4360  1.1  mrg 	  gfc_init_default_dt (f->sym, &init, true);
   4361  1.1  mrg       }
   4362  1.1  mrg     else if (f->sym && f->sym->attr.intent == INTENT_OUT
   4363  1.1  mrg 	     && f->sym->ts.type == BT_CLASS
   4364  1.1  mrg 	     && !CLASS_DATA (f->sym)->attr.class_pointer
   4365  1.1  mrg 	     && !CLASS_DATA (f->sym)->attr.allocatable)
   4366  1.1  mrg       {
   4367  1.1  mrg 	stmtblock_t block;
   4368  1.1  mrg 	gfc_expr *e;
   4369  1.1  mrg 
   4370  1.1  mrg 	gfc_init_block (&block);
   4371  1.1  mrg 	f->sym->attr.referenced = 1;
   4372  1.1  mrg 	e = gfc_lval_expr_from_sym (f->sym);
   4373  1.1  mrg 	gfc_add_finalizer_call (&block, e);
   4374  1.1  mrg 	gfc_free_expr (e);
   4375  1.1  mrg 	tmp = gfc_finish_block (&block);
   4376  1.1  mrg 
   4377  1.1  mrg 	if (f->sym->attr.optional || f->sym->ns->proc_name->attr.entry_master)
   4378  1.1  mrg 	  {
   4379  1.1  mrg 	    present = gfc_conv_expr_present (f->sym);
   4380  1.1  mrg 	    tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
   4381  1.1  mrg 			      present, tmp,
   4382  1.1  mrg 			      build_empty_stmt (input_location));
   4383  1.1  mrg 	  }
   4384  1.1  mrg 
   4385  1.1  mrg 	gfc_add_expr_to_block (&init, tmp);
   4386  1.1  mrg       }
   4387  1.1  mrg 
   4388  1.1  mrg   gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
   4389  1.1  mrg }
   4390  1.1  mrg 
   4391  1.1  mrg 
   4392  1.1  mrg /* Helper function to manage deferred string lengths.  */
   4393  1.1  mrg 
   4394  1.1  mrg static tree
   4395  1.1  mrg gfc_null_and_pass_deferred_len (gfc_symbol *sym, stmtblock_t *init,
   4396  1.1  mrg 			        locus *loc)
   4397  1.1  mrg {
   4398  1.1  mrg   tree tmp;
   4399  1.1  mrg 
   4400  1.1  mrg   /* Character length passed by reference.  */
   4401  1.1  mrg   tmp = sym->ts.u.cl->passed_length;
   4402  1.1  mrg   tmp = build_fold_indirect_ref_loc (input_location, tmp);
   4403  1.1  mrg   tmp = fold_convert (gfc_charlen_type_node, tmp);
   4404  1.1  mrg 
   4405  1.1  mrg   if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
   4406  1.1  mrg     /* Zero the string length when entering the scope.  */
   4407  1.1  mrg     gfc_add_modify (init, sym->ts.u.cl->backend_decl,
   4408  1.1  mrg 		    build_int_cst (gfc_charlen_type_node, 0));
   4409  1.1  mrg   else
   4410  1.1  mrg     {
   4411  1.1  mrg       tree tmp2;
   4412  1.1  mrg 
   4413  1.1  mrg       tmp2 = fold_build2_loc (input_location, MODIFY_EXPR,
   4414  1.1  mrg 			      gfc_charlen_type_node,
   4415  1.1  mrg 			      sym->ts.u.cl->backend_decl, tmp);
   4416  1.1  mrg       if (sym->attr.optional)
   4417  1.1  mrg 	{
   4418  1.1  mrg 	  tree present = gfc_conv_expr_present (sym);
   4419  1.1  mrg 	  tmp2 = build3_loc (input_location, COND_EXPR,
   4420  1.1  mrg 			     void_type_node, present, tmp2,
   4421  1.1  mrg 			     build_empty_stmt (input_location));
   4422  1.1  mrg 	}
   4423  1.1  mrg       gfc_add_expr_to_block (init, tmp2);
   4424  1.1  mrg     }
   4425  1.1  mrg 
   4426  1.1  mrg   gfc_restore_backend_locus (loc);
   4427  1.1  mrg 
   4428  1.1  mrg   /* Pass the final character length back.  */
   4429  1.1  mrg   if (sym->attr.intent != INTENT_IN)
   4430  1.1  mrg     {
   4431  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   4432  1.1  mrg 			     gfc_charlen_type_node, tmp,
   4433  1.1  mrg 			     sym->ts.u.cl->backend_decl);
   4434  1.1  mrg       if (sym->attr.optional)
   4435  1.1  mrg 	{
   4436  1.1  mrg 	  tree present = gfc_conv_expr_present (sym);
   4437  1.1  mrg 	  tmp = build3_loc (input_location, COND_EXPR,
   4438  1.1  mrg 			    void_type_node, present, tmp,
   4439  1.1  mrg 			    build_empty_stmt (input_location));
   4440  1.1  mrg 	}
   4441  1.1  mrg     }
   4442  1.1  mrg   else
   4443  1.1  mrg     tmp = NULL_TREE;
   4444  1.1  mrg 
   4445  1.1  mrg   return tmp;
   4446  1.1  mrg }
   4447  1.1  mrg 
   4448  1.1  mrg 
   4449  1.1  mrg /* Get the result expression for a procedure.  */
   4450  1.1  mrg 
   4451  1.1  mrg static tree
   4452  1.1  mrg get_proc_result (gfc_symbol* sym)
   4453  1.1  mrg {
   4454  1.1  mrg   if (sym->attr.subroutine || sym == sym->result)
   4455  1.1  mrg     {
   4456  1.1  mrg       if (current_fake_result_decl != NULL)
   4457  1.1  mrg 	return TREE_VALUE (current_fake_result_decl);
   4458  1.1  mrg 
   4459  1.1  mrg       return NULL_TREE;
   4460  1.1  mrg     }
   4461  1.1  mrg 
   4462  1.1  mrg   return sym->result->backend_decl;
   4463  1.1  mrg }
   4464  1.1  mrg 
   4465  1.1  mrg 
   4466  1.1  mrg /* Generate function entry and exit code, and add it to the function body.
   4467  1.1  mrg    This includes:
   4468  1.1  mrg     Allocation and initialization of array variables.
   4469  1.1  mrg     Allocation of character string variables.
   4470  1.1  mrg     Initialization and possibly repacking of dummy arrays.
   4471  1.1  mrg     Initialization of ASSIGN statement auxiliary variable.
   4472  1.1  mrg     Initialization of ASSOCIATE names.
   4473  1.1  mrg     Automatic deallocation.  */
   4474  1.1  mrg 
   4475  1.1  mrg void
   4476  1.1  mrg gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
   4477  1.1  mrg {
   4478  1.1  mrg   locus loc;
   4479  1.1  mrg   gfc_symbol *sym;
   4480  1.1  mrg   gfc_formal_arglist *f;
   4481  1.1  mrg   stmtblock_t tmpblock;
   4482  1.1  mrg   bool seen_trans_deferred_array = false;
   4483  1.1  mrg   bool is_pdt_type = false;
   4484  1.1  mrg   tree tmp = NULL;
   4485  1.1  mrg   gfc_expr *e;
   4486  1.1  mrg   gfc_se se;
   4487  1.1  mrg   stmtblock_t init;
   4488  1.1  mrg 
   4489  1.1  mrg   /* Deal with implicit return variables.  Explicit return variables will
   4490  1.1  mrg      already have been added.  */
   4491  1.1  mrg   if (gfc_return_by_reference (proc_sym) && proc_sym->result == proc_sym)
   4492  1.1  mrg     {
   4493  1.1  mrg       if (!current_fake_result_decl)
   4494  1.1  mrg 	{
   4495  1.1  mrg 	  gfc_entry_list *el = NULL;
   4496  1.1  mrg 	  if (proc_sym->attr.entry_master)
   4497  1.1  mrg 	    {
   4498  1.1  mrg 	      for (el = proc_sym->ns->entries; el; el = el->next)
   4499  1.1  mrg 		if (el->sym != el->sym->result)
   4500  1.1  mrg 		  break;
   4501  1.1  mrg 	    }
   4502  1.1  mrg 	  /* TODO: move to the appropriate place in resolve.cc.  */
   4503  1.1  mrg 	  if (warn_return_type > 0 && el == NULL)
   4504  1.1  mrg 	    gfc_warning (OPT_Wreturn_type,
   4505  1.1  mrg 			 "Return value of function %qs at %L not set",
   4506  1.1  mrg 			 proc_sym->name, &proc_sym->declared_at);
   4507  1.1  mrg 	}
   4508  1.1  mrg       else if (proc_sym->as)
   4509  1.1  mrg 	{
   4510  1.1  mrg 	  tree result = TREE_VALUE (current_fake_result_decl);
   4511  1.1  mrg 	  gfc_save_backend_locus (&loc);
   4512  1.1  mrg 	  gfc_set_backend_locus (&proc_sym->declared_at);
   4513  1.1  mrg 	  gfc_trans_dummy_array_bias (proc_sym, result, block);
   4514  1.1  mrg 
   4515  1.1  mrg 	  /* An automatic character length, pointer array result.  */
   4516  1.1  mrg 	  if (proc_sym->ts.type == BT_CHARACTER
   4517  1.1  mrg 	      && VAR_P (proc_sym->ts.u.cl->backend_decl))
   4518  1.1  mrg 	    {
   4519  1.1  mrg 	      tmp = NULL;
   4520  1.1  mrg 	      if (proc_sym->ts.deferred)
   4521  1.1  mrg 		{
   4522  1.1  mrg 		  gfc_start_block (&init);
   4523  1.1  mrg 		  tmp = gfc_null_and_pass_deferred_len (proc_sym, &init, &loc);
   4524  1.1  mrg 		  gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
   4525  1.1  mrg 		}
   4526  1.1  mrg 	      else
   4527  1.1  mrg 		gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
   4528  1.1  mrg 	    }
   4529  1.1  mrg 	}
   4530  1.1  mrg       else if (proc_sym->ts.type == BT_CHARACTER)
   4531  1.1  mrg 	{
   4532  1.1  mrg 	  if (proc_sym->ts.deferred)
   4533  1.1  mrg 	    {
   4534  1.1  mrg 	      tmp = NULL;
   4535  1.1  mrg 	      gfc_save_backend_locus (&loc);
   4536  1.1  mrg 	      gfc_set_backend_locus (&proc_sym->declared_at);
   4537  1.1  mrg 	      gfc_start_block (&init);
   4538  1.1  mrg 	      /* Zero the string length on entry.  */
   4539  1.1  mrg 	      gfc_add_modify (&init, proc_sym->ts.u.cl->backend_decl,
   4540  1.1  mrg 			      build_int_cst (gfc_charlen_type_node, 0));
   4541  1.1  mrg 	      /* Null the pointer.  */
   4542  1.1  mrg 	      e = gfc_lval_expr_from_sym (proc_sym);
   4543  1.1  mrg 	      gfc_init_se (&se, NULL);
   4544  1.1  mrg 	      se.want_pointer = 1;
   4545  1.1  mrg 	      gfc_conv_expr (&se, e);
   4546  1.1  mrg 	      gfc_free_expr (e);
   4547  1.1  mrg 	      tmp = se.expr;
   4548  1.1  mrg 	      gfc_add_modify (&init, tmp,
   4549  1.1  mrg 			      fold_convert (TREE_TYPE (se.expr),
   4550  1.1  mrg 					    null_pointer_node));
   4551  1.1  mrg 	      gfc_restore_backend_locus (&loc);
   4552  1.1  mrg 
   4553  1.1  mrg 	      /* Pass back the string length on exit.  */
   4554  1.1  mrg 	      tmp = proc_sym->ts.u.cl->backend_decl;
   4555  1.1  mrg 	      if (TREE_CODE (tmp) != INDIRECT_REF
   4556  1.1  mrg 		  && proc_sym->ts.u.cl->passed_length)
   4557  1.1  mrg 		{
   4558  1.1  mrg 		  tmp = proc_sym->ts.u.cl->passed_length;
   4559  1.1  mrg 		  tmp = build_fold_indirect_ref_loc (input_location, tmp);
   4560  1.1  mrg 		  tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   4561  1.1  mrg 					 TREE_TYPE (tmp), tmp,
   4562  1.1  mrg 					 fold_convert
   4563  1.1  mrg 					 (TREE_TYPE (tmp),
   4564  1.1  mrg 					  proc_sym->ts.u.cl->backend_decl));
   4565  1.1  mrg 		}
   4566  1.1  mrg 	      else
   4567  1.1  mrg 		tmp = NULL_TREE;
   4568  1.1  mrg 
   4569  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
   4570  1.1  mrg 	    }
   4571  1.1  mrg 	  else if (VAR_P (proc_sym->ts.u.cl->backend_decl))
   4572  1.1  mrg 	    gfc_trans_dummy_character (proc_sym, proc_sym->ts.u.cl, block);
   4573  1.1  mrg 	}
   4574  1.1  mrg       else
   4575  1.1  mrg 	gcc_assert (flag_f2c && proc_sym->ts.type == BT_COMPLEX);
   4576  1.1  mrg     }
   4577  1.1  mrg   else if (proc_sym == proc_sym->result && IS_CLASS_ARRAY (proc_sym))
   4578  1.1  mrg     {
   4579  1.1  mrg       /* Nullify explicit return class arrays on entry.  */
   4580  1.1  mrg       tree type;
   4581  1.1  mrg       tmp = get_proc_result (proc_sym);
   4582  1.1  mrg 	if (tmp && GFC_CLASS_TYPE_P (TREE_TYPE (tmp)))
   4583  1.1  mrg 	  {
   4584  1.1  mrg 	    gfc_start_block (&init);
   4585  1.1  mrg 	    tmp = gfc_class_data_get (tmp);
   4586  1.1  mrg 	    type = TREE_TYPE (gfc_conv_descriptor_data_get (tmp));
   4587  1.1  mrg 	    gfc_conv_descriptor_data_set (&init, tmp, build_int_cst (type, 0));
   4588  1.1  mrg 	    gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
   4589  1.1  mrg 	  }
   4590  1.1  mrg     }
   4591  1.1  mrg 
   4592  1.1  mrg 
   4593  1.1  mrg   /* Initialize the INTENT(OUT) derived type dummy arguments.  This
   4594  1.1  mrg      should be done here so that the offsets and lbounds of arrays
   4595  1.1  mrg      are available.  */
   4596  1.1  mrg   gfc_save_backend_locus (&loc);
   4597  1.1  mrg   gfc_set_backend_locus (&proc_sym->declared_at);
   4598  1.1  mrg   init_intent_out_dt (proc_sym, block);
   4599  1.1  mrg   gfc_restore_backend_locus (&loc);
   4600  1.1  mrg 
   4601  1.1  mrg   for (sym = proc_sym->tlink; sym != proc_sym; sym = sym->tlink)
   4602  1.1  mrg     {
   4603  1.1  mrg       bool alloc_comp_or_fini = (sym->ts.type == BT_DERIVED)
   4604  1.1  mrg 				&& (sym->ts.u.derived->attr.alloc_comp
   4605  1.1  mrg 				    || gfc_is_finalizable (sym->ts.u.derived,
   4606  1.1  mrg 							   NULL));
   4607  1.1  mrg       if (sym->assoc)
   4608  1.1  mrg 	continue;
   4609  1.1  mrg 
   4610  1.1  mrg       if (sym->ts.type == BT_DERIVED
   4611  1.1  mrg 	  && sym->ts.u.derived
   4612  1.1  mrg 	  && sym->ts.u.derived->attr.pdt_type)
   4613  1.1  mrg 	{
   4614  1.1  mrg 	  is_pdt_type = true;
   4615  1.1  mrg 	  gfc_init_block (&tmpblock);
   4616  1.1  mrg 	  if (!(sym->attr.dummy
   4617  1.1  mrg 		|| sym->attr.pointer
   4618  1.1  mrg 		|| sym->attr.allocatable))
   4619  1.1  mrg 	    {
   4620  1.1  mrg 	      tmp = gfc_allocate_pdt_comp (sym->ts.u.derived,
   4621  1.1  mrg 					   sym->backend_decl,
   4622  1.1  mrg 					   sym->as ? sym->as->rank : 0,
   4623  1.1  mrg 					   sym->param_list);
   4624  1.1  mrg 	      gfc_add_expr_to_block (&tmpblock, tmp);
   4625  1.1  mrg 	      if (!sym->attr.result)
   4626  1.1  mrg 		tmp = gfc_deallocate_pdt_comp (sym->ts.u.derived,
   4627  1.1  mrg 					       sym->backend_decl,
   4628  1.1  mrg 					       sym->as ? sym->as->rank : 0);
   4629  1.1  mrg 	      else
   4630  1.1  mrg 		tmp = NULL_TREE;
   4631  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), tmp);
   4632  1.1  mrg 	    }
   4633  1.1  mrg 	  else if (sym->attr.dummy)
   4634  1.1  mrg 	    {
   4635  1.1  mrg 	      tmp = gfc_check_pdt_dummy (sym->ts.u.derived,
   4636  1.1  mrg 					 sym->backend_decl,
   4637  1.1  mrg 					 sym->as ? sym->as->rank : 0,
   4638  1.1  mrg 					 sym->param_list);
   4639  1.1  mrg 	      gfc_add_expr_to_block (&tmpblock, tmp);
   4640  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL);
   4641  1.1  mrg 	    }
   4642  1.1  mrg 	}
   4643  1.1  mrg       else if (sym->ts.type == BT_CLASS
   4644  1.1  mrg 	       && CLASS_DATA (sym)->ts.u.derived
   4645  1.1  mrg 	       && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type)
   4646  1.1  mrg 	{
   4647  1.1  mrg 	  gfc_component *data = CLASS_DATA (sym);
   4648  1.1  mrg 	  is_pdt_type = true;
   4649  1.1  mrg 	  gfc_init_block (&tmpblock);
   4650  1.1  mrg 	  if (!(sym->attr.dummy
   4651  1.1  mrg 		|| CLASS_DATA (sym)->attr.pointer
   4652  1.1  mrg 		|| CLASS_DATA (sym)->attr.allocatable))
   4653  1.1  mrg 	    {
   4654  1.1  mrg 	      tmp = gfc_class_data_get (sym->backend_decl);
   4655  1.1  mrg 	      tmp = gfc_allocate_pdt_comp (data->ts.u.derived, tmp,
   4656  1.1  mrg 					   data->as ? data->as->rank : 0,
   4657  1.1  mrg 					   sym->param_list);
   4658  1.1  mrg 	      gfc_add_expr_to_block (&tmpblock, tmp);
   4659  1.1  mrg 	      tmp = gfc_class_data_get (sym->backend_decl);
   4660  1.1  mrg 	      if (!sym->attr.result)
   4661  1.1  mrg 		tmp = gfc_deallocate_pdt_comp (data->ts.u.derived, tmp,
   4662  1.1  mrg 					       data->as ? data->as->rank : 0);
   4663  1.1  mrg 	      else
   4664  1.1  mrg 		tmp = NULL_TREE;
   4665  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), tmp);
   4666  1.1  mrg 	    }
   4667  1.1  mrg 	  else if (sym->attr.dummy)
   4668  1.1  mrg 	    {
   4669  1.1  mrg 	      tmp = gfc_class_data_get (sym->backend_decl);
   4670  1.1  mrg 	      tmp = gfc_check_pdt_dummy (data->ts.u.derived, tmp,
   4671  1.1  mrg 					 data->as ? data->as->rank : 0,
   4672  1.1  mrg 					 sym->param_list);
   4673  1.1  mrg 	      gfc_add_expr_to_block (&tmpblock, tmp);
   4674  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL);
   4675  1.1  mrg 	    }
   4676  1.1  mrg 	}
   4677  1.1  mrg 
   4678  1.1  mrg       if (sym->attr.pointer && sym->attr.dimension
   4679  1.1  mrg 	  && sym->attr.save == SAVE_NONE
   4680  1.1  mrg 	  && !sym->attr.use_assoc
   4681  1.1  mrg 	  && !sym->attr.host_assoc
   4682  1.1  mrg 	  && !sym->attr.dummy
   4683  1.1  mrg 	  && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (sym->backend_decl)))
   4684  1.1  mrg 	{
   4685  1.1  mrg 	  gfc_init_block (&tmpblock);
   4686  1.1  mrg 	  gfc_conv_descriptor_span_set (&tmpblock, sym->backend_decl,
   4687  1.1  mrg 				build_int_cst (gfc_array_index_type, 0));
   4688  1.1  mrg 	  gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
   4689  1.1  mrg 				NULL_TREE);
   4690  1.1  mrg 	}
   4691  1.1  mrg 
   4692  1.1  mrg       if (sym->ts.type == BT_CLASS
   4693  1.1  mrg 	  && (sym->attr.save || flag_max_stack_var_size == 0)
   4694  1.1  mrg 	  && CLASS_DATA (sym)->attr.allocatable)
   4695  1.1  mrg 	{
   4696  1.1  mrg 	  tree vptr;
   4697  1.1  mrg 
   4698  1.1  mrg           if (UNLIMITED_POLY (sym))
   4699  1.1  mrg 	    vptr = null_pointer_node;
   4700  1.1  mrg 	  else
   4701  1.1  mrg 	    {
   4702  1.1  mrg 	      gfc_symbol *vsym;
   4703  1.1  mrg 	      vsym = gfc_find_derived_vtab (sym->ts.u.derived);
   4704  1.1  mrg 	      vptr = gfc_get_symbol_decl (vsym);
   4705  1.1  mrg 	      vptr = gfc_build_addr_expr (NULL, vptr);
   4706  1.1  mrg 	    }
   4707  1.1  mrg 
   4708  1.1  mrg 	  if (CLASS_DATA (sym)->attr.dimension
   4709  1.1  mrg 	      || (CLASS_DATA (sym)->attr.codimension
   4710  1.1  mrg 		  && flag_coarray != GFC_FCOARRAY_LIB))
   4711  1.1  mrg 	    {
   4712  1.1  mrg 	      tmp = gfc_class_data_get (sym->backend_decl);
   4713  1.1  mrg 	      tmp = gfc_build_null_descriptor (TREE_TYPE (tmp));
   4714  1.1  mrg 	    }
   4715  1.1  mrg 	  else
   4716  1.1  mrg 	    tmp = null_pointer_node;
   4717  1.1  mrg 
   4718  1.1  mrg 	  DECL_INITIAL (sym->backend_decl)
   4719  1.1  mrg 		= gfc_class_set_static_fields (sym->backend_decl, vptr, tmp);
   4720  1.1  mrg 	  TREE_CONSTANT (DECL_INITIAL (sym->backend_decl)) = 1;
   4721  1.1  mrg 	}
   4722  1.1  mrg       else if ((sym->attr.dimension || sym->attr.codimension
   4723  1.1  mrg 	       || (IS_CLASS_ARRAY (sym) && !CLASS_DATA (sym)->attr.allocatable)))
   4724  1.1  mrg 	{
   4725  1.1  mrg 	  bool is_classarray = IS_CLASS_ARRAY (sym);
   4726  1.1  mrg 	  symbol_attribute *array_attr;
   4727  1.1  mrg 	  gfc_array_spec *as;
   4728  1.1  mrg 	  array_type type_of_array;
   4729  1.1  mrg 
   4730  1.1  mrg 	  array_attr = is_classarray ? &CLASS_DATA (sym)->attr : &sym->attr;
   4731  1.1  mrg 	  as = is_classarray ? CLASS_DATA (sym)->as : sym->as;
   4732  1.1  mrg 	  /* Assumed-size Cray pointees need to be treated as AS_EXPLICIT.  */
   4733  1.1  mrg 	  type_of_array = as->type;
   4734  1.1  mrg 	  if (type_of_array == AS_ASSUMED_SIZE && as->cp_was_assumed)
   4735  1.1  mrg 	    type_of_array = AS_EXPLICIT;
   4736  1.1  mrg 	  switch (type_of_array)
   4737  1.1  mrg 	    {
   4738  1.1  mrg 	    case AS_EXPLICIT:
   4739  1.1  mrg 	      if (sym->attr.dummy || sym->attr.result)
   4740  1.1  mrg 		gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
   4741  1.1  mrg 	      /* Allocatable and pointer arrays need to processed
   4742  1.1  mrg 		 explicitly.  */
   4743  1.1  mrg 	      else if ((sym->ts.type != BT_CLASS && sym->attr.pointer)
   4744  1.1  mrg 		       || (sym->ts.type == BT_CLASS
   4745  1.1  mrg 			   && CLASS_DATA (sym)->attr.class_pointer)
   4746  1.1  mrg 		       || array_attr->allocatable)
   4747  1.1  mrg 		{
   4748  1.1  mrg 		  if (TREE_STATIC (sym->backend_decl))
   4749  1.1  mrg 		    {
   4750  1.1  mrg 		      gfc_save_backend_locus (&loc);
   4751  1.1  mrg 		      gfc_set_backend_locus (&sym->declared_at);
   4752  1.1  mrg 		      gfc_trans_static_array_pointer (sym);
   4753  1.1  mrg 		      gfc_restore_backend_locus (&loc);
   4754  1.1  mrg 		    }
   4755  1.1  mrg 		  else
   4756  1.1  mrg 		    {
   4757  1.1  mrg 		      seen_trans_deferred_array = true;
   4758  1.1  mrg 		      gfc_trans_deferred_array (sym, block);
   4759  1.1  mrg 		    }
   4760  1.1  mrg 		}
   4761  1.1  mrg 	      else if (sym->attr.codimension
   4762  1.1  mrg 		       && TREE_STATIC (sym->backend_decl))
   4763  1.1  mrg 		{
   4764  1.1  mrg 		  gfc_init_block (&tmpblock);
   4765  1.1  mrg 		  gfc_trans_array_cobounds (TREE_TYPE (sym->backend_decl),
   4766  1.1  mrg 					    &tmpblock, sym);
   4767  1.1  mrg 		  gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
   4768  1.1  mrg 					NULL_TREE);
   4769  1.1  mrg 		  continue;
   4770  1.1  mrg 		}
   4771  1.1  mrg 	      else
   4772  1.1  mrg 		{
   4773  1.1  mrg 		  gfc_save_backend_locus (&loc);
   4774  1.1  mrg 		  gfc_set_backend_locus (&sym->declared_at);
   4775  1.1  mrg 
   4776  1.1  mrg 		  if (alloc_comp_or_fini)
   4777  1.1  mrg 		    {
   4778  1.1  mrg 		      seen_trans_deferred_array = true;
   4779  1.1  mrg 		      gfc_trans_deferred_array (sym, block);
   4780  1.1  mrg 		    }
   4781  1.1  mrg 		  else if (sym->ts.type == BT_DERIVED
   4782  1.1  mrg 			     && sym->value
   4783  1.1  mrg 			     && !sym->attr.data
   4784  1.1  mrg 			     && sym->attr.save == SAVE_NONE)
   4785  1.1  mrg 		    {
   4786  1.1  mrg 		      gfc_start_block (&tmpblock);
   4787  1.1  mrg 		      gfc_init_default_dt (sym, &tmpblock, false);
   4788  1.1  mrg 		      gfc_add_init_cleanup (block,
   4789  1.1  mrg 					    gfc_finish_block (&tmpblock),
   4790  1.1  mrg 					    NULL_TREE);
   4791  1.1  mrg 		    }
   4792  1.1  mrg 
   4793  1.1  mrg 		  gfc_trans_auto_array_allocation (sym->backend_decl,
   4794  1.1  mrg 						   sym, block);
   4795  1.1  mrg 		  gfc_restore_backend_locus (&loc);
   4796  1.1  mrg 		}
   4797  1.1  mrg 	      break;
   4798  1.1  mrg 
   4799  1.1  mrg 	    case AS_ASSUMED_SIZE:
   4800  1.1  mrg 	      /* Must be a dummy parameter.  */
   4801  1.1  mrg 	      gcc_assert (sym->attr.dummy || as->cp_was_assumed);
   4802  1.1  mrg 
   4803  1.1  mrg 	      /* We should always pass assumed size arrays the g77 way.  */
   4804  1.1  mrg 	      if (sym->attr.dummy)
   4805  1.1  mrg 		gfc_trans_g77_array (sym, block);
   4806  1.1  mrg 	      break;
   4807  1.1  mrg 
   4808  1.1  mrg 	    case AS_ASSUMED_SHAPE:
   4809  1.1  mrg 	      /* Must be a dummy parameter.  */
   4810  1.1  mrg 	      gcc_assert (sym->attr.dummy);
   4811  1.1  mrg 
   4812  1.1  mrg 	      gfc_trans_dummy_array_bias (sym, sym->backend_decl, block);
   4813  1.1  mrg 	      break;
   4814  1.1  mrg 
   4815  1.1  mrg 	    case AS_ASSUMED_RANK:
   4816  1.1  mrg 	    case AS_DEFERRED:
   4817  1.1  mrg 	      seen_trans_deferred_array = true;
   4818  1.1  mrg 	      gfc_trans_deferred_array (sym, block);
   4819  1.1  mrg 	      if (sym->ts.type == BT_CHARACTER && sym->ts.deferred
   4820  1.1  mrg 		  && sym->attr.result)
   4821  1.1  mrg 		{
   4822  1.1  mrg 		  gfc_start_block (&init);
   4823  1.1  mrg 		  gfc_save_backend_locus (&loc);
   4824  1.1  mrg 		  gfc_set_backend_locus (&sym->declared_at);
   4825  1.1  mrg 		  tmp = gfc_null_and_pass_deferred_len (sym, &init, &loc);
   4826  1.1  mrg 		  gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
   4827  1.1  mrg 		}
   4828  1.1  mrg 	      break;
   4829  1.1  mrg 
   4830  1.1  mrg 	    default:
   4831  1.1  mrg 	      gcc_unreachable ();
   4832  1.1  mrg 	    }
   4833  1.1  mrg 	  if (alloc_comp_or_fini && !seen_trans_deferred_array)
   4834  1.1  mrg 	    gfc_trans_deferred_array (sym, block);
   4835  1.1  mrg 	}
   4836  1.1  mrg       else if ((!sym->attr.dummy || sym->ts.deferred)
   4837  1.1  mrg 		&& (sym->ts.type == BT_CLASS
   4838  1.1  mrg 		&& CLASS_DATA (sym)->attr.class_pointer))
   4839  1.1  mrg 	gfc_trans_class_array (sym, block);
   4840  1.1  mrg       else if ((!sym->attr.dummy || sym->ts.deferred)
   4841  1.1  mrg 		&& (sym->attr.allocatable
   4842  1.1  mrg 		    || (sym->attr.pointer && sym->attr.result)
   4843  1.1  mrg 		    || (sym->ts.type == BT_CLASS
   4844  1.1  mrg 			&& CLASS_DATA (sym)->attr.allocatable)))
   4845  1.1  mrg 	{
   4846  1.1  mrg 	  if (!sym->attr.save && flag_max_stack_var_size != 0)
   4847  1.1  mrg 	    {
   4848  1.1  mrg 	      tree descriptor = NULL_TREE;
   4849  1.1  mrg 
   4850  1.1  mrg 	      gfc_save_backend_locus (&loc);
   4851  1.1  mrg 	      gfc_set_backend_locus (&sym->declared_at);
   4852  1.1  mrg 	      gfc_start_block (&init);
   4853  1.1  mrg 
   4854  1.1  mrg 	      if (sym->ts.type == BT_CHARACTER
   4855  1.1  mrg 		  && sym->attr.allocatable
   4856  1.1  mrg 		  && !sym->attr.dimension
   4857  1.1  mrg 		  && sym->ts.u.cl && sym->ts.u.cl->length
   4858  1.1  mrg 		  && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE)
   4859  1.1  mrg 		gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
   4860  1.1  mrg 
   4861  1.1  mrg 	      if (!sym->attr.pointer)
   4862  1.1  mrg 		{
   4863  1.1  mrg 		  /* Nullify and automatic deallocation of allocatable
   4864  1.1  mrg 		     scalars.  */
   4865  1.1  mrg 		  e = gfc_lval_expr_from_sym (sym);
   4866  1.1  mrg 		  if (sym->ts.type == BT_CLASS)
   4867  1.1  mrg 		    gfc_add_data_component (e);
   4868  1.1  mrg 
   4869  1.1  mrg 		  gfc_init_se (&se, NULL);
   4870  1.1  mrg 		  if (sym->ts.type != BT_CLASS
   4871  1.1  mrg 		      || sym->ts.u.derived->attr.dimension
   4872  1.1  mrg 		      || sym->ts.u.derived->attr.codimension)
   4873  1.1  mrg 		    {
   4874  1.1  mrg 		      se.want_pointer = 1;
   4875  1.1  mrg 		      gfc_conv_expr (&se, e);
   4876  1.1  mrg 		    }
   4877  1.1  mrg 		  else if (sym->ts.type == BT_CLASS
   4878  1.1  mrg 			   && !CLASS_DATA (sym)->attr.dimension
   4879  1.1  mrg 			   && !CLASS_DATA (sym)->attr.codimension)
   4880  1.1  mrg 		    {
   4881  1.1  mrg 		      se.want_pointer = 1;
   4882  1.1  mrg 		      gfc_conv_expr (&se, e);
   4883  1.1  mrg 		    }
   4884  1.1  mrg 		  else
   4885  1.1  mrg 		    {
   4886  1.1  mrg 		      se.descriptor_only = 1;
   4887  1.1  mrg 		      gfc_conv_expr (&se, e);
   4888  1.1  mrg 		      descriptor = se.expr;
   4889  1.1  mrg 		      se.expr = gfc_conv_descriptor_data_addr (se.expr);
   4890  1.1  mrg 		      se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
   4891  1.1  mrg 		    }
   4892  1.1  mrg 		  gfc_free_expr (e);
   4893  1.1  mrg 
   4894  1.1  mrg 		  if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
   4895  1.1  mrg 		    {
   4896  1.1  mrg 		      /* Nullify when entering the scope.  */
   4897  1.1  mrg 		      tmp = fold_build2_loc (input_location, MODIFY_EXPR,
   4898  1.1  mrg 					     TREE_TYPE (se.expr), se.expr,
   4899  1.1  mrg 					     fold_convert (TREE_TYPE (se.expr),
   4900  1.1  mrg 							   null_pointer_node));
   4901  1.1  mrg 		      if (sym->attr.optional)
   4902  1.1  mrg 			{
   4903  1.1  mrg 			  tree present = gfc_conv_expr_present (sym);
   4904  1.1  mrg 			  tmp = build3_loc (input_location, COND_EXPR,
   4905  1.1  mrg 					    void_type_node, present, tmp,
   4906  1.1  mrg 					    build_empty_stmt (input_location));
   4907  1.1  mrg 			}
   4908  1.1  mrg 		      gfc_add_expr_to_block (&init, tmp);
   4909  1.1  mrg 		    }
   4910  1.1  mrg 		}
   4911  1.1  mrg 
   4912  1.1  mrg 	      if ((sym->attr.dummy || sym->attr.result)
   4913  1.1  mrg 		    && sym->ts.type == BT_CHARACTER
   4914  1.1  mrg 		    && sym->ts.deferred
   4915  1.1  mrg 		    && sym->ts.u.cl->passed_length)
   4916  1.1  mrg 		tmp = gfc_null_and_pass_deferred_len (sym, &init, &loc);
   4917  1.1  mrg 	      else
   4918  1.1  mrg 		{
   4919  1.1  mrg 		  gfc_restore_backend_locus (&loc);
   4920  1.1  mrg 		  tmp = NULL_TREE;
   4921  1.1  mrg 		}
   4922  1.1  mrg 
   4923  1.1  mrg 	      /* Initialize descriptor's TKR information.  */
   4924  1.1  mrg 	      if (sym->ts.type == BT_CLASS)
   4925  1.1  mrg 		gfc_trans_class_array (sym, block);
   4926  1.1  mrg 
   4927  1.1  mrg 	      /* Deallocate when leaving the scope. Nullifying is not
   4928  1.1  mrg 		 needed.  */
   4929  1.1  mrg 	      if (!sym->attr.result && !sym->attr.dummy && !sym->attr.pointer
   4930  1.1  mrg 		  && !sym->ns->proc_name->attr.is_main_program)
   4931  1.1  mrg 		{
   4932  1.1  mrg 		  if (sym->ts.type == BT_CLASS
   4933  1.1  mrg 		      && CLASS_DATA (sym)->attr.codimension)
   4934  1.1  mrg 		    tmp = gfc_deallocate_with_status (descriptor, NULL_TREE,
   4935  1.1  mrg 						      NULL_TREE, NULL_TREE,
   4936  1.1  mrg 						      NULL_TREE, true, NULL,
   4937  1.1  mrg 						      GFC_CAF_COARRAY_ANALYZE);
   4938  1.1  mrg 		  else
   4939  1.1  mrg 		    {
   4940  1.1  mrg 		      gfc_expr *expr = gfc_lval_expr_from_sym (sym);
   4941  1.1  mrg 		      tmp = gfc_deallocate_scalar_with_status (se.expr,
   4942  1.1  mrg 							       NULL_TREE,
   4943  1.1  mrg 							       NULL_TREE,
   4944  1.1  mrg 							       true, expr,
   4945  1.1  mrg 							       sym->ts);
   4946  1.1  mrg 		      gfc_free_expr (expr);
   4947  1.1  mrg 		    }
   4948  1.1  mrg 		}
   4949  1.1  mrg 
   4950  1.1  mrg 	      if (sym->ts.type == BT_CLASS)
   4951  1.1  mrg 		{
   4952  1.1  mrg 		  /* Initialize _vptr to declared type.  */
   4953  1.1  mrg 		  gfc_symbol *vtab;
   4954  1.1  mrg 		  tree rhs;
   4955  1.1  mrg 
   4956  1.1  mrg 		  gfc_save_backend_locus (&loc);
   4957  1.1  mrg 		  gfc_set_backend_locus (&sym->declared_at);
   4958  1.1  mrg 		  e = gfc_lval_expr_from_sym (sym);
   4959  1.1  mrg 		  gfc_add_vptr_component (e);
   4960  1.1  mrg 		  gfc_init_se (&se, NULL);
   4961  1.1  mrg 		  se.want_pointer = 1;
   4962  1.1  mrg 		  gfc_conv_expr (&se, e);
   4963  1.1  mrg 		  gfc_free_expr (e);
   4964  1.1  mrg 		  if (UNLIMITED_POLY (sym))
   4965  1.1  mrg 		    rhs = build_int_cst (TREE_TYPE (se.expr), 0);
   4966  1.1  mrg 		  else
   4967  1.1  mrg 		    {
   4968  1.1  mrg 		      vtab = gfc_find_derived_vtab (sym->ts.u.derived);
   4969  1.1  mrg 		      rhs = gfc_build_addr_expr (TREE_TYPE (se.expr),
   4970  1.1  mrg 						gfc_get_symbol_decl (vtab));
   4971  1.1  mrg 		    }
   4972  1.1  mrg 		  gfc_add_modify (&init, se.expr, rhs);
   4973  1.1  mrg 		  gfc_restore_backend_locus (&loc);
   4974  1.1  mrg 		}
   4975  1.1  mrg 
   4976  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
   4977  1.1  mrg 	    }
   4978  1.1  mrg 	}
   4979  1.1  mrg       else if (sym->ts.type == BT_CHARACTER && sym->ts.deferred)
   4980  1.1  mrg 	{
   4981  1.1  mrg 	  tree tmp = NULL;
   4982  1.1  mrg 	  stmtblock_t init;
   4983  1.1  mrg 
   4984  1.1  mrg 	  /* If we get to here, all that should be left are pointers.  */
   4985  1.1  mrg 	  gcc_assert (sym->attr.pointer);
   4986  1.1  mrg 
   4987  1.1  mrg 	  if (sym->attr.dummy)
   4988  1.1  mrg 	    {
   4989  1.1  mrg 	      gfc_start_block (&init);
   4990  1.1  mrg 	      gfc_save_backend_locus (&loc);
   4991  1.1  mrg 	      gfc_set_backend_locus (&sym->declared_at);
   4992  1.1  mrg 	      tmp = gfc_null_and_pass_deferred_len (sym, &init, &loc);
   4993  1.1  mrg 	      gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp);
   4994  1.1  mrg 	    }
   4995  1.1  mrg 	}
   4996  1.1  mrg       else if (sym->ts.deferred)
   4997  1.1  mrg 	gfc_fatal_error ("Deferred type parameter not yet supported");
   4998  1.1  mrg       else if (alloc_comp_or_fini)
   4999  1.1  mrg 	gfc_trans_deferred_array (sym, block);
   5000  1.1  mrg       else if (sym->ts.type == BT_CHARACTER)
   5001  1.1  mrg 	{
   5002  1.1  mrg 	  gfc_save_backend_locus (&loc);
   5003  1.1  mrg 	  gfc_set_backend_locus (&sym->declared_at);
   5004  1.1  mrg 	  if (sym->attr.dummy || sym->attr.result)
   5005  1.1  mrg 	    gfc_trans_dummy_character (sym, sym->ts.u.cl, block);
   5006  1.1  mrg 	  else
   5007  1.1  mrg 	    gfc_trans_auto_character_variable (sym, block);
   5008  1.1  mrg 	  gfc_restore_backend_locus (&loc);
   5009  1.1  mrg 	}
   5010  1.1  mrg       else if (sym->attr.assign)
   5011  1.1  mrg 	{
   5012  1.1  mrg 	  gfc_save_backend_locus (&loc);
   5013  1.1  mrg 	  gfc_set_backend_locus (&sym->declared_at);
   5014  1.1  mrg 	  gfc_trans_assign_aux_var (sym, block);
   5015  1.1  mrg 	  gfc_restore_backend_locus (&loc);
   5016  1.1  mrg 	}
   5017  1.1  mrg       else if (sym->ts.type == BT_DERIVED
   5018  1.1  mrg 		 && sym->value
   5019  1.1  mrg 		 && !sym->attr.data
   5020  1.1  mrg 		 && sym->attr.save == SAVE_NONE)
   5021  1.1  mrg 	{
   5022  1.1  mrg 	  gfc_start_block (&tmpblock);
   5023  1.1  mrg 	  gfc_init_default_dt (sym, &tmpblock, false);
   5024  1.1  mrg 	  gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock),
   5025  1.1  mrg 				NULL_TREE);
   5026  1.1  mrg 	}
   5027  1.1  mrg       else if (!(UNLIMITED_POLY(sym)) && !is_pdt_type)
   5028  1.1  mrg 	gcc_unreachable ();
   5029  1.1  mrg     }
   5030  1.1  mrg 
   5031  1.1  mrg   gfc_init_block (&tmpblock);
   5032  1.1  mrg 
   5033  1.1  mrg   for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next)
   5034  1.1  mrg     {
   5035  1.1  mrg       if (f->sym && f->sym->tlink == NULL && f->sym->ts.type == BT_CHARACTER
   5036  1.1  mrg 	  && f->sym->ts.u.cl->backend_decl)
   5037  1.1  mrg 	{
   5038  1.1  mrg 	  if (TREE_CODE (f->sym->ts.u.cl->backend_decl) == PARM_DECL)
   5039  1.1  mrg 	    gfc_trans_vla_type_sizes (f->sym, &tmpblock);
   5040  1.1  mrg 	}
   5041  1.1  mrg     }
   5042  1.1  mrg 
   5043  1.1  mrg   if (gfc_return_by_reference (proc_sym) && proc_sym->ts.type == BT_CHARACTER
   5044  1.1  mrg       && current_fake_result_decl != NULL)
   5045  1.1  mrg     {
   5046  1.1  mrg       gcc_assert (proc_sym->ts.u.cl->backend_decl != NULL);
   5047  1.1  mrg       if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == PARM_DECL)
   5048  1.1  mrg 	gfc_trans_vla_type_sizes (proc_sym, &tmpblock);
   5049  1.1  mrg     }
   5050  1.1  mrg 
   5051  1.1  mrg   gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), NULL_TREE);
   5052  1.1  mrg }
   5053  1.1  mrg 
   5054  1.1  mrg 
   5055  1.1  mrg struct module_hasher : ggc_ptr_hash<module_htab_entry>
   5056  1.1  mrg {
   5057  1.1  mrg   typedef const char *compare_type;
   5058  1.1  mrg 
   5059  1.1  mrg   static hashval_t hash (module_htab_entry *s)
   5060  1.1  mrg   {
   5061  1.1  mrg     return htab_hash_string (s->name);
   5062  1.1  mrg   }
   5063  1.1  mrg 
   5064  1.1  mrg   static bool
   5065  1.1  mrg   equal (module_htab_entry *a, const char *b)
   5066  1.1  mrg   {
   5067  1.1  mrg     return !strcmp (a->name, b);
   5068  1.1  mrg   }
   5069  1.1  mrg };
   5070  1.1  mrg 
   5071  1.1  mrg static GTY (()) hash_table<module_hasher> *module_htab;
   5072  1.1  mrg 
   5073  1.1  mrg /* Hash and equality functions for module_htab's decls.  */
   5074  1.1  mrg 
   5075  1.1  mrg hashval_t
   5076  1.1  mrg module_decl_hasher::hash (tree t)
   5077  1.1  mrg {
   5078  1.1  mrg   const_tree n = DECL_NAME (t);
   5079  1.1  mrg   if (n == NULL_TREE)
   5080  1.1  mrg     n = TYPE_NAME (TREE_TYPE (t));
   5081  1.1  mrg   return htab_hash_string (IDENTIFIER_POINTER (n));
   5082  1.1  mrg }
   5083  1.1  mrg 
   5084  1.1  mrg bool
   5085  1.1  mrg module_decl_hasher::equal (tree t1, const char *x2)
   5086  1.1  mrg {
   5087  1.1  mrg   const_tree n1 = DECL_NAME (t1);
   5088  1.1  mrg   if (n1 == NULL_TREE)
   5089  1.1  mrg     n1 = TYPE_NAME (TREE_TYPE (t1));
   5090  1.1  mrg   return strcmp (IDENTIFIER_POINTER (n1), x2) == 0;
   5091  1.1  mrg }
   5092  1.1  mrg 
   5093  1.1  mrg struct module_htab_entry *
   5094  1.1  mrg gfc_find_module (const char *name)
   5095  1.1  mrg {
   5096  1.1  mrg   if (! module_htab)
   5097  1.1  mrg     module_htab = hash_table<module_hasher>::create_ggc (10);
   5098  1.1  mrg 
   5099  1.1  mrg   module_htab_entry **slot
   5100  1.1  mrg     = module_htab->find_slot_with_hash (name, htab_hash_string (name), INSERT);
   5101  1.1  mrg   if (*slot == NULL)
   5102  1.1  mrg     {
   5103  1.1  mrg       module_htab_entry *entry = ggc_cleared_alloc<module_htab_entry> ();
   5104  1.1  mrg 
   5105  1.1  mrg       entry->name = gfc_get_string ("%s", name);
   5106  1.1  mrg       entry->decls = hash_table<module_decl_hasher>::create_ggc (10);
   5107  1.1  mrg       *slot = entry;
   5108  1.1  mrg     }
   5109  1.1  mrg   return *slot;
   5110  1.1  mrg }
   5111  1.1  mrg 
   5112  1.1  mrg void
   5113  1.1  mrg gfc_module_add_decl (struct module_htab_entry *entry, tree decl)
   5114  1.1  mrg {
   5115  1.1  mrg   const char *name;
   5116  1.1  mrg 
   5117  1.1  mrg   if (DECL_NAME (decl))
   5118  1.1  mrg     name = IDENTIFIER_POINTER (DECL_NAME (decl));
   5119  1.1  mrg   else
   5120  1.1  mrg     {
   5121  1.1  mrg       gcc_assert (TREE_CODE (decl) == TYPE_DECL);
   5122  1.1  mrg       name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl)));
   5123  1.1  mrg     }
   5124  1.1  mrg   tree *slot
   5125  1.1  mrg     = entry->decls->find_slot_with_hash (name, htab_hash_string (name),
   5126  1.1  mrg 					 INSERT);
   5127  1.1  mrg   if (*slot == NULL)
   5128  1.1  mrg     *slot = decl;
   5129  1.1  mrg }
   5130  1.1  mrg 
   5131  1.1  mrg 
   5132  1.1  mrg /* Generate debugging symbols for namelists. This function must come after
   5133  1.1  mrg    generate_local_decl to ensure that the variables in the namelist are
   5134  1.1  mrg    already declared.  */
   5135  1.1  mrg 
   5136  1.1  mrg static tree
   5137  1.1  mrg generate_namelist_decl (gfc_symbol * sym)
   5138  1.1  mrg {
   5139  1.1  mrg   gfc_namelist *nml;
   5140  1.1  mrg   tree decl;
   5141  1.1  mrg   vec<constructor_elt, va_gc> *nml_decls = NULL;
   5142  1.1  mrg 
   5143  1.1  mrg   gcc_assert (sym->attr.flavor == FL_NAMELIST);
   5144  1.1  mrg   for (nml = sym->namelist; nml; nml = nml->next)
   5145  1.1  mrg     {
   5146  1.1  mrg       if (nml->sym->backend_decl == NULL_TREE)
   5147  1.1  mrg 	{
   5148  1.1  mrg 	  nml->sym->attr.referenced = 1;
   5149  1.1  mrg 	  nml->sym->backend_decl = gfc_get_symbol_decl (nml->sym);
   5150  1.1  mrg 	}
   5151  1.1  mrg       DECL_IGNORED_P (nml->sym->backend_decl) = 0;
   5152  1.1  mrg       CONSTRUCTOR_APPEND_ELT (nml_decls, NULL_TREE, nml->sym->backend_decl);
   5153  1.1  mrg     }
   5154  1.1  mrg 
   5155  1.1  mrg   decl = make_node (NAMELIST_DECL);
   5156  1.1  mrg   TREE_TYPE (decl) = void_type_node;
   5157  1.1  mrg   NAMELIST_DECL_ASSOCIATED_DECL (decl) = build_constructor (NULL_TREE, nml_decls);
   5158  1.1  mrg   DECL_NAME (decl) = get_identifier (sym->name);
   5159  1.1  mrg   return decl;
   5160  1.1  mrg }
   5161  1.1  mrg 
   5162  1.1  mrg 
   5163  1.1  mrg /* Output an initialized decl for a module variable.  */
   5164  1.1  mrg 
   5165  1.1  mrg static void
   5166  1.1  mrg gfc_create_module_variable (gfc_symbol * sym)
   5167  1.1  mrg {
   5168  1.1  mrg   tree decl;
   5169  1.1  mrg 
   5170  1.1  mrg   /* Module functions with alternate entries are dealt with later and
   5171  1.1  mrg      would get caught by the next condition.  */
   5172  1.1  mrg   if (sym->attr.entry)
   5173  1.1  mrg     return;
   5174  1.1  mrg 
   5175  1.1  mrg   /* Make sure we convert the types of the derived types from iso_c_binding
   5176  1.1  mrg      into (void *).  */
   5177  1.1  mrg   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
   5178  1.1  mrg       && sym->ts.type == BT_DERIVED)
   5179  1.1  mrg     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
   5180  1.1  mrg 
   5181  1.1  mrg   if (gfc_fl_struct (sym->attr.flavor)
   5182  1.1  mrg       && sym->backend_decl
   5183  1.1  mrg       && TREE_CODE (sym->backend_decl) == RECORD_TYPE)
   5184  1.1  mrg     {
   5185  1.1  mrg       decl = sym->backend_decl;
   5186  1.1  mrg       gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
   5187  1.1  mrg 
   5188  1.1  mrg       if (!sym->attr.use_assoc && !sym->attr.used_in_submodule)
   5189  1.1  mrg 	{
   5190  1.1  mrg 	  gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE
   5191  1.1  mrg 		      || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl);
   5192  1.1  mrg 	  gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE
   5193  1.1  mrg 		      || DECL_CONTEXT (TYPE_STUB_DECL (decl))
   5194  1.1  mrg 			   == sym->ns->proc_name->backend_decl);
   5195  1.1  mrg 	}
   5196  1.1  mrg       TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   5197  1.1  mrg       DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl;
   5198  1.1  mrg       gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl));
   5199  1.1  mrg     }
   5200  1.1  mrg 
   5201  1.1  mrg   /* Only output variables, procedure pointers and array valued,
   5202  1.1  mrg      or derived type, parameters.  */
   5203  1.1  mrg   if (sym->attr.flavor != FL_VARIABLE
   5204  1.1  mrg 	&& !(sym->attr.flavor == FL_PARAMETER
   5205  1.1  mrg 	       && (sym->attr.dimension || sym->ts.type == BT_DERIVED))
   5206  1.1  mrg 	&& !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
   5207  1.1  mrg     return;
   5208  1.1  mrg 
   5209  1.1  mrg   if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl)
   5210  1.1  mrg     {
   5211  1.1  mrg       decl = sym->backend_decl;
   5212  1.1  mrg       gcc_assert (DECL_FILE_SCOPE_P (decl));
   5213  1.1  mrg       gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
   5214  1.1  mrg       DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   5215  1.1  mrg       gfc_module_add_decl (cur_module, decl);
   5216  1.1  mrg     }
   5217  1.1  mrg 
   5218  1.1  mrg   /* Don't generate variables from other modules. Variables from
   5219  1.1  mrg      COMMONs and Cray pointees will already have been generated.  */
   5220  1.1  mrg   if (sym->attr.use_assoc || sym->attr.used_in_submodule
   5221  1.1  mrg       || sym->attr.in_common || sym->attr.cray_pointee)
   5222  1.1  mrg     return;
   5223  1.1  mrg 
   5224  1.1  mrg   /* Equivalenced variables arrive here after creation.  */
   5225  1.1  mrg   if (sym->backend_decl
   5226  1.1  mrg       && (sym->equiv_built || sym->attr.in_equivalence))
   5227  1.1  mrg     return;
   5228  1.1  mrg 
   5229  1.1  mrg   if (sym->backend_decl && !sym->attr.vtab && !sym->attr.target)
   5230  1.1  mrg     gfc_internal_error ("backend decl for module variable %qs already exists",
   5231  1.1  mrg 			sym->name);
   5232  1.1  mrg 
   5233  1.1  mrg   if (sym->module && !sym->attr.result && !sym->attr.dummy
   5234  1.1  mrg       && (sym->attr.access == ACCESS_UNKNOWN
   5235  1.1  mrg 	  && (sym->ns->default_access == ACCESS_PRIVATE
   5236  1.1  mrg 	      || (sym->ns->default_access == ACCESS_UNKNOWN
   5237  1.1  mrg 		  && flag_module_private))))
   5238  1.1  mrg     sym->attr.access = ACCESS_PRIVATE;
   5239  1.1  mrg 
   5240  1.1  mrg   if (warn_unused_variable && !sym->attr.referenced
   5241  1.1  mrg       && sym->attr.access == ACCESS_PRIVATE)
   5242  1.1  mrg     gfc_warning (OPT_Wunused_value,
   5243  1.1  mrg 		 "Unused PRIVATE module variable %qs declared at %L",
   5244  1.1  mrg 		 sym->name, &sym->declared_at);
   5245  1.1  mrg 
   5246  1.1  mrg   /* We always want module variables to be created.  */
   5247  1.1  mrg   sym->attr.referenced = 1;
   5248  1.1  mrg   /* Create the decl.  */
   5249  1.1  mrg   decl = gfc_get_symbol_decl (sym);
   5250  1.1  mrg 
   5251  1.1  mrg   /* Create the variable.  */
   5252  1.1  mrg   pushdecl (decl);
   5253  1.1  mrg   gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE
   5254  1.1  mrg 	      || ((sym->ns->parent->proc_name->attr.flavor == FL_MODULE
   5255  1.1  mrg 		   || sym->ns->parent->proc_name->attr.flavor == FL_PROCEDURE)
   5256  1.1  mrg 		  && sym->fn_result_spec));
   5257  1.1  mrg   DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   5258  1.1  mrg   rest_of_decl_compilation (decl, 1, 0);
   5259  1.1  mrg   gfc_module_add_decl (cur_module, decl);
   5260  1.1  mrg 
   5261  1.1  mrg   /* Also add length of strings.  */
   5262  1.1  mrg   if (sym->ts.type == BT_CHARACTER)
   5263  1.1  mrg     {
   5264  1.1  mrg       tree length;
   5265  1.1  mrg 
   5266  1.1  mrg       length = sym->ts.u.cl->backend_decl;
   5267  1.1  mrg       gcc_assert (length || sym->attr.proc_pointer);
   5268  1.1  mrg       if (length && !INTEGER_CST_P (length))
   5269  1.1  mrg         {
   5270  1.1  mrg           pushdecl (length);
   5271  1.1  mrg           rest_of_decl_compilation (length, 1, 0);
   5272  1.1  mrg         }
   5273  1.1  mrg     }
   5274  1.1  mrg 
   5275  1.1  mrg   if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
   5276  1.1  mrg       && sym->attr.referenced && !sym->attr.use_assoc)
   5277  1.1  mrg     has_coarray_vars = true;
   5278  1.1  mrg }
   5279  1.1  mrg 
   5280  1.1  mrg /* Emit debug information for USE statements.  */
   5281  1.1  mrg 
   5282  1.1  mrg static void
   5283  1.1  mrg gfc_trans_use_stmts (gfc_namespace * ns)
   5284  1.1  mrg {
   5285  1.1  mrg   gfc_use_list *use_stmt;
   5286  1.1  mrg   for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next)
   5287  1.1  mrg     {
   5288  1.1  mrg       struct module_htab_entry *entry
   5289  1.1  mrg 	= gfc_find_module (use_stmt->module_name);
   5290  1.1  mrg       gfc_use_rename *rent;
   5291  1.1  mrg 
   5292  1.1  mrg       if (entry->namespace_decl == NULL)
   5293  1.1  mrg 	{
   5294  1.1  mrg 	  entry->namespace_decl
   5295  1.1  mrg 	    = build_decl (input_location,
   5296  1.1  mrg 			  NAMESPACE_DECL,
   5297  1.1  mrg 			  get_identifier (use_stmt->module_name),
   5298  1.1  mrg 			  void_type_node);
   5299  1.1  mrg 	  DECL_EXTERNAL (entry->namespace_decl) = 1;
   5300  1.1  mrg 	}
   5301  1.1  mrg       gfc_set_backend_locus (&use_stmt->where);
   5302  1.1  mrg       if (!use_stmt->only_flag)
   5303  1.1  mrg 	(*debug_hooks->imported_module_or_decl) (entry->namespace_decl,
   5304  1.1  mrg 						 NULL_TREE,
   5305  1.1  mrg 						 ns->proc_name->backend_decl,
   5306  1.1  mrg 						 false, false);
   5307  1.1  mrg       for (rent = use_stmt->rename; rent; rent = rent->next)
   5308  1.1  mrg 	{
   5309  1.1  mrg 	  tree decl, local_name;
   5310  1.1  mrg 
   5311  1.1  mrg 	  if (rent->op != INTRINSIC_NONE)
   5312  1.1  mrg 	    continue;
   5313  1.1  mrg 
   5314  1.1  mrg 						 hashval_t hash = htab_hash_string (rent->use_name);
   5315  1.1  mrg 	  tree *slot = entry->decls->find_slot_with_hash (rent->use_name, hash,
   5316  1.1  mrg 							  INSERT);
   5317  1.1  mrg 	  if (*slot == NULL)
   5318  1.1  mrg 	    {
   5319  1.1  mrg 	      gfc_symtree *st;
   5320  1.1  mrg 
   5321  1.1  mrg 	      st = gfc_find_symtree (ns->sym_root,
   5322  1.1  mrg 				     rent->local_name[0]
   5323  1.1  mrg 				     ? rent->local_name : rent->use_name);
   5324  1.1  mrg 
   5325  1.1  mrg 	      /* The following can happen if a derived type is renamed.  */
   5326  1.1  mrg 	      if (!st)
   5327  1.1  mrg 		{
   5328  1.1  mrg 		  char *name;
   5329  1.1  mrg 		  name = xstrdup (rent->local_name[0]
   5330  1.1  mrg 				  ? rent->local_name : rent->use_name);
   5331  1.1  mrg 		  name[0] = (char) TOUPPER ((unsigned char) name[0]);
   5332  1.1  mrg 		  st = gfc_find_symtree (ns->sym_root, name);
   5333  1.1  mrg 		  free (name);
   5334  1.1  mrg 		  gcc_assert (st);
   5335  1.1  mrg 		}
   5336  1.1  mrg 
   5337  1.1  mrg 	      /* Sometimes, generic interfaces wind up being over-ruled by a
   5338  1.1  mrg 		 local symbol (see PR41062).  */
   5339  1.1  mrg 	      if (!st->n.sym->attr.use_assoc)
   5340  1.1  mrg 		{
   5341  1.1  mrg 		  *slot = error_mark_node;
   5342  1.1  mrg 		  entry->decls->clear_slot (slot);
   5343  1.1  mrg 		  continue;
   5344  1.1  mrg 		}
   5345  1.1  mrg 
   5346  1.1  mrg 	      if (st->n.sym->backend_decl
   5347  1.1  mrg 		  && DECL_P (st->n.sym->backend_decl)
   5348  1.1  mrg 		  && st->n.sym->module
   5349  1.1  mrg 		  && strcmp (st->n.sym->module, use_stmt->module_name) == 0)
   5350  1.1  mrg 		{
   5351  1.1  mrg 		  gcc_assert (DECL_EXTERNAL (entry->namespace_decl)
   5352  1.1  mrg 			      || !VAR_P (st->n.sym->backend_decl));
   5353  1.1  mrg 		  decl = copy_node (st->n.sym->backend_decl);
   5354  1.1  mrg 		  DECL_CONTEXT (decl) = entry->namespace_decl;
   5355  1.1  mrg 		  DECL_EXTERNAL (decl) = 1;
   5356  1.1  mrg 		  DECL_IGNORED_P (decl) = 0;
   5357  1.1  mrg 		  DECL_INITIAL (decl) = NULL_TREE;
   5358  1.1  mrg 		}
   5359  1.1  mrg 	      else if (st->n.sym->attr.flavor == FL_NAMELIST
   5360  1.1  mrg 		       && st->n.sym->attr.use_only
   5361  1.1  mrg 		       && st->n.sym->module
   5362  1.1  mrg 		       && strcmp (st->n.sym->module, use_stmt->module_name)
   5363  1.1  mrg 			  == 0)
   5364  1.1  mrg 		{
   5365  1.1  mrg 		  decl = generate_namelist_decl (st->n.sym);
   5366  1.1  mrg 		  DECL_CONTEXT (decl) = entry->namespace_decl;
   5367  1.1  mrg 		  DECL_EXTERNAL (decl) = 1;
   5368  1.1  mrg 		  DECL_IGNORED_P (decl) = 0;
   5369  1.1  mrg 		  DECL_INITIAL (decl) = NULL_TREE;
   5370  1.1  mrg 		}
   5371  1.1  mrg 	      else
   5372  1.1  mrg 		{
   5373  1.1  mrg 		  *slot = error_mark_node;
   5374  1.1  mrg 		  entry->decls->clear_slot (slot);
   5375  1.1  mrg 		  continue;
   5376  1.1  mrg 		}
   5377  1.1  mrg 	      *slot = decl;
   5378  1.1  mrg 	    }
   5379  1.1  mrg 	  decl = (tree) *slot;
   5380  1.1  mrg 	  if (rent->local_name[0])
   5381  1.1  mrg 	    local_name = get_identifier (rent->local_name);
   5382  1.1  mrg 	  else
   5383  1.1  mrg 	    local_name = NULL_TREE;
   5384  1.1  mrg 	  gfc_set_backend_locus (&rent->where);
   5385  1.1  mrg 	  (*debug_hooks->imported_module_or_decl) (decl, local_name,
   5386  1.1  mrg 						   ns->proc_name->backend_decl,
   5387  1.1  mrg 						   !use_stmt->only_flag,
   5388  1.1  mrg 						   false);
   5389  1.1  mrg 	}
   5390  1.1  mrg     }
   5391  1.1  mrg }
   5392  1.1  mrg 
   5393  1.1  mrg 
   5394  1.1  mrg /* Return true if expr is a constant initializer that gfc_conv_initializer
   5395  1.1  mrg    will handle.  */
   5396  1.1  mrg 
   5397  1.1  mrg static bool
   5398  1.1  mrg check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array,
   5399  1.1  mrg 			    bool pointer)
   5400  1.1  mrg {
   5401  1.1  mrg   gfc_constructor *c;
   5402  1.1  mrg   gfc_component *cm;
   5403  1.1  mrg 
   5404  1.1  mrg   if (pointer)
   5405  1.1  mrg     return true;
   5406  1.1  mrg   else if (array)
   5407  1.1  mrg     {
   5408  1.1  mrg       if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL)
   5409  1.1  mrg 	return true;
   5410  1.1  mrg       else if (expr->expr_type == EXPR_STRUCTURE)
   5411  1.1  mrg 	return check_constant_initializer (expr, ts, false, false);
   5412  1.1  mrg       else if (expr->expr_type != EXPR_ARRAY)
   5413  1.1  mrg 	return false;
   5414  1.1  mrg       for (c = gfc_constructor_first (expr->value.constructor);
   5415  1.1  mrg 	   c; c = gfc_constructor_next (c))
   5416  1.1  mrg 	{
   5417  1.1  mrg 	  if (c->iterator)
   5418  1.1  mrg 	    return false;
   5419  1.1  mrg 	  if (c->expr->expr_type == EXPR_STRUCTURE)
   5420  1.1  mrg 	    {
   5421  1.1  mrg 	      if (!check_constant_initializer (c->expr, ts, false, false))
   5422  1.1  mrg 		return false;
   5423  1.1  mrg 	    }
   5424  1.1  mrg 	  else if (c->expr->expr_type != EXPR_CONSTANT)
   5425  1.1  mrg 	    return false;
   5426  1.1  mrg 	}
   5427  1.1  mrg       return true;
   5428  1.1  mrg     }
   5429  1.1  mrg   else switch (ts->type)
   5430  1.1  mrg     {
   5431  1.1  mrg     case_bt_struct:
   5432  1.1  mrg       if (expr->expr_type != EXPR_STRUCTURE)
   5433  1.1  mrg 	return false;
   5434  1.1  mrg       cm = expr->ts.u.derived->components;
   5435  1.1  mrg       for (c = gfc_constructor_first (expr->value.constructor);
   5436  1.1  mrg 	   c; c = gfc_constructor_next (c), cm = cm->next)
   5437  1.1  mrg 	{
   5438  1.1  mrg 	  if (!c->expr || cm->attr.allocatable)
   5439  1.1  mrg 	    continue;
   5440  1.1  mrg 	  if (!check_constant_initializer (c->expr, &cm->ts,
   5441  1.1  mrg 					   cm->attr.dimension,
   5442  1.1  mrg 					   cm->attr.pointer))
   5443  1.1  mrg 	    return false;
   5444  1.1  mrg 	}
   5445  1.1  mrg       return true;
   5446  1.1  mrg     default:
   5447  1.1  mrg       return expr->expr_type == EXPR_CONSTANT;
   5448  1.1  mrg     }
   5449  1.1  mrg }
   5450  1.1  mrg 
   5451  1.1  mrg /* Emit debug info for parameters and unreferenced variables with
   5452  1.1  mrg    initializers.  */
   5453  1.1  mrg 
   5454  1.1  mrg static void
   5455  1.1  mrg gfc_emit_parameter_debug_info (gfc_symbol *sym)
   5456  1.1  mrg {
   5457  1.1  mrg   tree decl;
   5458  1.1  mrg 
   5459  1.1  mrg   if (sym->attr.flavor != FL_PARAMETER
   5460  1.1  mrg       && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced))
   5461  1.1  mrg     return;
   5462  1.1  mrg 
   5463  1.1  mrg   if (sym->backend_decl != NULL
   5464  1.1  mrg       || sym->value == NULL
   5465  1.1  mrg       || sym->attr.use_assoc
   5466  1.1  mrg       || sym->attr.dummy
   5467  1.1  mrg       || sym->attr.result
   5468  1.1  mrg       || sym->attr.function
   5469  1.1  mrg       || sym->attr.intrinsic
   5470  1.1  mrg       || sym->attr.pointer
   5471  1.1  mrg       || sym->attr.allocatable
   5472  1.1  mrg       || sym->attr.cray_pointee
   5473  1.1  mrg       || sym->attr.threadprivate
   5474  1.1  mrg       || sym->attr.is_bind_c
   5475  1.1  mrg       || sym->attr.subref_array_pointer
   5476  1.1  mrg       || sym->attr.assign)
   5477  1.1  mrg     return;
   5478  1.1  mrg 
   5479  1.1  mrg   if (sym->ts.type == BT_CHARACTER)
   5480  1.1  mrg     {
   5481  1.1  mrg       gfc_conv_const_charlen (sym->ts.u.cl);
   5482  1.1  mrg       if (sym->ts.u.cl->backend_decl == NULL
   5483  1.1  mrg 	  || TREE_CODE (sym->ts.u.cl->backend_decl) != INTEGER_CST)
   5484  1.1  mrg 	return;
   5485  1.1  mrg     }
   5486  1.1  mrg   else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.alloc_comp)
   5487  1.1  mrg     return;
   5488  1.1  mrg 
   5489  1.1  mrg   if (sym->as)
   5490  1.1  mrg     {
   5491  1.1  mrg       int n;
   5492  1.1  mrg 
   5493  1.1  mrg       if (sym->as->type != AS_EXPLICIT)
   5494  1.1  mrg 	return;
   5495  1.1  mrg       for (n = 0; n < sym->as->rank; n++)
   5496  1.1  mrg 	if (sym->as->lower[n]->expr_type != EXPR_CONSTANT
   5497  1.1  mrg 	    || sym->as->upper[n] == NULL
   5498  1.1  mrg 	    || sym->as->upper[n]->expr_type != EXPR_CONSTANT)
   5499  1.1  mrg 	  return;
   5500  1.1  mrg     }
   5501  1.1  mrg 
   5502  1.1  mrg   if (!check_constant_initializer (sym->value, &sym->ts,
   5503  1.1  mrg 				   sym->attr.dimension, false))
   5504  1.1  mrg     return;
   5505  1.1  mrg 
   5506  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB && sym->attr.codimension)
   5507  1.1  mrg     return;
   5508  1.1  mrg 
   5509  1.1  mrg   /* Create the decl for the variable or constant.  */
   5510  1.1  mrg   decl = build_decl (input_location,
   5511  1.1  mrg 		     sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL,
   5512  1.1  mrg 		     gfc_sym_identifier (sym), gfc_sym_type (sym));
   5513  1.1  mrg   if (sym->attr.flavor == FL_PARAMETER)
   5514  1.1  mrg     TREE_READONLY (decl) = 1;
   5515  1.1  mrg   gfc_set_decl_location (decl, &sym->declared_at);
   5516  1.1  mrg   if (sym->attr.dimension)
   5517  1.1  mrg     GFC_DECL_PACKED_ARRAY (decl) = 1;
   5518  1.1  mrg   DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   5519  1.1  mrg   TREE_STATIC (decl) = 1;
   5520  1.1  mrg   TREE_USED (decl) = 1;
   5521  1.1  mrg   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
   5522  1.1  mrg     TREE_PUBLIC (decl) = 1;
   5523  1.1  mrg   DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts,
   5524  1.1  mrg 					      TREE_TYPE (decl),
   5525  1.1  mrg 					      sym->attr.dimension,
   5526  1.1  mrg 					      false, false);
   5527  1.1  mrg   debug_hooks->early_global_decl (decl);
   5528  1.1  mrg }
   5529  1.1  mrg 
   5530  1.1  mrg 
   5531  1.1  mrg static void
   5532  1.1  mrg generate_coarray_sym_init (gfc_symbol *sym)
   5533  1.1  mrg {
   5534  1.1  mrg   tree tmp, size, decl, token, desc;
   5535  1.1  mrg   bool is_lock_type, is_event_type;
   5536  1.1  mrg   int reg_type;
   5537  1.1  mrg   gfc_se se;
   5538  1.1  mrg   symbol_attribute attr;
   5539  1.1  mrg 
   5540  1.1  mrg   if (sym->attr.dummy || sym->attr.allocatable || !sym->attr.codimension
   5541  1.1  mrg       || sym->attr.use_assoc || !sym->attr.referenced
   5542  1.1  mrg       || sym->attr.associate_var
   5543  1.1  mrg       || sym->attr.select_type_temporary)
   5544  1.1  mrg     return;
   5545  1.1  mrg 
   5546  1.1  mrg   decl = sym->backend_decl;
   5547  1.1  mrg   TREE_USED(decl) = 1;
   5548  1.1  mrg   gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
   5549  1.1  mrg 
   5550  1.1  mrg   is_lock_type = sym->ts.type == BT_DERIVED
   5551  1.1  mrg 		 && sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
   5552  1.1  mrg 		 && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE;
   5553  1.1  mrg 
   5554  1.1  mrg   is_event_type = sym->ts.type == BT_DERIVED
   5555  1.1  mrg 		  && sym->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
   5556  1.1  mrg 		  && sym->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE;
   5557  1.1  mrg 
   5558  1.1  mrg   /* FIXME: Workaround for PR middle-end/49106, cf. also PR middle-end/49108
   5559  1.1  mrg      to make sure the variable is not optimized away.  */
   5560  1.1  mrg   DECL_PRESERVE_P (DECL_CONTEXT (decl)) = 1;
   5561  1.1  mrg 
   5562  1.1  mrg   /* For lock types, we pass the array size as only the library knows the
   5563  1.1  mrg      size of the variable.  */
   5564  1.1  mrg   if (is_lock_type || is_event_type)
   5565  1.1  mrg     size = gfc_index_one_node;
   5566  1.1  mrg   else
   5567  1.1  mrg     size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (decl)));
   5568  1.1  mrg 
   5569  1.1  mrg   /* Ensure that we do not have size=0 for zero-sized arrays.  */
   5570  1.1  mrg   size = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
   5571  1.1  mrg 			  fold_convert (size_type_node, size),
   5572  1.1  mrg 			  build_int_cst (size_type_node, 1));
   5573  1.1  mrg 
   5574  1.1  mrg   if (GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)))
   5575  1.1  mrg     {
   5576  1.1  mrg       tmp = GFC_TYPE_ARRAY_SIZE (TREE_TYPE (decl));
   5577  1.1  mrg       size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
   5578  1.1  mrg 			      fold_convert (size_type_node, tmp), size);
   5579  1.1  mrg     }
   5580  1.1  mrg 
   5581  1.1  mrg   gcc_assert (GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (decl)) != NULL_TREE);
   5582  1.1  mrg   token = gfc_build_addr_expr (ppvoid_type_node,
   5583  1.1  mrg 			       GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE(decl)));
   5584  1.1  mrg   if (is_lock_type)
   5585  1.1  mrg     reg_type = sym->attr.artificial ? GFC_CAF_CRITICAL : GFC_CAF_LOCK_STATIC;
   5586  1.1  mrg   else if (is_event_type)
   5587  1.1  mrg     reg_type = GFC_CAF_EVENT_STATIC;
   5588  1.1  mrg   else
   5589  1.1  mrg     reg_type = GFC_CAF_COARRAY_STATIC;
   5590  1.1  mrg 
   5591  1.1  mrg   /* Compile the symbol attribute.  */
   5592  1.1  mrg   if (sym->ts.type == BT_CLASS)
   5593  1.1  mrg     {
   5594  1.1  mrg       attr = CLASS_DATA (sym)->attr;
   5595  1.1  mrg       /* The pointer attribute is always set on classes, overwrite it with the
   5596  1.1  mrg 	 class_pointer attribute, which denotes the pointer for classes.  */
   5597  1.1  mrg       attr.pointer = attr.class_pointer;
   5598  1.1  mrg     }
   5599  1.1  mrg   else
   5600  1.1  mrg     attr = sym->attr;
   5601  1.1  mrg   gfc_init_se (&se, NULL);
   5602  1.1  mrg   desc = gfc_conv_scalar_to_descriptor (&se, decl, attr);
   5603  1.1  mrg   gfc_add_block_to_block (&caf_init_block, &se.pre);
   5604  1.1  mrg 
   5605  1.1  mrg   tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_register, 7, size,
   5606  1.1  mrg 			     build_int_cst (integer_type_node, reg_type),
   5607  1.1  mrg 			     token, gfc_build_addr_expr (pvoid_type_node, desc),
   5608  1.1  mrg 			     null_pointer_node, /* stat.  */
   5609  1.1  mrg 			     null_pointer_node, /* errgmsg.  */
   5610  1.1  mrg 			     build_zero_cst (size_type_node)); /* errmsg_len.  */
   5611  1.1  mrg   gfc_add_expr_to_block (&caf_init_block, tmp);
   5612  1.1  mrg   gfc_add_modify (&caf_init_block, decl, fold_convert (TREE_TYPE (decl),
   5613  1.1  mrg 					  gfc_conv_descriptor_data_get (desc)));
   5614  1.1  mrg 
   5615  1.1  mrg   /* Handle "static" initializer.  */
   5616  1.1  mrg   if (sym->value)
   5617  1.1  mrg     {
   5618  1.1  mrg       if (sym->value->expr_type == EXPR_ARRAY)
   5619  1.1  mrg 	{
   5620  1.1  mrg 	  gfc_constructor *c, *cnext;
   5621  1.1  mrg 
   5622  1.1  mrg 	  /* Test if the array has more than one element.  */
   5623  1.1  mrg 	  c = gfc_constructor_first (sym->value->value.constructor);
   5624  1.1  mrg 	  gcc_assert (c);  /* Empty constructor should not happen here.  */
   5625  1.1  mrg 	  cnext = gfc_constructor_next (c);
   5626  1.1  mrg 
   5627  1.1  mrg 	  if (cnext)
   5628  1.1  mrg 	    {
   5629  1.1  mrg 	      /* An EXPR_ARRAY with a rank > 1 here has to come from a
   5630  1.1  mrg 		 DATA statement.  Set its rank here as not to confuse
   5631  1.1  mrg 		 the following steps.   */
   5632  1.1  mrg 	      sym->value->rank = 1;
   5633  1.1  mrg 	    }
   5634  1.1  mrg 	  else
   5635  1.1  mrg 	    {
   5636  1.1  mrg 	      /* There is only a single value in the constructor, use
   5637  1.1  mrg 		 it directly for the assignment.  */
   5638  1.1  mrg 	      gfc_expr *new_expr;
   5639  1.1  mrg 	      new_expr = gfc_copy_expr (c->expr);
   5640  1.1  mrg 	      gfc_free_expr (sym->value);
   5641  1.1  mrg 	      sym->value = new_expr;
   5642  1.1  mrg 	    }
   5643  1.1  mrg 	}
   5644  1.1  mrg 
   5645  1.1  mrg       sym->attr.pointer = 1;
   5646  1.1  mrg       tmp = gfc_trans_assignment (gfc_lval_expr_from_sym (sym), sym->value,
   5647  1.1  mrg 				  true, false);
   5648  1.1  mrg       sym->attr.pointer = 0;
   5649  1.1  mrg       gfc_add_expr_to_block (&caf_init_block, tmp);
   5650  1.1  mrg     }
   5651  1.1  mrg   else if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pointer_comp)
   5652  1.1  mrg     {
   5653  1.1  mrg       tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, decl, sym->as
   5654  1.1  mrg 				    ? sym->as->rank : 0,
   5655  1.1  mrg 				    GFC_STRUCTURE_CAF_MODE_IN_COARRAY);
   5656  1.1  mrg       gfc_add_expr_to_block (&caf_init_block, tmp);
   5657  1.1  mrg     }
   5658  1.1  mrg }
   5659  1.1  mrg 
   5660  1.1  mrg 
   5661  1.1  mrg /* Generate constructor function to initialize static, nonallocatable
   5662  1.1  mrg    coarrays.  */
   5663  1.1  mrg 
   5664  1.1  mrg static void
   5665  1.1  mrg generate_coarray_init (gfc_namespace * ns __attribute((unused)))
   5666  1.1  mrg {
   5667  1.1  mrg   tree fndecl, tmp, decl, save_fn_decl;
   5668  1.1  mrg 
   5669  1.1  mrg   save_fn_decl = current_function_decl;
   5670  1.1  mrg   push_function_context ();
   5671  1.1  mrg 
   5672  1.1  mrg   tmp = build_function_type_list (void_type_node, NULL_TREE);
   5673  1.1  mrg   fndecl = build_decl (input_location, FUNCTION_DECL,
   5674  1.1  mrg 		       create_tmp_var_name ("_caf_init"), tmp);
   5675  1.1  mrg 
   5676  1.1  mrg   DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
   5677  1.1  mrg   SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
   5678  1.1  mrg 
   5679  1.1  mrg   decl = build_decl (input_location, RESULT_DECL, NULL_TREE, void_type_node);
   5680  1.1  mrg   DECL_ARTIFICIAL (decl) = 1;
   5681  1.1  mrg   DECL_IGNORED_P (decl) = 1;
   5682  1.1  mrg   DECL_CONTEXT (decl) = fndecl;
   5683  1.1  mrg   DECL_RESULT (fndecl) = decl;
   5684  1.1  mrg 
   5685  1.1  mrg   pushdecl (fndecl);
   5686  1.1  mrg   current_function_decl = fndecl;
   5687  1.1  mrg   announce_function (fndecl);
   5688  1.1  mrg 
   5689  1.1  mrg   rest_of_decl_compilation (fndecl, 0, 0);
   5690  1.1  mrg   make_decl_rtl (fndecl);
   5691  1.1  mrg   allocate_struct_function (fndecl, false);
   5692  1.1  mrg 
   5693  1.1  mrg   pushlevel ();
   5694  1.1  mrg   gfc_init_block (&caf_init_block);
   5695  1.1  mrg 
   5696  1.1  mrg   gfc_traverse_ns (ns, generate_coarray_sym_init);
   5697  1.1  mrg 
   5698  1.1  mrg   DECL_SAVED_TREE (fndecl) = gfc_finish_block (&caf_init_block);
   5699  1.1  mrg   decl = getdecls ();
   5700  1.1  mrg 
   5701  1.1  mrg   poplevel (1, 1);
   5702  1.1  mrg   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
   5703  1.1  mrg 
   5704  1.1  mrg   DECL_SAVED_TREE (fndecl)
   5705  1.1  mrg     = fold_build3_loc (DECL_SOURCE_LOCATION (fndecl), BIND_EXPR, void_type_node,
   5706  1.1  mrg 		       decl, DECL_SAVED_TREE (fndecl), DECL_INITIAL (fndecl));
   5707  1.1  mrg   dump_function (TDI_original, fndecl);
   5708  1.1  mrg 
   5709  1.1  mrg   cfun->function_end_locus = input_location;
   5710  1.1  mrg   set_cfun (NULL);
   5711  1.1  mrg 
   5712  1.1  mrg   if (decl_function_context (fndecl))
   5713  1.1  mrg     (void) cgraph_node::create (fndecl);
   5714  1.1  mrg   else
   5715  1.1  mrg     cgraph_node::finalize_function (fndecl, true);
   5716  1.1  mrg 
   5717  1.1  mrg   pop_function_context ();
   5718  1.1  mrg   current_function_decl = save_fn_decl;
   5719  1.1  mrg }
   5720  1.1  mrg 
   5721  1.1  mrg 
   5722  1.1  mrg static void
   5723  1.1  mrg create_module_nml_decl (gfc_symbol *sym)
   5724  1.1  mrg {
   5725  1.1  mrg   if (sym->attr.flavor == FL_NAMELIST)
   5726  1.1  mrg     {
   5727  1.1  mrg       tree decl = generate_namelist_decl (sym);
   5728  1.1  mrg       pushdecl (decl);
   5729  1.1  mrg       gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE);
   5730  1.1  mrg       DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   5731  1.1  mrg       rest_of_decl_compilation (decl, 1, 0);
   5732  1.1  mrg       gfc_module_add_decl (cur_module, decl);
   5733  1.1  mrg     }
   5734  1.1  mrg }
   5735  1.1  mrg 
   5736  1.1  mrg 
   5737  1.1  mrg /* Generate all the required code for module variables.  */
   5738  1.1  mrg 
   5739  1.1  mrg void
   5740  1.1  mrg gfc_generate_module_vars (gfc_namespace * ns)
   5741  1.1  mrg {
   5742  1.1  mrg   module_namespace = ns;
   5743  1.1  mrg   cur_module = gfc_find_module (ns->proc_name->name);
   5744  1.1  mrg 
   5745  1.1  mrg   /* Check if the frontend left the namespace in a reasonable state.  */
   5746  1.1  mrg   gcc_assert (ns->proc_name && !ns->proc_name->tlink);
   5747  1.1  mrg 
   5748  1.1  mrg   /* Generate COMMON blocks.  */
   5749  1.1  mrg   gfc_trans_common (ns);
   5750  1.1  mrg 
   5751  1.1  mrg   has_coarray_vars = false;
   5752  1.1  mrg 
   5753  1.1  mrg   /* Create decls for all the module variables.  */
   5754  1.1  mrg   gfc_traverse_ns (ns, gfc_create_module_variable);
   5755  1.1  mrg   gfc_traverse_ns (ns, create_module_nml_decl);
   5756  1.1  mrg 
   5757  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
   5758  1.1  mrg     generate_coarray_init (ns);
   5759  1.1  mrg 
   5760  1.1  mrg   cur_module = NULL;
   5761  1.1  mrg 
   5762  1.1  mrg   gfc_trans_use_stmts (ns);
   5763  1.1  mrg   gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
   5764  1.1  mrg }
   5765  1.1  mrg 
   5766  1.1  mrg 
   5767  1.1  mrg static void
   5768  1.1  mrg gfc_generate_contained_functions (gfc_namespace * parent)
   5769  1.1  mrg {
   5770  1.1  mrg   gfc_namespace *ns;
   5771  1.1  mrg 
   5772  1.1  mrg   /* We create all the prototypes before generating any code.  */
   5773  1.1  mrg   for (ns = parent->contained; ns; ns = ns->sibling)
   5774  1.1  mrg     {
   5775  1.1  mrg       /* Skip namespaces from used modules.  */
   5776  1.1  mrg       if (ns->parent != parent)
   5777  1.1  mrg 	continue;
   5778  1.1  mrg 
   5779  1.1  mrg       gfc_create_function_decl (ns, false);
   5780  1.1  mrg     }
   5781  1.1  mrg 
   5782  1.1  mrg   for (ns = parent->contained; ns; ns = ns->sibling)
   5783  1.1  mrg     {
   5784  1.1  mrg       /* Skip namespaces from used modules.  */
   5785  1.1  mrg       if (ns->parent != parent)
   5786  1.1  mrg 	continue;
   5787  1.1  mrg 
   5788  1.1  mrg       gfc_generate_function_code (ns);
   5789  1.1  mrg     }
   5790  1.1  mrg }
   5791  1.1  mrg 
   5792  1.1  mrg 
   5793  1.1  mrg /* Drill down through expressions for the array specification bounds and
   5794  1.1  mrg    character length calling generate_local_decl for all those variables
   5795  1.1  mrg    that have not already been declared.  */
   5796  1.1  mrg 
   5797  1.1  mrg static void
   5798  1.1  mrg generate_local_decl (gfc_symbol *);
   5799  1.1  mrg 
   5800  1.1  mrg /* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
   5801  1.1  mrg 
   5802  1.1  mrg static bool
   5803  1.1  mrg expr_decls (gfc_expr *e, gfc_symbol *sym,
   5804  1.1  mrg 	    int *f ATTRIBUTE_UNUSED)
   5805  1.1  mrg {
   5806  1.1  mrg   if (e->expr_type != EXPR_VARIABLE
   5807  1.1  mrg 	    || sym == e->symtree->n.sym
   5808  1.1  mrg 	    || e->symtree->n.sym->mark
   5809  1.1  mrg 	    || e->symtree->n.sym->ns != sym->ns)
   5810  1.1  mrg 	return false;
   5811  1.1  mrg 
   5812  1.1  mrg   generate_local_decl (e->symtree->n.sym);
   5813  1.1  mrg   return false;
   5814  1.1  mrg }
   5815  1.1  mrg 
   5816  1.1  mrg static void
   5817  1.1  mrg generate_expr_decls (gfc_symbol *sym, gfc_expr *e)
   5818  1.1  mrg {
   5819  1.1  mrg   gfc_traverse_expr (e, sym, expr_decls, 0);
   5820  1.1  mrg }
   5821  1.1  mrg 
   5822  1.1  mrg 
   5823  1.1  mrg /* Check for dependencies in the character length and array spec.  */
   5824  1.1  mrg 
   5825  1.1  mrg static void
   5826  1.1  mrg generate_dependency_declarations (gfc_symbol *sym)
   5827  1.1  mrg {
   5828  1.1  mrg   int i;
   5829  1.1  mrg 
   5830  1.1  mrg   if (sym->ts.type == BT_CHARACTER
   5831  1.1  mrg       && sym->ts.u.cl
   5832  1.1  mrg       && sym->ts.u.cl->length
   5833  1.1  mrg       && sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)
   5834  1.1  mrg     generate_expr_decls (sym, sym->ts.u.cl->length);
   5835  1.1  mrg 
   5836  1.1  mrg   if (sym->as && sym->as->rank)
   5837  1.1  mrg     {
   5838  1.1  mrg       for (i = 0; i < sym->as->rank; i++)
   5839  1.1  mrg 	{
   5840  1.1  mrg           generate_expr_decls (sym, sym->as->lower[i]);
   5841  1.1  mrg           generate_expr_decls (sym, sym->as->upper[i]);
   5842  1.1  mrg 	}
   5843  1.1  mrg     }
   5844  1.1  mrg }
   5845  1.1  mrg 
   5846  1.1  mrg 
   5847  1.1  mrg /* Generate decls for all local variables.  We do this to ensure correct
   5848  1.1  mrg    handling of expressions which only appear in the specification of
   5849  1.1  mrg    other functions.  */
   5850  1.1  mrg 
   5851  1.1  mrg static void
   5852  1.1  mrg generate_local_decl (gfc_symbol * sym)
   5853  1.1  mrg {
   5854  1.1  mrg   if (sym->attr.flavor == FL_VARIABLE)
   5855  1.1  mrg     {
   5856  1.1  mrg       if (sym->attr.codimension && !sym->attr.dummy && !sym->attr.allocatable
   5857  1.1  mrg 	  && sym->attr.referenced && !sym->attr.use_assoc)
   5858  1.1  mrg 	has_coarray_vars = true;
   5859  1.1  mrg 
   5860  1.1  mrg       if (!sym->attr.dummy && !sym->ns->proc_name->attr.entry_master)
   5861  1.1  mrg 	generate_dependency_declarations (sym);
   5862  1.1  mrg 
   5863  1.1  mrg       if (sym->attr.referenced)
   5864  1.1  mrg 	gfc_get_symbol_decl (sym);
   5865  1.1  mrg 
   5866  1.1  mrg       /* Warnings for unused dummy arguments.  */
   5867  1.1  mrg       else if (sym->attr.dummy && !sym->attr.in_namelist)
   5868  1.1  mrg 	{
   5869  1.1  mrg 	  /* INTENT(out) dummy arguments are likely meant to be set.  */
   5870  1.1  mrg 	  if (warn_unused_dummy_argument && sym->attr.intent == INTENT_OUT)
   5871  1.1  mrg 	    {
   5872  1.1  mrg 	      if (sym->ts.type != BT_DERIVED)
   5873  1.1  mrg 		gfc_warning (OPT_Wunused_dummy_argument,
   5874  1.1  mrg 			     "Dummy argument %qs at %L was declared "
   5875  1.1  mrg 			     "INTENT(OUT) but was not set",  sym->name,
   5876  1.1  mrg 			     &sym->declared_at);
   5877  1.1  mrg 	      else if (!gfc_has_default_initializer (sym->ts.u.derived)
   5878  1.1  mrg 		       && !sym->ts.u.derived->attr.zero_comp)
   5879  1.1  mrg 		gfc_warning (OPT_Wunused_dummy_argument,
   5880  1.1  mrg 			     "Derived-type dummy argument %qs at %L was "
   5881  1.1  mrg 			     "declared INTENT(OUT) but was not set and "
   5882  1.1  mrg 			     "does not have a default initializer",
   5883  1.1  mrg 			     sym->name, &sym->declared_at);
   5884  1.1  mrg 	      if (sym->backend_decl != NULL_TREE)
   5885  1.1  mrg 		suppress_warning (sym->backend_decl);
   5886  1.1  mrg 	    }
   5887  1.1  mrg 	  else if (warn_unused_dummy_argument)
   5888  1.1  mrg 	    {
   5889  1.1  mrg 	      if (!sym->attr.artificial)
   5890  1.1  mrg 		gfc_warning (OPT_Wunused_dummy_argument,
   5891  1.1  mrg 			     "Unused dummy argument %qs at %L", sym->name,
   5892  1.1  mrg 			     &sym->declared_at);
   5893  1.1  mrg 
   5894  1.1  mrg 	      if (sym->backend_decl != NULL_TREE)
   5895  1.1  mrg 		suppress_warning (sym->backend_decl);
   5896  1.1  mrg 	    }
   5897  1.1  mrg 	}
   5898  1.1  mrg 
   5899  1.1  mrg       /* Warn for unused variables, but not if they're inside a common
   5900  1.1  mrg 	 block or a namelist.  */
   5901  1.1  mrg       else if (warn_unused_variable
   5902  1.1  mrg 	       && !(sym->attr.in_common || sym->mark || sym->attr.in_namelist))
   5903  1.1  mrg 	{
   5904  1.1  mrg 	  if (sym->attr.use_only)
   5905  1.1  mrg 	    {
   5906  1.1  mrg 	      gfc_warning (OPT_Wunused_variable,
   5907  1.1  mrg 			   "Unused module variable %qs which has been "
   5908  1.1  mrg 			   "explicitly imported at %L", sym->name,
   5909  1.1  mrg 			   &sym->declared_at);
   5910  1.1  mrg 	      if (sym->backend_decl != NULL_TREE)
   5911  1.1  mrg 		suppress_warning (sym->backend_decl);
   5912  1.1  mrg 	    }
   5913  1.1  mrg 	  else if (!sym->attr.use_assoc)
   5914  1.1  mrg 	    {
   5915  1.1  mrg 	      /* Corner case: the symbol may be an entry point.  At this point,
   5916  1.1  mrg 		 it may appear to be an unused variable.  Suppress warning.  */
   5917  1.1  mrg 	      bool enter = false;
   5918  1.1  mrg 	      gfc_entry_list *el;
   5919  1.1  mrg 
   5920  1.1  mrg 	      for (el = sym->ns->entries; el; el=el->next)
   5921  1.1  mrg 		if (strcmp(sym->name, el->sym->name) == 0)
   5922  1.1  mrg 		  enter = true;
   5923  1.1  mrg 
   5924  1.1  mrg 	      if (!enter)
   5925  1.1  mrg 		gfc_warning (OPT_Wunused_variable,
   5926  1.1  mrg 			     "Unused variable %qs declared at %L",
   5927  1.1  mrg 			     sym->name, &sym->declared_at);
   5928  1.1  mrg 	      if (sym->backend_decl != NULL_TREE)
   5929  1.1  mrg 		suppress_warning (sym->backend_decl);
   5930  1.1  mrg 	    }
   5931  1.1  mrg 	}
   5932  1.1  mrg 
   5933  1.1  mrg       /* For variable length CHARACTER parameters, the PARM_DECL already
   5934  1.1  mrg 	 references the length variable, so force gfc_get_symbol_decl
   5935  1.1  mrg 	 even when not referenced.  If optimize > 0, it will be optimized
   5936  1.1  mrg 	 away anyway.  But do this only after emitting -Wunused-parameter
   5937  1.1  mrg 	 warning if requested.  */
   5938  1.1  mrg       if (sym->attr.dummy && !sym->attr.referenced
   5939  1.1  mrg 	    && sym->ts.type == BT_CHARACTER
   5940  1.1  mrg 	    && sym->ts.u.cl->backend_decl != NULL
   5941  1.1  mrg 	    && VAR_P (sym->ts.u.cl->backend_decl))
   5942  1.1  mrg 	{
   5943  1.1  mrg 	  sym->attr.referenced = 1;
   5944  1.1  mrg 	  gfc_get_symbol_decl (sym);
   5945  1.1  mrg 	}
   5946  1.1  mrg 
   5947  1.1  mrg       /* INTENT(out) dummy arguments and result variables with allocatable
   5948  1.1  mrg 	 components are reset by default and need to be set referenced to
   5949  1.1  mrg 	 generate the code for nullification and automatic lengths.  */
   5950  1.1  mrg       if (!sym->attr.referenced
   5951  1.1  mrg 	    && sym->ts.type == BT_DERIVED
   5952  1.1  mrg 	    && sym->ts.u.derived->attr.alloc_comp
   5953  1.1  mrg 	    && !sym->attr.pointer
   5954  1.1  mrg 	    && ((sym->attr.dummy && sym->attr.intent == INTENT_OUT)
   5955  1.1  mrg 		  ||
   5956  1.1  mrg 		(sym->attr.result && sym != sym->result)))
   5957  1.1  mrg 	{
   5958  1.1  mrg 	  sym->attr.referenced = 1;
   5959  1.1  mrg 	  gfc_get_symbol_decl (sym);
   5960  1.1  mrg 	}
   5961  1.1  mrg 
   5962  1.1  mrg       /* Check for dependencies in the array specification and string
   5963  1.1  mrg 	length, adding the necessary declarations to the function.  We
   5964  1.1  mrg 	mark the symbol now, as well as in traverse_ns, to prevent
   5965  1.1  mrg 	getting stuck in a circular dependency.  */
   5966  1.1  mrg       sym->mark = 1;
   5967  1.1  mrg     }
   5968  1.1  mrg   else if (sym->attr.flavor == FL_PARAMETER)
   5969  1.1  mrg     {
   5970  1.1  mrg       if (warn_unused_parameter
   5971  1.1  mrg            && !sym->attr.referenced)
   5972  1.1  mrg 	{
   5973  1.1  mrg            if (!sym->attr.use_assoc)
   5974  1.1  mrg 	     gfc_warning (OPT_Wunused_parameter,
   5975  1.1  mrg 			  "Unused parameter %qs declared at %L", sym->name,
   5976  1.1  mrg 			  &sym->declared_at);
   5977  1.1  mrg 	   else if (sym->attr.use_only)
   5978  1.1  mrg 	     gfc_warning (OPT_Wunused_parameter,
   5979  1.1  mrg 			  "Unused parameter %qs which has been explicitly "
   5980  1.1  mrg 			  "imported at %L", sym->name, &sym->declared_at);
   5981  1.1  mrg 	}
   5982  1.1  mrg 
   5983  1.1  mrg       if (sym->ns && sym->ns->construct_entities)
   5984  1.1  mrg 	{
   5985  1.1  mrg 	  /* Construction of the intrinsic modules within a BLOCK
   5986  1.1  mrg 	     construct, where ONLY and RENAMED entities are included,
   5987  1.1  mrg 	     seems to be bogus.  This is a workaround that can be removed
   5988  1.1  mrg 	     if someone ever takes on the task to creating full-fledge
   5989  1.1  mrg 	     modules.  See PR 69455.  */
   5990  1.1  mrg 	  if (sym->attr.referenced
   5991  1.1  mrg 	      && sym->from_intmod != INTMOD_ISO_C_BINDING
   5992  1.1  mrg 	      && sym->from_intmod != INTMOD_ISO_FORTRAN_ENV)
   5993  1.1  mrg 	    gfc_get_symbol_decl (sym);
   5994  1.1  mrg 	  sym->mark = 1;
   5995  1.1  mrg 	}
   5996  1.1  mrg     }
   5997  1.1  mrg   else if (sym->attr.flavor == FL_PROCEDURE)
   5998  1.1  mrg     {
   5999  1.1  mrg       /* TODO: move to the appropriate place in resolve.cc.  */
   6000  1.1  mrg       if (warn_return_type > 0
   6001  1.1  mrg 	  && sym->attr.function
   6002  1.1  mrg 	  && sym->result
   6003  1.1  mrg 	  && sym != sym->result
   6004  1.1  mrg 	  && !sym->result->attr.referenced
   6005  1.1  mrg 	  && !sym->attr.use_assoc
   6006  1.1  mrg 	  && sym->attr.if_source != IFSRC_IFBODY)
   6007  1.1  mrg 	{
   6008  1.1  mrg 	  gfc_warning (OPT_Wreturn_type,
   6009  1.1  mrg 		       "Return value %qs of function %qs declared at "
   6010  1.1  mrg 		       "%L not set", sym->result->name, sym->name,
   6011  1.1  mrg 		        &sym->result->declared_at);
   6012  1.1  mrg 
   6013  1.1  mrg 	  /* Prevents "Unused variable" warning for RESULT variables.  */
   6014  1.1  mrg 	  sym->result->mark = 1;
   6015  1.1  mrg 	}
   6016  1.1  mrg     }
   6017  1.1  mrg 
   6018  1.1  mrg   if (sym->attr.dummy == 1)
   6019  1.1  mrg     {
   6020  1.1  mrg       /* The tree type for scalar character dummy arguments of BIND(C)
   6021  1.1  mrg 	 procedures, if they are passed by value, should be unsigned char.
   6022  1.1  mrg 	 The value attribute implies the dummy is a scalar.  */
   6023  1.1  mrg       if (sym->attr.value == 1 && sym->backend_decl != NULL
   6024  1.1  mrg 	  && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop
   6025  1.1  mrg 	  && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c)
   6026  1.1  mrg 	{
   6027  1.1  mrg 	  /* We used to modify the tree here. Now it is done earlier in
   6028  1.1  mrg 	     the front-end, so we only check it here to avoid regressions.  */
   6029  1.1  mrg 	  gcc_assert (TREE_CODE (TREE_TYPE (sym->backend_decl)) == INTEGER_TYPE);
   6030  1.1  mrg 	  gcc_assert (TYPE_UNSIGNED (TREE_TYPE (sym->backend_decl)) == 1);
   6031  1.1  mrg 	  gcc_assert (TYPE_PRECISION (TREE_TYPE (sym->backend_decl)) == CHAR_TYPE_SIZE);
   6032  1.1  mrg 	  gcc_assert (DECL_BY_REFERENCE (sym->backend_decl) == 0);
   6033  1.1  mrg 	}
   6034  1.1  mrg 
   6035  1.1  mrg       /* Unused procedure passed as dummy argument.  */
   6036  1.1  mrg       if (sym->attr.flavor == FL_PROCEDURE)
   6037  1.1  mrg 	{
   6038  1.1  mrg 	  if (!sym->attr.referenced && !sym->attr.artificial)
   6039  1.1  mrg 	    {
   6040  1.1  mrg 	      if (warn_unused_dummy_argument)
   6041  1.1  mrg 		gfc_warning (OPT_Wunused_dummy_argument,
   6042  1.1  mrg 			     "Unused dummy argument %qs at %L", sym->name,
   6043  1.1  mrg 			     &sym->declared_at);
   6044  1.1  mrg 	    }
   6045  1.1  mrg 
   6046  1.1  mrg 	  /* Silence bogus "unused parameter" warnings from the
   6047  1.1  mrg 	     middle end.  */
   6048  1.1  mrg 	  if (sym->backend_decl != NULL_TREE)
   6049  1.1  mrg 		suppress_warning (sym->backend_decl);
   6050  1.1  mrg 	}
   6051  1.1  mrg     }
   6052  1.1  mrg 
   6053  1.1  mrg   /* Make sure we convert the types of the derived types from iso_c_binding
   6054  1.1  mrg      into (void *).  */
   6055  1.1  mrg   if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c
   6056  1.1  mrg       && sym->ts.type == BT_DERIVED)
   6057  1.1  mrg     sym->backend_decl = gfc_typenode_for_spec (&(sym->ts));
   6058  1.1  mrg }
   6059  1.1  mrg 
   6060  1.1  mrg 
   6061  1.1  mrg static void
   6062  1.1  mrg generate_local_nml_decl (gfc_symbol * sym)
   6063  1.1  mrg {
   6064  1.1  mrg   if (sym->attr.flavor == FL_NAMELIST && !sym->attr.use_assoc)
   6065  1.1  mrg     {
   6066  1.1  mrg       tree decl = generate_namelist_decl (sym);
   6067  1.1  mrg       pushdecl (decl);
   6068  1.1  mrg     }
   6069  1.1  mrg }
   6070  1.1  mrg 
   6071  1.1  mrg 
   6072  1.1  mrg static void
   6073  1.1  mrg generate_local_vars (gfc_namespace * ns)
   6074  1.1  mrg {
   6075  1.1  mrg   gfc_traverse_ns (ns, generate_local_decl);
   6076  1.1  mrg   gfc_traverse_ns (ns, generate_local_nml_decl);
   6077  1.1  mrg }
   6078  1.1  mrg 
   6079  1.1  mrg 
   6080  1.1  mrg /* Generate a switch statement to jump to the correct entry point.  Also
   6081  1.1  mrg    creates the label decls for the entry points.  */
   6082  1.1  mrg 
   6083  1.1  mrg static tree
   6084  1.1  mrg gfc_trans_entry_master_switch (gfc_entry_list * el)
   6085  1.1  mrg {
   6086  1.1  mrg   stmtblock_t block;
   6087  1.1  mrg   tree label;
   6088  1.1  mrg   tree tmp;
   6089  1.1  mrg   tree val;
   6090  1.1  mrg 
   6091  1.1  mrg   gfc_init_block (&block);
   6092  1.1  mrg   for (; el; el = el->next)
   6093  1.1  mrg     {
   6094  1.1  mrg       /* Add the case label.  */
   6095  1.1  mrg       label = gfc_build_label_decl (NULL_TREE);
   6096  1.1  mrg       val = build_int_cst (gfc_array_index_type, el->id);
   6097  1.1  mrg       tmp = build_case_label (val, NULL_TREE, label);
   6098  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   6099  1.1  mrg 
   6100  1.1  mrg       /* And jump to the actual entry point.  */
   6101  1.1  mrg       label = gfc_build_label_decl (NULL_TREE);
   6102  1.1  mrg       tmp = build1_v (GOTO_EXPR, label);
   6103  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   6104  1.1  mrg 
   6105  1.1  mrg       /* Save the label decl.  */
   6106  1.1  mrg       el->label = label;
   6107  1.1  mrg     }
   6108  1.1  mrg   tmp = gfc_finish_block (&block);
   6109  1.1  mrg   /* The first argument selects the entry point.  */
   6110  1.1  mrg   val = DECL_ARGUMENTS (current_function_decl);
   6111  1.1  mrg   tmp = fold_build2_loc (input_location, SWITCH_EXPR, NULL_TREE, val, tmp);
   6112  1.1  mrg   return tmp;
   6113  1.1  mrg }
   6114  1.1  mrg 
   6115  1.1  mrg 
   6116  1.1  mrg /* Add code to string lengths of actual arguments passed to a function against
   6117  1.1  mrg    the expected lengths of the dummy arguments.  */
   6118  1.1  mrg 
   6119  1.1  mrg static void
   6120  1.1  mrg add_argument_checking (stmtblock_t *block, gfc_symbol *sym)
   6121  1.1  mrg {
   6122  1.1  mrg   gfc_formal_arglist *formal;
   6123  1.1  mrg 
   6124  1.1  mrg   for (formal = gfc_sym_get_dummy_args (sym); formal; formal = formal->next)
   6125  1.1  mrg     if (formal->sym && formal->sym->ts.type == BT_CHARACTER
   6126  1.1  mrg 	&& !formal->sym->ts.deferred)
   6127  1.1  mrg       {
   6128  1.1  mrg 	enum tree_code comparison;
   6129  1.1  mrg 	tree cond;
   6130  1.1  mrg 	tree argname;
   6131  1.1  mrg 	gfc_symbol *fsym;
   6132  1.1  mrg 	gfc_charlen *cl;
   6133  1.1  mrg 	const char *message;
   6134  1.1  mrg 
   6135  1.1  mrg 	fsym = formal->sym;
   6136  1.1  mrg 	cl = fsym->ts.u.cl;
   6137  1.1  mrg 
   6138  1.1  mrg 	gcc_assert (cl);
   6139  1.1  mrg 	gcc_assert (cl->passed_length != NULL_TREE);
   6140  1.1  mrg 	gcc_assert (cl->backend_decl != NULL_TREE);
   6141  1.1  mrg 
   6142  1.1  mrg 	/* For POINTER, ALLOCATABLE and assumed-shape dummy arguments, the
   6143  1.1  mrg 	   string lengths must match exactly.  Otherwise, it is only required
   6144  1.1  mrg 	   that the actual string length is *at least* the expected one.
   6145  1.1  mrg 	   Sequence association allows for a mismatch of the string length
   6146  1.1  mrg 	   if the actual argument is (part of) an array, but only if the
   6147  1.1  mrg 	   dummy argument is an array. (See "Sequence association" in
   6148  1.1  mrg 	   Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.)  */
   6149  1.1  mrg 	if (fsym->attr.pointer || fsym->attr.allocatable
   6150  1.1  mrg 	    || (fsym->as && (fsym->as->type == AS_ASSUMED_SHAPE
   6151  1.1  mrg 			     || fsym->as->type == AS_ASSUMED_RANK)))
   6152  1.1  mrg 	  {
   6153  1.1  mrg 	    comparison = NE_EXPR;
   6154  1.1  mrg 	    message = _("Actual string length does not match the declared one"
   6155  1.1  mrg 			" for dummy argument '%s' (%ld/%ld)");
   6156  1.1  mrg 	  }
   6157  1.1  mrg 	else if (fsym->as && fsym->as->rank != 0)
   6158  1.1  mrg 	  continue;
   6159  1.1  mrg 	else
   6160  1.1  mrg 	  {
   6161  1.1  mrg 	    comparison = LT_EXPR;
   6162  1.1  mrg 	    message = _("Actual string length is shorter than the declared one"
   6163  1.1  mrg 			" for dummy argument '%s' (%ld/%ld)");
   6164  1.1  mrg 	  }
   6165  1.1  mrg 
   6166  1.1  mrg 	/* Build the condition.  For optional arguments, an actual length
   6167  1.1  mrg 	   of 0 is also acceptable if the associated string is NULL, which
   6168  1.1  mrg 	   means the argument was not passed.  */
   6169  1.1  mrg 	cond = fold_build2_loc (input_location, comparison, logical_type_node,
   6170  1.1  mrg 				cl->passed_length, cl->backend_decl);
   6171  1.1  mrg 	if (fsym->attr.optional)
   6172  1.1  mrg 	  {
   6173  1.1  mrg 	    tree not_absent;
   6174  1.1  mrg 	    tree not_0length;
   6175  1.1  mrg 	    tree absent_failed;
   6176  1.1  mrg 
   6177  1.1  mrg 	    not_0length = fold_build2_loc (input_location, NE_EXPR,
   6178  1.1  mrg 					   logical_type_node,
   6179  1.1  mrg 					   cl->passed_length,
   6180  1.1  mrg 					   build_zero_cst
   6181  1.1  mrg 					   (TREE_TYPE (cl->passed_length)));
   6182  1.1  mrg 	    /* The symbol needs to be referenced for gfc_get_symbol_decl.  */
   6183  1.1  mrg 	    fsym->attr.referenced = 1;
   6184  1.1  mrg 	    not_absent = gfc_conv_expr_present (fsym);
   6185  1.1  mrg 
   6186  1.1  mrg 	    absent_failed = fold_build2_loc (input_location, TRUTH_OR_EXPR,
   6187  1.1  mrg 					     logical_type_node, not_0length,
   6188  1.1  mrg 					     not_absent);
   6189  1.1  mrg 
   6190  1.1  mrg 	    cond = fold_build2_loc (input_location, TRUTH_AND_EXPR,
   6191  1.1  mrg 				    logical_type_node, cond, absent_failed);
   6192  1.1  mrg 	  }
   6193  1.1  mrg 
   6194  1.1  mrg 	/* Build the runtime check.  */
   6195  1.1  mrg 	argname = gfc_build_cstring_const (fsym->name);
   6196  1.1  mrg 	argname = gfc_build_addr_expr (pchar_type_node, argname);
   6197  1.1  mrg 	gfc_trans_runtime_check (true, false, cond, block, &fsym->declared_at,
   6198  1.1  mrg 				 message, argname,
   6199  1.1  mrg 				 fold_convert (long_integer_type_node,
   6200  1.1  mrg 					       cl->passed_length),
   6201  1.1  mrg 				 fold_convert (long_integer_type_node,
   6202  1.1  mrg 					       cl->backend_decl));
   6203  1.1  mrg       }
   6204  1.1  mrg }
   6205  1.1  mrg 
   6206  1.1  mrg 
   6207  1.1  mrg static void
   6208  1.1  mrg create_main_function (tree fndecl)
   6209  1.1  mrg {
   6210  1.1  mrg   tree old_context;
   6211  1.1  mrg   tree ftn_main;
   6212  1.1  mrg   tree tmp, decl, result_decl, argc, argv, typelist, arglist;
   6213  1.1  mrg   stmtblock_t body;
   6214  1.1  mrg 
   6215  1.1  mrg   old_context = current_function_decl;
   6216  1.1  mrg 
   6217  1.1  mrg   if (old_context)
   6218  1.1  mrg     {
   6219  1.1  mrg       push_function_context ();
   6220  1.1  mrg       saved_parent_function_decls = saved_function_decls;
   6221  1.1  mrg       saved_function_decls = NULL_TREE;
   6222  1.1  mrg     }
   6223  1.1  mrg 
   6224  1.1  mrg   /* main() function must be declared with global scope.  */
   6225  1.1  mrg   gcc_assert (current_function_decl == NULL_TREE);
   6226  1.1  mrg 
   6227  1.1  mrg   /* Declare the function.  */
   6228  1.1  mrg   tmp =  build_function_type_list (integer_type_node, integer_type_node,
   6229  1.1  mrg 				   build_pointer_type (pchar_type_node),
   6230  1.1  mrg 				   NULL_TREE);
   6231  1.1  mrg   main_identifier_node = get_identifier ("main");
   6232  1.1  mrg   ftn_main = build_decl (input_location, FUNCTION_DECL,
   6233  1.1  mrg       			 main_identifier_node, tmp);
   6234  1.1  mrg   DECL_EXTERNAL (ftn_main) = 0;
   6235  1.1  mrg   TREE_PUBLIC (ftn_main) = 1;
   6236  1.1  mrg   TREE_STATIC (ftn_main) = 1;
   6237  1.1  mrg   DECL_ATTRIBUTES (ftn_main)
   6238  1.1  mrg       = tree_cons (get_identifier("externally_visible"), NULL_TREE, NULL_TREE);
   6239  1.1  mrg 
   6240  1.1  mrg   /* Setup the result declaration (for "return 0").  */
   6241  1.1  mrg   result_decl = build_decl (input_location,
   6242  1.1  mrg 			    RESULT_DECL, NULL_TREE, integer_type_node);
   6243  1.1  mrg   DECL_ARTIFICIAL (result_decl) = 1;
   6244  1.1  mrg   DECL_IGNORED_P (result_decl) = 1;
   6245  1.1  mrg   DECL_CONTEXT (result_decl) = ftn_main;
   6246  1.1  mrg   DECL_RESULT (ftn_main) = result_decl;
   6247  1.1  mrg 
   6248  1.1  mrg   pushdecl (ftn_main);
   6249  1.1  mrg 
   6250  1.1  mrg   /* Get the arguments.  */
   6251  1.1  mrg 
   6252  1.1  mrg   arglist = NULL_TREE;
   6253  1.1  mrg   typelist = TYPE_ARG_TYPES (TREE_TYPE (ftn_main));
   6254  1.1  mrg 
   6255  1.1  mrg   tmp = TREE_VALUE (typelist);
   6256  1.1  mrg   argc = build_decl (input_location, PARM_DECL, get_identifier ("argc"), tmp);
   6257  1.1  mrg   DECL_CONTEXT (argc) = ftn_main;
   6258  1.1  mrg   DECL_ARG_TYPE (argc) = TREE_VALUE (typelist);
   6259  1.1  mrg   TREE_READONLY (argc) = 1;
   6260  1.1  mrg   gfc_finish_decl (argc);
   6261  1.1  mrg   arglist = chainon (arglist, argc);
   6262  1.1  mrg 
   6263  1.1  mrg   typelist = TREE_CHAIN (typelist);
   6264  1.1  mrg   tmp = TREE_VALUE (typelist);
   6265  1.1  mrg   argv = build_decl (input_location, PARM_DECL, get_identifier ("argv"), tmp);
   6266  1.1  mrg   DECL_CONTEXT (argv) = ftn_main;
   6267  1.1  mrg   DECL_ARG_TYPE (argv) = TREE_VALUE (typelist);
   6268  1.1  mrg   TREE_READONLY (argv) = 1;
   6269  1.1  mrg   DECL_BY_REFERENCE (argv) = 1;
   6270  1.1  mrg   gfc_finish_decl (argv);
   6271  1.1  mrg   arglist = chainon (arglist, argv);
   6272  1.1  mrg 
   6273  1.1  mrg   DECL_ARGUMENTS (ftn_main) = arglist;
   6274  1.1  mrg   current_function_decl = ftn_main;
   6275  1.1  mrg   announce_function (ftn_main);
   6276  1.1  mrg 
   6277  1.1  mrg   rest_of_decl_compilation (ftn_main, 1, 0);
   6278  1.1  mrg   make_decl_rtl (ftn_main);
   6279  1.1  mrg   allocate_struct_function (ftn_main, false);
   6280  1.1  mrg   pushlevel ();
   6281  1.1  mrg 
   6282  1.1  mrg   gfc_init_block (&body);
   6283  1.1  mrg 
   6284  1.1  mrg   /* Call some libgfortran initialization routines, call then MAIN__().  */
   6285  1.1  mrg 
   6286  1.1  mrg   /* Call _gfortran_caf_init (*argc, ***argv).  */
   6287  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB)
   6288  1.1  mrg     {
   6289  1.1  mrg       tree pint_type, pppchar_type;
   6290  1.1  mrg       pint_type = build_pointer_type (integer_type_node);
   6291  1.1  mrg       pppchar_type
   6292  1.1  mrg 	= build_pointer_type (build_pointer_type (pchar_type_node));
   6293  1.1  mrg 
   6294  1.1  mrg       tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_init, 2,
   6295  1.1  mrg 		gfc_build_addr_expr (pint_type, argc),
   6296  1.1  mrg 		gfc_build_addr_expr (pppchar_type, argv));
   6297  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6298  1.1  mrg     }
   6299  1.1  mrg 
   6300  1.1  mrg   /* Call _gfortran_set_args (argc, argv).  */
   6301  1.1  mrg   TREE_USED (argc) = 1;
   6302  1.1  mrg   TREE_USED (argv) = 1;
   6303  1.1  mrg   tmp = build_call_expr_loc (input_location,
   6304  1.1  mrg 			 gfor_fndecl_set_args, 2, argc, argv);
   6305  1.1  mrg   gfc_add_expr_to_block (&body, tmp);
   6306  1.1  mrg 
   6307  1.1  mrg   /* Add a call to set_options to set up the runtime library Fortran
   6308  1.1  mrg      language standard parameters.  */
   6309  1.1  mrg   {
   6310  1.1  mrg     tree array_type, array, var;
   6311  1.1  mrg     vec<constructor_elt, va_gc> *v = NULL;
   6312  1.1  mrg     static const int noptions = 7;
   6313  1.1  mrg 
   6314  1.1  mrg     /* Passing a new option to the library requires three modifications:
   6315  1.1  mrg           + add it to the tree_cons list below
   6316  1.1  mrg           + change the noptions variable above
   6317  1.1  mrg           + modify the library (runtime/compile_options.c)!  */
   6318  1.1  mrg 
   6319  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6320  1.1  mrg                             build_int_cst (integer_type_node,
   6321  1.1  mrg                                            gfc_option.warn_std));
   6322  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6323  1.1  mrg                             build_int_cst (integer_type_node,
   6324  1.1  mrg                                            gfc_option.allow_std));
   6325  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6326  1.1  mrg                             build_int_cst (integer_type_node, pedantic));
   6327  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6328  1.1  mrg                             build_int_cst (integer_type_node, flag_backtrace));
   6329  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6330  1.1  mrg                             build_int_cst (integer_type_node, flag_sign_zero));
   6331  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6332  1.1  mrg                             build_int_cst (integer_type_node,
   6333  1.1  mrg                                            (gfc_option.rtcheck
   6334  1.1  mrg                                             & GFC_RTCHECK_BOUNDS)));
   6335  1.1  mrg     CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
   6336  1.1  mrg                             build_int_cst (integer_type_node,
   6337  1.1  mrg                                            gfc_option.fpe_summary));
   6338  1.1  mrg 
   6339  1.1  mrg     array_type = build_array_type_nelts (integer_type_node, noptions);
   6340  1.1  mrg     array = build_constructor (array_type, v);
   6341  1.1  mrg     TREE_CONSTANT (array) = 1;
   6342  1.1  mrg     TREE_STATIC (array) = 1;
   6343  1.1  mrg 
   6344  1.1  mrg     /* Create a static variable to hold the jump table.  */
   6345  1.1  mrg     var = build_decl (input_location, VAR_DECL,
   6346  1.1  mrg 		      create_tmp_var_name ("options"), array_type);
   6347  1.1  mrg     DECL_ARTIFICIAL (var) = 1;
   6348  1.1  mrg     DECL_IGNORED_P (var) = 1;
   6349  1.1  mrg     TREE_CONSTANT (var) = 1;
   6350  1.1  mrg     TREE_STATIC (var) = 1;
   6351  1.1  mrg     TREE_READONLY (var) = 1;
   6352  1.1  mrg     DECL_INITIAL (var) = array;
   6353  1.1  mrg     pushdecl (var);
   6354  1.1  mrg     var = gfc_build_addr_expr (build_pointer_type (integer_type_node), var);
   6355  1.1  mrg 
   6356  1.1  mrg     tmp = build_call_expr_loc (input_location,
   6357  1.1  mrg 			   gfor_fndecl_set_options, 2,
   6358  1.1  mrg 			   build_int_cst (integer_type_node, noptions), var);
   6359  1.1  mrg     gfc_add_expr_to_block (&body, tmp);
   6360  1.1  mrg   }
   6361  1.1  mrg 
   6362  1.1  mrg   /* If -ffpe-trap option was provided, add a call to set_fpe so that
   6363  1.1  mrg      the library will raise a FPE when needed.  */
   6364  1.1  mrg   if (gfc_option.fpe != 0)
   6365  1.1  mrg     {
   6366  1.1  mrg       tmp = build_call_expr_loc (input_location,
   6367  1.1  mrg 			     gfor_fndecl_set_fpe, 1,
   6368  1.1  mrg 			     build_int_cst (integer_type_node,
   6369  1.1  mrg 					    gfc_option.fpe));
   6370  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6371  1.1  mrg     }
   6372  1.1  mrg 
   6373  1.1  mrg   /* If this is the main program and an -fconvert option was provided,
   6374  1.1  mrg      add a call to set_convert.  */
   6375  1.1  mrg 
   6376  1.1  mrg   if (flag_convert != GFC_FLAG_CONVERT_NATIVE)
   6377  1.1  mrg     {
   6378  1.1  mrg       tmp = build_call_expr_loc (input_location,
   6379  1.1  mrg 			     gfor_fndecl_set_convert, 1,
   6380  1.1  mrg 			     build_int_cst (integer_type_node, flag_convert));
   6381  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6382  1.1  mrg     }
   6383  1.1  mrg 
   6384  1.1  mrg   /* If this is the main program and an -frecord-marker option was provided,
   6385  1.1  mrg      add a call to set_record_marker.  */
   6386  1.1  mrg 
   6387  1.1  mrg   if (flag_record_marker != 0)
   6388  1.1  mrg     {
   6389  1.1  mrg       tmp = build_call_expr_loc (input_location,
   6390  1.1  mrg 			     gfor_fndecl_set_record_marker, 1,
   6391  1.1  mrg 			     build_int_cst (integer_type_node,
   6392  1.1  mrg 					    flag_record_marker));
   6393  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6394  1.1  mrg     }
   6395  1.1  mrg 
   6396  1.1  mrg   if (flag_max_subrecord_length != 0)
   6397  1.1  mrg     {
   6398  1.1  mrg       tmp = build_call_expr_loc (input_location,
   6399  1.1  mrg 			     gfor_fndecl_set_max_subrecord_length, 1,
   6400  1.1  mrg 			     build_int_cst (integer_type_node,
   6401  1.1  mrg 					    flag_max_subrecord_length));
   6402  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6403  1.1  mrg     }
   6404  1.1  mrg 
   6405  1.1  mrg   /* Call MAIN__().  */
   6406  1.1  mrg   tmp = build_call_expr_loc (input_location,
   6407  1.1  mrg 			 fndecl, 0);
   6408  1.1  mrg   gfc_add_expr_to_block (&body, tmp);
   6409  1.1  mrg 
   6410  1.1  mrg   /* Mark MAIN__ as used.  */
   6411  1.1  mrg   TREE_USED (fndecl) = 1;
   6412  1.1  mrg 
   6413  1.1  mrg   /* Coarray: Call _gfortran_caf_finalize(void).  */
   6414  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB)
   6415  1.1  mrg     {
   6416  1.1  mrg       tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_finalize, 0);
   6417  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   6418  1.1  mrg     }
   6419  1.1  mrg 
   6420  1.1  mrg   /* "return 0".  */
   6421  1.1  mrg   tmp = fold_build2_loc (input_location, MODIFY_EXPR, integer_type_node,
   6422  1.1  mrg 			 DECL_RESULT (ftn_main),
   6423  1.1  mrg 			 build_int_cst (integer_type_node, 0));
   6424  1.1  mrg   tmp = build1_v (RETURN_EXPR, tmp);
   6425  1.1  mrg   gfc_add_expr_to_block (&body, tmp);
   6426  1.1  mrg 
   6427  1.1  mrg 
   6428  1.1  mrg   DECL_SAVED_TREE (ftn_main) = gfc_finish_block (&body);
   6429  1.1  mrg   decl = getdecls ();
   6430  1.1  mrg 
   6431  1.1  mrg   /* Finish off this function and send it for code generation.  */
   6432  1.1  mrg   poplevel (1, 1);
   6433  1.1  mrg   BLOCK_SUPERCONTEXT (DECL_INITIAL (ftn_main)) = ftn_main;
   6434  1.1  mrg 
   6435  1.1  mrg   DECL_SAVED_TREE (ftn_main)
   6436  1.1  mrg     = fold_build3_loc (DECL_SOURCE_LOCATION (ftn_main), BIND_EXPR,
   6437  1.1  mrg 		       void_type_node, decl, DECL_SAVED_TREE (ftn_main),
   6438  1.1  mrg 		       DECL_INITIAL (ftn_main));
   6439  1.1  mrg 
   6440  1.1  mrg   /* Output the GENERIC tree.  */
   6441  1.1  mrg   dump_function (TDI_original, ftn_main);
   6442  1.1  mrg 
   6443  1.1  mrg   cgraph_node::finalize_function (ftn_main, true);
   6444  1.1  mrg 
   6445  1.1  mrg   if (old_context)
   6446  1.1  mrg     {
   6447  1.1  mrg       pop_function_context ();
   6448  1.1  mrg       saved_function_decls = saved_parent_function_decls;
   6449  1.1  mrg     }
   6450  1.1  mrg   current_function_decl = old_context;
   6451  1.1  mrg }
   6452  1.1  mrg 
   6453  1.1  mrg 
   6454  1.1  mrg /* Generate an appropriate return-statement for a procedure.  */
   6455  1.1  mrg 
   6456  1.1  mrg tree
   6457  1.1  mrg gfc_generate_return (void)
   6458  1.1  mrg {
   6459  1.1  mrg   gfc_symbol* sym;
   6460  1.1  mrg   tree result;
   6461  1.1  mrg   tree fndecl;
   6462  1.1  mrg 
   6463  1.1  mrg   sym = current_procedure_symbol;
   6464  1.1  mrg   fndecl = sym->backend_decl;
   6465  1.1  mrg 
   6466  1.1  mrg   if (TREE_TYPE (DECL_RESULT (fndecl)) == void_type_node)
   6467  1.1  mrg     result = NULL_TREE;
   6468  1.1  mrg   else
   6469  1.1  mrg     {
   6470  1.1  mrg       result = get_proc_result (sym);
   6471  1.1  mrg 
   6472  1.1  mrg       /* Set the return value to the dummy result variable.  The
   6473  1.1  mrg 	 types may be different for scalar default REAL functions
   6474  1.1  mrg 	 with -ff2c, therefore we have to convert.  */
   6475  1.1  mrg       if (result != NULL_TREE)
   6476  1.1  mrg 	{
   6477  1.1  mrg 	  result = convert (TREE_TYPE (DECL_RESULT (fndecl)), result);
   6478  1.1  mrg 	  result = fold_build2_loc (input_location, MODIFY_EXPR,
   6479  1.1  mrg 				    TREE_TYPE (result), DECL_RESULT (fndecl),
   6480  1.1  mrg 				    result);
   6481  1.1  mrg 	}
   6482  1.1  mrg       else
   6483  1.1  mrg 	{
   6484  1.1  mrg 	  /* If the function does not have a result variable, result is
   6485  1.1  mrg 	     NULL_TREE, and a 'return' is generated without a variable.
   6486  1.1  mrg 	     The following generates a 'return __result_XXX' where XXX is
   6487  1.1  mrg 	     the function name.  */
   6488  1.1  mrg 	  if (sym == sym->result && sym->attr.function && !flag_f2c)
   6489  1.1  mrg 	    {
   6490  1.1  mrg 	      result = gfc_get_fake_result_decl (sym, 0);
   6491  1.1  mrg 	      result = fold_build2_loc (input_location, MODIFY_EXPR,
   6492  1.1  mrg 					TREE_TYPE (result),
   6493  1.1  mrg 					DECL_RESULT (fndecl), result);
   6494  1.1  mrg 	    }
   6495  1.1  mrg 	}
   6496  1.1  mrg     }
   6497  1.1  mrg 
   6498  1.1  mrg   return build1_v (RETURN_EXPR, result);
   6499  1.1  mrg }
   6500  1.1  mrg 
   6501  1.1  mrg 
   6502  1.1  mrg static void
   6503  1.1  mrg is_from_ieee_module (gfc_symbol *sym)
   6504  1.1  mrg {
   6505  1.1  mrg   if (sym->from_intmod == INTMOD_IEEE_FEATURES
   6506  1.1  mrg       || sym->from_intmod == INTMOD_IEEE_EXCEPTIONS
   6507  1.1  mrg       || sym->from_intmod == INTMOD_IEEE_ARITHMETIC)
   6508  1.1  mrg     seen_ieee_symbol = 1;
   6509  1.1  mrg }
   6510  1.1  mrg 
   6511  1.1  mrg 
   6512  1.1  mrg static int
   6513  1.1  mrg is_ieee_module_used (gfc_namespace *ns)
   6514  1.1  mrg {
   6515  1.1  mrg   seen_ieee_symbol = 0;
   6516  1.1  mrg   gfc_traverse_ns (ns, is_from_ieee_module);
   6517  1.1  mrg   return seen_ieee_symbol;
   6518  1.1  mrg }
   6519  1.1  mrg 
   6520  1.1  mrg 
   6521  1.1  mrg static gfc_omp_clauses *module_oacc_clauses;
   6522  1.1  mrg 
   6523  1.1  mrg 
   6524  1.1  mrg static void
   6525  1.1  mrg add_clause (gfc_symbol *sym, gfc_omp_map_op map_op)
   6526  1.1  mrg {
   6527  1.1  mrg   gfc_omp_namelist *n;
   6528  1.1  mrg 
   6529  1.1  mrg   n = gfc_get_omp_namelist ();
   6530  1.1  mrg   n->sym = sym;
   6531  1.1  mrg   n->u.map_op = map_op;
   6532  1.1  mrg 
   6533  1.1  mrg   if (!module_oacc_clauses)
   6534  1.1  mrg     module_oacc_clauses = gfc_get_omp_clauses ();
   6535  1.1  mrg 
   6536  1.1  mrg   if (module_oacc_clauses->lists[OMP_LIST_MAP])
   6537  1.1  mrg     n->next = module_oacc_clauses->lists[OMP_LIST_MAP];
   6538  1.1  mrg 
   6539  1.1  mrg   module_oacc_clauses->lists[OMP_LIST_MAP] = n;
   6540  1.1  mrg }
   6541  1.1  mrg 
   6542  1.1  mrg 
   6543  1.1  mrg static void
   6544  1.1  mrg find_module_oacc_declare_clauses (gfc_symbol *sym)
   6545  1.1  mrg {
   6546  1.1  mrg   if (sym->attr.use_assoc)
   6547  1.1  mrg     {
   6548  1.1  mrg       gfc_omp_map_op map_op;
   6549  1.1  mrg 
   6550  1.1  mrg       if (sym->attr.oacc_declare_create)
   6551  1.1  mrg 	map_op = OMP_MAP_FORCE_ALLOC;
   6552  1.1  mrg 
   6553  1.1  mrg       if (sym->attr.oacc_declare_copyin)
   6554  1.1  mrg 	map_op = OMP_MAP_FORCE_TO;
   6555  1.1  mrg 
   6556  1.1  mrg       if (sym->attr.oacc_declare_deviceptr)
   6557  1.1  mrg 	map_op = OMP_MAP_FORCE_DEVICEPTR;
   6558  1.1  mrg 
   6559  1.1  mrg       if (sym->attr.oacc_declare_device_resident)
   6560  1.1  mrg 	map_op = OMP_MAP_DEVICE_RESIDENT;
   6561  1.1  mrg 
   6562  1.1  mrg       if (sym->attr.oacc_declare_create
   6563  1.1  mrg 	  || sym->attr.oacc_declare_copyin
   6564  1.1  mrg 	  || sym->attr.oacc_declare_deviceptr
   6565  1.1  mrg 	  || sym->attr.oacc_declare_device_resident)
   6566  1.1  mrg 	{
   6567  1.1  mrg 	  sym->attr.referenced = 1;
   6568  1.1  mrg 	  add_clause (sym, map_op);
   6569  1.1  mrg 	}
   6570  1.1  mrg     }
   6571  1.1  mrg }
   6572  1.1  mrg 
   6573  1.1  mrg 
   6574  1.1  mrg void
   6575  1.1  mrg finish_oacc_declare (gfc_namespace *ns, gfc_symbol *sym, bool block)
   6576  1.1  mrg {
   6577  1.1  mrg   gfc_code *code;
   6578  1.1  mrg   gfc_oacc_declare *oc;
   6579  1.1  mrg   locus where = gfc_current_locus;
   6580  1.1  mrg   gfc_omp_clauses *omp_clauses = NULL;
   6581  1.1  mrg   gfc_omp_namelist *n, *p;
   6582  1.1  mrg 
   6583  1.1  mrg   module_oacc_clauses = NULL;
   6584  1.1  mrg   gfc_traverse_ns (ns, find_module_oacc_declare_clauses);
   6585  1.1  mrg 
   6586  1.1  mrg   if (module_oacc_clauses && sym->attr.flavor == FL_PROGRAM)
   6587  1.1  mrg     {
   6588  1.1  mrg       gfc_oacc_declare *new_oc;
   6589  1.1  mrg 
   6590  1.1  mrg       new_oc = gfc_get_oacc_declare ();
   6591  1.1  mrg       new_oc->next = ns->oacc_declare;
   6592  1.1  mrg       new_oc->clauses = module_oacc_clauses;
   6593  1.1  mrg 
   6594  1.1  mrg       ns->oacc_declare = new_oc;
   6595  1.1  mrg     }
   6596  1.1  mrg 
   6597  1.1  mrg   if (!ns->oacc_declare)
   6598  1.1  mrg     return;
   6599  1.1  mrg 
   6600  1.1  mrg   for (oc = ns->oacc_declare; oc; oc = oc->next)
   6601  1.1  mrg     {
   6602  1.1  mrg       if (oc->module_var)
   6603  1.1  mrg 	continue;
   6604  1.1  mrg 
   6605  1.1  mrg       if (block)
   6606  1.1  mrg 	gfc_error ("Sorry, !$ACC DECLARE at %L is not allowed "
   6607  1.1  mrg 		   "in BLOCK construct", &oc->loc);
   6608  1.1  mrg 
   6609  1.1  mrg 
   6610  1.1  mrg       if (oc->clauses && oc->clauses->lists[OMP_LIST_MAP])
   6611  1.1  mrg 	{
   6612  1.1  mrg 	  if (omp_clauses == NULL)
   6613  1.1  mrg 	    {
   6614  1.1  mrg 	      omp_clauses = oc->clauses;
   6615  1.1  mrg 	      continue;
   6616  1.1  mrg 	    }
   6617  1.1  mrg 
   6618  1.1  mrg 	  for (n = oc->clauses->lists[OMP_LIST_MAP]; n; p = n, n = n->next)
   6619  1.1  mrg 	    ;
   6620  1.1  mrg 
   6621  1.1  mrg 	  gcc_assert (p->next == NULL);
   6622  1.1  mrg 
   6623  1.1  mrg 	  p->next = omp_clauses->lists[OMP_LIST_MAP];
   6624  1.1  mrg 	  omp_clauses = oc->clauses;
   6625  1.1  mrg 	}
   6626  1.1  mrg     }
   6627  1.1  mrg 
   6628  1.1  mrg   if (!omp_clauses)
   6629  1.1  mrg     return;
   6630  1.1  mrg 
   6631  1.1  mrg   for (n = omp_clauses->lists[OMP_LIST_MAP]; n; n = n->next)
   6632  1.1  mrg     {
   6633  1.1  mrg       switch (n->u.map_op)
   6634  1.1  mrg 	{
   6635  1.1  mrg 	  case OMP_MAP_DEVICE_RESIDENT:
   6636  1.1  mrg 	    n->u.map_op = OMP_MAP_FORCE_ALLOC;
   6637  1.1  mrg 	    break;
   6638  1.1  mrg 
   6639  1.1  mrg 	  default:
   6640  1.1  mrg 	    break;
   6641  1.1  mrg 	}
   6642  1.1  mrg     }
   6643  1.1  mrg 
   6644  1.1  mrg   code = XCNEW (gfc_code);
   6645  1.1  mrg   code->op = EXEC_OACC_DECLARE;
   6646  1.1  mrg   code->loc = where;
   6647  1.1  mrg 
   6648  1.1  mrg   code->ext.oacc_declare = gfc_get_oacc_declare ();
   6649  1.1  mrg   code->ext.oacc_declare->clauses = omp_clauses;
   6650  1.1  mrg 
   6651  1.1  mrg   code->block = XCNEW (gfc_code);
   6652  1.1  mrg   code->block->op = EXEC_OACC_DECLARE;
   6653  1.1  mrg   code->block->loc = where;
   6654  1.1  mrg 
   6655  1.1  mrg   if (ns->code)
   6656  1.1  mrg     code->block->next = ns->code;
   6657  1.1  mrg 
   6658  1.1  mrg   ns->code = code;
   6659  1.1  mrg 
   6660  1.1  mrg   return;
   6661  1.1  mrg }
   6662  1.1  mrg 
   6663  1.1  mrg static void
   6664  1.1  mrg gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally,
   6665  1.1  mrg 		     tree cfi_desc, tree gfc_desc, gfc_symbol *sym)
   6666  1.1  mrg {
   6667  1.1  mrg   stmtblock_t block;
   6668  1.1  mrg   gfc_init_block (&block);
   6669  1.1  mrg   tree cfi = build_fold_indirect_ref_loc (input_location, cfi_desc);
   6670  1.1  mrg   tree idx, etype, tmp, tmp2, size_var = NULL_TREE, rank = NULL_TREE;
   6671  1.1  mrg   bool do_copy_inout = false;
   6672  1.1  mrg 
   6673  1.1  mrg   /* When allocatable + intent out, free the cfi descriptor.  */
   6674  1.1  mrg   if (sym->attr.allocatable && sym->attr.intent == INTENT_OUT)
   6675  1.1  mrg     {
   6676  1.1  mrg       tmp = gfc_get_cfi_desc_base_addr (cfi);
   6677  1.1  mrg       tree call = builtin_decl_explicit (BUILT_IN_FREE);
   6678  1.1  mrg       call = build_call_expr_loc (input_location, call, 1, tmp);
   6679  1.1  mrg       gfc_add_expr_to_block (&block, fold_convert (void_type_node, call));
   6680  1.1  mrg       gfc_add_modify (&block, tmp,
   6681  1.1  mrg 		      fold_convert (TREE_TYPE (tmp), null_pointer_node));
   6682  1.1  mrg     }
   6683  1.1  mrg 
   6684  1.1  mrg   /* -fcheck=bound: Do version, rank, attribute, type and is-NULL checks.  */
   6685  1.1  mrg   if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
   6686  1.1  mrg     {
   6687  1.1  mrg       char *msg;
   6688  1.1  mrg       tree tmp3;
   6689  1.1  mrg       msg = xasprintf ("Unexpected version %%d (expected %d) in CFI descriptor "
   6690  1.1  mrg 		       "passed to dummy argument %s", CFI_VERSION, sym->name);
   6691  1.1  mrg       tmp2 = gfc_get_cfi_desc_version (cfi);
   6692  1.1  mrg       tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, tmp2,
   6693  1.1  mrg 			     build_int_cst (TREE_TYPE (tmp2), CFI_VERSION));
   6694  1.1  mrg       gfc_trans_runtime_check (true, false, tmp, &block, &sym->declared_at,
   6695  1.1  mrg 			       msg, tmp2);
   6696  1.1  mrg       free (msg);
   6697  1.1  mrg 
   6698  1.1  mrg       /* Rank check; however, for character(len=*), assumed/explicit-size arrays
   6699  1.1  mrg 	 are permitted to differ in rank according to the Fortran rules.  */
   6700  1.1  mrg       if (sym->as && sym->as->type != AS_ASSUMED_SIZE
   6701  1.1  mrg 	  && sym->as->type != AS_EXPLICIT)
   6702  1.1  mrg 	{
   6703  1.1  mrg 	  if (sym->as->rank != -1)
   6704  1.1  mrg 	    msg = xasprintf ("Invalid rank %%d (expected %d) in CFI descriptor "
   6705  1.1  mrg 			     "passed to dummy argument %s", sym->as->rank,
   6706  1.1  mrg 			     sym->name);
   6707  1.1  mrg 	  else
   6708  1.1  mrg 	    msg = xasprintf ("Invalid rank %%d (expected 0..%d) in CFI "
   6709  1.1  mrg 			     "descriptor passed to dummy argument %s",
   6710  1.1  mrg 			     CFI_MAX_RANK, sym->name);
   6711  1.1  mrg 
   6712  1.1  mrg 	  tmp3 = tmp2 = tmp = gfc_get_cfi_desc_rank (cfi);
   6713  1.1  mrg 	  if (sym->as->rank != -1)
   6714  1.1  mrg 	    tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   6715  1.1  mrg 				   tmp, build_int_cst (signed_char_type_node,
   6716  1.1  mrg 						       sym->as->rank));
   6717  1.1  mrg 	  else
   6718  1.1  mrg 	    {
   6719  1.1  mrg 	      tmp = fold_build2_loc (input_location, LT_EXPR, boolean_type_node,
   6720  1.1  mrg 				     tmp, build_zero_cst (TREE_TYPE (tmp)));
   6721  1.1  mrg 	      tmp2 = fold_build2_loc (input_location, GT_EXPR,
   6722  1.1  mrg 				      boolean_type_node, tmp2,
   6723  1.1  mrg 				      build_int_cst (TREE_TYPE (tmp2),
   6724  1.1  mrg 						     CFI_MAX_RANK));
   6725  1.1  mrg 	      tmp = fold_build2_loc (input_location, TRUTH_AND_EXPR,
   6726  1.1  mrg 				     boolean_type_node, tmp, tmp2);
   6727  1.1  mrg 	    }
   6728  1.1  mrg 	  gfc_trans_runtime_check (true, false, tmp, &block, &sym->declared_at,
   6729  1.1  mrg 				   msg, tmp3);
   6730  1.1  mrg 	  free (msg);
   6731  1.1  mrg 	}
   6732  1.1  mrg 
   6733  1.1  mrg       tmp3 = tmp = gfc_get_cfi_desc_attribute (cfi);
   6734  1.1  mrg       if (sym->attr.allocatable || sym->attr.pointer)
   6735  1.1  mrg 	{
   6736  1.1  mrg 	  int attr = (sym->attr.pointer ? CFI_attribute_pointer
   6737  1.1  mrg 					: CFI_attribute_allocatable);
   6738  1.1  mrg 	  msg = xasprintf ("Invalid attribute %%d (expected %d) in CFI "
   6739  1.1  mrg 			   "descriptor passed to dummy argument %s with %s "
   6740  1.1  mrg 			   "attribute", attr, sym->name,
   6741  1.1  mrg 			   sym->attr.pointer ? "pointer" : "allocatable");
   6742  1.1  mrg 	  tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   6743  1.1  mrg 				 tmp, build_int_cst (TREE_TYPE (tmp), attr));
   6744  1.1  mrg 	}
   6745  1.1  mrg       else
   6746  1.1  mrg 	{
   6747  1.1  mrg 	  int amin = MIN (CFI_attribute_pointer,
   6748  1.1  mrg 			  MIN (CFI_attribute_allocatable, CFI_attribute_other));
   6749  1.1  mrg 	  int amax = MAX (CFI_attribute_pointer,
   6750  1.1  mrg 			  MAX (CFI_attribute_allocatable, CFI_attribute_other));
   6751  1.1  mrg 	  msg = xasprintf ("Invalid attribute %%d (expected %d..%d) in CFI "
   6752  1.1  mrg 			   "descriptor passed to nonallocatable, nonpointer "
   6753  1.1  mrg 			   "dummy argument %s", amin, amax, sym->name);
   6754  1.1  mrg 	  tmp2 = tmp;
   6755  1.1  mrg 	  tmp = fold_build2_loc (input_location, LT_EXPR, boolean_type_node, tmp,
   6756  1.1  mrg 			     build_int_cst (TREE_TYPE (tmp), amin));
   6757  1.1  mrg 	  tmp2 = fold_build2_loc (input_location, GT_EXPR, boolean_type_node, tmp2,
   6758  1.1  mrg 			     build_int_cst (TREE_TYPE (tmp2), amax));
   6759  1.1  mrg 	  tmp = fold_build2_loc (input_location, TRUTH_AND_EXPR,
   6760  1.1  mrg 				 boolean_type_node, tmp, tmp2);
   6761  1.1  mrg 	  gfc_trans_runtime_check (true, false, tmp, &block, &sym->declared_at,
   6762  1.1  mrg 				   msg, tmp3);
   6763  1.1  mrg 	  free (msg);
   6764  1.1  mrg 	  msg = xasprintf ("Invalid unallocatated/unassociated CFI "
   6765  1.1  mrg 			   "descriptor passed to nonallocatable, nonpointer "
   6766  1.1  mrg 			   "dummy argument %s", sym->name);
   6767  1.1  mrg 	  tmp3 = tmp = gfc_get_cfi_desc_base_addr (cfi),
   6768  1.1  mrg 	  tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
   6769  1.1  mrg 				 tmp, null_pointer_node);
   6770  1.1  mrg 	}
   6771  1.1  mrg       gfc_trans_runtime_check (true, false, tmp, &block, &sym->declared_at,
   6772  1.1  mrg 			       msg, tmp3);
   6773  1.1  mrg       free (msg);
   6774  1.1  mrg 
   6775  1.1  mrg       if (sym->ts.type != BT_ASSUMED)
   6776  1.1  mrg 	{
   6777  1.1  mrg 	  int type = CFI_type_other;
   6778  1.1  mrg 	  if (sym->ts.f90_type == BT_VOID)
   6779  1.1  mrg 	    {
   6780  1.1  mrg 	      type = (sym->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR
   6781  1.1  mrg 		      ? CFI_type_cfunptr : CFI_type_cptr);
   6782  1.1  mrg 	    }
   6783  1.1  mrg 	  else
   6784  1.1  mrg 	    switch (sym->ts.type)
   6785  1.1  mrg 	      {
   6786  1.1  mrg 		case BT_INTEGER:
   6787  1.1  mrg 		case BT_LOGICAL:
   6788  1.1  mrg 		case BT_REAL:
   6789  1.1  mrg 		case BT_COMPLEX:
   6790  1.1  mrg 		  type = CFI_type_from_type_kind (sym->ts.type, sym->ts.kind);
   6791  1.1  mrg 		  break;
   6792  1.1  mrg 		case BT_CHARACTER:
   6793  1.1  mrg 		  type = CFI_type_from_type_kind (CFI_type_Character,
   6794  1.1  mrg 						  sym->ts.kind);
   6795  1.1  mrg 		  break;
   6796  1.1  mrg 		case BT_DERIVED:
   6797  1.1  mrg 		  type = CFI_type_struct;
   6798  1.1  mrg 		  break;
   6799  1.1  mrg 		case BT_VOID:
   6800  1.1  mrg 		  type = (sym->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR
   6801  1.1  mrg 			? CFI_type_cfunptr : CFI_type_cptr);
   6802  1.1  mrg 		  break;
   6803  1.1  mrg 		case BT_ASSUMED:
   6804  1.1  mrg 		case BT_CLASS:
   6805  1.1  mrg 		case BT_PROCEDURE:
   6806  1.1  mrg 		case BT_HOLLERITH:
   6807  1.1  mrg 		case BT_UNION:
   6808  1.1  mrg 		case BT_BOZ:
   6809  1.1  mrg 		case BT_UNKNOWN:
   6810  1.1  mrg 		  gcc_unreachable ();
   6811  1.1  mrg 	    }
   6812  1.1  mrg 	  msg = xasprintf ("Unexpected type %%d (expected %d) in CFI descriptor"
   6813  1.1  mrg 			   " passed to dummy argument %s", type, sym->name);
   6814  1.1  mrg 	  tmp2 = tmp = gfc_get_cfi_desc_type (cfi);
   6815  1.1  mrg 	  tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   6816  1.1  mrg 				 tmp, build_int_cst (TREE_TYPE (tmp), type));
   6817  1.1  mrg 	  gfc_trans_runtime_check (true, false, tmp, &block, &sym->declared_at,
   6818  1.1  mrg 			       msg, tmp2);
   6819  1.1  mrg 	  free (msg);
   6820  1.1  mrg 	}
   6821  1.1  mrg     }
   6822  1.1  mrg 
   6823  1.1  mrg   if (!sym->attr.referenced)
   6824  1.1  mrg     goto done;
   6825  1.1  mrg 
   6826  1.1  mrg   /* Set string length for len=* and len=:, otherwise, it is already set.  */
   6827  1.1  mrg   if (sym->ts.type == BT_CHARACTER && !sym->ts.u.cl->length)
   6828  1.1  mrg     {
   6829  1.1  mrg       tmp = fold_convert (gfc_array_index_type,
   6830  1.1  mrg 			  gfc_get_cfi_desc_elem_len (cfi));
   6831  1.1  mrg       if (sym->ts.kind != 1)
   6832  1.1  mrg 	tmp = fold_build2_loc (input_location, TRUNC_DIV_EXPR,
   6833  1.1  mrg 			       gfc_array_index_type, tmp,
   6834  1.1  mrg 			       build_int_cst (gfc_charlen_type_node,
   6835  1.1  mrg 					      sym->ts.kind));
   6836  1.1  mrg       gfc_add_modify (&block, sym->ts.u.cl->backend_decl, tmp);
   6837  1.1  mrg     }
   6838  1.1  mrg 
   6839  1.1  mrg   if (sym->ts.type == BT_CHARACTER
   6840  1.1  mrg       && !INTEGER_CST_P (sym->ts.u.cl->backend_decl))
   6841  1.1  mrg     {
   6842  1.1  mrg       gfc_conv_string_length (sym->ts.u.cl, NULL, init);
   6843  1.1  mrg       gfc_trans_vla_type_sizes (sym, init);
   6844  1.1  mrg     }
   6845  1.1  mrg 
   6846  1.1  mrg   /* gfc->data = cfi->base_addr - or for scalars: gfc = cfi->base_addr.
   6847  1.1  mrg      assumed-size/explicit-size arrays end up here for character(len=*)
   6848  1.1  mrg      only. */
   6849  1.1  mrg   if (!sym->attr.dimension || !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   6850  1.1  mrg     {
   6851  1.1  mrg       tmp = gfc_get_cfi_desc_base_addr (cfi);
   6852  1.1  mrg       gfc_add_modify (&block, gfc_desc,
   6853  1.1  mrg 		      fold_convert (TREE_TYPE (gfc_desc), tmp));
   6854  1.1  mrg       if (!sym->attr.dimension)
   6855  1.1  mrg 	goto done;
   6856  1.1  mrg     }
   6857  1.1  mrg 
   6858  1.1  mrg   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   6859  1.1  mrg     {
   6860  1.1  mrg       /* gfc->dtype = ... (from declaration, not from cfi).  */
   6861  1.1  mrg       etype = gfc_get_element_type (TREE_TYPE (gfc_desc));
   6862  1.1  mrg       gfc_add_modify (&block, gfc_conv_descriptor_dtype (gfc_desc),
   6863  1.1  mrg 		      gfc_get_dtype_rank_type (sym->as->rank, etype));
   6864  1.1  mrg       /* gfc->data = cfi->base_addr. */
   6865  1.1  mrg       gfc_conv_descriptor_data_set (&block, gfc_desc,
   6866  1.1  mrg 				    gfc_get_cfi_desc_base_addr (cfi));
   6867  1.1  mrg     }
   6868  1.1  mrg 
   6869  1.1  mrg   if (sym->ts.type == BT_ASSUMED)
   6870  1.1  mrg     {
   6871  1.1  mrg       /* For type(*), take elem_len + dtype.type from the actual argument.  */
   6872  1.1  mrg       gfc_add_modify (&block, gfc_conv_descriptor_elem_len (gfc_desc),
   6873  1.1  mrg 		      gfc_get_cfi_desc_elem_len (cfi));
   6874  1.1  mrg       tree cond;
   6875  1.1  mrg       tree ctype = gfc_get_cfi_desc_type (cfi);
   6876  1.1  mrg       ctype = fold_build2_loc (input_location, BIT_AND_EXPR, TREE_TYPE (ctype),
   6877  1.1  mrg 			       ctype, build_int_cst (TREE_TYPE (ctype),
   6878  1.1  mrg 						     CFI_type_mask));
   6879  1.1  mrg       tree type = gfc_conv_descriptor_type (gfc_desc);
   6880  1.1  mrg 
   6881  1.1  mrg       /* if (CFI_type_cptr) BT_VOID else BT_UNKNOWN  */
   6882  1.1  mrg       /* Note: BT_VOID is could also be CFI_type_funcptr, but assume c_ptr. */
   6883  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6884  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype), CFI_type_cptr));
   6885  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
   6886  1.1  mrg 			     build_int_cst (TREE_TYPE (type), BT_VOID));
   6887  1.1  mrg       tmp2 = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
   6888  1.1  mrg 			      type,
   6889  1.1  mrg 			      build_int_cst (TREE_TYPE (type), BT_UNKNOWN));
   6890  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6891  1.1  mrg 			      tmp, tmp2);
   6892  1.1  mrg       /* if (CFI_type_struct) BT_DERIVED else  < tmp2 >  */
   6893  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6894  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6895  1.1  mrg 					     CFI_type_struct));
   6896  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
   6897  1.1  mrg 			     build_int_cst (TREE_TYPE (type), BT_DERIVED));
   6898  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6899  1.1  mrg 			      tmp, tmp2);
   6900  1.1  mrg       /* if (CFI_type_Character) BT_CHARACTER else  < tmp2 >  */
   6901  1.1  mrg       /* Note: this is kind=1, CFI_type_ucs4_char is handled in the 'else if'
   6902  1.1  mrg 	 before (see below, as generated bottom up).  */
   6903  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6904  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6905  1.1  mrg 			      CFI_type_Character));
   6906  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
   6907  1.1  mrg 			     build_int_cst (TREE_TYPE (type), BT_CHARACTER));
   6908  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6909  1.1  mrg 			      tmp, tmp2);
   6910  1.1  mrg       /* if (CFI_type_ucs4_char) BT_CHARACTER else  < tmp2 >  */
   6911  1.1  mrg       /* Note: gfc->elem_len = cfi->elem_len/4.  */
   6912  1.1  mrg       /* However, assuming that CFI_type_ucs4_char cannot be recovered, leave
   6913  1.1  mrg 	 gfc->elem_len == cfi->elem_len, which helps with operations which use
   6914  1.1  mrg 	 sizeof() in Fortran and cfi->elem_len in C.  */
   6915  1.1  mrg       tmp = gfc_get_cfi_desc_type (cfi);
   6916  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, tmp,
   6917  1.1  mrg 			      build_int_cst (TREE_TYPE (tmp),
   6918  1.1  mrg 					     CFI_type_ucs4_char));
   6919  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
   6920  1.1  mrg 			     build_int_cst (TREE_TYPE (type), BT_CHARACTER));
   6921  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6922  1.1  mrg 			      tmp, tmp2);
   6923  1.1  mrg       /* if (CFI_type_Complex) BT_COMPLEX + cfi->elem_len/2 else  < tmp2 >  */
   6924  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6925  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6926  1.1  mrg 			      CFI_type_Complex));
   6927  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
   6928  1.1  mrg 			     build_int_cst (TREE_TYPE (type), BT_COMPLEX));
   6929  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6930  1.1  mrg 			      tmp, tmp2);
   6931  1.1  mrg       /* if (CFI_type_Integer || CFI_type_Logical || CFI_type_Real)
   6932  1.1  mrg 	   ctype else  <tmp2>  */
   6933  1.1  mrg       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6934  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6935  1.1  mrg 					     CFI_type_Integer));
   6936  1.1  mrg       tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6937  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6938  1.1  mrg 					     CFI_type_Logical));
   6939  1.1  mrg       cond = fold_build2_loc (input_location, TRUTH_OR_EXPR, boolean_type_node,
   6940  1.1  mrg 			      cond, tmp);
   6941  1.1  mrg       tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, ctype,
   6942  1.1  mrg 			      build_int_cst (TREE_TYPE (ctype),
   6943  1.1  mrg 					     CFI_type_Real));
   6944  1.1  mrg       cond = fold_build2_loc (input_location, TRUTH_OR_EXPR, boolean_type_node,
   6945  1.1  mrg 			      cond, tmp);
   6946  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
   6947  1.1  mrg 			     type, fold_convert (TREE_TYPE (type), ctype));
   6948  1.1  mrg       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
   6949  1.1  mrg 			      tmp, tmp2);
   6950  1.1  mrg       gfc_add_expr_to_block (&block, tmp2);
   6951  1.1  mrg     }
   6952  1.1  mrg 
   6953  1.1  mrg   if (sym->as->rank < 0)
   6954  1.1  mrg     {
   6955  1.1  mrg       /* Set gfc->dtype.rank, if assumed-rank.  */
   6956  1.1  mrg       rank = gfc_get_cfi_desc_rank (cfi);
   6957  1.1  mrg       gfc_add_modify (&block, gfc_conv_descriptor_rank (gfc_desc), rank);
   6958  1.1  mrg     }
   6959  1.1  mrg   else if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   6960  1.1  mrg     /* In that case, the CFI rank and the declared rank can differ.  */
   6961  1.1  mrg     rank = gfc_get_cfi_desc_rank (cfi);
   6962  1.1  mrg   else
   6963  1.1  mrg     rank = build_int_cst (signed_char_type_node, sym->as->rank);
   6964  1.1  mrg 
   6965  1.1  mrg   /* With bind(C), the standard requires that both Fortran callers and callees
   6966  1.1  mrg      handle noncontiguous arrays passed to an dummy with 'contiguous' attribute
   6967  1.1  mrg      and with character(len=*) + assumed-size/explicit-size arrays.
   6968  1.1  mrg      cf. Fortran 2018, 18.3.6, paragraph 5 (and for the caller: para. 6). */
   6969  1.1  mrg   if ((sym->ts.type == BT_CHARACTER && !sym->ts.u.cl->length
   6970  1.1  mrg        && (sym->as->type == AS_ASSUMED_SIZE || sym->as->type == AS_EXPLICIT))
   6971  1.1  mrg       || sym->attr.contiguous)
   6972  1.1  mrg     {
   6973  1.1  mrg       do_copy_inout = true;
   6974  1.1  mrg       gcc_assert (!sym->attr.pointer);
   6975  1.1  mrg       stmtblock_t block2;
   6976  1.1  mrg       tree data;
   6977  1.1  mrg       if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   6978  1.1  mrg 	data = gfc_conv_descriptor_data_get (gfc_desc);
   6979  1.1  mrg       else if (!POINTER_TYPE_P (TREE_TYPE (gfc_desc)))
   6980  1.1  mrg 	data = gfc_build_addr_expr (NULL, gfc_desc);
   6981  1.1  mrg       else
   6982  1.1  mrg 	data = gfc_desc;
   6983  1.1  mrg 
   6984  1.1  mrg       /* Is copy-in/out needed? */
   6985  1.1  mrg       /* do_copyin = rank != 0 && !assumed-size */
   6986  1.1  mrg       tree cond_var = gfc_create_var (boolean_type_node, "do_copyin");
   6987  1.1  mrg       tree cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   6988  1.1  mrg 				   rank, build_zero_cst (TREE_TYPE (rank)));
   6989  1.1  mrg       /* dim[rank-1].extent != -1 -> assumed size*/
   6990  1.1  mrg       tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (rank),
   6991  1.1  mrg 			     rank, build_int_cst (TREE_TYPE (rank), 1));
   6992  1.1  mrg       tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   6993  1.1  mrg 			      gfc_get_cfi_dim_extent (cfi, tmp),
   6994  1.1  mrg 			      build_int_cst (gfc_array_index_type, -1));
   6995  1.1  mrg       cond = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
   6996  1.1  mrg 			      boolean_type_node, cond, tmp);
   6997  1.1  mrg       gfc_add_modify (&block, cond_var, cond);
   6998  1.1  mrg       /* if (do_copyin) do_copyin = ... || ... || ... */
   6999  1.1  mrg       gfc_init_block (&block2);
   7000  1.1  mrg       /* dim[0].sm != elem_len */
   7001  1.1  mrg       tmp = fold_convert (gfc_array_index_type,
   7002  1.1  mrg 			  gfc_get_cfi_desc_elem_len (cfi));
   7003  1.1  mrg       cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7004  1.1  mrg 			      gfc_get_cfi_dim_sm (cfi, gfc_index_zero_node),
   7005  1.1  mrg 			      tmp);
   7006  1.1  mrg       gfc_add_modify (&block2, cond_var, cond);
   7007  1.1  mrg 
   7008  1.1  mrg       /* for (i = 1; i < rank; ++i)
   7009  1.1  mrg 	   cond &&= dim[i].sm != (dv->dim[i - 1].sm * dv->dim[i - 1].extent) */
   7010  1.1  mrg       idx = gfc_create_var (TREE_TYPE (rank), "idx");
   7011  1.1  mrg       stmtblock_t loop_body;
   7012  1.1  mrg       gfc_init_block (&loop_body);
   7013  1.1  mrg       tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (idx),
   7014  1.1  mrg 			     idx, build_int_cst (TREE_TYPE (idx), 1));
   7015  1.1  mrg       tree tmp2 = gfc_get_cfi_dim_sm (cfi, tmp);
   7016  1.1  mrg       tmp = gfc_get_cfi_dim_extent (cfi, tmp);
   7017  1.1  mrg       tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp),
   7018  1.1  mrg 			     tmp2, tmp);
   7019  1.1  mrg       cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7020  1.1  mrg 			     gfc_get_cfi_dim_sm (cfi, idx), tmp);
   7021  1.1  mrg       cond = fold_build2_loc (input_location, TRUTH_OR_EXPR, boolean_type_node,
   7022  1.1  mrg 			      cond_var, cond);
   7023  1.1  mrg       gfc_add_modify (&loop_body, cond_var, cond);
   7024  1.1  mrg       gfc_simple_for_loop (&block2, idx, build_int_cst (TREE_TYPE (idx), 1),
   7025  1.1  mrg 			  rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1),
   7026  1.1  mrg 			  gfc_finish_block (&loop_body));
   7027  1.1  mrg       tmp = build3_v (COND_EXPR, cond_var, gfc_finish_block (&block2),
   7028  1.1  mrg 		      build_empty_stmt (input_location));
   7029  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   7030  1.1  mrg 
   7031  1.1  mrg       /* Copy-in body.  */
   7032  1.1  mrg       gfc_init_block (&block2);
   7033  1.1  mrg       /* size = dim[0].extent; for (i = 1; i < rank; ++i) size *= dim[i].extent */
   7034  1.1  mrg       size_var = gfc_create_var (size_type_node, "size");
   7035  1.1  mrg       tmp = fold_convert (size_type_node,
   7036  1.1  mrg 			  gfc_get_cfi_dim_extent (cfi, gfc_index_zero_node));
   7037  1.1  mrg       gfc_add_modify (&block2, size_var, tmp);
   7038  1.1  mrg 
   7039  1.1  mrg       gfc_init_block (&loop_body);
   7040  1.1  mrg       tmp = fold_convert (size_type_node,
   7041  1.1  mrg 			  gfc_get_cfi_dim_extent (cfi, idx));
   7042  1.1  mrg       tmp = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
   7043  1.1  mrg 			     size_var, fold_convert (size_type_node, tmp));
   7044  1.1  mrg       gfc_add_modify (&loop_body, size_var, tmp);
   7045  1.1  mrg       gfc_simple_for_loop (&block2, idx, build_int_cst (TREE_TYPE (idx), 1),
   7046  1.1  mrg 			  rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1),
   7047  1.1  mrg 			  gfc_finish_block (&loop_body));
   7048  1.1  mrg       /* data = malloc (size * elem_len) */
   7049  1.1  mrg       tmp = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
   7050  1.1  mrg 			     size_var, gfc_get_cfi_desc_elem_len (cfi));
   7051  1.1  mrg       tree call = builtin_decl_explicit (BUILT_IN_MALLOC);
   7052  1.1  mrg       call = build_call_expr_loc (input_location, call, 1, tmp);
   7053  1.1  mrg       gfc_add_modify (&block2, data, fold_convert (TREE_TYPE (data), call));
   7054  1.1  mrg 
   7055  1.1  mrg       /* Copy the data:
   7056  1.1  mrg 	 for (idx = 0; idx < size; ++idx)
   7057  1.1  mrg 	   {
   7058  1.1  mrg 	     shift = 0;
   7059  1.1  mrg 	     tmpidx = idx
   7060  1.1  mrg 	     for (dim = 0; dim < rank; ++dim)
   7061  1.1  mrg 		{
   7062  1.1  mrg 		  shift += (tmpidx % extent[d]) * sm[d]
   7063  1.1  mrg 		  tmpidx = tmpidx / extend[d]
   7064  1.1  mrg 		}
   7065  1.1  mrg 	     memcpy (lhs + idx*elem_len, rhs + shift, elem_len)
   7066  1.1  mrg 	   } .*/
   7067  1.1  mrg       idx = gfc_create_var (size_type_node, "arrayidx");
   7068  1.1  mrg       gfc_init_block (&loop_body);
   7069  1.1  mrg       tree shift = gfc_create_var (size_type_node, "shift");
   7070  1.1  mrg       tree tmpidx = gfc_create_var (size_type_node, "tmpidx");
   7071  1.1  mrg       gfc_add_modify (&loop_body, shift, build_zero_cst (TREE_TYPE (shift)));
   7072  1.1  mrg       gfc_add_modify (&loop_body, tmpidx, idx);
   7073  1.1  mrg       stmtblock_t inner_loop;
   7074  1.1  mrg       gfc_init_block (&inner_loop);
   7075  1.1  mrg       tree dim = gfc_create_var (TREE_TYPE (rank), "dim");
   7076  1.1  mrg       /* shift += (tmpidx % extent[d]) * sm[d] */
   7077  1.1  mrg       tmp = fold_build2_loc (input_location, TRUNC_MOD_EXPR,
   7078  1.1  mrg 			     size_type_node, tmpidx,
   7079  1.1  mrg 			     fold_convert (size_type_node,
   7080  1.1  mrg 					   gfc_get_cfi_dim_extent (cfi, dim)));
   7081  1.1  mrg       tmp = fold_build2_loc (input_location, MULT_EXPR,
   7082  1.1  mrg 			     size_type_node, tmp,
   7083  1.1  mrg 			     fold_convert (size_type_node,
   7084  1.1  mrg 					   gfc_get_cfi_dim_sm (cfi, dim)));
   7085  1.1  mrg       gfc_add_modify (&inner_loop, shift,
   7086  1.1  mrg 		      fold_build2_loc (input_location, PLUS_EXPR,
   7087  1.1  mrg 				       size_type_node, shift, tmp));
   7088  1.1  mrg       /* tmpidx = tmpidx / extend[d] */
   7089  1.1  mrg       tmp = fold_convert (size_type_node, gfc_get_cfi_dim_extent (cfi, dim));
   7090  1.1  mrg       gfc_add_modify (&inner_loop, tmpidx,
   7091  1.1  mrg 		      fold_build2_loc (input_location, TRUNC_DIV_EXPR,
   7092  1.1  mrg 				       size_type_node, tmpidx, tmp));
   7093  1.1  mrg       gfc_simple_for_loop (&loop_body, dim, build_zero_cst (TREE_TYPE (rank)),
   7094  1.1  mrg 			   rank, LT_EXPR, build_int_cst (TREE_TYPE (dim), 1),
   7095  1.1  mrg 			   gfc_finish_block (&inner_loop));
   7096  1.1  mrg       /* Assign.  */
   7097  1.1  mrg       tmp = fold_convert (pchar_type_node, gfc_get_cfi_desc_base_addr (cfi));
   7098  1.1  mrg       tmp = fold_build2 (POINTER_PLUS_EXPR, pchar_type_node, tmp, shift);
   7099  1.1  mrg       tree lhs;
   7100  1.1  mrg       /* memcpy (lhs + idx*elem_len, rhs + shift, elem_len)  */
   7101  1.1  mrg       tree elem_len;
   7102  1.1  mrg       if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   7103  1.1  mrg 	elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
   7104  1.1  mrg       else
   7105  1.1  mrg 	elem_len = gfc_get_cfi_desc_elem_len (cfi);
   7106  1.1  mrg       lhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
   7107  1.1  mrg 			     elem_len, idx);
   7108  1.1  mrg       lhs = fold_build2_loc (input_location, POINTER_PLUS_EXPR, pchar_type_node,
   7109  1.1  mrg 			     fold_convert (pchar_type_node, data), lhs);
   7110  1.1  mrg       tmp = fold_convert (pvoid_type_node, tmp);
   7111  1.1  mrg       lhs = fold_convert (pvoid_type_node, lhs);
   7112  1.1  mrg       call = builtin_decl_explicit (BUILT_IN_MEMCPY);
   7113  1.1  mrg       call = build_call_expr_loc (input_location, call, 3, lhs, tmp, elem_len);
   7114  1.1  mrg       gfc_add_expr_to_block (&loop_body, fold_convert (void_type_node, call));
   7115  1.1  mrg       gfc_simple_for_loop (&block2, idx, build_zero_cst (TREE_TYPE (idx)),
   7116  1.1  mrg 			   size_var, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1),
   7117  1.1  mrg 			   gfc_finish_block (&loop_body));
   7118  1.1  mrg       /* if (cond) { block2 }  */
   7119  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
   7120  1.1  mrg 			     data, fold_convert (TREE_TYPE (data),
   7121  1.1  mrg 						 null_pointer_node));
   7122  1.1  mrg       tmp = build3_v (COND_EXPR, cond_var, gfc_finish_block (&block2),
   7123  1.1  mrg 		      build_empty_stmt (input_location));
   7124  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   7125  1.1  mrg     }
   7126  1.1  mrg 
   7127  1.1  mrg   if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   7128  1.1  mrg     {
   7129  1.1  mrg       tree offset, type;
   7130  1.1  mrg       type = TREE_TYPE (gfc_desc);
   7131  1.1  mrg       gfc_trans_array_bounds (type, sym, &offset, &block);
   7132  1.1  mrg       if (VAR_P (GFC_TYPE_ARRAY_OFFSET (type)))
   7133  1.1  mrg 	gfc_add_modify (&block, GFC_TYPE_ARRAY_OFFSET (type), offset);
   7134  1.1  mrg       goto done;
   7135  1.1  mrg     }
   7136  1.1  mrg 
   7137  1.1  mrg   /* If cfi->data != NULL. */
   7138  1.1  mrg   stmtblock_t block2;
   7139  1.1  mrg   gfc_init_block (&block2);
   7140  1.1  mrg 
   7141  1.1  mrg   /* if do_copy_inout:  gfc->dspan = gfc->dtype.elem_len
   7142  1.1  mrg      We use gfc instead of cfi on the RHS as this might be a constant.  */
   7143  1.1  mrg   tmp = fold_convert (gfc_array_index_type,
   7144  1.1  mrg 		      gfc_conv_descriptor_elem_len (gfc_desc));
   7145  1.1  mrg   if (!do_copy_inout)
   7146  1.1  mrg     {
   7147  1.1  mrg       /* gfc->dspan = ((cfi->dim[0].sm % gfc->elem_len)
   7148  1.1  mrg 		       ? cfi->dim[0].sm : gfc->elem_len).  */
   7149  1.1  mrg       tree cond;
   7150  1.1  mrg       tree tmp2 = gfc_get_cfi_dim_sm (cfi, gfc_rank_cst[0]);
   7151  1.1  mrg       cond = fold_build2_loc (input_location, TRUNC_MOD_EXPR,
   7152  1.1  mrg 			      gfc_array_index_type, tmp2, tmp);
   7153  1.1  mrg       cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7154  1.1  mrg 			      cond, gfc_index_zero_node);
   7155  1.1  mrg       tmp = build3_loc (input_location, COND_EXPR, gfc_array_index_type, cond,
   7156  1.1  mrg 			tmp2, tmp);
   7157  1.1  mrg     }
   7158  1.1  mrg   gfc_conv_descriptor_span_set (&block2, gfc_desc, tmp);
   7159  1.1  mrg 
   7160  1.1  mrg   /* Calculate offset + set lbound, ubound and stride.  */
   7161  1.1  mrg   gfc_conv_descriptor_offset_set (&block2, gfc_desc, gfc_index_zero_node);
   7162  1.1  mrg   if (sym->as->rank > 0 && !sym->attr.pointer && !sym->attr.allocatable)
   7163  1.1  mrg     for (int i = 0; i < sym->as->rank; ++i)
   7164  1.1  mrg       {
   7165  1.1  mrg 	gfc_se se;
   7166  1.1  mrg 	gfc_init_se (&se, NULL );
   7167  1.1  mrg 	if (sym->as->lower[i])
   7168  1.1  mrg 	  {
   7169  1.1  mrg 	    gfc_conv_expr (&se, sym->as->lower[i]);
   7170  1.1  mrg 	    tmp = se.expr;
   7171  1.1  mrg 	  }
   7172  1.1  mrg 	else
   7173  1.1  mrg 	  tmp = gfc_index_one_node;
   7174  1.1  mrg 	gfc_add_block_to_block (&block2, &se.pre);
   7175  1.1  mrg 	gfc_conv_descriptor_lbound_set (&block2, gfc_desc, gfc_rank_cst[i],
   7176  1.1  mrg 					tmp);
   7177  1.1  mrg 	gfc_add_block_to_block (&block2, &se.post);
   7178  1.1  mrg       }
   7179  1.1  mrg 
   7180  1.1  mrg   /* Loop: for (i = 0; i < rank; ++i).  */
   7181  1.1  mrg   idx = gfc_create_var (TREE_TYPE (rank), "idx");
   7182  1.1  mrg 
   7183  1.1  mrg   /* Loop body.  */
   7184  1.1  mrg   stmtblock_t loop_body;
   7185  1.1  mrg   gfc_init_block (&loop_body);
   7186  1.1  mrg   /* gfc->dim[i].lbound = ... */
   7187  1.1  mrg   if (sym->attr.pointer || sym->attr.allocatable)
   7188  1.1  mrg     {
   7189  1.1  mrg       tmp = gfc_get_cfi_dim_lbound (cfi, idx);
   7190  1.1  mrg       gfc_conv_descriptor_lbound_set (&loop_body, gfc_desc, idx, tmp);
   7191  1.1  mrg     }
   7192  1.1  mrg   else if (sym->as->rank < 0)
   7193  1.1  mrg     gfc_conv_descriptor_lbound_set (&loop_body, gfc_desc, idx,
   7194  1.1  mrg 				    gfc_index_one_node);
   7195  1.1  mrg 
   7196  1.1  mrg   /* gfc->dim[i].ubound = gfc->dim[i].lbound + cfi->dim[i].extent - 1. */
   7197  1.1  mrg   tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
   7198  1.1  mrg 			     gfc_conv_descriptor_lbound_get (gfc_desc, idx),
   7199  1.1  mrg 			     gfc_index_one_node);
   7200  1.1  mrg   tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
   7201  1.1  mrg 			     gfc_get_cfi_dim_extent (cfi, idx), tmp);
   7202  1.1  mrg   gfc_conv_descriptor_ubound_set (&loop_body, gfc_desc, idx, tmp);
   7203  1.1  mrg 
   7204  1.1  mrg   if (do_copy_inout)
   7205  1.1  mrg     {
   7206  1.1  mrg       /* gfc->dim[i].stride
   7207  1.1  mrg 	   = idx == 0 ? 1 : gfc->dim[i-1].stride * cfi->dim[i-1].extent */
   7208  1.1  mrg       tree cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
   7209  1.1  mrg 				   idx, build_zero_cst (TREE_TYPE (idx)));
   7210  1.1  mrg       tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (idx),
   7211  1.1  mrg 			     idx, build_int_cst (TREE_TYPE (idx), 1));
   7212  1.1  mrg       tree tmp2 = gfc_get_cfi_dim_extent (cfi, tmp);
   7213  1.1  mrg       tmp = gfc_conv_descriptor_stride_get (gfc_desc, tmp);
   7214  1.1  mrg       tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp2),
   7215  1.1  mrg 			     tmp2, tmp);
   7216  1.1  mrg       tmp = build3_loc (input_location, COND_EXPR, gfc_array_index_type, cond,
   7217  1.1  mrg 			gfc_index_one_node, tmp);
   7218  1.1  mrg     }
   7219  1.1  mrg   else
   7220  1.1  mrg     {
   7221  1.1  mrg       /* gfc->dim[i].stride = cfi->dim[i].sm / cfi>elem_len */
   7222  1.1  mrg       tmp = gfc_get_cfi_dim_sm (cfi, idx);
   7223  1.1  mrg       tmp = fold_build2_loc (input_location, TRUNC_DIV_EXPR,
   7224  1.1  mrg 			     gfc_array_index_type, tmp,
   7225  1.1  mrg 			     fold_convert (gfc_array_index_type,
   7226  1.1  mrg 					   gfc_get_cfi_desc_elem_len (cfi)));
   7227  1.1  mrg      }
   7228  1.1  mrg   gfc_conv_descriptor_stride_set (&loop_body, gfc_desc, idx, tmp);
   7229  1.1  mrg   /* gfc->offset -= gfc->dim[i].stride * gfc->dim[i].lbound. */
   7230  1.1  mrg   tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
   7231  1.1  mrg 			     gfc_conv_descriptor_stride_get (gfc_desc, idx),
   7232  1.1  mrg 			     gfc_conv_descriptor_lbound_get (gfc_desc, idx));
   7233  1.1  mrg   tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
   7234  1.1  mrg 			     gfc_conv_descriptor_offset_get (gfc_desc), tmp);
   7235  1.1  mrg   gfc_conv_descriptor_offset_set (&loop_body, gfc_desc, tmp);
   7236  1.1  mrg 
   7237  1.1  mrg   /* Generate loop.  */
   7238  1.1  mrg   gfc_simple_for_loop (&block2, idx, build_zero_cst (TREE_TYPE (idx)),
   7239  1.1  mrg 		       rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1),
   7240  1.1  mrg 		       gfc_finish_block (&loop_body));
   7241  1.1  mrg   if (sym->attr.allocatable || sym->attr.pointer)
   7242  1.1  mrg     {
   7243  1.1  mrg       tmp = gfc_get_cfi_desc_base_addr (cfi),
   7244  1.1  mrg       tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7245  1.1  mrg 			     tmp, null_pointer_node);
   7246  1.1  mrg       tmp = build3_v (COND_EXPR, tmp, gfc_finish_block (&block2),
   7247  1.1  mrg 		      build_empty_stmt (input_location));
   7248  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   7249  1.1  mrg     }
   7250  1.1  mrg   else
   7251  1.1  mrg     gfc_add_block_to_block (&block, &block2);
   7252  1.1  mrg 
   7253  1.1  mrg done:
   7254  1.1  mrg   /* If optional arg: 'if (arg) { block } else { local_arg = NULL; }'.  */
   7255  1.1  mrg   if (sym->attr.optional)
   7256  1.1  mrg     {
   7257  1.1  mrg       tree present = fold_build2_loc (input_location, NE_EXPR,
   7258  1.1  mrg 				      boolean_type_node, cfi_desc,
   7259  1.1  mrg 				      null_pointer_node);
   7260  1.1  mrg       tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
   7261  1.1  mrg 			     sym->backend_decl,
   7262  1.1  mrg 			     fold_convert (TREE_TYPE (sym->backend_decl),
   7263  1.1  mrg 					   null_pointer_node));
   7264  1.1  mrg       tmp = build3_v (COND_EXPR, present, gfc_finish_block (&block), tmp);
   7265  1.1  mrg       gfc_add_expr_to_block (init, tmp);
   7266  1.1  mrg     }
   7267  1.1  mrg   else
   7268  1.1  mrg     gfc_add_block_to_block (init, &block);
   7269  1.1  mrg 
   7270  1.1  mrg   if (!sym->attr.referenced)
   7271  1.1  mrg     return;
   7272  1.1  mrg 
   7273  1.1  mrg   /* If pointer not changed, nothing to be done (except copy out)  */
   7274  1.1  mrg   if (!do_copy_inout && ((!sym->attr.pointer && !sym->attr.allocatable)
   7275  1.1  mrg 			 || sym->attr.intent == INTENT_IN))
   7276  1.1  mrg     return;
   7277  1.1  mrg 
   7278  1.1  mrg   gfc_init_block (&block);
   7279  1.1  mrg 
   7280  1.1  mrg   /* For bind(C), Fortran does not permit mixing 'pointer' with 'contiguous' (or
   7281  1.1  mrg      len=*). Thus, when copy out is needed, the bounds ofthe descriptor remain
   7282  1.1  mrg      unchanged.  */
   7283  1.1  mrg   if (do_copy_inout)
   7284  1.1  mrg     {
   7285  1.1  mrg       tree data, call;
   7286  1.1  mrg       if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   7287  1.1  mrg 	data = gfc_conv_descriptor_data_get (gfc_desc);
   7288  1.1  mrg       else if (!POINTER_TYPE_P (TREE_TYPE (gfc_desc)))
   7289  1.1  mrg 	data = gfc_build_addr_expr (NULL, gfc_desc);
   7290  1.1  mrg       else
   7291  1.1  mrg 	data = gfc_desc;
   7292  1.1  mrg       gfc_init_block (&block2);
   7293  1.1  mrg       if (sym->attr.intent != INTENT_IN)
   7294  1.1  mrg 	{
   7295  1.1  mrg 	 /* First, create the inner copy-out loop.
   7296  1.1  mrg 	  for (idx = 0; idx < size; ++idx)
   7297  1.1  mrg 	   {
   7298  1.1  mrg 	     shift = 0;
   7299  1.1  mrg 	     tmpidx = idx
   7300  1.1  mrg 	     for (dim = 0; dim < rank; ++dim)
   7301  1.1  mrg 		{
   7302  1.1  mrg 		  shift += (tmpidx % extent[d]) * sm[d]
   7303  1.1  mrg 		  tmpidx = tmpidx / extend[d]
   7304  1.1  mrg 		}
   7305  1.1  mrg 	     memcpy (lhs + shift, rhs + idx*elem_len, elem_len)
   7306  1.1  mrg 	   } .*/
   7307  1.1  mrg 	  stmtblock_t loop_body;
   7308  1.1  mrg 	  idx = gfc_create_var (size_type_node, "arrayidx");
   7309  1.1  mrg 	  gfc_init_block (&loop_body);
   7310  1.1  mrg 	  tree shift = gfc_create_var (size_type_node, "shift");
   7311  1.1  mrg 	  tree tmpidx = gfc_create_var (size_type_node, "tmpidx");
   7312  1.1  mrg 	  gfc_add_modify (&loop_body, shift,
   7313  1.1  mrg 			  build_zero_cst (TREE_TYPE (shift)));
   7314  1.1  mrg 	  gfc_add_modify (&loop_body, tmpidx, idx);
   7315  1.1  mrg 	  stmtblock_t inner_loop;
   7316  1.1  mrg 	  gfc_init_block (&inner_loop);
   7317  1.1  mrg 	  tree dim = gfc_create_var (TREE_TYPE (rank), "dim");
   7318  1.1  mrg 	  /* shift += (tmpidx % extent[d]) * sm[d] */
   7319  1.1  mrg 	  tmp = fold_convert (size_type_node,
   7320  1.1  mrg 			      gfc_get_cfi_dim_extent (cfi, dim));
   7321  1.1  mrg 	  tmp = fold_build2_loc (input_location, TRUNC_MOD_EXPR,
   7322  1.1  mrg 				 size_type_node, tmpidx, tmp);
   7323  1.1  mrg 	  tmp = fold_build2_loc (input_location, MULT_EXPR,
   7324  1.1  mrg 				 size_type_node, tmp,
   7325  1.1  mrg 				 fold_convert (size_type_node,
   7326  1.1  mrg 					       gfc_get_cfi_dim_sm (cfi, dim)));
   7327  1.1  mrg 	  gfc_add_modify (&inner_loop, shift,
   7328  1.1  mrg 		      fold_build2_loc (input_location, PLUS_EXPR,
   7329  1.1  mrg 				       size_type_node, shift, tmp));
   7330  1.1  mrg 	  /* tmpidx = tmpidx / extend[d] */
   7331  1.1  mrg 	  tmp = fold_convert (size_type_node,
   7332  1.1  mrg 			      gfc_get_cfi_dim_extent (cfi, dim));
   7333  1.1  mrg 	  gfc_add_modify (&inner_loop, tmpidx,
   7334  1.1  mrg 			  fold_build2_loc (input_location, TRUNC_DIV_EXPR,
   7335  1.1  mrg 					   size_type_node, tmpidx, tmp));
   7336  1.1  mrg 	  gfc_simple_for_loop (&loop_body, dim,
   7337  1.1  mrg 			       build_zero_cst (TREE_TYPE (rank)), rank, LT_EXPR,
   7338  1.1  mrg 			       build_int_cst (TREE_TYPE (dim), 1),
   7339  1.1  mrg 			       gfc_finish_block (&inner_loop));
   7340  1.1  mrg 	  /* Assign.  */
   7341  1.1  mrg 	  tree rhs;
   7342  1.1  mrg 	  tmp = fold_convert (pchar_type_node,
   7343  1.1  mrg 			      gfc_get_cfi_desc_base_addr (cfi));
   7344  1.1  mrg 	  tmp = fold_build2 (POINTER_PLUS_EXPR, pchar_type_node, tmp, shift);
   7345  1.1  mrg 	  /* memcpy (lhs + shift, rhs + idx*elem_len, elem_len) */
   7346  1.1  mrg 	  tree elem_len;
   7347  1.1  mrg 	  if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
   7348  1.1  mrg 	    elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
   7349  1.1  mrg 	  else
   7350  1.1  mrg 	    elem_len = gfc_get_cfi_desc_elem_len (cfi);
   7351  1.1  mrg 	  rhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
   7352  1.1  mrg 				 elem_len, idx);
   7353  1.1  mrg 	  rhs = fold_build2_loc (input_location, POINTER_PLUS_EXPR,
   7354  1.1  mrg 				 pchar_type_node,
   7355  1.1  mrg 				 fold_convert (pchar_type_node, data), rhs);
   7356  1.1  mrg 	  tmp = fold_convert (pvoid_type_node, tmp);
   7357  1.1  mrg 	  rhs = fold_convert (pvoid_type_node, rhs);
   7358  1.1  mrg 	  call = builtin_decl_explicit (BUILT_IN_MEMCPY);
   7359  1.1  mrg 	  call = build_call_expr_loc (input_location, call, 3, tmp, rhs,
   7360  1.1  mrg 				      elem_len);
   7361  1.1  mrg 	  gfc_add_expr_to_block (&loop_body,
   7362  1.1  mrg 				 fold_convert (void_type_node, call));
   7363  1.1  mrg 	  gfc_simple_for_loop (&block2, idx, build_zero_cst (TREE_TYPE (idx)),
   7364  1.1  mrg 			       size_var, LT_EXPR,
   7365  1.1  mrg 			       build_int_cst (TREE_TYPE (idx), 1),
   7366  1.1  mrg 			       gfc_finish_block (&loop_body));
   7367  1.1  mrg 	}
   7368  1.1  mrg       call = builtin_decl_explicit (BUILT_IN_FREE);
   7369  1.1  mrg       call = build_call_expr_loc (input_location, call, 1, data);
   7370  1.1  mrg       gfc_add_expr_to_block (&block2, call);
   7371  1.1  mrg 
   7372  1.1  mrg       /* if (cfi->base_addr != gfc->data) { copy out; free(var) }; return  */
   7373  1.1  mrg       tree tmp2 = gfc_get_cfi_desc_base_addr (cfi);
   7374  1.1  mrg       tmp2 = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7375  1.1  mrg 			      tmp2, fold_convert (TREE_TYPE (tmp2), data));
   7376  1.1  mrg       tmp = build3_v (COND_EXPR, tmp2, gfc_finish_block (&block2),
   7377  1.1  mrg 		      build_empty_stmt (input_location));
   7378  1.1  mrg       gfc_add_expr_to_block (&block, tmp);
   7379  1.1  mrg       goto done_finally;
   7380  1.1  mrg     }
   7381  1.1  mrg 
   7382  1.1  mrg   /* Update pointer + array data data on exit.  */
   7383  1.1  mrg   tmp = gfc_get_cfi_desc_base_addr (cfi);
   7384  1.1  mrg   tmp2 = (!sym->attr.dimension
   7385  1.1  mrg 	       ? gfc_desc : gfc_conv_descriptor_data_get (gfc_desc));
   7386  1.1  mrg   gfc_add_modify (&block, tmp, fold_convert (TREE_TYPE (tmp), tmp2));
   7387  1.1  mrg 
   7388  1.1  mrg   /* Set string length for len=:, only.  */
   7389  1.1  mrg   if (sym->ts.type == BT_CHARACTER && !sym->ts.u.cl->length)
   7390  1.1  mrg     {
   7391  1.1  mrg       tmp = sym->ts.u.cl->backend_decl;
   7392  1.1  mrg       if (sym->ts.kind != 1)
   7393  1.1  mrg 	tmp = fold_build2_loc (input_location, MULT_EXPR,
   7394  1.1  mrg 			       gfc_array_index_type,
   7395  1.1  mrg 			       sym->ts.u.cl->backend_decl, tmp);
   7396  1.1  mrg       tmp2 = gfc_get_cfi_desc_elem_len (cfi);
   7397  1.1  mrg       gfc_add_modify (&block, tmp2, fold_convert (TREE_TYPE (tmp2), tmp));
   7398  1.1  mrg     }
   7399  1.1  mrg 
   7400  1.1  mrg   if (!sym->attr.dimension)
   7401  1.1  mrg     goto done_finally;
   7402  1.1  mrg 
   7403  1.1  mrg   gfc_init_block (&block2);
   7404  1.1  mrg 
   7405  1.1  mrg   /* Loop: for (i = 0; i < rank; ++i).  */
   7406  1.1  mrg   idx = gfc_create_var (TREE_TYPE (rank), "idx");
   7407  1.1  mrg 
   7408  1.1  mrg   /* Loop body.  */
   7409  1.1  mrg   gfc_init_block (&loop_body);
   7410  1.1  mrg   /* cfi->dim[i].lower_bound = gfc->dim[i].lbound */
   7411  1.1  mrg   gfc_add_modify (&loop_body, gfc_get_cfi_dim_lbound (cfi, idx),
   7412  1.1  mrg 		  gfc_conv_descriptor_lbound_get (gfc_desc, idx));
   7413  1.1  mrg   /* cfi->dim[i].extent = gfc->dim[i].ubound - gfc->dim[i].lbound + 1.  */
   7414  1.1  mrg   tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
   7415  1.1  mrg 			     gfc_conv_descriptor_ubound_get (gfc_desc, idx),
   7416  1.1  mrg 			     gfc_conv_descriptor_lbound_get (gfc_desc, idx));
   7417  1.1  mrg   tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, tmp,
   7418  1.1  mrg 			 gfc_index_one_node);
   7419  1.1  mrg   gfc_add_modify (&loop_body, gfc_get_cfi_dim_extent (cfi, idx), tmp);
   7420  1.1  mrg   /* d->dim[n].sm = gfc->dim[i].stride  * gfc->span); */
   7421  1.1  mrg   tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
   7422  1.1  mrg 			     gfc_conv_descriptor_stride_get (gfc_desc, idx),
   7423  1.1  mrg 			     gfc_conv_descriptor_span_get (gfc_desc));
   7424  1.1  mrg   gfc_add_modify (&loop_body, gfc_get_cfi_dim_sm (cfi, idx), tmp);
   7425  1.1  mrg 
   7426  1.1  mrg   /* Generate loop.  */
   7427  1.1  mrg   gfc_simple_for_loop (&block2, idx, build_zero_cst (TREE_TYPE (idx)),
   7428  1.1  mrg 		       rank, LT_EXPR, build_int_cst (TREE_TYPE (idx), 1),
   7429  1.1  mrg 		       gfc_finish_block (&loop_body));
   7430  1.1  mrg   /* if (gfc->data != NULL) { block2 }.  */
   7431  1.1  mrg   tmp = gfc_get_cfi_desc_base_addr (cfi),
   7432  1.1  mrg   tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
   7433  1.1  mrg 			 tmp, null_pointer_node);
   7434  1.1  mrg   tmp = build3_v (COND_EXPR, tmp, gfc_finish_block (&block2),
   7435  1.1  mrg 		  build_empty_stmt (input_location));
   7436  1.1  mrg   gfc_add_expr_to_block (&block, tmp);
   7437  1.1  mrg 
   7438  1.1  mrg done_finally:
   7439  1.1  mrg   /* If optional arg: 'if (arg) { block } else { local_arg = NULL; }'.  */
   7440  1.1  mrg   if (sym->attr.optional)
   7441  1.1  mrg     {
   7442  1.1  mrg       tree present = fold_build2_loc (input_location, NE_EXPR,
   7443  1.1  mrg 				      boolean_type_node, cfi_desc,
   7444  1.1  mrg 				      null_pointer_node);
   7445  1.1  mrg       tmp = build3_v (COND_EXPR, present, gfc_finish_block (&block),
   7446  1.1  mrg 		      build_empty_stmt (input_location));
   7447  1.1  mrg       gfc_add_expr_to_block (finally, tmp);
   7448  1.1  mrg      }
   7449  1.1  mrg    else
   7450  1.1  mrg      gfc_add_block_to_block (finally, &block);
   7451  1.1  mrg }
   7452  1.1  mrg 
   7453  1.1  mrg /* Generate code for a function.  */
   7454  1.1  mrg 
   7455  1.1  mrg void
   7456  1.1  mrg gfc_generate_function_code (gfc_namespace * ns)
   7457  1.1  mrg {
   7458  1.1  mrg   tree fndecl;
   7459  1.1  mrg   tree old_context;
   7460  1.1  mrg   tree decl;
   7461  1.1  mrg   tree tmp;
   7462  1.1  mrg   tree fpstate = NULL_TREE;
   7463  1.1  mrg   stmtblock_t init, cleanup, outer_block;
   7464  1.1  mrg   stmtblock_t body;
   7465  1.1  mrg   gfc_wrapped_block try_block;
   7466  1.1  mrg   tree recurcheckvar = NULL_TREE;
   7467  1.1  mrg   gfc_symbol *sym;
   7468  1.1  mrg   gfc_symbol *previous_procedure_symbol;
   7469  1.1  mrg   int rank, ieee;
   7470  1.1  mrg   bool is_recursive;
   7471  1.1  mrg 
   7472  1.1  mrg   sym = ns->proc_name;
   7473  1.1  mrg   previous_procedure_symbol = current_procedure_symbol;
   7474  1.1  mrg   current_procedure_symbol = sym;
   7475  1.1  mrg 
   7476  1.1  mrg   /* Initialize sym->tlink so that gfc_trans_deferred_vars does not get
   7477  1.1  mrg      lost or worse.  */
   7478  1.1  mrg   sym->tlink = sym;
   7479  1.1  mrg 
   7480  1.1  mrg   /* Create the declaration for functions with global scope.  */
   7481  1.1  mrg   if (!sym->backend_decl)
   7482  1.1  mrg     gfc_create_function_decl (ns, false);
   7483  1.1  mrg 
   7484  1.1  mrg   fndecl = sym->backend_decl;
   7485  1.1  mrg   old_context = current_function_decl;
   7486  1.1  mrg 
   7487  1.1  mrg   if (old_context)
   7488  1.1  mrg     {
   7489  1.1  mrg       push_function_context ();
   7490  1.1  mrg       saved_parent_function_decls = saved_function_decls;
   7491  1.1  mrg       saved_function_decls = NULL_TREE;
   7492  1.1  mrg     }
   7493  1.1  mrg 
   7494  1.1  mrg   trans_function_start (sym);
   7495  1.1  mrg 
   7496  1.1  mrg   gfc_init_block (&init);
   7497  1.1  mrg   gfc_init_block (&cleanup);
   7498  1.1  mrg   gfc_init_block (&outer_block);
   7499  1.1  mrg 
   7500  1.1  mrg   if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
   7501  1.1  mrg     {
   7502  1.1  mrg       /* Copy length backend_decls to all entry point result
   7503  1.1  mrg 	 symbols.  */
   7504  1.1  mrg       gfc_entry_list *el;
   7505  1.1  mrg       tree backend_decl;
   7506  1.1  mrg 
   7507  1.1  mrg       gfc_conv_const_charlen (ns->proc_name->ts.u.cl);
   7508  1.1  mrg       backend_decl = ns->proc_name->result->ts.u.cl->backend_decl;
   7509  1.1  mrg       for (el = ns->entries; el; el = el->next)
   7510  1.1  mrg 	el->sym->result->ts.u.cl->backend_decl = backend_decl;
   7511  1.1  mrg     }
   7512  1.1  mrg 
   7513  1.1  mrg   /* Translate COMMON blocks.  */
   7514  1.1  mrg   gfc_trans_common (ns);
   7515  1.1  mrg 
   7516  1.1  mrg   /* Null the parent fake result declaration if this namespace is
   7517  1.1  mrg      a module function or an external procedures.  */
   7518  1.1  mrg   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
   7519  1.1  mrg 	|| ns->parent == NULL)
   7520  1.1  mrg     parent_fake_result_decl = NULL_TREE;
   7521  1.1  mrg 
   7522  1.1  mrg   /* For BIND(C):
   7523  1.1  mrg      - deallocate intent-out allocatable dummy arguments.
   7524  1.1  mrg      - Create GFC variable which will later be populated by convert_CFI_desc  */
   7525  1.1  mrg   if (sym->attr.is_bind_c)
   7526  1.1  mrg     for (gfc_formal_arglist *formal = gfc_sym_get_dummy_args (sym);
   7527  1.1  mrg 	 formal; formal = formal->next)
   7528  1.1  mrg       {
   7529  1.1  mrg 	gfc_symbol *fsym = formal->sym;
   7530  1.1  mrg 	if (!is_CFI_desc (fsym, NULL))
   7531  1.1  mrg 	  continue;
   7532  1.1  mrg 	if (!fsym->attr.referenced)
   7533  1.1  mrg 	  {
   7534  1.1  mrg 	    gfc_conv_cfi_to_gfc (&init, &cleanup, fsym->backend_decl,
   7535  1.1  mrg 				 NULL_TREE, fsym);
   7536  1.1  mrg 	    continue;
   7537  1.1  mrg 	  }
   7538  1.1  mrg 	/* Let's now create a local GFI descriptor. Afterwards:
   7539  1.1  mrg 	   desc is the local descriptor,
   7540  1.1  mrg 	   desc_p is a pointer to it
   7541  1.1  mrg 	     and stored in sym->backend_decl
   7542  1.1  mrg 	   GFC_DECL_SAVED_DESCRIPTOR (desc_p) contains the CFI descriptor
   7543  1.1  mrg 	     -> PARM_DECL and before sym->backend_decl.
   7544  1.1  mrg 	   For scalars, decl == decl_p is a pointer variable.  */
   7545  1.1  mrg 	tree desc_p, desc;
   7546  1.1  mrg 	location_t loc = gfc_get_location (&sym->declared_at);
   7547  1.1  mrg 	if (fsym->ts.type == BT_CHARACTER && !fsym->ts.u.cl->length)
   7548  1.1  mrg 	  fsym->ts.u.cl->backend_decl = gfc_create_var (gfc_array_index_type,
   7549  1.1  mrg 							fsym->name);
   7550  1.1  mrg 	else if (fsym->ts.type == BT_CHARACTER && !fsym->ts.u.cl->backend_decl)
   7551  1.1  mrg 	  {
   7552  1.1  mrg 	    gfc_se se;
   7553  1.1  mrg 	    gfc_init_se (&se, NULL );
   7554  1.1  mrg 	    gfc_conv_expr (&se, fsym->ts.u.cl->length);
   7555  1.1  mrg 	    gfc_add_block_to_block (&init, &se.pre);
   7556  1.1  mrg 	    fsym->ts.u.cl->backend_decl = se.expr;
   7557  1.1  mrg 	    gcc_assert(se.post.head == NULL_TREE);
   7558  1.1  mrg 	  }
   7559  1.1  mrg 	/* Nullify, otherwise gfc_sym_type will return the CFI type.  */
   7560  1.1  mrg 	tree tmp = fsym->backend_decl;
   7561  1.1  mrg 	fsym->backend_decl = NULL;
   7562  1.1  mrg 	tree type = gfc_sym_type (fsym);
   7563  1.1  mrg 	gcc_assert (POINTER_TYPE_P (type));
   7564  1.1  mrg 	if (POINTER_TYPE_P (TREE_TYPE (type)))
   7565  1.1  mrg 	  /* For instance, allocatable scalars.  */
   7566  1.1  mrg 	  type = TREE_TYPE (type);
   7567  1.1  mrg 	if (TREE_CODE (type) == REFERENCE_TYPE)
   7568  1.1  mrg 	  type = build_pointer_type (TREE_TYPE (type));
   7569  1.1  mrg 	desc_p = build_decl (loc, VAR_DECL, get_identifier (fsym->name), type);
   7570  1.1  mrg 	if (!fsym->attr.dimension)
   7571  1.1  mrg 	  desc = desc_p;
   7572  1.1  mrg 	else if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (desc_p))))
   7573  1.1  mrg 	  {
   7574  1.1  mrg 	    /* Character(len=*) explict-size/assumed-size array. */
   7575  1.1  mrg 	    desc = desc_p;
   7576  1.1  mrg 	    gfc_build_qualified_array (desc, fsym);
   7577  1.1  mrg 	  }
   7578  1.1  mrg 	else
   7579  1.1  mrg 	  {
   7580  1.1  mrg 	    tree size = size_in_bytes (TREE_TYPE (TREE_TYPE (desc_p)));
   7581  1.1  mrg 	    tree call = builtin_decl_explicit (BUILT_IN_ALLOCA);
   7582  1.1  mrg 	    call = build_call_expr_loc (input_location, call, 1, size);
   7583  1.1  mrg 	    gfc_add_modify (&outer_block, desc_p,
   7584  1.1  mrg 			    fold_convert (TREE_TYPE(desc_p), call));
   7585  1.1  mrg 	    desc = build_fold_indirect_ref_loc (input_location, desc_p);
   7586  1.1  mrg 	  }
   7587  1.1  mrg 	pushdecl (desc_p);
   7588  1.1  mrg 	if (fsym->attr.optional)
   7589  1.1  mrg 	  {
   7590  1.1  mrg 	    gfc_allocate_lang_decl (desc_p);
   7591  1.1  mrg 	    GFC_DECL_OPTIONAL_ARGUMENT (desc_p) = 1;
   7592  1.1  mrg 	  }
   7593  1.1  mrg 	fsym->backend_decl = desc_p;
   7594  1.1  mrg 	gfc_conv_cfi_to_gfc (&init, &cleanup, tmp, desc, fsym);
   7595  1.1  mrg       }
   7596  1.1  mrg 
   7597  1.1  mrg   gfc_generate_contained_functions (ns);
   7598  1.1  mrg 
   7599  1.1  mrg   has_coarray_vars = false;
   7600  1.1  mrg   generate_local_vars (ns);
   7601  1.1  mrg 
   7602  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
   7603  1.1  mrg     generate_coarray_init (ns);
   7604  1.1  mrg 
   7605  1.1  mrg   /* Keep the parent fake result declaration in module functions
   7606  1.1  mrg      or external procedures.  */
   7607  1.1  mrg   if ((ns->parent && ns->parent->proc_name->attr.flavor == FL_MODULE)
   7608  1.1  mrg 	|| ns->parent == NULL)
   7609  1.1  mrg     current_fake_result_decl = parent_fake_result_decl;
   7610  1.1  mrg   else
   7611  1.1  mrg     current_fake_result_decl = NULL_TREE;
   7612  1.1  mrg 
   7613  1.1  mrg   is_recursive = sym->attr.recursive
   7614  1.1  mrg 		 || (sym->attr.entry_master
   7615  1.1  mrg 		     && sym->ns->entries->sym->attr.recursive);
   7616  1.1  mrg   if ((gfc_option.rtcheck & GFC_RTCHECK_RECURSION)
   7617  1.1  mrg       && !is_recursive && !flag_recursive && !sym->attr.artificial)
   7618  1.1  mrg     {
   7619  1.1  mrg       char * msg;
   7620  1.1  mrg 
   7621  1.1  mrg       msg = xasprintf ("Recursive call to nonrecursive procedure '%s'",
   7622  1.1  mrg 		       sym->name);
   7623  1.1  mrg       recurcheckvar = gfc_create_var (logical_type_node, "is_recursive");
   7624  1.1  mrg       TREE_STATIC (recurcheckvar) = 1;
   7625  1.1  mrg       DECL_INITIAL (recurcheckvar) = logical_false_node;
   7626  1.1  mrg       gfc_add_expr_to_block (&init, recurcheckvar);
   7627  1.1  mrg       gfc_trans_runtime_check (true, false, recurcheckvar, &init,
   7628  1.1  mrg 			       &sym->declared_at, msg);
   7629  1.1  mrg       gfc_add_modify (&init, recurcheckvar, logical_true_node);
   7630  1.1  mrg       free (msg);
   7631  1.1  mrg     }
   7632  1.1  mrg 
   7633  1.1  mrg   /* Check if an IEEE module is used in the procedure.  If so, save
   7634  1.1  mrg      the floating point state.  */
   7635  1.1  mrg   ieee = is_ieee_module_used (ns);
   7636  1.1  mrg   if (ieee)
   7637  1.1  mrg     fpstate = gfc_save_fp_state (&init);
   7638  1.1  mrg 
   7639  1.1  mrg   /* Now generate the code for the body of this function.  */
   7640  1.1  mrg   gfc_init_block (&body);
   7641  1.1  mrg 
   7642  1.1  mrg   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
   7643  1.1  mrg 	&& sym->attr.subroutine)
   7644  1.1  mrg     {
   7645  1.1  mrg       tree alternate_return;
   7646  1.1  mrg       alternate_return = gfc_get_fake_result_decl (sym, 0);
   7647  1.1  mrg       gfc_add_modify (&body, alternate_return, integer_zero_node);
   7648  1.1  mrg     }
   7649  1.1  mrg 
   7650  1.1  mrg   if (ns->entries)
   7651  1.1  mrg     {
   7652  1.1  mrg       /* Jump to the correct entry point.  */
   7653  1.1  mrg       tmp = gfc_trans_entry_master_switch (ns->entries);
   7654  1.1  mrg       gfc_add_expr_to_block (&body, tmp);
   7655  1.1  mrg     }
   7656  1.1  mrg 
   7657  1.1  mrg   /* If bounds-checking is enabled, generate code to check passed in actual
   7658  1.1  mrg      arguments against the expected dummy argument attributes (e.g. string
   7659  1.1  mrg      lengths).  */
   7660  1.1  mrg   if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !sym->attr.is_bind_c)
   7661  1.1  mrg     add_argument_checking (&body, sym);
   7662  1.1  mrg 
   7663  1.1  mrg   finish_oacc_declare (ns, sym, false);
   7664  1.1  mrg 
   7665  1.1  mrg   tmp = gfc_trans_code (ns->code);
   7666  1.1  mrg   gfc_add_expr_to_block (&body, tmp);
   7667  1.1  mrg 
   7668  1.1  mrg   if (TREE_TYPE (DECL_RESULT (fndecl)) != void_type_node
   7669  1.1  mrg       || (sym->result && sym->result != sym
   7670  1.1  mrg 	  && sym->result->ts.type == BT_DERIVED
   7671  1.1  mrg 	  && sym->result->ts.u.derived->attr.alloc_comp))
   7672  1.1  mrg     {
   7673  1.1  mrg       bool artificial_result_decl = false;
   7674  1.1  mrg       tree result = get_proc_result (sym);
   7675  1.1  mrg       gfc_symbol *rsym = sym == sym->result ? sym : sym->result;
   7676  1.1  mrg 
   7677  1.1  mrg       /* Make sure that a function returning an object with
   7678  1.1  mrg 	 alloc/pointer_components always has a result, where at least
   7679  1.1  mrg 	 the allocatable/pointer components are set to zero.  */
   7680  1.1  mrg       if (result == NULL_TREE && sym->attr.function
   7681  1.1  mrg 	  && ((sym->result->ts.type == BT_DERIVED
   7682  1.1  mrg 	       && (sym->attr.allocatable
   7683  1.1  mrg 		   || sym->attr.pointer
   7684  1.1  mrg 		   || sym->result->ts.u.derived->attr.alloc_comp
   7685  1.1  mrg 		   || sym->result->ts.u.derived->attr.pointer_comp))
   7686  1.1  mrg 	      || (sym->result->ts.type == BT_CLASS
   7687  1.1  mrg 		  && (CLASS_DATA (sym)->attr.allocatable
   7688  1.1  mrg 		      || CLASS_DATA (sym)->attr.class_pointer
   7689  1.1  mrg 		      || CLASS_DATA (sym->result)->attr.alloc_comp
   7690  1.1  mrg 		      || CLASS_DATA (sym->result)->attr.pointer_comp))))
   7691  1.1  mrg 	{
   7692  1.1  mrg 	  artificial_result_decl = true;
   7693  1.1  mrg 	  result = gfc_get_fake_result_decl (sym, 0);
   7694  1.1  mrg 	}
   7695  1.1  mrg 
   7696  1.1  mrg       if (result != NULL_TREE && sym->attr.function && !sym->attr.pointer)
   7697  1.1  mrg 	{
   7698  1.1  mrg 	  if (sym->attr.allocatable && sym->attr.dimension == 0
   7699  1.1  mrg 	      && sym->result == sym)
   7700  1.1  mrg 	    gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
   7701  1.1  mrg 							 null_pointer_node));
   7702  1.1  mrg 	  else if (sym->ts.type == BT_CLASS
   7703  1.1  mrg 		   && CLASS_DATA (sym)->attr.allocatable
   7704  1.1  mrg 		   && CLASS_DATA (sym)->attr.dimension == 0
   7705  1.1  mrg 		   && sym->result == sym)
   7706  1.1  mrg 	    {
   7707  1.1  mrg 	      tmp = CLASS_DATA (sym)->backend_decl;
   7708  1.1  mrg 	      tmp = fold_build3_loc (input_location, COMPONENT_REF,
   7709  1.1  mrg 				     TREE_TYPE (tmp), result, tmp, NULL_TREE);
   7710  1.1  mrg 	      gfc_add_modify (&init, tmp, fold_convert (TREE_TYPE (tmp),
   7711  1.1  mrg 							null_pointer_node));
   7712  1.1  mrg 	    }
   7713  1.1  mrg 	  else if (sym->ts.type == BT_DERIVED
   7714  1.1  mrg 		   && !sym->attr.allocatable)
   7715  1.1  mrg 	    {
   7716  1.1  mrg 	      gfc_expr *init_exp;
   7717  1.1  mrg 	      /* Arrays are not initialized using the default initializer of
   7718  1.1  mrg 		 their elements.  Therefore only check if a default
   7719  1.1  mrg 		 initializer is available when the result is scalar.  */
   7720  1.1  mrg 	      init_exp = rsym->as ? NULL
   7721  1.1  mrg                                   : gfc_generate_initializer (&rsym->ts, true);
   7722  1.1  mrg 	      if (init_exp)
   7723  1.1  mrg 		{
   7724  1.1  mrg 		  tmp = gfc_trans_structure_assign (result, init_exp, 0);
   7725  1.1  mrg 		  gfc_free_expr (init_exp);
   7726  1.1  mrg 		  gfc_add_expr_to_block (&init, tmp);
   7727  1.1  mrg 		}
   7728  1.1  mrg 	      else if (rsym->ts.u.derived->attr.alloc_comp)
   7729  1.1  mrg 		{
   7730  1.1  mrg 		  rank = rsym->as ? rsym->as->rank : 0;
   7731  1.1  mrg 		  tmp = gfc_nullify_alloc_comp (rsym->ts.u.derived, result,
   7732  1.1  mrg 						rank);
   7733  1.1  mrg 		  gfc_prepend_expr_to_block (&body, tmp);
   7734  1.1  mrg 		}
   7735  1.1  mrg 	    }
   7736  1.1  mrg 	}
   7737  1.1  mrg 
   7738  1.1  mrg       if (result == NULL_TREE || artificial_result_decl)
   7739  1.1  mrg 	{
   7740  1.1  mrg 	  /* TODO: move to the appropriate place in resolve.cc.  */
   7741  1.1  mrg 	  if (warn_return_type > 0 && sym == sym->result)
   7742  1.1  mrg 	    gfc_warning (OPT_Wreturn_type,
   7743  1.1  mrg 			 "Return value of function %qs at %L not set",
   7744  1.1  mrg 			 sym->name, &sym->declared_at);
   7745  1.1  mrg 	  if (warn_return_type > 0)
   7746  1.1  mrg 	    suppress_warning (sym->backend_decl);
   7747  1.1  mrg 	}
   7748  1.1  mrg       if (result != NULL_TREE)
   7749  1.1  mrg 	gfc_add_expr_to_block (&body, gfc_generate_return ());
   7750  1.1  mrg     }
   7751  1.1  mrg 
   7752  1.1  mrg   /* Reset recursion-check variable.  */
   7753  1.1  mrg   if (recurcheckvar != NULL_TREE)
   7754  1.1  mrg     {
   7755  1.1  mrg       gfc_add_modify (&cleanup, recurcheckvar, logical_false_node);
   7756  1.1  mrg       recurcheckvar = NULL;
   7757  1.1  mrg     }
   7758  1.1  mrg 
   7759  1.1  mrg   /* If IEEE modules are loaded, restore the floating-point state.  */
   7760  1.1  mrg   if (ieee)
   7761  1.1  mrg     gfc_restore_fp_state (&cleanup, fpstate);
   7762  1.1  mrg 
   7763  1.1  mrg   /* Finish the function body and add init and cleanup code.  */
   7764  1.1  mrg   tmp = gfc_finish_block (&body);
   7765  1.1  mrg   /* Add code to create and cleanup arrays.  */
   7766  1.1  mrg   gfc_start_wrapped_block (&try_block, tmp);
   7767  1.1  mrg   gfc_trans_deferred_vars (sym, &try_block);
   7768  1.1  mrg   gfc_add_init_cleanup (&try_block, gfc_finish_block (&init),
   7769  1.1  mrg 			gfc_finish_block (&cleanup));
   7770  1.1  mrg 
   7771  1.1  mrg   /* Add all the decls we created during processing.  */
   7772  1.1  mrg   decl = nreverse (saved_function_decls);
   7773  1.1  mrg   while (decl)
   7774  1.1  mrg     {
   7775  1.1  mrg       tree next;
   7776  1.1  mrg 
   7777  1.1  mrg       next = DECL_CHAIN (decl);
   7778  1.1  mrg       DECL_CHAIN (decl) = NULL_TREE;
   7779  1.1  mrg       pushdecl (decl);
   7780  1.1  mrg       decl = next;
   7781  1.1  mrg     }
   7782  1.1  mrg   saved_function_decls = NULL_TREE;
   7783  1.1  mrg 
   7784  1.1  mrg   gfc_add_expr_to_block (&outer_block, gfc_finish_wrapped_block (&try_block));
   7785  1.1  mrg   DECL_SAVED_TREE (fndecl) = gfc_finish_block (&outer_block);
   7786  1.1  mrg   decl = getdecls ();
   7787  1.1  mrg 
   7788  1.1  mrg   /* Finish off this function and send it for code generation.  */
   7789  1.1  mrg   poplevel (1, 1);
   7790  1.1  mrg   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
   7791  1.1  mrg 
   7792  1.1  mrg   DECL_SAVED_TREE (fndecl)
   7793  1.1  mrg     = fold_build3_loc (DECL_SOURCE_LOCATION (fndecl), BIND_EXPR, void_type_node,
   7794  1.1  mrg 		       decl, DECL_SAVED_TREE (fndecl), DECL_INITIAL (fndecl));
   7795  1.1  mrg 
   7796  1.1  mrg   /* Output the GENERIC tree.  */
   7797  1.1  mrg   dump_function (TDI_original, fndecl);
   7798  1.1  mrg 
   7799  1.1  mrg   /* Store the end of the function, so that we get good line number
   7800  1.1  mrg      info for the epilogue.  */
   7801  1.1  mrg   cfun->function_end_locus = input_location;
   7802  1.1  mrg 
   7803  1.1  mrg   /* We're leaving the context of this function, so zap cfun.
   7804  1.1  mrg      It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
   7805  1.1  mrg      tree_rest_of_compilation.  */
   7806  1.1  mrg   set_cfun (NULL);
   7807  1.1  mrg 
   7808  1.1  mrg   if (old_context)
   7809  1.1  mrg     {
   7810  1.1  mrg       pop_function_context ();
   7811  1.1  mrg       saved_function_decls = saved_parent_function_decls;
   7812  1.1  mrg     }
   7813  1.1  mrg   current_function_decl = old_context;
   7814  1.1  mrg 
   7815  1.1  mrg   if (decl_function_context (fndecl))
   7816  1.1  mrg     {
   7817  1.1  mrg       /* Register this function with cgraph just far enough to get it
   7818  1.1  mrg 	 added to our parent's nested function list.
   7819  1.1  mrg 	 If there are static coarrays in this function, the nested _caf_init
   7820  1.1  mrg 	 function has already called cgraph_create_node, which also created
   7821  1.1  mrg 	 the cgraph node for this function.  */
   7822  1.1  mrg       if (!has_coarray_vars || flag_coarray != GFC_FCOARRAY_LIB)
   7823  1.1  mrg 	(void) cgraph_node::get_create (fndecl);
   7824  1.1  mrg     }
   7825  1.1  mrg   else
   7826  1.1  mrg     cgraph_node::finalize_function (fndecl, true);
   7827  1.1  mrg 
   7828  1.1  mrg   gfc_trans_use_stmts (ns);
   7829  1.1  mrg   gfc_traverse_ns (ns, gfc_emit_parameter_debug_info);
   7830  1.1  mrg 
   7831  1.1  mrg   if (sym->attr.is_main_program)
   7832  1.1  mrg     create_main_function (fndecl);
   7833  1.1  mrg 
   7834  1.1  mrg   current_procedure_symbol = previous_procedure_symbol;
   7835  1.1  mrg }
   7836  1.1  mrg 
   7837  1.1  mrg 
   7838  1.1  mrg void
   7839  1.1  mrg gfc_generate_constructors (void)
   7840  1.1  mrg {
   7841  1.1  mrg   gcc_assert (gfc_static_ctors == NULL_TREE);
   7842  1.1  mrg #if 0
   7843  1.1  mrg   tree fnname;
   7844  1.1  mrg   tree type;
   7845  1.1  mrg   tree fndecl;
   7846  1.1  mrg   tree decl;
   7847  1.1  mrg   tree tmp;
   7848  1.1  mrg 
   7849  1.1  mrg   if (gfc_static_ctors == NULL_TREE)
   7850  1.1  mrg     return;
   7851  1.1  mrg 
   7852  1.1  mrg   fnname = get_file_function_name ("I");
   7853  1.1  mrg   type = build_function_type_list (void_type_node, NULL_TREE);
   7854  1.1  mrg 
   7855  1.1  mrg   fndecl = build_decl (input_location,
   7856  1.1  mrg 		       FUNCTION_DECL, fnname, type);
   7857  1.1  mrg   TREE_PUBLIC (fndecl) = 1;
   7858  1.1  mrg 
   7859  1.1  mrg   decl = build_decl (input_location,
   7860  1.1  mrg 		     RESULT_DECL, NULL_TREE, void_type_node);
   7861  1.1  mrg   DECL_ARTIFICIAL (decl) = 1;
   7862  1.1  mrg   DECL_IGNORED_P (decl) = 1;
   7863  1.1  mrg   DECL_CONTEXT (decl) = fndecl;
   7864  1.1  mrg   DECL_RESULT (fndecl) = decl;
   7865  1.1  mrg 
   7866  1.1  mrg   pushdecl (fndecl);
   7867  1.1  mrg 
   7868  1.1  mrg   current_function_decl = fndecl;
   7869  1.1  mrg 
   7870  1.1  mrg   rest_of_decl_compilation (fndecl, 1, 0);
   7871  1.1  mrg 
   7872  1.1  mrg   make_decl_rtl (fndecl);
   7873  1.1  mrg 
   7874  1.1  mrg   allocate_struct_function (fndecl, false);
   7875  1.1  mrg 
   7876  1.1  mrg   pushlevel ();
   7877  1.1  mrg 
   7878  1.1  mrg   for (; gfc_static_ctors; gfc_static_ctors = TREE_CHAIN (gfc_static_ctors))
   7879  1.1  mrg     {
   7880  1.1  mrg       tmp = build_call_expr_loc (input_location,
   7881  1.1  mrg 			     TREE_VALUE (gfc_static_ctors), 0);
   7882  1.1  mrg       DECL_SAVED_TREE (fndecl) = build_stmt (input_location, EXPR_STMT, tmp);
   7883  1.1  mrg     }
   7884  1.1  mrg 
   7885  1.1  mrg   decl = getdecls ();
   7886  1.1  mrg   poplevel (1, 1);
   7887  1.1  mrg 
   7888  1.1  mrg   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
   7889  1.1  mrg   DECL_SAVED_TREE (fndecl)
   7890  1.1  mrg     = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
   7891  1.1  mrg 		DECL_INITIAL (fndecl));
   7892  1.1  mrg 
   7893  1.1  mrg   free_after_parsing (cfun);
   7894  1.1  mrg   free_after_compilation (cfun);
   7895  1.1  mrg 
   7896  1.1  mrg   tree_rest_of_compilation (fndecl);
   7897  1.1  mrg 
   7898  1.1  mrg   current_function_decl = NULL_TREE;
   7899  1.1  mrg #endif
   7900  1.1  mrg }
   7901  1.1  mrg 
   7902  1.1  mrg /* Translates a BLOCK DATA program unit. This means emitting the
   7903  1.1  mrg    commons contained therein plus their initializations. We also emit
   7904  1.1  mrg    a globally visible symbol to make sure that each BLOCK DATA program
   7905  1.1  mrg    unit remains unique.  */
   7906  1.1  mrg 
   7907  1.1  mrg void
   7908  1.1  mrg gfc_generate_block_data (gfc_namespace * ns)
   7909  1.1  mrg {
   7910  1.1  mrg   tree decl;
   7911  1.1  mrg   tree id;
   7912  1.1  mrg 
   7913  1.1  mrg   /* Tell the backend the source location of the block data.  */
   7914  1.1  mrg   if (ns->proc_name)
   7915  1.1  mrg     gfc_set_backend_locus (&ns->proc_name->declared_at);
   7916  1.1  mrg   else
   7917  1.1  mrg     gfc_set_backend_locus (&gfc_current_locus);
   7918  1.1  mrg 
   7919  1.1  mrg   /* Process the DATA statements.  */
   7920  1.1  mrg   gfc_trans_common (ns);
   7921  1.1  mrg 
   7922  1.1  mrg   /* Create a global symbol with the mane of the block data.  This is to
   7923  1.1  mrg      generate linker errors if the same name is used twice.  It is never
   7924  1.1  mrg      really used.  */
   7925  1.1  mrg   if (ns->proc_name)
   7926  1.1  mrg     id = gfc_sym_mangled_function_id (ns->proc_name);
   7927  1.1  mrg   else
   7928  1.1  mrg     id = get_identifier ("__BLOCK_DATA__");
   7929  1.1  mrg 
   7930  1.1  mrg   decl = build_decl (input_location,
   7931  1.1  mrg 		     VAR_DECL, id, gfc_array_index_type);
   7932  1.1  mrg   TREE_PUBLIC (decl) = 1;
   7933  1.1  mrg   TREE_STATIC (decl) = 1;
   7934  1.1  mrg   DECL_IGNORED_P (decl) = 1;
   7935  1.1  mrg 
   7936  1.1  mrg   pushdecl (decl);
   7937  1.1  mrg   rest_of_decl_compilation (decl, 1, 0);
   7938  1.1  mrg }
   7939  1.1  mrg 
   7940  1.1  mrg 
   7941  1.1  mrg /* Process the local variables of a BLOCK construct.  */
   7942  1.1  mrg 
   7943  1.1  mrg void
   7944  1.1  mrg gfc_process_block_locals (gfc_namespace* ns)
   7945  1.1  mrg {
   7946  1.1  mrg   tree decl;
   7947  1.1  mrg 
   7948  1.1  mrg   saved_local_decls = NULL_TREE;
   7949  1.1  mrg   has_coarray_vars = false;
   7950  1.1  mrg 
   7951  1.1  mrg   generate_local_vars (ns);
   7952  1.1  mrg 
   7953  1.1  mrg   if (flag_coarray == GFC_FCOARRAY_LIB && has_coarray_vars)
   7954  1.1  mrg     generate_coarray_init (ns);
   7955  1.1  mrg 
   7956  1.1  mrg   decl = nreverse (saved_local_decls);
   7957  1.1  mrg   while (decl)
   7958  1.1  mrg     {
   7959  1.1  mrg       tree next;
   7960  1.1  mrg 
   7961  1.1  mrg       next = DECL_CHAIN (decl);
   7962  1.1  mrg       DECL_CHAIN (decl) = NULL_TREE;
   7963  1.1  mrg       pushdecl (decl);
   7964  1.1  mrg       decl = next;
   7965  1.1  mrg     }
   7966  1.1  mrg   saved_local_decls = NULL_TREE;
   7967  1.1  mrg }
   7968  1.1  mrg 
   7969  1.1  mrg 
   7970  1.1  mrg #include "gt-fortran-trans-decl.h"
   7971