OSDN Git Service

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