OSDN Git Service

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