OSDN Git Service

2006-08-30 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 Free Software Foundation, Inc.
3    Contributed by Paul Brook <paul@nowt.org>
4    and Steven Bosscher <s.bosscher@student.tudelft.nl>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23 /* trans-expr.c-- generate GENERIC trees for gfc_expr.  */
24
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tree.h"
29 #include "convert.h"
30 #include "ggc.h"
31 #include "toplev.h"
32 #include "real.h"
33 #include "tree-gimple.h"
34 #include "langhooks.h"
35 #include "flags.h"
36 #include "gfortran.h"
37 #include "trans.h"
38 #include "trans-const.h"
39 #include "trans-types.h"
40 #include "trans-array.h"
41 /* Only for gfc_trans_assign and gfc_trans_pointer_assign.  */
42 #include "trans-stmt.h"
43 #include "dependency.h"
44
45 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
46 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
47                                                  gfc_expr *);
48
49 /* Copy the scalarization loop variables.  */
50
51 static void
52 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
53 {
54   dest->ss = src->ss;
55   dest->loop = src->loop;
56 }
57
58
59 /* Initialize a simple expression holder.
60
61    Care must be taken when multiple se are created with the same parent.
62    The child se must be kept in sync.  The easiest way is to delay creation
63    of a child se until after after the previous se has been translated.  */
64
65 void
66 gfc_init_se (gfc_se * se, gfc_se * parent)
67 {
68   memset (se, 0, sizeof (gfc_se));
69   gfc_init_block (&se->pre);
70   gfc_init_block (&se->post);
71
72   se->parent = parent;
73
74   if (parent)
75     gfc_copy_se_loopvars (se, parent);
76 }
77
78
79 /* Advances to the next SS in the chain.  Use this rather than setting
80    se->ss = se->ss->next because all the parents needs to be kept in sync.
81    See gfc_init_se.  */
82
83 void
84 gfc_advance_se_ss_chain (gfc_se * se)
85 {
86   gfc_se *p;
87
88   gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
89
90   p = se;
91   /* Walk down the parent chain.  */
92   while (p != NULL)
93     {
94       /* Simple consistency check.  */
95       gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
96
97       p->ss = p->ss->next;
98
99       p = p->parent;
100     }
101 }
102
103
104 /* Ensures the result of the expression as either a temporary variable
105    or a constant so that it can be used repeatedly.  */
106
107 void
108 gfc_make_safe_expr (gfc_se * se)
109 {
110   tree var;
111
112   if (CONSTANT_CLASS_P (se->expr))
113     return;
114
115   /* We need a temporary for this result.  */
116   var = gfc_create_var (TREE_TYPE (se->expr), NULL);
117   gfc_add_modify_expr (&se->pre, var, se->expr);
118   se->expr = var;
119 }
120
121
122 /* Return an expression which determines if a dummy parameter is present.
123    Also used for arguments to procedures with multiple entry points.  */
124
125 tree
126 gfc_conv_expr_present (gfc_symbol * sym)
127 {
128   tree decl;
129
130   gcc_assert (sym->attr.dummy);
131
132   decl = gfc_get_symbol_decl (sym);
133   if (TREE_CODE (decl) != PARM_DECL)
134     {
135       /* Array parameters use a temporary descriptor, we want the real
136          parameter.  */
137       gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
138              || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
139       decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
140     }
141   return build2 (NE_EXPR, boolean_type_node, decl,
142                  fold_convert (TREE_TYPE (decl), null_pointer_node));
143 }
144
145
146 /* Converts a missing, dummy argument into a null or zero.  */
147
148 void
149 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts)
150 {
151   tree present;
152   tree tmp;
153
154   present = gfc_conv_expr_present (arg->symtree->n.sym);
155   tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
156                 build_int_cst (TREE_TYPE (se->expr), 0));
157   tmp = gfc_evaluate_now (tmp, &se->pre);
158   se->expr = tmp;
159   if (ts.type == BT_CHARACTER)
160     {
161       tmp = build_int_cst (gfc_charlen_type_node, 0);
162       tmp = build3 (COND_EXPR, gfc_charlen_type_node, present,
163                     se->string_length, tmp);
164       tmp = gfc_evaluate_now (tmp, &se->pre);
165       se->string_length = tmp;
166     }
167   return;
168 }
169
170
171 /* Get the character length of an expression, looking through gfc_refs
172    if necessary.  */
173
174 tree
175 gfc_get_expr_charlen (gfc_expr *e)
176 {
177   gfc_ref *r;
178   tree length;
179
180   gcc_assert (e->expr_type == EXPR_VARIABLE 
181               && e->ts.type == BT_CHARACTER);
182   
183   length = NULL; /* To silence compiler warning.  */
184
185   /* First candidate: if the variable is of type CHARACTER, the
186      expression's length could be the length of the character
187      variable.  */
188   if (e->symtree->n.sym->ts.type == BT_CHARACTER)
189     length = e->symtree->n.sym->ts.cl->backend_decl;
190
191   /* Look through the reference chain for component references.  */
192   for (r = e->ref; r; r = r->next)
193     {
194       switch (r->type)
195         {
196         case REF_COMPONENT:
197           if (r->u.c.component->ts.type == BT_CHARACTER)
198             length = r->u.c.component->ts.cl->backend_decl;
199           break;
200
201         case REF_ARRAY:
202           /* Do nothing.  */
203           break;
204
205         default:
206           /* We should never got substring references here.  These will be
207              broken down by the scalarizer.  */
208           gcc_unreachable ();
209         }
210     }
211
212   gcc_assert (length != NULL);
213   return length;
214 }
215
216   
217
218 /* Generate code to initialize a string length variable. Returns the
219    value.  */
220
221 void
222 gfc_trans_init_string_length (gfc_charlen * cl, stmtblock_t * pblock)
223 {
224   gfc_se se;
225   tree tmp;
226
227   gfc_init_se (&se, NULL);
228   gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
229   gfc_add_block_to_block (pblock, &se.pre);
230
231   tmp = cl->backend_decl;
232   gfc_add_modify_expr (pblock, tmp, se.expr);
233 }
234
235
236 static void
237 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind)
238 {
239   tree tmp;
240   tree type;
241   tree var;
242   gfc_se start;
243   gfc_se end;
244
245   type = gfc_get_character_type (kind, ref->u.ss.length);
246   type = build_pointer_type (type);
247
248   var = NULL_TREE;
249   gfc_init_se (&start, se);
250   gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
251   gfc_add_block_to_block (&se->pre, &start.pre);
252
253   if (integer_onep (start.expr))
254     gfc_conv_string_parameter (se);
255   else
256     {
257       /* Change the start of the string.  */
258       if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
259         tmp = se->expr;
260       else
261         tmp = build_fold_indirect_ref (se->expr);
262       tmp = gfc_build_array_ref (tmp, start.expr);
263       se->expr = gfc_build_addr_expr (type, tmp);
264     }
265
266   /* Length = end + 1 - start.  */
267   gfc_init_se (&end, se);
268   if (ref->u.ss.end == NULL)
269     end.expr = se->string_length;
270   else
271     {
272       gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
273       gfc_add_block_to_block (&se->pre, &end.pre);
274     }
275   tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
276                      build_int_cst (gfc_charlen_type_node, 1),
277                      start.expr);
278   tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node, end.expr, tmp);
279   tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
280                      build_int_cst (gfc_charlen_type_node, 0));
281   se->string_length = tmp;
282 }
283
284
285 /* Convert a derived type component reference.  */
286
287 static void
288 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
289 {
290   gfc_component *c;
291   tree tmp;
292   tree decl;
293   tree field;
294
295   c = ref->u.c.component;
296
297   gcc_assert (c->backend_decl);
298
299   field = c->backend_decl;
300   gcc_assert (TREE_CODE (field) == FIELD_DECL);
301   decl = se->expr;
302   tmp = build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
303
304   se->expr = tmp;
305
306   if (c->ts.type == BT_CHARACTER)
307     {
308       tmp = c->ts.cl->backend_decl;
309       /* Components must always be constant length.  */
310       gcc_assert (tmp && INTEGER_CST_P (tmp));
311       se->string_length = tmp;
312     }
313
314   if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
315     se->expr = build_fold_indirect_ref (se->expr);
316 }
317
318
319 /* Return the contents of a variable. Also handles reference/pointer
320    variables (all Fortran pointer references are implicit).  */
321
322 static void
323 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
324 {
325   gfc_ref *ref;
326   gfc_symbol *sym;
327   tree parent_decl;
328   int parent_flag;
329   bool return_value;
330   bool alternate_entry;
331   bool entry_master;
332
333   sym = expr->symtree->n.sym;
334   if (se->ss != NULL)
335     {
336       /* Check that something hasn't gone horribly wrong.  */
337       gcc_assert (se->ss != gfc_ss_terminator);
338       gcc_assert (se->ss->expr == expr);
339
340       /* A scalarized term.  We already know the descriptor.  */
341       se->expr = se->ss->data.info.descriptor;
342       se->string_length = se->ss->string_length;
343       for (ref = se->ss->data.info.ref; ref; ref = ref->next)
344         if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
345           break;
346     }
347   else
348     {
349       tree se_expr = NULL_TREE;
350
351       se->expr = gfc_get_symbol_decl (sym);
352
353       /* Deal with references to a parent results or entries by storing
354          the current_function_decl and moving to the parent_decl.  */
355       return_value = sym->attr.function && sym->result == sym;
356       alternate_entry = sym->attr.function && sym->attr.entry
357                         && sym->result == sym;
358       entry_master = sym->attr.result
359                      && sym->ns->proc_name->attr.entry_master
360                      && !gfc_return_by_reference (sym->ns->proc_name);
361       parent_decl = DECL_CONTEXT (current_function_decl);
362
363       if ((se->expr == parent_decl && return_value)
364            || (sym->ns && sym->ns->proc_name
365                && parent_decl
366                && sym->ns->proc_name->backend_decl == parent_decl
367                && (alternate_entry || entry_master)))
368         parent_flag = 1;
369       else
370         parent_flag = 0;
371
372       /* Special case for assigning the return value of a function.
373          Self recursive functions must have an explicit return value.  */
374       if (return_value && (se->expr == current_function_decl || parent_flag))
375         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
376
377       /* Similarly for alternate entry points.  */
378       else if (alternate_entry 
379                && (sym->ns->proc_name->backend_decl == current_function_decl
380                    || parent_flag))
381         {
382           gfc_entry_list *el = NULL;
383
384           for (el = sym->ns->entries; el; el = el->next)
385             if (sym == el->sym)
386               {
387                 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
388                 break;
389               }
390         }
391
392       else if (entry_master
393                && (sym->ns->proc_name->backend_decl == current_function_decl
394                    || parent_flag))
395         se_expr = gfc_get_fake_result_decl (sym, parent_flag);
396
397       if (se_expr)
398         se->expr = se_expr;
399
400       /* Procedure actual arguments.  */
401       else if (sym->attr.flavor == FL_PROCEDURE
402                && se->expr != current_function_decl)
403         {
404           gcc_assert (se->want_pointer);
405           if (!sym->attr.dummy)
406             {
407               gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
408               se->expr = build_fold_addr_expr (se->expr);
409             }
410           return;
411         }
412
413
414       /* Dereference the expression, where needed. Since characters
415          are entirely different from other types, they are treated 
416          separately.  */
417       if (sym->ts.type == BT_CHARACTER)
418         {
419           /* Dereference character pointer dummy arguments
420              or results.  */
421           if ((sym->attr.pointer || sym->attr.allocatable)
422               && (sym->attr.dummy
423                   || sym->attr.function
424                   || sym->attr.result))
425             se->expr = build_fold_indirect_ref (se->expr);
426         }
427       else
428         {
429           /* Dereference non-character scalar dummy arguments.  */
430           if (sym->attr.dummy && !sym->attr.dimension)
431             se->expr = build_fold_indirect_ref (se->expr);
432
433           /* Dereference scalar hidden result.  */
434           if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
435               && (sym->attr.function || sym->attr.result)
436               && !sym->attr.dimension && !sym->attr.pointer)
437             se->expr = build_fold_indirect_ref (se->expr);
438
439           /* Dereference non-character pointer variables. 
440              These must be dummies, results, or scalars.  */
441           if ((sym->attr.pointer || sym->attr.allocatable)
442               && (sym->attr.dummy
443                   || sym->attr.function
444                   || sym->attr.result
445                   || !sym->attr.dimension))
446             se->expr = build_fold_indirect_ref (se->expr);
447         }
448
449       ref = expr->ref;
450     }
451
452   /* For character variables, also get the length.  */
453   if (sym->ts.type == BT_CHARACTER)
454     {
455       /* If the character length of an entry isn't set, get the length from
456          the master function instead.  */
457       if (sym->attr.entry && !sym->ts.cl->backend_decl)
458         se->string_length = sym->ns->proc_name->ts.cl->backend_decl;
459       else
460         se->string_length = sym->ts.cl->backend_decl;
461       gcc_assert (se->string_length);
462     }
463
464   while (ref)
465     {
466       switch (ref->type)
467         {
468         case REF_ARRAY:
469           /* Return the descriptor if that's what we want and this is an array
470              section reference.  */
471           if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
472             return;
473 /* TODO: Pointers to single elements of array sections, eg elemental subs.  */
474           /* Return the descriptor for array pointers and allocations.  */
475           if (se->want_pointer
476               && ref->next == NULL && (se->descriptor_only))
477             return;
478
479           gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
480           /* Return a pointer to an element.  */
481           break;
482
483         case REF_COMPONENT:
484           gfc_conv_component_ref (se, ref);
485           break;
486
487         case REF_SUBSTRING:
488           gfc_conv_substring (se, ref, expr->ts.kind);
489           break;
490
491         default:
492           gcc_unreachable ();
493           break;
494         }
495       ref = ref->next;
496     }
497   /* Pointer assignment, allocation or pass by reference.  Arrays are handled
498      separately.  */
499   if (se->want_pointer)
500     {
501       if (expr->ts.type == BT_CHARACTER)
502         gfc_conv_string_parameter (se);
503       else 
504         se->expr = build_fold_addr_expr (se->expr);
505     }
506 }
507
508
509 /* Unary ops are easy... Or they would be if ! was a valid op.  */
510
511 static void
512 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
513 {
514   gfc_se operand;
515   tree type;
516
517   gcc_assert (expr->ts.type != BT_CHARACTER);
518   /* Initialize the operand.  */
519   gfc_init_se (&operand, se);
520   gfc_conv_expr_val (&operand, expr->value.op.op1);
521   gfc_add_block_to_block (&se->pre, &operand.pre);
522
523   type = gfc_typenode_for_spec (&expr->ts);
524
525   /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
526      We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
527      All other unary operators have an equivalent GIMPLE unary operator.  */
528   if (code == TRUTH_NOT_EXPR)
529     se->expr = build2 (EQ_EXPR, type, operand.expr,
530                        build_int_cst (type, 0));
531   else
532     se->expr = build1 (code, type, operand.expr);
533
534 }
535
536 /* Expand power operator to optimal multiplications when a value is raised
537    to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
538    Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
539    Programming", 3rd Edition, 1998.  */
540
541 /* This code is mostly duplicated from expand_powi in the backend.
542    We establish the "optimal power tree" lookup table with the defined size.
543    The items in the table are the exponents used to calculate the index
544    exponents. Any integer n less than the value can get an "addition chain",
545    with the first node being one.  */
546 #define POWI_TABLE_SIZE 256
547
548 /* The table is from builtins.c.  */
549 static const unsigned char powi_table[POWI_TABLE_SIZE] =
550   {
551       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
552       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
553       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
554      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
555      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
556      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
557      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
558      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
559      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
560      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
561      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
562      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
563      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
564      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
565      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
566      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
567      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
568      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
569      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
570      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
571      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
572      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
573      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
574      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
575      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
576     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
577     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
578     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
579     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
580     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
581     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
582     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
583   };
584
585 /* If n is larger than lookup table's max index, we use the "window 
586    method".  */
587 #define POWI_WINDOW_SIZE 3
588
589 /* Recursive function to expand the power operator. The temporary 
590    values are put in tmpvar. The function returns tmpvar[1] ** n.  */
591 static tree
592 gfc_conv_powi (gfc_se * se, int n, tree * tmpvar)
593 {
594   tree op0;
595   tree op1;
596   tree tmp;
597   int digit;
598
599   if (n < POWI_TABLE_SIZE)
600     {
601       if (tmpvar[n])
602         return tmpvar[n];
603
604       op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
605       op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
606     }
607   else if (n & 1)
608     {
609       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
610       op0 = gfc_conv_powi (se, n - digit, tmpvar);
611       op1 = gfc_conv_powi (se, digit, tmpvar);
612     }
613   else
614     {
615       op0 = gfc_conv_powi (se, n >> 1, tmpvar);
616       op1 = op0;
617     }
618
619   tmp = fold_build2 (MULT_EXPR, TREE_TYPE (op0), op0, op1);
620   tmp = gfc_evaluate_now (tmp, &se->pre);
621
622   if (n < POWI_TABLE_SIZE)
623     tmpvar[n] = tmp;
624
625   return tmp;
626 }
627
628
629 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
630    return 1. Else return 0 and a call to runtime library functions
631    will have to be built.  */
632 static int
633 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
634 {
635   tree cond;
636   tree tmp;
637   tree type;
638   tree vartmp[POWI_TABLE_SIZE];
639   int n;
640   int sgn;
641
642   type = TREE_TYPE (lhs);
643   n = abs (TREE_INT_CST_LOW (rhs));
644   sgn = tree_int_cst_sgn (rhs);
645
646   if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations) || optimize_size)
647       && (n > 2 || n < -1))
648     return 0;
649
650   /* rhs == 0  */
651   if (sgn == 0)
652     {
653       se->expr = gfc_build_const (type, integer_one_node);
654       return 1;
655     }
656   /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1.  */
657   if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
658     {
659       tmp = build2 (EQ_EXPR, boolean_type_node, lhs,
660                     build_int_cst (TREE_TYPE (lhs), -1));
661       cond = build2 (EQ_EXPR, boolean_type_node, lhs,
662                      build_int_cst (TREE_TYPE (lhs), 1));
663
664       /* If rhs is even,
665          result = (lhs == 1 || lhs == -1) ? 1 : 0.  */
666       if ((n & 1) == 0)
667         {
668           tmp = build2 (TRUTH_OR_EXPR, boolean_type_node, tmp, cond);
669           se->expr = build3 (COND_EXPR, type, tmp, build_int_cst (type, 1),
670                              build_int_cst (type, 0));
671           return 1;
672         }
673       /* If rhs is odd,
674          result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0.  */
675       tmp = build3 (COND_EXPR, type, tmp, build_int_cst (type, -1),
676                     build_int_cst (type, 0));
677       se->expr = build3 (COND_EXPR, type, cond, build_int_cst (type, 1), tmp);
678       return 1;
679     }
680
681   memset (vartmp, 0, sizeof (vartmp));
682   vartmp[1] = lhs;
683   if (sgn == -1)
684     {
685       tmp = gfc_build_const (type, integer_one_node);
686       vartmp[1] = build2 (RDIV_EXPR, type, tmp, vartmp[1]);
687     }
688
689   se->expr = gfc_conv_powi (se, n, vartmp);
690
691   return 1;
692 }
693
694
695 /* Power op (**).  Constant integer exponent has special handling.  */
696
697 static void
698 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
699 {
700   tree gfc_int4_type_node;
701   int kind;
702   int ikind;
703   gfc_se lse;
704   gfc_se rse;
705   tree fndecl;
706   tree tmp;
707
708   gfc_init_se (&lse, se);
709   gfc_conv_expr_val (&lse, expr->value.op.op1);
710   lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
711   gfc_add_block_to_block (&se->pre, &lse.pre);
712
713   gfc_init_se (&rse, se);
714   gfc_conv_expr_val (&rse, expr->value.op.op2);
715   gfc_add_block_to_block (&se->pre, &rse.pre);
716
717   if (expr->value.op.op2->ts.type == BT_INTEGER
718          && expr->value.op.op2->expr_type == EXPR_CONSTANT)
719     if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
720       return;        
721
722   gfc_int4_type_node = gfc_get_int_type (4);
723
724   kind = expr->value.op.op1->ts.kind;
725   switch (expr->value.op.op2->ts.type)
726     {
727     case BT_INTEGER:
728       ikind = expr->value.op.op2->ts.kind;
729       switch (ikind)
730         {
731         case 1:
732         case 2:
733           rse.expr = convert (gfc_int4_type_node, rse.expr);
734           /* Fall through.  */
735
736         case 4:
737           ikind = 0;
738           break;
739           
740         case 8:
741           ikind = 1;
742           break;
743
744         case 16:
745           ikind = 2;
746           break;
747
748         default:
749           gcc_unreachable ();
750         }
751       switch (kind)
752         {
753         case 1:
754         case 2:
755           if (expr->value.op.op1->ts.type == BT_INTEGER)
756             lse.expr = convert (gfc_int4_type_node, lse.expr);
757           else
758             gcc_unreachable ();
759           /* Fall through.  */
760
761         case 4:
762           kind = 0;
763           break;
764           
765         case 8:
766           kind = 1;
767           break;
768
769         case 10:
770           kind = 2;
771           break;
772
773         case 16:
774           kind = 3;
775           break;
776
777         default:
778           gcc_unreachable ();
779         }
780       
781       switch (expr->value.op.op1->ts.type)
782         {
783         case BT_INTEGER:
784           if (kind == 3) /* Case 16 was not handled properly above.  */
785             kind = 2;
786           fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
787           break;
788
789         case BT_REAL:
790           fndecl = gfor_fndecl_math_powi[kind][ikind].real;
791           break;
792
793         case BT_COMPLEX:
794           fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
795           break;
796
797         default:
798           gcc_unreachable ();
799         }
800       break;
801
802     case BT_REAL:
803       switch (kind)
804         {
805         case 4:
806           fndecl = built_in_decls[BUILT_IN_POWF];
807           break;
808         case 8:
809           fndecl = built_in_decls[BUILT_IN_POW];
810           break;
811         case 10:
812         case 16:
813           fndecl = built_in_decls[BUILT_IN_POWL];
814           break;
815         default:
816           gcc_unreachable ();
817         }
818       break;
819
820     case BT_COMPLEX:
821       switch (kind)
822         {
823         case 4:
824           fndecl = gfor_fndecl_math_cpowf;
825           break;
826         case 8:
827           fndecl = gfor_fndecl_math_cpow;
828           break;
829         case 10:
830           fndecl = gfor_fndecl_math_cpowl10;
831           break;
832         case 16:
833           fndecl = gfor_fndecl_math_cpowl16;
834           break;
835         default:
836           gcc_unreachable ();
837         }
838       break;
839
840     default:
841       gcc_unreachable ();
842       break;
843     }
844
845   tmp = gfc_chainon_list (NULL_TREE, lse.expr);
846   tmp = gfc_chainon_list (tmp, rse.expr);
847   se->expr = build_function_call_expr (fndecl, tmp);
848 }
849
850
851 /* Generate code to allocate a string temporary.  */
852
853 tree
854 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
855 {
856   tree var;
857   tree tmp;
858   tree args;
859
860   gcc_assert (TREE_TYPE (len) == gfc_charlen_type_node);
861
862   if (gfc_can_put_var_on_stack (len))
863     {
864       /* Create a temporary variable to hold the result.  */
865       tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
866                          build_int_cst (gfc_charlen_type_node, 1));
867       tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
868       tmp = build_array_type (gfc_character1_type_node, tmp);
869       var = gfc_create_var (tmp, "str");
870       var = gfc_build_addr_expr (type, var);
871     }
872   else
873     {
874       /* Allocate a temporary to hold the result.  */
875       var = gfc_create_var (type, "pstr");
876       args = gfc_chainon_list (NULL_TREE, len);
877       tmp = build_function_call_expr (gfor_fndecl_internal_malloc, args);
878       tmp = convert (type, tmp);
879       gfc_add_modify_expr (&se->pre, var, tmp);
880
881       /* Free the temporary afterwards.  */
882       tmp = convert (pvoid_type_node, var);
883       args = gfc_chainon_list (NULL_TREE, tmp);
884       tmp = build_function_call_expr (gfor_fndecl_internal_free, args);
885       gfc_add_expr_to_block (&se->post, tmp);
886     }
887
888   return var;
889 }
890
891
892 /* Handle a string concatenation operation.  A temporary will be allocated to
893    hold the result.  */
894
895 static void
896 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
897 {
898   gfc_se lse;
899   gfc_se rse;
900   tree len;
901   tree type;
902   tree var;
903   tree args;
904   tree tmp;
905
906   gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
907           && expr->value.op.op2->ts.type == BT_CHARACTER);
908
909   gfc_init_se (&lse, se);
910   gfc_conv_expr (&lse, expr->value.op.op1);
911   gfc_conv_string_parameter (&lse);
912   gfc_init_se (&rse, se);
913   gfc_conv_expr (&rse, expr->value.op.op2);
914   gfc_conv_string_parameter (&rse);
915
916   gfc_add_block_to_block (&se->pre, &lse.pre);
917   gfc_add_block_to_block (&se->pre, &rse.pre);
918
919   type = gfc_get_character_type (expr->ts.kind, expr->ts.cl);
920   len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
921   if (len == NULL_TREE)
922     {
923       len = fold_build2 (PLUS_EXPR, TREE_TYPE (lse.string_length),
924                          lse.string_length, rse.string_length);
925     }
926
927   type = build_pointer_type (type);
928
929   var = gfc_conv_string_tmp (se, type, len);
930
931   /* Do the actual concatenation.  */
932   args = NULL_TREE;
933   args = gfc_chainon_list (args, len);
934   args = gfc_chainon_list (args, var);
935   args = gfc_chainon_list (args, lse.string_length);
936   args = gfc_chainon_list (args, lse.expr);
937   args = gfc_chainon_list (args, rse.string_length);
938   args = gfc_chainon_list (args, rse.expr);
939   tmp = build_function_call_expr (gfor_fndecl_concat_string, args);
940   gfc_add_expr_to_block (&se->pre, tmp);
941
942   /* Add the cleanup for the operands.  */
943   gfc_add_block_to_block (&se->pre, &rse.post);
944   gfc_add_block_to_block (&se->pre, &lse.post);
945
946   se->expr = var;
947   se->string_length = len;
948 }
949
950 /* Translates an op expression. Common (binary) cases are handled by this
951    function, others are passed on. Recursion is used in either case.
952    We use the fact that (op1.ts == op2.ts) (except for the power
953    operator **).
954    Operators need no special handling for scalarized expressions as long as
955    they call gfc_conv_simple_val to get their operands.
956    Character strings get special handling.  */
957
958 static void
959 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
960 {
961   enum tree_code code;
962   gfc_se lse;
963   gfc_se rse;
964   tree type;
965   tree tmp;
966   int lop;
967   int checkstring;
968
969   checkstring = 0;
970   lop = 0;
971   switch (expr->value.op.operator)
972     {
973     case INTRINSIC_UPLUS:
974     case INTRINSIC_PARENTHESES:
975       gfc_conv_expr (se, expr->value.op.op1);
976       return;
977
978     case INTRINSIC_UMINUS:
979       gfc_conv_unary_op (NEGATE_EXPR, se, expr);
980       return;
981
982     case INTRINSIC_NOT:
983       gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
984       return;
985
986     case INTRINSIC_PLUS:
987       code = PLUS_EXPR;
988       break;
989
990     case INTRINSIC_MINUS:
991       code = MINUS_EXPR;
992       break;
993
994     case INTRINSIC_TIMES:
995       code = MULT_EXPR;
996       break;
997
998     case INTRINSIC_DIVIDE:
999       /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1000          an integer, we must round towards zero, so we use a
1001          TRUNC_DIV_EXPR.  */
1002       if (expr->ts.type == BT_INTEGER)
1003         code = TRUNC_DIV_EXPR;
1004       else
1005         code = RDIV_EXPR;
1006       break;
1007
1008     case INTRINSIC_POWER:
1009       gfc_conv_power_op (se, expr);
1010       return;
1011
1012     case INTRINSIC_CONCAT:
1013       gfc_conv_concat_op (se, expr);
1014       return;
1015
1016     case INTRINSIC_AND:
1017       code = TRUTH_ANDIF_EXPR;
1018       lop = 1;
1019       break;
1020
1021     case INTRINSIC_OR:
1022       code = TRUTH_ORIF_EXPR;
1023       lop = 1;
1024       break;
1025
1026       /* EQV and NEQV only work on logicals, but since we represent them
1027          as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE.  */
1028     case INTRINSIC_EQ:
1029     case INTRINSIC_EQV:
1030       code = EQ_EXPR;
1031       checkstring = 1;
1032       lop = 1;
1033       break;
1034
1035     case INTRINSIC_NE:
1036     case INTRINSIC_NEQV:
1037       code = NE_EXPR;
1038       checkstring = 1;
1039       lop = 1;
1040       break;
1041
1042     case INTRINSIC_GT:
1043       code = GT_EXPR;
1044       checkstring = 1;
1045       lop = 1;
1046       break;
1047
1048     case INTRINSIC_GE:
1049       code = GE_EXPR;
1050       checkstring = 1;
1051       lop = 1;
1052       break;
1053
1054     case INTRINSIC_LT:
1055       code = LT_EXPR;
1056       checkstring = 1;
1057       lop = 1;
1058       break;
1059
1060     case INTRINSIC_LE:
1061       code = LE_EXPR;
1062       checkstring = 1;
1063       lop = 1;
1064       break;
1065
1066     case INTRINSIC_USER:
1067     case INTRINSIC_ASSIGN:
1068       /* These should be converted into function calls by the frontend.  */
1069       gcc_unreachable ();
1070
1071     default:
1072       fatal_error ("Unknown intrinsic op");
1073       return;
1074     }
1075
1076   /* The only exception to this is **, which is handled separately anyway.  */
1077   gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1078
1079   if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1080     checkstring = 0;
1081
1082   /* lhs */
1083   gfc_init_se (&lse, se);
1084   gfc_conv_expr (&lse, expr->value.op.op1);
1085   gfc_add_block_to_block (&se->pre, &lse.pre);
1086
1087   /* rhs */
1088   gfc_init_se (&rse, se);
1089   gfc_conv_expr (&rse, expr->value.op.op2);
1090   gfc_add_block_to_block (&se->pre, &rse.pre);
1091
1092   if (checkstring)
1093     {
1094       gfc_conv_string_parameter (&lse);
1095       gfc_conv_string_parameter (&rse);
1096
1097       lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1098                                            rse.string_length, rse.expr);
1099       rse.expr = integer_zero_node;
1100       gfc_add_block_to_block (&lse.post, &rse.post);
1101     }
1102
1103   type = gfc_typenode_for_spec (&expr->ts);
1104
1105   if (lop)
1106     {
1107       /* The result of logical ops is always boolean_type_node.  */
1108       tmp = fold_build2 (code, type, lse.expr, rse.expr);
1109       se->expr = convert (type, tmp);
1110     }
1111   else
1112     se->expr = fold_build2 (code, type, lse.expr, rse.expr);
1113
1114   /* Add the post blocks.  */
1115   gfc_add_block_to_block (&se->post, &rse.post);
1116   gfc_add_block_to_block (&se->post, &lse.post);
1117 }
1118
1119 /* If a string's length is one, we convert it to a single character.  */
1120
1121 static tree
1122 gfc_to_single_character (tree len, tree str)
1123 {
1124   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str)));
1125
1126   if (INTEGER_CST_P (len) && TREE_INT_CST_LOW (len) == 1
1127     && TREE_INT_CST_HIGH (len) == 0)
1128     {
1129       str = fold_convert (pchar_type_node, str);
1130       return build_fold_indirect_ref (str);
1131     }
1132
1133   return NULL_TREE;
1134 }
1135
1136 /* Compare two strings. If they are all single characters, the result is the
1137    subtraction of them. Otherwise, we build a library call.  */
1138
1139 tree
1140 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2)
1141 {
1142   tree sc1;
1143   tree sc2;
1144   tree type;
1145   tree tmp;
1146
1147   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1148   gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1149
1150   type = gfc_get_int_type (gfc_default_integer_kind);
1151
1152   sc1 = gfc_to_single_character (len1, str1);
1153   sc2 = gfc_to_single_character (len2, str2);
1154
1155   /* Deal with single character specially.  */
1156   if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1157     {
1158       sc1 = fold_convert (type, sc1);
1159       sc2 = fold_convert (type, sc2);
1160       tmp = fold_build2 (MINUS_EXPR, type, sc1, sc2);
1161     }
1162    else
1163     {
1164       tmp = NULL_TREE;
1165       tmp = gfc_chainon_list (tmp, len1);
1166       tmp = gfc_chainon_list (tmp, str1);
1167       tmp = gfc_chainon_list (tmp, len2);
1168       tmp = gfc_chainon_list (tmp, str2);
1169
1170       /* Build a call for the comparison.  */
1171       tmp = build_function_call_expr (gfor_fndecl_compare_string, tmp);
1172     }
1173
1174   return tmp;
1175 }
1176
1177 static void
1178 gfc_conv_function_val (gfc_se * se, gfc_symbol * sym)
1179 {
1180   tree tmp;
1181
1182   if (sym->attr.dummy)
1183     {
1184       tmp = gfc_get_symbol_decl (sym);
1185       gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1186               && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1187     }
1188   else
1189     {
1190       if (!sym->backend_decl)
1191         sym->backend_decl = gfc_get_extern_function_decl (sym);
1192
1193       tmp = sym->backend_decl;
1194       if (sym->attr.cray_pointee)
1195         tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1196                        gfc_get_symbol_decl (sym->cp_pointer));
1197       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1198         {
1199           gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1200           tmp = build_fold_addr_expr (tmp);
1201         }
1202     }
1203   se->expr = tmp;
1204 }
1205
1206
1207 /* Initialize MAPPING.  */
1208
1209 void
1210 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1211 {
1212   mapping->syms = NULL;
1213   mapping->charlens = NULL;
1214 }
1215
1216
1217 /* Free all memory held by MAPPING (but not MAPPING itself).  */
1218
1219 void
1220 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1221 {
1222   gfc_interface_sym_mapping *sym;
1223   gfc_interface_sym_mapping *nextsym;
1224   gfc_charlen *cl;
1225   gfc_charlen *nextcl;
1226
1227   for (sym = mapping->syms; sym; sym = nextsym)
1228     {
1229       nextsym = sym->next;
1230       gfc_free_symbol (sym->new->n.sym);
1231       gfc_free (sym->new);
1232       gfc_free (sym);
1233     }
1234   for (cl = mapping->charlens; cl; cl = nextcl)
1235     {
1236       nextcl = cl->next;
1237       gfc_free_expr (cl->length);
1238       gfc_free (cl);
1239     }
1240 }
1241
1242
1243 /* Return a copy of gfc_charlen CL.  Add the returned structure to
1244    MAPPING so that it will be freed by gfc_free_interface_mapping.  */
1245
1246 static gfc_charlen *
1247 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1248                                    gfc_charlen * cl)
1249 {
1250   gfc_charlen *new;
1251
1252   new = gfc_get_charlen ();
1253   new->next = mapping->charlens;
1254   new->length = gfc_copy_expr (cl->length);
1255
1256   mapping->charlens = new;
1257   return new;
1258 }
1259
1260
1261 /* A subroutine of gfc_add_interface_mapping.  Return a descriptorless
1262    array variable that can be used as the actual argument for dummy
1263    argument SYM.  Add any initialization code to BLOCK.  PACKED is as
1264    for gfc_get_nodesc_array_type and DATA points to the first element
1265    in the passed array.  */
1266
1267 static tree
1268 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1269                                  int packed, tree data)
1270 {
1271   tree type;
1272   tree var;
1273
1274   type = gfc_typenode_for_spec (&sym->ts);
1275   type = gfc_get_nodesc_array_type (type, sym->as, packed);
1276
1277   var = gfc_create_var (type, "ifm");
1278   gfc_add_modify_expr (block, var, fold_convert (type, data));
1279
1280   return var;
1281 }
1282
1283
1284 /* A subroutine of gfc_add_interface_mapping.  Set the stride, upper bounds
1285    and offset of descriptorless array type TYPE given that it has the same
1286    size as DESC.  Add any set-up code to BLOCK.  */
1287
1288 static void
1289 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1290 {
1291   int n;
1292   tree dim;
1293   tree offset;
1294   tree tmp;
1295
1296   offset = gfc_index_zero_node;
1297   for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1298     {
1299       GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1300       if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1301         {
1302           dim = gfc_rank_cst[n];
1303           tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1304                              gfc_conv_descriptor_ubound (desc, dim),
1305                              gfc_conv_descriptor_lbound (desc, dim));
1306           tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1307                              GFC_TYPE_ARRAY_LBOUND (type, n),
1308                              tmp);
1309           tmp = gfc_evaluate_now (tmp, block);
1310           GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1311         }
1312       tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1313                          GFC_TYPE_ARRAY_LBOUND (type, n),
1314                          GFC_TYPE_ARRAY_STRIDE (type, n));
1315       offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1316     }
1317   offset = gfc_evaluate_now (offset, block);
1318   GFC_TYPE_ARRAY_OFFSET (type) = offset;
1319 }
1320
1321
1322 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1323    in SE.  The caller may still use se->expr and se->string_length after
1324    calling this function.  */
1325
1326 void
1327 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1328                            gfc_symbol * sym, gfc_se * se)
1329 {
1330   gfc_interface_sym_mapping *sm;
1331   tree desc;
1332   tree tmp;
1333   tree value;
1334   gfc_symbol *new_sym;
1335   gfc_symtree *root;
1336   gfc_symtree *new_symtree;
1337
1338   /* Create a new symbol to represent the actual argument.  */
1339   new_sym = gfc_new_symbol (sym->name, NULL);
1340   new_sym->ts = sym->ts;
1341   new_sym->attr.referenced = 1;
1342   new_sym->attr.dimension = sym->attr.dimension;
1343   new_sym->attr.pointer = sym->attr.pointer;
1344   new_sym->attr.allocatable = sym->attr.allocatable;
1345   new_sym->attr.flavor = sym->attr.flavor;
1346
1347   /* Create a fake symtree for it.  */
1348   root = NULL;
1349   new_symtree = gfc_new_symtree (&root, sym->name);
1350   new_symtree->n.sym = new_sym;
1351   gcc_assert (new_symtree == root);
1352
1353   /* Create a dummy->actual mapping.  */
1354   sm = gfc_getmem (sizeof (*sm));
1355   sm->next = mapping->syms;
1356   sm->old = sym;
1357   sm->new = new_symtree;
1358   mapping->syms = sm;
1359
1360   /* Stabilize the argument's value.  */
1361   se->expr = gfc_evaluate_now (se->expr, &se->pre);
1362
1363   if (sym->ts.type == BT_CHARACTER)
1364     {
1365       /* Create a copy of the dummy argument's length.  */
1366       new_sym->ts.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.cl);
1367
1368       /* If the length is specified as "*", record the length that
1369          the caller is passing.  We should use the callee's length
1370          in all other cases.  */
1371       if (!new_sym->ts.cl->length)
1372         {
1373           se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1374           new_sym->ts.cl->backend_decl = se->string_length;
1375         }
1376     }
1377
1378   /* Use the passed value as-is if the argument is a function.  */
1379   if (sym->attr.flavor == FL_PROCEDURE)
1380     value = se->expr;
1381
1382   /* If the argument is either a string or a pointer to a string,
1383      convert it to a boundless character type.  */
1384   else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1385     {
1386       tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1387       tmp = build_pointer_type (tmp);
1388       if (sym->attr.pointer)
1389         tmp = build_pointer_type (tmp);
1390
1391       value = fold_convert (tmp, se->expr);
1392       if (sym->attr.pointer)
1393         value = build_fold_indirect_ref (value);
1394     }
1395
1396   /* If the argument is a scalar, a pointer to an array or an allocatable,
1397      dereference it.  */
1398   else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1399     value = build_fold_indirect_ref (se->expr);
1400   
1401   /* For character(*), use the actual argument's descriptor.  */  
1402   else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.cl->length)
1403     value = build_fold_indirect_ref (se->expr);
1404
1405   /* If the argument is an array descriptor, use it to determine
1406      information about the actual argument's shape.  */
1407   else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1408            && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1409     {
1410       /* Get the actual argument's descriptor.  */
1411       desc = build_fold_indirect_ref (se->expr);
1412
1413       /* Create the replacement variable.  */
1414       tmp = gfc_conv_descriptor_data_get (desc);
1415       value = gfc_get_interface_mapping_array (&se->pre, sym, 0, tmp);
1416
1417       /* Use DESC to work out the upper bounds, strides and offset.  */
1418       gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1419     }
1420   else
1421     /* Otherwise we have a packed array.  */
1422     value = gfc_get_interface_mapping_array (&se->pre, sym, 2, se->expr);
1423
1424   new_sym->backend_decl = value;
1425 }
1426
1427
1428 /* Called once all dummy argument mappings have been added to MAPPING,
1429    but before the mapping is used to evaluate expressions.  Pre-evaluate
1430    the length of each argument, adding any initialization code to PRE and
1431    any finalization code to POST.  */
1432
1433 void
1434 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1435                               stmtblock_t * pre, stmtblock_t * post)
1436 {
1437   gfc_interface_sym_mapping *sym;
1438   gfc_expr *expr;
1439   gfc_se se;
1440
1441   for (sym = mapping->syms; sym; sym = sym->next)
1442     if (sym->new->n.sym->ts.type == BT_CHARACTER
1443         && !sym->new->n.sym->ts.cl->backend_decl)
1444       {
1445         expr = sym->new->n.sym->ts.cl->length;
1446         gfc_apply_interface_mapping_to_expr (mapping, expr);
1447         gfc_init_se (&se, NULL);
1448         gfc_conv_expr (&se, expr);
1449
1450         se.expr = gfc_evaluate_now (se.expr, &se.pre);
1451         gfc_add_block_to_block (pre, &se.pre);
1452         gfc_add_block_to_block (post, &se.post);
1453
1454         sym->new->n.sym->ts.cl->backend_decl = se.expr;
1455       }
1456 }
1457
1458
1459 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1460    constructor C.  */
1461
1462 static void
1463 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1464                                      gfc_constructor * c)
1465 {
1466   for (; c; c = c->next)
1467     {
1468       gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1469       if (c->iterator)
1470         {
1471           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1472           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1473           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
1474         }
1475     }
1476 }
1477
1478
1479 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1480    reference REF.  */
1481
1482 static void
1483 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
1484                                     gfc_ref * ref)
1485 {
1486   int n;
1487
1488   for (; ref; ref = ref->next)
1489     switch (ref->type)
1490       {
1491       case REF_ARRAY:
1492         for (n = 0; n < ref->u.ar.dimen; n++)
1493           {
1494             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
1495             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
1496             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
1497           }
1498         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
1499         break;
1500
1501       case REF_COMPONENT:
1502         break;
1503
1504       case REF_SUBSTRING:
1505         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
1506         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
1507         break;
1508       }
1509 }
1510
1511
1512 /* EXPR is a copy of an expression that appeared in the interface
1513    associated with MAPPING.  Walk it recursively looking for references to
1514    dummy arguments that MAPPING maps to actual arguments.  Replace each such
1515    reference with a reference to the associated actual argument.  */
1516
1517 static void
1518 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
1519                                      gfc_expr * expr)
1520 {
1521   gfc_interface_sym_mapping *sym;
1522   gfc_actual_arglist *actual;
1523
1524   if (!expr)
1525     return;
1526
1527   /* Copying an expression does not copy its length, so do that here.  */
1528   if (expr->ts.type == BT_CHARACTER && expr->ts.cl)
1529     {
1530       expr->ts.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.cl);
1531       gfc_apply_interface_mapping_to_expr (mapping, expr->ts.cl->length);
1532     }
1533
1534   /* Apply the mapping to any references.  */
1535   gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
1536
1537   /* ...and to the expression's symbol, if it has one.  */
1538   if (expr->symtree)
1539     for (sym = mapping->syms; sym; sym = sym->next)
1540       if (sym->old == expr->symtree->n.sym)
1541         expr->symtree = sym->new;
1542
1543   /* ...and to subexpressions in expr->value.  */
1544   switch (expr->expr_type)
1545     {
1546     case EXPR_VARIABLE:
1547     case EXPR_CONSTANT:
1548     case EXPR_NULL:
1549     case EXPR_SUBSTRING:
1550       break;
1551
1552     case EXPR_OP:
1553       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
1554       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
1555       break;
1556
1557     case EXPR_FUNCTION:
1558       for (sym = mapping->syms; sym; sym = sym->next)
1559         if (sym->old == expr->value.function.esym)
1560           expr->value.function.esym = sym->new->n.sym;
1561
1562       for (actual = expr->value.function.actual; actual; actual = actual->next)
1563         gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
1564       break;
1565
1566     case EXPR_ARRAY:
1567     case EXPR_STRUCTURE:
1568       gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
1569       break;
1570     }
1571 }
1572
1573
1574 /* Evaluate interface expression EXPR using MAPPING.  Store the result
1575    in SE.  */
1576
1577 void
1578 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
1579                              gfc_se * se, gfc_expr * expr)
1580 {
1581   expr = gfc_copy_expr (expr);
1582   gfc_apply_interface_mapping_to_expr (mapping, expr);
1583   gfc_conv_expr (se, expr);
1584   se->expr = gfc_evaluate_now (se->expr, &se->pre);
1585   gfc_free_expr (expr);
1586 }
1587
1588 /* Returns a reference to a temporary array into which a component of
1589    an actual argument derived type array is copied and then returned
1590    after the function call.
1591    TODO Get rid of this kludge, when array descriptors are capable of
1592    handling aliased arrays.  */
1593
1594 static void
1595 gfc_conv_aliased_arg (gfc_se * parmse, gfc_expr * expr,
1596                       int g77, sym_intent intent)
1597 {
1598   gfc_se lse;
1599   gfc_se rse;
1600   gfc_ss *lss;
1601   gfc_ss *rss;
1602   gfc_loopinfo loop;
1603   gfc_loopinfo loop2;
1604   gfc_ss_info *info;
1605   tree offset;
1606   tree tmp_index;
1607   tree tmp;
1608   tree base_type;
1609   stmtblock_t body;
1610   int n;
1611
1612   gcc_assert (expr->expr_type == EXPR_VARIABLE);
1613
1614   gfc_init_se (&lse, NULL);
1615   gfc_init_se (&rse, NULL);
1616
1617   /* Walk the argument expression.  */
1618   rss = gfc_walk_expr (expr);
1619
1620   gcc_assert (rss != gfc_ss_terminator);
1621  
1622   /* Initialize the scalarizer.  */
1623   gfc_init_loopinfo (&loop);
1624   gfc_add_ss_to_loop (&loop, rss);
1625
1626   /* Calculate the bounds of the scalarization.  */
1627   gfc_conv_ss_startstride (&loop);
1628
1629   /* Build an ss for the temporary.  */
1630   base_type = gfc_typenode_for_spec (&expr->ts);
1631   if (GFC_ARRAY_TYPE_P (base_type)
1632                 || GFC_DESCRIPTOR_TYPE_P (base_type))
1633     base_type = gfc_get_element_type (base_type);
1634
1635   loop.temp_ss = gfc_get_ss ();;
1636   loop.temp_ss->type = GFC_SS_TEMP;
1637   loop.temp_ss->data.temp.type = base_type;
1638
1639   if (expr->ts.type == BT_CHARACTER)
1640     {
1641       gfc_ref *char_ref = expr->ref;
1642
1643       for (; expr->ts.cl == NULL && char_ref; char_ref = char_ref->next)
1644         if (char_ref->type == REF_SUBSTRING)
1645           {
1646             gfc_se tmp_se;
1647
1648             expr->ts.cl = gfc_get_charlen ();
1649             expr->ts.cl->next = char_ref->u.ss.length->next;
1650             char_ref->u.ss.length->next = expr->ts.cl;
1651
1652             gfc_init_se (&tmp_se, NULL);
1653             gfc_conv_expr_type (&tmp_se, char_ref->u.ss.end,
1654                                 gfc_array_index_type);
1655             tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1656                                tmp_se.expr, gfc_index_one_node);
1657             tmp = gfc_evaluate_now (tmp, &parmse->pre);
1658             gfc_init_se (&tmp_se, NULL);
1659             gfc_conv_expr_type (&tmp_se, char_ref->u.ss.start,
1660                                 gfc_array_index_type);
1661             tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1662                                tmp, tmp_se.expr);
1663             expr->ts.cl->backend_decl = tmp;
1664
1665             break;
1666           }
1667       loop.temp_ss->data.temp.type
1668                 = gfc_typenode_for_spec (&expr->ts);
1669       loop.temp_ss->string_length = expr->ts.cl->backend_decl;
1670     }
1671
1672   loop.temp_ss->data.temp.dimen = loop.dimen;
1673   loop.temp_ss->next = gfc_ss_terminator;
1674
1675   /* Associate the SS with the loop.  */
1676   gfc_add_ss_to_loop (&loop, loop.temp_ss);
1677
1678   /* Setup the scalarizing loops.  */
1679   gfc_conv_loop_setup (&loop);
1680
1681   /* Pass the temporary descriptor back to the caller.  */
1682   info = &loop.temp_ss->data.info;
1683   parmse->expr = info->descriptor;
1684
1685   /* Setup the gfc_se structures.  */
1686   gfc_copy_loopinfo_to_se (&lse, &loop);
1687   gfc_copy_loopinfo_to_se (&rse, &loop);
1688
1689   rse.ss = rss;
1690   lse.ss = loop.temp_ss;
1691   gfc_mark_ss_chain_used (rss, 1);
1692   gfc_mark_ss_chain_used (loop.temp_ss, 1);
1693
1694   /* Start the scalarized loop body.  */
1695   gfc_start_scalarized_body (&loop, &body);
1696
1697   /* Translate the expression.  */
1698   gfc_conv_expr (&rse, expr);
1699
1700   gfc_conv_tmp_array_ref (&lse);
1701   gfc_advance_se_ss_chain (&lse);
1702
1703   if (intent != INTENT_OUT)
1704     {
1705       tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1706       gfc_add_expr_to_block (&body, tmp);
1707       gcc_assert (rse.ss == gfc_ss_terminator);
1708       gfc_trans_scalarizing_loops (&loop, &body);
1709     }
1710   else
1711     {
1712       /* Make sure that the temporary declaration survives.  */
1713       tmp = gfc_finish_block (&body);
1714       gfc_add_expr_to_block (&loop.pre, tmp);
1715     }
1716
1717   /* Add the post block after the second loop, so that any
1718      freeing of allocated memory is done at the right time.  */
1719   gfc_add_block_to_block (&parmse->pre, &loop.pre);
1720
1721   /**********Copy the temporary back again.*********/
1722
1723   gfc_init_se (&lse, NULL);
1724   gfc_init_se (&rse, NULL);
1725
1726   /* Walk the argument expression.  */
1727   lss = gfc_walk_expr (expr);
1728   rse.ss = loop.temp_ss;
1729   lse.ss = lss;
1730
1731   /* Initialize the scalarizer.  */
1732   gfc_init_loopinfo (&loop2);
1733   gfc_add_ss_to_loop (&loop2, lss);
1734
1735   /* Calculate the bounds of the scalarization.  */
1736   gfc_conv_ss_startstride (&loop2);
1737
1738   /* Setup the scalarizing loops.  */
1739   gfc_conv_loop_setup (&loop2);
1740
1741   gfc_copy_loopinfo_to_se (&lse, &loop2);
1742   gfc_copy_loopinfo_to_se (&rse, &loop2);
1743
1744   gfc_mark_ss_chain_used (lss, 1);
1745   gfc_mark_ss_chain_used (loop.temp_ss, 1);
1746
1747   /* Declare the variable to hold the temporary offset and start the
1748      scalarized loop body.  */
1749   offset = gfc_create_var (gfc_array_index_type, NULL);
1750   gfc_start_scalarized_body (&loop2, &body);
1751
1752   /* Build the offsets for the temporary from the loop variables.  The
1753      temporary array has lbounds of zero and strides of one in all
1754      dimensions, so this is very simple.  The offset is only computed
1755      outside the innermost loop, so the overall transfer could be
1756      optimized further.  */
1757   info = &rse.ss->data.info;
1758
1759   tmp_index = gfc_index_zero_node;
1760   for (n = info->dimen - 1; n > 0; n--)
1761     {
1762       tree tmp_str;
1763       tmp = rse.loop->loopvar[n];
1764       tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1765                          tmp, rse.loop->from[n]);
1766       tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1767                          tmp, tmp_index);
1768
1769       tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1770                              rse.loop->to[n-1], rse.loop->from[n-1]);
1771       tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1772                              tmp_str, gfc_index_one_node);
1773
1774       tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
1775                                tmp, tmp_str);
1776     }
1777
1778   tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1779                            tmp_index, rse.loop->from[0]);
1780   gfc_add_modify_expr (&rse.loop->code[0], offset, tmp_index);
1781
1782   tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1783                            rse.loop->loopvar[0], offset);
1784
1785   /* Now use the offset for the reference.  */
1786   tmp = build_fold_indirect_ref (info->data);
1787   rse.expr = gfc_build_array_ref (tmp, tmp_index);
1788
1789   if (expr->ts.type == BT_CHARACTER)
1790     rse.string_length = expr->ts.cl->backend_decl;
1791
1792   gfc_conv_expr (&lse, expr);
1793
1794   gcc_assert (lse.ss == gfc_ss_terminator);
1795
1796   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1797   gfc_add_expr_to_block (&body, tmp);
1798   
1799   /* Generate the copying loops.  */
1800   gfc_trans_scalarizing_loops (&loop2, &body);
1801
1802   /* Wrap the whole thing up by adding the second loop to the post-block
1803      and following it by the post-block of the first loop.  In this way,
1804      if the temporary needs freeing, it is done after use!  */
1805   if (intent != INTENT_IN)
1806     {
1807       gfc_add_block_to_block (&parmse->post, &loop2.pre);
1808       gfc_add_block_to_block (&parmse->post, &loop2.post);
1809     }
1810
1811   gfc_add_block_to_block (&parmse->post, &loop.post);
1812
1813   gfc_cleanup_loop (&loop);
1814   gfc_cleanup_loop (&loop2);
1815
1816   /* Pass the string length to the argument expression.  */
1817   if (expr->ts.type == BT_CHARACTER)
1818     parmse->string_length = expr->ts.cl->backend_decl;
1819
1820   /* We want either the address for the data or the address of the descriptor,
1821      depending on the mode of passing array arguments.  */
1822   if (g77)
1823     parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
1824   else
1825     parmse->expr = build_fold_addr_expr (parmse->expr);
1826
1827   return;
1828 }
1829
1830 /* Is true if the last array reference is followed by a component reference.  */
1831
1832 static bool
1833 is_aliased_array (gfc_expr * e)
1834 {
1835   gfc_ref * ref;
1836   bool seen_array;
1837
1838   seen_array = false;   
1839   for (ref = e->ref; ref; ref = ref->next)
1840     {
1841       if (ref->type == REF_ARRAY)
1842         seen_array = true;
1843
1844       if (ref->next == NULL
1845             && ref->type != REF_ARRAY)
1846         return seen_array;
1847     }
1848   return false;
1849 }
1850
1851 /* Generate code for a procedure call.  Note can return se->post != NULL.
1852    If se->direct_byref is set then se->expr contains the return parameter.
1853    Return nonzero, if the call has alternate specifiers.  */
1854
1855 int
1856 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
1857                         gfc_actual_arglist * arg)
1858 {
1859   gfc_interface_mapping mapping;
1860   tree arglist;
1861   tree retargs;
1862   tree tmp;
1863   tree fntype;
1864   gfc_se parmse;
1865   gfc_ss *argss;
1866   gfc_ss_info *info;
1867   int byref;
1868   tree type;
1869   tree var;
1870   tree len;
1871   tree stringargs;
1872   gfc_formal_arglist *formal;
1873   int has_alternate_specifier = 0;
1874   bool need_interface_mapping;
1875   bool callee_alloc;
1876   gfc_typespec ts;
1877   gfc_charlen cl;
1878   gfc_expr *e;
1879   gfc_symbol *fsym;
1880   stmtblock_t post;
1881
1882   arglist = NULL_TREE;
1883   retargs = NULL_TREE;
1884   stringargs = NULL_TREE;
1885   var = NULL_TREE;
1886   len = NULL_TREE;
1887
1888   if (se->ss != NULL)
1889     {
1890       if (!sym->attr.elemental)
1891         {
1892           gcc_assert (se->ss->type == GFC_SS_FUNCTION);
1893           if (se->ss->useflags)
1894             {
1895               gcc_assert (gfc_return_by_reference (sym)
1896                       && sym->result->attr.dimension);
1897               gcc_assert (se->loop != NULL);
1898
1899               /* Access the previously obtained result.  */
1900               gfc_conv_tmp_array_ref (se);
1901               gfc_advance_se_ss_chain (se);
1902               return 0;
1903             }
1904         }
1905       info = &se->ss->data.info;
1906     }
1907   else
1908     info = NULL;
1909
1910   gfc_init_block (&post);
1911   gfc_init_interface_mapping (&mapping);
1912   need_interface_mapping = ((sym->ts.type == BT_CHARACTER
1913                                   && sym->ts.cl->length
1914                                   && sym->ts.cl->length->expr_type
1915                                                 != EXPR_CONSTANT)
1916                               || sym->attr.dimension);
1917   formal = sym->formal;
1918   /* Evaluate the arguments.  */
1919   for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
1920     {
1921       e = arg->expr;
1922       fsym = formal ? formal->sym : NULL;
1923       if (e == NULL)
1924         {
1925
1926           if (se->ignore_optional)
1927             {
1928               /* Some intrinsics have already been resolved to the correct
1929                  parameters.  */
1930               continue;
1931             }
1932           else if (arg->label)
1933             {
1934               has_alternate_specifier = 1;
1935               continue;
1936             }
1937           else
1938             {
1939               /* Pass a NULL pointer for an absent arg.  */
1940               gfc_init_se (&parmse, NULL);
1941               parmse.expr = null_pointer_node;
1942               if (arg->missing_arg_type == BT_CHARACTER)
1943                 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
1944             }
1945         }
1946       else if (se->ss && se->ss->useflags)
1947         {
1948           /* An elemental function inside a scalarized loop.  */
1949           gfc_init_se (&parmse, se);
1950           gfc_conv_expr_reference (&parmse, e);
1951         }
1952       else
1953         {
1954           /* A scalar or transformational function.  */
1955           gfc_init_se (&parmse, NULL);
1956           argss = gfc_walk_expr (e);
1957
1958           if (argss == gfc_ss_terminator)
1959             {
1960               gfc_conv_expr_reference (&parmse, e);
1961               if (fsym && fsym->attr.pointer
1962                   && e->expr_type != EXPR_NULL)
1963                 {
1964                   /* Scalar pointer dummy args require an extra level of
1965                   indirection. The null pointer already contains
1966                   this level of indirection.  */
1967                   parmse.expr = build_fold_addr_expr (parmse.expr);
1968                 }
1969             }
1970           else
1971             {
1972               /* If the procedure requires an explicit interface, the actual
1973                  argument is passed according to the corresponding formal
1974                  argument.  If the corresponding formal argument is a POINTER,
1975                  ALLOCATABLE or assumed shape, we do not use g77's calling
1976                  convention, and pass the address of the array descriptor
1977                  instead. Otherwise we use g77's calling convention.  */
1978               int f;
1979               f = (fsym != NULL)
1980                   && !(fsym->attr.pointer || fsym->attr.allocatable)
1981                   && fsym->as->type != AS_ASSUMED_SHAPE;
1982               f = f || !sym->attr.always_explicit;
1983
1984               if (e->expr_type == EXPR_VARIABLE
1985                     && is_aliased_array (e))
1986                 /* The actual argument is a component reference to an
1987                    array of derived types.  In this case, the argument
1988                    is converted to a temporary, which is passed and then
1989                    written back after the procedure call.  */
1990                 gfc_conv_aliased_arg (&parmse, e, f,
1991                         fsym ? fsym->attr.intent : INTENT_INOUT);
1992               else
1993                 gfc_conv_array_parameter (&parmse, e, argss, f);
1994
1995               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is 
1996                  allocated on entry, it must be deallocated.  */
1997               if (fsym && fsym->attr.allocatable
1998                   && fsym->attr.intent == INTENT_OUT)
1999                 {
2000                   tmp = e->symtree->n.sym->backend_decl;
2001                   if (e->symtree->n.sym->attr.dummy)
2002                     tmp = build_fold_indirect_ref (tmp);
2003                   tmp = gfc_trans_dealloc_allocated (tmp);
2004                   gfc_add_expr_to_block (&se->pre, tmp);
2005                 }
2006
2007             } 
2008         }
2009
2010       /* If an optional argument is itself an optional dummy argument,
2011          check its presence and substitute a null if absent.  */
2012       if (e && e->expr_type == EXPR_VARIABLE
2013             && e->symtree->n.sym->attr.optional
2014             && fsym && fsym->attr.optional)
2015         gfc_conv_missing_dummy (&parmse, e, fsym->ts);
2016
2017       if (fsym && need_interface_mapping)
2018         gfc_add_interface_mapping (&mapping, fsym, &parmse);
2019
2020       gfc_add_block_to_block (&se->pre, &parmse.pre);
2021       gfc_add_block_to_block (&post, &parmse.post);
2022
2023       /* If an INTENT(OUT) dummy of derived type has a default
2024          initializer, it must be (re)initialized here.  */
2025       if (fsym && fsym->attr.intent == INTENT_OUT && fsym->ts.type == BT_DERIVED
2026           && fsym->value)
2027         {
2028           gcc_assert (!fsym->attr.allocatable);
2029           tmp = gfc_trans_assignment (e, fsym->value);
2030           gfc_add_expr_to_block (&se->pre, tmp);
2031         }
2032
2033       /* Character strings are passed as two parameters, a length and a
2034          pointer.  */
2035       if (parmse.string_length != NULL_TREE)
2036         stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2037
2038       arglist = gfc_chainon_list (arglist, parmse.expr);
2039     }
2040   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2041
2042   ts = sym->ts;
2043   if (ts.type == BT_CHARACTER)
2044     {
2045       if (sym->ts.cl->length == NULL)
2046         {
2047           /* Assumed character length results are not allowed by 5.1.1.5 of the
2048              standard and are trapped in resolve.c; except in the case of SPREAD
2049              (and other intrinsics?).  In this case, we take the character length
2050              of the first argument for the result.  */
2051           cl.backend_decl = TREE_VALUE (stringargs);
2052         }
2053       else
2054         {
2055           /* Calculate the length of the returned string.  */
2056           gfc_init_se (&parmse, NULL);
2057           if (need_interface_mapping)
2058             gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2059           else
2060             gfc_conv_expr (&parmse, sym->ts.cl->length);
2061           gfc_add_block_to_block (&se->pre, &parmse.pre);
2062           gfc_add_block_to_block (&se->post, &parmse.post);
2063           cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr);
2064         }
2065
2066       /* Set up a charlen structure for it.  */
2067       cl.next = NULL;
2068       cl.length = NULL;
2069       ts.cl = &cl;
2070
2071       len = cl.backend_decl;
2072     }
2073
2074   byref = gfc_return_by_reference (sym);
2075   if (byref)
2076     {
2077       if (se->direct_byref)
2078         retargs = gfc_chainon_list (retargs, se->expr);
2079       else if (sym->result->attr.dimension)
2080         {
2081           gcc_assert (se->loop && info);
2082
2083           /* Set the type of the array.  */
2084           tmp = gfc_typenode_for_spec (&ts);
2085           info->dimen = se->loop->dimen;
2086
2087           /* Evaluate the bounds of the result, if known.  */
2088           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2089
2090           /* Create a temporary to store the result.  In case the function
2091              returns a pointer, the temporary will be a shallow copy and
2092              mustn't be deallocated.  */
2093           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2094           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2095                                        false, !sym->attr.pointer, callee_alloc,
2096                                        true);
2097
2098           /* Pass the temporary as the first argument.  */
2099           tmp = info->descriptor;
2100           tmp = build_fold_addr_expr (tmp);
2101           retargs = gfc_chainon_list (retargs, tmp);
2102         }
2103       else if (ts.type == BT_CHARACTER)
2104         {
2105           /* Pass the string length.  */
2106           type = gfc_get_character_type (ts.kind, ts.cl);
2107           type = build_pointer_type (type);
2108
2109           /* Return an address to a char[0:len-1]* temporary for
2110              character pointers.  */
2111           if (sym->attr.pointer || sym->attr.allocatable)
2112             {
2113               /* Build char[0:len-1] * pstr.  */
2114               tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
2115                                  build_int_cst (gfc_charlen_type_node, 1));
2116               tmp = build_range_type (gfc_array_index_type,
2117                                       gfc_index_zero_node, tmp);
2118               tmp = build_array_type (gfc_character1_type_node, tmp);
2119               var = gfc_create_var (build_pointer_type (tmp), "pstr");
2120
2121               /* Provide an address expression for the function arguments.  */
2122               var = build_fold_addr_expr (var);
2123             }
2124           else
2125             var = gfc_conv_string_tmp (se, type, len);
2126
2127           retargs = gfc_chainon_list (retargs, var);
2128         }
2129       else
2130         {
2131           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2132
2133           type = gfc_get_complex_type (ts.kind);
2134           var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2135           retargs = gfc_chainon_list (retargs, var);
2136         }
2137
2138       /* Add the string length to the argument list.  */
2139       if (ts.type == BT_CHARACTER)
2140         retargs = gfc_chainon_list (retargs, len);
2141     }
2142   gfc_free_interface_mapping (&mapping);
2143
2144   /* Add the return arguments.  */
2145   arglist = chainon (retargs, arglist);
2146
2147   /* Add the hidden string length parameters to the arguments.  */
2148   arglist = chainon (arglist, stringargs);
2149
2150   /* Generate the actual call.  */
2151   gfc_conv_function_val (se, sym);
2152   /* If there are alternate return labels, function type should be
2153      integer.  Can't modify the type in place though, since it can be shared
2154      with other functions.  */
2155   if (has_alternate_specifier
2156       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2157     {
2158       gcc_assert (! sym->attr.dummy);
2159       TREE_TYPE (sym->backend_decl)
2160         = build_function_type (integer_type_node,
2161                                TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2162       se->expr = build_fold_addr_expr (sym->backend_decl);
2163     }
2164
2165   fntype = TREE_TYPE (TREE_TYPE (se->expr));
2166   se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
2167                      arglist, NULL_TREE);
2168
2169   /* If we have a pointer function, but we don't want a pointer, e.g.
2170      something like
2171         x = f()
2172      where f is pointer valued, we have to dereference the result.  */
2173   if (!se->want_pointer && !byref && sym->attr.pointer)
2174     se->expr = build_fold_indirect_ref (se->expr);
2175
2176   /* f2c calling conventions require a scalar default real function to
2177      return a double precision result.  Convert this back to default
2178      real.  We only care about the cases that can happen in Fortran 77.
2179   */
2180   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2181       && sym->ts.kind == gfc_default_real_kind
2182       && !sym->attr.always_explicit)
2183     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2184
2185   /* A pure function may still have side-effects - it may modify its
2186      parameters.  */
2187   TREE_SIDE_EFFECTS (se->expr) = 1;
2188 #if 0
2189   if (!sym->attr.pure)
2190     TREE_SIDE_EFFECTS (se->expr) = 1;
2191 #endif
2192
2193   if (byref)
2194     {
2195       /* Add the function call to the pre chain.  There is no expression.  */
2196       gfc_add_expr_to_block (&se->pre, se->expr);
2197       se->expr = NULL_TREE;
2198
2199       if (!se->direct_byref)
2200         {
2201           if (sym->attr.dimension)
2202             {
2203               if (flag_bounds_check)
2204                 {
2205                   /* Check the data pointer hasn't been modified.  This would
2206                      happen in a function returning a pointer.  */
2207                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
2208                   tmp = fold_build2 (NE_EXPR, boolean_type_node,
2209                                      tmp, info->data);
2210                   gfc_trans_runtime_check (tmp, gfc_msg_fault, &se->pre, NULL);
2211                 }
2212               se->expr = info->descriptor;
2213               /* Bundle in the string length.  */
2214               se->string_length = len;
2215             }
2216           else if (sym->ts.type == BT_CHARACTER)
2217             {
2218               /* Dereference for character pointer results.  */
2219               if (sym->attr.pointer || sym->attr.allocatable)
2220                 se->expr = build_fold_indirect_ref (var);
2221               else
2222                 se->expr = var;
2223
2224               se->string_length = len;
2225             }
2226           else
2227             {
2228               gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2229               se->expr = build_fold_indirect_ref (var);
2230             }
2231         }
2232     }
2233
2234   /* Follow the function call with the argument post block.  */
2235   if (byref)
2236     gfc_add_block_to_block (&se->pre, &post);
2237   else
2238     gfc_add_block_to_block (&se->post, &post);
2239
2240   return has_alternate_specifier;
2241 }
2242
2243
2244 /* Generate code to copy a string.  */
2245
2246 static void
2247 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
2248                        tree slength, tree src)
2249 {
2250   tree tmp, dlen, slen;
2251   tree dsc;
2252   tree ssc;
2253   tree cond;
2254   tree cond2;
2255   tree tmp2;
2256   tree tmp3;
2257   tree tmp4;
2258   stmtblock_t tempblock;
2259
2260   dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
2261   slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
2262
2263   /* Deal with single character specially.  */
2264   dsc = gfc_to_single_character (dlen, dest);
2265   ssc = gfc_to_single_character (slen, src);
2266   if (dsc != NULL_TREE && ssc != NULL_TREE)
2267     {
2268       gfc_add_modify_expr (block, dsc, ssc);
2269       return;
2270     }
2271
2272   /* Do nothing if the destination length is zero.  */
2273   cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
2274                       build_int_cst (gfc_charlen_type_node, 0));
2275
2276   /* The following code was previously in _gfortran_copy_string:
2277
2278        // The two strings may overlap so we use memmove.
2279        void
2280        copy_string (GFC_INTEGER_4 destlen, char * dest,
2281                     GFC_INTEGER_4 srclen, const char * src)
2282        {
2283          if (srclen >= destlen)
2284            {
2285              // This will truncate if too long.
2286              memmove (dest, src, destlen);
2287            }
2288          else
2289            {
2290              memmove (dest, src, srclen);
2291              // Pad with spaces.
2292              memset (&dest[srclen], ' ', destlen - srclen);
2293            }
2294        }
2295
2296      We're now doing it here for better optimization, but the logic
2297      is the same.  */
2298   
2299   /* Truncate string if source is too long.  */
2300   cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
2301   tmp2 = gfc_chainon_list (NULL_TREE, dest);
2302   tmp2 = gfc_chainon_list (tmp2, src);
2303   tmp2 = gfc_chainon_list (tmp2, dlen);
2304   tmp2 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp2);
2305
2306   /* Else copy and pad with spaces.  */
2307   tmp3 = gfc_chainon_list (NULL_TREE, dest);
2308   tmp3 = gfc_chainon_list (tmp3, src);
2309   tmp3 = gfc_chainon_list (tmp3, slen);
2310   tmp3 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp3);
2311
2312   tmp4 = fold_build2 (PLUS_EXPR, pchar_type_node, dest,
2313                       fold_convert (pchar_type_node, slen));
2314   tmp4 = gfc_chainon_list (NULL_TREE, tmp4);
2315   tmp4 = gfc_chainon_list (tmp4, build_int_cst
2316                                    (gfc_get_int_type (gfc_c_int_kind),
2317                                     lang_hooks.to_target_charset (' ')));
2318   tmp4 = gfc_chainon_list (tmp4, fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
2319                                               dlen, slen));
2320   tmp4 = build_function_call_expr (built_in_decls[BUILT_IN_MEMSET], tmp4);
2321
2322   gfc_init_block (&tempblock);
2323   gfc_add_expr_to_block (&tempblock, tmp3);
2324   gfc_add_expr_to_block (&tempblock, tmp4);
2325   tmp3 = gfc_finish_block (&tempblock);
2326
2327   /* The whole copy_string function is there.  */
2328   tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
2329   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
2330   gfc_add_expr_to_block (block, tmp);
2331 }
2332
2333
2334 /* Translate a statement function.
2335    The value of a statement function reference is obtained by evaluating the
2336    expression using the values of the actual arguments for the values of the
2337    corresponding dummy arguments.  */
2338
2339 static void
2340 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2341 {
2342   gfc_symbol *sym;
2343   gfc_symbol *fsym;
2344   gfc_formal_arglist *fargs;
2345   gfc_actual_arglist *args;
2346   gfc_se lse;
2347   gfc_se rse;
2348   gfc_saved_var *saved_vars;
2349   tree *temp_vars;
2350   tree type;
2351   tree tmp;
2352   int n;
2353
2354   sym = expr->symtree->n.sym;
2355   args = expr->value.function.actual;
2356   gfc_init_se (&lse, NULL);
2357   gfc_init_se (&rse, NULL);
2358
2359   n = 0;
2360   for (fargs = sym->formal; fargs; fargs = fargs->next)
2361     n++;
2362   saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2363   temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2364
2365   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2366     {
2367       /* Each dummy shall be specified, explicitly or implicitly, to be
2368          scalar.  */
2369       gcc_assert (fargs->sym->attr.dimension == 0);
2370       fsym = fargs->sym;
2371
2372       /* Create a temporary to hold the value.  */
2373       type = gfc_typenode_for_spec (&fsym->ts);
2374       temp_vars[n] = gfc_create_var (type, fsym->name);
2375
2376       if (fsym->ts.type == BT_CHARACTER)
2377         {
2378           /* Copy string arguments.  */
2379           tree arglen;
2380
2381           gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2382                   && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2383
2384           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
2385           tmp = gfc_build_addr_expr (build_pointer_type (type),
2386                                      temp_vars[n]);
2387
2388           gfc_conv_expr (&rse, args->expr);
2389           gfc_conv_string_parameter (&rse);
2390           gfc_add_block_to_block (&se->pre, &lse.pre);
2391           gfc_add_block_to_block (&se->pre, &rse.pre);
2392
2393           gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
2394                                  rse.expr);
2395           gfc_add_block_to_block (&se->pre, &lse.post);
2396           gfc_add_block_to_block (&se->pre, &rse.post);
2397         }
2398       else
2399         {
2400           /* For everything else, just evaluate the expression.  */
2401           gfc_conv_expr (&lse, args->expr);
2402
2403           gfc_add_block_to_block (&se->pre, &lse.pre);
2404           gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
2405           gfc_add_block_to_block (&se->pre, &lse.post);
2406         }
2407
2408       args = args->next;
2409     }
2410
2411   /* Use the temporary variables in place of the real ones.  */
2412   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2413     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
2414
2415   gfc_conv_expr (se, sym->value);
2416
2417   if (sym->ts.type == BT_CHARACTER)
2418     {
2419       gfc_conv_const_charlen (sym->ts.cl);
2420
2421       /* Force the expression to the correct length.  */
2422       if (!INTEGER_CST_P (se->string_length)
2423           || tree_int_cst_lt (se->string_length,
2424                               sym->ts.cl->backend_decl))
2425         {
2426           type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
2427           tmp = gfc_create_var (type, sym->name);
2428           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
2429           gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
2430                                  se->string_length, se->expr);
2431           se->expr = tmp;
2432         }
2433       se->string_length = sym->ts.cl->backend_decl;
2434     }
2435
2436   /* Restore the original variables.  */
2437   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2438     gfc_restore_sym (fargs->sym, &saved_vars[n]);
2439   gfc_free (saved_vars);
2440 }
2441
2442
2443 /* Translate a function expression.  */
2444
2445 static void
2446 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
2447 {
2448   gfc_symbol *sym;
2449
2450   if (expr->value.function.isym)
2451     {
2452       gfc_conv_intrinsic_function (se, expr);
2453       return;
2454     }
2455
2456   /* We distinguish statement functions from general functions to improve
2457      runtime performance.  */
2458   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2459     {
2460       gfc_conv_statement_function (se, expr);
2461       return;
2462     }
2463
2464   /* expr.value.function.esym is the resolved (specific) function symbol for
2465      most functions.  However this isn't set for dummy procedures.  */
2466   sym = expr->value.function.esym;
2467   if (!sym)
2468     sym = expr->symtree->n.sym;
2469   gfc_conv_function_call (se, sym, expr->value.function.actual);
2470 }
2471
2472
2473 static void
2474 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
2475 {
2476   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
2477   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
2478
2479   gfc_conv_tmp_array_ref (se);
2480   gfc_advance_se_ss_chain (se);
2481 }
2482
2483
2484 /* Build a static initializer.  EXPR is the expression for the initial value.
2485    The other parameters describe the variable of the component being 
2486    initialized. EXPR may be null.  */
2487
2488 tree
2489 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
2490                       bool array, bool pointer)
2491 {
2492   gfc_se se;
2493
2494   if (!(expr || pointer))
2495     return NULL_TREE;
2496
2497   if (array)
2498     {
2499       /* Arrays need special handling.  */
2500       if (pointer)
2501         return gfc_build_null_descriptor (type);
2502       else
2503         return gfc_conv_array_initializer (type, expr);
2504     }
2505   else if (pointer)
2506     return fold_convert (type, null_pointer_node);
2507   else
2508     {
2509       switch (ts->type)
2510         {
2511         case BT_DERIVED:
2512           gfc_init_se (&se, NULL);
2513           gfc_conv_structure (&se, expr, 1);
2514           return se.expr;
2515
2516         case BT_CHARACTER:
2517           return gfc_conv_string_init (ts->cl->backend_decl,expr);
2518
2519         default:
2520           gfc_init_se (&se, NULL);
2521           gfc_conv_constant (&se, expr);
2522           return se.expr;
2523         }
2524     }
2525 }
2526   
2527 static tree
2528 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2529 {
2530   gfc_se rse;
2531   gfc_se lse;
2532   gfc_ss *rss;
2533   gfc_ss *lss;
2534   stmtblock_t body;
2535   stmtblock_t block;
2536   gfc_loopinfo loop;
2537   int n;
2538   tree tmp;
2539
2540   gfc_start_block (&block);
2541
2542   /* Initialize the scalarizer.  */
2543   gfc_init_loopinfo (&loop);
2544
2545   gfc_init_se (&lse, NULL);
2546   gfc_init_se (&rse, NULL);
2547
2548   /* Walk the rhs.  */
2549   rss = gfc_walk_expr (expr);
2550   if (rss == gfc_ss_terminator)
2551     {
2552       /* The rhs is scalar.  Add a ss for the expression.  */
2553       rss = gfc_get_ss ();
2554       rss->next = gfc_ss_terminator;
2555       rss->type = GFC_SS_SCALAR;
2556       rss->expr = expr;
2557     }
2558
2559   /* Create a SS for the destination.  */
2560   lss = gfc_get_ss ();
2561   lss->type = GFC_SS_COMPONENT;
2562   lss->expr = NULL;
2563   lss->shape = gfc_get_shape (cm->as->rank);
2564   lss->next = gfc_ss_terminator;
2565   lss->data.info.dimen = cm->as->rank;
2566   lss->data.info.descriptor = dest;
2567   lss->data.info.data = gfc_conv_array_data (dest);
2568   lss->data.info.offset = gfc_conv_array_offset (dest);
2569   for (n = 0; n < cm->as->rank; n++)
2570     {
2571       lss->data.info.dim[n] = n;
2572       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
2573       lss->data.info.stride[n] = gfc_index_one_node;
2574
2575       mpz_init (lss->shape[n]);
2576       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
2577                cm->as->lower[n]->value.integer);
2578       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
2579     }
2580   
2581   /* Associate the SS with the loop.  */
2582   gfc_add_ss_to_loop (&loop, lss);
2583   gfc_add_ss_to_loop (&loop, rss);
2584
2585   /* Calculate the bounds of the scalarization.  */
2586   gfc_conv_ss_startstride (&loop);
2587
2588   /* Setup the scalarizing loops.  */
2589   gfc_conv_loop_setup (&loop);
2590
2591   /* Setup the gfc_se structures.  */
2592   gfc_copy_loopinfo_to_se (&lse, &loop);
2593   gfc_copy_loopinfo_to_se (&rse, &loop);
2594
2595   rse.ss = rss;
2596   gfc_mark_ss_chain_used (rss, 1);
2597   lse.ss = lss;
2598   gfc_mark_ss_chain_used (lss, 1);
2599
2600   /* Start the scalarized loop body.  */
2601   gfc_start_scalarized_body (&loop, &body);
2602
2603   gfc_conv_tmp_array_ref (&lse);
2604   if (cm->ts.type == BT_CHARACTER)
2605     lse.string_length = cm->ts.cl->backend_decl;
2606
2607   gfc_conv_expr (&rse, expr);
2608
2609   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);
2610   gfc_add_expr_to_block (&body, tmp);
2611
2612   gcc_assert (rse.ss == gfc_ss_terminator);
2613
2614   /* Generate the copying loops.  */
2615   gfc_trans_scalarizing_loops (&loop, &body);
2616
2617   /* Wrap the whole thing up.  */
2618   gfc_add_block_to_block (&block, &loop.pre);
2619   gfc_add_block_to_block (&block, &loop.post);
2620
2621   for (n = 0; n < cm->as->rank; n++)
2622     mpz_clear (lss->shape[n]);
2623   gfc_free (lss->shape);
2624
2625   gfc_cleanup_loop (&loop);
2626
2627   return gfc_finish_block (&block);
2628 }
2629
2630 /* Assign a single component of a derived type constructor.  */
2631
2632 static tree
2633 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2634 {
2635   gfc_se se;
2636   gfc_ss *rss;
2637   stmtblock_t block;
2638   tree tmp;
2639
2640   gfc_start_block (&block);
2641   if (cm->pointer)
2642     {
2643       gfc_init_se (&se, NULL);
2644       /* Pointer component.  */
2645       if (cm->dimension)
2646         {
2647           /* Array pointer.  */
2648           if (expr->expr_type == EXPR_NULL)
2649             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2650           else
2651             {
2652               rss = gfc_walk_expr (expr);
2653               se.direct_byref = 1;
2654               se.expr = dest;
2655               gfc_conv_expr_descriptor (&se, expr, rss);
2656               gfc_add_block_to_block (&block, &se.pre);
2657               gfc_add_block_to_block (&block, &se.post);
2658             }
2659         }
2660       else
2661         {
2662           /* Scalar pointers.  */
2663           se.want_pointer = 1;
2664           gfc_conv_expr (&se, expr);
2665           gfc_add_block_to_block (&block, &se.pre);
2666           gfc_add_modify_expr (&block, dest,
2667                                fold_convert (TREE_TYPE (dest), se.expr));
2668           gfc_add_block_to_block (&block, &se.post);
2669         }
2670     }
2671   else if (cm->dimension)
2672     {
2673       tmp = gfc_trans_subarray_assign (dest, cm, expr);
2674       gfc_add_expr_to_block (&block, tmp);
2675     }
2676   else if (expr->ts.type == BT_DERIVED)
2677     {
2678       if (expr->expr_type != EXPR_STRUCTURE)
2679         {
2680           gfc_init_se (&se, NULL);
2681           gfc_conv_expr (&se, expr);
2682           gfc_add_modify_expr (&block, dest,
2683                                fold_convert (TREE_TYPE (dest), se.expr));
2684         }
2685       else
2686         {
2687           /* Nested constructors.  */
2688           tmp = gfc_trans_structure_assign (dest, expr);
2689           gfc_add_expr_to_block (&block, tmp);
2690         }
2691     }
2692   else
2693     {
2694       /* Scalar component.  */
2695       gfc_se lse;
2696
2697       gfc_init_se (&se, NULL);
2698       gfc_init_se (&lse, NULL);
2699
2700       gfc_conv_expr (&se, expr);
2701       if (cm->ts.type == BT_CHARACTER)
2702         lse.string_length = cm->ts.cl->backend_decl;
2703       lse.expr = dest;
2704       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts.type);
2705       gfc_add_expr_to_block (&block, tmp);
2706     }
2707   return gfc_finish_block (&block);
2708 }
2709
2710 /* Assign a derived type constructor to a variable.  */
2711
2712 static tree
2713 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
2714 {
2715   gfc_constructor *c;
2716   gfc_component *cm;
2717   stmtblock_t block;
2718   tree field;
2719   tree tmp;
2720
2721   gfc_start_block (&block);
2722   cm = expr->ts.derived->components;
2723   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2724     {
2725       /* Skip absent members in default initializers.  */
2726       if (!c->expr)
2727         continue;
2728
2729       field = cm->backend_decl;
2730       tmp = build3 (COMPONENT_REF, TREE_TYPE (field), dest, field, NULL_TREE);
2731       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
2732       gfc_add_expr_to_block (&block, tmp);
2733     }
2734   return gfc_finish_block (&block);
2735 }
2736
2737 /* Build an expression for a constructor. If init is nonzero then
2738    this is part of a static variable initializer.  */
2739
2740 void
2741 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
2742 {
2743   gfc_constructor *c;
2744   gfc_component *cm;
2745   tree val;
2746   tree type;
2747   tree tmp;
2748   VEC(constructor_elt,gc) *v = NULL;
2749
2750   gcc_assert (se->ss == NULL);
2751   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
2752   type = gfc_typenode_for_spec (&expr->ts);
2753
2754   if (!init)
2755     {
2756       /* Create a temporary variable and fill it in.  */
2757       se->expr = gfc_create_var (type, expr->ts.derived->name);
2758       tmp = gfc_trans_structure_assign (se->expr, expr);
2759       gfc_add_expr_to_block (&se->pre, tmp);
2760       return;
2761     }
2762
2763   cm = expr->ts.derived->components;
2764   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2765     {
2766       /* Skip absent members in default initializers.  */
2767       if (!c->expr)
2768         continue;
2769
2770       val = gfc_conv_initializer (c->expr, &cm->ts,
2771           TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
2772
2773       /* Append it to the constructor list.  */
2774       CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
2775     }
2776   se->expr = build_constructor (type, v);
2777 }
2778
2779
2780 /* Translate a substring expression.  */
2781
2782 static void
2783 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
2784 {
2785   gfc_ref *ref;
2786
2787   ref = expr->ref;
2788
2789   gcc_assert (ref->type == REF_SUBSTRING);
2790
2791   se->expr = gfc_build_string_const(expr->value.character.length,
2792                                     expr->value.character.string);
2793   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
2794   TYPE_STRING_FLAG (TREE_TYPE (se->expr))=1;
2795
2796   gfc_conv_substring(se,ref,expr->ts.kind);
2797 }
2798
2799
2800 /* Entry point for expression translation.  Evaluates a scalar quantity.
2801    EXPR is the expression to be translated, and SE is the state structure if
2802    called from within the scalarized.  */
2803
2804 void
2805 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
2806 {
2807   if (se->ss && se->ss->expr == expr
2808       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
2809     {
2810       /* Substitute a scalar expression evaluated outside the scalarization
2811          loop.  */
2812       se->expr = se->ss->data.scalar.expr;
2813       se->string_length = se->ss->string_length;
2814       gfc_advance_se_ss_chain (se);
2815       return;
2816     }
2817
2818   switch (expr->expr_type)
2819     {
2820     case EXPR_OP:
2821       gfc_conv_expr_op (se, expr);
2822       break;
2823
2824     case EXPR_FUNCTION:
2825       gfc_conv_function_expr (se, expr);
2826       break;
2827
2828     case EXPR_CONSTANT:
2829       gfc_conv_constant (se, expr);
2830       break;
2831
2832     case EXPR_VARIABLE:
2833       gfc_conv_variable (se, expr);
2834       break;
2835
2836     case EXPR_NULL:
2837       se->expr = null_pointer_node;
2838       break;
2839
2840     case EXPR_SUBSTRING:
2841       gfc_conv_substring_expr (se, expr);
2842       break;
2843
2844     case EXPR_STRUCTURE:
2845       gfc_conv_structure (se, expr, 0);
2846       break;
2847
2848     case EXPR_ARRAY:
2849       gfc_conv_array_constructor_expr (se, expr);
2850       break;
2851
2852     default:
2853       gcc_unreachable ();
2854       break;
2855     }
2856 }
2857
2858 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
2859    of an assignment.  */
2860 void
2861 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
2862 {
2863   gfc_conv_expr (se, expr);
2864   /* All numeric lvalues should have empty post chains.  If not we need to
2865      figure out a way of rewriting an lvalue so that it has no post chain.  */
2866   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
2867 }
2868
2869 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
2870    numeric expressions.  Used for scalar values where inserting cleanup code
2871    is inconvenient.  */
2872 void
2873 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
2874 {
2875   tree val;
2876
2877   gcc_assert (expr->ts.type != BT_CHARACTER);
2878   gfc_conv_expr (se, expr);
2879   if (se->post.head)
2880     {
2881       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
2882       gfc_add_modify_expr (&se->pre, val, se->expr);
2883       se->expr = val;
2884       gfc_add_block_to_block (&se->pre, &se->post);
2885     }
2886 }
2887
2888 /* Helper to translate and expression and convert it to a particular type.  */
2889 void
2890 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
2891 {
2892   gfc_conv_expr_val (se, expr);
2893   se->expr = convert (type, se->expr);
2894 }
2895
2896
2897 /* Converts an expression so that it can be passed by reference.  Scalar
2898    values only.  */
2899
2900 void
2901 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
2902 {
2903   tree var;
2904
2905   if (se->ss && se->ss->expr == expr
2906       && se->ss->type == GFC_SS_REFERENCE)
2907     {
2908       se->expr = se->ss->data.scalar.expr;
2909       se->string_length = se->ss->string_length;
2910       gfc_advance_se_ss_chain (se);
2911       return;
2912     }
2913
2914   if (expr->ts.type == BT_CHARACTER)
2915     {
2916       gfc_conv_expr (se, expr);
2917       gfc_conv_string_parameter (se);
2918       return;
2919     }
2920
2921   if (expr->expr_type == EXPR_VARIABLE)
2922     {
2923       se->want_pointer = 1;
2924       gfc_conv_expr (se, expr);
2925       if (se->post.head)
2926         {
2927           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2928           gfc_add_modify_expr (&se->pre, var, se->expr);
2929           gfc_add_block_to_block (&se->pre, &se->post);
2930           se->expr = var;
2931         }
2932       return;
2933     }
2934
2935   gfc_conv_expr (se, expr);
2936
2937   /* Create a temporary var to hold the value.  */
2938   if (TREE_CONSTANT (se->expr))
2939     {
2940       var = build_decl (CONST_DECL, NULL, TREE_TYPE (se->expr));
2941       DECL_INITIAL (var) = se->expr;
2942       pushdecl (var);
2943     }
2944   else
2945     {
2946       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2947       gfc_add_modify_expr (&se->pre, var, se->expr);
2948     }
2949   gfc_add_block_to_block (&se->pre, &se->post);
2950
2951   /* Take the address of that value.  */
2952   se->expr = build_fold_addr_expr (var);
2953 }
2954
2955
2956 tree
2957 gfc_trans_pointer_assign (gfc_code * code)
2958 {
2959   return gfc_trans_pointer_assignment (code->expr, code->expr2);
2960 }
2961
2962
2963 /* Generate code for a pointer assignment.  */
2964
2965 tree
2966 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
2967 {
2968   gfc_se lse;
2969   gfc_se rse;
2970   gfc_ss *lss;
2971   gfc_ss *rss;
2972   stmtblock_t block;
2973   tree desc;
2974   tree tmp;
2975
2976   gfc_start_block (&block);
2977
2978   gfc_init_se (&lse, NULL);
2979
2980   lss = gfc_walk_expr (expr1);
2981   rss = gfc_walk_expr (expr2);
2982   if (lss == gfc_ss_terminator)
2983     {
2984       /* Scalar pointers.  */
2985       lse.want_pointer = 1;
2986       gfc_conv_expr (&lse, expr1);
2987       gcc_assert (rss == gfc_ss_terminator);
2988       gfc_init_se (&rse, NULL);
2989       rse.want_pointer = 1;
2990       gfc_conv_expr (&rse, expr2);
2991       gfc_add_block_to_block (&block, &lse.pre);
2992       gfc_add_block_to_block (&block, &rse.pre);
2993       gfc_add_modify_expr (&block, lse.expr,
2994                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
2995       gfc_add_block_to_block (&block, &rse.post);
2996       gfc_add_block_to_block (&block, &lse.post);
2997     }
2998   else
2999     {
3000       /* Array pointer.  */
3001       gfc_conv_expr_descriptor (&lse, expr1, lss);
3002       switch (expr2->expr_type)
3003         {
3004         case EXPR_NULL:
3005           /* Just set the data pointer to null.  */
3006           gfc_conv_descriptor_data_set (&block, lse.expr, null_pointer_node);
3007           break;
3008
3009         case EXPR_VARIABLE:
3010           /* Assign directly to the pointer's descriptor.  */
3011           lse.direct_byref = 1;
3012           gfc_conv_expr_descriptor (&lse, expr2, rss);
3013           break;
3014
3015         default:
3016           /* Assign to a temporary descriptor and then copy that
3017              temporary to the pointer.  */
3018           desc = lse.expr;
3019           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
3020
3021           lse.expr = tmp;
3022           lse.direct_byref = 1;
3023           gfc_conv_expr_descriptor (&lse, expr2, rss);
3024           gfc_add_modify_expr (&lse.pre, desc, tmp);
3025           break;
3026         }
3027       gfc_add_block_to_block (&block, &lse.pre);
3028       gfc_add_block_to_block (&block, &lse.post);
3029     }
3030   return gfc_finish_block (&block);
3031 }
3032
3033
3034 /* Makes sure se is suitable for passing as a function string parameter.  */
3035 /* TODO: Need to check all callers fo this function.  It may be abused.  */
3036
3037 void
3038 gfc_conv_string_parameter (gfc_se * se)
3039 {
3040   tree type;
3041
3042   if (TREE_CODE (se->expr) == STRING_CST)
3043     {
3044       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3045       return;
3046     }
3047
3048   type = TREE_TYPE (se->expr);
3049   if (TYPE_STRING_FLAG (type))
3050     {
3051       gcc_assert (TREE_CODE (se->expr) != INDIRECT_REF);
3052       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3053     }
3054
3055   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
3056   gcc_assert (se->string_length
3057           && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
3058 }
3059
3060
3061 /* Generate code for assignment of scalar variables.  Includes character
3062    strings.  */
3063
3064 tree
3065 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, bt type)
3066 {
3067   stmtblock_t block;
3068
3069   gfc_init_block (&block);
3070
3071   if (type == BT_CHARACTER)
3072     {
3073       gcc_assert (lse->string_length != NULL_TREE
3074               && rse->string_length != NULL_TREE);
3075
3076       gfc_conv_string_parameter (lse);
3077       gfc_conv_string_parameter (rse);
3078
3079       gfc_add_block_to_block (&block, &lse->pre);
3080       gfc_add_block_to_block (&block, &rse->pre);
3081
3082       gfc_trans_string_copy (&block, lse->string_length, lse->expr,
3083                              rse->string_length, rse->expr);
3084     }
3085   else
3086     {
3087       gfc_add_block_to_block (&block, &lse->pre);
3088       gfc_add_block_to_block (&block, &rse->pre);
3089
3090       gfc_add_modify_expr (&block, lse->expr,
3091                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
3092     }
3093
3094   gfc_add_block_to_block (&block, &lse->post);
3095   gfc_add_block_to_block (&block, &rse->post);
3096
3097   return gfc_finish_block (&block);
3098 }
3099
3100
3101 /* Try to translate array(:) = func (...), where func is a transformational
3102    array function, without using a temporary.  Returns NULL is this isn't the
3103    case.  */
3104
3105 static tree
3106 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
3107 {
3108   gfc_se se;
3109   gfc_ss *ss;
3110   gfc_ref * ref;
3111   bool seen_array_ref;
3112
3113   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
3114   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
3115     return NULL;
3116
3117   /* Elemental functions don't need a temporary anyway.  */
3118   if (expr2->value.function.esym != NULL
3119       && expr2->value.function.esym->attr.elemental)
3120     return NULL;
3121
3122   /* Fail if EXPR1 can't be expressed as a descriptor.  */
3123   if (gfc_ref_needs_temporary_p (expr1->ref))
3124     return NULL;
3125
3126   /* Functions returning pointers need temporaries.  */
3127   if (expr2->symtree->n.sym->attr.pointer 
3128       || expr2->symtree->n.sym->attr.allocatable)
3129     return NULL;
3130
3131   /* Check that no LHS component references appear during an array
3132      reference. This is needed because we do not have the means to
3133      span any arbitrary stride with an array descriptor. This check
3134      is not needed for the rhs because the function result has to be
3135      a complete type.  */
3136   seen_array_ref = false;
3137   for (ref = expr1->ref; ref; ref = ref->next)
3138     {
3139       if (ref->type == REF_ARRAY)
3140         seen_array_ref= true;
3141       else if (ref->type == REF_COMPONENT && seen_array_ref)
3142         return NULL;
3143     }
3144
3145   /* Check for a dependency.  */
3146   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
3147                                    expr2->value.function.esym,
3148                                    expr2->value.function.actual))
3149     return NULL;
3150
3151   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
3152      functions.  */
3153   gcc_assert (expr2->value.function.isym
3154               || (gfc_return_by_reference (expr2->value.function.esym)
3155               && expr2->value.function.esym->result->attr.dimension));
3156
3157   ss = gfc_walk_expr (expr1);
3158   gcc_assert (ss != gfc_ss_terminator);
3159   gfc_init_se (&se, NULL);
3160   gfc_start_block (&se.pre);
3161   se.want_pointer = 1;
3162
3163   gfc_conv_array_parameter (&se, expr1, ss, 0);
3164
3165   se.direct_byref = 1;
3166   se.ss = gfc_walk_expr (expr2);
3167   gcc_assert (se.ss != gfc_ss_terminator);
3168   gfc_conv_function_expr (&se, expr2);
3169   gfc_add_block_to_block (&se.pre, &se.post);
3170
3171   return gfc_finish_block (&se.pre);
3172 }
3173
3174
3175 /* Translate an assignment.  Most of the code is concerned with
3176    setting up the scalarizer.  */
3177
3178 tree
3179 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2)
3180 {
3181   gfc_se lse;
3182   gfc_se rse;
3183   gfc_ss *lss;
3184   gfc_ss *lss_section;
3185   gfc_ss *rss;
3186   gfc_loopinfo loop;
3187   tree tmp;
3188   stmtblock_t block;
3189   stmtblock_t body;
3190
3191   /* Special case a single function returning an array.  */
3192   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
3193     {
3194       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
3195       if (tmp)
3196         return tmp;
3197     }
3198
3199   /* Assignment of the form lhs = rhs.  */
3200   gfc_start_block (&block);
3201
3202   gfc_init_se (&lse, NULL);
3203   gfc_init_se (&rse, NULL);
3204
3205   /* Walk the lhs.  */
3206   lss = gfc_walk_expr (expr1);
3207   rss = NULL;
3208   if (lss != gfc_ss_terminator)
3209     {
3210       /* The assignment needs scalarization.  */
3211       lss_section = lss;
3212
3213       /* Find a non-scalar SS from the lhs.  */
3214       while (lss_section != gfc_ss_terminator
3215              && lss_section->type != GFC_SS_SECTION)
3216         lss_section = lss_section->next;
3217
3218       gcc_assert (lss_section != gfc_ss_terminator);
3219
3220       /* Initialize the scalarizer.  */
3221       gfc_init_loopinfo (&loop);
3222
3223       /* Walk the rhs.  */
3224       rss = gfc_walk_expr (expr2);
3225       if (rss == gfc_ss_terminator)
3226         {
3227           /* The rhs is scalar.  Add a ss for the expression.  */
3228           rss = gfc_get_ss ();
3229           rss->next = gfc_ss_terminator;
3230           rss->type = GFC_SS_SCALAR;
3231           rss->expr = expr2;
3232         }
3233       /* Associate the SS with the loop.  */
3234       gfc_add_ss_to_loop (&loop, lss);
3235       gfc_add_ss_to_loop (&loop, rss);
3236
3237       /* Calculate the bounds of the scalarization.  */
3238       gfc_conv_ss_startstride (&loop);
3239       /* Resolve any data dependencies in the statement.  */
3240       gfc_conv_resolve_dependencies (&loop, lss, rss);
3241       /* Setup the scalarizing loops.  */
3242       gfc_conv_loop_setup (&loop);
3243
3244       /* Setup the gfc_se structures.  */
3245       gfc_copy_loopinfo_to_se (&lse, &loop);
3246       gfc_copy_loopinfo_to_se (&rse, &loop);
3247
3248       rse.ss = rss;
3249       gfc_mark_ss_chain_used (rss, 1);
3250       if (loop.temp_ss == NULL)
3251         {
3252           lse.ss = lss;
3253           gfc_mark_ss_chain_used (lss, 1);
3254         }
3255       else
3256         {
3257           lse.ss = loop.temp_ss;
3258           gfc_mark_ss_chain_used (lss, 3);
3259           gfc_mark_ss_chain_used (loop.temp_ss, 3);
3260         }
3261
3262       /* Start the scalarized loop body.  */
3263       gfc_start_scalarized_body (&loop, &body);
3264     }
3265   else
3266     gfc_init_block (&body);
3267
3268   /* Translate the expression.  */
3269   gfc_conv_expr (&rse, expr2);
3270
3271   if (lss != gfc_ss_terminator && loop.temp_ss != NULL)
3272     {
3273       gfc_conv_tmp_array_ref (&lse);
3274       gfc_advance_se_ss_chain (&lse);
3275     }
3276   else
3277     gfc_conv_expr (&lse, expr1);
3278
3279   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3280   gfc_add_expr_to_block (&body, tmp);
3281
3282   if (lss == gfc_ss_terminator)
3283     {
3284       /* Use the scalar assignment as is.  */
3285       gfc_add_block_to_block (&block, &body);
3286     }
3287   else
3288     {
3289       gcc_assert (lse.ss == gfc_ss_terminator
3290                   && rse.ss == gfc_ss_terminator);
3291
3292       if (loop.temp_ss != NULL)
3293         {
3294           gfc_trans_scalarized_loop_boundary (&loop, &body);
3295
3296           /* We need to copy the temporary to the actual lhs.  */
3297           gfc_init_se (&lse, NULL);
3298           gfc_init_se (&rse, NULL);
3299           gfc_copy_loopinfo_to_se (&lse, &loop);
3300           gfc_copy_loopinfo_to_se (&rse, &loop);
3301
3302           rse.ss = loop.temp_ss;
3303           lse.ss = lss;
3304
3305           gfc_conv_tmp_array_ref (&rse);
3306           gfc_advance_se_ss_chain (&rse);
3307           gfc_conv_expr (&lse, expr1);
3308
3309           gcc_assert (lse.ss == gfc_ss_terminator
3310                       && rse.ss == gfc_ss_terminator);
3311
3312           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3313           gfc_add_expr_to_block (&body, tmp);
3314         }
3315       /* Generate the copying loops.  */
3316       gfc_trans_scalarizing_loops (&loop, &body);
3317
3318       /* Wrap the whole thing up.  */
3319       gfc_add_block_to_block (&block, &loop.pre);
3320       gfc_add_block_to_block (&block, &loop.post);
3321
3322       gfc_cleanup_loop (&loop);
3323     }
3324
3325   return gfc_finish_block (&block);
3326 }
3327
3328 tree
3329 gfc_trans_assign (gfc_code * code)
3330 {
3331   return gfc_trans_assignment (code->expr, code->expr2);
3332 }