OSDN Git Service

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