OSDN Git Service

2011-05-26 Paul Thomas <pault@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / trans-expr.c
1 /* Expression translation
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
3    2011
4    Free Software Foundation, Inc.
5    Contributed by Paul Brook <paul@nowt.org>
6    and Steven Bosscher <s.bosscher@student.tudelft.nl>
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 /* trans-expr.c-- generate GENERIC trees for gfc_expr.  */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tree.h"
30 #include "diagnostic-core.h"    /* For fatal_error.  */
31 #include "langhooks.h"
32 #include "flags.h"
33 #include "gfortran.h"
34 #include "arith.h"
35 #include "constructor.h"
36 #include "trans.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
44 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
45 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
46                                                  gfc_expr *);
47
48 /* Copy the scalarization loop variables.  */
49
50 static void
51 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
52 {
53   dest->ss = src->ss;
54   dest->loop = src->loop;
55 }
56
57
58 /* Initialize a simple expression holder.
59
60    Care must be taken when multiple se are created with the same parent.
61    The child se must be kept in sync.  The easiest way is to delay creation
62    of a child se until after after the previous se has been translated.  */
63
64 void
65 gfc_init_se (gfc_se * se, gfc_se * parent)
66 {
67   memset (se, 0, sizeof (gfc_se));
68   gfc_init_block (&se->pre);
69   gfc_init_block (&se->post);
70
71   se->parent = parent;
72
73   if (parent)
74     gfc_copy_se_loopvars (se, parent);
75 }
76
77
78 /* Advances to the next SS in the chain.  Use this rather than setting
79    se->ss = se->ss->next because all the parents needs to be kept in sync.
80    See gfc_init_se.  */
81
82 void
83 gfc_advance_se_ss_chain (gfc_se * se)
84 {
85   gfc_se *p;
86
87   gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
88
89   p = se;
90   /* Walk down the parent chain.  */
91   while (p != NULL)
92     {
93       /* Simple consistency check.  */
94       gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
95
96       p->ss = p->ss->next;
97
98       p = p->parent;
99     }
100 }
101
102
103 /* Ensures the result of the expression as either a temporary variable
104    or a constant so that it can be used repeatedly.  */
105
106 void
107 gfc_make_safe_expr (gfc_se * se)
108 {
109   tree var;
110
111   if (CONSTANT_CLASS_P (se->expr))
112     return;
113
114   /* We need a temporary for this result.  */
115   var = gfc_create_var (TREE_TYPE (se->expr), NULL);
116   gfc_add_modify (&se->pre, var, se->expr);
117   se->expr = var;
118 }
119
120
121 /* Return an expression which determines if a dummy parameter is present.
122    Also used for arguments to procedures with multiple entry points.  */
123
124 tree
125 gfc_conv_expr_present (gfc_symbol * sym)
126 {
127   tree decl, cond;
128
129   gcc_assert (sym->attr.dummy);
130
131   decl = gfc_get_symbol_decl (sym);
132   if (TREE_CODE (decl) != PARM_DECL)
133     {
134       /* Array parameters use a temporary descriptor, we want the real
135          parameter.  */
136       gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
137              || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
138       decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
139     }
140
141   cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, decl,
142                           fold_convert (TREE_TYPE (decl), null_pointer_node));
143
144   /* Fortran 2008 allows to pass null pointers and non-associated pointers
145      as actual argument to denote absent dummies. For array descriptors,
146      we thus also need to check the array descriptor.  */
147   if (!sym->attr.pointer && !sym->attr.allocatable
148       && sym->as && sym->as->type == AS_ASSUMED_SHAPE
149       && (gfc_option.allow_std & GFC_STD_F2008) != 0)
150     {
151       tree tmp;
152       tmp = build_fold_indirect_ref_loc (input_location, decl);
153       tmp = gfc_conv_array_data (tmp);
154       tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, tmp,
155                              fold_convert (TREE_TYPE (tmp), null_pointer_node));
156       cond = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
157                               boolean_type_node, cond, tmp);
158     }
159
160   return cond;
161 }
162
163
164 /* Converts a missing, dummy argument into a null or zero.  */
165
166 void
167 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
168 {
169   tree present;
170   tree tmp;
171
172   present = gfc_conv_expr_present (arg->symtree->n.sym);
173
174   if (kind > 0)
175     {
176       /* Create a temporary and convert it to the correct type.  */
177       tmp = gfc_get_int_type (kind);
178       tmp = fold_convert (tmp, build_fold_indirect_ref_loc (input_location,
179                                                         se->expr));
180     
181       /* Test for a NULL value.  */
182       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), present,
183                         tmp, fold_convert (TREE_TYPE (tmp), integer_one_node));
184       tmp = gfc_evaluate_now (tmp, &se->pre);
185       se->expr = gfc_build_addr_expr (NULL_TREE, tmp);
186     }
187   else
188     {
189       tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (se->expr),
190                         present, se->expr,
191                         build_zero_cst (TREE_TYPE (se->expr)));
192       tmp = gfc_evaluate_now (tmp, &se->pre);
193       se->expr = tmp;
194     }
195
196   if (ts.type == BT_CHARACTER)
197     {
198       tmp = build_int_cst (gfc_charlen_type_node, 0);
199       tmp = fold_build3_loc (input_location, COND_EXPR, gfc_charlen_type_node,
200                              present, se->string_length, tmp);
201       tmp = gfc_evaluate_now (tmp, &se->pre);
202       se->string_length = tmp;
203     }
204   return;
205 }
206
207
208 /* Get the character length of an expression, looking through gfc_refs
209    if necessary.  */
210
211 tree
212 gfc_get_expr_charlen (gfc_expr *e)
213 {
214   gfc_ref *r;
215   tree length;
216
217   gcc_assert (e->expr_type == EXPR_VARIABLE 
218               && e->ts.type == BT_CHARACTER);
219   
220   length = NULL; /* To silence compiler warning.  */
221
222   if (is_subref_array (e) && e->ts.u.cl->length)
223     {
224       gfc_se tmpse;
225       gfc_init_se (&tmpse, NULL);
226       gfc_conv_expr_type (&tmpse, e->ts.u.cl->length, gfc_charlen_type_node);
227       e->ts.u.cl->backend_decl = tmpse.expr;
228       return tmpse.expr;
229     }
230
231   /* First candidate: if the variable is of type CHARACTER, the
232      expression's length could be the length of the character
233      variable.  */
234   if (e->symtree->n.sym->ts.type == BT_CHARACTER)
235     length = e->symtree->n.sym->ts.u.cl->backend_decl;
236
237   /* Look through the reference chain for component references.  */
238   for (r = e->ref; r; r = r->next)
239     {
240       switch (r->type)
241         {
242         case REF_COMPONENT:
243           if (r->u.c.component->ts.type == BT_CHARACTER)
244             length = r->u.c.component->ts.u.cl->backend_decl;
245           break;
246
247         case REF_ARRAY:
248           /* Do nothing.  */
249           break;
250
251         default:
252           /* We should never got substring references here.  These will be
253              broken down by the scalarizer.  */
254           gcc_unreachable ();
255           break;
256         }
257     }
258
259   gcc_assert (length != NULL);
260   return length;
261 }
262
263
264 /* For each character array constructor subexpression without a ts.u.cl->length,
265    replace it by its first element (if there aren't any elements, the length
266    should already be set to zero).  */
267
268 static void
269 flatten_array_ctors_without_strlen (gfc_expr* e)
270 {
271   gfc_actual_arglist* arg;
272   gfc_constructor* c;
273
274   if (!e)
275     return;
276
277   switch (e->expr_type)
278     {
279
280     case EXPR_OP:
281       flatten_array_ctors_without_strlen (e->value.op.op1); 
282       flatten_array_ctors_without_strlen (e->value.op.op2); 
283       break;
284
285     case EXPR_COMPCALL:
286       /* TODO: Implement as with EXPR_FUNCTION when needed.  */
287       gcc_unreachable ();
288
289     case EXPR_FUNCTION:
290       for (arg = e->value.function.actual; arg; arg = arg->next)
291         flatten_array_ctors_without_strlen (arg->expr);
292       break;
293
294     case EXPR_ARRAY:
295
296       /* We've found what we're looking for.  */
297       if (e->ts.type == BT_CHARACTER && !e->ts.u.cl->length)
298         {
299           gfc_constructor *c;
300           gfc_expr* new_expr;
301
302           gcc_assert (e->value.constructor);
303
304           c = gfc_constructor_first (e->value.constructor);
305           new_expr = c->expr;
306           c->expr = NULL;
307
308           flatten_array_ctors_without_strlen (new_expr);
309           gfc_replace_expr (e, new_expr);
310           break;
311         }
312
313       /* Otherwise, fall through to handle constructor elements.  */
314     case EXPR_STRUCTURE:
315       for (c = gfc_constructor_first (e->value.constructor);
316            c; c = gfc_constructor_next (c))
317         flatten_array_ctors_without_strlen (c->expr);
318       break;
319
320     default:
321       break;
322
323     }
324 }
325
326
327 /* Generate code to initialize a string length variable. Returns the
328    value.  For array constructors, cl->length might be NULL and in this case,
329    the first element of the constructor is needed.  expr is the original
330    expression so we can access it but can be NULL if this is not needed.  */
331
332 void
333 gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock)
334 {
335   gfc_se se;
336
337   gfc_init_se (&se, NULL);
338
339   if (!cl->length
340         && cl->backend_decl
341         && TREE_CODE (cl->backend_decl) == VAR_DECL)
342     return;
343
344   /* If cl->length is NULL, use gfc_conv_expr to obtain the string length but
345      "flatten" array constructors by taking their first element; all elements
346      should be the same length or a cl->length should be present.  */
347   if (!cl->length)
348     {
349       gfc_expr* expr_flat;
350       gcc_assert (expr);
351       expr_flat = gfc_copy_expr (expr);
352       flatten_array_ctors_without_strlen (expr_flat);
353       gfc_resolve_expr (expr_flat);
354
355       gfc_conv_expr (&se, expr_flat);
356       gfc_add_block_to_block (pblock, &se.pre);
357       cl->backend_decl = convert (gfc_charlen_type_node, se.string_length);
358
359       gfc_free_expr (expr_flat);
360       return;
361     }
362
363   /* Convert cl->length.  */
364
365   gcc_assert (cl->length);
366
367   gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
368   se.expr = fold_build2_loc (input_location, MAX_EXPR, gfc_charlen_type_node,
369                              se.expr, build_int_cst (gfc_charlen_type_node, 0));
370   gfc_add_block_to_block (pblock, &se.pre);
371
372   if (cl->backend_decl)
373     gfc_add_modify (pblock, cl->backend_decl, se.expr);
374   else
375     cl->backend_decl = gfc_evaluate_now (se.expr, pblock);
376 }
377
378
379 static void
380 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
381                     const char *name, locus *where)
382 {
383   tree tmp;
384   tree type;
385   tree fault;
386   gfc_se start;
387   gfc_se end;
388   char *msg;
389
390   type = gfc_get_character_type (kind, ref->u.ss.length);
391   type = build_pointer_type (type);
392
393   gfc_init_se (&start, se);
394   gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
395   gfc_add_block_to_block (&se->pre, &start.pre);
396
397   if (integer_onep (start.expr))
398     gfc_conv_string_parameter (se);
399   else
400     {
401       tmp = start.expr;
402       STRIP_NOPS (tmp);
403       /* Avoid multiple evaluation of substring start.  */
404       if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
405         start.expr = gfc_evaluate_now (start.expr, &se->pre);
406
407       /* Change the start of the string.  */
408       if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
409         tmp = se->expr;
410       else
411         tmp = build_fold_indirect_ref_loc (input_location,
412                                        se->expr);
413       tmp = gfc_build_array_ref (tmp, start.expr, NULL);
414       se->expr = gfc_build_addr_expr (type, tmp);
415     }
416
417   /* Length = end + 1 - start.  */
418   gfc_init_se (&end, se);
419   if (ref->u.ss.end == NULL)
420     end.expr = se->string_length;
421   else
422     {
423       gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
424       gfc_add_block_to_block (&se->pre, &end.pre);
425     }
426   tmp = end.expr;
427   STRIP_NOPS (tmp);
428   if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
429     end.expr = gfc_evaluate_now (end.expr, &se->pre);
430
431   if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
432     {
433       tree nonempty = fold_build2_loc (input_location, LE_EXPR,
434                                        boolean_type_node, start.expr,
435                                        end.expr);
436
437       /* Check lower bound.  */
438       fault = fold_build2_loc (input_location, LT_EXPR, boolean_type_node,
439                                start.expr,
440                                build_int_cst (gfc_charlen_type_node, 1));
441       fault = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
442                                boolean_type_node, nonempty, fault);
443       if (name)
444         asprintf (&msg, "Substring out of bounds: lower bound (%%ld) of '%s' "
445                   "is less than one", name);
446       else
447         asprintf (&msg, "Substring out of bounds: lower bound (%%ld)"
448                   "is less than one");
449       gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
450                                fold_convert (long_integer_type_node,
451                                              start.expr));
452       free (msg);
453
454       /* Check upper bound.  */
455       fault = fold_build2_loc (input_location, GT_EXPR, boolean_type_node,
456                                end.expr, se->string_length);
457       fault = fold_build2_loc (input_location, TRUTH_ANDIF_EXPR,
458                                boolean_type_node, nonempty, fault);
459       if (name)
460         asprintf (&msg, "Substring out of bounds: upper bound (%%ld) of '%s' "
461                   "exceeds string length (%%ld)", name);
462       else
463         asprintf (&msg, "Substring out of bounds: upper bound (%%ld) "
464                   "exceeds string length (%%ld)");
465       gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
466                                fold_convert (long_integer_type_node, end.expr),
467                                fold_convert (long_integer_type_node,
468                                              se->string_length));
469       free (msg);
470     }
471
472   /* If the start and end expressions are equal, the length is one.  */
473   if (ref->u.ss.end
474       && gfc_dep_compare_expr (ref->u.ss.start, ref->u.ss.end) == 0)
475     tmp = build_int_cst (gfc_charlen_type_node, 1);
476   else
477     {
478       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_charlen_type_node,
479                              end.expr, start.expr);
480       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_charlen_type_node,
481                              build_int_cst (gfc_charlen_type_node, 1), tmp);
482       tmp = fold_build2_loc (input_location, MAX_EXPR, gfc_charlen_type_node,
483                              tmp, build_int_cst (gfc_charlen_type_node, 0));
484     }
485
486   se->string_length = tmp;
487 }
488
489
490 /* Convert a derived type component reference.  */
491
492 static void
493 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
494 {
495   gfc_component *c;
496   tree tmp;
497   tree decl;
498   tree field;
499
500   c = ref->u.c.component;
501
502   gcc_assert (c->backend_decl);
503
504   field = c->backend_decl;
505   gcc_assert (TREE_CODE (field) == FIELD_DECL);
506   decl = se->expr;
507
508   /* Components can correspond to fields of different containing
509      types, as components are created without context, whereas
510      a concrete use of a component has the type of decl as context.
511      So, if the type doesn't match, we search the corresponding
512      FIELD_DECL in the parent type.  To not waste too much time
513      we cache this result in norestrict_decl.  */
514
515   if (DECL_FIELD_CONTEXT (field) != TREE_TYPE (decl))
516     {
517       tree f2 = c->norestrict_decl;
518       if (!f2 || DECL_FIELD_CONTEXT (f2) != TREE_TYPE (decl))
519         for (f2 = TYPE_FIELDS (TREE_TYPE (decl)); f2; f2 = DECL_CHAIN (f2))
520           if (TREE_CODE (f2) == FIELD_DECL
521               && DECL_NAME (f2) == DECL_NAME (field))
522             break;
523       gcc_assert (f2);
524       c->norestrict_decl = f2;
525       field = f2;
526     }
527   tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
528                          decl, field, NULL_TREE);
529
530   se->expr = tmp;
531
532   if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer)
533     {
534       tmp = c->ts.u.cl->backend_decl;
535       /* Components must always be constant length.  */
536       gcc_assert (tmp && INTEGER_CST_P (tmp));
537       se->string_length = tmp;
538     }
539
540   if (((c->attr.pointer || c->attr.allocatable) && c->attr.dimension == 0
541        && c->ts.type != BT_CHARACTER)
542       || c->attr.proc_pointer)
543     se->expr = build_fold_indirect_ref_loc (input_location,
544                                         se->expr);
545 }
546
547
548 /* This function deals with component references to components of the
549    parent type for derived type extensons.  */
550 static void
551 conv_parent_component_references (gfc_se * se, gfc_ref * ref)
552 {
553   gfc_component *c;
554   gfc_component *cmp;
555   gfc_symbol *dt;
556   gfc_ref parent;
557
558   dt = ref->u.c.sym;
559   c = ref->u.c.component;
560
561   /* Return if the component is not in the parent type.  */
562   for (cmp = dt->components; cmp; cmp = cmp->next)
563     if (strcmp (c->name, cmp->name) == 0)
564       return;
565
566   /* Build a gfc_ref to recursively call gfc_conv_component_ref.  */
567   parent.type = REF_COMPONENT;
568   parent.next = NULL;
569   parent.u.c.sym = dt;
570   parent.u.c.component = dt->components;
571
572   if (dt->backend_decl == NULL)
573     gfc_get_derived_type (dt);
574
575   /* Build the reference and call self.  */
576   gfc_conv_component_ref (se, &parent);
577   parent.u.c.sym = dt->components->ts.u.derived;
578   parent.u.c.component = c;
579   conv_parent_component_references (se, &parent);
580 }
581
582 /* Return the contents of a variable. Also handles reference/pointer
583    variables (all Fortran pointer references are implicit).  */
584
585 static void
586 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
587 {
588   gfc_ref *ref;
589   gfc_symbol *sym;
590   tree parent_decl = NULL_TREE;
591   int parent_flag;
592   bool return_value;
593   bool alternate_entry;
594   bool entry_master;
595
596   sym = expr->symtree->n.sym;
597   if (se->ss != NULL)
598     {
599       /* Check that something hasn't gone horribly wrong.  */
600       gcc_assert (se->ss != gfc_ss_terminator);
601       gcc_assert (se->ss->expr == expr);
602
603       /* A scalarized term.  We already know the descriptor.  */
604       se->expr = se->ss->data.info.descriptor;
605       se->string_length = se->ss->string_length;
606       for (ref = se->ss->data.info.ref; ref; ref = ref->next)
607         if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
608           break;
609     }
610   else
611     {
612       tree se_expr = NULL_TREE;
613
614       se->expr = gfc_get_symbol_decl (sym);
615
616       /* Deal with references to a parent results or entries by storing
617          the current_function_decl and moving to the parent_decl.  */
618       return_value = sym->attr.function && sym->result == sym;
619       alternate_entry = sym->attr.function && sym->attr.entry
620                         && sym->result == sym;
621       entry_master = sym->attr.result
622                      && sym->ns->proc_name->attr.entry_master
623                      && !gfc_return_by_reference (sym->ns->proc_name);
624       if (current_function_decl)
625         parent_decl = DECL_CONTEXT (current_function_decl);
626
627       if ((se->expr == parent_decl && return_value)
628            || (sym->ns && sym->ns->proc_name
629                && parent_decl
630                && sym->ns->proc_name->backend_decl == parent_decl
631                && (alternate_entry || entry_master)))
632         parent_flag = 1;
633       else
634         parent_flag = 0;
635
636       /* Special case for assigning the return value of a function.
637          Self recursive functions must have an explicit return value.  */
638       if (return_value && (se->expr == current_function_decl || parent_flag))
639         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
640
641       /* Similarly for alternate entry points.  */
642       else if (alternate_entry 
643                && (sym->ns->proc_name->backend_decl == current_function_decl
644                    || parent_flag))
645         {
646           gfc_entry_list *el = NULL;
647
648           for (el = sym->ns->entries; el; el = el->next)
649             if (sym == el->sym)
650               {
651                 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
652                 break;
653               }
654         }
655
656       else if (entry_master
657                && (sym->ns->proc_name->backend_decl == current_function_decl
658                    || parent_flag))
659         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
660
661       if (se_expr)
662         se->expr = se_expr;
663
664       /* Procedure actual arguments.  */
665       else if (sym->attr.flavor == FL_PROCEDURE
666                && se->expr != current_function_decl)
667         {
668           if (!sym->attr.dummy && !sym->attr.proc_pointer)
669             {
670               gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
671               se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
672             }
673           return;
674         }
675
676
677       /* Dereference the expression, where needed. Since characters
678          are entirely different from other types, they are treated 
679          separately.  */
680       if (sym->ts.type == BT_CHARACTER)
681         {
682           /* Dereference character pointer dummy arguments
683              or results.  */
684           if ((sym->attr.pointer || sym->attr.allocatable)
685               && (sym->attr.dummy
686                   || sym->attr.function
687                   || sym->attr.result))
688             se->expr = build_fold_indirect_ref_loc (input_location,
689                                                 se->expr);
690
691         }
692       else if (!sym->attr.value)
693         {
694           /* Dereference non-character scalar dummy arguments.  */
695           if (sym->attr.dummy && !sym->attr.dimension)
696             se->expr = build_fold_indirect_ref_loc (input_location,
697                                                 se->expr);
698
699           /* Dereference scalar hidden result.  */
700           if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
701               && (sym->attr.function || sym->attr.result)
702               && !sym->attr.dimension && !sym->attr.pointer
703               && !sym->attr.always_explicit)
704             se->expr = build_fold_indirect_ref_loc (input_location,
705                                                 se->expr);
706
707           /* Dereference non-character pointer variables. 
708              These must be dummies, results, or scalars.  */
709           if ((sym->attr.pointer || sym->attr.allocatable
710                || gfc_is_associate_pointer (sym))
711               && (sym->attr.dummy
712                   || sym->attr.function
713                   || sym->attr.result
714                   || !sym->attr.dimension))
715             se->expr = build_fold_indirect_ref_loc (input_location,
716                                                 se->expr);
717         }
718
719       ref = expr->ref;
720     }
721
722   /* For character variables, also get the length.  */
723   if (sym->ts.type == BT_CHARACTER)
724     {
725       /* If the character length of an entry isn't set, get the length from
726          the master function instead.  */
727       if (sym->attr.entry && !sym->ts.u.cl->backend_decl)
728         se->string_length = sym->ns->proc_name->ts.u.cl->backend_decl;
729       else
730         se->string_length = sym->ts.u.cl->backend_decl;
731       gcc_assert (se->string_length);
732     }
733
734   while (ref)
735     {
736       switch (ref->type)
737         {
738         case REF_ARRAY:
739           /* Return the descriptor if that's what we want and this is an array
740              section reference.  */
741           if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
742             return;
743 /* TODO: Pointers to single elements of array sections, eg elemental subs.  */
744           /* Return the descriptor for array pointers and allocations.  */
745           if (se->want_pointer
746               && ref->next == NULL && (se->descriptor_only))
747             return;
748
749           gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
750           /* Return a pointer to an element.  */
751           break;
752
753         case REF_COMPONENT:
754           if (ref->u.c.sym->attr.extension)
755             conv_parent_component_references (se, ref);
756
757           gfc_conv_component_ref (se, ref);
758           break;
759
760         case REF_SUBSTRING:
761           gfc_conv_substring (se, ref, expr->ts.kind,
762                               expr->symtree->name, &expr->where);
763           break;
764
765         default:
766           gcc_unreachable ();
767           break;
768         }
769       ref = ref->next;
770     }
771   /* Pointer assignment, allocation or pass by reference.  Arrays are handled
772      separately.  */
773   if (se->want_pointer)
774     {
775       if (expr->ts.type == BT_CHARACTER && !gfc_is_proc_ptr_comp (expr, NULL))
776         gfc_conv_string_parameter (se);
777       else 
778         se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
779     }
780 }
781
782
783 /* Unary ops are easy... Or they would be if ! was a valid op.  */
784
785 static void
786 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
787 {
788   gfc_se operand;
789   tree type;
790
791   gcc_assert (expr->ts.type != BT_CHARACTER);
792   /* Initialize the operand.  */
793   gfc_init_se (&operand, se);
794   gfc_conv_expr_val (&operand, expr->value.op.op1);
795   gfc_add_block_to_block (&se->pre, &operand.pre);
796
797   type = gfc_typenode_for_spec (&expr->ts);
798
799   /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
800      We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
801      All other unary operators have an equivalent GIMPLE unary operator.  */
802   if (code == TRUTH_NOT_EXPR)
803     se->expr = fold_build2_loc (input_location, EQ_EXPR, type, operand.expr,
804                                 build_int_cst (type, 0));
805   else
806     se->expr = fold_build1_loc (input_location, code, type, operand.expr);
807
808 }
809
810 /* Expand power operator to optimal multiplications when a value is raised
811    to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
812    Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
813    Programming", 3rd Edition, 1998.  */
814
815 /* This code is mostly duplicated from expand_powi in the backend.
816    We establish the "optimal power tree" lookup table with the defined size.
817    The items in the table are the exponents used to calculate the index
818    exponents. Any integer n less than the value can get an "addition chain",
819    with the first node being one.  */
820 #define POWI_TABLE_SIZE 256
821
822 /* The table is from builtins.c.  */
823 static const unsigned char powi_table[POWI_TABLE_SIZE] =
824   {
825       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
826       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
827       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
828      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
829      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
830      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
831      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
832      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
833      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
834      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
835      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
836      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
837      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
838      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
839      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
840      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
841      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
842      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
843      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
844      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
845      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
846      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
847      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
848      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
849      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
850     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
851     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
852     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
853     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
854     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
855     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
856     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
857   };
858
859 /* If n is larger than lookup table's max index, we use the "window 
860    method".  */
861 #define POWI_WINDOW_SIZE 3
862
863 /* Recursive function to expand the power operator. The temporary 
864    values are put in tmpvar. The function returns tmpvar[1] ** n.  */
865 static tree
866 gfc_conv_powi (gfc_se * se, unsigned HOST_WIDE_INT n, tree * tmpvar)
867 {
868   tree op0;
869   tree op1;
870   tree tmp;
871   int digit;
872
873   if (n < POWI_TABLE_SIZE)
874     {
875       if (tmpvar[n])
876         return tmpvar[n];
877
878       op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
879       op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
880     }
881   else if (n & 1)
882     {
883       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
884       op0 = gfc_conv_powi (se, n - digit, tmpvar);
885       op1 = gfc_conv_powi (se, digit, tmpvar);
886     }
887   else
888     {
889       op0 = gfc_conv_powi (se, n >> 1, tmpvar);
890       op1 = op0;
891     }
892
893   tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (op0), op0, op1);
894   tmp = gfc_evaluate_now (tmp, &se->pre);
895
896   if (n < POWI_TABLE_SIZE)
897     tmpvar[n] = tmp;
898
899   return tmp;
900 }
901
902
903 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
904    return 1. Else return 0 and a call to runtime library functions
905    will have to be built.  */
906 static int
907 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
908 {
909   tree cond;
910   tree tmp;
911   tree type;
912   tree vartmp[POWI_TABLE_SIZE];
913   HOST_WIDE_INT m;
914   unsigned HOST_WIDE_INT n;
915   int sgn;
916
917   /* If exponent is too large, we won't expand it anyway, so don't bother
918      with large integer values.  */
919   if (!double_int_fits_in_shwi_p (TREE_INT_CST (rhs)))
920     return 0;
921
922   m = double_int_to_shwi (TREE_INT_CST (rhs));
923   /* There's no ABS for HOST_WIDE_INT, so here we go. It also takes care
924      of the asymmetric range of the integer type.  */
925   n = (unsigned HOST_WIDE_INT) (m < 0 ? -m : m);
926   
927   type = TREE_TYPE (lhs);
928   sgn = tree_int_cst_sgn (rhs);
929
930   if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
931        || optimize_size) && (m > 2 || m < -1))
932     return 0;
933
934   /* rhs == 0  */
935   if (sgn == 0)
936     {
937       se->expr = gfc_build_const (type, integer_one_node);
938       return 1;
939     }
940
941   /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1.  */
942   if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
943     {
944       tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
945                              lhs, build_int_cst (TREE_TYPE (lhs), -1));
946       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
947                               lhs, build_int_cst (TREE_TYPE (lhs), 1));
948
949       /* If rhs is even,
950          result = (lhs == 1 || lhs == -1) ? 1 : 0.  */
951       if ((n & 1) == 0)
952         {
953           tmp = fold_build2_loc (input_location, TRUTH_OR_EXPR,
954                                  boolean_type_node, tmp, cond);
955           se->expr = fold_build3_loc (input_location, COND_EXPR, type,
956                                       tmp, build_int_cst (type, 1),
957                                       build_int_cst (type, 0));
958           return 1;
959         }
960       /* If rhs is odd,
961          result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0.  */
962       tmp = fold_build3_loc (input_location, COND_EXPR, type, tmp,
963                              build_int_cst (type, -1),
964                              build_int_cst (type, 0));
965       se->expr = fold_build3_loc (input_location, COND_EXPR, type,
966                                   cond, build_int_cst (type, 1), tmp);
967       return 1;
968     }
969
970   memset (vartmp, 0, sizeof (vartmp));
971   vartmp[1] = lhs;
972   if (sgn == -1)
973     {
974       tmp = gfc_build_const (type, integer_one_node);
975       vartmp[1] = fold_build2_loc (input_location, RDIV_EXPR, type, tmp,
976                                    vartmp[1]);
977     }
978
979   se->expr = gfc_conv_powi (se, n, vartmp);
980
981   return 1;
982 }
983
984
985 /* Power op (**).  Constant integer exponent has special handling.  */
986
987 static void
988 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
989 {
990   tree gfc_int4_type_node;
991   int kind;
992   int ikind;
993   int res_ikind_1, res_ikind_2;
994   gfc_se lse;
995   gfc_se rse;
996   tree fndecl = NULL;
997
998   gfc_init_se (&lse, se);
999   gfc_conv_expr_val (&lse, expr->value.op.op1);
1000   lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
1001   gfc_add_block_to_block (&se->pre, &lse.pre);
1002
1003   gfc_init_se (&rse, se);
1004   gfc_conv_expr_val (&rse, expr->value.op.op2);
1005   gfc_add_block_to_block (&se->pre, &rse.pre);
1006
1007   if (expr->value.op.op2->ts.type == BT_INTEGER
1008       && expr->value.op.op2->expr_type == EXPR_CONSTANT)
1009     if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
1010       return;
1011
1012   gfc_int4_type_node = gfc_get_int_type (4);
1013
1014   /* In case of integer operands with kinds 1 or 2, we call the integer kind 4
1015      library routine.  But in the end, we have to convert the result back
1016      if this case applies -- with res_ikind_K, we keep track whether operand K
1017      falls into this case.  */
1018   res_ikind_1 = -1;
1019   res_ikind_2 = -1;
1020
1021   kind = expr->value.op.op1->ts.kind;
1022   switch (expr->value.op.op2->ts.type)
1023     {
1024     case BT_INTEGER:
1025       ikind = expr->value.op.op2->ts.kind;
1026       switch (ikind)
1027         {
1028         case 1:
1029         case 2:
1030           rse.expr = convert (gfc_int4_type_node, rse.expr);
1031           res_ikind_2 = ikind;
1032           /* Fall through.  */
1033
1034         case 4:
1035           ikind = 0;
1036           break;
1037           
1038         case 8:
1039           ikind = 1;
1040           break;
1041
1042         case 16:
1043           ikind = 2;
1044           break;
1045
1046         default:
1047           gcc_unreachable ();
1048         }
1049       switch (kind)
1050         {
1051         case 1:
1052         case 2:
1053           if (expr->value.op.op1->ts.type == BT_INTEGER)
1054             {
1055               lse.expr = convert (gfc_int4_type_node, lse.expr);
1056               res_ikind_1 = kind;
1057             }
1058           else
1059             gcc_unreachable ();
1060           /* Fall through.  */
1061
1062         case 4:
1063           kind = 0;
1064           break;
1065           
1066         case 8:
1067           kind = 1;
1068           break;
1069
1070         case 10:
1071           kind = 2;
1072           break;
1073
1074         case 16:
1075           kind = 3;
1076           break;
1077
1078         default:
1079           gcc_unreachable ();
1080         }
1081       
1082       switch (expr->value.op.op1->ts.type)
1083         {
1084         case BT_INTEGER:
1085           if (kind == 3) /* Case 16 was not handled properly above.  */
1086             kind = 2;
1087           fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
1088           break;
1089
1090         case BT_REAL:
1091           /* Use builtins for real ** int4.  */
1092           if (ikind == 0)
1093             {
1094               switch (kind)
1095                 {
1096                 case 0:
1097                   fndecl = built_in_decls[BUILT_IN_POWIF];
1098                   break;
1099                 
1100                 case 1:
1101                   fndecl = built_in_decls[BUILT_IN_POWI];
1102                   break;
1103
1104                 case 2:
1105                   fndecl = built_in_decls[BUILT_IN_POWIL];
1106                   break;
1107
1108                 case 3:
1109                   /* Use the __builtin_powil() only if real(kind=16) is 
1110                      actually the C long double type.  */
1111                   if (!gfc_real16_is_float128)
1112                     fndecl = built_in_decls[BUILT_IN_POWIL];
1113                   break;
1114
1115                 default:
1116                   gcc_unreachable ();
1117                 }
1118             }
1119
1120           /* If we don't have a good builtin for this, go for the 
1121              library function.  */
1122           if (!fndecl)
1123             fndecl = gfor_fndecl_math_powi[kind][ikind].real;
1124           break;
1125
1126         case BT_COMPLEX:
1127           fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
1128           break;
1129
1130         default:
1131           gcc_unreachable ();
1132         }
1133       break;
1134
1135     case BT_REAL:
1136       fndecl = gfc_builtin_decl_for_float_kind (BUILT_IN_POW, kind);
1137       break;
1138
1139     case BT_COMPLEX:
1140       fndecl = gfc_builtin_decl_for_float_kind (BUILT_IN_CPOW, kind);
1141       break;
1142
1143     default:
1144       gcc_unreachable ();
1145       break;
1146     }
1147
1148   se->expr = build_call_expr_loc (input_location,
1149                               fndecl, 2, lse.expr, rse.expr);
1150
1151   /* Convert the result back if it is of wrong integer kind.  */
1152   if (res_ikind_1 != -1 && res_ikind_2 != -1)
1153     {
1154       /* We want the maximum of both operand kinds as result.  */
1155       if (res_ikind_1 < res_ikind_2)
1156         res_ikind_1 = res_ikind_2;
1157       se->expr = convert (gfc_get_int_type (res_ikind_1), se->expr);
1158     }
1159 }
1160
1161
1162 /* Generate code to allocate a string temporary.  */
1163
1164 tree
1165 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
1166 {
1167   tree var;
1168   tree tmp;
1169
1170   if (gfc_can_put_var_on_stack (len))
1171     {
1172       /* Create a temporary variable to hold the result.  */
1173       tmp = fold_build2_loc (input_location, MINUS_EXPR,
1174                              gfc_charlen_type_node, len,
1175                              build_int_cst (gfc_charlen_type_node, 1));
1176       tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
1177
1178       if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
1179         tmp = build_array_type (TREE_TYPE (TREE_TYPE (type)), tmp);
1180       else
1181         tmp = build_array_type (TREE_TYPE (type), tmp);
1182
1183       var = gfc_create_var (tmp, "str");
1184       var = gfc_build_addr_expr (type, var);
1185     }
1186   else
1187     {
1188       /* Allocate a temporary to hold the result.  */
1189       var = gfc_create_var (type, "pstr");
1190       tmp = gfc_call_malloc (&se->pre, type,
1191                              fold_build2_loc (input_location, MULT_EXPR,
1192                                               TREE_TYPE (len), len,
1193                                               fold_convert (TREE_TYPE (len),
1194                                                             TYPE_SIZE (type))));
1195       gfc_add_modify (&se->pre, var, tmp);
1196
1197       /* Free the temporary afterwards.  */
1198       tmp = gfc_call_free (convert (pvoid_type_node, var));
1199       gfc_add_expr_to_block (&se->post, tmp);
1200     }
1201
1202   return var;
1203 }
1204
1205
1206 /* Handle a string concatenation operation.  A temporary will be allocated to
1207    hold the result.  */
1208
1209 static void
1210 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
1211 {
1212   gfc_se lse, rse;
1213   tree len, type, var, tmp, fndecl;
1214
1215   gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
1216               && expr->value.op.op2->ts.type == BT_CHARACTER);
1217   gcc_assert (expr->value.op.op1->ts.kind == expr->value.op.op2->ts.kind);
1218
1219   gfc_init_se (&lse, se);
1220   gfc_conv_expr (&lse, expr->value.op.op1);
1221   gfc_conv_string_parameter (&lse);
1222   gfc_init_se (&rse, se);
1223   gfc_conv_expr (&rse, expr->value.op.op2);
1224   gfc_conv_string_parameter (&rse);
1225
1226   gfc_add_block_to_block (&se->pre, &lse.pre);
1227   gfc_add_block_to_block (&se->pre, &rse.pre);
1228
1229   type = gfc_get_character_type (expr->ts.kind, expr->ts.u.cl);
1230   len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1231   if (len == NULL_TREE)
1232     {
1233       len = fold_build2_loc (input_location, PLUS_EXPR,
1234                              TREE_TYPE (lse.string_length),
1235                              lse.string_length, rse.string_length);
1236     }
1237
1238   type = build_pointer_type (type);
1239
1240   var = gfc_conv_string_tmp (se, type, len);
1241
1242   /* Do the actual concatenation.  */
1243   if (expr->ts.kind == 1)
1244     fndecl = gfor_fndecl_concat_string;
1245   else if (expr->ts.kind == 4)
1246     fndecl = gfor_fndecl_concat_string_char4;
1247   else
1248     gcc_unreachable ();
1249
1250   tmp = build_call_expr_loc (input_location,
1251                          fndecl, 6, len, var, lse.string_length, lse.expr,
1252                          rse.string_length, rse.expr);
1253   gfc_add_expr_to_block (&se->pre, tmp);
1254
1255   /* Add the cleanup for the operands.  */
1256   gfc_add_block_to_block (&se->pre, &rse.post);
1257   gfc_add_block_to_block (&se->pre, &lse.post);
1258
1259   se->expr = var;
1260   se->string_length = len;
1261 }
1262
1263 /* Translates an op expression. Common (binary) cases are handled by this
1264    function, others are passed on. Recursion is used in either case.
1265    We use the fact that (op1.ts == op2.ts) (except for the power
1266    operator **).
1267    Operators need no special handling for scalarized expressions as long as
1268    they call gfc_conv_simple_val to get their operands.
1269    Character strings get special handling.  */
1270
1271 static void
1272 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
1273 {
1274   enum tree_code code;
1275   gfc_se lse;
1276   gfc_se rse;
1277   tree tmp, type;
1278   int lop;
1279   int checkstring;
1280
1281   checkstring = 0;
1282   lop = 0;
1283   switch (expr->value.op.op)
1284     {
1285     case INTRINSIC_PARENTHESES:
1286       if ((expr->ts.type == BT_REAL
1287            || expr->ts.type == BT_COMPLEX)
1288           && gfc_option.flag_protect_parens)
1289         {
1290           gfc_conv_unary_op (PAREN_EXPR, se, expr);
1291           gcc_assert (FLOAT_TYPE_P (TREE_TYPE (se->expr)));
1292           return;
1293         }
1294
1295       /* Fallthrough.  */
1296     case INTRINSIC_UPLUS:
1297       gfc_conv_expr (se, expr->value.op.op1);
1298       return;
1299
1300     case INTRINSIC_UMINUS:
1301       gfc_conv_unary_op (NEGATE_EXPR, se, expr);
1302       return;
1303
1304     case INTRINSIC_NOT:
1305       gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
1306       return;
1307
1308     case INTRINSIC_PLUS:
1309       code = PLUS_EXPR;
1310       break;
1311
1312     case INTRINSIC_MINUS:
1313       code = MINUS_EXPR;
1314       break;
1315
1316     case INTRINSIC_TIMES:
1317       code = MULT_EXPR;
1318       break;
1319
1320     case INTRINSIC_DIVIDE:
1321       /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1322          an integer, we must round towards zero, so we use a
1323          TRUNC_DIV_EXPR.  */
1324       if (expr->ts.type == BT_INTEGER)
1325         code = TRUNC_DIV_EXPR;
1326       else
1327         code = RDIV_EXPR;
1328       break;
1329
1330     case INTRINSIC_POWER:
1331       gfc_conv_power_op (se, expr);
1332       return;
1333
1334     case INTRINSIC_CONCAT:
1335       gfc_conv_concat_op (se, expr);
1336       return;
1337
1338     case INTRINSIC_AND:
1339       code = TRUTH_ANDIF_EXPR;
1340       lop = 1;
1341       break;
1342
1343     case INTRINSIC_OR:
1344       code = TRUTH_ORIF_EXPR;
1345       lop = 1;
1346       break;
1347
1348       /* EQV and NEQV only work on logicals, but since we represent them
1349          as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE.  */
1350     case INTRINSIC_EQ:
1351     case INTRINSIC_EQ_OS:
1352     case INTRINSIC_EQV:
1353       code = EQ_EXPR;
1354       checkstring = 1;
1355       lop = 1;
1356       break;
1357
1358     case INTRINSIC_NE:
1359     case INTRINSIC_NE_OS:
1360     case INTRINSIC_NEQV:
1361       code = NE_EXPR;
1362       checkstring = 1;
1363       lop = 1;
1364       break;
1365
1366     case INTRINSIC_GT:
1367     case INTRINSIC_GT_OS:
1368       code = GT_EXPR;
1369       checkstring = 1;
1370       lop = 1;
1371       break;
1372
1373     case INTRINSIC_GE:
1374     case INTRINSIC_GE_OS:
1375       code = GE_EXPR;
1376       checkstring = 1;
1377       lop = 1;
1378       break;
1379
1380     case INTRINSIC_LT:
1381     case INTRINSIC_LT_OS:
1382       code = LT_EXPR;
1383       checkstring = 1;
1384       lop = 1;
1385       break;
1386
1387     case INTRINSIC_LE:
1388     case INTRINSIC_LE_OS:
1389       code = LE_EXPR;
1390       checkstring = 1;
1391       lop = 1;
1392       break;
1393
1394     case INTRINSIC_USER:
1395     case INTRINSIC_ASSIGN:
1396       /* These should be converted into function calls by the frontend.  */
1397       gcc_unreachable ();
1398
1399     default:
1400       fatal_error ("Unknown intrinsic op");
1401       return;
1402     }
1403
1404   /* The only exception to this is **, which is handled separately anyway.  */
1405   gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1406
1407   if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1408     checkstring = 0;
1409
1410   /* lhs */
1411   gfc_init_se (&lse, se);
1412   gfc_conv_expr (&lse, expr->value.op.op1);
1413   gfc_add_block_to_block (&se->pre, &lse.pre);
1414
1415   /* rhs */
1416   gfc_init_se (&rse, se);
1417   gfc_conv_expr (&rse, expr->value.op.op2);
1418   gfc_add_block_to_block (&se->pre, &rse.pre);
1419
1420   if (checkstring)
1421     {
1422       gfc_conv_string_parameter (&lse);
1423       gfc_conv_string_parameter (&rse);
1424
1425       lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1426                                            rse.string_length, rse.expr,
1427                                            expr->value.op.op1->ts.kind,
1428                                            code);
1429       rse.expr = build_int_cst (TREE_TYPE (lse.expr), 0);
1430       gfc_add_block_to_block (&lse.post, &rse.post);
1431     }
1432
1433   type = gfc_typenode_for_spec (&expr->ts);
1434
1435   if (lop)
1436     {
1437       /* The result of logical ops is always boolean_type_node.  */
1438       tmp = fold_build2_loc (input_location, code, boolean_type_node,
1439                              lse.expr, rse.expr);
1440       se->expr = convert (type, tmp);
1441     }
1442   else
1443     se->expr = fold_build2_loc (input_location, code, type, lse.expr, rse.expr);
1444
1445   /* Add the post blocks.  */
1446   gfc_add_block_to_block (&se->post, &rse.post);
1447   gfc_add_block_to_block (&se->post, &lse.post);
1448 }
1449
1450 /* If a string's length is one, we convert it to a single character.  */
1451
1452 tree
1453 gfc_string_to_single_character (tree len, tree str, int kind)
1454 {
1455
1456   if (!INTEGER_CST_P (len) || TREE_INT_CST_HIGH (len) != 0
1457       || !POINTER_TYPE_P (TREE_TYPE (str)))
1458     return NULL_TREE;
1459
1460   if (TREE_INT_CST_LOW (len) == 1)
1461     {
1462       str = fold_convert (gfc_get_pchar_type (kind), str);
1463       return build_fold_indirect_ref_loc (input_location, str);
1464     }
1465
1466   if (kind == 1
1467       && TREE_CODE (str) == ADDR_EXPR
1468       && TREE_CODE (TREE_OPERAND (str, 0)) == ARRAY_REF
1469       && TREE_CODE (TREE_OPERAND (TREE_OPERAND (str, 0), 0)) == STRING_CST
1470       && array_ref_low_bound (TREE_OPERAND (str, 0))
1471          == TREE_OPERAND (TREE_OPERAND (str, 0), 1)
1472       && TREE_INT_CST_LOW (len) > 1
1473       && TREE_INT_CST_LOW (len)
1474          == (unsigned HOST_WIDE_INT)
1475             TREE_STRING_LENGTH (TREE_OPERAND (TREE_OPERAND (str, 0), 0)))
1476     {
1477       tree ret = fold_convert (gfc_get_pchar_type (kind), str);
1478       ret = build_fold_indirect_ref_loc (input_location, ret);
1479       if (TREE_CODE (ret) == INTEGER_CST)
1480         {
1481           tree string_cst = TREE_OPERAND (TREE_OPERAND (str, 0), 0);
1482           int i, length = TREE_STRING_LENGTH (string_cst);
1483           const char *ptr = TREE_STRING_POINTER (string_cst);
1484
1485           for (i = 1; i < length; i++)
1486             if (ptr[i] != ' ')
1487               return NULL_TREE;
1488
1489           return ret;
1490         }
1491     }
1492
1493   return NULL_TREE;
1494 }
1495
1496
1497 void
1498 gfc_conv_scalar_char_value (gfc_symbol *sym, gfc_se *se, gfc_expr **expr)
1499 {
1500
1501   if (sym->backend_decl)
1502     {
1503       /* This becomes the nominal_type in
1504          function.c:assign_parm_find_data_types.  */
1505       TREE_TYPE (sym->backend_decl) = unsigned_char_type_node;
1506       /* This becomes the passed_type in
1507          function.c:assign_parm_find_data_types.  C promotes char to
1508          integer for argument passing.  */
1509       DECL_ARG_TYPE (sym->backend_decl) = unsigned_type_node;
1510
1511       DECL_BY_REFERENCE (sym->backend_decl) = 0;
1512     }
1513
1514   if (expr != NULL)
1515     {
1516       /* If we have a constant character expression, make it into an
1517          integer.  */
1518       if ((*expr)->expr_type == EXPR_CONSTANT)
1519         {
1520           gfc_typespec ts;
1521           gfc_clear_ts (&ts);
1522
1523           *expr = gfc_get_int_expr (gfc_default_integer_kind, NULL,
1524                                     (int)(*expr)->value.character.string[0]);
1525           if ((*expr)->ts.kind != gfc_c_int_kind)
1526             {
1527               /* The expr needs to be compatible with a C int.  If the 
1528                  conversion fails, then the 2 causes an ICE.  */
1529               ts.type = BT_INTEGER;
1530               ts.kind = gfc_c_int_kind;
1531               gfc_convert_type (*expr, &ts, 2);
1532             }
1533         }
1534       else if (se != NULL && (*expr)->expr_type == EXPR_VARIABLE)
1535         {
1536           if ((*expr)->ref == NULL)
1537             {
1538               se->expr = gfc_string_to_single_character
1539                 (build_int_cst (integer_type_node, 1),
1540                  gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
1541                                       gfc_get_symbol_decl
1542                                       ((*expr)->symtree->n.sym)),
1543                  (*expr)->ts.kind);
1544             }
1545           else
1546             {
1547               gfc_conv_variable (se, *expr);
1548               se->expr = gfc_string_to_single_character
1549                 (build_int_cst (integer_type_node, 1),
1550                  gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
1551                                       se->expr),
1552                  (*expr)->ts.kind);
1553             }
1554         }
1555     }
1556 }
1557
1558 /* Helper function for gfc_build_compare_string.  Return LEN_TRIM value
1559    if STR is a string literal, otherwise return -1.  */
1560
1561 static int
1562 gfc_optimize_len_trim (tree len, tree str, int kind)
1563 {
1564   if (kind == 1
1565       && TREE_CODE (str) == ADDR_EXPR
1566       && TREE_CODE (TREE_OPERAND (str, 0)) == ARRAY_REF
1567       && TREE_CODE (TREE_OPERAND (TREE_OPERAND (str, 0), 0)) == STRING_CST
1568       && array_ref_low_bound (TREE_OPERAND (str, 0))
1569          == TREE_OPERAND (TREE_OPERAND (str, 0), 1)
1570       && TREE_INT_CST_LOW (len) >= 1
1571       && TREE_INT_CST_LOW (len)
1572          == (unsigned HOST_WIDE_INT)
1573             TREE_STRING_LENGTH (TREE_OPERAND (TREE_OPERAND (str, 0), 0)))
1574     {
1575       tree folded = fold_convert (gfc_get_pchar_type (kind), str);
1576       folded = build_fold_indirect_ref_loc (input_location, folded);
1577       if (TREE_CODE (folded) == INTEGER_CST)
1578         {
1579           tree string_cst = TREE_OPERAND (TREE_OPERAND (str, 0), 0);
1580           int length = TREE_STRING_LENGTH (string_cst);
1581           const char *ptr = TREE_STRING_POINTER (string_cst);
1582
1583           for (; length > 0; length--)
1584             if (ptr[length - 1] != ' ')
1585               break;
1586
1587           return length;
1588         }
1589     }
1590   return -1;
1591 }
1592
1593 /* Compare two strings. If they are all single characters, the result is the
1594    subtraction of them. Otherwise, we build a library call.  */
1595
1596 tree
1597 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2, int kind,
1598                           enum tree_code code)
1599 {
1600   tree sc1;
1601   tree sc2;
1602   tree fndecl;
1603
1604   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1605   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1606
1607   sc1 = gfc_string_to_single_character (len1, str1, kind);
1608   sc2 = gfc_string_to_single_character (len2, str2, kind);
1609
1610   if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1611     {
1612       /* Deal with single character specially.  */
1613       sc1 = fold_convert (integer_type_node, sc1);
1614       sc2 = fold_convert (integer_type_node, sc2);
1615       return fold_build2_loc (input_location, MINUS_EXPR, integer_type_node,
1616                               sc1, sc2);
1617     }
1618
1619   if ((code == EQ_EXPR || code == NE_EXPR)
1620       && optimize
1621       && INTEGER_CST_P (len1) && INTEGER_CST_P (len2))
1622     {
1623       /* If one string is a string literal with LEN_TRIM longer
1624          than the length of the second string, the strings
1625          compare unequal.  */
1626       int len = gfc_optimize_len_trim (len1, str1, kind);
1627       if (len > 0 && compare_tree_int (len2, len) < 0)
1628         return integer_one_node;
1629       len = gfc_optimize_len_trim (len2, str2, kind);
1630       if (len > 0 && compare_tree_int (len1, len) < 0)
1631         return integer_one_node;
1632     }
1633
1634   /* Build a call for the comparison.  */
1635   if (kind == 1)
1636     fndecl = gfor_fndecl_compare_string;
1637   else if (kind == 4)
1638     fndecl = gfor_fndecl_compare_string_char4;
1639   else
1640     gcc_unreachable ();
1641
1642   return build_call_expr_loc (input_location, fndecl, 4,
1643                               len1, str1, len2, str2);
1644 }
1645
1646
1647 /* Return the backend_decl for a procedure pointer component.  */
1648
1649 static tree
1650 get_proc_ptr_comp (gfc_expr *e)
1651 {
1652   gfc_se comp_se;
1653   gfc_expr *e2;
1654   expr_t old_type;
1655
1656   gfc_init_se (&comp_se, NULL);
1657   e2 = gfc_copy_expr (e);
1658   /* We have to restore the expr type later so that gfc_free_expr frees
1659      the exact same thing that was allocated.
1660      TODO: This is ugly.  */
1661   old_type = e2->expr_type;
1662   e2->expr_type = EXPR_VARIABLE;
1663   gfc_conv_expr (&comp_se, e2);
1664   e2->expr_type = old_type;
1665   gfc_free_expr (e2);
1666   return build_fold_addr_expr_loc (input_location, comp_se.expr);
1667 }
1668
1669
1670 static void
1671 conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr)
1672 {
1673   tree tmp;
1674
1675   if (gfc_is_proc_ptr_comp (expr, NULL))
1676     tmp = get_proc_ptr_comp (expr);
1677   else if (sym->attr.dummy)
1678     {
1679       tmp = gfc_get_symbol_decl (sym);
1680       if (sym->attr.proc_pointer)
1681         tmp = build_fold_indirect_ref_loc (input_location,
1682                                        tmp);
1683       gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1684               && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1685     }
1686   else
1687     {
1688       if (!sym->backend_decl)
1689         sym->backend_decl = gfc_get_extern_function_decl (sym);
1690
1691       tmp = sym->backend_decl;
1692
1693       if (sym->attr.cray_pointee)
1694         {
1695           /* TODO - make the cray pointee a pointer to a procedure,
1696              assign the pointer to it and use it for the call.  This
1697              will do for now!  */
1698           tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1699                          gfc_get_symbol_decl (sym->cp_pointer));
1700           tmp = gfc_evaluate_now (tmp, &se->pre);
1701         }
1702
1703       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1704         {
1705           gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1706           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
1707         }
1708     }
1709   se->expr = tmp;
1710 }
1711
1712
1713 /* Initialize MAPPING.  */
1714
1715 void
1716 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1717 {
1718   mapping->syms = NULL;
1719   mapping->charlens = NULL;
1720 }
1721
1722
1723 /* Free all memory held by MAPPING (but not MAPPING itself).  */
1724
1725 void
1726 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1727 {
1728   gfc_interface_sym_mapping *sym;
1729   gfc_interface_sym_mapping *nextsym;
1730   gfc_charlen *cl;
1731   gfc_charlen *nextcl;
1732
1733   for (sym = mapping->syms; sym; sym = nextsym)
1734     {
1735       nextsym = sym->next;
1736       sym->new_sym->n.sym->formal = NULL;
1737       gfc_free_symbol (sym->new_sym->n.sym);
1738       gfc_free_expr (sym->expr);
1739       free (sym->new_sym);
1740       free (sym);
1741     }
1742   for (cl = mapping->charlens; cl; cl = nextcl)
1743     {
1744       nextcl = cl->next;
1745       gfc_free_expr (cl->length);
1746       free (cl);
1747     }
1748 }
1749
1750
1751 /* Return a copy of gfc_charlen CL.  Add the returned structure to
1752    MAPPING so that it will be freed by gfc_free_interface_mapping.  */
1753
1754 static gfc_charlen *
1755 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1756                                    gfc_charlen * cl)
1757 {
1758   gfc_charlen *new_charlen;
1759
1760   new_charlen = gfc_get_charlen ();
1761   new_charlen->next = mapping->charlens;
1762   new_charlen->length = gfc_copy_expr (cl->length);
1763
1764   mapping->charlens = new_charlen;
1765   return new_charlen;
1766 }
1767
1768
1769 /* A subroutine of gfc_add_interface_mapping.  Return a descriptorless
1770    array variable that can be used as the actual argument for dummy
1771    argument SYM.  Add any initialization code to BLOCK.  PACKED is as
1772    for gfc_get_nodesc_array_type and DATA points to the first element
1773    in the passed array.  */
1774
1775 static tree
1776 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1777                                  gfc_packed packed, tree data)
1778 {
1779   tree type;
1780   tree var;
1781
1782   type = gfc_typenode_for_spec (&sym->ts);
1783   type = gfc_get_nodesc_array_type (type, sym->as, packed,
1784                                     !sym->attr.target && !sym->attr.pointer
1785                                     && !sym->attr.proc_pointer);
1786
1787   var = gfc_create_var (type, "ifm");
1788   gfc_add_modify (block, var, fold_convert (type, data));
1789
1790   return var;
1791 }
1792
1793
1794 /* A subroutine of gfc_add_interface_mapping.  Set the stride, upper bounds
1795    and offset of descriptorless array type TYPE given that it has the same
1796    size as DESC.  Add any set-up code to BLOCK.  */
1797
1798 static void
1799 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1800 {
1801   int n;
1802   tree dim;
1803   tree offset;
1804   tree tmp;
1805
1806   offset = gfc_index_zero_node;
1807   for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1808     {
1809       dim = gfc_rank_cst[n];
1810       GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1811       if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
1812         {
1813           GFC_TYPE_ARRAY_LBOUND (type, n)
1814                 = gfc_conv_descriptor_lbound_get (desc, dim);
1815           GFC_TYPE_ARRAY_UBOUND (type, n)
1816                 = gfc_conv_descriptor_ubound_get (desc, dim);
1817         }
1818       else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1819         {
1820           tmp = fold_build2_loc (input_location, MINUS_EXPR,
1821                                  gfc_array_index_type,
1822                                  gfc_conv_descriptor_ubound_get (desc, dim),
1823                                  gfc_conv_descriptor_lbound_get (desc, dim));
1824           tmp = fold_build2_loc (input_location, PLUS_EXPR,
1825                                  gfc_array_index_type,
1826                                  GFC_TYPE_ARRAY_LBOUND (type, n), tmp);
1827           tmp = gfc_evaluate_now (tmp, block);
1828           GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1829         }
1830       tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
1831                              GFC_TYPE_ARRAY_LBOUND (type, n),
1832                              GFC_TYPE_ARRAY_STRIDE (type, n));
1833       offset = fold_build2_loc (input_location, MINUS_EXPR,
1834                                 gfc_array_index_type, offset, tmp);
1835     }
1836   offset = gfc_evaluate_now (offset, block);
1837   GFC_TYPE_ARRAY_OFFSET (type) = offset;
1838 }
1839
1840
1841 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1842    in SE.  The caller may still use se->expr and se->string_length after
1843    calling this function.  */
1844
1845 void
1846 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1847                            gfc_symbol * sym, gfc_se * se,
1848                            gfc_expr *expr)
1849 {
1850   gfc_interface_sym_mapping *sm;
1851   tree desc;
1852   tree tmp;
1853   tree value;
1854   gfc_symbol *new_sym;
1855   gfc_symtree *root;
1856   gfc_symtree *new_symtree;
1857
1858   /* Create a new symbol to represent the actual argument.  */
1859   new_sym = gfc_new_symbol (sym->name, NULL);
1860   new_sym->ts = sym->ts;
1861   new_sym->as = gfc_copy_array_spec (sym->as);
1862   new_sym->attr.referenced = 1;
1863   new_sym->attr.dimension = sym->attr.dimension;
1864   new_sym->attr.contiguous = sym->attr.contiguous;
1865   new_sym->attr.codimension = sym->attr.codimension;
1866   new_sym->attr.pointer = sym->attr.pointer;
1867   new_sym->attr.allocatable = sym->attr.allocatable;
1868   new_sym->attr.flavor = sym->attr.flavor;
1869   new_sym->attr.function = sym->attr.function;
1870
1871   /* Ensure that the interface is available and that
1872      descriptors are passed for array actual arguments.  */
1873   if (sym->attr.flavor == FL_PROCEDURE)
1874     {
1875       new_sym->formal = expr->symtree->n.sym->formal;
1876       new_sym->attr.always_explicit
1877             = expr->symtree->n.sym->attr.always_explicit;
1878     }
1879
1880   /* Create a fake symtree for it.  */
1881   root = NULL;
1882   new_symtree = gfc_new_symtree (&root, sym->name);
1883   new_symtree->n.sym = new_sym;
1884   gcc_assert (new_symtree == root);
1885
1886   /* Create a dummy->actual mapping.  */
1887   sm = XCNEW (gfc_interface_sym_mapping);
1888   sm->next = mapping->syms;
1889   sm->old = sym;
1890   sm->new_sym = new_symtree;
1891   sm->expr = gfc_copy_expr (expr);
1892   mapping->syms = sm;
1893
1894   /* Stabilize the argument's value.  */
1895   if (!sym->attr.function && se)
1896     se->expr = gfc_evaluate_now (se->expr, &se->pre);
1897
1898   if (sym->ts.type == BT_CHARACTER)
1899     {
1900       /* Create a copy of the dummy argument's length.  */
1901       new_sym->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.u.cl);
1902       sm->expr->ts.u.cl = new_sym->ts.u.cl;
1903
1904       /* If the length is specified as "*", record the length that
1905          the caller is passing.  We should use the callee's length
1906          in all other cases.  */
1907       if (!new_sym->ts.u.cl->length && se)
1908         {
1909           se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1910           new_sym->ts.u.cl->backend_decl = se->string_length;
1911         }
1912     }
1913
1914   if (!se)
1915     return;
1916
1917   /* Use the passed value as-is if the argument is a function.  */
1918   if (sym->attr.flavor == FL_PROCEDURE)
1919     value = se->expr;
1920
1921   /* If the argument is either a string or a pointer to a string,
1922      convert it to a boundless character type.  */
1923   else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1924     {
1925       tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1926       tmp = build_pointer_type (tmp);
1927       if (sym->attr.pointer)
1928         value = build_fold_indirect_ref_loc (input_location,
1929                                          se->expr);
1930       else
1931         value = se->expr;
1932       value = fold_convert (tmp, value);
1933     }
1934
1935   /* If the argument is a scalar, a pointer to an array or an allocatable,
1936      dereference it.  */
1937   else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1938     value = build_fold_indirect_ref_loc (input_location,
1939                                      se->expr);
1940   
1941   /* For character(*), use the actual argument's descriptor.  */  
1942   else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.u.cl->length)
1943     value = build_fold_indirect_ref_loc (input_location,
1944                                      se->expr);
1945
1946   /* If the argument is an array descriptor, use it to determine
1947      information about the actual argument's shape.  */
1948   else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1949            && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1950     {
1951       /* Get the actual argument's descriptor.  */
1952       desc = build_fold_indirect_ref_loc (input_location,
1953                                       se->expr);
1954
1955       /* Create the replacement variable.  */
1956       tmp = gfc_conv_descriptor_data_get (desc);
1957       value = gfc_get_interface_mapping_array (&se->pre, sym,
1958                                                PACKED_NO, tmp);
1959
1960       /* Use DESC to work out the upper bounds, strides and offset.  */
1961       gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1962     }
1963   else
1964     /* Otherwise we have a packed array.  */
1965     value = gfc_get_interface_mapping_array (&se->pre, sym,
1966                                              PACKED_FULL, se->expr);
1967
1968   new_sym->backend_decl = value;
1969 }
1970
1971
1972 /* Called once all dummy argument mappings have been added to MAPPING,
1973    but before the mapping is used to evaluate expressions.  Pre-evaluate
1974    the length of each argument, adding any initialization code to PRE and
1975    any finalization code to POST.  */
1976
1977 void
1978 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1979                               stmtblock_t * pre, stmtblock_t * post)
1980 {
1981   gfc_interface_sym_mapping *sym;
1982   gfc_expr *expr;
1983   gfc_se se;
1984
1985   for (sym = mapping->syms; sym; sym = sym->next)
1986     if (sym->new_sym->n.sym->ts.type == BT_CHARACTER
1987         && !sym->new_sym->n.sym->ts.u.cl->backend_decl)
1988       {
1989         expr = sym->new_sym->n.sym->ts.u.cl->length;
1990         gfc_apply_interface_mapping_to_expr (mapping, expr);
1991         gfc_init_se (&se, NULL);
1992         gfc_conv_expr (&se, expr);
1993         se.expr = fold_convert (gfc_charlen_type_node, se.expr);
1994         se.expr = gfc_evaluate_now (se.expr, &se.pre);
1995         gfc_add_block_to_block (pre, &se.pre);
1996         gfc_add_block_to_block (post, &se.post);
1997
1998         sym->new_sym->n.sym->ts.u.cl->backend_decl = se.expr;
1999       }
2000 }
2001
2002
2003 /* Like gfc_apply_interface_mapping_to_expr, but applied to
2004    constructor C.  */
2005
2006 static void
2007 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
2008                                      gfc_constructor_base base)
2009 {
2010   gfc_constructor *c;
2011   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
2012     {
2013       gfc_apply_interface_mapping_to_expr (mapping, c->expr);
2014       if (c->iterator)
2015         {
2016           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
2017           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
2018           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
2019         }
2020     }
2021 }
2022
2023
2024 /* Like gfc_apply_interface_mapping_to_expr, but applied to
2025    reference REF.  */
2026
2027 static void
2028 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
2029                                     gfc_ref * ref)
2030 {
2031   int n;
2032
2033   for (; ref; ref = ref->next)
2034     switch (ref->type)
2035       {
2036       case REF_ARRAY:
2037         for (n = 0; n < ref->u.ar.dimen; n++)
2038           {
2039             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
2040             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
2041             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
2042           }
2043         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
2044         break;
2045
2046       case REF_COMPONENT:
2047         break;
2048
2049       case REF_SUBSTRING:
2050         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
2051         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
2052         break;
2053       }
2054 }
2055
2056
2057 /* Convert intrinsic function calls into result expressions.  */
2058
2059 static bool
2060 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping)
2061 {
2062   gfc_symbol *sym;
2063   gfc_expr *new_expr;
2064   gfc_expr *arg1;
2065   gfc_expr *arg2;
2066   int d, dup;
2067
2068   arg1 = expr->value.function.actual->expr;
2069   if (expr->value.function.actual->next)
2070     arg2 = expr->value.function.actual->next->expr;
2071   else
2072     arg2 = NULL;
2073
2074   sym = arg1->symtree->n.sym;
2075
2076   if (sym->attr.dummy)
2077     return false;
2078
2079   new_expr = NULL;
2080
2081   switch (expr->value.function.isym->id)
2082     {
2083     case GFC_ISYM_LEN:
2084       /* TODO figure out why this condition is necessary.  */
2085       if (sym->attr.function
2086           && (arg1->ts.u.cl->length == NULL
2087               || (arg1->ts.u.cl->length->expr_type != EXPR_CONSTANT
2088                   && arg1->ts.u.cl->length->expr_type != EXPR_VARIABLE)))
2089         return false;
2090
2091       new_expr = gfc_copy_expr (arg1->ts.u.cl->length);
2092       break;
2093
2094     case GFC_ISYM_SIZE:
2095       if (!sym->as || sym->as->rank == 0)
2096         return false;
2097
2098       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2099         {
2100           dup = mpz_get_si (arg2->value.integer);
2101           d = dup - 1;
2102         }
2103       else
2104         {
2105           dup = sym->as->rank;
2106           d = 0;
2107         }
2108
2109       for (; d < dup; d++)
2110         {
2111           gfc_expr *tmp;
2112
2113           if (!sym->as->upper[d] || !sym->as->lower[d])
2114             {
2115               gfc_free_expr (new_expr);
2116               return false;
2117             }
2118
2119           tmp = gfc_add (gfc_copy_expr (sym->as->upper[d]),
2120                                         gfc_get_int_expr (gfc_default_integer_kind,
2121                                                           NULL, 1));
2122           tmp = gfc_subtract (tmp, gfc_copy_expr (sym->as->lower[d]));
2123           if (new_expr)
2124             new_expr = gfc_multiply (new_expr, tmp);
2125           else
2126             new_expr = tmp;
2127         }
2128       break;
2129
2130     case GFC_ISYM_LBOUND:
2131     case GFC_ISYM_UBOUND:
2132         /* TODO These implementations of lbound and ubound do not limit if
2133            the size < 0, according to F95's 13.14.53 and 13.14.113.  */
2134
2135       if (!sym->as || sym->as->rank == 0)
2136         return false;
2137
2138       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2139         d = mpz_get_si (arg2->value.integer) - 1;
2140       else
2141         /* TODO: If the need arises, this could produce an array of
2142            ubound/lbounds.  */
2143         gcc_unreachable ();
2144
2145       if (expr->value.function.isym->id == GFC_ISYM_LBOUND)
2146         {
2147           if (sym->as->lower[d])
2148             new_expr = gfc_copy_expr (sym->as->lower[d]);
2149         }
2150       else
2151         {
2152           if (sym->as->upper[d])
2153             new_expr = gfc_copy_expr (sym->as->upper[d]);
2154         }
2155       break;
2156
2157     default:
2158       break;
2159     }
2160
2161   gfc_apply_interface_mapping_to_expr (mapping, new_expr);
2162   if (!new_expr)
2163     return false;
2164
2165   gfc_replace_expr (expr, new_expr);
2166   return true;
2167 }
2168
2169
2170 static void
2171 gfc_map_fcn_formal_to_actual (gfc_expr *expr, gfc_expr *map_expr,
2172                               gfc_interface_mapping * mapping)
2173 {
2174   gfc_formal_arglist *f;
2175   gfc_actual_arglist *actual;
2176
2177   actual = expr->value.function.actual;
2178   f = map_expr->symtree->n.sym->formal;
2179
2180   for (; f && actual; f = f->next, actual = actual->next)
2181     {
2182       if (!actual->expr)
2183         continue;
2184
2185       gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
2186     }
2187
2188   if (map_expr->symtree->n.sym->attr.dimension)
2189     {
2190       int d;
2191       gfc_array_spec *as;
2192
2193       as = gfc_copy_array_spec (map_expr->symtree->n.sym->as);
2194
2195       for (d = 0; d < as->rank; d++)
2196         {
2197           gfc_apply_interface_mapping_to_expr (mapping, as->lower[d]);
2198           gfc_apply_interface_mapping_to_expr (mapping, as->upper[d]);
2199         }
2200
2201       expr->value.function.esym->as = as;
2202     }
2203
2204   if (map_expr->symtree->n.sym->ts.type == BT_CHARACTER)
2205     {
2206       expr->value.function.esym->ts.u.cl->length
2207         = gfc_copy_expr (map_expr->symtree->n.sym->ts.u.cl->length);
2208
2209       gfc_apply_interface_mapping_to_expr (mapping,
2210                         expr->value.function.esym->ts.u.cl->length);
2211     }
2212 }
2213
2214
2215 /* EXPR is a copy of an expression that appeared in the interface
2216    associated with MAPPING.  Walk it recursively looking for references to
2217    dummy arguments that MAPPING maps to actual arguments.  Replace each such
2218    reference with a reference to the associated actual argument.  */
2219
2220 static void
2221 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
2222                                      gfc_expr * expr)
2223 {
2224   gfc_interface_sym_mapping *sym;
2225   gfc_actual_arglist *actual;
2226
2227   if (!expr)
2228     return;
2229
2230   /* Copying an expression does not copy its length, so do that here.  */
2231   if (expr->ts.type == BT_CHARACTER && expr->ts.u.cl)
2232     {
2233       expr->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.u.cl);
2234       gfc_apply_interface_mapping_to_expr (mapping, expr->ts.u.cl->length);
2235     }
2236
2237   /* Apply the mapping to any references.  */
2238   gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
2239
2240   /* ...and to the expression's symbol, if it has one.  */
2241   /* TODO Find out why the condition on expr->symtree had to be moved into
2242      the loop rather than being outside it, as originally.  */
2243   for (sym = mapping->syms; sym; sym = sym->next)
2244     if (expr->symtree && sym->old == expr->symtree->n.sym)
2245       {
2246         if (sym->new_sym->n.sym->backend_decl)
2247           expr->symtree = sym->new_sym;
2248         else if (sym->expr)
2249           gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
2250         /* Replace base type for polymorphic arguments.  */
2251         if (expr->ref && expr->ref->type == REF_COMPONENT
2252             && sym->expr && sym->expr->ts.type == BT_CLASS)
2253           expr->ref->u.c.sym = sym->expr->ts.u.derived;
2254       }
2255
2256       /* ...and to subexpressions in expr->value.  */
2257   switch (expr->expr_type)
2258     {
2259     case EXPR_VARIABLE:
2260     case EXPR_CONSTANT:
2261     case EXPR_NULL:
2262     case EXPR_SUBSTRING:
2263       break;
2264
2265     case EXPR_OP:
2266       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
2267       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
2268       break;
2269
2270     case EXPR_FUNCTION:
2271       for (actual = expr->value.function.actual; actual; actual = actual->next)
2272         gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
2273
2274       if (expr->value.function.esym == NULL
2275             && expr->value.function.isym != NULL
2276             && expr->value.function.actual->expr->symtree
2277             && gfc_map_intrinsic_function (expr, mapping))
2278         break;
2279
2280       for (sym = mapping->syms; sym; sym = sym->next)
2281         if (sym->old == expr->value.function.esym)
2282           {
2283             expr->value.function.esym = sym->new_sym->n.sym;
2284             gfc_map_fcn_formal_to_actual (expr, sym->expr, mapping);
2285             expr->value.function.esym->result = sym->new_sym->n.sym;
2286           }
2287       break;
2288
2289     case EXPR_ARRAY:
2290     case EXPR_STRUCTURE:
2291       gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
2292       break;
2293
2294     case EXPR_COMPCALL:
2295     case EXPR_PPC:
2296       gcc_unreachable ();
2297       break;
2298     }
2299
2300   return;
2301 }
2302
2303
2304 /* Evaluate interface expression EXPR using MAPPING.  Store the result
2305    in SE.  */
2306
2307 void
2308 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
2309                              gfc_se * se, gfc_expr * expr)
2310 {
2311   expr = gfc_copy_expr (expr);
2312   gfc_apply_interface_mapping_to_expr (mapping, expr);
2313   gfc_conv_expr (se, expr);
2314   se->expr = gfc_evaluate_now (se->expr, &se->pre);
2315   gfc_free_expr (expr);
2316 }
2317
2318
2319 /* Returns a reference to a temporary array into which a component of
2320    an actual argument derived type array is copied and then returned
2321    after the function call.  */
2322 void
2323 gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
2324                            sym_intent intent, bool formal_ptr)
2325 {
2326   gfc_se lse;
2327   gfc_se rse;
2328   gfc_ss *lss;
2329   gfc_ss *rss;
2330   gfc_loopinfo loop;
2331   gfc_loopinfo loop2;
2332   gfc_ss_info *info;
2333   tree offset;
2334   tree tmp_index;
2335   tree tmp;
2336   tree base_type;
2337   tree size;
2338   stmtblock_t body;
2339   int n;
2340   int dimen;
2341
2342   gcc_assert (expr->expr_type == EXPR_VARIABLE);
2343
2344   gfc_init_se (&lse, NULL);
2345   gfc_init_se (&rse, NULL);
2346
2347   /* Walk the argument expression.  */
2348   rss = gfc_walk_expr (expr);
2349
2350   gcc_assert (rss != gfc_ss_terminator);
2351  
2352   /* Initialize the scalarizer.  */
2353   gfc_init_loopinfo (&loop);
2354   gfc_add_ss_to_loop (&loop, rss);
2355
2356   /* Calculate the bounds of the scalarization.  */
2357   gfc_conv_ss_startstride (&loop);
2358
2359   /* Build an ss for the temporary.  */
2360   if (expr->ts.type == BT_CHARACTER && !expr->ts.u.cl->backend_decl)
2361     gfc_conv_string_length (expr->ts.u.cl, expr, &parmse->pre);
2362
2363   base_type = gfc_typenode_for_spec (&expr->ts);
2364   if (GFC_ARRAY_TYPE_P (base_type)
2365                 || GFC_DESCRIPTOR_TYPE_P (base_type))
2366     base_type = gfc_get_element_type (base_type);
2367
2368   loop.temp_ss = gfc_get_ss ();;
2369   loop.temp_ss->type = GFC_SS_TEMP;
2370   loop.temp_ss->data.temp.type = base_type;
2371
2372   if (expr->ts.type == BT_CHARACTER)
2373     loop.temp_ss->string_length = expr->ts.u.cl->backend_decl;
2374   else
2375     loop.temp_ss->string_length = NULL;
2376
2377   parmse->string_length = loop.temp_ss->string_length;
2378   loop.temp_ss->data.temp.dimen = loop.dimen;
2379   loop.temp_ss->next = gfc_ss_terminator;
2380
2381   /* Associate the SS with the loop.  */
2382   gfc_add_ss_to_loop (&loop, loop.temp_ss);
2383
2384   /* Setup the scalarizing loops.  */
2385   gfc_conv_loop_setup (&loop, &expr->where);
2386
2387   /* Pass the temporary descriptor back to the caller.  */
2388   info = &loop.temp_ss->data.info;
2389   parmse->expr = info->descriptor;
2390
2391   /* Setup the gfc_se structures.  */
2392   gfc_copy_loopinfo_to_se (&lse, &loop);
2393   gfc_copy_loopinfo_to_se (&rse, &loop);
2394
2395   rse.ss = rss;
2396   lse.ss = loop.temp_ss;
2397   gfc_mark_ss_chain_used (rss, 1);
2398   gfc_mark_ss_chain_used (loop.temp_ss, 1);
2399
2400   /* Start the scalarized loop body.  */
2401   gfc_start_scalarized_body (&loop, &body);
2402
2403   /* Translate the expression.  */
2404   gfc_conv_expr (&rse, expr);
2405
2406   gfc_conv_tmp_array_ref (&lse);
2407
2408   if (intent != INTENT_OUT)
2409     {
2410       tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false, true);
2411       gfc_add_expr_to_block (&body, tmp);
2412       gcc_assert (rse.ss == gfc_ss_terminator);
2413       gfc_trans_scalarizing_loops (&loop, &body);
2414     }
2415   else
2416     {
2417       /* Make sure that the temporary declaration survives by merging
2418        all the loop declarations into the current context.  */
2419       for (n = 0; n < loop.dimen; n++)
2420         {
2421           gfc_merge_block_scope (&body);
2422           body = loop.code[loop.order[n]];
2423         }
2424       gfc_merge_block_scope (&body);
2425     }
2426
2427   /* Add the post block after the second loop, so that any
2428      freeing of allocated memory is done at the right time.  */
2429   gfc_add_block_to_block (&parmse->pre, &loop.pre);
2430
2431   /**********Copy the temporary back again.*********/
2432
2433   gfc_init_se (&lse, NULL);
2434   gfc_init_se (&rse, NULL);
2435
2436   /* Walk the argument expression.  */
2437   lss = gfc_walk_expr (expr);
2438   rse.ss = loop.temp_ss;
2439   lse.ss = lss;
2440
2441   /* Initialize the scalarizer.  */
2442   gfc_init_loopinfo (&loop2);
2443   gfc_add_ss_to_loop (&loop2, lss);
2444
2445   /* Calculate the bounds of the scalarization.  */
2446   gfc_conv_ss_startstride (&loop2);
2447
2448   /* Setup the scalarizing loops.  */
2449   gfc_conv_loop_setup (&loop2, &expr->where);
2450
2451   gfc_copy_loopinfo_to_se (&lse, &loop2);
2452   gfc_copy_loopinfo_to_se (&rse, &loop2);
2453
2454   gfc_mark_ss_chain_used (lss, 1);
2455   gfc_mark_ss_chain_used (loop.temp_ss, 1);
2456
2457   /* Declare the variable to hold the temporary offset and start the
2458      scalarized loop body.  */
2459   offset = gfc_create_var (gfc_array_index_type, NULL);
2460   gfc_start_scalarized_body (&loop2, &body);
2461
2462   /* Build the offsets for the temporary from the loop variables.  The
2463      temporary array has lbounds of zero and strides of one in all
2464      dimensions, so this is very simple.  The offset is only computed
2465      outside the innermost loop, so the overall transfer could be
2466      optimized further.  */
2467   info = &rse.ss->data.info;
2468   dimen = info->dimen;
2469
2470   tmp_index = gfc_index_zero_node;
2471   for (n = dimen - 1; n > 0; n--)
2472     {
2473       tree tmp_str;
2474       tmp = rse.loop->loopvar[n];
2475       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
2476                              tmp, rse.loop->from[n]);
2477       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
2478                              tmp, tmp_index);
2479
2480       tmp_str = fold_build2_loc (input_location, MINUS_EXPR,
2481                                  gfc_array_index_type,
2482                                  rse.loop->to[n-1], rse.loop->from[n-1]);
2483       tmp_str = fold_build2_loc (input_location, PLUS_EXPR,
2484                                  gfc_array_index_type,
2485                                  tmp_str, gfc_index_one_node);
2486
2487       tmp_index = fold_build2_loc (input_location, MULT_EXPR,
2488                                    gfc_array_index_type, tmp, tmp_str);
2489     }
2490
2491   tmp_index = fold_build2_loc (input_location, MINUS_EXPR,
2492                                gfc_array_index_type,
2493                                tmp_index, rse.loop->from[0]);
2494   gfc_add_modify (&rse.loop->code[0], offset, tmp_index);
2495
2496   tmp_index = fold_build2_loc (input_location, PLUS_EXPR,
2497                                gfc_array_index_type,
2498                                rse.loop->loopvar[0], offset);
2499
2500   /* Now use the offset for the reference.  */
2501   tmp = build_fold_indirect_ref_loc (input_location,
2502                                  info->data);
2503   rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
2504
2505   if (expr->ts.type == BT_CHARACTER)
2506     rse.string_length = expr->ts.u.cl->backend_decl;
2507
2508   gfc_conv_expr (&lse, expr);
2509
2510   gcc_assert (lse.ss == gfc_ss_terminator);
2511
2512   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false, true);
2513   gfc_add_expr_to_block (&body, tmp);
2514   
2515   /* Generate the copying loops.  */
2516   gfc_trans_scalarizing_loops (&loop2, &body);
2517
2518   /* Wrap the whole thing up by adding the second loop to the post-block
2519      and following it by the post-block of the first loop.  In this way,
2520      if the temporary needs freeing, it is done after use!  */
2521   if (intent != INTENT_IN)
2522     {
2523       gfc_add_block_to_block (&parmse->post, &loop2.pre);
2524       gfc_add_block_to_block (&parmse->post, &loop2.post);
2525     }
2526
2527   gfc_add_block_to_block (&parmse->post, &loop.post);
2528
2529   gfc_cleanup_loop (&loop);
2530   gfc_cleanup_loop (&loop2);
2531
2532   /* Pass the string length to the argument expression.  */
2533   if (expr->ts.type == BT_CHARACTER)
2534     parmse->string_length = expr->ts.u.cl->backend_decl;
2535
2536   /* Determine the offset for pointer formal arguments and set the
2537      lbounds to one.  */
2538   if (formal_ptr)
2539     {
2540       size = gfc_index_one_node;
2541       offset = gfc_index_zero_node;  
2542       for (n = 0; n < dimen; n++)
2543         {
2544           tmp = gfc_conv_descriptor_ubound_get (parmse->expr,
2545                                                 gfc_rank_cst[n]);
2546           tmp = fold_build2_loc (input_location, PLUS_EXPR,
2547                                  gfc_array_index_type, tmp,
2548                                  gfc_index_one_node);
2549           gfc_conv_descriptor_ubound_set (&parmse->pre,
2550                                           parmse->expr,
2551                                           gfc_rank_cst[n],
2552                                           tmp);
2553           gfc_conv_descriptor_lbound_set (&parmse->pre,
2554                                           parmse->expr,
2555                                           gfc_rank_cst[n],
2556                                           gfc_index_one_node);
2557           size = gfc_evaluate_now (size, &parmse->pre);
2558           offset = fold_build2_loc (input_location, MINUS_EXPR,
2559                                     gfc_array_index_type,
2560                                     offset, size);
2561           offset = gfc_evaluate_now (offset, &parmse->pre);
2562           tmp = fold_build2_loc (input_location, MINUS_EXPR,
2563                                  gfc_array_index_type,
2564                                  rse.loop->to[n], rse.loop->from[n]);
2565           tmp = fold_build2_loc (input_location, PLUS_EXPR,
2566                                  gfc_array_index_type,
2567                                  tmp, gfc_index_one_node);
2568           size = fold_build2_loc (input_location, MULT_EXPR,
2569                                   gfc_array_index_type, size, tmp);
2570         }
2571
2572       gfc_conv_descriptor_offset_set (&parmse->pre, parmse->expr,
2573                                       offset);
2574     }
2575
2576   /* We want either the address for the data or the address of the descriptor,
2577      depending on the mode of passing array arguments.  */
2578   if (g77)
2579     parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
2580   else
2581     parmse->expr = gfc_build_addr_expr (NULL_TREE, parmse->expr);
2582
2583   return;
2584 }
2585
2586
2587 /* Generate the code for argument list functions.  */
2588
2589 static void
2590 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
2591 {
2592   /* Pass by value for g77 %VAL(arg), pass the address
2593      indirectly for %LOC, else by reference.  Thus %REF
2594      is a "do-nothing" and %LOC is the same as an F95
2595      pointer.  */
2596   if (strncmp (name, "%VAL", 4) == 0)
2597     gfc_conv_expr (se, expr);
2598   else if (strncmp (name, "%LOC", 4) == 0)
2599     {
2600       gfc_conv_expr_reference (se, expr);
2601       se->expr = gfc_build_addr_expr (NULL, se->expr);
2602     }
2603   else if (strncmp (name, "%REF", 4) == 0)
2604     gfc_conv_expr_reference (se, expr);
2605   else
2606     gfc_error ("Unknown argument list function at %L", &expr->where);
2607 }
2608
2609
2610 /* Takes a derived type expression and returns the address of a temporary
2611    class object of the 'declared' type.  */ 
2612 static void
2613 gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e,
2614                            gfc_typespec class_ts)
2615 {
2616   gfc_component *cmp;
2617   gfc_symbol *vtab;
2618   gfc_symbol *declared = class_ts.u.derived;
2619   gfc_ss *ss;
2620   tree ctree;
2621   tree var;
2622   tree tmp;
2623
2624   /* The derived type needs to be converted to a temporary
2625      CLASS object.  */
2626   tmp = gfc_typenode_for_spec (&class_ts);
2627   var = gfc_create_var (tmp, "class");
2628
2629   /* Set the vptr.  */
2630   cmp = gfc_find_component (declared, "_vptr", true, true);
2631   ctree = fold_build3_loc (input_location, COMPONENT_REF,
2632                            TREE_TYPE (cmp->backend_decl),
2633                            var, cmp->backend_decl, NULL_TREE);
2634
2635   /* Remember the vtab corresponds to the derived type
2636      not to the class declared type.  */
2637   vtab = gfc_find_derived_vtab (e->ts.u.derived);
2638   gcc_assert (vtab);
2639   tmp = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtab));
2640   gfc_add_modify (&parmse->pre, ctree,
2641                   fold_convert (TREE_TYPE (ctree), tmp));
2642
2643   /* Now set the data field.  */
2644   cmp = gfc_find_component (declared, "_data", true, true);
2645   ctree = fold_build3_loc (input_location, COMPONENT_REF,
2646                            TREE_TYPE (cmp->backend_decl),
2647                            var, cmp->backend_decl, NULL_TREE);
2648   ss = gfc_walk_expr (e);
2649   if (ss == gfc_ss_terminator)
2650     {
2651       parmse->ss = NULL;
2652       gfc_conv_expr_reference (parmse, e);
2653       tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
2654       gfc_add_modify (&parmse->pre, ctree, tmp);
2655     }
2656   else
2657     {
2658       parmse->ss = ss;
2659       gfc_conv_expr (parmse, e);
2660       gfc_add_modify (&parmse->pre, ctree, parmse->expr);
2661     }
2662
2663   /* Pass the address of the class object.  */
2664   parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
2665 }
2666
2667
2668 /* The following routine generates code for the intrinsic
2669    procedures from the ISO_C_BINDING module:
2670     * C_LOC           (function)
2671     * C_FUNLOC        (function)
2672     * C_F_POINTER     (subroutine)
2673     * C_F_PROCPOINTER (subroutine)
2674     * C_ASSOCIATED    (function)
2675    One exception which is not handled here is C_F_POINTER with non-scalar
2676    arguments. Returns 1 if the call was replaced by inline code (else: 0).  */
2677
2678 static int
2679 conv_isocbinding_procedure (gfc_se * se, gfc_symbol * sym,
2680                             gfc_actual_arglist * arg)
2681 {
2682   gfc_symbol *fsym;
2683   gfc_ss *argss;
2684     
2685   if (sym->intmod_sym_id == ISOCBINDING_LOC)
2686     {
2687       if (arg->expr->rank == 0)
2688         gfc_conv_expr_reference (se, arg->expr);
2689       else
2690         {
2691           int f;
2692           /* This is really the actual arg because no formal arglist is
2693              created for C_LOC.  */
2694           fsym = arg->expr->symtree->n.sym;
2695
2696           /* We should want it to do g77 calling convention.  */
2697           f = (fsym != NULL)
2698             && !(fsym->attr.pointer || fsym->attr.allocatable)
2699             && fsym->as->type != AS_ASSUMED_SHAPE;
2700           f = f || !sym->attr.always_explicit;
2701       
2702           argss = gfc_walk_expr (arg->expr);
2703           gfc_conv_array_parameter (se, arg->expr, argss, f,
2704                                     NULL, NULL, NULL);
2705         }
2706
2707       /* TODO -- the following two lines shouldn't be necessary, but if
2708          they're removed, a bug is exposed later in the code path.
2709          This workaround was thus introduced, but will have to be
2710          removed; please see PR 35150 for details about the issue.  */
2711       se->expr = convert (pvoid_type_node, se->expr);
2712       se->expr = gfc_evaluate_now (se->expr, &se->pre);
2713
2714       return 1;
2715     }
2716   else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2717     {
2718       arg->expr->ts.type = sym->ts.u.derived->ts.type;
2719       arg->expr->ts.f90_type = sym->ts.u.derived->ts.f90_type;
2720       arg->expr->ts.kind = sym->ts.u.derived->ts.kind;
2721       gfc_conv_expr_reference (se, arg->expr);
2722   
2723       return 1;
2724     }
2725   else if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER
2726             && arg->next->expr->rank == 0)
2727            || sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER)
2728     {
2729       /* Convert c_f_pointer if fptr is a scalar
2730          and convert c_f_procpointer.  */
2731       gfc_se cptrse;
2732       gfc_se fptrse;
2733
2734       gfc_init_se (&cptrse, NULL);
2735       gfc_conv_expr (&cptrse, arg->expr);
2736       gfc_add_block_to_block (&se->pre, &cptrse.pre);
2737       gfc_add_block_to_block (&se->post, &cptrse.post);
2738
2739       gfc_init_se (&fptrse, NULL);
2740       if (sym->intmod_sym_id == ISOCBINDING_F_POINTER
2741           || gfc_is_proc_ptr_comp (arg->next->expr, NULL))
2742         fptrse.want_pointer = 1;
2743
2744       gfc_conv_expr (&fptrse, arg->next->expr);
2745       gfc_add_block_to_block (&se->pre, &fptrse.pre);
2746       gfc_add_block_to_block (&se->post, &fptrse.post);
2747       
2748       if (arg->next->expr->symtree->n.sym->attr.proc_pointer
2749           && arg->next->expr->symtree->n.sym->attr.dummy)
2750         fptrse.expr = build_fold_indirect_ref_loc (input_location,
2751                                                    fptrse.expr);
2752       
2753       se->expr = fold_build2_loc (input_location, MODIFY_EXPR,
2754                                   TREE_TYPE (fptrse.expr),
2755                                   fptrse.expr,
2756                                   fold_convert (TREE_TYPE (fptrse.expr),
2757                                                 cptrse.expr));
2758
2759       return 1;
2760     }
2761   else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2762     {
2763       gfc_se arg1se;
2764       gfc_se arg2se;
2765
2766       /* Build the addr_expr for the first argument.  The argument is
2767          already an *address* so we don't need to set want_pointer in
2768          the gfc_se.  */
2769       gfc_init_se (&arg1se, NULL);
2770       gfc_conv_expr (&arg1se, arg->expr);
2771       gfc_add_block_to_block (&se->pre, &arg1se.pre);
2772       gfc_add_block_to_block (&se->post, &arg1se.post);
2773
2774       /* See if we were given two arguments.  */
2775       if (arg->next == NULL)
2776         /* Only given one arg so generate a null and do a
2777            not-equal comparison against the first arg.  */
2778         se->expr = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
2779                                     arg1se.expr,
2780                                     fold_convert (TREE_TYPE (arg1se.expr),
2781                                                   null_pointer_node));
2782       else
2783         {
2784           tree eq_expr;
2785           tree not_null_expr;
2786           
2787           /* Given two arguments so build the arg2se from second arg.  */
2788           gfc_init_se (&arg2se, NULL);
2789           gfc_conv_expr (&arg2se, arg->next->expr);
2790           gfc_add_block_to_block (&se->pre, &arg2se.pre);
2791           gfc_add_block_to_block (&se->post, &arg2se.post);
2792
2793           /* Generate test to compare that the two args are equal.  */
2794           eq_expr = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
2795                                      arg1se.expr, arg2se.expr);
2796           /* Generate test to ensure that the first arg is not null.  */
2797           not_null_expr = fold_build2_loc (input_location, NE_EXPR,
2798                                            boolean_type_node,
2799                                            arg1se.expr, null_pointer_node);
2800
2801           /* Finally, the generated test must check that both arg1 is not
2802              NULL and that it is equal to the second arg.  */
2803           se->expr = fold_build2_loc (input_location, TRUTH_AND_EXPR,
2804                                       boolean_type_node,
2805                                       not_null_expr, eq_expr);
2806         }
2807
2808       return 1;
2809     }
2810     
2811   /* Nothing was done.  */
2812   return 0;
2813 }
2814
2815 /* Generate code for a procedure call.  Note can return se->post != NULL.
2816    If se->direct_byref is set then se->expr contains the return parameter.
2817    Return nonzero, if the call has alternate specifiers.
2818    'expr' is only needed for procedure pointer components.  */
2819
2820 int
2821 gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
2822                          gfc_actual_arglist * args, gfc_expr * expr,
2823                          VEC(tree,gc) *append_args)
2824 {
2825   gfc_interface_mapping mapping;
2826   VEC(tree,gc) *arglist;
2827   VEC(tree,gc) *retargs;
2828   tree tmp;
2829   tree fntype;
2830   gfc_se parmse;
2831   gfc_ss *argss;
2832   gfc_ss_info *info;
2833   int byref;
2834   int parm_kind;
2835   tree type;
2836   tree var;
2837   tree len;
2838   VEC(tree,gc) *stringargs;
2839   tree result = NULL;
2840   gfc_formal_arglist *formal;
2841   gfc_actual_arglist *arg;
2842   int has_alternate_specifier = 0;
2843   bool need_interface_mapping;
2844   bool callee_alloc;
2845   gfc_typespec ts;
2846   gfc_charlen cl;
2847   gfc_expr *e;
2848   gfc_symbol *fsym;
2849   stmtblock_t post;
2850   enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
2851   gfc_component *comp = NULL;
2852   int arglen;
2853
2854   arglist = NULL;
2855   retargs = NULL;
2856   stringargs = NULL;
2857   var = NULL_TREE;
2858   len = NULL_TREE;
2859   gfc_clear_ts (&ts);
2860
2861   if (sym->from_intmod == INTMOD_ISO_C_BINDING
2862       && conv_isocbinding_procedure (se, sym, args))
2863     return 0;
2864
2865   gfc_is_proc_ptr_comp (expr, &comp);
2866
2867   if (se->ss != NULL)
2868     {
2869       if (!sym->attr.elemental)
2870         {
2871           gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2872           if (se->ss->useflags)
2873             {
2874               gcc_assert ((!comp && gfc_return_by_reference (sym)
2875                            && sym->result->attr.dimension)
2876                           || (comp && comp->attr.dimension));
2877               gcc_assert (se->loop != NULL);
2878
2879               /* Access the previously obtained result.  */
2880               gfc_conv_tmp_array_ref (se);
2881               return 0;
2882             }
2883         }
2884       info = &se->ss->data.info;
2885     }
2886   else
2887     info = NULL;
2888
2889   gfc_init_block (&post);
2890   gfc_init_interface_mapping (&mapping);
2891   if (!comp)
2892     {
2893       formal = sym->formal;
2894       need_interface_mapping = sym->attr.dimension ||
2895                                (sym->ts.type == BT_CHARACTER
2896                                 && sym->ts.u.cl->length
2897                                 && sym->ts.u.cl->length->expr_type
2898                                    != EXPR_CONSTANT);
2899     }
2900   else
2901     {
2902       formal = comp->formal;
2903       need_interface_mapping = comp->attr.dimension ||
2904                                (comp->ts.type == BT_CHARACTER
2905                                 && comp->ts.u.cl->length
2906                                 && comp->ts.u.cl->length->expr_type
2907                                    != EXPR_CONSTANT);
2908     }
2909
2910   /* Evaluate the arguments.  */
2911   for (arg = args; arg != NULL;
2912        arg = arg->next, formal = formal ? formal->next : NULL)
2913     {
2914       e = arg->expr;
2915       fsym = formal ? formal->sym : NULL;
2916       parm_kind = MISSING;
2917
2918       if (e == NULL)
2919         {
2920           if (se->ignore_optional)
2921             {
2922               /* Some intrinsics have already been resolved to the correct
2923                  parameters.  */
2924               continue;
2925             }
2926           else if (arg->label)
2927             {
2928               has_alternate_specifier = 1;
2929               continue;
2930             }
2931           else
2932             {
2933               /* Pass a NULL pointer for an absent arg.  */
2934               gfc_init_se (&parmse, NULL);
2935               parmse.expr = null_pointer_node;
2936               if (arg->missing_arg_type == BT_CHARACTER)
2937                 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2938             }
2939         }
2940       else if (arg->expr->expr_type == EXPR_NULL && fsym && !fsym->attr.pointer)
2941         {
2942           /* Pass a NULL pointer to denote an absent arg.  */
2943           gcc_assert (fsym->attr.optional && !fsym->attr.allocatable);
2944           gfc_init_se (&parmse, NULL);
2945           parmse.expr = null_pointer_node;
2946           if (arg->missing_arg_type == BT_CHARACTER)
2947             parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2948         }
2949       else if (fsym && fsym->ts.type == BT_CLASS
2950                  && e->ts.type == BT_DERIVED)
2951         {
2952           /* The derived type needs to be converted to a temporary
2953              CLASS object.  */
2954           gfc_init_se (&parmse, se);
2955           gfc_conv_derived_to_class (&parmse, e, fsym->ts);
2956         }
2957       else if (se->ss && se->ss->useflags)
2958         {
2959           /* An elemental function inside a scalarized loop.  */
2960           gfc_init_se (&parmse, se);
2961           gfc_conv_expr_reference (&parmse, e);
2962           parm_kind = ELEMENTAL;
2963         }
2964       else
2965         {
2966           /* A scalar or transformational function.  */
2967           gfc_init_se (&parmse, NULL);
2968           argss = gfc_walk_expr (e);
2969
2970           if (argss == gfc_ss_terminator)
2971             {
2972               if (e->expr_type == EXPR_VARIABLE
2973                     && e->symtree->n.sym->attr.cray_pointee
2974                     && fsym && fsym->attr.flavor == FL_PROCEDURE)
2975                 {
2976                     /* The Cray pointer needs to be converted to a pointer to
2977                        a type given by the expression.  */
2978                     gfc_conv_expr (&parmse, e);
2979                     type = build_pointer_type (TREE_TYPE (parmse.expr));
2980                     tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer);
2981                     parmse.expr = convert (type, tmp);
2982                 }
2983               else if (fsym && fsym->attr.value)
2984                 {
2985                   if (fsym->ts.type == BT_CHARACTER
2986                       && fsym->ts.is_c_interop
2987                       && fsym->ns->proc_name != NULL
2988                       && fsym->ns->proc_name->attr.is_bind_c)
2989                     {
2990                       parmse.expr = NULL;
2991                       gfc_conv_scalar_char_value (fsym, &parmse, &e);
2992                       if (parmse.expr == NULL)
2993                         gfc_conv_expr (&parmse, e);
2994                     }
2995                   else
2996                     gfc_conv_expr (&parmse, e);
2997                 }
2998               else if (arg->name && arg->name[0] == '%')
2999                 /* Argument list functions %VAL, %LOC and %REF are signalled
3000                    through arg->name.  */
3001                 conv_arglist_function (&parmse, arg->expr, arg->name);
3002               else if ((e->expr_type == EXPR_FUNCTION)
3003                         && ((e->value.function.esym
3004                              && e->value.function.esym->result->attr.pointer)
3005                             || (!e->value.function.esym
3006                                 && e->symtree->n.sym->attr.pointer))
3007                         && fsym && fsym->attr.target)
3008                 {
3009                   gfc_conv_expr (&parmse, e);
3010                   parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
3011                 }
3012               else if (e->expr_type == EXPR_FUNCTION
3013                        && e->symtree->n.sym->result
3014                        && e->symtree->n.sym->result != e->symtree->n.sym
3015                        && e->symtree->n.sym->result->attr.proc_pointer)
3016                 {
3017                   /* Functions returning procedure pointers.  */
3018                   gfc_conv_expr (&parmse, e);
3019                   if (fsym && fsym->attr.proc_pointer)
3020                     parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
3021                 }
3022               else
3023                 {
3024                   gfc_conv_expr_reference (&parmse, e);
3025
3026                   /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is 
3027                      allocated on entry, it must be deallocated.  */
3028                   if (fsym && fsym->attr.allocatable
3029                       && fsym->attr.intent == INTENT_OUT)
3030                     {
3031                       stmtblock_t block;
3032
3033                       gfc_init_block  (&block);
3034                       tmp = gfc_deallocate_with_status (parmse.expr, NULL_TREE,
3035                                                         true, NULL);
3036                       gfc_add_expr_to_block (&block, tmp);
3037                       tmp = fold_build2_loc (input_location, MODIFY_EXPR,
3038                                              void_type_node, parmse.expr,
3039                                              null_pointer_node);
3040                       gfc_add_expr_to_block (&block, tmp);
3041
3042                       if (fsym->attr.optional
3043                           && e->expr_type == EXPR_VARIABLE
3044                           && e->symtree->n.sym->attr.optional)
3045                         {
3046                           tmp = fold_build3_loc (input_location, COND_EXPR,
3047                                      void_type_node,
3048                                      gfc_conv_expr_present (e->symtree->n.sym),
3049                                             gfc_finish_block (&block),
3050                                             build_empty_stmt (input_location));
3051                         }
3052                       else
3053                         tmp = gfc_finish_block (&block);
3054
3055                       gfc_add_expr_to_block (&se->pre, tmp);
3056                     }
3057
3058                   if (fsym && e->expr_type != EXPR_NULL
3059                       && ((fsym->attr.pointer
3060                            && fsym->attr.flavor != FL_PROCEDURE)
3061                           || (fsym->attr.proc_pointer
3062                               && !(e->expr_type == EXPR_VARIABLE
3063                                    && e->symtree->n.sym->attr.dummy))
3064                           || (fsym->attr.proc_pointer
3065                               && e->expr_type == EXPR_VARIABLE
3066                               && gfc_is_proc_ptr_comp (e, NULL))
3067                           || fsym->attr.allocatable))
3068                     {
3069                       /* Scalar pointer dummy args require an extra level of
3070                          indirection. The null pointer already contains
3071                          this level of indirection.  */
3072                       parm_kind = SCALAR_POINTER;
3073                       parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
3074                     }
3075                 }
3076             }
3077           else
3078             {
3079               /* If the procedure requires an explicit interface, the actual
3080                  argument is passed according to the corresponding formal
3081                  argument.  If the corresponding formal argument is a POINTER,
3082                  ALLOCATABLE or assumed shape, we do not use g77's calling
3083                  convention, and pass the address of the array descriptor
3084                  instead. Otherwise we use g77's calling convention.  */
3085               bool f;
3086               f = (fsym != NULL)
3087                   && !(fsym->attr.pointer || fsym->attr.allocatable)
3088                   && fsym->as && fsym->as->type != AS_ASSUMED_SHAPE;
3089               if (comp)
3090                 f = f || !comp->attr.always_explicit;
3091               else
3092                 f = f || !sym->attr.always_explicit;
3093
3094               /* If the argument is a function call that may not create
3095                  a temporary for the result, we have to check that we
3096                  can do it, i.e. that there is no alias between this 
3097                  argument and another one.  */
3098               if (gfc_get_noncopying_intrinsic_argument (e) != NULL)
3099                 {
3100                   gfc_expr *iarg;
3101                   sym_intent intent;
3102
3103                   if (fsym != NULL)
3104                     intent = fsym->attr.intent;
3105                   else
3106                     intent = INTENT_UNKNOWN;
3107
3108                   if (gfc_check_fncall_dependency (e, intent, sym, args,
3109                                                    NOT_ELEMENTAL))
3110                     parmse.force_tmp = 1;
3111
3112                   iarg = e->value.function.actual->expr;
3113
3114                   /* Temporary needed if aliasing due to host association.  */
3115                   if (sym->attr.contained
3116                         && !sym->attr.pure
3117                         && !sym->attr.implicit_pure
3118                         && !sym->attr.use_assoc
3119                         && iarg->expr_type == EXPR_VARIABLE
3120                         && sym->ns == iarg->symtree->n.sym->ns)
3121                     parmse.force_tmp = 1;
3122
3123                   /* Ditto within module.  */
3124                   if (sym->attr.use_assoc
3125                         && !sym->attr.pure
3126                         && !sym->attr.implicit_pure
3127                         && iarg->expr_type == EXPR_VARIABLE
3128                         && sym->module == iarg->symtree->n.sym->module)
3129                     parmse.force_tmp = 1;
3130                 }
3131
3132               if (e->expr_type == EXPR_VARIABLE
3133                     && is_subref_array (e))
3134                 /* The actual argument is a component reference to an
3135                    array of derived types.  In this case, the argument
3136                    is converted to a temporary, which is passed and then
3137                    written back after the procedure call.  */
3138                 gfc_conv_subref_array_arg (&parmse, e, f,
3139                                 fsym ? fsym->attr.intent : INTENT_INOUT,
3140                                 fsym && fsym->attr.pointer);
3141               else
3142                 gfc_conv_array_parameter (&parmse, e, argss, f, fsym,
3143                                           sym->name, NULL);
3144
3145               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is 
3146                  allocated on entry, it must be deallocated.  */
3147               if (fsym && fsym->attr.allocatable
3148                   && fsym->attr.intent == INTENT_OUT)
3149                 {
3150                   tmp = build_fold_indirect_ref_loc (input_location,
3151                                                      parmse.expr);
3152                   tmp = gfc_trans_dealloc_allocated (tmp);
3153                   if (fsym->attr.optional
3154                       && e->expr_type == EXPR_VARIABLE
3155                       && e->symtree->n.sym->attr.optional)
3156                     tmp = fold_build3_loc (input_location, COND_EXPR,
3157                                      void_type_node,
3158                                      gfc_conv_expr_present (e->symtree->n.sym),
3159                                        tmp, build_empty_stmt (input_location));
3160                   gfc_add_expr_to_block (&se->pre, tmp);
3161                 }
3162             } 
3163         }
3164
3165       /* The case with fsym->attr.optional is that of a user subroutine
3166          with an interface indicating an optional argument.  When we call
3167          an intrinsic subroutine, however, fsym is NULL, but we might still
3168          have an optional argument, so we proceed to the substitution
3169          just in case.  */
3170       if (e && (fsym == NULL || fsym->attr.optional))
3171         {
3172           /* If an optional argument is itself an optional dummy argument,
3173              check its presence and substitute a null if absent.  This is
3174              only needed when passing an array to an elemental procedure
3175              as then array elements are accessed - or no NULL pointer is
3176              allowed and a "1" or "0" should be passed if not present.
3177              When passing a non-array-descriptor full array to a
3178              non-array-descriptor dummy, no check is needed. For
3179              array-descriptor actual to array-descriptor dummy, see
3180              PR 41911 for why a check has to be inserted.
3181              fsym == NULL is checked as intrinsics required the descriptor
3182              but do not always set fsym.  */
3183           if (e->expr_type == EXPR_VARIABLE
3184               && e->symtree->n.sym->attr.optional
3185               && ((e->rank > 0 && sym->attr.elemental)
3186                   || e->representation.length || e->ts.type == BT_CHARACTER
3187                   || (e->rank > 0
3188                       && (fsym == NULL 
3189                           || (fsym-> as
3190                               && (fsym->as->type == AS_ASSUMED_SHAPE
3191                                   || fsym->as->type == AS_DEFERRED))))))
3192             gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
3193                                     e->representation.length);
3194         }
3195
3196       if (fsym && e)
3197         {
3198           /* Obtain the character length of an assumed character length
3199              length procedure from the typespec.  */
3200           if (fsym->ts.type == BT_CHARACTER
3201               && parmse.string_length == NULL_TREE
3202               && e->ts.type == BT_PROCEDURE
3203               && e->symtree->n.sym->ts.type == BT_CHARACTER
3204               && e->symtree->n.sym->ts.u.cl->length != NULL
3205               && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
3206             {
3207               gfc_conv_const_charlen (e->symtree->n.sym->ts.u.cl);
3208               parmse.string_length = e->symtree->n.sym->ts.u.cl->backend_decl;
3209             }
3210         }
3211
3212       if (fsym && need_interface_mapping && e)
3213         gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
3214
3215       gfc_add_block_to_block (&se->pre, &parmse.pre);
3216       gfc_add_block_to_block (&post, &parmse.post);
3217
3218       /* Allocated allocatable components of derived types must be
3219          deallocated for non-variable scalars.  Non-variable arrays are
3220          dealt with in trans-array.c(gfc_conv_array_parameter).  */
3221       if (e && e->ts.type == BT_DERIVED
3222             && e->ts.u.derived->attr.alloc_comp
3223             && !(e->symtree && e->symtree->n.sym->attr.pointer)
3224             && (e->expr_type != EXPR_VARIABLE && !e->rank))
3225         {
3226           int parm_rank;
3227           tmp = build_fold_indirect_ref_loc (input_location,
3228                                          parmse.expr);
3229           parm_rank = e->rank;
3230           switch (parm_kind)
3231             {
3232             case (ELEMENTAL):
3233             case (SCALAR):
3234               parm_rank = 0;
3235               break;
3236
3237             case (SCALAR_POINTER):
3238               tmp = build_fold_indirect_ref_loc (input_location,
3239                                              tmp);
3240               break;
3241             }
3242
3243           if (e->expr_type == EXPR_OP
3244                 && e->value.op.op == INTRINSIC_PARENTHESES
3245                 && e->value.op.op1->expr_type == EXPR_VARIABLE)
3246             {
3247               tree local_tmp;
3248               local_tmp = gfc_evaluate_now (tmp, &se->pre);
3249               local_tmp = gfc_copy_alloc_comp (e->ts.u.derived, local_tmp, tmp, parm_rank);
3250               gfc_add_expr_to_block (&se->post, local_tmp);
3251             }
3252
3253           tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp, parm_rank);
3254
3255           gfc_add_expr_to_block (&se->post, tmp);
3256         }
3257
3258       /* Add argument checking of passing an unallocated/NULL actual to
3259          a nonallocatable/nonpointer dummy.  */
3260
3261       if (gfc_option.rtcheck & GFC_RTCHECK_POINTER && e != NULL)
3262         {
3263           symbol_attribute attr;
3264           char *msg;
3265           tree cond;
3266
3267           if (e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_FUNCTION)
3268             attr = gfc_expr_attr (e);
3269           else
3270             goto end_pointer_check;
3271
3272           if (attr.optional)
3273             {
3274               /* If the actual argument is an optional pointer/allocatable and
3275                  the formal argument takes an nonpointer optional value,
3276                  it is invalid to pass a non-present argument on, even
3277                  though there is no technical reason for this in gfortran.
3278                  See Fortran 2003, Section 12.4.1.6 item (7)+(8).  */
3279               tree present, null_ptr, type;
3280
3281               if (attr.allocatable
3282                   && (fsym == NULL || !fsym->attr.allocatable))
3283                 asprintf (&msg, "Allocatable actual argument '%s' is not "
3284                           "allocated or not present", e->symtree->n.sym->name);
3285               else if (attr.pointer
3286                        && (fsym == NULL || !fsym->attr.pointer))
3287                 asprintf (&msg, "Pointer actual argument '%s' is not "
3288                           "associated or not present",
3289                           e->symtree->n.sym->name);
3290               else if (attr.proc_pointer
3291                        && (fsym == NULL || !fsym->attr.proc_pointer))
3292                 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3293                           "associated or not present",
3294                           e->symtree->n.sym->name);
3295               else
3296                 goto end_pointer_check;
3297
3298               present = gfc_conv_expr_present (e->symtree->n.sym);
3299               type = TREE_TYPE (present);
3300               present = fold_build2_loc (input_location, EQ_EXPR,
3301                                          boolean_type_node, present,
3302                                          fold_convert (type,
3303                                                        null_pointer_node));
3304               type = TREE_TYPE (parmse.expr);
3305               null_ptr = fold_build2_loc (input_location, EQ_EXPR,
3306                                           boolean_type_node, parmse.expr,
3307                                           fold_convert (type,
3308                                                         null_pointer_node));
3309               cond = fold_build2_loc (input_location, TRUTH_ORIF_EXPR,
3310                                       boolean_type_node, present, null_ptr);
3311             }
3312           else
3313             {
3314               if (attr.allocatable
3315                   && (fsym == NULL || !fsym->attr.allocatable))
3316                 asprintf (&msg, "Allocatable actual argument '%s' is not "
3317                       "allocated", e->symtree->n.sym->name);
3318               else if (attr.pointer
3319                        && (fsym == NULL || !fsym->attr.pointer))
3320                 asprintf (&msg, "Pointer actual argument '%s' is not "
3321                       "associated", e->symtree->n.sym->name);
3322               else if (attr.proc_pointer
3323                        && (fsym == NULL || !fsym->attr.proc_pointer))
3324                 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3325                       "associated", e->symtree->n.sym->name);
3326               else
3327                 goto end_pointer_check;
3328
3329
3330               cond = fold_build2_loc (input_location, EQ_EXPR,
3331                                       boolean_type_node, parmse.expr,
3332                                       fold_convert (TREE_TYPE (parmse.expr),
3333                                                     null_pointer_node));
3334             }
3335  
3336           gfc_trans_runtime_check (true, false, cond, &se->pre, &e->where,
3337                                    msg);
3338           free (msg);
3339         }
3340       end_pointer_check:
3341
3342       /* Deferred length dummies pass the character length by reference
3343          so that the value can be returned.  */
3344       if (parmse.string_length && fsym && fsym->ts.deferred)
3345         {
3346           tmp = parmse.string_length;
3347           if (TREE_CODE (tmp) != VAR_DECL)
3348             tmp = gfc_evaluate_now (parmse.string_length, &se->pre);
3349           parmse.string_length = gfc_build_addr_expr (NULL_TREE, tmp);
3350         }
3351
3352       /* Character strings are passed as two parameters, a length and a
3353          pointer - except for Bind(c) which only passes the pointer.  */
3354       if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
3355         VEC_safe_push (tree, gc, stringargs, parmse.string_length);
3356
3357       VEC_safe_push (tree, gc, arglist, parmse.expr);
3358     }
3359   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
3360
3361   if (comp)
3362     ts = comp->ts;
3363   else
3364    ts = sym->ts;
3365
3366   if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
3367     se->string_length = build_int_cst (gfc_charlen_type_node, 1);
3368   else if (ts.type == BT_CHARACTER)
3369     {
3370       if (ts.u.cl->length == NULL)
3371         {
3372           /* Assumed character length results are not allowed by 5.1.1.5 of the
3373              standard and are trapped in resolve.c; except in the case of SPREAD
3374              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
3375              we take the character length of the first argument for the result.
3376              For dummies, we have to look through the formal argument list for
3377              this function and use the character length found there.*/
3378           if (ts.deferred && (sym->attr.allocatable || sym->attr.pointer))
3379             cl.backend_decl = gfc_create_var (gfc_charlen_type_node, "slen");
3380           else if (!sym->attr.dummy)
3381             cl.backend_decl = VEC_index (tree, stringargs, 0);
3382           else
3383             {
3384               formal = sym->ns->proc_name->formal;
3385               for (; formal; formal = formal->next)
3386                 if (strcmp (formal->sym->name, sym->name) == 0)
3387                   cl.backend_decl = formal->sym->ts.u.cl->backend_decl;
3388             }
3389         }
3390       else
3391         {
3392           tree tmp;
3393
3394           /* Calculate the length of the returned string.  */
3395           gfc_init_se (&parmse, NULL);
3396           if (need_interface_mapping)
3397             gfc_apply_interface_mapping (&mapping, &parmse, ts.u.cl->length);
3398           else
3399             gfc_conv_expr (&parmse, ts.u.cl->length);
3400           gfc_add_block_to_block (&se->pre, &parmse.pre);
3401           gfc_add_block_to_block (&se->post, &parmse.post);
3402           
3403           tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
3404           tmp = fold_build2_loc (input_location, MAX_EXPR,
3405                                  gfc_charlen_type_node, tmp,
3406                                  build_int_cst (gfc_charlen_type_node, 0));
3407           cl.backend_decl = tmp;
3408         }
3409
3410       /* Set up a charlen structure for it.  */
3411       cl.next = NULL;
3412       cl.length = NULL;
3413       ts.u.cl = &cl;
3414
3415       len = cl.backend_decl;
3416     }
3417
3418   byref = (comp && (comp->attr.dimension || comp->ts.type == BT_CHARACTER))
3419           || (!comp && gfc_return_by_reference (sym));
3420   if (byref)
3421     {
3422       if (se->direct_byref)
3423         {
3424           /* Sometimes, too much indirection can be applied; e.g. for
3425              function_result = array_valued_recursive_function.  */
3426           if (TREE_TYPE (TREE_TYPE (se->expr))
3427                 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
3428                 && GFC_DESCRIPTOR_TYPE_P
3429                         (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
3430             se->expr = build_fold_indirect_ref_loc (input_location,
3431                                                 se->expr);
3432
3433           /* If the lhs of an assignment x = f(..) is allocatable and
3434              f2003 is allowed, we must do the automatic reallocation.
3435              TODO - deal with intrinsics, without using a temporary.  */
3436           if (gfc_option.flag_realloc_lhs
3437                 && se->ss && se->ss->loop_chain
3438                 && se->ss->loop_chain->is_alloc_lhs
3439                 && !expr->value.function.isym
3440                 && sym->result->as != NULL)
3441             {
3442               /* Evaluate the bounds of the result, if known.  */
3443               gfc_set_loop_bounds_from_array_spec (&mapping, se,
3444                                                    sym->result->as);
3445
3446               /* Perform the automatic reallocation.  */
3447               tmp = gfc_alloc_allocatable_for_assignment (se->loop,
3448                                                           expr, NULL);
3449               gfc_add_expr_to_block (&se->pre, tmp);
3450
3451               /* Pass the temporary as the first argument.  */
3452               result = info->descriptor;
3453             }
3454           else
3455             result = build_fold_indirect_ref_loc (input_location,
3456                                                   se->expr);
3457           VEC_safe_push (tree, gc, retargs, se->expr);
3458         }
3459       else if (comp && comp->attr.dimension)
3460         {
3461           gcc_assert (se->loop && info);
3462
3463           /* Set the type of the array.  */
3464           tmp = gfc_typenode_for_spec (&comp->ts);
3465           info->dimen = se->loop->dimen;
3466
3467           /* Evaluate the bounds of the result, if known.  */
3468           gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
3469
3470           /* If the lhs of an assignment x = f(..) is allocatable and
3471              f2003 is allowed, we must not generate the function call
3472              here but should just send back the results of the mapping.
3473              This is signalled by the function ss being flagged.  */
3474           if (gfc_option.flag_realloc_lhs
3475                 && se->ss && se->ss->is_alloc_lhs)
3476             {
3477               gfc_free_interface_mapping (&mapping);
3478               return has_alternate_specifier;
3479             }
3480
3481           /* Create a temporary to store the result.  In case the function
3482              returns a pointer, the temporary will be a shallow copy and
3483              mustn't be deallocated.  */
3484           callee_alloc = comp->attr.allocatable || comp->attr.pointer;
3485           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3486                                        NULL_TREE, false, !comp->attr.pointer,
3487                                        callee_alloc, &se->ss->expr->where);
3488
3489           /* Pass the temporary as the first argument.  */
3490           result = info->descriptor;
3491           tmp = gfc_build_addr_expr (NULL_TREE, result);
3492           VEC_safe_push (tree, gc, retargs, tmp);
3493         }
3494       else if (!comp && sym->result->attr.dimension)
3495         {
3496           gcc_assert (se->loop && info);
3497
3498           /* Set the type of the array.  */
3499           tmp = gfc_typenode_for_spec (&ts);
3500           info->dimen = se->loop->dimen;
3501
3502           /* Evaluate the bounds of the result, if known.  */
3503           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
3504
3505           /* If the lhs of an assignment x = f(..) is allocatable and
3506              f2003 is allowed, we must not generate the function call
3507              here but should just send back the results of the mapping.
3508              This is signalled by the function ss being flagged.  */
3509           if (gfc_option.flag_realloc_lhs
3510                 && se->ss && se->ss->is_alloc_lhs)
3511             {
3512               gfc_free_interface_mapping (&mapping);
3513               return has_alternate_specifier;
3514             }
3515
3516           /* Create a temporary to store the result.  In case the function
3517              returns a pointer, the temporary will be a shallow copy and
3518              mustn't be deallocated.  */
3519           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
3520           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3521                                        NULL_TREE, false, !sym->attr.pointer,
3522                                        callee_alloc, &se->ss->expr->where);
3523
3524           /* Pass the temporary as the first argument.  */
3525           result = info->descriptor;
3526           tmp = gfc_build_addr_expr (NULL_TREE, result);
3527           VEC_safe_push (tree, gc, retargs, tmp);
3528         }
3529       else if (ts.type == BT_CHARACTER)
3530         {
3531           /* Pass the string length.  */
3532           type = gfc_get_character_type (ts.kind, ts.u.cl);
3533           type = build_pointer_type (type);
3534
3535           /* Return an address to a char[0:len-1]* temporary for
3536              character pointers.  */
3537           if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3538                || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3539             {
3540               var = gfc_create_var (type, "pstr");
3541
3542               if ((!comp && sym->attr.allocatable)
3543                   || (comp && comp->attr.allocatable))
3544                 gfc_add_modify (&se->pre, var,
3545                                 fold_convert (TREE_TYPE (var),
3546                                               null_pointer_node));
3547
3548               /* Provide an address expression for the function arguments.  */
3549               var = gfc_build_addr_expr (NULL_TREE, var);
3550             }
3551           else
3552             var = gfc_conv_string_tmp (se, type, len);
3553
3554           VEC_safe_push (tree, gc, retargs, var);
3555         }
3556       else
3557         {
3558           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
3559
3560           type = gfc_get_complex_type (ts.kind);
3561           var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
3562           VEC_safe_push (tree, gc, retargs, var);
3563         }
3564
3565       if (ts.type == BT_CHARACTER && ts.deferred
3566             && (sym->attr.allocatable || sym->attr.pointer))
3567         {
3568           tmp = len;
3569           if (TREE_CODE (tmp) != VAR_DECL)
3570             tmp = gfc_evaluate_now (len, &se->pre);
3571           len = gfc_build_addr_expr (NULL_TREE, tmp);
3572         }
3573
3574       /* Add the string length to the argument list.  */
3575       if (ts.type == BT_CHARACTER)
3576         VEC_safe_push (tree, gc, retargs, len);
3577     }
3578   gfc_free_interface_mapping (&mapping);
3579
3580   /* We need to glom RETARGS + ARGLIST + STRINGARGS + APPEND_ARGS.  */
3581   arglen = (VEC_length (tree, arglist)
3582             + VEC_length (tree, stringargs) + VEC_length (tree, append_args));
3583   VEC_reserve_exact (tree, gc, retargs, arglen);
3584
3585   /* Add the return arguments.  */
3586   VEC_splice (tree, retargs, arglist);
3587
3588   /* Add the hidden string length parameters to the arguments.  */
3589   VEC_splice (tree, retargs, stringargs);
3590
3591   /* We may want to append extra arguments here.  This is used e.g. for
3592      calls to libgfortran_matmul_??, which need extra information.  */
3593   if (!VEC_empty (tree, append_args))
3594     VEC_splice (tree, retargs, append_args);
3595   arglist = retargs;
3596
3597   /* Generate the actual call.  */
3598   conv_function_val (se, sym, expr);
3599
3600   /* If there are alternate return labels, function type should be
3601      integer.  Can't modify the type in place though, since it can be shared
3602      with other functions.  For dummy arguments, the typing is done to
3603      this result, even if it has to be repeated for each call.  */
3604   if (has_alternate_specifier
3605       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
3606     {
3607       if (!sym->attr.dummy)
3608         {
3609           TREE_TYPE (sym->backend_decl)
3610                 = build_function_type (integer_type_node,
3611                       TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
3612           se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
3613         }
3614       else
3615         TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
3616     }
3617
3618   fntype = TREE_TYPE (TREE_TYPE (se->expr));
3619   se->expr = build_call_vec (TREE_TYPE (fntype), se->expr, arglist);
3620
3621   /* If we have a pointer function, but we don't want a pointer, e.g.
3622      something like
3623         x = f()
3624      where f is pointer valued, we have to dereference the result.  */
3625   if (!se->want_pointer && !byref
3626       && ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3627           || (comp && (comp->attr.pointer || comp->attr.allocatable))))
3628     se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
3629
3630   /* f2c calling conventions require a scalar default real function to
3631      return a double precision result.  Convert this back to default
3632      real.  We only care about the cases that can happen in Fortran 77.
3633   */
3634   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
3635       && sym->ts.kind == gfc_default_real_kind
3636       && !sym->attr.always_explicit)
3637     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
3638
3639   /* A pure function may still have side-effects - it may modify its
3640      parameters.  */
3641   TREE_SIDE_EFFECTS (se->expr) = 1;
3642 #if 0
3643   if (!sym->attr.pure)
3644     TREE_SIDE_EFFECTS (se->expr) = 1;
3645 #endif
3646
3647   if (byref)
3648     {
3649       /* Add the function call to the pre chain.  There is no expression.  */
3650       gfc_add_expr_to_block (&se->pre, se->expr);
3651       se->expr = NULL_TREE;
3652
3653       if (!se->direct_byref)
3654         {
3655           if ((sym->attr.dimension && !comp) || (comp && comp->attr.dimension))
3656             {
3657               if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
3658                 {
3659                   /* Check the data pointer hasn't been modified.  This would
3660                      happen in a function returning a pointer.  */
3661                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
3662                   tmp = fold_build2_loc (input_location, NE_EXPR,
3663                                          boolean_type_node,
3664                                          tmp, info->data);
3665                   gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
3666                                            gfc_msg_fault);
3667                 }
3668               se->expr = info->descriptor;
3669               /* Bundle in the string length.  */
3670               se->string_length = len;
3671             }
3672           else if (ts.type == BT_CHARACTER)
3673             {
3674               /* Dereference for character pointer results.  */
3675               if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3676                   || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3677                 se->expr = build_fold_indirect_ref_loc (input_location, var);
3678               else
3679                 se->expr = var;
3680
3681               if (!ts.deferred)
3682                 se->string_length = len;
3683               else if (sym->attr.allocatable || sym->attr.pointer)
3684                 se->string_length = cl.backend_decl;
3685             }
3686           else
3687             {
3688               gcc_assert (ts.type == BT_COMPLEX && gfc_option.flag_f2c);
3689               se->expr = build_fold_indirect_ref_loc (input_location, var);
3690             }
3691         }
3692     }
3693
3694   /* Follow the function call with the argument post block.  */
3695   if (byref)
3696     {
3697       gfc_add_block_to_block (&se->pre, &post);
3698
3699       /* Transformational functions of derived types with allocatable
3700          components must have the result allocatable components copied.  */
3701       arg = expr->value.function.actual;
3702       if (result && arg && expr->rank
3703             && expr->value.function.isym
3704             && expr->value.function.isym->transformational
3705             && arg->expr->ts.type == BT_DERIVED
3706             && arg->expr->ts.u.derived->attr.alloc_comp)
3707         {
3708           tree tmp2;
3709           /* Copy the allocatable components.  We have to use a
3710              temporary here to prevent source allocatable components
3711              from being corrupted.  */
3712           tmp2 = gfc_evaluate_now (result, &se->pre);
3713           tmp = gfc_copy_alloc_comp (arg->expr->ts.u.derived,
3714                                      result, tmp2, expr->rank);
3715           gfc_add_expr_to_block (&se->pre, tmp);
3716           tmp = gfc_copy_allocatable_data (result, tmp2, TREE_TYPE(tmp2),
3717                                            expr->rank);
3718           gfc_add_expr_to_block (&se->pre, tmp);
3719
3720           /* Finally free the temporary's data field.  */
3721           tmp = gfc_conv_descriptor_data_get (tmp2);
3722           tmp = gfc_deallocate_with_status (tmp, NULL_TREE, true, NULL);
3723           gfc_add_expr_to_block (&se->pre, tmp);
3724         }
3725     }
3726   else
3727     gfc_add_block_to_block (&se->post, &post);
3728
3729   return has_alternate_specifier;
3730 }
3731
3732
3733 /* Fill a character string with spaces.  */
3734
3735 static tree
3736 fill_with_spaces (tree start, tree type, tree size)
3737 {
3738   stmtblock_t block, loop;
3739   tree i, el, exit_label, cond, tmp;
3740
3741   /* For a simple char type, we can call memset().  */
3742   if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
3743     return build_call_expr_loc (input_location,
3744                             built_in_decls[BUILT_IN_MEMSET], 3, start,
3745                             build_int_cst (gfc_get_int_type (gfc_c_int_kind),
3746                                            lang_hooks.to_target_charset (' ')),
3747                             size);
3748
3749   /* Otherwise, we use a loop:
3750         for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
3751           *el = (type) ' ';
3752    */
3753
3754   /* Initialize variables.  */
3755   gfc_init_block (&block);
3756   i = gfc_create_var (sizetype, "i");
3757   gfc_add_modify (&block, i, fold_convert (sizetype, size));
3758   el = gfc_create_var (build_pointer_type (type), "el");
3759   gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
3760   exit_label = gfc_build_label_decl (NULL_TREE);
3761   TREE_USED (exit_label) = 1;
3762
3763
3764   /* Loop body.  */
3765   gfc_init_block (&loop);
3766
3767   /* Exit condition.  */
3768   cond = fold_build2_loc (input_location, LE_EXPR, boolean_type_node, i,
3769                           build_zero_cst (sizetype));
3770   tmp = build1_v (GOTO_EXPR, exit_label);
3771   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
3772                          build_empty_stmt (input_location));
3773   gfc_add_expr_to_block (&loop, tmp);
3774
3775   /* Assignment.  */
3776   gfc_add_modify (&loop,
3777                   fold_build1_loc (input_location, INDIRECT_REF, type, el),
3778                   build_int_cst (type, lang_hooks.to_target_charset (' ')));
3779
3780   /* Increment loop variables.  */
3781   gfc_add_modify (&loop, i,
3782                   fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
3783                                    TYPE_SIZE_UNIT (type)));
3784   gfc_add_modify (&loop, el,
3785                   fold_build2_loc (input_location, POINTER_PLUS_EXPR,
3786                                    TREE_TYPE (el), el, TYPE_SIZE_UNIT (type)));
3787
3788   /* Making the loop... actually loop!  */
3789   tmp = gfc_finish_block (&loop);
3790   tmp = build1_v (LOOP_EXPR, tmp);
3791   gfc_add_expr_to_block (&block, tmp);
3792
3793   /* The exit label.  */
3794   tmp = build1_v (LABEL_EXPR, exit_label);
3795   gfc_add_expr_to_block (&block, tmp);
3796
3797
3798   return gfc_finish_block (&block);
3799 }
3800
3801
3802 /* Generate code to copy a string.  */
3803
3804 void
3805 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
3806                        int dkind, tree slength, tree src, int skind)
3807 {
3808   tree tmp, dlen, slen;
3809   tree dsc;
3810   tree ssc;
3811   tree cond;
3812   tree cond2;
3813   tree tmp2;
3814   tree tmp3;
3815   tree tmp4;
3816   tree chartype;
3817   stmtblock_t tempblock;
3818
3819   gcc_assert (dkind == skind);
3820
3821   if (slength != NULL_TREE)
3822     {
3823       slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
3824       ssc = gfc_string_to_single_character (slen, src, skind);
3825     }
3826   else
3827     {
3828       slen = build_int_cst (size_type_node, 1);
3829       ssc =  src;
3830     }
3831
3832   if (dlength != NULL_TREE)
3833     {
3834       dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
3835       dsc = gfc_string_to_single_character (dlen, dest, dkind);
3836     }
3837   else
3838     {
3839       dlen = build_int_cst (size_type_node, 1);
3840       dsc =  dest;
3841     }
3842
3843   /* Assign directly if the types are compatible.  */
3844   if (dsc != NULL_TREE && ssc != NULL_TREE
3845       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
3846     {
3847       gfc_add_modify (block, dsc, ssc);
3848       return;
3849     }
3850
3851   /* Do nothing if the destination length is zero.  */
3852   cond = fold_build2_loc (input_location, GT_EXPR, boolean_type_node, dlen,
3853                           build_int_cst (size_type_node, 0));
3854
3855   /* The following code was previously in _gfortran_copy_string:
3856
3857        // The two strings may overlap so we use memmove.
3858        void
3859        copy_string (GFC_INTEGER_4 destlen, char * dest,
3860                     GFC_INTEGER_4 srclen, const char * src)
3861        {
3862          if (srclen >= destlen)
3863            {
3864              // This will truncate if too long.
3865              memmove (dest, src, destlen);
3866            }
3867          else
3868            {
3869              memmove (dest, src, srclen);
3870              // Pad with spaces.
3871              memset (&dest[srclen], ' ', destlen - srclen);
3872            }
3873        }
3874
3875      We're now doing it here for better optimization, but the logic
3876      is the same.  */
3877
3878   /* For non-default character kinds, we have to multiply the string
3879      length by the base type size.  */
3880   chartype = gfc_get_char_type (dkind);
3881   slen = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
3882                           fold_convert (size_type_node, slen),
3883                           fold_convert (size_type_node,
3884                                         TYPE_SIZE_UNIT (chartype)));
3885   dlen = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
3886                           fold_convert (size_type_node, dlen),
3887                           fold_convert (size_type_node,
3888                                         TYPE_SIZE_UNIT (chartype)));
3889
3890   if (dlength && POINTER_TYPE_P (TREE_TYPE (dest)))
3891     dest = fold_convert (pvoid_type_node, dest);
3892   else
3893     dest = gfc_build_addr_expr (pvoid_type_node, dest);
3894
3895   if (slength && POINTER_TYPE_P (TREE_TYPE (src)))
3896     src = fold_convert (pvoid_type_node, src);
3897   else
3898     src = gfc_build_addr_expr (pvoid_type_node, src);
3899
3900   /* Truncate string if source is too long.  */
3901   cond2 = fold_build2_loc (input_location, GE_EXPR, boolean_type_node, slen,
3902                            dlen);
3903   tmp2 = build_call_expr_loc (input_location,
3904                           built_in_decls[BUILT_IN_MEMMOVE],
3905                           3, dest, src, dlen);
3906
3907   /* Else copy and pad with spaces.  */
3908   tmp3 = build_call_expr_loc (input_location,
3909                           built_in_decls[BUILT_IN_MEMMOVE],
3910                           3, dest, src, slen);
3911
3912   tmp4 = fold_build2_loc (input_location, POINTER_PLUS_EXPR, TREE_TYPE (dest),
3913                           dest, fold_convert (sizetype, slen));
3914   tmp4 = fill_with_spaces (tmp4, chartype,
3915                            fold_build2_loc (input_location, MINUS_EXPR,
3916                                             TREE_TYPE(dlen), dlen, slen));
3917
3918   gfc_init_block (&tempblock);
3919   gfc_add_expr_to_block (&tempblock, tmp3);
3920   gfc_add_expr_to_block (&tempblock, tmp4);
3921   tmp3 = gfc_finish_block (&tempblock);
3922
3923   /* The whole copy_string function is there.  */
3924   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond2,
3925                          tmp2, tmp3);
3926   tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, tmp,
3927                          build_empty_stmt (input_location));
3928   gfc_add_expr_to_block (block, tmp);
3929 }
3930
3931
3932 /* Translate a statement function.
3933    The value of a statement function reference is obtained by evaluating the
3934    expression using the values of the actual arguments for the values of the
3935    corresponding dummy arguments.  */
3936
3937 static void
3938 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
3939 {
3940   gfc_symbol *sym;
3941   gfc_symbol *fsym;
3942   gfc_formal_arglist *fargs;
3943   gfc_actual_arglist *args;
3944   gfc_se lse;
3945   gfc_se rse;
3946   gfc_saved_var *saved_vars;
3947   tree *temp_vars;
3948   tree type;
3949   tree tmp;
3950   int n;
3951
3952   sym = expr->symtree->n.sym;
3953   args = expr->value.function.actual;
3954   gfc_init_se (&lse, NULL);
3955   gfc_init_se (&rse, NULL);
3956
3957   n = 0;
3958   for (fargs = sym->formal; fargs; fargs = fargs->next)
3959     n++;
3960   saved_vars = XCNEWVEC (gfc_saved_var, n);
3961   temp_vars = XCNEWVEC (tree, n);
3962
3963   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3964     {
3965       /* Each dummy shall be specified, explicitly or implicitly, to be
3966          scalar.  */
3967       gcc_assert (fargs->sym->attr.dimension == 0);
3968       fsym = fargs->sym;
3969
3970       if (fsym->ts.type == BT_CHARACTER)
3971         {
3972           /* Copy string arguments.  */
3973           tree arglen;
3974
3975           gcc_assert (fsym->ts.u.cl && fsym->ts.u.cl->length
3976                       && fsym->ts.u.cl->length->expr_type == EXPR_CONSTANT);
3977
3978           /* Create a temporary to hold the value.  */
3979           if (fsym->ts.u.cl->backend_decl == NULL_TREE)
3980              fsym->ts.u.cl->backend_decl
3981                 = gfc_conv_constant_to_tree (fsym->ts.u.cl->length);
3982
3983           type = gfc_get_character_type (fsym->ts.kind, fsym->ts.u.cl);
3984           temp_vars[n] = gfc_create_var (type, fsym->name);
3985
3986           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3987
3988           gfc_conv_expr (&rse, args->expr);
3989           gfc_conv_string_parameter (&rse);
3990           gfc_add_block_to_block (&se->pre, &lse.pre);
3991           gfc_add_block_to_block (&se->pre, &rse.pre);
3992
3993           gfc_trans_string_copy (&se->pre, arglen, temp_vars[n], fsym->ts.kind,
3994                                  rse.string_length, rse.expr, fsym->ts.kind);
3995           gfc_add_block_to_block (&se->pre, &lse.post);
3996           gfc_add_block_to_block (&se->pre, &rse.post);
3997         }
3998       else
3999         {
4000           /* For everything else, just evaluate the expression.  */
4001
4002           /* Create a temporary to hold the value.  */
4003           type = gfc_typenode_for_spec (&fsym->ts);
4004           temp_vars[n] = gfc_create_var (type, fsym->name);
4005
4006           gfc_conv_expr (&lse, args->expr);
4007
4008           gfc_add_block_to_block (&se->pre, &lse.pre);
4009           gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
4010           gfc_add_block_to_block (&se->pre, &lse.post);
4011         }
4012
4013       args = args->next;
4014     }
4015
4016   /* Use the temporary variables in place of the real ones.  */
4017   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
4018     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
4019
4020   gfc_conv_expr (se, sym->value);
4021
4022   if (sym->ts.type == BT_CHARACTER)
4023     {
4024       gfc_conv_const_charlen (sym->ts.u.cl);
4025
4026       /* Force the expression to the correct length.  */
4027       if (!INTEGER_CST_P (se->string_length)
4028           || tree_int_cst_lt (se->string_length,
4029                               sym->ts.u.cl->backend_decl))
4030         {
4031           type = gfc_get_character_type (sym->ts.kind, sym->ts.u.cl);
4032           tmp = gfc_create_var (type, sym->name);
4033           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
4034           gfc_trans_string_copy (&se->pre, sym->ts.u.cl->backend_decl, tmp,
4035                                  sym->ts.kind, se->string_length, se->expr,
4036                                  sym->ts.kind);
4037           se->expr = tmp;
4038         }
4039       se->string_length = sym->ts.u.cl->backend_decl;
4040     }
4041
4042   /* Restore the original variables.  */
4043   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
4044     gfc_restore_sym (fargs->sym, &saved_vars[n]);
4045   free (saved_vars);
4046 }
4047
4048
4049 /* Translate a function expression.  */
4050
4051 static void
4052 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
4053 {
4054   gfc_symbol *sym;
4055
4056   if (expr->value.function.isym)
4057     {
4058       gfc_conv_intrinsic_function (se, expr);
4059       return;
4060     }
4061
4062   /* We distinguish statement functions from general functions to improve
4063      runtime performance.  */
4064   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
4065     {
4066       gfc_conv_statement_function (se, expr);
4067       return;
4068     }
4069
4070   /* expr.value.function.esym is the resolved (specific) function symbol for
4071      most functions.  However this isn't set for dummy procedures.  */
4072   sym = expr->value.function.esym;
4073   if (!sym)
4074     sym = expr->symtree->n.sym;
4075
4076   gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr, NULL);
4077 }
4078
4079
4080 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
4081
4082 static bool
4083 is_zero_initializer_p (gfc_expr * expr)
4084 {
4085   if (expr->expr_type != EXPR_CONSTANT)
4086     return false;
4087
4088   /* We ignore constants with prescribed memory representations for now.  */
4089   if (expr->representation.string)
4090     return false;
4091
4092   switch (expr->ts.type)
4093     {
4094     case BT_INTEGER:
4095       return mpz_cmp_si (expr->value.integer, 0) == 0;
4096
4097     case BT_REAL:
4098       return mpfr_zero_p (expr->value.real)
4099              && MPFR_SIGN (expr->value.real) >= 0;
4100
4101     case BT_LOGICAL:
4102       return expr->value.logical == 0;
4103
4104     case BT_COMPLEX:
4105       return mpfr_zero_p (mpc_realref (expr->value.complex))
4106              && MPFR_SIGN (mpc_realref (expr->value.complex)) >= 0
4107              && mpfr_zero_p (mpc_imagref (expr->value.complex))
4108              && MPFR_SIGN (mpc_imagref (expr->value.complex)) >= 0;
4109
4110     default:
4111       break;
4112     }
4113   return false;
4114 }
4115
4116
4117 static void
4118 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
4119 {
4120   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
4121   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
4122
4123   gfc_conv_tmp_array_ref (se);
4124 }
4125
4126
4127 /* Build a static initializer.  EXPR is the expression for the initial value.
4128    The other parameters describe the variable of the component being 
4129    initialized. EXPR may be null.  */
4130
4131 tree
4132 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
4133                       bool array, bool pointer, bool procptr)
4134 {
4135   gfc_se se;
4136
4137   if (!(expr || pointer || procptr))
4138     return NULL_TREE;
4139
4140   /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
4141      (these are the only two iso_c_binding derived types that can be
4142      used as initialization expressions).  If so, we need to modify
4143      the 'expr' to be that for a (void *).  */
4144   if (expr != NULL && expr->ts.type == BT_DERIVED
4145       && expr->ts.is_iso_c && expr->ts.u.derived)
4146     {
4147       gfc_symbol *derived = expr->ts.u.derived;
4148
4149       /* The derived symbol has already been converted to a (void *).  Use
4150          its kind.  */
4151       expr = gfc_get_int_expr (derived->ts.kind, NULL, 0);
4152       expr->ts.f90_type = derived->ts.f90_type;
4153
4154       gfc_init_se (&se, NULL);
4155       gfc_conv_constant (&se, expr);
4156       gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
4157       return se.expr;
4158     }
4159   
4160   if (array && !procptr)
4161     {
4162       tree ctor;
4163       /* Arrays need special handling.  */
4164       if (pointer)
4165         ctor = gfc_build_null_descriptor (type);
4166       /* Special case assigning an array to zero.  */
4167       else if (is_zero_initializer_p (expr))
4168         ctor = build_constructor (type, NULL);
4169       else
4170         ctor = gfc_conv_array_initializer (type, expr);
4171       TREE_STATIC (ctor) = 1;
4172       return ctor;
4173     }
4174   else if (pointer || procptr)
4175     {
4176       if (!expr || expr->expr_type == EXPR_NULL)
4177         return fold_convert (type, null_pointer_node);
4178       else
4179         {
4180           gfc_init_se (&se, NULL);
4181           se.want_pointer = 1;
4182           gfc_conv_expr (&se, expr);
4183           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
4184           return se.expr;
4185         }
4186     }
4187   else
4188     {
4189       switch (ts->type)
4190         {
4191         case BT_DERIVED:
4192         case BT_CLASS:
4193           gfc_init_se (&se, NULL);
4194           if (ts->type == BT_CLASS && expr->expr_type == EXPR_NULL)
4195             gfc_conv_structure (&se, gfc_class_null_initializer(ts), 1);
4196           else
4197             gfc_conv_structure (&se, expr, 1);
4198           gcc_assert (TREE_CODE (se.expr) == CONSTRUCTOR);
4199           TREE_STATIC (se.expr) = 1;
4200           return se.expr;
4201
4202         case BT_CHARACTER:
4203           {
4204             tree ctor = gfc_conv_string_init (ts->u.cl->backend_decl,expr);
4205             TREE_STATIC (ctor) = 1;
4206             return ctor;
4207           }
4208
4209         default:
4210           gfc_init_se (&se, NULL);
4211           gfc_conv_constant (&se, expr);
4212           gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
4213           return se.expr;
4214         }
4215     }
4216 }
4217   
4218 static tree
4219 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
4220 {
4221   gfc_se rse;
4222   gfc_se lse;
4223   gfc_ss *rss;
4224   gfc_ss *lss;
4225   stmtblock_t body;
4226   stmtblock_t block;
4227   gfc_loopinfo loop;
4228   int n;
4229   tree tmp;
4230
4231   gfc_start_block (&block);
4232
4233   /* Initialize the scalarizer.  */
4234   gfc_init_loopinfo (&loop);
4235
4236   gfc_init_se (&lse, NULL);
4237   gfc_init_se (&rse, NULL);
4238
4239   /* Walk the rhs.  */
4240   rss = gfc_walk_expr (expr);
4241   if (rss == gfc_ss_terminator)
4242     {
4243       /* The rhs is scalar.  Add a ss for the expression.  */
4244       rss = gfc_get_ss ();
4245       rss->next = gfc_ss_terminator;
4246       rss->type = GFC_SS_SCALAR;
4247       rss->expr = expr;
4248     }
4249
4250   /* Create a SS for the destination.  */
4251   lss = gfc_get_ss ();
4252   lss->type = GFC_SS_COMPONENT;
4253   lss->expr = NULL;
4254   lss->shape = gfc_get_shape (cm->as->rank);
4255   lss->next = gfc_ss_terminator;
4256   lss->data.info.dimen = cm->as->rank;
4257   lss->data.info.descriptor = dest;
4258   lss->data.info.data = gfc_conv_array_data (dest);
4259   lss->data.info.offset = gfc_conv_array_offset (dest);
4260   for (n = 0; n < cm->as->rank; n++)
4261     {
4262       lss->data.info.dim[n] = n;
4263       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
4264       lss->data.info.stride[n] = gfc_index_one_node;
4265
4266       mpz_init (lss->shape[n]);
4267       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
4268                cm->as->lower[n]->value.integer);
4269       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
4270     }
4271   
4272   /* Associate the SS with the loop.  */
4273   gfc_add_ss_to_loop (&loop, lss);
4274   gfc_add_ss_to_loop (&loop, rss);
4275
4276   /* Calculate the bounds of the scalarization.  */
4277   gfc_conv_ss_startstride (&loop);
4278
4279   /* Setup the scalarizing loops.  */
4280   gfc_conv_loop_setup (&loop, &expr->where);
4281
4282   /* Setup the gfc_se structures.  */
4283   gfc_copy_loopinfo_to_se (&lse, &loop);
4284   gfc_copy_loopinfo_to_se (&rse, &loop);
4285
4286   rse.ss = rss;
4287   gfc_mark_ss_chain_used (rss, 1);
4288   lse.ss = lss;
4289   gfc_mark_ss_chain_used (lss, 1);
4290
4291   /* Start the scalarized loop body.  */
4292   gfc_start_scalarized_body (&loop, &body);
4293
4294   gfc_conv_tmp_array_ref (&lse);
4295   if (cm->ts.type == BT_CHARACTER)
4296     lse.string_length = cm->ts.u.cl->backend_decl;
4297
4298   gfc_conv_expr (&rse, expr);
4299
4300   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false, true);
4301   gfc_add_expr_to_block (&body, tmp);
4302
4303   gcc_assert (rse.ss == gfc_ss_terminator);
4304
4305   /* Generate the copying loops.  */
4306   gfc_trans_scalarizing_loops (&loop, &body);
4307
4308   /* Wrap the whole thing up.  */
4309   gfc_add_block_to_block (&block, &loop.pre);
4310   gfc_add_block_to_block (&block, &loop.post);
4311
4312   for (n = 0; n < cm->as->rank; n++)
4313     mpz_clear (lss->shape[n]);
4314   free (lss->shape);
4315
4316   gfc_cleanup_loop (&loop);
4317
4318   return gfc_finish_block (&block);
4319 }
4320
4321
4322 static tree
4323 gfc_trans_alloc_subarray_assign (tree dest, gfc_component * cm,
4324                                  gfc_expr * expr)
4325 {
4326   gfc_se se;
4327   gfc_ss *rss;
4328   stmtblock_t block;
4329   tree offset;
4330   int n;
4331   tree tmp;
4332   tree tmp2;
4333   gfc_array_spec *as;
4334   gfc_expr *arg = NULL;
4335
4336   gfc_start_block (&block);
4337   gfc_init_se (&se, NULL);
4338
4339   /* Get the descriptor for the expressions.  */ 
4340   rss = gfc_walk_expr (expr);
4341   se.want_pointer = 0;
4342   gfc_conv_expr_descriptor (&se, expr, rss);
4343   gfc_add_block_to_block (&block, &se.pre);
4344   gfc_add_modify (&block, dest, se.expr);
4345
4346   /* Deal with arrays of derived types with allocatable components.  */
4347   if (cm->ts.type == BT_DERIVED
4348         && cm->ts.u.derived->attr.alloc_comp)
4349     tmp = gfc_copy_alloc_comp (cm->ts.u.derived,
4350                                se.expr, dest,
4351                                cm->as->rank);
4352   else
4353     tmp = gfc_duplicate_allocatable (dest, se.expr,
4354                                      TREE_TYPE(cm->backend_decl),
4355                                      cm->as->rank);
4356
4357   gfc_add_expr_to_block (&block, tmp);
4358   gfc_add_block_to_block (&block, &se.post);
4359
4360   if (expr->expr_type != EXPR_VARIABLE)
4361     gfc_conv_descriptor_data_set (&block, se.expr,
4362                                   null_pointer_node);
4363
4364   /* We need to know if the argument of a conversion function is a
4365      variable, so that the correct lower bound can be used.  */
4366   if (expr->expr_type == EXPR_FUNCTION
4367         && expr->value.function.isym
4368         && expr->value.function.isym->conversion
4369         && expr->value.function.actual->expr
4370         && expr->value.function.actual->expr->expr_type == EXPR_VARIABLE)
4371     arg = expr->value.function.actual->expr;
4372
4373   /* Obtain the array spec of full array references.  */
4374   if (arg)
4375     as = gfc_get_full_arrayspec_from_expr (arg);
4376   else
4377     as = gfc_get_full_arrayspec_from_expr (expr);
4378
4379   /* Shift the lbound and ubound of temporaries to being unity,
4380      rather than zero, based. Always calculate the offset.  */
4381   offset = gfc_conv_descriptor_offset_get (dest);
4382   gfc_add_modify (&block, offset, gfc_index_zero_node);
4383   tmp2 =gfc_create_var (gfc_array_index_type, NULL);
4384
4385   for (n = 0; n < expr->rank; n++)
4386     {
4387       tree span;
4388       tree lbound;
4389
4390       /* Obtain the correct lbound - ISO/IEC TR 15581:2001 page 9.
4391          TODO It looks as if gfc_conv_expr_descriptor should return
4392          the correct bounds and that the following should not be
4393          necessary.  This would simplify gfc_conv_intrinsic_bound
4394          as well.  */
4395       if (as && as->lower[n])
4396         {
4397           gfc_se lbse;
4398           gfc_init_se (&lbse, NULL);
4399           gfc_conv_expr (&lbse, as->lower[n]);
4400           gfc_add_block_to_block (&block, &lbse.pre);
4401           lbound = gfc_evaluate_now (lbse.expr, &block);
4402         }
4403       else if (as && arg)
4404         {
4405           tmp = gfc_get_symbol_decl (arg->symtree->n.sym);
4406           lbound = gfc_conv_descriptor_lbound_get (tmp,
4407                                         gfc_rank_cst[n]);
4408         }
4409       else if (as)
4410         lbound = gfc_conv_descriptor_lbound_get (dest,
4411                                                 gfc_rank_cst[n]);
4412       else
4413         lbound = gfc_index_one_node;
4414
4415       lbound = fold_convert (gfc_array_index_type, lbound);
4416
4417       /* Shift the bounds and set the offset accordingly.  */
4418       tmp = gfc_conv_descriptor_ubound_get (dest, gfc_rank_cst[n]);
4419       span = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
4420                 tmp, gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]));
4421       tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
4422                              span, lbound);
4423       gfc_conv_descriptor_ubound_set (&block, dest,
4424                                       gfc_rank_cst[n], tmp);
4425       gfc_conv_descriptor_lbound_set (&block, dest,
4426                                       gfc_rank_cst[n], lbound);
4427
4428       tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
4429                          gfc_conv_descriptor_lbound_get (dest,
4430                                                          gfc_rank_cst[n]),
4431                          gfc_conv_descriptor_stride_get (dest,
4432                                                          gfc_rank_cst[n]));
4433       gfc_add_modify (&block, tmp2, tmp);
4434       tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
4435                              offset, tmp2);
4436       gfc_conv_descriptor_offset_set (&block, dest, tmp);
4437     }
4438
4439   if (arg)
4440     {
4441       /* If a conversion expression has a null data pointer
4442          argument, nullify the allocatable component.  */
4443       tree non_null_expr;
4444       tree null_expr;
4445
4446       if (arg->symtree->n.sym->attr.allocatable
4447             || arg->symtree->n.sym->attr.pointer)
4448         {
4449           non_null_expr = gfc_finish_block (&block);
4450           gfc_start_block (&block);
4451           gfc_conv_descriptor_data_set (&block, dest,
4452                                         null_pointer_node);
4453           null_expr = gfc_finish_block (&block);
4454           tmp = gfc_conv_descriptor_data_get (arg->symtree->n.sym->backend_decl);
4455           tmp = build2_loc (input_location, EQ_EXPR, boolean_type_node, tmp,
4456                             fold_convert (TREE_TYPE (tmp), null_pointer_node));
4457           return build3_v (COND_EXPR, tmp,
4458                            null_expr, non_null_expr);
4459         }
4460     }
4461
4462   return gfc_finish_block (&block);
4463 }
4464
4465
4466 /* Assign a single component of a derived type constructor.  */
4467
4468 static tree
4469 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
4470 {
4471   gfc_se se;
4472   gfc_se lse;
4473   gfc_ss *rss;
4474   stmtblock_t block;
4475   tree tmp;
4476
4477   gfc_start_block (&block);
4478
4479   if (cm->attr.pointer)
4480     {
4481       gfc_init_se (&se, NULL);
4482       /* Pointer component.  */
4483       if (cm->attr.dimension)
4484         {
4485           /* Array pointer.  */
4486           if (expr->expr_type == EXPR_NULL)
4487             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4488           else
4489             {
4490               rss = gfc_walk_expr (expr);
4491               se.direct_byref = 1;
4492               se.expr = dest;
4493               gfc_conv_expr_descriptor (&se, expr, rss);
4494               gfc_add_block_to_block (&block, &se.pre);
4495               gfc_add_block_to_block (&block, &se.post);
4496             }
4497         }
4498       else
4499         {
4500           /* Scalar pointers.  */
4501           se.want_pointer = 1;
4502           gfc_conv_expr (&se, expr);
4503           gfc_add_block_to_block (&block, &se.pre);
4504           gfc_add_modify (&block, dest,
4505                                fold_convert (TREE_TYPE (dest), se.expr));
4506           gfc_add_block_to_block (&block, &se.post);
4507         }
4508     }
4509   else if (cm->ts.type == BT_CLASS && expr->expr_type == EXPR_NULL)
4510     {
4511       /* NULL initialization for CLASS components.  */
4512       tmp = gfc_trans_structure_assign (dest,
4513                                         gfc_class_null_initializer (&cm->ts));
4514       gfc_add_expr_to_block (&block, tmp);
4515     }
4516   else if (cm->attr.dimension && !cm->attr.proc_pointer)
4517     {
4518       if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
4519         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4520       else if (cm->attr.allocatable)
4521         {
4522           tmp = gfc_trans_alloc_subarray_assign (dest, cm, expr);
4523           gfc_add_expr_to_block (&block, tmp);
4524         }
4525       else
4526         {
4527           tmp = gfc_trans_subarray_assign (dest, cm, expr);
4528           gfc_add_expr_to_block (&block, tmp);
4529         }
4530     }
4531   else if (expr->ts.type == BT_DERIVED)
4532     {
4533       if (expr->expr_type != EXPR_STRUCTURE)
4534         {
4535           gfc_init_se (&se, NULL);
4536           gfc_conv_expr (&se, expr);
4537           gfc_add_block_to_block (&block, &se.pre);
4538           gfc_add_modify (&block, dest,
4539                                fold_convert (TREE_TYPE (dest), se.expr));
4540           gfc_add_block_to_block (&block, &se.post);
4541         }
4542       else
4543         {
4544           /* Nested constructors.  */
4545           tmp = gfc_trans_structure_assign (dest, expr);
4546           gfc_add_expr_to_block (&block, tmp);
4547         }
4548     }
4549   else
4550     {
4551       /* Scalar component.  */
4552       gfc_init_se (&se, NULL);
4553       gfc_init_se (&lse, NULL);
4554
4555       gfc_conv_expr (&se, expr);
4556       if (cm->ts.type == BT_CHARACTER)
4557         lse.string_length = cm->ts.u.cl->backend_decl;
4558       lse.expr = dest;
4559       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false, true);
4560       gfc_add_expr_to_block (&block, tmp);
4561     }
4562   return gfc_finish_block (&block);
4563 }
4564
4565 /* Assign a derived type constructor to a variable.  */
4566
4567 static tree
4568 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
4569 {
4570   gfc_constructor *c;
4571   gfc_component *cm;
4572   stmtblock_t block;
4573   tree field;
4574   tree tmp;
4575
4576   gfc_start_block (&block);
4577   cm = expr->ts.u.derived->components;
4578
4579   if (expr->ts.u.derived->from_intmod == INTMOD_ISO_C_BINDING
4580       && (expr->ts.u.derived->intmod_sym_id == ISOCBINDING_PTR
4581           || expr->ts.u.derived->intmod_sym_id == ISOCBINDING_FUNPTR))
4582     {
4583       gfc_se se, lse;
4584
4585       gcc_assert (cm->backend_decl == NULL);
4586       gfc_init_se (&se, NULL);
4587       gfc_init_se (&lse, NULL);
4588       gfc_conv_expr (&se, gfc_constructor_first (expr->value.constructor)->expr);
4589       lse.expr = dest;
4590       gfc_add_modify (&block, lse.expr,
4591                       fold_convert (TREE_TYPE (lse.expr), se.expr));
4592
4593       return gfc_finish_block (&block);
4594     } 
4595
4596   for (c = gfc_constructor_first (expr->value.constructor);
4597        c; c = gfc_constructor_next (c), cm = cm->next)
4598     {
4599       /* Skip absent members in default initializers.  */
4600       if (!c->expr)
4601         continue;
4602
4603       field = cm->backend_decl;
4604       tmp = fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
4605                              dest, field, NULL_TREE);
4606       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
4607       gfc_add_expr_to_block (&block, tmp);
4608     }
4609   return gfc_finish_block (&block);
4610 }
4611
4612 /* Build an expression for a constructor. If init is nonzero then
4613    this is part of a static variable initializer.  */
4614
4615 void
4616 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
4617 {
4618   gfc_constructor *c;
4619   gfc_component *cm;
4620   tree val;
4621   tree type;
4622   tree tmp;
4623   VEC(constructor_elt,gc) *v = NULL;
4624
4625   gcc_assert (se->ss == NULL);
4626   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
4627   type = gfc_typenode_for_spec (&expr->ts);
4628
4629   if (!init)
4630     {
4631       /* Create a temporary variable and fill it in.  */
4632       se->expr = gfc_create_var (type, expr->ts.u.derived->name);
4633       tmp = gfc_trans_structure_assign (se->expr, expr);
4634       gfc_add_expr_to_block (&se->pre, tmp);
4635       return;
4636     }
4637
4638   cm = expr->ts.u.derived->components;
4639
4640   for (c = gfc_constructor_first (expr->value.constructor);
4641        c; c = gfc_constructor_next (c), cm = cm->next)
4642     {
4643       /* Skip absent members in default initializers and allocatable
4644          components.  Although the latter have a default initializer
4645          of EXPR_NULL,... by default, the static nullify is not needed
4646          since this is done every time we come into scope.  */
4647       if (!c->expr || (cm->attr.allocatable && cm->attr.flavor != FL_PROCEDURE))
4648         continue;
4649
4650       if (strcmp (cm->name, "_size") == 0)
4651         {
4652           val = TYPE_SIZE_UNIT (gfc_get_derived_type (cm->ts.u.derived));
4653           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4654         }
4655       else if (cm->initializer && cm->initializer->expr_type != EXPR_NULL
4656                && strcmp (cm->name, "_extends") == 0)
4657         {
4658           tree vtab;
4659           gfc_symbol *vtabs;
4660           vtabs = cm->initializer->symtree->n.sym;
4661           vtab = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtabs));
4662           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, vtab);
4663         }
4664       else
4665         {
4666           val = gfc_conv_initializer (c->expr, &cm->ts,
4667                                       TREE_TYPE (cm->backend_decl),
4668                                       cm->attr.dimension, cm->attr.pointer,
4669                                       cm->attr.proc_pointer);
4670
4671           /* Append it to the constructor list.  */
4672           CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4673         }
4674     }
4675   se->expr = build_constructor (type, v);
4676   if (init) 
4677     TREE_CONSTANT (se->expr) = 1;
4678 }
4679
4680
4681 /* Translate a substring expression.  */
4682
4683 static void
4684 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
4685 {
4686   gfc_ref *ref;
4687
4688   ref = expr->ref;
4689
4690   gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
4691
4692   se->expr = gfc_build_wide_string_const (expr->ts.kind,
4693                                           expr->value.character.length,
4694                                           expr->value.character.string);
4695
4696   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
4697   TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
4698
4699   if (ref)
4700     gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
4701 }
4702
4703
4704 /* Entry point for expression translation.  Evaluates a scalar quantity.
4705    EXPR is the expression to be translated, and SE is the state structure if
4706    called from within the scalarized.  */
4707
4708 void
4709 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
4710 {
4711   if (se->ss && se->ss->expr == expr
4712       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
4713     {
4714       /* Substitute a scalar expression evaluated outside the scalarization
4715          loop.  */
4716       se->expr = se->ss->data.scalar.expr;
4717       if (se->ss->type == GFC_SS_REFERENCE)
4718         se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
4719       se->string_length = se->ss->string_length;
4720       gfc_advance_se_ss_chain (se);
4721       return;
4722     }
4723
4724   /* We need to convert the expressions for the iso_c_binding derived types.
4725      C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
4726      null_pointer_node.  C_PTR and C_FUNPTR are converted to match the
4727      typespec for the C_PTR and C_FUNPTR symbols, which has already been
4728      updated to be an integer with a kind equal to the size of a (void *).  */
4729   if (expr->ts.type == BT_DERIVED && expr->ts.u.derived
4730       && expr->ts.u.derived->attr.is_iso_c)
4731     {
4732       if (expr->expr_type == EXPR_VARIABLE
4733           && (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
4734               || expr->symtree->n.sym->intmod_sym_id
4735                  == ISOCBINDING_NULL_FUNPTR))
4736         {
4737           /* Set expr_type to EXPR_NULL, which will result in
4738              null_pointer_node being used below.  */
4739           expr->expr_type = EXPR_NULL;
4740         }
4741       else
4742         {
4743           /* Update the type/kind of the expression to be what the new
4744              type/kind are for the updated symbols of C_PTR/C_FUNPTR.  */
4745           expr->ts.type = expr->ts.u.derived->ts.type;
4746           expr->ts.f90_type = expr->ts.u.derived->ts.f90_type;
4747           expr->ts.kind = expr->ts.u.derived->ts.kind;
4748         }
4749     }
4750   
4751   switch (expr->expr_type)
4752     {
4753     case EXPR_OP:
4754       gfc_conv_expr_op (se, expr);
4755       break;
4756
4757     case EXPR_FUNCTION:
4758       gfc_conv_function_expr (se, expr);
4759       break;
4760
4761     case EXPR_CONSTANT:
4762       gfc_conv_constant (se, expr);
4763       break;
4764
4765     case EXPR_VARIABLE:
4766       gfc_conv_variable (se, expr);
4767       break;
4768
4769     case EXPR_NULL:
4770       se->expr = null_pointer_node;
4771       break;
4772
4773     case EXPR_SUBSTRING:
4774       gfc_conv_substring_expr (se, expr);
4775       break;
4776
4777     case EXPR_STRUCTURE:
4778       gfc_conv_structure (se, expr, 0);
4779       break;
4780
4781     case EXPR_ARRAY:
4782       gfc_conv_array_constructor_expr (se, expr);
4783       break;
4784
4785     default:
4786       gcc_unreachable ();
4787       break;
4788     }
4789 }
4790
4791 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
4792    of an assignment.  */
4793 void
4794 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
4795 {
4796   gfc_conv_expr (se, expr);
4797   /* All numeric lvalues should have empty post chains.  If not we need to
4798      figure out a way of rewriting an lvalue so that it has no post chain.  */
4799   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
4800 }
4801
4802 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
4803    numeric expressions.  Used for scalar values where inserting cleanup code
4804    is inconvenient.  */
4805 void
4806 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
4807 {
4808   tree val;
4809
4810   gcc_assert (expr->ts.type != BT_CHARACTER);
4811   gfc_conv_expr (se, expr);
4812   if (se->post.head)
4813     {
4814       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
4815       gfc_add_modify (&se->pre, val, se->expr);
4816       se->expr = val;
4817       gfc_add_block_to_block (&se->pre, &se->post);
4818     }
4819 }
4820
4821 /* Helper to translate an expression and convert it to a particular type.  */
4822 void
4823 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
4824 {
4825   gfc_conv_expr_val (se, expr);
4826   se->expr = convert (type, se->expr);
4827 }
4828
4829
4830 /* Converts an expression so that it can be passed by reference.  Scalar
4831    values only.  */
4832
4833 void
4834 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
4835 {
4836   tree var;
4837
4838   if (se->ss && se->ss->expr == expr
4839       && se->ss->type == GFC_SS_REFERENCE)
4840     {
4841       /* Returns a reference to the scalar evaluated outside the loop
4842          for this case.  */
4843       gfc_conv_expr (se, expr);
4844       return;
4845     }
4846
4847   if (expr->ts.type == BT_CHARACTER)
4848     {
4849       gfc_conv_expr (se, expr);
4850       gfc_conv_string_parameter (se);
4851       return;
4852     }
4853
4854   if (expr->expr_type == EXPR_VARIABLE)
4855     {
4856       se->want_pointer = 1;
4857       gfc_conv_expr (se, expr);
4858       if (se->post.head)
4859         {
4860           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4861           gfc_add_modify (&se->pre, var, se->expr);
4862           gfc_add_block_to_block (&se->pre, &se->post);
4863           se->expr = var;
4864         }
4865       return;
4866     }
4867
4868   if (expr->expr_type == EXPR_FUNCTION
4869       && ((expr->value.function.esym
4870            && expr->value.function.esym->result->attr.pointer
4871            && !expr->value.function.esym->result->attr.dimension)
4872           || (!expr->value.function.esym
4873               && expr->symtree->n.sym->attr.pointer
4874               && !expr->symtree->n.sym->attr.dimension)))
4875     {
4876       se->want_pointer = 1;
4877       gfc_conv_expr (se, expr);
4878       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4879       gfc_add_modify (&se->pre, var, se->expr);
4880       se->expr = var;
4881       return;
4882     }
4883
4884
4885   gfc_conv_expr (se, expr);
4886
4887   /* Create a temporary var to hold the value.  */
4888   if (TREE_CONSTANT (se->expr))
4889     {
4890       tree tmp = se->expr;
4891       STRIP_TYPE_NOPS (tmp);
4892       var = build_decl (input_location,
4893                         CONST_DECL, NULL, TREE_TYPE (tmp));
4894       DECL_INITIAL (var) = tmp;
4895       TREE_STATIC (var) = 1;
4896       pushdecl (var);
4897     }
4898   else
4899     {
4900       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4901       gfc_add_modify (&se->pre, var, se->expr);
4902     }
4903   gfc_add_block_to_block (&se->pre, &se->post);
4904
4905   /* Take the address of that value.  */
4906   se->expr = gfc_build_addr_expr (NULL_TREE, var);
4907 }
4908
4909
4910 tree
4911 gfc_trans_pointer_assign (gfc_code * code)
4912 {
4913   return gfc_trans_pointer_assignment (code->expr1, code->expr2);
4914 }
4915
4916
4917 /* Generate code for a pointer assignment.  */
4918
4919 tree
4920 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
4921 {
4922   gfc_se lse;
4923   gfc_se rse;
4924   gfc_ss *lss;
4925   gfc_ss *rss;
4926   stmtblock_t block;
4927   tree desc;
4928   tree tmp;
4929   tree decl;
4930
4931   gfc_start_block (&block);
4932
4933   gfc_init_se (&lse, NULL);
4934
4935   lss = gfc_walk_expr (expr1);
4936   rss = gfc_walk_expr (expr2);
4937   if (lss == gfc_ss_terminator)
4938     {
4939       /* Scalar pointers.  */
4940       lse.want_pointer = 1;
4941       gfc_conv_expr (&lse, expr1);
4942       gcc_assert (rss == gfc_ss_terminator);
4943       gfc_init_se (&rse, NULL);
4944       rse.want_pointer = 1;
4945       gfc_conv_expr (&rse, expr2);
4946
4947       if (expr1->symtree->n.sym->attr.proc_pointer
4948           && expr1->symtree->n.sym->attr.dummy)
4949         lse.expr = build_fold_indirect_ref_loc (input_location,
4950                                             lse.expr);
4951
4952       if (expr2->symtree && expr2->symtree->n.sym->attr.proc_pointer
4953           && expr2->symtree->n.sym->attr.dummy)
4954         rse.expr = build_fold_indirect_ref_loc (input_location,
4955                                             rse.expr);
4956
4957       gfc_add_block_to_block (&block, &lse.pre);
4958       gfc_add_block_to_block (&block, &rse.pre);
4959
4960       /* Check character lengths if character expression.  The test is only
4961          really added if -fbounds-check is enabled.  Exclude deferred
4962          character length lefthand sides.  */
4963       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL
4964           && !(expr1->ts.deferred
4965                         && (TREE_CODE (lse.string_length) == VAR_DECL))
4966           && !expr1->symtree->n.sym->attr.proc_pointer
4967           && !gfc_is_proc_ptr_comp (expr1, NULL))
4968         {
4969           gcc_assert (expr2->ts.type == BT_CHARACTER);
4970           gcc_assert (lse.string_length && rse.string_length);
4971           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4972                                        lse.string_length, rse.string_length,
4973                                        &block);
4974         }
4975
4976       /* The assignment to an deferred character length sets the string
4977          length to that of the rhs.  */
4978       if (expr1->ts.deferred && (TREE_CODE (lse.string_length) == VAR_DECL))
4979         {
4980           if (expr2->expr_type != EXPR_NULL)
4981             gfc_add_modify (&block, lse.string_length, rse.string_length);
4982           else
4983             gfc_add_modify (&block, lse.string_length,
4984                             build_int_cst (gfc_charlen_type_node, 0));
4985         }
4986
4987       gfc_add_modify (&block, lse.expr,
4988                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
4989
4990       gfc_add_block_to_block (&block, &rse.post);
4991       gfc_add_block_to_block (&block, &lse.post);
4992     }
4993   else
4994     {
4995       gfc_ref* remap;
4996       bool rank_remap;
4997       tree strlen_lhs;
4998       tree strlen_rhs = NULL_TREE;
4999
5000       /* Array pointer.  Find the last reference on the LHS and if it is an
5001          array section ref, we're dealing with bounds remapping.  In this case,
5002          set it to AR_FULL so that gfc_conv_expr_descriptor does
5003          not see it and process the bounds remapping afterwards explicitely.  */
5004       for (remap = expr1->ref; remap; remap = remap->next)
5005         if (!remap->next && remap->type == REF_ARRAY
5006             && remap->u.ar.type == AR_SECTION)
5007           {  
5008             remap->u.ar.type = AR_FULL;
5009             break;
5010           }
5011       rank_remap = (remap && remap->u.ar.end[0]);
5012
5013       gfc_conv_expr_descriptor (&lse, expr1, lss);
5014       strlen_lhs = lse.string_length;
5015       desc = lse.expr;
5016
5017       if (expr2->expr_type == EXPR_NULL)
5018         {
5019           /* Just set the data pointer to null.  */
5020           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
5021         }
5022       else if (rank_remap)
5023         {
5024           /* If we are rank-remapping, just get the RHS's descriptor and
5025              process this later on.  */
5026           gfc_init_se (&rse, NULL);
5027           rse.direct_byref = 1;
5028           rse.byref_noassign = 1;
5029           gfc_conv_expr_descriptor (&rse, expr2, rss);
5030           strlen_rhs = rse.string_length;
5031         }
5032       else if (expr2->expr_type == EXPR_VARIABLE)
5033         {
5034           /* Assign directly to the LHS's descriptor.  */
5035           lse.direct_byref = 1;
5036           gfc_conv_expr_descriptor (&lse, expr2, rss);
5037           strlen_rhs = lse.string_length;
5038
5039           /* If this is a subreference array pointer assignment, use the rhs
5040              descriptor element size for the lhs span.  */
5041           if (expr1->symtree->n.sym->attr.subref_array_pointer)
5042             {
5043               decl = expr1->symtree->n.sym->backend_decl;
5044               gfc_init_se (&rse, NULL);
5045               rse.descriptor_only = 1;
5046               gfc_conv_expr (&rse, expr2);
5047               tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
5048               tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
5049               if (!INTEGER_CST_P (tmp))
5050                 gfc_add_block_to_block (&lse.post, &rse.pre);
5051               gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
5052             }
5053         }
5054       else
5055         {
5056           /* Assign to a temporary descriptor and then copy that
5057              temporary to the pointer.  */
5058           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
5059
5060           lse.expr = tmp;
5061           lse.direct_byref = 1;
5062           gfc_conv_expr_descriptor (&lse, expr2, rss);
5063           strlen_rhs = lse.string_length;
5064           gfc_add_modify (&lse.pre, desc, tmp);
5065         }
5066
5067       gfc_add_block_to_block (&block, &lse.pre);
5068       if (rank_remap)
5069         gfc_add_block_to_block (&block, &rse.pre);
5070
5071       /* If we do bounds remapping, update LHS descriptor accordingly.  */
5072       if (remap)
5073         {
5074           int dim;
5075           gcc_assert (remap->u.ar.dimen == expr1->rank);
5076
5077           if (rank_remap)
5078             {
5079               /* Do rank remapping.  We already have the RHS's descriptor
5080                  converted in rse and now have to build the correct LHS
5081                  descriptor for it.  */
5082
5083               tree dtype, data;
5084               tree offs, stride;
5085               tree lbound, ubound;
5086
5087               /* Set dtype.  */
5088               dtype = gfc_conv_descriptor_dtype (desc);
5089               tmp = gfc_get_dtype (TREE_TYPE (desc));
5090               gfc_add_modify (&block, dtype, tmp);
5091
5092               /* Copy data pointer.  */
5093               data = gfc_conv_descriptor_data_get (rse.expr);
5094               gfc_conv_descriptor_data_set (&block, desc, data);
5095
5096               /* Copy offset but adjust it such that it would correspond
5097                  to a lbound of zero.  */
5098               offs = gfc_conv_descriptor_offset_get (rse.expr);
5099               for (dim = 0; dim < expr2->rank; ++dim)
5100                 {
5101                   stride = gfc_conv_descriptor_stride_get (rse.expr,
5102                                                            gfc_rank_cst[dim]);
5103                   lbound = gfc_conv_descriptor_lbound_get (rse.expr,
5104                                                            gfc_rank_cst[dim]);
5105                   tmp = fold_build2_loc (input_location, MULT_EXPR,
5106                                          gfc_array_index_type, stride, lbound);
5107                   offs = fold_build2_loc (input_location, PLUS_EXPR,
5108                                           gfc_array_index_type, offs, tmp);
5109                 }
5110               gfc_conv_descriptor_offset_set (&block, desc, offs);
5111
5112               /* Set the bounds as declared for the LHS and calculate strides as
5113                  well as another offset update accordingly.  */
5114               stride = gfc_conv_descriptor_stride_get (rse.expr,
5115                                                        gfc_rank_cst[0]);
5116               for (dim = 0; dim < expr1->rank; ++dim)
5117                 {
5118                   gfc_se lower_se;
5119                   gfc_se upper_se;
5120
5121                   gcc_assert (remap->u.ar.start[dim] && remap->u.ar.end[dim]);
5122
5123                   /* Convert declared bounds.  */
5124                   gfc_init_se (&lower_se, NULL);
5125                   gfc_init_se (&upper_se, NULL);
5126                   gfc_conv_expr (&lower_se, remap->u.ar.start[dim]);
5127                   gfc_conv_expr (&upper_se, remap->u.ar.end[dim]);
5128
5129                   gfc_add_block_to_block (&block, &lower_se.pre);
5130                   gfc_add_block_to_block (&block, &upper_se.pre);
5131
5132                   lbound = fold_convert (gfc_array_index_type, lower_se.expr);
5133                   ubound = fold_convert (gfc_array_index_type, upper_se.expr);
5134
5135                   lbound = gfc_evaluate_now (lbound, &block);
5136                   ubound = gfc_evaluate_now (ubound, &block);
5137
5138                   gfc_add_block_to_block (&block, &lower_se.post);
5139                   gfc_add_block_to_block (&block, &upper_se.post);
5140
5141                   /* Set bounds in descriptor.  */
5142                   gfc_conv_descriptor_lbound_set (&block, desc,
5143                                                   gfc_rank_cst[dim], lbound);
5144                   gfc_conv_descriptor_ubound_set (&block, desc,
5145                                                   gfc_rank_cst[dim], ubound);
5146
5147                   /* Set stride.  */
5148                   stride = gfc_evaluate_now (stride, &block);
5149                   gfc_conv_descriptor_stride_set (&block, desc,
5150                                                   gfc_rank_cst[dim], stride);
5151
5152                   /* Update offset.  */
5153                   offs = gfc_conv_descriptor_offset_get (desc);
5154                   tmp = fold_build2_loc (input_location, MULT_EXPR,
5155                                          gfc_array_index_type, lbound, stride);
5156                   offs = fold_build2_loc (input_location, MINUS_EXPR,
5157                                           gfc_array_index_type, offs, tmp);
5158                   offs = gfc_evaluate_now (offs, &block);
5159                   gfc_conv_descriptor_offset_set (&block, desc, offs);
5160
5161                   /* Update stride.  */
5162                   tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
5163                   stride = fold_build2_loc (input_location, MULT_EXPR,
5164                                             gfc_array_index_type, stride, tmp);
5165                 }
5166             }
5167           else
5168             {
5169               /* Bounds remapping.  Just shift the lower bounds.  */
5170
5171               gcc_assert (expr1->rank == expr2->rank);
5172
5173               for (dim = 0; dim < remap->u.ar.dimen; ++dim)
5174                 {
5175                   gfc_se lbound_se;
5176
5177                   gcc_assert (remap->u.ar.start[dim]);
5178                   gcc_assert (!remap->u.ar.end[dim]);
5179                   gfc_init_se (&lbound_se, NULL);
5180                   gfc_conv_expr (&lbound_se, remap->u.ar.start[dim]);
5181
5182                   gfc_add_block_to_block (&block, &lbound_se.pre);
5183                   gfc_conv_shift_descriptor_lbound (&block, desc,
5184                                                     dim, lbound_se.expr);
5185                   gfc_add_block_to_block (&block, &lbound_se.post);
5186                 }
5187             }
5188         }
5189
5190       /* Check string lengths if applicable.  The check is only really added
5191          to the output code if -fbounds-check is enabled.  */
5192       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
5193         {
5194           gcc_assert (expr2->ts.type == BT_CHARACTER);
5195           gcc_assert (strlen_lhs && strlen_rhs);
5196           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
5197                                        strlen_lhs, strlen_rhs, &block);
5198         }
5199
5200       /* If rank remapping was done, check with -fcheck=bounds that
5201          the target is at least as large as the pointer.  */
5202       if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS))
5203         {
5204           tree lsize, rsize;
5205           tree fault;
5206           const char* msg;
5207
5208           lsize = gfc_conv_descriptor_size (lse.expr, expr1->rank);
5209           rsize = gfc_conv_descriptor_size (rse.expr, expr2->rank);
5210
5211           lsize = gfc_evaluate_now (lsize, &block);
5212           rsize = gfc_evaluate_now (rsize, &block);
5213           fault = fold_build2_loc (input_location, LT_EXPR, boolean_type_node,
5214                                    rsize, lsize);
5215
5216           msg = _("Target of rank remapping is too small (%ld < %ld)");
5217           gfc_trans_runtime_check (true, false, fault, &block, &expr2->where,
5218                                    msg, rsize, lsize);
5219         }
5220
5221       gfc_add_block_to_block (&block, &lse.post);
5222       if (rank_remap)
5223         gfc_add_block_to_block (&block, &rse.post);
5224     }
5225
5226   return gfc_finish_block (&block);
5227 }
5228
5229
5230 /* Makes sure se is suitable for passing as a function string parameter.  */
5231 /* TODO: Need to check all callers of this function.  It may be abused.  */
5232
5233 void
5234 gfc_conv_string_parameter (gfc_se * se)
5235 {
5236   tree type;
5237
5238   if (TREE_CODE (se->expr) == STRING_CST)
5239     {
5240       type = TREE_TYPE (TREE_TYPE (se->expr));
5241       se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
5242       return;
5243     }
5244
5245   if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
5246     {
5247       if (TREE_CODE (se->expr) != INDIRECT_REF)
5248         {
5249           type = TREE_TYPE (se->expr);
5250           se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
5251         }
5252       else
5253         {
5254           type = gfc_get_character_type_len (gfc_default_character_kind,
5255                                              se->string_length);
5256           type = build_pointer_type (type);
5257           se->expr = gfc_build_addr_expr (type, se->expr);
5258         }
5259     }
5260
5261   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
5262 }
5263
5264
5265 /* Generate code for assignment of scalar variables.  Includes character
5266    strings and derived types with allocatable components.
5267    If you know that the LHS has no allocations, set dealloc to false.  */
5268
5269 tree
5270 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
5271                          bool l_is_temp, bool r_is_var, bool dealloc)
5272 {
5273   stmtblock_t block;
5274   tree tmp;
5275   tree cond;
5276
5277   gfc_init_block (&block);
5278
5279   if (ts.type == BT_CHARACTER)
5280     {
5281       tree rlen = NULL;
5282       tree llen = NULL;
5283
5284       if (lse->string_length != NULL_TREE)
5285         {
5286           gfc_conv_string_parameter (lse);
5287           gfc_add_block_to_block (&block, &lse->pre);
5288           llen = lse->string_length;
5289         }
5290
5291       if (rse->string_length != NULL_TREE)
5292         {
5293           gcc_assert (rse->string_length != NULL_TREE);
5294           gfc_conv_string_parameter (rse);
5295           gfc_add_block_to_block (&block, &rse->pre);
5296           rlen = rse->string_length;
5297         }
5298
5299       gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
5300                              rse->expr, ts.kind);
5301     }
5302   else if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
5303     {
5304       cond = NULL_TREE;
5305         
5306       /* Are the rhs and the lhs the same?  */
5307       if (r_is_var)
5308         {
5309           cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
5310                                   gfc_build_addr_expr (NULL_TREE, lse->expr),
5311                                   gfc_build_addr_expr (NULL_TREE, rse->expr));
5312           cond = gfc_evaluate_now (cond, &lse->pre);
5313         }
5314
5315       /* Deallocate the lhs allocated components as long as it is not
5316          the same as the rhs.  This must be done following the assignment
5317          to prevent deallocating data that could be used in the rhs
5318          expression.  */
5319       if (!l_is_temp && dealloc)
5320         {
5321           tmp = gfc_evaluate_now (lse->expr, &lse->pre);
5322           tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
5323           if (r_is_var)
5324             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
5325                             tmp);
5326           gfc_add_expr_to_block (&lse->post, tmp);
5327         }
5328
5329       gfc_add_block_to_block (&block, &rse->pre);
5330       gfc_add_block_to_block (&block, &lse->pre);
5331
5332       gfc_add_modify (&block, lse->expr,
5333                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
5334
5335       /* Do a deep copy if the rhs is a variable, if it is not the
5336          same as the lhs.  */
5337       if (r_is_var)
5338         {
5339           tmp = gfc_copy_alloc_comp (ts.u.derived, rse->expr, lse->expr, 0);
5340           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
5341                           tmp);
5342           gfc_add_expr_to_block (&block, tmp);
5343         }
5344     }
5345   else if (ts.type == BT_DERIVED || ts.type == BT_CLASS)
5346     {
5347       gfc_add_block_to_block (&block, &lse->pre);
5348       gfc_add_block_to_block (&block, &rse->pre);
5349       tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
5350                              TREE_TYPE (lse->expr), rse->expr);
5351       gfc_add_modify (&block, lse->expr, tmp);
5352     }
5353   else
5354     {
5355       gfc_add_block_to_block (&block, &lse->pre);
5356       gfc_add_block_to_block (&block, &rse->pre);
5357
5358       gfc_add_modify (&block, lse->expr,
5359                       fold_convert (TREE_TYPE (lse->expr), rse->expr));
5360     }
5361
5362   gfc_add_block_to_block (&block, &lse->post);
5363   gfc_add_block_to_block (&block, &rse->post);
5364
5365   return gfc_finish_block (&block);
5366 }
5367
5368
5369 /* There are quite a lot of restrictions on the optimisation in using an
5370    array function assign without a temporary.  */
5371
5372 static bool
5373 arrayfunc_assign_needs_temporary (gfc_expr * expr1, gfc_expr * expr2)
5374 {
5375   gfc_ref * ref;
5376   bool seen_array_ref;
5377   bool c = false;
5378   gfc_symbol *sym = expr1->symtree->n.sym;
5379
5380   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
5381   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
5382     return true;
5383
5384   /* Elemental functions are scalarized so that they don't need a
5385      temporary in gfc_trans_assignment_1, so return a true.  Otherwise,
5386      they would need special treatment in gfc_trans_arrayfunc_assign.  */
5387   if (expr2->value.function.esym != NULL
5388       && expr2->value.function.esym->attr.elemental)
5389     return true;
5390
5391   /* Need a temporary if rhs is not FULL or a contiguous section.  */
5392   if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
5393     return true;
5394
5395   /* Need a temporary if EXPR1 can't be expressed as a descriptor.  */
5396   if (gfc_ref_needs_temporary_p (expr1->ref))
5397     return true;
5398
5399   /* Functions returning pointers or allocatables need temporaries.  */
5400   c = expr2->value.function.esym
5401       ? (expr2->value.function.esym->attr.pointer 
5402          || expr2->value.function.esym->attr.allocatable)
5403       : (expr2->symtree->n.sym->attr.pointer
5404          || expr2->symtree->n.sym->attr.allocatable);
5405   if (c)
5406     return true;
5407
5408   /* Character array functions need temporaries unless the
5409      character lengths are the same.  */
5410   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
5411     {
5412       if (expr1->ts.u.cl->length == NULL
5413             || expr1->ts.u.cl->length->expr_type != EXPR_CONSTANT)
5414         return true;
5415
5416       if (expr2->ts.u.cl->length == NULL
5417             || expr2->ts.u.cl->length->expr_type != EXPR_CONSTANT)
5418         return true;
5419
5420       if (mpz_cmp (expr1->ts.u.cl->length->value.integer,
5421                      expr2->ts.u.cl->length->value.integer) != 0)
5422         return true;
5423     }
5424
5425   /* Check that no LHS component references appear during an array
5426      reference. This is needed because we do not have the means to
5427      span any arbitrary stride with an array descriptor. This check
5428      is not needed for the rhs because the function result has to be
5429      a complete type.  */
5430   seen_array_ref = false;
5431   for (ref = expr1->ref; ref; ref = ref->next)
5432     {
5433       if (ref->type == REF_ARRAY)
5434         seen_array_ref= true;
5435       else if (ref->type == REF_COMPONENT && seen_array_ref)
5436         return true;
5437     }
5438
5439   /* Check for a dependency.  */
5440   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
5441                                    expr2->value.function.esym,
5442                                    expr2->value.function.actual,
5443                                    NOT_ELEMENTAL))
5444     return true;
5445
5446   /* If we have reached here with an intrinsic function, we do not
5447      need a temporary except in the particular case that reallocation
5448      on assignment is active and the lhs is allocatable and a target.  */
5449   if (expr2->value.function.isym)
5450     return (gfc_option.flag_realloc_lhs
5451               && sym->attr.allocatable
5452               && sym->attr.target);
5453
5454   /* If the LHS is a dummy, we need a temporary if it is not
5455      INTENT(OUT).  */
5456   if (sym->attr.dummy && sym->attr.intent != INTENT_OUT)
5457     return true;
5458
5459   /* If the lhs has been host_associated, is in common, a pointer or is
5460      a target and the function is not using a RESULT variable, aliasing
5461      can occur and a temporary is needed.  */
5462   if ((sym->attr.host_assoc
5463            || sym->attr.in_common
5464            || sym->attr.pointer
5465            || sym->attr.cray_pointee
5466            || sym->attr.target)
5467         && expr2->symtree != NULL
5468         && expr2->symtree->n.sym == expr2->symtree->n.sym->result)
5469     return true;
5470
5471   /* A PURE function can unconditionally be called without a temporary.  */
5472   if (expr2->value.function.esym != NULL
5473       && expr2->value.function.esym->attr.pure)
5474     return false;
5475
5476   /* Implicit_pure functions are those which could legally be declared
5477      to be PURE.  */
5478   if (expr2->value.function.esym != NULL
5479       && expr2->value.function.esym->attr.implicit_pure)
5480     return false;
5481
5482   if (!sym->attr.use_assoc
5483         && !sym->attr.in_common
5484         && !sym->attr.pointer
5485         && !sym->attr.target
5486         && !sym->attr.cray_pointee
5487         && expr2->value.function.esym)
5488     {
5489       /* A temporary is not needed if the function is not contained and
5490          the variable is local or host associated and not a pointer or
5491          a target. */
5492       if (!expr2->value.function.esym->attr.contained)
5493         return false;
5494
5495       /* A temporary is not needed if the lhs has never been host
5496          associated and the procedure is contained.  */
5497       else if (!sym->attr.host_assoc)
5498         return false;
5499
5500       /* A temporary is not needed if the variable is local and not
5501          a pointer, a target or a result.  */
5502       if (sym->ns->parent
5503             && expr2->value.function.esym->ns == sym->ns->parent)
5504         return false;
5505     }
5506
5507   /* Default to temporary use.  */
5508   return true;
5509 }
5510
5511
5512 /* Provide the loop info so that the lhs descriptor can be built for
5513    reallocatable assignments from extrinsic function calls.  */
5514
5515 static void
5516 realloc_lhs_loop_for_fcn_call (gfc_se *se, locus *where, gfc_ss **ss,
5517                                gfc_loopinfo *loop)
5518 {
5519   /* Signal that the function call should not be made by
5520      gfc_conv_loop_setup. */
5521   se->ss->is_alloc_lhs = 1;
5522   gfc_init_loopinfo (loop);
5523   gfc_add_ss_to_loop (loop, *ss);
5524   gfc_add_ss_to_loop (loop, se->ss);
5525   gfc_conv_ss_startstride (loop);
5526   gfc_conv_loop_setup (loop, where);
5527   gfc_copy_loopinfo_to_se (se, loop);
5528   gfc_add_block_to_block (&se->pre, &loop->pre);
5529   gfc_add_block_to_block (&se->pre, &loop->post);
5530   se->ss->is_alloc_lhs = 0;
5531 }
5532
5533
5534 /* For Assignment to a reallocatable lhs from intrinsic functions,
5535    replace the se.expr (ie. the result) with a temporary descriptor.
5536    Null the data field so that the library allocates space for the
5537    result. Free the data of the original descriptor after the function,
5538    in case it appears in an argument expression and transfer the
5539    result to the original descriptor.  */
5540
5541 static void
5542 fcncall_realloc_result (gfc_se *se, int rank)
5543 {
5544   tree desc;
5545   tree res_desc;
5546   tree tmp;
5547   tree offset;
5548   int n;
5549
5550   /* Use the allocation done by the library.  Substitute the lhs
5551      descriptor with a copy, whose data field is nulled.*/
5552   desc = build_fold_indirect_ref_loc (input_location, se->expr);
5553   /* Unallocated, the descriptor does not have a dtype.  */
5554   tmp = gfc_conv_descriptor_dtype (desc);
5555   gfc_add_modify (&se->pre, tmp, gfc_get_dtype (TREE_TYPE (desc)));
5556   res_desc = gfc_evaluate_now (desc, &se->pre);
5557   gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
5558   se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc);
5559
5560   /* Free the lhs after the function call and copy the result to
5561      the lhs descriptor.  */
5562   tmp = gfc_conv_descriptor_data_get (desc);
5563   tmp = gfc_call_free (fold_convert (pvoid_type_node, tmp));
5564   gfc_add_expr_to_block (&se->post, tmp);
5565   gfc_add_modify (&se->post, desc, res_desc);
5566
5567   offset = gfc_index_zero_node;
5568   tmp = gfc_index_one_node;
5569   /* Now reset the bounds from zero based to unity based.  */
5570   for (n = 0 ; n < rank; n++)
5571     {
5572       /* Accumulate the offset.  */
5573       offset = fold_build2_loc (input_location, MINUS_EXPR,
5574                                 gfc_array_index_type,
5575                                 offset, tmp);
5576       /* Now do the bounds.  */
5577       gfc_conv_descriptor_offset_set (&se->post, desc, tmp);
5578       tmp = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]);
5579       tmp = fold_build2_loc (input_location, PLUS_EXPR,
5580                              gfc_array_index_type,
5581                              tmp, gfc_index_one_node);
5582       gfc_conv_descriptor_lbound_set (&se->post, desc,
5583                                       gfc_rank_cst[n],
5584                                       gfc_index_one_node);
5585       gfc_conv_descriptor_ubound_set (&se->post, desc,
5586                                       gfc_rank_cst[n], tmp);
5587
5588       /* The extent for the next contribution to offset.  */
5589       tmp = fold_build2_loc (input_location, MINUS_EXPR,
5590                              gfc_array_index_type,
5591                              gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[n]),
5592                              gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[n]));
5593       tmp = fold_build2_loc (input_location, PLUS_EXPR,
5594                              gfc_array_index_type,
5595                              tmp, gfc_index_one_node);
5596     }
5597   gfc_conv_descriptor_offset_set (&se->post, desc, offset);
5598 }
5599
5600
5601
5602 /* Try to translate array(:) = func (...), where func is a transformational
5603    array function, without using a temporary.  Returns NULL if this isn't the
5604    case.  */
5605
5606 static tree
5607 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
5608 {
5609   gfc_se se;
5610   gfc_ss *ss;
5611   gfc_component *comp = NULL;
5612   gfc_loopinfo loop;
5613
5614   if (arrayfunc_assign_needs_temporary (expr1, expr2))
5615     return NULL;
5616
5617   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
5618      functions.  */
5619   gcc_assert (expr2->value.function.isym
5620               || (gfc_is_proc_ptr_comp (expr2, &comp)
5621                   && comp && comp->attr.dimension)
5622               || (!comp && gfc_return_by_reference (expr2->value.function.esym)
5623                   && expr2->value.function.esym->result->attr.dimension));
5624
5625   ss = gfc_walk_expr (expr1);
5626   gcc_assert (ss != gfc_ss_terminator);
5627   gfc_init_se (&se, NULL);
5628   gfc_start_block (&se.pre);
5629   se.want_pointer = 1;
5630
5631   gfc_conv_array_parameter (&se, expr1, ss, false, NULL, NULL, NULL);
5632
5633   if (expr1->ts.type == BT_DERIVED
5634         && expr1->ts.u.derived->attr.alloc_comp)
5635     {
5636       tree tmp;
5637       tmp = gfc_deallocate_alloc_comp (expr1->ts.u.derived, se.expr,
5638                                        expr1->rank);
5639       gfc_add_expr_to_block (&se.pre, tmp);
5640     }
5641
5642   se.direct_byref = 1;
5643   se.ss = gfc_walk_expr (expr2);
5644   gcc_assert (se.ss != gfc_ss_terminator);
5645
5646   /* Reallocate on assignment needs the loopinfo for extrinsic functions.
5647      This is signalled to gfc_conv_procedure_call by setting is_alloc_lhs.
5648      Clearly, this cannot be done for an allocatable function result, since
5649      the shape of the result is unknown and, in any case, the function must
5650      correctly take care of the reallocation internally. For intrinsic
5651      calls, the array data is freed and the library takes care of allocation.
5652      TODO: Add logic of trans-array.c: gfc_alloc_allocatable_for_assignment
5653      to the library.  */    
5654   if (gfc_option.flag_realloc_lhs
5655         && gfc_is_reallocatable_lhs (expr1)
5656         && !gfc_expr_attr (expr1).codimension
5657         && !gfc_is_coindexed (expr1)
5658         && !(expr2->value.function.esym
5659             && expr2->value.function.esym->result->attr.allocatable))
5660     {
5661       if (!expr2->value.function.isym)
5662         {
5663           realloc_lhs_loop_for_fcn_call (&se, &expr1->where, &ss, &loop);
5664           ss->is_alloc_lhs = 1;
5665         }
5666       else
5667         fcncall_realloc_result (&se, expr1->rank);
5668     }
5669
5670   gfc_conv_function_expr (&se, expr2);
5671   gfc_add_block_to_block (&se.pre, &se.post);
5672
5673   return gfc_finish_block (&se.pre);
5674 }
5675
5676
5677 /* Try to efficiently translate array(:) = 0.  Return NULL if this
5678    can't be done.  */
5679
5680 static tree
5681 gfc_trans_zero_assign (gfc_expr * expr)
5682 {
5683   tree dest, len, type;
5684   tree tmp;
5685   gfc_symbol *sym;
5686
5687   sym = expr->symtree->n.sym;
5688   dest = gfc_get_symbol_decl (sym);
5689
5690   type = TREE_TYPE (dest);
5691   if (POINTER_TYPE_P (type))
5692     type = TREE_TYPE (type);
5693   if (!GFC_ARRAY_TYPE_P (type))
5694     return NULL_TREE;
5695
5696   /* Determine the length of the array.  */
5697   len = GFC_TYPE_ARRAY_SIZE (type);
5698   if (!len || TREE_CODE (len) != INTEGER_CST)
5699     return NULL_TREE;
5700
5701   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
5702   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
5703                          fold_convert (gfc_array_index_type, tmp));
5704
5705   /* If we are zeroing a local array avoid taking its address by emitting
5706      a = {} instead.  */
5707   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
5708     return build2_loc (input_location, MODIFY_EXPR, void_type_node,
5709                        dest, build_constructor (TREE_TYPE (dest), NULL));
5710
5711   /* Convert arguments to the correct types.  */
5712   dest = fold_convert (pvoid_type_node, dest);
5713   len = fold_convert (size_type_node, len);
5714
5715   /* Construct call to __builtin_memset.  */
5716   tmp = build_call_expr_loc (input_location,
5717                          built_in_decls[BUILT_IN_MEMSET],
5718                          3, dest, integer_zero_node, len);
5719   return fold_convert (void_type_node, tmp);
5720 }
5721
5722
5723 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
5724    that constructs the call to __builtin_memcpy.  */
5725
5726 tree
5727 gfc_build_memcpy_call (tree dst, tree src, tree len)
5728 {
5729   tree tmp;
5730
5731   /* Convert arguments to the correct types.  */
5732   if (!POINTER_TYPE_P (TREE_TYPE (dst)))
5733     dst = gfc_build_addr_expr (pvoid_type_node, dst);
5734   else
5735     dst = fold_convert (pvoid_type_node, dst);
5736
5737   if (!POINTER_TYPE_P (TREE_TYPE (src)))
5738     src = gfc_build_addr_expr (pvoid_type_node, src);
5739   else
5740     src = fold_convert (pvoid_type_node, src);
5741
5742   len = fold_convert (size_type_node, len);
5743
5744   /* Construct call to __builtin_memcpy.  */
5745   tmp = build_call_expr_loc (input_location,
5746                          built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
5747   return fold_convert (void_type_node, tmp);
5748 }
5749
5750
5751 /* Try to efficiently translate dst(:) = src(:).  Return NULL if this
5752    can't be done.  EXPR1 is the destination/lhs and EXPR2 is the
5753    source/rhs, both are gfc_full_array_ref_p which have been checked for
5754    dependencies.  */
5755
5756 static tree
5757 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
5758 {
5759   tree dst, dlen, dtype;
5760   tree src, slen, stype;
5761   tree tmp;
5762
5763   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5764   src = gfc_get_symbol_decl (expr2->symtree->n.sym);
5765
5766   dtype = TREE_TYPE (dst);
5767   if (POINTER_TYPE_P (dtype))
5768     dtype = TREE_TYPE (dtype);
5769   stype = TREE_TYPE (src);
5770   if (POINTER_TYPE_P (stype))
5771     stype = TREE_TYPE (stype);
5772
5773   if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
5774     return NULL_TREE;
5775
5776   /* Determine the lengths of the arrays.  */
5777   dlen = GFC_TYPE_ARRAY_SIZE (dtype);
5778   if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
5779     return NULL_TREE;
5780   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5781   dlen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
5782                           dlen, fold_convert (gfc_array_index_type, tmp));
5783
5784   slen = GFC_TYPE_ARRAY_SIZE (stype);
5785   if (!slen || TREE_CODE (slen) != INTEGER_CST)
5786     return NULL_TREE;
5787   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
5788   slen = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
5789                           slen, fold_convert (gfc_array_index_type, tmp));
5790
5791   /* Sanity check that they are the same.  This should always be
5792      the case, as we should already have checked for conformance.  */
5793   if (!tree_int_cst_equal (slen, dlen))
5794     return NULL_TREE;
5795
5796   return gfc_build_memcpy_call (dst, src, dlen);
5797 }
5798
5799
5800 /* Try to efficiently translate array(:) = (/ ... /).  Return NULL if
5801    this can't be done.  EXPR1 is the destination/lhs for which
5802    gfc_full_array_ref_p is true, and EXPR2 is the source/rhs.  */
5803
5804 static tree
5805 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
5806 {
5807   unsigned HOST_WIDE_INT nelem;
5808   tree dst, dtype;
5809   tree src, stype;
5810   tree len;
5811   tree tmp;
5812
5813   nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
5814   if (nelem == 0)
5815     return NULL_TREE;
5816
5817   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5818   dtype = TREE_TYPE (dst);
5819   if (POINTER_TYPE_P (dtype))
5820     dtype = TREE_TYPE (dtype);
5821   if (!GFC_ARRAY_TYPE_P (dtype))
5822     return NULL_TREE;
5823
5824   /* Determine the lengths of the array.  */
5825   len = GFC_TYPE_ARRAY_SIZE (dtype);
5826   if (!len || TREE_CODE (len) != INTEGER_CST)
5827     return NULL_TREE;
5828
5829   /* Confirm that the constructor is the same size.  */
5830   if (compare_tree_int (len, nelem) != 0)
5831     return NULL_TREE;
5832
5833   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5834   len = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, len,
5835                          fold_convert (gfc_array_index_type, tmp));
5836
5837   stype = gfc_typenode_for_spec (&expr2->ts);
5838   src = gfc_build_constant_array_constructor (expr2, stype);
5839
5840   stype = TREE_TYPE (src);
5841   if (POINTER_TYPE_P (stype))
5842     stype = TREE_TYPE (stype);
5843
5844   return gfc_build_memcpy_call (dst, src, len);
5845 }
5846
5847
5848 /* Tells whether the expression is to be treated as a variable reference.  */
5849
5850 static bool
5851 expr_is_variable (gfc_expr *expr)
5852 {
5853   gfc_expr *arg;
5854
5855   if (expr->expr_type == EXPR_VARIABLE)
5856     return true;
5857
5858   arg = gfc_get_noncopying_intrinsic_argument (expr);
5859   if (arg)
5860     {
5861       gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE);
5862       return expr_is_variable (arg);
5863     }
5864
5865   return false;
5866 }
5867
5868
5869 /* Is the lhs OK for automatic reallocation?  */
5870
5871 static bool
5872 is_scalar_reallocatable_lhs (gfc_expr *expr)
5873 {
5874   gfc_ref * ref;
5875
5876   /* An allocatable variable with no reference.  */
5877   if (expr->symtree->n.sym->attr.allocatable
5878         && !expr->ref)
5879     return true;
5880
5881   /* All that can be left are allocatable components.  */
5882   if ((expr->symtree->n.sym->ts.type != BT_DERIVED
5883         && expr->symtree->n.sym->ts.type != BT_CLASS)
5884         || !expr->symtree->n.sym->ts.u.derived->attr.alloc_comp)
5885     return false;
5886
5887   /* Find an allocatable component ref last.  */
5888   for (ref = expr->ref; ref; ref = ref->next)
5889     if (ref->type == REF_COMPONENT
5890           && !ref->next
5891           && ref->u.c.component->attr.allocatable)
5892       return true;
5893
5894   return false;
5895 }
5896
5897
5898 /* Allocate or reallocate scalar lhs, as necessary.  */
5899
5900 static void
5901 alloc_scalar_allocatable_for_assignment (stmtblock_t *block,
5902                                          tree string_length,
5903                                          gfc_expr *expr1,
5904                                          gfc_expr *expr2)
5905
5906 {
5907   tree cond;
5908   tree tmp;
5909   tree size;
5910   tree size_in_bytes;
5911   tree jump_label1;
5912   tree jump_label2;
5913   gfc_se lse;
5914
5915   if (!expr1 || expr1->rank)
5916     return;
5917
5918   if (!expr2 || expr2->rank)
5919     return;
5920
5921   /* Since this is a scalar lhs, we can afford to do this.  That is,
5922      there is no risk of side effects being repeated.  */
5923   gfc_init_se (&lse, NULL);
5924   lse.want_pointer = 1;
5925   gfc_conv_expr (&lse, expr1);
5926   
5927   jump_label1 = gfc_build_label_decl (NULL_TREE);
5928   jump_label2 = gfc_build_label_decl (NULL_TREE);
5929
5930   /* Do the allocation if the lhs is NULL. Otherwise go to label 1.  */
5931   tmp = build_int_cst (TREE_TYPE (lse.expr), 0);
5932   cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
5933                           lse.expr, tmp);
5934   tmp = build3_v (COND_EXPR, cond,
5935                   build1_v (GOTO_EXPR, jump_label1),
5936                   build_empty_stmt (input_location));
5937   gfc_add_expr_to_block (block, tmp);
5938
5939   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
5940     {
5941       /* Use the rhs string length and the lhs element size.  */
5942       size = string_length;
5943       tmp = TREE_TYPE (gfc_typenode_for_spec (&expr1->ts));
5944       tmp = TYPE_SIZE_UNIT (tmp);
5945       size_in_bytes = fold_build2_loc (input_location, MULT_EXPR,
5946                                        TREE_TYPE (tmp), tmp,
5947                                        fold_convert (TREE_TYPE (tmp), size));
5948     }
5949   else
5950     {
5951       /* Otherwise use the length in bytes of the rhs.  */
5952       size = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&expr1->ts));
5953       size_in_bytes = size;
5954     }
5955
5956   tmp = build_call_expr_loc (input_location,
5957                              built_in_decls[BUILT_IN_MALLOC], 1,
5958                              size_in_bytes);
5959   tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
5960   gfc_add_modify (block, lse.expr, tmp);
5961   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
5962     {
5963       /* Deferred characters need checking for lhs and rhs string
5964          length.  Other deferred parameter variables will have to
5965          come here too.  */
5966       tmp = build1_v (GOTO_EXPR, jump_label2);
5967       gfc_add_expr_to_block (block, tmp);
5968     }
5969   tmp = build1_v (LABEL_EXPR, jump_label1);
5970   gfc_add_expr_to_block (block, tmp);
5971
5972   /* For a deferred length character, reallocate if lengths of lhs and
5973      rhs are different.  */
5974   if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
5975     {
5976       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
5977                               expr1->ts.u.cl->backend_decl, size);
5978       /* Jump past the realloc if the lengths are the same.  */
5979       tmp = build3_v (COND_EXPR, cond,
5980                       build1_v (GOTO_EXPR, jump_label2),
5981                       build_empty_stmt (input_location));
5982       gfc_add_expr_to_block (block, tmp);
5983       tmp = build_call_expr_loc (input_location,
5984                                  built_in_decls[BUILT_IN_REALLOC], 2,
5985                                  fold_convert (pvoid_type_node, lse.expr),
5986                                  size_in_bytes);
5987       tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
5988       gfc_add_modify (block, lse.expr, tmp);
5989       tmp = build1_v (LABEL_EXPR, jump_label2);
5990       gfc_add_expr_to_block (block, tmp);
5991
5992       /* Update the lhs character length.  */
5993       size = string_length;
5994       gfc_add_modify (block, expr1->ts.u.cl->backend_decl, size);
5995     }
5996 }
5997
5998
5999 /* Subroutine of gfc_trans_assignment that actually scalarizes the
6000    assignment.  EXPR1 is the destination/LHS and EXPR2 is the source/RHS.
6001    init_flag indicates initialization expressions and dealloc that no
6002    deallocate prior assignment is needed (if in doubt, set true).  */
6003
6004 static tree
6005 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
6006                         bool dealloc)
6007 {
6008   gfc_se lse;
6009   gfc_se rse;
6010   gfc_ss *lss;
6011   gfc_ss *lss_section;
6012   gfc_ss *rss;
6013   gfc_loopinfo loop;
6014   tree tmp;
6015   stmtblock_t block;
6016   stmtblock_t body;
6017   bool l_is_temp;
6018   bool scalar_to_array;
6019   bool def_clen_func;
6020   tree string_length;
6021   int n;
6022
6023   /* Assignment of the form lhs = rhs.  */
6024   gfc_start_block (&block);
6025
6026   gfc_init_se (&lse, NULL);
6027   gfc_init_se (&rse, NULL);
6028
6029   /* Walk the lhs.  */
6030   lss = gfc_walk_expr (expr1);
6031   if (gfc_is_reallocatable_lhs (expr1)
6032         && !(expr2->expr_type == EXPR_FUNCTION
6033              && expr2->value.function.isym != NULL))
6034     lss->is_alloc_lhs = 1;
6035   rss = NULL;
6036   if (lss != gfc_ss_terminator)
6037     {
6038       /* Allow the scalarizer to workshare array assignments.  */
6039       if (ompws_flags & OMPWS_WORKSHARE_FLAG)
6040         ompws_flags |= OMPWS_SCALARIZER_WS;
6041
6042       /* The assignment needs scalarization.  */
6043       lss_section = lss;
6044
6045       /* Find a non-scalar SS from the lhs.  */
6046       while (lss_section != gfc_ss_terminator
6047              && lss_section->type != GFC_SS_SECTION)
6048         lss_section = lss_section->next;
6049
6050       gcc_assert (lss_section != gfc_ss_terminator);
6051
6052       /* Initialize the scalarizer.  */
6053       gfc_init_loopinfo (&loop);
6054
6055       /* Walk the rhs.  */
6056       rss = gfc_walk_expr (expr2);
6057       if (rss == gfc_ss_terminator)
6058         {
6059           /* The rhs is scalar.  Add a ss for the expression.  */
6060           rss = gfc_get_ss ();
6061           rss->next = gfc_ss_terminator;
6062           rss->type = GFC_SS_SCALAR;
6063           rss->expr = expr2;
6064         }
6065       /* Associate the SS with the loop.  */
6066       gfc_add_ss_to_loop (&loop, lss);
6067       gfc_add_ss_to_loop (&loop, rss);
6068
6069       /* Calculate the bounds of the scalarization.  */
6070       gfc_conv_ss_startstride (&loop);
6071       /* Enable loop reversal.  */
6072       for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
6073         loop.reverse[n] = GFC_ENABLE_REVERSE;
6074       /* Resolve any data dependencies in the statement.  */
6075       gfc_conv_resolve_dependencies (&loop, lss, rss);
6076       /* Setup the scalarizing loops.  */
6077       gfc_conv_loop_setup (&loop, &expr2->where);
6078
6079       /* Setup the gfc_se structures.  */
6080       gfc_copy_loopinfo_to_se (&lse, &loop);
6081       gfc_copy_loopinfo_to_se (&rse, &loop);
6082
6083       rse.ss = rss;
6084       gfc_mark_ss_chain_used (rss, 1);
6085       if (loop.temp_ss == NULL)
6086         {
6087           lse.ss = lss;
6088           gfc_mark_ss_chain_used (lss, 1);
6089         }
6090       else
6091         {
6092           lse.ss = loop.temp_ss;
6093           gfc_mark_ss_chain_used (lss, 3);
6094           gfc_mark_ss_chain_used (loop.temp_ss, 3);
6095         }
6096
6097       /* Start the scalarized loop body.  */
6098       gfc_start_scalarized_body (&loop, &body);
6099     }
6100   else
6101     gfc_init_block (&body);
6102
6103   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
6104
6105   /* Translate the expression.  */
6106   gfc_conv_expr (&rse, expr2);
6107
6108   /* Stabilize a string length for temporaries.  */
6109   if (expr2->ts.type == BT_CHARACTER)
6110     string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
6111   else
6112     string_length = NULL_TREE;
6113
6114   if (l_is_temp)
6115     {
6116       gfc_conv_tmp_array_ref (&lse);
6117       if (expr2->ts.type == BT_CHARACTER)
6118         lse.string_length = string_length;
6119     }
6120   else
6121     gfc_conv_expr (&lse, expr1);
6122
6123   /* Assignments of scalar derived types with allocatable components
6124      to arrays must be done with a deep copy and the rhs temporary
6125      must have its components deallocated afterwards.  */
6126   scalar_to_array = (expr2->ts.type == BT_DERIVED
6127                        && expr2->ts.u.derived->attr.alloc_comp
6128                        && !expr_is_variable (expr2)
6129                        && !gfc_is_constant_expr (expr2)
6130                        && expr1->rank && !expr2->rank);
6131   if (scalar_to_array && dealloc)
6132     {
6133       tmp = gfc_deallocate_alloc_comp (expr2->ts.u.derived, rse.expr, 0);
6134       gfc_add_expr_to_block (&loop.post, tmp);
6135     }
6136
6137   /* For a deferred character length function, the function call must
6138      happen before the (re)allocation of the lhs, otherwise the character
6139      length of the result is not known.  */
6140   def_clen_func = (((expr2->expr_type == EXPR_FUNCTION)
6141                            || (expr2->expr_type == EXPR_COMPCALL)
6142                            || (expr2->expr_type == EXPR_PPC))
6143                        && expr2->ts.deferred);
6144   if (gfc_option.flag_realloc_lhs
6145         && expr2->ts.type == BT_CHARACTER
6146         && (def_clen_func || expr2->expr_type == EXPR_OP)
6147         && expr1->ts.deferred)
6148     gfc_add_block_to_block (&block, &rse.pre);
6149
6150   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
6151                                  l_is_temp || init_flag,
6152                                  expr_is_variable (expr2) || scalar_to_array,
6153                                  dealloc);
6154   gfc_add_expr_to_block (&body, tmp);
6155
6156   if (lss == gfc_ss_terminator)
6157     {
6158       /* F2003: Add the code for reallocation on assignment.  */
6159       if (gfc_option.flag_realloc_lhs
6160             && is_scalar_reallocatable_lhs (expr1))
6161         alloc_scalar_allocatable_for_assignment (&block, rse.string_length,
6162                                                  expr1, expr2);
6163
6164       /* Use the scalar assignment as is.  */
6165       gfc_add_block_to_block (&block, &body);
6166     }
6167   else
6168     {
6169       gcc_assert (lse.ss == gfc_ss_terminator
6170                   && rse.ss == gfc_ss_terminator);
6171
6172       if (l_is_temp)
6173         {
6174           gfc_trans_scalarized_loop_boundary (&loop, &body);
6175
6176           /* We need to copy the temporary to the actual lhs.  */
6177           gfc_init_se (&lse, NULL);
6178           gfc_init_se (&rse, NULL);
6179           gfc_copy_loopinfo_to_se (&lse, &loop);
6180           gfc_copy_loopinfo_to_se (&rse, &loop);
6181
6182           rse.ss = loop.temp_ss;
6183           lse.ss = lss;
6184
6185           gfc_conv_tmp_array_ref (&rse);
6186           gfc_conv_expr (&lse, expr1);
6187
6188           gcc_assert (lse.ss == gfc_ss_terminator
6189                       && rse.ss == gfc_ss_terminator);
6190
6191           if (expr2->ts.type == BT_CHARACTER)
6192             rse.string_length = string_length;
6193
6194           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
6195                                          false, false, dealloc);
6196           gfc_add_expr_to_block (&body, tmp);
6197         }
6198
6199       /* F2003: Allocate or reallocate lhs of allocatable array.  */
6200       if (gfc_option.flag_realloc_lhs
6201             && gfc_is_reallocatable_lhs (expr1)
6202             && !gfc_expr_attr (expr1).codimension
6203             && !gfc_is_coindexed (expr1))
6204         {
6205           tmp = gfc_alloc_allocatable_for_assignment (&loop, expr1, expr2);
6206           if (tmp != NULL_TREE)
6207             gfc_add_expr_to_block (&loop.code[expr1->rank - 1], tmp);
6208         }
6209
6210       /* Generate the copying loops.  */
6211       gfc_trans_scalarizing_loops (&loop, &body);
6212
6213       /* Wrap the whole thing up.  */
6214       gfc_add_block_to_block (&block, &loop.pre);
6215       gfc_add_block_to_block (&block, &loop.post);
6216
6217       gfc_cleanup_loop (&loop);
6218     }
6219
6220   return gfc_finish_block (&block);
6221 }
6222
6223
6224 /* Check whether EXPR is a copyable array.  */
6225
6226 static bool
6227 copyable_array_p (gfc_expr * expr)
6228 {
6229   if (expr->expr_type != EXPR_VARIABLE)
6230     return false;
6231
6232   /* First check it's an array.  */
6233   if (expr->rank < 1 || !expr->ref || expr->ref->next)
6234     return false;
6235
6236   if (!gfc_full_array_ref_p (expr->ref, NULL))
6237     return false;
6238
6239   /* Next check that it's of a simple enough type.  */
6240   switch (expr->ts.type)
6241     {
6242     case BT_INTEGER:
6243     case BT_REAL:
6244     case BT_COMPLEX:
6245     case BT_LOGICAL:
6246       return true;
6247
6248     case BT_CHARACTER:
6249       return false;
6250
6251     case BT_DERIVED:
6252       return !expr->ts.u.derived->attr.alloc_comp;
6253
6254     default:
6255       break;
6256     }
6257
6258   return false;
6259 }
6260
6261 /* Translate an assignment.  */
6262
6263 tree
6264 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
6265                       bool dealloc)
6266 {
6267   tree tmp;
6268
6269   /* Special case a single function returning an array.  */
6270   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
6271     {
6272       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
6273       if (tmp)
6274         return tmp;
6275     }
6276
6277   /* Special case assigning an array to zero.  */
6278   if (copyable_array_p (expr1)
6279       && is_zero_initializer_p (expr2))
6280     {
6281       tmp = gfc_trans_zero_assign (expr1);
6282       if (tmp)
6283         return tmp;
6284     }
6285
6286   /* Special case copying one array to another.  */
6287   if (copyable_array_p (expr1)
6288       && copyable_array_p (expr2)
6289       && gfc_compare_types (&expr1->ts, &expr2->ts)
6290       && !gfc_check_dependency (expr1, expr2, 0))
6291     {
6292       tmp = gfc_trans_array_copy (expr1, expr2);
6293       if (tmp)
6294         return tmp;
6295     }
6296
6297   /* Special case initializing an array from a constant array constructor.  */
6298   if (copyable_array_p (expr1)
6299       && expr2->expr_type == EXPR_ARRAY
6300       && gfc_compare_types (&expr1->ts, &expr2->ts))
6301     {
6302       tmp = gfc_trans_array_constructor_copy (expr1, expr2);
6303       if (tmp)
6304         return tmp;
6305     }
6306
6307   /* Fallback to the scalarizer to generate explicit loops.  */
6308   return gfc_trans_assignment_1 (expr1, expr2, init_flag, dealloc);
6309 }
6310
6311 tree
6312 gfc_trans_init_assign (gfc_code * code)
6313 {
6314   return gfc_trans_assignment (code->expr1, code->expr2, true, false);
6315 }
6316
6317 tree
6318 gfc_trans_assign (gfc_code * code)
6319 {
6320   return gfc_trans_assignment (code->expr1, code->expr2, false, true);
6321 }
6322
6323
6324 /* Special case for initializing a polymorphic dummy with INTENT(OUT).
6325    A MEMCPY is needed to copy the full data from the default initializer
6326    of the dynamic type.  */
6327
6328 tree
6329 gfc_trans_class_init_assign (gfc_code *code)
6330 {
6331   stmtblock_t block;
6332   tree tmp;
6333   gfc_se dst,src,memsz;
6334   gfc_expr *lhs,*rhs,*sz;
6335
6336   gfc_start_block (&block);
6337
6338   lhs = gfc_copy_expr (code->expr1);
6339   gfc_add_data_component (lhs);
6340
6341   rhs = gfc_copy_expr (code->expr1);
6342   gfc_add_vptr_component (rhs);
6343
6344   /* Make sure that the component backend_decls have been built, which
6345      will not have happened if the derived types concerned have not
6346      been referenced.  */
6347   gfc_get_derived_type (rhs->ts.u.derived);
6348   gfc_add_def_init_component (rhs);
6349
6350   sz = gfc_copy_expr (code->expr1);
6351   gfc_add_vptr_component (sz);
6352   gfc_add_size_component (sz);
6353
6354   gfc_init_se (&dst, NULL);
6355   gfc_init_se (&src, NULL);
6356   gfc_init_se (&memsz, NULL);
6357   gfc_conv_expr (&dst, lhs);
6358   gfc_conv_expr (&src, rhs);
6359   gfc_conv_expr (&memsz, sz);
6360   gfc_add_block_to_block (&block, &src.pre);
6361   tmp = gfc_build_memcpy_call (dst.expr, src.expr, memsz.expr);
6362   gfc_add_expr_to_block (&block, tmp);
6363   
6364   return gfc_finish_block (&block);
6365 }
6366
6367
6368 /* Translate an assignment to a CLASS object
6369    (pointer or ordinary assignment).  */
6370
6371 tree
6372 gfc_trans_class_assign (gfc_expr *expr1, gfc_expr *expr2, gfc_exec_op op)
6373 {
6374   stmtblock_t block;
6375   tree tmp;
6376   gfc_expr *lhs;
6377   gfc_expr *rhs;
6378
6379   gfc_start_block (&block);
6380
6381   if (expr2->ts.type != BT_CLASS)
6382     {
6383       /* Insert an additional assignment which sets the '_vptr' field.  */
6384       gfc_symbol *vtab = NULL;
6385       gfc_symtree *st;
6386
6387       lhs = gfc_copy_expr (expr1);
6388       gfc_add_vptr_component (lhs);
6389
6390       if (expr2->ts.type == BT_DERIVED)
6391         vtab = gfc_find_derived_vtab (expr2->ts.u.derived);
6392       else if (expr2->expr_type == EXPR_NULL)
6393         vtab = gfc_find_derived_vtab (expr1->ts.u.derived);
6394       gcc_assert (vtab);
6395
6396       rhs = gfc_get_expr ();
6397       rhs->expr_type = EXPR_VARIABLE;
6398       gfc_find_sym_tree (vtab->name, vtab->ns, 1, &st);
6399       rhs->symtree = st;
6400       rhs->ts = vtab->ts;
6401
6402       tmp = gfc_trans_pointer_assignment (lhs, rhs);
6403       gfc_add_expr_to_block (&block, tmp);
6404
6405       gfc_free_expr (lhs);
6406       gfc_free_expr (rhs);
6407     }
6408
6409   /* Do the actual CLASS assignment.  */
6410   if (expr2->ts.type == BT_CLASS)
6411     op = EXEC_ASSIGN;
6412   else
6413     gfc_add_data_component (expr1);
6414
6415   if (op == EXEC_ASSIGN)
6416     tmp = gfc_trans_assignment (expr1, expr2, false, true);
6417   else if (op == EXEC_POINTER_ASSIGN)
6418     tmp = gfc_trans_pointer_assignment (expr1, expr2);
6419   else
6420     gcc_unreachable();
6421
6422   gfc_add_expr_to_block (&block, tmp);
6423
6424   return gfc_finish_block (&block);
6425 }