OSDN Git Service

2006-12-31 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 the code for argument list functions.  */
1910
1911 static void
1912 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
1913 {
1914   tree type = NULL_TREE;
1915   /* Pass by value for g77 %VAL(arg), pass the address
1916      indirectly for %LOC, else by reference.  Thus %REF
1917      is a "do-nothing" and %LOC is the same as an F95
1918      pointer.  */
1919   if (strncmp (name, "%VAL", 4) == 0)
1920     {
1921       gfc_conv_expr (se, expr);
1922       /* %VAL converts argument to default kind.  */
1923       switch (expr->ts.type)
1924         {
1925           case BT_REAL:
1926             type = gfc_get_real_type (gfc_default_real_kind);
1927             se->expr = fold_convert (type, se->expr);
1928             break;
1929           case BT_COMPLEX:
1930             type = gfc_get_complex_type (gfc_default_complex_kind);
1931             se->expr = fold_convert (type, se->expr);
1932             break;
1933           case BT_INTEGER:
1934             type = gfc_get_int_type (gfc_default_integer_kind);
1935             se->expr = fold_convert (type, se->expr);
1936             break;
1937           case BT_LOGICAL:
1938             type = gfc_get_logical_type (gfc_default_logical_kind);
1939             se->expr = fold_convert (type, se->expr);
1940             break;
1941           /* This should have been resolved away.  */
1942           case BT_UNKNOWN: case BT_CHARACTER: case BT_DERIVED:
1943           case BT_PROCEDURE: case BT_HOLLERITH:
1944             gfc_internal_error ("Bad type in conv_arglist_function");
1945         }
1946           
1947     }
1948   else if (strncmp (name, "%LOC", 4) == 0)
1949     {
1950       gfc_conv_expr_reference (se, expr);
1951       se->expr = gfc_build_addr_expr (NULL, se->expr);
1952     }
1953   else if (strncmp (name, "%REF", 4) == 0)
1954     gfc_conv_expr_reference (se, expr);
1955   else
1956     gfc_error ("Unknown argument list function at %L", &expr->where);
1957 }
1958
1959
1960 /* Generate code for a procedure call.  Note can return se->post != NULL.
1961    If se->direct_byref is set then se->expr contains the return parameter.
1962    Return nonzero, if the call has alternate specifiers.  */
1963
1964 int
1965 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
1966                         gfc_actual_arglist * arg, tree append_args)
1967 {
1968   gfc_interface_mapping mapping;
1969   tree arglist;
1970   tree retargs;
1971   tree tmp;
1972   tree fntype;
1973   gfc_se parmse;
1974   gfc_ss *argss;
1975   gfc_ss_info *info;
1976   int byref;
1977   int parm_kind;
1978   tree type;
1979   tree var;
1980   tree len;
1981   tree stringargs;
1982   gfc_formal_arglist *formal;
1983   int has_alternate_specifier = 0;
1984   bool need_interface_mapping;
1985   bool callee_alloc;
1986   gfc_typespec ts;
1987   gfc_charlen cl;
1988   gfc_expr *e;
1989   gfc_symbol *fsym;
1990   stmtblock_t post;
1991   enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
1992
1993   arglist = NULL_TREE;
1994   retargs = NULL_TREE;
1995   stringargs = NULL_TREE;
1996   var = NULL_TREE;
1997   len = NULL_TREE;
1998
1999   if (se->ss != NULL)
2000     {
2001       if (!sym->attr.elemental)
2002         {
2003           gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2004           if (se->ss->useflags)
2005             {
2006               gcc_assert (gfc_return_by_reference (sym)
2007                       && sym->result->attr.dimension);
2008               gcc_assert (se->loop != NULL);
2009
2010               /* Access the previously obtained result.  */
2011               gfc_conv_tmp_array_ref (se);
2012               gfc_advance_se_ss_chain (se);
2013               return 0;
2014             }
2015         }
2016       info = &se->ss->data.info;
2017     }
2018   else
2019     info = NULL;
2020
2021   gfc_init_block (&post);
2022   gfc_init_interface_mapping (&mapping);
2023   need_interface_mapping = ((sym->ts.type == BT_CHARACTER
2024                                   && sym->ts.cl->length
2025                                   && sym->ts.cl->length->expr_type
2026                                                 != EXPR_CONSTANT)
2027                               || sym->attr.dimension);
2028   formal = sym->formal;
2029   /* Evaluate the arguments.  */
2030   for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2031     {
2032       e = arg->expr;
2033       fsym = formal ? formal->sym : NULL;
2034       parm_kind = MISSING;
2035       if (e == NULL)
2036         {
2037
2038           if (se->ignore_optional)
2039             {
2040               /* Some intrinsics have already been resolved to the correct
2041                  parameters.  */
2042               continue;
2043             }
2044           else if (arg->label)
2045             {
2046               has_alternate_specifier = 1;
2047               continue;
2048             }
2049           else
2050             {
2051               /* Pass a NULL pointer for an absent arg.  */
2052               gfc_init_se (&parmse, NULL);
2053               parmse.expr = null_pointer_node;
2054               if (arg->missing_arg_type == BT_CHARACTER)
2055                 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2056             }
2057         }
2058       else if (se->ss && se->ss->useflags)
2059         {
2060           /* An elemental function inside a scalarized loop.  */
2061           gfc_init_se (&parmse, se);
2062           gfc_conv_expr_reference (&parmse, e);
2063           parm_kind = ELEMENTAL;
2064         }
2065       else
2066         {
2067           /* A scalar or transformational function.  */
2068           gfc_init_se (&parmse, NULL);
2069           argss = gfc_walk_expr (e);
2070
2071           if (argss == gfc_ss_terminator)
2072             {
2073               parm_kind = SCALAR;
2074               if (fsym && fsym->attr.value)
2075                 {
2076                   gfc_conv_expr (&parmse, e);
2077                 }
2078               else if (arg->name && arg->name[0] == '%')
2079                 /* Argument list functions %VAL, %LOC and %REF are signalled
2080                    through arg->name.  */
2081                 conv_arglist_function (&parmse, arg->expr, arg->name);
2082               else
2083                 {
2084                   gfc_conv_expr_reference (&parmse, e);
2085                   if (fsym && fsym->attr.pointer
2086                         && e->expr_type != EXPR_NULL)
2087                     {
2088                       /* Scalar pointer dummy args require an extra level of
2089                          indirection. The null pointer already contains
2090                          this level of indirection.  */
2091                       parm_kind = SCALAR_POINTER;
2092                       parmse.expr = build_fold_addr_expr (parmse.expr);
2093                     }
2094                 }
2095             }
2096           else
2097             {
2098               /* If the procedure requires an explicit interface, the actual
2099                  argument is passed according to the corresponding formal
2100                  argument.  If the corresponding formal argument is a POINTER,
2101                  ALLOCATABLE or assumed shape, we do not use g77's calling
2102                  convention, and pass the address of the array descriptor
2103                  instead. Otherwise we use g77's calling convention.  */
2104               int f;
2105               f = (fsym != NULL)
2106                   && !(fsym->attr.pointer || fsym->attr.allocatable)
2107                   && fsym->as->type != AS_ASSUMED_SHAPE;
2108               f = f || !sym->attr.always_explicit;
2109
2110               if (e->expr_type == EXPR_VARIABLE
2111                     && is_aliased_array (e))
2112                 /* The actual argument is a component reference to an
2113                    array of derived types.  In this case, the argument
2114                    is converted to a temporary, which is passed and then
2115                    written back after the procedure call.  */
2116                 gfc_conv_aliased_arg (&parmse, e, f,
2117                         fsym ? fsym->attr.intent : INTENT_INOUT);
2118               else
2119                 gfc_conv_array_parameter (&parmse, e, argss, f);
2120
2121               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is 
2122                  allocated on entry, it must be deallocated.  */
2123               if (fsym && fsym->attr.allocatable
2124                   && fsym->attr.intent == INTENT_OUT)
2125                 {
2126                   tmp = build_fold_indirect_ref (parmse.expr);
2127                   tmp = gfc_trans_dealloc_allocated (tmp);
2128                   gfc_add_expr_to_block (&se->pre, tmp);
2129                 }
2130
2131             } 
2132         }
2133
2134       if (fsym)
2135         {
2136           if (e)
2137             {
2138               /* If an optional argument is itself an optional dummy
2139                  argument, check its presence and substitute a null
2140                  if absent.  */
2141               if (e->expr_type == EXPR_VARIABLE
2142                     && e->symtree->n.sym->attr.optional
2143                     && fsym->attr.optional)
2144                 gfc_conv_missing_dummy (&parmse, e, fsym->ts);
2145
2146               /* If an INTENT(OUT) dummy of derived type has a default
2147                  initializer, it must be (re)initialized here.  */
2148               if (fsym->attr.intent == INTENT_OUT
2149                     && fsym->ts.type == BT_DERIVED
2150                     && fsym->value)
2151                 {
2152                   gcc_assert (!fsym->attr.allocatable);
2153                   tmp = gfc_trans_assignment (e, fsym->value, false);
2154                   gfc_add_expr_to_block (&se->pre, tmp);
2155                 }
2156
2157               /* Obtain the character length of an assumed character
2158                  length procedure from the typespec.  */
2159               if (fsym->ts.type == BT_CHARACTER
2160                     && parmse.string_length == NULL_TREE
2161                     && e->ts.type == BT_PROCEDURE
2162                     && e->symtree->n.sym->ts.type == BT_CHARACTER
2163                     && e->symtree->n.sym->ts.cl->length != NULL)
2164                 {
2165                   gfc_conv_const_charlen (e->symtree->n.sym->ts.cl);
2166                   parmse.string_length
2167                         = e->symtree->n.sym->ts.cl->backend_decl;
2168                 }
2169             }
2170
2171           if (need_interface_mapping)
2172             gfc_add_interface_mapping (&mapping, fsym, &parmse);
2173         }
2174
2175       gfc_add_block_to_block (&se->pre, &parmse.pre);
2176       gfc_add_block_to_block (&post, &parmse.post);
2177
2178       /* Allocated allocatable components of derived types must be
2179          deallocated for INTENT(OUT) dummy arguments and non-variable
2180          scalars.  Non-variable arrays are dealt with in trans-array.c
2181          (gfc_conv_array_parameter).  */
2182       if (e && e->ts.type == BT_DERIVED
2183             && e->ts.derived->attr.alloc_comp
2184             && ((formal && formal->sym->attr.intent == INTENT_OUT)
2185                    ||
2186                 (e->expr_type != EXPR_VARIABLE && !e->rank)))
2187         {
2188           int parm_rank;
2189           tmp = build_fold_indirect_ref (parmse.expr);
2190           parm_rank = e->rank;
2191           switch (parm_kind)
2192             {
2193             case (ELEMENTAL):
2194             case (SCALAR):
2195               parm_rank = 0;
2196               break;
2197
2198             case (SCALAR_POINTER):
2199               tmp = build_fold_indirect_ref (tmp);
2200               break;
2201             case (ARRAY):
2202               tmp = parmse.expr;
2203               break;
2204             }
2205
2206           tmp = gfc_deallocate_alloc_comp (e->ts.derived, tmp, parm_rank);
2207           if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.optional)
2208             tmp = build3_v (COND_EXPR, gfc_conv_expr_present (e->symtree->n.sym),
2209                             tmp, build_empty_stmt ());
2210
2211           if (e->expr_type != EXPR_VARIABLE)
2212             /* Don't deallocate non-variables until they have been used.  */
2213             gfc_add_expr_to_block (&se->post, tmp);
2214           else 
2215             {
2216               gcc_assert (formal && formal->sym->attr.intent == INTENT_OUT);
2217               gfc_add_expr_to_block (&se->pre, tmp);
2218             }
2219         }
2220
2221       /* Character strings are passed as two parameters, a length and a
2222          pointer.  */
2223       if (parmse.string_length != NULL_TREE)
2224         stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2225
2226       arglist = gfc_chainon_list (arglist, parmse.expr);
2227     }
2228   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2229
2230   ts = sym->ts;
2231   if (ts.type == BT_CHARACTER)
2232     {
2233       if (sym->ts.cl->length == NULL)
2234         {
2235           /* Assumed character length results are not allowed by 5.1.1.5 of the
2236              standard and are trapped in resolve.c; except in the case of SPREAD
2237              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
2238              we take the character length of the first argument for the result.
2239              For dummies, we have to look through the formal argument list for
2240              this function and use the character length found there.*/
2241           if (!sym->attr.dummy)
2242             cl.backend_decl = TREE_VALUE (stringargs);
2243           else
2244             {
2245               formal = sym->ns->proc_name->formal;
2246               for (; formal; formal = formal->next)
2247                 if (strcmp (formal->sym->name, sym->name) == 0)
2248                   cl.backend_decl = formal->sym->ts.cl->backend_decl;
2249             }
2250         }
2251         else
2252         {
2253           /* Calculate the length of the returned string.  */
2254           gfc_init_se (&parmse, NULL);
2255           if (need_interface_mapping)
2256             gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2257           else
2258             gfc_conv_expr (&parmse, sym->ts.cl->length);
2259           gfc_add_block_to_block (&se->pre, &parmse.pre);
2260           gfc_add_block_to_block (&se->post, &parmse.post);
2261           cl.backend_decl = fold_convert (gfc_charlen_type_node, parmse.expr);
2262         }
2263
2264       /* Set up a charlen structure for it.  */
2265       cl.next = NULL;
2266       cl.length = NULL;
2267       ts.cl = &cl;
2268
2269       len = cl.backend_decl;
2270     }
2271
2272   byref = gfc_return_by_reference (sym);
2273   if (byref)
2274     {
2275       if (se->direct_byref)
2276         retargs = gfc_chainon_list (retargs, se->expr);
2277       else if (sym->result->attr.dimension)
2278         {
2279           gcc_assert (se->loop && info);
2280
2281           /* Set the type of the array.  */
2282           tmp = gfc_typenode_for_spec (&ts);
2283           info->dimen = se->loop->dimen;
2284
2285           /* Evaluate the bounds of the result, if known.  */
2286           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2287
2288           /* Create a temporary to store the result.  In case the function
2289              returns a pointer, the temporary will be a shallow copy and
2290              mustn't be deallocated.  */
2291           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2292           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2293                                        false, !sym->attr.pointer, callee_alloc,
2294                                        true);
2295
2296           /* Pass the temporary as the first argument.  */
2297           tmp = info->descriptor;
2298           tmp = build_fold_addr_expr (tmp);
2299           retargs = gfc_chainon_list (retargs, tmp);
2300         }
2301       else if (ts.type == BT_CHARACTER)
2302         {
2303           /* Pass the string length.  */
2304           type = gfc_get_character_type (ts.kind, ts.cl);
2305           type = build_pointer_type (type);
2306
2307           /* Return an address to a char[0:len-1]* temporary for
2308              character pointers.  */
2309           if (sym->attr.pointer || sym->attr.allocatable)
2310             {
2311               /* Build char[0:len-1] * pstr.  */
2312               tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
2313                                  build_int_cst (gfc_charlen_type_node, 1));
2314               tmp = build_range_type (gfc_array_index_type,
2315                                       gfc_index_zero_node, tmp);
2316               tmp = build_array_type (gfc_character1_type_node, tmp);
2317               var = gfc_create_var (build_pointer_type (tmp), "pstr");
2318
2319               /* Provide an address expression for the function arguments.  */
2320               var = build_fold_addr_expr (var);
2321             }
2322           else
2323             var = gfc_conv_string_tmp (se, type, len);
2324
2325           retargs = gfc_chainon_list (retargs, var);
2326         }
2327       else
2328         {
2329           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2330
2331           type = gfc_get_complex_type (ts.kind);
2332           var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2333           retargs = gfc_chainon_list (retargs, var);
2334         }
2335
2336       /* Add the string length to the argument list.  */
2337       if (ts.type == BT_CHARACTER)
2338         retargs = gfc_chainon_list (retargs, len);
2339     }
2340   gfc_free_interface_mapping (&mapping);
2341
2342   /* Add the return arguments.  */
2343   arglist = chainon (retargs, arglist);
2344
2345   /* Add the hidden string length parameters to the arguments.  */
2346   arglist = chainon (arglist, stringargs);
2347
2348   /* We may want to append extra arguments here.  This is used e.g. for
2349      calls to libgfortran_matmul_??, which need extra information.  */
2350   if (append_args != NULL_TREE)
2351     arglist = chainon (arglist, append_args);
2352
2353   /* Generate the actual call.  */
2354   gfc_conv_function_val (se, sym);
2355   /* If there are alternate return labels, function type should be
2356      integer.  Can't modify the type in place though, since it can be shared
2357      with other functions.  */
2358   if (has_alternate_specifier
2359       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2360     {
2361       gcc_assert (! sym->attr.dummy);
2362       TREE_TYPE (sym->backend_decl)
2363         = build_function_type (integer_type_node,
2364                                TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2365       se->expr = build_fold_addr_expr (sym->backend_decl);
2366     }
2367
2368   fntype = TREE_TYPE (TREE_TYPE (se->expr));
2369   se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
2370                      arglist, NULL_TREE);
2371
2372   /* If we have a pointer function, but we don't want a pointer, e.g.
2373      something like
2374         x = f()
2375      where f is pointer valued, we have to dereference the result.  */
2376   if (!se->want_pointer && !byref && sym->attr.pointer)
2377     se->expr = build_fold_indirect_ref (se->expr);
2378
2379   /* f2c calling conventions require a scalar default real function to
2380      return a double precision result.  Convert this back to default
2381      real.  We only care about the cases that can happen in Fortran 77.
2382   */
2383   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2384       && sym->ts.kind == gfc_default_real_kind
2385       && !sym->attr.always_explicit)
2386     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2387
2388   /* A pure function may still have side-effects - it may modify its
2389      parameters.  */
2390   TREE_SIDE_EFFECTS (se->expr) = 1;
2391 #if 0
2392   if (!sym->attr.pure)
2393     TREE_SIDE_EFFECTS (se->expr) = 1;
2394 #endif
2395
2396   if (byref)
2397     {
2398       /* Add the function call to the pre chain.  There is no expression.  */
2399       gfc_add_expr_to_block (&se->pre, se->expr);
2400       se->expr = NULL_TREE;
2401
2402       if (!se->direct_byref)
2403         {
2404           if (sym->attr.dimension)
2405             {
2406               if (flag_bounds_check)
2407                 {
2408                   /* Check the data pointer hasn't been modified.  This would
2409                      happen in a function returning a pointer.  */
2410                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
2411                   tmp = fold_build2 (NE_EXPR, boolean_type_node,
2412                                      tmp, info->data);
2413                   gfc_trans_runtime_check (tmp, gfc_msg_fault, &se->pre, NULL);
2414                 }
2415               se->expr = info->descriptor;
2416               /* Bundle in the string length.  */
2417               se->string_length = len;
2418             }
2419           else if (sym->ts.type == BT_CHARACTER)
2420             {
2421               /* Dereference for character pointer results.  */
2422               if (sym->attr.pointer || sym->attr.allocatable)
2423                 se->expr = build_fold_indirect_ref (var);
2424               else
2425                 se->expr = var;
2426
2427               se->string_length = len;
2428             }
2429           else
2430             {
2431               gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
2432               se->expr = build_fold_indirect_ref (var);
2433             }
2434         }
2435     }
2436
2437   /* Follow the function call with the argument post block.  */
2438   if (byref)
2439     gfc_add_block_to_block (&se->pre, &post);
2440   else
2441     gfc_add_block_to_block (&se->post, &post);
2442
2443   return has_alternate_specifier;
2444 }
2445
2446
2447 /* Generate code to copy a string.  */
2448
2449 static void
2450 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
2451                        tree slength, tree src)
2452 {
2453   tree tmp, dlen, slen;
2454   tree dsc;
2455   tree ssc;
2456   tree cond;
2457   tree cond2;
2458   tree tmp2;
2459   tree tmp3;
2460   tree tmp4;
2461   stmtblock_t tempblock;
2462
2463   dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
2464   slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
2465
2466   /* Deal with single character specially.  */
2467   dsc = gfc_to_single_character (dlen, dest);
2468   ssc = gfc_to_single_character (slen, src);
2469   if (dsc != NULL_TREE && ssc != NULL_TREE)
2470     {
2471       gfc_add_modify_expr (block, dsc, ssc);
2472       return;
2473     }
2474
2475   /* Do nothing if the destination length is zero.  */
2476   cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
2477                       build_int_cst (gfc_charlen_type_node, 0));
2478
2479   /* The following code was previously in _gfortran_copy_string:
2480
2481        // The two strings may overlap so we use memmove.
2482        void
2483        copy_string (GFC_INTEGER_4 destlen, char * dest,
2484                     GFC_INTEGER_4 srclen, const char * src)
2485        {
2486          if (srclen >= destlen)
2487            {
2488              // This will truncate if too long.
2489              memmove (dest, src, destlen);
2490            }
2491          else
2492            {
2493              memmove (dest, src, srclen);
2494              // Pad with spaces.
2495              memset (&dest[srclen], ' ', destlen - srclen);
2496            }
2497        }
2498
2499      We're now doing it here for better optimization, but the logic
2500      is the same.  */
2501   
2502   /* Truncate string if source is too long.  */
2503   cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
2504   tmp2 = gfc_chainon_list (NULL_TREE, dest);
2505   tmp2 = gfc_chainon_list (tmp2, src);
2506   tmp2 = gfc_chainon_list (tmp2, dlen);
2507   tmp2 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp2);
2508
2509   /* Else copy and pad with spaces.  */
2510   tmp3 = gfc_chainon_list (NULL_TREE, dest);
2511   tmp3 = gfc_chainon_list (tmp3, src);
2512   tmp3 = gfc_chainon_list (tmp3, slen);
2513   tmp3 = build_function_call_expr (built_in_decls[BUILT_IN_MEMMOVE], tmp3);
2514
2515   tmp4 = fold_build2 (PLUS_EXPR, pchar_type_node, dest,
2516                       fold_convert (pchar_type_node, slen));
2517   tmp4 = gfc_chainon_list (NULL_TREE, tmp4);
2518   tmp4 = gfc_chainon_list (tmp4, build_int_cst
2519                                    (gfc_get_int_type (gfc_c_int_kind),
2520                                     lang_hooks.to_target_charset (' ')));
2521   tmp4 = gfc_chainon_list (tmp4, fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
2522                                               dlen, slen));
2523   tmp4 = build_function_call_expr (built_in_decls[BUILT_IN_MEMSET], tmp4);
2524
2525   gfc_init_block (&tempblock);
2526   gfc_add_expr_to_block (&tempblock, tmp3);
2527   gfc_add_expr_to_block (&tempblock, tmp4);
2528   tmp3 = gfc_finish_block (&tempblock);
2529
2530   /* The whole copy_string function is there.  */
2531   tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
2532   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
2533   gfc_add_expr_to_block (block, tmp);
2534 }
2535
2536
2537 /* Translate a statement function.
2538    The value of a statement function reference is obtained by evaluating the
2539    expression using the values of the actual arguments for the values of the
2540    corresponding dummy arguments.  */
2541
2542 static void
2543 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
2544 {
2545   gfc_symbol *sym;
2546   gfc_symbol *fsym;
2547   gfc_formal_arglist *fargs;
2548   gfc_actual_arglist *args;
2549   gfc_se lse;
2550   gfc_se rse;
2551   gfc_saved_var *saved_vars;
2552   tree *temp_vars;
2553   tree type;
2554   tree tmp;
2555   int n;
2556
2557   sym = expr->symtree->n.sym;
2558   args = expr->value.function.actual;
2559   gfc_init_se (&lse, NULL);
2560   gfc_init_se (&rse, NULL);
2561
2562   n = 0;
2563   for (fargs = sym->formal; fargs; fargs = fargs->next)
2564     n++;
2565   saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
2566   temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
2567
2568   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2569     {
2570       /* Each dummy shall be specified, explicitly or implicitly, to be
2571          scalar.  */
2572       gcc_assert (fargs->sym->attr.dimension == 0);
2573       fsym = fargs->sym;
2574
2575       /* Create a temporary to hold the value.  */
2576       type = gfc_typenode_for_spec (&fsym->ts);
2577       temp_vars[n] = gfc_create_var (type, fsym->name);
2578
2579       if (fsym->ts.type == BT_CHARACTER)
2580         {
2581           /* Copy string arguments.  */
2582           tree arglen;
2583
2584           gcc_assert (fsym->ts.cl && fsym->ts.cl->length
2585                   && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
2586
2587           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
2588           tmp = gfc_build_addr_expr (build_pointer_type (type),
2589                                      temp_vars[n]);
2590
2591           gfc_conv_expr (&rse, args->expr);
2592           gfc_conv_string_parameter (&rse);
2593           gfc_add_block_to_block (&se->pre, &lse.pre);
2594           gfc_add_block_to_block (&se->pre, &rse.pre);
2595
2596           gfc_trans_string_copy (&se->pre, arglen, tmp, rse.string_length,
2597                                  rse.expr);
2598           gfc_add_block_to_block (&se->pre, &lse.post);
2599           gfc_add_block_to_block (&se->pre, &rse.post);
2600         }
2601       else
2602         {
2603           /* For everything else, just evaluate the expression.  */
2604           gfc_conv_expr (&lse, args->expr);
2605
2606           gfc_add_block_to_block (&se->pre, &lse.pre);
2607           gfc_add_modify_expr (&se->pre, temp_vars[n], lse.expr);
2608           gfc_add_block_to_block (&se->pre, &lse.post);
2609         }
2610
2611       args = args->next;
2612     }
2613
2614   /* Use the temporary variables in place of the real ones.  */
2615   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2616     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
2617
2618   gfc_conv_expr (se, sym->value);
2619
2620   if (sym->ts.type == BT_CHARACTER)
2621     {
2622       gfc_conv_const_charlen (sym->ts.cl);
2623
2624       /* Force the expression to the correct length.  */
2625       if (!INTEGER_CST_P (se->string_length)
2626           || tree_int_cst_lt (se->string_length,
2627                               sym->ts.cl->backend_decl))
2628         {
2629           type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
2630           tmp = gfc_create_var (type, sym->name);
2631           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
2632           gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
2633                                  se->string_length, se->expr);
2634           se->expr = tmp;
2635         }
2636       se->string_length = sym->ts.cl->backend_decl;
2637     }
2638
2639   /* Restore the original variables.  */
2640   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
2641     gfc_restore_sym (fargs->sym, &saved_vars[n]);
2642   gfc_free (saved_vars);
2643 }
2644
2645
2646 /* Translate a function expression.  */
2647
2648 static void
2649 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
2650 {
2651   gfc_symbol *sym;
2652
2653   if (expr->value.function.isym)
2654     {
2655       gfc_conv_intrinsic_function (se, expr);
2656       return;
2657     }
2658
2659   /* We distinguish statement functions from general functions to improve
2660      runtime performance.  */
2661   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
2662     {
2663       gfc_conv_statement_function (se, expr);
2664       return;
2665     }
2666
2667   /* expr.value.function.esym is the resolved (specific) function symbol for
2668      most functions.  However this isn't set for dummy procedures.  */
2669   sym = expr->value.function.esym;
2670   if (!sym)
2671     sym = expr->symtree->n.sym;
2672   gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE);
2673 }
2674
2675
2676 static void
2677 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
2678 {
2679   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
2680   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
2681
2682   gfc_conv_tmp_array_ref (se);
2683   gfc_advance_se_ss_chain (se);
2684 }
2685
2686
2687 /* Build a static initializer.  EXPR is the expression for the initial value.
2688    The other parameters describe the variable of the component being 
2689    initialized. EXPR may be null.  */
2690
2691 tree
2692 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
2693                       bool array, bool pointer)
2694 {
2695   gfc_se se;
2696
2697   if (!(expr || pointer))
2698     return NULL_TREE;
2699
2700   if (array)
2701     {
2702       /* Arrays need special handling.  */
2703       if (pointer)
2704         return gfc_build_null_descriptor (type);
2705       else
2706         return gfc_conv_array_initializer (type, expr);
2707     }
2708   else if (pointer)
2709     return fold_convert (type, null_pointer_node);
2710   else
2711     {
2712       switch (ts->type)
2713         {
2714         case BT_DERIVED:
2715           gfc_init_se (&se, NULL);
2716           gfc_conv_structure (&se, expr, 1);
2717           return se.expr;
2718
2719         case BT_CHARACTER:
2720           return gfc_conv_string_init (ts->cl->backend_decl,expr);
2721
2722         default:
2723           gfc_init_se (&se, NULL);
2724           gfc_conv_constant (&se, expr);
2725           return se.expr;
2726         }
2727     }
2728 }
2729   
2730 static tree
2731 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2732 {
2733   gfc_se rse;
2734   gfc_se lse;
2735   gfc_ss *rss;
2736   gfc_ss *lss;
2737   stmtblock_t body;
2738   stmtblock_t block;
2739   gfc_loopinfo loop;
2740   int n;
2741   tree tmp;
2742
2743   gfc_start_block (&block);
2744
2745   /* Initialize the scalarizer.  */
2746   gfc_init_loopinfo (&loop);
2747
2748   gfc_init_se (&lse, NULL);
2749   gfc_init_se (&rse, NULL);
2750
2751   /* Walk the rhs.  */
2752   rss = gfc_walk_expr (expr);
2753   if (rss == gfc_ss_terminator)
2754     {
2755       /* The rhs is scalar.  Add a ss for the expression.  */
2756       rss = gfc_get_ss ();
2757       rss->next = gfc_ss_terminator;
2758       rss->type = GFC_SS_SCALAR;
2759       rss->expr = expr;
2760     }
2761
2762   /* Create a SS for the destination.  */
2763   lss = gfc_get_ss ();
2764   lss->type = GFC_SS_COMPONENT;
2765   lss->expr = NULL;
2766   lss->shape = gfc_get_shape (cm->as->rank);
2767   lss->next = gfc_ss_terminator;
2768   lss->data.info.dimen = cm->as->rank;
2769   lss->data.info.descriptor = dest;
2770   lss->data.info.data = gfc_conv_array_data (dest);
2771   lss->data.info.offset = gfc_conv_array_offset (dest);
2772   for (n = 0; n < cm->as->rank; n++)
2773     {
2774       lss->data.info.dim[n] = n;
2775       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
2776       lss->data.info.stride[n] = gfc_index_one_node;
2777
2778       mpz_init (lss->shape[n]);
2779       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
2780                cm->as->lower[n]->value.integer);
2781       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
2782     }
2783   
2784   /* Associate the SS with the loop.  */
2785   gfc_add_ss_to_loop (&loop, lss);
2786   gfc_add_ss_to_loop (&loop, rss);
2787
2788   /* Calculate the bounds of the scalarization.  */
2789   gfc_conv_ss_startstride (&loop);
2790
2791   /* Setup the scalarizing loops.  */
2792   gfc_conv_loop_setup (&loop);
2793
2794   /* Setup the gfc_se structures.  */
2795   gfc_copy_loopinfo_to_se (&lse, &loop);
2796   gfc_copy_loopinfo_to_se (&rse, &loop);
2797
2798   rse.ss = rss;
2799   gfc_mark_ss_chain_used (rss, 1);
2800   lse.ss = lss;
2801   gfc_mark_ss_chain_used (lss, 1);
2802
2803   /* Start the scalarized loop body.  */
2804   gfc_start_scalarized_body (&loop, &body);
2805
2806   gfc_conv_tmp_array_ref (&lse);
2807   if (cm->ts.type == BT_CHARACTER)
2808     lse.string_length = cm->ts.cl->backend_decl;
2809
2810   gfc_conv_expr (&rse, expr);
2811
2812   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
2813   gfc_add_expr_to_block (&body, tmp);
2814
2815   gcc_assert (rse.ss == gfc_ss_terminator);
2816
2817   /* Generate the copying loops.  */
2818   gfc_trans_scalarizing_loops (&loop, &body);
2819
2820   /* Wrap the whole thing up.  */
2821   gfc_add_block_to_block (&block, &loop.pre);
2822   gfc_add_block_to_block (&block, &loop.post);
2823
2824   for (n = 0; n < cm->as->rank; n++)
2825     mpz_clear (lss->shape[n]);
2826   gfc_free (lss->shape);
2827
2828   gfc_cleanup_loop (&loop);
2829
2830   return gfc_finish_block (&block);
2831 }
2832
2833
2834 /* Assign a single component of a derived type constructor.  */
2835
2836 static tree
2837 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
2838 {
2839   gfc_se se;
2840   gfc_se lse;
2841   gfc_ss *rss;
2842   stmtblock_t block;
2843   tree tmp;
2844   tree offset;
2845   int n;
2846
2847   gfc_start_block (&block);
2848
2849   if (cm->pointer)
2850     {
2851       gfc_init_se (&se, NULL);
2852       /* Pointer component.  */
2853       if (cm->dimension)
2854         {
2855           /* Array pointer.  */
2856           if (expr->expr_type == EXPR_NULL)
2857             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2858           else
2859             {
2860               rss = gfc_walk_expr (expr);
2861               se.direct_byref = 1;
2862               se.expr = dest;
2863               gfc_conv_expr_descriptor (&se, expr, rss);
2864               gfc_add_block_to_block (&block, &se.pre);
2865               gfc_add_block_to_block (&block, &se.post);
2866             }
2867         }
2868       else
2869         {
2870           /* Scalar pointers.  */
2871           se.want_pointer = 1;
2872           gfc_conv_expr (&se, expr);
2873           gfc_add_block_to_block (&block, &se.pre);
2874           gfc_add_modify_expr (&block, dest,
2875                                fold_convert (TREE_TYPE (dest), se.expr));
2876           gfc_add_block_to_block (&block, &se.post);
2877         }
2878     }
2879   else if (cm->dimension)
2880     {
2881       if (cm->allocatable && expr->expr_type == EXPR_NULL)
2882         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
2883       else if (cm->allocatable)
2884         {
2885           tree tmp2;
2886
2887           gfc_init_se (&se, NULL);
2888  
2889           rss = gfc_walk_expr (expr);
2890           se.want_pointer = 0;
2891           gfc_conv_expr_descriptor (&se, expr, rss);
2892           gfc_add_block_to_block (&block, &se.pre);
2893
2894           tmp = fold_convert (TREE_TYPE (dest), se.expr);
2895           gfc_add_modify_expr (&block, dest, tmp);
2896
2897           if (cm->ts.type == BT_DERIVED && cm->ts.derived->attr.alloc_comp)
2898             tmp = gfc_copy_alloc_comp (cm->ts.derived, se.expr, dest,
2899                                        cm->as->rank);
2900           else
2901             tmp = gfc_duplicate_allocatable (dest, se.expr,
2902                                              TREE_TYPE(cm->backend_decl),
2903                                              cm->as->rank);
2904
2905           gfc_add_expr_to_block (&block, tmp);
2906
2907           gfc_add_block_to_block (&block, &se.post);
2908           gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
2909
2910           /* Shift the lbound and ubound of temporaries to being unity, rather
2911              than zero, based.  Calculate the offset for all cases.  */
2912           offset = gfc_conv_descriptor_offset (dest);
2913           gfc_add_modify_expr (&block, offset, gfc_index_zero_node);
2914           tmp2 =gfc_create_var (gfc_array_index_type, NULL);
2915           for (n = 0; n < expr->rank; n++)
2916             {
2917               if (expr->expr_type != EXPR_VARIABLE
2918                   && expr->expr_type != EXPR_CONSTANT)
2919                 {
2920                   tmp = gfc_conv_descriptor_ubound (dest, gfc_rank_cst[n]);
2921                   gfc_add_modify_expr (&block, tmp,
2922                                        fold_build2 (PLUS_EXPR,
2923                                                     gfc_array_index_type,
2924                                                     tmp, gfc_index_one_node));
2925                   tmp = gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]);
2926                   gfc_add_modify_expr (&block, tmp, gfc_index_one_node);
2927                 }
2928               tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
2929                                  gfc_conv_descriptor_lbound (dest,
2930                                                              gfc_rank_cst[n]),
2931                                  gfc_conv_descriptor_stride (dest,
2932                                                              gfc_rank_cst[n]));
2933               gfc_add_modify_expr (&block, tmp2, tmp);
2934               tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
2935               gfc_add_modify_expr (&block, offset, tmp);
2936             }
2937         }
2938       else
2939         {
2940           tmp = gfc_trans_subarray_assign (dest, cm, expr);
2941           gfc_add_expr_to_block (&block, tmp);
2942         }
2943     }
2944   else if (expr->ts.type == BT_DERIVED)
2945     {
2946       if (expr->expr_type != EXPR_STRUCTURE)
2947         {
2948           gfc_init_se (&se, NULL);
2949           gfc_conv_expr (&se, expr);
2950           gfc_add_modify_expr (&block, dest,
2951                                fold_convert (TREE_TYPE (dest), se.expr));
2952         }
2953       else
2954         {
2955           /* Nested constructors.  */
2956           tmp = gfc_trans_structure_assign (dest, expr);
2957           gfc_add_expr_to_block (&block, tmp);
2958         }
2959     }
2960   else
2961     {
2962       /* Scalar component.  */
2963       gfc_init_se (&se, NULL);
2964       gfc_init_se (&lse, NULL);
2965
2966       gfc_conv_expr (&se, expr);
2967       if (cm->ts.type == BT_CHARACTER)
2968         lse.string_length = cm->ts.cl->backend_decl;
2969       lse.expr = dest;
2970       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
2971       gfc_add_expr_to_block (&block, tmp);
2972     }
2973   return gfc_finish_block (&block);
2974 }
2975
2976 /* Assign a derived type constructor to a variable.  */
2977
2978 static tree
2979 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
2980 {
2981   gfc_constructor *c;
2982   gfc_component *cm;
2983   stmtblock_t block;
2984   tree field;
2985   tree tmp;
2986
2987   gfc_start_block (&block);
2988   cm = expr->ts.derived->components;
2989   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
2990     {
2991       /* Skip absent members in default initializers.  */
2992       if (!c->expr)
2993         continue;
2994
2995       field = cm->backend_decl;
2996       tmp = build3 (COMPONENT_REF, TREE_TYPE (field), dest, field, NULL_TREE);
2997       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
2998       gfc_add_expr_to_block (&block, tmp);
2999     }
3000   return gfc_finish_block (&block);
3001 }
3002
3003 /* Build an expression for a constructor. If init is nonzero then
3004    this is part of a static variable initializer.  */
3005
3006 void
3007 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
3008 {
3009   gfc_constructor *c;
3010   gfc_component *cm;
3011   tree val;
3012   tree type;
3013   tree tmp;
3014   VEC(constructor_elt,gc) *v = NULL;
3015
3016   gcc_assert (se->ss == NULL);
3017   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
3018   type = gfc_typenode_for_spec (&expr->ts);
3019
3020   if (!init)
3021     {
3022       /* Create a temporary variable and fill it in.  */
3023       se->expr = gfc_create_var (type, expr->ts.derived->name);
3024       tmp = gfc_trans_structure_assign (se->expr, expr);
3025       gfc_add_expr_to_block (&se->pre, tmp);
3026       return;
3027     }
3028
3029   cm = expr->ts.derived->components;
3030
3031   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3032     {
3033       /* Skip absent members in default initializers and allocatable
3034          components.  Although the latter have a default initializer
3035          of EXPR_NULL,... by default, the static nullify is not needed
3036          since this is done every time we come into scope.  */
3037       if (!c->expr || cm->allocatable)
3038         continue;
3039
3040       val = gfc_conv_initializer (c->expr, &cm->ts,
3041           TREE_TYPE (cm->backend_decl), cm->dimension, cm->pointer);
3042
3043       /* Append it to the constructor list.  */
3044       CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
3045     }
3046   se->expr = build_constructor (type, v);
3047 }
3048
3049
3050 /* Translate a substring expression.  */
3051
3052 static void
3053 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
3054 {
3055   gfc_ref *ref;
3056
3057   ref = expr->ref;
3058
3059   gcc_assert (ref->type == REF_SUBSTRING);
3060
3061   se->expr = gfc_build_string_const(expr->value.character.length,
3062                                     expr->value.character.string);
3063   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
3064   TYPE_STRING_FLAG (TREE_TYPE (se->expr))=1;
3065
3066   gfc_conv_substring(se,ref,expr->ts.kind,NULL,&expr->where);
3067 }
3068
3069
3070 /* Entry point for expression translation.  Evaluates a scalar quantity.
3071    EXPR is the expression to be translated, and SE is the state structure if
3072    called from within the scalarized.  */
3073
3074 void
3075 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
3076 {
3077   if (se->ss && se->ss->expr == expr
3078       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
3079     {
3080       /* Substitute a scalar expression evaluated outside the scalarization
3081          loop.  */
3082       se->expr = se->ss->data.scalar.expr;
3083       se->string_length = se->ss->string_length;
3084       gfc_advance_se_ss_chain (se);
3085       return;
3086     }
3087
3088   switch (expr->expr_type)
3089     {
3090     case EXPR_OP:
3091       gfc_conv_expr_op (se, expr);
3092       break;
3093
3094     case EXPR_FUNCTION:
3095       gfc_conv_function_expr (se, expr);
3096       break;
3097
3098     case EXPR_CONSTANT:
3099       gfc_conv_constant (se, expr);
3100       break;
3101
3102     case EXPR_VARIABLE:
3103       gfc_conv_variable (se, expr);
3104       break;
3105
3106     case EXPR_NULL:
3107       se->expr = null_pointer_node;
3108       break;
3109
3110     case EXPR_SUBSTRING:
3111       gfc_conv_substring_expr (se, expr);
3112       break;
3113
3114     case EXPR_STRUCTURE:
3115       gfc_conv_structure (se, expr, 0);
3116       break;
3117
3118     case EXPR_ARRAY:
3119       gfc_conv_array_constructor_expr (se, expr);
3120       break;
3121
3122     default:
3123       gcc_unreachable ();
3124       break;
3125     }
3126 }
3127
3128 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
3129    of an assignment.  */
3130 void
3131 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
3132 {
3133   gfc_conv_expr (se, expr);
3134   /* All numeric lvalues should have empty post chains.  If not we need to
3135      figure out a way of rewriting an lvalue so that it has no post chain.  */
3136   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
3137 }
3138
3139 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
3140    numeric expressions.  Used for scalar values where inserting cleanup code
3141    is inconvenient.  */
3142 void
3143 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
3144 {
3145   tree val;
3146
3147   gcc_assert (expr->ts.type != BT_CHARACTER);
3148   gfc_conv_expr (se, expr);
3149   if (se->post.head)
3150     {
3151       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
3152       gfc_add_modify_expr (&se->pre, val, se->expr);
3153       se->expr = val;
3154       gfc_add_block_to_block (&se->pre, &se->post);
3155     }
3156 }
3157
3158 /* Helper to translate and expression and convert it to a particular type.  */
3159 void
3160 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
3161 {
3162   gfc_conv_expr_val (se, expr);
3163   se->expr = convert (type, se->expr);
3164 }
3165
3166
3167 /* Converts an expression so that it can be passed by reference.  Scalar
3168    values only.  */
3169
3170 void
3171 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
3172 {
3173   tree var;
3174
3175   if (se->ss && se->ss->expr == expr
3176       && se->ss->type == GFC_SS_REFERENCE)
3177     {
3178       se->expr = se->ss->data.scalar.expr;
3179       se->string_length = se->ss->string_length;
3180       gfc_advance_se_ss_chain (se);
3181       return;
3182     }
3183
3184   if (expr->ts.type == BT_CHARACTER)
3185     {
3186       gfc_conv_expr (se, expr);
3187       gfc_conv_string_parameter (se);
3188       return;
3189     }
3190
3191   if (expr->expr_type == EXPR_VARIABLE)
3192     {
3193       se->want_pointer = 1;
3194       gfc_conv_expr (se, expr);
3195       if (se->post.head)
3196         {
3197           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3198           gfc_add_modify_expr (&se->pre, var, se->expr);
3199           gfc_add_block_to_block (&se->pre, &se->post);
3200           se->expr = var;
3201         }
3202       return;
3203     }
3204
3205   gfc_conv_expr (se, expr);
3206
3207   /* Create a temporary var to hold the value.  */
3208   if (TREE_CONSTANT (se->expr))
3209     {
3210       tree tmp = se->expr;
3211       STRIP_TYPE_NOPS (tmp);
3212       var = build_decl (CONST_DECL, NULL, TREE_TYPE (tmp));
3213       DECL_INITIAL (var) = tmp;
3214       TREE_STATIC (var) = 1;
3215       pushdecl (var);
3216     }
3217   else
3218     {
3219       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3220       gfc_add_modify_expr (&se->pre, var, se->expr);
3221     }
3222   gfc_add_block_to_block (&se->pre, &se->post);
3223
3224   /* Take the address of that value.  */
3225   se->expr = build_fold_addr_expr (var);
3226 }
3227
3228
3229 tree
3230 gfc_trans_pointer_assign (gfc_code * code)
3231 {
3232   return gfc_trans_pointer_assignment (code->expr, code->expr2);
3233 }
3234
3235
3236 /* Generate code for a pointer assignment.  */
3237
3238 tree
3239 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
3240 {
3241   gfc_se lse;
3242   gfc_se rse;
3243   gfc_ss *lss;
3244   gfc_ss *rss;
3245   stmtblock_t block;
3246   tree desc;
3247   tree tmp;
3248
3249   gfc_start_block (&block);
3250
3251   gfc_init_se (&lse, NULL);
3252
3253   lss = gfc_walk_expr (expr1);
3254   rss = gfc_walk_expr (expr2);
3255   if (lss == gfc_ss_terminator)
3256     {
3257       /* Scalar pointers.  */
3258       lse.want_pointer = 1;
3259       gfc_conv_expr (&lse, expr1);
3260       gcc_assert (rss == gfc_ss_terminator);
3261       gfc_init_se (&rse, NULL);
3262       rse.want_pointer = 1;
3263       gfc_conv_expr (&rse, expr2);
3264       gfc_add_block_to_block (&block, &lse.pre);
3265       gfc_add_block_to_block (&block, &rse.pre);
3266       gfc_add_modify_expr (&block, lse.expr,
3267                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
3268       gfc_add_block_to_block (&block, &rse.post);
3269       gfc_add_block_to_block (&block, &lse.post);
3270     }
3271   else
3272     {
3273       /* Array pointer.  */
3274       gfc_conv_expr_descriptor (&lse, expr1, lss);
3275       switch (expr2->expr_type)
3276         {
3277         case EXPR_NULL:
3278           /* Just set the data pointer to null.  */
3279           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
3280           break;
3281
3282         case EXPR_VARIABLE:
3283           /* Assign directly to the pointer's descriptor.  */
3284           lse.direct_byref = 1;
3285           gfc_conv_expr_descriptor (&lse, expr2, rss);
3286           break;
3287
3288         default:
3289           /* Assign to a temporary descriptor and then copy that
3290              temporary to the pointer.  */
3291           desc = lse.expr;
3292           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
3293
3294           lse.expr = tmp;
3295           lse.direct_byref = 1;
3296           gfc_conv_expr_descriptor (&lse, expr2, rss);
3297           gfc_add_modify_expr (&lse.pre, desc, tmp);
3298           break;
3299         }
3300       gfc_add_block_to_block (&block, &lse.pre);
3301       gfc_add_block_to_block (&block, &lse.post);
3302     }
3303   return gfc_finish_block (&block);
3304 }
3305
3306
3307 /* Makes sure se is suitable for passing as a function string parameter.  */
3308 /* TODO: Need to check all callers fo this function.  It may be abused.  */
3309
3310 void
3311 gfc_conv_string_parameter (gfc_se * se)
3312 {
3313   tree type;
3314
3315   if (TREE_CODE (se->expr) == STRING_CST)
3316     {
3317       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3318       return;
3319     }
3320
3321   type = TREE_TYPE (se->expr);
3322   if (TYPE_STRING_FLAG (type))
3323     {
3324       gcc_assert (TREE_CODE (se->expr) != INDIRECT_REF);
3325       se->expr = gfc_build_addr_expr (pchar_type_node, se->expr);
3326     }
3327
3328   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
3329   gcc_assert (se->string_length
3330           && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
3331 }
3332
3333
3334 /* Generate code for assignment of scalar variables.  Includes character
3335    strings and derived types with allocatable components.  */
3336
3337 tree
3338 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
3339                          bool l_is_temp, bool r_is_var)
3340 {
3341   stmtblock_t block;
3342   tree tmp;
3343   tree cond;
3344
3345   gfc_init_block (&block);
3346
3347   if (ts.type == BT_CHARACTER)
3348     {
3349       gcc_assert (lse->string_length != NULL_TREE
3350               && rse->string_length != NULL_TREE);
3351
3352       gfc_conv_string_parameter (lse);
3353       gfc_conv_string_parameter (rse);
3354
3355       gfc_add_block_to_block (&block, &lse->pre);
3356       gfc_add_block_to_block (&block, &rse->pre);
3357
3358       gfc_trans_string_copy (&block, lse->string_length, lse->expr,
3359                              rse->string_length, rse->expr);
3360     }
3361   else if (ts.type == BT_DERIVED && ts.derived->attr.alloc_comp)
3362     {
3363       cond = NULL_TREE;
3364         
3365       /* Are the rhs and the lhs the same?  */
3366       if (r_is_var)
3367         {
3368           cond = fold_build2 (EQ_EXPR, boolean_type_node,
3369                               build_fold_addr_expr (lse->expr),
3370                               build_fold_addr_expr (rse->expr));
3371           cond = gfc_evaluate_now (cond, &lse->pre);
3372         }
3373
3374       /* Deallocate the lhs allocated components as long as it is not
3375          the same as the rhs.  */
3376       if (!l_is_temp)
3377         {
3378           tmp = gfc_deallocate_alloc_comp (ts.derived, lse->expr, 0);
3379           if (r_is_var)
3380             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3381           gfc_add_expr_to_block (&lse->pre, tmp);
3382         }
3383         
3384       gfc_add_block_to_block (&block, &lse->pre);
3385       gfc_add_block_to_block (&block, &rse->pre);
3386
3387       gfc_add_modify_expr (&block, lse->expr,
3388                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
3389
3390       /* Do a deep copy if the rhs is a variable, if it is not the
3391          same as the lhs.  */
3392       if (r_is_var)
3393         {
3394           tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
3395           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
3396           gfc_add_expr_to_block (&block, tmp);
3397         }
3398     }
3399   else
3400     {
3401       gfc_add_block_to_block (&block, &lse->pre);
3402       gfc_add_block_to_block (&block, &rse->pre);
3403
3404       gfc_add_modify_expr (&block, lse->expr,
3405                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
3406     }
3407
3408   gfc_add_block_to_block (&block, &lse->post);
3409   gfc_add_block_to_block (&block, &rse->post);
3410
3411   return gfc_finish_block (&block);
3412 }
3413
3414
3415 /* Try to translate array(:) = func (...), where func is a transformational
3416    array function, without using a temporary.  Returns NULL is this isn't the
3417    case.  */
3418
3419 static tree
3420 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
3421 {
3422   gfc_se se;
3423   gfc_ss *ss;
3424   gfc_ref * ref;
3425   bool seen_array_ref;
3426
3427   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
3428   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
3429     return NULL;
3430
3431   /* Elemental functions don't need a temporary anyway.  */
3432   if (expr2->value.function.esym != NULL
3433       && expr2->value.function.esym->attr.elemental)
3434     return NULL;
3435
3436   /* Fail if EXPR1 can't be expressed as a descriptor.  */
3437   if (gfc_ref_needs_temporary_p (expr1->ref))
3438     return NULL;
3439
3440   /* Functions returning pointers need temporaries.  */
3441   if (expr2->symtree->n.sym->attr.pointer 
3442       || expr2->symtree->n.sym->attr.allocatable)
3443     return NULL;
3444
3445   /* Character array functions need temporaries unless the
3446      character lengths are the same.  */
3447   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
3448     {
3449       if (expr1->ts.cl->length == NULL
3450             || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
3451         return NULL;
3452
3453       if (expr2->ts.cl->length == NULL
3454             || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
3455         return NULL;
3456
3457       if (mpz_cmp (expr1->ts.cl->length->value.integer,
3458                      expr2->ts.cl->length->value.integer) != 0)
3459         return NULL;
3460     }
3461
3462   /* Check that no LHS component references appear during an array
3463      reference. This is needed because we do not have the means to
3464      span any arbitrary stride with an array descriptor. This check
3465      is not needed for the rhs because the function result has to be
3466      a complete type.  */
3467   seen_array_ref = false;
3468   for (ref = expr1->ref; ref; ref = ref->next)
3469     {
3470       if (ref->type == REF_ARRAY)
3471         seen_array_ref= true;
3472       else if (ref->type == REF_COMPONENT && seen_array_ref)
3473         return NULL;
3474     }
3475
3476   /* Check for a dependency.  */
3477   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
3478                                    expr2->value.function.esym,
3479                                    expr2->value.function.actual))
3480     return NULL;
3481
3482   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
3483      functions.  */
3484   gcc_assert (expr2->value.function.isym
3485               || (gfc_return_by_reference (expr2->value.function.esym)
3486               && expr2->value.function.esym->result->attr.dimension));
3487
3488   ss = gfc_walk_expr (expr1);
3489   gcc_assert (ss != gfc_ss_terminator);
3490   gfc_init_se (&se, NULL);
3491   gfc_start_block (&se.pre);
3492   se.want_pointer = 1;
3493
3494   gfc_conv_array_parameter (&se, expr1, ss, 0);
3495
3496   se.direct_byref = 1;
3497   se.ss = gfc_walk_expr (expr2);
3498   gcc_assert (se.ss != gfc_ss_terminator);
3499   gfc_conv_function_expr (&se, expr2);
3500   gfc_add_block_to_block (&se.pre, &se.post);
3501
3502   return gfc_finish_block (&se.pre);
3503 }
3504
3505 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
3506
3507 static bool
3508 is_zero_initializer_p (gfc_expr * expr)
3509 {
3510   if (expr->expr_type != EXPR_CONSTANT)
3511     return false;
3512   /* We ignore Hollerith constants for the time being.  */
3513   if (expr->from_H)
3514     return false;
3515
3516   switch (expr->ts.type)
3517     {
3518     case BT_INTEGER:
3519       return mpz_cmp_si (expr->value.integer, 0) == 0;
3520
3521     case BT_REAL:
3522       return mpfr_zero_p (expr->value.real)
3523              && MPFR_SIGN (expr->value.real) >= 0;
3524
3525     case BT_LOGICAL:
3526       return expr->value.logical == 0;
3527
3528     case BT_COMPLEX:
3529       return mpfr_zero_p (expr->value.complex.r)
3530              && MPFR_SIGN (expr->value.complex.r) >= 0
3531              && mpfr_zero_p (expr->value.complex.i)
3532              && MPFR_SIGN (expr->value.complex.i) >= 0;
3533
3534     default:
3535       break;
3536     }
3537   return false;
3538 }
3539
3540 /* Try to efficiently translate array(:) = 0.  Return NULL if this
3541    can't be done.  */
3542
3543 static tree
3544 gfc_trans_zero_assign (gfc_expr * expr)
3545 {
3546   tree dest, len, type;
3547   tree tmp, args;
3548   gfc_symbol *sym;
3549
3550   sym = expr->symtree->n.sym;
3551   dest = gfc_get_symbol_decl (sym);
3552
3553   type = TREE_TYPE (dest);
3554   if (POINTER_TYPE_P (type))
3555     type = TREE_TYPE (type);
3556   if (!GFC_ARRAY_TYPE_P (type))
3557     return NULL_TREE;
3558
3559   /* Determine the length of the array.  */
3560   len = GFC_TYPE_ARRAY_SIZE (type);
3561   if (!len || TREE_CODE (len) != INTEGER_CST)
3562     return NULL_TREE;
3563
3564   len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
3565                      TYPE_SIZE_UNIT (gfc_get_element_type (type)));
3566
3567   /* Convert arguments to the correct types.  */
3568   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
3569     dest = gfc_build_addr_expr (pvoid_type_node, dest);
3570   else
3571     dest = fold_convert (pvoid_type_node, dest);
3572   len = fold_convert (size_type_node, len);
3573
3574   /* Construct call to __builtin_memset.  */
3575   args = build_tree_list (NULL_TREE, len);
3576   args = tree_cons (NULL_TREE, integer_zero_node, args);
3577   args = tree_cons (NULL_TREE, dest, args);
3578   tmp = build_function_call_expr (built_in_decls[BUILT_IN_MEMSET], args);
3579   return fold_convert (void_type_node, tmp);
3580 }
3581
3582 /* Translate an assignment.  Most of the code is concerned with
3583    setting up the scalarizer.  */
3584
3585 tree
3586 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
3587 {
3588   gfc_se lse;
3589   gfc_se rse;
3590   gfc_ss *lss;
3591   gfc_ss *lss_section;
3592   gfc_ss *rss;
3593   gfc_loopinfo loop;
3594   tree tmp;
3595   stmtblock_t block;
3596   stmtblock_t body;
3597   bool l_is_temp;
3598
3599   /* Special case a single function returning an array.  */
3600   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
3601     {
3602       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
3603       if (tmp)
3604         return tmp;
3605     }
3606
3607   /* Special case assigning an array to zero.  */
3608   if (expr1->expr_type == EXPR_VARIABLE
3609       && expr1->rank > 0
3610       && expr1->ref
3611       && gfc_full_array_ref_p (expr1->ref)
3612       && is_zero_initializer_p (expr2))
3613     {
3614       tmp = gfc_trans_zero_assign (expr1);
3615       if (tmp)
3616         return tmp;
3617     }
3618
3619   /* Assignment of the form lhs = rhs.  */
3620   gfc_start_block (&block);
3621
3622   gfc_init_se (&lse, NULL);
3623   gfc_init_se (&rse, NULL);
3624
3625   /* Walk the lhs.  */
3626   lss = gfc_walk_expr (expr1);
3627   rss = NULL;
3628   if (lss != gfc_ss_terminator)
3629     {
3630       /* The assignment needs scalarization.  */
3631       lss_section = lss;
3632
3633       /* Find a non-scalar SS from the lhs.  */
3634       while (lss_section != gfc_ss_terminator
3635              && lss_section->type != GFC_SS_SECTION)
3636         lss_section = lss_section->next;
3637
3638       gcc_assert (lss_section != gfc_ss_terminator);
3639
3640       /* Initialize the scalarizer.  */
3641       gfc_init_loopinfo (&loop);
3642
3643       /* Walk the rhs.  */
3644       rss = gfc_walk_expr (expr2);
3645       if (rss == gfc_ss_terminator)
3646         {
3647           /* The rhs is scalar.  Add a ss for the expression.  */
3648           rss = gfc_get_ss ();
3649           rss->next = gfc_ss_terminator;
3650           rss->type = GFC_SS_SCALAR;
3651           rss->expr = expr2;
3652         }
3653       /* Associate the SS with the loop.  */
3654       gfc_add_ss_to_loop (&loop, lss);
3655       gfc_add_ss_to_loop (&loop, rss);
3656
3657       /* Calculate the bounds of the scalarization.  */
3658       gfc_conv_ss_startstride (&loop);
3659       /* Resolve any data dependencies in the statement.  */
3660       gfc_conv_resolve_dependencies (&loop, lss, rss);
3661       /* Setup the scalarizing loops.  */
3662       gfc_conv_loop_setup (&loop);
3663
3664       /* Setup the gfc_se structures.  */
3665       gfc_copy_loopinfo_to_se (&lse, &loop);
3666       gfc_copy_loopinfo_to_se (&rse, &loop);
3667
3668       rse.ss = rss;
3669       gfc_mark_ss_chain_used (rss, 1);
3670       if (loop.temp_ss == NULL)
3671         {
3672           lse.ss = lss;
3673           gfc_mark_ss_chain_used (lss, 1);
3674         }
3675       else
3676         {
3677           lse.ss = loop.temp_ss;
3678           gfc_mark_ss_chain_used (lss, 3);
3679           gfc_mark_ss_chain_used (loop.temp_ss, 3);
3680         }
3681
3682       /* Start the scalarized loop body.  */
3683       gfc_start_scalarized_body (&loop, &body);
3684     }
3685   else
3686     gfc_init_block (&body);
3687
3688   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
3689
3690   /* Translate the expression.  */
3691   gfc_conv_expr (&rse, expr2);
3692
3693   if (l_is_temp)
3694     {
3695       gfc_conv_tmp_array_ref (&lse);
3696       gfc_advance_se_ss_chain (&lse);
3697     }
3698   else
3699     gfc_conv_expr (&lse, expr1);
3700
3701   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
3702                                  l_is_temp || init_flag,
3703                                  expr2->expr_type == EXPR_VARIABLE);
3704   gfc_add_expr_to_block (&body, tmp);
3705
3706   if (lss == gfc_ss_terminator)
3707     {
3708       /* Use the scalar assignment as is.  */
3709       gfc_add_block_to_block (&block, &body);
3710     }
3711   else
3712     {
3713       gcc_assert (lse.ss == gfc_ss_terminator
3714                   && rse.ss == gfc_ss_terminator);
3715
3716       if (l_is_temp)
3717         {
3718           gfc_trans_scalarized_loop_boundary (&loop, &body);
3719
3720           /* We need to copy the temporary to the actual lhs.  */
3721           gfc_init_se (&lse, NULL);
3722           gfc_init_se (&rse, NULL);
3723           gfc_copy_loopinfo_to_se (&lse, &loop);
3724           gfc_copy_loopinfo_to_se (&rse, &loop);
3725
3726           rse.ss = loop.temp_ss;
3727           lse.ss = lss;
3728
3729           gfc_conv_tmp_array_ref (&rse);
3730           gfc_advance_se_ss_chain (&rse);
3731           gfc_conv_expr (&lse, expr1);
3732
3733           gcc_assert (lse.ss == gfc_ss_terminator
3734                       && rse.ss == gfc_ss_terminator);
3735
3736           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
3737                                          false, false);
3738           gfc_add_expr_to_block (&body, tmp);
3739         }
3740
3741       /* Generate the copying loops.  */
3742       gfc_trans_scalarizing_loops (&loop, &body);
3743
3744       /* Wrap the whole thing up.  */
3745       gfc_add_block_to_block (&block, &loop.pre);
3746       gfc_add_block_to_block (&block, &loop.post);
3747
3748       gfc_cleanup_loop (&loop);
3749     }
3750
3751   return gfc_finish_block (&block);
3752 }
3753
3754 tree
3755 gfc_trans_init_assign (gfc_code * code)
3756 {
3757   return gfc_trans_assignment (code->expr, code->expr2, true);
3758 }
3759
3760 tree
3761 gfc_trans_assign (gfc_code * code)
3762 {
3763   return gfc_trans_assignment (code->expr, code->expr2, false);
3764 }