re PR fortran/79229 (ICE in gfc_trans_assignment_1 with -fcheck=mem)
[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                   tmp = build_fold_indirect_ref_loc (input_location,
5458                                                      parmse.expr);
5459                   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
5460                     tmp = gfc_conv_descriptor_data_get (tmp);
5461                   tmp = gfc_deallocate_with_status (tmp, NULL_TREE, NULL_TREE,
5462                                                     NULL_TREE, NULL_TREE, true,
5463                                                     e,
5464                                                     GFC_CAF_COARRAY_NOCOARRAY);
5465                   if (fsym->attr.optional
5466                       && e->expr_type == EXPR_VARIABLE
5467                       && e->symtree->n.sym->attr.optional)
5468                     tmp = fold_build3_loc (input_location, COND_EXPR,
5469                                      void_type_node,
5470                                      gfc_conv_expr_present (e->symtree->n.sym),
5471                                        tmp, build_empty_stmt (input_location));
5472                   gfc_add_expr_to_block (&se->pre, tmp);
5473                 }
5474             }
5475         }
5476
5477       /* The case with fsym->attr.optional is that of a user subroutine
5478          with an interface indicating an optional argument.  When we call
5479          an intrinsic subroutine, however, fsym is NULL, but we might still
5480          have an optional argument, so we proceed to the substitution
5481          just in case.  */
5482       if (e && (fsym == NULL || fsym->attr.optional))
5483         {
5484           /* If an optional argument is itself an optional dummy argument,
5485              check its presence and substitute a null if absent.  This is
5486              only needed when passing an array to an elemental procedure
5487              as then array elements are accessed - or no NULL pointer is
5488              allowed and a "1" or "0" should be passed if not present.
5489              When passing a non-array-descriptor full array to a
5490              non-array-descriptor dummy, no check is needed. For
5491              array-descriptor actual to array-descriptor dummy, see
5492              PR 41911 for why a check has to be inserted.
5493              fsym == NULL is checked as intrinsics required the descriptor
5494              but do not always set fsym.  */
5495           if (e->expr_type == EXPR_VARIABLE
5496               && e->symtree->n.sym->attr.optional
5497               && ((e->rank != 0 && elemental_proc)
5498                   || e->representation.length || e->ts.type == BT_CHARACTER
5499                   || (e->rank != 0
5500                       && (fsym == NULL
5501                           || (fsym-> as
5502                               && (fsym->as->type == AS_ASSUMED_SHAPE
5503                                   || fsym->as->type == AS_ASSUMED_RANK
5504                                   || fsym->as->type == AS_DEFERRED))))))
5505             gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
5506                                     e->representation.length);
5507         }
5508
5509       if (fsym && e)
5510         {
5511           /* Obtain the character length of an assumed character length
5512              length procedure from the typespec.  */
5513           if (fsym->ts.type == BT_CHARACTER
5514               && parmse.string_length == NULL_TREE
5515               && e->ts.type == BT_PROCEDURE
5516               && e->symtree->n.sym->ts.type == BT_CHARACTER
5517               && e->symtree->n.sym->ts.u.cl->length != NULL
5518               && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
5519             {
5520               gfc_conv_const_charlen (e->symtree->n.sym->ts.u.cl);
5521               parmse.string_length = e->symtree->n.sym->ts.u.cl->backend_decl;
5522             }
5523         }
5524
5525       if (fsym && need_interface_mapping && e)
5526         gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
5527
5528       gfc_add_block_to_block (&se->pre, &parmse.pre);
5529       gfc_add_block_to_block (&post, &parmse.post);
5530
5531       /* Allocated allocatable components of derived types must be
5532          deallocated for non-variable scalars, array arguments to elemental
5533          procedures, and array arguments with descriptor to non-elemental
5534          procedures.  As bounds information for descriptorless arrays is no
5535          longer available here, they are dealt with in trans-array.c
5536          (gfc_conv_array_parameter).  */
5537       if (e && (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS)
5538             && e->ts.u.derived->attr.alloc_comp
5539             && (e->rank == 0 || elemental_proc || !nodesc_arg)
5540             && !expr_may_alias_variables (e, elemental_proc))
5541         {
5542           int parm_rank;
5543           /* It is known the e returns a structure type with at least one
5544              allocatable component.  When e is a function, ensure that the
5545              function is called once only by using a temporary variable.  */
5546           if (!DECL_P (parmse.expr))
5547             parmse.expr = gfc_evaluate_now_loc (input_location,
5548                                                 parmse.expr, &se->pre);
5549
5550           if (fsym && fsym->attr.value)
5551             tmp = parmse.expr;
5552           else
5553             tmp = build_fold_indirect_ref_loc (input_location,
5554                                                parmse.expr);
5555
5556           parm_rank = e->rank;
5557           switch (parm_kind)
5558             {
5559             case (ELEMENTAL):
5560             case (SCALAR):
5561               parm_rank = 0;
5562               break;
5563
5564             case (SCALAR_POINTER):
5565               tmp = build_fold_indirect_ref_loc (input_location,
5566                                              tmp);
5567               break;
5568             }
5569
5570           if (e->expr_type == EXPR_OP
5571                 && e->value.op.op == INTRINSIC_PARENTHESES
5572                 && e->value.op.op1->expr_type == EXPR_VARIABLE)
5573             {
5574               tree local_tmp;
5575               local_tmp = gfc_evaluate_now (tmp, &se->pre);
5576               local_tmp = gfc_copy_alloc_comp (e->ts.u.derived, local_tmp, tmp,
5577                                                parm_rank, 0);
5578               gfc_add_expr_to_block (&se->post, local_tmp);
5579             }
5580
5581           if (e->ts.type == BT_DERIVED && fsym && fsym->ts.type == BT_CLASS)
5582             {
5583               /* The derived type is passed to gfc_deallocate_alloc_comp.
5584                  Therefore, class actuals can handled correctly but derived
5585                  types passed to class formals need the _data component.  */
5586               tmp = gfc_class_data_get (tmp);
5587               if (!CLASS_DATA (fsym)->attr.dimension)
5588                 tmp = build_fold_indirect_ref_loc (input_location, tmp);
5589             }
5590
5591           tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp, parm_rank);
5592
5593           gfc_prepend_expr_to_block (&post, tmp);
5594         }
5595
5596       /* Add argument checking of passing an unallocated/NULL actual to
5597          a nonallocatable/nonpointer dummy.  */
5598
5599       if (gfc_option.rtcheck & GFC_RTCHECK_POINTER && e != NULL)
5600         {
5601           symbol_attribute attr;
5602           char *msg;
5603           tree cond;
5604
5605           if (e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_FUNCTION)
5606             attr = gfc_expr_attr (e);
5607           else
5608             goto end_pointer_check;
5609
5610           /*  In Fortran 2008 it's allowed to pass a NULL pointer/nonallocated
5611               allocatable to an optional dummy, cf. 12.5.2.12.  */
5612           if (fsym != NULL && fsym->attr.optional && !attr.proc_pointer
5613               && (gfc_option.allow_std & GFC_STD_F2008) != 0)
5614             goto end_pointer_check;
5615
5616           if (attr.optional)
5617             {
5618               /* If the actual argument is an optional pointer/allocatable and
5619                  the formal argument takes an nonpointer optional value,
5620                  it is invalid to pass a non-present argument on, even
5621                  though there is no technical reason for this in gfortran.
5622                  See Fortran 2003, Section 12.4.1.6 item (7)+(8).  */
5623               tree present, null_ptr, type;
5624
5625               if (attr.allocatable
5626                   && (fsym == NULL || !fsym->attr.allocatable))
5627                 msg = xasprintf ("Allocatable actual argument '%s' is not "
5628                                  "allocated or not present",
5629                                  e->symtree->n.sym->name);
5630               else if (attr.pointer
5631                        && (fsym == NULL || !fsym->attr.pointer))
5632                 msg = xasprintf ("Pointer actual argument '%s' is not "
5633                                  "associated or not present",
5634                                  e->symtree->n.sym->name);
5635               else if (attr.proc_pointer
5636                        && (fsym == NULL || !fsym->attr.proc_pointer))
5637                 msg = xasprintf ("Proc-pointer actual argument '%s' is not "
5638                                  "associated or not present",
5639                                  e->symtree->n.sym->name);
5640               else
5641                 goto end_pointer_check;
5642
5643               present = gfc_conv_expr_present (e->symtree->n.sym);
5644               type = TREE_TYPE (present);
5645               present = fold_build2_loc (input_location, EQ_EXPR,
5646                                          boolean_type_node, present,
5647                                          fold_convert (type,
5648                                                        null_pointer_node));
5649               type = TREE_TYPE (parmse.expr);
5650               null_ptr = fold_build2_loc (input_location, EQ_EXPR,
5651                                           boolean_type_node, parmse.expr,
5652                                           fold_convert (type,
5653                                                         null_pointer_node));
5654               cond = fold_build2_loc (input_location, TRUTH_ORIF_EXPR,
5655                                       boolean_type_node, present, null_ptr);
5656             }
5657           else
5658             {
5659               if (attr.allocatable
5660                   && (fsym == NULL || !fsym->attr.allocatable))
5661                 msg = xasprintf ("Allocatable actual argument '%s' is not "
5662                                  "allocated", e->symtree->n.sym->name);
5663               else if (attr.pointer
5664                        && (fsym == NULL || !fsym->attr.pointer))
5665                 msg = xasprintf ("Pointer actual argument '%s' is not "
5666                                  "associated", e->symtree->n.sym->name);
5667               else if (attr.proc_pointer
5668                        && (fsym == NULL || !fsym->attr.proc_pointer))
5669                 msg = xasprintf ("Proc-pointer actual argument '%s' is not "
5670                                  "associated", e->symtree->n.sym->name);
5671               else
5672                 goto end_pointer_check;
5673
5674               tmp = parmse.expr;
5675
5676               /* If the argument is passed by value, we need to strip the
5677                  INDIRECT_REF.  */
5678               if (!POINTER_TYPE_P (TREE_TYPE (parmse.expr)))
5679                 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
5680
5681               cond = fold_build2_loc (input_location, EQ_EXPR,
5682                                       boolean_type_node, tmp,
5683                                       fold_convert (TREE_TYPE (tmp),
5684                                                     null_pointer_node));
5685             }
5686
5687           gfc_trans_runtime_check (true, false, cond, &se->pre, &e->where,
5688                                    msg);
5689           free (msg);
5690         }
5691       end_pointer_check:
5692
5693       /* Deferred length dummies pass the character length by reference
5694          so that the value can be returned.  */
5695       if (parmse.string_length && fsym && fsym->ts.deferred)
5696         {
5697           if (INDIRECT_REF_P (parmse.string_length))
5698             /* In chains of functions/procedure calls the string_length already
5699                is a pointer to the variable holding the length.  Therefore
5700                remove the deref on call.  */
5701             parmse.string_length = TREE_OPERAND (parmse.string_length, 0);
5702           else
5703             {
5704               tmp = parmse.string_length;
5705               if (!VAR_P (tmp) && TREE_CODE (tmp) != COMPONENT_REF)
5706                 tmp = gfc_evaluate_now (parmse.string_length, &se->pre);
5707               parmse.string_length = gfc_build_addr_expr (NULL_TREE, tmp);
5708             }
5709         }
5710
5711       /* Character strings are passed as two parameters, a length and a
5712          pointer - except for Bind(c) which only passes the pointer.
5713          An unlimited polymorphic formal argument likewise does not
5714          need the length.  */
5715       if (parmse.string_length != NULL_TREE
5716           && !sym->attr.is_bind_c
5717           && !(fsym && UNLIMITED_POLY (fsym)))
5718         vec_safe_push (stringargs, parmse.string_length);
5719
5720       /* When calling __copy for character expressions to unlimited
5721          polymorphic entities, the dst argument needs a string length.  */
5722       if (sym->name[0] == '_' && e && e->ts.type == BT_CHARACTER
5723           && strncmp (sym->name, "__vtab_CHARACTER", 16) == 0
5724           && arg->next && arg->next->expr
5725           && (arg->next->expr->ts.type == BT_DERIVED
5726               || arg->next->expr->ts.type == BT_CLASS)
5727           && arg->next->expr->ts.u.derived->attr.unlimited_polymorphic)
5728         vec_safe_push (stringargs, parmse.string_length);
5729
5730       /* For descriptorless coarrays and assumed-shape coarray dummies, we
5731          pass the token and the offset as additional arguments.  */
5732       if (fsym && e == NULL && flag_coarray == GFC_FCOARRAY_LIB
5733           && ((fsym->ts.type != BT_CLASS && fsym->attr.codimension
5734                && !fsym->attr.allocatable)
5735               || (fsym->ts.type == BT_CLASS
5736                   && CLASS_DATA (fsym)->attr.codimension
5737                   && !CLASS_DATA (fsym)->attr.allocatable)))
5738         {
5739           /* Token and offset.  */
5740           vec_safe_push (stringargs, null_pointer_node);
5741           vec_safe_push (stringargs, build_int_cst (gfc_array_index_type, 0));
5742           gcc_assert (fsym->attr.optional);
5743         }
5744       else if (fsym && flag_coarray == GFC_FCOARRAY_LIB
5745                && ((fsym->ts.type != BT_CLASS && fsym->attr.codimension
5746                     && !fsym->attr.allocatable)
5747                    || (fsym->ts.type == BT_CLASS
5748                        && CLASS_DATA (fsym)->attr.codimension
5749                        && !CLASS_DATA (fsym)->attr.allocatable)))
5750         {
5751           tree caf_decl, caf_type;
5752           tree offset, tmp2;
5753
5754           caf_decl = gfc_get_tree_for_caf_expr (e);
5755           caf_type = TREE_TYPE (caf_decl);
5756
5757           if (GFC_DESCRIPTOR_TYPE_P (caf_type)
5758               && (GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE
5759                   || GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_POINTER))
5760             tmp = gfc_conv_descriptor_token (caf_decl);
5761           else if (DECL_LANG_SPECIFIC (caf_decl)
5762                    && GFC_DECL_TOKEN (caf_decl) != NULL_TREE)
5763             tmp = GFC_DECL_TOKEN (caf_decl);
5764           else
5765             {
5766               gcc_assert (GFC_ARRAY_TYPE_P (caf_type)
5767                           && GFC_TYPE_ARRAY_CAF_TOKEN (caf_type) != NULL_TREE);
5768               tmp = GFC_TYPE_ARRAY_CAF_TOKEN (caf_type);
5769             }
5770
5771           vec_safe_push (stringargs, tmp);
5772
5773           if (GFC_DESCRIPTOR_TYPE_P (caf_type)
5774               && GFC_TYPE_ARRAY_AKIND (caf_type) == GFC_ARRAY_ALLOCATABLE)
5775             offset = build_int_cst (gfc_array_index_type, 0);
5776           else if (DECL_LANG_SPECIFIC (caf_decl)
5777                    && GFC_DECL_CAF_OFFSET (caf_decl) != NULL_TREE)
5778             offset = GFC_DECL_CAF_OFFSET (caf_decl);
5779           else if (GFC_TYPE_ARRAY_CAF_OFFSET (caf_type) != NULL_TREE)
5780             offset = GFC_TYPE_ARRAY_CAF_OFFSET (caf_type);
5781           else
5782             offset = build_int_cst (gfc_array_index_type, 0);
5783
5784           if (GFC_DESCRIPTOR_TYPE_P (caf_type))
5785             tmp = gfc_conv_descriptor_data_get (caf_decl);
5786           else
5787             {
5788               gcc_assert (POINTER_TYPE_P (caf_type));
5789               tmp = caf_decl;
5790             }
5791
5792           tmp2 = fsym->ts.type == BT_CLASS
5793                  ? gfc_class_data_get (parmse.expr) : parmse.expr;
5794           if ((fsym->ts.type != BT_CLASS
5795                && (fsym->as->type == AS_ASSUMED_SHAPE
5796                    || fsym->as->type == AS_ASSUMED_RANK))
5797               || (fsym->ts.type == BT_CLASS
5798                   && (CLASS_DATA (fsym)->as->type == AS_ASSUMED_SHAPE
5799                       || CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)))
5800             {
5801               if (fsym->ts.type == BT_CLASS)
5802                 gcc_assert (!POINTER_TYPE_P (TREE_TYPE (tmp2)));
5803               else
5804                 {
5805                   gcc_assert (POINTER_TYPE_P (TREE_TYPE (tmp2)));
5806                   tmp2 = build_fold_indirect_ref_loc (input_location, tmp2);
5807                 }
5808               gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp2)));
5809               tmp2 = gfc_conv_descriptor_data_get (tmp2);
5810             }
5811           else if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp2)))
5812             tmp2 = gfc_conv_descriptor_data_get (tmp2);
5813           else
5814             {
5815               gcc_assert (POINTER_TYPE_P (TREE_TYPE (tmp2)));
5816             }
5817
5818           tmp = fold_build2_loc (input_location, MINUS_EXPR,
5819                                  gfc_array_index_type,
5820                                  fold_convert (gfc_array_index_type, tmp2),
5821                                  fold_convert (gfc_array_index_type, tmp));
5822           offset = fold_build2_loc (input_location, PLUS_EXPR,
5823                                     gfc_array_index_type, offset, tmp);
5824
5825           vec_safe_push (stringargs, offset);
5826         }
5827
5828       vec_safe_push (arglist, parmse.expr);
5829     }
5830   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
5831
5832   if (comp)
5833     ts = comp->ts;
5834   else if (sym->ts.type == BT_CLASS)
5835     ts = CLASS_DATA (sym)->ts;
5836   else
5837     ts = sym->ts;
5838
5839   if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
5840     se->string_length = build_int_cst (gfc_charlen_type_node, 1);
5841   else if (ts.type == BT_CHARACTER)
5842     {
5843       if (ts.u.cl->length == NULL)
5844         {
5845           /* Assumed character length results are not allowed by 5.1.1.5 of the
5846              standard and are trapped in resolve.c; except in the case of SPREAD
5847              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
5848              we take the character length of the first argument for the result.
5849              For dummies, we have to look through the formal argument list for
5850              this function and use the character length found there.*/
5851           if (ts.deferred)
5852             cl.backend_decl = gfc_create_var (gfc_charlen_type_node, "slen");
5853           else if (!sym->attr.dummy)
5854             cl.backend_decl = (*stringargs)[0];
5855           else
5856             {
5857               formal = gfc_sym_get_dummy_args (sym->ns->proc_name);
5858               for (; formal; formal = formal->next)
5859                 if (strcmp (formal->sym->name, sym->name) == 0)
5860                   cl.backend_decl = formal->sym->ts.u.cl->backend_decl;
5861             }
5862           len = cl.backend_decl;
5863         }
5864       else
5865         {
5866           tree tmp;
5867
5868           /* Calculate the length of the returned string.  */
5869           gfc_init_se (&parmse, NULL);
5870           if (need_interface_mapping)
5871             gfc_apply_interface_mapping (&mapping, &parmse, ts.u.cl->length);
5872           else
5873             gfc_conv_expr (&parmse, ts.u.cl->length);
5874           gfc_add_block_to_block (&se->pre, &parmse.pre);
5875           gfc_add_block_to_block (&se->post, &parmse.post);
5876
5877           tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
5878           tmp = fold_build2_loc (input_location, MAX_EXPR,
5879                                  gfc_charlen_type_node, tmp,
5880                                  build_int_cst (gfc_charlen_type_node, 0));
5881           cl.backend_decl = tmp;
5882         }
5883
5884       /* Set up a charlen structure for it.  */
5885       cl.next = NULL;
5886       cl.length = NULL;
5887       ts.u.cl = &cl;
5888
5889       len = cl.backend_decl;
5890     }
5891
5892   byref = (comp && (comp->attr.dimension
5893            || (comp->ts.type == BT_CHARACTER && !sym->attr.is_bind_c)))
5894            || (!comp && gfc_return_by_reference (sym));
5895   if (byref)
5896     {
5897       if (se->direct_byref)
5898         {
5899           /* Sometimes, too much indirection can be applied; e.g. for
5900              function_result = array_valued_recursive_function.  */
5901           if (TREE_TYPE (TREE_TYPE (se->expr))
5902                 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
5903                 && GFC_DESCRIPTOR_TYPE_P
5904                         (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
5905             se->expr = build_fold_indirect_ref_loc (input_location,
5906                                                     se->expr);
5907
5908           /* If the lhs of an assignment x = f(..) is allocatable and
5909              f2003 is allowed, we must do the automatic reallocation.
5910              TODO - deal with intrinsics, without using a temporary.  */
5911           if (flag_realloc_lhs
5912                 && se->ss && se->ss->loop_chain
5913                 && se->ss->loop_chain->is_alloc_lhs
5914                 && !expr->value.function.isym
5915                 && sym->result->as != NULL)
5916             {
5917               /* Evaluate the bounds of the result, if known.  */
5918               gfc_set_loop_bounds_from_array_spec (&mapping, se,
5919                                                    sym->result->as);
5920
5921               /* Perform the automatic reallocation.  */
5922               tmp = gfc_alloc_allocatable_for_assignment (se->loop,
5923                                                           expr, NULL);
5924               gfc_add_expr_to_block (&se->pre, tmp);
5925
5926               /* Pass the temporary as the first argument.  */
5927               result = info->descriptor;
5928             }
5929           else
5930             result = build_fold_indirect_ref_loc (input_location,
5931                                                   se->expr);
5932           vec_safe_push (retargs, se->expr);
5933         }
5934       else if (comp && comp->attr.dimension)
5935         {
5936           gcc_assert (se->loop && info);
5937
5938           /* Set the type of the array.  */
5939           tmp = gfc_typenode_for_spec (&comp->ts);
5940           gcc_assert (se->ss->dimen == se->loop->dimen);
5941
5942           /* Evaluate the bounds of the result, if known.  */
5943           gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
5944
5945           /* If the lhs of an assignment x = f(..) is allocatable and
5946              f2003 is allowed, we must not generate the function call
5947              here but should just send back the results of the mapping.
5948              This is signalled by the function ss being flagged.  */
5949           if (flag_realloc_lhs && se->ss && se->ss->is_alloc_lhs)
5950             {
5951               gfc_free_interface_mapping (&mapping);
5952               return has_alternate_specifier;
5953             }
5954
5955           /* Create a temporary to store the result.  In case the function
5956              returns a pointer, the temporary will be a shallow copy and
5957              mustn't be deallocated.  */
5958           callee_alloc = comp->attr.allocatable || comp->attr.pointer;
5959           gfc_trans_create_temp_array (&se->pre, &se->post, se->ss,
5960                                        tmp, NULL_TREE, false,
5961                                        !comp->attr.pointer, callee_alloc,
5962                                        &se->ss->info->expr->where);
5963
5964           /* Pass the temporary as the first argument.  */
5965           result = info->descriptor;
5966           tmp = gfc_build_addr_expr (NULL_TREE, result);
5967           vec_safe_push (retargs, tmp);
5968         }
5969       else if (!comp && sym->result->attr.dimension)
5970         {
5971           gcc_assert (se->loop && info);
5972
5973           /* Set the type of the array.  */
5974           tmp = gfc_typenode_for_spec (&ts);
5975           gcc_assert (se->ss->dimen == se->loop->dimen);
5976
5977           /* Evaluate the bounds of the result, if known.  */
5978           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
5979
5980           /* If the lhs of an assignment x = f(..) is allocatable and
5981              f2003 is allowed, we must not generate the function call
5982              here but should just send back the results of the mapping.
5983              This is signalled by the function ss being flagged.  */
5984           if (flag_realloc_lhs && se->ss && se->ss->is_alloc_lhs)
5985             {
5986               gfc_free_interface_mapping (&mapping);
5987               return has_alternate_specifier;
5988             }
5989
5990           /* Create a temporary to store the result.  In case the function
5991              returns a pointer, the temporary will be a shallow copy and
5992              mustn't be deallocated.  */
5993           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
5994           gfc_trans_create_temp_array (&se->pre, &se->post, se->ss,
5995                                        tmp, NULL_TREE, false,
5996                                        !sym->attr.pointer, callee_alloc,
5997                                        &se->ss->info->expr->where);
5998
5999           /* Pass the temporary as the first argument.  */
6000           result = info->descriptor;
6001           tmp = gfc_build_addr_expr (NULL_TREE, result);
6002           vec_safe_push (retargs, tmp);
6003         }
6004       else if (ts.type == BT_CHARACTER)
6005         {
6006           /* Pass the string length.  */
6007           type = gfc_get_character_type (ts.kind, ts.u.cl);
6008           type = build_pointer_type (type);
6009
6010           /* Emit a DECL_EXPR for the VLA type.  */
6011           tmp = TREE_TYPE (type);
6012           if (TYPE_SIZE (tmp)
6013               && TREE_CODE (TYPE_SIZE (tmp)) != INTEGER_CST)
6014             {
6015               tmp = build_decl (input_location, TYPE_DECL, NULL_TREE, tmp);
6016               DECL_ARTIFICIAL (tmp) = 1;
6017               DECL_IGNORED_P (tmp) = 1;
6018               tmp = fold_build1_loc (input_location, DECL_EXPR,
6019                                      TREE_TYPE (tmp), tmp);
6020               gfc_add_expr_to_block (&se->pre, tmp);
6021             }
6022
6023           /* Return an address to a char[0:len-1]* temporary for
6024              character pointers.  */
6025           if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6026                || (comp && (comp->attr.pointer || comp->attr.allocatable)))
6027             {
6028               var = gfc_create_var (type, "pstr");
6029
6030               if ((!comp && sym->attr.allocatable)
6031                   || (comp && comp->attr.allocatable))
6032                 {
6033                   gfc_add_modify (&se->pre, var,
6034                                   fold_convert (TREE_TYPE (var),
6035                                                 null_pointer_node));
6036                   tmp = gfc_call_free (var);
6037                   gfc_add_expr_to_block (&se->post, tmp);
6038                 }
6039
6040               /* Provide an address expression for the function arguments.  */
6041               var = gfc_build_addr_expr (NULL_TREE, var);
6042             }
6043           else
6044             var = gfc_conv_string_tmp (se, type, len);
6045
6046           vec_safe_push (retargs, var);
6047         }
6048       else
6049         {
6050           gcc_assert (flag_f2c && ts.type == BT_COMPLEX);
6051
6052           type = gfc_get_complex_type (ts.kind);
6053           var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
6054           vec_safe_push (retargs, var);
6055         }
6056
6057       /* Add the string length to the argument list.  */
6058       if (ts.type == BT_CHARACTER && ts.deferred)
6059         {
6060           tmp = len;
6061           if (!VAR_P (tmp))
6062             tmp = gfc_evaluate_now (len, &se->pre);
6063           TREE_STATIC (tmp) = 1;
6064           gfc_add_modify (&se->pre, tmp,
6065                           build_int_cst (TREE_TYPE (tmp), 0));
6066           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
6067           vec_safe_push (retargs, tmp);
6068         }
6069       else if (ts.type == BT_CHARACTER)
6070         vec_safe_push (retargs, len);
6071     }
6072   gfc_free_interface_mapping (&mapping);
6073
6074   /* We need to glom RETARGS + ARGLIST + STRINGARGS + APPEND_ARGS.  */
6075   arglen = (vec_safe_length (arglist) + vec_safe_length (optionalargs)
6076             + vec_safe_length (stringargs) + vec_safe_length (append_args));
6077   vec_safe_reserve (retargs, arglen);
6078
6079   /* Add the return arguments.  */
6080   vec_safe_splice (retargs, arglist);
6081
6082   /* Add the hidden present status for optional+value to the arguments.  */
6083   vec_safe_splice (retargs, optionalargs);
6084
6085   /* Add the hidden string length parameters to the arguments.  */
6086   vec_safe_splice (retargs, stringargs);
6087
6088   /* We may want to append extra arguments here.  This is used e.g. for
6089      calls to libgfortran_matmul_??, which need extra information.  */
6090   vec_safe_splice (retargs, append_args);
6091
6092   arglist = retargs;
6093
6094   /* Generate the actual call.  */
6095   if (base_object == NULL_TREE)
6096     conv_function_val (se, sym, expr);
6097   else
6098     conv_base_obj_fcn_val (se, base_object, expr);
6099
6100   /* If there are alternate return labels, function type should be
6101      integer.  Can't modify the type in place though, since it can be shared
6102      with other functions.  For dummy arguments, the typing is done to
6103      this result, even if it has to be repeated for each call.  */
6104   if (has_alternate_specifier
6105       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
6106     {
6107       if (!sym->attr.dummy)
6108         {
6109           TREE_TYPE (sym->backend_decl)
6110                 = build_function_type (integer_type_node,
6111                       TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
6112           se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
6113         }
6114       else
6115         TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
6116     }
6117
6118   fntype = TREE_TYPE (TREE_TYPE (se->expr));
6119   se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist);
6120
6121   /* Allocatable scalar function results must be freed and nullified
6122      after use. This necessitates the creation of a temporary to
6123      hold the result to prevent duplicate calls.  */
6124   if (!byref && sym->ts.type != BT_CHARACTER
6125       && sym->attr.allocatable && !sym->attr.dimension)
6126     {
6127       tmp = gfc_create_var (TREE_TYPE (se->expr), NULL);
6128       gfc_add_modify (&se->pre, tmp, se->expr);
6129       se->expr = tmp;
6130       tmp = gfc_call_free (tmp);
6131       gfc_add_expr_to_block (&post, tmp);
6132       gfc_add_modify (&post, se->expr, build_int_cst (TREE_TYPE (se->expr), 0));
6133     }
6134
6135   /* If we have a pointer function, but we don't want a pointer, e.g.
6136      something like
6137         x = f()
6138      where f is pointer valued, we have to dereference the result.  */
6139   if (!se->want_pointer && !byref
6140       && ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6141           || (comp && (comp->attr.pointer || comp->attr.allocatable))))
6142     se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
6143
6144   /* f2c calling conventions require a scalar default real function to
6145      return a double precision result.  Convert this back to default
6146      real.  We only care about the cases that can happen in Fortran 77.
6147   */
6148   if (flag_f2c && sym->ts.type == BT_REAL
6149       && sym->ts.kind == gfc_default_real_kind
6150       && !sym->attr.always_explicit)
6151     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
6152
6153   /* A pure function may still have side-effects - it may modify its
6154      parameters.  */
6155   TREE_SIDE_EFFECTS (se->expr) = 1;
6156 #if 0
6157   if (!sym->attr.pure)
6158     TREE_SIDE_EFFECTS (se->expr) = 1;
6159 #endif
6160
6161   if (byref)
6162     {
6163       /* Add the function call to the pre chain.  There is no expression.  */
6164       gfc_add_expr_to_block (&se->pre, se->expr);
6165       se->expr = NULL_TREE;
6166
6167       if (!se->direct_byref)
6168         {
6169           if ((sym->attr.dimension && !comp) || (comp && comp->attr.dimension))
6170             {
6171               if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
6172                 {
6173                   /* Check the data pointer hasn't been modified.  This would
6174                      happen in a function returning a pointer.  */
6175                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
6176                   tmp = fold_build2_loc (input_location, NE_EXPR,
6177                                          boolean_type_node,
6178                                          tmp, info->data);
6179                   gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
6180                                            gfc_msg_fault);
6181                 }
6182               se->expr = info->descriptor;
6183               /* Bundle in the string length.  */
6184               se->string_length = len;
6185             }
6186           else if (ts.type == BT_CHARACTER)
6187             {
6188               /* Dereference for character pointer results.  */
6189               if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
6190                   || (comp && (comp->attr.pointer || comp->attr.allocatable)))
6191                 se->expr = build_fold_indirect_ref_loc (input_location, var);
6192               else
6193                 se->expr = var;
6194
6195               se->string_length = len;
6196             }
6197           else
6198             {
6199               gcc_assert (ts.type == BT_COMPLEX && flag_f2c);
6200               se->expr = build_fold_indirect_ref_loc (input_location, var);
6201             }
6202         }
6203     }
6204
6205   /* Associate the rhs class object's meta-data with the result, when the
6206      result is a temporary.  */
6207   if (args && args->expr && args->expr->ts.type == BT_CLASS
6208       && sym->ts.type == BT_CLASS && result != NULL_TREE && DECL_P (result)
6209       && !GFC_CLASS_TYPE_P (TREE_TYPE (result)))
6210     {
6211       gfc_se parmse;
6212       gfc_expr *class_expr = gfc_find_and_cut_at_last_class_ref (args->expr);
6213
6214       gfc_init_se (&parmse, NULL);
6215       parmse.data_not_needed = 1;
6216       gfc_conv_expr (&parmse, class_expr);
6217       if (!DECL_LANG_SPECIFIC (result))
6218         gfc_allocate_lang_decl (result);
6219       GFC_DECL_SAVED_DESCRIPTOR (result) = parmse.expr;
6220       gfc_free_expr (class_expr);
6221       gcc_assert (parmse.pre.head == NULL_TREE
6222                   && parmse.post.head == NULL_TREE);
6223     }
6224
6225   /* Follow the function call with the argument post block.  */
6226   if (byref)
6227     {
6228       gfc_add_block_to_block (&se->pre, &post);
6229
6230       /* Transformational functions of derived types with allocatable
6231          components must have the result allocatable components copied.  */
6232       arg = expr->value.function.actual;
6233       if (result && arg && expr->rank
6234             && expr->value.function.isym
6235             && expr->value.function.isym->transformational
6236             && arg->expr->ts.type == BT_DERIVED
6237             && arg->expr->ts.u.derived->attr.alloc_comp)
6238         {
6239           tree tmp2;
6240           /* Copy the allocatable components.  We have to use a
6241              temporary here to prevent source allocatable components
6242              from being corrupted.  */
6243           tmp2 = gfc_evaluate_now (result, &se->pre);
6244           tmp = gfc_copy_alloc_comp (arg->expr->ts.u.derived,
6245                                      result, tmp2, expr->rank, 0);
6246           gfc_add_expr_to_block (&se->pre, tmp);
6247           tmp = gfc_copy_allocatable_data (result, tmp2, TREE_TYPE(tmp2),
6248                                            expr->rank);
6249           gfc_add_expr_to_block (&se->pre, tmp);
6250
6251           /* Finally free the temporary's data field.  */
6252           tmp = gfc_conv_descriptor_data_get (tmp2);
6253           tmp = gfc_deallocate_with_status (tmp, NULL_TREE, NULL_TREE,
6254                                             NULL_TREE, NULL_TREE, true,
6255                                             NULL, GFC_CAF_COARRAY_NOCOARRAY);
6256           gfc_add_expr_to_block (&se->pre, tmp);
6257         }
6258     }
6259   else
6260     {
6261       /* For a function with a class array result, save the result as
6262          a temporary, set the info fields needed by the scalarizer and
6263          call the finalization function of the temporary. Note that the
6264          nullification of allocatable components needed by the result
6265          is done in gfc_trans_assignment_1.  */
6266       if (expr && ((gfc_is_alloc_class_array_function (expr)
6267                     && se->ss && se->ss->loop)
6268                    || gfc_is_alloc_class_scalar_function (expr))
6269           && se->expr && GFC_CLASS_TYPE_P (TREE_TYPE (se->expr))
6270           && expr->must_finalize)
6271         {
6272           tree final_fndecl;
6273           tree is_final;
6274           int n;
6275           if (se->ss && se->ss->loop)
6276             {
6277               se->expr = gfc_evaluate_now (se->expr, &se->ss->loop->pre);
6278               tmp = gfc_class_data_get (se->expr);
6279               info->descriptor = tmp;
6280               info->data = gfc_conv_descriptor_data_get (tmp);
6281               info->offset = gfc_conv_descriptor_offset_get (tmp);
6282               for (n = 0; n < se->ss->loop->dimen; n++)
6283                 {
6284                   tree dim = gfc_rank_cst[n];
6285                   se->ss->loop->to[n] = gfc_conv_descriptor_ubound_get (tmp, dim);
6286                   se->ss->loop->from[n] = gfc_conv_descriptor_lbound_get (tmp, dim);
6287                 }
6288             }
6289           else
6290             {
6291               /* TODO Eliminate the doubling of temporaries. This
6292                  one is necessary to ensure no memory leakage.  */
6293               se->expr = gfc_evaluate_now (se->expr, &se->pre);
6294               tmp = gfc_class_data_get (se->expr);
6295               tmp = gfc_conv_scalar_to_descriptor (se, tmp,
6296                         CLASS_DATA (expr->value.function.esym->result)->attr);
6297             }
6298
6299           final_fndecl = gfc_class_vtab_final_get (se->expr);
6300           is_final = fold_build2_loc (input_location, NE_EXPR,
6301                                       boolean_type_node,
6302                                       final_fndecl,
6303                                       fold_convert (TREE_TYPE (final_fndecl),
6304                                                     null_pointer_node));
6305           final_fndecl = build_fold_indirect_ref_loc (input_location,
6306                                                       final_fndecl);
6307           tmp = build_call_expr_loc (input_location,
6308                                      final_fndecl, 3,
6309                                      gfc_build_addr_expr (NULL, tmp),
6310                                      gfc_class_vtab_size_get (se->expr),
6311                                      boolean_false_node);
6312           tmp = fold_build3_loc (input_location, COND_EXPR,
6313                                  void_type_node, is_final, tmp,
6314                                  build_empty_stmt (input_location));
6315
6316           if (se->ss && se->ss->loop)
6317             {
6318               gfc_add_expr_to_block (&se->ss->loop->post, tmp);
6319               tmp = gfc_call_free (info->data);
6320               gfc_add_expr_to_block (&se->ss->loop->post, tmp);
6321             }
6322           else
6323             {
6324               gfc_add_expr_to_block (&se->post, tmp);
6325               tmp = gfc_class_data_get (se->expr);
6326               tmp = gfc_call_free (tmp);
6327               gfc_add_expr_to_block (&se->post, tmp);
6328             }
6329           expr->must_finalize = 0;
6330         }
6331
6332       gfc_add_block_to_block (&se->post, &post);
6333     }
6334
6335   return has_alternate_specifier;
6336 }
6337
6338
6339 /* Fill a character string with spaces.  */
6340
6341 static tree
6342 fill_with_spaces (tree start, tree type, tree size)
6343 {
6344   stmtblock_t block, loop;
6345   tree i, el, exit_label, cond, tmp;
6346
6347   /* For a simple char type, we can call memset().  */
6348   if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
6349     return build_call_expr_loc (input_location,
6350                             builtin_decl_explicit (BUILT_IN_MEMSET),
6351                             3, start,
6352                             build_int_cst (gfc_get_int_type (gfc_c_int_kind),
6353                                            lang_hooks.to_target_charset (' ')),
6354                             size);
6355
6356   /* Otherwise, we use a loop:
6357         for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
6358           *el = (type) ' ';
6359    */
6360
6361   /* Initialize variables.  */
6362   gfc_init_block (&block);
6363   i = gfc_create_var (sizetype, "i");
6364   gfc_add_modify (&block, i, fold_convert (sizetype, size));
6365   el = gfc_create_var (build_pointer_type (type), "el");
6366   gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
6367   exit_label = gfc_build_label_decl (NULL_TREE);
6368   TREE_USED (exit_label) = 1;
6369
6370
6371   /* Loop body.  */
6372   gfc_init_block (&loop);
6373
6374   /* Exit condition.  */
6375   cond = fold_build2_loc (input_location, LE_EXPR, boolean_type_node, i,
6376                           build_zero_cst (sizetype));
6377   tmp = build1_v (GOTO_EXPR, exit_label);
6378   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
6379                          build_empty_stmt (input_location));
6380   gfc_add_expr_to_block (&loop, tmp);
6381
6382   /* Assignment.  */
6383   gfc_add_modify (&loop,
6384                   fold_build1_loc (input_location, INDIRECT_REF, type, el),
6385                   build_int_cst (type, lang_hooks.to_target_charset (' ')));
6386
6387   /* Increment loop variables.  */
6388   gfc_add_modify (&loop, i,
6389                   fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
6390                                    TYPE_SIZE_UNIT (type)));
6391   gfc_add_modify (&loop, el,
6392                   fold_build_pointer_plus_loc (input_location,
6393                                                el, TYPE_SIZE_UNIT (type)));
6394
6395   /* Making the loop... actually loop!  */
6396   tmp = gfc_finish_block (&loop);
6397   tmp = build1_v (LOOP_EXPR, tmp);
6398   gfc_add_expr_to_block (&block, tmp);
6399
6400   /* The exit label.  */
6401   tmp = build1_v (LABEL_EXPR, exit_label);
6402   gfc_add_expr_to_block (&block, tmp);
6403
6404
6405   return gfc_finish_block (&block);
6406 }
6407
6408
6409 /* Generate code to copy a string.  */
6410
6411 void
6412 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
6413                        int dkind, tree slength, tree src, int skind)
6414 {
6415   tree tmp, dlen, slen;
6416   tree dsc;
6417   tree ssc;
6418   tree cond;
6419   tree cond2;
6420   tree tmp2;
6421   tree tmp3;
6422   tree tmp4;
6423   tree chartype;
6424   stmtblock_t tempblock;
6425
6426   gcc_assert (dkind == skind);
6427
6428   if (slength != NULL_TREE)
6429     {
6430       slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
6431       ssc = gfc_string_to_single_character (slen, src, skind);
6432     }
6433   else
6434     {
6435       slen = build_int_cst (size_type_node, 1);
6436       ssc =  src;
6437     }
6438
6439   if (dlength != NULL_TREE)
6440     {
6441       dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
6442       dsc = gfc_string_to_single_character (dlen, dest, dkind);
6443     }
6444   else
6445     {
6446       dlen = build_int_cst (size_type_node, 1);
6447       dsc =  dest;
6448     }
6449
6450   /* Assign directly if the types are compatible.  */
6451   if (dsc != NULL_TREE && ssc != NULL_TREE
6452       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
6453     {
6454       gfc_add_modify (block, dsc, ssc);
6455       return;
6456     }
6457
6458   /* The string copy algorithm below generates code like
6459
6460      if (dlen > 0) {
6461          memmove (dest, src, min(dlen, slen));
6462          if (slen < dlen)
6463              memset(&dest[slen], ' ', dlen - slen);
6464      }
6465   */
6466
6467   /* Do nothing if the destination length is zero.  */
6468   cond = fold_build2_loc (input_location, GT_EXPR, boolean_type_node, dlen,
6469                           build_int_cst (size_type_node, 0));
6470
6471   /* For non-default character kinds, we have to multiply the string
6472      length by the base type size.  */
6473   chartype = gfc_get_char_type (dkind);
6474   slen = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
6475                           fold_convert (size_type_node, slen),
6476                           fold_convert (size_type_node,
6477                                         TYPE_SIZE_UNIT (chartype)));
6478   dlen = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
6479                           fold_convert (size_type_node, dlen),
6480                           fold_convert (size_type_node,
6481                                         TYPE_SIZE_UNIT (chartype)));
6482
6483   if (dlength && POINTER_TYPE_P (TREE_TYPE (dest)))
6484     dest = fold_convert (pvoid_type_node, dest);
6485   else
6486     dest = gfc_build_addr_expr (pvoid_type_node, dest);
6487
6488   if (slength && POINTER_TYPE_P (TREE_TYPE (src)))
6489     src = fold_convert (pvoid_type_node, src);
6490   else
6491     src = gfc_build_addr_expr (pvoid_type_node, src);
6492
6493   /* First do the memmove. */
6494   tmp2 = fold_build2_loc (input_location, MIN_EXPR, TREE_TYPE (dlen), dlen,
6495                           slen);
6496   tmp2 = build_call_expr_loc (input_location,
6497                               builtin_decl_explicit (BUILT_IN_MEMMOVE),
6498                               3, dest, src, tmp2);
6499   stmtblock_t tmpblock2;
6500   gfc_init_block (&tmpblock2);
6501   gfc_add_expr_to_block (&tmpblock2, tmp2);
6502
6503   /* If the destination is longer, fill the end with spaces.  */
6504   cond2 = fold_build2_loc (input_location, LT_EXPR, boolean_type_node, slen,
6505                            dlen);
6506
6507   /* Wstringop-overflow appears at -O3 even though this warning is not
6508      explicitly available in fortran nor can it be switched off. If the
6509      source length is a constant, its negative appears as a very large
6510      postive number and triggers the warning in BUILTIN_MEMSET. Fixing
6511      the result of the MINUS_EXPR suppresses this spurious warning.  */
6512   tmp = fold_build2_loc (input_location, MINUS_EXPR,
6513                          TREE_TYPE(dlen), dlen, slen);
6514   if (slength && TREE_CONSTANT (slength))
6515     tmp = gfc_evaluate_now (tmp, block);
6516
6517   tmp4 = fold_build_pointer_plus_loc (input_location, dest, slen);
6518   tmp4 = fill_with_spaces (tmp4, chartype, tmp);
6519
6520   gfc_init_block (&tempblock);
6521   gfc_add_expr_to_block (&tempblock, tmp4);
6522   tmp3 = gfc_finish_block (&tempblock);
6523
6524   /* The whole copy_string function is there.  */
6525   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
6526                          tmp3, build_empty_stmt (input_location));
6527   gfc_add_expr_to_block (&tmpblock2, tmp);
6528   tmp = gfc_finish_block (&tmpblock2);
6529   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
6530                          build_empty_stmt (input_location));
6531   gfc_add_expr_to_block (block, tmp);
6532 }
6533
6534
6535 /* Translate a statement function.
6536    The value of a statement function reference is obtained by evaluating the
6537    expression using the values of the actual arguments for the values of the
6538    corresponding dummy arguments.  */
6539
6540 static void
6541 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
6542 {
6543   gfc_symbol *sym;
6544   gfc_symbol *fsym;
6545   gfc_formal_arglist *fargs;
6546   gfc_actual_arglist *args;
6547   gfc_se lse;
6548   gfc_se rse;
6549   gfc_saved_var *saved_vars;
6550   tree *temp_vars;
6551   tree type;
6552   tree tmp;
6553   int n;
6554
6555   sym = expr->symtree->n.sym;
6556   args = expr->value.function.actual;
6557   gfc_init_se (&lse, NULL);
6558   gfc_init_se (&rse, NULL);
6559
6560   n = 0;
6561   for (fargs = gfc_sym_get_dummy_args (sym); fargs; fargs = fargs->next)
6562     n++;
6563   saved_vars = XCNEWVEC (gfc_saved_var, n);
6564   temp_vars = XCNEWVEC (tree, n);
6565
6566   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
6567        fargs = fargs->next, n++)
6568     {
6569       /* Each dummy shall be specified, explicitly or implicitly, to be
6570          scalar.  */
6571       gcc_assert (fargs->sym->attr.dimension == 0);
6572       fsym = fargs->sym;
6573
6574       if (fsym->ts.type == BT_CHARACTER)
6575         {
6576           /* Copy string arguments.  */
6577           tree arglen;
6578
6579           gcc_assert (fsym->ts.u.cl && fsym->ts.u.cl->length
6580                       && fsym->ts.u.cl->length->expr_type == EXPR_CONSTANT);
6581
6582           /* Create a temporary to hold the value.  */
6583           if (fsym->ts.u.cl->backend_decl == NULL_TREE)
6584              fsym->ts.u.cl->backend_decl
6585                 = gfc_conv_constant_to_tree (fsym->ts.u.cl->length);
6586
6587           type = gfc_get_character_type (fsym->ts.kind, fsym->ts.u.cl);
6588           temp_vars[n] = gfc_create_var (type, fsym->name);
6589
6590           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
6591
6592           gfc_conv_expr (&rse, args->expr);
6593           gfc_conv_string_parameter (&rse);
6594           gfc_add_block_to_block (&se->pre, &lse.pre);
6595           gfc_add_block_to_block (&se->pre, &rse.pre);
6596
6597           gfc_trans_string_copy (&se->pre, arglen, temp_vars[n], fsym->ts.kind,
6598                                  rse.string_length, rse.expr, fsym->ts.kind);
6599           gfc_add_block_to_block (&se->pre, &lse.post);
6600           gfc_add_block_to_block (&se->pre, &rse.post);
6601         }
6602       else
6603         {
6604           /* For everything else, just evaluate the expression.  */
6605
6606           /* Create a temporary to hold the value.  */
6607           type = gfc_typenode_for_spec (&fsym->ts);
6608           temp_vars[n] = gfc_create_var (type, fsym->name);
6609
6610           gfc_conv_expr (&lse, args->expr);
6611
6612           gfc_add_block_to_block (&se->pre, &lse.pre);
6613           gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
6614           gfc_add_block_to_block (&se->pre, &lse.post);
6615         }
6616
6617       args = args->next;
6618     }
6619
6620   /* Use the temporary variables in place of the real ones.  */
6621   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
6622        fargs = fargs->next, n++)
6623     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
6624
6625   gfc_conv_expr (se, sym->value);
6626
6627   if (sym->ts.type == BT_CHARACTER)
6628     {
6629       gfc_conv_const_charlen (sym->ts.u.cl);
6630
6631       /* Force the expression to the correct length.  */
6632       if (!INTEGER_CST_P (se->string_length)
6633           || tree_int_cst_lt (se->string_length,
6634                               sym->ts.u.cl->backend_decl))
6635         {
6636           type = gfc_get_character_type (sym->ts.kind, sym->ts.u.cl);
6637           tmp = gfc_create_var (type, sym->name);
6638           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
6639           gfc_trans_string_copy (&se->pre, sym->ts.u.cl->backend_decl, tmp,
6640                                  sym->ts.kind, se->string_length, se->expr,
6641                                  sym->ts.kind);
6642           se->expr = tmp;
6643         }
6644       se->string_length = sym->ts.u.cl->backend_decl;
6645     }
6646
6647   /* Restore the original variables.  */
6648   for (fargs = gfc_sym_get_dummy_args (sym), n = 0; fargs;
6649        fargs = fargs->next, n++)
6650     gfc_restore_sym (fargs->sym, &saved_vars[n]);
6651   free (temp_vars);
6652   free (saved_vars);
6653 }
6654
6655
6656 /* Translate a function expression.  */
6657
6658 static void
6659 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
6660 {
6661   gfc_symbol *sym;
6662
6663   if (expr->value.function.isym)
6664     {
6665       gfc_conv_intrinsic_function (se, expr);
6666       return;
6667     }
6668
6669   /* expr.value.function.esym is the resolved (specific) function symbol for
6670      most functions.  However this isn't set for dummy procedures.  */
6671   sym = expr->value.function.esym;
6672   if (!sym)
6673     sym = expr->symtree->n.sym;
6674
6675   /* The IEEE_ARITHMETIC functions are caught here. */
6676   if (sym->from_intmod == INTMOD_IEEE_ARITHMETIC)
6677     if (gfc_conv_ieee_arithmetic_function (se, expr))
6678       return;
6679
6680   /* We distinguish statement functions from general functions to improve
6681      runtime performance.  */
6682   if (sym->attr.proc == PROC_ST_FUNCTION)
6683     {
6684       gfc_conv_statement_function (se, expr);
6685       return;
6686     }
6687
6688   gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr,
6689                            NULL);
6690 }
6691
6692
6693 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
6694
6695 static bool
6696 is_zero_initializer_p (gfc_expr * expr)
6697 {
6698   if (expr->expr_type != EXPR_CONSTANT)
6699     return false;
6700
6701   /* We ignore constants with prescribed memory representations for now.  */
6702   if (expr->representation.string)
6703     return false;
6704
6705   switch (expr->ts.type)
6706     {
6707     case BT_INTEGER:
6708       return mpz_cmp_si (expr->value.integer, 0) == 0;
6709
6710     case BT_REAL:
6711       return mpfr_zero_p (expr->value.real)
6712              && MPFR_SIGN (expr->value.real) >= 0;
6713
6714     case BT_LOGICAL:
6715       return expr->value.logical == 0;
6716
6717     case BT_COMPLEX:
6718       return mpfr_zero_p (mpc_realref (expr->value.complex))
6719              && MPFR_SIGN (mpc_realref (expr->value.complex)) >= 0
6720              && mpfr_zero_p (mpc_imagref (expr->value.complex))
6721              && MPFR_SIGN (mpc_imagref (expr->value.complex)) >= 0;
6722
6723     default:
6724       break;
6725     }
6726   return false;
6727 }
6728
6729
6730 static void
6731 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
6732 {
6733   gfc_ss *ss;
6734
6735   ss = se->ss;
6736   gcc_assert (ss != NULL && ss != gfc_ss_terminator);
6737   gcc_assert (ss->info->expr == expr && ss->info->type == GFC_SS_CONSTRUCTOR);
6738
6739   gfc_conv_tmp_array_ref (se);
6740 }
6741
6742
6743 /* Build a static initializer.  EXPR is the expression for the initial value.
6744    The other parameters describe the variable of the component being
6745    initialized. EXPR may be null.  */
6746
6747 tree
6748 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
6749                       bool array, bool pointer, bool procptr)
6750 {
6751   gfc_se se;
6752
6753   if (flag_coarray != GFC_FCOARRAY_LIB && ts->type == BT_DERIVED
6754       && ts->u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
6755       && ts->u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)
6756     return build_constructor (type, NULL);
6757
6758   if (!(expr || pointer || procptr))
6759     return NULL_TREE;
6760
6761   /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
6762      (these are the only two iso_c_binding derived types that can be
6763      used as initialization expressions).  If so, we need to modify
6764      the 'expr' to be that for a (void *).  */
6765   if (expr != NULL && expr->ts.type == BT_DERIVED
6766       && expr->ts.is_iso_c && expr->ts.u.derived)
6767     {
6768       gfc_symbol *derived = expr->ts.u.derived;
6769
6770       /* The derived symbol has already been converted to a (void *).  Use
6771          its kind.  */
6772       expr = gfc_get_int_expr (derived->ts.kind, NULL, 0);
6773       expr->ts.f90_type = derived->ts.f90_type;
6774
6775       gfc_init_se (&se, NULL);
6776       gfc_conv_constant (&se, expr);
6777       gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
6778       return se.expr;
6779     }
6780
6781   if (array && !procptr)
6782     {
6783       tree ctor;
6784       /* Arrays need special handling.  */
6785       if (pointer)
6786         ctor = gfc_build_null_descriptor (type);
6787       /* Special case assigning an array to zero.  */
6788       else if (is_zero_initializer_p (expr))
6789         ctor = build_constructor (type, NULL);
6790       else
6791         ctor = gfc_conv_array_initializer (type, expr);
6792       TREE_STATIC (ctor) = 1;
6793       return ctor;
6794     }
6795   else if (pointer || procptr)
6796     {
6797       if (ts->type == BT_CLASS && !procptr)
6798         {
6799           gfc_init_se (&se, NULL);
6800           gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1);
6801           gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR);
6802           TREE_STATIC (se.expr) = 1;
6803           return se.expr;
6804         }
6805       else if (!expr || expr->expr_type == EXPR_NULL)
6806         return fold_convert (type, null_pointer_node);
6807       else
6808         {
6809           gfc_init_se (&se, NULL);
6810           se.want_pointer = 1;
6811           gfc_conv_expr (&se, expr);
6812           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
6813           return se.expr;
6814         }
6815     }
6816   else
6817     {
6818       switch (ts->type)
6819         {
6820         case_bt_struct:
6821         case BT_CLASS:
6822           gfc_init_se (&se, NULL);
6823           if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL)
6824             gfc_conv_structure (&se, gfc_class_initializer (ts, expr), 1);
6825           else
6826             gfc_conv_structure (&se, expr, 1);
6827           gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR);
6828           TREE_STATIC (se.expr) = 1;
6829           return se.expr;
6830
6831         case BT_CHARACTER:
6832           {
6833             tree ctor = gfc_conv_string_init (ts->u.cl->backend_decl,expr);
6834             TREE_STATIC (ctor) = 1;
6835             return ctor;
6836           }
6837
6838         default:
6839           gfc_init_se (&se, NULL);
6840           gfc_conv_constant (&se, expr);
6841           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
6842           return se.expr;
6843         }
6844     }
6845 }
6846
6847 static tree
6848 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
6849 {
6850   gfc_se rse;
6851   gfc_se lse;
6852   gfc_ss *rss;
6853   gfc_ss *lss;
6854   gfc_array_info *lss_array;
6855   stmtblock_t body;
6856   stmtblock_t block;
6857   gfc_loopinfo loop;
6858   int n;
6859   tree tmp;
6860
6861   gfc_start_block (&block);
6862
6863   /* Initialize the scalarizer.  */
6864   gfc_init_loopinfo (&loop);
6865
6866   gfc_init_se (&lse, NULL);
6867   gfc_init_se (&rse, NULL);
6868
6869   /* Walk the rhs.  */
6870   rss = gfc_walk_expr (expr);
6871   if (rss == gfc_ss_terminator)
6872     /* The rhs is scalar.  Add a ss for the expression.  */
6873     rss = gfc_get_scalar_ss (gfc_ss_terminator, expr);
6874
6875   /* Create a SS for the destination.  */
6876   lss = gfc_get_array_ss (gfc_ss_terminator, NULL, cm->as->rank,
6877                           GFC_SS_COMPONENT);
6878   lss_array = &lss->info->data.array;
6879   lss_array->shape = gfc_get_shape (cm->as->rank);
6880   lss_array->descriptor = dest;
6881   lss_array->data = gfc_conv_array_data (dest);
6882   lss_array->offset = gfc_conv_array_offset (dest);
6883   for (n = 0; n < cm->as->rank; n++)
6884     {
6885       lss_array->start[n] = gfc_conv_array_lbound (dest, n);
6886       lss_array->stride[n] = gfc_index_one_node;
6887
6888       mpz_init (lss_array->shape[n]);
6889       mpz_sub (lss_array->shape[n], cm->as->upper[n]->value.integer,
6890                cm->as->lower[n]->value.integer);
6891       mpz_add_ui (lss_array->shape[n], lss_array->shape[n], 1);
6892     }
6893
6894   /* Associate the SS with the loop.  */
6895   gfc_add_ss_to_loop (&loop, lss);
6896   gfc_add_ss_to_loop (&loop, rss);
6897
6898   /* Calculate the bounds of the scalarization.  */
6899   gfc_conv_ss_startstride (&loop);
6900
6901   /* Setup the scalarizing loops.  */
6902   gfc_conv_loop_setup (&loop, &expr->where);
6903
6904   /* Setup the gfc_se structures.  */
6905   gfc_copy_loopinfo_to_se (&lse, &loop);
6906   gfc_copy_loopinfo_to_se (&rse, &loop);
6907
6908   rse.ss = rss;
6909   gfc_mark_ss_chain_used (rss, 1);
6910   lse.ss = lss;
6911   gfc_mark_ss_chain_used (lss, 1);
6912
6913   /* Start the scalarized loop body.  */
6914   gfc_start_scalarized_body (&loop, &body);
6915
6916   gfc_conv_tmp_array_ref (&lse);
6917   if (cm->ts.type == BT_CHARACTER)
6918     lse.string_length = cm->ts.u.cl->backend_decl;
6919
6920   gfc_conv_expr (&rse, expr);
6921
6922   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
6923   gfc_add_expr_to_block (&body, tmp);
6924
6925   gcc_assert (rse.ss == gfc_ss_terminator);
6926
6927   /* Generate the copying loops.  */
6928   gfc_trans_scalarizing_loops (&loop, &body);
6929
6930   /* Wrap the whole thing up.  */
6931   gfc_add_block_to_block (&block, &loop.pre);
6932   gfc_add_block_to_block (&block, &loop.post);
6933
6934   gcc_assert (lss_array->shape != NULL);
6935   gfc_free_shape (&lss_array->shape, cm->as->rank);
6936   gfc_cleanup_loop (&loop);
6937
6938   return gfc_finish_block (&block);
6939 }
6940
6941
6942 static tree
6943 gfc_trans_alloc_subarray_assign (tree dest, gfc_component * cm,
6944                                  gfc_expr * expr)
6945 {
6946   gfc_se se;
6947   stmtblock_t block;
6948   tree offset;
6949   int n;
6950   tree tmp;
6951   tree tmp2;
6952   gfc_array_spec *as;
6953   gfc_expr *arg = NULL;
6954
6955   gfc_start_block (&block);
6956   gfc_init_se (&se, NULL);
6957
6958   /* Get the descriptor for the expressions.  */
6959   se.want_pointer = 0;
6960   gfc_conv_expr_descriptor (&se, expr);
6961   gfc_add_block_to_block (&block, &se.pre);
6962   gfc_add_modify (&block, dest, se.expr);
6963
6964   /* Deal with arrays of derived types with allocatable components.  */
6965   if (gfc_bt_struct (cm->ts.type)
6966         && cm->ts.u.derived->attr.alloc_comp)
6967     // TODO: Fix caf_mode
6968     tmp = gfc_copy_alloc_comp (cm->ts.u.derived,
6969                                se.expr, dest,
6970                                cm->as->rank, 0);
6971   else if (cm->ts.type == BT_CLASS && expr->ts.type == BT_DERIVED
6972            && CLASS_DATA(cm)->attr.allocatable)
6973     {
6974       if (cm->ts.u.derived->attr.alloc_comp)
6975         // TODO: Fix caf_mode
6976         tmp = gfc_copy_alloc_comp (expr->ts.u.derived,
6977                                    se.expr, dest,
6978                                    expr->rank, 0);
6979       else
6980         {
6981           tmp = TREE_TYPE (dest);
6982           tmp = gfc_duplicate_allocatable (dest, se.expr,
6983                                            tmp, expr->rank, NULL_TREE);
6984         }
6985     }
6986   else
6987     tmp = gfc_duplicate_allocatable (dest, se.expr,
6988                                      TREE_TYPE(cm->backend_decl),
6989                                      cm->as->rank, NULL_TREE);
6990
6991   gfc_add_expr_to_block (&block, tmp);
6992   gfc_add_block_to_block (&block, &se.post);
6993
6994   if (expr->expr_type != EXPR_VARIABLE)
6995     gfc_conv_descriptor_data_set (&block, se.expr,
6996                                   null_pointer_node);
6997
6998   /* We need to know if the argument of a conversion function is a
6999      variable, so that the correct lower bound can be used.  */
7000   if (expr->expr_type == EXPR_FUNCTION
7001         && expr->value.function.isym
7002         && expr->value.function.isym->conversion
7003         && expr->value.function.actual->expr
7004         && expr->value.function.actual->expr->expr_type == EXPR_VARIABLE)
7005     arg = expr->value.function.actual->expr;
7006
7007   /* Obtain the array spec of full array references.  */
7008   if (arg)
7009     as = gfc_get_full_arrayspec_from_expr (arg);
7010   else
7011     as = gfc_get_full_arrayspec_from_expr (expr);
7012
7013   /* Shift the lbound and ubound of temporaries to being unity,
7014      rather than zero, based. Always calculate the offset.  */
7015   offset = gfc_conv_descriptor_offset_get (dest);
7016   gfc_add_modify (&block, offset, gfc_index_zero_node);
7017   tmp2 =gfc_create_var (gfc_array_index_type, NULL);
7018
7019   for (n = 0; n < expr->rank; n++)
7020     {
7021       tree span;
7022       tree lbound;
7023
7024       /* Obtain the correct lbound - ISO/IEC TR 15581:2001 page 9.
7025          TODO It looks as if gfc_conv_expr_descriptor should return
7026          the correct bounds and that the following should not be
7027          necessary.  This would simplify gfc_conv_intrinsic_bound
7028          as well.  */
7029       if (as && as->lower[n])
7030         {
7031           gfc_se lbse;
7032           gfc_init_se (&lbse, NULL);
7033           gfc_conv_expr (&lbse, as->lower[n]);
7034           gfc_add_block_to_block (&block, &lbse.pre);
7035           lbound = gfc_evaluate_now (lbse.expr, &block);
7036         }
7037       else if (as && arg)
7038         {
7039           tmp = gfc_get_symbol_decl (arg->symtree->n.sym);
7040           lbound = gfc_conv_descriptor_lbound_get (tmp,
7041                                         gfc_rank_cst[n]);
7042         }
7043       else if (as)
7044         lbound = gfc_conv_descriptor_lbound_get (dest,
7045                                                 gfc_rank_cst[n]);
7046       else
7047         lbound = gfc_index_one_node;
7048
7049       lbound = fold_convert (gfc_array_index_type, lbound);
7050
7051       /* Shift the bounds and set the offset accordingly.  */
7052       tmp = gfc_conv_descriptor_ubound_get (dest, gfc_rank_cst[n]);
7053       span = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
7054                 tmp, gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]));
7055       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
7056                              span, lbound);
7057       gfc_conv_descriptor_ubound_set (&block, dest,
7058                                       gfc_rank_cst[n], tmp);
7059       gfc_conv_descriptor_lbound_set (&block, dest,
7060                                       gfc_rank_cst[n], lbound);
7061
7062       tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
7063                          gfc_conv_descriptor_lbound_get (dest,
7064                                                          gfc_rank_cst[n]),
7065                          gfc_conv_descriptor_stride_get (dest,
7066                                                          gfc_rank_cst[n]));
7067       gfc_add_modify (&block, tmp2, tmp);
7068       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
7069                              offset, tmp2);
7070       gfc_conv_descriptor_offset_set (&block, dest, tmp);
7071     }
7072
7073   if (arg)
7074     {
7075       /* If a conversion expression has a null data pointer
7076          argument, nullify the allocatable component.  */
7077       tree non_null_expr;
7078       tree null_expr;
7079
7080       if (arg->symtree->n.sym->attr.allocatable
7081             || arg->symtree->n.sym->attr.pointer)
7082         {
7083           non_null_expr = gfc_finish_block (&block);
7084           gfc_start_block (&block);
7085           gfc_conv_descriptor_data_set (&block, dest,
7086                                         null_pointer_node);
7087           null_expr = gfc_finish_block (&block);
7088           tmp = gfc_conv_descriptor_data_get (arg->symtree->n.sym->backend_decl);
7089           tmp = build2_loc (input_location, EQ_EXPR, boolean_type_node, tmp,
7090                             fold_convert (TREE_TYPE (tmp), null_pointer_node));
7091           return build3_v (COND_EXPR, tmp,
7092                            null_expr, non_null_expr);
7093         }
7094     }
7095
7096   return gfc_finish_block (&block);
7097 }
7098
7099
7100 /* Allocate or reallocate scalar component, as necessary.  */
7101
7102 static void
7103 alloc_scalar_allocatable_for_subcomponent_assignment (stmtblock_t *block,
7104                                                       tree comp,
7105                                                       gfc_component *cm,
7106                                                       gfc_expr *expr2,
7107                                                       gfc_symbol *sym)
7108 {
7109   tree tmp;
7110   tree ptr;
7111   tree size;
7112   tree size_in_bytes;
7113   tree lhs_cl_size = NULL_TREE;
7114
7115   if (!comp)
7116     return;
7117
7118   if (!expr2 || expr2->rank)
7119     return;
7120
7121   realloc_lhs_warning (expr2->ts.type, false, &expr2->where);
7122
7123   if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
7124     {
7125       char name[GFC_MAX_SYMBOL_LEN+9];
7126       gfc_component *strlen;
7127       /* Use the rhs string length and the lhs element size.  */
7128       gcc_assert (expr2->ts.type == BT_CHARACTER);
7129       if (!expr2->ts.u.cl->backend_decl)
7130         {
7131           gfc_conv_string_length (expr2->ts.u.cl, expr2, block);
7132           gcc_assert (expr2->ts.u.cl->backend_decl);
7133         }
7134
7135       size = expr2->ts.u.cl->backend_decl;
7136
7137       /* Ensure that cm->ts.u.cl->backend_decl is a componentref to _%s_length
7138          component.  */
7139       sprintf (name, "_%s_length", cm->name);
7140       strlen = gfc_find_component (sym, name, true, true, NULL);
7141       lhs_cl_size = fold_build3_loc (input_location, COMPONENT_REF,
7142                                      gfc_charlen_type_node,
7143                                      TREE_OPERAND (comp, 0),
7144                                      strlen->backend_decl, NULL_TREE);
7145
7146       tmp = TREE_TYPE (gfc_typenode_for_spec (&cm->ts));
7147       tmp = TYPE_SIZE_UNIT (tmp);
7148       size_in_bytes = fold_build2_loc (input_location, MULT_EXPR,
7149                                        TREE_TYPE (tmp), tmp,
7150                                        fold_convert (TREE_TYPE (tmp), size));
7151     }
7152   else if (cm->ts.type == BT_CLASS)
7153     {
7154       gcc_assert (expr2->ts.type == BT_CLASS || expr2->ts.type == BT_DERIVED);
7155       if (expr2->ts.type == BT_DERIVED)
7156         {
7157           tmp = gfc_get_symbol_decl (expr2->ts.u.derived);
7158           size = TYPE_SIZE_UNIT (tmp);
7159         }
7160       else
7161         {
7162           gfc_expr *e2vtab;
7163           gfc_se se;
7164           e2vtab = gfc_find_and_cut_at_last_class_ref (expr2);
7165           gfc_add_vptr_component (e2vtab);
7166           gfc_add_size_component (e2vtab);
7167           gfc_init_se (&se, NULL);
7168           gfc_conv_expr (&se, e2vtab);
7169           gfc_add_block_to_block (block, &se.pre);
7170           size = fold_convert (size_type_node, se.expr);
7171           gfc_free_expr (e2vtab);
7172         }
7173       size_in_bytes = size;
7174     }
7175   else
7176     {
7177       /* Otherwise use the length in bytes of the rhs.  */
7178       size = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&cm->ts));
7179       size_in_bytes = size;
7180     }
7181
7182   size_in_bytes = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
7183                                    size_in_bytes, size_one_node);
7184
7185   if (cm->ts.type == BT_DERIVED && cm->ts.u.derived->attr.alloc_comp)
7186     {
7187       tmp = build_call_expr_loc (input_location,
7188                                  builtin_decl_explicit (BUILT_IN_CALLOC),
7189                                  2, build_one_cst (size_type_node),
7190                                  size_in_bytes);
7191       tmp = fold_convert (TREE_TYPE (comp), tmp);
7192       gfc_add_modify (block, comp, tmp);
7193     }
7194   else
7195     {
7196       tmp = build_call_expr_loc (input_location,
7197                                  builtin_decl_explicit (BUILT_IN_MALLOC),
7198                                  1, size_in_bytes);
7199       if (GFC_CLASS_TYPE_P (TREE_TYPE (comp)))
7200         ptr = gfc_class_data_get (comp);
7201       else
7202         ptr = comp;
7203       tmp = fold_convert (TREE_TYPE (ptr), tmp);
7204       gfc_add_modify (block, ptr, tmp);
7205     }
7206
7207   if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
7208     /* Update the lhs character length.  */
7209     gfc_add_modify (block, lhs_cl_size, size);
7210 }
7211
7212
7213 /* Assign a single component of a derived type constructor.  */
7214
7215 static tree
7216 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr,
7217                                gfc_symbol *sym, bool init)
7218 {
7219   gfc_se se;
7220   gfc_se lse;
7221   stmtblock_t block;
7222   tree tmp;
7223   tree vtab;
7224
7225   gfc_start_block (&block);
7226
7227   if (cm->attr.pointer || cm->attr.proc_pointer)
7228     {
7229       /* Only care about pointers here, not about allocatables.  */
7230       gfc_init_se (&se, NULL);
7231       /* Pointer component.  */
7232       if ((cm->attr.dimension || cm->attr.codimension)
7233           && !cm->attr.proc_pointer)
7234         {
7235           /* Array pointer.  */
7236           if (expr->expr_type == EXPR_NULL)
7237             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
7238           else
7239             {
7240               se.direct_byref = 1;
7241               se.expr = dest;
7242               gfc_conv_expr_descriptor (&se, expr);
7243               gfc_add_block_to_block (&block, &se.pre);
7244               gfc_add_block_to_block (&block, &se.post);
7245             }
7246         }
7247       else
7248         {
7249           /* Scalar pointers.  */
7250           se.want_pointer = 1;
7251           gfc_conv_expr (&se, expr);
7252           gfc_add_block_to_block (&block, &se.pre);
7253
7254           if (expr->symtree && expr->symtree->n.sym->attr.proc_pointer
7255               && expr->symtree->n.sym->attr.dummy)
7256             se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
7257
7258           gfc_add_modify (&block, dest,
7259                                fold_convert (TREE_TYPE (dest), se.expr));
7260           gfc_add_block_to_block (&block, &se.post);
7261         }
7262     }
7263   else if (cm->ts.type == BT_CLASS && expr->expr_type == EXPR_NULL)
7264     {
7265       /* NULL initialization for CLASS components.  */
7266       tmp = gfc_trans_structure_assign (dest,
7267                                         gfc_class_initializer (&cm->ts, expr),
7268                                         false);
7269       gfc_add_expr_to_block (&block, tmp);
7270     }
7271   else if ((cm->attr.dimension || cm->attr.codimension)
7272            && !cm->attr.proc_pointer)
7273     {
7274       if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
7275         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
7276       else if (cm->attr.allocatable)
7277         {
7278           tmp = gfc_trans_alloc_subarray_assign (dest, cm, expr);
7279           gfc_add_expr_to_block (&block, tmp);
7280         }
7281       else
7282         {
7283           tmp = gfc_trans_subarray_assign (dest, cm, expr);
7284           gfc_add_expr_to_block (&block, tmp);
7285         }
7286     }
7287   else if (cm->ts.type == BT_CLASS
7288            && CLASS_DATA (cm)->attr.dimension
7289            && CLASS_DATA (cm)->attr.allocatable
7290            && expr->ts.type == BT_DERIVED)
7291     {
7292       vtab = gfc_get_symbol_decl (gfc_find_vtab (&expr->ts));
7293       vtab = gfc_build_addr_expr (NULL_TREE, vtab);
7294       tmp = gfc_class_vptr_get (dest);
7295       gfc_add_modify (&block, tmp,
7296                       fold_convert (TREE_TYPE (tmp), vtab));
7297       tmp = gfc_class_data_get (dest);
7298       tmp = gfc_trans_alloc_subarray_assign (tmp, cm, expr);
7299       gfc_add_expr_to_block (&block, tmp);
7300     }
7301   else if (init && cm->attr.allocatable && expr->expr_type == EXPR_NULL)
7302     {
7303       /* NULL initialization for allocatable components.  */
7304       gfc_add_modify (&block, dest, fold_convert (TREE_TYPE (dest),
7305                                                   null_pointer_node));
7306     }
7307   else if (init && (cm->attr.allocatable
7308            || (cm->ts.type == BT_CLASS && CLASS_DATA (cm)->attr.allocatable
7309                && expr->ts.type != BT_CLASS)))
7310     {
7311       /* Take care about non-array allocatable components here.  The alloc_*
7312          routine below is motivated by the alloc_scalar_allocatable_for_
7313          assignment() routine, but with the realloc portions removed and
7314          different input.  */
7315       alloc_scalar_allocatable_for_subcomponent_assignment (&block,
7316                                                             dest,
7317                                                             cm,
7318                                                             expr,
7319                                                             sym);
7320       /* The remainder of these instructions follow the if (cm->attr.pointer)
7321          if (!cm->attr.dimension) part above.  */
7322       gfc_init_se (&se, NULL);
7323       gfc_conv_expr (&se, expr);
7324       gfc_add_block_to_block (&block, &se.pre);
7325
7326       if (expr->symtree && expr->symtree->n.sym->attr.proc_pointer
7327           && expr->symtree->n.sym->attr.dummy)
7328         se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
7329
7330       if (cm->ts.type == BT_CLASS && expr->ts.type == BT_DERIVED)
7331         {
7332           tmp = gfc_class_data_get (dest);
7333           tmp = build_fold_indirect_ref_loc (input_location, tmp);
7334           vtab = gfc_get_symbol_decl (gfc_find_vtab (&expr->ts));
7335           vtab = gfc_build_addr_expr (NULL_TREE, vtab);
7336           gfc_add_modify (&block, gfc_class_vptr_get (dest),
7337                  fold_convert (TREE_TYPE (gfc_class_vptr_get (dest)), vtab));
7338         }
7339       else
7340         tmp = build_fold_indirect_ref_loc (input_location, dest);
7341
7342       /* For deferred strings insert a memcpy.  */
7343       if (cm->ts.type == BT_CHARACTER && cm->ts.deferred)
7344         {
7345           tree size;
7346           gcc_assert (se.string_length || expr->ts.u.cl->backend_decl);
7347           size = size_of_string_in_bytes (cm->ts.kind, se.string_length
7348                                                 ? se.string_length
7349                                                 : expr->ts.u.cl->backend_decl);
7350           tmp = gfc_build_memcpy_call (tmp, se.expr, size);
7351           gfc_add_expr_to_block (&block, tmp);
7352         }
7353       else
7354         gfc_add_modify (&block, tmp,
7355                         fold_convert (TREE_TYPE (tmp), se.expr));
7356       gfc_add_block_to_block (&block, &se.post);
7357     }
7358   else if (expr->ts.type == BT_UNION)
7359     {
7360       tree tmp;
7361       gfc_constructor *c = gfc_constructor_first (expr->value.constructor);
7362       /* We mark that the entire union should be initialized with a contrived
7363          EXPR_NULL expression at the beginning.  */
7364       if (c != NULL && c->n.component == NULL
7365           && c->expr != NULL && c->expr->expr_type == EXPR_NULL)
7366         {
7367           tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
7368                             dest, build_constructor (TREE_TYPE (dest), NULL));
7369           gfc_add_expr_to_block (&block, tmp);
7370           c = gfc_constructor_next (c);
7371         }
7372       /* The following constructor expression, if any, represents a specific
7373          map intializer, as given by the user.  */
7374       if (c != NULL && c->expr != NULL)
7375         {
7376           gcc_assert (expr->expr_type == EXPR_STRUCTURE);
7377           tmp = gfc_trans_structure_assign (dest, expr, expr->symtree != NULL);
7378           gfc_add_expr_to_block (&block, tmp);
7379         }
7380     }
7381   else if (expr->ts.type == BT_DERIVED && expr->ts.f90_type != BT_VOID)
7382     {
7383       if (expr->expr_type != EXPR_STRUCTURE)
7384         {
7385           tree dealloc = NULL_TREE;
7386           gfc_init_se (&se, NULL);
7387           gfc_conv_expr (&se, expr);
7388           gfc_add_block_to_block (&block, &se.pre);
7389           /* Prevent repeat evaluations in gfc_copy_alloc_comp by fixing the
7390              expression in  a temporary variable and deallocate the allocatable
7391              components. Then we can the copy the expression to the result.  */
7392           if (cm->ts.u.derived->attr.alloc_comp
7393               && expr->expr_type != EXPR_VARIABLE)
7394             {
7395               se.expr = gfc_evaluate_now (se.expr, &block);
7396               dealloc = gfc_deallocate_alloc_comp (cm->ts.u.derived, se.expr,
7397                                                    expr->rank);
7398             }
7399           gfc_add_modify (&block, dest,
7400                           fold_convert (TREE_TYPE (dest), se.expr));
7401           if (cm->ts.u.derived->attr.alloc_comp
7402               && expr->expr_type != EXPR_NULL)
7403             {
7404               // TODO: Fix caf_mode
7405               tmp = gfc_copy_alloc_comp (cm->ts.u.derived, se.expr,
7406                                          dest, expr->rank, 0);
7407               gfc_add_expr_to_block (&block, tmp);
7408               if (dealloc != NULL_TREE)
7409                 gfc_add_expr_to_block (&block, dealloc);
7410             }
7411           gfc_add_block_to_block (&block, &se.post);
7412         }
7413       else
7414         {
7415           /* Nested constructors.  */
7416           tmp = gfc_trans_structure_assign (dest, expr, expr->symtree != NULL);
7417           gfc_add_expr_to_block (&block, tmp);
7418         }
7419     }
7420   else if (gfc_deferred_strlen (cm, &tmp))
7421     {
7422       tree strlen;
7423       strlen = tmp;
7424       gcc_assert (strlen);
7425       strlen = fold_build3_loc (input_location, COMPONENT_REF,
7426                                 TREE_TYPE (strlen),
7427                                 TREE_OPERAND (dest, 0),
7428                                 strlen, NULL_TREE);
7429
7430       if (expr->expr_type == EXPR_NULL)
7431         {
7432           tmp = build_int_cst (TREE_TYPE (cm->backend_decl), 0);
7433           gfc_add_modify (&block, dest, tmp);
7434           tmp = build_int_cst (TREE_TYPE (strlen), 0);
7435           gfc_add_modify (&block, strlen, tmp);
7436         }
7437       else
7438         {
7439           tree size;
7440           gfc_init_se (&se, NULL);
7441           gfc_conv_expr (&se, expr);
7442           size = size_of_string_in_bytes (cm->ts.kind, se.string_length);
7443           tmp = build_call_expr_loc (input_location,
7444                                      builtin_decl_explicit (BUILT_IN_MALLOC),
7445                                      1, size);
7446           gfc_add_modify (&block, dest,
7447                           fold_convert (TREE_TYPE (dest), tmp));
7448           gfc_add_modify (&block, strlen, se.string_length);
7449           tmp = gfc_build_memcpy_call (dest, se.expr, size);
7450           gfc_add_expr_to_block (&block, tmp);
7451         }
7452     }
7453   else if (!cm->attr.artificial)
7454     {
7455       /* Scalar component (excluding deferred parameters).  */
7456       gfc_init_se (&se, NULL);
7457       gfc_init_se (&lse, NULL);
7458
7459       gfc_conv_expr (&se, expr);
7460       if (cm->ts.type == BT_CHARACTER)
7461         lse.string_length = cm->ts.u.cl->backend_decl;
7462       lse.expr = dest;
7463       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, false, false);
7464       gfc_add_expr_to_block (&block, tmp);
7465     }
7466   return gfc_finish_block (&block);
7467 }
7468
7469 /* Assign a derived type constructor to a variable.  */
7470
7471 tree
7472 gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray)
7473 {
7474   gfc_constructor *c;
7475   gfc_component *cm;
7476   stmtblock_t block;
7477   tree field;
7478   tree tmp;
7479   gfc_se se;
7480
7481   gfc_start_block (&block);
7482   cm = expr->ts.u.derived->components;
7483
7484   if (expr->ts.u.derived->from_intmod == INTMOD_ISO_C_BINDING
7485       && (expr->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR
7486           || expr->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR))
7487     {
7488       gfc_se lse;
7489
7490       gfc_init_se (&se, NULL);
7491       gfc_init_se (&lse, NULL);
7492       gfc_conv_expr (&se, gfc_constructor_first (expr->value.constructor)->expr);
7493       lse.expr = dest;
7494       gfc_add_modify (&block, lse.expr,
7495                       fold_convert (TREE_TYPE (lse.expr), se.expr));
7496
7497       return gfc_finish_block (&block);
7498     }
7499
7500   if (coarray)
7501     gfc_init_se (&se, NULL);
7502
7503   for (c = gfc_constructor_first (expr->value.constructor);
7504        c; c = gfc_constructor_next (c), cm = cm->next)
7505     {
7506       /* Skip absent members in default initializers.  */
7507       if (!c->expr && !cm->attr.allocatable)
7508         continue;
7509
7510       /* Register the component with the caf-lib before it is initialized.
7511          Register only allocatable components, that are not coarray'ed
7512          components (%comp[*]).  Only register when the constructor is not the
7513          null-expression.  */
7514       if (coarray && !cm->attr.codimension
7515           && (cm->attr.allocatable || cm->attr.pointer)
7516           && (!c->expr || c->expr->expr_type == EXPR_NULL))
7517         {
7518           tree token, desc, size;
7519           bool is_array = cm->ts.type == BT_CLASS
7520               ? CLASS_DATA (cm)->attr.dimension : cm->attr.dimension;
7521
7522           field = cm->backend_decl;
7523           field = fold_build3_loc (input_location, COMPONENT_REF,
7524                                    TREE_TYPE (field), dest, field, NULL_TREE);
7525           if (cm->ts.type == BT_CLASS)
7526             field = gfc_class_data_get (field);
7527
7528           token = is_array ? gfc_conv_descriptor_token (field)
7529                            : fold_build3_loc (input_location, COMPONENT_REF,
7530                                               TREE_TYPE (cm->caf_token), dest,
7531                                               cm->caf_token, NULL_TREE);
7532
7533           if (is_array)
7534             {
7535               /* The _caf_register routine looks at the rank of the array
7536                  descriptor to decide whether the data registered is an array
7537                  or not.  */
7538               int rank = cm->ts.type == BT_CLASS ? CLASS_DATA (cm)->as->rank
7539                                                  : cm->as->rank;
7540               /* When the rank is not known just set a positive rank, which
7541                  suffices to recognize the data as array.  */
7542               if (rank < 0)
7543                 rank = 1;
7544               size = integer_zero_node;
7545               desc = field;
7546               gfc_add_modify (&block, gfc_conv_descriptor_dtype (desc),
7547                               build_int_cst (gfc_array_index_type, rank));
7548             }
7549           else
7550             {
7551               desc = gfc_conv_scalar_to_descriptor (&se, field,
7552                                                     cm->ts.type == BT_CLASS
7553                                                     ? CLASS_DATA (cm)->attr
7554                                                     : cm->attr);
7555               size = TYPE_SIZE_UNIT (TREE_TYPE (field));
7556             }
7557           gfc_add_block_to_block (&block, &se.pre);
7558           tmp =  build_call_expr_loc (input_location, gfor_fndecl_caf_register,
7559                                       7, size, build_int_cst (
7560                                         integer_type_node,
7561                                         GFC_CAF_COARRAY_ALLOC_REGISTER_ONLY),
7562                                       gfc_build_addr_expr (pvoid_type_node,
7563                                                            token),
7564                                       gfc_build_addr_expr (NULL_TREE, desc),
7565                                       null_pointer_node, null_pointer_node,
7566                                       integer_zero_node);
7567           gfc_add_expr_to_block (&block, tmp);
7568         }
7569       field = cm->backend_decl;
7570       tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
7571                              dest, field, NULL_TREE);
7572       if (!c->expr)
7573         {
7574           gfc_expr *e = gfc_get_null_expr (NULL);
7575           tmp = gfc_trans_subcomponent_assign (tmp, cm, e, expr->ts.u.derived,
7576                                                init);
7577           gfc_free_expr (e);
7578         }
7579       else
7580         tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr,
7581                                              expr->ts.u.derived, init);
7582       gfc_add_expr_to_block (&block, tmp);
7583     }
7584   return gfc_finish_block (&block);
7585 }
7586
7587 void
7588 gfc_conv_union_initializer (vec<constructor_elt, va_gc> *v,
7589                             gfc_component *un, gfc_expr *init)
7590 {
7591   gfc_constructor *ctor;
7592
7593   if (un->ts.type != BT_UNION || un == NULL || init == NULL)
7594     return;
7595
7596   ctor = gfc_constructor_first (init->value.constructor);
7597
7598   if (ctor == NULL || ctor->expr == NULL)
7599     return;
7600
7601   gcc_assert (init->expr_type == EXPR_STRUCTURE);
7602
7603   /* If we have an 'initialize all' constructor, do it first.  */
7604   if (ctor->expr->expr_type == EXPR_NULL)
7605     {
7606       tree union_type = TREE_TYPE (un->backend_decl);
7607       tree val = build_constructor (union_type, NULL);
7608       CONSTRUCTOR_APPEND_ELT (v, un->backend_decl, val);
7609       ctor = gfc_constructor_next (ctor);
7610     }
7611
7612   /* Add the map initializer on top.  */
7613   if (ctor != NULL && ctor->expr != NULL)
7614     {
7615       gcc_assert (ctor->expr->expr_type == EXPR_STRUCTURE);
7616       tree val = gfc_conv_initializer (ctor->expr, &un->ts,
7617                                        TREE_TYPE (un->backend_decl),
7618                                        un->attr.dimension, un->attr.pointer,
7619                                        un->attr.proc_pointer);
7620       CONSTRUCTOR_APPEND_ELT (v, un->backend_decl, val);
7621     }
7622 }
7623
7624 /* Build an expression for a constructor. If init is nonzero then
7625    this is part of a static variable initializer.  */
7626
7627 void
7628 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
7629 {
7630   gfc_constructor *c;
7631   gfc_component *cm;
7632   tree val;
7633   tree type;
7634   tree tmp;
7635   vec<constructor_elt, va_gc> *v = NULL;
7636
7637   gcc_assert (se->ss == NULL);
7638   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
7639   type = gfc_typenode_for_spec (&expr->ts);
7640
7641   if (!init)
7642     {
7643       /* Create a temporary variable and fill it in.  */
7644       se->expr = gfc_create_var (type, expr->ts.u.derived->name);
7645       /* The symtree in expr is NULL, if the code to generate is for
7646          initializing the static members only.  */
7647       tmp = gfc_trans_structure_assign (se->expr, expr, expr->symtree != NULL,
7648                                         se->want_coarray);
7649       gfc_add_expr_to_block (&se->pre, tmp);
7650       return;
7651     }
7652
7653   cm = expr->ts.u.derived->components;
7654
7655   for (c = gfc_constructor_first (expr->value.constructor);
7656        c; c = gfc_constructor_next (c), cm = cm->next)
7657     {
7658       /* Skip absent members in default initializers and allocatable
7659          components.  Although the latter have a default initializer
7660          of EXPR_NULL,... by default, the static nullify is not needed
7661          since this is done every time we come into scope.  */
7662       if (!c->expr || (cm->attr.allocatable && cm->attr.flavor != FL_PROCEDURE))
7663         continue;
7664
7665       if (cm->initializer && cm->initializer->expr_type != EXPR_NULL
7666           && strcmp (cm->name, "_extends") == 0
7667           && cm->initializer->symtree)
7668         {
7669           tree vtab;
7670           gfc_symbol *vtabs;
7671           vtabs = cm->initializer->symtree->n.sym;
7672           vtab = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtabs));
7673           vtab = unshare_expr_without_location (vtab);
7674           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, vtab);
7675         }
7676       else if (cm->ts.u.derived && strcmp (cm->name, "_size") == 0)
7677         {
7678           val = TYPE_SIZE_UNIT (gfc_get_derived_type (cm->ts.u.derived));
7679           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl,
7680                                   fold_convert (TREE_TYPE (cm->backend_decl),
7681                                                 val));
7682         }
7683       else if (cm->ts.type == BT_INTEGER && strcmp (cm->name, "_len") == 0)
7684         CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl,
7685                                 fold_convert (TREE_TYPE (cm->backend_decl),
7686                                               integer_zero_node));
7687       else if (cm->ts.type == BT_UNION)
7688         gfc_conv_union_initializer (v, cm, c->expr);
7689       else
7690         {
7691           val = gfc_conv_initializer (c->expr, &cm->ts,
7692                                       TREE_TYPE (cm->backend_decl),
7693                                       cm->attr.dimension, cm->attr.pointer,
7694                                       cm->attr.proc_pointer);
7695           val = unshare_expr_without_location (val);
7696
7697           /* Append it to the constructor list.  */
7698           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
7699         }
7700     }
7701
7702   se->expr = build_constructor (type, v);
7703   if (init)
7704     TREE_CONSTANT (se->expr) = 1;
7705 }
7706
7707
7708 /* Translate a substring expression.  */
7709
7710 static void
7711 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
7712 {
7713   gfc_ref *ref;
7714
7715   ref = expr->ref;
7716
7717   gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
7718
7719   se->expr = gfc_build_wide_string_const (expr->ts.kind,
7720                                           expr->value.character.length,
7721                                           expr->value.character.string);
7722
7723   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
7724   TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
7725
7726   if (ref)
7727     gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
7728 }
7729
7730
7731 /* Entry point for expression translation.  Evaluates a scalar quantity.
7732    EXPR is the expression to be translated, and SE is the state structure if
7733    called from within the scalarized.  */
7734
7735 void
7736 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
7737 {
7738   gfc_ss *ss;
7739
7740   ss = se->ss;
7741   if (ss && ss->info->expr == expr
7742       && (ss->info->type == GFC_SS_SCALAR
7743           || ss->info->type == GFC_SS_REFERENCE))
7744     {
7745       gfc_ss_info *ss_info;
7746
7747       ss_info = ss->info;
7748       /* Substitute a scalar expression evaluated outside the scalarization
7749          loop.  */
7750       se->expr = ss_info->data.scalar.value;
7751       if (gfc_scalar_elemental_arg_saved_as_reference (ss_info))
7752         se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
7753
7754       se->string_length = ss_info->string_length;
7755       gfc_advance_se_ss_chain (se);
7756       return;
7757     }
7758
7759   /* We need to convert the expressions for the iso_c_binding derived types.
7760      C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
7761      null_pointer_node.  C_PTR and C_FUNPTR are converted to match the
7762      typespec for the C_PTR and C_FUNPTR symbols, which has already been
7763      updated to be an integer with a kind equal to the size of a (void *).  */
7764   if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->ts.f90_type == BT_VOID
7765       && expr->ts.u.derived->attr.is_bind_c)
7766     {
7767       if (expr->expr_type == EXPR_VARIABLE
7768           && (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
7769               || expr->symtree->n.sym->intmod_sym_id
7770                  == ISOCBINDING_NULL_FUNPTR))
7771         {
7772           /* Set expr_type to EXPR_NULL, which will result in
7773              null_pointer_node being used below.  */
7774           expr->expr_type = EXPR_NULL;
7775         }
7776       else
7777         {
7778           /* Update the type/kind of the expression to be what the new
7779              type/kind are for the updated symbols of C_PTR/C_FUNPTR.  */
7780           expr->ts.type = BT_INTEGER;
7781           expr->ts.f90_type = BT_VOID;
7782           expr->ts.kind = gfc_index_integer_kind;
7783         }
7784     }
7785
7786   gfc_fix_class_refs (expr);
7787
7788   switch (expr->expr_type)
7789     {
7790     case EXPR_OP:
7791       gfc_conv_expr_op (se, expr);
7792       break;
7793
7794     case EXPR_FUNCTION:
7795       gfc_conv_function_expr (se, expr);
7796       break;
7797
7798     case EXPR_CONSTANT:
7799       gfc_conv_constant (se, expr);
7800       break;
7801
7802     case EXPR_VARIABLE:
7803       gfc_conv_variable (se, expr);
7804       break;
7805
7806     case EXPR_NULL:
7807       se->expr = null_pointer_node;
7808       break;
7809
7810     case EXPR_SUBSTRING:
7811       gfc_conv_substring_expr (se, expr);
7812       break;
7813
7814     case EXPR_STRUCTURE:
7815       gfc_conv_structure (se, expr, 0);
7816       break;
7817
7818     case EXPR_ARRAY:
7819       gfc_conv_array_constructor_expr (se, expr);
7820       break;
7821
7822     default:
7823       gcc_unreachable ();
7824       break;
7825     }
7826 }
7827
7828 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
7829    of an assignment.  */
7830 void
7831 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
7832 {
7833   gfc_conv_expr (se, expr);
7834   /* All numeric lvalues should have empty post chains.  If not we need to
7835      figure out a way of rewriting an lvalue so that it has no post chain.  */
7836   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
7837 }
7838
7839 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
7840    numeric expressions.  Used for scalar values where inserting cleanup code
7841    is inconvenient.  */
7842 void
7843 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
7844 {
7845   tree val;
7846
7847   gcc_assert (expr->ts.type != BT_CHARACTER);
7848   gfc_conv_expr (se, expr);
7849   if (se->post.head)
7850     {
7851       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
7852       gfc_add_modify (&se->pre, val, se->expr);
7853       se->expr = val;
7854       gfc_add_block_to_block (&se->pre, &se->post);
7855     }
7856 }
7857
7858 /* Helper to translate an expression and convert it to a particular type.  */
7859 void
7860 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
7861 {
7862   gfc_conv_expr_val (se, expr);
7863   se->expr = convert (type, se->expr);
7864 }
7865
7866
7867 /* Converts an expression so that it can be passed by reference.  Scalar
7868    values only.  */
7869
7870 void
7871 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
7872 {
7873   gfc_ss *ss;
7874   tree var;
7875
7876   ss = se->ss;
7877   if (ss && ss->info->expr == expr
7878       && ss->info->type == GFC_SS_REFERENCE)
7879     {
7880       /* Returns a reference to the scalar evaluated outside the loop
7881          for this case.  */
7882       gfc_conv_expr (se, expr);
7883
7884       if (expr->ts.type == BT_CHARACTER
7885           && expr->expr_type != EXPR_FUNCTION)
7886         gfc_conv_string_parameter (se);
7887      else
7888         se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
7889
7890       return;
7891     }
7892
7893   if (expr->ts.type == BT_CHARACTER)
7894     {
7895       gfc_conv_expr (se, expr);
7896       gfc_conv_string_parameter (se);
7897       return;
7898     }
7899
7900   if (expr->expr_type == EXPR_VARIABLE)
7901     {
7902       se->want_pointer = 1;
7903       gfc_conv_expr (se, expr);
7904       if (se->post.head)
7905         {
7906           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
7907           gfc_add_modify (&se->pre, var, se->expr);
7908           gfc_add_block_to_block (&se->pre, &se->post);
7909           se->expr = var;
7910         }
7911       return;
7912     }
7913
7914   if (expr->expr_type == EXPR_FUNCTION
7915       && ((expr->value.function.esym
7916            && expr->value.function.esym->result->attr.pointer
7917            && !expr->value.function.esym->result->attr.dimension)
7918           || (!expr->value.function.esym && !expr->ref
7919               && expr->symtree->n.sym->attr.pointer
7920               && !expr->symtree->n.sym->attr.dimension)))
7921     {
7922       se->want_pointer = 1;
7923       gfc_conv_expr (se, expr);
7924       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
7925       gfc_add_modify (&se->pre, var, se->expr);
7926       se->expr = var;
7927       return;
7928     }
7929
7930   gfc_conv_expr (se, expr);
7931
7932   /* Create a temporary var to hold the value.  */
7933   if (TREE_CONSTANT (se->expr))
7934     {
7935       tree tmp = se->expr;
7936       STRIP_TYPE_NOPS (tmp);
7937       var = build_decl (input_location,
7938                         CONST_DECL, NULL, TREE_TYPE (tmp));
7939       DECL_INITIAL (var) = tmp;
7940       TREE_STATIC (var) = 1;
7941       pushdecl (var);
7942     }
7943   else
7944     {
7945       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
7946       gfc_add_modify (&se->pre, var, se->expr);
7947     }
7948   gfc_add_block_to_block (&se->pre, &se->post);
7949
7950   /* Take the address of that value.  */
7951   se->expr = gfc_build_addr_expr (NULL_TREE, var);
7952 }
7953
7954
7955 /* Get the _len component for an unlimited polymorphic expression.  */
7956
7957 static tree
7958 trans_get_upoly_len (stmtblock_t *block, gfc_expr *expr)
7959 {
7960   gfc_se se;
7961   gfc_ref *ref = expr->ref;
7962
7963   gfc_init_se (&se, NULL);
7964   while (ref && ref->next)
7965     ref = ref->next;
7966   gfc_add_len_component (expr);
7967   gfc_conv_expr (&se, expr);
7968   gfc_add_block_to_block (block, &se.pre);
7969   gcc_assert (se.post.head == NULL_TREE);
7970   if (ref)
7971     {
7972       gfc_free_ref_list (ref->next);
7973       ref->next = NULL;
7974     }
7975   else
7976     {
7977       gfc_free_ref_list (expr->ref);
7978       expr->ref = NULL;
7979     }
7980   return se.expr;
7981 }
7982
7983
7984 /* Assign _vptr and _len components as appropriate.  BLOCK should be a
7985    statement-list outside of the scalarizer-loop.  When code is generated, that
7986    depends on the scalarized expression, it is added to RSE.PRE.
7987    Returns le's _vptr tree and when set the len expressions in to_lenp and
7988    from_lenp to form a le%_vptr%_copy (re, le, [from_lenp, to_lenp])
7989    expression.  */
7990
7991 static tree
7992 trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le,
7993                                  gfc_expr * re, gfc_se *rse,
7994                                  tree * to_lenp, tree * from_lenp)
7995 {
7996   gfc_se se;
7997   gfc_expr * vptr_expr;
7998   tree tmp, to_len = NULL_TREE, from_len = NULL_TREE, lhs_vptr;
7999   bool set_vptr = false, temp_rhs = false;
8000   stmtblock_t *pre = block;
8001
8002   /* Create a temporary for complicated expressions.  */
8003   if (re->expr_type != EXPR_VARIABLE && re->expr_type != EXPR_NULL
8004       && rse->expr != NULL_TREE && !DECL_P (rse->expr))
8005     {
8006       tmp = gfc_create_var (TREE_TYPE (rse->expr), "rhs");
8007       pre = &rse->pre;
8008       gfc_add_modify (&rse->pre, tmp, rse->expr);
8009       rse->expr = tmp;
8010       temp_rhs = true;
8011     }
8012
8013   /* Get the _vptr for the left-hand side expression.  */
8014   gfc_init_se (&se, NULL);
8015   vptr_expr = gfc_find_and_cut_at_last_class_ref (le);
8016   if (vptr_expr != NULL && gfc_expr_attr (vptr_expr).class_ok)
8017     {
8018       /* Care about _len for unlimited polymorphic entities.  */
8019       if (UNLIMITED_POLY (vptr_expr)
8020           || (vptr_expr->ts.type == BT_DERIVED
8021               && vptr_expr->ts.u.derived->attr.unlimited_polymorphic))
8022         to_len = trans_get_upoly_len (block, vptr_expr);
8023       gfc_add_vptr_component (vptr_expr);
8024       set_vptr = true;
8025     }
8026   else
8027     vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&le->ts));
8028   se.want_pointer = 1;
8029   gfc_conv_expr (&se, vptr_expr);
8030   gfc_free_expr (vptr_expr);
8031   gfc_add_block_to_block (block, &se.pre);
8032   gcc_assert (se.post.head == NULL_TREE);
8033   lhs_vptr = se.expr;
8034   STRIP_NOPS (lhs_vptr);
8035
8036   /* Set the _vptr only when the left-hand side of the assignment is a
8037      class-object.  */
8038   if (set_vptr)
8039     {
8040       /* Get the vptr from the rhs expression only, when it is variable.
8041          Functions are expected to be assigned to a temporary beforehand.  */
8042       vptr_expr = re->expr_type == EXPR_VARIABLE
8043           ? gfc_find_and_cut_at_last_class_ref (re)
8044           : NULL;
8045       if (vptr_expr != NULL && vptr_expr->ts.type == BT_CLASS)
8046         {
8047           if (to_len != NULL_TREE)
8048             {
8049               /* Get the _len information from the rhs.  */
8050               if (UNLIMITED_POLY (vptr_expr)
8051                   || (vptr_expr->ts.type == BT_DERIVED
8052                       && vptr_expr->ts.u.derived->attr.unlimited_polymorphic))
8053                 from_len = trans_get_upoly_len (block, vptr_expr);
8054             }
8055           gfc_add_vptr_component (vptr_expr);
8056         }
8057       else
8058         {
8059           if (re->expr_type == EXPR_VARIABLE
8060               && DECL_P (re->symtree->n.sym->backend_decl)
8061               && DECL_LANG_SPECIFIC (re->symtree->n.sym->backend_decl)
8062               && GFC_DECL_SAVED_DESCRIPTOR (re->symtree->n.sym->backend_decl)
8063               && GFC_CLASS_TYPE_P (TREE_TYPE (GFC_DECL_SAVED_DESCRIPTOR (
8064                                            re->symtree->n.sym->backend_decl))))
8065             {
8066               vptr_expr = NULL;
8067               se.expr = gfc_class_vptr_get (GFC_DECL_SAVED_DESCRIPTOR (
8068                                              re->symtree->n.sym->backend_decl));
8069               if (to_len)
8070                 from_len = gfc_class_len_get (GFC_DECL_SAVED_DESCRIPTOR (
8071                                              re->symtree->n.sym->backend_decl));
8072             }
8073           else if (temp_rhs && re->ts.type == BT_CLASS)
8074             {
8075               vptr_expr = NULL;
8076               se.expr = gfc_class_vptr_get (rse->expr);
8077             }
8078           else if (re->expr_type != EXPR_NULL)
8079             /* Only when rhs is non-NULL use its declared type for vptr
8080                initialisation.  */
8081             vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&re->ts));
8082           else
8083             /* When the rhs is NULL use the vtab of lhs' declared type.  */
8084             vptr_expr = gfc_lval_expr_from_sym (gfc_find_vtab (&le->ts));
8085         }
8086
8087       if (vptr_expr)
8088         {
8089           gfc_init_se (&se, NULL);
8090           se.want_pointer = 1;
8091           gfc_conv_expr (&se, vptr_expr);
8092           gfc_free_expr (vptr_expr);
8093           gfc_add_block_to_block (block, &se.pre);
8094           gcc_assert (se.post.head == NULL_TREE);
8095         }
8096       gfc_add_modify (pre, lhs_vptr, fold_convert (TREE_TYPE (lhs_vptr),
8097                                                 se.expr));
8098
8099       if (to_len != NULL_TREE)
8100         {
8101           /* The _len component needs to be set.  Figure how to get the
8102              value of the right-hand side.  */
8103           if (from_len == NULL_TREE)
8104             {
8105               if (rse->string_length != NULL_TREE)
8106                 from_len = rse->string_length;
8107               else if (re->ts.type == BT_CHARACTER && re->ts.u.cl->length)
8108                 {
8109                   from_len = gfc_get_expr_charlen (re);
8110                   gfc_init_se (&se, NULL);
8111                   gfc_conv_expr (&se, re->ts.u.cl->length);
8112                   gfc_add_block_to_block (block, &se.pre);
8113                   gcc_assert (se.post.head == NULL_TREE);
8114                   from_len = gfc_evaluate_now (se.expr, block);
8115                 }
8116               else
8117                 from_len = integer_zero_node;
8118             }
8119           gfc_add_modify (pre, to_len, fold_convert (TREE_TYPE (to_len),
8120                                                      from_len));
8121         }
8122     }
8123
8124   /* Return the _len trees only, when requested.  */
8125   if (to_lenp)
8126     *to_lenp = to_len;
8127   if (from_lenp)
8128     *from_lenp = from_len;
8129   return lhs_vptr;
8130 }
8131
8132
8133 /* Assign tokens for pointer components.  */
8134
8135 static void
8136 trans_caf_token_assign (gfc_se *lse, gfc_se *rse, gfc_expr *expr1,
8137                         gfc_expr *expr2)
8138 {
8139   symbol_attribute lhs_attr, rhs_attr;
8140   tree tmp, lhs_tok, rhs_tok;
8141   /* Flag to indicated component refs on the rhs.  */
8142   bool rhs_cr;
8143
8144   lhs_attr = gfc_caf_attr (expr1);
8145   if (expr2->expr_type != EXPR_NULL)
8146     {
8147       rhs_attr = gfc_caf_attr (expr2, false, &rhs_cr);
8148       if (lhs_attr.codimension && rhs_attr.codimension)
8149         {
8150           lhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (lse, expr1);
8151           lhs_tok = build_fold_indirect_ref (lhs_tok);
8152
8153           if (rhs_cr)
8154             rhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (rse, expr2);
8155           else
8156             {
8157               tree caf_decl;
8158               caf_decl = gfc_get_tree_for_caf_expr (expr2);
8159               gfc_get_caf_token_offset (rse, &rhs_tok, NULL, caf_decl,
8160                                         NULL_TREE, NULL);
8161             }
8162           tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
8163                             lhs_tok,
8164                             fold_convert (TREE_TYPE (lhs_tok), rhs_tok));
8165           gfc_prepend_expr_to_block (&lse->post, tmp);
8166         }
8167     }
8168   else if (lhs_attr.codimension)
8169     {
8170       lhs_tok = gfc_get_ultimate_alloc_ptr_comps_caf_token (lse, expr1);
8171       lhs_tok = build_fold_indirect_ref (lhs_tok);
8172       tmp = build2_loc (input_location, MODIFY_EXPR, void_type_node,
8173                         lhs_tok, null_pointer_node);
8174       gfc_prepend_expr_to_block (&lse->post, tmp);
8175     }
8176 }
8177
8178 /* Indentify class valued proc_pointer assignments.  */
8179
8180 static bool
8181 pointer_assignment_is_proc_pointer (gfc_expr * expr1, gfc_expr * expr2)
8182 {
8183   gfc_ref * ref;
8184
8185   ref = expr1->ref;
8186   while (ref && ref->next)
8187      ref = ref->next;
8188
8189   return ref && ref->type == REF_COMPONENT
8190       && ref->u.c.component->attr.proc_pointer
8191       && expr2->expr_type == EXPR_VARIABLE
8192       && expr2->symtree->n.sym->attr.flavor == FL_PROCEDURE;
8193 }
8194
8195
8196 tree
8197 gfc_trans_pointer_assign (gfc_code * code)
8198 {
8199   return gfc_trans_pointer_assignment (code->expr1, code->expr2);
8200 }
8201
8202
8203 /* Generate code for a pointer assignment.  */
8204
8205 tree
8206 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
8207 {
8208   gfc_se lse;
8209   gfc_se rse;
8210   stmtblock_t block;
8211   tree desc;
8212   tree tmp;
8213   tree decl;
8214   bool scalar, non_proc_pointer_assign;
8215   gfc_ss *ss;
8216
8217   gfc_start_block (&block);
8218
8219   gfc_init_se (&lse, NULL);
8220
8221   /* Usually testing whether this is not a proc pointer assignment.  */
8222   non_proc_pointer_assign = !pointer_assignment_is_proc_pointer (expr1, expr2);
8223
8224   /* Check whether the expression is a scalar or not; we cannot use
8225      expr1->rank as it can be nonzero for proc pointers.  */
8226   ss = gfc_walk_expr (expr1);
8227   scalar = ss == gfc_ss_terminator;
8228   if (!scalar)
8229     gfc_free_ss_chain (ss);
8230
8231   if (expr1->ts.type == BT_DERIVED && expr2->ts.type == BT_CLASS
8232       && expr2->expr_type != EXPR_FUNCTION && non_proc_pointer_assign)
8233     {
8234       gfc_add_data_component (expr2);
8235       /* The following is required as gfc_add_data_component doesn't
8236          update ts.type if there is a tailing REF_ARRAY.  */
8237       expr2->ts.type = BT_DERIVED;
8238     }
8239
8240   if (scalar)
8241     {
8242       /* Scalar pointers.  */
8243       lse.want_pointer = 1;
8244       gfc_conv_expr (&lse, expr1);
8245       gfc_init_se (&rse, NULL);
8246       rse.want_pointer = 1;
8247       gfc_conv_expr (&rse, expr2);
8248
8249       if (non_proc_pointer_assign && expr1->ts.type == BT_CLASS)
8250         {
8251           trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, NULL,
8252                                            NULL);
8253           lse.expr = gfc_class_data_get (lse.expr);
8254         }
8255
8256       if (expr1->symtree->n.sym->attr.proc_pointer
8257           && expr1->symtree->n.sym->attr.dummy)
8258         lse.expr = build_fold_indirect_ref_loc (input_location,
8259                                             lse.expr);
8260
8261       if (expr2->symtree && expr2->symtree->n.sym->attr.proc_pointer
8262           && expr2->symtree->n.sym->attr.dummy)
8263         rse.expr = build_fold_indirect_ref_loc (input_location,
8264                                             rse.expr);
8265
8266       gfc_add_block_to_block (&block, &lse.pre);
8267       gfc_add_block_to_block (&block, &rse.pre);
8268
8269       /* Check character lengths if character expression.  The test is only
8270          really added if -fbounds-check is enabled.  Exclude deferred
8271          character length lefthand sides.  */
8272       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL
8273           && !expr1->ts.deferred
8274           && !expr1->symtree->n.sym->attr.proc_pointer
8275           && !gfc_is_proc_ptr_comp (expr1))
8276         {
8277           gcc_assert (expr2->ts.type == BT_CHARACTER);
8278           gcc_assert (lse.string_length && rse.string_length);
8279           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
8280                                        lse.string_length, rse.string_length,
8281                                        &block);
8282         }
8283
8284       /* The assignment to an deferred character length sets the string
8285          length to that of the rhs.  */
8286       if (expr1->ts.deferred)
8287         {
8288           if (expr2->expr_type != EXPR_NULL && lse.string_length != NULL)
8289             gfc_add_modify (&block, lse.string_length, rse.string_length);
8290           else if (lse.string_length != NULL)
8291             gfc_add_modify (&block, lse.string_length,
8292                             build_int_cst (gfc_charlen_type_node, 0));
8293         }
8294
8295       gfc_add_modify (&block, lse.expr,
8296                       fold_convert (TREE_TYPE (lse.expr), rse.expr));
8297
8298       /* Also set the tokens for pointer components in derived typed
8299          coarrays.  */
8300       if (flag_coarray == GFC_FCOARRAY_LIB)
8301         trans_caf_token_assign (&lse, &rse, expr1, expr2);
8302
8303       gfc_add_block_to_block (&block, &rse.post);
8304       gfc_add_block_to_block (&block, &lse.post);
8305     }
8306   else
8307     {
8308       gfc_ref* remap;
8309       bool rank_remap;
8310       tree expr1_vptr = NULL_TREE;
8311       tree strlen_lhs;
8312       tree strlen_rhs = NULL_TREE;
8313
8314       /* Array pointer.  Find the last reference on the LHS and if it is an
8315          array section ref, we're dealing with bounds remapping.  In this case,
8316          set it to AR_FULL so that gfc_conv_expr_descriptor does
8317          not see it and process the bounds remapping afterwards explicitly.  */
8318       for (remap = expr1->ref; remap; remap = remap->next)
8319         if (!remap->next && remap->type == REF_ARRAY
8320             && remap->u.ar.type == AR_SECTION)
8321           break;
8322       rank_remap = (remap && remap->u.ar.end[0]);
8323
8324       gfc_init_se (&lse, NULL);
8325       if (remap)
8326         lse.descriptor_only = 1;
8327       gfc_conv_expr_descriptor (&lse, expr1);
8328       strlen_lhs = lse.string_length;
8329       desc = lse.expr;
8330
8331       if (expr2->expr_type == EXPR_NULL)
8332         {
8333           /* Just set the data pointer to null.  */
8334           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
8335         }
8336       else if (rank_remap)
8337         {
8338           /* If we are rank-remapping, just get the RHS's descriptor and
8339              process this later on.  */
8340           gfc_init_se (&rse, NULL);
8341           rse.direct_byref = 1;
8342           rse.byref_noassign = 1;
8343
8344           if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS)
8345             {
8346               gfc_conv_function_expr (&rse, expr2);
8347
8348               if (expr1->ts.type != BT_CLASS)
8349                 rse.expr = gfc_class_data_get (rse.expr);
8350               else
8351                 {
8352                   expr1_vptr = trans_class_vptr_len_assignment (&block, expr1,
8353                                                                 expr2, &rse,
8354                                                                 NULL, NULL);
8355                   gfc_add_block_to_block (&block, &rse.pre);
8356                   tmp = gfc_create_var (TREE_TYPE (rse.expr), "ptrtemp");
8357                   gfc_add_modify (&lse.pre, tmp, rse.expr);
8358
8359                   gfc_add_modify (&lse.pre, expr1_vptr,
8360                                   fold_convert (TREE_TYPE (expr1_vptr),
8361                                                 gfc_class_vptr_get (tmp)));
8362                   rse.expr = gfc_class_data_get (tmp);
8363                 }
8364             }
8365           else if (expr2->expr_type == EXPR_FUNCTION)
8366             {
8367               tree bound[GFC_MAX_DIMENSIONS];
8368               int i;
8369
8370               for (i = 0; i < expr2->rank; i++)
8371                 bound[i] = NULL_TREE;
8372               tmp = gfc_typenode_for_spec (&expr2->ts);
8373               tmp = gfc_get_array_type_bounds (tmp, expr2->rank, 0,
8374                                                bound, bound, 0,
8375                                                GFC_ARRAY_POINTER_CONT, false);
8376               tmp = gfc_create_var (tmp, "ptrtemp");
8377               rse.descriptor_only = 0;
8378               rse.expr = tmp;
8379               rse.direct_byref = 1;
8380               gfc_conv_expr_descriptor (&rse, expr2);
8381               strlen_rhs = rse.string_length;
8382               rse.expr = tmp;
8383             }
8384           else
8385             {
8386               gfc_conv_expr_descriptor (&rse, expr2);
8387               strlen_rhs = rse.string_length;
8388               if (expr1->ts.type == BT_CLASS)
8389                 expr1_vptr = trans_class_vptr_len_assignment (&block, expr1,
8390                                                               expr2, &rse,
8391                                                               NULL, NULL);
8392             }
8393         }
8394       else if (expr2->expr_type == EXPR_VARIABLE)
8395         {
8396           /* Assign directly to the LHS's descriptor.  */
8397           lse.descriptor_only = 0;
8398           lse.direct_byref = 1;
8399           gfc_conv_expr_descriptor (&lse, expr2);
8400           strlen_rhs = lse.string_length;
8401
8402           /* If this is a subreference array pointer assignment, use the rhs
8403              descriptor element size for the lhs span.  */
8404           if (expr1->symtree->n.sym->attr.subref_array_pointer)
8405             {
8406               decl = expr1->symtree->n.sym->backend_decl;
8407               gfc_init_se (&rse, NULL);
8408               rse.descriptor_only = 1;
8409               gfc_conv_expr (&rse, expr2);
8410               if (expr1->ts.type == BT_CLASS)
8411                 trans_class_vptr_len_assignment (&block, expr1, expr2, &rse,
8412                                                  NULL, NULL);
8413               tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
8414               tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
8415               if (!INTEGER_CST_P (tmp))
8416                 gfc_add_block_to_block (&lse.post, &rse.pre);
8417               gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
8418             }
8419           else if (expr1->ts.type == BT_CLASS)
8420             {
8421               rse.expr = NULL_TREE;
8422               rse.string_length = NULL_TREE;
8423               trans_class_vptr_len_assignment (&block, expr1, expr2, &rse,
8424                                                NULL, NULL);
8425             }
8426         }
8427       else if (expr2->expr_type == EXPR_FUNCTION && expr2->ts.type == BT_CLASS)
8428         {
8429           gfc_init_se (&rse, NULL);
8430           rse.want_pointer = 1;
8431           gfc_conv_function_expr (&rse, expr2);
8432           if (expr1->ts.type != BT_CLASS)
8433             {
8434               rse.expr = gfc_class_data_get (rse.expr);
8435               gfc_add_modify (&lse.pre, desc, rse.expr);
8436             }
8437           else
8438             {
8439               expr1_vptr = trans_class_vptr_len_assignment (&block, expr1,
8440                                                             expr2, &rse, NULL,
8441                                                             NULL);
8442               gfc_add_block_to_block (&block, &rse.pre);
8443               tmp = gfc_create_var (TREE_TYPE (rse.expr), "ptrtemp");
8444               gfc_add_modify (&lse.pre, tmp, rse.expr);
8445
8446               gfc_add_modify (&lse.pre, expr1_vptr,
8447                               fold_convert (TREE_TYPE (expr1_vptr),
8448                                         gfc_class_vptr_get (tmp)));
8449               rse.expr = gfc_class_data_get (tmp);
8450               gfc_add_modify (&lse.pre, desc, rse.expr);
8451             }
8452         }
8453       else
8454         {
8455           /* Assign to a temporary descriptor and then copy that
8456              temporary to the pointer.  */
8457           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
8458           lse.descriptor_only = 0;
8459           lse.expr = tmp;
8460           lse.direct_byref = 1;
8461           gfc_conv_expr_descriptor (&lse, expr2);
8462           strlen_rhs = lse.string_length;
8463           gfc_add_modify (&lse.pre, desc, tmp);
8464         }
8465
8466       gfc_add_block_to_block (&block, &lse.pre);
8467       if (rank_remap)
8468         gfc_add_block_to_block (&block, &rse.pre);
8469
8470       /* If we do bounds remapping, update LHS descriptor accordingly.  */
8471       if (remap)
8472         {
8473           int dim;
8474           gcc_assert (remap->u.ar.dimen == expr1->rank);
8475
8476           if (rank_remap)
8477             {
8478               /* Do rank remapping.  We already have the RHS's descriptor
8479                  converted in rse and now have to build the correct LHS
8480                  descriptor for it.  */
8481
8482               tree dtype, data;
8483               tree offs, stride;
8484               tree lbound, ubound;
8485
8486               /* Set dtype.  */
8487               dtype = gfc_conv_descriptor_dtype (desc);
8488               tmp = gfc_get_dtype (TREE_TYPE (desc));
8489               gfc_add_modify (&block, dtype, tmp);
8490
8491               /* Copy data pointer.  */
8492               data = gfc_conv_descriptor_data_get (rse.expr);
8493               gfc_conv_descriptor_data_set (&block, desc, data);
8494
8495               /* Copy offset but adjust it such that it would correspond
8496                  to a lbound of zero.  */
8497               offs = gfc_conv_descriptor_offset_get (rse.expr);
8498               for (dim = 0; dim < expr2->rank; ++dim)
8499                 {
8500                   stride = gfc_conv_descriptor_stride_get (rse.expr,
8501                                                            gfc_rank_cst[dim]);
8502                   lbound = gfc_conv_descriptor_lbound_get (rse.expr,
8503                                                            gfc_rank_cst[dim]);
8504                   tmp = fold_build2_loc (input_location, MULT_EXPR,
8505                                          gfc_array_index_type, stride, lbound);
8506                   offs = fold_build2_loc (input_location, PLUS_EXPR,
8507                                           gfc_array_index_type, offs, tmp);
8508                 }
8509               gfc_conv_descriptor_offset_set (&block, desc, offs);
8510
8511               /* Set the bounds as declared for the LHS and calculate strides as
8512                  well as another offset update accordingly.  */
8513               stride = gfc_conv_descriptor_stride_get (rse.expr,
8514                                                        gfc_rank_cst[0]);
8515               for (dim = 0; dim < expr1->rank; ++dim)
8516                 {
8517                   gfc_se lower_se;
8518                   gfc_se upper_se;
8519
8520                   gcc_assert (remap->u.ar.start[dim] && remap->u.ar.end[dim]);
8521
8522                   /* Convert declared bounds.  */
8523                   gfc_init_se (&lower_se, NULL);
8524                   gfc_init_se (&upper_se, NULL);
8525                   gfc_conv_expr (&lower_se, remap->u.ar.start[dim]);
8526                   gfc_conv_expr (&upper_se, remap->u.ar.end[dim]);
8527
8528                   gfc_add_block_to_block (&block, &lower_se.pre);
8529                   gfc_add_block_to_block (&block, &upper_se.pre);
8530
8531                   lbound = fold_convert (gfc_array_index_type, lower_se.expr);
8532                   ubound = fold_convert (gfc_array_index_type, upper_se.expr);
8533
8534                   lbound = gfc_evaluate_now (lbound, &block);
8535                   ubound = gfc_evaluate_now (ubound, &block);
8536
8537                   gfc_add_block_to_block (&block, &lower_se.post);
8538                   gfc_add_block_to_block (&block, &upper_se.post);
8539
8540                   /* Set bounds in descriptor.  */
8541                   gfc_conv_descriptor_lbound_set (&block, desc,
8542                                                   gfc_rank_cst[dim], lbound);
8543                   gfc_conv_descriptor_ubound_set (&block, desc,
8544                                                   gfc_rank_cst[dim], ubound);
8545
8546                   /* Set stride.  */
8547                   stride = gfc_evaluate_now (stride, &block);
8548                   gfc_conv_descriptor_stride_set (&block, desc,
8549                                                   gfc_rank_cst[dim], stride);
8550
8551                   /* Update offset.  */
8552                   offs = gfc_conv_descriptor_offset_get (desc);
8553                   tmp = fold_build2_loc (input_location, MULT_EXPR,
8554                                          gfc_array_index_type, lbound, stride);
8555                   offs = fold_build2_loc (input_location, MINUS_EXPR,
8556                                           gfc_array_index_type, offs, tmp);
8557                   offs = gfc_evaluate_now (offs, &block);
8558                   gfc_conv_descriptor_offset_set (&block, desc, offs);
8559
8560                   /* Update stride.  */
8561                   tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
8562                   stride = fold_build2_loc (input_location, MULT_EXPR,
8563                                             gfc_array_index_type, stride, tmp);
8564                 }
8565             }
8566           else
8567             {
8568               /* Bounds remapping.  Just shift the lower bounds.  */
8569
8570               gcc_assert (expr1->rank == expr2->rank);
8571
8572               for (dim = 0; dim < remap->u.ar.dimen; ++dim)
8573                 {
8574                   gfc_se lbound_se;
8575
8576                   gcc_assert (remap->u.ar.start[dim]);
8577                   gcc_assert (!remap->u.ar.end[dim]);
8578                   gfc_init_se (&lbound_se, NULL);
8579                   gfc_conv_expr (&lbound_se, remap->u.ar.start[dim]);
8580
8581                   gfc_add_block_to_block (&block, &lbound_se.pre);
8582                   gfc_conv_shift_descriptor_lbound (&block, desc,
8583                                                     dim, lbound_se.expr);
8584                   gfc_add_block_to_block (&block, &lbound_se.post);
8585                 }
8586             }
8587         }
8588
8589       /* Check string lengths if applicable.  The check is only really added
8590          to the output code if -fbounds-check is enabled.  */
8591       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
8592         {
8593           gcc_assert (expr2->ts.type == BT_CHARACTER);
8594           gcc_assert (strlen_lhs && strlen_rhs);
8595           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
8596                                        strlen_lhs, strlen_rhs, &block);
8597         }
8598
8599       /* If rank remapping was done, check with -fcheck=bounds that
8600          the target is at least as large as the pointer.  */
8601       if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS))
8602         {
8603           tree lsize, rsize;
8604           tree fault;
8605           const char* msg;
8606
8607           lsize = gfc_conv_descriptor_size (lse.expr, expr1->rank);
8608           rsize = gfc_conv_descriptor_size (rse.expr, expr2->rank);
8609
8610           lsize = gfc_evaluate_now (lsize, &block);
8611           rsize = gfc_evaluate_now (rsize, &block);
8612           fault = fold_build2_loc (input_location, LT_EXPR, boolean_type_node,
8613                                    rsize, lsize);
8614
8615           msg = _("Target of rank remapping is too small (%ld < %ld)");
8616           gfc_trans_runtime_check (true, false, fault, &block, &expr2->where,
8617                                    msg, rsize, lsize);
8618         }
8619
8620       gfc_add_block_to_block (&block, &lse.post);
8621       if (rank_remap)
8622         gfc_add_block_to_block (&block, &rse.post);
8623     }
8624
8625   return gfc_finish_block (&block);
8626 }
8627
8628
8629 /* Makes sure se is suitable for passing as a function string parameter.  */
8630 /* TODO: Need to check all callers of this function.  It may be abused.  */
8631
8632 void
8633 gfc_conv_string_parameter (gfc_se * se)
8634 {
8635   tree type;
8636
8637   if (TREE_CODE (se->expr) == STRING_CST)
8638     {
8639       type = TREE_TYPE (TREE_TYPE (se->expr));
8640       se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
8641       return;
8642     }
8643
8644   if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
8645     {
8646       if (TREE_CODE (se->expr) != INDIRECT_REF)
8647         {
8648           type = TREE_TYPE (se->expr);
8649           se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
8650         }
8651       else
8652         {
8653           type = gfc_get_character_type_len (gfc_default_character_kind,
8654                                              se->string_length);
8655           type = build_pointer_type (type);
8656           se->expr = gfc_build_addr_expr (type, se->expr);
8657         }
8658     }
8659
8660   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
8661 }
8662
8663
8664 /* Generate code for assignment of scalar variables.  Includes character
8665    strings and derived types with allocatable components.
8666    If you know that the LHS has no allocations, set dealloc to false.
8667
8668    DEEP_COPY has no effect if the typespec TS is not a derived type with
8669    allocatable components.  Otherwise, if it is set, an explicit copy of each
8670    allocatable component is made.  This is necessary as a simple copy of the
8671    whole object would copy array descriptors as is, so that the lhs's
8672    allocatable components would point to the rhs's after the assignment.
8673    Typically, setting DEEP_COPY is necessary if the rhs is a variable, and not
8674    necessary if the rhs is a non-pointer function, as the allocatable components
8675    are not accessible by other means than the function's result after the
8676    function has returned.  It is even more subtle when temporaries are involved,
8677    as the two following examples show:
8678     1.  When we evaluate an array constructor, a temporary is created.  Thus
8679       there is theoretically no alias possible.  However, no deep copy is
8680       made for this temporary, so that if the constructor is made of one or
8681       more variable with allocatable components, those components still point
8682       to the variable's: DEEP_COPY should be set for the assignment from the
8683       temporary to the lhs in that case.
8684     2.  When assigning a scalar to an array, we evaluate the scalar value out
8685       of the loop, store it into a temporary variable, and assign from that.
8686       In that case, deep copying when assigning to the temporary would be a
8687       waste of resources; however deep copies should happen when assigning from
8688       the temporary to each array element: again DEEP_COPY should be set for
8689       the assignment from the temporary to the lhs.  */
8690
8691 tree
8692 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
8693                          bool deep_copy, bool dealloc, bool in_coarray)
8694 {
8695   stmtblock_t block;
8696   tree tmp;
8697   tree cond;
8698
8699   gfc_init_block (&block);
8700
8701   if (ts.type == BT_CHARACTER)
8702     {
8703       tree rlen = NULL;
8704       tree llen = NULL;
8705
8706       if (lse->string_length != NULL_TREE)
8707         {
8708           gfc_conv_string_parameter (lse);
8709           gfc_add_block_to_block (&block, &lse->pre);
8710           llen = lse->string_length;
8711         }
8712
8713       if (rse->string_length != NULL_TREE)
8714         {
8715           gfc_conv_string_parameter (rse);
8716           gfc_add_block_to_block (&block, &rse->pre);
8717           rlen = rse->string_length;
8718         }
8719
8720       gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
8721                              rse->expr, ts.kind);
8722     }
8723   else if (gfc_bt_struct (ts.type) && ts.u.derived->attr.alloc_comp)
8724     {
8725       tree tmp_var = NULL_TREE;
8726       cond = NULL_TREE;
8727
8728       /* Are the rhs and the lhs the same?  */
8729       if (deep_copy)
8730         {
8731           cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
8732                                   gfc_build_addr_expr (NULL_TREE, lse->expr),
8733                                   gfc_build_addr_expr (NULL_TREE, rse->expr));
8734           cond = gfc_evaluate_now (cond, &lse->pre);
8735         }
8736
8737       /* Deallocate the lhs allocated components as long as it is not
8738          the same as the rhs.  This must be done following the assignment
8739          to prevent deallocating data that could be used in the rhs
8740          expression.  */
8741       if (dealloc)
8742         {
8743           tmp_var = gfc_evaluate_now (lse->expr, &lse->pre);
8744           tmp = gfc_deallocate_alloc_comp_no_caf (ts.u.derived, tmp_var, 0);
8745           if (deep_copy)
8746             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
8747                             tmp);
8748           gfc_add_expr_to_block (&lse->post, tmp);
8749         }
8750
8751       gfc_add_block_to_block (&block, &rse->pre);
8752       gfc_add_block_to_block (&block, &lse->pre);
8753
8754       gfc_add_modify (&block, lse->expr,
8755                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
8756
8757       /* Restore pointer address of coarray components.  */
8758       if (ts.u.derived->attr.coarray_comp && deep_copy && tmp_var != NULL_TREE)
8759         {
8760           tmp = gfc_reassign_alloc_comp_caf (ts.u.derived, tmp_var, lse->expr);
8761           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
8762                           tmp);
8763           gfc_add_expr_to_block (&block, tmp);
8764         }
8765
8766       /* Do a deep copy if the rhs is a variable, if it is not the
8767          same as the lhs.  */
8768       if (deep_copy)
8769         {
8770           int caf_mode = in_coarray ? (GFC_STRUCTURE_CAF_MODE_ENABLE_COARRAY
8771                                        | GFC_STRUCTURE_CAF_MODE_IN_COARRAY) : 0;
8772           tmp = gfc_copy_alloc_comp (ts.u.derived, rse->expr, lse->expr, 0,
8773                                      caf_mode);
8774           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
8775                           tmp);
8776           gfc_add_expr_to_block (&block, tmp);
8777         }
8778     }
8779   else if (gfc_bt_struct (ts.type) || ts.type == BT_CLASS)
8780     {
8781       gfc_add_block_to_block (&block, &lse->pre);
8782       gfc_add_block_to_block (&block, &rse->pre);
8783       tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
8784                              TREE_TYPE (lse->expr), rse->expr);
8785       gfc_add_modify (&block, lse->expr, tmp);
8786     }
8787   else
8788     {
8789       gfc_add_block_to_block (&block, &lse->pre);
8790       gfc_add_block_to_block (&block, &rse->pre);
8791
8792       gfc_add_modify (&block, lse->expr,
8793                       fold_convert (TREE_TYPE (lse->expr), rse->expr));
8794     }
8795
8796   gfc_add_block_to_block (&block, &lse->post);
8797   gfc_add_block_to_block (&block, &rse->post);
8798
8799   return gfc_finish_block (&block);
8800 }
8801
8802
8803 /* There are quite a lot of restrictions on the optimisation in using an
8804    array function assign without a temporary.  */
8805
8806 static bool
8807 arrayfunc_assign_needs_temporary (gfc_expr * expr1, gfc_expr * expr2)
8808 {
8809   gfc_ref * ref;
8810   bool seen_array_ref;
8811   bool c = false;
8812   gfc_symbol *sym = expr1->symtree->n.sym;
8813
8814   /* Play it safe with class functions assigned to a derived type.  */
8815   if (gfc_is_alloc_class_array_function (expr2)
8816       && expr1->ts.type == BT_DERIVED)
8817     return true;
8818
8819   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
8820   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
8821     return true;
8822
8823   /* Elemental functions are scalarized so that they don't need a
8824      temporary in gfc_trans_assignment_1, so return a true.  Otherwise,
8825      they would need special treatment in gfc_trans_arrayfunc_assign.  */
8826   if (expr2->value.function.esym != NULL
8827       && expr2->value.function.esym->attr.elemental)
8828     return true;
8829
8830   /* Need a temporary if rhs is not FULL or a contiguous section.  */
8831   if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
8832     return true;
8833
8834   /* Need a temporary if EXPR1 can't be expressed as a descriptor.  */
8835   if (gfc_ref_needs_temporary_p (expr1->ref))
8836     return true;
8837
8838   /* Functions returning pointers or allocatables need temporaries.  */
8839   c = expr2->value.function.esym
8840       ? (expr2->value.function.esym->attr.pointer
8841          || expr2->value.function.esym->attr.allocatable)
8842       : (expr2->symtree->n.sym->attr.pointer
8843          || expr2->symtree->n.sym->attr.allocatable);
8844   if (c)
8845     return true;
8846
8847   /* Character array functions need temporaries unless the
8848      character lengths are the same.  */
8849   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
8850     {
8851       if (expr1->ts.u.cl->length == NULL
8852             || expr1->ts.u.cl->length->expr_type != EXPR_CONSTANT)
8853         return true;
8854
8855       if (expr2->ts.u.cl->length == NULL
8856             || expr2->ts.u.cl->length->expr_type != EXPR_CONSTANT)
8857         return true;
8858
8859       if (mpz_cmp (expr1->ts.u.cl->length->value.integer,
8860                      expr2->ts.u.cl->length->value.integer) != 0)
8861         return true;
8862     }
8863
8864   /* Check that no LHS component references appear during an array
8865      reference. This is needed because we do not have the means to
8866      span any arbitrary stride with an array descriptor. This check
8867      is not needed for the rhs because the function result has to be
8868      a complete type.  */
8869   seen_array_ref = false;
8870   for (ref = expr1->ref; ref; ref = ref->next)
8871     {
8872       if (ref->type == REF_ARRAY)
8873         seen_array_ref= true;
8874       else if (ref->type == REF_COMPONENT && seen_array_ref)
8875         return true;
8876     }
8877
8878   /* Check for a dependency.  */
8879   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
8880                                    expr2->value.function.esym,
8881                                    expr2->value.function.actual,
8882                                    NOT_ELEMENTAL))
8883     return true;
8884
8885   /* If we have reached here with an intrinsic function, we do not
8886      need a temporary except in the particular case that reallocation
8887      on assignment is active and the lhs is allocatable and a target.  */
8888   if (expr2->value.function.isym)
8889     return (flag_realloc_lhs && sym->attr.allocatable && sym->attr.target);
8890
8891   /* If the LHS is a dummy, we need a temporary if it is not
8892      INTENT(OUT).  */
8893   if (sym->attr.dummy && sym->attr.intent != INTENT_OUT)
8894     return true;
8895
8896   /* If the lhs has been host_associated, is in common, a pointer or is
8897      a target and the function is not using a RESULT variable, aliasing
8898      can occur and a temporary is needed.  */
8899   if ((sym->attr.host_assoc
8900            || sym->attr.in_common
8901            || sym->attr.pointer
8902            || sym->attr.cray_pointee
8903            || sym->attr.target)
8904         && expr2->symtree != NULL
8905         && expr2->symtree->n.sym == expr2->symtree->n.sym->result)
8906     return true;
8907
8908   /* A PURE function can unconditionally be called without a temporary.  */
8909   if (expr2->value.function.esym != NULL
8910       && expr2->value.function.esym->attr.pure)
8911     return false;
8912
8913   /* Implicit_pure functions are those which could legally be declared
8914      to be PURE.  */
8915   if (expr2->value.function.esym != NULL
8916       && expr2->value.function.esym->attr.implicit_pure)
8917     return false;
8918
8919   if (!sym->attr.use_assoc
8920         && !sym->attr.in_common
8921         && !sym->attr.pointer
8922         && !sym->attr.target
8923         && !sym->attr.cray_pointee
8924         && expr2->value.function.esym)
8925     {
8926       /* A temporary is not needed if the function is not contained and
8927          the variable is local or host associated and not a pointer or
8928          a target.  */
8929       if (!expr2->value.function.esym->attr.contained)
8930         return false;
8931
8932       /* A temporary is not needed if the lhs has never been host
8933          associated and the procedure is contained.  */
8934       else if (!sym->attr.host_assoc)
8935         return false;
8936
8937       /* A temporary is not needed if the variable is local and not
8938          a pointer, a target or a result.  */
8939       if (sym->ns->parent
8940             && expr2->value.function.esym->ns == sym->ns->parent)
8941         return false;
8942     }
8943
8944   /* Default to temporary use.  */
8945   return true;
8946 }
8947
8948
8949 /* Provide the loop info so that the lhs descriptor can be built for
8950    reallocatable assignments from extrinsic function calls.  */
8951
8952 static void
8953 realloc_lhs_loop_for_fcn_call (gfc_se *se, locus *where, gfc_ss **ss,
8954                                gfc_loopinfo *loop)
8955 {
8956   /* Signal that the function call should not be made by
8957      gfc_conv_loop_setup.  */
8958   se->ss->is_alloc_lhs = 1;
8959   gfc_init_loopinfo (loop);
8960   gfc_add_ss_to_loop (loop, *ss);
8961   gfc_add_ss_to_loop (loop, se->ss);
8962   gfc_conv_ss_startstride (loop);
8963   gfc_conv_loop_setup (loop, where);
8964   gfc_copy_loopinfo_to_se (se, loop);
8965   gfc_add_block_to_block (&se->pre, &loop->pre);
8966   gfc_add_block_to_block (&se->pre, &loop->post);
8967   se->ss->is_alloc_lhs = 0;
8968 }
8969
8970
8971 /* For assignment to a reallocatable lhs from intrinsic functions,
8972    replace the se.expr (ie. the result) with a temporary descriptor.
8973    Null the data field so that the library allocates space for the
8974    result. Free the data of the original descriptor after the function,
8975    in case it appears in an argument expression and transfer the
8976    result to the original descriptor.  */
8977
8978 static void
8979 fcncall_realloc_result (gfc_se *se, int rank)
8980 {
8981   tree desc;
8982   tree res_desc;
8983   tree tmp;
8984   tree offset;
8985   tree zero_cond;
8986   int n;
8987
8988   /* Use the allocation done by the library.  Substitute the lhs
8989      descriptor with a copy, whose data field is nulled.*/
8990   desc = build_fold_indirect_ref_loc (input_location, se->expr);
8991   if (POINTER_TYPE_P (TREE_TYPE (desc)))
8992     desc = build_fold_indirect_ref_loc (input_location, desc);
8993
8994   /* Unallocated, the descriptor does not have a dtype.  */
8995   tmp = gfc_conv_descriptor_dtype (desc);
8996   gfc_add_modify (&se->pre, tmp, gfc_get_dtype (TREE_TYPE (desc)));
8997
8998   res_desc = gfc_evaluate_now (desc, &se->pre);
8999   gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
9000   se->expr = gfc_build_addr_expr (NULL_TREE, res_desc);
9001
9002   /* Free the lhs after the function call and copy the result data to
9003      the lhs descriptor.  */
9004   tmp = gfc_conv_descriptor_data_get (desc);
9005   zero_cond = fold_build2_loc (input_location, EQ_EXPR,
9006                                boolean_type_node, tmp,
9007                                build_int_cst (TREE_TYPE (tmp), 0));
9008   zero_cond = gfc_evaluate_now (zero_cond, &se->post);
9009   tmp = gfc_call_free (tmp);
9010   gfc_add_expr_to_block (&se->post, tmp);
9011
9012   tmp = gfc_conv_descriptor_data_get (res_desc);
9013   gfc_conv_descriptor_data_set (&se->post, desc, tmp);
9014
9015   /* Check that the shapes are the same between lhs and expression.  */
9016   for (n = 0 ; n < rank; n++)
9017     {
9018       tree tmp1;
9019       tmp = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]);
9020       tmp1 = gfc_conv_descriptor_lbound_get (res_desc, gfc_rank_cst[n]);
9021       tmp = fold_build2_loc (input_location, MINUS_EXPR,
9022                              gfc_array_index_type, tmp, tmp1);
9023       tmp1 = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
9024       tmp = fold_build2_loc (input_location, MINUS_EXPR,
9025                              gfc_array_index_type, tmp, tmp1);
9026       tmp1 = gfc_conv_descriptor_ubound_get (res_desc, gfc_rank_cst[n]);
9027       tmp = fold_build2_loc (input_location, PLUS_EXPR,
9028                              gfc_array_index_type, tmp, tmp1);
9029       tmp = fold_build2_loc (input_location, NE_EXPR,
9030                              boolean_type_node, tmp,
9031                              gfc_index_zero_node);
9032       tmp = gfc_evaluate_now (tmp, &se->post);
9033       zero_cond = fold_build2_loc (input_location, TRUTH_OR_EXPR,
9034                                    boolean_type_node, tmp,
9035                                    zero_cond);
9036     }
9037
9038   /* 'zero_cond' being true is equal to lhs not being allocated or the
9039      shapes being different.  */
9040   zero_cond = gfc_evaluate_now (zero_cond, &se->post);
9041
9042   /* Now reset the bounds returned from the function call to bounds based
9043      on the lhs lbounds, except where the lhs is not allocated or the shapes
9044      of 'variable and 'expr' are different. Set the offset accordingly.  */
9045   offset = gfc_index_zero_node;
9046   for (n = 0 ; n < rank; n++)
9047     {
9048       tree lbound;
9049
9050       lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]);
9051       lbound = fold_build3_loc (input_location, COND_EXPR,
9052                                 gfc_array_index_type, zero_cond,
9053                                 gfc_index_one_node, lbound);
9054       lbound = gfc_evaluate_now (lbound, &se->post);
9055
9056       tmp = gfc_conv_descriptor_ubound_get (res_desc, gfc_rank_cst[n]);
9057       tmp = fold_build2_loc (input_location, PLUS_EXPR,
9058                              gfc_array_index_type, tmp, lbound);
9059       gfc_conv_descriptor_lbound_set (&se->post, desc,
9060                                       gfc_rank_cst[n], lbound);
9061       gfc_conv_descriptor_ubound_set (&se->post, desc,
9062                                       gfc_rank_cst[n], tmp);
9063
9064       /* Set stride and accumulate the offset.  */
9065       tmp = gfc_conv_descriptor_stride_get (res_desc, gfc_rank_cst[n]);
9066       gfc_conv_descriptor_stride_set (&se->post, desc,
9067                                       gfc_rank_cst[n], tmp);
9068       tmp = fold_build2_loc (input_location, MULT_EXPR,
9069                              gfc_array_index_type, lbound, tmp);
9070       offset = fold_build2_loc (input_location, MINUS_EXPR,
9071                                 gfc_array_index_type, offset, tmp);
9072       offset = gfc_evaluate_now (offset, &se->post);
9073     }
9074
9075   gfc_conv_descriptor_offset_set (&se->post, desc, offset);
9076 }
9077
9078
9079
9080 /* Try to translate array(:) = func (...), where func is a transformational
9081    array function, without using a temporary.  Returns NULL if this isn't the
9082    case.  */
9083
9084 static tree
9085 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
9086 {
9087   gfc_se se;
9088   gfc_ss *ss = NULL;
9089   gfc_component *comp = NULL;
9090   gfc_loopinfo loop;
9091
9092   if (arrayfunc_assign_needs_temporary (expr1, expr2))
9093     return NULL;
9094
9095   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
9096      functions.  */
9097   comp = gfc_get_proc_ptr_comp (expr2);
9098   gcc_assert (expr2->value.function.isym
9099               || (comp && comp->attr.dimension)
9100               || (!comp && gfc_return_by_reference (expr2->value.function.esym)
9101                   && expr2->value.function.esym->result->attr.dimension));
9102
9103   gfc_init_se (&se, NULL);
9104   gfc_start_block (&se.pre);
9105   se.want_pointer = 1;
9106
9107   gfc_conv_array_parameter (&se, expr1, false, NULL, NULL, NULL);
9108
9109   if (expr1->ts.type == BT_DERIVED
9110         && expr1->ts.u.derived->attr.alloc_comp)
9111     {
9112       tree tmp;
9113       tmp = gfc_deallocate_alloc_comp_no_caf (expr1->ts.u.derived, se.expr,
9114                                               expr1->rank);
9115       gfc_add_expr_to_block (&se.pre, tmp);
9116     }
9117
9118   se.direct_byref = 1;
9119   se.ss = gfc_walk_expr (expr2);
9120   gcc_assert (se.ss != gfc_ss_terminator);
9121
9122   /* Reallocate on assignment needs the loopinfo for extrinsic functions.
9123      This is signalled to gfc_conv_procedure_call by setting is_alloc_lhs.
9124      Clearly, this cannot be done for an allocatable function result, since
9125      the shape of the result is unknown and, in any case, the function must
9126      correctly take care of the reallocation internally. For intrinsic
9127      calls, the array data is freed and the library takes care of allocation.
9128      TODO: Add logic of trans-array.c: gfc_alloc_allocatable_for_assignment
9129      to the library.  */
9130   if (flag_realloc_lhs
9131         && gfc_is_reallocatable_lhs (expr1)
9132         && !gfc_expr_attr (expr1).codimension
9133         && !gfc_is_coindexed (expr1)
9134         && !(expr2->value.function.esym
9135             && expr2->value.function.esym->result->attr.allocatable))
9136     {
9137       realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
9138
9139       if (!expr2->value.function.isym)
9140         {
9141           ss = gfc_walk_expr (expr1);
9142           gcc_assert (ss != gfc_ss_terminator);
9143
9144           realloc_lhs_loop_for_fcn_call (&se, &expr1->where, &ss, &loop);
9145           ss->is_alloc_lhs = 1;
9146         }
9147       else
9148         fcncall_realloc_result (&se, expr1->rank);
9149     }
9150
9151   gfc_conv_function_expr (&se, expr2);
9152   gfc_add_block_to_block (&se.pre, &se.post);
9153
9154   if (ss)
9155     gfc_cleanup_loop (&loop);
9156   else
9157     gfc_free_ss_chain (se.ss);
9158
9159   return gfc_finish_block (&se.pre);
9160 }
9161
9162
9163 /* Try to efficiently translate array(:) = 0.  Return NULL if this
9164    can't be done.  */
9165
9166 static tree
9167 gfc_trans_zero_assign (gfc_expr * expr)
9168 {
9169   tree dest, len, type;
9170   tree tmp;
9171   gfc_symbol *sym;
9172
9173   sym = expr->symtree->n.sym;
9174   dest = gfc_get_symbol_decl (sym);
9175
9176   type = TREE_TYPE (dest);
9177   if (POINTER_TYPE_P (type))
9178     type = TREE_TYPE (type);
9179   if (!GFC_ARRAY_TYPE_P (type))
9180     return NULL_TREE;
9181
9182   /* Determine the length of the array.  */
9183   len = GFC_TYPE_ARRAY_SIZE (type);
9184   if (!len || TREE_CODE (len) != INTEGER_CST)
9185     return NULL_TREE;
9186
9187   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
9188   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
9189                          fold_convert (gfc_array_index_type, tmp));
9190
9191   /* If we are zeroing a local array avoid taking its address by emitting
9192      a = {} instead.  */
9193   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
9194     return build2_loc (input_location, MODIFY_EXPR, void_type_node,
9195                        dest, build_constructor (TREE_TYPE (dest),
9196                                               NULL));
9197
9198   /* Convert arguments to the correct types.  */
9199   dest = fold_convert (pvoid_type_node, dest);
9200   len = fold_convert (size_type_node, len);
9201
9202   /* Construct call to __builtin_memset.  */
9203   tmp = build_call_expr_loc (input_location,
9204                              builtin_decl_explicit (BUILT_IN_MEMSET),
9205                              3, dest, integer_zero_node, len);
9206   return fold_convert (void_type_node, tmp);
9207 }
9208
9209
9210 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
9211    that constructs the call to __builtin_memcpy.  */
9212
9213 tree
9214 gfc_build_memcpy_call (tree dst, tree src, tree len)
9215 {
9216   tree tmp;
9217
9218   /* Convert arguments to the correct types.  */
9219   if (!POINTER_TYPE_P (TREE_TYPE (dst)))
9220     dst = gfc_build_addr_expr (pvoid_type_node, dst);
9221   else
9222     dst = fold_convert (pvoid_type_node, dst);
9223
9224   if (!POINTER_TYPE_P (TREE_TYPE (src)))
9225     src = gfc_build_addr_expr (pvoid_type_node, src);
9226   else
9227     src = fold_convert (pvoid_type_node, src);
9228
9229   len = fold_convert (size_type_node, len);
9230
9231   /* Construct call to __builtin_memcpy.  */
9232   tmp = build_call_expr_loc (input_location,
9233                              builtin_decl_explicit (BUILT_IN_MEMCPY),
9234                              3, dst, src, len);
9235   return fold_convert (void_type_node, tmp);
9236 }
9237
9238
9239 /* Try to efficiently translate dst(:) = src(:).  Return NULL if this
9240    can't be done.  EXPR1 is the destination/lhs and EXPR2 is the
9241    source/rhs, both are gfc_full_array_ref_p which have been checked for
9242    dependencies.  */
9243
9244 static tree
9245 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
9246 {
9247   tree dst, dlen, dtype;
9248   tree src, slen, stype;
9249   tree tmp;
9250
9251   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
9252   src = gfc_get_symbol_decl (expr2->symtree->n.sym);
9253
9254   dtype = TREE_TYPE (dst);
9255   if (POINTER_TYPE_P (dtype))
9256     dtype = TREE_TYPE (dtype);
9257   stype = TREE_TYPE (src);
9258   if (POINTER_TYPE_P (stype))
9259     stype = TREE_TYPE (stype);
9260
9261   if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
9262     return NULL_TREE;
9263
9264   /* Determine the lengths of the arrays.  */
9265   dlen = GFC_TYPE_ARRAY_SIZE (dtype);
9266   if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
9267     return NULL_TREE;
9268   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
9269   dlen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
9270                           dlen, fold_convert (gfc_array_index_type, tmp));
9271
9272   slen = GFC_TYPE_ARRAY_SIZE (stype);
9273   if (!slen || TREE_CODE (slen) != INTEGER_CST)
9274     return NULL_TREE;
9275   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
9276   slen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
9277                           slen, fold_convert (gfc_array_index_type, tmp));
9278
9279   /* Sanity check that they are the same.  This should always be
9280      the case, as we should already have checked for conformance.  */
9281   if (!tree_int_cst_equal (slen, dlen))
9282     return NULL_TREE;
9283
9284   return gfc_build_memcpy_call (dst, src, dlen);
9285 }
9286
9287
9288 /* Try to efficiently translate array(:) = (/ ... /).  Return NULL if
9289    this can't be done.  EXPR1 is the destination/lhs for which
9290    gfc_full_array_ref_p is true, and EXPR2 is the source/rhs.  */
9291
9292 static tree
9293 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
9294 {
9295   unsigned HOST_WIDE_INT nelem;
9296   tree dst, dtype;
9297   tree src, stype;
9298   tree len;
9299   tree tmp;
9300
9301   nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
9302   if (nelem == 0)
9303     return NULL_TREE;
9304
9305   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
9306   dtype = TREE_TYPE (dst);
9307   if (POINTER_TYPE_P (dtype))
9308     dtype = TREE_TYPE (dtype);
9309   if (!GFC_ARRAY_TYPE_P (dtype))
9310     return NULL_TREE;
9311
9312   /* Determine the lengths of the array.  */
9313   len = GFC_TYPE_ARRAY_SIZE (dtype);
9314   if (!len || TREE_CODE (len) != INTEGER_CST)
9315     return NULL_TREE;
9316
9317   /* Confirm that the constructor is the same size.  */
9318   if (compare_tree_int (len, nelem) != 0)
9319     return NULL_TREE;
9320
9321   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
9322   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
9323                          fold_convert (gfc_array_index_type, tmp));
9324
9325   stype = gfc_typenode_for_spec (&expr2->ts);
9326   src = gfc_build_constant_array_constructor (expr2, stype);
9327
9328   stype = TREE_TYPE (src);
9329   if (POINTER_TYPE_P (stype))
9330     stype = TREE_TYPE (stype);
9331
9332   return gfc_build_memcpy_call (dst, src, len);
9333 }
9334
9335
9336 /* Tells whether the expression is to be treated as a variable reference.  */
9337
9338 bool
9339 gfc_expr_is_variable (gfc_expr *expr)
9340 {
9341   gfc_expr *arg;
9342   gfc_component *comp;
9343   gfc_symbol *func_ifc;
9344
9345   if (expr->expr_type == EXPR_VARIABLE)
9346     return true;
9347
9348   arg = gfc_get_noncopying_intrinsic_argument (expr);
9349   if (arg)
9350     {
9351       gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE);
9352       return gfc_expr_is_variable (arg);
9353     }
9354
9355   /* A data-pointer-returning function should be considered as a variable
9356      too.  */
9357   if (expr->expr_type == EXPR_FUNCTION
9358       && expr->ref == NULL)
9359     {
9360       if (expr->value.function.isym != NULL)
9361         return false;
9362
9363       if (expr->value.function.esym != NULL)
9364         {
9365           func_ifc = expr->value.function.esym;
9366           goto found_ifc;
9367         }
9368       else
9369         {
9370           gcc_assert (expr->symtree);
9371           func_ifc = expr->symtree->n.sym;
9372           goto found_ifc;
9373         }
9374
9375       gcc_unreachable ();
9376     }
9377
9378   comp = gfc_get_proc_ptr_comp (expr);
9379   if ((expr->expr_type == EXPR_PPC || expr->expr_type == EXPR_FUNCTION)
9380       && comp)
9381     {
9382       func_ifc = comp->ts.interface;
9383       goto found_ifc;
9384     }
9385
9386   if (expr->expr_type == EXPR_COMPCALL)
9387     {
9388       gcc_assert (!expr->value.compcall.tbp->is_generic);
9389       func_ifc = expr->value.compcall.tbp->u.specific->n.sym;
9390       goto found_ifc;
9391     }
9392
9393   return false;
9394
9395 found_ifc:
9396   gcc_assert (func_ifc->attr.function
9397               && func_ifc->result != NULL);
9398   return func_ifc->result->attr.pointer;
9399 }
9400
9401
9402 /* Is the lhs OK for automatic reallocation?  */
9403
9404 static bool
9405 is_scalar_reallocatable_lhs (gfc_expr *expr)
9406 {
9407   gfc_ref * ref;
9408
9409   /* An allocatable variable with no reference.  */
9410   if (expr->symtree->n.sym->attr.allocatable
9411         && !expr->ref)
9412     return true;
9413
9414   /* All that can be left are allocatable components.  However, we do
9415      not check for allocatable components here because the expression
9416      could be an allocatable component of a pointer component.  */
9417   if (expr->symtree->n.sym->ts.type != BT_DERIVED
9418         && expr->symtree->n.sym->ts.type != BT_CLASS)
9419     return false;
9420
9421   /* Find an allocatable component ref last.  */
9422   for (ref = expr->ref; ref; ref = ref->next)
9423     if (ref->type == REF_COMPONENT
9424           && !ref->next
9425           && ref->u.c.component->attr.allocatable)
9426       return true;
9427
9428   return false;
9429 }
9430
9431
9432 /* Allocate or reallocate scalar lhs, as necessary.  */
9433
9434 static void
9435 alloc_scalar_allocatable_for_assignment (stmtblock_t *block,
9436                                          tree string_length,
9437                                          gfc_expr *expr1,
9438                                          gfc_expr *expr2)
9439
9440 {
9441   tree cond;
9442   tree tmp;
9443   tree size;
9444   tree size_in_bytes;
9445   tree jump_label1;
9446   tree jump_label2;
9447   gfc_se lse;
9448   gfc_ref *ref;
9449
9450   if (!expr1 || expr1->rank)
9451     return;
9452
9453   if (!expr2 || expr2->rank)
9454     return;
9455
9456   for (ref = expr1->ref; ref; ref = ref->next)
9457     if (ref->type == REF_SUBSTRING)
9458       return;
9459
9460   realloc_lhs_warning (expr2->ts.type, false, &expr2->where);
9461
9462   /* Since this is a scalar lhs, we can afford to do this.  That is,
9463      there is no risk of side effects being repeated.  */
9464   gfc_init_se (&lse, NULL);
9465   lse.want_pointer = 1;
9466   gfc_conv_expr (&lse, expr1);
9467
9468   jump_label1 = gfc_build_label_decl (NULL_TREE);
9469   jump_label2 = gfc_build_label_decl (NULL_TREE);
9470
9471   /* Do the allocation if the lhs is NULL. Otherwise go to label 1.  */
9472   tmp = build_int_cst (TREE_TYPE (lse.expr), 0);
9473   cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
9474                           lse.expr, tmp);
9475   tmp = build3_v (COND_EXPR, cond,
9476                   build1_v (GOTO_EXPR, jump_label1),
9477                   build_empty_stmt (input_location));
9478   gfc_add_expr_to_block (block, tmp);
9479
9480   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
9481     {
9482       /* Use the rhs string length and the lhs element size.  */
9483       size = string_length;
9484       tmp = TREE_TYPE (gfc_typenode_for_spec (&expr1->ts));
9485       tmp = TYPE_SIZE_UNIT (tmp);
9486       size_in_bytes = fold_build2_loc (input_location, MULT_EXPR,
9487                                        TREE_TYPE (tmp), tmp,
9488                                        fold_convert (TREE_TYPE (tmp), size));
9489     }
9490   else
9491     {
9492       /* Otherwise use the length in bytes of the rhs.  */
9493       size = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&expr1->ts));
9494       size_in_bytes = size;
9495     }
9496
9497   size_in_bytes = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
9498                                    size_in_bytes, size_one_node);
9499
9500   if (gfc_caf_attr (expr1).codimension && flag_coarray == GFC_FCOARRAY_LIB)
9501     {
9502       tree caf_decl, token;
9503       gfc_se caf_se;
9504       symbol_attribute attr;
9505
9506       gfc_clear_attr (&attr);
9507       gfc_init_se (&caf_se, NULL);
9508
9509       caf_decl = gfc_get_tree_for_caf_expr (expr1);
9510       gfc_get_caf_token_offset (&caf_se, &token, NULL, caf_decl, NULL_TREE,
9511                                 NULL);
9512       gfc_add_block_to_block (block, &caf_se.pre);
9513       gfc_allocate_allocatable (block, lse.expr, size_in_bytes,
9514                                 gfc_build_addr_expr (NULL_TREE, token),
9515                                 NULL_TREE, NULL_TREE, NULL_TREE, jump_label1,
9516                                 expr1, 1);
9517     }
9518   else if (expr1->ts.type == BT_DERIVED && expr1->ts.u.derived->attr.alloc_comp)
9519     {
9520       tmp = build_call_expr_loc (input_location,
9521                                  builtin_decl_explicit (BUILT_IN_CALLOC),
9522                                  2, build_one_cst (size_type_node),
9523                                  size_in_bytes);
9524       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
9525       gfc_add_modify (block, lse.expr, tmp);
9526     }
9527   else
9528     {
9529       tmp = build_call_expr_loc (input_location,
9530                                  builtin_decl_explicit (BUILT_IN_MALLOC),
9531                                  1, size_in_bytes);
9532       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
9533       gfc_add_modify (block, lse.expr, tmp);
9534     }
9535
9536   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
9537     {
9538       /* Deferred characters need checking for lhs and rhs string
9539          length.  Other deferred parameter variables will have to
9540          come here too.  */
9541       tmp = build1_v (GOTO_EXPR, jump_label2);
9542       gfc_add_expr_to_block (block, tmp);
9543     }
9544   tmp = build1_v (LABEL_EXPR, jump_label1);
9545   gfc_add_expr_to_block (block, tmp);
9546
9547   /* For a deferred length character, reallocate if lengths of lhs and
9548      rhs are different.  */
9549   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
9550     {
9551       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
9552                               lse.string_length, size);
9553       /* Jump past the realloc if the lengths are the same.  */
9554       tmp = build3_v (COND_EXPR, cond,
9555                       build1_v (GOTO_EXPR, jump_label2),
9556                       build_empty_stmt (input_location));
9557       gfc_add_expr_to_block (block, tmp);
9558       tmp = build_call_expr_loc (input_location,
9559                                  builtin_decl_explicit (BUILT_IN_REALLOC),
9560                                  2, fold_convert (pvoid_type_node, lse.expr),
9561                                  size_in_bytes);
9562       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
9563       gfc_add_modify (block, lse.expr, tmp);
9564       tmp = build1_v (LABEL_EXPR, jump_label2);
9565       gfc_add_expr_to_block (block, tmp);
9566
9567       /* Update the lhs character length.  */
9568       size = string_length;
9569       gfc_add_modify (block, lse.string_length, size);
9570     }
9571 }
9572
9573 /* Check for assignments of the type
9574
9575    a = a + 4
9576
9577    to make sure we do not check for reallocation unneccessarily.  */
9578
9579
9580 static bool
9581 is_runtime_conformable (gfc_expr *expr1, gfc_expr *expr2)
9582 {
9583   gfc_actual_arglist *a;
9584   gfc_expr *e1, *e2;
9585
9586   switch (expr2->expr_type)
9587     {
9588     case EXPR_VARIABLE:
9589       return gfc_dep_compare_expr (expr1, expr2) == 0;
9590
9591     case EXPR_FUNCTION:
9592       if (expr2->value.function.esym
9593           && expr2->value.function.esym->attr.elemental)
9594         {
9595           for (a = expr2->value.function.actual; a != NULL; a = a->next)
9596             {
9597               e1 = a->expr;
9598               if (e1 && e1->rank > 0 && !is_runtime_conformable (expr1, e1))
9599                 return false;
9600             }
9601           return true;
9602         }
9603       else if (expr2->value.function.isym
9604                && expr2->value.function.isym->elemental)
9605         {
9606           for (a = expr2->value.function.actual; a != NULL; a = a->next)
9607             {
9608               e1 = a->expr;
9609               if (e1 && e1->rank > 0 && !is_runtime_conformable (expr1, e1))
9610                 return false;
9611             }
9612           return true;
9613         }
9614
9615       break;
9616
9617     case EXPR_OP:
9618       switch (expr2->value.op.op)
9619         {
9620         case INTRINSIC_NOT:
9621         case INTRINSIC_UPLUS:
9622         case INTRINSIC_UMINUS:
9623         case INTRINSIC_PARENTHESES:
9624           return is_runtime_conformable (expr1, expr2->value.op.op1);
9625
9626         case INTRINSIC_PLUS:
9627         case INTRINSIC_MINUS:
9628         case INTRINSIC_TIMES:
9629         case INTRINSIC_DIVIDE:
9630         case INTRINSIC_POWER:
9631         case INTRINSIC_AND:
9632         case INTRINSIC_OR:
9633         case INTRINSIC_EQV:
9634         case INTRINSIC_NEQV:
9635         case INTRINSIC_EQ:
9636         case INTRINSIC_NE:
9637         case INTRINSIC_GT:
9638         case INTRINSIC_GE:
9639         case INTRINSIC_LT:
9640         case INTRINSIC_LE:
9641         case INTRINSIC_EQ_OS:
9642         case INTRINSIC_NE_OS:
9643         case INTRINSIC_GT_OS:
9644         case INTRINSIC_GE_OS:
9645         case INTRINSIC_LT_OS:
9646         case INTRINSIC_LE_OS:
9647
9648           e1 = expr2->value.op.op1;
9649           e2 = expr2->value.op.op2;
9650
9651           if (e1->rank == 0 && e2->rank > 0)
9652             return is_runtime_conformable (expr1, e2);
9653           else if (e1->rank > 0 && e2->rank == 0)
9654             return is_runtime_conformable (expr1, e1);
9655           else if (e1->rank > 0 && e2->rank > 0)
9656             return is_runtime_conformable (expr1, e1)
9657               && is_runtime_conformable (expr1, e2);
9658           break;
9659
9660         default:
9661           break;
9662
9663         }
9664
9665       break;
9666
9667     default:
9668       break;
9669     }
9670   return false;
9671 }
9672
9673
9674 static tree
9675 trans_class_assignment (stmtblock_t *block, gfc_expr *lhs, gfc_expr *rhs,
9676                         gfc_se *lse, gfc_se *rse, bool use_vptr_copy,
9677                         bool class_realloc)
9678 {
9679   tree tmp, fcn, stdcopy, to_len, from_len, vptr;
9680   vec<tree, va_gc> *args = NULL;
9681
9682   vptr = trans_class_vptr_len_assignment (block, lhs, rhs, rse, &to_len,
9683                                          &from_len);
9684
9685   /* Generate allocation of the lhs.  */
9686   if (class_realloc)
9687     {
9688       stmtblock_t alloc;
9689       tree class_han;
9690
9691       tmp = gfc_vptr_size_get (vptr);
9692       class_han = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
9693           ? gfc_class_data_get (lse->expr) : lse->expr;
9694       gfc_init_block (&alloc);
9695       gfc_allocate_using_malloc (&alloc, class_han, tmp, NULL_TREE);
9696       tmp = fold_build2_loc (input_location, EQ_EXPR,
9697                              boolean_type_node, class_han,
9698                              build_int_cst (prvoid_type_node, 0));
9699       tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
9700                              gfc_unlikely (tmp,
9701                                            PRED_FORTRAN_FAIL_ALLOC),
9702                              gfc_finish_block (&alloc),
9703                              build_empty_stmt (input_location));
9704       gfc_add_expr_to_block (&lse->pre, tmp);
9705     }
9706
9707   fcn = gfc_vptr_copy_get (vptr);
9708
9709   tmp = GFC_CLASS_TYPE_P (TREE_TYPE (rse->expr))
9710       ? gfc_class_data_get (rse->expr) : rse->expr;
9711   if (use_vptr_copy)
9712     {
9713       if (!POINTER_TYPE_P (TREE_TYPE (tmp))
9714           || INDIRECT_REF_P (tmp)
9715           || (rhs->ts.type == BT_DERIVED
9716               && rhs->ts.u.derived->attr.unlimited_polymorphic
9717               && !rhs->ts.u.derived->attr.pointer
9718               && !rhs->ts.u.derived->attr.allocatable)
9719           || (UNLIMITED_POLY (rhs)
9720               && !CLASS_DATA (rhs)->attr.pointer
9721               && !CLASS_DATA (rhs)->attr.allocatable))
9722         vec_safe_push (args, gfc_build_addr_expr (NULL_TREE, tmp));
9723       else
9724         vec_safe_push (args, tmp);
9725       tmp = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
9726           ? gfc_class_data_get (lse->expr) : lse->expr;
9727       if (!POINTER_TYPE_P (TREE_TYPE (tmp))
9728           || INDIRECT_REF_P (tmp)
9729           || (lhs->ts.type == BT_DERIVED
9730               && lhs->ts.u.derived->attr.unlimited_polymorphic
9731               && !lhs->ts.u.derived->attr.pointer
9732               && !lhs->ts.u.derived->attr.allocatable)
9733           || (UNLIMITED_POLY (lhs)
9734               && !CLASS_DATA (lhs)->attr.pointer
9735               && !CLASS_DATA (lhs)->attr.allocatable))
9736         vec_safe_push (args, gfc_build_addr_expr (NULL_TREE, tmp));
9737       else
9738         vec_safe_push (args, tmp);
9739
9740       stdcopy = build_call_vec (TREE_TYPE (TREE_TYPE (fcn)), fcn, args);
9741
9742       if (to_len != NULL_TREE && !integer_zerop (from_len))
9743         {
9744           tree extcopy;
9745           vec_safe_push (args, from_len);
9746           vec_safe_push (args, to_len);
9747           extcopy = build_call_vec (TREE_TYPE (TREE_TYPE (fcn)), fcn, args);
9748
9749           tmp = fold_build2_loc (input_location, GT_EXPR,
9750                                  boolean_type_node, from_len,
9751                                  integer_zero_node);
9752           return fold_build3_loc (input_location, COND_EXPR,
9753                                   void_type_node, tmp,
9754                                   extcopy, stdcopy);
9755         }
9756       else
9757         return stdcopy;
9758     }
9759   else
9760     {
9761       tree rhst = GFC_CLASS_TYPE_P (TREE_TYPE (lse->expr))
9762           ? gfc_class_data_get (lse->expr) : lse->expr;
9763       stmtblock_t tblock;
9764       gfc_init_block (&tblock);
9765       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
9766         tmp = gfc_build_addr_expr (NULL_TREE, tmp);
9767       if (!POINTER_TYPE_P (TREE_TYPE (rhst)))
9768         rhst = gfc_build_addr_expr (NULL_TREE, rhst);
9769       /* When coming from a ptr_copy lhs and rhs are swapped.  */
9770       gfc_add_modify_loc (input_location, &tblock, rhst,
9771                           fold_convert (TREE_TYPE (rhst), tmp));
9772       return gfc_finish_block (&tblock);
9773     }
9774 }
9775
9776 /* Subroutine of gfc_trans_assignment that actually scalarizes the
9777    assignment.  EXPR1 is the destination/LHS and EXPR2 is the source/RHS.
9778    init_flag indicates initialization expressions and dealloc that no
9779    deallocate prior assignment is needed (if in doubt, set true).
9780    When PTR_COPY is set and expr1 is a class type, then use the _vptr-copy
9781    routine instead of a pointer assignment.  Alias resolution is only done,
9782    when MAY_ALIAS is set (the default).  This flag is used by ALLOCATE()
9783    where it is known, that newly allocated memory on the lhs can never be
9784    an alias of the rhs.  */
9785
9786 static tree
9787 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
9788                         bool dealloc, bool use_vptr_copy, bool may_alias)
9789 {
9790   gfc_se lse;
9791   gfc_se rse;
9792   gfc_ss *lss;
9793   gfc_ss *lss_section;
9794   gfc_ss *rss;
9795   gfc_loopinfo loop;
9796   tree tmp;
9797   stmtblock_t block;
9798   stmtblock_t body;
9799   bool l_is_temp;
9800   bool scalar_to_array;
9801   tree string_length;
9802   int n;
9803   bool maybe_workshare = false, lhs_refs_comp = false, rhs_refs_comp = false;
9804   symbol_attribute lhs_caf_attr, rhs_caf_attr, lhs_attr;
9805   bool is_poly_assign;
9806
9807   /* Assignment of the form lhs = rhs.  */
9808   gfc_start_block (&block);
9809
9810   gfc_init_se (&lse, NULL);
9811   gfc_init_se (&rse, NULL);
9812
9813   /* Walk the lhs.  */
9814   lss = gfc_walk_expr (expr1);
9815   if (gfc_is_reallocatable_lhs (expr1)
9816         && !(expr2->expr_type == EXPR_FUNCTION
9817              && expr2->value.function.isym != NULL))
9818     lss->is_alloc_lhs = 1;
9819   rss = NULL;
9820
9821   if ((expr1->ts.type == BT_DERIVED)
9822       && (gfc_is_alloc_class_array_function (expr2)
9823           || gfc_is_alloc_class_scalar_function (expr2)))
9824     expr2->must_finalize = 1;
9825
9826   /* Checking whether a class assignment is desired is quite complicated and
9827      needed at two locations, so do it once only before the information is
9828      needed.  */
9829   lhs_attr = gfc_expr_attr (expr1);
9830   is_poly_assign = (use_vptr_copy || lhs_attr.pointer
9831                     || (lhs_attr.allocatable && !lhs_attr.dimension))
9832                    && (expr1->ts.type == BT_CLASS
9833                        || gfc_is_class_array_ref (expr1, NULL)
9834                        || gfc_is_class_scalar_expr (expr1)
9835                        || gfc_is_class_array_ref (expr2, NULL)
9836                        || gfc_is_class_scalar_expr (expr2));
9837
9838
9839   /* Only analyze the expressions for coarray properties, when in coarray-lib
9840      mode.  */
9841   if (flag_coarray == GFC_FCOARRAY_LIB)
9842     {
9843       lhs_caf_attr = gfc_caf_attr (expr1, false, &lhs_refs_comp);
9844       rhs_caf_attr = gfc_caf_attr (expr2, false, &rhs_refs_comp);
9845     }
9846
9847   if (lss != gfc_ss_terminator)
9848     {
9849       /* The assignment needs scalarization.  */
9850       lss_section = lss;
9851
9852       /* Find a non-scalar SS from the lhs.  */
9853       while (lss_section != gfc_ss_terminator
9854              && lss_section->info->type != GFC_SS_SECTION)
9855         lss_section = lss_section->next;
9856
9857       gcc_assert (lss_section != gfc_ss_terminator);
9858
9859       /* Initialize the scalarizer.  */
9860       gfc_init_loopinfo (&loop);
9861
9862       /* Walk the rhs.  */
9863       rss = gfc_walk_expr (expr2);
9864       if (rss == gfc_ss_terminator)
9865         /* The rhs is scalar.  Add a ss for the expression.  */
9866         rss = gfc_get_scalar_ss (gfc_ss_terminator, expr2);
9867       /* When doing a class assign, then the handle to the rhs needs to be a
9868          pointer to allow for polymorphism.  */
9869       if (is_poly_assign && expr2->rank == 0 && !UNLIMITED_POLY (expr2))
9870         rss->info->type = GFC_SS_REFERENCE;
9871
9872       /* Associate the SS with the loop.  */
9873       gfc_add_ss_to_loop (&loop, lss);
9874       gfc_add_ss_to_loop (&loop, rss);
9875
9876       /* Calculate the bounds of the scalarization.  */
9877       gfc_conv_ss_startstride (&loop);
9878       /* Enable loop reversal.  */
9879       for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
9880         loop.reverse[n] = GFC_ENABLE_REVERSE;
9881       /* Resolve any data dependencies in the statement.  */
9882       if (may_alias)
9883         gfc_conv_resolve_dependencies (&loop, lss, rss);
9884       /* Setup the scalarizing loops.  */
9885       gfc_conv_loop_setup (&loop, &expr2->where);
9886
9887       /* Setup the gfc_se structures.  */
9888       gfc_copy_loopinfo_to_se (&lse, &loop);
9889       gfc_copy_loopinfo_to_se (&rse, &loop);
9890
9891       rse.ss = rss;
9892       gfc_mark_ss_chain_used (rss, 1);
9893       if (loop.temp_ss == NULL)
9894         {
9895           lse.ss = lss;
9896           gfc_mark_ss_chain_used (lss, 1);
9897         }
9898       else
9899         {
9900           lse.ss = loop.temp_ss;
9901           gfc_mark_ss_chain_used (lss, 3);
9902           gfc_mark_ss_chain_used (loop.temp_ss, 3);
9903         }
9904
9905       /* Allow the scalarizer to workshare array assignments.  */
9906       if ((ompws_flags & (OMPWS_WORKSHARE_FLAG | OMPWS_SCALARIZER_BODY))
9907           == OMPWS_WORKSHARE_FLAG
9908           && loop.temp_ss == NULL)
9909         {
9910           maybe_workshare = true;
9911           ompws_flags |= OMPWS_SCALARIZER_WS | OMPWS_SCALARIZER_BODY;
9912         }
9913
9914       /* Start the scalarized loop body.  */
9915       gfc_start_scalarized_body (&loop, &body);
9916     }
9917   else
9918     gfc_init_block (&body);
9919
9920   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
9921
9922   /* Translate the expression.  */
9923   rse.want_coarray = flag_coarray == GFC_FCOARRAY_LIB && init_flag
9924       && lhs_caf_attr.codimension;
9925   gfc_conv_expr (&rse, expr2);
9926
9927   /* Deal with the case of a scalar class function assigned to a derived type.  */
9928   if (gfc_is_alloc_class_scalar_function (expr2)
9929       && expr1->ts.type == BT_DERIVED)
9930     {
9931       rse.expr = gfc_class_data_get (rse.expr);
9932       rse.expr = build_fold_indirect_ref_loc (input_location, rse.expr);
9933     }
9934
9935   /* Stabilize a string length for temporaries.  */
9936   if (expr2->ts.type == BT_CHARACTER && !expr1->ts.deferred
9937       && !(VAR_P (rse.string_length)
9938            || TREE_CODE (rse.string_length) == PARM_DECL
9939            || TREE_CODE (rse.string_length) == INDIRECT_REF))
9940     string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
9941   else if (expr2->ts.type == BT_CHARACTER)
9942     string_length = rse.string_length;
9943   else
9944     string_length = NULL_TREE;
9945
9946   if (l_is_temp)
9947     {
9948       gfc_conv_tmp_array_ref (&lse);
9949       if (expr2->ts.type == BT_CHARACTER)
9950         lse.string_length = string_length;
9951     }
9952   else
9953     {
9954       gfc_conv_expr (&lse, expr1);
9955       if (gfc_option.rtcheck & GFC_RTCHECK_MEM
9956           && !init_flag
9957           && gfc_expr_attr (expr1).allocatable
9958           && expr1->rank
9959           && !expr2->rank)
9960         {
9961           tree cond;
9962           const char* msg;
9963
9964           tmp = INDIRECT_REF_P (lse.expr)
9965               ? gfc_build_addr_expr (NULL_TREE, lse.expr) : lse.expr;
9966
9967           /* We should only get array references here.  */
9968           gcc_assert (TREE_CODE (tmp) == POINTER_PLUS_EXPR
9969                       || TREE_CODE (tmp) == ARRAY_REF);
9970
9971           /* 'tmp' is either the pointer to the array(POINTER_PLUS_EXPR)
9972              or the array itself(ARRAY_REF).  */
9973           tmp = TREE_OPERAND (tmp, 0);
9974
9975           /* Provide the address of the array.  */
9976           if (TREE_CODE (lse.expr) == ARRAY_REF)
9977             tmp = gfc_build_addr_expr (NULL_TREE, tmp);
9978
9979           cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
9980                                   tmp, build_int_cst (TREE_TYPE (tmp), 0));
9981           msg = _("Assignment of scalar to unallocated array");
9982           gfc_trans_runtime_check (true, false, cond, &loop.pre,
9983                                    &expr1->where, msg);
9984         }
9985     }
9986
9987   /* Assignments of scalar derived types with allocatable components
9988      to arrays must be done with a deep copy and the rhs temporary
9989      must have its components deallocated afterwards.  */
9990   scalar_to_array = (expr2->ts.type == BT_DERIVED
9991                        && expr2->ts.u.derived->attr.alloc_comp
9992                        && !gfc_expr_is_variable (expr2)
9993                        && expr1->rank && !expr2->rank);
9994   scalar_to_array |= (expr1->ts.type == BT_DERIVED
9995                                     && expr1->rank
9996                                     && expr1->ts.u.derived->attr.alloc_comp
9997                                     && gfc_is_alloc_class_scalar_function (expr2));
9998   if (scalar_to_array && dealloc)
9999     {
10000       tmp = gfc_deallocate_alloc_comp_no_caf (expr2->ts.u.derived, rse.expr, 0);
10001       gfc_prepend_expr_to_block (&loop.post, tmp);
10002     }
10003
10004   /* When assigning a character function result to a deferred-length variable,
10005      the function call must happen before the (re)allocation of the lhs -
10006      otherwise the character length of the result is not known.
10007      NOTE: This relies on having the exact dependence of the length type
10008      parameter available to the caller; gfortran saves it in the .mod files.
10009      NOTE ALSO: The concatenation operation generates a temporary pointer,
10010      whose allocation must go to the innermost loop.  */
10011   if (flag_realloc_lhs
10012       && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred
10013       && !(lss != gfc_ss_terminator
10014            && expr2->expr_type == EXPR_OP
10015            && expr2->value.op.op == INTRINSIC_CONCAT))
10016     gfc_add_block_to_block (&block, &rse.pre);
10017
10018   /* Nullify the allocatable components corresponding to those of the lhs
10019      derived type, so that the finalization of the function result does not
10020      affect the lhs of the assignment. Prepend is used to ensure that the
10021      nullification occurs before the call to the finalizer. In the case of
10022      a scalar to array assignment, this is done in gfc_trans_scalar_assign
10023      as part of the deep copy.  */
10024   if (!scalar_to_array && expr1->ts.type == BT_DERIVED
10025                        && (gfc_is_alloc_class_array_function (expr2)
10026                            || gfc_is_alloc_class_scalar_function (expr2)))
10027     {
10028       tmp = rse.expr;
10029       tmp = gfc_nullify_alloc_comp (expr1->ts.u.derived, rse.expr, 0);
10030       gfc_prepend_expr_to_block (&rse.post, tmp);
10031       if (lss != gfc_ss_terminator && rss == gfc_ss_terminator)
10032         gfc_add_block_to_block (&loop.post, &rse.post);
10033     }
10034
10035   if (is_poly_assign)
10036     tmp = trans_class_assignment (&body, expr1, expr2, &lse, &rse,
10037                                   use_vptr_copy || (lhs_attr.allocatable
10038                                                     && !lhs_attr.dimension),
10039                                   flag_realloc_lhs && !lhs_attr.pointer);
10040   else if (flag_coarray == GFC_FCOARRAY_LIB
10041            && lhs_caf_attr.codimension && rhs_caf_attr.codimension
10042            && ((lhs_caf_attr.allocatable && lhs_refs_comp)
10043                || (rhs_caf_attr.allocatable && rhs_refs_comp)))
10044     {
10045       /* Only detour to caf_send[get][_by_ref] () when the lhs or rhs is an
10046          allocatable component, because those need to be accessed via the
10047          caf-runtime.  No need to check for coindexes here, because resolve
10048          has rewritten those already.  */
10049       gfc_code code;
10050       gfc_actual_arglist a1, a2;
10051       /* Clear the structures to prevent accessing garbage.  */
10052       memset (&code, '\0', sizeof (gfc_code));
10053       memset (&a1, '\0', sizeof (gfc_actual_arglist));
10054       memset (&a2, '\0', sizeof (gfc_actual_arglist));
10055       a1.expr = expr1;
10056       a1.next = &a2;
10057       a2.expr = expr2;
10058       a2.next = NULL;
10059       code.ext.actual = &a1;
10060       code.resolved_isym = gfc_intrinsic_subroutine_by_id (GFC_ISYM_CAF_SEND);
10061       tmp = gfc_conv_intrinsic_subroutine (&code);
10062     }
10063   else
10064     tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
10065                                    gfc_expr_is_variable (expr2)
10066                                    || scalar_to_array
10067                                    || expr2->expr_type == EXPR_ARRAY,
10068                                    !(l_is_temp || init_flag) && dealloc,
10069                                    expr1->symtree->n.sym->attr.codimension);
10070   /* Add the pre blocks to the body.  */
10071   gfc_add_block_to_block (&body, &rse.pre);
10072   gfc_add_block_to_block (&body, &lse.pre);
10073   gfc_add_expr_to_block (&body, tmp);
10074   /* Add the post blocks to the body.  */
10075   gfc_add_block_to_block (&body, &rse.post);
10076   gfc_add_block_to_block (&body, &lse.post);
10077
10078   if (lss == gfc_ss_terminator)
10079     {
10080       /* F2003: Add the code for reallocation on assignment.  */
10081       if (flag_realloc_lhs && is_scalar_reallocatable_lhs (expr1)
10082           && !is_poly_assign)
10083         alloc_scalar_allocatable_for_assignment (&block, string_length,
10084                                                  expr1, expr2);
10085
10086       /* Use the scalar assignment as is.  */
10087       gfc_add_block_to_block (&block, &body);
10088     }
10089   else
10090     {
10091       gcc_assert (lse.ss == gfc_ss_terminator
10092                   && rse.ss == gfc_ss_terminator);
10093
10094       if (l_is_temp)
10095         {
10096           gfc_trans_scalarized_loop_boundary (&loop, &body);
10097
10098           /* We need to copy the temporary to the actual lhs.  */
10099           gfc_init_se (&lse, NULL);
10100           gfc_init_se (&rse, NULL);
10101           gfc_copy_loopinfo_to_se (&lse, &loop);
10102           gfc_copy_loopinfo_to_se (&rse, &loop);
10103
10104           rse.ss = loop.temp_ss;
10105           lse.ss = lss;
10106
10107           gfc_conv_tmp_array_ref (&rse);
10108           gfc_conv_expr (&lse, expr1);
10109
10110           gcc_assert (lse.ss == gfc_ss_terminator
10111                       && rse.ss == gfc_ss_terminator);
10112
10113           if (expr2->ts.type == BT_CHARACTER)
10114             rse.string_length = string_length;
10115
10116           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
10117                                          false, dealloc);
10118           gfc_add_expr_to_block (&body, tmp);
10119         }
10120
10121       /* F2003: Allocate or reallocate lhs of allocatable array.  */
10122       if (flag_realloc_lhs
10123           && gfc_is_reallocatable_lhs (expr1)
10124           && expr2->rank
10125           && !is_runtime_conformable (expr1, expr2))
10126         {
10127           realloc_lhs_warning (expr1->ts.type, true, &expr1->where);
10128           ompws_flags &= ~OMPWS_SCALARIZER_WS;
10129           tmp = gfc_alloc_allocatable_for_assignment (&loop, expr1, expr2);
10130           if (tmp != NULL_TREE)
10131             gfc_add_expr_to_block (&loop.code[expr1->rank - 1], tmp);
10132         }
10133
10134       if (maybe_workshare)
10135         ompws_flags &= ~OMPWS_SCALARIZER_BODY;
10136
10137       /* Generate the copying loops.  */
10138       gfc_trans_scalarizing_loops (&loop, &body);
10139
10140       /* Wrap the whole thing up.  */
10141       gfc_add_block_to_block (&block, &loop.pre);
10142       gfc_add_block_to_block (&block, &loop.post);
10143
10144       gfc_cleanup_loop (&loop);
10145     }
10146
10147   return gfc_finish_block (&block);
10148 }
10149
10150
10151 /* Check whether EXPR is a copyable array.  */
10152
10153 static bool
10154 copyable_array_p (gfc_expr * expr)
10155 {
10156   if (expr->expr_type != EXPR_VARIABLE)
10157     return false;
10158
10159   /* First check it's an array.  */
10160   if (expr->rank < 1 || !expr->ref || expr->ref->next)
10161     return false;
10162
10163   if (!gfc_full_array_ref_p (expr->ref, NULL))
10164     return false;
10165
10166   /* Next check that it's of a simple enough type.  */
10167   switch (expr->ts.type)
10168     {
10169     case BT_INTEGER:
10170     case BT_REAL:
10171     case BT_COMPLEX:
10172     case BT_LOGICAL:
10173       return true;
10174
10175     case BT_CHARACTER:
10176       return false;
10177
10178     case_bt_struct:
10179       return !expr->ts.u.derived->attr.alloc_comp;
10180
10181     default:
10182       break;
10183     }
10184
10185   return false;
10186 }
10187
10188 /* Translate an assignment.  */
10189
10190 tree
10191 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
10192                       bool dealloc, bool use_vptr_copy, bool may_alias)
10193 {
10194   tree tmp;
10195
10196   /* Special case a single function returning an array.  */
10197   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
10198     {
10199       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
10200       if (tmp)
10201         return tmp;
10202     }
10203
10204   /* Special case assigning an array to zero.  */
10205   if (copyable_array_p (expr1)
10206       && is_zero_initializer_p (expr2))
10207     {
10208       tmp = gfc_trans_zero_assign (expr1);
10209       if (tmp)
10210         return tmp;
10211     }
10212
10213   /* Special case copying one array to another.  */
10214   if (copyable_array_p (expr1)
10215       && copyable_array_p (expr2)
10216       && gfc_compare_types (&expr1->ts, &expr2->ts)
10217       && !gfc_check_dependency (expr1, expr2, 0))
10218     {
10219       tmp = gfc_trans_array_copy (expr1, expr2);
10220       if (tmp)
10221         return tmp;
10222     }
10223
10224   /* Special case initializing an array from a constant array constructor.  */
10225   if (copyable_array_p (expr1)
10226       && expr2->expr_type == EXPR_ARRAY
10227       && gfc_compare_types (&expr1->ts, &expr2->ts))
10228     {
10229       tmp = gfc_trans_array_constructor_copy (expr1, expr2);
10230       if (tmp)
10231         return tmp;
10232     }
10233
10234   /* Fallback to the scalarizer to generate explicit loops.  */
10235   return gfc_trans_assignment_1 (expr1, expr2, init_flag, dealloc,
10236                                  use_vptr_copy, may_alias);
10237 }
10238
10239 tree
10240 gfc_trans_init_assign (gfc_code * code)
10241 {
10242   return gfc_trans_assignment (code->expr1, code->expr2, true, false, true);
10243 }
10244
10245 tree
10246 gfc_trans_assign (gfc_code * code)
10247 {
10248   return gfc_trans_assignment (code->expr1, code->expr2, false, true);
10249 }