OSDN Git Service

2529fb7c6d2d2a8dad7199a8dc2cf0fa8bf18395
[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, "ifm");
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 /* Returns a reference to a temporary array into which a component of
1533    an actual argument derived type array is copied and then returned
1534    after the function call.
1535    TODO Get rid of this kludge, when array descriptors are capable of
1536    handling aliased arrays.  */
1537
1538 static void
1539 gfc_conv_aliased_arg (gfc_se * parmse, gfc_expr * expr, int g77)
1540 {
1541   gfc_se lse;
1542   gfc_se rse;
1543   gfc_ss *lss;
1544   gfc_ss *rss;
1545   gfc_loopinfo loop;
1546   gfc_loopinfo loop2;
1547   gfc_ss_info *info;
1548   tree offset;
1549   tree tmp_index;
1550   tree tmp;
1551   tree base_type;
1552   stmtblock_t body;
1553   int n;
1554
1555   gcc_assert (expr->expr_type == EXPR_VARIABLE);
1556
1557   gfc_init_se (&lse, NULL);
1558   gfc_init_se (&rse, NULL);
1559
1560   /* Walk the argument expression.  */
1561   rss = gfc_walk_expr (expr);
1562
1563   gcc_assert (rss != gfc_ss_terminator);
1564  
1565   /* Initialize the scalarizer.  */
1566   gfc_init_loopinfo (&loop);
1567   gfc_add_ss_to_loop (&loop, rss);
1568
1569   /* Calculate the bounds of the scalarization.  */
1570   gfc_conv_ss_startstride (&loop);
1571
1572   /* Build an ss for the temporary.  */
1573   base_type = gfc_typenode_for_spec (&expr->ts);
1574   if (GFC_ARRAY_TYPE_P (base_type)
1575                 || GFC_DESCRIPTOR_TYPE_P (base_type))
1576     base_type = gfc_get_element_type (base_type);
1577
1578   loop.temp_ss = gfc_get_ss ();;
1579   loop.temp_ss->type = GFC_SS_TEMP;
1580   loop.temp_ss->data.temp.type = base_type;
1581
1582   if (expr->ts.type == BT_CHARACTER)
1583     loop.temp_ss->string_length = expr->ts.cl->backend_decl;
1584
1585   loop.temp_ss->data.temp.dimen = loop.dimen;
1586   loop.temp_ss->next = gfc_ss_terminator;
1587
1588   /* Associate the SS with the loop.  */
1589   gfc_add_ss_to_loop (&loop, loop.temp_ss);
1590
1591   /* Setup the scalarizing loops.  */
1592   gfc_conv_loop_setup (&loop);
1593
1594   /* Pass the temporary descriptor back to the caller.  */
1595   info = &loop.temp_ss->data.info;
1596   parmse->expr = info->descriptor;
1597
1598   /* Setup the gfc_se structures.  */
1599   gfc_copy_loopinfo_to_se (&lse, &loop);
1600   gfc_copy_loopinfo_to_se (&rse, &loop);
1601
1602   rse.ss = rss;
1603   lse.ss = loop.temp_ss;
1604   gfc_mark_ss_chain_used (rss, 1);
1605   gfc_mark_ss_chain_used (loop.temp_ss, 1);
1606
1607   /* Start the scalarized loop body.  */
1608   gfc_start_scalarized_body (&loop, &body);
1609
1610   /* Translate the expression.  */
1611   gfc_conv_expr (&rse, expr);
1612
1613   gfc_conv_tmp_array_ref (&lse);
1614   gfc_advance_se_ss_chain (&lse);
1615
1616   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1617   gfc_add_expr_to_block (&body, tmp);
1618
1619   gcc_assert (rse.ss == gfc_ss_terminator);
1620
1621   gfc_trans_scalarizing_loops (&loop, &body);
1622
1623   /* Add the post block after the second loop, so that any
1624      freeing of allocated memory is done at the right time.  */
1625   gfc_add_block_to_block (&parmse->pre, &loop.pre);
1626
1627   /**********Copy the temporary back again.*********/
1628
1629   gfc_init_se (&lse, NULL);
1630   gfc_init_se (&rse, NULL);
1631
1632   /* Walk the argument expression.  */
1633   lss = gfc_walk_expr (expr);
1634   rse.ss = loop.temp_ss;
1635   lse.ss = lss;
1636
1637   /* Initialize the scalarizer.  */
1638   gfc_init_loopinfo (&loop2);
1639   gfc_add_ss_to_loop (&loop2, lss);
1640
1641   /* Calculate the bounds of the scalarization.  */
1642   gfc_conv_ss_startstride (&loop2);
1643
1644   /* Setup the scalarizing loops.  */
1645   gfc_conv_loop_setup (&loop2);
1646
1647   gfc_copy_loopinfo_to_se (&lse, &loop2);
1648   gfc_copy_loopinfo_to_se (&rse, &loop2);
1649
1650   gfc_mark_ss_chain_used (lss, 1);
1651   gfc_mark_ss_chain_used (loop.temp_ss, 1);
1652
1653   /* Declare the variable to hold the temporary offset and start the
1654      scalarized loop body.  */
1655   offset = gfc_create_var (gfc_array_index_type, NULL);
1656   gfc_start_scalarized_body (&loop2, &body);
1657
1658   /* Build the offsets for the temporary from the loop variables.  The
1659      temporary array has lbounds of zero and strides of one in all
1660      dimensions, so this is very simple.  The offset is only computed
1661      outside the innermost loop, so the overall transfer could be
1662      optimised further.  */
1663   info = &rse.ss->data.info;
1664
1665   tmp_index = gfc_index_zero_node;
1666   for (n = info->dimen - 1; n > 0; n--)
1667     {
1668       tree tmp_str;
1669       tmp = rse.loop->loopvar[n];
1670       tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1671                          tmp, rse.loop->from[n]);
1672       tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1673                          tmp, tmp_index);
1674
1675       tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1676                              rse.loop->to[n-1], rse.loop->from[n-1]);
1677       tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1678                              tmp_str, gfc_index_one_node);
1679
1680       tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
1681                                tmp, tmp_str);
1682     }
1683
1684   tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1685                            tmp_index, rse.loop->from[0]);
1686   gfc_add_modify_expr (&rse.loop->code[0], offset, tmp_index);
1687
1688   tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1689                            rse.loop->loopvar[0], offset);
1690
1691   /* Now use the offset for the reference.  */
1692   tmp = build_fold_indirect_ref (info->data);
1693   rse.expr = gfc_build_array_ref (tmp, tmp_index);
1694
1695   if (expr->ts.type == BT_CHARACTER)
1696     rse.string_length = expr->ts.cl->backend_decl;
1697
1698   gfc_conv_expr (&lse, expr);
1699
1700   gcc_assert (lse.ss == gfc_ss_terminator);
1701
1702   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts.type);
1703   gfc_add_expr_to_block (&body, tmp);
1704   
1705   /* Generate the copying loops.  */
1706   gfc_trans_scalarizing_loops (&loop2, &body);
1707
1708   /* Wrap the whole thing up by adding the second loop to the post-block
1709      and following it by the post-block of the fist loop.  In this way,
1710      if the temporary needs freeing, it is done after use!  */
1711   gfc_add_block_to_block (&parmse->post, &loop2.pre);
1712   gfc_add_block_to_block (&parmse->post, &loop2.post);
1713
1714   gfc_add_block_to_block (&parmse->post, &loop.post);
1715
1716   gfc_cleanup_loop (&loop);
1717   gfc_cleanup_loop (&loop2);
1718
1719   /* Pass the string length to the argument expression.  */
1720   if (expr->ts.type == BT_CHARACTER)
1721     parmse->string_length = expr->ts.cl->backend_decl;
1722
1723   /* We want either the address for the data or the address of the descriptor,
1724      depending on the mode of passing array arguments.  */
1725   if (g77)
1726     parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
1727   else
1728     parmse->expr = build_fold_addr_expr (parmse->expr);
1729
1730   return;
1731 }
1732
1733 /* Is true if the last array reference is followed by a component reference.  */
1734
1735 static bool
1736 is_aliased_array (gfc_expr * e)
1737 {
1738   gfc_ref * ref;
1739   bool seen_array;
1740
1741   seen_array = false;   
1742   for (ref = e->ref; ref; ref = ref->next)
1743     {
1744       if (ref->type == REF_ARRAY)
1745         seen_array = true;
1746
1747       if (ref->next == NULL && ref->type == REF_COMPONENT)
1748         return seen_array;
1749     }
1750   return false;
1751 }
1752
1753 /* Generate code for a procedure call.  Note can return se->post != NULL.
1754    If se->direct_byref is set then se->expr contains the return parameter.
1755    Return nonzero, if the call has alternate specifiers.  */
1756
1757 int
1758 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
1759                         gfc_actual_arglist * arg)
1760 {
1761   gfc_interface_mapping mapping;
1762   tree arglist;
1763   tree retargs;
1764   tree tmp;
1765   tree fntype;
1766   gfc_se parmse;
1767   gfc_ss *argss;
1768   gfc_ss_info *info;
1769   int byref;
1770   tree type;
1771   tree var;
1772   tree len;
1773   tree stringargs;
1774   gfc_formal_arglist *formal;
1775   int has_alternate_specifier = 0;
1776   bool need_interface_mapping;
1777   gfc_typespec ts;
1778   gfc_charlen cl;
1779
1780   arglist = NULL_TREE;
1781   retargs = NULL_TREE;
1782   stringargs = NULL_TREE;
1783   var = NULL_TREE;
1784   len = NULL_TREE;
1785
1786   if (se->ss != NULL)
1787     {
1788       if (!sym->attr.elemental)
1789         {
1790           gcc_assert (se->ss->type == GFC_SS_FUNCTION);
1791           if (se->ss->useflags)
1792             {
1793               gcc_assert (gfc_return_by_reference (sym)
1794                       && sym->result->attr.dimension);
1795               gcc_assert (se->loop != NULL);
1796
1797               /* Access the previously obtained result.  */
1798               gfc_conv_tmp_array_ref (se);
1799               gfc_advance_se_ss_chain (se);
1800               return 0;
1801             }
1802         }
1803       info = &se->ss->data.info;
1804     }
1805   else
1806     info = NULL;
1807
1808   gfc_init_interface_mapping (&mapping);
1809   need_interface_mapping = ((sym->ts.type == BT_CHARACTER
1810                                   && sym->ts.cl->length
1811                                   && sym->ts.cl->length->expr_type
1812                                                 != EXPR_CONSTANT)
1813                               || sym->attr.dimension);
1814   formal = sym->formal;
1815   /* Evaluate the arguments.  */
1816   for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
1817     {
1818       if (arg->expr == NULL)
1819         {
1820
1821           if (se->ignore_optional)
1822             {
1823               /* Some intrinsics have already been resolved to the correct
1824                  parameters.  */
1825               continue;
1826             }
1827           else if (arg->label)
1828             {
1829               has_alternate_specifier = 1;
1830               continue;
1831             }
1832           else
1833             {
1834               /* Pass a NULL pointer for an absent arg.  */
1835               gfc_init_se (&parmse, NULL);
1836               parmse.expr = null_pointer_node;
1837               if (arg->missing_arg_type == BT_CHARACTER)
1838                 parmse.string_length = convert (gfc_charlen_type_node,
1839                                                 integer_zero_node);
1840             }
1841         }
1842       else if (se->ss && se->ss->useflags)
1843         {
1844           /* An elemental function inside a scalarized loop.  */
1845           gfc_init_se (&parmse, se);
1846           gfc_conv_expr_reference (&parmse, arg->expr);
1847         }
1848       else
1849         {
1850           /* A scalar or transformational function.  */
1851           gfc_init_se (&parmse, NULL);
1852           argss = gfc_walk_expr (arg->expr);
1853
1854           if (argss == gfc_ss_terminator)
1855             {
1856               gfc_conv_expr_reference (&parmse, arg->expr);
1857               if (formal && formal->sym->attr.pointer
1858                   && arg->expr->expr_type != EXPR_NULL)
1859                 {
1860                   /* Scalar pointer dummy args require an extra level of
1861                   indirection. The null pointer already contains
1862                   this level of indirection.  */
1863                   parmse.expr = build_fold_addr_expr (parmse.expr);
1864                 }
1865             }
1866           else
1867             {
1868               /* If the procedure requires an explicit interface, the
1869                  actual argument is passed according to the
1870                  corresponding formal argument.  If the corresponding
1871                  formal argument is a POINTER or assumed shape, we do
1872                  not use g77's calling convention, and pass the
1873                  address of the array descriptor instead. Otherwise we
1874                  use g77's calling convention.  */
1875               int f;
1876               f = (formal != NULL)
1877                   && !formal->sym->attr.pointer
1878                   && formal->sym->as->type != AS_ASSUMED_SHAPE;
1879               f = f || !sym->attr.always_explicit;
1880               if (arg->expr->expr_type == EXPR_VARIABLE
1881                     && is_aliased_array (arg->expr))
1882                 /* The actual argument is a component reference to an
1883                    array of derived types.  In this case, the argument
1884                    is converted to a temporary, which is passed and then
1885                    written back after the procedure call.  */
1886                 gfc_conv_aliased_arg (&parmse, arg->expr, f);
1887               else
1888                 gfc_conv_array_parameter (&parmse, arg->expr, argss, f);
1889             } 
1890         }
1891
1892       if (formal && need_interface_mapping)
1893         gfc_add_interface_mapping (&mapping, formal->sym, &parmse);
1894
1895       gfc_add_block_to_block (&se->pre, &parmse.pre);
1896       gfc_add_block_to_block (&se->post, &parmse.post);
1897
1898       /* Character strings are passed as two parameters, a length and a
1899          pointer.  */
1900       if (parmse.string_length != NULL_TREE)
1901         stringargs = gfc_chainon_list (stringargs, parmse.string_length);
1902
1903       arglist = gfc_chainon_list (arglist, parmse.expr);
1904     }
1905   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
1906
1907   ts = sym->ts;
1908   if (ts.type == BT_CHARACTER)
1909     {
1910       if (sym->ts.cl->length == NULL)
1911         {
1912           /* Assumed character length results are not allowed by 5.1.1.5 of the
1913              standard and are trapped in resolve.c; except in the case of SPREAD
1914              (and other intrinsics?).  In this case, we take the character length
1915              of the first argument for the result.  */
1916           cl.backend_decl = TREE_VALUE (stringargs);
1917         }
1918       else
1919         {
1920           /* Calculate the length of the returned string.  */
1921           gfc_init_se (&parmse, NULL);
1922           if (need_interface_mapping)
1923             gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
1924           else
1925             gfc_conv_expr (&parmse, sym->ts.cl->length);
1926           gfc_add_block_to_block (&se->pre, &parmse.pre);
1927           gfc_add_block_to_block (&se->post, &parmse.post);
1928           cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr);
1929         }
1930
1931       /* Set up a charlen structure for it.  */
1932       cl.next = NULL;
1933       cl.length = NULL;
1934       ts.cl = &cl;
1935
1936       len = cl.backend_decl;
1937     }
1938
1939   byref = gfc_return_by_reference (sym);
1940   if (byref)
1941     {
1942       if (se->direct_byref)
1943         retargs = gfc_chainon_list (retargs, se->expr);
1944       else if (sym->result->attr.dimension)
1945         {
1946           gcc_assert (se->loop && info);
1947
1948           /* Set the type of the array.  */
1949           tmp = gfc_typenode_for_spec (&ts);
1950           info->dimen = se->loop->dimen;
1951
1952           /* Evaluate the bounds of the result, if known.  */
1953           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
1954
1955           /* Allocate a temporary to store the result.  */
1956           gfc_trans_allocate_temp_array (&se->pre, &se->post,
1957                                          se->loop, info, tmp, false);
1958
1959           /* Zero the first stride to indicate a temporary.  */
1960           tmp = gfc_conv_descriptor_stride (info->descriptor, gfc_rank_cst[0]);
1961           gfc_add_modify_expr (&se->pre, tmp,
1962                                convert (TREE_TYPE (tmp), integer_zero_node));
1963
1964           /* Pass the temporary as the first argument.  */
1965           tmp = info->descriptor;
1966           tmp = build_fold_addr_expr (tmp);
1967           retargs = gfc_chainon_list (retargs, tmp);
1968         }
1969       else if (ts.type == BT_CHARACTER)
1970         {
1971           /* Pass the string length.  */
1972           type = gfc_get_character_type (ts.kind, ts.cl);
1973           type = build_pointer_type (type);
1974
1975           /* Return an address to a char[0:len-1]* temporary for
1976              character pointers.  */
1977           if (sym->attr.pointer || sym->attr.allocatable)
1978             {
1979               /* Build char[0:len-1] * pstr.  */
1980               tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
1981                                  build_int_cst (gfc_charlen_type_node, 1));
1982               tmp = build_range_type (gfc_array_index_type,
1983                                       gfc_index_zero_node, tmp);
1984               tmp = build_array_type (gfc_character1_type_node, tmp);
1985               var = gfc_create_var (build_pointer_type (tmp), "pstr");
1986
1987               /* Provide an address expression for the function arguments.  */
1988               var = build_fold_addr_expr (var);
1989             }
1990           else
1991             var = gfc_conv_string_tmp (se, type, len);
1992
1993           retargs = gfc_chainon_list (retargs, var);
1994         }
1995       else
1996         {
1997           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
1998
1999           type = gfc_get_complex_type (ts.kind);
2000           var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2001           retargs = gfc_chainon_list (retargs, var);
2002         }
2003
2004       /* Add the string length to the argument list.  */
2005       if (ts.type == BT_CHARACTER)
2006         retargs = gfc_chainon_list (retargs, len);
2007     }
2008   gfc_free_interface_mapping (&mapping);
2009
2010   /* Add the return arguments.  */
2011   arglist = chainon (retargs, arglist);
2012
2013   /* Add the hidden string length parameters to the arguments.  */
2014   arglist = chainon (arglist, stringargs);
2015
2016   /* Generate the actual call.  */
2017   gfc_conv_function_val (se, sym);
2018   /* If there are alternate return labels, function type should be
2019      integer.  Can't modify the type in place though, since it can be shared
2020      with other functions.  */
2021   if (has_alternate_specifier
2022       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2023     {
2024       gcc_assert (! sym->attr.dummy);
2025       TREE_TYPE (sym->backend_decl)
2026         = build_function_type (integer_type_node,
2027                                TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2028       se->expr = build_fold_addr_expr (sym->backend_decl);
2029     }
2030
2031   fntype = TREE_TYPE (TREE_TYPE (se->expr));
2032   se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
2033                      arglist, NULL_TREE);
2034
2035   /* If we have a pointer function, but we don't want a pointer, e.g.
2036      something like
2037         x = f()
2038      where f is pointer valued, we have to dereference the result.  */
2039   if (!se->want_pointer && !byref && sym->attr.pointer)
2040     se->expr = build_fold_indirect_ref (se->expr);
2041
2042   /* f2c calling conventions require a scalar default real function to
2043      return a double precision result.  Convert this back to default
2044      real.  We only care about the cases that can happen in Fortran 77.
2045   */
2046   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2047       && sym->ts.kind == gfc_default_real_kind
2048       && !sym->attr.always_explicit)
2049     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2050
2051   /* A pure function may still have side-effects - it may modify its
2052      parameters.  */
2053   TREE_SIDE_EFFECTS (se->expr) = 1;
2054 #if 0
2055   if (!sym->attr.pure)
2056     TREE_SIDE_EFFECTS (se->expr) = 1;
2057 #endif
2058
2059   if (byref)
2060     {
2061       /* Add the function call to the pre chain.  There is no expression.  */
2062       gfc_add_expr_to_block (&se->pre, se->expr);
2063       se->expr = NULL_TREE;
2064
2065       if (!se->direct_byref)
2066         {
2067           if (sym->attr.dimension)
2068             {
2069               if (flag_bounds_check)
2070                 {
2071                   /* Check the data pointer hasn't been modified.  This would
2072                      happen in a function returning a pointer.  */
2073                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
2074                   tmp = fold_build2 (NE_EXPR, boolean_type_node,
2075                                      tmp, info->data);
2076                   gfc_trans_runtime_check (tmp, gfc_strconst_fault, &se->pre);
2077                 }
2078               se->expr = info->descriptor;
2079               /* Bundle in the string length.  */
2080               se->string_length = len;
2081             }
2082           else if (sym->ts.type == BT_CHARACTER)
2083             {
2084               /* Dereference for character pointer results.  */
2085               if (sym->attr.pointer || sym->attr.allocatable)
2086                 se->expr = build_fold_indirect_ref (var);
2087               else
2088                 se->expr = var;
2089
2090               se->string_length = len;
2091             }
2092           else
2093             {
2094               gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2095               se->expr = build_fold_indirect_ref (var);
2096             }
2097         }
2098     }
2099
2100   return has_alternate_specifier;
2101 }
2102
2103
2104 /* Generate code to copy a string.  */
2105
2106 static void
2107 gfc_trans_string_copy (stmtblock_t * block, tree dlen, tree dest,
2108                        tree slen, tree src)
2109 {
2110   tree tmp;
2111   tree dsc;
2112   tree ssc;
2113
2114   /* Deal with single character specially.  */
2115   dsc = gfc_to_single_character (dlen, dest);
2116   ssc = gfc_to_single_character (slen, src);
2117   if (dsc != NULL_TREE && ssc != NULL_TREE)
2118     {
2119       gfc_add_modify_expr (block, dsc, ssc);
2120       return;
2121     }
2122
2123   tmp = NULL_TREE;
2124   tmp = gfc_chainon_list (tmp, dlen);
2125   tmp = gfc_chainon_list (tmp, dest);
2126   tmp = gfc_chainon_list (tmp, slen);
2127   tmp = gfc_chainon_list (tmp, src);
2128   tmp = build_function_call_expr (gfor_fndecl_copy_string, tmp);
2129   gfc_add_expr_to_block (block, tmp);
2130 }
2131
2132
2133 /* Translate a statement function.
2134    The value of a statement function reference is obtained by evaluating the
2135    expression using the values of the actual arguments for the values of the
2136    corresponding dummy arguments.  */
2137
2138 static void
2139 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2140 {
2141   gfc_symbol *sym;
2142   gfc_symbol *fsym;
2143   gfc_formal_arglist *fargs;
2144   gfc_actual_arglist *args;
2145   gfc_se lse;
2146   gfc_se rse;
2147   gfc_saved_var *saved_vars;
2148   tree *temp_vars;
2149   tree type;
2150   tree tmp;
2151   int n;
2152
2153   sym = expr->symtree->n.sym;
2154   args = expr->value.function.actual;
2155   gfc_init_se (&lse, NULL);
2156   gfc_init_se (&rse, NULL);
2157
2158   n = 0;
2159   for (fargs = sym->formal; fargs; fargs = fargs->next)
2160     n++;
2161   saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2162   temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2163
2164   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2165     {
2166       /* Each dummy shall be specified, explicitly or implicitly, to be
2167          scalar.  */
2168       gcc_assert (fargs->sym->attr.dimension == 0);
2169       fsym = fargs->sym;
2170
2171       /* Create a temporary to hold the value.  */
2172       type = gfc_typenode_for_spec (&fsym->ts);
2173       temp_vars[n] = gfc_create_var (type, fsym->name);
2174
2175       if (fsym->ts.type == BT_CHARACTER)
2176         {
2177           /* Copy string arguments.  */
2178           tree arglen;
2179
2180           gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2181                   && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2182
2183           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
2184           tmp = gfc_build_addr_expr (build_pointer_type (type),
2185                                      temp_vars[n]);
2186
2187           gfc_conv_expr (&rse, args->expr);
2188           gfc_conv_string_parameter (&rse);
2189           gfc_add_block_to_block (&se->pre, &lse.pre);
2190           gfc_add_block_to_block (&se->pre, &rse.pre);
2191
2192           gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
2193                                  rse.expr);
2194           gfc_add_block_to_block (&se->pre, &lse.post);
2195           gfc_add_block_to_block (&se->pre, &rse.post);
2196         }
2197       else
2198         {
2199           /* For everything else, just evaluate the expression.  */
2200           gfc_conv_expr (&lse, args->expr);
2201
2202           gfc_add_block_to_block (&se->pre, &lse.pre);
2203           gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
2204           gfc_add_block_to_block (&se->pre, &lse.post);
2205         }
2206
2207       args = args->next;
2208     }
2209
2210   /* Use the temporary variables in place of the real ones.  */
2211   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2212     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
2213
2214   gfc_conv_expr (se, sym->value);
2215
2216   if (sym->ts.type == BT_CHARACTER)
2217     {
2218       gfc_conv_const_charlen (sym->ts.cl);
2219
2220       /* Force the expression to the correct length.  */
2221       if (!INTEGER_CST_P (se->string_length)
2222           || tree_int_cst_lt (se->string_length,
2223                               sym->ts.cl->backend_decl))
2224         {
2225           type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
2226           tmp = gfc_create_var (type, sym->name);
2227           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
2228           gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
2229                                  se->string_length, se->expr);
2230           se->expr = tmp;
2231         }
2232       se->string_length = sym->ts.cl->backend_decl;
2233     }
2234
2235   /* Restore the original variables.  */
2236   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2237     gfc_restore_sym (fargs->sym, &saved_vars[n]);
2238   gfc_free (saved_vars);
2239 }
2240
2241
2242 /* Translate a function expression.  */
2243
2244 static void
2245 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
2246 {
2247   gfc_symbol *sym;
2248
2249   if (expr->value.function.isym)
2250     {
2251       gfc_conv_intrinsic_function (se, expr);
2252       return;
2253     }
2254
2255   /* We distinguish statement functions from general functions to improve
2256      runtime performance.  */
2257   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2258     {
2259       gfc_conv_statement_function (se, expr);
2260       return;
2261     }
2262
2263   /* expr.value.function.esym is the resolved (specific) function symbol for
2264      most functions.  However this isn't set for dummy procedures.  */
2265   sym = expr->value.function.esym;
2266   if (!sym)
2267     sym = expr->symtree->n.sym;
2268   gfc_conv_function_call (se, sym, expr->value.function.actual);
2269 }
2270
2271
2272 static void
2273 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
2274 {
2275   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
2276   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
2277
2278   gfc_conv_tmp_array_ref (se);
2279   gfc_advance_se_ss_chain (se);
2280 }
2281
2282
2283 /* Build a static initializer.  EXPR is the expression for the initial value.
2284    The other parameters describe the variable of the component being 
2285    initialized. EXPR may be null.  */
2286
2287 tree
2288 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
2289                       bool array, bool pointer)
2290 {
2291   gfc_se se;
2292
2293   if (!(expr || pointer))
2294     return NULL_TREE;
2295
2296   if (array)
2297     {
2298       /* Arrays need special handling.  */
2299       if (pointer)
2300         return gfc_build_null_descriptor (type);
2301       else
2302         return gfc_conv_array_initializer (type, expr);
2303     }
2304   else if (pointer)
2305     return fold_convert (type, null_pointer_node);
2306   else
2307     {
2308       switch (ts->type)
2309         {
2310         case BT_DERIVED:
2311           gfc_init_se (&se, NULL);
2312           gfc_conv_structure (&se, expr, 1);
2313           return se.expr;
2314
2315         case BT_CHARACTER:
2316           return gfc_conv_string_init (ts->cl->backend_decl,expr);
2317
2318         default:
2319           gfc_init_se (&se, NULL);
2320           gfc_conv_constant (&se, expr);
2321           return se.expr;
2322         }
2323     }
2324 }
2325   
2326 static tree
2327 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2328 {
2329   gfc_se rse;
2330   gfc_se lse;
2331   gfc_ss *rss;
2332   gfc_ss *lss;
2333   stmtblock_t body;
2334   stmtblock_t block;
2335   gfc_loopinfo loop;
2336   int n;
2337   tree tmp;
2338
2339   gfc_start_block (&block);
2340
2341   /* Initialize the scalarizer.  */
2342   gfc_init_loopinfo (&loop);
2343
2344   gfc_init_se (&lse, NULL);
2345   gfc_init_se (&rse, NULL);
2346
2347   /* Walk the rhs.  */
2348   rss = gfc_walk_expr (expr);
2349   if (rss == gfc_ss_terminator)
2350     {
2351       /* The rhs is scalar.  Add a ss for the expression.  */
2352       rss = gfc_get_ss ();
2353       rss->next = gfc_ss_terminator;
2354       rss->type = GFC_SS_SCALAR;
2355       rss->expr = expr;
2356     }
2357
2358   /* Create a SS for the destination.  */
2359   lss = gfc_get_ss ();
2360   lss->type = GFC_SS_COMPONENT;
2361   lss->expr = NULL;
2362   lss->shape = gfc_get_shape (cm->as->rank);
2363   lss->next = gfc_ss_terminator;
2364   lss->data.info.dimen = cm->as->rank;
2365   lss->data.info.descriptor = dest;
2366   lss->data.info.data = gfc_conv_array_data (dest);
2367   lss->data.info.offset = gfc_conv_array_offset (dest);
2368   for (n = 0; n < cm->as->rank; n++)
2369     {
2370       lss->data.info.dim[n] = n;
2371       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
2372       lss->data.info.stride[n] = gfc_index_one_node;
2373
2374       mpz_init (lss->shape[n]);
2375       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
2376                cm->as->lower[n]->value.integer);
2377       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
2378     }
2379   
2380   /* Associate the SS with the loop.  */
2381   gfc_add_ss_to_loop (&loop, lss);
2382   gfc_add_ss_to_loop (&loop, rss);
2383
2384   /* Calculate the bounds of the scalarization.  */
2385   gfc_conv_ss_startstride (&loop);
2386
2387   /* Setup the scalarizing loops.  */
2388   gfc_conv_loop_setup (&loop);
2389
2390   /* Setup the gfc_se structures.  */
2391   gfc_copy_loopinfo_to_se (&lse, &loop);
2392   gfc_copy_loopinfo_to_se (&rse, &loop);
2393
2394   rse.ss = rss;
2395   gfc_mark_ss_chain_used (rss, 1);
2396   lse.ss = lss;
2397   gfc_mark_ss_chain_used (lss, 1);
2398
2399   /* Start the scalarized loop body.  */
2400   gfc_start_scalarized_body (&loop, &body);
2401
2402   gfc_conv_tmp_array_ref (&lse);
2403   if (cm->ts.type == BT_CHARACTER)
2404     lse.string_length = cm->ts.cl->backend_decl;
2405
2406   gfc_conv_expr (&rse, expr);
2407
2408   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);
2409   gfc_add_expr_to_block (&body, tmp);
2410
2411   gcc_assert (rse.ss == gfc_ss_terminator);
2412
2413   /* Generate the copying loops.  */
2414   gfc_trans_scalarizing_loops (&loop, &body);
2415
2416   /* Wrap the whole thing up.  */
2417   gfc_add_block_to_block (&block, &loop.pre);
2418   gfc_add_block_to_block (&block, &loop.post);
2419
2420   for (n = 0; n < cm->as->rank; n++)
2421     mpz_clear (lss->shape[n]);
2422   gfc_free (lss->shape);
2423
2424   gfc_cleanup_loop (&loop);
2425
2426   return gfc_finish_block (&block);
2427 }
2428
2429 /* Assign a single component of a derived type constructor.  */
2430
2431 static tree
2432 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2433 {
2434   gfc_se se;
2435   gfc_ss *rss;
2436   stmtblock_t block;
2437   tree tmp;
2438
2439   gfc_start_block (&block);
2440   if (cm->pointer)
2441     {
2442       gfc_init_se (&se, NULL);
2443       /* Pointer component.  */
2444       if (cm->dimension)
2445         {
2446           /* Array pointer.  */
2447           if (expr->expr_type == EXPR_NULL)
2448             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2449           else
2450             {
2451               rss = gfc_walk_expr (expr);
2452               se.direct_byref = 1;
2453               se.expr = dest;
2454               gfc_conv_expr_descriptor (&se, expr, rss);
2455               gfc_add_block_to_block (&block, &se.pre);
2456               gfc_add_block_to_block (&block, &se.post);
2457             }
2458         }
2459       else
2460         {
2461           /* Scalar pointers.  */
2462           se.want_pointer = 1;
2463           gfc_conv_expr (&se, expr);
2464           gfc_add_block_to_block (&block, &se.pre);
2465           gfc_add_modify_expr (&block, dest,
2466                                fold_convert (TREE_TYPE (dest), se.expr));
2467           gfc_add_block_to_block (&block, &se.post);
2468         }
2469     }
2470   else if (cm->dimension)
2471     {
2472       tmp = gfc_trans_subarray_assign (dest, cm, expr);
2473       gfc_add_expr_to_block (&block, tmp);
2474     }
2475   else if (expr->ts.type == BT_DERIVED)
2476     {
2477       /* Nested derived type.  */
2478       tmp = gfc_trans_structure_assign (dest, expr);
2479       gfc_add_expr_to_block (&block, tmp);
2480     }
2481   else
2482     {
2483       /* Scalar component.  */
2484       gfc_se lse;
2485
2486       gfc_init_se (&se, NULL);
2487       gfc_init_se (&lse, NULL);
2488
2489       gfc_conv_expr (&se, expr);
2490       if (cm->ts.type == BT_CHARACTER)
2491         lse.string_length = cm->ts.cl->backend_decl;
2492       lse.expr = dest;
2493       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts.type);
2494       gfc_add_expr_to_block (&block, tmp);
2495     }
2496   return gfc_finish_block (&block);
2497 }
2498
2499 /* Assign a derived type constructor to a variable.  */
2500
2501 static tree
2502 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
2503 {
2504   gfc_constructor *c;
2505   gfc_component *cm;
2506   stmtblock_t block;
2507   tree field;
2508   tree tmp;
2509
2510   gfc_start_block (&block);
2511   cm = expr->ts.derived->components;
2512   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2513     {
2514       /* Skip absent members in default initializers.  */
2515       if (!c->expr)
2516         continue;
2517
2518       field = cm->backend_decl;
2519       tmp = build3 (COMPONENT_REF, TREE_TYPE (field), dest, field, NULL_TREE);
2520       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
2521       gfc_add_expr_to_block (&block, tmp);
2522     }
2523   return gfc_finish_block (&block);
2524 }
2525
2526 /* Build an expression for a constructor. If init is nonzero then
2527    this is part of a static variable initializer.  */
2528
2529 void
2530 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
2531 {
2532   gfc_constructor *c;
2533   gfc_component *cm;
2534   tree val;
2535   tree type;
2536   tree tmp;
2537   VEC(constructor_elt,gc) *v = NULL;
2538
2539   gcc_assert (se->ss == NULL);
2540   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
2541   type = gfc_typenode_for_spec (&expr->ts);
2542
2543   if (!init)
2544     {
2545       /* Create a temporary variable and fill it in.  */
2546       se->expr = gfc_create_var (type, expr->ts.derived->name);
2547       tmp = gfc_trans_structure_assign (se->expr, expr);
2548       gfc_add_expr_to_block (&se->pre, tmp);
2549       return;
2550     }
2551
2552   cm = expr->ts.derived->components;
2553   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2554     {
2555       /* Skip absent members in default initializers.  */
2556       if (!c->expr)
2557         continue;
2558
2559       val = gfc_conv_initializer (c->expr, &cm->ts,
2560           TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
2561
2562       /* Append it to the constructor list.  */
2563       CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
2564     }
2565   se->expr = build_constructor (type, v);
2566 }
2567
2568
2569 /* Translate a substring expression.  */
2570
2571 static void
2572 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
2573 {
2574   gfc_ref *ref;
2575
2576   ref = expr->ref;
2577
2578   gcc_assert (ref->type == REF_SUBSTRING);
2579
2580   se->expr = gfc_build_string_const(expr->value.character.length,
2581                                     expr->value.character.string);
2582   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
2583   TYPE_STRING_FLAG (TREE_TYPE (se->expr))=1;
2584
2585   gfc_conv_substring(se,ref,expr->ts.kind);
2586 }
2587
2588
2589 /* Entry point for expression translation.  Evaluates a scalar quantity.
2590    EXPR is the expression to be translated, and SE is the state structure if
2591    called from within the scalarized.  */
2592
2593 void
2594 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
2595 {
2596   if (se->ss && se->ss->expr == expr
2597       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
2598     {
2599       /* Substitute a scalar expression evaluated outside the scalarization
2600          loop.  */
2601       se->expr = se->ss->data.scalar.expr;
2602       se->string_length = se->ss->string_length;
2603       gfc_advance_se_ss_chain (se);
2604       return;
2605     }
2606
2607   switch (expr->expr_type)
2608     {
2609     case EXPR_OP:
2610       gfc_conv_expr_op (se, expr);
2611       break;
2612
2613     case EXPR_FUNCTION:
2614       gfc_conv_function_expr (se, expr);
2615       break;
2616
2617     case EXPR_CONSTANT:
2618       gfc_conv_constant (se, expr);
2619       break;
2620
2621     case EXPR_VARIABLE:
2622       gfc_conv_variable (se, expr);
2623       break;
2624
2625     case EXPR_NULL:
2626       se->expr = null_pointer_node;
2627       break;
2628
2629     case EXPR_SUBSTRING:
2630       gfc_conv_substring_expr (se, expr);
2631       break;
2632
2633     case EXPR_STRUCTURE:
2634       gfc_conv_structure (se, expr, 0);
2635       break;
2636
2637     case EXPR_ARRAY:
2638       gfc_conv_array_constructor_expr (se, expr);
2639       break;
2640
2641     default:
2642       gcc_unreachable ();
2643       break;
2644     }
2645 }
2646
2647 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
2648    of an assignment.  */
2649 void
2650 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
2651 {
2652   gfc_conv_expr (se, expr);
2653   /* All numeric lvalues should have empty post chains.  If not we need to
2654      figure out a way of rewriting an lvalue so that it has no post chain.  */
2655   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
2656 }
2657
2658 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
2659    numeric expressions.  Used for scalar values where inserting cleanup code
2660    is inconvenient.  */
2661 void
2662 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
2663 {
2664   tree val;
2665
2666   gcc_assert (expr->ts.type != BT_CHARACTER);
2667   gfc_conv_expr (se, expr);
2668   if (se->post.head)
2669     {
2670       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
2671       gfc_add_modify_expr (&se->pre, val, se->expr);
2672       se->expr = val;
2673       gfc_add_block_to_block (&se->pre, &se->post);
2674     }
2675 }
2676
2677 /* Helper to translate and expression and convert it to a particular type.  */
2678 void
2679 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
2680 {
2681   gfc_conv_expr_val (se, expr);
2682   se->expr = convert (type, se->expr);
2683 }
2684
2685
2686 /* Converts an expression so that it can be passed by reference.  Scalar
2687    values only.  */
2688
2689 void
2690 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
2691 {
2692   tree var;
2693
2694   if (se->ss && se->ss->expr == expr
2695       && se->ss->type == GFC_SS_REFERENCE)
2696     {
2697       se->expr = se->ss->data.scalar.expr;
2698       se->string_length = se->ss->string_length;
2699       gfc_advance_se_ss_chain (se);
2700       return;
2701     }
2702
2703   if (expr->ts.type == BT_CHARACTER)
2704     {
2705       gfc_conv_expr (se, expr);
2706       gfc_conv_string_parameter (se);
2707       return;
2708     }
2709
2710   if (expr->expr_type == EXPR_VARIABLE)
2711     {
2712       se->want_pointer = 1;
2713       gfc_conv_expr (se, expr);
2714       if (se->post.head)
2715         {
2716           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2717           gfc_add_modify_expr (&se->pre, var, se->expr);
2718           gfc_add_block_to_block (&se->pre, &se->post);
2719           se->expr = var;
2720         }
2721       return;
2722     }
2723
2724   gfc_conv_expr (se, expr);
2725
2726   /* Create a temporary var to hold the value.  */
2727   if (TREE_CONSTANT (se->expr))
2728     {
2729       var = build_decl (CONST_DECL, NULL, TREE_TYPE (se->expr));
2730       DECL_INITIAL (var) = se->expr;
2731       pushdecl (var);
2732     }
2733   else
2734     {
2735       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
2736       gfc_add_modify_expr (&se->pre, var, se->expr);
2737     }
2738   gfc_add_block_to_block (&se->pre, &se->post);
2739
2740   /* Take the address of that value.  */
2741   se->expr = build_fold_addr_expr (var);
2742 }
2743
2744
2745 tree
2746 gfc_trans_pointer_assign (gfc_code * code)
2747 {
2748   return gfc_trans_pointer_assignment (code->expr, code->expr2);
2749 }
2750
2751
2752 /* Generate code for a pointer assignment.  */
2753
2754 tree
2755 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
2756 {
2757   gfc_se lse;
2758   gfc_se rse;
2759   gfc_ss *lss;
2760   gfc_ss *rss;
2761   stmtblock_t block;
2762   tree desc;
2763   tree tmp;
2764
2765   gfc_start_block (&block);
2766
2767   gfc_init_se (&lse, NULL);
2768
2769   lss = gfc_walk_expr (expr1);
2770   rss = gfc_walk_expr (expr2);
2771   if (lss == gfc_ss_terminator)
2772     {
2773       /* Scalar pointers.  */
2774       lse.want_pointer = 1;
2775       gfc_conv_expr (&lse, expr1);
2776       gcc_assert (rss == gfc_ss_terminator);
2777       gfc_init_se (&rse, NULL);
2778       rse.want_pointer = 1;
2779       gfc_conv_expr (&rse, expr2);
2780       gfc_add_block_to_block (&block, &lse.pre);
2781       gfc_add_block_to_block (&block, &rse.pre);
2782       gfc_add_modify_expr (&block, lse.expr,
2783                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
2784       gfc_add_block_to_block (&block, &rse.post);
2785       gfc_add_block_to_block (&block, &lse.post);
2786     }
2787   else
2788     {
2789       /* Array pointer.  */
2790       gfc_conv_expr_descriptor (&lse, expr1, lss);
2791       switch (expr2->expr_type)
2792         {
2793         case EXPR_NULL:
2794           /* Just set the data pointer to null.  */
2795           gfc_conv_descriptor_data_set (&block, lse.expr, null_pointer_node);
2796           break;
2797
2798         case EXPR_VARIABLE:
2799           /* Assign directly to the pointer's descriptor.  */
2800           lse.direct_byref = 1;
2801           gfc_conv_expr_descriptor (&lse, expr2, rss);
2802           break;
2803
2804         default:
2805           /* Assign to a temporary descriptor and then copy that
2806              temporary to the pointer.  */
2807           desc = lse.expr;
2808           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
2809
2810           lse.expr = tmp;
2811           lse.direct_byref = 1;
2812           gfc_conv_expr_descriptor (&lse, expr2, rss);
2813           gfc_add_modify_expr (&lse.pre, desc, tmp);
2814           break;
2815         }
2816       gfc_add_block_to_block (&block, &lse.pre);
2817       gfc_add_block_to_block (&block, &lse.post);
2818     }
2819   return gfc_finish_block (&block);
2820 }
2821
2822
2823 /* Makes sure se is suitable for passing as a function string parameter.  */
2824 /* TODO: Need to check all callers fo this function.  It may be abused.  */
2825
2826 void
2827 gfc_conv_string_parameter (gfc_se * se)
2828 {
2829   tree type;
2830
2831   if (TREE_CODE (se->expr) == STRING_CST)
2832     {
2833       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
2834       return;
2835     }
2836
2837   type = TREE_TYPE (se->expr);
2838   if (TYPE_STRING_FLAG (type))
2839     {
2840       gcc_assert (TREE_CODE (se->expr) != INDIRECT_REF);
2841       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
2842     }
2843
2844   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
2845   gcc_assert (se->string_length
2846           && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
2847 }
2848
2849
2850 /* Generate code for assignment of scalar variables.  Includes character
2851    strings.  */
2852
2853 tree
2854 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, bt type)
2855 {
2856   stmtblock_t block;
2857
2858   gfc_init_block (&block);
2859
2860   if (type == BT_CHARACTER)
2861     {
2862       gcc_assert (lse->string_length != NULL_TREE
2863               && rse->string_length != NULL_TREE);
2864
2865       gfc_conv_string_parameter (lse);
2866       gfc_conv_string_parameter (rse);
2867
2868       gfc_add_block_to_block (&block, &lse->pre);
2869       gfc_add_block_to_block (&block, &rse->pre);
2870
2871       gfc_trans_string_copy (&block, lse->string_length, lse->expr,
2872                              rse->string_length, rse->expr);
2873     }
2874   else
2875     {
2876       gfc_add_block_to_block (&block, &lse->pre);
2877       gfc_add_block_to_block (&block, &rse->pre);
2878
2879       gfc_add_modify_expr (&block, lse->expr,
2880                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
2881     }
2882
2883   gfc_add_block_to_block (&block, &lse->post);
2884   gfc_add_block_to_block (&block, &rse->post);
2885
2886   return gfc_finish_block (&block);
2887 }
2888
2889
2890 /* Try to translate array(:) = func (...), where func is a transformational
2891    array function, without using a temporary.  Returns NULL is this isn't the
2892    case.  */
2893
2894 static tree
2895 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
2896 {
2897   gfc_se se;
2898   gfc_ss *ss;
2899   gfc_ref * ref;
2900   bool seen_array_ref;
2901
2902   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
2903   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
2904     return NULL;
2905
2906   /* Elemental functions don't need a temporary anyway.  */
2907   if (expr2->value.function.esym != NULL
2908       && expr2->value.function.esym->attr.elemental)
2909     return NULL;
2910
2911   /* Fail if EXPR1 can't be expressed as a descriptor.  */
2912   if (gfc_ref_needs_temporary_p (expr1->ref))
2913     return NULL;
2914
2915   /* Check that no LHS component references appear during an array
2916      reference. This is needed because we do not have the means to
2917      span any arbitrary stride with an array descriptor. This check
2918      is not needed for the rhs because the function result has to be
2919      a complete type.  */
2920   seen_array_ref = false;
2921   for (ref = expr1->ref; ref; ref = ref->next)
2922     {
2923       if (ref->type == REF_ARRAY)
2924         seen_array_ref= true;
2925       else if (ref->type == REF_COMPONENT && seen_array_ref)
2926         return NULL;
2927     }
2928
2929   /* Check for a dependency.  */
2930   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
2931                                    expr2->value.function.esym,
2932                                    expr2->value.function.actual))
2933     return NULL;
2934
2935   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
2936      functions.  */
2937   gcc_assert (expr2->value.function.isym
2938               || (gfc_return_by_reference (expr2->value.function.esym)
2939               && expr2->value.function.esym->result->attr.dimension));
2940
2941   ss = gfc_walk_expr (expr1);
2942   gcc_assert (ss != gfc_ss_terminator);
2943   gfc_init_se (&se, NULL);
2944   gfc_start_block (&se.pre);
2945   se.want_pointer = 1;
2946
2947   gfc_conv_array_parameter (&se, expr1, ss, 0);
2948
2949   se.direct_byref = 1;
2950   se.ss = gfc_walk_expr (expr2);
2951   gcc_assert (se.ss != gfc_ss_terminator);
2952   gfc_conv_function_expr (&se, expr2);
2953   gfc_add_block_to_block (&se.pre, &se.post);
2954
2955   return gfc_finish_block (&se.pre);
2956 }
2957
2958
2959 /* Translate an assignment.  Most of the code is concerned with
2960    setting up the scalarizer.  */
2961
2962 tree
2963 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2)
2964 {
2965   gfc_se lse;
2966   gfc_se rse;
2967   gfc_ss *lss;
2968   gfc_ss *lss_section;
2969   gfc_ss *rss;
2970   gfc_loopinfo loop;
2971   tree tmp;
2972   stmtblock_t block;
2973   stmtblock_t body;
2974
2975   /* Special case a single function returning an array.  */
2976   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
2977     {
2978       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
2979       if (tmp)
2980         return tmp;
2981     }
2982
2983   /* Assignment of the form lhs = rhs.  */
2984   gfc_start_block (&block);
2985
2986   gfc_init_se (&lse, NULL);
2987   gfc_init_se (&rse, NULL);
2988
2989   /* Walk the lhs.  */
2990   lss = gfc_walk_expr (expr1);
2991   rss = NULL;
2992   if (lss != gfc_ss_terminator)
2993     {
2994       /* The assignment needs scalarization.  */
2995       lss_section = lss;
2996
2997       /* Find a non-scalar SS from the lhs.  */
2998       while (lss_section != gfc_ss_terminator
2999              && lss_section->type != GFC_SS_SECTION)
3000         lss_section = lss_section->next;
3001
3002       gcc_assert (lss_section != gfc_ss_terminator);
3003
3004       /* Initialize the scalarizer.  */
3005       gfc_init_loopinfo (&loop);
3006
3007       /* Walk the rhs.  */
3008       rss = gfc_walk_expr (expr2);
3009       if (rss == gfc_ss_terminator)
3010         {
3011           /* The rhs is scalar.  Add a ss for the expression.  */
3012           rss = gfc_get_ss ();
3013           rss->next = gfc_ss_terminator;
3014           rss->type = GFC_SS_SCALAR;
3015           rss->expr = expr2;
3016         }
3017       /* Associate the SS with the loop.  */
3018       gfc_add_ss_to_loop (&loop, lss);
3019       gfc_add_ss_to_loop (&loop, rss);
3020
3021       /* Calculate the bounds of the scalarization.  */
3022       gfc_conv_ss_startstride (&loop);
3023       /* Resolve any data dependencies in the statement.  */
3024       gfc_conv_resolve_dependencies (&loop, lss, rss);
3025       /* Setup the scalarizing loops.  */
3026       gfc_conv_loop_setup (&loop);
3027
3028       /* Setup the gfc_se structures.  */
3029       gfc_copy_loopinfo_to_se (&lse, &loop);
3030       gfc_copy_loopinfo_to_se (&rse, &loop);
3031
3032       rse.ss = rss;
3033       gfc_mark_ss_chain_used (rss, 1);
3034       if (loop.temp_ss == NULL)
3035         {
3036           lse.ss = lss;
3037           gfc_mark_ss_chain_used (lss, 1);
3038         }
3039       else
3040         {
3041           lse.ss = loop.temp_ss;
3042           gfc_mark_ss_chain_used (lss, 3);
3043           gfc_mark_ss_chain_used (loop.temp_ss, 3);
3044         }
3045
3046       /* Start the scalarized loop body.  */
3047       gfc_start_scalarized_body (&loop, &body);
3048     }
3049   else
3050     gfc_init_block (&body);
3051
3052   /* Translate the expression.  */
3053   gfc_conv_expr (&rse, expr2);
3054
3055   if (lss != gfc_ss_terminator && loop.temp_ss != NULL)
3056     {
3057       gfc_conv_tmp_array_ref (&lse);
3058       gfc_advance_se_ss_chain (&lse);
3059     }
3060   else
3061     gfc_conv_expr (&lse, expr1);
3062
3063   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3064   gfc_add_expr_to_block (&body, tmp);
3065
3066   if (lss == gfc_ss_terminator)
3067     {
3068       /* Use the scalar assignment as is.  */
3069       gfc_add_block_to_block (&block, &body);
3070     }
3071   else
3072     {
3073       gcc_assert (lse.ss == gfc_ss_terminator
3074                   && rse.ss == gfc_ss_terminator);
3075
3076       if (loop.temp_ss != NULL)
3077         {
3078           gfc_trans_scalarized_loop_boundary (&loop, &body);
3079
3080           /* We need to copy the temporary to the actual lhs.  */
3081           gfc_init_se (&lse, NULL);
3082           gfc_init_se (&rse, NULL);
3083           gfc_copy_loopinfo_to_se (&lse, &loop);
3084           gfc_copy_loopinfo_to_se (&rse, &loop);
3085
3086           rse.ss = loop.temp_ss;
3087           lse.ss = lss;
3088
3089           gfc_conv_tmp_array_ref (&rse);
3090           gfc_advance_se_ss_chain (&rse);
3091           gfc_conv_expr (&lse, expr1);
3092
3093           gcc_assert (lse.ss == gfc_ss_terminator
3094                       && rse.ss == gfc_ss_terminator);
3095
3096           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts.type);
3097           gfc_add_expr_to_block (&body, tmp);
3098         }
3099       /* Generate the copying loops.  */
3100       gfc_trans_scalarizing_loops (&loop, &body);
3101
3102       /* Wrap the whole thing up.  */
3103       gfc_add_block_to_block (&block, &loop.pre);
3104       gfc_add_block_to_block (&block, &loop.post);
3105
3106       gfc_cleanup_loop (&loop);
3107     }
3108
3109   return gfc_finish_block (&block);
3110 }
3111
3112 tree
3113 gfc_trans_assign (gfc_code * code)
3114 {
3115   return gfc_trans_assignment (code->expr, code->expr2);
3116 }