re PR fortran/90539 (481.wrf slowdown by 25% on Intel Kaby with -Ofast -march=native...
[platform/upstream/gcc.git] / gcc / fortran / trans-expr.c
1 /* Expression translation
2    Copyright (C) 2002-2019 Free Software Foundation, Inc.
3    Contributed by Paul Brook <paul@nowt.org>
4    and Steven Bosscher <s.bosscher@student.tudelft.nl>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* trans-expr.c-- generate GENERIC trees for gfc_expr.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "options.h"
28 #include "tree.h"
29 #include "gfortran.h"
30 #include "trans.h"
31 #include "stringpool.h"
32 #include "diagnostic-core.h"    /* For fatal_error.  */
33 #include "fold-const.h"
34 #include "langhooks.h"
35 #include "arith.h"
36 #include "constructor.h"
37 #include "trans-const.h"
38 #include "trans-types.h"
39 #include "trans-array.h"
40 /* Only for gfc_trans_assign and gfc_trans_pointer_assign.  */
41 #include "trans-stmt.h"
42 #include "dependency.h"
43 #include "gimplify.h"
44
45 /* Convert a scalar to an array descriptor. To be used for assumed-rank
46    arrays.  */
47
48 static tree
49 get_scalar_to_descriptor_type (tree scalar, symbol_attribute attr)
50 {
51   enum gfc_array_kind akind;
52
53   if (attr.pointer)
54     akind = GFC_ARRAY_POINTER_CONT;
55   else if (attr.allocatable)
56     akind = GFC_ARRAY_ALLOCATABLE;
57   else
58     akind = GFC_ARRAY_ASSUMED_SHAPE_CONT;
59
60   if (POINTER_TYPE_P (TREE_TYPE (scalar)))
61     scalar = TREE_TYPE (scalar);
62   return gfc_get_array_type_bounds (TREE_TYPE (scalar), 0, 0, NULL, NULL, 1,
63                                     akind, !(attr.pointer || attr.target));
64 }
65
66 tree
67 gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, symbol_attribute attr)
68 {
69   tree desc, type, etype;
70
71   type = get_scalar_to_descriptor_type (scalar, attr);
72   etype = TREE_TYPE (scalar);
73   desc = gfc_create_var (type, "desc");
74   DECL_ARTIFICIAL (desc) = 1;
75
76   if (CONSTANT_CLASS_P (scalar))
77     {
78       tree tmp;
79       tmp = gfc_create_var (TREE_TYPE (scalar), "scalar");
80       gfc_add_modify (&se->pre, tmp, scalar);
81       scalar = tmp;
82     }
83   if (!POINTER_TYPE_P (TREE_TYPE (scalar)))
84     scalar = gfc_build_addr_expr (NULL_TREE, scalar);
85   else if (TREE_TYPE (etype) && TREE_CODE (TREE_TYPE (etype)) == ARRAY_TYPE)
86     etype = TREE_TYPE (etype);
87   gfc_add_modify (&se->pre, gfc_conv_descriptor_dtype (desc),
88                   gfc_get_dtype_rank_type (0, etype));
89   gfc_conv_descriptor_data_set (&se->pre, desc, scalar);
90
91   /* Copy pointer address back - but only if it could have changed and
92      if the actual argument is a pointer and not, e.g., NULL().  */
93   if ((attr.pointer || attr.allocatable) && attr.intent != INTENT_IN)
94     gfc_add_modify (&se->post, scalar,
95                     fold_convert (TREE_TYPE (scalar),
96                                   gfc_conv_descriptor_data_get (desc)));
97   return desc;
98 }
99
100
101 /* Get the coarray token from the ultimate array or component ref.
102    Returns a NULL_TREE, when the ref object is not allocatable or pointer.  */
103
104 tree
105 gfc_get_ultimate_alloc_ptr_comps_caf_token (gfc_se *outerse, gfc_expr *expr)
106 {
107   gfc_symbol *sym = expr->symtree->n.sym;
108   bool is_coarray = sym->attr.codimension;
109   gfc_expr *caf_expr = gfc_copy_expr (expr);
110   gfc_ref *ref = caf_expr->ref, *last_caf_ref = NULL;
111
112   while (ref)
113     {
114       if (ref->type == REF_COMPONENT
115           && (ref->u.c.component->attr.allocatable
116               || ref->u.c.component->attr.pointer)
117           && (is_coarray || ref->u.c.component->attr.codimension))
118           last_caf_ref = ref;
119       ref = ref->next;
120     }
121
122   if (last_caf_ref == NULL)
123     return NULL_TREE;
124
125   tree comp = last_caf_ref->u.c.component->caf_token, caf;
126   gfc_se se;
127   bool comp_ref = !last_caf_ref->u.c.component->attr.dimension;
128   if (comp == NULL_TREE && comp_ref)
129     return NULL_TREE;
130   gfc_init_se (&se, outerse);
131   gfc_free_ref_list (last_caf_ref->next);
132   last_caf_ref->next = NULL;
133   caf_expr->rank = comp_ref ? 0 : last_caf_ref->u.c.component->as->rank;
134   se.want_pointer = comp_ref;
135   gfc_conv_expr (&se, caf_expr);
136   gfc_add_block_to_block (&outerse->pre, &se.pre);
137
138   if (TREE_CODE (se.expr) == COMPONENT_REF && comp_ref)
139     se.expr = TREE_OPERAND (se.expr, 0);
140   gfc_free_expr (caf_expr);
141
142   if (comp_ref)
143     caf = fold_build3_loc (input_location, COMPONENT_REF,
144                            TREE_TYPE (comp), se.expr, comp, NULL_TREE);
145   else
146     caf = gfc_conv_descriptor_token (se.expr);
147   return gfc_build_addr_expr (NULL_TREE, caf);
148 }
149
150
151 /* This is the seed for an eventual trans-class.c
152
153    The following parameters should not be used directly since they might
154    in future implementations.  Use the corresponding APIs.  */
155 #define CLASS_DATA_FIELD 0
156 #define CLASS_VPTR_FIELD 1
157 #define CLASS_LEN_FIELD 2
158 #define VTABLE_HASH_FIELD 0
159 #define VTABLE_SIZE_FIELD 1
160 #define VTABLE_EXTENDS_FIELD 2
161 #define VTABLE_DEF_INIT_FIELD 3
162 #define VTABLE_COPY_FIELD 4
163 #define VTABLE_FINAL_FIELD 5
164 #define VTABLE_DEALLOCATE_FIELD 6
165
166
167 tree
168 gfc_class_set_static_fields (tree decl, tree vptr, tree data)
169 {
170   tree tmp;
171   tree field;
172   vec<constructor_elt, va_gc> *init = NULL;
173
174   field = TYPE_FIELDS (TREE_TYPE (decl));
175   tmp = gfc_advance_chain (field, CLASS_DATA_FIELD);
176   CONSTRUCTOR_APPEND_ELT (init, tmp, data);
177
178   tmp = gfc_advance_chain (field, CLASS_VPTR_FIELD);
179   CONSTRUCTOR_APPEND_ELT (init, tmp, vptr);
180
181   return build_constructor (TREE_TYPE (decl), init);
182 }
183
184
185 tree
186 gfc_class_data_get (tree decl)
187 {
188   tree data;
189   if (POINTER_TYPE_P (TREE_TYPE (decl)))
190     decl = build_fold_indirect_ref_loc (input_location, decl);
191   data = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (decl)),
192                             CLASS_DATA_FIELD);
193   return fold_build3_loc (input_location, COMPONENT_REF,
194                           TREE_TYPE (data), decl, data,
195                           NULL_TREE);
196 }
197
198
199 tree
200 gfc_class_vptr_get (tree decl)
201 {
202   tree vptr;
203   /* For class arrays decl may be a temporary descriptor handle, the vptr is
204      then available through the saved descriptor.  */
205   if (VAR_P (decl) && DECL_LANG_SPECIFIC (decl)
206       && GFC_DECL_SAVED_DESCRIPTOR (decl))
207     decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
208   if (POINTER_TYPE_P (TREE_TYPE (decl)))
209     decl = build_fold_indirect_ref_loc (input_location, decl);
210   vptr = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (decl)),
211                             CLASS_VPTR_FIELD);
212   return fold_build3_loc (input_location, COMPONENT_REF,
213                           TREE_TYPE (vptr), decl, vptr,
214                           NULL_TREE);
215 }
216
217
218 tree
219 gfc_class_len_get (tree decl)
220 {
221   tree len;
222   /* For class arrays decl may be a temporary descriptor handle, the len is
223      then available through the saved descriptor.  */
224   if (VAR_P (decl) && DECL_LANG_SPECIFIC (decl)
225       && GFC_DECL_SAVED_DESCRIPTOR (decl))
226     decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
227   if (POINTER_TYPE_P (TREE_TYPE (decl)))
228     decl = build_fold_indirect_ref_loc (input_location, decl);
229   len = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (decl)),
230                            CLASS_LEN_FIELD);
231   return fold_build3_loc (input_location, COMPONENT_REF,
232                           TREE_TYPE (len), decl, len,
233                           NULL_TREE);
234 }
235
236
237 /* Try to get the _len component of a class.  When the class is not unlimited
238    poly, i.e. no _len field exists, then return a zero node.  */
239
240 tree
241 gfc_class_len_or_zero_get (tree decl)
242 {
243   tree len;
244   /* For class arrays decl may be a temporary descriptor handle, the vptr is
245      then available through the saved descriptor.  */
246   if (VAR_P (decl) && DECL_LANG_SPECIFIC (decl)
247       && GFC_DECL_SAVED_DESCRIPTOR (decl))
248     decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
249   if (POINTER_TYPE_P (TREE_TYPE (decl)))
250     decl = build_fold_indirect_ref_loc (input_location, decl);
251   len = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (decl)),
252                            CLASS_LEN_FIELD);
253   return len != NULL_TREE ? fold_build3_loc (input_location, COMPONENT_REF,
254                                              TREE_TYPE (len), decl, len,
255                                              NULL_TREE)
256     : build_zero_cst (gfc_charlen_type_node);
257 }
258
259
260 /* Get the specified FIELD from the VPTR.  */
261
262 static tree
263 vptr_field_get (tree vptr, int fieldno)
264 {
265   tree field;
266   vptr = build_fold_indirect_ref_loc (input_location, vptr);
267   field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (vptr)),
268                              fieldno);
269   field = fold_build3_loc (input_location, COMPONENT_REF,
270                            TREE_TYPE (field), vptr, field,
271                            NULL_TREE);
272   gcc_assert (field);
273   return field;
274 }
275
276
277 /* Get the field from the class' vptr.  */
278
279 static tree
280 class_vtab_field_get (tree decl, int fieldno)
281 {
282   tree vptr;
283   vptr = gfc_class_vptr_get (decl);
284   return vptr_field_get (vptr, fieldno);
285 }
286
287
288 /* Define a macro for creating the class_vtab_* and vptr_* accessors in
289    unison.  */
290 #define VTAB_GET_FIELD_GEN(name, field) tree \
291 gfc_class_vtab_## name ##_get (tree cl) \
292 { \
293   return class_vtab_field_get (cl, field); \
294 } \
295  \
296 tree \
297 gfc_vptr_## name ##_get (tree vptr) \
298 { \
299   return vptr_field_get (vptr, field); \
300 }
301
302 VTAB_GET_FIELD_GEN (hash, VTABLE_HASH_FIELD)
303 VTAB_GET_FIELD_GEN (extends, VTABLE_EXTENDS_FIELD)
304 VTAB_GET_FIELD_GEN (def_init, VTABLE_DEF_INIT_FIELD)
305 VTAB_GET_FIELD_GEN (copy, VTABLE_COPY_FIELD)
306 VTAB_GET_FIELD_GEN (final, VTABLE_FINAL_FIELD)
307 VTAB_GET_FIELD_GEN (deallocate, VTABLE_DEALLOCATE_FIELD)
308
309
310 /* The size field is returned as an array index type.  Therefore treat
311    it and only it specially.  */
312
313 tree
314 gfc_class_vtab_size_get (tree cl)
315 {
316   tree size;
317   size = class_vtab_field_get (cl, VTABLE_SIZE_FIELD);
318   /* Always return size as an array index type.  */
319   size = fold_convert (gfc_array_index_type, size);
320   gcc_assert (size);
321   return size;
322 }
323
324 tree
325 gfc_vptr_size_get (tree vptr)
326 {
327   tree size;
328   size = vptr_field_get (vptr, VTABLE_SIZE_FIELD);
329   /* Always return size as an array index type.  */
330   size = fold_convert (gfc_array_index_type, size);
331   gcc_assert (size);
332   return size;
333 }
334
335
336 #undef CLASS_DATA_FIELD
337 #undef CLASS_VPTR_FIELD
338 #undef CLASS_LEN_FIELD
339 #undef VTABLE_HASH_FIELD
340 #undef VTABLE_SIZE_FIELD
341 #undef VTABLE_EXTENDS_FIELD
342 #undef VTABLE_DEF_INIT_FIELD
343 #undef VTABLE_COPY_FIELD
344 #undef VTABLE_FINAL_FIELD
345
346
347 /* Search for the last _class ref in the chain of references of this
348    expression and cut the chain there.  Albeit this routine is similiar
349    to class.c::gfc_add_component_ref (), is there a significant
350    difference: gfc_add_component_ref () concentrates on an array ref to
351    be the last ref in the chain.  This routine is oblivious to the kind
352    of refs following.  */
353
354 gfc_expr *
355 gfc_find_and_cut_at_last_class_ref (gfc_expr *e, bool is_mold)
356 {
357   gfc_expr *base_expr;
358   gfc_ref *ref, *class_ref, *tail = NULL, *array_ref;
359
360   /* Find the last class reference.  */
361   class_ref = NULL;
362   array_ref = NULL;
363   for (ref = e->ref; ref; ref = ref->next)
364     {
365       if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
366         array_ref = ref;
367
368       if (ref->type == REF_COMPONENT
369           && ref->u.c.component->ts.type == BT_CLASS)
370         {
371           /* Component to the right of a part reference with nonzero rank
372              must not have the ALLOCATABLE attribute.  If attempts are
373              made to reference such a component reference, an error results
374              followed by an ICE.  */
375           if (array_ref && CLASS_DATA (ref->u.c.component)->attr.allocatable)
376             return NULL;
377           class_ref = ref;
378         }
379
380       if (ref->next == NULL)
381         break;
382     }
383
384   /* Remove and store all subsequent references after the
385      CLASS reference.  */
386   if (class_ref)
387     {
388       tail = class_ref->next;
389       class_ref->next = NULL;
390     }
391   else if (e->symtree && e->symtree->n.sym->ts.type == BT_CLASS)
392     {
393       tail = e->ref;
394       e->ref = NULL;
395     }
396
397   if (is_mold)
398     base_expr = gfc_expr_to_initialize (e);
399   else
400     base_expr = gfc_copy_expr (e);
401
402   /* Restore the original tail expression.  */
403   if (class_ref)
404     {
405       gfc_free_ref_list (class_ref->next);
406       class_ref->next = tail;
407     }
408   else if (e->symtree && e->symtree->n.sym->ts.type == BT_CLASS)
409     {
410       gfc_free_ref_list (e->ref);
411       e->ref = tail;
412     }
413   return base_expr;
414 }
415
416
417 /* Reset the vptr to the declared type, e.g. after deallocation.  */
418
419 void
420 gfc_reset_vptr (stmtblock_t *block, gfc_expr *e)
421 {
422   gfc_symbol *vtab;
423   tree vptr;
424   tree vtable;
425   gfc_se se;
426
427   /* Evaluate the expression and obtain the vptr from it.  */
428   gfc_init_se (&se, NULL);
429   if (e->rank)
430     gfc_conv_expr_descriptor (&se, e);
431   else
432     gfc_conv_expr (&se, e);
433   gfc_add_block_to_block (block, &se.pre);
434   vptr = gfc_get_vptr_from_expr (se.expr);
435
436   /* If a vptr is not found, we can do nothing more.  */
437   if (vptr == NULL_TREE)
438     return;
439
440   if (UNLIMITED_POLY (e))
441     gfc_add_modify (block, vptr, build_int_cst (TREE_TYPE (vptr), 0));
442   else
443     {
444       /* Return the vptr to the address of the declared type.  */
445       vtab = gfc_find_derived_vtab (e->ts.u.derived);
446       vtable = vtab->backend_decl;
447       if (vtable == NULL_TREE)
448         vtable = gfc_get_symbol_decl (vtab);
449       vtable = gfc_build_addr_expr (NULL, vtable);
450       vtable = fold_convert (TREE_TYPE (vptr), vtable);
451       gfc_add_modify (block, vptr, vtable);
452     }
453 }
454
455
456 /* Reset the len for unlimited polymorphic objects.  */
457
458 void
459 gfc_reset_len (stmtblock_t *block, gfc_expr *expr)
460 {
461   gfc_expr *e;
462   gfc_se se_len;
463   e = gfc_find_and_cut_at_last_class_ref (expr);
464   if (e == NULL)
465     return;
466   gfc_add_len_component (e);
467   gfc_init_se (&se_len, NULL);
468   gfc_conv_expr (&se_len, e);
469   gfc_add_modify (block, se_len.expr,
470                   fold_convert (TREE_TYPE (se_len.expr), integer_zero_node));
471   gfc_free_expr (e);
472 }
473
474
475 /* Obtain the vptr of the last class reference in an expression.
476    Return NULL_TREE if no class reference is found.  */
477
478 tree
479 gfc_get_vptr_from_expr (tree expr)
480 {
481   tree tmp;
482   tree type;
483
484   for (tmp = expr; tmp; tmp = TREE_OPERAND (tmp, 0))
485     {
486       type = TREE_TYPE (tmp);
487       while (type)
488         {
489           if (GFC_CLASS_TYPE_P (type))
490             return gfc_class_vptr_get (tmp);
491           if (type != TYPE_CANONICAL (type))
492             type = TYPE_CANONICAL (type);
493           else
494             type = NULL_TREE;
495         }
496       if (VAR_P (tmp) || TREE_CODE (tmp) == PARM_DECL)
497         break;
498     }
499
500   if (POINTER_TYPE_P (TREE_TYPE (tmp)))
501     tmp = build_fold_indirect_ref_loc (input_location, tmp);
502
503   if (GFC_CLASS_TYPE_P (TREE_TYPE (tmp)))
504     return gfc_class_vptr_get (tmp);
505
506   return NULL_TREE;
507 }
508
509
510 static void
511 class_array_data_assign (stmtblock_t *block, tree lhs_desc, tree rhs_desc,
512                          bool lhs_type)
513 {
514   tree tmp, tmp2, type;
515
516   gfc_conv_descriptor_data_set (block, lhs_desc,
517                                 gfc_conv_descriptor_data_get (rhs_desc));
518   gfc_conv_descriptor_offset_set (block, lhs_desc,
519                                   gfc_conv_descriptor_offset_get (rhs_desc));
520
521   gfc_add_modify (block, gfc_conv_descriptor_dtype (lhs_desc),
522                   gfc_conv_descriptor_dtype (rhs_desc));
523
524   /* Assign the dimension as range-ref.  */
525   tmp = gfc_get_descriptor_dimension (lhs_desc);
526   tmp2 = gfc_get_descriptor_dimension (rhs_desc);
527
528   type = lhs_type ? TREE_TYPE (tmp) : TREE_TYPE (tmp2);
529   tmp = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp,
530                     gfc_index_zero_node, NULL_TREE, NULL_TREE);
531   tmp2 = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp2,
532                      gfc_index_zero_node, NULL_TREE, NULL_TREE);
533   gfc_add_modify (block, tmp, tmp2);
534 }
535
536
537 /* Takes a derived type expression and returns the address of a temporary
538    class object of the 'declared' type.  If vptr is not NULL, this is
539    used for the temporary class object.
540    optional_alloc_ptr is false when the dummy is neither allocatable
541    nor a pointer; that's only relevant for the optional handling.  */
542 void
543 gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e,
544                            gfc_typespec class_ts, tree vptr, bool optional,
545                            bool optional_alloc_ptr)
546 {
547   gfc_symbol *vtab;
548   tree cond_optional = NULL_TREE;
549   gfc_ss *ss;
550   tree ctree;
551   tree var;
552   tree tmp;
553   int dim;
554
555   /* The derived type needs to be converted to a temporary
556      CLASS object.  */
557   tmp = gfc_typenode_for_spec (&class_ts);
558   var = gfc_create_var (tmp, "class");
559
560   /* Set the vptr.  */
561   ctree =  gfc_class_vptr_get (var);
562
563   if (vptr != NULL_TREE)
564     {
565       /* Use the dynamic vptr.  */
566       tmp = vptr;
567     }
568   else
569     {
570       /* In this case the vtab corresponds to the derived type and the
571          vptr must point to it.  */
572       vtab = gfc_find_derived_vtab (e->ts.u.derived);
573       gcc_assert (vtab);
574       tmp = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtab));
575     }
576   gfc_add_modify (&parmse->pre, ctree,
577                   fold_convert (TREE_TYPE (ctree), tmp));
578
579   /* Now set the data field.  */
580   ctree =  gfc_class_data_get (var);
581
582   if (optional)
583     cond_optional = gfc_conv_expr_present (e->symtree->n.sym);
584
585   if (parmse->expr && POINTER_TYPE_P (TREE_TYPE (parmse->expr)))
586     {
587       /* If there is a ready made pointer to a derived type, use it
588          rather than evaluating the expression again.  */
589       tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
590       gfc_add_modify (&parmse->pre, ctree, tmp);
591     }
592   else if (parmse->ss && parmse->ss->info && parmse->ss->info->useflags)
593     {
594       /* For an array reference in an elemental procedure call we need
595          to retain the ss to provide the scalarized array reference.  */
596       gfc_conv_expr_reference (parmse, e);
597       tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
598       if (optional)
599         tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
600                           cond_optional, tmp,
601                           fold_convert (TREE_TYPE (tmp), null_pointer_node));
602       gfc_add_modify (&parmse->pre, ctree, tmp);
603     }
604   else
605     {
606       ss = gfc_walk_expr (e);
607       if (ss == gfc_ss_terminator)
608         {
609           parmse->ss = NULL;
610           gfc_conv_expr_reference (parmse, e);
611
612           /* Scalar to an assumed-rank array.  */
613           if (class_ts.u.derived->components->as)
614             {
615               tree type;
616               type = get_scalar_to_descriptor_type (parmse->expr,
617                                                     gfc_expr_attr (e));
618               gfc_add_modify (&parmse->pre, gfc_conv_descriptor_dtype (ctree),
619                               gfc_get_dtype (type));
620               if (optional)
621                 parmse->expr = build3_loc (input_location, COND_EXPR,
622                                            TREE_TYPE (parmse->expr),
623                                            cond_optional, parmse->expr,
624                                            fold_convert (TREE_TYPE (parmse->expr),
625                                                          null_pointer_node));
626               gfc_conv_descriptor_data_set (&parmse->pre, ctree, parmse->expr);
627             }
628           else
629             {
630               tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
631               if (optional)
632                 tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
633                                   cond_optional, tmp,
634                                   fold_convert (TREE_TYPE (tmp),
635                                                 null_pointer_node));
636               gfc_add_modify (&parmse->pre, ctree, tmp);
637             }
638         }
639       else
640         {
641           stmtblock_t block;
642           gfc_init_block (&block);
643           gfc_ref *ref;
644
645           parmse->ss = ss;
646           parmse->use_offset = 1;
647           gfc_conv_expr_descriptor (parmse, e);
648
649           /* Detect any array references with vector subscripts.  */
650           for (ref = e->ref; ref; ref = ref->next)
651             if (ref->type == REF_ARRAY
652                 && ref->u.ar.type != AR_ELEMENT
653                 && ref->u.ar.type != AR_FULL)
654               {
655                 for (dim = 0; dim < ref->u.ar.dimen; dim++)
656                   if (ref->u.ar.dimen_type[dim] == DIMEN_VECTOR)
657                     break;
658                 if (dim < ref->u.ar.dimen)
659                   break;
660               }
661
662           /* Array references with vector subscripts and non-variable expressions
663              need be converted to a one-based descriptor.  */
664           if (ref || e->expr_type != EXPR_VARIABLE)
665             {
666               for (dim = 0; dim < e->rank; ++dim)
667                 gfc_conv_shift_descriptor_lbound (&block, parmse->expr, dim,
668                                                   gfc_index_one_node);
669             }
670
671           if (e->rank != class_ts.u.derived->components->as->rank)
672             {
673               gcc_assert (class_ts.u.derived->components->as->type
674                           == AS_ASSUMED_RANK);
675               class_array_data_assign (&block, ctree, parmse->expr, false);
676             }
677           else
678             {
679               if (gfc_expr_attr (e).codimension)
680                 parmse->expr = fold_build1_loc (input_location,
681                                                 VIEW_CONVERT_EXPR,
682                                                 TREE_TYPE (ctree),
683                                                 parmse->expr);
684               gfc_add_modify (&block, ctree, parmse->expr);
685             }
686
687           if (optional)
688             {
689               tmp = gfc_finish_block (&block);
690
691               gfc_init_block (&block);
692               gfc_conv_descriptor_data_set (&block, ctree, null_pointer_node);
693
694               tmp = build3_v (COND_EXPR, cond_optional, tmp,
695                               gfc_finish_block (&block));
696               gfc_add_expr_to_block (&parmse->pre, tmp);
697             }
698           else
699             gfc_add_block_to_block (&parmse->pre, &block);
700         }
701     }
702
703   if (class_ts.u.derived->components->ts.type == BT_DERIVED
704       && class_ts.u.derived->components->ts.u.derived
705                  ->attr.unlimited_polymorphic)
706     {
707       /* Take care about initializing the _len component correctly.  */
708       ctree = gfc_class_len_get (var);
709       if (UNLIMITED_POLY (e))
710         {
711           gfc_expr *len;
712           gfc_se se;
713
714           len = gfc_copy_expr (e);
715           gfc_add_len_component (len);
716           gfc_init_se (&se, NULL);
717           gfc_conv_expr (&se, len);
718           if (optional)
719             tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (se.expr),
720                               cond_optional, se.expr,
721                               fold_convert (TREE_TYPE (se.expr),
722                                             integer_zero_node));
723           else
724             tmp = se.expr;
725         }
726       else
727         tmp = integer_zero_node;
728       gfc_add_modify (&parmse->pre, ctree, fold_convert (TREE_TYPE (ctree),
729                                                           tmp));
730     }
731   /* Pass the address of the class object.  */
732   parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
733
734   if (optional && optional_alloc_ptr)
735     parmse->expr = build3_loc (input_location, COND_EXPR,
736                                TREE_TYPE (parmse->expr),
737                                cond_optional, parmse->expr,
738                                fold_convert (TREE_TYPE (parmse->expr),
739                                              null_pointer_node));
740 }
741
742
743 /* Create a new class container, which is required as scalar coarrays
744    have an array descriptor while normal scalars haven't. Optionally,
745    NULL pointer checks are added if the argument is OPTIONAL.  */
746
747 static void
748 class_scalar_coarray_to_class (gfc_se *parmse, gfc_expr *e,
749                                gfc_typespec class_ts, bool optional)
750 {
751   tree var, ctree, tmp;
752   stmtblock_t block;
753   gfc_ref *ref;
754   gfc_ref *class_ref;
755
756   gfc_init_block (&block);
757
758   class_ref = NULL;
759   for (ref = e->ref; ref; ref = ref->next)
760     {
761       if (ref->type == REF_COMPONENT
762             && ref->u.c.component->ts.type == BT_CLASS)
763         class_ref = ref;
764     }
765
766   if (class_ref == NULL
767         && e->symtree && e->symtree->n.sym->ts.type == BT_CLASS)
768     tmp = e->symtree->n.sym->backend_decl;
769   else
770     {
771       /* Remove everything after the last class reference, convert the
772          expression and then recover its tailend once more.  */
773       gfc_se tmpse;
774       ref = class_ref->next;
775       class_ref->next = NULL;
776       gfc_init_se (&tmpse, NULL);
777       gfc_conv_expr (&tmpse, e);
778       class_ref->next = ref;
779       tmp = tmpse.expr;
780     }
781
782   var = gfc_typenode_for_spec (&class_ts);
783   var = gfc_create_var (var, "class");
784
785   ctree = gfc_class_vptr_get (var);
786   gfc_add_modify (&block, ctree,
787                   fold_convert (TREE_TYPE (ctree), gfc_class_vptr_get (tmp)));
788
789   ctree = gfc_class_data_get (var);
790   tmp = gfc_conv_descriptor_data_get (gfc_class_data_get (tmp));
791   gfc_add_modify (&block, ctree, fold_convert (TREE_TYPE (ctree), tmp));
792
793   /* Pass the address of the class object.  */
794   parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
795
796   if (optional)
797     {
798       tree cond = gfc_conv_expr_present (e->symtree->n.sym);
799       tree tmp2;
800
801       tmp = gfc_finish_block (&block);
802
803       gfc_init_block (&block);
804       tmp2 = gfc_class_data_get (var);
805       gfc_add_modify (&block, tmp2, fold_convert (TREE_TYPE (tmp2),
806                                                   null_pointer_node));
807       tmp2 = gfc_finish_block (&block);
808
809       tmp = build3_loc (input_location, COND_EXPR, void_type_node,
810                         cond, tmp, tmp2);
811       gfc_add_expr_to_block (&parmse->pre, tmp);
812     }
813   else
814     gfc_add_block_to_block (&parmse->pre, &block);
815 }
816
817
818 /* Takes an intrinsic type expression and returns the address of a temporary
819    class object of the 'declared' type.  */
820 void
821 gfc_conv_intrinsic_to_class (gfc_se *parmse, gfc_expr *e,
822                              gfc_typespec class_ts)
823 {
824   gfc_symbol *vtab;
825   gfc_ss *ss;
826   tree ctree;
827   tree var;
828   tree tmp;
829
830   /* The intrinsic type needs to be converted to a temporary
831      CLASS object.  */
832   tmp = gfc_typenode_for_spec (&class_ts);
833   var = gfc_create_var (tmp, "class");
834
835   /* Set the vptr.  */
836   ctree = gfc_class_vptr_get (var);
837
838   vtab = gfc_find_vtab (&e->ts);
839   gcc_assert (vtab);
840   tmp = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtab));
841   gfc_add_modify (&parmse->pre, ctree,
842                   fold_convert (TREE_TYPE (ctree), tmp));
843
844   /* Now set the data field.  */
845   ctree = gfc_class_data_get (var);
846   if (parmse->ss && parmse->ss->info->useflags)
847     {
848       /* For an array reference in an elemental procedure call we need
849          to retain the ss to provide the scalarized array reference.  */
850       gfc_conv_expr_reference (parmse, e);
851       tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
852       gfc_add_modify (&parmse->pre, ctree, tmp);
853     }
854   else
855     {
856       ss = gfc_walk_expr (e);
857       if (ss == gfc_ss_terminator)
858         {
859           parmse->ss = NULL;
860           gfc_conv_expr_reference (parmse, e);
861           if (class_ts.u.derived->components->as
862               && class_ts.u.derived->components->as->type == AS_ASSUMED_RANK)
863             {
864               tmp = gfc_conv_scalar_to_descriptor (parmse, parmse->expr,
865                                                    gfc_expr_attr (e));
866               tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
867                                      TREE_TYPE (ctree), tmp);
868             }
869           else
870               tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
871           gfc_add_modify (&parmse->pre, ctree, tmp);
872         }
873       else
874         {
875           parmse->ss = ss;
876           parmse->use_offset = 1;
877           gfc_conv_expr_descriptor (parmse, e);
878           if (class_ts.u.derived->components->as->rank != e->rank)
879             {
880               tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
881                                      TREE_TYPE (ctree), parmse->expr);
882               gfc_add_modify (&parmse->pre, ctree, tmp);
883             }
884           else
885             gfc_add_modify (&parmse->pre, ctree, parmse->expr);
886         }
887     }
888
889   gcc_assert (class_ts.type == BT_CLASS);
890   if (class_ts.u.derived->components->ts.type == BT_DERIVED
891       && class_ts.u.derived->components->ts.u.derived
892                  ->attr.unlimited_polymorphic)
893     {
894       ctree = gfc_class_len_get (var);
895       /* When the actual arg is a char array, then set the _len component of the
896          unlimited polymorphic entity to the length of the string.  */
897       if (e->ts.type == BT_CHARACTER)
898         {
899           /* Start with parmse->string_length because this seems to be set to a
900            correct value more often.  */
901           if (parmse->string_length)
902             tmp = parmse->string_length;
903           /* When the string_length is not yet set, then try the backend_decl of
904            the cl.  */
905           else if (e->ts.u.cl->backend_decl)
906             tmp = e->ts.u.cl->backend_decl;
907           /* If both of the above approaches fail, then try to generate an
908            expression from the input, which is only feasible currently, when the
909            expression can be evaluated to a constant one.  */
910           else
911             {
912               /* Try to simplify the expression.  */
913               gfc_simplify_expr (e, 0);
914               if (e->expr_type == EXPR_CONSTANT && !e->ts.u.cl->resolved)
915                 {
916                   /* Amazingly all data is present to compute the length of a
917                    constant string, but the expression is not yet there.  */
918                   e->ts.u.cl->length = gfc_get_constant_expr (BT_INTEGER,
919                                                               gfc_charlen_int_kind,
920                                                               &e->where);
921                   mpz_set_ui (e->ts.u.cl->length->value.integer,
922                               e->value.character.length);
923                   gfc_conv_const_charlen (e->ts.u.cl);
924                   e->ts.u.cl->resolved = 1;
925                   tmp = e->ts.u.cl->backend_decl;
926                 }
927               else
928                 {
929                   gfc_error ("Cannot compute the length of the char array "
930                              "at %L.", &e->where);
931                 }
932             }
933         }
934       else
935         tmp = integer_zero_node;
936
937       gfc_add_modify (&parmse->pre, ctree, fold_convert (TREE_TYPE (ctree), tmp));
938     }
939   else if (class_ts.type == BT_CLASS
940            && class_ts.u.derived->components
941            && class_ts.u.derived->components->ts.u
942                 .derived->attr.unlimited_polymorphic)
943     {
944       ctree = gfc_class_len_get (var);
945       gfc_add_modify (&parmse->pre, ctree,
946                       fold_convert (TREE_TYPE (ctree),
947                                     integer_zero_node));
948     }
949   /* Pass the address of the class object.  */
950   parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
951 }
952
953
954 /* Takes a scalarized class array expression and returns the
955    address of a temporary scalar class object of the 'declared'
956    type.
957    OOP-TODO: This could be improved by adding code that branched on
958    the dynamic type being the same as the declared type. In this case
959    the original class expression can be passed directly.
960    optional_alloc_ptr is false when the dummy is neither allocatable
961    nor a pointer; that's relevant for the optional handling.
962    Set copyback to true if class container's _data and _vtab pointers
963    might get modified.  */
964
965 void
966 gfc_conv_class_to_class (gfc_se *parmse, gfc_expr *e, gfc_typespec class_ts,
967                          bool elemental, bool copyback, bool optional,
968                          bool optional_alloc_ptr)
969 {
970   tree ctree;
971   tree var;
972   tree tmp;
973   tree vptr;
974   tree cond = NULL_TREE;
975   tree slen = NULL_TREE;
976   gfc_ref *ref;
977   gfc_ref *class_ref;
978   stmtblock_t block;
979   bool full_array = false;
980
981   gfc_init_block (&block);
982
983   class_ref = NULL;
984   for (ref = e->ref; ref; ref = ref->next)
985     {
986       if (ref->type == REF_COMPONENT
987             && ref->u.c.component->ts.type == BT_CLASS)
988         class_ref = ref;
989
990       if (ref->next == NULL)
991         break;
992     }
993
994   if ((ref == NULL || class_ref == ref)
995       && !(gfc_is_class_array_function (e) && parmse->class_vptr != NULL_TREE)
996       && (!class_ts.u.derived->components->as
997           || class_ts.u.derived->components->as->rank != -1))
998     return;
999
1000   /* Test for FULL_ARRAY.  */
1001   if (e->rank == 0 && gfc_expr_attr (e).codimension
1002       && gfc_expr_attr (e).dimension)
1003     full_array = true;
1004   else
1005     gfc_is_class_array_ref (e, &full_array);
1006
1007   /* The derived type needs to be converted to a temporary
1008      CLASS object.  */
1009   tmp = gfc_typenode_for_spec (&class_ts);
1010   var = gfc_create_var (tmp, "class");
1011
1012   /* Set the data.  */
1013   ctree = gfc_class_data_get (var);
1014   if (class_ts.u.derived->components->as
1015       && e->rank != class_ts.u.derived->components->as->rank)
1016     {
1017       if (e->rank == 0)
1018         {
1019           tree type = get_scalar_to_descriptor_type (parmse->expr,
1020                                                      gfc_expr_attr (e));
1021           gfc_add_modify (&block, gfc_conv_descriptor_dtype (ctree),
1022                           gfc_get_dtype (type));
1023
1024           tmp = gfc_class_data_get (parmse->expr);
1025           if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1026             tmp = gfc_build_addr_expr (NULL_TREE, tmp);
1027
1028           gfc_conv_descriptor_data_set (&block, ctree, tmp);
1029         }
1030       else
1031         class_array_data_assign (&block, ctree, parmse->expr, false);
1032     }
1033   else
1034     {
1035       if (TREE_TYPE (parmse->expr) != TREE_TYPE (ctree))
1036         parmse->expr = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
1037                                         TREE_TYPE (ctree), parmse->expr);
1038       gfc_add_modify (&block, ctree, parmse->expr);
1039     }
1040
1041   /* Return the data component, except in the case of scalarized array
1042      references, where nullification of the cannot occur and so there
1043      is no need.  */
1044   if (!elemental && full_array && copyback)
1045     {
1046       if (class_ts.u.derived->components->as
1047           && e->rank != class_ts.u.derived->components->as->rank)
1048         {
1049           if (e->rank == 0)
1050             gfc_add_modify (&parmse->post, gfc_class_data_get (parmse->expr),
1051                             gfc_conv_descriptor_data_get (ctree));
1052           else
1053             class_array_data_assign (&parmse->post, parmse->expr, ctree, true);
1054         }
1055       else
1056         gfc_add_modify (&parmse->post, parmse->expr, ctree);
1057     }
1058
1059   /* Set the vptr.  */
1060   ctree = gfc_class_vptr_get (var);
1061
1062   /* The vptr is the second field of the actual argument.
1063      First we have to find the corresponding class reference.  */
1064
1065   tmp = NULL_TREE;
1066   if (gfc_is_class_array_function (e)
1067       && parmse->class_vptr != NULL_TREE)
1068     tmp = parmse->class_vptr;
1069   else if (class_ref == NULL
1070            && e->symtree && e->symtree->n.sym->ts.type == BT_CLASS)
1071     {
1072       tmp = e->symtree->n.sym->backend_decl;
1073
1074       if (TREE_CODE (tmp) == FUNCTION_DECL)
1075         tmp = gfc_get_fake_result_decl (e->symtree->n.sym, 0);
1076
1077       if (DECL_LANG_SPECIFIC (tmp) && GFC_DECL_SAVED_DESCRIPTOR (tmp))
1078         tmp = GFC_DECL_SAVED_DESCRIPTOR (tmp);
1079
1080       slen = build_zero_cst (size_type_node);
1081     }
1082   else
1083     {
1084       /* Remove everything after the last class reference, convert the
1085          expression and then recover its tailend once more.  */
1086       gfc_se tmpse;
1087       ref = class_ref->next;
1088       class_ref->next = NULL;
1089       gfc_init_se (&tmpse, NULL);
1090       gfc_conv_expr (&tmpse, e);
1091       class_ref->next = ref;
1092       tmp = tmpse.expr;
1093       slen = tmpse.string_length;
1094     }
1095
1096   gcc_assert (tmp != NULL_TREE);
1097
1098   /* Dereference if needs be.  */
1099   if (TREE_CODE (TREE_TYPE (tmp)) == REFERENCE_TYPE)
1100     tmp = build_fold_indirect_ref_loc (input_location, tmp);
1101
1102   if (!(gfc_is_class_array_function (e) && parmse->class_vptr))
1103     vptr = gfc_class_vptr_get (tmp);
1104   else
1105     vptr = tmp;
1106
1107   gfc_add_modify (&block, ctree,
1108                   fold_convert (TREE_TYPE (ctree), vptr));
1109
1110   /* Return the vptr component, except in the case of scalarized array
1111      references, where the dynamic type cannot change.  */
1112   if (!elemental && full_array && copyback)
1113     gfc_add_modify (&parmse->post, vptr,
1114                     fold_convert (TREE_TYPE (vptr), ctree));
1115
1116   /* For unlimited polymorphic objects also set the _len component.  */
1117   if (class_ts.type == BT_CLASS
1118       && class_ts.u.derived->components
1119       && class_ts.u.derived->components->ts.u
1120                       .derived->attr.unlimited_polymorphic)
1121     {
1122       ctree = gfc_class_len_get (var);
1123       if (UNLIMITED_POLY (e))
1124         tmp = gfc_class_len_get (tmp);
1125       else if (e->ts.type == BT_CHARACTER)
1126         {
1127           gcc_assert (slen != NULL_TREE);
1128           tmp = slen;
1129         }
1130       else
1131         tmp = build_zero_cst (size_type_node);
1132       gfc_add_modify (&parmse->pre, ctree,
1133                       fold_convert (TREE_TYPE (ctree), tmp));
1134
1135       /* Return the len component, except in the case of scalarized array
1136         references, where the dynamic type cannot change.  */
1137       if (!elemental && full_array && copyback
1138           && (UNLIMITED_POLY (e) || VAR_P (tmp)))
1139           gfc_add_modify (&parmse->post, tmp,
1140                           fold_convert (TREE_TYPE (tmp), ctree));
1141     }
1142
1143   if (optional)
1144     {
1145       tree tmp2;
1146
1147       cond = gfc_conv_expr_present (e->symtree->n.sym);
1148       /* parmse->pre may contain some preparatory instructions for the
1149          temporary array descriptor.  Those may only be executed when the
1150          optional argument is set, therefore add parmse->pre's instructions
1151          to block, which is later guarded by an if (optional_arg_given).  */
1152       gfc_add_block_to_block (&parmse->pre, &block);
1153       block.head = parmse->pre.head;
1154       parmse->pre.head = NULL_TREE;
1155       tmp = gfc_finish_block (&block);
1156
1157       if (optional_alloc_ptr)
1158         tmp2 = build_empty_stmt (input_location);
1159       else
1160         {
1161           gfc_init_block (&block);
1162
1163           tmp2 = gfc_conv_descriptor_data_get (gfc_class_data_get (var));
1164           gfc_add_modify (&block, tmp2, fold_convert (TREE_TYPE (tmp2),
1165                                                       null_pointer_node));
1166           tmp2 = gfc_finish_block (&block);
1167         }
1168
1169       tmp = build3_loc (input_location, COND_EXPR, void_type_node,
1170                         cond, tmp, tmp2);
1171       gfc_add_expr_to_block (&parmse->pre, tmp);
1172     }
1173   else
1174     gfc_add_block_to_block (&parmse->pre, &block);
1175
1176   /* Pass the address of the class object.  */
1177   parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
1178
1179   if (optional && optional_alloc_ptr)
1180     parmse->expr = build3_loc (input_location, COND_EXPR,
1181                                TREE_TYPE (parmse->expr),
1182                                cond, parmse->expr,
1183                                fold_convert (TREE_TYPE (parmse->expr),
1184                                              null_pointer_node));
1185 }
1186
1187
1188 /* Given a class array declaration and an index, returns the address
1189    of the referenced element.  */
1190
1191 tree
1192 gfc_get_class_array_ref (tree index, tree class_decl, tree data_comp,
1193                          bool unlimited)
1194 {
1195   tree data, size, tmp, ctmp, offset, ptr;
1196
1197   data = data_comp != NULL_TREE ? data_comp :
1198                                   gfc_class_data_get (class_decl);
1199   size = gfc_class_vtab_size_get (class_decl);
1200
1201   if (unlimited)
1202     {
1203       tmp = fold_convert (gfc_array_index_type,
1204                           gfc_class_len_get (class_decl));
1205       ctmp = fold_build2_loc (input_location, MULT_EXPR,
1206                               gfc_array_index_type, size, tmp);
1207       tmp = fold_build2_loc (input_location, GT_EXPR,
1208                              logical_type_node, tmp,
1209                              build_zero_cst (TREE_TYPE (tmp)));
1210       size = fold_build3_loc (input_location, COND_EXPR,
1211                               gfc_array_index_type, tmp, ctmp, size);
1212     }
1213
1214   offset = fold_build2_loc (input_location, MULT_EXPR,
1215                             gfc_array_index_type,
1216                             index, size);
1217
1218   data = gfc_conv_descriptor_data_get (data);
1219   ptr = fold_convert (pvoid_type_node, data);
1220   ptr = fold_build_pointer_plus_loc (input_location, ptr, offset);
1221   return fold_convert (TREE_TYPE (data), ptr);
1222 }
1223
1224
1225 /* Copies one class expression to another, assuming that if either
1226    'to' or 'from' are arrays they are packed.  Should 'from' be
1227    NULL_TREE, the initialization expression for 'to' is used, assuming
1228    that the _vptr is set.  */
1229
1230 tree
1231 gfc_copy_class_to_class (tree from, tree to, tree nelems, bool unlimited)
1232 {
1233   tree fcn;
1234   tree fcn_type;
1235   tree from_data;
1236   tree from_len;
1237   tree to_data;
1238   tree to_len;
1239   tree to_ref;
1240   tree from_ref;
1241   vec<tree, va_gc> *args;
1242   tree tmp;
1243   tree stdcopy;
1244   tree extcopy;
1245   tree index;
1246   bool is_from_desc = false, is_to_class = false;
1247
1248   args = NULL;
1249   /* To prevent warnings on uninitialized variables.  */
1250   from_len = to_len = NULL_TREE;
1251
1252   if (from != NULL_TREE)
1253     fcn = gfc_class_vtab_copy_get (from);
1254   else
1255     fcn = gfc_class_vtab_copy_get (to);
1256
1257   fcn_type = TREE_TYPE (TREE_TYPE (fcn));
1258
1259   if (from != NULL_TREE)
1260     {
1261       is_from_desc = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (from));
1262       if (is_from_desc)
1263         {
1264           from_data = from;
1265           from = GFC_DECL_SAVED_DESCRIPTOR (from);
1266         }
1267       else
1268         {
1269           /* Check that from is a class.  When the class is part of a coarray,
1270              then from is a common pointer and is to be used as is.  */
1271           tmp = POINTER_TYPE_P (TREE_TYPE (from))
1272               ? build_fold_indirect_ref (from) : from;
1273           from_data =
1274               (GFC_CLASS_TYPE_P (TREE_TYPE (tmp))
1275                || (DECL_P (tmp) && GFC_DECL_CLASS (tmp)))
1276               ? gfc_class_data_get (from) : from;
1277           is_from_desc = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (from_data));
1278         }
1279      }
1280   else
1281     from_data = gfc_class_vtab_def_init_get (to);
1282
1283   if (unlimited)
1284     {
1285       if (from != NULL_TREE && unlimited)
1286         from_len = gfc_class_len_or_zero_get (from);
1287       else
1288         from_len = build_zero_cst (size_type_node);
1289     }
1290
1291   if (GFC_CLASS_TYPE_P (TREE_TYPE (to)))
1292     {
1293       is_to_class = true;
1294       to_data = gfc_class_data_get (to);
1295       if (unlimited)
1296         to_len = gfc_class_len_get (to);
1297     }
1298   else
1299     /* When to is a BT_DERIVED and not a BT_CLASS, then to_data == to.  */
1300     to_data = to;
1301
1302   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (to_data)))
1303     {
1304       stmtblock_t loopbody;
1305       stmtblock_t body;
1306       stmtblock_t ifbody;
1307       gfc_loopinfo loop;
1308       tree orig_nelems = nelems; /* Needed for bounds check.  */
1309
1310       gfc_init_block (&body);
1311       tmp = fold_build2_loc (input_location, MINUS_EXPR,
1312                              gfc_array_index_type, nelems,
1313                              gfc_index_one_node);
1314       nelems = gfc_evaluate_now (tmp, &body);
1315       index = gfc_create_var (gfc_array_index_type, "S");
1316
1317       if (is_from_desc)
1318         {
1319           from_ref = gfc_get_class_array_ref (index, from, from_data,
1320                                               unlimited);
1321           vec_safe_push (args, from_ref);
1322         }
1323       else
1324         vec_safe_push (args, from_data);
1325
1326       if (is_to_class)
1327         to_ref = gfc_get_class_array_ref (index, to, to_data, unlimited);
1328       else
1329         {
1330           tmp = gfc_conv_array_data (to);
1331           tmp = build_fold_indirect_ref_loc (input_location, tmp);
1332           to_ref = gfc_build_addr_expr (NULL_TREE,
1333                                         gfc_build_array_ref (tmp, index, to));
1334         }
1335       vec_safe_push (args, to_ref);
1336
1337       /* Add bounds check.  */
1338       if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) > 0 && is_from_desc)
1339         {
1340           char *msg;
1341           const char *name = "<<unknown>>";
1342           tree from_len;
1343
1344           if (DECL_P (to))
1345             name = (const char *)(DECL_NAME (to)->identifier.id.str);
1346
1347           from_len = gfc_conv_descriptor_size (from_data, 1);
1348           tmp = fold_build2_loc (input_location, NE_EXPR,
1349                                   logical_type_node, from_len, orig_nelems);
1350           msg = xasprintf ("Array bound mismatch for dimension %d "
1351                            "of array '%s' (%%ld/%%ld)",
1352                            1, name);
1353
1354           gfc_trans_runtime_check (true, false, tmp, &body,
1355                                    &gfc_current_locus, msg,
1356                              fold_convert (long_integer_type_node, orig_nelems),
1357                                fold_convert (long_integer_type_node, from_len));
1358
1359           free (msg);
1360         }
1361
1362       tmp = build_call_vec (fcn_type, fcn, args);
1363
1364       /* Build the body of the loop.  */
1365       gfc_init_block (&loopbody);
1366       gfc_add_expr_to_block (&loopbody, tmp);
1367
1368       /* Build the loop and return.  */
1369       gfc_init_loopinfo (&loop);
1370       loop.dimen = 1;
1371       loop.from[0] = gfc_index_zero_node;
1372       loop.loopvar[0] = index;
1373       loop.to[0] = nelems;
1374       gfc_trans_scalarizing_loops (&loop, &loopbody);
1375       gfc_init_block (&ifbody);
1376       gfc_add_block_to_block (&ifbody, &loop.pre);
1377       stdcopy = gfc_finish_block (&ifbody);
1378       /* In initialization mode from_len is a constant zero.  */
1379       if (unlimited && !integer_zerop (from_len))
1380         {
1381           vec_safe_push (args, from_len);
1382           vec_safe_push (args, to_len);
1383           tmp = build_call_vec (fcn_type, fcn, args);
1384           /* Build the body of the loop.  */
1385           gfc_init_block (&loopbody);
1386           gfc_add_expr_to_block (&loopbody, tmp);
1387
1388           /* Build the loop and return.  */
1389           gfc_init_loopinfo (&loop);
1390           loop.dimen = 1;
1391           loop.from[0] = gfc_index_zero_node;
1392           loop.loopvar[0] = index;
1393           loop.to[0] = nelems;
1394           gfc_trans_scalarizing_loops (&loop, &loopbody);
1395           gfc_init_block (&ifbody);
1396           gfc_add_block_to_block (&ifbody, &loop.pre);
1397           extcopy = gfc_finish_block (&ifbody);
1398
1399           tmp = fold_build2_loc (input_location, GT_EXPR,
1400                                  logical_type_node, from_len,
1401                                  build_zero_cst (TREE_TYPE (from_len)));
1402           tmp = fold_build3_loc (input_location, COND_EXPR,
1403                                  void_type_node, tmp, extcopy, stdcopy);
1404           gfc_add_expr_to_block (&body, tmp);
1405           tmp = gfc_finish_block (&body);
1406         }
1407       else
1408         {
1409           gfc_add_expr_to_block (&body, stdcopy);
1410           tmp = gfc_finish_block (&body);
1411         }
1412       gfc_cleanup_loop (&loop);
1413     }
1414   else
1415     {
1416       gcc_assert (!is_from_desc);
1417       vec_safe_push (args, from_data);
1418       vec_safe_push (args, to_data);
1419       stdcopy = build_call_vec (fcn_type, fcn, args);
1420
1421       /* In initialization mode from_len is a constant zero.  */
1422       if (unlimited && !integer_zerop (from_len))
1423         {
1424           vec_safe_push (args, from_len);
1425           vec_safe_push (args, to_len);
1426           extcopy = build_call_vec (fcn_type, fcn, args);
1427           tmp = fold_build2_loc (input_location, GT_EXPR,
1428                                  logical_type_node, from_len,
1429                                  build_zero_cst (TREE_TYPE (from_len)));
1430           tmp = fold_build3_loc (input_location, COND_EXPR,
1431                                  void_type_node, tmp, extcopy, stdcopy);
1432         }
1433       else
1434         tmp = stdcopy;
1435     }
1436
1437   /* Only copy _def_init to to_data, when it is not a NULL-pointer.  */
1438   if (from == NULL_TREE)
1439     {
1440       tree cond;
1441       cond = fold_build2_loc (input_location, NE_EXPR,
1442                               logical_type_node,
1443                               from_data, null_pointer_node);
1444       tmp = fold_build3_loc (input_location, COND_EXPR,
1445                              void_type_node, cond,
1446                              tmp, build_empty_stmt (input_location));
1447     }
1448
1449   return tmp;
1450 }
1451
1452
1453 static tree
1454 gfc_trans_class_array_init_assign (gfc_expr *rhs, gfc_expr *lhs, gfc_expr *obj)
1455 {
1456   gfc_actual_arglist *actual;
1457   gfc_expr *ppc;
1458   gfc_code *ppc_code;
1459   tree res;
1460
1461   actual = gfc_get_actual_arglist ();
1462   actual->expr = gfc_copy_expr (rhs);
1463   actual->next = gfc_get_actual_arglist ();
1464   actual->next->expr = gfc_copy_expr (lhs);
1465   ppc = gfc_copy_expr (obj);
1466   gfc_add_vptr_component (ppc);
1467   gfc_add_component_ref (ppc, "_copy");
1468   ppc_code = gfc_get_code (EXEC_CALL);
1469   ppc_code->resolved_sym = ppc->symtree->n.sym;
1470   /* Although '_copy' is set to be elemental in class.c, it is
1471      not staying that way.  Find out why, sometime....  */
1472   ppc_code->resolved_sym->attr.elemental = 1;
1473   ppc_code->ext.actual = actual;
1474   ppc_code->expr1 = ppc;
1475   /* Since '_copy' is elemental, the scalarizer will take care
1476      of arrays in gfc_trans_call.  */
1477   res = gfc_trans_call (ppc_code, false, NULL, NULL, false);
1478   gfc_free_statements (ppc_code);
1479
1480   if (UNLIMITED_POLY(obj))
1481     {
1482       /* Check if rhs is non-NULL. */
1483       gfc_se src;
1484       gfc_init_se (&src, NULL);
1485       gfc_conv_expr (&src, rhs);
1486       src.expr = gfc_build_addr_expr (NULL_TREE, src.expr);
1487       tree cond = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
1488                                    src.expr, fold_convert (TREE_TYPE (src.expr),
1489                                                            null_pointer_node));
1490       res = build3_loc (input_location, COND_EXPR, TREE_TYPE (res), cond, res,
1491                         build_empty_stmt (input_location));
1492     }
1493
1494   return res;
1495 }
1496
1497 /* Special case for initializing a polymorphic dummy with INTENT(OUT).
1498    A MEMCPY is needed to copy the full data from the default initializer
1499    of the dynamic type.  */
1500
1501 tree
1502 gfc_trans_class_init_assign (gfc_code *code)
1503 {
1504   stmtblock_t block;
1505   tree tmp;
1506   gfc_se dst,src,memsz;
1507   gfc_expr *lhs, *rhs, *sz;
1508
1509   gfc_start_block (&block);
1510
1511   lhs = gfc_copy_expr (code->expr1);
1512
1513   rhs = gfc_copy_expr (code->expr1);
1514   gfc_add_vptr_component (rhs);
1515
1516   /* Make sure that the component backend_decls have been built, which
1517      will not have happened if the derived types concerned have not
1518      been referenced.  */
1519   gfc_get_derived_type (rhs->ts.u.derived);
1520   gfc_add_def_init_component (rhs);
1521   /* The _def_init is always scalar.  */
1522   rhs->rank = 0;
1523
1524   if (code->expr1->ts.type == BT_CLASS
1525       && CLASS_DATA (code->expr1)->attr.dimension)
1526     {
1527       gfc_array_spec *tmparr = gfc_get_array_spec ();
1528       *tmparr = *CLASS_DATA (code->expr1)->as;
1529       /* Adding the array ref to the class expression results in correct
1530          indexing to the dynamic type.  */
1531       gfc_add_full_array_ref (lhs, tmparr);
1532       tmp = gfc_trans_class_array_init_assign (rhs, lhs, code->expr1);
1533     }
1534   else
1535     {
1536       /* Scalar initialization needs the _data component.  */
1537       gfc_add_data_component (lhs);
1538       sz = gfc_copy_expr (code->expr1);
1539       gfc_add_vptr_component (sz);
1540       gfc_add_size_component (sz);
1541
1542       gfc_init_se (&dst, NULL);
1543       gfc_init_se (&src, NULL);
1544       gfc_init_se (&memsz, NULL);
1545       gfc_conv_expr (&dst, lhs);
1546       gfc_conv_expr (&src, rhs);
1547       gfc_conv_expr (&memsz, sz);
1548       gfc_add_block_to_block (&block, &src.pre);
1549       src.expr = gfc_build_addr_expr (NULL_TREE, src.expr);
1550
1551       tmp = gfc_build_memcpy_call (dst.expr, src.expr, memsz.expr);
1552
1553       if (UNLIMITED_POLY(code->expr1))
1554         {
1555           /* Check if _def_init is non-NULL. */
1556           tree cond = fold_build2_loc (input_location, NE_EXPR,
1557                                        logical_type_node, src.expr,
1558                                        fold_convert (TREE_TYPE (src.expr),
1559                                                      null_pointer_node));
1560           tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), cond,
1561                             tmp, build_empty_stmt (input_location));
1562         }
1563     }
1564
1565   if (code->expr1->symtree->n.sym->attr.optional
1566       || code->expr1->symtree->n.sym->ns->proc_name->attr.entry_master)
1567     {
1568       tree present = gfc_conv_expr_present (code->expr1->symtree->n.sym);
1569       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp),
1570                         present, tmp,
1571                         build_empty_stmt (input_location));
1572     }
1573
1574   gfc_add_expr_to_block (&block, tmp);
1575
1576   return gfc_finish_block (&block);
1577 }
1578
1579
1580 /* End of prototype trans-class.c  */
1581
1582
1583 static void
1584 realloc_lhs_warning (bt type, bool array, locus *where)
1585 {
1586   if (array && type != BT_CLASS && type != BT_DERIVED && warn_realloc_lhs)
1587     gfc_warning (OPT_Wrealloc_lhs,
1588                  "Code for reallocating the allocatable array at %L will "
1589                  "be added", where);
1590   else if (warn_realloc_lhs_all)
1591     gfc_warning (OPT_Wrealloc_lhs_all,
1592                  "Code for reallocating the allocatable variable at %L "
1593                  "will be added", where);
1594 }
1595
1596
1597 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
1598                                                  gfc_expr *);
1599
1600 /* Copy the scalarization loop variables.  */
1601
1602 static void
1603 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
1604 {
1605   dest->ss = src->ss;
1606   dest->loop = src->loop;
1607 }
1608
1609
1610 /* Initialize a simple expression holder.
1611
1612    Care must be taken when multiple se are created with the same parent.
1613    The child se must be kept in sync.  The easiest way is to delay creation
1614    of a child se until after after the previous se has been translated.  */
1615
1616 void
1617 gfc_init_se (gfc_se * se, gfc_se * parent)
1618 {
1619   memset (se, 0, sizeof (gfc_se));
1620   gfc_init_block (&se->pre);
1621   gfc_init_block (&se->post);
1622
1623   se->parent = parent;
1624
1625   if (parent)
1626     gfc_copy_se_loopvars (se, parent);
1627 }
1628
1629
1630 /* Advances to the next SS in the chain.  Use this rather than setting
1631    se->ss = se->ss->next because all the parents needs to be kept in sync.
1632    See gfc_init_se.  */
1633
1634 void
1635 gfc_advance_se_ss_chain (gfc_se * se)
1636 {
1637   gfc_se *p;
1638   gfc_ss *ss;
1639
1640   gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
1641
1642   p = se;
1643   /* Walk down the parent chain.  */
1644   while (p != NULL)
1645     {
1646       /* Simple consistency check.  */
1647       gcc_assert (p->parent == NULL || p->parent->ss == p->ss
1648                   || p->parent->ss->nested_ss == p->ss);
1649
1650       /* If we were in a nested loop, the next scalarized expression can be
1651          on the parent ss' next pointer.  Thus we should not take the next
1652          pointer blindly, but rather go up one nest level as long as next
1653          is the end of chain.  */
1654       ss = p->ss;
1655       while (ss->next == gfc_ss_terminator && ss->parent != NULL)
1656         ss = ss->parent;
1657
1658       p->ss = ss->next;
1659
1660       p = p->parent;
1661     }
1662 }
1663
1664
1665 /* Ensures the result of the expression as either a temporary variable
1666    or a constant so that it can be used repeatedly.  */
1667
1668 void
1669 gfc_make_safe_expr (gfc_se * se)
1670 {
1671   tree var;
1672
1673   if (CONSTANT_CLASS_P (se->expr))
1674     return;
1675
1676   /* We need a temporary for this result.  */
1677   var = gfc_create_var (TREE_TYPE (se->expr), NULL);
1678   gfc_add_modify (&se->pre, var, se->expr);
1679   se->expr = var;
1680 }
1681
1682
1683 /* Return an expression which determines if a dummy parameter is present.
1684    Also used for arguments to procedures with multiple entry points.  */
1685
1686 tree
1687 gfc_conv_expr_present (gfc_symbol * sym)
1688 {
1689   tree decl, cond;
1690
1691   gcc_assert (sym->attr.dummy);
1692   decl = gfc_get_symbol_decl (sym);
1693
1694   /* Intrinsic scalars with VALUE attribute which are passed by value
1695      use a hidden argument to denote the present status.  */
1696   if (sym->attr.value && sym->ts.type != BT_CHARACTER
1697       && sym->ts.type != BT_CLASS && sym->ts.type != BT_DERIVED
1698       && !sym->attr.dimension)
1699     {
1700       char name[GFC_MAX_SYMBOL_LEN + 2];
1701       tree tree_name;
1702
1703       gcc_assert (TREE_CODE (decl) == PARM_DECL);
1704       name[0] = '_';
1705       strcpy (&name[1], sym->name);
1706       tree_name = get_identifier (name);
1707
1708       /* Walk function argument list to find hidden arg.  */
1709       cond = DECL_ARGUMENTS (DECL_CONTEXT (decl));
1710       for ( ; cond != NULL_TREE; cond = TREE_CHAIN (cond))
1711         if (DECL_NAME (cond) == tree_name)
1712           break;
1713
1714       gcc_assert (cond);
1715       return cond;
1716     }
1717
1718   if (TREE_CODE (decl) != PARM_DECL)
1719     {
1720       /* Array parameters use a temporary descriptor, we want the real
1721          parameter.  */
1722       gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
1723              || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
1724       decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
1725     }
1726
1727   cond = fold_build2_loc (input_location, NE_EXPR, logical_type_node, decl,
1728                           fold_convert (TREE_TYPE (decl), null_pointer_node));
1729
1730   /* Fortran 2008 allows to pass null pointers and non-associated pointers
1731      as actual argument to denote absent dummies. For array descriptors,
1732      we thus also need to check the array descriptor.  For BT_CLASS, it
1733      can also occur for scalars and F2003 due to type->class wrapping and
1734      class->class wrapping.  Note further that BT_CLASS always uses an
1735      array descriptor for arrays, also for explicit-shape/assumed-size.  */
1736
1737   if (!sym->attr.allocatable
1738       && ((sym->ts.type != BT_CLASS && !sym->attr.pointer)
1739           || (sym->ts.type == BT_CLASS
1740               && !CLASS_DATA (sym)->attr.allocatable
1741               && !CLASS_DATA (sym)->attr.class_pointer))
1742       && ((gfc_option.allow_std & GFC_STD_F2008) != 0
1743           || sym->ts.type == BT_CLASS))
1744     {
1745       tree tmp;
1746
1747       if ((sym->as && (sym->as->type == AS_ASSUMED_SHAPE
1748                        || sym->as->type == AS_ASSUMED_RANK
1749                        || sym->attr.codimension))
1750           || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as))
1751         {
1752           tmp = build_fold_indirect_ref_loc (input_location, decl);
1753           if (sym->ts.type == BT_CLASS)
1754             tmp = gfc_class_data_get (tmp);
1755           tmp = gfc_conv_array_data (tmp);
1756         }
1757       else if (sym->ts.type == BT_CLASS)
1758         tmp = gfc_class_data_get (decl);
1759       else
1760         tmp = NULL_TREE;
1761
1762       if (tmp != NULL_TREE)
1763         {
1764           tmp = fold_build2_loc (input_location, NE_EXPR, logical_type_node, tmp,
1765                                  fold_convert (TREE_TYPE (tmp), null_pointer_node));
1766           cond = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
1767                                   logical_type_node, cond, tmp);
1768         }
1769     }
1770
1771   return cond;
1772 }
1773
1774
1775 /* Converts a missing, dummy argument into a null or zero.  */
1776
1777 void
1778 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
1779 {
1780   tree present;
1781   tree tmp;
1782
1783   present = gfc_conv_expr_present (arg->symtree->n.sym);
1784
1785   if (kind > 0)
1786     {
1787       /* Create a temporary and convert it to the correct type.  */
1788       tmp = gfc_get_int_type (kind);
1789       tmp = fold_convert (tmp, build_fold_indirect_ref_loc (input_location,
1790                                                         se->expr));
1791
1792       /* Test for a NULL value.  */
1793       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
1794                         tmp, fold_convert (TREE_TYPE (tmp), integer_one_node));
1795       tmp = gfc_evaluate_now (tmp, &se->pre);
1796       se->expr = gfc_build_addr_expr (NULL_TREE, tmp);
1797     }
1798   else
1799     {
1800       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (se->expr),
1801                         present, se->expr,
1802                         build_zero_cst (TREE_TYPE (se->expr)));
1803       tmp = gfc_evaluate_now (tmp, &se->pre);
1804       se->expr = tmp;
1805     }
1806
1807   if (ts.type == BT_CHARACTER)
1808     {
1809       tmp = build_int_cst (gfc_charlen_type_node, 0);
1810       tmp = fold_build3_loc (input_location, COND_EXPR, gfc_charlen_type_node,
1811                              present, se->string_length, tmp);
1812       tmp = gfc_evaluate_now (tmp, &se->pre);
1813       se->string_length = tmp;
1814     }
1815   return;
1816 }
1817
1818
1819 /* Get the character length of an expression, looking through gfc_refs
1820    if necessary.  */
1821
1822 tree
1823 gfc_get_expr_charlen (gfc_expr *e)
1824 {
1825   gfc_ref *r;
1826   tree length;
1827   gfc_se se;
1828
1829   gcc_assert (e->expr_type == EXPR_VARIABLE
1830               && e->ts.type == BT_CHARACTER);
1831
1832   length = NULL; /* To silence compiler warning.  */
1833
1834   if (is_subref_array (e) && e->ts.u.cl->length)
1835     {
1836       gfc_se tmpse;
1837       gfc_init_se (&tmpse, NULL);
1838       gfc_conv_expr_type (&tmpse, e->ts.u.cl->length, gfc_charlen_type_node);
1839       e->ts.u.cl->backend_decl = tmpse.expr;
1840       return tmpse.expr;
1841     }
1842
1843   /* First candidate: if the variable is of type CHARACTER, the
1844      expression's length could be the length of the character
1845      variable.  */
1846   if (e->symtree->n.sym->ts.type == BT_CHARACTER)
1847     length = e->symtree->n.sym->ts.u.cl->backend_decl;
1848
1849   /* Look through the reference chain for component references.  */
1850   for (r = e->ref; r; r = r->next)
1851     {
1852       switch (r->type)
1853         {
1854         case REF_COMPONENT:
1855           if (r->u.c.component->ts.type == BT_CHARACTER)
1856             length = r->u.c.component->ts.u.cl->backend_decl;
1857           break;
1858
1859         case REF_ARRAY:
1860           /* Do nothing.  */
1861           break;
1862
1863         case REF_SUBSTRING:
1864           gfc_init_se (&se, NULL);
1865           gfc_conv_expr_type (&se, r->u.ss.start, gfc_charlen_type_node);
1866           length = se.expr;
1867           gfc_conv_expr_type (&se, r->u.ss.end, gfc_charlen_type_node);
1868           length = fold_build2_loc (input_location, MINUS_EXPR,
1869                                     gfc_charlen_type_node,
1870                                     se.expr, length);
1871           length = fold_build2_loc (input_location, PLUS_EXPR,
1872                                     gfc_charlen_type_node, length,
1873                                     gfc_index_one_node);
1874           break;
1875
1876         default:
1877           gcc_unreachable ();
1878           break;
1879         }
1880     }
1881
1882   gcc_assert (length != NULL);
1883   return length;
1884 }
1885
1886
1887 /* Return for an expression the backend decl of the coarray.  */
1888
1889 tree
1890 gfc_get_tree_for_caf_expr (gfc_expr *expr)
1891 {
1892   tree caf_decl;
1893   bool found = false;
1894   gfc_ref *ref;
1895
1896   gcc_assert (expr && expr->expr_type == EXPR_VARIABLE);
1897
1898   /* Not-implemented diagnostic.  */
1899   if (expr->symtree->n.sym->ts.type == BT_CLASS
1900       && UNLIMITED_POLY (expr->symtree->n.sym)
1901       && CLASS_DATA (expr->symtree->n.sym)->attr.codimension)
1902     gfc_error ("Sorry, coindexed access to an unlimited polymorphic object at "
1903                "%L is not supported", &expr->where);
1904
1905   for (ref = expr->ref; ref; ref = ref->next)
1906     if (ref->type == REF_COMPONENT)
1907       {
1908         if (ref->u.c.component->ts.type == BT_CLASS
1909             && UNLIMITED_POLY (ref->u.c.component)
1910             && CLASS_DATA (ref->u.c.component)->attr.codimension)
1911           gfc_error ("Sorry, coindexed access to an unlimited polymorphic "
1912                      "component at %L is not supported", &expr->where);
1913       }
1914
1915   /* Make sure the backend_decl is present before accessing it.  */
1916   caf_decl = expr->symtree->n.sym->backend_decl == NULL_TREE
1917       ? gfc_get_symbol_decl (expr->symtree->n.sym)
1918       : expr->symtree->n.sym->backend_decl;
1919
1920   if (expr->symtree->n.sym->ts.type == BT_CLASS)
1921     {
1922       if (expr->ref && expr->ref->type == REF_ARRAY)
1923         {
1924           caf_decl = gfc_class_data_get (caf_decl);
1925           if (CLASS_DATA (expr->symtree->n.sym)->attr.codimension)
1926             return caf_decl;
1927         }
1928       for (ref = expr->ref; ref; ref = ref->next)
1929         {
1930           if (ref->type == REF_COMPONENT
1931               && strcmp (ref->u.c.component->name, "_data") != 0)
1932             {
1933               caf_decl = gfc_class_data_get (caf_decl);
1934               if (CLASS_DATA (expr->symtree->n.sym)->attr.codimension)
1935                 return caf_decl;
1936               break;
1937             }
1938           else if (ref->type == REF_ARRAY && ref->u.ar.dimen)
1939             break;
1940         }
1941     }
1942   if (expr->symtree->n.sym->attr.codimension)
1943     return caf_decl;
1944
1945   /* The following code assumes that the coarray is a component reachable via
1946      only scalar components/variables; the Fortran standard guarantees this.  */
1947
1948   for (ref = expr->ref; ref; ref = ref->next)
1949     if (ref->type == REF_COMPONENT)
1950       {
1951         gfc_component *comp = ref->u.c.component;
1952
1953         if (POINTER_TYPE_P (TREE_TYPE (caf_decl)))
1954           caf_decl = build_fold_indirect_ref_loc (input_location, caf_decl);
1955         caf_decl = fold_build3_loc (input_location, COMPONENT_REF,
1956                                     TREE_TYPE (comp->backend_decl), caf_decl,
1957                                     comp->backend_decl, NULL_TREE);
1958         if (comp->ts.type == BT_CLASS)
1959           {
1960             caf_decl = gfc_class_data_get (caf_decl);
1961             if (CLASS_DATA (comp)->attr.codimension)
1962               {
1963                 found = true;
1964                 break;
1965               }
1966           }
1967         if (comp->attr.codimension)
1968           {
1969             found = true;
1970             break;
1971           }
1972       }
1973   gcc_assert (found && caf_decl);
1974   return caf_decl;
1975 }
1976
1977
1978 /* Obtain the Coarray token - and optionally also the offset.  */
1979
1980 void
1981 gfc_get_caf_token_offset (gfc_se *se, tree *token, tree *offset, tree caf_decl,
1982                           tree se_expr, gfc_expr *expr)
1983 {
1984   tree tmp;
1985
1986   /* Coarray token.  */
1987   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (caf_decl)))
1988     {
1989       gcc_assert (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (caf_decl))
1990                     == GFC_ARRAY_ALLOCATABLE
1991                   || expr->symtree->n.sym->attr.select_type_temporary);
1992       *token = gfc_conv_descriptor_token (caf_decl);
1993     }
1994   else if (DECL_LANG_SPECIFIC (caf_decl)
1995            && GFC_DECL_TOKEN (caf_decl) != NULL_TREE)
1996     *token = GFC_DECL_TOKEN (caf_decl);
1997   else
1998     {
1999       gcc_assert (GFC_ARRAY_TYPE_P (TREE_TYPE (caf_decl))
2000                   && GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (caf_decl)) != NULL_TREE);
2001       *token = GFC_TYPE_ARRAY_CAF_TOKEN (TREE_TYPE (caf_decl));
2002     }
2003
2004   if (offset == NULL)
2005     return;
2006
2007   /* Offset between the coarray base address and the address wanted.  */
2008   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (caf_decl))
2009       && (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (caf_decl)) == GFC_ARRAY_ALLOCATABLE
2010           || GFC_TYPE_ARRAY_AKIND (TREE_TYPE (caf_decl)) == GFC_ARRAY_POINTER))
2011     *offset = build_int_cst (gfc_array_index_type, 0);
2012   else if (DECL_LANG_SPECIFIC (caf_decl)
2013            && GFC_DECL_CAF_OFFSET (caf_decl) != NULL_TREE)
2014     *offset = GFC_DECL_CAF_OFFSET (caf_decl);
2015   else if (GFC_TYPE_ARRAY_CAF_OFFSET (TREE_TYPE (caf_decl)) != NULL_TREE)
2016     *offset = GFC_TYPE_ARRAY_CAF_OFFSET (TREE_TYPE (caf_decl));
2017   else
2018     *offset = build_int_cst (gfc_array_index_type, 0);
2019
2020   if (POINTER_TYPE_P (TREE_TYPE (se_expr))
2021       && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se_expr))))
2022     {
2023       tmp = build_fold_indirect_ref_loc (input_location, se_expr);
2024       tmp = gfc_conv_descriptor_data_get (tmp);
2025     }
2026   else if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se_expr)))
2027     tmp = gfc_conv_descriptor_data_get (se_expr);
2028   else
2029     {
2030       gcc_assert (POINTER_TYPE_P (TREE_TYPE (se_expr)));
2031       tmp = se_expr;
2032     }
2033
2034   *offset = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
2035                              *offset, fold_convert (gfc_array_index_type, tmp));
2036
2037   if (expr->symtree->n.sym->ts.type == BT_DERIVED
2038       && expr->symtree->n.sym->attr.codimension
2039       && expr->symtree->n.sym->ts.u.derived->attr.alloc_comp)
2040     {
2041       gfc_expr *base_expr = gfc_copy_expr (expr);
2042       gfc_ref *ref = base_expr->ref;
2043       gfc_se base_se;
2044
2045       // Iterate through the refs until the last one.
2046       while (ref->next)
2047           ref = ref->next;
2048
2049       if (ref->type == REF_ARRAY
2050           && ref->u.ar.type != AR_FULL)
2051         {
2052           const int ranksum = ref->u.ar.dimen + ref->u.ar.codimen;
2053           int i;
2054           for (i = 0; i < ranksum; ++i)
2055             {
2056               ref->u.ar.start[i] = NULL;
2057               ref->u.ar.end[i] = NULL;
2058             }
2059           ref->u.ar.type = AR_FULL;
2060         }
2061       gfc_init_se (&base_se, NULL);
2062       if (gfc_caf_attr (base_expr).dimension)
2063         {
2064           gfc_conv_expr_descriptor (&base_se, base_expr);
2065           tmp = gfc_conv_descriptor_data_get (base_se.expr);
2066         }
2067       else
2068         {
2069           gfc_conv_expr (&base_se, base_expr);
2070           tmp = base_se.expr;
2071         }
2072
2073       gfc_free_expr (base_expr);
2074       gfc_add_block_to_block (&se->pre, &base_se.pre);
2075       gfc_add_block_to_block (&se->post, &base_se.post);
2076     }
2077   else if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (caf_decl)))
2078     tmp = gfc_conv_descriptor_data_get (caf_decl);
2079   else
2080    {
2081      gcc_assert (POINTER_TYPE_P (TREE_TYPE (caf_decl)));
2082      tmp = caf_decl;
2083    }
2084
2085   *offset = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
2086                             fold_convert (gfc_array_index_type, *offset),
2087                             fold_convert (gfc_array_index_type, tmp));
2088 }
2089
2090
2091 /* Convert the coindex of a coarray into an image index; the result is
2092    image_num =  (idx(1)-lcobound(1)+1) + (idx(2)-lcobound(2))*extent(1)
2093               + (idx(3)-lcobound(3))*extend(1)*extent(2) + ...  */
2094
2095 tree
2096 gfc_caf_get_image_index (stmtblock_t *block, gfc_expr *e, tree desc)
2097 {
2098   gfc_ref *ref;
2099   tree lbound, ubound, extent, tmp, img_idx;
2100   gfc_se se;
2101   int i;
2102
2103   for (ref = e->ref; ref; ref = ref->next)
2104     if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
2105       break;
2106   gcc_assert (ref != NULL);
2107
2108   if (ref->u.ar.dimen_type[ref->u.ar.dimen] == DIMEN_THIS_IMAGE)
2109     {
2110       return build_call_expr_loc (input_location, gfor_fndecl_caf_this_image, 1,
2111                                   integer_zero_node);
2112     }
2113
2114   img_idx = build_zero_cst (gfc_array_index_type);
2115   extent = build_one_cst (gfc_array_index_type);
2116   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)))
2117     for (i = ref->u.ar.dimen; i < ref->u.ar.dimen + ref->u.ar.codimen; i++)
2118       {
2119         gfc_init_se (&se, NULL);
2120         gfc_conv_expr_type (&se, ref->u.ar.start[i], gfc_array_index_type);
2121         gfc_add_block_to_block (block, &se.pre);
2122         lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[i]);
2123         tmp = fold_build2_loc (input_location, MINUS_EXPR,
2124                                TREE_TYPE (lbound), se.expr, lbound);
2125         tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp),
2126                                extent, tmp);
2127         img_idx = fold_build2_loc (input_location, PLUS_EXPR,
2128                                    TREE_TYPE (tmp), img_idx, tmp);
2129         if (i < ref->u.ar.dimen + ref->u.ar.codimen - 1)
2130           {
2131             ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[i]);
2132             tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
2133             extent = fold_build2_loc (input_location, MULT_EXPR,
2134                                       TREE_TYPE (tmp), extent, tmp);
2135           }
2136       }
2137   else
2138     for (i = ref->u.ar.dimen; i < ref->u.ar.dimen + ref->u.ar.codimen; i++)
2139       {
2140         gfc_init_se (&se, NULL);
2141         gfc_conv_expr_type (&se, ref->u.ar.start[i], gfc_array_index_type);
2142         gfc_add_block_to_block (block, &se.pre);
2143         lbound = GFC_TYPE_ARRAY_LBOUND (TREE_TYPE (desc), i);
2144         tmp = fold_build2_loc (input_location, MINUS_EXPR,
2145                                TREE_TYPE (lbound), se.expr, lbound);
2146         tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp),
2147                                extent, tmp);
2148         img_idx = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (tmp),
2149                                    img_idx, tmp);
2150         if (i < ref->u.ar.dimen + ref->u.ar.codimen - 1)
2151           {
2152             ubound = GFC_TYPE_ARRAY_UBOUND (TREE_TYPE (desc), i);
2153             tmp = fold_build2_loc (input_location, MINUS_EXPR,
2154                                    TREE_TYPE (ubound), ubound, lbound);
2155             tmp = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (tmp),
2156                                    tmp, build_one_cst (TREE_TYPE (tmp)));
2157             extent = fold_build2_loc (input_location, MULT_EXPR,
2158                                       TREE_TYPE (tmp), extent, tmp);
2159           }
2160       }
2161   img_idx = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (img_idx),
2162                              img_idx, build_one_cst (TREE_TYPE (img_idx)));
2163   return fold_convert (integer_type_node, img_idx);
2164 }
2165
2166
2167 /* For each character array constructor subexpression without a ts.u.cl->length,
2168    replace it by its first element (if there aren't any elements, the length
2169    should already be set to zero).  */
2170
2171 static void
2172 flatten_array_ctors_without_strlen (gfc_expr* e)
2173 {
2174   gfc_actual_arglist* arg;
2175   gfc_constructor* c;
2176
2177   if (!e)
2178     return;
2179
2180   switch (e->expr_type)
2181     {
2182
2183     case EXPR_OP:
2184       flatten_array_ctors_without_strlen (e->value.op.op1);
2185       flatten_array_ctors_without_strlen (e->value.op.op2);
2186       break;
2187
2188     case EXPR_COMPCALL:
2189       /* TODO: Implement as with EXPR_FUNCTION when needed.  */
2190       gcc_unreachable ();
2191
2192     case EXPR_FUNCTION:
2193       for (arg = e->value.function.actual; arg; arg = arg->next)
2194         flatten_array_ctors_without_strlen (arg->expr);
2195       break;
2196
2197     case EXPR_ARRAY:
2198
2199       /* We've found what we're looking for.  */
2200       if (e->ts.type == BT_CHARACTER && !e->ts.u.cl->length)
2201         {
2202           gfc_constructor *c;
2203           gfc_expr* new_expr;
2204
2205           gcc_assert (e->value.constructor);
2206
2207           c = gfc_constructor_first (e->value.constructor);
2208           new_expr = c->expr;
2209           c->expr = NULL;
2210
2211           flatten_array_ctors_without_strlen (new_expr);
2212           gfc_replace_expr (e, new_expr);
2213           break;
2214         }
2215
2216       /* Otherwise, fall through to handle constructor elements.  */
2217       gcc_fallthrough ();
2218     case EXPR_STRUCTURE:
2219       for (c = gfc_constructor_first (e->value.constructor);
2220            c; c = gfc_constructor_next (c))
2221         flatten_array_ctors_without_strlen (c->expr);
2222       break;
2223
2224     default:
2225       break;
2226
2227     }
2228 }
2229
2230
2231 /* Generate code to initialize a string length variable. Returns the
2232    value.  For array constructors, cl->length might be NULL and in this case,
2233    the first element of the constructor is needed.  expr is the original
2234    expression so we can access it but can be NULL if this is not needed.  */
2235
2236 void
2237 gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock)
2238 {
2239   gfc_se se;
2240
2241   gfc_init_se (&se, NULL);
2242
2243   if (!cl->length && cl->backend_decl && VAR_P (cl->backend_decl))
2244     return;
2245
2246   /* If cl->length is NULL, use gfc_conv_expr to obtain the string length but
2247      "flatten" array constructors by taking their first element; all elements
2248      should be the same length or a cl->length should be present.  */
2249   if (!cl->length)
2250     {
2251       gfc_expr* expr_flat;
2252       if (!expr)
2253         return;
2254       expr_flat = gfc_copy_expr (expr);
2255       flatten_array_ctors_without_strlen (expr_flat);
2256       gfc_resolve_expr (expr_flat);
2257
2258       gfc_conv_expr (&se, expr_flat);
2259       gfc_add_block_to_block (pblock, &se.pre);
2260       cl->backend_decl = convert (gfc_charlen_type_node, se.string_length);
2261
2262       gfc_free_expr (expr_flat);
2263       return;
2264     }
2265
2266   /* Convert cl->length.  */
2267
2268   gcc_assert (cl->length);
2269
2270   gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
2271   se.expr = fold_build2_loc (input_location, MAX_EXPR, gfc_charlen_type_node,
2272                              se.expr, build_zero_cst (TREE_TYPE (se.expr)));
2273   gfc_add_block_to_block (pblock, &se.pre);
2274
2275   if (cl->backend_decl)
2276     gfc_add_modify (pblock, cl->backend_decl, se.expr);
2277   else
2278     cl->backend_decl = gfc_evaluate_now (se.expr, pblock);
2279 }
2280
2281
2282 static void
2283 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
2284                     const char *name, locus *where)
2285 {
2286   tree tmp;
2287   tree type;
2288   tree fault;
2289   gfc_se start;
2290   gfc_se end;
2291   char *msg;
2292   mpz_t length;
2293
2294   type = gfc_get_character_type (kind, ref->u.ss.length);
2295   type = build_pointer_type (type);
2296
2297   gfc_init_se (&start, se);
2298   gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
2299   gfc_add_block_to_block (&se->pre, &start.pre);
2300
2301   if (integer_onep (start.expr))
2302     gfc_conv_string_parameter (se);
2303   else
2304     {
2305       tmp = start.expr;
2306       STRIP_NOPS (tmp);
2307       /* Avoid multiple evaluation of substring start.  */
2308       if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
2309         start.expr = gfc_evaluate_now (start.expr, &se->pre);
2310
2311       /* Change the start of the string.  */
2312       if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
2313         tmp = se->expr;
2314       else
2315         tmp = build_fold_indirect_ref_loc (input_location,
2316                                        se->expr);
2317       tmp = gfc_build_array_ref (tmp, start.expr, NULL);
2318       se->expr = gfc_build_addr_expr (type, tmp);
2319     }
2320
2321   /* Length = end + 1 - start.  */
2322   gfc_init_se (&end, se);
2323   if (ref->u.ss.end == NULL)
2324     end.expr = se->string_length;
2325   else
2326     {
2327       gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
2328       gfc_add_block_to_block (&se->pre, &end.pre);
2329     }
2330   tmp = end.expr;
2331   STRIP_NOPS (tmp);
2332   if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
2333     end.expr = gfc_evaluate_now (end.expr, &se->pre);
2334
2335   if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
2336     {
2337       tree nonempty = fold_build2_loc (input_location, LE_EXPR,
2338                                        logical_type_node, start.expr,
2339                                        end.expr);
2340
2341       /* Check lower bound.  */
2342       fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
2343                                start.expr,
2344                                build_one_cst (TREE_TYPE (start.expr)));
2345       fault = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
2346                                logical_type_node, nonempty, fault);
2347       if (name)
2348         msg = xasprintf ("Substring out of bounds: lower bound (%%ld) of '%s' "
2349                          "is less than one", name);
2350       else
2351         msg = xasprintf ("Substring out of bounds: lower bound (%%ld) "
2352                          "is less than one");
2353       gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
2354                                fold_convert (long_integer_type_node,
2355                                              start.expr));
2356       free (msg);
2357
2358       /* Check upper bound.  */
2359       fault = fold_build2_loc (input_location, GT_EXPR, logical_type_node,
2360                                end.expr, se->string_length);
2361       fault = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
2362                                logical_type_node, nonempty, fault);
2363       if (name)
2364         msg = xasprintf ("Substring out of bounds: upper bound (%%ld) of '%s' "
2365                          "exceeds string length (%%ld)", name);
2366       else
2367         msg = xasprintf ("Substring out of bounds: upper bound (%%ld) "
2368                          "exceeds string length (%%ld)");
2369       gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
2370                                fold_convert (long_integer_type_node, end.expr),
2371                                fold_convert (long_integer_type_node,
2372                                              se->string_length));
2373       free (msg);
2374     }
2375
2376   /* Try to calculate the length from the start and end expressions.  */
2377   if (ref->u.ss.end
2378       && gfc_dep_difference (ref->u.ss.end, ref->u.ss.start, &length))
2379     {
2380       HOST_WIDE_INT i_len;
2381
2382       i_len = gfc_mpz_get_hwi (length) + 1;
2383       if (i_len < 0)
2384         i_len = 0;
2385
2386       tmp = build_int_cst (gfc_charlen_type_node, i_len);
2387       mpz_clear (length);  /* Was initialized by gfc_dep_difference.  */
2388     }
2389   else
2390     {
2391       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_charlen_type_node,
2392                              fold_convert (gfc_charlen_type_node, end.expr),
2393                              fold_convert (gfc_charlen_type_node, start.expr));
2394       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_charlen_type_node,
2395                              build_int_cst (gfc_charlen_type_node, 1), tmp);
2396       tmp = fold_build2_loc (input_location, MAX_EXPR, gfc_charlen_type_node,
2397                              tmp, build_int_cst (gfc_charlen_type_node, 0));
2398     }
2399
2400   se->string_length = tmp;
2401 }
2402
2403
2404 /* Convert a derived type component reference.  */
2405
2406 static void
2407 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
2408 {
2409   gfc_component *c;
2410   tree tmp;
2411   tree decl;
2412   tree field;
2413   tree context;
2414
2415   c = ref->u.c.component;
2416
2417   if (c->backend_decl == NULL_TREE
2418       && ref->u.c.sym != NULL)
2419     gfc_get_derived_type (ref->u.c.sym);
2420
2421   field = c->backend_decl;
2422   gcc_assert (field && TREE_CODE (field) == FIELD_DECL);
2423   decl = se->expr;
2424   context = DECL_FIELD_CONTEXT (field);
2425
2426   /* Components can correspond to fields of different containing
2427      types, as components are created without context, whereas
2428      a concrete use of a component has the type of decl as context.
2429      So, if the type doesn't match, we search the corresponding
2430      FIELD_DECL in the parent type.  To not waste too much time
2431      we cache this result in norestrict_decl.
2432      On the other hand, if the context is a UNION or a MAP (a
2433      RECORD_TYPE within a UNION_TYPE) always use the given FIELD_DECL.  */
2434
2435   if (context != TREE_TYPE (decl)
2436       && !(   TREE_CODE (TREE_TYPE (field)) == UNION_TYPE /* Field is union */
2437            || TREE_CODE (context) == UNION_TYPE))         /* Field is map */
2438     {
2439       tree f2 = c->norestrict_decl;
2440       if (!f2 || DECL_FIELD_CONTEXT (f2) != TREE_TYPE (decl))
2441         for (f2 = TYPE_FIELDS (TREE_TYPE (decl)); f2; f2 = DECL_CHAIN (f2))
2442           if (TREE_CODE (f2) == FIELD_DECL
2443               && DECL_NAME (f2) == DECL_NAME (field))
2444             break;
2445       gcc_assert (f2);
2446       c->norestrict_decl = f2;
2447       field = f2;
2448     }
2449
2450   if (ref->u.c.sym && ref->u.c.sym->ts.type == BT_CLASS
2451       && strcmp ("_data", c->name) == 0)
2452     {
2453       /* Found a ref to the _data component.  Store the associated ref to
2454          the vptr in se->class_vptr.  */
2455       se->class_vptr = gfc_class_vptr_get (decl);
2456     }
2457   else
2458     se->class_vptr = NULL_TREE;
2459
2460   tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
2461                          decl, field, NULL_TREE);
2462
2463   se->expr = tmp;
2464
2465   /* Allocatable deferred char arrays are to be handled by the gfc_deferred_
2466      strlen () conditional below.  */
2467   if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer
2468       && !(c->attr.allocatable && c->ts.deferred)
2469       && !c->attr.pdt_string)
2470     {
2471       tmp = c->ts.u.cl->backend_decl;
2472       /* Components must always be constant length.  */
2473       gcc_assert (tmp && INTEGER_CST_P (tmp));
2474       se->string_length = tmp;
2475     }
2476
2477   if (gfc_deferred_strlen (c, &field))
2478     {
2479       tmp = fold_build3_loc (input_location, COMPONENT_REF,
2480                              TREE_TYPE (field),
2481                              decl, field, NULL_TREE);
2482       se->string_length = tmp;
2483     }
2484
2485   if (((c->attr.pointer || c->attr.allocatable)
2486        && (!c->attr.dimension && !c->attr.codimension)
2487        && c->ts.type != BT_CHARACTER)
2488       || c->attr.proc_pointer)
2489     se->expr = build_fold_indirect_ref_loc (input_location,
2490                                         se->expr);
2491 }
2492
2493
2494 /* This function deals with component references to components of the
2495    parent type for derived type extensions.  */
2496 static void
2497 conv_parent_component_references (gfc_se * se, gfc_ref * ref)
2498 {
2499   gfc_component *c;
2500   gfc_component *cmp;
2501   gfc_symbol *dt;
2502   gfc_ref parent;
2503
2504   dt = ref->u.c.sym;
2505   c = ref->u.c.component;
2506
2507   /* Return if the component is in the parent type.  */
2508   for (cmp = dt->components; cmp; cmp = cmp->next)
2509     if (strcmp (c->name, cmp->name) == 0)
2510       return;
2511
2512   /* Build a gfc_ref to recursively call gfc_conv_component_ref.  */
2513   parent.type = REF_COMPONENT;
2514   parent.next = NULL;
2515   parent.u.c.sym = dt;
2516   parent.u.c.component = dt->components;
2517
2518   if (dt->backend_decl == NULL)
2519     gfc_get_derived_type (dt);
2520
2521   /* Build the reference and call self.  */
2522   gfc_conv_component_ref (se, &parent);
2523   parent.u.c.sym = dt->components->ts.u.derived;
2524   parent.u.c.component = c;
2525   conv_parent_component_references (se, &parent);
2526 }
2527
2528
2529 static void
2530 conv_inquiry (gfc_se * se, gfc_ref * ref, gfc_expr *expr, gfc_typespec *ts)
2531 {
2532   tree res = se->expr;
2533
2534   switch (ref->u.i)
2535     {
2536     case INQUIRY_RE:
2537       res = fold_build1_loc (input_location, REALPART_EXPR,
2538                              TREE_TYPE (TREE_TYPE (res)), res);
2539       break;
2540
2541     case INQUIRY_IM:
2542       res = fold_build1_loc (input_location, IMAGPART_EXPR,
2543                              TREE_TYPE (TREE_TYPE (res)), res);
2544       break;
2545
2546     case INQUIRY_KIND:
2547       res = build_int_cst (gfc_typenode_for_spec (&expr->ts),
2548                            ts->kind);
2549       break;
2550
2551     case INQUIRY_LEN:
2552       res = fold_convert (gfc_typenode_for_spec (&expr->ts),
2553                           se->string_length);
2554       break;
2555
2556     default:
2557       gcc_unreachable ();
2558     }
2559   se->expr = res;
2560 }
2561
2562 /* Return the contents of a variable. Also handles reference/pointer
2563    variables (all Fortran pointer references are implicit).  */
2564
2565 static void
2566 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
2567 {
2568   gfc_ss *ss;
2569   gfc_ref *ref;
2570   gfc_symbol *sym;
2571   tree parent_decl = NULL_TREE;
2572   int parent_flag;
2573   bool return_value;
2574   bool alternate_entry;
2575   bool entry_master;
2576   bool is_classarray;
2577   bool first_time = true;
2578
2579   sym = expr->symtree->n.sym;
2580   is_classarray = IS_CLASS_ARRAY (sym);
2581   ss = se->ss;
2582   if (ss != NULL)
2583     {
2584       gfc_ss_info *ss_info = ss->info;
2585
2586       /* Check that something hasn't gone horribly wrong.  */
2587       gcc_assert (ss != gfc_ss_terminator);
2588       gcc_assert (ss_info->expr == expr);
2589
2590       /* A scalarized term.  We already know the descriptor.  */
2591       se->expr = ss_info->data.array.descriptor;
2592       se->string_length = ss_info->string_length;
2593       ref = ss_info->data.array.ref;
2594       if (ref)
2595         gcc_assert (ref->type == REF_ARRAY
2596                     && ref->u.ar.type != AR_ELEMENT);
2597       else
2598         gfc_conv_tmp_array_ref (se);
2599     }
2600   else
2601     {
2602       tree se_expr = NULL_TREE;
2603
2604       se->expr = gfc_get_symbol_decl (sym);
2605
2606       /* Deal with references to a parent results or entries by storing
2607          the current_function_decl and moving to the parent_decl.  */
2608       return_value = sym->attr.function && sym->result == sym;
2609       alternate_entry = sym->attr.function && sym->attr.entry
2610                         && sym->result == sym;
2611       entry_master = sym->attr.result
2612                      && sym->ns->proc_name->attr.entry_master
2613                      && !gfc_return_by_reference (sym->ns->proc_name);
2614       if (current_function_decl)
2615         parent_decl = DECL_CONTEXT (current_function_decl);
2616
2617       if ((se->expr == parent_decl && return_value)
2618            || (sym->ns && sym->ns->proc_name
2619                && parent_decl
2620                && sym->ns->proc_name->backend_decl == parent_decl
2621                && (alternate_entry || entry_master)))
2622         parent_flag = 1;
2623       else
2624         parent_flag = 0;
2625
2626       /* Special case for assigning the return value of a function.
2627          Self recursive functions must have an explicit return value.  */
2628       if (return_value && (se->expr == current_function_decl || parent_flag))
2629         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
2630
2631       /* Similarly for alternate entry points.  */
2632       else if (alternate_entry
2633                && (sym->ns->proc_name->backend_decl == current_function_decl
2634                    || parent_flag))
2635         {
2636           gfc_entry_list *el = NULL;
2637
2638           for (el = sym->ns->entries; el; el = el->next)
2639             if (sym == el->sym)
2640               {
2641                 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
2642                 break;
2643               }
2644         }
2645
2646       else if (entry_master
2647                && (sym->ns->proc_name->backend_decl == current_function_decl
2648                    || parent_flag))
2649         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
2650
2651       if (se_expr)
2652         se->expr = se_expr;
2653
2654       /* Procedure actual arguments.  Look out for temporary variables
2655          with the same attributes as function values.  */
2656       else if (!sym->attr.temporary
2657                && sym->attr.flavor == FL_PROCEDURE
2658                && se->expr != current_function_decl)
2659         {
2660           if (!sym->attr.dummy && !sym->attr.proc_pointer)
2661             {
2662               gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
2663               se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
2664             }
2665           return;
2666         }
2667
2668
2669       /* Dereference the expression, where needed. Since characters
2670          are entirely different from other types, they are treated
2671          separately.  */
2672       if (sym->ts.type == BT_CHARACTER)
2673         {
2674           /* Dereference character pointer dummy arguments
2675              or results.  */
2676           if ((sym->attr.pointer || sym->attr.allocatable)
2677               && (sym->attr.dummy
2678                   || sym->attr.function
2679                   || sym->attr.result))
2680             se->expr = build_fold_indirect_ref_loc (input_location,
2681                                                 se->expr);
2682
2683         }
2684       else if (!sym->attr.value)
2685         {
2686           /* Dereference temporaries for class array dummy arguments.  */
2687           if (sym->attr.dummy && is_classarray
2688               && GFC_ARRAY_TYPE_P (TREE_TYPE (se->expr)))
2689             {
2690               if (!se->descriptor_only)
2691                 se->expr = GFC_DECL_SAVED_DESCRIPTOR (se->expr);
2692
2693               se->expr = build_fold_indirect_ref_loc (input_location,
2694                                                       se->expr);
2695             }
2696
2697           /* Dereference non-character scalar dummy arguments.  */
2698           if (sym->attr.dummy && !sym->attr.dimension
2699               && !(sym->attr.codimension && sym->attr.allocatable)
2700               && (sym->ts.type != BT_CLASS
2701                   || (!CLASS_DATA (sym)->attr.dimension
2702                       && !(CLASS_DATA (sym)->attr.codimension
2703                            && CLASS_DATA (sym)->attr.allocatable))))
2704             se->expr = build_fold_indirect_ref_loc (input_location,
2705                                                 se->expr);
2706
2707           /* Dereference scalar hidden result.  */
2708           if (flag_f2c && sym->ts.type == BT_COMPLEX
2709               && (sym->attr.function || sym->attr.result)
2710               && !sym->attr.dimension && !sym->attr.pointer
2711               && !sym->attr.always_explicit)
2712             se->expr = build_fold_indirect_ref_loc (input_location,
2713                                                 se->expr);
2714
2715           /* Dereference non-character, non-class pointer variables.
2716              These must be dummies, results, or scalars.  */
2717           if (!is_classarray
2718               && (sym->attr.pointer || sym->attr.allocatable
2719                   || gfc_is_associate_pointer (sym)
2720                   || (sym->as && sym->as->type == AS_ASSUMED_RANK))
2721               && (sym->attr.dummy
2722                   || sym->attr.function
2723                   || sym->attr.result
2724                   || (!sym->attr.dimension
2725                       && (!sym->attr.codimension || !sym->attr.allocatable))))
2726             se->expr = build_fold_indirect_ref_loc (input_location,
2727                                                 se->expr);
2728           /* Now treat the class array pointer variables accordingly.  */
2729           else if (sym->ts.type == BT_CLASS
2730                    && sym->attr.dummy
2731                    && (CLASS_DATA (sym)->attr.dimension
2732                        || CLASS_DATA (sym)->attr.codimension)
2733                    && ((CLASS_DATA (sym)->as
2734                         && CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK)
2735                        || CLASS_DATA (sym)->attr.allocatable
2736                        || CLASS_DATA (sym)->attr.class_pointer))
2737             se->expr = build_fold_indirect_ref_loc (input_location,
2738                                                 se->expr);
2739           /* And the case where a non-dummy, non-result, non-function,
2740              non-allotable and non-pointer classarray is present.  This case was
2741              previously covered by the first if, but with introducing the
2742              condition !is_classarray there, that case has to be covered
2743              explicitly.  */
2744           else if (sym->ts.type == BT_CLASS
2745                    && !sym->attr.dummy
2746                    && !sym->attr.function
2747                    && !sym->attr.result
2748                    && (CLASS_DATA (sym)->attr.dimension
2749                        || CLASS_DATA (sym)->attr.codimension)
2750                    && (sym->assoc
2751                        || !CLASS_DATA (sym)->attr.allocatable)
2752                    && !CLASS_DATA (sym)->attr.class_pointer)
2753             se->expr = build_fold_indirect_ref_loc (input_location,
2754                                                 se->expr);
2755         }
2756
2757       ref = expr->ref;
2758     }
2759
2760   /* For character variables, also get the length.  */
2761   if (sym->ts.type == BT_CHARACTER)
2762     {
2763       /* If the character length of an entry isn't set, get the length from
2764          the master function instead.  */
2765       if (sym->attr.entry && !sym->ts.u.cl->backend_decl)
2766         se->string_length = sym->ns->proc_name->ts.u.cl->backend_decl;
2767       else
2768         se->string_length = sym->ts.u.cl->backend_decl;
2769       gcc_assert (se->string_length);
2770     }
2771
2772   gfc_typespec *ts = &sym->ts;
2773   while (ref)
2774     {
2775       switch (ref->type)
2776         {
2777         case REF_ARRAY:
2778           /* Return the descriptor if that's what we want and this is an array
2779              section reference.  */
2780           if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
2781             return;
2782 /* TODO: Pointers to single elements of array sections, eg elemental subs.  */
2783           /* Return the descriptor for array pointers and allocations.  */
2784           if (se->want_pointer
2785               && ref->next == NULL && (se->descriptor_only))
2786             return;
2787
2788           gfc_conv_array_ref (se, &ref->u.ar, expr, &expr->where);
2789           /* Return a pointer to an element.  */
2790           break;
2791
2792         case REF_COMPONENT:
2793           ts = &ref->u.c.component->ts;
2794           if (first_time && is_classarray && sym->attr.dummy
2795               && se->descriptor_only
2796               && !CLASS_DATA (sym)->attr.allocatable
2797               && !CLASS_DATA (sym)->attr.class_pointer
2798               && CLASS_DATA (sym)->as
2799               && CLASS_DATA (sym)->as->type != AS_ASSUMED_RANK
2800               && strcmp ("_data", ref->u.c.component->name) == 0)
2801             /* Skip the first ref of a _data component, because for class
2802                arrays that one is already done by introducing a temporary
2803                array descriptor.  */
2804             break;
2805
2806           if (ref->u.c.sym->attr.extension)
2807             conv_parent_component_references (se, ref);
2808
2809           gfc_conv_component_ref (se, ref);
2810           if (!ref->next && ref->u.c.sym->attr.codimension
2811               && se->want_pointer && se->descriptor_only)
2812             return;
2813
2814           break;
2815
2816         case REF_SUBSTRING:
2817           gfc_conv_substring (se, ref, expr->ts.kind,
2818                               expr->symtree->name, &expr->where);
2819           break;
2820
2821         case REF_INQUIRY:
2822           conv_inquiry (se, ref, expr, ts);
2823           break;
2824
2825         default:
2826           gcc_unreachable ();
2827           break;
2828         }
2829       first_time = false;
2830       ref = ref->next;
2831     }
2832   /* Pointer assignment, allocation or pass by reference.  Arrays are handled
2833      separately.  */
2834   if (se->want_pointer)
2835     {
2836       if (expr->ts.type == BT_CHARACTER && !gfc_is_proc_ptr_comp (expr))
2837         gfc_conv_string_parameter (se);
2838       else
2839         se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
2840     }
2841 }
2842
2843
2844 /* Unary ops are easy... Or they would be if ! was a valid op.  */
2845
2846 static void
2847 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
2848 {
2849   gfc_se operand;
2850   tree type;
2851
2852   gcc_assert (expr->ts.type != BT_CHARACTER);
2853   /* Initialize the operand.  */
2854   gfc_init_se (&operand, se);
2855   gfc_conv_expr_val (&operand, expr->value.op.op1);
2856   gfc_add_block_to_block (&se->pre, &operand.pre);
2857
2858   type = gfc_typenode_for_spec (&expr->ts);
2859
2860   /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
2861      We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
2862      All other unary operators have an equivalent GIMPLE unary operator.  */
2863   if (code == TRUTH_NOT_EXPR)
2864     se->expr = fold_build2_loc (input_location, EQ_EXPR, type, operand.expr,
2865                                 build_int_cst (type, 0));
2866   else
2867     se->expr = fold_build1_loc (input_location, code, type, operand.expr);
2868
2869 }
2870
2871 /* Expand power operator to optimal multiplications when a value is raised
2872    to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
2873    Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
2874    Programming", 3rd Edition, 1998.  */
2875
2876 /* This code is mostly duplicated from expand_powi in the backend.
2877    We establish the "optimal power tree" lookup table with the defined size.
2878    The items in the table are the exponents used to calculate the index
2879    exponents. Any integer n less than the value can get an "addition chain",
2880    with the first node being one.  */
2881 #define POWI_TABLE_SIZE 256
2882
2883 /* The table is from builtins.c.  */
2884 static const unsigned char powi_table[POWI_TABLE_SIZE] =
2885   {
2886       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
2887       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
2888       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
2889      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
2890      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
2891      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
2892      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
2893      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
2894      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
2895      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
2896      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
2897      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
2898      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
2899      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
2900      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
2901      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
2902      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
2903      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
2904      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
2905      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
2906      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
2907      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
2908      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
2909      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
2910      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
2911     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
2912     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
2913     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
2914     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
2915     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
2916     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
2917     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
2918   };
2919
2920 /* If n is larger than lookup table's max index, we use the "window
2921    method".  */
2922 #define POWI_WINDOW_SIZE 3
2923
2924 /* Recursive function to expand the power operator. The temporary
2925    values are put in tmpvar. The function returns tmpvar[1] ** n.  */
2926 static tree
2927 gfc_conv_powi (gfc_se * se, unsigned HOST_WIDE_INT n, tree * tmpvar)
2928 {
2929   tree op0;
2930   tree op1;
2931   tree tmp;
2932   int digit;
2933
2934   if (n < POWI_TABLE_SIZE)
2935     {
2936       if (tmpvar[n])
2937         return tmpvar[n];
2938
2939       op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
2940       op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
2941     }
2942   else if (n & 1)
2943     {
2944       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
2945       op0 = gfc_conv_powi (se, n - digit, tmpvar);
2946       op1 = gfc_conv_powi (se, digit, tmpvar);
2947     }
2948   else
2949     {
2950       op0 = gfc_conv_powi (se, n >> 1, tmpvar);
2951       op1 = op0;
2952     }
2953
2954   tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (op0), op0, op1);
2955   tmp = gfc_evaluate_now (tmp, &se->pre);
2956
2957   if (n < POWI_TABLE_SIZE)
2958     tmpvar[n] = tmp;
2959
2960   return tmp;
2961 }
2962
2963
2964 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
2965    return 1. Else return 0 and a call to runtime library functions
2966    will have to be built.  */
2967 static int
2968 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
2969 {
2970   tree cond;
2971   tree tmp;
2972   tree type;
2973   tree vartmp[POWI_TABLE_SIZE];
2974   HOST_WIDE_INT m;
2975   unsigned HOST_WIDE_INT n;
2976   int sgn;
2977   wi::tree_to_wide_ref wrhs = wi::to_wide (rhs);
2978
2979   /* If exponent is too large, we won't expand it anyway, so don't bother
2980      with large integer values.  */
2981   if (!wi::fits_shwi_p (wrhs))
2982     return 0;
2983
2984   m = wrhs.to_shwi ();
2985   /* Use the wide_int's routine to reliably get the absolute value on all
2986      platforms.  Then convert it to a HOST_WIDE_INT like above.  */
2987   n = wi::abs (wrhs).to_shwi ();
2988
2989   type = TREE_TYPE (lhs);
2990   sgn = tree_int_cst_sgn (rhs);
2991
2992   if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
2993        || optimize_size) && (m > 2 || m < -1))
2994     return 0;
2995
2996   /* rhs == 0  */
2997   if (sgn == 0)
2998     {
2999       se->expr = gfc_build_const (type, integer_one_node);
3000       return 1;
3001     }
3002
3003   /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1.  */
3004   if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
3005     {
3006       tmp = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
3007                              lhs, build_int_cst (TREE_TYPE (lhs), -1));
3008       cond = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
3009                               lhs, build_int_cst (TREE_TYPE (lhs), 1));
3010
3011       /* If rhs is even,
3012          result = (lhs == 1 || lhs == -1) ? 1 : 0.  */
3013       if ((n & 1) == 0)
3014         {
3015           tmp = fold_build2_loc (input_location, TRUTH_OR_EXPR,
3016                                  logical_type_node, tmp, cond);
3017           se->expr = fold_build3_loc (input_location, COND_EXPR, type,
3018                                       tmp, build_int_cst (type, 1),
3019                                       build_int_cst (type, 0));
3020           return 1;
3021         }
3022       /* If rhs is odd,
3023          result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0.  */
3024       tmp = fold_build3_loc (input_location, COND_EXPR, type, tmp,
3025                              build_int_cst (type, -1),
3026                              build_int_cst (type, 0));
3027       se->expr = fold_build3_loc (input_location, COND_EXPR, type,
3028                                   cond, build_int_cst (type, 1), tmp);
3029       return 1;
3030     }
3031
3032   memset (vartmp, 0, sizeof (vartmp));
3033   vartmp[1] = lhs;
3034   if (sgn == -1)
3035     {
3036       tmp = gfc_build_const (type, integer_one_node);
3037       vartmp[1] = fold_build2_loc (input_location, RDIV_EXPR, type, tmp,
3038                                    vartmp[1]);
3039     }
3040
3041   se->expr = gfc_conv_powi (se, n, vartmp);
3042
3043   return 1;
3044 }
3045
3046
3047 /* Power op (**).  Constant integer exponent has special handling.  */
3048
3049 static void
3050 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
3051 {
3052   tree gfc_int4_type_node;
3053   int kind;
3054   int ikind;
3055   int res_ikind_1, res_ikind_2;
3056   gfc_se lse;
3057   gfc_se rse;
3058   tree fndecl = NULL;
3059
3060   gfc_init_se (&lse, se);
3061   gfc_conv_expr_val (&lse, expr->value.op.op1);
3062   lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
3063   gfc_add_block_to_block (&se->pre, &lse.pre);
3064
3065   gfc_init_se (&rse, se);
3066   gfc_conv_expr_val (&rse, expr->value.op.op2);
3067   gfc_add_block_to_block (&se->pre, &rse.pre);
3068
3069   if (expr->value.op.op2->ts.type == BT_INTEGER
3070       && expr->value.op.op2->expr_type == EXPR_CONSTANT)
3071     if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
3072       return;
3073
3074   if (INTEGER_CST_P (lse.expr)
3075       && TREE_CODE (TREE_TYPE (rse.expr)) == INTEGER_TYPE)
3076     {
3077       wi::tree_to_wide_ref wlhs = wi::to_wide (lse.expr);
3078       HOST_WIDE_INT v, w;
3079       int kind, ikind, bit_size;
3080
3081       v = wlhs.to_shwi ();
3082       w = abs (v);
3083
3084       kind = expr->value.op.op1->ts.kind;
3085       ikind = gfc_validate_kind (BT_INTEGER, kind, false);
3086       bit_size = gfc_integer_kinds[ikind].bit_size;
3087
3088       if (v == 1)
3089         {
3090           /* 1**something is always 1.  */
3091           se->expr = build_int_cst (TREE_TYPE (lse.expr), 1);
3092           return;
3093         }
3094       else if (v == -1)
3095         {
3096           /* (-1)**n is 1 - ((n & 1) << 1) */
3097           tree type;
3098           tree tmp;
3099
3100           type = TREE_TYPE (lse.expr);
3101           tmp = fold_build2_loc (input_location, BIT_AND_EXPR, type,
3102                                  rse.expr, build_int_cst (type, 1));
3103           tmp = fold_build2_loc (input_location, LSHIFT_EXPR, type,
3104                                  tmp, build_int_cst (type, 1));
3105           tmp = fold_build2_loc (input_location, MINUS_EXPR, type,
3106                                  build_int_cst (type, 1), tmp);
3107           se->expr = tmp;
3108           return;
3109         }
3110       else if (w > 0 && ((w & (w-1)) == 0) && ((w >> (bit_size-1)) == 0))
3111         {
3112           /* Here v is +/- 2**e.  The further simplification uses
3113              2**n = 1<<n, 4**n = 1<<(n+n), 8**n = 1 <<(3*n), 16**n =
3114              1<<(4*n), etc., but we have to make sure to return zero
3115              if the number of bits is too large. */
3116           tree lshift;
3117           tree type;
3118           tree shift;
3119           tree ge;
3120           tree cond;
3121           tree num_bits;
3122           tree cond2;
3123           tree tmp1;
3124
3125           type = TREE_TYPE (lse.expr);
3126
3127           if (w == 2)
3128             shift = rse.expr;
3129           else if (w == 4)
3130             shift = fold_build2_loc (input_location, PLUS_EXPR,
3131                                      TREE_TYPE (rse.expr),
3132                                        rse.expr, rse.expr);
3133           else
3134             {
3135               /* use popcount for fast log2(w) */
3136               int e = wi::popcount (w-1);
3137               shift = fold_build2_loc (input_location, MULT_EXPR,
3138                                        TREE_TYPE (rse.expr),
3139                                        build_int_cst (TREE_TYPE (rse.expr), e),
3140                                        rse.expr);
3141             }
3142
3143           lshift = fold_build2_loc (input_location, LSHIFT_EXPR, type,
3144                                     build_int_cst (type, 1), shift);
3145           ge = fold_build2_loc (input_location, GE_EXPR, logical_type_node,
3146                                 rse.expr, build_int_cst (type, 0));
3147           cond = fold_build3_loc (input_location, COND_EXPR, type, ge, lshift,
3148                                  build_int_cst (type, 0));
3149           num_bits = build_int_cst (TREE_TYPE (rse.expr), TYPE_PRECISION (type));
3150           cond2 = fold_build2_loc (input_location, GE_EXPR, logical_type_node,
3151                                    rse.expr, num_bits);
3152           tmp1 = fold_build3_loc (input_location, COND_EXPR, type, cond2,
3153                                   build_int_cst (type, 0), cond);
3154           if (v > 0)
3155             {
3156               se->expr = tmp1;
3157             }
3158           else
3159             {
3160               /* for v < 0, calculate v**n = |v|**n * (-1)**n */
3161               tree tmp2;
3162               tmp2 = fold_build2_loc (input_location, BIT_AND_EXPR, type,
3163                                       rse.expr, build_int_cst (type, 1));
3164               tmp2 = fold_build2_loc (input_location, LSHIFT_EXPR, type,
3165                                       tmp2, build_int_cst (type, 1));
3166               tmp2 = fold_build2_loc (input_location, MINUS_EXPR, type,
3167                                       build_int_cst (type, 1), tmp2);
3168               se->expr = fold_build2_loc (input_location, MULT_EXPR, type,
3169                                           tmp1, tmp2);
3170             }
3171           return;
3172         }
3173     }
3174
3175   gfc_int4_type_node = gfc_get_int_type (4);
3176
3177   /* In case of integer operands with kinds 1 or 2, we call the integer kind 4
3178      library routine.  But in the end, we have to convert the result back
3179      if this case applies -- with res_ikind_K, we keep track whether operand K
3180      falls into this case.  */
3181   res_ikind_1 = -1;
3182   res_ikind_2 = -1;
3183
3184   kind = expr->value.op.op1->ts.kind;
3185   switch (expr->value.op.op2->ts.type)
3186     {
3187     case BT_INTEGER:
3188       ikind = expr->value.op.op2->ts.kind;
3189       switch (ikind)
3190         {
3191         case 1:
3192         case 2:
3193           rse.expr = convert (gfc_int4_type_node, rse.expr);
3194           res_ikind_2 = ikind;
3195           /* Fall through.  */
3196
3197         case 4:
3198           ikind = 0;
3199           break;
3200
3201         case 8:
3202           ikind = 1;
3203           break;
3204
3205         case 16:
3206           ikind = 2;
3207           break;
3208
3209         default:
3210           gcc_unreachable ();
3211         }
3212       switch (kind)
3213         {
3214         case 1:
3215         case 2:
3216           if (expr->value.op.op1->ts.type == BT_INTEGER)
3217             {
3218               lse.expr = convert (gfc_int4_type_node, lse.expr);
3219               res_ikind_1 = kind;
3220             }
3221           else
3222             gcc_unreachable ();
3223           /* Fall through.  */
3224
3225         case 4:
3226           kind = 0;
3227           break;
3228
3229         case 8:
3230           kind = 1;
3231           break;
3232
3233         case 10:
3234           kind = 2;
3235           break;
3236
3237         case 16:
3238           kind = 3;
3239           break;
3240
3241         default:
3242           gcc_unreachable ();
3243         }
3244
3245       switch (expr->value.op.op1->ts.type)
3246         {
3247         case BT_INTEGER:
3248           if (kind == 3) /* Case 16 was not handled properly above.  */
3249             kind = 2;
3250           fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
3251           break;
3252
3253         case BT_REAL:
3254           /* Use builtins for real ** int4.  */
3255           if (ikind == 0)
3256             {
3257               switch (kind)
3258                 {
3259                 case 0:
3260                   fndecl = builtin_decl_explicit (BUILT_IN_POWIF);
3261                   break;
3262
3263                 case 1:
3264                   fndecl = builtin_decl_explicit (BUILT_IN_POWI);
3265                   break;
3266
3267                 case 2:
3268                   fndecl = builtin_decl_explicit (BUILT_IN_POWIL);
3269                   break;
3270
3271                 case 3:
3272                   /* Use the __builtin_powil() only if real(kind=16) is
3273                      actually the C long double type.  */
3274                   if (!gfc_real16_is_float128)
3275                     fndecl = builtin_decl_explicit (BUILT_IN_POWIL);
3276                   break;
3277
3278                 default:
3279                   gcc_unreachable ();
3280                 }
3281             }
3282
3283           /* If we don't have a good builtin for this, go for the
3284              library function.  */
3285           if (!fndecl)
3286             fndecl = gfor_fndecl_math_powi[kind][ikind].real;
3287           break;
3288
3289         case BT_COMPLEX:
3290           fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
3291           break;
3292
3293         default:
3294           gcc_unreachable ();
3295         }
3296       break;
3297
3298     case BT_REAL:
3299       fndecl = gfc_builtin_decl_for_float_kind (BUILT_IN_POW, kind);
3300       break;
3301
3302     case BT_COMPLEX:
3303       fndecl = gfc_builtin_decl_for_float_kind (BUILT_IN_CPOW, kind);
3304       break;
3305
3306     default:
3307       gcc_unreachable ();
3308       break;
3309     }
3310
3311   se->expr = build_call_expr_loc (input_location,
3312                               fndecl, 2, lse.expr, rse.expr);
3313
3314   /* Convert the result back if it is of wrong integer kind.  */
3315   if (res_ikind_1 != -1 && res_ikind_2 != -1)
3316     {
3317       /* We want the maximum of both operand kinds as result.  */
3318       if (res_ikind_1 < res_ikind_2)
3319         res_ikind_1 = res_ikind_2;
3320       se->expr = convert (gfc_get_int_type (res_ikind_1), se->expr);
3321     }
3322 }
3323
3324
3325 /* Generate code to allocate a string temporary.  */
3326
3327 tree
3328 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
3329 {
3330   tree var;
3331   tree tmp;
3332
3333   if (gfc_can_put_var_on_stack (len))
3334     {
3335       /* Create a temporary variable to hold the result.  */
3336       tmp = fold_build2_loc (input_location, MINUS_EXPR,
3337                              TREE_TYPE (len), len,
3338                              build_int_cst (TREE_TYPE (len), 1));
3339       tmp = build_range_type (gfc_charlen_type_node, size_zero_node, tmp);
3340
3341       if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
3342         tmp = build_array_type (TREE_TYPE (TREE_TYPE (type)), tmp);
3343       else
3344         tmp = build_array_type (TREE_TYPE (type), tmp);
3345
3346       var = gfc_create_var (tmp, "str");
3347       var = gfc_build_addr_expr (type, var);
3348     }
3349   else
3350     {
3351       /* Allocate a temporary to hold the result.  */
3352       var = gfc_create_var (type, "pstr");
3353       gcc_assert (POINTER_TYPE_P (type));
3354       tmp = TREE_TYPE (type);
3355       if (TREE_CODE (tmp) == ARRAY_TYPE)
3356         tmp = TREE_TYPE (tmp);
3357       tmp = TYPE_SIZE_UNIT (tmp);
3358       tmp = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
3359                             fold_convert (size_type_node, len),
3360                             fold_convert (size_type_node, tmp));
3361       tmp = gfc_call_malloc (&se->pre, type, tmp);
3362       gfc_add_modify (&se->pre, var, tmp);
3363
3364       /* Free the temporary afterwards.  */
3365       tmp = gfc_call_free (var);
3366       gfc_add_expr_to_block (&se->post, tmp);
3367     }
3368
3369   return var;
3370 }
3371
3372
3373 /* Handle a string concatenation operation.  A temporary will be allocated to
3374    hold the result.  */
3375
3376 static void
3377 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
3378 {
3379   gfc_se lse, rse;
3380   tree len, type, var, tmp, fndecl;
3381
3382   gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
3383               && expr->value.op.op2->ts.type == BT_CHARACTER);
3384   gcc_assert (expr->value.op.op1->ts.kind == expr->value.op.op2->ts.kind);
3385
3386   gfc_init_se (&lse, se);
3387   gfc_conv_expr (&lse, expr->value.op.op1);
3388   gfc_conv_string_parameter (&lse);
3389   gfc_init_se (&rse, se);
3390   gfc_conv_expr (&rse, expr->value.op.op2);
3391   gfc_conv_string_parameter (&rse);
3392
3393   gfc_add_block_to_block (&se->pre, &lse.pre);
3394   gfc_add_block_to_block (&se->pre, &rse.pre);
3395
3396   type = gfc_get_character_type (expr->ts.kind, expr->ts.u.cl);
3397   len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3398   if (len == NULL_TREE)
3399     {
3400       len = fold_build2_loc (input_location, PLUS_EXPR,
3401                              gfc_charlen_type_node,
3402                              fold_convert (gfc_charlen_type_node,
3403                                            lse.string_length),
3404                              fold_convert (gfc_charlen_type_node,
3405                                            rse.string_length));
3406     }
3407
3408   type = build_pointer_type (type);
3409
3410   var = gfc_conv_string_tmp (se, type, len);
3411
3412   /* Do the actual concatenation.  */
3413   if (expr->ts.kind == 1)
3414     fndecl = gfor_fndecl_concat_string;
3415   else if (expr->ts.kind == 4)
3416     fndecl = gfor_fndecl_concat_string_char4;
3417   else
3418     gcc_unreachable ();
3419
3420   tmp = build_call_expr_loc (input_location,
3421                          fndecl, 6, len, var, lse.string_length, lse.expr,
3422                          rse.string_length, rse.expr);
3423   gfc_add_expr_to_block (&se->pre, tmp);
3424
3425   /* Add the cleanup for the operands.  */
3426   gfc_add_block_to_block (&se->pre, &rse.post);
3427   gfc_add_block_to_block (&se->pre, &lse.post);
3428
3429   se->expr = var;
3430   se->string_length = len;
3431 }
3432
3433 /* Translates an op expression. Common (binary) cases are handled by this
3434    function, others are passed on. Recursion is used in either case.
3435    We use the fact that (op1.ts == op2.ts) (except for the power
3436    operator **).
3437    Operators need no special handling for scalarized expressions as long as
3438    they call gfc_conv_simple_val to get their operands.
3439    Character strings get special handling.  */
3440
3441 static void
3442 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
3443 {
3444   enum tree_code code;
3445   gfc_se lse;
3446   gfc_se rse;
3447   tree tmp, type;
3448   int lop;
3449   int checkstring;
3450
3451   checkstring = 0;
3452   lop = 0;
3453   switch (expr->value.op.op)
3454     {
3455     case INTRINSIC_PARENTHESES:
3456       if ((expr->ts.type == BT_REAL || expr->ts.type == BT_COMPLEX)
3457           && flag_protect_parens)
3458         {
3459           gfc_conv_unary_op (PAREN_EXPR, se, expr);
3460           gcc_assert (FLOAT_TYPE_P (TREE_TYPE (se->expr)));
3461           return;
3462         }
3463
3464       /* Fallthrough.  */
3465     case INTRINSIC_UPLUS:
3466       gfc_conv_expr (se, expr->value.op.op1);
3467       return;
3468
3469     case INTRINSIC_UMINUS:
3470       gfc_conv_unary_op (NEGATE_EXPR, se, expr);
3471       return;
3472
3473     case INTRINSIC_NOT:
3474       gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
3475       return;
3476
3477     case INTRINSIC_PLUS:
3478       code = PLUS_EXPR;
3479       break;
3480
3481     case INTRINSIC_MINUS:
3482       code = MINUS_EXPR;
3483       break;
3484
3485     case INTRINSIC_TIMES:
3486       code = MULT_EXPR;
3487       break;
3488
3489     case INTRINSIC_DIVIDE:
3490       /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
3491          an integer, we must round towards zero, so we use a
3492          TRUNC_DIV_EXPR.  */
3493       if (expr->ts.type == BT_INTEGER)
3494         code = TRUNC_DIV_EXPR;
3495       else
3496         code = RDIV_EXPR;
3497       break;
3498
3499     case INTRINSIC_POWER:
3500       gfc_conv_power_op (se, expr);
3501       return;
3502
3503     case INTRINSIC_CONCAT:
3504       gfc_conv_concat_op (se, expr);
3505       return;
3506
3507     case INTRINSIC_AND:
3508       code = flag_frontend_optimize ? TRUTH_ANDIF_EXPR : TRUTH_AND_EXPR;
3509       lop = 1;
3510       break;
3511
3512     case INTRINSIC_OR:
3513       code = flag_frontend_optimize ? TRUTH_ORIF_EXPR : TRUTH_OR_EXPR;
3514       lop = 1;
3515       break;
3516
3517       /* EQV and NEQV only work on logicals, but since we represent them
3518          as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE.  */
3519     case INTRINSIC_EQ:
3520     case INTRINSIC_EQ_OS:
3521     case INTRINSIC_EQV:
3522       code = EQ_EXPR;
3523       checkstring = 1;
3524       lop = 1;
3525       break;
3526
3527     case INTRINSIC_NE:
3528     case INTRINSIC_NE_OS:
3529     case INTRINSIC_NEQV:
3530       code = NE_EXPR;
3531       checkstring = 1;
3532       lop = 1;
3533       break;
3534
3535     case INTRINSIC_GT:
3536     case INTRINSIC_GT_OS:
3537       code = GT_EXPR;
3538       checkstring = 1;
3539       lop = 1;
3540       break;
3541
3542     case INTRINSIC_GE:
3543     case INTRINSIC_GE_OS:
3544       code = GE_EXPR;
3545       checkstring = 1;
3546       lop = 1;
3547       break;
3548
3549     case INTRINSIC_LT:
3550     case INTRINSIC_LT_OS:
3551       code = LT_EXPR;
3552       checkstring = 1;
3553       lop = 1;
3554       break;
3555
3556     case INTRINSIC_LE:
3557     case INTRINSIC_LE_OS:
3558       code = LE_EXPR;
3559       checkstring = 1;
3560       lop = 1;
3561       break;
3562
3563     case INTRINSIC_USER:
3564     case INTRINSIC_ASSIGN:
3565       /* These should be converted into function calls by the frontend.  */
3566       gcc_unreachable ();
3567
3568     default:
3569       fatal_error (input_location, "Unknown intrinsic op");
3570       return;
3571     }
3572
3573   /* The only exception to this is **, which is handled separately anyway.  */
3574   gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
3575
3576   if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
3577     checkstring = 0;
3578
3579   /* lhs */
3580   gfc_init_se (&lse, se);
3581   gfc_conv_expr (&lse, expr->value.op.op1);
3582   gfc_add_block_to_block (&se->pre, &lse.pre);
3583
3584   /* rhs */
3585   gfc_init_se (&rse, se);
3586   gfc_conv_expr (&rse, expr->value.op.op2);
3587   gfc_add_block_to_block (&se->pre, &rse.pre);
3588
3589   if (checkstring)
3590     {
3591       gfc_conv_string_parameter (&lse);
3592       gfc_conv_string_parameter (&rse);
3593
3594       lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
3595                                            rse.string_length, rse.expr,
3596                                            expr->value.op.op1->ts.kind,
3597                                            code);
3598       rse.expr = build_int_cst (TREE_TYPE (lse.expr), 0);
3599       gfc_add_block_to_block (&lse.post, &rse.post);
3600     }
3601
3602   type = gfc_typenode_for_spec (&expr->ts);
3603
3604   if (lop)
3605     {
3606       /* The result of logical ops is always logical_type_node.  */
3607       tmp = fold_build2_loc (input_location, code, logical_type_node,
3608                              lse.expr, rse.expr);
3609       se->expr = convert (type, tmp);
3610     }
3611   else
3612     se->expr = fold_build2_loc (input_location, code, type, lse.expr, rse.expr);
3613
3614   /* Add the post blocks.  */
3615   gfc_add_block_to_block (&se->post, &rse.post);
3616   gfc_add_block_to_block (&se->post, &lse.post);
3617 }
3618
3619 /* If a string's length is one, we convert it to a single character.  */
3620
3621 tree
3622 gfc_string_to_single_character (tree len, tree str, int kind)
3623 {
3624
3625   if (len == NULL
3626       || !tree_fits_uhwi_p (len)
3627       || !POINTER_TYPE_P (TREE_TYPE (str)))
3628     return NULL_TREE;
3629
3630   if (TREE_INT_CST_LOW (len) == 1)
3631     {
3632       str = fold_convert (gfc_get_pchar_type (kind), str);
3633       return build_fold_indirect_ref_loc (input_location, str);
3634     }
3635
3636   if (kind == 1
3637       && TREE_CODE (str) == ADDR_EXPR
3638       && TREE_CODE (TREE_OPERAND (str, 0)) == ARRAY_REF
3639       && TREE_CODE (TREE_OPERAND (TREE_OPERAND (str, 0), 0)) == STRING_CST
3640       && array_ref_low_bound (TREE_OPERAND (str, 0))
3641          == TREE_OPERAND (TREE_OPERAND (str, 0), 1)
3642       && TREE_INT_CST_LOW (len) > 1
3643       && TREE_INT_CST_LOW (len)
3644          == (unsigned HOST_WIDE_INT)
3645             TREE_STRING_LENGTH (TREE_OPERAND (TREE_OPERAND (str, 0), 0)))
3646     {
3647       tree ret = fold_convert (gfc_get_pchar_type (kind), str);
3648       ret = build_fold_indirect_ref_loc (input_location, ret);
3649       if (TREE_CODE (ret) == INTEGER_CST)
3650         {
3651           tree string_cst = TREE_OPERAND (TREE_OPERAND (str, 0), 0);
3652           int i, length = TREE_STRING_LENGTH (string_cst);
3653           const char *ptr = TREE_STRING_POINTER (string_cst);
3654
3655           for (i = 1; i < length; i++)
3656             if (ptr[i] != ' ')
3657               return NULL_TREE;
3658
3659           return ret;
3660         }
3661     }
3662
3663   return NULL_TREE;
3664 }
3665
3666
3667 void
3668 gfc_conv_scalar_char_value (gfc_symbol *sym, gfc_se *se, gfc_expr **expr)
3669 {
3670
3671   if (sym->backend_decl)
3672     {
3673       /* This becomes the nominal_type in
3674          function.c:assign_parm_find_data_types.  */
3675       TREE_TYPE (sym->backend_decl) = unsigned_char_type_node;
3676       /* This becomes the passed_type in
3677          function.c:assign_parm_find_data_types.  C promotes char to
3678          integer for argument passing.  */
3679       DECL_ARG_TYPE (sym->backend_decl) = unsigned_type_node;
3680
3681       DECL_BY_REFERENCE (sym->backend_decl) = 0;
3682     }
3683
3684   if (expr != NULL)
3685     {
3686       /* If we have a constant character expression, make it into an
3687          integer.  */
3688       if ((*expr)->expr_type == EXPR_CONSTANT)
3689         {
3690           gfc_typespec ts;
3691           gfc_clear_ts (&ts);
3692
3693           *expr = gfc_get_int_expr (gfc_default_integer_kind, NULL,
3694                                     (int)(*expr)->value.character.string[0]);
3695           if ((*expr)->ts.kind != gfc_c_int_kind)
3696             {
3697               /* The expr needs to be compatible with a C int.  If the
3698                  conversion fails, then the 2 causes an ICE.  */
3699               ts.type = BT_INTEGER;
3700               ts.kind = gfc_c_int_kind;
3701               gfc_convert_type (*expr, &ts, 2);
3702             }
3703         }
3704       else if (se != NULL && (*expr)->expr_type == EXPR_VARIABLE)
3705         {
3706           if ((*expr)->ref == NULL)
3707             {
3708               se->expr = gfc_string_to_single_character
3709                 (build_int_cst (integer_type_node, 1),
3710                  gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
3711                                       gfc_get_symbol_decl
3712                                       ((*expr)->symtree->n.sym)),
3713                  (*expr)->ts.kind);
3714             }
3715           else
3716             {
3717               gfc_conv_variable (se, *expr);
3718               se->expr = gfc_string_to_single_character
3719                 (build_int_cst (integer_type_node, 1),
3720                  gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
3721                                       se->expr),
3722                  (*expr)->ts.kind);
3723             }
3724         }
3725     }
3726 }
3727
3728 /* Helper function for gfc_build_compare_string.  Return LEN_TRIM value
3729    if STR is a string literal, otherwise return -1.  */
3730
3731 static int
3732 gfc_optimize_len_trim (tree len, tree str, int kind)
3733 {
3734   if (kind == 1
3735       && TREE_CODE (str) == ADDR_EXPR
3736       && TREE_CODE (TREE_OPERAND (str, 0)) == ARRAY_REF
3737       && TREE_CODE (TREE_OPERAND (TREE_OPERAND (str, 0), 0)) == STRING_CST
3738       && array_ref_low_bound (TREE_OPERAND (str, 0))
3739          == TREE_OPERAND (TREE_OPERAND (str, 0), 1)
3740       && tree_fits_uhwi_p (len)
3741       && tree_to_uhwi (len) >= 1
3742       && tree_to_uhwi (len)
3743          == (unsigned HOST_WIDE_INT)
3744             TREE_STRING_LENGTH (TREE_OPERAND (TREE_OPERAND (str, 0), 0)))
3745     {
3746       tree folded = fold_convert (gfc_get_pchar_type (kind), str);
3747       folded = build_fold_indirect_ref_loc (input_location, folded);
3748       if (TREE_CODE (folded) == INTEGER_CST)
3749         {
3750           tree string_cst = TREE_OPERAND (TREE_OPERAND (str, 0), 0);
3751           int length = TREE_STRING_LENGTH (string_cst);
3752           const char *ptr = TREE_STRING_POINTER (string_cst);
3753
3754           for (; length > 0; length--)
3755             if (ptr[length - 1] != ' ')
3756               break;
3757
3758           return length;
3759         }
3760     }
3761   return -1;
3762 }
3763
3764 /* Helper to build a call to memcmp.  */
3765
3766 static tree
3767 build_memcmp_call (tree s1, tree s2, tree n)
3768 {
3769   tree tmp;
3770
3771   if (!POINTER_TYPE_P (TREE_TYPE (s1)))
3772     s1 = gfc_build_addr_expr (pvoid_type_node, s1);
3773   else
3774     s1 = fold_convert (pvoid_type_node, s1);
3775
3776   if (!POINTER_TYPE_P (TREE_TYPE (s2)))
3777     s2 = gfc_build_addr_expr (pvoid_type_node, s2);
3778   else
3779     s2 = fold_convert (pvoid_type_node, s2);
3780
3781   n = fold_convert (size_type_node, n);
3782
3783   tmp = build_call_expr_loc (input_location,
3784                              builtin_decl_explicit (BUILT_IN_MEMCMP),
3785                              3, s1, s2, n);
3786
3787   return fold_convert (integer_type_node, tmp);
3788 }
3789
3790 /* Compare two strings. If they are all single characters, the result is the
3791    subtraction of them. Otherwise, we build a library call.  */
3792
3793 tree
3794 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2, int kind,
3795                           enum tree_code code)
3796 {
3797   tree sc1;
3798   tree sc2;
3799   tree fndecl;
3800
3801   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
3802   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
3803
3804   sc1 = gfc_string_to_single_character (len1, str1, kind);
3805   sc2 = gfc_string_to_single_character (len2, str2, kind);
3806
3807   if (sc1 != NULL_TREE && sc2 != NULL_TREE)
3808     {
3809       /* Deal with single character specially.  */
3810       sc1 = fold_convert (integer_type_node, sc1);
3811       sc2 = fold_convert (integer_type_node, sc2);
3812       return fold_build2_loc (input_location, MINUS_EXPR, integer_type_node,
3813                               sc1, sc2);
3814     }
3815
3816   if ((code == EQ_EXPR || code == NE_EXPR)
3817       && optimize
3818       && INTEGER_CST_P (len1) && INTEGER_CST_P (len2))
3819     {
3820       /* If one string is a string literal with LEN_TRIM longer
3821          than the length of the second string, the strings
3822          compare unequal.  */
3823       int len = gfc_optimize_len_trim (len1, str1, kind);
3824       if (len > 0 && compare_tree_int (len2, len) < 0)
3825         return integer_one_node;
3826       len = gfc_optimize_len_trim (len2, str2, kind);
3827       if (len > 0 && compare_tree_int (len1, len) < 0)
3828         return integer_one_node;
3829     }
3830
3831   /* We can compare via memcpy if the strings are known to be equal
3832      in length and they are
3833      - kind=1
3834      - kind=4 and the comparison is for (in)equality.  */
3835
3836   if (INTEGER_CST_P (len1) && INTEGER_CST_P (len2)
3837       && tree_int_cst_equal (len1, len2)
3838       && (kind == 1 || code == EQ_EXPR || code == NE_EXPR))
3839     {
3840       tree tmp;
3841       tree chartype;
3842
3843       chartype = gfc_get_char_type (kind);
3844       tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE(len1),
3845                              fold_convert (TREE_TYPE(len1),
3846                                            TYPE_SIZE_UNIT(chartype)),
3847                              len1);
3848       return build_memcmp_call (str1, str2, tmp);
3849     }
3850
3851   /* Build a call for the comparison.  */
3852   if (kind == 1)
3853     fndecl = gfor_fndecl_compare_string;
3854   else if (kind == 4)
3855     fndecl = gfor_fndecl_compare_string_char4;
3856   else
3857     gcc_unreachable ();
3858
3859   return build_call_expr_loc (input_location, fndecl, 4,
3860                               len1, str1, len2, str2);
3861 }
3862
3863
3864 /* Return the backend_decl for a procedure pointer component.  */
3865
3866 static tree
3867 get_proc_ptr_comp (gfc_expr *e)
3868 {
3869   gfc_se comp_se;
3870   gfc_expr *e2;
3871   expr_t old_type;
3872
3873   gfc_init_se (&comp_se, NULL);
3874   e2 = gfc_copy_expr (e);
3875   /* We have to restore the expr type later so that gfc_free_expr frees
3876      the exact same thing that was allocated.
3877      TODO: This is ugly.  */
3878   old_type = e2->expr_type;
3879   e2->expr_type = EXPR_VARIABLE;
3880   gfc_conv_expr (&comp_se, e2);
3881   e2->expr_type = old_type;
3882   gfc_free_expr (e2);
3883   return build_fold_addr_expr_loc (input_location, comp_se.expr);
3884 }
3885
3886
3887 /* Convert a typebound function reference from a class object.  */
3888 static void
3889 conv_base_obj_fcn_val (gfc_se * se, tree base_object, gfc_expr * expr)
3890 {
3891   gfc_ref *ref;
3892   tree var;
3893
3894   if (!VAR_P (base_object))
3895     {
3896       var = gfc_create_var (TREE_TYPE (base_object), NULL);
3897       gfc_add_modify (&se->pre, var, base_object);
3898     }
3899   se->expr = gfc_class_vptr_get (base_object);
3900   se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
3901   ref = expr->ref;
3902   while (ref && ref->next)
3903     ref = ref->next;
3904   gcc_assert (ref && ref->type == REF_COMPONENT);
3905   if (ref->u.c.sym->attr.extension)
3906     conv_parent_component_references (se, ref);
3907   gfc_conv_component_ref (se, ref);
3908   se->expr = build_fold_addr_expr_loc (input_location, se->expr);
3909 }
3910
3911
3912 static void
3913 conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr,
3914                    gfc_actual_arglist *actual_args)
3915 {
3916   tree tmp;
3917
3918   if (gfc_is_proc_ptr_comp (expr))
3919     tmp = get_proc_ptr_comp (expr);
3920   else if (sym->attr.dummy)
3921     {
3922       tmp = gfc_get_symbol_decl (sym);
3923       if (sym->attr.proc_pointer)
3924         tmp = build_fold_indirect_ref_loc (input_location,
3925                                        tmp);
3926       gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
3927               && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
3928     }
3929   else
3930     {
3931       if (!sym->backend_decl)
3932         sym->backend_decl = gfc_get_extern_function_decl (sym, actual_args);
3933
3934       TREE_USED (sym->backend_decl) = 1;
3935
3936       tmp = sym->backend_decl;
3937
3938       if (sym->attr.cray_pointee)
3939         {
3940           /* TODO - make the cray pointee a pointer to a procedure,
3941              assign the pointer to it and use it for the call.  This
3942              will do for now!  */
3943           tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
3944                          gfc_get_symbol_decl (sym->cp_pointer));
3945           tmp = gfc_evaluate_now (tmp, &se->pre);
3946         }
3947
3948       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
3949         {
3950           gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
3951           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
3952         }
3953     }
3954   se->expr = tmp;
3955 }
3956
3957
3958 /* Initialize MAPPING.  */
3959
3960 void
3961 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
3962 {
3963   mapping->syms = NULL;
3964   mapping->charlens = NULL;
3965 }
3966
3967
3968 /* Free all memory held by MAPPING (but not MAPPING itself).  */
3969
3970 void
3971 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
3972 {
3973   gfc_interface_sym_mapping *sym;
3974   gfc_interface_sym_mapping *nextsym;
3975   gfc_charlen *cl;
3976   gfc_charlen *nextcl;
3977
3978   for (sym = mapping->syms; sym; sym = nextsym)
3979     {
3980       nextsym = sym->next;
3981       sym->new_sym->n.sym->formal = NULL;
3982       gfc_free_symbol (sym->new_sym->n.sym);
3983       gfc_free_expr (sym->expr);
3984       free (sym->new_sym);
3985       free (sym);
3986     }
3987   for (cl = mapping->charlens; cl; cl = nextcl)
3988     {
3989       nextcl = cl->next;
3990       gfc_free_expr (cl->length);
3991       free (cl);
3992     }
3993 }
3994
3995
3996 /* Return a copy of gfc_charlen CL.  Add the returned structure to
3997    MAPPING so that it will be freed by gfc_free_interface_mapping.  */
3998
3999 static gfc_charlen *
4000 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
4001                                    gfc_charlen * cl)
4002 {
4003   gfc_charlen *new_charlen;
4004
4005   new_charlen = gfc_get_charlen ();
4006   new_charlen->next = mapping->charlens;
4007   new_charlen->length = gfc_copy_expr (cl->length);
4008
4009   mapping->charlens = new_charlen;
4010   return new_charlen;
4011 }
4012
4013
4014 /* A subroutine of gfc_add_interface_mapping.  Return a descriptorless
4015    array variable that can be used as the actual argument for dummy
4016    argument SYM.  Add any initialization code to BLOCK.  PACKED is as
4017    for gfc_get_nodesc_array_type and DATA points to the first element
4018    in the passed array.  */
4019
4020 static tree
4021 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
4022                                  gfc_packed packed, tree data)
4023 {
4024   tree type;
4025   tree var;
4026
4027   type = gfc_typenode_for_spec (&sym->ts);
4028   type = gfc_get_nodesc_array_type (type, sym->as, packed,
4029                                     !sym->attr.target && !sym->attr.pointer
4030                                     && !sym->attr.proc_pointer);
4031
4032   var = gfc_create_var (type, "ifm");
4033   gfc_add_modify (block, var, fold_convert (type, data));
4034
4035   return var;
4036 }
4037
4038
4039 /* A subroutine of gfc_add_interface_mapping.  Set the stride, upper bounds
4040    and offset of descriptorless array type TYPE given that it has the same
4041    size as DESC.  Add any set-up code to BLOCK.  */
4042
4043 static void
4044 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
4045 {
4046   int n;
4047   tree dim;
4048   tree offset;
4049   tree tmp;
4050
4051   offset = gfc_index_zero_node;
4052   for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
4053     {
4054       dim = gfc_rank_cst[n];
4055       GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
4056       if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
4057         {
4058           GFC_TYPE_ARRAY_LBOUND (type, n)
4059                 = gfc_conv_descriptor_lbound_get (desc, dim);
4060           GFC_TYPE_ARRAY_UBOUND (type, n)
4061                 = gfc_conv_descriptor_ubound_get (desc, dim);
4062         }
4063       else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
4064         {
4065           tmp = fold_build2_loc (input_location, MINUS_EXPR,
4066                                  gfc_array_index_type,
4067                                  gfc_conv_descriptor_ubound_get (desc, dim),
4068                                  gfc_conv_descriptor_lbound_get (desc, dim));
4069           tmp = fold_build2_loc (input_location, PLUS_EXPR,
4070                                  gfc_array_index_type,
4071                                  GFC_TYPE_ARRAY_LBOUND (type, n), tmp);
4072           tmp = gfc_evaluate_now (tmp, block);
4073           GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
4074         }
4075       tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
4076                              GFC_TYPE_ARRAY_LBOUND (type, n),
4077                              GFC_TYPE_ARRAY_STRIDE (type, n));
4078       offset = fold_build2_loc (input_location, MINUS_EXPR,
4079                                 gfc_array_index_type, offset, tmp);
4080     }
4081   offset = gfc_evaluate_now (offset, block);
4082   GFC_TYPE_ARRAY_OFFSET (type) = offset;
4083 }
4084
4085
4086 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
4087    in SE.  The caller may still use se->expr and se->string_length after
4088    calling this function.  */
4089
4090 void
4091 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
4092                            gfc_symbol * sym, gfc_se * se,
4093                            gfc_expr *expr)
4094 {
4095   gfc_interface_sym_mapping *sm;
4096   tree desc;
4097   tree tmp;
4098   tree value;
4099   gfc_symbol *new_sym;
4100   gfc_symtree *root;
4101   gfc_symtree *new_symtree;
4102
4103   /* Create a new symbol to represent the actual argument.  */
4104   new_sym = gfc_new_symbol (sym->name, NULL);
4105   new_sym->ts = sym->ts;
4106   new_sym->as = gfc_copy_array_spec (sym->as);
4107   new_sym->attr.referenced = 1;
4108   new_sym->attr.dimension = sym->attr.dimension;
4109   new_sym->attr.contiguous = sym->attr.contiguous;
4110   new_sym->attr.codimension = sym->attr.codimension;
4111   new_sym->attr.pointer = sym->attr.pointer;
4112   new_sym->attr.allocatable = sym->attr.allocatable;
4113   new_sym->attr.flavor = sym->attr.flavor;
4114   new_sym->attr.function = sym->attr.function;
4115
4116   /* Ensure that the interface is available and that
4117      descriptors are passed for array actual arguments.  */
4118   if (sym->attr.flavor == FL_PROCEDURE)
4119     {
4120       new_sym->formal = expr->symtree->n.sym->formal;
4121       new_sym->attr.always_explicit
4122             = expr->symtree->n.sym->attr.always_explicit;
4123     }
4124
4125   /* Create a fake symtree for it.  */
4126   root = NULL;
4127   new_symtree = gfc_new_symtree (&root, sym->name);
4128   new_symtree->n.sym = new_sym;
4129   gcc_assert (new_symtree == root);
4130
4131   /* Create a dummy->actual mapping.  */
4132   sm = XCNEW (gfc_interface_sym_mapping);
4133   sm->next = mapping->syms;
4134   sm->old = sym;
4135   sm->new_sym = new_symtree;
4136   sm->expr = gfc_copy_expr (expr);
4137   mapping->syms = sm;
4138
4139   /* Stabilize the argument's value.  */
4140   if (!sym->attr.function && se)
4141     se->expr = gfc_evaluate_now (se->expr, &se->pre);
4142
4143   if (sym->ts.type == BT_CHARACTER)
4144     {
4145       /* Create a copy of the dummy argument's length.  */
4146       new_sym->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.u.cl);
4147       sm->expr->ts.u.cl = new_sym->ts.u.cl;
4148
4149       /* If the length is specified as "*", record the length that
4150          the caller is passing.  We should use the callee's length
4151          in all other cases.  */
4152       if (!new_sym->ts.u.cl->length && se)
4153         {
4154           se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
4155           new_sym->ts.u.cl->backend_decl = se->string_length;
4156         }
4157     }
4158
4159   if (!se)
4160     return;
4161
4162   /* Use the passed value as-is if the argument is a function.  */
4163   if (sym->attr.flavor == FL_PROCEDURE)
4164     value = se->expr;
4165
4166   /* If the argument is a pass-by-value scalar, use the value as is.  */
4167   else if (!sym->attr.dimension && sym->attr.value)
4168     value = se->expr;
4169
4170   /* If the argument is either a string or a pointer to a string,
4171      convert it to a boundless character type.  */
4172   else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
4173     {
4174       tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
4175       tmp = build_pointer_type (tmp);
4176       if (sym->attr.pointer)
4177         value = build_fold_indirect_ref_loc (input_location,
4178                                          se->expr);
4179       else
4180         value = se->expr;
4181       value = fold_convert (tmp, value);
4182     }
4183
4184   /* If the argument is a scalar, a pointer to an array or an allocatable,
4185      dereference it.  */
4186   else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
4187     value = build_fold_indirect_ref_loc (input_location,
4188                                      se->expr);
4189
4190   /* For character(*), use the actual argument's descriptor.  */
4191   else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.u.cl->length)
4192     value = build_fold_indirect_ref_loc (input_location,
4193                                      se->expr);
4194
4195   /* If the argument is an array descriptor, use it to determine
4196      information about the actual argument's shape.  */
4197   else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
4198            && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
4199     {
4200       /* Get the actual argument's descriptor.  */
4201       desc = build_fold_indirect_ref_loc (input_location,
4202                                       se->expr);
4203
4204       /* Create the replacement variable.  */
4205       tmp = gfc_conv_descriptor_data_get (desc);
4206       value = gfc_get_interface_mapping_array (&se->pre, sym,
4207                                                PACKED_NO, tmp);
4208
4209       /* Use DESC to work out the upper bounds, strides and offset.  */
4210       gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
4211     }
4212   else
4213     /* Otherwise we have a packed array.  */
4214     value = gfc_get_interface_mapping_array (&se->pre, sym,
4215                                              PACKED_FULL, se->expr);
4216
4217   new_sym->backend_decl = value;
4218 }
4219
4220
4221 /* Called once all dummy argument mappings have been added to MAPPING,
4222    but before the mapping is used to evaluate expressions.  Pre-evaluate
4223    the length of each argument, adding any initialization code to PRE and
4224    any finalization code to POST.  */
4225
4226 void
4227 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
4228                               stmtblock_t * pre, stmtblock_t * post)
4229 {
4230   gfc_interface_sym_mapping *sym;
4231   gfc_expr *expr;
4232   gfc_se se;
4233
4234   for (sym = mapping->syms; sym; sym = sym->next)
4235     if (sym->new_sym->n.sym->ts.type == BT_CHARACTER
4236         && !sym->new_sym->n.sym->ts.u.cl->backend_decl)
4237       {
4238         expr = sym->new_sym->n.sym->ts.u.cl->length;
4239         gfc_apply_interface_mapping_to_expr (mapping, expr);
4240         gfc_init_se (&se, NULL);
4241         gfc_conv_expr (&se, expr);
4242         se.expr = fold_convert (gfc_charlen_type_node, se.expr);
4243         se.expr = gfc_evaluate_now (se.expr, &se.pre);
4244         gfc_add_block_to_block (pre, &se.pre);
4245         gfc_add_block_to_block (post, &se.post);
4246
4247         sym->new_sym->n.sym->ts.u.cl->backend_decl = se.expr;
4248       }
4249 }
4250
4251
4252 /* Like gfc_apply_interface_mapping_to_expr, but applied to
4253    constructor C.  */
4254
4255 static void
4256 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
4257                                      gfc_constructor_base base)
4258 {
4259   gfc_constructor *c;
4260   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
4261     {
4262       gfc_apply_interface_mapping_to_expr (mapping, c->expr);
4263       if (c->iterator)
4264         {
4265           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
4266           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
4267           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
4268         }
4269     }
4270 }
4271
4272
4273 /* Like gfc_apply_interface_mapping_to_expr, but applied to
4274    reference REF.  */
4275
4276 static void
4277 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
4278                                     gfc_ref * ref)
4279 {
4280   int n;
4281
4282   for (; ref; ref = ref->next)
4283     switch (ref->type)
4284       {
4285       case REF_ARRAY:
4286         for (n = 0; n < ref->u.ar.dimen; n++)
4287           {
4288             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
4289             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
4290             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
4291           }
4292         break;
4293
4294       case REF_COMPONENT:
4295       case REF_INQUIRY:
4296         break;
4297
4298       case REF_SUBSTRING:
4299         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
4300         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
4301         break;
4302       }
4303 }
4304
4305
4306 /* Convert intrinsic function calls into result expressions.  */
4307
4308 static bool
4309 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping)
4310 {
4311   gfc_symbol *sym;
4312   gfc_expr *new_expr;
4313   gfc_expr *arg1;
4314   gfc_expr *arg2;
4315   int d, dup;
4316
4317   arg1 = expr->value.function.actual->expr;
4318   if (expr->value.function.actual->next)
4319     arg2 = expr->value.function.actual->next->expr;
4320   else
4321     arg2 = NULL;
4322
4323   sym = arg1->symtree->n.sym;
4324
4325   if (sym->attr.dummy)
4326     return false;
4327
4328   new_expr = NULL;
4329
4330   switch (expr->value.function.isym->id)
4331     {
4332     case GFC_ISYM_LEN:
4333       /* TODO figure out why this condition is necessary.  */
4334       if (sym->attr.function
4335           && (arg1->ts.u.cl->length == NULL
4336               || (arg1->ts.u.cl->length->expr_type != EXPR_CONSTANT
4337                   && arg1->ts.u.cl->length->expr_type != EXPR_VARIABLE)))
4338         return false;
4339
4340       new_expr = gfc_copy_expr (arg1->ts.u.cl->length);
4341       break;
4342
4343     case GFC_ISYM_LEN_TRIM:
4344       new_expr = gfc_copy_expr (arg1);
4345       gfc_apply_interface_mapping_to_expr (mapping, new_expr);
4346
4347       if (!new_expr)
4348         return false;
4349
4350       gfc_replace_expr (arg1, new_expr);
4351       return true;
4352
4353     case GFC_ISYM_SIZE:
4354       if (!sym->as || sym->as->rank == 0)
4355         return false;
4356
4357       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
4358         {
4359           dup = mpz_get_si (arg2->value.integer);
4360           d = dup - 1;
4361         }
4362       else
4363         {
4364           dup = sym->as->rank;
4365           d = 0;
4366         }
4367
4368       for (; d < dup; d++)
4369         {
4370           gfc_expr *tmp;
4371
4372           if (!sym->as->upper[d] || !sym->as->lower[d])
4373             {
4374               gfc_free_expr (new_expr);
4375               return false;
4376             }
4377
4378           tmp = gfc_add (gfc_copy_expr (sym->as->upper[d]),
4379                                         gfc_get_int_expr (gfc_default_integer_kind,
4380                                                           NULL, 1));
4381           tmp = gfc_subtract (tmp, gfc_copy_expr (sym->as->lower[d]));
4382           if (new_expr)
4383             new_expr = gfc_multiply (new_expr, tmp);
4384           else
4385             new_expr = tmp;
4386         }
4387       break;
4388
4389     case GFC_ISYM_LBOUND:
4390     case GFC_ISYM_UBOUND:
4391         /* TODO These implementations of lbound and ubound do not limit if
4392            the size < 0, according to F95's 13.14.53 and 13.14.113.  */
4393
4394       if (!sym->as || sym->as->rank == 0)
4395         return false;
4396
4397       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
4398         d = mpz_get_si (arg2->value.integer) - 1;
4399       else
4400         return false;
4401
4402       if (expr->value.function.isym->id == GFC_ISYM_LBOUND)
4403         {
4404           if (sym->as->lower[d])
4405             new_expr = gfc_copy_expr (sym->as->lower[d]);
4406         }
4407       else
4408         {
4409           if (sym->as->upper[d])
4410             new_expr = gfc_copy_expr (sym->as->upper[d]);
4411         }
4412       break;
4413
4414     default:
4415       break;
4416     }
4417
4418   gfc_apply_interface_mapping_to_expr (mapping, new_expr);
4419   if (!new_expr)
4420     return false;
4421
4422   gfc_replace_expr (expr, new_expr);
4423   return true;
4424 }
4425
4426
4427 static void
4428 gfc_map_fcn_formal_to_actual (gfc_expr *expr, gfc_expr *map_expr,
4429                               gfc_interface_mapping * mapping)
4430 {
4431   gfc_formal_arglist *f;
4432   gfc_actual_arglist *actual;
4433
4434   actual = expr->value.function.actual;
4435   f = gfc_sym_get_dummy_args (map_expr->symtree->n.sym);
4436
4437   for (; f && actual; f = f->next, actual = actual->next)
4438     {
4439       if (!actual->expr)
4440         continue;
4441
4442       gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
4443     }
4444
4445   if (map_expr->symtree->n.sym->attr.dimension)
4446     {
4447       int d;
4448       gfc_array_spec *as;
4449
4450       as = gfc_copy_array_spec (map_expr->symtree->n.sym->as);
4451
4452       for (d = 0; d < as->rank; d++)
4453         {
4454           gfc_apply_interface_mapping_to_expr (mapping, as->lower[d]);
4455           gfc_apply_interface_mapping_to_expr (mapping, as->upper[d]);
4456         }
4457
4458       expr->value.function.esym->as = as;
4459     }
4460
4461   if (map_expr->symtree->n.sym->ts.type == BT_CHARACTER)
4462     {
4463       expr->value.function.esym->ts.u.cl->length
4464         = gfc_copy_expr (map_expr->symtree->n.sym->ts.u.cl->length);
4465
4466       gfc_apply_interface_mapping_to_expr (mapping,
4467                         expr->value.function.esym->ts.u.cl->length);
4468     }
4469 }
4470
4471
4472 /* EXPR is a copy of an expression that appeared in the interface
4473    associated with MAPPING.  Walk it recursively looking for references to
4474    dummy arguments that MAPPING maps to actual arguments.  Replace each such
4475    reference with a reference to the associated actual argument.  */
4476
4477 static void
4478 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
4479                                      gfc_expr * expr)
4480 {
4481   gfc_interface_sym_mapping *sym;
4482   gfc_actual_arglist *actual;
4483
4484   if (!expr)
4485     return;
4486
4487   /* Copying an expression does not copy its length, so do that here.  */
4488   if (expr->ts.type == BT_CHARACTER && expr->ts.u.cl)
4489     {
4490       expr->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.u.cl);
4491       gfc_apply_interface_mapping_to_expr (mapping, expr->ts.u.cl->length);
4492     }
4493
4494   /* Apply the mapping to any references.  */
4495   gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
4496
4497   /* ...and to the expression's symbol, if it has one.  */
4498   /* TODO Find out why the condition on expr->symtree had to be moved into
4499      the loop rather than being outside it, as originally.  */
4500   for (sym = mapping->syms; sym; sym = sym->next)
4501     if (expr->symtree && sym->old == expr->symtree->n.sym)
4502       {
4503         if (sym->new_sym->n.sym->backend_decl)
4504           expr->symtree = sym->new_sym;
4505         else if (sym->expr)
4506           gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
4507       }
4508
4509       /* ...and to subexpressions in expr->value.  */
4510   switch (expr->expr_type)
4511     {
4512     case EXPR_VARIABLE:
4513     case EXPR_CONSTANT:
4514     case EXPR_NULL:
4515     case EXPR_SUBSTRING:
4516       break;
4517
4518     case EXPR_OP:
4519       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
4520       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
4521       break;
4522
4523     case EXPR_FUNCTION:
4524       for (actual = expr->value.function.actual; actual; actual = actual->next)
4525         gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
4526
4527       if (expr->value.function.esym == NULL
4528             && expr->value.function.isym != NULL
4529             && expr->value.function.actual
4530             && expr->value.function.actual->expr
4531             && expr->value.function.actual->expr->symtree
4532             && gfc_map_intrinsic_function (expr, mapping))
4533         break;
4534
4535       for (sym = mapping->syms; sym; sym = sym->next)
4536         if (sym->old == expr->value.function.esym)
4537           {
4538             expr->value.function.esym = sym->new_sym->n.sym;
4539             gfc_map_fcn_formal_to_actual (expr, sym->expr, mapping);
4540             expr->value.function.esym->result = sym->new_sym->n.sym;
4541           }
4542       break;
4543
4544     case EXPR_ARRAY:
4545     case EXPR_STRUCTURE:
4546       gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
4547       break;
4548
4549     case EXPR_COMPCALL:
4550     case EXPR_PPC:
4551     case EXPR_UNKNOWN:
4552       gcc_unreachable ();
4553       break;
4554     }
4555
4556   return;
4557 }
4558
4559
4560 /* Evaluate interface expression EXPR using MAPPING.  Store the result
4561    in SE.  */
4562
4563 void
4564 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
4565                              gfc_se * se, gfc_expr * expr)
4566 {
4567   expr = gfc_copy_expr (expr);
4568   gfc_apply_interface_mapping_to_expr (mapping, expr);
4569   gfc_conv_expr (se, expr);
4570   se->expr = gfc_evaluate_now (se->expr, &se->pre);
4571   gfc_free_expr (expr);
4572 }
4573
4574
4575 /* Returns a reference to a temporary array into which a component of
4576    an actual argument derived type array is copied and then returned
4577    after the function call.  */
4578 void
4579 gfc_conv_subref_array_arg (gfc_se *se, gfc_expr * expr, int g77,
4580                            sym_intent intent, bool formal_ptr,
4581                            const gfc_symbol *fsym, const char *proc_name,
4582                            gfc_symbol *sym, bool check_contiguous)
4583 {
4584   gfc_se lse;
4585   gfc_se rse;
4586   gfc_ss *lss;
4587   gfc_ss *rss;
4588   gfc_loopinfo loop;
4589   gfc_loopinfo loop2;
4590   gfc_array_info *info;
4591   tree offset;
4592   tree tmp_index;
4593   tree tmp;
4594   tree base_type;
4595   tree size;
4596   stmtblock_t body;
4597   int n;
4598   int dimen;
4599   gfc_se work_se;
4600   gfc_se *parmse;
4601   bool pass_optional;
4602
4603   pass_optional = fsym && fsym->attr.optional && sym && sym->attr.optional;
4604
4605   if (pass_optional || check_contiguous)
4606     {
4607       gfc_init_se (&work_se, NULL);
4608       parmse = &work_se;
4609     }
4610   else
4611     parmse = se;
4612
4613   if (gfc_option.rtcheck & GFC_RTCHECK_ARRAY_TEMPS)
4614     {
4615       /* We will create a temporary array, so let us warn.  */
4616       char * msg;
4617
4618       if (fsym && proc_name)
4619         msg = xasprintf ("An array temporary was created for argument "
4620                              "'%s' of procedure '%s'", fsym->name, proc_name);
4621       else
4622         msg = xasprintf ("An array temporary was created");
4623
4624       tmp = build_int_cst (logical_type_node, 1);
4625       gfc_trans_runtime_check (false, true, tmp, &parmse->pre,
4626                                &expr->where, msg);
4627       free (msg);
4628     }
4629
4630   gfc_init_se (&lse, NULL);
4631   gfc_init_se (&rse, NULL);
4632
4633   /* Walk the argument expression.  */
4634   rss = gfc_walk_expr (expr);
4635
4636   gcc_assert (rss != gfc_ss_terminator);
4637
4638   /* Initialize the scalarizer.  */
4639   gfc_init_loopinfo (&loop);
4640   gfc_add_ss_to_loop (&loop, rss);
4641
4642   /* Calculate the bounds of the scalarization.  */
4643   gfc_conv_ss_startstride (&loop);
4644
4645   /* Build an ss for the temporary.  */
4646   if (expr->ts.type == BT_CHARACTER && !expr->ts.u.cl->backend_decl)
4647     gfc_conv_string_length (expr->ts.u.cl, expr, &parmse->pre);
4648
4649   base_type = gfc_typenode_for_spec (&expr->ts);
4650   if (GFC_ARRAY_TYPE_P (base_type)
4651                 || GFC_DESCRIPTOR_TYPE_P (base_type))
4652     base_type = gfc_get_element_type (base_type);
4653
4654   if (expr->ts.type == BT_CLASS)
4655     base_type = gfc_typenode_for_spec (&CLASS_DATA (expr)->ts);
4656
4657   loop.temp_ss = gfc_get_temp_ss (base_type, ((expr->ts.type == BT_CHARACTER)
4658                                               ? expr->ts.u.cl->backend_decl
4659                                               : NULL),
4660                                   loop.dimen);
4661
4662   parmse->string_length = loop.temp_ss->info->string_length;
4663
4664   /* Associate the SS with the loop.  */
4665   gfc_add_ss_to_loop (&loop, loop.temp_ss);
4666
4667   /* Setup the scalarizing loops.  */
4668   gfc_conv_loop_setup (&loop, &expr->where);
4669
4670   /* Pass the temporary descriptor back to the caller.  */
4671   info = &loop.temp_ss->info->data.array;
4672   parmse->expr = info->descriptor;
4673
4674   /* Setup the gfc_se structures.  */
4675   gfc_copy_loopinfo_to_se (&lse, &loop);
4676   gfc_copy_loopinfo_to_se (&rse, &loop);
4677
4678   rse.ss = rss;
4679   lse.ss = loop.temp_ss;
4680   gfc_mark_ss_chain_used (rss, 1);
4681   gfc_mark_ss_chain_used (loop.temp_ss, 1);
4682
4683   /* Start the scalarized loop body.  */
4684   gfc_start_scalarized_body (&loop, &body);
4685
4686   /* Translate the expression.  */
4687   gfc_conv_expr (&rse, expr);
4688
4689   /* Reset the offset for the function call since the loop
4690      is zero based on the data pointer.  Note that the temp
4691      comes first in the loop chain since it is added second.  */
4692   if (gfc_is_class_array_function (expr))
4693     {
4694       tmp = loop.ss->loop_chain->info->data.array.descriptor;
4695       gfc_conv_descriptor_offset_set (&loop.pre, tmp,
4696                                       gfc_index_zero_node);
4697     }
4698
4699   gfc_conv_tmp_array_ref (&lse);
4700
4701   if (intent != INTENT_OUT)
4702     {
4703       tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
4704       gfc_add_expr_to_block (&body, tmp);
4705       gcc_assert (rse.ss == gfc_ss_terminator);
4706       gfc_trans_scalarizing_loops (&loop, &body);
4707     }
4708   else
4709     {
4710       /* Make sure that the temporary declaration survives by merging
4711        all the loop declarations into the current context.  */
4712       for (n = 0; n < loop.dimen; n++)
4713         {
4714           gfc_merge_block_scope (&body);
4715           body = loop.code[loop.order[n]];
4716         }
4717       gfc_merge_block_scope (&body);
4718     }
4719
4720   /* Add the post block after the second loop, so that any
4721      freeing of allocated memory is done at the right time.  */
4722   gfc_add_block_to_block (&parmse->pre, &loop.pre);
4723
4724   /**********Copy the temporary back again.*********/
4725
4726   gfc_init_se (&lse, NULL);
4727   gfc_init_se (&rse, NULL);
4728
4729   /* Walk the argument expression.  */
4730   lss = gfc_walk_expr (expr);
4731   rse.ss = loop.temp_ss;
4732   lse.ss = lss;
4733
4734   /* Initialize the scalarizer.  */
4735   gfc_init_loopinfo (&loop2);
4736   gfc_add_ss_to_loop (&loop2, lss);
4737
4738   dimen = rse.ss->dimen;
4739
4740   /* Skip the write-out loop for this case.  */
4741   if (gfc_is_class_array_function (expr))
4742     goto class_array_fcn;
4743
4744   /* Calculate the bounds of the scalarization.  */
4745   gfc_conv_ss_startstride (&loop2);
4746
4747   /* Setup the scalarizing loops.  */
4748   gfc_conv_loop_setup (&loop2, &expr->where);
4749
4750   gfc_copy_loopinfo_to_se (&lse, &loop2);
4751   gfc_copy_loopinfo_to_se (&rse, &loop2);
4752
4753   gfc_mark_ss_chain_used (lss, 1);
4754   gfc_mark_ss_chain_used (loop.temp_ss, 1);
4755
4756   /* Declare the variable to hold the temporary offset and start the
4757      scalarized loop body.  */
4758   offset = gfc_create_var (gfc_array_index_type, NULL);
4759   gfc_start_scalarized_body (&loop2, &body);
4760
4761   /* Build the offsets for the temporary from the loop variables.  The
4762      temporary array has lbounds of zero and strides of one in all
4763      dimensions, so this is very simple.  The offset is only computed
4764      outside the innermost loop, so the overall transfer could be
4765      optimized further.  */
4766   info = &rse.ss->info->data.array;
4767
4768   tmp_index = gfc_index_zero_node;
4769   for (n = dimen - 1; n > 0; n--)
4770     {
4771       tree tmp_str;
4772       tmp = rse.loop->loopvar[n];
4773       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
4774                              tmp, rse.loop->from[n]);
4775       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
4776                              tmp, tmp_index);
4777
4778       tmp_str = fold_build2_loc (input_location, MINUS_EXPR,
4779                                  gfc_array_index_type,
4780                                  rse.loop->to[n-1], rse.loop->from[n-1]);
4781       tmp_str = fold_build2_loc (input_location, PLUS_EXPR,
4782                                  gfc_array_index_type,
4783                                  tmp_str, gfc_index_one_node);
4784
4785       tmp_index = fold_build2_loc (input_location, MULT_EXPR,
4786                                    gfc_array_index_type, tmp, tmp_str);
4787     }
4788
4789   tmp_index = fold_build2_loc (input_location, MINUS_EXPR,
4790                                gfc_array_index_type,
4791                                tmp_index, rse.loop->from[0]);
4792   gfc_add_modify (&rse.loop->code[0], offset, tmp_index);
4793
4794   tmp_index = fold_build2_loc (input_location, PLUS_EXPR,
4795                                gfc_array_index_type,
4796                                rse.loop->loopvar[0], offset);
4797
4798   /* Now use the offset for the reference.  */
4799   tmp = build_fold_indirect_ref_loc (input_location,
4800                                  info->data);
4801   rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
4802
4803   if (expr->ts.type == BT_CHARACTER)
4804     rse.string_length = expr->ts.u.cl->backend_decl;
4805
4806   gfc_conv_expr (&lse, expr);
4807
4808   gcc_assert (lse.ss == gfc_ss_terminator);
4809
4810   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, true);
4811   gfc_add_expr_to_block (&body, tmp);
4812
4813   /* Generate the copying loops.  */
4814   gfc_trans_scalarizing_loops (&loop2, &body);
4815
4816   /* Wrap the whole thing up by adding the second loop to the post-block
4817      and following it by the post-block of the first loop.  In this way,
4818      if the temporary needs freeing, it is done after use!  */
4819   if (intent != INTENT_IN)
4820     {
4821       gfc_add_block_to_block (&parmse->post, &loop2.pre);
4822       gfc_add_block_to_block (&parmse->post, &loop2.post);
4823     }
4824
4825 class_array_fcn:
4826
4827   gfc_add_block_to_block (&parmse->post, &loop.post);
4828
4829   gfc_cleanup_loop (&loop);
4830   gfc_cleanup_loop (&loop2);
4831
4832   /* Pass the string length to the argument expression.  */
4833   if (expr->ts.type == BT_CHARACTER)
4834     parmse->string_length = expr->ts.u.cl->backend_decl;
4835
4836   /* Determine the offset for pointer formal arguments and set the
4837      lbounds to one.  */
4838   if (formal_ptr)
4839     {
4840       size = gfc_index_one_node;
4841       offset = gfc_index_zero_node;
4842       for (n = 0; n < dimen; n++)
4843         {
4844           tmp = gfc_conv_descriptor_ubound_get (parmse->expr,
4845                                                 gfc_rank_cst[n]);
4846           tmp = fold_build2_loc (input_location, PLUS_EXPR,
4847                                  gfc_array_index_type, tmp,
4848                                  gfc_index_one_node);
4849           gfc_conv_descriptor_ubound_set (&parmse->pre,
4850                                           parmse->expr,
4851                                           gfc_rank_cst[n],
4852                                           tmp);
4853           gfc_conv_descriptor_lbound_set (&parmse->pre,
4854                                           parmse->expr,
4855                                           gfc_rank_cst[n],
4856                                           gfc_index_one_node);
4857           size = gfc_evaluate_now (size, &parmse->pre);
4858           offset = fold_build2_loc (input_location, MINUS_EXPR,
4859                                     gfc_array_index_type,
4860                                     offset, size);
4861           offset = gfc_evaluate_now (offset, &parmse->pre);
4862           tmp = fold_build2_loc (input_location, MINUS_EXPR,
4863                                  gfc_array_index_type,
4864                                  rse.loop->to[n], rse.loop->from[n]);
4865           tmp = fold_build2_loc (input_location, PLUS_EXPR,
4866                                  gfc_array_index_type,
4867                                  tmp, gfc_index_one_node);
4868           size = fold_build2_loc (input_location, MULT_EXPR,
4869                                   gfc_array_index_type, size, tmp);
4870         }
4871
4872       gfc_conv_descriptor_offset_set (&parmse->pre, parmse->expr,
4873                                       offset);
4874     }
4875
4876   /* We want either the address for the data or the address of the descriptor,
4877      depending on the mode of passing array arguments.  */
4878   if (g77)
4879     parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
4880   else
4881     parmse->expr = gfc_build_addr_expr (NULL_TREE, parmse->expr);
4882
4883   /* Basically make this into
4884      
4885      if (present)
4886        {
4887          if (contiguous)
4888            {
4889              pointer = a;
4890            }
4891          else
4892            {
4893              parmse->pre();
4894              pointer = parmse->expr;
4895            }
4896        }
4897      else
4898        pointer = NULL;
4899
4900      foo (pointer);
4901      if (present && !contiguous)
4902            se->post();
4903
4904      */
4905
4906   if (pass_optional || check_contiguous)
4907     {
4908       tree type;
4909       stmtblock_t else_block;
4910       tree pre_stmts, post_stmts;
4911       tree pointer;
4912       tree else_stmt;
4913       tree present_var = NULL_TREE;
4914       tree cont_var = NULL_TREE;
4915       tree post_cond;
4916
4917       type = TREE_TYPE (parmse->expr);
4918       pointer = gfc_create_var (type, "arg_ptr");
4919
4920       if (check_contiguous)
4921         {
4922           gfc_se cont_se, array_se;
4923           stmtblock_t if_block, else_block;
4924           tree if_stmt, else_stmt;
4925
4926           cont_var = gfc_create_var (boolean_type_node, "contiguous");
4927
4928           /* cont_var = is_contiguous (expr); .  */
4929           gfc_init_se (&cont_se, parmse);
4930           gfc_conv_is_contiguous_expr (&cont_se, expr);
4931           gfc_add_block_to_block (&se->pre, &(&cont_se)->pre);
4932           gfc_add_modify (&se->pre, cont_var, cont_se.expr);
4933           gfc_add_block_to_block (&se->pre, &(&cont_se)->post);
4934
4935           /* arrayse->expr = descriptor of a.  */
4936           gfc_init_se (&array_se, se);
4937           gfc_conv_expr_descriptor (&array_se, expr);
4938           gfc_add_block_to_block (&se->pre, &(&array_se)->pre);
4939           gfc_add_block_to_block (&se->pre, &(&array_se)->post);
4940
4941           /* if_stmt = { pointer = &a[0]; } .  */
4942           gfc_init_block (&if_block);
4943           tmp = gfc_conv_array_data (array_se.expr);
4944           tmp = fold_convert (type, tmp);
4945           gfc_add_modify (&if_block, pointer, tmp);
4946           if_stmt = gfc_finish_block (&if_block);
4947
4948           /* else_stmt = { parmse->pre(); pointer = parmse->expr; } .  */
4949           gfc_init_block (&else_block);
4950           gfc_add_block_to_block (&else_block, &parmse->pre);
4951           gfc_add_modify (&else_block, pointer, parmse->expr);
4952           else_stmt = gfc_finish_block (&else_block);
4953
4954           /* And put the above into an if statement.  */
4955           pre_stmts = fold_build3_loc (input_location, COND_EXPR, void_type_node,
4956                                       cont_var, if_stmt, else_stmt);
4957         }
4958       else
4959         {
4960           /* pointer = pramse->expr;  .  */
4961           gfc_add_modify (&parmse->pre, pointer, parmse->expr);
4962           pre_stmts = gfc_finish_block (&parmse->pre);
4963         }
4964
4965       if (pass_optional)
4966         {
4967           present_var = gfc_create_var (boolean_type_node, "present");
4968
4969           /* present_var = present(sym); .  */
4970           tmp = gfc_conv_expr_present (sym);
4971           tmp = fold_convert (boolean_type_node, tmp);
4972           gfc_add_modify (&se->pre, present_var, tmp);
4973
4974           /* else_stmt = { pointer = NULL; } .  */
4975           gfc_init_block (&else_block);
4976           gfc_add_modify (&else_block, pointer, build_int_cst (type, 0));
4977           else_stmt = gfc_finish_block (&else_block);
4978
4979           tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, present_var,
4980                                  pre_stmts, else_stmt);
4981           gfc_add_expr_to_block (&se->pre, tmp);
4982
4983
4984         }
4985       else
4986         gfc_add_expr_to_block (&se->pre, pre_stmts);
4987
4988       post_stmts = gfc_finish_block (&parmse->post);
4989
4990       /* Put together the post stuff, plus the optional
4991          deallocation.  */
4992       if (check_contiguous)
4993         {
4994           /* !cont_var.  */
4995           tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
4996                                  cont_var,
4997                                  build_zero_cst (boolean_type_node));
4998           if (pass_optional)
4999             post_cond = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
5000                                          boolean_type_node, present_var, tmp);
5001           else
5002             post_cond = tmp;
5003         }
5004       else
5005         {
5006           gcc_assert (pass_optional);
5007           post_cond = present_var;
5008         }
5009
5010       tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, post_cond,
5011                              post_stmts, build_empty_stmt (input_location));
5012       gfc_add_expr_to_block (&se->post, tmp);
5013       se->expr = pointer;
5014     }
5015
5016   return;
5017 }
5018
5019
5020 /* Generate the code for argument list functions.  */
5021
5022 static void
5023 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
5024 {
5025   /* Pass by value for g77 %VAL(arg), pass the address
5026      indirectly for %LOC, else by reference.  Thus %REF
5027      is a "do-nothing" and %LOC is the same as an F95
5028      pointer.  */
5029   if (strcmp (name, "%VAL") == 0)
5030     gfc_conv_expr (se, expr);
5031   else if (strcmp (name, "%LOC") == 0)
5032     {
5033       gfc_conv_expr_reference (se, expr);
5034       se->expr = gfc_build_addr_expr (NULL, se->expr);
5035     }
5036   else if (strcmp (name, "%REF") == 0)
5037     gfc_conv_expr_reference (se, expr);
5038   else
5039     gfc_error ("Unknown argument list function at %L", &expr->where);
5040 }
5041
5042
5043 /* This function tells whether the middle-end representation of the expression
5044    E given as input may point to data otherwise accessible through a variable
5045    (sub-)reference.
5046    It is assumed that the only expressions that may alias are variables,
5047    and array constructors if ARRAY_MAY_ALIAS is true and some of its elements
5048    may alias.
5049    This function is used to decide whether freeing an expression's allocatable
5050    components is safe or should be avoided.
5051
5052    If ARRAY_MAY_ALIAS is true, an array constructor may alias if some of
5053    its elements are copied from a variable.  This ARRAY_MAY_ALIAS trick
5054    is necessary because for array constructors, aliasing depends on how
5055    the array is used:
5056     - If E is an array constructor used as argument to an elemental procedure,
5057       the array, which is generated through shallow copy by the scalarizer,
5058       is used directly and can alias the expressions it was copied from.
5059     - If E is an array constructor used as argument to a non-elemental
5060       procedure,the scalarizer is used in gfc_conv_expr_descriptor to generate
5061       the array as in the previous case, but then that array is used
5062       to initialize a new descriptor through deep copy.  There is no alias
5063       possible in that case.
5064    Thus, the ARRAY_MAY_ALIAS flag is necessary to distinguish the two cases
5065    above.  */
5066
5067 static bool
5068 expr_may_alias_variables (gfc_expr *e, bool array_may_alias)
5069 {
5070   gfc_constructor *c;
5071
5072   if (e->expr_type == EXPR_VARIABLE)
5073     return true;
5074   else if (e->expr_type == EXPR_FUNCTION)
5075     {
5076       gfc_symbol *proc_ifc = gfc_get_proc_ifc_for_expr (e);
5077
5078       if (proc_ifc->result != NULL
5079           && ((proc_ifc->result->ts.type == BT_CLASS
5080                && proc_ifc->result->ts.u.derived->attr.is_class
5081                && CLASS_DATA (proc_ifc->result)->attr.class_pointer)
5082               || proc_ifc->result->attr.pointer))
5083         return true;
5084       else
5085         return false;
5086     }
5087   else if (e->expr_type != EXPR_ARRAY || !array_may_alias)
5088     return false;
5089
5090   for (c = gfc_constructor_first (e->value.constructor);
5091        c; c = gfc_constructor_next (c))
5092     if (c->expr
5093         && expr_may_alias_variables (c->expr, array_may_alias))
5094       return true;
5095
5096   return false;
5097 }
5098
5099
5100 /* A helper function to set the dtype for unallocated or unassociated
5101    entities.  */
5102
5103 static void
5104 set_dtype_for_unallocated (gfc_se *parmse, gfc_expr *e)
5105 {
5106   tree tmp;
5107   tree desc;
5108   tree cond;
5109   tree type;
5110   stmtblock_t block;
5111
5112   /* TODO Figure out how to handle optional dummies.  */
5113   if (e && e->expr_type == EXPR_VARIABLE
5114       && e->symtree->n.sym->attr.optional)
5115     return;
5116
5117   desc = parmse->expr;
5118   if (desc == NULL_TREE)
5119     return;
5120
5121   if (POINTER_TYPE_P (TREE_TYPE (desc)))
5122     desc = build_fold_indirect_ref_loc (input_location, desc);
5123
5124   if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)))
5125     return;
5126
5127   gfc_init_block (&block);
5128   tmp = gfc_conv_descriptor_data_get (desc);
5129   cond = fold_build2_loc (input_location, EQ_EXPR,
5130                           logical_type_node, tmp,
5131                           build_int_cst (TREE_TYPE (tmp), 0));
5132   tmp = gfc_conv_descriptor_dtype (desc);
5133   type = gfc_get_element_type (TREE_TYPE (desc));
5134   tmp = fold_build2_loc (input_location, MODIFY_EXPR,
5135                          TREE_TYPE (tmp), tmp,
5136                          gfc_get_dtype_rank_type (e->rank, type));
5137   gfc_add_expr_to_block (&block, tmp);
5138   cond = build3_v (COND_EXPR, cond,
5139                    gfc_finish_block (&block),
5140                    build_empty_stmt (input_location));
5141   gfc_add_expr_to_block (&parmse->pre, cond);
5142 }
5143
5144
5145
5146 /* Provide an interface between gfortran array descriptors and the F2018:18.4
5147    ISO_Fortran_binding array descriptors. */
5148
5149 static void
5150 gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym)
5151 {
5152   tree tmp;
5153   tree cfi_desc_ptr;
5154   tree gfc_desc_ptr;
5155   tree type;
5156   tree cond;
5157   int attribute;
5158   symbol_attribute attr = gfc_expr_attr (e);
5159   stmtblock_t block;
5160
5161   /* If this is a full array or a scalar, the allocatable and pointer
5162      attributes can be passed. Otherwise it is 'CFI_attribute_other'*/
5163   attribute = 2;
5164   if (!e->rank || gfc_get_full_arrayspec_from_expr (e))
5165     {
5166       if (fsym->attr.pointer)
5167         attribute = 0;
5168       else if (fsym->attr.allocatable)
5169         attribute = 1;
5170     }
5171
5172   if (e->rank != 0)
5173     {
5174       parmse->force_no_tmp = 1;
5175       if (fsym->attr.contiguous
5176           && !gfc_is_simply_contiguous (e, false, true))
5177         gfc_conv_subref_array_arg (parmse, e, false, fsym->attr.intent,
5178                                    fsym->attr.pointer);
5179       else
5180         gfc_conv_expr_descriptor (parmse, e);
5181
5182       if (POINTER_TYPE_P (TREE_TYPE (parmse->expr)))
5183         parmse->expr = build_fold_indirect_ref_loc (input_location,
5184                                                     parmse->expr);
5185
5186       /* Unallocated allocatable arrays and unassociated pointer arrays
5187          need their dtype setting if they are argument associated with
5188          assumed rank dummies.  */
5189       if (fsym && fsym->as
5190           && (gfc_expr_attr (e).pointer
5191               || gfc_expr_attr (e).allocatable))
5192         set_dtype_for_unallocated (parmse, e);
5193
5194       /* All the temporary descriptors are marked as DECL_ARTIFICIAL. If
5195          the expression type is different from the descriptor type, then
5196          the offset must be found (eg. to a component ref or substring)
5197          and the dtype updated.  Assumed type entities are only allowed
5198          to be dummies in Fortran. They therefore lack the decl specific
5199          appendiges and so must be treated differently from other fortran
5200          entities passed to CFI descriptors in the interface decl.  */
5201       type = e->ts.type != BT_ASSUMED ? gfc_typenode_for_spec (&e->ts) :
5202                                         NULL_TREE;
5203
5204       if (type && DECL_ARTIFICIAL (parmse->expr)
5205           && type != gfc_get_element_type (TREE_TYPE (parmse->expr)))
5206         {
5207           /* Obtain the offset to the data.  */
5208           gfc_get_dataptr_offset (&parmse->pre, parmse->expr, parmse->expr,
5209                                   gfc_index_zero_node, true, e);
5210
5211           /* Update the dtype.  */
5212           gfc_add_modify (&parmse->pre,
5213                           gfc_conv_descriptor_dtype (parmse->expr),
5214                           gfc_get_dtype_rank_type (e->rank, type));
5215         }
5216       else if (type == NULL_TREE
5217                || (!is_subref_array (e) && !DECL_ARTIFICIAL (parmse->expr)))
5218         {
5219           /* Make sure that the span is set for expressions where it
5220              might not have been done already.  */
5221           tmp = gfc_conv_descriptor_elem_len (parmse->expr);
5222           tmp = fold_convert (gfc_array_index_type, tmp);
5223           gfc_conv_descriptor_span_set (&parmse->pre, parmse->expr, tmp);
5224         }
5225     }
5226   else
5227     {
5228       gfc_conv_expr (parmse, e);
5229
5230       if (POINTER_TYPE_P (TREE_TYPE (parmse->expr)))
5231         parmse->expr = build_fold_indirect_ref_loc (input_location,
5232                                                     parmse->expr);
5233
5234       parmse->expr = gfc_conv_scalar_to_descriptor (parmse,
5235                                                     parmse->expr, attr);
5236     }
5237
5238   /* Set the CFI attribute field.  */
5239   tmp = gfc_conv_descriptor_attribute (parmse->expr);
5240   tmp = fold_build2_loc (input_location, MODIFY_EXPR,
5241                          void_type_node, tmp,
5242                          build_int_cst (TREE_TYPE (tmp), attribute));
5243   gfc_add_expr_to_block (&parmse->pre, tmp);
5244
5245   /* Now pass the gfc_descriptor by reference.  */
5246   parmse->expr = gfc_build_addr_expr (NULL_TREE, parmse->expr);
5247
5248   /* Variables to point to the gfc and CFI descriptors.  */
5249   gfc_desc_ptr = parmse->expr;
5250   cfi_desc_ptr = gfc_create_var (pvoid_type_node, "cfi");
5251   gfc_add_modify (&parmse->pre, cfi_desc_ptr,
5252                   build_int_cst (pvoid_type_node, 0));
5253
5254   /* Allocate the CFI descriptor and fill the fields.  */
5255   tmp = gfc_build_addr_expr (NULL_TREE, cfi_desc_ptr);
5256   tmp = build_call_expr_loc (input_location,
5257                              gfor_fndecl_gfc_to_cfi, 2, tmp, gfc_desc_ptr);
5258   gfc_add_expr_to_block (&parmse->pre, tmp);
5259
5260   /* The CFI descriptor is passed to the bind_C procedure.  */
5261   parmse->expr = cfi_desc_ptr;
5262
5263   /* Free the CFI descriptor.  */
5264   gfc_init_block (&block);
5265   cond = fold_build2_loc (input_location, NE_EXPR,
5266                           logical_type_node, cfi_desc_ptr,
5267                           build_int_cst (TREE_TYPE (cfi_desc_ptr), 0));
5268   tmp = gfc_call_free (cfi_desc_ptr);
5269   gfc_add_expr_to_block (&block, tmp);
5270   tmp = build3_v (COND_EXPR, cond,
5271                   gfc_finish_block (&block),
5272                   build_empty_stmt (input_location));
5273   gfc_prepend_expr_to_block (&parmse->post, tmp);
5274
5275   /* Transfer values back to gfc descriptor.  */
5276   tmp = gfc_build_addr_expr (NULL_TREE, parmse->expr);
5277   tmp = build_call_expr_loc (input_location,
5278                              gfor_fndecl_cfi_to_gfc, 2, gfc_desc_ptr, tmp);
5279   gfc_prepend_expr_to_block (&parmse->post, tmp);
5280 }
5281
5282
5283 /* Generate code for a procedure call.  Note can return se->post != NULL.
5284    If se->direct_byref is set then se->expr contains the return parameter.
5285    Return nonzero, if the call has alternate specifiers.
5286    'expr' is only needed for procedure pointer components.  */
5287
5288 int
5289 gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
5290                          gfc_actual_arglist * args, gfc_expr * expr,
5291                          vec<tree, va_gc> *append_args)
5292 {
5293   gfc_interface_mapping mapping;
5294   vec<tree, va_gc> *arglist;
5295   vec<tree, va_gc> *retargs;
5296   tree tmp;
5297   tree fntype;
5298   gfc_se parmse;
5299   gfc_array_info *info;
5300   int byref;
5301   int parm_kind;
5302   tree type;
5303   tree var;
5304   tree len;
5305   tree base_object;
5306   vec<tree, va_gc> *stringargs;
5307   vec<tree, va_gc> *optionalargs;
5308   tree result = NULL;
5309   gfc_formal_arglist *formal;
5310   gfc_actual_arglist *arg;
5311   int has_alternate_specifier = 0;
5312   bool need_interface_mapping;
5313   bool callee_alloc;
5314   bool ulim_copy;
5315   gfc_typespec ts;
5316   gfc_charlen cl;
5317   gfc_expr *e;
5318   gfc_symbol *fsym;
5319   stmtblock_t post;
5320   enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
5321   gfc_component *comp = NULL;
5322   int arglen;
5323   unsigned int argc;
5324
5325   arglist = NULL;
5326   retargs = NULL;
5327   stringargs = NULL;
5328   optionalargs = NULL;
5329   var = NULL_TREE;
5330   len = NULL_TREE;
5331   gfc_clear_ts (&ts);
5332
5333   comp = gfc_get_proc_ptr_comp (expr);
5334
5335   bool elemental_proc = (comp
5336                          && comp->ts.interface
5337                          && comp->ts.interface->attr.elemental)
5338                         || (comp && comp->attr.elemental)
5339                         || sym->attr.elemental;
5340
5341   if (se->ss != NULL)
5342     {
5343       if (!elemental_proc)
5344         {
5345           gcc_assert (se->ss->info->type == GFC_SS_FUNCTION);
5346           if (se->ss->info->useflags)
5347             {
5348               gcc_assert ((!comp && gfc_return_by_reference (sym)
5349                            && sym->result->attr.dimension)
5350                           || (comp && comp->attr.dimension)
5351                           || gfc_is_class_array_function (expr));
5352               gcc_assert (se->loop != NULL);
5353               /* Access the previously obtained result.  */
5354               gfc_conv_tmp_array_ref (se);
5355               return 0;
5356             }
5357         }
5358       info = &se->ss->info->data.array;
5359     }
5360   else
5361     info = NULL;
5362
5363   gfc_init_block (&post);
5364   gfc_init_interface_mapping (&mapping);
5365   if (!comp)
5366     {
5367       formal = gfc_sym_get_dummy_args (sym);
5368       need_interface_mapping = sym->attr.dimension ||
5369                                (sym->ts.type == BT_CHARACTER
5370                                 && sym->ts.u.cl->length
5371                                 && sym->ts.u.cl->length->expr_type
5372                                    != EXPR_CONSTANT);
5373     }
5374   else
5375     {
5376       formal = comp->ts.interface ? comp->ts.interface->formal : NULL;
5377       need_interface_mapping = comp->attr.dimension ||
5378                                (comp->ts.type == BT_CHARACTER
5379                                 && comp->ts.u.cl->length
5380                                 && comp->ts.u.cl->length->expr_type
5381                                    != EXPR_CONSTANT);
5382     }
5383
5384   base_object = NULL_TREE;
5385   /* For _vprt->_copy () routines no formal symbol is present.  Nevertheless
5386      is the third and fourth argument to such a function call a value
5387      denoting the number of elements to copy (i.e., most of the time the
5388      length of a deferred length string).  */
5389   ulim_copy = (formal == NULL)
5390                && UNLIMITED_POLY (sym)
5391                && comp && (strcmp ("_copy", comp->name) == 0);
5392
5393   /* Evaluate the arguments.  */
5394   for (arg = args, argc = 0; arg != NULL;
5395        arg = arg->next, formal = formal ? formal->next : NULL, ++argc)
5396     {
5397       bool finalized = false;
5398       bool non_unity_length_string = false;
5399
5400       e = arg->expr;
5401       fsym = formal ? formal->sym : NULL;
5402       parm_kind = MISSING;
5403
5404       if (fsym && fsym->ts.type == BT_CHARACTER && fsym->ts.u.cl
5405           && (!fsym->ts.u.cl->length
5406               || fsym->ts.u.cl->length->expr_type != EXPR_CONSTANT
5407               || mpz_cmp_si (fsym->ts.u.cl->length->value.integer, 1) != 0))
5408         non_unity_length_string = true;
5409
5410       /* If the procedure requires an explicit interface, the actual
5411          argument is passed according to the corresponding formal
5412          argument.  If the corresponding formal argument is a POINTER,
5413          ALLOCATABLE or assumed shape, we do not use g77's calling
5414          convention, and pass the address of the array descriptor
5415          instead.  Otherwise we use g77's calling convention, in other words
5416          pass the array data pointer without descriptor.  */
5417       bool nodesc_arg = fsym != NULL
5418                         && !(fsym->attr.pointer || fsym->attr.allocatable)
5419                         && fsym->as
5420                         && fsym->as->type != AS_ASSUMED_SHAPE
5421                         && fsym->as->type != AS_ASSUMED_RANK;
5422       if (comp)
5423         nodesc_arg = nodesc_arg || !comp->attr.always_explicit;
5424       else
5425         nodesc_arg = nodesc_arg || !sym->attr.always_explicit;
5426
5427       /* Class array expressions are sometimes coming completely unadorned
5428          with either arrayspec or _data component.  Correct that here.
5429          OOP-TODO: Move this to the frontend.  */
5430       if (e && e->expr_type == EXPR_VARIABLE
5431             && !e->ref
5432             && e->ts.type == BT_CLASS
5433             && (CLASS_DATA (e)->attr.codimension
5434                 || CLASS_DATA (e)->attr.dimension))
5435         {
5436           gfc_typespec temp_ts = e->ts;
5437           gfc_add_class_array_ref (e);
5438           e->ts = temp_ts;
5439         }
5440
5441       if (e == NULL)
5442         {
5443           if (se->ignore_optional)
5444             {
5445               /* Some intrinsics have already been resolved to the correct
5446                  parameters.  */
5447               continue;
5448             }
5449           else if (arg->label)
5450             {
5451               has_alternate_specifier = 1;
5452               continue;
5453             }
5454           else
5455             {
5456               gfc_init_se (&parmse, NULL);
5457
5458               /* For scalar arguments with VALUE attribute which are passed by
5459                  value, pass "0" and a hidden argument gives the optional
5460                  status.  */
5461               if (fsym && fsym->attr.optional && fsym->attr.value
5462                   && !fsym->attr.dimension && fsym->ts.type != BT_CHARACTER
5463                   && fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED)
5464                 {
5465                   parmse.expr = fold_convert (gfc_sym_type (fsym),
5466                                               integer_zero_node);
5467                   vec_safe_push (optionalargs, boolean_false_node);
5468                 }
5469               else
5470                 {
5471                   /* Pass a NULL pointer for an absent arg.  */
5472                   parmse.expr = null_pointer_node;
5473                   if (arg->missing_arg_type == BT_CHARACTER)
5474                     parmse.string_length = build_int_cst (gfc_charlen_type_node,
5475                                                           0);
5476                 }
5477             }
5478         }
5479       else if (arg->expr->expr_type == EXPR_NULL
5480                && fsym && !fsym->attr.pointer
5481                && (fsym->ts.type != BT_CLASS
5482                    || !CLASS_DATA (fsym)->attr.class_pointer))
5483         {
5484           /* Pass a NULL pointer to denote an absent arg.  */
5485           gcc_assert (fsym->attr.optional && !fsym->attr.allocatable
5486                       && (fsym->ts.type != BT_CLASS
5487                           || !CLASS_DATA (fsym)->attr.allocatable));
5488           gfc_init_se (&parmse, NULL);
5489           parmse.expr = null_pointer_node;
5490           if (arg->missing_arg_type == BT_CHARACTER)
5491             parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
5492         }
5493       else if (fsym && fsym->ts.type == BT_CLASS
5494                  && e->ts.type == BT_DERIVED)
5495         {
5496           /* The derived type needs to be converted to a temporary
5497              CLASS object.  */
5498           gfc_init_se (&parmse, se);
5499           gfc_conv_derived_to_class (&parmse, e, fsym->ts, NULL,
5500                                      fsym->attr.optional
5501                                      && e->expr_type == EXPR_VARIABLE
5502                                      && e->symtree->n.sym->attr.optional,
5503                                      CLASS_DATA (fsym)->attr.class_pointer
5504                                      || CLASS_DATA (fsym)->attr.allocatable);
5505         }
5506       else if (UNLIMITED_POLY (fsym) && e->ts.type != BT_CLASS)
5507         {
5508           /* The intrinsic type needs to be converted to a temporary
5509              CLASS object for the unlimited polymorphic formal.  */
5510           gfc_init_se (&parmse, se);
5511           gfc_conv_intrinsic_to_class (&parmse, e, fsym->ts);
5512         }
5513       else if (se->ss && se->ss->info->useflags)
5514         {
5515           gfc_ss *ss;
5516
5517           ss = se->ss;
5518
5519           /* An elemental function inside a scalarized loop.  */
5520           gfc_init_se (&parmse, se);
5521           parm_kind = ELEMENTAL;
5522
5523           /* When no fsym is present, ulim_copy is set and this is a third or
5524              fourth argument, use call-by-value instead of by reference to
5525              hand the length properties to the copy routine (i.e., most of the
5526              time this will be a call to a __copy_character_* routine where the
5527              third and fourth arguments are the lengths of a deferred length
5528              char array).  */
5529           if ((fsym && fsym->attr.value)
5530               || (ulim_copy && (argc == 2 || argc == 3)))
5531             gfc_conv_expr (&parmse, e);
5532           else
5533             gfc_conv_expr_reference (&parmse, e);
5534
5535           if (e->ts.type == BT_CHARACTER && !e->rank
5536               && e->expr_type == EXPR_FUNCTION)
5537             parmse.expr = build_fold_indirect_ref_loc (input_location,
5538                                                        parmse.expr);
5539
5540           if (fsym && fsym->ts.type == BT_DERIVED
5541               && gfc_is_class_container_ref (e))
5542             {
5543               parmse.expr = gfc_class_data_get (parmse.expr);
5544
5545               if (fsym->attr.optional && e->expr_type == EXPR_VARIABLE
5546                   && e->symtree->n.sym->attr.optional)
5547                 {
5548                   tree cond = gfc_conv_expr_present (e->symtree->n.sym);
5549                   parmse.expr = build3_loc (input_location, COND_EXPR,
5550                                         TREE_TYPE (parmse.expr),
5551                                         cond, parmse.expr,
5552                                         fold_convert (TREE_TYPE (parmse.expr),
5553                                                       null_pointer_node));
5554                 }
5555             }
5556
5557           /* If we are passing an absent array as optional dummy to an
5558              elemental procedure, make sure that we pass NULL when the data
5559              pointer is NULL.  We need this extra conditional because of
5560              scalarization which passes arrays elements to the procedure,
5561              ignoring the fact that the array can be absent/unallocated/...  */
5562           if (ss->info->can_be_null_ref && ss->info->type != GFC_SS_REFERENCE)
5563             {
5564               tree descriptor_data;
5565
5566               descriptor_data = ss->info->data.array.data;
5567               tmp = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
5568                                      descriptor_data,
5569                                      fold_convert (TREE_TYPE (descriptor_data),
5570                                                    null_pointer_node));
5571               parmse.expr
5572                 = fold_build3_loc (input_location, COND_EXPR,
5573                                    TREE_TYPE (parmse.expr),
5574                                    gfc_unlikely (tmp, PRED_FORTRAN_ABSENT_DUMMY),
5575                                    fold_convert (TREE_TYPE (parmse.expr),
5576                                                  null_pointer_node),
5577                                    parmse.expr);
5578             }
5579
5580           /* The scalarizer does not repackage the reference to a class
5581              array - instead it returns a pointer to the data element.  */
5582           if (fsym && fsym->ts.type == BT_CLASS && e->ts.type == BT_CLASS)
5583             gfc_conv_class_to_class (&parmse, e, fsym->ts, true,
5584                                      fsym->attr.intent != INTENT_IN
5585                                      && (CLASS_DATA (fsym)->attr.class_pointer
5586                                          || CLASS_DATA (fsym)->attr.allocatable),
5587                                      fsym->attr.optional
5588                                      && e->expr_type == EXPR_VARIABLE
5589                                      && e->symtree->n.sym->attr.optional,
5590                                      CLASS_DATA (fsym)->attr.class_pointer
5591                                      || CLASS_DATA (fsym)->attr.allocatable);
5592         }
5593       else
5594         {
5595           bool scalar;
5596           gfc_ss *argss;
5597
5598           gfc_init_se (&parmse, NULL);
5599
5600           /* Check whether the expression is a scalar or not; we cannot use
5601              e->rank as it can be nonzero for functions arguments.  */
5602           argss = gfc_walk_expr (e);
5603           scalar = argss == gfc_ss_terminator;
5604           if (!scalar)
5605             gfc_free_ss_chain (argss);
5606
5607           /* Special handling for passing scalar polymorphic coarrays;
5608              otherwise one passes "class->_data.data" instead of "&class".  */
5609           if (e->rank == 0 && e->ts.type == BT_CLASS
5610               && fsym && fsym->ts.type == BT_CLASS
5611               && CLASS_DATA (fsym)->attr.codimension
5612               && !CLASS_DATA (fsym)->attr.dimension)
5613             {
5614               gfc_add_class_array_ref (e);
5615               parmse.want_coarray = 1;
5616               scalar = false;
5617             }
5618
5619           /* A scalar or transformational function.  */
5620           if (scalar)
5621             {
5622               if (e->expr_type == EXPR_VARIABLE
5623                     && e->symtree->n.sym->attr.cray_pointee
5624                     && fsym && fsym->attr.flavor == FL_PROCEDURE)
5625                 {
5626                     /* The Cray pointer needs to be converted to a pointer to
5627                        a type given by the expression.  */
5628                     gfc_conv_expr (&parmse, e);
5629                     type = build_pointer_type (TREE_TYPE (parmse.expr));
5630                     tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer);
5631                     parmse.expr = convert (type, tmp);
5632                 }
5633
5634               else if (sym->attr.is_bind_c && e
5635                        && (is_CFI_desc (fsym, NULL)
5636                            || non_unity_length_string))
5637                 /* Implement F2018, C.12.6.1: paragraph (2).  */
5638                 gfc_conv_gfc_desc_to_cfi_desc (&parmse, e, fsym);
5639
5640               else if (fsym && fsym->attr.value)
5641                 {
5642                   if (fsym->ts.type == BT_CHARACTER
5643                       && fsym->ts.is_c_interop
5644                       && fsym->ns->proc_name != NULL
5645                       && fsym->ns->proc_name->attr.is_bind_c)
5646                     {
5647                       parmse.expr = NULL;
5648                       gfc_conv_scalar_char_value (fsym, &parmse, &e);
5649                       if (parmse.expr == NULL)
5650                         gfc_conv_expr (&parmse, e);
5651                     }
5652                   else
5653                     {
5654                     gfc_conv_expr (&parmse, e);
5655                     if (fsym->attr.optional
5656                         && fsym->ts.type != BT_CLASS
5657                         && fsym->ts.type != BT_DERIVED)
5658                       {
5659                         if (e->expr_type != EXPR_VARIABLE
5660                             || !e->symtree->n.sym->attr.optional
5661                             || e->ref != NULL)
5662                           vec_safe_push (optionalargs, boolean_true_node);
5663                         else
5664                           {
5665                             tmp = gfc_conv_expr_present (e->symtree->n.sym);
5666                             if (!e->symtree->n.sym->attr.value)
5667                               parmse.expr
5668                                 = fold_build3_loc (input_location, COND_EXPR,
5669                                         TREE_TYPE (parmse.expr),
5670                                         tmp, parmse.expr,
5671                                         fold_convert (TREE_TYPE (parmse.expr),
5672                                                       integer_zero_node));
5673
5674                             vec_safe_push (optionalargs, tmp);
5675                           }
5676                       }
5677                     }
5678                 }
5679
5680               else if (arg->name && arg->name[0] == '%')
5681                 /* Argument list functions %VAL, %LOC and %REF are signalled
5682                    through arg->name.  */
5683                 conv_arglist_function (&parmse, arg->expr, arg->name);
5684               else if ((e->expr_type == EXPR_FUNCTION)
5685                         && ((e->value.function.esym
5686                              && e->value.function.esym->result->attr.pointer)
5687                             || (!e->value.function.esym
5688                                 && e->symtree->n.sym->attr.pointer))
5689                         && fsym && fsym->attr.target)
5690                 {
5691                   gfc_conv_expr (&parmse, e);
5692                   parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
5693                 }
5694
5695               else if (e->expr_type == EXPR_FUNCTION
5696                        && e->symtree->n.sym->result
5697                        && e->symtree->n.sym->result != e->symtree->n.sym
5698                        && e->symtree->n.sym->result->attr.proc_pointer)
5699                 {
5700                   /* Functions returning procedure pointers.  */
5701                   gfc_conv_expr (&parmse, e);
5702                   if (fsym && fsym->attr.proc_pointer)
5703                     parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
5704                 }
5705
5706               else
5707                 {
5708                   if (e->ts.type == BT_CLASS && fsym
5709                       && fsym->ts.type == BT_CLASS
5710                       && (!CLASS_DATA (fsym)->as
5711                           || CLASS_DATA (fsym)->as->type != AS_ASSUMED_RANK)
5712                       && CLASS_DATA (e)->attr.codimension)
5713                     {
5714                       gcc_assert (!CLASS_DATA (fsym)->attr.codimension);
5715                       gcc_assert (!CLASS_DATA (fsym)->as);
5716                       gfc_add_class_array_ref (e);
5717                       parmse.want_coarray = 1;
5718                       gfc_conv_expr_reference (&parmse, e);
5719                       class_scalar_coarray_to_class (&parmse, e, fsym->ts,
5720                                      fsym->attr.optional
5721                                      && e->expr_type == EXPR_VARIABLE);
5722                     }
5723                   else if (e->ts.type == BT_CLASS && fsym
5724                            && fsym->ts.type == BT_CLASS
5725                            && !CLASS_DATA (fsym)->as
5726                            && !CLASS_DATA (e)->as
5727                            && strcmp (fsym->ts.u.derived->name,
5728                                       e->ts.u.derived->name))
5729                     {
5730                       type = gfc_typenode_for_spec (&fsym->ts);
5731                       var = gfc_create_var (type, fsym->name);
5732                       gfc_conv_expr (&parmse, e);
5733                       if (fsym->attr.optional
5734                           && e->expr_type == EXPR_VARIABLE
5735                           && e->symtree->n.sym->attr.optional)
5736                         {
5737                           stmtblock_t block;
5738                           tree cond;
5739                           tmp = gfc_build_addr_expr (NULL_TREE, parmse.expr);
5740                           cond = fold_build2_loc (input_location, NE_EXPR,
5741                                                   logical_type_node, tmp,
5742                                                   fold_convert (TREE_TYPE (tmp),
5743                                                             null_pointer_node));
5744                           gfc_start_block (&block);
5745                           gfc_add_modify (&block, var,
5746                                           fold_build1_loc (input_location,
5747                                                            VIEW_CONVERT_EXPR,
5748                                                            type, parmse.expr));
5749                           gfc_add_expr_to_block (&parmse.pre,
5750                                  fold_build3_loc (input_location,
5751                                          COND_EXPR, void_type_node,
5752                                          cond, gfc_finish_block (&block),
5753                                          build_empty_stmt (input_location)));
5754                           parmse.expr = gfc_build_addr_expr (NULL_TREE, var);
5755                           parmse.expr = build3_loc (input_location, COND_EXPR,
5756                                          TREE_TYPE (parmse.expr),
5757                                          cond, parmse.expr,
5758                                          fold_convert (TREE_TYPE (parmse.expr),
5759                                                        null_pointer_node));
5760                         }
5761                       else
5762                         {
5763                           /* Since the internal representation of unlimited
5764                              polymorphic expressions includes an extra field
5765                              that other class objects do not, a cast to the
5766                              formal type does not work.  */
5767                           if (!UNLIMITED_POLY (e) && UNLIMITED_POLY (fsym))
5768                             {
5769                               tree efield;
5770
5771                               /* Set the _data field.  */
5772                               tmp = gfc_class_data_get (var);
5773                               efield = fold_convert (TREE_TYPE (tmp),
5774                                         gfc_class_data_get (parmse.expr));
5775                               gfc_add_modify (&parmse.pre, tmp, efield);
5776
5777                               /* Set the _vptr field.  */
5778                               tmp = gfc_class_vptr_get (var);
5779                               efield = fold_convert (TREE_TYPE (tmp),
5780                                         gfc_class_vptr_get (parmse.expr));
5781                               gfc_add_modify (&parmse.pre, tmp, efield);
5782
5783                               /* Set the _len field.  */
5784                               tmp = gfc_class_len_get (var);
5785                               gfc_add_modify (&parmse.pre, tmp,
5786                                               build_int_cst (TREE_TYPE (tmp), 0));
5787                             }
5788                           else
5789                             {
5790                               tmp = fold_build1_loc (input_location,
5791                                                      VIEW_CONVERT_EXPR,
5792                                                      type, parmse.expr);
5793                               gfc_add_modify (&parmse.pre, var, tmp);
5794                                               ;
5795                             }
5796                           parmse.expr = gfc_build_addr_expr (NULL_TREE, var);
5797                         }
5798                     }
5799                   else
5800                     {
5801                       bool add_clobber;
5802                       add_clobber = fsym && fsym->attr.intent == INTENT_OUT
5803                         && !fsym->attr.allocatable && !fsym->attr.pointer
5804                         && !e->symtree->n.sym->attr.dimension
5805                         && !e->symtree->n.sym->attr.pointer
5806                         /* See PR 41453.  */
5807                         && !e->symtree->n.sym->attr.dummy
5808                         /* FIXME - PR 87395 and PR 41453  */
5809                         && e->symtree->n.sym->attr.save == SAVE_NONE
5810                         && !e->symtree->n.sym->attr.associate_var
5811                         && e->ts.type != BT_CHARACTER && e->ts.type != BT_DERIVED
5812                         && e->ts.type != BT_CLASS && !sym->attr.elemental;
5813
5814                       gfc_conv_expr_reference (&parmse, e, add_clobber);
5815                     }
5816                   /* Catch base objects that are not variables.  */
5817                   if (e->ts.type == BT_CLASS
5818                         && e->expr_type != EXPR_VARIABLE
5819                         && expr && e == expr->base_expr)
5820                     base_object = build_fold_indirect_ref_loc (input_location,
5821                                                                parmse.expr);
5822
5823                   /* A class array element needs converting back to be a
5824                      class object, if the formal argument is a class object.  */
5825                   if (fsym && fsym->ts.type == BT_CLASS
5826                         && e->ts.type == BT_CLASS
5827                         && ((CLASS_DATA (fsym)->as
5828                              && CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)
5829                             || CLASS_DATA (e)->attr.dimension))
5830                     gfc_conv_class_to_class (&parmse, e, fsym->ts, false,
5831                                      fsym->attr.intent != INTENT_IN
5832                                      && (CLASS_DATA (fsym)->attr.class_pointer
5833                                          || CLASS_DATA (fsym)->attr.allocatable),
5834                                      fsym->attr.optional
5835                                      && e->expr_type == EXPR_VARIABLE
5836                                      && e->symtree->n.sym->attr.optional,
5837                                      CLASS_DATA (fsym)->attr.class_pointer
5838                                      || CLASS_DATA (fsym)->attr.allocatable);
5839
5840                   /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
5841                      allocated on entry, it must be deallocated.  */
5842                   if (fsym && fsym->attr.intent == INTENT_OUT
5843                       && (fsym->attr.allocatable
5844                           || (fsym->ts.type == BT_CLASS
5845                               && CLASS_DATA (fsym)->attr.allocatable)))
5846                     {
5847                       stmtblock_t block;
5848                       tree ptr;
5849
5850                       gfc_init_block  (&block);
5851                       ptr = parmse.expr;
5852                       if (e->ts.type == BT_CLASS)
5853                         ptr = gfc_class_data_get (ptr);
5854
5855                       tmp = gfc_deallocate_scalar_with_status (ptr, NULL_TREE,
5856                                                                NULL_TREE, true,
5857                                                                e, e->ts);
5858                       gfc_add_expr_to_block (&block, tmp);
5859                       tmp = fold_build2_loc (input_location, MODIFY_EXPR,
5860                                              void_type_node, ptr,
5861                                              null_pointer_node);
5862                       gfc_add_expr_to_block (&block, tmp);
5863
5864                       if (fsym->ts.type == BT_CLASS && UNLIMITED_POLY (fsym))
5865                         {
5866                           gfc_add_modify (&block, ptr,
5867                                           fold_convert (TREE_TYPE (ptr),
5868                                                         null_pointer_node));
5869                           gfc_add_expr_to_block (&block, tmp);
5870                         }
5871                       else if (fsym->ts.type == BT_CLASS)
5872                         {
5873                           gfc_symbol *vtab;
5874                           vtab = gfc_find_derived_vtab (fsym->ts.u.derived);
5875                           tmp = gfc_get_symbol_decl (vtab);
5876                           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
5877                           ptr = gfc_class_vptr_get (parmse.expr);
5878                           gfc_add_modify (&block, ptr,
5879                                           fold_convert (TREE_TYPE (ptr), tmp));
5880                           gfc_add_expr_to_block (&block, tmp);
5881                         }
5882
5883                       if (fsym->attr.optional
5884                           && e->expr_type == EXPR_VARIABLE
5885                           && e->symtree->n.sym->attr.optional)
5886                         {
5887                           tmp = fold_build3_loc (input_location, COND_EXPR,
5888                                      void_type_node,
5889                                      gfc_conv_expr_present (e->symtree->n.sym),
5890                                             gfc_finish_block (&block),
5891                                             build_empty_stmt (input_location));
5892                         }
5893                       else
5894                         tmp = gfc_finish_block (&block);
5895
5896                       gfc_add_expr_to_block (&se->pre, tmp);
5897                     }
5898
5899                   if (fsym && (fsym->ts.type == BT_DERIVED
5900                                || fsym->ts.type == BT_ASSUMED)
5901                       && e->ts.type == BT_CLASS
5902                       && !CLASS_DATA (e)->attr.dimension
5903                       && !CLASS_DATA (e)->attr.codimension)
5904                     {
5905                       parmse.expr = gfc_class_data_get (parmse.expr);
5906                       /* The result is a class temporary, whose _data component
5907                          must be freed to avoid a memory leak.  */
5908                       if (e->expr_type == EXPR_FUNCTION
5909                           && CLASS_DATA (e)->attr.allocatable)
5910                         {
5911                           tree zero;
5912
5913                           gfc_expr *var;
5914
5915                           /* Borrow the function symbol to make a call to
5916                              gfc_add_finalizer_call and then restore it.  */
5917                           tmp = e->symtree->n.sym->backend_decl;
5918                           e->symtree->n.sym->backend_decl
5919                                         = TREE_OPERAND (parmse.expr, 0);
5920                           e->symtree->n.sym->attr.flavor = FL_VARIABLE;
5921                           var = gfc_lval_expr_from_sym (e->symtree->n.sym);
5922                           finalized = gfc_add_finalizer_call (&parmse.post,
5923                                                               var);
5924                           gfc_free_expr (var);
5925                           e->symtree->n.sym->backend_decl = tmp;
5926                           e->symtree->n.sym->attr.flavor = FL_PROCEDURE;
5927
5928                           /* Then free the class _data.  */
5929                           zero = build_int_cst (TREE_TYPE (parmse.expr), 0);
5930                           tmp = fold_build2_loc (input_location, NE_EXPR,
5931                                                  logical_type_node,
5932                                                  parmse.expr, zero);
5933                           tmp = build3_v (COND_EXPR, tmp,
5934                                           gfc_call_free (parmse.expr),
5935                                           build_empty_stmt (input_location));
5936                           gfc_add_expr_to_block (&parmse.post, tmp);
5937                           gfc_add_modify (&parmse.post, parmse.expr, zero);
5938                         }
5939                     }
5940
5941                   /* Wrap scalar variable in a descriptor. We need to convert
5942                      the address of a pointer back to the pointer itself before,
5943                      we can assign it to the data field.  */
5944
5945                   if (fsym && fsym->as && fsym->as->type == AS_ASSUMED_RANK
5946                       && fsym->ts.type != BT_CLASS && e->expr_type != EXPR_NULL)
5947                     {
5948                       tmp = parmse.expr;
5949                       if (TREE_CODE (tmp) == ADDR_EXPR)
5950                         tmp = build_fold_indirect_ref_loc (input_location, tmp);
5951                       parmse.expr = gfc_conv_scalar_to_descriptor (&parmse, tmp,
5952                                                                    fsym->attr);
5953                       parmse.expr = gfc_build_addr_expr (NULL_TREE,
5954                                                          parmse.expr);
5955                     }
5956                   else if (fsym && e->expr_type != EXPR_NULL
5957                       && ((fsym->attr.pointer
5958                            && fsym->attr.flavor != FL_PROCEDURE)
5959                           || (fsym->attr.proc_pointer
5960                               && !(e->expr_type == EXPR_VARIABLE
5961                                    && e->symtree->n.sym->attr.dummy))
5962                           || (fsym->attr.proc_pointer
5963                               && e->expr_type == EXPR_VARIABLE
5964                               && gfc_is_proc_ptr_comp (e))
5965                           || (fsym->attr.allocatable
5966                               && fsym->attr.flavor != FL_PROCEDURE)))
5967                     {
5968                       /* Scalar pointer dummy args require an extra level of
5969                          indirection. The null pointer already contains
5970                          this level of indirection.  */
5971                       parm_kind = SCALAR_POINTER;
5972                       parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
5973                     }
5974                 }
5975             }
5976           else if (e->ts.type == BT_CLASS
5977                     && fsym && fsym->ts.type == BT_CLASS
5978                     && (CLASS_DATA (fsym)->attr.dimension
5979                         || CLASS_DATA (fsym)->attr.codimension))
5980             {
5981               /* Pass a class array.  */
5982               parmse.use_offset = 1;
5983               gfc_conv_expr_descriptor (&parmse, e);
5984
5985               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
5986                  allocated on entry, it must be deallocated.  */
5987               if (fsym->attr.intent == INTENT_OUT
5988                   && CLASS_DATA (fsym)->attr.allocatable)
5989                 {
5990                   stmtblock_t block;
5991                   tree ptr;
5992
5993                   gfc_init_block  (&block);
5994                   ptr = parmse.expr;
5995                   ptr = gfc_class_data_get (ptr);
5996
5997                   tmp = gfc_deallocate_with_status (ptr, NULL_TREE,
5998                                                     NULL_TREE, NULL_TREE,
5999                                                     NULL_TREE, true, e,
6000                                                     GFC_CAF_COARRAY_NOCOARRAY);
6001                   gfc_add_expr_to_block (&block, tmp);
6002                   tmp = fold_build2_loc (input_location, MODIFY_EXPR,
6003                                          void_type_node, ptr,
6004                                          null_pointer_node);
6005                   gfc_add_expr_to_block (&block, tmp);
6006                   gfc_reset_vptr (&block, e);
6007
6008                   if (fsym->attr.optional
6009                       && e->expr_type == EXPR_VARIABLE
6010                       && (!e->ref
6011                           || (e->ref->type == REF_ARRAY
6012                               && e->ref->u.ar.type != AR_FULL))
6013                       && e->symtree->n.sym->attr.optional)
6014                     {
6015                       tmp = fold_build3_loc (input_location, COND_EXPR,
6016                                     void_type_node,
6017                                     gfc_conv_expr_present (e->symtree->n.sym),
6018                                     gfc_finish_block (&block),
6019                                     build_empty_stmt (input_location));
6020                     }
6021                   else
6022                     tmp = gfc_finish_block (&block);
6023
6024                   gfc_add_expr_to_block (&se->pre, tmp);
6025                 }
6026
6027               /* The conversion does not repackage the reference to a class
6028                  array - _data descriptor.  */
6029               gfc_conv_class_to_class (&parmse, e, fsym->ts, false,
6030                                      fsym->attr.intent != INTENT_IN
6031                                      && (CLASS_DATA (fsym)->attr.class_pointer
6032                                          || CLASS_DATA (fsym)->attr.allocatable),
6033                                      fsym->attr.optional
6034                                      && e->expr_type == EXPR_VARIABLE
6035                                      && e->symtree->n.sym->attr.optional,
6036                                      CLASS_DATA (fsym)->attr.class_pointer
6037                                      || CLASS_DATA (fsym)->attr.allocatable);
6038             }
6039           else
6040             {
6041               /* If the argument is a function call that may not create
6042                  a temporary for the result, we have to check that we
6043                  can do it, i.e. that there is no alias between this
6044                  argument and another one.  */
6045               if (gfc_get_noncopying_intrinsic_argument (e) != NULL)
6046                 {
6047                   gfc_expr *iarg;
6048                   sym_intent intent;
6049
6050                   if (fsym != NULL)
6051                     intent = fsym->attr.intent;
6052                   else
6053                     intent = INTENT_UNKNOWN;
6054
6055                   if (gfc_check_fncall_dependency (e, intent, sym, args,
6056                                                    NOT_ELEMENTAL))
6057                     parmse.force_tmp = 1;
6058
6059                   iarg = e->value.function.actual->expr;
6060
6061                   /* Temporary needed if aliasing due to host association.  */
6062                   if (sym->attr.contained
6063                         && !sym->attr.pure
6064                         && !sym->attr.implicit_pure
6065                         && !sym->attr.use_assoc
6066                         && iarg->expr_type == EXPR_VARIABLE
6067                         && sym->ns == iarg->symtree->n.sym->ns)
6068                     parmse.force_tmp = 1;
6069
6070                   /* Ditto within module.  */
6071                   if (sym->attr.use_assoc
6072                         && !sym->attr.pure
6073                         && !sym->attr.implicit_pure
6074                         && iarg->expr_type == EXPR_VARIABLE
6075                         && sym->module == iarg->symtree->n.sym->module)
6076                     parmse.force_tmp = 1;
6077                 }
6078
6079               if (sym->attr.is_bind_c && e
6080                   && (is_CFI_desc (fsym, NULL) || non_unity_length_string))
6081                 /* Implement F2018, C.12.6.1: paragraph (2).  */
6082                 gfc_conv_gfc_desc_to_cfi_desc (&parmse, e, fsym);
6083
6084               else if (e->expr_type == EXPR_VARIABLE
6085                     && is_subref_array (e)
6086                     && !(fsym && fsym->attr.pointer))
6087                 /* The actual argument is a component reference to an
6088                    array of derived types.  In this case, the argument
6089                    is converted to a temporary, which is passed and then
6090                    written back after the procedure call.  */
6091                 gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
6092                                 fsym ? fsym->attr.intent : INTENT_INOUT,
6093                                 fsym && fsym->attr.pointer);
6094
6095               else if (gfc_is_class_array_ref (e, NULL)
6096                          && fsym && fsym->ts.type == BT_DERIVED)
6097                 /* The actual argument is a component reference to an
6098                    array of derived types.  In this case, the argument
6099                    is converted to a temporary, which is passed and then
6100                    written back after the procedure call.
6101                    OOP-TODO: Insert code so that if the dynamic type is
6102                    the same as the declared type, copy-in/copy-out does
6103                    not occur.  */
6104                 gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
6105                                 fsym ? fsym->attr.intent : INTENT_INOUT,
6106                                 fsym && fsym->attr.pointer);
6107
6108               else if (gfc_is_class_array_function (e)
6109                          && fsym && fsym->ts.type == BT_DERIVED)
6110                 /* See previous comment.  For function actual argument,
6111                    the write out is not needed so the intent is set as
6112                    intent in.  */
6113                 {
6114                   e->must_finalize = 1;
6115                   gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
6116                                              INTENT_IN,
6117                                              fsym && fsym->attr.pointer);
6118                 }
6119               else if (fsym && fsym->attr.contiguous
6120                        && !gfc_is_simply_contiguous (e, false, true))
6121                 {
6122                   gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
6123                                 fsym ? fsym->attr.intent : INTENT_INOUT,
6124                                 fsym && fsym->attr.pointer);
6125                 }
6126               else
6127                 gfc_conv_array_parameter (&parmse, e, nodesc_arg, fsym,
6128                                           sym->name, NULL);
6129
6130               /* Unallocated allocatable arrays and unassociated pointer arrays
6131                  need their dtype setting if they are argument associated with
6132                  assumed rank dummies.  */
6133               if (!sym->attr.is_bind_c && e && fsym && fsym->as
6134                   && fsym->as->type == AS_ASSUMED_RANK)
6135                 {
6136                   if (gfc_expr_attr (e).pointer
6137                       || gfc_expr_attr (e).allocatable)
6138                     set_dtype_for_unallocated (&parmse, e);
6139                   else if (e->expr_type == EXPR_VARIABLE
6140                            && e->symtree->n.sym->attr.dummy
6141                            && e->symtree->n.sym->as
6142                            && e->symtree->n.sym->as->type == AS_ASSUMED_SIZE)
6143                     {
6144                       tree minus_one;
6145                       tmp = build_fold_indirect_ref_loc (input_location,
6146                                                          parmse.expr);
6147                       minus_one = build_int_cst (gfc_array_index_type, -1);
6148                       gfc_conv_descriptor_ubound_set (&parmse.pre, tmp,
6149                                                       gfc_rank_cst[e->rank - 1],
6150                                                       minus_one);
6151                     }
6152                 }
6153
6154               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
6155                  allocated on entry, it must be deallocated.  */
6156               if (fsym && fsym->attr.allocatable
6157                   && fsym->attr.intent == INTENT_OUT)
6158                 {
6159                   if (fsym->ts.type == BT_DERIVED
6160                       && fsym->ts.u.derived->attr.alloc_comp)
6161                   {
6162                     // deallocate the components first
6163                     tmp = gfc_deallocate_alloc_comp (fsym->ts.u.derived,
6164                                                      parmse.expr, e->rank);
6165                     if (tmp != NULL_TREE)
6166                       gfc_add_expr_to_block (&se->pre, tmp);
6167                   }
6168
6169                   tmp = build_fold_indirect_ref_loc (input_location,
6170                                                      parmse.expr);
6171                   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
6172                     tmp = gfc_conv_descriptor_data_get (tmp);
6173                   tmp = gfc_deallocate_with_status (tmp, NULL_TREE, NULL_TREE,
6174                                                     NULL_TREE, NULL_TREE, true,
6175                                                     e,
6176                                                     GFC_CAF_COARRAY_NOCOARRAY);
6177                   if (fsym->attr.optional
6178                       && e->expr_type == EXPR_VARIABLE
6179                       && e->symtree->n.sym->attr.optional)
6180                     tmp = fold_build3_loc (input_location, COND_EXPR,
6181                                      void_type_node,
6182                                      gfc_conv_expr_present (e->symtree->n.sym),
6183                                        tmp, build_empty_stmt (input_location));
6184                   gfc_add_expr_to_block (&se->pre, tmp);
6185                 }
6186             }
6187         }
6188
6189       /* The case with fsym->attr.optional is that of a user subroutine
6190          with an interface indicating an optional argument.  When we call
6191          an intrinsic subroutine, however, fsym is NULL, but we might still
6192          have an optional argument, so we proceed to the substitution
6193          just in case.  */
6194       if (e && (fsym == NULL || fsym->attr.optional))
6195         {
6196           /* If an optional argument is itself an optional dummy argument,
6197              check its presence and substitute a null if absent.  This is
6198              only needed when passing an array to an elemental procedure
6199              as then array elements are accessed - or no NULL pointer is
6200              allowed and a "1" or "0" should be passed if not present.
6201              When passing a non-array-descriptor full array to a
6202              non-array-descriptor dummy, no check is needed. For
6203              array-descriptor actual to array-descriptor dummy, see
6204              PR 41911 for why a check has to be inserted.
6205              fsym == NULL is checked as intrinsics required the descriptor
6206              but do not always set fsym.
6207              Also, it is necessary to pass a NULL pointer to library routines
6208              which usually ignore optional arguments, so they can handle
6209              these themselves.  */
6210           if (e->expr_type == EXPR_VARIABLE
6211               && e->symtree->n.sym->attr.optional
6212               && (((e->rank != 0 && elemental_proc)
6213                    || e->representation.length || e->ts.type == BT_CHARACTER
6214                    || (e->rank != 0
6215                        && (fsym == NULL
6216                            || (fsym->as
6217                                && (fsym->as->type == AS_ASSUMED_SHAPE
6218                                    || fsym->as->type == AS_ASSUMED_RANK
6219                                    || fsym->as->type == AS_DEFERRED)))))
6220                   || se->ignore_optional))
6221             gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
6222                                     e->representation.length);
6223         }
6224
6225       if (fsym && e)
6226         {
6227           /* Obtain the character length of an assumed character length
6228              length procedure from the typespec.  */
6229           if (fsym->ts.type == BT_CHARACTER
6230               && parmse.string_length == NULL_TREE
6231               && e->ts.type == BT_PROCEDURE
6232               && e->symtree->n.sym->ts.type == BT_CHARACTER
6233               && e->symtree->n.sym->ts.u.cl->length != NULL
6234               && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
6235             {
6236               gfc_conv_const_charlen (e->symtree->n.sym->ts.u.cl);
6237               parmse.string_length = e->symtree->n.sym->ts.u.cl->backend_decl;
6238             }
6239         }
6240
6241       if (fsym && need_interface_mapping && e)
6242         gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
6243
6244       gfc_add_block_to_block (&se->pre, &parmse.pre);
6245       gfc_add_block_to_block (&post, &parmse.post);
6246
6247       /* Allocated allocatable components of derived types must be
6248          deallocated for non-variable scalars, array arguments to elemental
6249          procedures, and array arguments with descriptor to non-elemental
6250          procedures.  As bounds information for descriptorless arrays is no
6251          longer available here, they are dealt with in trans-array.c
6252          (gfc_conv_array_parameter).  */
6253       if (e && (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS)
6254             && e->ts.u.derived->attr.alloc_comp
6255             && (e->rank == 0 || elemental_proc || !nodesc_arg)
6256             && !expr_may_alias_variables (e, elemental_proc))
6257         {
6258           int parm_rank;
6259           /* It is known the e returns a structure type with at least one
6260              allocatable component.  When e is a function, ensure that the
6261              function is called once only by using a temporary variable.  */
6262           if (!DECL_P (parmse.expr))
6263             parmse.expr = gfc_evaluate_now_loc (input_location,
6264                                                 parmse.expr, &se->pre);
6265
6266           if (fsym && fsym->attr.value)
6267             tmp = parmse.expr;
6268           else
6269             tmp = build_fold_indirect_ref_loc (input_location,
6270                                                parmse.expr);
6271
6272           parm_rank = e->rank;
6273           switch (parm_kind)
6274             {
6275             case (ELEMENTAL):
6276             case (SCALAR):
6277               parm_rank = 0;
6278               break;
6279
6280             case (SCALAR_POINTER):
6281               tmp = build_fold_indirect_ref_loc (input_location,
6282                                              tmp);
6283               break;
6284             }
6285
6286           if (e->ts.type == BT_DERIVED && fsym && fsym->ts.type == BT_CLASS)
6287             {
6288               /* The derived type is passed to gfc_deallocate_alloc_comp.
6289                  Therefore, class actuals can be handled correctly but derived
6290                  types passed to class formals need the _data component.  */
6291               tmp = gfc_class_data_get (tmp);
6292               if (!CLASS_DATA (fsym)->attr.dimension)
6293                 tmp = build_fold_indirect_ref_loc (input_location, tmp);
6294             }
6295
6296           if (e->expr_type == EXPR_OP
6297                 && e->value.op.op == INTRINSIC_PARENTHESES
6298                 && e->value.op.op1->expr_type == EXPR_VARIABLE)
6299             {
6300               tree local_tmp;
6301               local_tmp = gfc_evaluate_now (tmp, &se->pre);
6302               local_tmp = gfc_copy_alloc_comp (e->ts.u.derived, local_tmp, tmp,
6303                                                parm_rank, 0);
6304               gfc_add_expr_to_block (&se->post, local_tmp);
6305             }
6306
6307           if (!finalized && !e->must_finalize)
6308             {
6309               if ((e->ts.type == BT_CLASS
6310                    && GFC_CLASS_TYPE_P (TREE_TYPE (tmp)))
6311                   || e->ts.type == BT_DERIVED)
6312                 tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp,
6313                                                  parm_rank);
6314               else if (e->ts.type == BT_CLASS)
6315                 tmp = gfc_deallocate_alloc_comp (CLASS_DATA (e)->ts.u.derived,
6316                                                  tmp, parm_rank);
6317               gfc_prepend_expr_to_block (&post, tmp);
6318             }
6319         }
6320
6321       /* Add argument checking of passing an unallocated/NULL actual to
6322          a nonallocatable/nonpointer dummy.  */
6323
6324       if (gfc_option.rtcheck & GFC_RTCHECK_POINTER && e != NULL)
6325         {
6326           symbol_attribute attr;
6327           char *msg;
6328           tree cond;
6329
6330           if (e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_FUNCTION)
6331             attr = gfc_expr_attr (e);
6332           else
6333             goto end_pointer_check;
6334
6335           /*  In Fortran 2008 it's allowed to pass a NULL pointer/nonallocated
6336               allocatable to an optional dummy, cf. 12.5.2.12.  */
6337           if (fsym != NULL && fsym->attr.optional && !attr.proc_pointer
6338               && (gfc_option.allow_std & GFC_STD_F2008) != 0)
6339             goto end_pointer_check;
6340
6341           if (attr.optional)
6342             {
6343               /* If the actual argument is an optional pointer/allocatable and
6344                  the formal argument takes an nonpointer optional value,
6345                  it is invalid to pass a non-present argument on, even
6346                  though there is no technical reason for this in gfortran.
6347                  See Fortran 2003, Section 12.4.1.6 item (7)+(8).  */
6348               tree present, null_ptr, type;
6349
6350               if (attr.allocatable
6351                   && (fsym == NULL || !fsym->attr.allocatable))
6352                 msg = xasprintf ("Allocatable actual argument '%s' is not "
6353                                  "allocated or not present",
6354                                  e->symtree->n.sym->name);
6355               else if (attr.pointer
6356                        && (fsym == NULL || !fsym->attr.pointer))
6357                 msg = xasprintf ("Pointer actual argument '%s' is not "
6358                                  "associated or not present",
6359                                  e->symtree->n.sym->name);
6360               else if (attr.proc_pointer
6361                        && (fsym == NULL || !fsym->attr.proc_pointer))
6362                 msg = xasprintf ("Proc-pointer actual argument '%s' is not "
6363                                  "associated or not present",
6364                                  e->symtree->n.sym->name);
6365               else
6366                 goto end_pointer_check;
6367
6368               present = gfc_conv_expr_present (e->symtree->n.sym);
6369               type = TREE_TYPE (present);
6370               present = fold_build2_loc (input_location, EQ_EXPR,
6371                                          logical_type_node, present,
6372                                          fold_convert (type,
6373                                                        null_pointer_node));
6374               type = TREE_TYPE (parmse.expr);
6375               null_ptr = fold_build2_loc (input_location, EQ_EXPR,
6376                                           logical_type_node, parmse.expr,
6377                                           fold_convert (type,
6378                                                         null_pointer_node));
6379               cond = fold_build2_loc (input_location, TRUTH_ORIF_EXPR,
6380                                       logical_type_node, present, null_ptr);
6381             }
6382           else
6383             {
6384               if (attr.allocatable
6385                   && (fsym == NULL || !fsym->attr.allocatable))
6386                 msg = xasprintf ("Allocatable actual argument '%s' is not "
6387                                  "allocated", e->symtree->n.sym->name);
6388               else if (attr.pointer
6389                        && (fsym == NULL || !fsym->attr.pointer))
6390                 msg = xasprintf ("Pointer actual argument '%s' is not "
6391                                  "associated", e->symtree->n.sym->name);
6392               else if (attr.proc_pointer
6393                        && (fsym == NULL || !fsym->attr.proc_pointer))
6394                 msg = xasprintf ("Proc-pointer actual argument '%s' is not "
6395                                  "associated", e->symtree->n.sym->name);
6396               else
6397                 goto end_pointer_check;
6398
6399               tmp = parmse.expr;
6400
6401               /* If the argument is passed by value, we need to strip the
6402                  INDIRECT_REF.  */
6403               if (!POINTER_TYPE_P (TREE_TYPE (parmse.expr)))
6404                 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
6405
6406               cond = fold_build2_loc (input_location, EQ_EXPR,
6407                                       logical_type_node, tmp,
6408                                       fold_convert (TREE_TYPE (tmp),
6409                                                     null_pointer_node));
6410             }
6411
6412           gfc_trans_runtime_check (true, false, cond, &se->pre, &e->where,
6413                                    msg);
6414           free (msg);
6415         }
6416       end_pointer_check:
6417
6418       /* Deferred length dummies pass the character length by reference
6419          so that the value can be returned.  */
6420       if (parmse.string_length && fsym && fsym->ts.deferred)
6421         {
6422           if (INDIRECT_REF_P (parmse.string_length))
6423             /* In chains of functions/procedure calls the string_length already
6424                is a pointer to the variable holding the length.  Therefore
6425                remove the deref on call.  */
6426             parmse.string_length = TREE_OPERAND (parmse.string_length, 0);
6427           else
6428             {
6429               tmp = parmse.string_length;
6430               if (!VAR_P (tmp) && TREE_CODE (tmp) != COMPONENT_REF)
6431                 tmp = gfc_evaluate_now (parmse.string_length, &se->pre);
6432               parmse.string_length = gfc_build_addr_expr (NULL_TREE, tmp);
6433             }
6434         }
6435
6436       /* Character strings are passed as two parameters, a length and a
6437          pointer - except for Bind(c) which only passes the pointer.
6438          An unlimited polymorphic formal argument likewise does not
6439          need the length.  */
6440       if (parmse.string_length != NULL_TREE
6441           && !sym->attr.is_bind_c
6442           && !(fsym && UNLIMITED_POLY (fsym)))
6443         vec_safe_push (stringargs, parmse.string_length);
6444
6445       /* When calling __copy for character expressions to unlimited
6446          polymorphic entities, the dst argument needs a string length.  */
6447       if (sym->name[0] == '_' && e && e->ts.type == BT_CHARACTER
6448           && gfc_str_startswith (sym->name, "__vtab_CHARACTER")
6449           && arg->next && arg->next->expr
6450           && (arg->next->expr->ts.type == BT_DERIVED
6451               || arg->next->expr->ts.type == BT_CLASS)
6452           && arg->next->expr->ts.u.derived->attr.unlimited_polymorphic)
6453         vec_safe_push (stringargs, parmse.string_length);
6454
6455       /* For descriptorless coarrays and assumed-shape coarray dummies, we
6456          pass the token and the offset as additional arguments.  */
6457       if (fsym && e == NULL && flag_coarray == GFC_FCOARRAY_LIB
6458           && ((fsym->ts.type != BT_CLASS && fsym->attr.codimension
6459                && !fsym->attr.allocatable)
6460               || (fsym->ts.type == BT_CLASS
6461                   && CLASS_DATA (fsym)->attr.codimension
6462                   && !CLASS_DATA (fsym)->attr.allocatable)))
6463         {
6464           /* Token and offset.  */
6465           vec_safe_push (stringargs, null_pointer_node);
6466           vec_safe_push (stringargs, build_int_cst (gfc_array_index_type, 0));
6467           gcc_assert (fsym->attr.optional);
6468         }
6469       else if (fsym && flag_coarray == GFC_FCOARRAY_LIB
6470                && ((fsym->ts.type != BT_CLASS && fsym->attr.codimension
6471                     && !fsym->attr.allocatable)
6472                    || (fsym->ts.type == BT_CLASS
6473                        && CLASS_DATA (fsym)->attr.codimension
6474                        && !CLASS_DATA (fsym)->attr.allocatable)))
6475         {
6476           tree caf_decl, caf_type;
6477           tree offset, tmp2;
6478
6479           caf_decl = gfc_get_tree_for_caf_expr (e);
6480           caf_type = TREE_TYPE (caf_decl);
6481
6482           if (GFC_DESCRIPTOR_TYPE_P (caf_type)
6483               && (GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE
6484                   || GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_POINTER))
6485             tmp = gfc_conv_descriptor_token (caf_decl);
6486           else if (DECL_LANG_SPECIFIC (caf_decl)
6487                    && GFC_DECL_TOKEN (caf_decl) != NULL_TREE)
6488             tmp = GFC_DECL_TOKEN (caf_decl);
6489           else
6490             {
6491               gcc_assert (GFC_ARRAY_TYPE_P (caf_type)
6492                           && GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) != NULL_TREE);
6493               tmp = GFC_TYPE_ARRAY_CAF_TOKEN (caf_type);
6494             }
6495
6496           vec_safe_push (stringargs, tmp);
6497
6498           if (GFC_DESCRIPTOR_TYPE_P (caf_type)
6499               && GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE)
6500             offset = build_int_cst (gfc_array_index_type, 0);
6501           else if (DECL_LANG_SPECIFIC (caf_decl)
6502                    && GFC_DECL_CAF_OFFSET (caf_decl) != NULL_TREE)
6503             offset = GFC_DECL_CAF_OFFSET (caf_decl);
6504           else if (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) != NULL_TREE)
6505             offset = GFC_TYPE_ARRAY_CAF_OFFSET (caf_type);
6506           else
6507             offset = build_int_cst (gfc_array_index_type, 0);
6508
6509           if (GFC_DESCRIPTOR_TYPE_P (caf_type))
6510             tmp = gfc_conv_descriptor_data_get (caf_decl);
6511           else
6512             {
6513               gcc_assert (POINTER_TYPE_P (caf_type));
6514               tmp = caf_decl;
6515             }
6516
6517           tmp2 = fsym->ts.type == BT_CLASS
6518                  ? gfc_class_data_get (parmse.expr) : parmse.expr;
6519           if ((fsym->ts.type != BT_CLASS
6520                && (fsym->as->type == AS_ASSUMED_SHAPE
6521                    || fsym->as->type == AS_ASSUMED_RANK))
6522               || (fsym->ts.type == BT_CLASS
6523                   && (CLASS_DATA (fsym)->as->type == AS_ASSUMED_SHAPE
6524                       || CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)))
6525             {
6526               if (fsym->ts.type == BT_CLASS)
6527                 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (tmp2)));
6528               else
6529                 {
6530                   gcc_assert (POINTER_TYPE_P (TREE_TYPE (tmp2)));
6531                   tmp2 = build_fold_indirect_ref_loc (input_location, tmp2);
6532                 }
6533               gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp2)));
6534               tmp2 = gfc_conv_descriptor_data_get (tmp2);
6535             }
6536           else if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp2)))
6537             tmp2 = gfc_conv_descriptor_data_get (tmp2);
6538           else
6539             {
6540               gcc_assert (POINTER_TYPE_P (TREE_TYPE (tmp2)));
6541             }
6542
6543           tmp = fold_build2_loc (input_location, MINUS_EXPR,
6544                                  gfc_array_index_type,
6545                                  fold_convert (gfc_array_index_type, tmp2),
6546                                  fold_convert (gfc_array_index_type, tmp));
6547           offset = fold_build2_loc (input_location, PLUS_EXPR,
6548                                     gfc_array_index_type, offset, tmp);
6549
6550           vec_safe_push (stringargs, offset);
6551         }
6552
6553       vec_safe_push (arglist, parmse.expr);
6554     }
6555   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
6556
6557   if (comp)
6558     ts = comp->ts;
6559   else if (sym->ts.type == BT_CLASS)
6560     ts = CLASS_DATA (sym)->ts;
6561   else
6562     ts = sym->ts;
6563
6564   if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
6565     se->string_length = build_int_cst (gfc_charlen_type_node, 1);
6566   else if (ts.type == BT_CHARACTER)
6567     {
6568       if (ts.u.cl->length == NULL)
6569         {
6570           /* Assumed character length results are not allowed by C418 of the 2003
6571              standard and are trapped in resolve.c; except in the case of SPREAD
6572              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
6573              we take the character length of the first argument for the result.
6574              For dummies, we have to look through the formal argument list for
6575              this function and use the character length found there.*/
6576           if (ts.deferred)
6577             cl.backend_decl = gfc_create_var (gfc_charlen_type_node, "slen");
6578           else if (!sym->attr.dummy)
6579             cl.backend_decl = (*stringargs)[0];
6580           else
6581             {
6582               formal = gfc_sym_get_dummy_args (sym->ns->proc_name);
6583               for (; formal; formal = formal->next)
6584                 if (strcmp (formal->sym->name, sym->name) == 0)
6585                   cl.backend_decl = formal->sym->ts.u.cl->backend_decl;
6586             }
6587           len = cl.backend_decl;
6588         }
6589       else
6590         {
6591           tree tmp;
6592
6593           /* Calculate the length of the returned string.  */
6594           gfc_init_se (&parmse, NULL);
6595           if (need_interface_mapping)
6596             gfc_apply_interface_mapping (&mapping, &parmse, ts.u.cl->length);
6597           else
6598             gfc_conv_expr (&parmse, ts.u.cl->length);
6599           gfc_add_block_to_block (&se->pre, &parmse.pre);
6600           gfc_add_block_to_block (&se->post, &parmse.post);
6601           tmp = parmse.expr;
6602           /* TODO: It would be better to have the charlens as
6603              gfc_charlen_type_node already when the interface is
6604              created instead of converting it here (see PR 84615).  */
6605           tmp = fold_build2_loc (input_location, MAX_EXPR,
6606                                  gfc_charlen_type_node,
6607                                  fold_convert (gfc_charlen_type_node, tmp),
6608                                  build_zero_cst (gfc_charlen_type_node));
6609           cl.backend_decl = tmp;
6610         }
6611
6612       /* Set up a charlen structure for it.  */
6613       cl.next = NULL;
6614       cl.length = NULL;
6615       ts.u.cl = &cl;
6616
6617       len = cl.backend_decl;
6618     }
6619
6620   byref = (comp && (comp->attr.dimension
6621            || (comp->ts.type == BT_CHARACTER && !sym->attr.is_bind_c)))
6622            || (!comp && gfc_return_by_reference (sym));
6623   if (byref)
6624     {
6625       if (se->direct_byref)
6626         {
6627           /* Sometimes, too much indirection can be applied; e.g. for
6628              function_result = array_valued_recursive_function.  */
6629           if (TREE_TYPE (TREE_TYPE (se->expr))
6630                 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
6631                 && GFC_DESCRIPTOR_TYPE_P
6632                         (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
6633             se->expr = build_fold_indirect_ref_loc (input_location,
6634                                                     se->expr);
6635
6636           /* If the lhs of an assignment x = f(..) is allocatable and
6637              f2003 is allowed, we must do the automatic reallocation.
6638              TODO - deal with intrinsics, without using a temporary.  */
6639           if (flag_realloc_lhs
6640                 && se->ss && se->ss->loop_chain
6641                 && se->ss->loop_chain->is_alloc_lhs
6642                 && !expr->value.function.isym
6643                 && sym->result->as != NULL)
6644             {
6645               /* Evaluate the bounds of the result, if known.  */
6646               gfc_set_loop_bounds_from_array_spec (&mapping, se,
6647                                                    sym->result->as);
6648
6649               /* Perform the automatic reallocation.  */
6650               tmp = gfc_alloc_allocatable_for_assignment (se->loop,
6651                                                           expr, NULL);
6652               gfc_add_expr_to_block (&se->pre, tmp);
6653
6654               /* Pass the temporary as the first argument.  */
6655               result = info->descriptor;
6656             }
6657           else
6658             result = build_fold_indirect_ref_loc (input_location,
6659                                                   se->expr);
6660           vec_safe_push (retargs, se->expr);
6661         }
6662       else if (comp && comp->attr.dimension)
6663         {
6664           gcc_assert (se->loop && info);
6665
6666           /* Set the type of the array.  */
6667           tmp = gfc_typenode_for_spec (&comp->ts);
6668           gcc_assert (se->ss->dimen == se->loop->dimen);
6669
6670           /* Evaluate the bounds of the result, if known.  */
6671           gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
6672
6673           /* If the lhs of an assignment x = f(..) is allocatable and
6674              f2003 is allowed, we must not generate the function call
6675              here but should just send back the results of the mapping.
6676              This is signalled by the function ss being flagged.  */
6677           if (flag_realloc_lhs && se->ss && se->ss->is_alloc_lhs)
6678             {
6679               gfc_free_interface_mapping (&mapping);
6680               return has_alternate_specifier;
6681             }
6682
6683           /* Create a temporary to store the result.  In case the function
6684              returns a pointer, the temporary will be a shallow copy and
6685              mustn't be deallocated.  */
6686           callee_alloc = comp->attr.allocatable || comp->attr.pointer;
6687           gfc_trans_create_temp_array (&se->pre, &se->post, se->ss,
6688                                        tmp, NULL_TREE, false,
6689                                        !comp->attr.pointer, callee_alloc,
6690                                        &se->ss->info->expr->where);
6691
6692           /* Pass the temporary as the first argument.  */
6693           result = info->descriptor;
6694           tmp = gfc_build_addr_expr (NULL_TREE, result);
6695           vec_safe_push (retargs, tmp);
6696         }
6697       else if (!comp && sym->result->attr.dimension)
6698         {
6699           gcc_assert (se->loop && info);
6700
6701           /* Set the type of the array.  */
6702           tmp = gfc_typenode_for_spec (&ts);
6703           gcc_assert (se->ss->dimen == se->loop->dimen);
6704
6705           /* Evaluate the bounds of the result, if known.  */
6706           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
6707
6708           /* If the lhs of an assignment x = f(..) is allocatable and
6709              f2003 is allowed, we must not generate the function call
6710              here but should just send back the results of the mapping.
6711              This is signalled by the function ss being flagged.  */
6712           if (flag_realloc_lhs && se->ss && se->ss->is_alloc_lhs)
6713             {
6714               gfc_free_interface_mapping (&mapping);
6715               return has_alternate_specifier;
6716             }
6717
6718           /* Create a temporary to store the result.  In case the function
6719              returns a pointer, the temporary will be a shallow copy and
6720              mustn't be deallocated.  */
6721           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
6722           gfc_trans_create_temp_array (&se->pre, &se->post, se->ss,
6723                                        tmp, NULL_TREE, false,
6724                                        !sym->attr.pointer, callee_alloc,
6725                                        &se->ss->info->expr->where);
6726
6727           /* Pass the temporary as the first argument.  */
6728           result = info->descriptor;
6729           tmp = gfc_build_addr_expr (NULL_TREE, result);
6730           vec_safe_push (retargs, tmp);
6731         }
6732       else if (ts.type == BT_CHARACTER)
6733         {
6734           /* Pass the string length.  */
6735           type = gfc_get_character_type (ts.kind, ts.u.cl);
6736           type = build_pointer_type (type);
6737
6738           /* Emit a DECL_EXPR for the VLA type.  */
6739           tmp = TREE_TYPE (type);
6740           if (TYPE_SIZE (tmp)
6741               && TREE_CODE (TYPE_SIZE (tmp)) != INTEGER_CST)
6742             {
6743               tmp = build_decl (input_location, TYPE_DECL, NULL_TREE, tmp);
6744               DECL_ARTIFICIAL (tmp) = 1;
6745               DECL_IGNORED_P (tmp) = 1;
6746               tmp = fold_build1_loc (input_location, DECL_EXPR,
6747                                      TREE_TYPE (tmp), tmp);
6748               gfc_add_expr_to_block (&se->pre, tmp);
6749             }
6750
6751           /* Return an address to a char[0:len-1]* temporary for
6752              character pointers.  */
6753           if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6754                || (comp && (comp->attr.pointer || comp->attr.allocatable)))
6755             {
6756               var = gfc_create_var (type, "pstr");
6757
6758               if ((!comp && sym->attr.allocatable)
6759                   || (comp && comp->attr.allocatable))
6760                 {
6761                   gfc_add_modify (&se->pre, var,
6762                                   fold_convert (TREE_TYPE (var),
6763                                                 null_pointer_node));
6764                   tmp = gfc_call_free (var);
6765                   gfc_add_expr_to_block (&se->post, tmp);
6766                 }
6767
6768               /* Provide an address expression for the function arguments.  */
6769               var = gfc_build_addr_expr (NULL_TREE, var);
6770             }
6771           else
6772             var = gfc_conv_string_tmp (se, type, len);
6773
6774           vec_safe_push (retargs, var);
6775         }
6776       else
6777         {
6778           gcc_assert (flag_f2c && ts.type == BT_COMPLEX);
6779
6780           type = gfc_get_complex_type (ts.kind);
6781           var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
6782           vec_safe_push (retargs, var);
6783         }
6784
6785       /* Add the string length to the argument list.  */
6786       if (ts.type == BT_CHARACTER && ts.deferred)
6787         {
6788           tmp = len;
6789           if (!VAR_P (tmp))
6790             tmp = gfc_evaluate_now (len, &se->pre);
6791           TREE_STATIC (tmp) = 1;
6792           gfc_add_modify (&se->pre, tmp,
6793                           build_int_cst (TREE_TYPE (tmp), 0));
6794           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
6795           vec_safe_push (retargs, tmp);
6796         }
6797       else if (ts.type == BT_CHARACTER)
6798         vec_safe_push (retargs, len);
6799     }
6800   gfc_free_interface_mapping (&mapping);
6801
6802   /* We need to glom RETARGS + ARGLIST + STRINGARGS + APPEND_ARGS.  */
6803   arglen = (vec_safe_length (arglist) + vec_safe_length (optionalargs)
6804             + vec_safe_length (stringargs) + vec_safe_length (append_args));
6805   vec_safe_reserve (retargs, arglen);
6806
6807   /* Add the return arguments.  */
6808   vec_safe_splice (retargs, arglist);
6809
6810   /* Add the hidden present status for optional+value to the arguments.  */
6811   vec_safe_splice (retargs, optionalargs);
6812
6813   /* Add the hidden string length parameters to the arguments.  */
6814   vec_safe_splice (retargs, stringargs);
6815
6816   /* We may want to append extra arguments here.  This is used e.g. for
6817      calls to libgfortran_matmul_??, which need extra information.  */
6818   vec_safe_splice (retargs, append_args);
6819
6820   arglist = retargs;
6821
6822   /* Generate the actual call.  */
6823   if (base_object == NULL_TREE)
6824     conv_function_val (se, sym, expr, args);
6825   else
6826     conv_base_obj_fcn_val (se, base_object, expr);
6827
6828   /* If there are alternate return labels, function type should be
6829      integer.  Can't modify the type in place though, since it can be shared
6830      with other functions.  For dummy arguments, the typing is done to
6831      this result, even if it has to be repeated for each call.  */
6832   if (has_alternate_specifier
6833       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
6834     {
6835       if (!sym->attr.dummy)
6836         {
6837           TREE_TYPE (sym->backend_decl)
6838                 = build_function_type (integer_type_node,
6839                       TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
6840           se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
6841         }
6842       else
6843         TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
6844     }
6845
6846   fntype = TREE_TYPE (TREE_TYPE (se->expr));
6847   se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist);
6848
6849   /* Allocatable scalar function results must be freed and nullified
6850      after use. This necessitates the creation of a temporary to
6851      hold the result to prevent duplicate calls.  */
6852   if (!byref && sym->ts.type != BT_CHARACTER
6853       && ((sym->attr.allocatable && !sym->attr.dimension && !comp)
6854           || (comp && comp->attr.allocatable && !comp->attr.dimension)))
6855     {
6856       tmp = gfc_create_var (TREE_TYPE (se->expr), NULL);
6857       gfc_add_modify (&se->pre, tmp, se->expr);
6858       se->expr = tmp;
6859       tmp = gfc_call_free (tmp);
6860       gfc_add_expr_to_block (&post, tmp);
6861       gfc_add_modify (&post, se->expr, build_int_cst (TREE_TYPE (se->expr), 0));
6862     }
6863
6864   /* If we have a pointer function, but we don't want a pointer, e.g.
6865      something like
6866         x = f()
6867      where f is pointer valued, we have to dereference the result.  */
6868   if (!se->want_pointer && !byref
6869       && ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6870           || (comp && (comp->attr.pointer || comp->attr.allocatable))))
6871     se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
6872
6873   /* f2c calling conventions require a scalar default real function to
6874      return a double precision result.  Convert this back to default
6875      real.  We only care about the cases that can happen in Fortran 77.
6876   */
6877   if (flag_f2c && sym->ts.type == BT_REAL
6878       && sym->ts.kind == gfc_default_real_kind
6879       && !sym->attr.always_explicit)
6880     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
6881
6882   /* A pure function may still have side-effects - it may modify its
6883      parameters.  */
6884   TREE_SIDE_EFFECTS (se->expr) = 1;
6885 #if 0
6886   if (!sym->attr.pure)
6887     TREE_SIDE_EFFECTS (se->expr) = 1;
6888 #endif
6889
6890   if (byref)
6891     {
6892       /* Add the function call to the pre chain.  There is no expression.  */
6893       gfc_add_expr_to_block (&se->pre, se->expr);
6894       se->expr = NULL_TREE;
6895
6896       if (!se->direct_byref)
6897         {
6898           if ((sym->attr.dimension && !comp) || (comp && comp->attr.dimension))
6899             {
6900               if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
6901                 {
6902                   /* Check the data pointer hasn't been modified.  This would
6903                      happen in a function returning a pointer.  */
6904                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
6905                   tmp = fold_build2_loc (input_location, NE_EXPR,
6906                                          logical_type_node,
6907                                          tmp, info->data);
6908                   gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
6909                                            gfc_msg_fault);
6910                 }
6911               se->expr = info->descriptor;
6912               /* Bundle in the string length.  */
6913               se->string_length = len;
6914             }
6915           else if (ts.type == BT_CHARACTER)
6916             {
6917               /* Dereference for character pointer results.  */
6918               if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6919                   || (comp && (comp->attr.pointer || comp->attr.allocatable)))
6920                 se->expr = build_fold_indirect_ref_loc (input_location, var);
6921               else
6922                 se->expr = var;
6923
6924               se->string_length = len;
6925             }
6926           else
6927             {
6928               gcc_assert (ts.type == BT_COMPLEX && flag_f2c);
6929               se->expr = build_fold_indirect_ref_loc (input_location, var);
6930             }
6931         }
6932     }
6933
6934   /* Associate the rhs class object's meta-data with the result, when the
6935      result is a temporary.  */
6936   if (args && args->expr && args->expr->ts.type == BT_CLASS
6937       && sym->ts.type == BT_CLASS && result != NULL_TREE && DECL_P (result)
6938       && !GFC_CLASS_TYPE_P (TREE_TYPE (result)))
6939     {
6940       gfc_se parmse;
6941       gfc_expr *class_expr = gfc_find_and_cut_at_last_class_ref (args->expr);
6942
6943       gfc_init_se (&parmse, NULL);
6944       parmse.data_not_needed = 1;
6945       gfc_conv_expr (&parmse, class_expr);
6946       if (!DECL_LANG_SPECIFIC (result))
6947         gfc_allocate_lang_decl (result);
6948       GFC_DECL_SAVED_DESCRIPTOR (result) = parmse.expr;
6949       gfc_free_expr (class_expr);
6950       gcc_assert (parmse.pre.head == NULL_TREE
6951                   && parmse.post.head == NULL_TREE);
6952     }
6953
6954   /* Follow the function call with the argument post block.  */
6955   if (byref)
6956     {
6957       gfc_add_block_to_block (&se->pre, &post);
6958
6959       /* Transformational functions of derived types with allocatable
6960          components must have the result allocatable components copied when the
6961          argument is actually given.  */
6962       arg = expr->value.function.actual;
6963       if (result && arg && expr->rank
6964           && expr->value.function.isym
6965           && expr->value.function.isym->transformational
6966           && arg->expr
6967           && arg->expr->ts.type == BT_DERIVED
6968           && arg->expr->ts.u.derived->attr.alloc_comp)
6969         {
6970           tree tmp2;
6971           /* Copy the allocatable components.  We have to use a
6972              temporary here to prevent source allocatable components
6973              from being corrupted.  */
6974           tmp2 = gfc_evaluate_now (result, &se->pre);
6975           tmp = gfc_copy_alloc_comp (arg->expr->ts.u.derived,
6976                                      result, tmp2, expr->rank, 0);
6977           gfc_add_expr_to_block (&se->pre, tmp);
6978           tmp = gfc_copy_allocatable_data (result, tmp2, TREE_TYPE(tmp2),
6979                                            expr->rank);
6980           gfc_add_expr_to_block (&se->pre, tmp);
6981
6982           /* Finally free the temporary's data field.  */
6983           tmp = gfc_conv_descriptor_data_get (tmp2);
6984           tmp = gfc_deallocate_with_status (tmp, NULL_TREE, NULL_TREE,
6985                                             NULL_TREE, NULL_TREE, true,
6986                                             NULL, GFC_CAF_COARRAY_NOCOARRAY);
6987           gfc_add_expr_to_block (&se->pre, tmp);
6988         }
6989     }
6990   else
6991     {
6992       /* For a function with a class array result, save the result as
6993          a temporary, set the info fields needed by the scalarizer and
6994          call the finalization function of the temporary. Note that the
6995          nullification of allocatable components needed by the result
6996          is done in gfc_trans_assignment_1.  */
6997       if (expr && ((gfc_is_class_array_function (expr)
6998                     && se->ss && se->ss->loop)
6999                    || gfc_is_alloc_class_scalar_function (expr))
7000           && se->expr && GFC_CLASS_TYPE_P (TREE_TYPE (se->expr))
7001           && expr->must_finalize)
7002         {
7003           tree final_fndecl;
7004           tree is_final;
7005           int n;
7006           if (se->ss && se->ss->loop)
7007             {
7008               gfc_add_block_to_block (&se->ss->loop->pre, &se->pre);
7009               se->expr = gfc_evaluate_now (se->expr, &se->ss->loop->pre);
7010               tmp = gfc_class_data_get (se->expr);
7011               info->descriptor = tmp;
7012               info->data = gfc_conv_descriptor_data_get (tmp);
7013               info->offset = gfc_conv_descriptor_offset_get (tmp);
7014               for (n = 0; n < se->ss->loop->dimen; n++)
7015                 {
7016                   tree dim = gfc_rank_cst[n];
7017                   se->ss->loop->to[n] = gfc_conv_descriptor_ubound_get (tmp, dim);
7018                   se->ss->loop->from[n] = gfc_conv_descriptor_lbound_get (tmp, dim);
7019                 }
7020             }
7021           else
7022             {
7023               /* TODO Eliminate the doubling of temporaries. This
7024                  one is necessary to ensure no memory leakage.  */
7025               se->expr = gfc_evaluate_now (se->expr, &se->pre);
7026               tmp = gfc_class_data_get (se->expr);
7027               tmp = gfc_conv_scalar_to_descriptor (se, tmp,
7028                         CLASS_DATA (expr->value.function.esym->result)->attr);
7029             }
7030
7031           if ((gfc_is_class_array_function (expr)
7032                || gfc_is_alloc_class_scalar_function (expr))
7033               && CLASS_DATA (expr->value.function.esym->result)->attr.pointer)
7034             goto no_finalization;
7035
7036           final_fndecl = gfc_class_vtab_final_get (se->expr);
7037           is_final = fold_build2_loc (input_location, NE_EXPR,
7038                                       logical_type_node,
7039                                       final_fndecl,
7040                                       fold_convert (TREE_TYPE (final_fndecl),
7041                                                     null_pointer_node));
7042           final_fndecl = build_fold_indirect_ref_loc (input_location,
7043                                                       final_fndecl);
7044           tmp = build_call_expr_loc (input_location,
7045                                      final_fndecl, 3,
7046                                      gfc_build_addr_expr (NULL, tmp),
7047                                      gfc_class_vtab_size_get (se->expr),
7048                                      boolean_false_node);
7049           tmp = fold_build3_loc (input_location, COND_EXPR,
7050                                  void_type_node, is_final, tmp,
7051                                  build_empty_stmt (input_location));
7052
7053           if (se->ss && se->ss->loop)
7054             {
7055               gfc_prepend_expr_to_block (&se->ss->loop->post, tmp);
7056               tmp = fold_build2_loc (input_location, NE_EXPR,
7057                                      logical_type_node,
7058                                      info->data,
7059                                      fold_convert (TREE_TYPE (info->data),
7060                                                     null_pointer_node));
7061               tmp = fold_build3_loc (input_location, COND_EXPR,
7062                                      void_type_node, tmp,
7063                                      gfc_call_free (info->data),
7064                                      build_empty_stmt (input_location));
7065               gfc_add_expr_to_block (&se->ss->loop->post, tmp);
7066             }
7067           else
7068             {
7069               tree classdata;
7070               gfc_prepend_expr_to_block (&se->post, tmp);
7071               classdata = gfc_class_data_get (se->expr);
7072               tmp = fold_build2_loc (input_location, NE_EXPR,
7073                                      logical_type_node,
7074                                      classdata,
7075                                      fold_convert (TREE_TYPE (classdata),
7076                                                     null_pointer_node));
7077               tmp = fold_build3_loc (input_location, COND_EXPR,
7078                                      void_type_node, tmp,
7079                                      gfc_call_free (classdata),
7080                                      build_empty_stmt (input_location));
7081               gfc_add_expr_to_block (&se->post, tmp);
7082             }
7083         }
7084
7085 no_finalization:
7086       gfc_add_block_to_block (&se->post, &post);
7087     }
7088
7089   return has_alternate_specifier;
7090 }
7091
7092
7093 /* Fill a character string with spaces.  */
7094
7095 static tree
7096 fill_with_spaces (tree start, tree type, tree size)
7097 {
7098   stmtblock_t block, loop;
7099   tree i, el, exit_label, cond, tmp;
7100
7101   /* For a simple char type, we can call memset().  */
7102   if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
7103     return build_call_expr_loc (input_location,
7104                             builtin_decl_explicit (BUILT_IN_MEMSET),
7105                             3, start,
7106                             build_int_cst (gfc_get_int_type (gfc_c_int_kind),
7107                                            lang_hooks.to_target_charset (' ')),
7108                                 fold_convert (size_type_node, size));
7109
7110   /* Otherwise, we use a loop:
7111         for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
7112           *el = (type) ' ';
7113    */
7114
7115   /* Initialize variables.  */
7116   gfc_init_block (&block);
7117   i = gfc_create_var (sizetype, "i");
7118   gfc_add_modify (&block, i, fold_convert (sizetype, size));
7119   el = gfc_create_var (build_pointer_type (type), "el");
7120   gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
7121   exit_label = gfc_build_label_decl (NULL_TREE);
7122   TREE_USED (exit_label) = 1;
7123
7124
7125   /* Loop body.  */
7126   gfc_init_block (&loop);
7127
7128   /* Exit condition.  */
7129   cond = fold_build2_loc (input_location, LE_EXPR, logical_type_node, i,
7130                           build_zero_cst (sizetype));
7131   tmp = build1_v (GOTO_EXPR, exit_label);
7132   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
7133                          build_empty_stmt (input_location));
7134   gfc_add_expr_to_block (&loop, tmp);
7135
7136   /* Assignment.  */
7137   gfc_add_modify (&loop,
7138                   fold_build1_loc (input_location, INDIRECT_REF, type, el),
7139                   build_int_cst (type, lang_hooks.to_target_charset (' ')));
7140
7141   /* Increment loop variables.  */
7142   gfc_add_modify (&loop, i,
7143                   fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
7144                                    TYPE_SIZE_UNIT (type)));
7145   gfc_add_modify (&loop, el,
7146                   fold_build_pointer_plus_loc (input_location,
7147                                                el, TYPE_SIZE_UNIT (type)));
7148
7149   /* Making the loop... actually loop!  */
7150   tmp = gfc_finish_block (&loop);
7151   tmp = build1_v (LOOP_EXPR, tmp);
7152   gfc_add_expr_to_block (&block, tmp);
7153
7154   /* The exit label.  */
7155   tmp = build1_v (LABEL_EXPR, exit_label);
7156   gfc_add_expr_to_block (&block, tmp);
7157
7158
7159   return gfc_finish_block (&block);
7160 }
7161
7162
7163 /* Generate code to copy a string.  */
7164
7165 void
7166 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
7167                        int dkind, tree slength, tree src, int skind)
7168 {
7169   tree tmp, dlen, slen;
7170   tree dsc;
7171   tree ssc;
7172   tree cond;
7173   tree cond2;
7174   tree tmp2;
7175   tree tmp3;
7176   tree tmp4;
7177   tree chartype;
7178   stmtblock_t tempblock;
7179
7180   gcc_assert (dkind == skind);
7181
7182   if (slength != NULL_TREE)
7183     {
7184       slen = gfc_evaluate_now (fold_convert (gfc_charlen_type_node, slength), block);
7185       ssc = gfc_string_to_single_character (slen, src, skind);
7186     }
7187   else
7188     {
7189       slen = build_one_cst (gfc_charlen_type_node);
7190       ssc =  src;
7191     }
7192
7193   if (dlength != NULL_TREE)
7194     {
7195       dlen = gfc_evaluate_now (fold_convert (gfc_charlen_type_node, dlength), block);
7196       dsc = gfc_string_to_single_character (dlen, dest, dkind);
7197     }
7198   else
7199     {
7200       dlen = build_one_cst (gfc_charlen_type_node);
7201       dsc =  dest;
7202     }
7203
7204   /* Assign directly if the types are compatible.  */
7205   if (dsc != NULL_TREE && ssc != NULL_TREE
7206       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
7207     {
7208       gfc_add_modify (block, dsc, ssc);
7209       return;
7210     }
7211
7212   /* The string copy algorithm below generates code like
7213
7214      if (destlen > 0)
7215        {
7216          if (srclen < destlen)
7217            {
7218              memmove (dest, src, srclen);
7219              // Pad with spaces.
7220              memset (&dest[srclen], ' ', destlen - srclen);
7221            }
7222          else
7223            {
7224              // Truncate if too long.
7225              memmove (dest, src, destlen);
7226            }
7227        }
7228   */
7229
7230   /* Do nothing if the destination length is zero.  */
7231   cond = fold_build2_loc (input_location, GT_EXPR, logical_type_node, dlen,
7232                           build_zero_cst (TREE_TYPE (dlen)));
7233
7234   /* For non-default character kinds, we have to multiply the string
7235      length by the base type size.  */
7236   chartype = gfc_get_char_type (dkind);
7237   slen = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (slen),
7238                           slen,
7239                           fold_convert (TREE_TYPE (slen),
7240                                         TYPE_SIZE_UNIT (chartype)));
7241   dlen = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (dlen),
7242                           dlen,
7243                           fold_convert (TREE_TYPE (dlen),
7244                                         TYPE_SIZE_UNIT (chartype)));
7245
7246   if (dlength && POINTER_TYPE_P (TREE_TYPE (dest)))
7247     dest = fold_convert (pvoid_type_node, dest);
7248   else
7249     dest = gfc_build_addr_expr (pvoid_type_node, dest);
7250
7251   if (slength && POINTER_TYPE_P (TREE_TYPE (src)))
7252     src = fold_convert (pvoid_type_node, src);
7253   else
7254     src = gfc_build_addr_expr (pvoid_type_node, src);
7255
7256   /* Truncate string if source is too long.  */
7257   cond2 = fold_build2_loc (input_location, LT_EXPR, logical_type_node, slen,
7258                            dlen);
7259
7260   /* Copy and pad with spaces.  */
7261   tmp3 = build_call_expr_loc (input_location,
7262                               builtin_decl_explicit (BUILT_IN_MEMMOVE),
7263                               3, dest, src,
7264                               fold_convert (size_type_node, slen));
7265
7266   /* Wstringop-overflow appears at -O3 even though this warning is not
7267      explicitly available in fortran nor can it be switched off. If the
7268      source length is a constant, its negative appears as a very large
7269      postive number and triggers the warning in BUILTIN_MEMSET. Fixing
7270      the result of the MINUS_EXPR suppresses this spurious warning.  */
7271   tmp = fold_build2_loc (input_location, MINUS_EXPR,
7272                          TREE_TYPE(dlen), dlen, slen);
7273   if (slength && TREE_CONSTANT (slength))
7274     tmp = gfc_evaluate_now (tmp, block);
7275
7276   tmp4 = fold_build_pointer_plus_loc (input_location, dest, slen);
7277   tmp4 = fill_with_spaces (tmp4, chartype, tmp);
7278
7279   gfc_init_block (&tempblock);
7280   gfc_add_expr_to_block (&tempblock, tmp3);
7281   gfc_add_expr_to_block (&tempblock, tmp4);
7282   tmp3 = gfc_finish_block (&tempblock);
7283
7284   /* The truncated memmove if the slen >= dlen.  */
7285   tmp2 = build_call_expr_loc (input_location,
7286                               builtin_decl_explicit (BUILT_IN_MEMMOVE),
7287                               3, dest, src,
7288                               fold_convert (size_type_node, dlen));
7289
7290   /* The whole copy_string function is there.  */
7291   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
7292                          tmp3, tmp2);
7293   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
7294                          build_empty_stmt (input_location));
7295   gfc_add_expr_to_block (block, tmp);
7296 }
7297
7298
7299 /* Translate a statement function.
7300    The value of a statement function reference is obtained by evaluating the
7301    expression using the values of the actual arguments for the values of the
7302    corresponding dummy arguments.  */
7303
7304 static void
7305 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
7306 {
7307   gfc_symbol *sym;
7308   gfc_symbol *fsym;
7309   gfc_formal_arglist *fargs;
7310   gfc_actual_arglist *args;
7311   gfc_se lse;
7312   gfc_se rse;
7313   gfc_saved_var *saved_vars;
7314   tree *temp_vars;
7315   tree type;
7316   tree tmp;
7317   int n;
7318
7319   sym = expr->symtree->n.sym;
7320   args = expr->value.function.actual;
7321   gfc_init_se (&lse, NULL);
7322   gfc_init_se (&rse, NULL);
7323
7324   n = 0;
7325   for (fargs = gfc_sym_get_dummy_args (sym); fargs; fargs = fargs->next)
7326     n++;
7327   saved_vars = XCNEWVEC (gfc_saved_var, n);
7328   temp_vars = XCNEWVEC (tree, n);
7329
7330   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
7331        fargs = fargs->next, n++)
7332     {
7333       /* Each dummy shall be specified, explicitly or implicitly, to be
7334          scalar.  */
7335       gcc_assert (fargs->sym->attr.dimension == 0);
7336       fsym = fargs->sym;
7337
7338       if (fsym->ts.type == BT_CHARACTER)
7339         {
7340           /* Copy string arguments.  */
7341           tree arglen;
7342
7343           gcc_assert (fsym->ts.u.cl && fsym->ts.u.cl->length
7344                       && fsym->ts.u.cl->length->expr_type == EXPR_CONSTANT);
7345
7346           /* Create a temporary to hold the value.  */
7347           if (fsym->ts.u.cl->backend_decl == NULL_TREE)
7348              fsym->ts.u.cl->backend_decl
7349                 = gfc_conv_constant_to_tree (fsym->ts.u.cl->length);
7350
7351           type = gfc_get_character_type (fsym->ts.kind, fsym->ts.u.cl);
7352           temp_vars[n] = gfc_create_var (type, fsym->name);
7353
7354           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
7355
7356           gfc_conv_expr (&rse, args->expr);
7357           gfc_conv_string_parameter (&rse);
7358           gfc_add_block_to_block (&se->pre, &lse.pre);
7359           gfc_add_block_to_block (&se->pre, &rse.pre);
7360
7361           gfc_trans_string_copy (&se->pre, arglen, temp_vars[n], fsym->ts.kind,
7362                                  rse.string_length, rse.expr, fsym->ts.kind);
7363           gfc_add_block_to_block (&se->pre, &lse.post);
7364           gfc_add_block_to_block (&se->pre, &rse.post);
7365         }
7366       else
7367         {
7368           /* For everything else, just evaluate the expression.  */
7369
7370           /* Create a temporary to hold the value.  */
7371           type = gfc_typenode_for_spec (&fsym->ts);
7372           temp_vars[n] = gfc_create_var (type, fsym->name);
7373
7374           gfc_conv_expr (&lse, args->expr);
7375
7376           gfc_add_block_to_block (&se->pre, &lse.pre);
7377           gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
7378           gfc_add_block_to_block (&se->pre, &lse.post);
7379         }
7380
7381       args = args->next;
7382     }
7383
7384   /* Use the temporary variables in place of the real ones.  */
7385   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
7386        fargs = fargs->next, n++)
7387     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
7388
7389   gfc_conv_expr (se, sym->value);
7390
7391   if (sym->ts.type == BT_CHARACTER)
7392     {
7393       gfc_conv_const_charlen (sym->ts.u.cl);
7394
7395       /* Force the expression to the correct length.  */
7396       if (!INTEGER_CST_P (se->string_length)
7397           || tree_int_cst_lt (se->string_length,
7398                               sym->ts.u.cl->backend_decl))
7399         {
7400           type = gfc_get_character_type (sym->ts.kind, sym->ts.u.cl);
7401           tmp = gfc_create_var (type, sym->name);
7402           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
7403           gfc_trans_string_copy (&se->pre, sym->ts.u.cl->backend_decl, tmp,
7404                                  sym->ts.kind, se->string_length, se->expr,
7405                                  sym->ts.kind);
7406           se->expr = tmp;
7407         }
7408       se->string_length = sym->ts.u.cl->backend_decl;
7409     }
7410
7411   /* Restore the original variables.  */
7412   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
7413        fargs = fargs->next, n++)
7414     gfc_restore_sym (fargs->sym, &saved_vars[n]);
7415   free (temp_vars);
7416   free (saved_vars);
7417 }
7418
7419
7420 /* Translate a function expression.  */
7421
7422 static void
7423 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
7424 {
7425   gfc_symbol *sym;
7426
7427   if (expr->value.function.isym)
7428     {
7429       gfc_conv_intrinsic_function (se, expr);
7430       return;
7431     }
7432
7433   /* expr.value.function.esym is the resolved (specific) function symbol for
7434      most functions.  However this isn't set for dummy procedures.  */
7435   sym = expr->value.function.esym;
7436   if (!sym)
7437     sym = expr->symtree->n.sym;
7438
7439   /* The IEEE_ARITHMETIC functions are caught here. */
7440   if (sym->from_intmod == INTMOD_IEEE_ARITHMETIC)
7441     if (gfc_conv_ieee_arithmetic_function (se, expr))
7442       return;
7443
7444   /* We distinguish statement functions from general functions to improve
7445      runtime performance.  */
7446   if (sym->attr.proc == PROC_ST_FUNCTION)
7447     {
7448       gfc_conv_statement_function (se, expr);
7449       return;
7450     }
7451
7452   gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr,
7453                            NULL);
7454 }
7455
7456
7457 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
7458
7459 static bool
7460 is_zero_initializer_p (gfc_expr * expr)
7461 {
7462   if (expr->expr_type != EXPR_CONSTANT)
7463     return false;
7464
7465   /* We ignore constants with prescribed memory representations for now.  */
7466   if (expr->representation.string)
7467     return false;
7468
7469   switch (expr->ts.type)
7470     {
7471     case BT_INTEGER:
7472       return mpz_cmp_si (expr->value.integer, 0) == 0;
7473
7474     case BT_REAL:
7475       return mpfr_zero_p (expr->value.real)
7476              && MPFR_SIGN (expr->value.real) >= 0;
7477
7478     case BT_LOGICAL:
7479       return expr->value.logical == 0;
7480
7481     case BT_COMPLEX:
7482       return mpfr_zero_p (mpc_realref (expr->value.complex))
7483              && MPFR_SIGN (mpc_realref (expr->value.complex)) >= 0
7484              && mpfr_zero_p (mpc_imagref (expr->value.complex))
7485              && MPFR_SIGN (mpc_imagref (expr->value.complex)) >= 0;
7486
7487     default:
7488       break;
7489     }
7490   return false;
7491 }
7492
7493
7494 static void
7495 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
7496 {
7497   gfc_ss *ss;
7498
7499   ss = se->ss;
7500   gcc_assert (ss != NULL && ss != gfc_ss_terminator);
7501   gcc_assert (ss->info->expr == expr && ss->info->type == GFC_SS_CONSTRUCTOR);
7502
7503   gfc_conv_tmp_array_ref (se);
7504 }
7505
7506
7507 /* Build a static initializer.  EXPR is the expression for the initial value.
7508    The other parameters describe the variable of the component being
7509    initialized. EXPR may be null.  */
7510
7511 tree
7512 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
7513                       bool array, bool pointer, bool procptr)
7514 {
7515   gfc_se se;
7516
7517   if (flag_coarray != GFC_FCOARRAY_LIB && ts->type == BT_DERIVED
7518       && ts->u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
7519       && ts->u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
7520     return build_constructor (type, NULL);
7521
7522   if (!(expr || pointer || procptr))
7523     return NULL_TREE;
7524
7525   /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
7526      (these are the only two iso_c_binding derived types that can be
7527      used as initialization expressions).  If so, we need to modify
7528      the 'expr' to be that for a (void *).  */
7529   if (expr != NULL && expr->ts.type == BT_DERIVED
7530       && expr->ts.is_iso_c && expr->ts.u.derived)
7531     {
7532       if (TREE_CODE (type) == ARRAY_TYPE)
7533         return build_constructor (type, NULL);
7534       else if (POINTER_TYPE_P (type))
7535         return build_int_cst (type, 0);
7536       else
7537         gcc_unreachable ();
7538     }
7539
7540   if (array && !procptr)
7541     {
7542       tree ctor;
7543       /* Arrays need special handling.  */
7544       if (pointer)
7545         ctor = gfc_build_null_descriptor (type);
7546       /* Special case assigning an array to zero.  */
7547       else if (is_zero_initializer_p (expr))
7548         ctor = build_constructor (type, NULL);
7549       else
7550         ctor = gfc_conv_array_initializer (type, expr);
7551       TREE_STATIC (ctor) = 1;
7552       return ctor;
7553     }
7554   else if (pointer || procptr)
7555     {
7556       if (ts->type == BT_CLASS && !procptr)
7557         {
7558           gfc_init_se (&se, NULL);
7559           gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1);
7560           gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR);
7561           TREE_STATIC (se.expr) = 1;
7562           return se.expr;
7563         }
7564       else if (!expr || expr->expr_type == EXPR_NULL)
7565         return fold_convert (type, null_pointer_node);
7566       else
7567         {
7568           gfc_init_se (&se, NULL);
7569           se.want_pointer = 1;
7570           gfc_conv_expr (&se, expr);
7571           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
7572           return se.expr;
7573         }
7574     }
7575   else
7576     {
7577       switch (ts->type)
7578         {
7579         case_bt_struct:
7580         case BT_CLASS:
7581           gfc_init_se (&se, NULL);
7582           if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL)
7583             gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1);
7584           else
7585             gfc_conv_structure (&se, expr, 1);
7586           gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR);
7587           TREE_STATIC (se.expr) = 1;
7588           return se.expr;
7589
7590         case BT_CHARACTER:
7591           {
7592             tree ctor = gfc_conv_string_init (ts->u.cl->backend_decl,expr);
7593             TREE_STATIC (ctor) = 1;
7594             return ctor;
7595           }
7596
7597         default:
7598           gfc_init_se (&se, NULL);
7599           gfc_conv_constant (&se, expr);
7600           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
7601           return se.expr;
7602         }
7603     }
7604 }
7605
7606 static tree
7607 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
7608 {
7609   gfc_se rse;
7610   gfc_se lse;
7611   gfc_ss *rss;
7612   gfc_ss *lss;
7613   gfc_array_info *lss_array;
7614   stmtblock_t body;
7615   stmtblock_t block;
7616   gfc_loopinfo loop;
7617   int n;
7618   tree tmp;
7619
7620   gfc_start_block (&block);
7621
7622   /* Initialize the scalarizer.  */
7623   gfc_init_loopinfo (&loop);
7624
7625   gfc_init_se (&lse, NULL);
7626   gfc_init_se (&rse, NULL);
7627
7628   /* Walk the rhs.  */
7629   rss = gfc_walk_expr (expr);
7630   if (rss == gfc_ss_terminator)
7631     /* The rhs is scalar.  Add a ss for the expression.  */
7632     rss = gfc_get_scalar_ss (gfc_ss_terminator, expr);
7633
7634   /* Create a SS for the destination.  */
7635   lss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank,
7636                           GFC_SS_COMPONENT);
7637   lss_array = &lss->info->data.array;
7638   lss_array->shape = gfc_get_shape (cm->as->rank);
7639   lss_array->descriptor = dest;
7640   lss_array->data = gfc_conv_array_data (dest);
7641   lss_array->offset = gfc_conv_array_offset (dest);
7642   for (n = 0; n < cm->as->rank; n++)
7643     {
7644       lss_array->start[n] = gfc_conv_array_lbound (dest, n);
7645       lss_array->stride[n] = gfc_index_one_node;
7646
7647       mpz_init (lss_array->shape[n]);
7648       mpz_sub (lss_array->shape[n], cm->as->upper[n]->value.integer,
7649                cm->as->lower[n]->value.integer);
7650       mpz_add_ui (lss_array->shape[n], lss_array->shape[n], 1);
7651     }
7652
7653   /* Associate the SS with the loop.  */
7654   gfc_add_ss_to_loop (&loop, lss);
7655   gfc_add_ss_to_loop (&loop, rss);
7656
7657   /* Calculate the bounds of the scalarization.  */
7658   gfc_conv_ss_startstride (&loop);
7659
7660   /* Setup the scalarizing loops.  */
7661   gfc_conv_loop_setup (&loop, &expr->where);
7662
7663   /* Setup the gfc_se structures.  */
7664   gfc_copy_loopinfo_to_se (&lse, &loop);
7665   gfc_copy_loopinfo_to_se (&rse, &loop);
7666
7667   rse.ss = rss;
7668   gfc_mark_ss_chain_used (rss, 1);
7669   lse.ss = lss;
7670   gfc_mark_ss_chain_used (lss, 1);
7671
7672   /* Start the scalarized loop body.  */
7673   gfc_start_scalarized_body (&loop, &body);
7674
7675   gfc_conv_tmp_array_ref (&lse);
7676   if (cm->ts.type == BT_CHARACTER)
7677     lse.string_length = cm->ts.u.cl->backend_decl;
7678
7679   gfc_conv_expr (&rse, expr);
7680
7681   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
7682   gfc_add_expr_to_block (&body, tmp);
7683
7684   gcc_assert (rse.ss == gfc_ss_terminator);
7685
7686   /* Generate the copying loops.  */
7687   gfc_trans_scalarizing_loops (&loop, &body);
7688
7689   /* Wrap the whole thing up.  */
7690   gfc_add_block_to_block (&block, &loop.pre);
7691   gfc_add_block_to_block (&block, &loop.post);
7692
7693   gcc_assert (lss_array->shape != NULL);
7694   gfc_free_shape (&lss_array->shape, cm->as->rank);
7695   gfc_cleanup_loop (&loop);
7696
7697   return gfc_finish_block (&block);
7698 }
7699
7700
7701 static tree
7702 gfc_trans_alloc_subarray_assign (tree dest, gfc_component * cm,
7703                                  gfc_expr * expr)
7704 {
7705   gfc_se se;
7706   stmtblock_t block;
7707   tree offset;
7708   int n;
7709   tree tmp;
7710   tree tmp2;
7711   gfc_array_spec *as;
7712   gfc_expr *arg = NULL;
7713
7714   gfc_start_block (&block);
7715   gfc_init_se (&se, NULL);
7716
7717   /* Get the descriptor for the expressions.  */
7718   se.want_pointer = 0;
7719   gfc_conv_expr_descriptor (&se, expr);
7720   gfc_add_block_to_block (&block, &se.pre);
7721   gfc_add_modify (&block, dest, se.expr);
7722
7723   /* Deal with arrays of derived types with allocatable components.  */
7724   if (gfc_bt_struct (cm->ts.type)
7725         && cm->ts.u.derived->attr.alloc_comp)
7726     // TODO: Fix caf_mode
7727     tmp = gfc_copy_alloc_comp (cm->ts.u.derived,
7728                                se.expr, dest,
7729                                cm->as->rank, 0);
7730   else if (cm->ts.type == BT_CLASS && expr->ts.type == BT_DERIVED
7731            && CLASS_DATA(cm)->attr.allocatable)
7732     {
7733       if (cm->ts.u.derived->attr.alloc_comp)
7734         // TODO: Fix caf_mode
7735         tmp = gfc_copy_alloc_comp (expr->ts.u.derived,
7736                                    se.expr, dest,
7737                                    expr->rank, 0);
7738       else
7739         {
7740           tmp = TREE_TYPE (dest);
7741           tmp = gfc_duplicate_allocatable (dest, se.expr,
7742                                            tmp, expr->rank, NULL_TREE);
7743         }
7744     }
7745   else
7746     tmp = gfc_duplicate_allocatable (dest, se.expr,
7747                                      TREE_TYPE(cm->backend_decl),
7748                                      cm->as->rank, NULL_TREE);
7749
7750   gfc_add_expr_to_block (&block, tmp);
7751   gfc_add_block_to_block (&block, &se.post);
7752
7753   if (expr->expr_type != EXPR_VARIABLE)
7754     gfc_conv_descriptor_data_set (&block, se.expr,
7755                                   null_pointer_node);
7756
7757   /* We need to know if the argument of a conversion function is a
7758      variable, so that the correct lower bound can be used.  */
7759   if (expr->expr_type == EXPR_FUNCTION
7760         && expr->value.function.isym
7761         && expr->value.function.isym->conversion
7762         && expr->value.function.actual->expr
7763         && expr->value.function.actual->expr->expr_type == EXPR_VARIABLE)
7764     arg = expr->value.function.actual->expr;
7765
7766   /* Obtain the array spec of full array references.  */
7767   if (arg)
7768     as = gfc_get_full_arrayspec_from_expr (arg);
7769   else
7770     as = gfc_get_full_arrayspec_from_expr (expr);
7771
7772   /* Shift the lbound and ubound of temporaries to being unity,
7773      rather than zero, based. Always calculate the offset.  */
7774   offset = gfc_conv_descriptor_offset_get (dest);
7775   gfc_add_modify (&block, offset, gfc_index_zero_node);
7776   tmp2 =gfc_create_var (gfc_array_index_type, NULL);
7777
7778   for (n = 0; n < expr->rank; n++)
7779     {
7780       tree span;
7781       tree lbound;
7782
7783       /* Obtain the correct lbound - ISO/IEC TR 15581:2001 page 9.
7784          TODO It looks as if gfc_conv_expr_descriptor should return
7785          the correct bounds and that the following should not be
7786          necessary.  This would simplify gfc_conv_intrinsic_bound
7787          as well.  */
7788       if (as && as->lower[n])
7789         {
7790           gfc_se lbse;
7791           gfc_init_se (&lbse, NULL);
7792           gfc_conv_expr (&lbse, as->lower[n]);
7793           gfc_add_block_to_block (&block, &lbse.pre);
7794           lbound = gfc_evaluate_now (lbse.expr, &block);
7795         }
7796       else if (as && arg)
7797         {
7798           tmp = gfc_get_symbol_decl (arg->symtree->n.sym);
7799           lbound = gfc_conv_descriptor_lbound_get (tmp,
7800                                         gfc_rank_cst[n]);
7801         }
7802       else if (as)
7803         lbound = gfc_conv_descriptor_lbound_get (dest,
7804                                                 gfc_rank_cst[n]);
7805       else
7806         lbound = gfc_index_one_node;
7807
7808       lbound = fold_convert (gfc_array_index_type, lbound);
7809
7810       /* Shift the bounds and set the offset accordingly.  */
7811       tmp = gfc_conv_descriptor_ubound_get (dest, gfc_rank_cst[n]);
7812       span = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
7813                 tmp, gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]));
7814       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
7815                              span, lbound);
7816       gfc_conv_descriptor_ubound_set (&block, dest,
7817                                       gfc_rank_cst[n], tmp);
7818       gfc_conv_descriptor_lbound_set (&block, dest,
7819                                       gfc_rank_cst[n], lbound);
7820
7821       tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
7822                          gfc_conv_descriptor_lbound_get (dest,
7823                                                          gfc_rank_cst[n]),
7824                          gfc_conv_descriptor_stride_get (dest,
7825                                                          gfc_rank_cst[n]));
7826       gfc_add_modify (&block, tmp2, tmp);
7827       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
7828                              offset, tmp2);
7829       gfc_conv_descriptor_offset_set (&block, dest, tmp);
7830     }
7831
7832   if (arg)
7833     {
7834       /* If a conversion expression has a null data pointer
7835          argument, nullify the allocatable component.  */
7836       tree non_null_expr;
7837       tree null_expr;
7838
7839       if (arg->symtree->n.sym->attr.allocatable
7840             || arg->symtree->n.sym->attr.pointer)
7841         {
7842           non_null_expr = gfc_finish_block (&block);
7843           gfc_start_block (&block);
7844           gfc_conv_descriptor_data_set (&block, dest,
7845                                         null_pointer_node);
7846           null_expr = gfc_finish_block (&block);
7847           tmp = gfc_conv_descriptor_data_get (arg->symtree->n.sym->backend_decl);
7848           tmp = build2_loc (input_location, EQ_EXPR, logical_type_node, tmp,
7849                             fold_convert (TREE_TYPE (tmp), null_pointer_node));
7850           return build3_v (COND_EXPR, tmp,
7851                            null_expr, non_null_expr);
7852         }
7853     }
7854
7855   return gfc_finish_block (&block);
7856 }
7857
7858
7859 /* Allocate or reallocate scalar component, as necessary.  */
7860
7861 static void
7862 alloc_scalar_allocatable_for_subcomponent_assignment (stmtblock_t *block,
7863                                                       tree comp,
7864                                                       gfc_component *cm,
7865                                                       gfc_expr *expr2,
7866                                                       gfc_symbol *sym)
7867 {
7868   tree tmp;
7869   tree ptr;
7870   tree size;
7871   tree size_in_bytes;
7872   tree lhs_cl_size = NULL_TREE;
7873
7874   if (!comp)
7875     return;
7876
7877   if (!expr2 || expr2->rank)
7878     return;
7879
7880   realloc_lhs_warning (expr2->ts.type, false, &expr2->where);
7881
7882   if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
7883     {
7884       char name[GFC_MAX_SYMBOL_LEN+9];
7885       gfc_component *strlen;
7886       /* Use the rhs string length and the lhs element size.  */
7887       gcc_assert (expr2->ts.type == BT_CHARACTER);
7888       if (!expr2->ts.u.cl->backend_decl)
7889         {
7890           gfc_conv_string_length (expr2->ts.u.cl, expr2, block);
7891           gcc_assert (expr2->ts.u.cl->backend_decl);
7892         }
7893
7894       size = expr2->ts.u.cl->backend_decl;
7895
7896       /* Ensure that cm->ts.u.cl->backend_decl is a componentref to _%s_length
7897          component.  */
7898       sprintf (name, "_%s_length", cm->name);
7899       strlen = gfc_find_component (sym, name, true, true, NULL);
7900       lhs_cl_size = fold_build3_loc (input_location, COMPONENT_REF,
7901                                      gfc_charlen_type_node,
7902                                      TREE_OPERAND (comp, 0),
7903                                      strlen->backend_decl, NULL_TREE);
7904
7905       tmp = TREE_TYPE (gfc_typenode_for_spec (&cm->ts));
7906       tmp = TYPE_SIZE_UNIT (tmp);
7907       size_in_bytes = fold_build2_loc (input_location, MULT_EXPR,
7908                                        TREE_TYPE (tmp), tmp,
7909                                        fold_convert (TREE_TYPE (tmp), size));
7910     }
7911   else if (cm->ts.type == BT_CLASS)
7912     {
7913       gcc_assert (expr2->ts.type == BT_CLASS || expr2->ts.type == BT_DERIVED);
7914       if (expr2->ts.type == BT_DERIVED)
7915         {
7916           tmp = gfc_get_symbol_decl (expr2->ts.u.derived);
7917           size = TYPE_SIZE_UNIT (tmp);
7918         }
7919       else
7920         {
7921           gfc_expr *e2vtab;
7922           gfc_se se;
7923           e2vtab = gfc_find_and_cut_at_last_class_ref (expr2);
7924           gfc_add_vptr_component (e2vtab);
7925           gfc_add_size_component (e2vtab);
7926           gfc_init_se (&se, NULL);
7927           gfc_conv_expr (&se, e2vtab);
7928           gfc_add_block_to_block (block, &se.pre);
7929           size = fold_convert (size_type_node, se.expr);
7930           gfc_free_expr (e2vtab);
7931         }
7932       size_in_bytes = size;
7933     }
7934   else
7935     {
7936       /* Otherwise use the length in bytes of the rhs.  */
7937       size = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&cm->ts));
7938       size_in_bytes = size;
7939     }
7940
7941   size_in_bytes = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
7942                                    size_in_bytes, size_one_node);
7943
7944   if (cm->ts.type == BT_DERIVED && cm->ts.u.derived->attr.alloc_comp)
7945     {
7946       tmp = build_call_expr_loc (input_location,
7947                                  builtin_decl_explicit (BUILT_IN_CALLOC),
7948                                  2, build_one_cst (size_type_node),
7949                                  size_in_bytes);
7950       tmp = fold_convert (TREE_TYPE (comp), tmp);
7951       gfc_add_modify (block, comp, tmp);
7952     }
7953   else
7954     {
7955       tmp = build_call_expr_loc (input_location,
7956                                  builtin_decl_explicit (BUILT_IN_MALLOC),
7957                                  1, size_in_bytes);
7958       if (GFC_CLASS_TYPE_P (TREE_TYPE (comp)))
7959         ptr = gfc_class_data_get (comp);
7960       else
7961         ptr = comp;
7962       tmp = fold_convert (TREE_TYPE (ptr), tmp);
7963       gfc_add_modify (block, ptr, tmp);
7964     }
7965
7966   if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
7967     /* Update the lhs character length.  */
7968     gfc_add_modify (block, lhs_cl_size,
7969                     fold_convert (TREE_TYPE (lhs_cl_size), size));
7970 }
7971
7972
7973 /* Assign a single component of a derived type constructor.  */
7974
7975 static tree
7976 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr,
7977                                gfc_symbol *sym, bool init)
7978 {
7979   gfc_se se;
7980   gfc_se lse;
7981   stmtblock_t block;
7982   tree tmp;
7983   tree vtab;
7984
7985   gfc_start_block (&block);
7986
7987   if (cm->attr.pointer || cm->attr.proc_pointer)
7988     {
7989       /* Only care about pointers here, not about allocatables.  */
7990       gfc_init_se (&se, NULL);
7991       /* Pointer component.  */
7992       if ((cm->attr.dimension || cm->attr.codimension)
7993           && !cm->attr.proc_pointer)
7994         {
7995           /* Array pointer.  */
7996           if (expr->expr_type == EXPR_NULL)
7997             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
7998           else
7999             {
8000               se.direct_byref = 1;
8001               se.expr = dest;
8002               gfc_conv_expr_descriptor (&se, expr);
8003               gfc_add_block_to_block (&block, &se.pre);
8004               gfc_add_block_to_block (&block, &se.post);
8005             }
8006         }
8007       else
8008         {
8009           /* Scalar pointers.  */
8010           se.want_pointer = 1;
8011           gfc_conv_expr (&se, expr);
8012           gfc_add_block_to_block (&block, &se.pre);
8013
8014           if (expr->symtree && expr->symtree->n.sym->attr.proc_pointer
8015               && expr->symtree->n.sym->attr.dummy)
8016             se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
8017
8018           gfc_add_modify (&block, dest,
8019                                fold_convert (TREE_TYPE (dest), se.expr));
8020           gfc_add_block_to_block (&block, &se.post);
8021         }
8022     }
8023   else if (cm->ts.type == BT_CLASS && expr->expr_type == EXPR_NULL)
8024     {
8025       /* NULL initialization for CLASS components.  */
8026       tmp = gfc_trans_structure_assign (dest,
8027                                         gfc_class_initializer (&cm->ts, expr),
8028                                         false);
8029       gfc_add_expr_to_block (&block, tmp);
8030     }
8031   else if ((cm->attr.dimension || cm->attr.codimension)
8032            && !cm->attr.proc_pointer)
8033     {
8034       if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
8035         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
8036       else if (cm->attr.allocatable || cm->attr.pdt_array)
8037         {
8038           tmp = gfc_trans_alloc_subarray_assign (dest, cm, expr);
8039           gfc_add_expr_to_block (&block, tmp);
8040         }
8041       else
8042         {
8043           tmp = gfc_trans_subarray_assign (dest, cm, expr);
8044           gfc_add_expr_to_block (&block, tmp);
8045         }
8046     }
8047   else if (cm->ts.type == BT_CLASS
8048            && CLASS_DATA (cm)->attr.dimension
8049            && CLASS_DATA (cm)->attr.allocatable
8050            && expr->ts.type == BT_DERIVED)
8051     {
8052       vtab = gfc_get_symbol_decl (gfc_find_vtab (&expr->ts));
8053       vtab = gfc_build_addr_expr (NULL_TREE, vtab);
8054       tmp = gfc_class_vptr_get (dest);
8055       gfc_add_modify (&block, tmp,
8056                       fold_convert (TREE_TYPE (tmp), vtab));
8057       tmp = gfc_class_data_get (dest);
8058       tmp = gfc_trans_alloc_subarray_assign (tmp, cm, expr);
8059       gfc_add_expr_to_block (&block, tmp);
8060     }
8061   else if (init && cm->attr.allocatable && expr->expr_type == EXPR_NULL)
8062     {
8063       /* NULL initialization for allocatable components.  */
8064       gfc_add_modify (&block, dest, fold_convert (TREE_TYPE (dest),
8065                                                   null_pointer_node));
8066     }
8067   else if (init && (cm->attr.allocatable
8068            || (cm->ts.type == BT_CLASS && CLASS_DATA (cm)->attr.allocatable
8069                && expr->ts.type != BT_CLASS)))
8070     {
8071       /* Take care about non-array allocatable components here.  The alloc_*
8072          routine below is motivated by the alloc_scalar_allocatable_for_
8073          assignment() routine, but with the realloc portions removed and
8074          different input.  */
8075       alloc_scalar_allocatable_for_subcomponent_assignment (&block,
8076                                                             dest,
8077                                                             cm,
8078                                                             expr,
8079                                                             sym);
8080       /* The remainder of these instructions follow the if (cm->attr.pointer)
8081          if (!cm->attr.dimension) part above.  */
8082       gfc_init_se (&se, NULL);
8083       gfc_conv_expr (&se, expr);
8084       gfc_add_block_to_block (&block, &se.pre);
8085
8086       if (expr->symtree && expr->symtree->n.sym->attr.proc_pointer
8087           && expr->symtree->n.sym->attr.dummy)
8088         se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
8089
8090       if (cm->ts.type == BT_CLASS && expr->ts.type == BT_DERIVED)
8091         {
8092           tmp = gfc_class_data_get (dest);
8093           tmp = build_fold_indirect_ref_loc (input_location, tmp);
8094           vtab = gfc_get_symbol_decl (gfc_find_vtab (&expr->ts));
8095           vtab = gfc_build_addr_expr (NULL_TREE, vtab);
8096           gfc_add_modify (&block, gfc_class_vptr_get (dest),
8097                  fold_convert (TREE_TYPE (gfc_class_vptr_get (dest)), vtab));
8098         }
8099       else
8100         tmp = build_fold_indirect_ref_loc (input_location, dest);
8101
8102       /* For deferred strings insert a memcpy.  */
8103       if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
8104         {
8105           tree size;
8106           gcc_assert (se.string_length || expr->ts.u.cl->backend_decl);
8107           size = size_of_string_in_bytes (cm->ts.kind, se.string_length
8108                                                 ? se.string_length
8109                                                 : expr->ts.u.cl->backend_decl);
8110           tmp = gfc_build_memcpy_call (tmp, se.expr, size);
8111           gfc_add_expr_to_block (&block, tmp);
8112         }
8113       else
8114         gfc_add_modify (&block, tmp,
8115                         fold_convert (TREE_TYPE (tmp), se.expr));
8116       gfc_add_block_to_block (&block, &se.post);
8117     }
8118   else if (expr->ts.type == BT_UNION)
8119     {
8120       tree tmp;
8121       gfc_constructor *c = gfc_constructor_first (expr->value.constructor);
8122       /* We mark that the entire union should be initialized with a contrived
8123          EXPR_NULL expression at the beginning.  */
8124       if (c != NULL && c->n.component == NULL
8125           && c->expr != NULL && c->expr->expr_type == EXPR_NULL)
8126         {
8127           tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
8128                             dest, build_constructor (TREE_TYPE (dest), NULL));
8129           gfc_add_expr_to_block (&block, tmp);
8130           c = gfc_constructor_next (c);
8131         }
8132       /* The following constructor expression, if any, represents a specific
8133          map intializer, as given by the user.  */
8134       if (c != NULL && c->expr != NULL)
8135         {
8136           gcc_assert (expr->expr_type == EXPR_STRUCTURE);
8137           tmp = gfc_trans_structure_assign (dest, expr, expr->symtree != NULL);
8138           gfc_add_expr_to_block (&block, tmp);
8139         }
8140     }
8141   else if (expr->ts.type == BT_DERIVED && expr->ts.f90_type != BT_VOID)
8142     {
8143       if (expr->expr_type != EXPR_STRUCTURE)
8144         {
8145           tree dealloc = NULL_TREE;
8146           gfc_init_se (&se, NULL);
8147           gfc_conv_expr (&se, expr);
8148           gfc_add_block_to_block (&block, &se.pre);
8149           /* Prevent repeat evaluations in gfc_copy_alloc_comp by fixing the
8150              expression in  a temporary variable and deallocate the allocatable
8151              components. Then we can the copy the expression to the result.  */
8152           if (cm->ts.u.derived->attr.alloc_comp
8153               && expr->expr_type != EXPR_VARIABLE)
8154             {
8155               se.expr = gfc_evaluate_now (se.expr, &block);
8156               dealloc = gfc_deallocate_alloc_comp (cm->ts.u.derived, se.expr,
8157                                                    expr->rank);
8158             }
8159           gfc_add_modify (&block, dest,
8160                           fold_convert (TREE_TYPE (dest), se.expr));
8161           if (cm->ts.u.derived->attr.alloc_comp
8162               && expr->expr_type != EXPR_NULL)
8163             {
8164               // TODO: Fix caf_mode
8165               tmp = gfc_copy_alloc_comp (cm->ts.u.derived, se.expr,
8166                                          dest, expr->rank, 0);
8167               gfc_add_expr_to_block (&block, tmp);
8168               if (dealloc != NULL_TREE)
8169                 gfc_add_expr_to_block (&block, dealloc);
8170             }
8171           gfc_add_block_to_block (&block, &se.post);
8172         }
8173       else
8174         {
8175           /* Nested constructors.  */
8176           tmp = gfc_trans_structure_assign (dest, expr, expr->symtree != NULL);
8177           gfc_add_expr_to_block (&block, tmp);
8178         }
8179     }
8180   else if (gfc_deferred_strlen (cm, &tmp))
8181     {
8182       tree strlen;
8183       strlen = tmp;
8184       gcc_assert (strlen);
8185       strlen = fold_build3_loc (input_location, COMPONENT_REF,
8186                                 TREE_TYPE (strlen),
8187                                 TREE_OPERAND (dest, 0),
8188                                 strlen, NULL_TREE);
8189
8190       if (expr->expr_type == EXPR_NULL)
8191         {
8192           tmp = build_int_cst (TREE_TYPE (cm->backend_decl), 0);
8193           gfc_add_modify (&block, dest, tmp);
8194           tmp = build_int_cst (TREE_TYPE (strlen), 0);
8195           gfc_add_modify (&block, strlen, tmp);
8196         }
8197       else
8198         {
8199           tree size;
8200           gfc_init_se (&se, NULL);
8201           gfc_conv_expr (&se, expr);
8202           size = size_of_string_in_bytes (cm->ts.kind, se.string_length);
8203           tmp = build_call_expr_loc (input_location,
8204                                      builtin_decl_explicit (BUILT_IN_MALLOC),
8205                                      1, size);
8206           gfc_add_modify (&block, dest,
8207                           fold_convert (TREE_TYPE (dest), tmp));
8208           gfc_add_modify (&block, strlen,
8209                           fold_convert (TREE_TYPE (strlen), se.string_length));
8210           tmp = gfc_build_memcpy_call (dest, se.expr, size);
8211           gfc_add_expr_to_block (&block, tmp);
8212         }
8213     }
8214   else if (!cm->attr.artificial)
8215     {
8216       /* Scalar component (excluding deferred parameters).  */
8217       gfc_init_se (&se, NULL);
8218       gfc_init_se (&lse, NULL);
8219
8220       gfc_conv_expr (&se, expr);
8221       if (cm->ts.type == BT_CHARACTER)
8222         lse.string_length = cm->ts.u.cl->backend_decl;
8223       lse.expr = dest;
8224       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, false, false);
8225       gfc_add_expr_to_block (&block, tmp);
8226     }
8227   return gfc_finish_block (&block);
8228 }
8229
8230 /* Assign a derived type constructor to a variable.  */
8231
8232 tree
8233 gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray)
8234 {
8235   gfc_constructor *c;
8236   gfc_component *cm;
8237   stmtblock_t block;
8238   tree field;
8239   tree tmp;
8240   gfc_se se;
8241
8242   gfc_start_block (&block);
8243   cm = expr->ts.u.derived->components;
8244
8245   if (expr->ts.u.derived->from_intmod == INTMOD_ISO_C_BINDING
8246       && (expr->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR
8247           || expr->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR))
8248     {
8249       gfc_se lse;
8250
8251       gfc_init_se (&se, NULL);
8252       gfc_init_se (&lse, NULL);
8253       gfc_conv_expr (&se, gfc_constructor_first (expr->value.constructor)->expr);
8254       lse.expr = dest;
8255       gfc_add_modify (&block, lse.expr,
8256                       fold_convert (TREE_TYPE (lse.expr), se.expr));
8257
8258       return gfc_finish_block (&block);
8259     }
8260
8261   if (coarray)
8262     gfc_init_se (&se, NULL);
8263
8264   for (c = gfc_constructor_first (expr->value.constructor);
8265        c; c = gfc_constructor_next (c), cm = cm->next)
8266     {
8267       /* Skip absent members in default initializers.  */
8268       if (!c->expr && !cm->attr.allocatable)
8269         continue;
8270
8271       /* Register the component with the caf-lib before it is initialized.
8272          Register only allocatable components, that are not coarray'ed
8273          components (%comp[*]).  Only register when the constructor is not the
8274          null-expression.  */
8275       if (coarray && !cm->attr.codimension
8276           && (cm->attr.allocatable || cm->attr.pointer)
8277           && (!c->expr || c->expr->expr_type == EXPR_NULL))
8278         {
8279           tree token, desc, size;
8280           bool is_array = cm->ts.type == BT_CLASS
8281               ? CLASS_DATA (cm)->attr.dimension : cm->attr.dimension;
8282
8283           field = cm->backend_decl;
8284           field = fold_build3_loc (input_location, COMPONENT_REF,
8285                                    TREE_TYPE (field), dest, field, NULL_TREE);
8286           if (cm->ts.type == BT_CLASS)
8287             field = gfc_class_data_get (field);
8288
8289           token = is_array ? gfc_conv_descriptor_token (field)
8290                            : fold_build3_loc (input_location, COMPONENT_REF,
8291                                               TREE_TYPE (cm->caf_token), dest,
8292                                               cm->caf_token, NULL_TREE);
8293
8294           if (is_array)
8295             {
8296               /* The _caf_register routine looks at the rank of the array
8297                  descriptor to decide whether the data registered is an array
8298                  or not.  */
8299               int rank = cm->ts.type == BT_CLASS ? CLASS_DATA (cm)->as->rank
8300                                                  : cm->as->rank;
8301               /* When the rank is not known just set a positive rank, which
8302                  suffices to recognize the data as array.  */
8303               if (rank < 0)
8304                 rank = 1;
8305               size = build_zero_cst (size_type_node);
8306               desc = field;
8307               gfc_add_modify (&block, gfc_conv_descriptor_rank (desc),
8308                               build_int_cst (signed_char_type_node, rank));
8309             }
8310           else
8311             {
8312               desc = gfc_conv_scalar_to_descriptor (&se, field,
8313                                                     cm->ts.type == BT_CLASS
8314                                                     ? CLASS_DATA (cm)->attr
8315                                                     : cm->attr);
8316               size = TYPE_SIZE_UNIT (TREE_TYPE (field));
8317             }
8318           gfc_add_block_to_block (&block, &se.pre);
8319           tmp =  build_call_expr_loc (input_location, gfor_fndecl_caf_register,
8320                                       7, size, build_int_cst (
8321                                         integer_type_node,
8322                                         GFC_CAF_COARRAY_ALLOC_REGISTER_ONLY),
8323                                       gfc_build_addr_expr (pvoid_type_node,
8324                                                            token),
8325                                       gfc_build_addr_expr (NULL_TREE, desc),
8326                                       null_pointer_node, null_pointer_node,
8327                                       integer_zero_node);
8328           gfc_add_expr_to_block (&block, tmp);
8329         }
8330       field = cm->backend_decl;
8331       tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
8332                              dest, field, NULL_TREE);
8333       if (!c->expr)
8334         {
8335           gfc_expr *e = gfc_get_null_expr (NULL);
8336           tmp = gfc_trans_subcomponent_assign (tmp, cm, e, expr->ts.u.derived,
8337                                                init);
8338           gfc_free_expr (e);
8339         }
8340       else
8341         tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr,
8342                                              expr->ts.u.derived, init);
8343       gfc_add_expr_to_block (&block, tmp);
8344     }
8345   return gfc_finish_block (&block);
8346 }
8347
8348 void
8349 gfc_conv_union_initializer (vec<constructor_elt, va_gc> *v,
8350                             gfc_component *un, gfc_expr *init)
8351 {
8352   gfc_constructor *ctor;
8353
8354   if (un->ts.type != BT_UNION || un == NULL || init == NULL)
8355     return;
8356
8357   ctor = gfc_constructor_first (init->value.constructor);
8358
8359   if (ctor == NULL || ctor->expr == NULL)
8360     return;
8361
8362   gcc_assert (init->expr_type == EXPR_STRUCTURE);
8363
8364   /* If we have an 'initialize all' constructor, do it first.  */
8365   if (ctor->expr->expr_type == EXPR_NULL)
8366     {
8367       tree union_type = TREE_TYPE (un->backend_decl);
8368       tree val = build_constructor (union_type, NULL);
8369       CONSTRUCTOR_APPEND_ELT (v, un->backend_decl, val);
8370       ctor = gfc_constructor_next (ctor);
8371     }
8372
8373   /* Add the map initializer on top.  */
8374   if (ctor != NULL && ctor->expr != NULL)
8375     {
8376       gcc_assert (ctor->expr->expr_type == EXPR_STRUCTURE);
8377       tree val = gfc_conv_initializer (ctor->expr, &un->ts,
8378                                        TREE_TYPE (un->backend_decl),
8379                                        un->attr.dimension, un->attr.pointer,
8380                                        un->attr.proc_pointer);
8381       CONSTRUCTOR_APPEND_ELT (v, un->backend_decl, val);
8382     }
8383 }
8384
8385 /* Build an expression for a constructor. If init is nonzero then
8386    this is part of a static variable initializer.  */
8387
8388 void
8389 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
8390 {
8391   gfc_constructor *c;
8392   gfc_component *cm;
8393   tree val;
8394   tree type;
8395   tree tmp;
8396   vec<constructor_elt, va_gc> *v = NULL;
8397
8398   gcc_assert (se->ss == NULL);
8399   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
8400   type = gfc_typenode_for_spec (&expr->ts);
8401
8402   if (!init)
8403     {
8404       /* Create a temporary variable and fill it in.  */
8405       se->expr = gfc_create_var (type, expr->ts.u.derived->name);
8406       /* The symtree in expr is NULL, if the code to generate is for
8407          initializing the static members only.  */
8408       tmp = gfc_trans_structure_assign (se->expr, expr, expr->symtree != NULL,
8409                                         se->want_coarray);
8410       gfc_add_expr_to_block (&se->pre, tmp);
8411       return;
8412     }
8413
8414   cm = expr->ts.u.derived->components;
8415
8416   for (c = gfc_constructor_first (expr->value.constructor);
8417        c; c = gfc_constructor_next (c), cm = cm->next)
8418     {
8419       /* Skip absent members in default initializers and allocatable
8420          components.  Although the latter have a default initializer
8421          of EXPR_NULL,... by default, the static nullify is not needed
8422          since this is done every time we come into scope.  */
8423       if (!c->expr || (cm->attr.allocatable && cm->attr.flavor != FL_PROCEDURE))
8424         continue;
8425
8426       if (cm->initializer && cm->initializer->expr_type != EXPR_NULL
8427           && strcmp (cm->name, "_extends") == 0
8428           && cm->initializer->symtree)
8429         {
8430           tree vtab;
8431           gfc_symbol *vtabs;
8432           vtabs = cm->initializer->symtree->n.sym;
8433           vtab = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtabs));
8434           vtab = unshare_expr_without_location (vtab);
8435           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, vtab);
8436         }
8437       else if (cm->ts.u.derived && strcmp (cm->name, "_size") == 0)
8438         {
8439           val = TYPE_SIZE_UNIT (gfc_get_derived_type (cm->ts.u.derived));
8440           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl,
8441                                   fold_convert (TREE_TYPE (cm->backend_decl),
8442                                                 val));
8443         }
8444       else if (cm->ts.type == BT_INTEGER && strcmp (cm->name, "_len") == 0)
8445         CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl,
8446                                 fold_convert (TREE_TYPE (cm->backend_decl),
8447                                               integer_zero_node));
8448       else if (cm->ts.type == BT_UNION)
8449         gfc_conv_union_initializer (v, cm, c->expr);
8450       else
8451         {
8452           val = gfc_conv_initializer (c->expr, &cm->ts,
8453                                       TREE_TYPE (cm->backend_decl),
8454                                       cm->attr.dimension, cm->attr.pointer,
8455                                       cm->attr.proc_pointer);
8456           val = unshare_expr_without_location (val);
8457
8458           /* Append it to the constructor list.  */
8459           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
8460         }
8461     }
8462
8463   se->expr = build_constructor (type, v);
8464   if (init)
8465     TREE_CONSTANT (se->expr) = 1;
8466 }
8467
8468
8469 /* Translate a substring expression.  */
8470
8471 static void
8472 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
8473 {
8474   gfc_ref *ref;
8475
8476   ref = expr->ref;
8477
8478   gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
8479
8480   se->expr = gfc_build_wide_string_const (expr->ts.kind,
8481                                           expr->value.character.length,
8482                                           expr->value.character.string);
8483
8484   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
8485   TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
8486
8487   if (ref)
8488     gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
8489 }
8490
8491
8492 /* Entry point for expression translation.  Evaluates a scalar quantity.
8493    EXPR is the expression to be translated, and SE is the state structure if
8494    called from within the scalarized.  */
8495
8496 void
8497 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
8498 {
8499   gfc_ss *ss;
8500
8501   ss = se->ss;
8502   if (ss && ss->info->expr == expr
8503       && (ss->info->type == GFC_SS_SCALAR
8504           || ss->info->type == GFC_SS_REFERENCE))
8505     {
8506       gfc_ss_info *ss_info;
8507
8508       ss_info = ss->info;
8509       /* Substitute a scalar expression evaluated outside the scalarization
8510          loop.  */
8511       se->expr = ss_info->data.scalar.value;
8512       if (gfc_scalar_elemental_arg_saved_as_reference (ss_info))
8513         se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
8514
8515       se->string_length = ss_info->string_length;
8516       gfc_advance_se_ss_chain (se);
8517       return;
8518     }
8519
8520   /* We need to convert the expressions for the iso_c_binding derived types.
8521      C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
8522      null_pointer_node.  C_PTR and C_FUNPTR are converted to match the
8523      typespec for the C_PTR and C_FUNPTR symbols, which has already been
8524      updated to be an integer with a kind equal to the size of a (void *).  */
8525   if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->ts.f90_type == BT_VOID
8526       && expr->ts.u.derived->attr.is_bind_c)
8527     {
8528       if (expr->expr_type == EXPR_VARIABLE
8529           && (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
8530               || expr->symtree->n.sym->intmod_sym_id
8531                  == ISOCBINDING_NULL_FUNPTR))
8532         {
8533           /* Set expr_type to EXPR_NULL, which will result in
8534              null_pointer_node being used below.  */
8535           expr->expr_type = EXPR_NULL;
8536         }
8537       else
8538         {
8539           /* Update the type/kind of the expression to be what the new
8540              type/kind are for the updated symbols of C_PTR/C_FUNPTR.  */
8541           expr->ts.type = BT_INTEGER;
8542           expr->ts.f90_type = BT_VOID;
8543           expr->ts.kind = gfc_index_integer_kind;
8544         }
8545     }
8546
8547   gfc_fix_class_refs (expr);
8548
8549   switch (expr->expr_type)
8550     {
8551     case EXPR_OP:
8552       gfc_conv_expr_op (se, expr);
8553       break;
8554
8555     case EXPR_FUNCTION:
8556       gfc_conv_function_expr (se, expr);
8557       break;
8558
8559     case EXPR_CONSTANT:
8560       gfc_conv_constant (se, expr);
8561       break;
8562
8563     case EXPR_VARIABLE:
8564       gfc_conv_variable (se, expr);
8565       break;
8566
8567     case EXPR_NULL:
8568       se->expr = null_pointer_node;
8569       break;
8570
8571     case EXPR_SUBSTRING:
8572       gfc_conv_substring_expr (se, expr);
8573       break;
8574
8575     case EXPR_STRUCTURE:
8576       gfc_conv_structure (se, expr, 0);
8577       break;
8578
8579     case EXPR_ARRAY:
8580       gfc_conv_array_constructor_expr (se, expr);
8581       break;
8582
8583     default:
8584       gcc_unreachable ();
8585       break;
8586     }
8587 }
8588
8589 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
8590    of an assignment.  */
8591 void
8592 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
8593 {
8594   gfc_conv_expr (se, expr);
8595   /* All numeric lvalues should have empty post chains.  If not we need to
8596      figure out a way of rewriting an lvalue so that it has no post chain.  */
8597   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
8598 }
8599
8600 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
8601    numeric expressions.  Used for scalar values where inserting cleanup code
8602    is inconvenient.  */
8603 void
8604 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
8605 {
8606   tree val;
8607
8608   gcc_assert (expr->ts.type != BT_CHARACTER);
8609   gfc_conv_expr (se, expr);
8610   if (se->post.head)
8611     {
8612       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
8613       gfc_add_modify (&se->pre, val, se->expr);
8614       se->expr = val;
8615       gfc_add_block_to_block (&se->pre, &se->post);
8616     }
8617 }
8618
8619 /* Helper to translate an expression and convert it to a particular type.  */
8620 void
8621 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
8622 {
8623   gfc_conv_expr_val (se, expr);
8624   se->expr = convert (type, se->expr);
8625 }
8626
8627
8628 /* Converts an expression so that it can be passed by reference.  Scalar
8629    values only.  */
8630
8631 void
8632 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr, bool add_clobber)
8633 {
8634   gfc_ss *ss;
8635   tree var;
8636
8637   ss = se->ss;
8638   if (ss && ss->info->expr == expr
8639       && ss->info->type == GFC_SS_REFERENCE)
8640     {
8641       /* Returns a reference to the scalar evaluated outside the loop
8642          for this case.  */
8643       gfc_conv_expr (se, expr);
8644
8645       if (expr->ts.type == BT_CHARACTER
8646           && expr->expr_type != EXPR_FUNCTION)
8647         gfc_conv_string_parameter (se);
8648      else
8649         se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
8650
8651       return;
8652     }
8653
8654   if (expr->ts.type == BT_CHARACTER)
8655     {
8656       gfc_conv_expr (se, expr);
8657       gfc_conv_string_parameter (se);
8658       return;
8659     }
8660
8661   if (expr->expr_type == EXPR_VARIABLE)
8662     {
8663       se->want_pointer = 1;
8664       gfc_conv_expr (se, expr);
8665       if (se->post.head)
8666         {
8667           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
8668           gfc_add_modify (&se->pre, var, se->expr);
8669           gfc_add_block_to_block (&se->pre, &se->post);
8670           se->expr = var;
8671         }
8672       else if (add_clobber && expr->ref == NULL)
8673         {
8674           tree clobber;
8675           tree var;
8676           /* FIXME: This fails if var is passed by reference, see PR
8677              41453.  */
8678           var = expr->symtree->n.sym->backend_decl;
8679           clobber = build_clobber (TREE_TYPE (var));
8680           gfc_add_modify (&se->pre, var, clobber);
8681         }
8682       return;
8683     }
8684
8685   if (expr->expr_type == EXPR_FUNCTION
8686       && ((expr->value.function.esym
8687            && expr->value.function.esym->result->attr.pointer
8688            && !expr->value.function.esym->result->attr.dimension)
8689           || (!expr->value.function.esym && !expr->ref
8690               && expr->symtree->n.sym->attr.pointer
8691               && !expr->symtree->n.sym->attr.dimension)))
8692     {
8693       se->want_pointer = 1;
8694       gfc_conv_expr (se, expr);
8695       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
8696       gfc_add_modify (&se->pre, var, se->expr);
8697       se->expr = var;
8698       return;
8699     }
8700
8701   gfc_conv_expr (se, expr);
8702
8703   /* Create a temporary var to hold the value.  */
8704   if (TREE_CONSTANT (se->expr))
8705     {
8706       tree tmp = se->expr;
8707       STRIP_TYPE_NOPS (tmp);
8708       var = build_decl (input_location,
8709                         CONST_DECL, NULL, TREE_TYPE (tmp));
8710       DECL_INITIAL (var) = tmp;
8711       TREE_STATIC (var) = 1;
8712       pushdecl (var);
8713     }
8714   else
8715     {
8716       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
8717       gfc_add_modify (&se->pre, var, se->expr);
8718     }
8719
8720   if (!expr->must_finalize)
8721     gfc_add_block_to_block (&se->pre, &se->post);
8722
8723   /* Take the address of that value.  */
8724   se->expr = gfc_build_addr_expr (NULL_TREE, var);
8725 }
8726
8727
8728 /* Get the _len component for an unlimited polymorphic expression.  */
8729
8730 static tree
8731 trans_get_upoly_len (stmtblock_t *block, gfc_expr *expr)
8732 {
8733   gfc_se se;
8734   gfc_ref *ref = expr->ref;
8735
8736   gfc_init_se (&se, NULL);
8737   while (ref && ref->next)
8738     ref = ref->next;
8739   gfc_add_len_component (expr);
8740   gfc_conv_expr (&se, expr);
8741   gfc_add_block_to_block (block, &se.pre);
8742   gcc_assert (se.post.head == NULL_TREE);
8743   if (ref)
8744     {
8745       gfc_free_ref_list (ref->next);
8746       ref->next = NULL;
8747     }
8748   else
8749     {
8750       gfc_free_ref_list (expr->ref);
8751       expr->ref = NULL;
8752     }
8753   return se.expr;
8754 }
8755
8756
8757 /* Assign _vptr and _len components as appropriate.  BLOCK should be a
8758    statement-list outside of the scalarizer-loop.  When code is generated, that
8759    depends on the scalarized expression, it is added to RSE.PRE.
8760    Returns le's _vptr tree and when set the len expressions in to_lenp and
8761    from_lenp to form a le%_vptr%_copy (re, le, [from_lenp, to_lenp])
8762    expression.  */
8763
8764 static tree
8765 trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le,
8766                                  gfc_expr * re, gfc_se *rse,
8767                                  tree * to_lenp, tree * from_lenp)
8768 {
8769   gfc_se se;
8770   gfc_expr * vptr_expr;
8771   tree tmp, to_len = NULL_TREE, from_len = NULL_TREE, lhs_vptr;
8772   bool set_vptr = false, temp_rhs = false;
8773   stmtblock_t *pre = block;
8774
8775   /* Create a temporary for complicated expressions.  */
8776   if (re->expr_type != EXPR_VARIABLE && re->expr_type != EXPR_NULL
8777       && rse->expr != NULL_TREE && !DECL_P (rse->expr))
8778     {
8779       tmp = gfc_create_var (TREE_TYPE (rse->expr), "rhs");
8780       pre = &rse->pre;
8781       gfc_add_modify (&rse->pre, tmp, rse->expr);
8782       rse->expr = tmp;
8783       temp_rhs = true;
8784     }
8785
8786   /* Get the _vptr for the left-hand side expression.  */
8787   gfc_init_se (&se, NULL);
8788   vptr_expr = gfc_find_and_cut_at_last_class_ref (le);
8789   if (vptr_expr != NULL && gfc_expr_attr (vptr_expr).class_ok)
8790     {
8791       /* Care about _len for unlimited polymorphic entities.  */
8792       if (UNLIMITED_POLY (vptr_expr)
8793           || (vptr_expr->ts.type == BT_DERIVED
8794               && vptr_expr->ts.u.derived->attr.unlimited_polymorphic))
8795         to_len = trans_get_upoly_len (block, vptr_expr);
8796       gfc_add_vptr_component (vptr_expr);
8797       set_vptr = true;
8798     }
8799   else
8800     vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&le->ts));
8801   se.want_pointer = 1;
8802   gfc_conv_expr (&se, vptr_expr);
8803   gfc_free_expr (vptr_expr);
8804   gfc_add_block_to_block (block, &se.pre);
8805   gcc_assert (se.post.head == NULL_TREE);
8806   lhs_vptr = se.expr;
8807   STRIP_NOPS (lhs_vptr);
8808
8809   /* Set the _vptr only when the left-hand side of the assignment is a
8810      class-object.  */
8811   if (set_vptr)
8812     {
8813       /* Get the vptr from the rhs expression only, when it is variable.
8814          Functions are expected to be assigned to a temporary beforehand.  */
8815       vptr_expr = (re->expr_type == EXPR_VARIABLE && re->ts.type == BT_CLASS)
8816           ? gfc_find_and_cut_at_last_class_ref (re)
8817           : NULL;
8818       if (vptr_expr != NULL && vptr_expr->ts.type == BT_CLASS)
8819         {
8820           if (to_len != NULL_TREE)
8821             {
8822               /* Get the _len information from the rhs.  */
8823               if (UNLIMITED_POLY (vptr_expr)
8824                   || (vptr_expr->ts.type == BT_DERIVED
8825                       && vptr_expr->ts.u.derived->attr.unlimited_polymorphic))
8826                 from_len = trans_get_upoly_len (block, vptr_expr);
8827             }
8828           gfc_add_vptr_component (vptr_expr);
8829         }
8830       else
8831         {
8832           if (re->expr_type == EXPR_VARIABLE
8833               && DECL_P (re->symtree->n.sym->backend_decl)
8834               && DECL_LANG_SPECIFIC (re->symtree->n.sym->backend_decl)
8835               && GFC_DECL_SAVED_DESCRIPTOR (re->symtree->n.sym->backend_decl)
8836               && GFC_CLASS_TYPE_P (TREE_TYPE (GFC_DECL_SAVED_DESCRIPTOR (
8837                                            re->symtree->n.sym->backend_decl))))
8838             {
8839               vptr_expr = NULL;
8840               se.expr = gfc_class_vptr_get (GFC_DECL_SAVED_DESCRIPTOR (
8841                                              re->symtree->n.sym->backend_decl));
8842               if (to_len)
8843                 from_len = gfc_class_len_get (GFC_DECL_SAVED_DESCRIPTOR (
8844                                              re->symtree->n.sym->backend_decl));
8845             }
8846           else if (temp_rhs && re->ts.type == BT_CLASS)
8847             {
8848               vptr_expr = NULL;
8849               se.expr = gfc_class_vptr_get (rse->expr);
8850               if (UNLIMITED_POLY (re))
8851                 from_len = gfc_class_len_get (rse->expr);
8852             }
8853           else if (re->expr_type != EXPR_NULL)
8854             /* Only when rhs is non-NULL use its declared type for vptr
8855                initialisation.  */
8856             vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&re->ts));
8857           else
8858             /* When the rhs is NULL use the vtab of lhs' declared type.  */
8859             vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&le->ts));
8860         }
8861
8862       if (vptr_expr)
8863         {
8864           gfc_init_se (&se, NULL);
8865           se.want_pointer = 1;
8866           gfc_conv_expr (&se, vptr_expr);
8867           gfc_free_expr (vptr_expr);
8868           gfc_add_block_to_block (block, &se.pre);
8869           gcc_assert (se.post.head == NULL_TREE);
8870         }
8871       gfc_add_modify (pre, lhs_vptr, fold_convert (TREE_TYPE (lhs_vptr),
8872                                                 se.expr));
8873
8874       if (to_len != NULL_TREE)
8875         {
8876           /* The _len component needs to be set.  Figure how to get the
8877              value of the right-hand side.  */
8878           if (from_len == NULL_TREE)
8879             {
8880               if (rse->string_length != NULL_TREE)
8881                 from_len = rse->string_length;
8882               else if (re->ts.type == BT_CHARACTER && re->ts.u.cl->length)
8883                 {
8884                   from_len = gfc_get_expr_charlen (re);
8885                   gfc_init_se (&se, NULL);
8886                   gfc_conv_expr (&se, re->ts.u.cl->length);
8887                   gfc_add_block_to_block (block, &se.pre);
8888                   gcc_assert (se.post.head == NULL_TREE);
8889                   from_len = gfc_evaluate_now (se.expr, block);
8890                 }
8891               else
8892                 from_len = build_zero_cst (gfc_charlen_type_node);
8893             }
8894           gfc_add_modify (pre, to_len, fold_convert (TREE_TYPE (to_len),
8895                                                      from_len));
8896         }
8897     }
8898
8899   /* Return the _len trees only, when requested.  */
8900   if (to_lenp)
8901     *to_lenp = to_len;
8902   if (from_lenp)
8903     *from_lenp = from_len;
8904   return lhs_vptr;
8905 }
8906
8907
8908 /* Assign tokens for pointer components.  */
8909
8910 static void
8911 trans_caf_token_assign (gfc_se *lse, gfc_se *rse, gfc_expr *expr1,
8912                         gfc_expr *expr2)
8913 {
8914   symbol_attribute lhs_attr, rhs_attr;
8915   tree tmp, lhs_tok, rhs_tok;
8916   /* Flag to indicated component refs on the rhs.  */
8917   bool rhs_cr;
8918
8919   lhs_attr = gfc_caf_attr (expr1);
8920   if (expr2->expr_type != EXPR_NULL)
8921     {
8922       rhs_attr = gfc_caf_attr (expr2, false, &rhs_cr);
8923       if (lhs_attr.codimension && rhs_attr.codimension)
8924         {
8925           lhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (lse, expr1);
8926           lhs_tok = build_fold_indirect_ref (lhs_tok);
8927
8928           if (rhs_cr)
8929             rhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (rse, expr2);
8930           else
8931             {
8932               tree caf_decl;
8933               caf_decl = gfc_get_tree_for_caf_expr (expr2);
8934               gfc_get_caf_token_offset (rse, &rhs_tok, NULL, caf_decl,
8935                                         NULL_TREE, NULL);
8936             }
8937           tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
8938                             lhs_tok,
8939                             fold_convert (TREE_TYPE (lhs_tok), rhs_tok));
8940           gfc_prepend_expr_to_block (&lse->post, tmp);
8941         }
8942     }
8943   else if (lhs_attr.codimension)
8944     {
8945       lhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (lse, expr1);
8946       lhs_tok = build_fold_indirect_ref (lhs_tok);
8947       tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
8948                         lhs_tok, null_pointer_node);
8949       gfc_prepend_expr_to_block (&lse->post, tmp);
8950     }
8951 }
8952
8953 /* Indentify class valued proc_pointer assignments.  */
8954
8955 static bool
8956 pointer_assignment_is_proc_pointer (gfc_expr * expr1, gfc_expr * expr2)
8957 {
8958   gfc_ref * ref;
8959
8960   ref = expr1->ref;
8961   while (ref && ref->next)
8962      ref = ref->next;
8963
8964   return ref && ref->type == REF_COMPONENT
8965       && ref->u.c.component->attr.proc_pointer
8966       && expr2->expr_type == EXPR_VARIABLE
8967       && expr2->symtree->n.sym->attr.flavor == FL_PROCEDURE;
8968 }
8969
8970
8971 /* Do everything that is needed for a CLASS function expr2.  */
8972
8973 static tree
8974 trans_class_pointer_fcn (stmtblock_t *block, gfc_se *lse, gfc_se *rse,
8975                          gfc_expr *expr1, gfc_expr *expr2)
8976 {
8977   tree expr1_vptr = NULL_TREE;
8978   tree tmp;
8979
8980   gfc_conv_function_expr (rse, expr2);
8981   rse->expr = gfc_evaluate_now (rse->expr, &rse->pre);
8982
8983   if (expr1->ts.type != BT_CLASS)
8984       rse->expr = gfc_class_data_get (rse->expr);
8985   else
8986     {
8987       expr1_vptr = trans_class_vptr_len_assignment (block, expr1,
8988                                                     expr2, rse,
8989                                                     NULL, NULL);
8990       gfc_add_block_to_block (block, &rse->pre);
8991       tmp = gfc_create_var (TREE_TYPE (rse->expr), "ptrtemp");
8992       gfc_add_modify (&lse->pre, tmp, rse->expr);
8993
8994       gfc_add_modify (&lse->pre, expr1_vptr,
8995                       fold_convert (TREE_TYPE (expr1_vptr),
8996                       gfc_class_vptr_get (tmp)));
8997       rse->expr = gfc_class_data_get (tmp);
8998     }
8999
9000   return expr1_vptr;
9001 }
9002
9003
9004 tree
9005 gfc_trans_pointer_assign (gfc_code * code)
9006 {
9007   return gfc_trans_pointer_assignment (code->expr1, code->expr2);
9008 }
9009
9010
9011 /* Generate code for a pointer assignment.  */
9012
9013 tree
9014 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
9015 {
9016   gfc_se lse;
9017   gfc_se rse;
9018   stmtblock_t block;
9019   tree desc;
9020   tree tmp;
9021   tree expr1_vptr = NULL_TREE;
9022   bool scalar, non_proc_pointer_assign;
9023   gfc_ss *ss;
9024
9025   gfc_start_block (&block);
9026
9027   gfc_init_se (&lse, NULL);
9028
9029   /* Usually testing whether this is not a proc pointer assignment.  */
9030   non_proc_pointer_assign = !pointer_assignment_is_proc_pointer (expr1, expr2);
9031
9032   /* Check whether the expression is a scalar or not; we cannot use
9033      expr1->rank as it can be nonzero for proc pointers.  */
9034   ss = gfc_walk_expr (expr1);
9035   scalar = ss == gfc_ss_terminator;
9036   if (!scalar)
9037     gfc_free_ss_chain (ss);
9038
9039   if (expr1->ts.type == BT_DERIVED && expr2->ts.type == BT_CLASS
9040       && expr2->expr_type != EXPR_FUNCTION && non_proc_pointer_assign)
9041     {
9042       gfc_add_data_component (expr2);
9043       /* The following is required as gfc_add_data_component doesn't
9044          update ts.type if there is a tailing REF_ARRAY.  */
9045       expr2->ts.type = BT_DERIVED;
9046     }
9047
9048   if (scalar)
9049     {
9050       /* Scalar pointers.  */
9051       lse.want_pointer = 1;
9052       gfc_conv_expr (&lse, expr1);
9053       gfc_init_se (&rse, NULL);
9054       rse.want_pointer = 1;
9055       if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS)
9056         trans_class_pointer_fcn (&block, &lse, &rse, expr1, expr2);
9057       else
9058         gfc_conv_expr (&rse, expr2);
9059
9060       if (non_proc_pointer_assign && expr1->ts.type == BT_CLASS)
9061         {
9062           trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, NULL,
9063                                            NULL);
9064           lse.expr = gfc_class_data_get (lse.expr);
9065         }
9066
9067       if (expr1->symtree->n.sym->attr.proc_pointer
9068           && expr1->symtree->n.sym->attr.dummy)
9069         lse.expr = build_fold_indirect_ref_loc (input_location,
9070                                                 lse.expr);
9071
9072       if (expr2->symtree && expr2->symtree->n.sym->attr.proc_pointer
9073           && expr2->symtree->n.sym->attr.dummy)
9074         rse.expr = build_fold_indirect_ref_loc (input_location,
9075                                                 rse.expr);
9076
9077       gfc_add_block_to_block (&block, &lse.pre);
9078       gfc_add_block_to_block (&block, &rse.pre);
9079
9080       /* Check character lengths if character expression.  The test is only
9081          really added if -fbounds-check is enabled.  Exclude deferred
9082          character length lefthand sides.  */
9083       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL
9084           && !expr1->ts.deferred
9085           && !expr1->symtree->n.sym->attr.proc_pointer
9086           && !gfc_is_proc_ptr_comp (expr1))
9087         {
9088           gcc_assert (expr2->ts.type == BT_CHARACTER);
9089           gcc_assert (lse.string_length && rse.string_length);
9090           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
9091                                        lse.string_length, rse.string_length,
9092                                        &block);
9093         }
9094
9095       /* The assignment to an deferred character length sets the string
9096          length to that of the rhs.  */
9097       if (expr1->ts.deferred)
9098         {
9099           if (expr2->expr_type != EXPR_NULL && lse.string_length != NULL)
9100             gfc_add_modify (&block, lse.string_length,
9101                             fold_convert (TREE_TYPE (lse.string_length),
9102                                           rse.string_length));
9103           else if (lse.string_length != NULL)
9104             gfc_add_modify (&block, lse.string_length,
9105                             build_zero_cst (TREE_TYPE (lse.string_length)));
9106         }
9107
9108       gfc_add_modify (&block, lse.expr,
9109                       fold_convert (TREE_TYPE (lse.expr), rse.expr));
9110
9111       /* Also set the tokens for pointer components in derived typed
9112          coarrays.  */
9113       if (flag_coarray == GFC_FCOARRAY_LIB)
9114         trans_caf_token_assign (&lse, &rse, expr1, expr2);
9115
9116       gfc_add_block_to_block (&block, &rse.post);
9117       gfc_add_block_to_block (&block, &lse.post);
9118     }
9119   else
9120     {
9121       gfc_ref* remap;
9122       bool rank_remap;
9123       tree strlen_lhs;
9124       tree strlen_rhs = NULL_TREE;
9125
9126       /* Array pointer.  Find the last reference on the LHS and if it is an
9127          array section ref, we're dealing with bounds remapping.  In this case,
9128          set it to AR_FULL so that gfc_conv_expr_descriptor does
9129          not see it and process the bounds remapping afterwards explicitly.  */
9130       for (remap = expr1->ref; remap; remap = remap->next)
9131         if (!remap->next && remap->type == REF_ARRAY
9132             && remap->u.ar.type == AR_SECTION)
9133           break;
9134       rank_remap = (remap && remap->u.ar.end[0]);
9135
9136       gfc_init_se (&lse, NULL);
9137       if (remap)
9138         lse.descriptor_only = 1;
9139       gfc_conv_expr_descriptor (&lse, expr1);
9140       strlen_lhs = lse.string_length;
9141       desc = lse.expr;
9142
9143       if (expr2->expr_type == EXPR_NULL)
9144         {
9145           /* Just set the data pointer to null.  */
9146           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
9147         }
9148       else if (rank_remap)
9149         {
9150           /* If we are rank-remapping, just get the RHS's descriptor and
9151              process this later on.  */
9152           gfc_init_se (&rse, NULL);
9153           rse.direct_byref = 1;
9154           rse.byref_noassign = 1;
9155
9156           if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS)
9157             expr1_vptr = trans_class_pointer_fcn (&block, &lse, &rse,
9158                                                   expr1, expr2);
9159           else if (expr2->expr_type == EXPR_FUNCTION)
9160             {
9161               tree bound[GFC_MAX_DIMENSIONS];
9162               int i;
9163
9164               for (i = 0; i < expr2->rank; i++)
9165                 bound[i] = NULL_TREE;
9166               tmp = gfc_typenode_for_spec (&expr2->ts);
9167               tmp = gfc_get_array_type_bounds (tmp, expr2->rank, 0,
9168                                                bound, bound, 0,
9169                                                GFC_ARRAY_POINTER_CONT, false);
9170               tmp = gfc_create_var (tmp, "ptrtemp");
9171               rse.descriptor_only = 0;
9172               rse.expr = tmp;
9173               rse.direct_byref = 1;
9174               gfc_conv_expr_descriptor (&rse, expr2);
9175               strlen_rhs = rse.string_length;
9176               rse.expr = tmp;
9177             }
9178           else
9179             {
9180               gfc_conv_expr_descriptor (&rse, expr2);
9181               strlen_rhs = rse.string_length;
9182               if (expr1->ts.type == BT_CLASS)
9183                 expr1_vptr = trans_class_vptr_len_assignment (&block, expr1,
9184                                                               expr2, &rse,
9185                                                               NULL, NULL);
9186             }
9187         }
9188       else if (expr2->expr_type == EXPR_VARIABLE)
9189         {
9190           /* Assign directly to the LHS's descriptor.  */
9191           lse.descriptor_only = 0;
9192           lse.direct_byref = 1;
9193           gfc_conv_expr_descriptor (&lse, expr2);
9194           strlen_rhs = lse.string_length;
9195
9196           if (expr1->ts.type == BT_CLASS)
9197             {
9198               rse.expr = NULL_TREE;
9199               rse.string_length = NULL_TREE;
9200               trans_class_vptr_len_assignment (&block, expr1, expr2, &rse,
9201                                                NULL, NULL);
9202             }
9203
9204           if (remap == NULL)
9205             {
9206               /* If the target is not a whole array, use the target array
9207                  reference for remap.  */
9208               for (remap = expr2->ref; remap; remap = remap->next)
9209                 if (remap->type == REF_ARRAY
9210                     && remap->u.ar.type == AR_FULL
9211                     && remap->next)
9212                   break;
9213             }
9214         }
9215       else if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS)
9216         {
9217           gfc_init_se (&rse, NULL);
9218           rse.want_pointer = 1;
9219           gfc_conv_function_expr (&rse, expr2);
9220           if (expr1->ts.type != BT_CLASS)
9221             {
9222               rse.expr = gfc_class_data_get (rse.expr);
9223               gfc_add_modify (&lse.pre, desc, rse.expr);
9224               /* Set the lhs span.  */
9225               tmp = TREE_TYPE (rse.expr);
9226               tmp = TYPE_SIZE_UNIT (gfc_get_element_type (tmp));
9227               tmp = fold_convert (gfc_array_index_type, tmp);
9228               gfc_conv_descriptor_span_set (&lse.pre, desc, tmp);
9229             }
9230           else
9231             {
9232               expr1_vptr = trans_class_vptr_len_assignment (&block, expr1,
9233                                                             expr2, &rse, NULL,
9234                                                             NULL);
9235               gfc_add_block_to_block (&block, &rse.pre);
9236               tmp = gfc_create_var (TREE_TYPE (rse.expr), "ptrtemp");
9237               gfc_add_modify (&lse.pre, tmp, rse.expr);
9238
9239               gfc_add_modify (&lse.pre, expr1_vptr,
9240                               fold_convert (TREE_TYPE (expr1_vptr),
9241                                         gfc_class_vptr_get (tmp)));
9242               rse.expr = gfc_class_data_get (tmp);
9243               gfc_add_modify (&lse.pre, desc, rse.expr);
9244             }
9245         }
9246       else
9247         {
9248           /* Assign to a temporary descriptor and then copy that
9249              temporary to the pointer.  */
9250           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
9251           lse.descriptor_only = 0;
9252           lse.expr = tmp;
9253           lse.direct_byref = 1;
9254           gfc_conv_expr_descriptor (&lse, expr2);
9255           strlen_rhs = lse.string_length;
9256           gfc_add_modify (&lse.pre, desc, tmp);
9257         }
9258
9259       gfc_add_block_to_block (&block, &lse.pre);
9260       if (rank_remap)
9261         gfc_add_block_to_block (&block, &rse.pre);
9262
9263       /* If we do bounds remapping, update LHS descriptor accordingly.  */
9264       if (remap)
9265         {
9266           int dim;
9267           gcc_assert (remap->u.ar.dimen == expr1->rank);
9268
9269           if (rank_remap)
9270             {
9271               /* Do rank remapping.  We already have the RHS's descriptor
9272                  converted in rse and now have to build the correct LHS
9273                  descriptor for it.  */
9274
9275               tree dtype, data, span;
9276               tree offs, stride;
9277               tree lbound, ubound;
9278
9279               /* Set dtype.  */
9280               dtype = gfc_conv_descriptor_dtype (desc);
9281               tmp = gfc_get_dtype (TREE_TYPE (desc));
9282               gfc_add_modify (&block, dtype, tmp);
9283
9284               /* Copy data pointer.  */
9285               data = gfc_conv_descriptor_data_get (rse.expr);
9286               gfc_conv_descriptor_data_set (&block, desc, data);
9287
9288               /* Copy the span.  */
9289               if (TREE_CODE (rse.expr) == VAR_DECL
9290                   && GFC_DECL_PTR_ARRAY_P (rse.expr))
9291                 span = gfc_conv_descriptor_span_get (rse.expr);
9292               else
9293                 {
9294                   tmp = TREE_TYPE (rse.expr);
9295                   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (tmp));
9296                   span = fold_convert (gfc_array_index_type, tmp);
9297                 }
9298               gfc_conv_descriptor_span_set (&block, desc, span);
9299
9300               /* Copy offset but adjust it such that it would correspond
9301                  to a lbound of zero.  */
9302               offs = gfc_conv_descriptor_offset_get (rse.expr);
9303               for (dim = 0; dim < expr2->rank; ++dim)
9304                 {
9305                   stride = gfc_conv_descriptor_stride_get (rse.expr,
9306                                                            gfc_rank_cst[dim]);
9307                   lbound = gfc_conv_descriptor_lbound_get (rse.expr,
9308                                                            gfc_rank_cst[dim]);
9309                   tmp = fold_build2_loc (input_location, MULT_EXPR,
9310                                          gfc_array_index_type, stride, lbound);
9311                   offs = fold_build2_loc (input_location, PLUS_EXPR,
9312                                           gfc_array_index_type, offs, tmp);
9313                 }
9314               gfc_conv_descriptor_offset_set (&block, desc, offs);
9315
9316               /* Set the bounds as declared for the LHS and calculate strides as
9317                  well as another offset update accordingly.  */
9318               stride = gfc_conv_descriptor_stride_get (rse.expr,
9319                                                        gfc_rank_cst[0]);
9320               for (dim = 0; dim < expr1->rank; ++dim)
9321                 {
9322                   gfc_se lower_se;
9323                   gfc_se upper_se;
9324
9325                   gcc_assert (remap->u.ar.start[dim] && remap->u.ar.end[dim]);
9326
9327                   /* Convert declared bounds.  */
9328                   gfc_init_se (&lower_se, NULL);
9329                   gfc_init_se (&upper_se, NULL);
9330                   gfc_conv_expr (&lower_se, remap->u.ar.start[dim]);
9331                   gfc_conv_expr (&upper_se, remap->u.ar.end[dim]);
9332
9333                   gfc_add_block_to_block (&block, &lower_se.pre);
9334                   gfc_add_block_to_block (&block, &upper_se.pre);
9335
9336                   lbound = fold_convert (gfc_array_index_type, lower_se.expr);
9337                   ubound = fold_convert (gfc_array_index_type, upper_se.expr);
9338
9339                   lbound = gfc_evaluate_now (lbound, &block);
9340                   ubound = gfc_evaluate_now (ubound, &block);
9341
9342                   gfc_add_block_to_block (&block, &lower_se.post);
9343                   gfc_add_block_to_block (&block, &upper_se.post);
9344
9345                   /* Set bounds in descriptor.  */
9346                   gfc_conv_descriptor_lbound_set (&block, desc,
9347                                                   gfc_rank_cst[dim], lbound);
9348                   gfc_conv_descriptor_ubound_set (&block, desc,
9349                                                   gfc_rank_cst[dim], ubound);
9350
9351                   /* Set stride.  */
9352                   stride = gfc_evaluate_now (stride, &block);
9353                   gfc_conv_descriptor_stride_set (&block, desc,
9354                                                   gfc_rank_cst[dim], stride);
9355
9356                   /* Update offset.  */
9357                   offs = gfc_conv_descriptor_offset_get (desc);
9358                   tmp = fold_build2_loc (input_location, MULT_EXPR,
9359                                          gfc_array_index_type, lbound, stride);
9360                   offs = fold_build2_loc (input_location, MINUS_EXPR,
9361                                           gfc_array_index_type, offs, tmp);
9362                   offs = gfc_evaluate_now (offs, &block);
9363                   gfc_conv_descriptor_offset_set (&block, desc, offs);
9364
9365                   /* Update stride.  */
9366                   tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
9367                   stride = fold_build2_loc (input_location, MULT_EXPR,
9368                                             gfc_array_index_type, stride, tmp);
9369                 }
9370             }
9371           else
9372             {
9373               /* Bounds remapping.  Just shift the lower bounds.  */
9374
9375               gcc_assert (expr1->rank == expr2->rank);
9376
9377               for (dim = 0; dim < remap->u.ar.dimen; ++dim)
9378                 {
9379                   gfc_se lbound_se;
9380
9381                   gcc_assert (!remap->u.ar.end[dim]);
9382                   gfc_init_se (&lbound_se, NULL);
9383                   if (remap->u.ar.start[dim])
9384                     {
9385                       gfc_conv_expr (&lbound_se, remap->u.ar.start[dim]);
9386                       gfc_add_block_to_block (&block, &lbound_se.pre);
9387                     }
9388                   else
9389                     /* This remap arises from a target that is not a whole
9390                        array. The start expressions will be NULL but we need
9391                        the lbounds to be one.  */
9392                     lbound_se.expr = gfc_index_one_node;
9393                   gfc_conv_shift_descriptor_lbound (&block, desc,
9394                                                     dim, lbound_se.expr);
9395                   gfc_add_block_to_block (&block, &lbound_se.post);
9396                 }
9397             }
9398         }
9399
9400       /* If rank remapping was done, check with -fcheck=bounds that
9401          the target is at least as large as the pointer.  */
9402       if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS))
9403         {
9404           tree lsize, rsize;
9405           tree fault;
9406           const char* msg;
9407
9408           lsize = gfc_conv_descriptor_size (lse.expr, expr1->rank);
9409           rsize = gfc_conv_descriptor_size (rse.expr, expr2->rank);
9410
9411           lsize = gfc_evaluate_now (lsize, &block);
9412           rsize = gfc_evaluate_now (rsize, &block);
9413           fault = fold_build2_loc (input_location, LT_EXPR, logical_type_node,
9414                                    rsize, lsize);
9415
9416           msg = _("Target of rank remapping is too small (%ld < %ld)");
9417           gfc_trans_runtime_check (true, false, fault, &block, &expr2->where,
9418                                    msg, rsize, lsize);
9419         }
9420
9421       if (expr1->ts.type == BT_CHARACTER
9422           && expr1->symtree->n.sym->ts.deferred
9423           && expr1->symtree->n.sym->ts.u.cl->backend_decl
9424           && VAR_P (expr1->symtree->n.sym->ts.u.cl->backend_decl))
9425         {
9426           tmp = expr1->symtree->n.sym->ts.u.cl->backend_decl;
9427           if (expr2->expr_type != EXPR_NULL)
9428             gfc_add_modify (&block, tmp,
9429                             fold_convert (TREE_TYPE (tmp), strlen_rhs));
9430           else
9431             gfc_add_modify (&block, tmp, build_zero_cst (TREE_TYPE (tmp)));
9432         }
9433
9434       /* Check string lengths if applicable.  The check is only really added
9435          to the output code if -fbounds-check is enabled.  */
9436       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
9437         {
9438           gcc_assert (expr2->ts.type == BT_CHARACTER);
9439           gcc_assert (strlen_lhs && strlen_rhs);
9440           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
9441                                        strlen_lhs, strlen_rhs, &block);
9442         }
9443
9444       gfc_add_block_to_block (&block, &lse.post);
9445       if (rank_remap)
9446         gfc_add_block_to_block (&block, &rse.post);
9447     }
9448
9449   return gfc_finish_block (&block);
9450 }
9451
9452
9453 /* Makes sure se is suitable for passing as a function string parameter.  */
9454 /* TODO: Need to check all callers of this function.  It may be abused.  */
9455
9456 void
9457 gfc_conv_string_parameter (gfc_se * se)
9458 {
9459   tree type;
9460
9461   if (TREE_CODE (se->expr) == STRING_CST)
9462     {
9463       type = TREE_TYPE (TREE_TYPE (se->expr));
9464       se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
9465       return;
9466     }
9467
9468   if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
9469     {
9470       if (TREE_CODE (se->expr) != INDIRECT_REF)
9471         {
9472           type = TREE_TYPE (se->expr);
9473           se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
9474         }
9475       else
9476         {
9477           type = gfc_get_character_type_len (gfc_default_character_kind,
9478                                              se->string_length);
9479           type = build_pointer_type (type);
9480           se->expr = gfc_build_addr_expr (type, se->expr);
9481         }
9482     }
9483
9484   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
9485 }
9486
9487
9488 /* Generate code for assignment of scalar variables.  Includes character
9489    strings and derived types with allocatable components.
9490    If you know that the LHS has no allocations, set dealloc to false.
9491
9492    DEEP_COPY has no effect if the typespec TS is not a derived type with
9493    allocatable components.  Otherwise, if it is set, an explicit copy of each
9494    allocatable component is made.  This is necessary as a simple copy of the
9495    whole object would copy array descriptors as is, so that the lhs's
9496    allocatable components would point to the rhs's after the assignment.
9497    Typically, setting DEEP_COPY is necessary if the rhs is a variable, and not
9498    necessary if the rhs is a non-pointer function, as the allocatable components
9499    are not accessible by other means than the function's result after the
9500    function has returned.  It is even more subtle when temporaries are involved,
9501    as the two following examples show:
9502     1.  When we evaluate an array constructor, a temporary is created.  Thus
9503       there is theoretically no alias possible.  However, no deep copy is
9504       made for this temporary, so that if the constructor is made of one or
9505       more variable with allocatable components, those components still point
9506       to the variable's: DEEP_COPY should be set for the assignment from the
9507       temporary to the lhs in that case.
9508     2.  When assigning a scalar to an array, we evaluate the scalar value out
9509       of the loop, store it into a temporary variable, and assign from that.
9510       In that case, deep copying when assigning to the temporary would be a
9511       waste of resources; however deep copies should happen when assigning from
9512       the temporary to each array element: again DEEP_COPY should be set for
9513       the assignment from the temporary to the lhs.  */
9514
9515 tree
9516 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
9517                          bool deep_copy, bool dealloc, bool in_coarray)
9518 {
9519   stmtblock_t block;
9520   tree tmp;
9521   tree cond;
9522
9523   gfc_init_block (&block);
9524
9525   if (ts.type == BT_CHARACTER)
9526     {
9527       tree rlen = NULL;
9528       tree llen = NULL;
9529
9530       if (lse->string_length != NULL_TREE)
9531         {
9532           gfc_conv_string_parameter (lse);
9533           gfc_add_block_to_block (&block, &lse->pre);
9534           llen = lse->string_length;
9535         }
9536
9537       if (rse->string_length != NULL_TREE)
9538         {
9539           gfc_conv_string_parameter (rse);
9540           gfc_add_block_to_block (&block, &rse->pre);
9541           rlen = rse->string_length;
9542         }
9543
9544       gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
9545                              rse->expr, ts.kind);
9546     }
9547   else if (gfc_bt_struct (ts.type)
9548            && (ts.u.derived->attr.alloc_comp
9549                 || (deep_copy && ts.u.derived->attr.pdt_type)))
9550     {
9551       tree tmp_var = NULL_TREE;
9552       cond = NULL_TREE;
9553
9554       /* Are the rhs and the lhs the same?  */
9555       if (deep_copy)
9556         {
9557           cond = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
9558                                   gfc_build_addr_expr (NULL_TREE, lse->expr),
9559                                   gfc_build_addr_expr (NULL_TREE, rse->expr));
9560           cond = gfc_evaluate_now (cond, &lse->pre);
9561         }
9562
9563       /* Deallocate the lhs allocated components as long as it is not
9564          the same as the rhs.  This must be done following the assignment
9565          to prevent deallocating data that could be used in the rhs
9566          expression.  */
9567       if (dealloc)
9568         {
9569           tmp_var = gfc_evaluate_now (lse->expr, &lse->pre);
9570           tmp = gfc_deallocate_alloc_comp_no_caf (ts.u.derived, tmp_var, 0);
9571           if (deep_copy)
9572             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
9573                             tmp);
9574           gfc_add_expr_to_block (&lse->post, tmp);
9575         }
9576
9577       gfc_add_block_to_block (&block, &rse->pre);
9578       gfc_add_block_to_block (&block, &lse->pre);
9579
9580       gfc_add_modify (&block, lse->expr,
9581                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
9582
9583       /* Restore pointer address of coarray components.  */
9584       if (ts.u.derived->attr.coarray_comp && deep_copy && tmp_var != NULL_TREE)
9585         {
9586           tmp = gfc_reassign_alloc_comp_caf (ts.u.derived, tmp_var, lse->expr);
9587           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
9588                           tmp);
9589           gfc_add_expr_to_block (&block, tmp);
9590         }
9591
9592       /* Do a deep copy if the rhs is a variable, if it is not the
9593          same as the lhs.  */
9594       if (deep_copy)
9595         {
9596           int caf_mode = in_coarray ? (GFC_STRUCTURE_CAF_MODE_ENABLE_COARRAY
9597                                        | GFC_STRUCTURE_CAF_MODE_IN_COARRAY) : 0;
9598           tmp = gfc_copy_alloc_comp (ts.u.derived, rse->expr, lse->expr, 0,
9599                                      caf_mode);
9600           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
9601                           tmp);
9602           gfc_add_expr_to_block (&block, tmp);
9603         }
9604     }
9605   else if (gfc_bt_struct (ts.type) || ts.type == BT_CLASS)
9606     {
9607       gfc_add_block_to_block (&block, &lse->pre);
9608       gfc_add_block_to_block (&block, &rse->pre);
9609       tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
9610                              TREE_TYPE (lse->expr), rse->expr);
9611       gfc_add_modify (&block, lse->expr, tmp);
9612     }
9613   else
9614     {
9615       gfc_add_block_to_block (&block, &lse->pre);
9616       gfc_add_block_to_block (&block, &rse->pre);
9617
9618       gfc_add_modify (&block, lse->expr,
9619                       fold_convert (TREE_TYPE (lse->expr), rse->expr));
9620     }
9621
9622   gfc_add_block_to_block (&block, &lse->post);
9623   gfc_add_block_to_block (&block, &rse->post);
9624
9625   return gfc_finish_block (&block);
9626 }
9627
9628
9629 /* There are quite a lot of restrictions on the optimisation in using an
9630    array function assign without a temporary.  */
9631
9632 static bool
9633 arrayfunc_assign_needs_temporary (gfc_expr * expr1, gfc_expr * expr2)
9634 {
9635   gfc_ref * ref;
9636   bool seen_array_ref;
9637   bool c = false;
9638   gfc_symbol *sym = expr1->symtree->n.sym;
9639
9640   /* Play it safe with class functions assigned to a derived type.  */
9641   if (gfc_is_class_array_function (expr2)
9642       && expr1->ts.type == BT_DERIVED)
9643     return true;
9644
9645   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
9646   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
9647     return true;
9648
9649   /* Elemental functions are scalarized so that they don't need a
9650      temporary in gfc_trans_assignment_1, so return a true.  Otherwise,
9651      they would need special treatment in gfc_trans_arrayfunc_assign.  */
9652   if (expr2->value.function.esym != NULL
9653       && expr2->value.function.esym->attr.elemental)
9654     return true;
9655
9656   /* Need a temporary if rhs is not FULL or a contiguous section.  */
9657   if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
9658     return true;
9659
9660   /* Need a temporary if EXPR1 can't be expressed as a descriptor.  */
9661   if (gfc_ref_needs_temporary_p (expr1->ref))
9662     return true;
9663
9664   /* Functions returning pointers or allocatables need temporaries.  */
9665   c = expr2->value.function.esym
9666       ? (expr2->value.function.esym->attr.pointer
9667          || expr2->value.function.esym->attr.allocatable)
9668       : (expr2->symtree->n.sym->attr.pointer
9669          || expr2->symtree->n.sym->attr.allocatable);
9670   if (c)
9671     return true;
9672
9673   /* Character array functions need temporaries unless the
9674      character lengths are the same.  */
9675   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
9676     {
9677       if (expr1->ts.u.cl->length == NULL
9678             || expr1->ts.u.cl->length->expr_type != EXPR_CONSTANT)
9679         return true;
9680
9681       if (expr2->ts.u.cl->length == NULL
9682             || expr2->ts.u.cl->length->expr_type != EXPR_CONSTANT)
9683         return true;
9684
9685       if (mpz_cmp (expr1->ts.u.cl->length->value.integer,
9686                      expr2->ts.u.cl->length->value.integer) != 0)
9687         return true;
9688     }
9689
9690   /* Check that no LHS component references appear during an array
9691      reference. This is needed because we do not have the means to
9692      span any arbitrary stride with an array descriptor. This check
9693      is not needed for the rhs because the function result has to be
9694      a complete type.  */
9695   seen_array_ref = false;
9696   for (ref = expr1->ref; ref; ref = ref->next)
9697     {
9698       if (ref->type == REF_ARRAY)
9699         seen_array_ref= true;
9700       else if (ref->type == REF_COMPONENT && seen_array_ref)
9701         return true;
9702     }
9703
9704   /* Check for a dependency.  */
9705   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
9706                                    expr2->value.function.esym,
9707                                    expr2->value.function.actual,
9708                                    NOT_ELEMENTAL))
9709     return true;
9710
9711   /* If we have reached here with an intrinsic function, we do not
9712      need a temporary except in the particular case that reallocation
9713      on assignment is active and the lhs is allocatable and a target.  */
9714   if (expr2->value.function.isym)
9715     return (flag_realloc_lhs && sym->attr.allocatable && sym->attr.target);
9716
9717   /* If the LHS is a dummy, we need a temporary if it is not
9718      INTENT(OUT).  */
9719   if (sym->attr.dummy && sym->attr.intent != INTENT_OUT)
9720     return true;
9721
9722   /* If the lhs has been host_associated, is in common, a pointer or is
9723      a target and the function is not using a RESULT variable, aliasing
9724      can occur and a temporary is needed.  */
9725   if ((sym->attr.host_assoc
9726            || sym->attr.in_common
9727            || sym->attr.pointer
9728            || sym->attr.cray_pointee
9729            || sym->attr.target)
9730         && expr2->symtree != NULL
9731         && expr2->symtree->n.sym == expr2->symtree->n.sym->result)
9732     return true;
9733
9734   /* A PURE function can unconditionally be called without a temporary.  */
9735   if (expr2->value.function.esym != NULL
9736       && expr2->value.function.esym->attr.pure)
9737     return false;
9738
9739   /* Implicit_pure functions are those which could legally be declared
9740      to be PURE.  */
9741   if (expr2->value.function.esym != NULL
9742       && expr2->value.function.esym->attr.implicit_pure)
9743     return false;
9744
9745   if (!sym->attr.use_assoc
9746         && !sym->attr.in_common
9747         && !sym->attr.pointer
9748         && !sym->attr.target
9749         && !sym->attr.cray_pointee
9750         && expr2->value.function.esym)
9751     {
9752       /* A temporary is not needed if the function is not contained and
9753          the variable is local or host associated and not a pointer or
9754          a target.  */
9755       if (!expr2->value.function.esym->attr.contained)
9756         return false;
9757
9758       /* A temporary is not needed if the lhs has never been host
9759          associated and the procedure is contained.  */
9760       else if (!sym->attr.host_assoc)
9761         return false;
9762
9763       /* A temporary is not needed if the variable is local and not
9764          a pointer, a target or a result.  */
9765       if (sym->ns->parent
9766             && expr2->value.function.esym->ns == sym->ns->parent)
9767         return false;
9768     }
9769
9770   /* Default to temporary use.  */
9771   return true;
9772 }
9773
9774
9775 /* Provide the loop info so that the lhs descriptor can be built for
9776    reallocatable assignments from extrinsic function calls.  */
9777
9778 static void
9779 realloc_lhs_loop_for_fcn_call (gfc_se *se, locus *where, gfc_ss **ss,
9780                                gfc_loopinfo *loop)
9781 {
9782   /* Signal that the function call should not be made by
9783      gfc_conv_loop_setup.  */
9784   se->ss->is_alloc_lhs = 1;
9785   gfc_init_loopinfo (loop);
9786   gfc_add_ss_to_loop (loop, *ss);
9787   gfc_add_ss_to_loop (loop, se->ss);
9788   gfc_conv_ss_startstride (loop);
9789   gfc_conv_loop_setup (loop, where);
9790   gfc_copy_loopinfo_to_se (se, loop);
9791   gfc_add_block_to_block (&se->pre, &loop->pre);
9792   gfc_add_block_to_block (&se->pre, &loop->post);
9793   se->ss->is_alloc_lhs = 0;
9794 }
9795
9796
9797 /* For assignment to a reallocatable lhs from intrinsic functions,
9798    replace the se.expr (ie. the result) with a temporary descriptor.
9799    Null the data field so that the library allocates space for the
9800    result. Free the data of the original descriptor after the function,
9801    in case it appears in an argument expression and transfer the
9802    result to the original descriptor.  */
9803
9804 static void
9805 fcncall_realloc_result (gfc_se *se, int rank)
9806 {
9807   tree desc;
9808   tree res_desc;
9809   tree tmp;
9810   tree offset;
9811   tree zero_cond;
9812   int n;
9813
9814   /* Use the allocation done by the library.  Substitute the lhs
9815      descriptor with a copy, whose data field is nulled.*/
9816   desc = build_fold_indirect_ref_loc (input_location, se->expr);
9817   if (POINTER_TYPE_P (TREE_TYPE (desc)))
9818     desc = build_fold_indirect_ref_loc (input_location, desc);
9819
9820   /* Unallocated, the descriptor does not have a dtype.  */
9821   tmp = gfc_conv_descriptor_dtype (desc);
9822   gfc_add_modify (&se->pre, tmp, gfc_get_dtype (TREE_TYPE (desc)));
9823
9824   res_desc = gfc_evaluate_now (desc, &se->pre);
9825   gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
9826   se->expr = gfc_build_addr_expr (NULL_TREE, res_desc);
9827
9828   /* Free the lhs after the function call and copy the result data to
9829      the lhs descriptor.  */
9830   tmp = gfc_conv_descriptor_data_get (desc);
9831   zero_cond = fold_build2_loc (input_location, EQ_EXPR,
9832                                logical_type_node, tmp,
9833                                build_int_cst (TREE_TYPE (tmp), 0));
9834   zero_cond = gfc_evaluate_now (zero_cond, &se->post);
9835   tmp = gfc_call_free (tmp);
9836   gfc_add_expr_to_block (&se->post, tmp);
9837
9838   tmp = gfc_conv_descriptor_data_get (res_desc);
9839   gfc_conv_descriptor_data_set (&se->post, desc, tmp);
9840
9841   /* Check that the shapes are the same between lhs and expression.  */
9842   for (n = 0 ; n < rank; n++)
9843     {
9844       tree tmp1;
9845       tmp = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]);
9846       tmp1 = gfc_conv_descriptor_lbound_get (res_desc, gfc_rank_cst[n]);
9847       tmp = fold_build2_loc (input_location, MINUS_EXPR,
9848                              gfc_array_index_type, tmp, tmp1);
9849       tmp1 = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
9850       tmp = fold_build2_loc (input_location, MINUS_EXPR,
9851                              gfc_array_index_type, tmp, tmp1);
9852       tmp1 = gfc_conv_descriptor_ubound_get (res_desc, gfc_rank_cst[n]);
9853       tmp = fold_build2_loc (input_location, PLUS_EXPR,
9854                              gfc_array_index_type, tmp, tmp1);
9855       tmp = fold_build2_loc (input_location, NE_EXPR,
9856                              logical_type_node, tmp,
9857                              gfc_index_zero_node);
9858       tmp = gfc_evaluate_now (tmp, &se->post);
9859       zero_cond = fold_build2_loc (input_location, TRUTH_OR_EXPR,
9860                                    logical_type_node, tmp,
9861                                    zero_cond);
9862     }
9863
9864   /* 'zero_cond' being true is equal to lhs not being allocated or the
9865      shapes being different.  */
9866   zero_cond = gfc_evaluate_now (zero_cond, &se->post);
9867
9868   /* Now reset the bounds returned from the function call to bounds based
9869      on the lhs lbounds, except where the lhs is not allocated or the shapes
9870      of 'variable and 'expr' are different. Set the offset accordingly.  */
9871   offset = gfc_index_zero_node;
9872   for (n = 0 ; n < rank; n++)
9873     {
9874       tree lbound;
9875
9876       lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]);
9877       lbound = fold_build3_loc (input_location, COND_EXPR,
9878                                 gfc_array_index_type, zero_cond,
9879                                 gfc_index_one_node, lbound);
9880       lbound = gfc_evaluate_now (lbound, &se->post);
9881
9882       tmp = gfc_conv_descriptor_ubound_get (res_desc, gfc_rank_cst[n]);
9883       tmp = fold_build2_loc (input_location, PLUS_EXPR,
9884                              gfc_array_index_type, tmp, lbound);
9885       gfc_conv_descriptor_lbound_set (&se->post, desc,
9886                                       gfc_rank_cst[n], lbound);
9887       gfc_conv_descriptor_ubound_set (&se->post, desc,
9888                                       gfc_rank_cst[n], tmp);
9889
9890       /* Set stride and accumulate the offset.  */
9891       tmp = gfc_conv_descriptor_stride_get (res_desc, gfc_rank_cst[n]);
9892       gfc_conv_descriptor_stride_set (&se->post, desc,
9893                                       gfc_rank_cst[n], tmp);
9894       tmp = fold_build2_loc (input_location, MULT_EXPR,
9895                              gfc_array_index_type, lbound, tmp);
9896       offset = fold_build2_loc (input_location, MINUS_EXPR,
9897                                 gfc_array_index_type, offset, tmp);
9898       offset = gfc_evaluate_now (offset, &se->post);
9899     }
9900
9901   gfc_conv_descriptor_offset_set (&se->post, desc, offset);
9902 }
9903
9904
9905
9906 /* Try to translate array(:) = func (...), where func is a transformational
9907    array function, without using a temporary.  Returns NULL if this isn't the
9908    case.  */
9909
9910 static tree
9911 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
9912 {
9913   gfc_se se;
9914   gfc_ss *ss = NULL;
9915   gfc_component *comp = NULL;
9916   gfc_loopinfo loop;
9917
9918   if (arrayfunc_assign_needs_temporary (expr1, expr2))
9919     return NULL;
9920
9921   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
9922      functions.  */
9923   comp = gfc_get_proc_ptr_comp (expr2);
9924
9925   if (!(expr2->value.function.isym
9926               || (comp && comp->attr.dimension)
9927               || (!comp && gfc_return_by_reference (expr2->value.function.esym)
9928                   && expr2->value.function.esym->result->attr.dimension)))
9929     return NULL;
9930
9931   gfc_init_se (&se, NULL);
9932   gfc_start_block (&se.pre);
9933   se.want_pointer = 1;
9934
9935   gfc_conv_array_parameter (&se, expr1, false, NULL, NULL, NULL);
9936
9937   if (expr1->ts.type == BT_DERIVED
9938         && expr1->ts.u.derived->attr.alloc_comp)
9939     {
9940       tree tmp;
9941       tmp = gfc_deallocate_alloc_comp_no_caf (expr1->ts.u.derived, se.expr,
9942                                               expr1->rank);
9943       gfc_add_expr_to_block (&se.pre, tmp);
9944     }
9945
9946   se.direct_byref = 1;
9947   se.ss = gfc_walk_expr (expr2);
9948   gcc_assert (se.ss != gfc_ss_terminator);
9949
9950   /* Reallocate on assignment needs the loopinfo for extrinsic functions.
9951      This is signalled to gfc_conv_procedure_call by setting is_alloc_lhs.
9952      Clearly, this cannot be done for an allocatable function result, since
9953      the shape of the result is unknown and, in any case, the function must
9954      correctly take care of the reallocation internally. For intrinsic
9955      calls, the array data is freed and the library takes care of allocation.
9956      TODO: Add logic of trans-array.c: gfc_alloc_allocatable_for_assignment
9957      to the library.  */
9958   if (flag_realloc_lhs
9959         && gfc_is_reallocatable_lhs (expr1)
9960         && !gfc_expr_attr (expr1).codimension
9961         && !gfc_is_coindexed (expr1)
9962         && !(expr2->value.function.esym
9963             && expr2->value.function.esym->result->attr.allocatable))
9964     {
9965       realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
9966
9967       if (!expr2->value.function.isym)
9968         {
9969           ss = gfc_walk_expr (expr1);
9970           gcc_assert (ss != gfc_ss_terminator);
9971
9972           realloc_lhs_loop_for_fcn_call (&se, &expr1->where, &ss, &loop);
9973           ss->is_alloc_lhs = 1;
9974         }
9975       else
9976         fcncall_realloc_result (&se, expr1->rank);
9977     }
9978
9979   gfc_conv_function_expr (&se, expr2);
9980   gfc_add_block_to_block (&se.pre, &se.post);
9981
9982   if (ss)
9983     gfc_cleanup_loop (&loop);
9984   else
9985     gfc_free_ss_chain (se.ss);
9986
9987   return gfc_finish_block (&se.pre);
9988 }
9989
9990
9991 /* Try to efficiently translate array(:) = 0.  Return NULL if this
9992    can't be done.  */
9993
9994 static tree
9995 gfc_trans_zero_assign (gfc_expr * expr)
9996 {
9997   tree dest, len, type;
9998   tree tmp;
9999   gfc_symbol *sym;
10000
10001   sym = expr->symtree->n.sym;
10002   dest = gfc_get_symbol_decl (sym);
10003
10004   type = TREE_TYPE (dest);
10005   if (POINTER_TYPE_P (type))
10006     type = TREE_TYPE (type);
10007   if (!GFC_ARRAY_TYPE_P (type))
10008     return NULL_TREE;
10009
10010   /* Determine the length of the array.  */
10011   len = GFC_TYPE_ARRAY_SIZE (type);
10012   if (!len || TREE_CODE (len) != INTEGER_CST)
10013     return NULL_TREE;
10014
10015   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
10016   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
10017                          fold_convert (gfc_array_index_type, tmp));
10018
10019   /* If we are zeroing a local array avoid taking its address by emitting
10020      a = {} instead.  */
10021   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
10022     return build2_loc (input_location, MODIFY_EXPR, void_type_node,
10023                        dest, build_constructor (TREE_TYPE (dest),
10024                                               NULL));
10025
10026   /* Convert arguments to the correct types.  */
10027   dest = fold_convert (pvoid_type_node, dest);
10028   len = fold_convert (size_type_node, len);
10029
10030   /* Construct call to __builtin_memset.  */
10031   tmp = build_call_expr_loc (input_location,
10032                              builtin_decl_explicit (BUILT_IN_MEMSET),
10033                              3, dest, integer_zero_node, len);
10034   return fold_convert (void_type_node, tmp);
10035 }
10036
10037
10038 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
10039    that constructs the call to __builtin_memcpy.  */
10040
10041 tree
10042 gfc_build_memcpy_call (tree dst, tree src, tree len)
10043 {
10044   tree tmp;
10045
10046   /* Convert arguments to the correct types.  */
10047   if (!POINTER_TYPE_P (TREE_TYPE (dst)))
10048     dst = gfc_build_addr_expr (pvoid_type_node, dst);
10049   else
10050     dst = fold_convert (pvoid_type_node, dst);
10051
10052   if (!POINTER_TYPE_P (TREE_TYPE (src)))
10053     src = gfc_build_addr_expr (pvoid_type_node, src);
10054   else
10055     src = fold_convert (pvoid_type_node, src);
10056
10057   len = fold_convert (size_type_node, len);
10058
10059   /* Construct call to __builtin_memcpy.  */
10060   tmp = build_call_expr_loc (input_location,
10061                              builtin_decl_explicit (BUILT_IN_MEMCPY),
10062                              3, dst, src, len);
10063   return fold_convert (void_type_node, tmp);
10064 }
10065
10066
10067 /* Try to efficiently translate dst(:) = src(:).  Return NULL if this
10068    can't be done.  EXPR1 is the destination/lhs and EXPR2 is the
10069    source/rhs, both are gfc_full_array_ref_p which have been checked for
10070    dependencies.  */
10071
10072 static tree
10073 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
10074 {
10075   tree dst, dlen, dtype;
10076   tree src, slen, stype;
10077   tree tmp;
10078
10079   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
10080   src = gfc_get_symbol_decl (expr2->symtree->n.sym);
10081
10082   dtype = TREE_TYPE (dst);
10083   if (POINTER_TYPE_P (dtype))
10084     dtype = TREE_TYPE (dtype);
10085   stype = TREE_TYPE (src);
10086   if (POINTER_TYPE_P (stype))
10087     stype = TREE_TYPE (stype);
10088
10089   if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
10090     return NULL_TREE;
10091
10092   /* Determine the lengths of the arrays.  */
10093   dlen = GFC_TYPE_ARRAY_SIZE (dtype);
10094   if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
10095     return NULL_TREE;
10096   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
10097   dlen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
10098                           dlen, fold_convert (gfc_array_index_type, tmp));
10099
10100   slen = GFC_TYPE_ARRAY_SIZE (stype);
10101   if (!slen || TREE_CODE (slen) != INTEGER_CST)
10102     return NULL_TREE;
10103   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
10104   slen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
10105                           slen, fold_convert (gfc_array_index_type, tmp));
10106
10107   /* Sanity check that they are the same.  This should always be
10108      the case, as we should already have checked for conformance.  */
10109   if (!tree_int_cst_equal (slen, dlen))
10110     return NULL_TREE;
10111
10112   return gfc_build_memcpy_call (dst, src, dlen);
10113 }
10114
10115
10116 /* Try to efficiently translate array(:) = (/ ... /).  Return NULL if
10117    this can't be done.  EXPR1 is the destination/lhs for which
10118    gfc_full_array_ref_p is true, and EXPR2 is the source/rhs.  */
10119
10120 static tree
10121 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
10122 {
10123   unsigned HOST_WIDE_INT nelem;
10124   tree dst, dtype;
10125   tree src, stype;
10126   tree len;
10127   tree tmp;
10128
10129   nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
10130   if (nelem == 0)
10131     return NULL_TREE;
10132
10133   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
10134   dtype = TREE_TYPE (dst);
10135   if (POINTER_TYPE_P (dtype))
10136     dtype = TREE_TYPE (dtype);
10137   if (!GFC_ARRAY_TYPE_P (dtype))
10138     return NULL_TREE;
10139
10140   /* Determine the lengths of the array.  */
10141   len = GFC_TYPE_ARRAY_SIZE (dtype);
10142   if (!len || TREE_CODE (len) != INTEGER_CST)
10143     return NULL_TREE;
10144
10145   /* Confirm that the constructor is the same size.  */
10146   if (compare_tree_int (len, nelem) != 0)
10147     return NULL_TREE;
10148
10149   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
10150   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
10151                          fold_convert (gfc_array_index_type, tmp));
10152
10153   stype = gfc_typenode_for_spec (&expr2->ts);
10154   src = gfc_build_constant_array_constructor (expr2, stype);
10155
10156   stype = TREE_TYPE (src);
10157   if (POINTER_TYPE_P (stype))
10158     stype = TREE_TYPE (stype);
10159
10160   return gfc_build_memcpy_call (dst, src, len);
10161 }
10162
10163
10164 /* Tells whether the expression is to be treated as a variable reference.  */
10165
10166 bool
10167 gfc_expr_is_variable (gfc_expr *expr)
10168 {
10169   gfc_expr *arg;
10170   gfc_component *comp;
10171   gfc_symbol *func_ifc;
10172
10173   if (expr->expr_type == EXPR_VARIABLE)
10174     return true;
10175
10176   arg = gfc_get_noncopying_intrinsic_argument (expr);
10177   if (arg)
10178     {
10179       gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE);
10180       return gfc_expr_is_variable (arg);
10181     }
10182
10183   /* A data-pointer-returning function should be considered as a variable
10184      too.  */
10185   if (expr->expr_type == EXPR_FUNCTION
10186       && expr->ref == NULL)
10187     {
10188       if (expr->value.function.isym != NULL)
10189         return false;
10190
10191       if (expr->value.function.esym != NULL)
10192         {
10193           func_ifc = expr->value.function.esym;
10194           goto found_ifc;
10195         }
10196       else
10197         {
10198           gcc_assert (expr->symtree);
10199           func_ifc = expr->symtree->n.sym;
10200           goto found_ifc;
10201         }
10202
10203       gcc_unreachable ();
10204     }
10205
10206   comp = gfc_get_proc_ptr_comp (expr);
10207   if ((expr->expr_type == EXPR_PPC || expr->expr_type == EXPR_FUNCTION)
10208       && comp)
10209     {
10210       func_ifc = comp->ts.interface;
10211       goto found_ifc;
10212     }
10213
10214   if (expr->expr_type == EXPR_COMPCALL)
10215     {
10216       gcc_assert (!expr->value.compcall.tbp->is_generic);
10217       func_ifc = expr->value.compcall.tbp->u.specific->n.sym;
10218       goto found_ifc;
10219     }
10220
10221   return false;
10222
10223 found_ifc:
10224   gcc_assert (func_ifc->attr.function
10225               && func_ifc->result != NULL);
10226   return func_ifc->result->attr.pointer;
10227 }
10228
10229
10230 /* Is the lhs OK for automatic reallocation?  */
10231
10232 static bool
10233 is_scalar_reallocatable_lhs (gfc_expr *expr)
10234 {
10235   gfc_ref * ref;
10236
10237   /* An allocatable variable with no reference.  */
10238   if (expr->symtree->n.sym->attr.allocatable
10239         && !expr->ref)
10240     return true;
10241
10242   /* All that can be left are allocatable components.  However, we do
10243      not check for allocatable components here because the expression
10244      could be an allocatable component of a pointer component.  */
10245   if (expr->symtree->n.sym->ts.type != BT_DERIVED
10246         && expr->symtree->n.sym->ts.type != BT_CLASS)
10247     return false;
10248
10249   /* Find an allocatable component ref last.  */
10250   for (ref = expr->ref; ref; ref = ref->next)
10251     if (ref->type == REF_COMPONENT
10252           && !ref->next
10253           && ref->u.c.component->attr.allocatable)
10254       return true;
10255
10256   return false;
10257 }
10258
10259
10260 /* Allocate or reallocate scalar lhs, as necessary.  */
10261
10262 static void
10263 alloc_scalar_allocatable_for_assignment (stmtblock_t *block,
10264                                          tree string_length,
10265                                          gfc_expr *expr1,
10266                                          gfc_expr *expr2)
10267
10268 {
10269   tree cond;
10270   tree tmp;
10271   tree size;
10272   tree size_in_bytes;
10273   tree jump_label1;
10274   tree jump_label2;
10275   gfc_se lse;
10276   gfc_ref *ref;
10277
10278   if (!expr1 || expr1->rank)
10279     return;
10280
10281   if (!expr2 || expr2->rank)
10282     return;
10283
10284   for (ref = expr1->ref; ref; ref = ref->next)
10285     if (ref->type == REF_SUBSTRING)
10286       return;
10287
10288   realloc_lhs_warning (expr2->ts.type, false, &expr2->where);
10289
10290   /* Since this is a scalar lhs, we can afford to do this.  That is,
10291      there is no risk of side effects being repeated.  */
10292   gfc_init_se (&lse, NULL);
10293   lse.want_pointer = 1;
10294   gfc_conv_expr (&lse, expr1);
10295
10296   jump_label1 = gfc_build_label_decl (NULL_TREE);
10297   jump_label2 = gfc_build_label_decl (NULL_TREE);
10298
10299   /* Do the allocation if the lhs is NULL. Otherwise go to label 1.  */
10300   tmp = build_int_cst (TREE_TYPE (lse.expr), 0);
10301   cond = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
10302                           lse.expr, tmp);
10303   tmp = build3_v (COND_EXPR, cond,
10304                   build1_v (GOTO_EXPR, jump_label1),
10305                   build_empty_stmt (input_location));
10306   gfc_add_expr_to_block (block, tmp);
10307
10308   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
10309     {
10310       /* Use the rhs string length and the lhs element size.  */
10311       size = string_length;
10312       tmp = TREE_TYPE (gfc_typenode_for_spec (&expr1->ts));
10313       tmp = TYPE_SIZE_UNIT (tmp);
10314       size_in_bytes = fold_build2_loc (input_location, MULT_EXPR,
10315                                        TREE_TYPE (tmp), tmp,
10316                                        fold_convert (TREE_TYPE (tmp), size));
10317     }
10318   else
10319     {
10320       /* Otherwise use the length in bytes of the rhs.  */
10321       size = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&expr1->ts));
10322       size_in_bytes = size;
10323     }
10324
10325   size_in_bytes = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
10326                                    size_in_bytes, size_one_node);
10327
10328   if (gfc_caf_attr (expr1).codimension && flag_coarray == GFC_FCOARRAY_LIB)
10329     {
10330       tree caf_decl, token;
10331       gfc_se caf_se;
10332       symbol_attribute attr;
10333
10334       gfc_clear_attr (&attr);
10335       gfc_init_se (&caf_se, NULL);
10336
10337       caf_decl = gfc_get_tree_for_caf_expr (expr1);
10338       gfc_get_caf_token_offset (&caf_se, &token, NULL, caf_decl, NULL_TREE,
10339                                 NULL);
10340       gfc_add_block_to_block (block, &caf_se.pre);
10341       gfc_allocate_allocatable (block, lse.expr, size_in_bytes,
10342                                 gfc_build_addr_expr (NULL_TREE, token),
10343                                 NULL_TREE, NULL_TREE, NULL_TREE, jump_label1,
10344                                 expr1, 1);
10345     }
10346   else if (expr1->ts.type == BT_DERIVED && expr1->ts.u.derived->attr.alloc_comp)
10347     {
10348       tmp = build_call_expr_loc (input_location,
10349                                  builtin_decl_explicit (BUILT_IN_CALLOC),
10350                                  2, build_one_cst (size_type_node),
10351                                  size_in_bytes);
10352       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
10353       gfc_add_modify (block, lse.expr, tmp);
10354     }
10355   else
10356     {
10357       tmp = build_call_expr_loc (input_location,
10358                                  builtin_decl_explicit (BUILT_IN_MALLOC),
10359                                  1, size_in_bytes);
10360       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
10361       gfc_add_modify (block, lse.expr, tmp);
10362     }
10363
10364   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
10365     {
10366       /* Deferred characters need checking for lhs and rhs string
10367          length.  Other deferred parameter variables will have to
10368          come here too.  */
10369       tmp = build1_v (GOTO_EXPR, jump_label2);
10370       gfc_add_expr_to_block (block, tmp);
10371     }
10372   tmp = build1_v (LABEL_EXPR, jump_label1);
10373   gfc_add_expr_to_block (block, tmp);
10374
10375   /* For a deferred length character, reallocate if lengths of lhs and
10376      rhs are different.  */
10377   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
10378     {
10379       cond = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
10380                               lse.string_length,
10381                               fold_convert (TREE_TYPE (lse.string_length),
10382                                             size));
10383       /* Jump past the realloc if the lengths are the same.  */
10384       tmp = build3_v (COND_EXPR, cond,
10385                       build1_v (GOTO_EXPR, jump_label2),
10386                       build_empty_stmt (input_location));
10387       gfc_add_expr_to_block (block, tmp);
10388       tmp = build_call_expr_loc (input_location,
10389                                  builtin_decl_explicit (BUILT_IN_REALLOC),
10390                                  2, fold_convert (pvoid_type_node, lse.expr),
10391                                  size_in_bytes);
10392       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
10393       gfc_add_modify (block, lse.expr, tmp);
10394       tmp = build1_v (LABEL_EXPR, jump_label2);
10395       gfc_add_expr_to_block (block, tmp);
10396
10397       /* Update the lhs character length.  */
10398       size = string_length;
10399       gfc_add_modify (block, lse.string_length,
10400                       fold_convert (TREE_TYPE (lse.string_length), size));
10401     }
10402 }
10403
10404 /* Check for assignments of the type
10405
10406    a = a + 4
10407
10408    to make sure we do not check for reallocation unneccessarily.  */
10409
10410
10411 static bool
10412 is_runtime_conformable (gfc_expr *expr1, gfc_expr *expr2)
10413 {
10414   gfc_actual_arglist *a;
10415   gfc_expr *e1, *e2;
10416
10417   switch (expr2->expr_type)
10418     {
10419     case EXPR_VARIABLE:
10420       return gfc_dep_compare_expr (expr1, expr2) == 0;
10421
10422     case EXPR_FUNCTION:
10423       if (expr2->value.function.esym
10424           && expr2->value.function.esym->attr.elemental)
10425         {
10426           for (a = expr2->value.function.actual; a != NULL; a = a->next)
10427             {
10428               e1 = a->expr;
10429               if (e1 && e1->rank > 0 && !is_runtime_conformable (expr1, e1))
10430                 return false;
10431             }
10432           return true;
10433         }
10434       else if (expr2->value.function.isym
10435                && expr2->value.function.isym->elemental)
10436         {
10437           for (a = expr2->value.function.actual; a != NULL; a = a->next)
10438             {
10439               e1 = a->expr;
10440               if (e1 && e1->rank > 0 && !is_runtime_conformable (expr1, e1))
10441                 return false;
10442             }
10443           return true;
10444         }
10445
10446       break;
10447
10448     case EXPR_OP:
10449       switch (expr2->value.op.op)
10450         {
10451         case INTRINSIC_NOT:
10452         case INTRINSIC_UPLUS:
10453         case INTRINSIC_UMINUS:
10454         case INTRINSIC_PARENTHESES:
10455           return is_runtime_conformable (expr1, expr2->value.op.op1);
10456
10457         case INTRINSIC_PLUS:
10458         case INTRINSIC_MINUS:
10459         case INTRINSIC_TIMES:
10460         case INTRINSIC_DIVIDE:
10461         case INTRINSIC_POWER:
10462         case INTRINSIC_AND:
10463         case INTRINSIC_OR:
10464         case INTRINSIC_EQV:
10465         case INTRINSIC_NEQV:
10466         case INTRINSIC_EQ:
10467         case INTRINSIC_NE:
10468         case INTRINSIC_GT:
10469         case INTRINSIC_GE:
10470         case INTRINSIC_LT:
10471         case INTRINSIC_LE:
10472         case INTRINSIC_EQ_OS:
10473         case INTRINSIC_NE_OS:
10474         case INTRINSIC_GT_OS:
10475         case INTRINSIC_GE_OS:
10476         case INTRINSIC_LT_OS:
10477         case INTRINSIC_LE_OS:
10478
10479           e1 = expr2->value.op.op1;
10480           e2 = expr2->value.op.op2;
10481
10482           if (e1->rank == 0 && e2->rank > 0)
10483             return is_runtime_conformable (expr1, e2);
10484           else if (e1->rank > 0 && e2->rank == 0)
10485             return is_runtime_conformable (expr1, e1);
10486           else if (e1->rank > 0 && e2->rank > 0)
10487             return is_runtime_conformable (expr1, e1)
10488               && is_runtime_conformable (expr1, e2);
10489           break;
10490
10491         default:
10492           break;
10493
10494         }
10495
10496       break;
10497
10498     default:
10499       break;
10500     }
10501   return false;
10502 }
10503
10504
10505 static tree
10506 trans_class_assignment (stmtblock_t *block, gfc_expr *lhs, gfc_expr *rhs,
10507                         gfc_se *lse, gfc_se *rse, bool use_vptr_copy,
10508                         bool class_realloc)
10509 {
10510   tree tmp, fcn, stdcopy, to_len, from_len, vptr;
10511   vec<tree, va_gc> *args = NULL;
10512
10513   vptr = trans_class_vptr_len_assignment (block, lhs, rhs, rse, &to_len,
10514                                          &from_len);
10515
10516   /* Generate allocation of the lhs.  */
10517   if (class_realloc)
10518     {
10519       stmtblock_t alloc;
10520       tree class_han;
10521
10522       tmp = gfc_vptr_size_get (vptr);
10523       class_han = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
10524           ? gfc_class_data_get (lse->expr) : lse->expr;
10525       gfc_init_block (&alloc);
10526       gfc_allocate_using_malloc (&alloc, class_han, tmp, NULL_TREE);
10527       tmp = fold_build2_loc (input_location, EQ_EXPR,
10528                              logical_type_node, class_han,
10529                              build_int_cst (prvoid_type_node, 0));
10530       tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
10531                              gfc_unlikely (tmp,
10532                                            PRED_FORTRAN_FAIL_ALLOC),
10533                              gfc_finish_block (&alloc),
10534                              build_empty_stmt (input_location));
10535       gfc_add_expr_to_block (&lse->pre, tmp);
10536     }
10537
10538   fcn = gfc_vptr_copy_get (vptr);
10539
10540   tmp = GFC_CLASS_TYPE_P (TREE_TYPE (rse->expr))
10541       ? gfc_class_data_get (rse->expr) : rse->expr;
10542   if (use_vptr_copy)
10543     {
10544       if (!POINTER_TYPE_P (TREE_TYPE (tmp))
10545           || INDIRECT_REF_P (tmp)
10546           || (rhs->ts.type == BT_DERIVED
10547               && rhs->ts.u.derived->attr.unlimited_polymorphic
10548               && !rhs->ts.u.derived->attr.pointer
10549               && !rhs->ts.u.derived->attr.allocatable)
10550           || (UNLIMITED_POLY (rhs)
10551               && !CLASS_DATA (rhs)->attr.pointer
10552               && !CLASS_DATA (rhs)->attr.allocatable))
10553         vec_safe_push (args, gfc_build_addr_expr (NULL_TREE, tmp));
10554       else
10555         vec_safe_push (args, tmp);
10556       tmp = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
10557           ? gfc_class_data_get (lse->expr) : lse->expr;
10558       if (!POINTER_TYPE_P (TREE_TYPE (tmp))
10559           || INDIRECT_REF_P (tmp)
10560           || (lhs->ts.type == BT_DERIVED
10561               && lhs->ts.u.derived->attr.unlimited_polymorphic
10562               && !lhs->ts.u.derived->attr.pointer
10563               && !lhs->ts.u.derived->attr.allocatable)
10564           || (UNLIMITED_POLY (lhs)
10565               && !CLASS_DATA (lhs)->attr.pointer
10566               && !CLASS_DATA (lhs)->attr.allocatable))
10567         vec_safe_push (args, gfc_build_addr_expr (NULL_TREE, tmp));
10568       else
10569         vec_safe_push (args, tmp);
10570
10571       stdcopy = build_call_vec (TREE_TYPE (TREE_TYPE (fcn)), fcn, args);
10572
10573       if (to_len != NULL_TREE && !integer_zerop (from_len))
10574         {
10575           tree extcopy;
10576           vec_safe_push (args, from_len);
10577           vec_safe_push (args, to_len);
10578           extcopy = build_call_vec (TREE_TYPE (TREE_TYPE (fcn)), fcn, args);
10579
10580           tmp = fold_build2_loc (input_location, GT_EXPR,
10581                                  logical_type_node, from_len,
10582                                  build_zero_cst (TREE_TYPE (from_len)));
10583           return fold_build3_loc (input_location, COND_EXPR,
10584                                   void_type_node, tmp,
10585                                   extcopy, stdcopy);
10586         }
10587       else
10588         return stdcopy;
10589     }
10590   else
10591     {
10592       tree rhst = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
10593           ? gfc_class_data_get (lse->expr) : lse->expr;
10594       stmtblock_t tblock;
10595       gfc_init_block (&tblock);
10596       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
10597         tmp = gfc_build_addr_expr (NULL_TREE, tmp);
10598       if (!POINTER_TYPE_P (TREE_TYPE (rhst)))
10599         rhst = gfc_build_addr_expr (NULL_TREE, rhst);
10600       /* When coming from a ptr_copy lhs and rhs are swapped.  */
10601       gfc_add_modify_loc (input_location, &tblock, rhst,
10602                           fold_convert (TREE_TYPE (rhst), tmp));
10603       return gfc_finish_block (&tblock);
10604     }
10605 }
10606
10607 /* Subroutine of gfc_trans_assignment that actually scalarizes the
10608    assignment.  EXPR1 is the destination/LHS and EXPR2 is the source/RHS.
10609    init_flag indicates initialization expressions and dealloc that no
10610    deallocate prior assignment is needed (if in doubt, set true).
10611    When PTR_COPY is set and expr1 is a class type, then use the _vptr-copy
10612    routine instead of a pointer assignment.  Alias resolution is only done,
10613    when MAY_ALIAS is set (the default).  This flag is used by ALLOCATE()
10614    where it is known, that newly allocated memory on the lhs can never be
10615    an alias of the rhs.  */
10616
10617 static tree
10618 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
10619                         bool dealloc, bool use_vptr_copy, bool may_alias)
10620 {
10621   gfc_se lse;
10622   gfc_se rse;
10623   gfc_ss *lss;
10624   gfc_ss *lss_section;
10625   gfc_ss *rss;
10626   gfc_loopinfo loop;
10627   tree tmp;
10628   stmtblock_t block;
10629   stmtblock_t body;
10630   bool l_is_temp;
10631   bool scalar_to_array;
10632   tree string_length;
10633   int n;
10634   bool maybe_workshare = false, lhs_refs_comp = false, rhs_refs_comp = false;
10635   symbol_attribute lhs_caf_attr, rhs_caf_attr, lhs_attr;
10636   bool is_poly_assign;
10637
10638   /* Assignment of the form lhs = rhs.  */
10639   gfc_start_block (&block);
10640
10641   gfc_init_se (&lse, NULL);
10642   gfc_init_se (&rse, NULL);
10643
10644   /* Walk the lhs.  */
10645   lss = gfc_walk_expr (expr1);
10646   if (gfc_is_reallocatable_lhs (expr1))
10647     {
10648       lss->no_bounds_check = 1;
10649       if (!(expr2->expr_type == EXPR_FUNCTION
10650             && expr2->value.function.isym != NULL
10651             && !(expr2->value.function.isym->elemental
10652                  || expr2->value.function.isym->conversion)))
10653         lss->is_alloc_lhs = 1;
10654     }
10655   else
10656     lss->no_bounds_check = expr1->no_bounds_check;
10657
10658   rss = NULL;
10659
10660   if ((expr1->ts.type == BT_DERIVED)
10661       && (gfc_is_class_array_function (expr2)
10662           || gfc_is_alloc_class_scalar_function (expr2)))
10663     expr2->must_finalize = 1;
10664
10665   /* Checking whether a class assignment is desired is quite complicated and
10666      needed at two locations, so do it once only before the information is
10667      needed.  */
10668   lhs_attr = gfc_expr_attr (expr1);
10669   is_poly_assign = (use_vptr_copy || lhs_attr.pointer
10670                     || (lhs_attr.allocatable && !lhs_attr.dimension))
10671                    && (expr1->ts.type == BT_CLASS
10672                        || gfc_is_class_array_ref (expr1, NULL)
10673                        || gfc_is_class_scalar_expr (expr1)
10674                        || gfc_is_class_array_ref (expr2, NULL)
10675                        || gfc_is_class_scalar_expr (expr2));
10676
10677
10678   /* Only analyze the expressions for coarray properties, when in coarray-lib
10679      mode.  */
10680   if (flag_coarray == GFC_FCOARRAY_LIB)
10681     {
10682       lhs_caf_attr = gfc_caf_attr (expr1, false, &lhs_refs_comp);
10683       rhs_caf_attr = gfc_caf_attr (expr2, false, &rhs_refs_comp);
10684     }
10685
10686   if (lss != gfc_ss_terminator)
10687     {
10688       /* The assignment needs scalarization.  */
10689       lss_section = lss;
10690
10691       /* Find a non-scalar SS from the lhs.  */
10692       while (lss_section != gfc_ss_terminator
10693              && lss_section->info->type != GFC_SS_SECTION)
10694         lss_section = lss_section->next;
10695
10696       gcc_assert (lss_section != gfc_ss_terminator);
10697
10698       /* Initialize the scalarizer.  */
10699       gfc_init_loopinfo (&loop);
10700
10701       /* Walk the rhs.  */
10702       rss = gfc_walk_expr (expr2);
10703       if (rss == gfc_ss_terminator)
10704         /* The rhs is scalar.  Add a ss for the expression.  */
10705         rss = gfc_get_scalar_ss (gfc_ss_terminator, expr2);
10706       /* When doing a class assign, then the handle to the rhs needs to be a
10707          pointer to allow for polymorphism.  */
10708       if (is_poly_assign && expr2->rank == 0 && !UNLIMITED_POLY (expr2))
10709         rss->info->type = GFC_SS_REFERENCE;
10710
10711       rss->no_bounds_check = expr2->no_bounds_check;
10712       /* Associate the SS with the loop.  */
10713       gfc_add_ss_to_loop (&loop, lss);
10714       gfc_add_ss_to_loop (&loop, rss);
10715
10716       /* Calculate the bounds of the scalarization.  */
10717       gfc_conv_ss_startstride (&loop);
10718       /* Enable loop reversal.  */
10719       for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
10720         loop.reverse[n] = GFC_ENABLE_REVERSE;
10721       /* Resolve any data dependencies in the statement.  */
10722       if (may_alias)
10723         gfc_conv_resolve_dependencies (&loop, lss, rss);
10724       /* Setup the scalarizing loops.  */
10725       gfc_conv_loop_setup (&loop, &expr2->where);
10726
10727       /* Setup the gfc_se structures.  */
10728       gfc_copy_loopinfo_to_se (&lse, &loop);
10729       gfc_copy_loopinfo_to_se (&rse, &loop);
10730
10731       rse.ss = rss;
10732       gfc_mark_ss_chain_used (rss, 1);
10733       if (loop.temp_ss == NULL)
10734         {
10735           lse.ss = lss;
10736           gfc_mark_ss_chain_used (lss, 1);
10737         }
10738       else
10739         {
10740           lse.ss = loop.temp_ss;
10741           gfc_mark_ss_chain_used (lss, 3);
10742           gfc_mark_ss_chain_used (loop.temp_ss, 3);
10743         }
10744
10745       /* Allow the scalarizer to workshare array assignments.  */
10746       if ((ompws_flags & (OMPWS_WORKSHARE_FLAG | OMPWS_SCALARIZER_BODY))
10747           == OMPWS_WORKSHARE_FLAG
10748           && loop.temp_ss == NULL)
10749         {
10750           maybe_workshare = true;
10751           ompws_flags |= OMPWS_SCALARIZER_WS | OMPWS_SCALARIZER_BODY;
10752         }
10753
10754       /* Start the scalarized loop body.  */
10755       gfc_start_scalarized_body (&loop, &body);
10756     }
10757   else
10758     gfc_init_block (&body);
10759
10760   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
10761
10762   /* Translate the expression.  */
10763   rse.want_coarray = flag_coarray == GFC_FCOARRAY_LIB && init_flag
10764       && lhs_caf_attr.codimension;
10765   gfc_conv_expr (&rse, expr2);
10766
10767   /* Deal with the case of a scalar class function assigned to a derived type.  */
10768   if (gfc_is_alloc_class_scalar_function (expr2)
10769       && expr1->ts.type == BT_DERIVED)
10770     {
10771       rse.expr = gfc_class_data_get (rse.expr);
10772       rse.expr = build_fold_indirect_ref_loc (input_location, rse.expr);
10773     }
10774
10775   /* Stabilize a string length for temporaries.  */
10776   if (expr2->ts.type == BT_CHARACTER && !expr1->ts.deferred
10777       && !(VAR_P (rse.string_length)
10778            || TREE_CODE (rse.string_length) == PARM_DECL
10779            || TREE_CODE (rse.string_length) == INDIRECT_REF))
10780     string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
10781   else if (expr2->ts.type == BT_CHARACTER)
10782     {
10783       if (expr1->ts.deferred
10784           && gfc_expr_attr (expr1).allocatable
10785           && gfc_check_dependency (expr1, expr2, true))
10786         rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
10787       string_length = rse.string_length;
10788     }
10789   else
10790     string_length = NULL_TREE;
10791
10792   if (l_is_temp)
10793     {
10794       gfc_conv_tmp_array_ref (&lse);
10795       if (expr2->ts.type == BT_CHARACTER)
10796         lse.string_length = string_length;
10797     }
10798   else
10799     {
10800       gfc_conv_expr (&lse, expr1);
10801       if (gfc_option.rtcheck & GFC_RTCHECK_MEM
10802           && !init_flag
10803           && gfc_expr_attr (expr1).allocatable
10804           && expr1->rank
10805           && !expr2->rank)
10806         {
10807           tree cond;
10808           const char* msg;
10809
10810           tmp = INDIRECT_REF_P (lse.expr)
10811               ? gfc_build_addr_expr (NULL_TREE, lse.expr) : lse.expr;
10812
10813           /* We should only get array references here.  */
10814           gcc_assert (TREE_CODE (tmp) == POINTER_PLUS_EXPR
10815                       || TREE_CODE (tmp) == ARRAY_REF);
10816
10817           /* 'tmp' is either the pointer to the array(POINTER_PLUS_EXPR)
10818              or the array itself(ARRAY_REF).  */
10819           tmp = TREE_OPERAND (tmp, 0);
10820
10821           /* Provide the address of the array.  */
10822           if (TREE_CODE (lse.expr) == ARRAY_REF)
10823             tmp = gfc_build_addr_expr (NULL_TREE, tmp);
10824
10825           cond = fold_build2_loc (input_location, EQ_EXPR, logical_type_node,
10826                                   tmp, build_int_cst (TREE_TYPE (tmp), 0));
10827           msg = _("Assignment of scalar to unallocated array");
10828           gfc_trans_runtime_check (true, false, cond, &loop.pre,
10829                                    &expr1->where, msg);
10830         }
10831
10832       /* Deallocate the lhs parameterized components if required.  */
10833       if (dealloc && expr2->expr_type == EXPR_FUNCTION
10834           && !expr1->symtree->n.sym->attr.associate_var)
10835         {
10836           if (expr1->ts.type == BT_DERIVED
10837               && expr1->ts.u.derived
10838               && expr1->ts.u.derived->attr.pdt_type)
10839             {
10840               tmp = gfc_deallocate_pdt_comp (expr1->ts.u.derived, lse.expr,
10841                                              expr1->rank);
10842               gfc_add_expr_to_block (&lse.pre, tmp);
10843             }
10844           else if (expr1->ts.type == BT_CLASS
10845                    && CLASS_DATA (expr1)->ts.u.derived
10846                    && CLASS_DATA (expr1)->ts.u.derived->attr.pdt_type)
10847             {
10848               tmp = gfc_class_data_get (lse.expr);
10849               tmp = gfc_deallocate_pdt_comp (CLASS_DATA (expr1)->ts.u.derived,
10850                                              tmp, expr1->rank);
10851               gfc_add_expr_to_block (&lse.pre, tmp);
10852             }
10853         }
10854     }
10855
10856   /* Assignments of scalar derived types with allocatable components
10857      to arrays must be done with a deep copy and the rhs temporary
10858      must have its components deallocated afterwards.  */
10859   scalar_to_array = (expr2->ts.type == BT_DERIVED
10860                        && expr2->ts.u.derived->attr.alloc_comp
10861                        && !gfc_expr_is_variable (expr2)
10862                        && expr1->rank && !expr2->rank);
10863   scalar_to_array |= (expr1->ts.type == BT_DERIVED
10864                                     && expr1->rank
10865                                     && expr1->ts.u.derived->attr.alloc_comp
10866                                     && gfc_is_alloc_class_scalar_function (expr2));
10867   if (scalar_to_array && dealloc)
10868     {
10869       tmp = gfc_deallocate_alloc_comp_no_caf (expr2->ts.u.derived, rse.expr, 0);
10870       gfc_prepend_expr_to_block (&loop.post, tmp);
10871     }
10872
10873   /* When assigning a character function result to a deferred-length variable,
10874      the function call must happen before the (re)allocation of the lhs -
10875      otherwise the character length of the result is not known.
10876      NOTE 1: This relies on having the exact dependence of the length type
10877      parameter available to the caller; gfortran saves it in the .mod files.
10878      NOTE 2: Vector array references generate an index temporary that must
10879      not go outside the loop. Otherwise, variables should not generate
10880      a pre block.
10881      NOTE 3: The concatenation operation generates a temporary pointer,
10882      whose allocation must go to the innermost loop.
10883      NOTE 4: Elemental functions may generate a temporary, too.  */
10884   if (flag_realloc_lhs
10885       && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred
10886       && !(lss != gfc_ss_terminator
10887            && rss != gfc_ss_terminator
10888            && ((expr2->expr_type == EXPR_VARIABLE && expr2->rank)
10889                || (expr2->expr_type == EXPR_FUNCTION
10890                    && expr2->value.function.esym != NULL
10891                    && expr2->value.function.esym->attr.elemental)
10892                || (expr2->expr_type == EXPR_FUNCTION
10893                    && expr2->value.function.isym != NULL
10894                    && expr2->value.function.isym->elemental)
10895                || (expr2->expr_type == EXPR_OP
10896                    && expr2->value.op.op == INTRINSIC_CONCAT))))
10897     gfc_add_block_to_block (&block, &rse.pre);
10898
10899   /* Nullify the allocatable components corresponding to those of the lhs
10900      derived type, so that the finalization of the function result does not
10901      affect the lhs of the assignment. Prepend is used to ensure that the
10902      nullification occurs before the call to the finalizer. In the case of
10903      a scalar to array assignment, this is done in gfc_trans_scalar_assign
10904      as part of the deep copy.  */
10905   if (!scalar_to_array && expr1->ts.type == BT_DERIVED
10906                        && (gfc_is_class_array_function (expr2)
10907                            || gfc_is_alloc_class_scalar_function (expr2)))
10908     {
10909       tmp = rse.expr;
10910       tmp = gfc_nullify_alloc_comp (expr1->ts.u.derived, rse.expr, 0);
10911       gfc_prepend_expr_to_block (&rse.post, tmp);
10912       if (lss != gfc_ss_terminator && rss == gfc_ss_terminator)
10913         gfc_add_block_to_block (&loop.post, &rse.post);
10914     }
10915
10916   tmp = NULL_TREE;
10917
10918   if (is_poly_assign)
10919     tmp = trans_class_assignment (&body, expr1, expr2, &lse, &rse,
10920                                   use_vptr_copy || (lhs_attr.allocatable
10921                                                     && !lhs_attr.dimension),
10922                                   flag_realloc_lhs && !lhs_attr.pointer);
10923   else if (flag_coarray == GFC_FCOARRAY_LIB
10924            && lhs_caf_attr.codimension && rhs_caf_attr.codimension
10925            && ((lhs_caf_attr.allocatable && lhs_refs_comp)
10926                || (rhs_caf_attr.allocatable && rhs_refs_comp)))
10927     {
10928       /* Only detour to caf_send[get][_by_ref] () when the lhs or rhs is an
10929          allocatable component, because those need to be accessed via the
10930          caf-runtime.  No need to check for coindexes here, because resolve
10931          has rewritten those already.  */
10932       gfc_code code;
10933       gfc_actual_arglist a1, a2;
10934       /* Clear the structures to prevent accessing garbage.  */
10935       memset (&code, '\0', sizeof (gfc_code));
10936       memset (&a1, '\0', sizeof (gfc_actual_arglist));
10937       memset (&a2, '\0', sizeof (gfc_actual_arglist));
10938       a1.expr = expr1;
10939       a1.next = &a2;
10940       a2.expr = expr2;
10941       a2.next = NULL;
10942       code.ext.actual = &a1;
10943       code.resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
10944       tmp = gfc_conv_intrinsic_subroutine (&code);
10945     }
10946   else if (!is_poly_assign && expr2->must_finalize
10947            && expr1->ts.type == BT_CLASS
10948            && expr2->ts.type == BT_CLASS)
10949     {
10950       /* This case comes about when the scalarizer provides array element
10951          references. Use the vptr copy function, since this does a deep
10952          copy of allocatable components, without which the finalizer call */
10953       tmp = gfc_get_vptr_from_expr (rse.expr);
10954       if (tmp != NULL_TREE)
10955         {
10956           tree fcn = gfc_vptr_copy_get (tmp);
10957           if (POINTER_TYPE_P (TREE_TYPE (fcn)))
10958             fcn = build_fold_indirect_ref_loc (input_location, fcn);
10959           tmp = build_call_expr_loc (input_location,
10960                                      fcn, 2,
10961                                      gfc_build_addr_expr (NULL, rse.expr),
10962                                      gfc_build_addr_expr (NULL, lse.expr));
10963         }
10964     }
10965
10966   /* If nothing else works, do it the old fashioned way!  */
10967   if (tmp == NULL_TREE)
10968     tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
10969                                    gfc_expr_is_variable (expr2)
10970                                    || scalar_to_array
10971                                    || expr2->expr_type == EXPR_ARRAY,
10972                                    !(l_is_temp || init_flag) && dealloc,
10973                                    expr1->symtree->n.sym->attr.codimension);
10974
10975   /* Add the pre blocks to the body.  */
10976   gfc_add_block_to_block (&body, &rse.pre);
10977   gfc_add_block_to_block (&body, &lse.pre);
10978   gfc_add_expr_to_block (&body, tmp);
10979   /* Add the post blocks to the body.  */
10980   gfc_add_block_to_block (&body, &rse.post);
10981   gfc_add_block_to_block (&body, &lse.post);
10982
10983   if (lss == gfc_ss_terminator)
10984     {
10985       /* F2003: Add the code for reallocation on assignment.  */
10986       if (flag_realloc_lhs && is_scalar_reallocatable_lhs (expr1)
10987           && !is_poly_assign)
10988         alloc_scalar_allocatable_for_assignment (&block, string_length,
10989                                                  expr1, expr2);
10990
10991       /* Use the scalar assignment as is.  */
10992       gfc_add_block_to_block (&block, &body);
10993     }
10994   else
10995     {
10996       gcc_assert (lse.ss == gfc_ss_terminator
10997                   && rse.ss == gfc_ss_terminator);
10998
10999       if (l_is_temp)
11000         {
11001           gfc_trans_scalarized_loop_boundary (&loop, &body);
11002
11003           /* We need to copy the temporary to the actual lhs.  */
11004           gfc_init_se (&lse, NULL);
11005           gfc_init_se (&rse, NULL);
11006           gfc_copy_loopinfo_to_se (&lse, &loop);
11007           gfc_copy_loopinfo_to_se (&rse, &loop);
11008
11009           rse.ss = loop.temp_ss;
11010           lse.ss = lss;
11011
11012           gfc_conv_tmp_array_ref (&rse);
11013           gfc_conv_expr (&lse, expr1);
11014
11015           gcc_assert (lse.ss == gfc_ss_terminator
11016                       && rse.ss == gfc_ss_terminator);
11017
11018           if (expr2->ts.type == BT_CHARACTER)
11019             rse.string_length = string_length;
11020
11021           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
11022                                          false, dealloc);
11023           gfc_add_expr_to_block (&body, tmp);
11024         }
11025
11026       /* F2003: Allocate or reallocate lhs of allocatable array.  */
11027       if (flag_realloc_lhs
11028           && gfc_is_reallocatable_lhs (expr1)
11029           && expr2->rank
11030           && !is_runtime_conformable (expr1, expr2))
11031         {
11032           realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
11033           ompws_flags &= ~OMPWS_SCALARIZER_WS;
11034           tmp = gfc_alloc_allocatable_for_assignment (&loop, expr1, expr2);
11035           if (tmp != NULL_TREE)
11036             gfc_add_expr_to_block (&loop.code[expr1->rank - 1], tmp);
11037         }
11038
11039       if (maybe_workshare)
11040         ompws_flags &= ~OMPWS_SCALARIZER_BODY;
11041
11042       /* Generate the copying loops.  */
11043       gfc_trans_scalarizing_loops (&loop, &body);
11044
11045       /* Wrap the whole thing up.  */
11046       gfc_add_block_to_block (&block, &loop.pre);
11047       gfc_add_block_to_block (&block, &loop.post);
11048
11049       gfc_cleanup_loop (&loop);
11050     }
11051
11052   return gfc_finish_block (&block);
11053 }
11054
11055
11056 /* Check whether EXPR is a copyable array.  */
11057
11058 static bool
11059 copyable_array_p (gfc_expr * expr)
11060 {
11061   if (expr->expr_type != EXPR_VARIABLE)
11062     return false;
11063
11064   /* First check it's an array.  */
11065   if (expr->rank < 1 || !expr->ref || expr->ref->next)
11066     return false;
11067
11068   if (!gfc_full_array_ref_p (expr->ref, NULL))
11069     return false;
11070
11071   /* Next check that it's of a simple enough type.  */
11072   switch (expr->ts.type)
11073     {
11074     case BT_INTEGER:
11075     case BT_REAL:
11076     case BT_COMPLEX:
11077     case BT_LOGICAL:
11078       return true;
11079
11080     case BT_CHARACTER:
11081       return false;
11082
11083     case_bt_struct:
11084       return !expr->ts.u.derived->attr.alloc_comp;
11085
11086     default:
11087       break;
11088     }
11089
11090   return false;
11091 }
11092
11093 /* Translate an assignment.  */
11094
11095 tree
11096 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
11097                       bool dealloc, bool use_vptr_copy, bool may_alias)
11098 {
11099   tree tmp;
11100
11101   /* Special case a single function returning an array.  */
11102   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
11103     {
11104       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
11105       if (tmp)
11106         return tmp;
11107     }
11108
11109   /* Special case assigning an array to zero.  */
11110   if (copyable_array_p (expr1)
11111       && is_zero_initializer_p (expr2))
11112     {
11113       tmp = gfc_trans_zero_assign (expr1);
11114       if (tmp)
11115         return tmp;
11116     }
11117
11118   /* Special case copying one array to another.  */
11119   if (copyable_array_p (expr1)
11120       && copyable_array_p (expr2)
11121       && gfc_compare_types (&expr1->ts, &expr2->ts)
11122       && !gfc_check_dependency (expr1, expr2, 0))
11123     {
11124       tmp = gfc_trans_array_copy (expr1, expr2);
11125       if (tmp)
11126         return tmp;
11127     }
11128
11129   /* Special case initializing an array from a constant array constructor.  */
11130   if (copyable_array_p (expr1)
11131       && expr2->expr_type == EXPR_ARRAY
11132       && gfc_compare_types (&expr1->ts, &expr2->ts))
11133     {
11134       tmp = gfc_trans_array_constructor_copy (expr1, expr2);
11135       if (tmp)
11136         return tmp;
11137     }
11138
11139   if (UNLIMITED_POLY (expr1) && expr1->rank
11140       && expr2->ts.type != BT_CLASS)
11141     use_vptr_copy = true;
11142
11143   /* Fallback to the scalarizer to generate explicit loops.  */
11144   return gfc_trans_assignment_1 (expr1, expr2, init_flag, dealloc,
11145                                  use_vptr_copy, may_alias);
11146 }
11147
11148 tree
11149 gfc_trans_init_assign (gfc_code * code)
11150 {
11151   return gfc_trans_assignment (code->expr1, code->expr2, true, false, true);
11152 }
11153
11154 tree
11155 gfc_trans_assign (gfc_code * code)
11156 {
11157   return gfc_trans_assignment (code->expr1, code->expr2, false, true);
11158 }