OSDN Git Service

Update Copyright years for files modified in 2008 and/or 2009.
[pf3gnuchains/gcc-fork.git] / gcc / fortran / trans-expr.c
1 /* Expression translation
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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
1509       if (sym->attr.cray_pointee)
1510         {
1511           /* TODO - make the cray pointee a pointer to a procedure,
1512              assign the pointer to it and use it for the call.  This
1513              will do for now!  */
1514           tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1515                          gfc_get_symbol_decl (sym->cp_pointer));
1516           tmp = gfc_evaluate_now (tmp, &se->pre);
1517         }
1518
1519       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1520         {
1521           gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1522           tmp = build_fold_addr_expr (tmp);
1523         }
1524     }
1525   se->expr = tmp;
1526 }
1527
1528
1529 /* Translate the call for an elemental subroutine call used in an operator
1530    assignment.  This is a simplified version of gfc_conv_function_call.  */
1531
1532 tree
1533 gfc_conv_operator_assign (gfc_se *lse, gfc_se *rse, gfc_symbol *sym)
1534 {
1535   tree args;
1536   tree tmp;
1537   gfc_se se;
1538   stmtblock_t block;
1539
1540   /* Only elemental subroutines with two arguments.  */
1541   gcc_assert (sym->attr.elemental && sym->attr.subroutine);
1542   gcc_assert (sym->formal->next->next == NULL);
1543
1544   gfc_init_block (&block);
1545
1546   gfc_add_block_to_block (&block, &lse->pre);
1547   gfc_add_block_to_block (&block, &rse->pre);
1548
1549   /* Build the argument list for the call, including hidden string lengths.  */
1550   args = gfc_chainon_list (NULL_TREE, build_fold_addr_expr (lse->expr));
1551   args = gfc_chainon_list (args, build_fold_addr_expr (rse->expr));
1552   if (lse->string_length != NULL_TREE)
1553     args = gfc_chainon_list (args, lse->string_length);
1554   if (rse->string_length != NULL_TREE)
1555     args = gfc_chainon_list (args, rse->string_length);    
1556
1557   /* Build the function call.  */
1558   gfc_init_se (&se, NULL);
1559   gfc_conv_function_val (&se, sym);
1560   tmp = TREE_TYPE (TREE_TYPE (TREE_TYPE (se.expr)));
1561   tmp = build_call_list (tmp, se.expr, args);
1562   gfc_add_expr_to_block (&block, tmp);
1563
1564   gfc_add_block_to_block (&block, &lse->post);
1565   gfc_add_block_to_block (&block, &rse->post);
1566
1567   return gfc_finish_block (&block);
1568 }
1569
1570
1571 /* Initialize MAPPING.  */
1572
1573 void
1574 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1575 {
1576   mapping->syms = NULL;
1577   mapping->charlens = NULL;
1578 }
1579
1580
1581 /* Free all memory held by MAPPING (but not MAPPING itself).  */
1582
1583 void
1584 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1585 {
1586   gfc_interface_sym_mapping *sym;
1587   gfc_interface_sym_mapping *nextsym;
1588   gfc_charlen *cl;
1589   gfc_charlen *nextcl;
1590
1591   for (sym = mapping->syms; sym; sym = nextsym)
1592     {
1593       nextsym = sym->next;
1594       sym->new_sym->n.sym->formal = NULL;
1595       gfc_free_symbol (sym->new_sym->n.sym);
1596       gfc_free_expr (sym->expr);
1597       gfc_free (sym->new_sym);
1598       gfc_free (sym);
1599     }
1600   for (cl = mapping->charlens; cl; cl = nextcl)
1601     {
1602       nextcl = cl->next;
1603       gfc_free_expr (cl->length);
1604       gfc_free (cl);
1605     }
1606 }
1607
1608
1609 /* Return a copy of gfc_charlen CL.  Add the returned structure to
1610    MAPPING so that it will be freed by gfc_free_interface_mapping.  */
1611
1612 static gfc_charlen *
1613 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1614                                    gfc_charlen * cl)
1615 {
1616   gfc_charlen *new_charlen;
1617
1618   new_charlen = gfc_get_charlen ();
1619   new_charlen->next = mapping->charlens;
1620   new_charlen->length = gfc_copy_expr (cl->length);
1621
1622   mapping->charlens = new_charlen;
1623   return new_charlen;
1624 }
1625
1626
1627 /* A subroutine of gfc_add_interface_mapping.  Return a descriptorless
1628    array variable that can be used as the actual argument for dummy
1629    argument SYM.  Add any initialization code to BLOCK.  PACKED is as
1630    for gfc_get_nodesc_array_type and DATA points to the first element
1631    in the passed array.  */
1632
1633 static tree
1634 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1635                                  gfc_packed packed, tree data)
1636 {
1637   tree type;
1638   tree var;
1639
1640   type = gfc_typenode_for_spec (&sym->ts);
1641   type = gfc_get_nodesc_array_type (type, sym->as, packed);
1642
1643   var = gfc_create_var (type, "ifm");
1644   gfc_add_modify (block, var, fold_convert (type, data));
1645
1646   return var;
1647 }
1648
1649
1650 /* A subroutine of gfc_add_interface_mapping.  Set the stride, upper bounds
1651    and offset of descriptorless array type TYPE given that it has the same
1652    size as DESC.  Add any set-up code to BLOCK.  */
1653
1654 static void
1655 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1656 {
1657   int n;
1658   tree dim;
1659   tree offset;
1660   tree tmp;
1661
1662   offset = gfc_index_zero_node;
1663   for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1664     {
1665       dim = gfc_rank_cst[n];
1666       GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1667       if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
1668         {
1669           GFC_TYPE_ARRAY_LBOUND (type, n)
1670                 = gfc_conv_descriptor_lbound (desc, dim);
1671           GFC_TYPE_ARRAY_UBOUND (type, n)
1672                 = gfc_conv_descriptor_ubound (desc, dim);
1673         }
1674       else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1675         {
1676           tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1677                              gfc_conv_descriptor_ubound (desc, dim),
1678                              gfc_conv_descriptor_lbound (desc, dim));
1679           tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1680                              GFC_TYPE_ARRAY_LBOUND (type, n),
1681                              tmp);
1682           tmp = gfc_evaluate_now (tmp, block);
1683           GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1684         }
1685       tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1686                          GFC_TYPE_ARRAY_LBOUND (type, n),
1687                          GFC_TYPE_ARRAY_STRIDE (type, n));
1688       offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1689     }
1690   offset = gfc_evaluate_now (offset, block);
1691   GFC_TYPE_ARRAY_OFFSET (type) = offset;
1692 }
1693
1694
1695 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1696    in SE.  The caller may still use se->expr and se->string_length after
1697    calling this function.  */
1698
1699 void
1700 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1701                            gfc_symbol * sym, gfc_se * se,
1702                            gfc_expr *expr)
1703 {
1704   gfc_interface_sym_mapping *sm;
1705   tree desc;
1706   tree tmp;
1707   tree value;
1708   gfc_symbol *new_sym;
1709   gfc_symtree *root;
1710   gfc_symtree *new_symtree;
1711
1712   /* Create a new symbol to represent the actual argument.  */
1713   new_sym = gfc_new_symbol (sym->name, NULL);
1714   new_sym->ts = sym->ts;
1715   new_sym->as = gfc_copy_array_spec (sym->as);
1716   new_sym->attr.referenced = 1;
1717   new_sym->attr.dimension = sym->attr.dimension;
1718   new_sym->attr.pointer = sym->attr.pointer;
1719   new_sym->attr.allocatable = sym->attr.allocatable;
1720   new_sym->attr.flavor = sym->attr.flavor;
1721   new_sym->attr.function = sym->attr.function;
1722
1723   /* Ensure that the interface is available and that
1724      descriptors are passed for array actual arguments.  */
1725   if (sym->attr.flavor == FL_PROCEDURE)
1726     {
1727       new_sym->formal = expr->symtree->n.sym->formal;
1728       new_sym->attr.always_explicit
1729             = expr->symtree->n.sym->attr.always_explicit;
1730     }
1731
1732   /* Create a fake symtree for it.  */
1733   root = NULL;
1734   new_symtree = gfc_new_symtree (&root, sym->name);
1735   new_symtree->n.sym = new_sym;
1736   gcc_assert (new_symtree == root);
1737
1738   /* Create a dummy->actual mapping.  */
1739   sm = XCNEW (gfc_interface_sym_mapping);
1740   sm->next = mapping->syms;
1741   sm->old = sym;
1742   sm->new_sym = new_symtree;
1743   sm->expr = gfc_copy_expr (expr);
1744   mapping->syms = sm;
1745
1746   /* Stabilize the argument's value.  */
1747   if (!sym->attr.function && se)
1748     se->expr = gfc_evaluate_now (se->expr, &se->pre);
1749
1750   if (sym->ts.type == BT_CHARACTER)
1751     {
1752       /* Create a copy of the dummy argument's length.  */
1753       new_sym->ts.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.cl);
1754       sm->expr->ts.cl = new_sym->ts.cl;
1755
1756       /* If the length is specified as "*", record the length that
1757          the caller is passing.  We should use the callee's length
1758          in all other cases.  */
1759       if (!new_sym->ts.cl->length && se)
1760         {
1761           se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1762           new_sym->ts.cl->backend_decl = se->string_length;
1763         }
1764     }
1765
1766   if (!se)
1767     return;
1768
1769   /* Use the passed value as-is if the argument is a function.  */
1770   if (sym->attr.flavor == FL_PROCEDURE)
1771     value = se->expr;
1772
1773   /* If the argument is either a string or a pointer to a string,
1774      convert it to a boundless character type.  */
1775   else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1776     {
1777       tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1778       tmp = build_pointer_type (tmp);
1779       if (sym->attr.pointer)
1780         value = build_fold_indirect_ref (se->expr);
1781       else
1782         value = se->expr;
1783       value = fold_convert (tmp, value);
1784     }
1785
1786   /* If the argument is a scalar, a pointer to an array or an allocatable,
1787      dereference it.  */
1788   else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1789     value = build_fold_indirect_ref (se->expr);
1790   
1791   /* For character(*), use the actual argument's descriptor.  */  
1792   else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.cl->length)
1793     value = build_fold_indirect_ref (se->expr);
1794
1795   /* If the argument is an array descriptor, use it to determine
1796      information about the actual argument's shape.  */
1797   else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1798            && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1799     {
1800       /* Get the actual argument's descriptor.  */
1801       desc = build_fold_indirect_ref (se->expr);
1802
1803       /* Create the replacement variable.  */
1804       tmp = gfc_conv_descriptor_data_get (desc);
1805       value = gfc_get_interface_mapping_array (&se->pre, sym,
1806                                                PACKED_NO, tmp);
1807
1808       /* Use DESC to work out the upper bounds, strides and offset.  */
1809       gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1810     }
1811   else
1812     /* Otherwise we have a packed array.  */
1813     value = gfc_get_interface_mapping_array (&se->pre, sym,
1814                                              PACKED_FULL, se->expr);
1815
1816   new_sym->backend_decl = value;
1817 }
1818
1819
1820 /* Called once all dummy argument mappings have been added to MAPPING,
1821    but before the mapping is used to evaluate expressions.  Pre-evaluate
1822    the length of each argument, adding any initialization code to PRE and
1823    any finalization code to POST.  */
1824
1825 void
1826 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1827                               stmtblock_t * pre, stmtblock_t * post)
1828 {
1829   gfc_interface_sym_mapping *sym;
1830   gfc_expr *expr;
1831   gfc_se se;
1832
1833   for (sym = mapping->syms; sym; sym = sym->next)
1834     if (sym->new_sym->n.sym->ts.type == BT_CHARACTER
1835         && !sym->new_sym->n.sym->ts.cl->backend_decl)
1836       {
1837         expr = sym->new_sym->n.sym->ts.cl->length;
1838         gfc_apply_interface_mapping_to_expr (mapping, expr);
1839         gfc_init_se (&se, NULL);
1840         gfc_conv_expr (&se, expr);
1841         se.expr = fold_convert (gfc_charlen_type_node, se.expr);
1842         se.expr = gfc_evaluate_now (se.expr, &se.pre);
1843         gfc_add_block_to_block (pre, &se.pre);
1844         gfc_add_block_to_block (post, &se.post);
1845
1846         sym->new_sym->n.sym->ts.cl->backend_decl = se.expr;
1847       }
1848 }
1849
1850
1851 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1852    constructor C.  */
1853
1854 static void
1855 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1856                                      gfc_constructor * c)
1857 {
1858   for (; c; c = c->next)
1859     {
1860       gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1861       if (c->iterator)
1862         {
1863           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1864           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1865           gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
1866         }
1867     }
1868 }
1869
1870
1871 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1872    reference REF.  */
1873
1874 static void
1875 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
1876                                     gfc_ref * ref)
1877 {
1878   int n;
1879
1880   for (; ref; ref = ref->next)
1881     switch (ref->type)
1882       {
1883       case REF_ARRAY:
1884         for (n = 0; n < ref->u.ar.dimen; n++)
1885           {
1886             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
1887             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
1888             gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
1889           }
1890         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
1891         break;
1892
1893       case REF_COMPONENT:
1894         break;
1895
1896       case REF_SUBSTRING:
1897         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
1898         gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
1899         break;
1900       }
1901 }
1902
1903
1904 /* Convert intrinsic function calls into result expressions.  */
1905
1906 static bool
1907 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping)
1908 {
1909   gfc_symbol *sym;
1910   gfc_expr *new_expr;
1911   gfc_expr *arg1;
1912   gfc_expr *arg2;
1913   int d, dup;
1914
1915   arg1 = expr->value.function.actual->expr;
1916   if (expr->value.function.actual->next)
1917     arg2 = expr->value.function.actual->next->expr;
1918   else
1919     arg2 = NULL;
1920
1921   sym = arg1->symtree->n.sym;
1922
1923   if (sym->attr.dummy)
1924     return false;
1925
1926   new_expr = NULL;
1927
1928   switch (expr->value.function.isym->id)
1929     {
1930     case GFC_ISYM_LEN:
1931       /* TODO figure out why this condition is necessary.  */
1932       if (sym->attr.function
1933           && (arg1->ts.cl->length == NULL
1934               || (arg1->ts.cl->length->expr_type != EXPR_CONSTANT
1935                   && arg1->ts.cl->length->expr_type != EXPR_VARIABLE)))
1936         return false;
1937
1938       new_expr = gfc_copy_expr (arg1->ts.cl->length);
1939       break;
1940
1941     case GFC_ISYM_SIZE:
1942       if (!sym->as)
1943         return false;
1944
1945       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
1946         {
1947           dup = mpz_get_si (arg2->value.integer);
1948           d = dup - 1;
1949         }
1950       else
1951         {
1952           dup = sym->as->rank;
1953           d = 0;
1954         }
1955
1956       for (; d < dup; d++)
1957         {
1958           gfc_expr *tmp;
1959
1960           if (!sym->as->upper[d] || !sym->as->lower[d])
1961             {
1962               gfc_free_expr (new_expr);
1963               return false;
1964             }
1965
1966           tmp = gfc_add (gfc_copy_expr (sym->as->upper[d]), gfc_int_expr (1));
1967           tmp = gfc_subtract (tmp, gfc_copy_expr (sym->as->lower[d]));
1968           if (new_expr)
1969             new_expr = gfc_multiply (new_expr, tmp);
1970           else
1971             new_expr = tmp;
1972         }
1973       break;
1974
1975     case GFC_ISYM_LBOUND:
1976     case GFC_ISYM_UBOUND:
1977         /* TODO These implementations of lbound and ubound do not limit if
1978            the size < 0, according to F95's 13.14.53 and 13.14.113.  */
1979
1980       if (!sym->as)
1981         return false;
1982
1983       if (arg2 && arg2->expr_type == EXPR_CONSTANT)
1984         d = mpz_get_si (arg2->value.integer) - 1;
1985       else
1986         /* TODO: If the need arises, this could produce an array of
1987            ubound/lbounds.  */
1988         gcc_unreachable ();
1989
1990       if (expr->value.function.isym->id == GFC_ISYM_LBOUND)
1991         {
1992           if (sym->as->lower[d])
1993             new_expr = gfc_copy_expr (sym->as->lower[d]);
1994         }
1995       else
1996         {
1997           if (sym->as->upper[d])
1998             new_expr = gfc_copy_expr (sym->as->upper[d]);
1999         }
2000       break;
2001
2002     default:
2003       break;
2004     }
2005
2006   gfc_apply_interface_mapping_to_expr (mapping, new_expr);
2007   if (!new_expr)
2008     return false;
2009
2010   gfc_replace_expr (expr, new_expr);
2011   return true;
2012 }
2013
2014
2015 static void
2016 gfc_map_fcn_formal_to_actual (gfc_expr *expr, gfc_expr *map_expr,
2017                               gfc_interface_mapping * mapping)
2018 {
2019   gfc_formal_arglist *f;
2020   gfc_actual_arglist *actual;
2021
2022   actual = expr->value.function.actual;
2023   f = map_expr->symtree->n.sym->formal;
2024
2025   for (; f && actual; f = f->next, actual = actual->next)
2026     {
2027       if (!actual->expr)
2028         continue;
2029
2030       gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
2031     }
2032
2033   if (map_expr->symtree->n.sym->attr.dimension)
2034     {
2035       int d;
2036       gfc_array_spec *as;
2037
2038       as = gfc_copy_array_spec (map_expr->symtree->n.sym->as);
2039
2040       for (d = 0; d < as->rank; d++)
2041         {
2042           gfc_apply_interface_mapping_to_expr (mapping, as->lower[d]);
2043           gfc_apply_interface_mapping_to_expr (mapping, as->upper[d]);
2044         }
2045
2046       expr->value.function.esym->as = as;
2047     }
2048
2049   if (map_expr->symtree->n.sym->ts.type == BT_CHARACTER)
2050     {
2051       expr->value.function.esym->ts.cl->length
2052         = gfc_copy_expr (map_expr->symtree->n.sym->ts.cl->length);
2053
2054       gfc_apply_interface_mapping_to_expr (mapping,
2055                         expr->value.function.esym->ts.cl->length);
2056     }
2057 }
2058
2059
2060 /* EXPR is a copy of an expression that appeared in the interface
2061    associated with MAPPING.  Walk it recursively looking for references to
2062    dummy arguments that MAPPING maps to actual arguments.  Replace each such
2063    reference with a reference to the associated actual argument.  */
2064
2065 static void
2066 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
2067                                      gfc_expr * expr)
2068 {
2069   gfc_interface_sym_mapping *sym;
2070   gfc_actual_arglist *actual;
2071
2072   if (!expr)
2073     return;
2074
2075   /* Copying an expression does not copy its length, so do that here.  */
2076   if (expr->ts.type == BT_CHARACTER && expr->ts.cl)
2077     {
2078       expr->ts.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.cl);
2079       gfc_apply_interface_mapping_to_expr (mapping, expr->ts.cl->length);
2080     }
2081
2082   /* Apply the mapping to any references.  */
2083   gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
2084
2085   /* ...and to the expression's symbol, if it has one.  */
2086   /* TODO Find out why the condition on expr->symtree had to be moved into
2087      the loop rather than being outside it, as originally.  */
2088   for (sym = mapping->syms; sym; sym = sym->next)
2089     if (expr->symtree && sym->old == expr->symtree->n.sym)
2090       {
2091         if (sym->new_sym->n.sym->backend_decl)
2092           expr->symtree = sym->new_sym;
2093         else if (sym->expr)
2094           gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
2095       }
2096
2097       /* ...and to subexpressions in expr->value.  */
2098   switch (expr->expr_type)
2099     {
2100     case EXPR_VARIABLE:
2101     case EXPR_CONSTANT:
2102     case EXPR_NULL:
2103     case EXPR_SUBSTRING:
2104       break;
2105
2106     case EXPR_OP:
2107       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
2108       gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
2109       break;
2110
2111     case EXPR_FUNCTION:
2112       for (actual = expr->value.function.actual; actual; actual = actual->next)
2113         gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
2114
2115       if (expr->value.function.esym == NULL
2116             && expr->value.function.isym != NULL
2117             && expr->value.function.actual->expr->symtree
2118             && gfc_map_intrinsic_function (expr, mapping))
2119         break;
2120
2121       for (sym = mapping->syms; sym; sym = sym->next)
2122         if (sym->old == expr->value.function.esym)
2123           {
2124             expr->value.function.esym = sym->new_sym->n.sym;
2125             gfc_map_fcn_formal_to_actual (expr, sym->expr, mapping);
2126             expr->value.function.esym->result = sym->new_sym->n.sym;
2127           }
2128       break;
2129
2130     case EXPR_ARRAY:
2131     case EXPR_STRUCTURE:
2132       gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
2133       break;
2134
2135     case EXPR_COMPCALL:
2136       gcc_unreachable ();
2137       break;
2138     }
2139
2140   return;
2141 }
2142
2143
2144 /* Evaluate interface expression EXPR using MAPPING.  Store the result
2145    in SE.  */
2146
2147 void
2148 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
2149                              gfc_se * se, gfc_expr * expr)
2150 {
2151   expr = gfc_copy_expr (expr);
2152   gfc_apply_interface_mapping_to_expr (mapping, expr);
2153   gfc_conv_expr (se, expr);
2154   se->expr = gfc_evaluate_now (se->expr, &se->pre);
2155   gfc_free_expr (expr);
2156 }
2157
2158
2159 /* Returns a reference to a temporary array into which a component of
2160    an actual argument derived type array is copied and then returned
2161    after the function call.  */
2162 void
2163 gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr,
2164                            int g77, sym_intent intent)
2165 {
2166   gfc_se lse;
2167   gfc_se rse;
2168   gfc_ss *lss;
2169   gfc_ss *rss;
2170   gfc_loopinfo loop;
2171   gfc_loopinfo loop2;
2172   gfc_ss_info *info;
2173   tree offset;
2174   tree tmp_index;
2175   tree tmp;
2176   tree base_type;
2177   stmtblock_t body;
2178   int n;
2179
2180   gcc_assert (expr->expr_type == EXPR_VARIABLE);
2181
2182   gfc_init_se (&lse, NULL);
2183   gfc_init_se (&rse, NULL);
2184
2185   /* Walk the argument expression.  */
2186   rss = gfc_walk_expr (expr);
2187
2188   gcc_assert (rss != gfc_ss_terminator);
2189  
2190   /* Initialize the scalarizer.  */
2191   gfc_init_loopinfo (&loop);
2192   gfc_add_ss_to_loop (&loop, rss);
2193
2194   /* Calculate the bounds of the scalarization.  */
2195   gfc_conv_ss_startstride (&loop);
2196
2197   /* Build an ss for the temporary.  */
2198   if (expr->ts.type == BT_CHARACTER && !expr->ts.cl->backend_decl)
2199     gfc_conv_string_length (expr->ts.cl, expr, &parmse->pre);
2200
2201   base_type = gfc_typenode_for_spec (&expr->ts);
2202   if (GFC_ARRAY_TYPE_P (base_type)
2203                 || GFC_DESCRIPTOR_TYPE_P (base_type))
2204     base_type = gfc_get_element_type (base_type);
2205
2206   loop.temp_ss = gfc_get_ss ();;
2207   loop.temp_ss->type = GFC_SS_TEMP;
2208   loop.temp_ss->data.temp.type = base_type;
2209
2210   if (expr->ts.type == BT_CHARACTER)
2211     loop.temp_ss->string_length = expr->ts.cl->backend_decl;
2212   else
2213     loop.temp_ss->string_length = NULL;
2214
2215   parmse->string_length = loop.temp_ss->string_length;
2216   loop.temp_ss->data.temp.dimen = loop.dimen;
2217   loop.temp_ss->next = gfc_ss_terminator;
2218
2219   /* Associate the SS with the loop.  */
2220   gfc_add_ss_to_loop (&loop, loop.temp_ss);
2221
2222   /* Setup the scalarizing loops.  */
2223   gfc_conv_loop_setup (&loop, &expr->where);
2224
2225   /* Pass the temporary descriptor back to the caller.  */
2226   info = &loop.temp_ss->data.info;
2227   parmse->expr = info->descriptor;
2228
2229   /* Setup the gfc_se structures.  */
2230   gfc_copy_loopinfo_to_se (&lse, &loop);
2231   gfc_copy_loopinfo_to_se (&rse, &loop);
2232
2233   rse.ss = rss;
2234   lse.ss = loop.temp_ss;
2235   gfc_mark_ss_chain_used (rss, 1);
2236   gfc_mark_ss_chain_used (loop.temp_ss, 1);
2237
2238   /* Start the scalarized loop body.  */
2239   gfc_start_scalarized_body (&loop, &body);
2240
2241   /* Translate the expression.  */
2242   gfc_conv_expr (&rse, expr);
2243
2244   gfc_conv_tmp_array_ref (&lse);
2245   gfc_advance_se_ss_chain (&lse);
2246
2247   if (intent != INTENT_OUT)
2248     {
2249       tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false);
2250       gfc_add_expr_to_block (&body, tmp);
2251       gcc_assert (rse.ss == gfc_ss_terminator);
2252       gfc_trans_scalarizing_loops (&loop, &body);
2253     }
2254   else
2255     {
2256       /* Make sure that the temporary declaration survives by merging
2257        all the loop declarations into the current context.  */
2258       for (n = 0; n < loop.dimen; n++)
2259         {
2260           gfc_merge_block_scope (&body);
2261           body = loop.code[loop.order[n]];
2262         }
2263       gfc_merge_block_scope (&body);
2264     }
2265
2266   /* Add the post block after the second loop, so that any
2267      freeing of allocated memory is done at the right time.  */
2268   gfc_add_block_to_block (&parmse->pre, &loop.pre);
2269
2270   /**********Copy the temporary back again.*********/
2271
2272   gfc_init_se (&lse, NULL);
2273   gfc_init_se (&rse, NULL);
2274
2275   /* Walk the argument expression.  */
2276   lss = gfc_walk_expr (expr);
2277   rse.ss = loop.temp_ss;
2278   lse.ss = lss;
2279
2280   /* Initialize the scalarizer.  */
2281   gfc_init_loopinfo (&loop2);
2282   gfc_add_ss_to_loop (&loop2, lss);
2283
2284   /* Calculate the bounds of the scalarization.  */
2285   gfc_conv_ss_startstride (&loop2);
2286
2287   /* Setup the scalarizing loops.  */
2288   gfc_conv_loop_setup (&loop2, &expr->where);
2289
2290   gfc_copy_loopinfo_to_se (&lse, &loop2);
2291   gfc_copy_loopinfo_to_se (&rse, &loop2);
2292
2293   gfc_mark_ss_chain_used (lss, 1);
2294   gfc_mark_ss_chain_used (loop.temp_ss, 1);
2295
2296   /* Declare the variable to hold the temporary offset and start the
2297      scalarized loop body.  */
2298   offset = gfc_create_var (gfc_array_index_type, NULL);
2299   gfc_start_scalarized_body (&loop2, &body);
2300
2301   /* Build the offsets for the temporary from the loop variables.  The
2302      temporary array has lbounds of zero and strides of one in all
2303      dimensions, so this is very simple.  The offset is only computed
2304      outside the innermost loop, so the overall transfer could be
2305      optimized further.  */
2306   info = &rse.ss->data.info;
2307
2308   tmp_index = gfc_index_zero_node;
2309   for (n = info->dimen - 1; n > 0; n--)
2310     {
2311       tree tmp_str;
2312       tmp = rse.loop->loopvar[n];
2313       tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2314                          tmp, rse.loop->from[n]);
2315       tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2316                          tmp, tmp_index);
2317
2318       tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2319                              rse.loop->to[n-1], rse.loop->from[n-1]);
2320       tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2321                              tmp_str, gfc_index_one_node);
2322
2323       tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
2324                                tmp, tmp_str);
2325     }
2326
2327   tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2328                            tmp_index, rse.loop->from[0]);
2329   gfc_add_modify (&rse.loop->code[0], offset, tmp_index);
2330
2331   tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2332                            rse.loop->loopvar[0], offset);
2333
2334   /* Now use the offset for the reference.  */
2335   tmp = build_fold_indirect_ref (info->data);
2336   rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
2337
2338   if (expr->ts.type == BT_CHARACTER)
2339     rse.string_length = expr->ts.cl->backend_decl;
2340
2341   gfc_conv_expr (&lse, expr);
2342
2343   gcc_assert (lse.ss == gfc_ss_terminator);
2344
2345   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
2346   gfc_add_expr_to_block (&body, tmp);
2347   
2348   /* Generate the copying loops.  */
2349   gfc_trans_scalarizing_loops (&loop2, &body);
2350
2351   /* Wrap the whole thing up by adding the second loop to the post-block
2352      and following it by the post-block of the first loop.  In this way,
2353      if the temporary needs freeing, it is done after use!  */
2354   if (intent != INTENT_IN)
2355     {
2356       gfc_add_block_to_block (&parmse->post, &loop2.pre);
2357       gfc_add_block_to_block (&parmse->post, &loop2.post);
2358     }
2359
2360   gfc_add_block_to_block (&parmse->post, &loop.post);
2361
2362   gfc_cleanup_loop (&loop);
2363   gfc_cleanup_loop (&loop2);
2364
2365   /* Pass the string length to the argument expression.  */
2366   if (expr->ts.type == BT_CHARACTER)
2367     parmse->string_length = expr->ts.cl->backend_decl;
2368
2369   /* We want either the address for the data or the address of the descriptor,
2370      depending on the mode of passing array arguments.  */
2371   if (g77)
2372     parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
2373   else
2374     parmse->expr = build_fold_addr_expr (parmse->expr);
2375
2376   return;
2377 }
2378
2379
2380 /* Generate the code for argument list functions.  */
2381
2382 static void
2383 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
2384 {
2385   /* Pass by value for g77 %VAL(arg), pass the address
2386      indirectly for %LOC, else by reference.  Thus %REF
2387      is a "do-nothing" and %LOC is the same as an F95
2388      pointer.  */
2389   if (strncmp (name, "%VAL", 4) == 0)
2390     gfc_conv_expr (se, expr);
2391   else if (strncmp (name, "%LOC", 4) == 0)
2392     {
2393       gfc_conv_expr_reference (se, expr);
2394       se->expr = gfc_build_addr_expr (NULL, se->expr);
2395     }
2396   else if (strncmp (name, "%REF", 4) == 0)
2397     gfc_conv_expr_reference (se, expr);
2398   else
2399     gfc_error ("Unknown argument list function at %L", &expr->where);
2400 }
2401
2402
2403 /* Generate code for a procedure call.  Note can return se->post != NULL.
2404    If se->direct_byref is set then se->expr contains the return parameter.
2405    Return nonzero, if the call has alternate specifiers.  */
2406
2407 int
2408 gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
2409                         gfc_actual_arglist * arg, tree append_args)
2410 {
2411   gfc_interface_mapping mapping;
2412   tree arglist;
2413   tree retargs;
2414   tree tmp;
2415   tree fntype;
2416   gfc_se parmse;
2417   gfc_ss *argss;
2418   gfc_ss_info *info;
2419   int byref;
2420   int parm_kind;
2421   tree type;
2422   tree var;
2423   tree len;
2424   tree stringargs;
2425   gfc_formal_arglist *formal;
2426   int has_alternate_specifier = 0;
2427   bool need_interface_mapping;
2428   bool callee_alloc;
2429   gfc_typespec ts;
2430   gfc_charlen cl;
2431   gfc_expr *e;
2432   gfc_symbol *fsym;
2433   stmtblock_t post;
2434   enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
2435
2436   arglist = NULL_TREE;
2437   retargs = NULL_TREE;
2438   stringargs = NULL_TREE;
2439   var = NULL_TREE;
2440   len = NULL_TREE;
2441   gfc_clear_ts (&ts);
2442
2443   if (sym->from_intmod == INTMOD_ISO_C_BINDING)
2444     {
2445       if (sym->intmod_sym_id == ISOCBINDING_LOC)
2446         {
2447           if (arg->expr->rank == 0)
2448             gfc_conv_expr_reference (se, arg->expr);
2449           else
2450             {
2451               int f;
2452               /* This is really the actual arg because no formal arglist is
2453                  created for C_LOC.      */
2454               fsym = arg->expr->symtree->n.sym;
2455
2456               /* We should want it to do g77 calling convention.  */
2457               f = (fsym != NULL)
2458                 && !(fsym->attr.pointer || fsym->attr.allocatable)
2459                 && fsym->as->type != AS_ASSUMED_SHAPE;
2460               f = f || !sym->attr.always_explicit;
2461           
2462               argss = gfc_walk_expr (arg->expr);
2463               gfc_conv_array_parameter (se, arg->expr, argss, f, NULL, NULL);
2464             }
2465
2466           /* TODO -- the following two lines shouldn't be necessary, but
2467             they're removed a bug is exposed later in the codepath.
2468             This is workaround was thus introduced, but will have to be
2469             removed; please see PR 35150 for details about the issue.  */
2470           se->expr = convert (pvoid_type_node, se->expr);
2471           se->expr = gfc_evaluate_now (se->expr, &se->pre);
2472
2473           return 0;
2474         }
2475       else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2476         {
2477           arg->expr->ts.type = sym->ts.derived->ts.type;
2478           arg->expr->ts.f90_type = sym->ts.derived->ts.f90_type;
2479           arg->expr->ts.kind = sym->ts.derived->ts.kind;
2480           gfc_conv_expr_reference (se, arg->expr);
2481       
2482           return 0;
2483         }
2484       else if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER
2485                  && arg->next->expr->rank == 0)
2486                || sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER)
2487         {
2488           /* Convert c_f_pointer if fptr is a scalar
2489              and convert c_f_procpointer.  */
2490           gfc_se cptrse;
2491           gfc_se fptrse;
2492
2493           gfc_init_se (&cptrse, NULL);
2494           gfc_conv_expr (&cptrse, arg->expr);
2495           gfc_add_block_to_block (&se->pre, &cptrse.pre);
2496           gfc_add_block_to_block (&se->post, &cptrse.post);
2497
2498           gfc_init_se (&fptrse, NULL);
2499           if (sym->intmod_sym_id == ISOCBINDING_F_POINTER)
2500               fptrse.want_pointer = 1;
2501
2502           gfc_conv_expr (&fptrse, arg->next->expr);
2503           gfc_add_block_to_block (&se->pre, &fptrse.pre);
2504           gfc_add_block_to_block (&se->post, &fptrse.post);
2505
2506           tmp = arg->next->expr->symtree->n.sym->backend_decl;
2507           se->expr = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp), fptrse.expr,
2508                                   fold_convert (TREE_TYPE (tmp), cptrse.expr));
2509
2510           return 0;
2511         }
2512       else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2513         {
2514           gfc_se arg1se;
2515           gfc_se arg2se;
2516
2517           /* Build the addr_expr for the first argument.  The argument is
2518              already an *address* so we don't need to set want_pointer in
2519              the gfc_se.  */
2520           gfc_init_se (&arg1se, NULL);
2521           gfc_conv_expr (&arg1se, arg->expr);
2522           gfc_add_block_to_block (&se->pre, &arg1se.pre);
2523           gfc_add_block_to_block (&se->post, &arg1se.post);
2524
2525           /* See if we were given two arguments.  */
2526           if (arg->next == NULL)
2527             /* Only given one arg so generate a null and do a
2528                not-equal comparison against the first arg.  */
2529             se->expr = fold_build2 (NE_EXPR, boolean_type_node, arg1se.expr,
2530                                     fold_convert (TREE_TYPE (arg1se.expr),
2531                                                   null_pointer_node));
2532           else
2533             {
2534               tree eq_expr;
2535               tree not_null_expr;
2536               
2537               /* Given two arguments so build the arg2se from second arg.  */
2538               gfc_init_se (&arg2se, NULL);
2539               gfc_conv_expr (&arg2se, arg->next->expr);
2540               gfc_add_block_to_block (&se->pre, &arg2se.pre);
2541               gfc_add_block_to_block (&se->post, &arg2se.post);
2542
2543               /* Generate test to compare that the two args are equal.  */
2544               eq_expr = fold_build2 (EQ_EXPR, boolean_type_node,
2545                                      arg1se.expr, arg2se.expr);
2546               /* Generate test to ensure that the first arg is not null.  */
2547               not_null_expr = fold_build2 (NE_EXPR, boolean_type_node,
2548                                            arg1se.expr, null_pointer_node);
2549
2550               /* Finally, the generated test must check that both arg1 is not
2551                  NULL and that it is equal to the second arg.  */
2552               se->expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
2553                                       not_null_expr, eq_expr);
2554             }
2555
2556           return 0;
2557         }
2558     }
2559   
2560   if (se->ss != NULL)
2561     {
2562       if (!sym->attr.elemental)
2563         {
2564           gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2565           if (se->ss->useflags)
2566             {
2567               gcc_assert (gfc_return_by_reference (sym)
2568                       && sym->result->attr.dimension);
2569               gcc_assert (se->loop != NULL);
2570
2571               /* Access the previously obtained result.  */
2572               gfc_conv_tmp_array_ref (se);
2573               gfc_advance_se_ss_chain (se);
2574               return 0;
2575             }
2576         }
2577       info = &se->ss->data.info;
2578     }
2579   else
2580     info = NULL;
2581
2582   gfc_init_block (&post);
2583   gfc_init_interface_mapping (&mapping);
2584   need_interface_mapping = ((sym->ts.type == BT_CHARACTER
2585                                   && sym->ts.cl->length
2586                                   && sym->ts.cl->length->expr_type
2587                                                 != EXPR_CONSTANT)
2588                               || sym->attr.dimension);
2589   formal = sym->formal;
2590   /* Evaluate the arguments.  */
2591   for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2592     {
2593       e = arg->expr;
2594       fsym = formal ? formal->sym : NULL;
2595       parm_kind = MISSING;
2596       if (e == NULL)
2597         {
2598
2599           if (se->ignore_optional)
2600             {
2601               /* Some intrinsics have already been resolved to the correct
2602                  parameters.  */
2603               continue;
2604             }
2605           else if (arg->label)
2606             {
2607               has_alternate_specifier = 1;
2608               continue;
2609             }
2610           else
2611             {
2612               /* Pass a NULL pointer for an absent arg.  */
2613               gfc_init_se (&parmse, NULL);
2614               parmse.expr = null_pointer_node;
2615               if (arg->missing_arg_type == BT_CHARACTER)
2616                 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2617             }
2618         }
2619       else if (se->ss && se->ss->useflags)
2620         {
2621           /* An elemental function inside a scalarized loop.  */
2622           gfc_init_se (&parmse, se);
2623           gfc_conv_expr_reference (&parmse, e);
2624           parm_kind = ELEMENTAL;
2625         }
2626       else
2627         {
2628           /* A scalar or transformational function.  */
2629           gfc_init_se (&parmse, NULL);
2630           argss = gfc_walk_expr (e);
2631
2632           if (argss == gfc_ss_terminator)
2633             {
2634               if (e->expr_type == EXPR_VARIABLE
2635                     && e->symtree->n.sym->attr.cray_pointee
2636                     && fsym && fsym->attr.flavor == FL_PROCEDURE)
2637                 {
2638                     /* The Cray pointer needs to be converted to a pointer to
2639                        a type given by the expression.  */
2640                     gfc_conv_expr (&parmse, e);
2641                     type = build_pointer_type (TREE_TYPE (parmse.expr));
2642                     tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer);
2643                     parmse.expr = convert (type, tmp);
2644                 }
2645               else if (fsym && fsym->attr.value)
2646                 {
2647                   if (fsym->ts.type == BT_CHARACTER
2648                       && fsym->ts.is_c_interop
2649                       && fsym->ns->proc_name != NULL
2650                       && fsym->ns->proc_name->attr.is_bind_c)
2651                     {
2652                       parmse.expr = NULL;
2653                       gfc_conv_scalar_char_value (fsym, &parmse, &e);
2654                       if (parmse.expr == NULL)
2655                         gfc_conv_expr (&parmse, e);
2656                     }
2657                   else
2658                     gfc_conv_expr (&parmse, e);
2659                 }
2660               else if (arg->name && arg->name[0] == '%')
2661                 /* Argument list functions %VAL, %LOC and %REF are signalled
2662                    through arg->name.  */
2663                 conv_arglist_function (&parmse, arg->expr, arg->name);
2664               else if ((e->expr_type == EXPR_FUNCTION)
2665                           && e->symtree->n.sym->attr.pointer
2666                           && fsym && fsym->attr.target)
2667                 {
2668                   gfc_conv_expr (&parmse, e);
2669                   parmse.expr = build_fold_addr_expr (parmse.expr);
2670                 }
2671               else
2672                 {
2673                   gfc_conv_expr_reference (&parmse, e);
2674                   if (fsym && e->expr_type != EXPR_NULL
2675                       && ((fsym->attr.pointer
2676                            && fsym->attr.flavor != FL_PROCEDURE)
2677                           || fsym->attr.proc_pointer))
2678                     {
2679                       /* Scalar pointer dummy args require an extra level of
2680                          indirection. The null pointer already contains
2681                          this level of indirection.  */
2682                       parm_kind = SCALAR_POINTER;
2683                       parmse.expr = build_fold_addr_expr (parmse.expr);
2684                     }
2685                 }
2686             }
2687           else
2688             {
2689               /* If the procedure requires an explicit interface, the actual
2690                  argument is passed according to the corresponding formal
2691                  argument.  If the corresponding formal argument is a POINTER,
2692                  ALLOCATABLE or assumed shape, we do not use g77's calling
2693                  convention, and pass the address of the array descriptor
2694                  instead. Otherwise we use g77's calling convention.  */
2695               int f;
2696               f = (fsym != NULL)
2697                   && !(fsym->attr.pointer || fsym->attr.allocatable)
2698                   && fsym->as->type != AS_ASSUMED_SHAPE;
2699               f = f || !sym->attr.always_explicit;
2700
2701               if (e->expr_type == EXPR_VARIABLE
2702                     && is_subref_array (e))
2703                 /* The actual argument is a component reference to an
2704                    array of derived types.  In this case, the argument
2705                    is converted to a temporary, which is passed and then
2706                    written back after the procedure call.  */
2707                 gfc_conv_subref_array_arg (&parmse, e, f,
2708                         fsym ? fsym->attr.intent : INTENT_INOUT);
2709               else
2710                 gfc_conv_array_parameter (&parmse, e, argss, f, fsym,
2711                                           sym->name);
2712
2713               /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is 
2714                  allocated on entry, it must be deallocated.  */
2715               if (fsym && fsym->attr.allocatable
2716                   && fsym->attr.intent == INTENT_OUT)
2717                 {
2718                   tmp = build_fold_indirect_ref (parmse.expr);
2719                   tmp = gfc_trans_dealloc_allocated (tmp);
2720                   gfc_add_expr_to_block (&se->pre, tmp);
2721                 }
2722
2723             } 
2724         }
2725
2726       /* The case with fsym->attr.optional is that of a user subroutine
2727          with an interface indicating an optional argument.  When we call
2728          an intrinsic subroutine, however, fsym is NULL, but we might still
2729          have an optional argument, so we proceed to the substitution
2730          just in case.  */
2731       if (e && (fsym == NULL || fsym->attr.optional))
2732         {
2733           /* If an optional argument is itself an optional dummy argument,
2734              check its presence and substitute a null if absent.  */
2735           if (e->expr_type == EXPR_VARIABLE
2736               && e->symtree->n.sym->attr.optional)
2737             gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
2738                                     e->representation.length);
2739         }
2740
2741       if (fsym && e)
2742         {
2743           /* Obtain the character length of an assumed character length
2744              length procedure from the typespec.  */
2745           if (fsym->ts.type == BT_CHARACTER
2746               && parmse.string_length == NULL_TREE
2747               && e->ts.type == BT_PROCEDURE
2748               && e->symtree->n.sym->ts.type == BT_CHARACTER
2749               && e->symtree->n.sym->ts.cl->length != NULL
2750               && e->symtree->n.sym->ts.cl->length->expr_type == EXPR_CONSTANT)
2751             {
2752               gfc_conv_const_charlen (e->symtree->n.sym->ts.cl);
2753               parmse.string_length = e->symtree->n.sym->ts.cl->backend_decl;
2754             }
2755         }
2756
2757       if (fsym && need_interface_mapping && e)
2758         gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
2759
2760       gfc_add_block_to_block (&se->pre, &parmse.pre);
2761       gfc_add_block_to_block (&post, &parmse.post);
2762
2763       /* Allocated allocatable components of derived types must be
2764          deallocated for non-variable scalars.  Non-variable arrays are
2765          dealt with in trans-array.c(gfc_conv_array_parameter).  */
2766       if (e && e->ts.type == BT_DERIVED
2767             && e->ts.derived->attr.alloc_comp
2768             && (e->expr_type != EXPR_VARIABLE && !e->rank))
2769         {
2770           int parm_rank;
2771           tmp = build_fold_indirect_ref (parmse.expr);
2772           parm_rank = e->rank;
2773           switch (parm_kind)
2774             {
2775             case (ELEMENTAL):
2776             case (SCALAR):
2777               parm_rank = 0;
2778               break;
2779
2780             case (SCALAR_POINTER):
2781               tmp = build_fold_indirect_ref (tmp);
2782               break;
2783             }
2784
2785           tmp = gfc_deallocate_alloc_comp (e->ts.derived, tmp, parm_rank);
2786           gfc_add_expr_to_block (&se->post, tmp);
2787         }
2788
2789       /* Character strings are passed as two parameters, a length and a
2790          pointer - except for Bind(c) which only passes the pointer.  */
2791       if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
2792         stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2793
2794       arglist = gfc_chainon_list (arglist, parmse.expr);
2795     }
2796   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2797
2798   ts = sym->ts;
2799   if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
2800     se->string_length = build_int_cst (gfc_charlen_type_node, 1);
2801   else if (ts.type == BT_CHARACTER)
2802     {
2803       if (sym->ts.cl->length == NULL)
2804         {
2805           /* Assumed character length results are not allowed by 5.1.1.5 of the
2806              standard and are trapped in resolve.c; except in the case of SPREAD
2807              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
2808              we take the character length of the first argument for the result.
2809              For dummies, we have to look through the formal argument list for
2810              this function and use the character length found there.*/
2811           if (!sym->attr.dummy)
2812             cl.backend_decl = TREE_VALUE (stringargs);
2813           else
2814             {
2815               formal = sym->ns->proc_name->formal;
2816               for (; formal; formal = formal->next)
2817                 if (strcmp (formal->sym->name, sym->name) == 0)
2818                   cl.backend_decl = formal->sym->ts.cl->backend_decl;
2819             }
2820         }
2821         else
2822         {
2823           tree tmp;
2824
2825           /* Calculate the length of the returned string.  */
2826           gfc_init_se (&parmse, NULL);
2827           if (need_interface_mapping)
2828             gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2829           else
2830             gfc_conv_expr (&parmse, sym->ts.cl->length);
2831           gfc_add_block_to_block (&se->pre, &parmse.pre);
2832           gfc_add_block_to_block (&se->post, &parmse.post);
2833           
2834           tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
2835           tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
2836                              build_int_cst (gfc_charlen_type_node, 0));
2837           cl.backend_decl = tmp;
2838         }
2839
2840       /* Set up a charlen structure for it.  */
2841       cl.next = NULL;
2842       cl.length = NULL;
2843       ts.cl = &cl;
2844
2845       len = cl.backend_decl;
2846     }
2847
2848   byref = gfc_return_by_reference (sym);
2849   if (byref)
2850     {
2851       if (se->direct_byref)
2852         {
2853           /* Sometimes, too much indirection can be applied; e.g. for
2854              function_result = array_valued_recursive_function.  */
2855           if (TREE_TYPE (TREE_TYPE (se->expr))
2856                 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
2857                 && GFC_DESCRIPTOR_TYPE_P
2858                         (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
2859             se->expr = build_fold_indirect_ref (se->expr);
2860
2861           retargs = gfc_chainon_list (retargs, se->expr);
2862         }
2863       else if (sym->result->attr.dimension)
2864         {
2865           gcc_assert (se->loop && info);
2866
2867           /* Set the type of the array.  */
2868           tmp = gfc_typenode_for_spec (&ts);
2869           info->dimen = se->loop->dimen;
2870
2871           /* Evaluate the bounds of the result, if known.  */
2872           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2873
2874           /* Create a temporary to store the result.  In case the function
2875              returns a pointer, the temporary will be a shallow copy and
2876              mustn't be deallocated.  */
2877           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2878           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2879                                        NULL_TREE, false, !sym->attr.pointer,
2880                                        callee_alloc, &se->ss->expr->where);
2881
2882           /* Pass the temporary as the first argument.  */
2883           tmp = info->descriptor;
2884           tmp = build_fold_addr_expr (tmp);
2885           retargs = gfc_chainon_list (retargs, tmp);
2886         }
2887       else if (ts.type == BT_CHARACTER)
2888         {
2889           /* Pass the string length.  */
2890           type = gfc_get_character_type (ts.kind, ts.cl);
2891           type = build_pointer_type (type);
2892
2893           /* Return an address to a char[0:len-1]* temporary for
2894              character pointers.  */
2895           if (sym->attr.pointer || sym->attr.allocatable)
2896             {
2897               var = gfc_create_var (type, "pstr");
2898
2899               /* Provide an address expression for the function arguments.  */
2900               var = build_fold_addr_expr (var);
2901             }
2902           else
2903             var = gfc_conv_string_tmp (se, type, len);
2904
2905           retargs = gfc_chainon_list (retargs, var);
2906         }
2907       else
2908         {
2909           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2910
2911           type = gfc_get_complex_type (ts.kind);
2912           var = build_fold_addr_expr (gfc_create_var (type, "cmplx"));
2913           retargs = gfc_chainon_list (retargs, var);
2914         }
2915
2916       /* Add the string length to the argument list.  */
2917       if (ts.type == BT_CHARACTER)
2918         retargs = gfc_chainon_list (retargs, len);
2919     }
2920   gfc_free_interface_mapping (&mapping);
2921
2922   /* Add the return arguments.  */
2923   arglist = chainon (retargs, arglist);
2924
2925   /* Add the hidden string length parameters to the arguments.  */
2926   arglist = chainon (arglist, stringargs);
2927
2928   /* We may want to append extra arguments here.  This is used e.g. for
2929      calls to libgfortran_matmul_??, which need extra information.  */
2930   if (append_args != NULL_TREE)
2931     arglist = chainon (arglist, append_args);
2932
2933   /* Generate the actual call.  */
2934   gfc_conv_function_val (se, sym);
2935
2936   /* If there are alternate return labels, function type should be
2937      integer.  Can't modify the type in place though, since it can be shared
2938      with other functions.  For dummy arguments, the typing is done to
2939      to this result, even if it has to be repeated for each call.  */
2940   if (has_alternate_specifier
2941       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2942     {
2943       if (!sym->attr.dummy)
2944         {
2945           TREE_TYPE (sym->backend_decl)
2946                 = build_function_type (integer_type_node,
2947                       TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2948           se->expr = build_fold_addr_expr (sym->backend_decl);
2949         }
2950       else
2951         TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
2952     }
2953
2954   fntype = TREE_TYPE (TREE_TYPE (se->expr));
2955   se->expr = build_call_list (TREE_TYPE (fntype), se->expr, arglist);
2956
2957   /* If we have a pointer function, but we don't want a pointer, e.g.
2958      something like
2959         x = f()
2960      where f is pointer valued, we have to dereference the result.  */
2961   if (!se->want_pointer && !byref && sym->attr.pointer)
2962     se->expr = build_fold_indirect_ref (se->expr);
2963
2964   /* f2c calling conventions require a scalar default real function to
2965      return a double precision result.  Convert this back to default
2966      real.  We only care about the cases that can happen in Fortran 77.
2967   */
2968   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2969       && sym->ts.kind == gfc_default_real_kind
2970       && !sym->attr.always_explicit)
2971     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2972
2973   /* A pure function may still have side-effects - it may modify its
2974      parameters.  */
2975   TREE_SIDE_EFFECTS (se->expr) = 1;
2976 #if 0
2977   if (!sym->attr.pure)
2978     TREE_SIDE_EFFECTS (se->expr) = 1;
2979 #endif
2980
2981   if (byref)
2982     {
2983       /* Add the function call to the pre chain.  There is no expression.  */
2984       gfc_add_expr_to_block (&se->pre, se->expr);
2985       se->expr = NULL_TREE;
2986
2987       if (!se->direct_byref)
2988         {
2989           if (sym->attr.dimension)
2990             {
2991               if (flag_bounds_check)
2992                 {
2993                   /* Check the data pointer hasn't been modified.  This would
2994                      happen in a function returning a pointer.  */
2995                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
2996                   tmp = fold_build2 (NE_EXPR, boolean_type_node,
2997                                      tmp, info->data);
2998                   gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
2999                                            gfc_msg_fault);
3000                 }
3001               se->expr = info->descriptor;
3002               /* Bundle in the string length.  */
3003               se->string_length = len;
3004             }
3005           else if (sym->ts.type == BT_CHARACTER)
3006             {
3007               /* Dereference for character pointer results.  */
3008               if (sym->attr.pointer || sym->attr.allocatable)
3009                 se->expr = build_fold_indirect_ref (var);
3010               else
3011                 se->expr = var;
3012
3013               se->string_length = len;
3014             }
3015           else
3016             {
3017               gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
3018               se->expr = build_fold_indirect_ref (var);
3019             }
3020         }
3021     }
3022
3023   /* Follow the function call with the argument post block.  */
3024   if (byref)
3025     gfc_add_block_to_block (&se->pre, &post);
3026   else
3027     gfc_add_block_to_block (&se->post, &post);
3028
3029   return has_alternate_specifier;
3030 }
3031
3032
3033 /* Fill a character string with spaces.  */
3034
3035 static tree
3036 fill_with_spaces (tree start, tree type, tree size)
3037 {
3038   stmtblock_t block, loop;
3039   tree i, el, exit_label, cond, tmp;
3040
3041   /* For a simple char type, we can call memset().  */
3042   if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
3043     return build_call_expr (built_in_decls[BUILT_IN_MEMSET], 3, start,
3044                             build_int_cst (gfc_get_int_type (gfc_c_int_kind),
3045                                            lang_hooks.to_target_charset (' ')),
3046                             size);
3047
3048   /* Otherwise, we use a loop:
3049         for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
3050           *el = (type) ' ';
3051    */
3052
3053   /* Initialize variables.  */
3054   gfc_init_block (&block);
3055   i = gfc_create_var (sizetype, "i");
3056   gfc_add_modify (&block, i, fold_convert (sizetype, size));
3057   el = gfc_create_var (build_pointer_type (type), "el");
3058   gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
3059   exit_label = gfc_build_label_decl (NULL_TREE);
3060   TREE_USED (exit_label) = 1;
3061
3062
3063   /* Loop body.  */
3064   gfc_init_block (&loop);
3065
3066   /* Exit condition.  */
3067   cond = fold_build2 (LE_EXPR, boolean_type_node, i,
3068                       fold_convert (sizetype, integer_zero_node));
3069   tmp = build1_v (GOTO_EXPR, exit_label);
3070   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
3071   gfc_add_expr_to_block (&loop, tmp);
3072
3073   /* Assignment.  */
3074   gfc_add_modify (&loop, fold_build1 (INDIRECT_REF, type, el),
3075                        build_int_cst (type,
3076                                       lang_hooks.to_target_charset (' ')));
3077
3078   /* Increment loop variables.  */
3079   gfc_add_modify (&loop, i, fold_build2 (MINUS_EXPR, sizetype, i,
3080                                               TYPE_SIZE_UNIT (type)));
3081   gfc_add_modify (&loop, el, fold_build2 (POINTER_PLUS_EXPR,
3082                                                TREE_TYPE (el), el,
3083                                                TYPE_SIZE_UNIT (type)));
3084
3085   /* Making the loop... actually loop!  */
3086   tmp = gfc_finish_block (&loop);
3087   tmp = build1_v (LOOP_EXPR, tmp);
3088   gfc_add_expr_to_block (&block, tmp);
3089
3090   /* The exit label.  */
3091   tmp = build1_v (LABEL_EXPR, exit_label);
3092   gfc_add_expr_to_block (&block, tmp);
3093
3094
3095   return gfc_finish_block (&block);
3096 }
3097
3098
3099 /* Generate code to copy a string.  */
3100
3101 void
3102 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
3103                        int dkind, tree slength, tree src, int skind)
3104 {
3105   tree tmp, dlen, slen;
3106   tree dsc;
3107   tree ssc;
3108   tree cond;
3109   tree cond2;
3110   tree tmp2;
3111   tree tmp3;
3112   tree tmp4;
3113   tree chartype;
3114   stmtblock_t tempblock;
3115
3116   gcc_assert (dkind == skind);
3117
3118   if (slength != NULL_TREE)
3119     {
3120       slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
3121       ssc = string_to_single_character (slen, src, skind);
3122     }
3123   else
3124     {
3125       slen = build_int_cst (size_type_node, 1);
3126       ssc =  src;
3127     }
3128
3129   if (dlength != NULL_TREE)
3130     {
3131       dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
3132       dsc = string_to_single_character (slen, dest, dkind);
3133     }
3134   else
3135     {
3136       dlen = build_int_cst (size_type_node, 1);
3137       dsc =  dest;
3138     }
3139
3140   if (slength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (src)))
3141     ssc = string_to_single_character (slen, src, skind);
3142   if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
3143     dsc = string_to_single_character (dlen, dest, dkind);
3144
3145
3146   /* Assign directly if the types are compatible.  */
3147   if (dsc != NULL_TREE && ssc != NULL_TREE
3148       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
3149     {
3150       gfc_add_modify (block, dsc, ssc);
3151       return;
3152     }
3153
3154   /* Do nothing if the destination length is zero.  */
3155   cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
3156                       build_int_cst (size_type_node, 0));
3157
3158   /* The following code was previously in _gfortran_copy_string:
3159
3160        // The two strings may overlap so we use memmove.
3161        void
3162        copy_string (GFC_INTEGER_4 destlen, char * dest,
3163                     GFC_INTEGER_4 srclen, const char * src)
3164        {
3165          if (srclen >= destlen)
3166            {
3167              // This will truncate if too long.
3168              memmove (dest, src, destlen);
3169            }
3170          else
3171            {
3172              memmove (dest, src, srclen);
3173              // Pad with spaces.
3174              memset (&dest[srclen], ' ', destlen - srclen);
3175            }
3176        }
3177
3178      We're now doing it here for better optimization, but the logic
3179      is the same.  */
3180
3181   /* For non-default character kinds, we have to multiply the string
3182      length by the base type size.  */
3183   chartype = gfc_get_char_type (dkind);
3184   slen = fold_build2 (MULT_EXPR, size_type_node,
3185                       fold_convert (size_type_node, slen),
3186                       fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3187   dlen = fold_build2 (MULT_EXPR, size_type_node,
3188                       fold_convert (size_type_node, dlen),
3189                       fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3190
3191   if (dlength)
3192     dest = fold_convert (pvoid_type_node, dest);
3193   else
3194     dest = gfc_build_addr_expr (pvoid_type_node, dest);
3195
3196   if (slength)
3197     src = fold_convert (pvoid_type_node, src);
3198   else
3199     src = gfc_build_addr_expr (pvoid_type_node, src);
3200
3201   /* Truncate string if source is too long.  */
3202   cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
3203   tmp2 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
3204                           3, dest, src, dlen);
3205
3206   /* Else copy and pad with spaces.  */
3207   tmp3 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
3208                           3, dest, src, slen);
3209
3210   tmp4 = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest,
3211                       fold_convert (sizetype, slen));
3212   tmp4 = fill_with_spaces (tmp4, chartype,
3213                            fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
3214                                         dlen, slen));
3215
3216   gfc_init_block (&tempblock);
3217   gfc_add_expr_to_block (&tempblock, tmp3);
3218   gfc_add_expr_to_block (&tempblock, tmp4);
3219   tmp3 = gfc_finish_block (&tempblock);
3220
3221   /* The whole copy_string function is there.  */
3222   tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
3223   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
3224   gfc_add_expr_to_block (block, tmp);
3225 }
3226
3227
3228 /* Translate a statement function.
3229    The value of a statement function reference is obtained by evaluating the
3230    expression using the values of the actual arguments for the values of the
3231    corresponding dummy arguments.  */
3232
3233 static void
3234 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
3235 {
3236   gfc_symbol *sym;
3237   gfc_symbol *fsym;
3238   gfc_formal_arglist *fargs;
3239   gfc_actual_arglist *args;
3240   gfc_se lse;
3241   gfc_se rse;
3242   gfc_saved_var *saved_vars;
3243   tree *temp_vars;
3244   tree type;
3245   tree tmp;
3246   int n;
3247
3248   sym = expr->symtree->n.sym;
3249   args = expr->value.function.actual;
3250   gfc_init_se (&lse, NULL);
3251   gfc_init_se (&rse, NULL);
3252
3253   n = 0;
3254   for (fargs = sym->formal; fargs; fargs = fargs->next)
3255     n++;
3256   saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
3257   temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
3258
3259   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3260     {
3261       /* Each dummy shall be specified, explicitly or implicitly, to be
3262          scalar.  */
3263       gcc_assert (fargs->sym->attr.dimension == 0);
3264       fsym = fargs->sym;
3265
3266       /* Create a temporary to hold the value.  */
3267       type = gfc_typenode_for_spec (&fsym->ts);
3268       temp_vars[n] = gfc_create_var (type, fsym->name);
3269
3270       if (fsym->ts.type == BT_CHARACTER)
3271         {
3272           /* Copy string arguments.  */
3273           tree arglen;
3274
3275           gcc_assert (fsym->ts.cl && fsym->ts.cl->length
3276                       && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
3277
3278           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3279           tmp = gfc_build_addr_expr (build_pointer_type (type),
3280                                      temp_vars[n]);
3281
3282           gfc_conv_expr (&rse, args->expr);
3283           gfc_conv_string_parameter (&rse);
3284           gfc_add_block_to_block (&se->pre, &lse.pre);
3285           gfc_add_block_to_block (&se->pre, &rse.pre);
3286
3287           gfc_trans_string_copy (&se->pre, arglen, tmp, fsym->ts.kind,
3288                                  rse.string_length, rse.expr, fsym->ts.kind);
3289           gfc_add_block_to_block (&se->pre, &lse.post);
3290           gfc_add_block_to_block (&se->pre, &rse.post);
3291         }
3292       else
3293         {
3294           /* For everything else, just evaluate the expression.  */
3295           gfc_conv_expr (&lse, args->expr);
3296
3297           gfc_add_block_to_block (&se->pre, &lse.pre);
3298           gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
3299           gfc_add_block_to_block (&se->pre, &lse.post);
3300         }
3301
3302       args = args->next;
3303     }
3304
3305   /* Use the temporary variables in place of the real ones.  */
3306   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3307     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
3308
3309   gfc_conv_expr (se, sym->value);
3310
3311   if (sym->ts.type == BT_CHARACTER)
3312     {
3313       gfc_conv_const_charlen (sym->ts.cl);
3314
3315       /* Force the expression to the correct length.  */
3316       if (!INTEGER_CST_P (se->string_length)
3317           || tree_int_cst_lt (se->string_length,
3318                               sym->ts.cl->backend_decl))
3319         {
3320           type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
3321           tmp = gfc_create_var (type, sym->name);
3322           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
3323           gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
3324                                  sym->ts.kind, se->string_length, se->expr,
3325                                  sym->ts.kind);
3326           se->expr = tmp;
3327         }
3328       se->string_length = sym->ts.cl->backend_decl;
3329     }
3330
3331   /* Restore the original variables.  */
3332   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3333     gfc_restore_sym (fargs->sym, &saved_vars[n]);
3334   gfc_free (saved_vars);
3335 }
3336
3337
3338 /* Translate a function expression.  */
3339
3340 static void
3341 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
3342 {
3343   gfc_symbol *sym;
3344
3345   if (expr->value.function.isym)
3346     {
3347       gfc_conv_intrinsic_function (se, expr);
3348       return;
3349     }
3350
3351   /* We distinguish statement functions from general functions to improve
3352      runtime performance.  */
3353   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3354     {
3355       gfc_conv_statement_function (se, expr);
3356       return;
3357     }
3358
3359   /* expr.value.function.esym is the resolved (specific) function symbol for
3360      most functions.  However this isn't set for dummy procedures.  */
3361   sym = expr->value.function.esym;
3362   if (!sym)
3363     sym = expr->symtree->n.sym;
3364   gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE);
3365 }
3366
3367
3368 static void
3369 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
3370 {
3371   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
3372   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
3373
3374   gfc_conv_tmp_array_ref (se);
3375   gfc_advance_se_ss_chain (se);
3376 }
3377
3378
3379 /* Build a static initializer.  EXPR is the expression for the initial value.
3380    The other parameters describe the variable of the component being 
3381    initialized. EXPR may be null.  */
3382
3383 tree
3384 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
3385                       bool array, bool pointer)
3386 {
3387   gfc_se se;
3388
3389   if (!(expr || pointer))
3390     return NULL_TREE;
3391
3392   /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
3393      (these are the only two iso_c_binding derived types that can be
3394      used as initialization expressions).  If so, we need to modify
3395      the 'expr' to be that for a (void *).  */
3396   if (expr != NULL && expr->ts.type == BT_DERIVED
3397       && expr->ts.is_iso_c && expr->ts.derived)
3398     {
3399       gfc_symbol *derived = expr->ts.derived;
3400
3401       expr = gfc_int_expr (0);
3402
3403       /* The derived symbol has already been converted to a (void *).  Use
3404          its kind.  */
3405       expr->ts.f90_type = derived->ts.f90_type;
3406       expr->ts.kind = derived->ts.kind;
3407     }
3408   
3409   if (array)
3410     {
3411       /* Arrays need special handling.  */
3412       if (pointer)
3413         return gfc_build_null_descriptor (type);
3414       else
3415         return gfc_conv_array_initializer (type, expr);
3416     }
3417   else if (pointer)
3418     return fold_convert (type, null_pointer_node);
3419   else
3420     {
3421       switch (ts->type)
3422         {
3423         case BT_DERIVED:
3424           gfc_init_se (&se, NULL);
3425           gfc_conv_structure (&se, expr, 1);
3426           return se.expr;
3427
3428         case BT_CHARACTER:
3429           return gfc_conv_string_init (ts->cl->backend_decl,expr);
3430
3431         default:
3432           gfc_init_se (&se, NULL);
3433           gfc_conv_constant (&se, expr);
3434           return se.expr;
3435         }
3436     }
3437 }
3438   
3439 static tree
3440 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3441 {
3442   gfc_se rse;
3443   gfc_se lse;
3444   gfc_ss *rss;
3445   gfc_ss *lss;
3446   stmtblock_t body;
3447   stmtblock_t block;
3448   gfc_loopinfo loop;
3449   int n;
3450   tree tmp;
3451
3452   gfc_start_block (&block);
3453
3454   /* Initialize the scalarizer.  */
3455   gfc_init_loopinfo (&loop);
3456
3457   gfc_init_se (&lse, NULL);
3458   gfc_init_se (&rse, NULL);
3459
3460   /* Walk the rhs.  */
3461   rss = gfc_walk_expr (expr);
3462   if (rss == gfc_ss_terminator)
3463     {
3464       /* The rhs is scalar.  Add a ss for the expression.  */
3465       rss = gfc_get_ss ();
3466       rss->next = gfc_ss_terminator;
3467       rss->type = GFC_SS_SCALAR;
3468       rss->expr = expr;
3469     }
3470
3471   /* Create a SS for the destination.  */
3472   lss = gfc_get_ss ();
3473   lss->type = GFC_SS_COMPONENT;
3474   lss->expr = NULL;
3475   lss->shape = gfc_get_shape (cm->as->rank);
3476   lss->next = gfc_ss_terminator;
3477   lss->data.info.dimen = cm->as->rank;
3478   lss->data.info.descriptor = dest;
3479   lss->data.info.data = gfc_conv_array_data (dest);
3480   lss->data.info.offset = gfc_conv_array_offset (dest);
3481   for (n = 0; n < cm->as->rank; n++)
3482     {
3483       lss->data.info.dim[n] = n;
3484       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
3485       lss->data.info.stride[n] = gfc_index_one_node;
3486
3487       mpz_init (lss->shape[n]);
3488       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
3489                cm->as->lower[n]->value.integer);
3490       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
3491     }
3492   
3493   /* Associate the SS with the loop.  */
3494   gfc_add_ss_to_loop (&loop, lss);
3495   gfc_add_ss_to_loop (&loop, rss);
3496
3497   /* Calculate the bounds of the scalarization.  */
3498   gfc_conv_ss_startstride (&loop);
3499
3500   /* Setup the scalarizing loops.  */
3501   gfc_conv_loop_setup (&loop, &expr->where);
3502
3503   /* Setup the gfc_se structures.  */
3504   gfc_copy_loopinfo_to_se (&lse, &loop);
3505   gfc_copy_loopinfo_to_se (&rse, &loop);
3506
3507   rse.ss = rss;
3508   gfc_mark_ss_chain_used (rss, 1);
3509   lse.ss = lss;
3510   gfc_mark_ss_chain_used (lss, 1);
3511
3512   /* Start the scalarized loop body.  */
3513   gfc_start_scalarized_body (&loop, &body);
3514
3515   gfc_conv_tmp_array_ref (&lse);
3516   if (cm->ts.type == BT_CHARACTER)
3517     lse.string_length = cm->ts.cl->backend_decl;
3518
3519   gfc_conv_expr (&rse, expr);
3520
3521   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
3522   gfc_add_expr_to_block (&body, tmp);
3523
3524   gcc_assert (rse.ss == gfc_ss_terminator);
3525
3526   /* Generate the copying loops.  */
3527   gfc_trans_scalarizing_loops (&loop, &body);
3528
3529   /* Wrap the whole thing up.  */
3530   gfc_add_block_to_block (&block, &loop.pre);
3531   gfc_add_block_to_block (&block, &loop.post);
3532
3533   for (n = 0; n < cm->as->rank; n++)
3534     mpz_clear (lss->shape[n]);
3535   gfc_free (lss->shape);
3536
3537   gfc_cleanup_loop (&loop);
3538
3539   return gfc_finish_block (&block);
3540 }
3541
3542
3543 /* Assign a single component of a derived type constructor.  */
3544
3545 static tree
3546 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3547 {
3548   gfc_se se;
3549   gfc_se lse;
3550   gfc_ss *rss;
3551   stmtblock_t block;
3552   tree tmp;
3553   tree offset;
3554   int n;
3555
3556   gfc_start_block (&block);
3557
3558   if (cm->attr.pointer)
3559     {
3560       gfc_init_se (&se, NULL);
3561       /* Pointer component.  */
3562       if (cm->attr.dimension)
3563         {
3564           /* Array pointer.  */
3565           if (expr->expr_type == EXPR_NULL)
3566             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3567           else
3568             {
3569               rss = gfc_walk_expr (expr);
3570               se.direct_byref = 1;
3571               se.expr = dest;
3572               gfc_conv_expr_descriptor (&se, expr, rss);
3573               gfc_add_block_to_block (&block, &se.pre);
3574               gfc_add_block_to_block (&block, &se.post);
3575             }
3576         }
3577       else
3578         {
3579           /* Scalar pointers.  */
3580           se.want_pointer = 1;
3581           gfc_conv_expr (&se, expr);
3582           gfc_add_block_to_block (&block, &se.pre);
3583           gfc_add_modify (&block, dest,
3584                                fold_convert (TREE_TYPE (dest), se.expr));
3585           gfc_add_block_to_block (&block, &se.post);
3586         }
3587     }
3588   else if (cm->attr.dimension)
3589     {
3590       if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
3591         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3592       else if (cm->attr.allocatable)
3593         {
3594           tree tmp2;
3595
3596           gfc_init_se (&se, NULL);
3597  
3598           rss = gfc_walk_expr (expr);
3599           se.want_pointer = 0;
3600           gfc_conv_expr_descriptor (&se, expr, rss);
3601           gfc_add_block_to_block (&block, &se.pre);
3602
3603           tmp = fold_convert (TREE_TYPE (dest), se.expr);
3604           gfc_add_modify (&block, dest, tmp);
3605
3606           if (cm->ts.type == BT_DERIVED && cm->ts.derived->attr.alloc_comp)
3607             tmp = gfc_copy_alloc_comp (cm->ts.derived, se.expr, dest,
3608                                        cm->as->rank);
3609           else
3610             tmp = gfc_duplicate_allocatable (dest, se.expr,
3611                                              TREE_TYPE(cm->backend_decl),
3612                                              cm->as->rank);
3613
3614           gfc_add_expr_to_block (&block, tmp);
3615           gfc_add_block_to_block (&block, &se.post);
3616
3617           if (expr->expr_type != EXPR_VARIABLE)
3618             gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
3619
3620           /* Shift the lbound and ubound of temporaries to being unity, rather
3621              than zero, based.  Calculate the offset for all cases.  */
3622           offset = gfc_conv_descriptor_offset (dest);
3623           gfc_add_modify (&block, offset, gfc_index_zero_node);
3624           tmp2 =gfc_create_var (gfc_array_index_type, NULL);
3625           for (n = 0; n < expr->rank; n++)
3626             {
3627               if (expr->expr_type != EXPR_VARIABLE
3628                     && expr->expr_type != EXPR_CONSTANT)
3629                 {
3630                   tree span;
3631                   tmp = gfc_conv_descriptor_ubound (dest, gfc_rank_cst[n]);
3632                   span = fold_build2 (MINUS_EXPR, gfc_array_index_type, tmp,
3633                             gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]));
3634                   gfc_add_modify (&block, tmp,
3635                                        fold_build2 (PLUS_EXPR,
3636                                                     gfc_array_index_type,
3637                                                     span, gfc_index_one_node));
3638                   tmp = gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]);
3639                   gfc_add_modify (&block, tmp, gfc_index_one_node);
3640                 }
3641               tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
3642                                  gfc_conv_descriptor_lbound (dest,
3643                                                              gfc_rank_cst[n]),
3644                                  gfc_conv_descriptor_stride (dest,
3645                                                              gfc_rank_cst[n]));
3646               gfc_add_modify (&block, tmp2, tmp);
3647               tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
3648               gfc_add_modify (&block, offset, tmp);
3649             }
3650
3651           if (expr->expr_type == EXPR_FUNCTION
3652                 && expr->value.function.isym
3653                 && expr->value.function.isym->conversion
3654                 && expr->value.function.actual->expr
3655                 && expr->value.function.actual->expr->expr_type
3656                                                 == EXPR_VARIABLE)
3657             {
3658               /* If a conversion expression has a null data pointer
3659                  argument, nullify the allocatable component.  */
3660               gfc_symbol *s;
3661               tree non_null_expr;
3662               tree null_expr;
3663               s = expr->value.function.actual->expr->symtree->n.sym;
3664               if (s->attr.allocatable || s->attr.pointer)
3665                 {
3666                   non_null_expr = gfc_finish_block (&block);
3667                   gfc_start_block (&block);
3668                   gfc_conv_descriptor_data_set (&block, dest,
3669                                                 null_pointer_node);
3670                   null_expr = gfc_finish_block (&block);
3671                   tmp = gfc_conv_descriptor_data_get (s->backend_decl);
3672                   tmp = build2 (EQ_EXPR, boolean_type_node, tmp,
3673                                 fold_convert (TREE_TYPE (tmp),
3674                                               null_pointer_node));
3675                   return build3_v (COND_EXPR, tmp, null_expr,
3676                                    non_null_expr);
3677                 }
3678             }
3679         }
3680       else
3681         {
3682           tmp = gfc_trans_subarray_assign (dest, cm, expr);
3683           gfc_add_expr_to_block (&block, tmp);
3684         }
3685     }
3686   else if (expr->ts.type == BT_DERIVED)
3687     {
3688       if (expr->expr_type != EXPR_STRUCTURE)
3689         {
3690           gfc_init_se (&se, NULL);
3691           gfc_conv_expr (&se, expr);
3692           gfc_add_block_to_block (&block, &se.pre);
3693           gfc_add_modify (&block, dest,
3694                                fold_convert (TREE_TYPE (dest), se.expr));
3695           gfc_add_block_to_block (&block, &se.post);
3696         }
3697       else
3698         {
3699           /* Nested constructors.  */
3700           tmp = gfc_trans_structure_assign (dest, expr);
3701           gfc_add_expr_to_block (&block, tmp);
3702         }
3703     }
3704   else
3705     {
3706       /* Scalar component.  */
3707       gfc_init_se (&se, NULL);
3708       gfc_init_se (&lse, NULL);
3709
3710       gfc_conv_expr (&se, expr);
3711       if (cm->ts.type == BT_CHARACTER)
3712         lse.string_length = cm->ts.cl->backend_decl;
3713       lse.expr = dest;
3714       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
3715       gfc_add_expr_to_block (&block, tmp);
3716     }
3717   return gfc_finish_block (&block);
3718 }
3719
3720 /* Assign a derived type constructor to a variable.  */
3721
3722 static tree
3723 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
3724 {
3725   gfc_constructor *c;
3726   gfc_component *cm;
3727   stmtblock_t block;
3728   tree field;
3729   tree tmp;
3730
3731   gfc_start_block (&block);
3732   cm = expr->ts.derived->components;
3733   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3734     {
3735       /* Skip absent members in default initializers.  */
3736       if (!c->expr)
3737         continue;
3738
3739       field = cm->backend_decl;
3740       tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
3741                          dest, field, NULL_TREE);
3742       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
3743       gfc_add_expr_to_block (&block, tmp);
3744     }
3745   return gfc_finish_block (&block);
3746 }
3747
3748 /* Build an expression for a constructor. If init is nonzero then
3749    this is part of a static variable initializer.  */
3750
3751 void
3752 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
3753 {
3754   gfc_constructor *c;
3755   gfc_component *cm;
3756   tree val;
3757   tree type;
3758   tree tmp;
3759   VEC(constructor_elt,gc) *v = NULL;
3760
3761   gcc_assert (se->ss == NULL);
3762   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
3763   type = gfc_typenode_for_spec (&expr->ts);
3764
3765   if (!init)
3766     {
3767       /* Create a temporary variable and fill it in.  */
3768       se->expr = gfc_create_var (type, expr->ts.derived->name);
3769       tmp = gfc_trans_structure_assign (se->expr, expr);
3770       gfc_add_expr_to_block (&se->pre, tmp);
3771       return;
3772     }
3773
3774   cm = expr->ts.derived->components;
3775
3776   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3777     {
3778       /* Skip absent members in default initializers and allocatable
3779          components.  Although the latter have a default initializer
3780          of EXPR_NULL,... by default, the static nullify is not needed
3781          since this is done every time we come into scope.  */
3782       if (!c->expr || cm->attr.allocatable)
3783         continue;
3784
3785       val = gfc_conv_initializer (c->expr, &cm->ts,
3786           TREE_TYPE (cm->backend_decl), cm->attr.dimension, cm->attr.pointer);
3787
3788       /* Append it to the constructor list.  */
3789       CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
3790     }
3791   se->expr = build_constructor (type, v);
3792   if (init) 
3793     TREE_CONSTANT (se->expr) = 1;
3794 }
3795
3796
3797 /* Translate a substring expression.  */
3798
3799 static void
3800 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
3801 {
3802   gfc_ref *ref;
3803
3804   ref = expr->ref;
3805
3806   gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
3807
3808   se->expr = gfc_build_wide_string_const (expr->ts.kind,
3809                                           expr->value.character.length,
3810                                           expr->value.character.string);
3811
3812   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
3813   TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
3814
3815   if (ref)
3816     gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
3817 }
3818
3819
3820 /* Entry point for expression translation.  Evaluates a scalar quantity.
3821    EXPR is the expression to be translated, and SE is the state structure if
3822    called from within the scalarized.  */
3823
3824 void
3825 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
3826 {
3827   if (se->ss && se->ss->expr == expr
3828       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
3829     {
3830       /* Substitute a scalar expression evaluated outside the scalarization
3831          loop.  */
3832       se->expr = se->ss->data.scalar.expr;
3833       se->string_length = se->ss->string_length;
3834       gfc_advance_se_ss_chain (se);
3835       return;
3836     }
3837
3838   /* We need to convert the expressions for the iso_c_binding derived types.
3839      C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
3840      null_pointer_node.  C_PTR and C_FUNPTR are converted to match the
3841      typespec for the C_PTR and C_FUNPTR symbols, which has already been
3842      updated to be an integer with a kind equal to the size of a (void *).  */
3843   if (expr->ts.type == BT_DERIVED && expr->ts.derived
3844       && expr->ts.derived->attr.is_iso_c)
3845     {
3846       if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
3847           || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR)
3848         {
3849           /* Set expr_type to EXPR_NULL, which will result in
3850              null_pointer_node being used below.  */
3851           expr->expr_type = EXPR_NULL;
3852         }
3853       else
3854         {
3855           /* Update the type/kind of the expression to be what the new
3856              type/kind are for the updated symbols of C_PTR/C_FUNPTR.  */
3857           expr->ts.type = expr->ts.derived->ts.type;
3858           expr->ts.f90_type = expr->ts.derived->ts.f90_type;
3859           expr->ts.kind = expr->ts.derived->ts.kind;
3860         }
3861     }
3862   
3863   switch (expr->expr_type)
3864     {
3865     case EXPR_OP:
3866       gfc_conv_expr_op (se, expr);
3867       break;
3868
3869     case EXPR_FUNCTION:
3870       gfc_conv_function_expr (se, expr);
3871       break;
3872
3873     case EXPR_CONSTANT:
3874       gfc_conv_constant (se, expr);
3875       break;
3876
3877     case EXPR_VARIABLE:
3878       gfc_conv_variable (se, expr);
3879       break;
3880
3881     case EXPR_NULL:
3882       se->expr = null_pointer_node;
3883       break;
3884
3885     case EXPR_SUBSTRING:
3886       gfc_conv_substring_expr (se, expr);
3887       break;
3888
3889     case EXPR_STRUCTURE:
3890       gfc_conv_structure (se, expr, 0);
3891       break;
3892
3893     case EXPR_ARRAY:
3894       gfc_conv_array_constructor_expr (se, expr);
3895       break;
3896
3897     default:
3898       gcc_unreachable ();
3899       break;
3900     }
3901 }
3902
3903 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
3904    of an assignment.  */
3905 void
3906 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
3907 {
3908   gfc_conv_expr (se, expr);
3909   /* All numeric lvalues should have empty post chains.  If not we need to
3910      figure out a way of rewriting an lvalue so that it has no post chain.  */
3911   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
3912 }
3913
3914 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
3915    numeric expressions.  Used for scalar values where inserting cleanup code
3916    is inconvenient.  */
3917 void
3918 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
3919 {
3920   tree val;
3921
3922   gcc_assert (expr->ts.type != BT_CHARACTER);
3923   gfc_conv_expr (se, expr);
3924   if (se->post.head)
3925     {
3926       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
3927       gfc_add_modify (&se->pre, val, se->expr);
3928       se->expr = val;
3929       gfc_add_block_to_block (&se->pre, &se->post);
3930     }
3931 }
3932
3933 /* Helper to translate an expression and convert it to a particular type.  */
3934 void
3935 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
3936 {
3937   gfc_conv_expr_val (se, expr);
3938   se->expr = convert (type, se->expr);
3939 }
3940
3941
3942 /* Converts an expression so that it can be passed by reference.  Scalar
3943    values only.  */
3944
3945 void
3946 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
3947 {
3948   tree var;
3949
3950   if (se->ss && se->ss->expr == expr
3951       && se->ss->type == GFC_SS_REFERENCE)
3952     {
3953       se->expr = se->ss->data.scalar.expr;
3954       se->string_length = se->ss->string_length;
3955       gfc_advance_se_ss_chain (se);
3956       return;
3957     }
3958
3959   if (expr->ts.type == BT_CHARACTER)
3960     {
3961       gfc_conv_expr (se, expr);
3962       gfc_conv_string_parameter (se);
3963       return;
3964     }
3965
3966   if (expr->expr_type == EXPR_VARIABLE)
3967     {
3968       se->want_pointer = 1;
3969       gfc_conv_expr (se, expr);
3970       if (se->post.head)
3971         {
3972           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3973           gfc_add_modify (&se->pre, var, se->expr);
3974           gfc_add_block_to_block (&se->pre, &se->post);
3975           se->expr = var;
3976         }
3977       return;
3978     }
3979
3980   if (expr->expr_type == EXPR_FUNCTION
3981         && expr->symtree->n.sym->attr.pointer
3982         && !expr->symtree->n.sym->attr.dimension)
3983     {
3984       se->want_pointer = 1;
3985       gfc_conv_expr (se, expr);
3986       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3987       gfc_add_modify (&se->pre, var, se->expr);
3988       se->expr = var;
3989       return;
3990     }
3991
3992
3993   gfc_conv_expr (se, expr);
3994
3995   /* Create a temporary var to hold the value.  */
3996   if (TREE_CONSTANT (se->expr))
3997     {
3998       tree tmp = se->expr;
3999       STRIP_TYPE_NOPS (tmp);
4000       var = build_decl (CONST_DECL, NULL, TREE_TYPE (tmp));
4001       DECL_INITIAL (var) = tmp;
4002       TREE_STATIC (var) = 1;
4003       pushdecl (var);
4004     }
4005   else
4006     {
4007       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4008       gfc_add_modify (&se->pre, var, se->expr);
4009     }
4010   gfc_add_block_to_block (&se->pre, &se->post);
4011
4012   /* Take the address of that value.  */
4013   se->expr = build_fold_addr_expr (var);
4014 }
4015
4016
4017 tree
4018 gfc_trans_pointer_assign (gfc_code * code)
4019 {
4020   return gfc_trans_pointer_assignment (code->expr, code->expr2);
4021 }
4022
4023
4024 /* Generate code for a pointer assignment.  */
4025
4026 tree
4027 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
4028 {
4029   gfc_se lse;
4030   gfc_se rse;
4031   gfc_ss *lss;
4032   gfc_ss *rss;
4033   stmtblock_t block;
4034   tree desc;
4035   tree tmp;
4036   tree decl;
4037
4038   gfc_start_block (&block);
4039
4040   gfc_init_se (&lse, NULL);
4041
4042   lss = gfc_walk_expr (expr1);
4043   rss = gfc_walk_expr (expr2);
4044   if (lss == gfc_ss_terminator)
4045     {
4046       /* Scalar pointers.  */
4047       lse.want_pointer = 1;
4048       gfc_conv_expr (&lse, expr1);
4049       gcc_assert (rss == gfc_ss_terminator);
4050       gfc_init_se (&rse, NULL);
4051       rse.want_pointer = 1;
4052       gfc_conv_expr (&rse, expr2);
4053
4054       if (expr1->symtree->n.sym->attr.proc_pointer
4055           && expr1->symtree->n.sym->attr.dummy)
4056         lse.expr = build_fold_indirect_ref (lse.expr);
4057
4058       gfc_add_block_to_block (&block, &lse.pre);
4059       gfc_add_block_to_block (&block, &rse.pre);
4060
4061       /* Check character lengths if character expression.  The test is only
4062          really added if -fbounds-check is enabled.  */
4063       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4064         {
4065           gcc_assert (expr2->ts.type == BT_CHARACTER);
4066           gcc_assert (lse.string_length && rse.string_length);
4067           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4068                                        lse.string_length, rse.string_length,
4069                                        &block);
4070         }
4071
4072       gfc_add_modify (&block, lse.expr,
4073                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
4074
4075       gfc_add_block_to_block (&block, &rse.post);
4076       gfc_add_block_to_block (&block, &lse.post);
4077     }
4078   else
4079     {
4080       tree strlen_lhs;
4081       tree strlen_rhs = NULL_TREE;
4082
4083       /* Array pointer.  */
4084       gfc_conv_expr_descriptor (&lse, expr1, lss);
4085       strlen_lhs = lse.string_length;
4086       switch (expr2->expr_type)
4087         {
4088         case EXPR_NULL:
4089           /* Just set the data pointer to null.  */
4090           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
4091           break;
4092
4093         case EXPR_VARIABLE:
4094           /* Assign directly to the pointer's descriptor.  */
4095           lse.direct_byref = 1;
4096           gfc_conv_expr_descriptor (&lse, expr2, rss);
4097           strlen_rhs = lse.string_length;
4098
4099           /* If this is a subreference array pointer assignment, use the rhs
4100              descriptor element size for the lhs span.  */
4101           if (expr1->symtree->n.sym->attr.subref_array_pointer)
4102             {
4103               decl = expr1->symtree->n.sym->backend_decl;
4104               gfc_init_se (&rse, NULL);
4105               rse.descriptor_only = 1;
4106               gfc_conv_expr (&rse, expr2);
4107               tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
4108               tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
4109               if (!INTEGER_CST_P (tmp))
4110                 gfc_add_block_to_block (&lse.post, &rse.pre);
4111               gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
4112             }
4113
4114           break;
4115
4116         default:
4117           /* Assign to a temporary descriptor and then copy that
4118              temporary to the pointer.  */
4119           desc = lse.expr;
4120           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
4121
4122           lse.expr = tmp;
4123           lse.direct_byref = 1;
4124           gfc_conv_expr_descriptor (&lse, expr2, rss);
4125           strlen_rhs = lse.string_length;
4126           gfc_add_modify (&lse.pre, desc, tmp);
4127           break;
4128         }
4129
4130       gfc_add_block_to_block (&block, &lse.pre);
4131
4132       /* Check string lengths if applicable.  The check is only really added
4133          to the output code if -fbounds-check is enabled.  */
4134       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4135         {
4136           gcc_assert (expr2->ts.type == BT_CHARACTER);
4137           gcc_assert (strlen_lhs && strlen_rhs);
4138           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4139                                        strlen_lhs, strlen_rhs, &block);
4140         }
4141
4142       gfc_add_block_to_block (&block, &lse.post);
4143     }
4144   return gfc_finish_block (&block);
4145 }
4146
4147
4148 /* Makes sure se is suitable for passing as a function string parameter.  */
4149 /* TODO: Need to check all callers of this function.  It may be abused.  */
4150
4151 void
4152 gfc_conv_string_parameter (gfc_se * se)
4153 {
4154   tree type;
4155
4156   if (TREE_CODE (se->expr) == STRING_CST)
4157     {
4158       type = TREE_TYPE (TREE_TYPE (se->expr));
4159       se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4160       return;
4161     }
4162
4163   if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
4164     {
4165       if (TREE_CODE (se->expr) != INDIRECT_REF)
4166         {
4167           type = TREE_TYPE (se->expr);
4168           se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4169         }
4170       else
4171         {
4172           type = gfc_get_character_type_len (gfc_default_character_kind,
4173                                              se->string_length);
4174           type = build_pointer_type (type);
4175           se->expr = gfc_build_addr_expr (type, se->expr);
4176         }
4177     }
4178
4179   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
4180   gcc_assert (se->string_length
4181           && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
4182 }
4183
4184
4185 /* Generate code for assignment of scalar variables.  Includes character
4186    strings and derived types with allocatable components.  */
4187
4188 tree
4189 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
4190                          bool l_is_temp, bool r_is_var)
4191 {
4192   stmtblock_t block;
4193   tree tmp;
4194   tree cond;
4195
4196   gfc_init_block (&block);
4197
4198   if (ts.type == BT_CHARACTER)
4199     {
4200       tree rlen = NULL;
4201       tree llen = NULL;
4202
4203       if (lse->string_length != NULL_TREE)
4204         {
4205           gfc_conv_string_parameter (lse);
4206           gfc_add_block_to_block (&block, &lse->pre);
4207           llen = lse->string_length;
4208         }
4209
4210       if (rse->string_length != NULL_TREE)
4211         {
4212           gcc_assert (rse->string_length != NULL_TREE);
4213           gfc_conv_string_parameter (rse);
4214           gfc_add_block_to_block (&block, &rse->pre);
4215           rlen = rse->string_length;
4216         }
4217
4218       gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
4219                              rse->expr, ts.kind);
4220     }
4221   else if (ts.type == BT_DERIVED && ts.derived->attr.alloc_comp)
4222     {
4223       cond = NULL_TREE;
4224         
4225       /* Are the rhs and the lhs the same?  */
4226       if (r_is_var)
4227         {
4228           cond = fold_build2 (EQ_EXPR, boolean_type_node,
4229                               build_fold_addr_expr (lse->expr),
4230                               build_fold_addr_expr (rse->expr));
4231           cond = gfc_evaluate_now (cond, &lse->pre);
4232         }
4233
4234       /* Deallocate the lhs allocated components as long as it is not
4235          the same as the rhs.  This must be done following the assignment
4236          to prevent deallocating data that could be used in the rhs
4237          expression.  */
4238       if (!l_is_temp)
4239         {
4240           tmp = gfc_evaluate_now (lse->expr, &lse->pre);
4241           tmp = gfc_deallocate_alloc_comp (ts.derived, tmp, 0);
4242           if (r_is_var)
4243             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
4244           gfc_add_expr_to_block (&lse->post, tmp);
4245         }
4246
4247       gfc_add_block_to_block (&block, &rse->pre);
4248       gfc_add_block_to_block (&block, &lse->pre);
4249
4250       gfc_add_modify (&block, lse->expr,
4251                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
4252
4253       /* Do a deep copy if the rhs is a variable, if it is not the
4254          same as the lhs.  */
4255       if (r_is_var)
4256         {
4257           tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
4258           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
4259           gfc_add_expr_to_block (&block, tmp);
4260         }
4261     }
4262   else
4263     {
4264       gfc_add_block_to_block (&block, &lse->pre);
4265       gfc_add_block_to_block (&block, &rse->pre);
4266
4267       gfc_add_modify (&block, lse->expr,
4268                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
4269     }
4270
4271   gfc_add_block_to_block (&block, &lse->post);
4272   gfc_add_block_to_block (&block, &rse->post);
4273
4274   return gfc_finish_block (&block);
4275 }
4276
4277
4278 /* Try to translate array(:) = func (...), where func is a transformational
4279    array function, without using a temporary.  Returns NULL is this isn't the
4280    case.  */
4281
4282 static tree
4283 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
4284 {
4285   gfc_se se;
4286   gfc_ss *ss;
4287   gfc_ref * ref;
4288   bool seen_array_ref;
4289
4290   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
4291   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
4292     return NULL;
4293
4294   /* Elemental functions don't need a temporary anyway.  */
4295   if (expr2->value.function.esym != NULL
4296       && expr2->value.function.esym->attr.elemental)
4297     return NULL;
4298
4299   /* Fail if EXPR1 can't be expressed as a descriptor.  */
4300   if (gfc_ref_needs_temporary_p (expr1->ref))
4301     return NULL;
4302
4303   /* Functions returning pointers need temporaries.  */
4304   if (expr2->symtree->n.sym->attr.pointer 
4305       || expr2->symtree->n.sym->attr.allocatable)
4306     return NULL;
4307
4308   /* Character array functions need temporaries unless the
4309      character lengths are the same.  */
4310   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
4311     {
4312       if (expr1->ts.cl->length == NULL
4313             || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
4314         return NULL;
4315
4316       if (expr2->ts.cl->length == NULL
4317             || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
4318         return NULL;
4319
4320       if (mpz_cmp (expr1->ts.cl->length->value.integer,
4321                      expr2->ts.cl->length->value.integer) != 0)
4322         return NULL;
4323     }
4324
4325   /* Check that no LHS component references appear during an array
4326      reference. This is needed because we do not have the means to
4327      span any arbitrary stride with an array descriptor. This check
4328      is not needed for the rhs because the function result has to be
4329      a complete type.  */
4330   seen_array_ref = false;
4331   for (ref = expr1->ref; ref; ref = ref->next)
4332     {
4333       if (ref->type == REF_ARRAY)
4334         seen_array_ref= true;
4335       else if (ref->type == REF_COMPONENT && seen_array_ref)
4336         return NULL;
4337     }
4338
4339   /* Check for a dependency.  */
4340   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
4341                                    expr2->value.function.esym,
4342                                    expr2->value.function.actual,
4343                                    NOT_ELEMENTAL))
4344     return NULL;
4345
4346   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
4347      functions.  */
4348   gcc_assert (expr2->value.function.isym
4349               || (gfc_return_by_reference (expr2->value.function.esym)
4350               && expr2->value.function.esym->result->attr.dimension));
4351
4352   ss = gfc_walk_expr (expr1);
4353   gcc_assert (ss != gfc_ss_terminator);
4354   gfc_init_se (&se, NULL);
4355   gfc_start_block (&se.pre);
4356   se.want_pointer = 1;
4357
4358   gfc_conv_array_parameter (&se, expr1, ss, 0, NULL, NULL);
4359
4360   se.direct_byref = 1;
4361   se.ss = gfc_walk_expr (expr2);
4362   gcc_assert (se.ss != gfc_ss_terminator);
4363   gfc_conv_function_expr (&se, expr2);
4364   gfc_add_block_to_block (&se.pre, &se.post);
4365
4366   return gfc_finish_block (&se.pre);
4367 }
4368
4369 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
4370
4371 static bool
4372 is_zero_initializer_p (gfc_expr * expr)
4373 {
4374   if (expr->expr_type != EXPR_CONSTANT)
4375     return false;
4376
4377   /* We ignore constants with prescribed memory representations for now.  */
4378   if (expr->representation.string)
4379     return false;
4380
4381   switch (expr->ts.type)
4382     {
4383     case BT_INTEGER:
4384       return mpz_cmp_si (expr->value.integer, 0) == 0;
4385
4386     case BT_REAL:
4387       return mpfr_zero_p (expr->value.real)
4388              && MPFR_SIGN (expr->value.real) >= 0;
4389
4390     case BT_LOGICAL:
4391       return expr->value.logical == 0;
4392
4393     case BT_COMPLEX:
4394       return mpfr_zero_p (expr->value.complex.r)
4395              && MPFR_SIGN (expr->value.complex.r) >= 0
4396              && mpfr_zero_p (expr->value.complex.i)
4397              && MPFR_SIGN (expr->value.complex.i) >= 0;
4398
4399     default:
4400       break;
4401     }
4402   return false;
4403 }
4404
4405 /* Try to efficiently translate array(:) = 0.  Return NULL if this
4406    can't be done.  */
4407
4408 static tree
4409 gfc_trans_zero_assign (gfc_expr * expr)
4410 {
4411   tree dest, len, type;
4412   tree tmp;
4413   gfc_symbol *sym;
4414
4415   sym = expr->symtree->n.sym;
4416   dest = gfc_get_symbol_decl (sym);
4417
4418   type = TREE_TYPE (dest);
4419   if (POINTER_TYPE_P (type))
4420     type = TREE_TYPE (type);
4421   if (!GFC_ARRAY_TYPE_P (type))
4422     return NULL_TREE;
4423
4424   /* Determine the length of the array.  */
4425   len = GFC_TYPE_ARRAY_SIZE (type);
4426   if (!len || TREE_CODE (len) != INTEGER_CST)
4427     return NULL_TREE;
4428
4429   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
4430   len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4431                      fold_convert (gfc_array_index_type, tmp));
4432
4433   /* Convert arguments to the correct types.  */
4434   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
4435     dest = gfc_build_addr_expr (pvoid_type_node, dest);
4436   else
4437     dest = fold_convert (pvoid_type_node, dest);
4438   len = fold_convert (size_type_node, len);
4439
4440   /* Construct call to __builtin_memset.  */
4441   tmp = build_call_expr (built_in_decls[BUILT_IN_MEMSET],
4442                          3, dest, integer_zero_node, len);
4443   return fold_convert (void_type_node, tmp);
4444 }
4445
4446
4447 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
4448    that constructs the call to __builtin_memcpy.  */
4449
4450 tree
4451 gfc_build_memcpy_call (tree dst, tree src, tree len)
4452 {
4453   tree tmp;
4454
4455   /* Convert arguments to the correct types.  */
4456   if (!POINTER_TYPE_P (TREE_TYPE (dst)))
4457     dst = gfc_build_addr_expr (pvoid_type_node, dst);
4458   else
4459     dst = fold_convert (pvoid_type_node, dst);
4460
4461   if (!POINTER_TYPE_P (TREE_TYPE (src)))
4462     src = gfc_build_addr_expr (pvoid_type_node, src);
4463   else
4464     src = fold_convert (pvoid_type_node, src);
4465
4466   len = fold_convert (size_type_node, len);
4467
4468   /* Construct call to __builtin_memcpy.  */
4469   tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
4470   return fold_convert (void_type_node, tmp);
4471 }
4472
4473
4474 /* Try to efficiently translate dst(:) = src(:).  Return NULL if this
4475    can't be done.  EXPR1 is the destination/lhs and EXPR2 is the
4476    source/rhs, both are gfc_full_array_ref_p which have been checked for
4477    dependencies.  */
4478
4479 static tree
4480 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
4481 {
4482   tree dst, dlen, dtype;
4483   tree src, slen, stype;
4484   tree tmp;
4485
4486   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4487   src = gfc_get_symbol_decl (expr2->symtree->n.sym);
4488
4489   dtype = TREE_TYPE (dst);
4490   if (POINTER_TYPE_P (dtype))
4491     dtype = TREE_TYPE (dtype);
4492   stype = TREE_TYPE (src);
4493   if (POINTER_TYPE_P (stype))
4494     stype = TREE_TYPE (stype);
4495
4496   if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
4497     return NULL_TREE;
4498
4499   /* Determine the lengths of the arrays.  */
4500   dlen = GFC_TYPE_ARRAY_SIZE (dtype);
4501   if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
4502     return NULL_TREE;
4503   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4504   dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen,
4505                       fold_convert (gfc_array_index_type, tmp));
4506
4507   slen = GFC_TYPE_ARRAY_SIZE (stype);
4508   if (!slen || TREE_CODE (slen) != INTEGER_CST)
4509     return NULL_TREE;
4510   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
4511   slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen,
4512                       fold_convert (gfc_array_index_type, tmp));
4513
4514   /* Sanity check that they are the same.  This should always be
4515      the case, as we should already have checked for conformance.  */
4516   if (!tree_int_cst_equal (slen, dlen))
4517     return NULL_TREE;
4518
4519   return gfc_build_memcpy_call (dst, src, dlen);
4520 }
4521
4522
4523 /* Try to efficiently translate array(:) = (/ ... /).  Return NULL if
4524    this can't be done.  EXPR1 is the destination/lhs for which
4525    gfc_full_array_ref_p is true, and EXPR2 is the source/rhs.  */
4526
4527 static tree
4528 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
4529 {
4530   unsigned HOST_WIDE_INT nelem;
4531   tree dst, dtype;
4532   tree src, stype;
4533   tree len;
4534   tree tmp;
4535
4536   nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
4537   if (nelem == 0)
4538     return NULL_TREE;
4539
4540   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4541   dtype = TREE_TYPE (dst);
4542   if (POINTER_TYPE_P (dtype))
4543     dtype = TREE_TYPE (dtype);
4544   if (!GFC_ARRAY_TYPE_P (dtype))
4545     return NULL_TREE;
4546
4547   /* Determine the lengths of the array.  */
4548   len = GFC_TYPE_ARRAY_SIZE (dtype);
4549   if (!len || TREE_CODE (len) != INTEGER_CST)
4550     return NULL_TREE;
4551
4552   /* Confirm that the constructor is the same size.  */
4553   if (compare_tree_int (len, nelem) != 0)
4554     return NULL_TREE;
4555
4556   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4557   len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4558                      fold_convert (gfc_array_index_type, tmp));
4559
4560   stype = gfc_typenode_for_spec (&expr2->ts);
4561   src = gfc_build_constant_array_constructor (expr2, stype);
4562
4563   stype = TREE_TYPE (src);
4564   if (POINTER_TYPE_P (stype))
4565     stype = TREE_TYPE (stype);
4566
4567   return gfc_build_memcpy_call (dst, src, len);
4568 }
4569
4570
4571 /* Subroutine of gfc_trans_assignment that actually scalarizes the
4572    assignment.  EXPR1 is the destination/RHS and EXPR2 is the source/LHS.  */
4573
4574 static tree
4575 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4576 {
4577   gfc_se lse;
4578   gfc_se rse;
4579   gfc_ss *lss;
4580   gfc_ss *lss_section;
4581   gfc_ss *rss;
4582   gfc_loopinfo loop;
4583   tree tmp;
4584   stmtblock_t block;
4585   stmtblock_t body;
4586   bool l_is_temp;
4587   bool scalar_to_array;
4588
4589   /* Assignment of the form lhs = rhs.  */
4590   gfc_start_block (&block);
4591
4592   gfc_init_se (&lse, NULL);
4593   gfc_init_se (&rse, NULL);
4594
4595   /* Walk the lhs.  */
4596   lss = gfc_walk_expr (expr1);
4597   rss = NULL;
4598   if (lss != gfc_ss_terminator)
4599     {
4600       /* The assignment needs scalarization.  */
4601       lss_section = lss;
4602
4603       /* Find a non-scalar SS from the lhs.  */
4604       while (lss_section != gfc_ss_terminator
4605              && lss_section->type != GFC_SS_SECTION)
4606         lss_section = lss_section->next;
4607
4608       gcc_assert (lss_section != gfc_ss_terminator);
4609
4610       /* Initialize the scalarizer.  */
4611       gfc_init_loopinfo (&loop);
4612
4613       /* Walk the rhs.  */
4614       rss = gfc_walk_expr (expr2);
4615       if (rss == gfc_ss_terminator)
4616         {
4617           /* The rhs is scalar.  Add a ss for the expression.  */
4618           rss = gfc_get_ss ();
4619           rss->next = gfc_ss_terminator;
4620           rss->type = GFC_SS_SCALAR;
4621           rss->expr = expr2;
4622         }
4623       /* Associate the SS with the loop.  */
4624       gfc_add_ss_to_loop (&loop, lss);
4625       gfc_add_ss_to_loop (&loop, rss);
4626
4627       /* Calculate the bounds of the scalarization.  */
4628       gfc_conv_ss_startstride (&loop);
4629       /* Resolve any data dependencies in the statement.  */
4630       gfc_conv_resolve_dependencies (&loop, lss, rss);
4631       /* Setup the scalarizing loops.  */
4632       gfc_conv_loop_setup (&loop, &expr2->where);
4633
4634       /* Setup the gfc_se structures.  */
4635       gfc_copy_loopinfo_to_se (&lse, &loop);
4636       gfc_copy_loopinfo_to_se (&rse, &loop);
4637
4638       rse.ss = rss;
4639       gfc_mark_ss_chain_used (rss, 1);
4640       if (loop.temp_ss == NULL)
4641         {
4642           lse.ss = lss;
4643           gfc_mark_ss_chain_used (lss, 1);
4644         }
4645       else
4646         {
4647           lse.ss = loop.temp_ss;
4648           gfc_mark_ss_chain_used (lss, 3);
4649           gfc_mark_ss_chain_used (loop.temp_ss, 3);
4650         }
4651
4652       /* Start the scalarized loop body.  */
4653       gfc_start_scalarized_body (&loop, &body);
4654     }
4655   else
4656     gfc_init_block (&body);
4657
4658   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
4659
4660   /* Translate the expression.  */
4661   gfc_conv_expr (&rse, expr2);
4662
4663   if (l_is_temp)
4664     {
4665       gfc_conv_tmp_array_ref (&lse);
4666       gfc_advance_se_ss_chain (&lse);
4667     }
4668   else
4669     gfc_conv_expr (&lse, expr1);
4670
4671   /* Assignments of scalar derived types with allocatable components
4672      to arrays must be done with a deep copy and the rhs temporary
4673      must have its components deallocated afterwards.  */
4674   scalar_to_array = (expr2->ts.type == BT_DERIVED
4675                        && expr2->ts.derived->attr.alloc_comp
4676                        && expr2->expr_type != EXPR_VARIABLE
4677                        && !gfc_is_constant_expr (expr2)
4678                        && expr1->rank && !expr2->rank);
4679   if (scalar_to_array)
4680     {
4681       tmp = gfc_deallocate_alloc_comp (expr2->ts.derived, rse.expr, 0);
4682       gfc_add_expr_to_block (&loop.post, tmp);
4683     }
4684
4685   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4686                                  l_is_temp || init_flag,
4687                                  (expr2->expr_type == EXPR_VARIABLE)
4688                                     || scalar_to_array);
4689   gfc_add_expr_to_block (&body, tmp);
4690
4691   if (lss == gfc_ss_terminator)
4692     {
4693       /* Use the scalar assignment as is.  */
4694       gfc_add_block_to_block (&block, &body);
4695     }
4696   else
4697     {
4698       gcc_assert (lse.ss == gfc_ss_terminator
4699                   && rse.ss == gfc_ss_terminator);
4700
4701       if (l_is_temp)
4702         {
4703           gfc_trans_scalarized_loop_boundary (&loop, &body);
4704
4705           /* We need to copy the temporary to the actual lhs.  */
4706           gfc_init_se (&lse, NULL);
4707           gfc_init_se (&rse, NULL);
4708           gfc_copy_loopinfo_to_se (&lse, &loop);
4709           gfc_copy_loopinfo_to_se (&rse, &loop);
4710
4711           rse.ss = loop.temp_ss;
4712           lse.ss = lss;
4713
4714           gfc_conv_tmp_array_ref (&rse);
4715           gfc_advance_se_ss_chain (&rse);
4716           gfc_conv_expr (&lse, expr1);
4717
4718           gcc_assert (lse.ss == gfc_ss_terminator
4719                       && rse.ss == gfc_ss_terminator);
4720
4721           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4722                                          false, false);
4723           gfc_add_expr_to_block (&body, tmp);
4724         }
4725
4726       /* Generate the copying loops.  */
4727       gfc_trans_scalarizing_loops (&loop, &body);
4728
4729       /* Wrap the whole thing up.  */
4730       gfc_add_block_to_block (&block, &loop.pre);
4731       gfc_add_block_to_block (&block, &loop.post);
4732
4733       gfc_cleanup_loop (&loop);
4734     }
4735
4736   return gfc_finish_block (&block);
4737 }
4738
4739
4740 /* Check whether EXPR is a copyable array.  */
4741
4742 static bool
4743 copyable_array_p (gfc_expr * expr)
4744 {
4745   if (expr->expr_type != EXPR_VARIABLE)
4746     return false;
4747
4748   /* First check it's an array.  */
4749   if (expr->rank < 1 || !expr->ref || expr->ref->next)
4750     return false;
4751
4752   if (!gfc_full_array_ref_p (expr->ref))
4753     return false;
4754
4755   /* Next check that it's of a simple enough type.  */
4756   switch (expr->ts.type)
4757     {
4758     case BT_INTEGER:
4759     case BT_REAL:
4760     case BT_COMPLEX:
4761     case BT_LOGICAL:
4762       return true;
4763
4764     case BT_CHARACTER:
4765       return false;
4766
4767     case BT_DERIVED:
4768       return !expr->ts.derived->attr.alloc_comp;
4769
4770     default:
4771       break;
4772     }
4773
4774   return false;
4775 }
4776
4777 /* Translate an assignment.  */
4778
4779 tree
4780 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4781 {
4782   tree tmp;
4783
4784   /* Special case a single function returning an array.  */
4785   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
4786     {
4787       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
4788       if (tmp)
4789         return tmp;
4790     }
4791
4792   /* Special case assigning an array to zero.  */
4793   if (copyable_array_p (expr1)
4794       && is_zero_initializer_p (expr2))
4795     {
4796       tmp = gfc_trans_zero_assign (expr1);
4797       if (tmp)
4798         return tmp;
4799     }
4800
4801   /* Special case copying one array to another.  */
4802   if (copyable_array_p (expr1)
4803       && copyable_array_p (expr2)
4804       && gfc_compare_types (&expr1->ts, &expr2->ts)
4805       && !gfc_check_dependency (expr1, expr2, 0))
4806     {
4807       tmp = gfc_trans_array_copy (expr1, expr2);
4808       if (tmp)
4809         return tmp;
4810     }
4811
4812   /* Special case initializing an array from a constant array constructor.  */
4813   if (copyable_array_p (expr1)
4814       && expr2->expr_type == EXPR_ARRAY
4815       && gfc_compare_types (&expr1->ts, &expr2->ts))
4816     {
4817       tmp = gfc_trans_array_constructor_copy (expr1, expr2);
4818       if (tmp)
4819         return tmp;
4820     }
4821
4822   /* Fallback to the scalarizer to generate explicit loops.  */
4823   return gfc_trans_assignment_1 (expr1, expr2, init_flag);
4824 }
4825
4826 tree
4827 gfc_trans_init_assign (gfc_code * code)
4828 {
4829   return gfc_trans_assignment (code->expr, code->expr2, true);
4830 }
4831
4832 tree
4833 gfc_trans_assign (gfc_code * code)
4834 {
4835   return gfc_trans_assignment (code->expr, code->expr2, false);
4836 }