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