OSDN Git Service

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