OSDN Git Service

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