OSDN Git Service

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