OSDN Git Service

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