OSDN Git Service

2009-04-28 Paul Thomas <pault@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / trans-expr.c
1 /* Expression translation
2    Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 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 = gfc_build_addr_expr (NULL_TREE, 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 (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
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 = gfc_build_addr_expr (NULL_TREE, 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 = gfc_build_addr_expr (NULL_TREE, 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 = gfc_build_addr_expr (NULL_TREE, 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, gfc_build_addr_expr (NULL_TREE, lse->expr));
1551   args = gfc_chainon_list (args, gfc_build_addr_expr (NULL_TREE, 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 = gfc_build_addr_expr (NULL_TREE, 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 = gfc_build_addr_expr (NULL_TREE, 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 = gfc_build_addr_expr (NULL_TREE, 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           if (e->expr_type == EXPR_OP
2786                 && e->value.op.op == INTRINSIC_PARENTHESES
2787                 && e->value.op.op1->expr_type == EXPR_VARIABLE)
2788             {
2789               tree local_tmp;
2790               local_tmp = gfc_evaluate_now (tmp, &se->pre);
2791               local_tmp = gfc_copy_alloc_comp (e->ts.derived, local_tmp, tmp, parm_rank);
2792               gfc_add_expr_to_block (&se->post, local_tmp);
2793             }
2794
2795           tmp = gfc_deallocate_alloc_comp (e->ts.derived, tmp, parm_rank);
2796
2797           gfc_add_expr_to_block (&se->post, tmp);
2798         }
2799
2800       /* Character strings are passed as two parameters, a length and a
2801          pointer - except for Bind(c) which only passes the pointer.  */
2802       if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
2803         stringargs = gfc_chainon_list (stringargs, parmse.string_length);
2804
2805       arglist = gfc_chainon_list (arglist, parmse.expr);
2806     }
2807   gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
2808
2809   ts = sym->ts;
2810   if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
2811     se->string_length = build_int_cst (gfc_charlen_type_node, 1);
2812   else if (ts.type == BT_CHARACTER)
2813     {
2814       if (sym->ts.cl->length == NULL)
2815         {
2816           /* Assumed character length results are not allowed by 5.1.1.5 of the
2817              standard and are trapped in resolve.c; except in the case of SPREAD
2818              (and other intrinsics?) and dummy functions.  In the case of SPREAD,
2819              we take the character length of the first argument for the result.
2820              For dummies, we have to look through the formal argument list for
2821              this function and use the character length found there.*/
2822           if (!sym->attr.dummy)
2823             cl.backend_decl = TREE_VALUE (stringargs);
2824           else
2825             {
2826               formal = sym->ns->proc_name->formal;
2827               for (; formal; formal = formal->next)
2828                 if (strcmp (formal->sym->name, sym->name) == 0)
2829                   cl.backend_decl = formal->sym->ts.cl->backend_decl;
2830             }
2831         }
2832         else
2833         {
2834           tree tmp;
2835
2836           /* Calculate the length of the returned string.  */
2837           gfc_init_se (&parmse, NULL);
2838           if (need_interface_mapping)
2839             gfc_apply_interface_mapping (&mapping, &parmse, sym->ts.cl->length);
2840           else
2841             gfc_conv_expr (&parmse, sym->ts.cl->length);
2842           gfc_add_block_to_block (&se->pre, &parmse.pre);
2843           gfc_add_block_to_block (&se->post, &parmse.post);
2844           
2845           tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
2846           tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
2847                              build_int_cst (gfc_charlen_type_node, 0));
2848           cl.backend_decl = tmp;
2849         }
2850
2851       /* Set up a charlen structure for it.  */
2852       cl.next = NULL;
2853       cl.length = NULL;
2854       ts.cl = &cl;
2855
2856       len = cl.backend_decl;
2857     }
2858
2859   byref = gfc_return_by_reference (sym);
2860   if (byref)
2861     {
2862       if (se->direct_byref)
2863         {
2864           /* Sometimes, too much indirection can be applied; e.g. for
2865              function_result = array_valued_recursive_function.  */
2866           if (TREE_TYPE (TREE_TYPE (se->expr))
2867                 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
2868                 && GFC_DESCRIPTOR_TYPE_P
2869                         (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
2870             se->expr = build_fold_indirect_ref (se->expr);
2871
2872           retargs = gfc_chainon_list (retargs, se->expr);
2873         }
2874       else if (sym->result->attr.dimension)
2875         {
2876           gcc_assert (se->loop && info);
2877
2878           /* Set the type of the array.  */
2879           tmp = gfc_typenode_for_spec (&ts);
2880           info->dimen = se->loop->dimen;
2881
2882           /* Evaluate the bounds of the result, if known.  */
2883           gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
2884
2885           /* Create a temporary to store the result.  In case the function
2886              returns a pointer, the temporary will be a shallow copy and
2887              mustn't be deallocated.  */
2888           callee_alloc = sym->attr.allocatable || sym->attr.pointer;
2889           gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
2890                                        NULL_TREE, false, !sym->attr.pointer,
2891                                        callee_alloc, &se->ss->expr->where);
2892
2893           /* Pass the temporary as the first argument.  */
2894           tmp = info->descriptor;
2895           tmp = gfc_build_addr_expr (NULL_TREE, tmp);
2896           retargs = gfc_chainon_list (retargs, tmp);
2897         }
2898       else if (ts.type == BT_CHARACTER)
2899         {
2900           /* Pass the string length.  */
2901           type = gfc_get_character_type (ts.kind, ts.cl);
2902           type = build_pointer_type (type);
2903
2904           /* Return an address to a char[0:len-1]* temporary for
2905              character pointers.  */
2906           if (sym->attr.pointer || sym->attr.allocatable)
2907             {
2908               var = gfc_create_var (type, "pstr");
2909
2910               /* Provide an address expression for the function arguments.  */
2911               var = gfc_build_addr_expr (NULL_TREE, var);
2912             }
2913           else
2914             var = gfc_conv_string_tmp (se, type, len);
2915
2916           retargs = gfc_chainon_list (retargs, var);
2917         }
2918       else
2919         {
2920           gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
2921
2922           type = gfc_get_complex_type (ts.kind);
2923           var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
2924           retargs = gfc_chainon_list (retargs, var);
2925         }
2926
2927       /* Add the string length to the argument list.  */
2928       if (ts.type == BT_CHARACTER)
2929         retargs = gfc_chainon_list (retargs, len);
2930     }
2931   gfc_free_interface_mapping (&mapping);
2932
2933   /* Add the return arguments.  */
2934   arglist = chainon (retargs, arglist);
2935
2936   /* Add the hidden string length parameters to the arguments.  */
2937   arglist = chainon (arglist, stringargs);
2938
2939   /* We may want to append extra arguments here.  This is used e.g. for
2940      calls to libgfortran_matmul_??, which need extra information.  */
2941   if (append_args != NULL_TREE)
2942     arglist = chainon (arglist, append_args);
2943
2944   /* Generate the actual call.  */
2945   gfc_conv_function_val (se, sym);
2946
2947   /* If there are alternate return labels, function type should be
2948      integer.  Can't modify the type in place though, since it can be shared
2949      with other functions.  For dummy arguments, the typing is done to
2950      to this result, even if it has to be repeated for each call.  */
2951   if (has_alternate_specifier
2952       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
2953     {
2954       if (!sym->attr.dummy)
2955         {
2956           TREE_TYPE (sym->backend_decl)
2957                 = build_function_type (integer_type_node,
2958                       TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
2959           se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
2960         }
2961       else
2962         TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
2963     }
2964
2965   fntype = TREE_TYPE (TREE_TYPE (se->expr));
2966   se->expr = build_call_list (TREE_TYPE (fntype), se->expr, arglist);
2967
2968   /* If we have a pointer function, but we don't want a pointer, e.g.
2969      something like
2970         x = f()
2971      where f is pointer valued, we have to dereference the result.  */
2972   if (!se->want_pointer && !byref && sym->attr.pointer)
2973     se->expr = build_fold_indirect_ref (se->expr);
2974
2975   /* f2c calling conventions require a scalar default real function to
2976      return a double precision result.  Convert this back to default
2977      real.  We only care about the cases that can happen in Fortran 77.
2978   */
2979   if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
2980       && sym->ts.kind == gfc_default_real_kind
2981       && !sym->attr.always_explicit)
2982     se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
2983
2984   /* A pure function may still have side-effects - it may modify its
2985      parameters.  */
2986   TREE_SIDE_EFFECTS (se->expr) = 1;
2987 #if 0
2988   if (!sym->attr.pure)
2989     TREE_SIDE_EFFECTS (se->expr) = 1;
2990 #endif
2991
2992   if (byref)
2993     {
2994       /* Add the function call to the pre chain.  There is no expression.  */
2995       gfc_add_expr_to_block (&se->pre, se->expr);
2996       se->expr = NULL_TREE;
2997
2998       if (!se->direct_byref)
2999         {
3000           if (sym->attr.dimension)
3001             {
3002               if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
3003                 {
3004                   /* Check the data pointer hasn't been modified.  This would
3005                      happen in a function returning a pointer.  */
3006                   tmp = gfc_conv_descriptor_data_get (info->descriptor);
3007                   tmp = fold_build2 (NE_EXPR, boolean_type_node,
3008                                      tmp, info->data);
3009                   gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
3010                                            gfc_msg_fault);
3011                 }
3012               se->expr = info->descriptor;
3013               /* Bundle in the string length.  */
3014               se->string_length = len;
3015             }
3016           else if (sym->ts.type == BT_CHARACTER)
3017             {
3018               /* Dereference for character pointer results.  */
3019               if (sym->attr.pointer || sym->attr.allocatable)
3020                 se->expr = build_fold_indirect_ref (var);
3021               else
3022                 se->expr = var;
3023
3024               se->string_length = len;
3025             }
3026           else
3027             {
3028               gcc_assert (sym->ts.type == BT_COMPLEX && gfc_option.flag_f2c);
3029               se->expr = build_fold_indirect_ref (var);
3030             }
3031         }
3032     }
3033
3034   /* Follow the function call with the argument post block.  */
3035   if (byref)
3036     gfc_add_block_to_block (&se->pre, &post);
3037   else
3038     gfc_add_block_to_block (&se->post, &post);
3039
3040   return has_alternate_specifier;
3041 }
3042
3043
3044 /* Fill a character string with spaces.  */
3045
3046 static tree
3047 fill_with_spaces (tree start, tree type, tree size)
3048 {
3049   stmtblock_t block, loop;
3050   tree i, el, exit_label, cond, tmp;
3051
3052   /* For a simple char type, we can call memset().  */
3053   if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
3054     return build_call_expr (built_in_decls[BUILT_IN_MEMSET], 3, start,
3055                             build_int_cst (gfc_get_int_type (gfc_c_int_kind),
3056                                            lang_hooks.to_target_charset (' ')),
3057                             size);
3058
3059   /* Otherwise, we use a loop:
3060         for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
3061           *el = (type) ' ';
3062    */
3063
3064   /* Initialize variables.  */
3065   gfc_init_block (&block);
3066   i = gfc_create_var (sizetype, "i");
3067   gfc_add_modify (&block, i, fold_convert (sizetype, size));
3068   el = gfc_create_var (build_pointer_type (type), "el");
3069   gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
3070   exit_label = gfc_build_label_decl (NULL_TREE);
3071   TREE_USED (exit_label) = 1;
3072
3073
3074   /* Loop body.  */
3075   gfc_init_block (&loop);
3076
3077   /* Exit condition.  */
3078   cond = fold_build2 (LE_EXPR, boolean_type_node, i,
3079                       fold_convert (sizetype, integer_zero_node));
3080   tmp = build1_v (GOTO_EXPR, exit_label);
3081   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
3082   gfc_add_expr_to_block (&loop, tmp);
3083
3084   /* Assignment.  */
3085   gfc_add_modify (&loop, fold_build1 (INDIRECT_REF, type, el),
3086                        build_int_cst (type,
3087                                       lang_hooks.to_target_charset (' ')));
3088
3089   /* Increment loop variables.  */
3090   gfc_add_modify (&loop, i, fold_build2 (MINUS_EXPR, sizetype, i,
3091                                               TYPE_SIZE_UNIT (type)));
3092   gfc_add_modify (&loop, el, fold_build2 (POINTER_PLUS_EXPR,
3093                                                TREE_TYPE (el), el,
3094                                                TYPE_SIZE_UNIT (type)));
3095
3096   /* Making the loop... actually loop!  */
3097   tmp = gfc_finish_block (&loop);
3098   tmp = build1_v (LOOP_EXPR, tmp);
3099   gfc_add_expr_to_block (&block, tmp);
3100
3101   /* The exit label.  */
3102   tmp = build1_v (LABEL_EXPR, exit_label);
3103   gfc_add_expr_to_block (&block, tmp);
3104
3105
3106   return gfc_finish_block (&block);
3107 }
3108
3109
3110 /* Generate code to copy a string.  */
3111
3112 void
3113 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
3114                        int dkind, tree slength, tree src, int skind)
3115 {
3116   tree tmp, dlen, slen;
3117   tree dsc;
3118   tree ssc;
3119   tree cond;
3120   tree cond2;
3121   tree tmp2;
3122   tree tmp3;
3123   tree tmp4;
3124   tree chartype;
3125   stmtblock_t tempblock;
3126
3127   gcc_assert (dkind == skind);
3128
3129   if (slength != NULL_TREE)
3130     {
3131       slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
3132       ssc = string_to_single_character (slen, src, skind);
3133     }
3134   else
3135     {
3136       slen = build_int_cst (size_type_node, 1);
3137       ssc =  src;
3138     }
3139
3140   if (dlength != NULL_TREE)
3141     {
3142       dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
3143       dsc = string_to_single_character (slen, dest, dkind);
3144     }
3145   else
3146     {
3147       dlen = build_int_cst (size_type_node, 1);
3148       dsc =  dest;
3149     }
3150
3151   if (slength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (src)))
3152     ssc = string_to_single_character (slen, src, skind);
3153   if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
3154     dsc = string_to_single_character (dlen, dest, dkind);
3155
3156
3157   /* Assign directly if the types are compatible.  */
3158   if (dsc != NULL_TREE && ssc != NULL_TREE
3159       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
3160     {
3161       gfc_add_modify (block, dsc, ssc);
3162       return;
3163     }
3164
3165   /* Do nothing if the destination length is zero.  */
3166   cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
3167                       build_int_cst (size_type_node, 0));
3168
3169   /* The following code was previously in _gfortran_copy_string:
3170
3171        // The two strings may overlap so we use memmove.
3172        void
3173        copy_string (GFC_INTEGER_4 destlen, char * dest,
3174                     GFC_INTEGER_4 srclen, const char * src)
3175        {
3176          if (srclen >= destlen)
3177            {
3178              // This will truncate if too long.
3179              memmove (dest, src, destlen);
3180            }
3181          else
3182            {
3183              memmove (dest, src, srclen);
3184              // Pad with spaces.
3185              memset (&dest[srclen], ' ', destlen - srclen);
3186            }
3187        }
3188
3189      We're now doing it here for better optimization, but the logic
3190      is the same.  */
3191
3192   /* For non-default character kinds, we have to multiply the string
3193      length by the base type size.  */
3194   chartype = gfc_get_char_type (dkind);
3195   slen = fold_build2 (MULT_EXPR, size_type_node,
3196                       fold_convert (size_type_node, slen),
3197                       fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3198   dlen = fold_build2 (MULT_EXPR, size_type_node,
3199                       fold_convert (size_type_node, dlen),
3200                       fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3201
3202   if (dlength)
3203     dest = fold_convert (pvoid_type_node, dest);
3204   else
3205     dest = gfc_build_addr_expr (pvoid_type_node, dest);
3206
3207   if (slength)
3208     src = fold_convert (pvoid_type_node, src);
3209   else
3210     src = gfc_build_addr_expr (pvoid_type_node, src);
3211
3212   /* Truncate string if source is too long.  */
3213   cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
3214   tmp2 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
3215                           3, dest, src, dlen);
3216
3217   /* Else copy and pad with spaces.  */
3218   tmp3 = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE],
3219                           3, dest, src, slen);
3220
3221   tmp4 = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest,
3222                       fold_convert (sizetype, slen));
3223   tmp4 = fill_with_spaces (tmp4, chartype,
3224                            fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
3225                                         dlen, slen));
3226
3227   gfc_init_block (&tempblock);
3228   gfc_add_expr_to_block (&tempblock, tmp3);
3229   gfc_add_expr_to_block (&tempblock, tmp4);
3230   tmp3 = gfc_finish_block (&tempblock);
3231
3232   /* The whole copy_string function is there.  */
3233   tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
3234   tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp, build_empty_stmt ());
3235   gfc_add_expr_to_block (block, tmp);
3236 }
3237
3238
3239 /* Translate a statement function.
3240    The value of a statement function reference is obtained by evaluating the
3241    expression using the values of the actual arguments for the values of the
3242    corresponding dummy arguments.  */
3243
3244 static void
3245 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
3246 {
3247   gfc_symbol *sym;
3248   gfc_symbol *fsym;
3249   gfc_formal_arglist *fargs;
3250   gfc_actual_arglist *args;
3251   gfc_se lse;
3252   gfc_se rse;
3253   gfc_saved_var *saved_vars;
3254   tree *temp_vars;
3255   tree type;
3256   tree tmp;
3257   int n;
3258
3259   sym = expr->symtree->n.sym;
3260   args = expr->value.function.actual;
3261   gfc_init_se (&lse, NULL);
3262   gfc_init_se (&rse, NULL);
3263
3264   n = 0;
3265   for (fargs = sym->formal; fargs; fargs = fargs->next)
3266     n++;
3267   saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
3268   temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
3269
3270   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3271     {
3272       /* Each dummy shall be specified, explicitly or implicitly, to be
3273          scalar.  */
3274       gcc_assert (fargs->sym->attr.dimension == 0);
3275       fsym = fargs->sym;
3276
3277       /* Create a temporary to hold the value.  */
3278       type = gfc_typenode_for_spec (&fsym->ts);
3279       temp_vars[n] = gfc_create_var (type, fsym->name);
3280
3281       if (fsym->ts.type == BT_CHARACTER)
3282         {
3283           /* Copy string arguments.  */
3284           tree arglen;
3285
3286           gcc_assert (fsym->ts.cl && fsym->ts.cl->length
3287                       && fsym->ts.cl->length->expr_type == EXPR_CONSTANT);
3288
3289           arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3290           tmp = gfc_build_addr_expr (build_pointer_type (type),
3291                                      temp_vars[n]);
3292
3293           gfc_conv_expr (&rse, args->expr);
3294           gfc_conv_string_parameter (&rse);
3295           gfc_add_block_to_block (&se->pre, &lse.pre);
3296           gfc_add_block_to_block (&se->pre, &rse.pre);
3297
3298           gfc_trans_string_copy (&se->pre, arglen, tmp, fsym->ts.kind,
3299                                  rse.string_length, rse.expr, fsym->ts.kind);
3300           gfc_add_block_to_block (&se->pre, &lse.post);
3301           gfc_add_block_to_block (&se->pre, &rse.post);
3302         }
3303       else
3304         {
3305           /* For everything else, just evaluate the expression.  */
3306           gfc_conv_expr (&lse, args->expr);
3307
3308           gfc_add_block_to_block (&se->pre, &lse.pre);
3309           gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
3310           gfc_add_block_to_block (&se->pre, &lse.post);
3311         }
3312
3313       args = args->next;
3314     }
3315
3316   /* Use the temporary variables in place of the real ones.  */
3317   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3318     gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
3319
3320   gfc_conv_expr (se, sym->value);
3321
3322   if (sym->ts.type == BT_CHARACTER)
3323     {
3324       gfc_conv_const_charlen (sym->ts.cl);
3325
3326       /* Force the expression to the correct length.  */
3327       if (!INTEGER_CST_P (se->string_length)
3328           || tree_int_cst_lt (se->string_length,
3329                               sym->ts.cl->backend_decl))
3330         {
3331           type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
3332           tmp = gfc_create_var (type, sym->name);
3333           tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
3334           gfc_trans_string_copy (&se->pre, sym->ts.cl->backend_decl, tmp,
3335                                  sym->ts.kind, se->string_length, se->expr,
3336                                  sym->ts.kind);
3337           se->expr = tmp;
3338         }
3339       se->string_length = sym->ts.cl->backend_decl;
3340     }
3341
3342   /* Restore the original variables.  */
3343   for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3344     gfc_restore_sym (fargs->sym, &saved_vars[n]);
3345   gfc_free (saved_vars);
3346 }
3347
3348
3349 /* Translate a function expression.  */
3350
3351 static void
3352 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
3353 {
3354   gfc_symbol *sym;
3355
3356   if (expr->value.function.isym)
3357     {
3358       gfc_conv_intrinsic_function (se, expr);
3359       return;
3360     }
3361
3362   /* We distinguish statement functions from general functions to improve
3363      runtime performance.  */
3364   if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3365     {
3366       gfc_conv_statement_function (se, expr);
3367       return;
3368     }
3369
3370   /* expr.value.function.esym is the resolved (specific) function symbol for
3371      most functions.  However this isn't set for dummy procedures.  */
3372   sym = expr->value.function.esym;
3373   if (!sym)
3374     sym = expr->symtree->n.sym;
3375   gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE);
3376 }
3377
3378
3379 static void
3380 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
3381 {
3382   gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
3383   gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
3384
3385   gfc_conv_tmp_array_ref (se);
3386   gfc_advance_se_ss_chain (se);
3387 }
3388
3389
3390 /* Build a static initializer.  EXPR is the expression for the initial value.
3391    The other parameters describe the variable of the component being 
3392    initialized. EXPR may be null.  */
3393
3394 tree
3395 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
3396                       bool array, bool pointer)
3397 {
3398   gfc_se se;
3399
3400   if (!(expr || pointer))
3401     return NULL_TREE;
3402
3403   /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
3404      (these are the only two iso_c_binding derived types that can be
3405      used as initialization expressions).  If so, we need to modify
3406      the 'expr' to be that for a (void *).  */
3407   if (expr != NULL && expr->ts.type == BT_DERIVED
3408       && expr->ts.is_iso_c && expr->ts.derived)
3409     {
3410       gfc_symbol *derived = expr->ts.derived;
3411
3412       expr = gfc_int_expr (0);
3413
3414       /* The derived symbol has already been converted to a (void *).  Use
3415          its kind.  */
3416       expr->ts.f90_type = derived->ts.f90_type;
3417       expr->ts.kind = derived->ts.kind;
3418     }
3419   
3420   if (array)
3421     {
3422       /* Arrays need special handling.  */
3423       if (pointer)
3424         return gfc_build_null_descriptor (type);
3425       else
3426         return gfc_conv_array_initializer (type, expr);
3427     }
3428   else if (pointer)
3429     return fold_convert (type, null_pointer_node);
3430   else
3431     {
3432       switch (ts->type)
3433         {
3434         case BT_DERIVED:
3435           gfc_init_se (&se, NULL);
3436           gfc_conv_structure (&se, expr, 1);
3437           return se.expr;
3438
3439         case BT_CHARACTER:
3440           return gfc_conv_string_init (ts->cl->backend_decl,expr);
3441
3442         default:
3443           gfc_init_se (&se, NULL);
3444           gfc_conv_constant (&se, expr);
3445           return se.expr;
3446         }
3447     }
3448 }
3449   
3450 static tree
3451 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3452 {
3453   gfc_se rse;
3454   gfc_se lse;
3455   gfc_ss *rss;
3456   gfc_ss *lss;
3457   stmtblock_t body;
3458   stmtblock_t block;
3459   gfc_loopinfo loop;
3460   int n;
3461   tree tmp;
3462
3463   gfc_start_block (&block);
3464
3465   /* Initialize the scalarizer.  */
3466   gfc_init_loopinfo (&loop);
3467
3468   gfc_init_se (&lse, NULL);
3469   gfc_init_se (&rse, NULL);
3470
3471   /* Walk the rhs.  */
3472   rss = gfc_walk_expr (expr);
3473   if (rss == gfc_ss_terminator)
3474     {
3475       /* The rhs is scalar.  Add a ss for the expression.  */
3476       rss = gfc_get_ss ();
3477       rss->next = gfc_ss_terminator;
3478       rss->type = GFC_SS_SCALAR;
3479       rss->expr = expr;
3480     }
3481
3482   /* Create a SS for the destination.  */
3483   lss = gfc_get_ss ();
3484   lss->type = GFC_SS_COMPONENT;
3485   lss->expr = NULL;
3486   lss->shape = gfc_get_shape (cm->as->rank);
3487   lss->next = gfc_ss_terminator;
3488   lss->data.info.dimen = cm->as->rank;
3489   lss->data.info.descriptor = dest;
3490   lss->data.info.data = gfc_conv_array_data (dest);
3491   lss->data.info.offset = gfc_conv_array_offset (dest);
3492   for (n = 0; n < cm->as->rank; n++)
3493     {
3494       lss->data.info.dim[n] = n;
3495       lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
3496       lss->data.info.stride[n] = gfc_index_one_node;
3497
3498       mpz_init (lss->shape[n]);
3499       mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
3500                cm->as->lower[n]->value.integer);
3501       mpz_add_ui (lss->shape[n], lss->shape[n], 1);
3502     }
3503   
3504   /* Associate the SS with the loop.  */
3505   gfc_add_ss_to_loop (&loop, lss);
3506   gfc_add_ss_to_loop (&loop, rss);
3507
3508   /* Calculate the bounds of the scalarization.  */
3509   gfc_conv_ss_startstride (&loop);
3510
3511   /* Setup the scalarizing loops.  */
3512   gfc_conv_loop_setup (&loop, &expr->where);
3513
3514   /* Setup the gfc_se structures.  */
3515   gfc_copy_loopinfo_to_se (&lse, &loop);
3516   gfc_copy_loopinfo_to_se (&rse, &loop);
3517
3518   rse.ss = rss;
3519   gfc_mark_ss_chain_used (rss, 1);
3520   lse.ss = lss;
3521   gfc_mark_ss_chain_used (lss, 1);
3522
3523   /* Start the scalarized loop body.  */
3524   gfc_start_scalarized_body (&loop, &body);
3525
3526   gfc_conv_tmp_array_ref (&lse);
3527   if (cm->ts.type == BT_CHARACTER)
3528     lse.string_length = cm->ts.cl->backend_decl;
3529
3530   gfc_conv_expr (&rse, expr);
3531
3532   tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
3533   gfc_add_expr_to_block (&body, tmp);
3534
3535   gcc_assert (rse.ss == gfc_ss_terminator);
3536
3537   /* Generate the copying loops.  */
3538   gfc_trans_scalarizing_loops (&loop, &body);
3539
3540   /* Wrap the whole thing up.  */
3541   gfc_add_block_to_block (&block, &loop.pre);
3542   gfc_add_block_to_block (&block, &loop.post);
3543
3544   for (n = 0; n < cm->as->rank; n++)
3545     mpz_clear (lss->shape[n]);
3546   gfc_free (lss->shape);
3547
3548   gfc_cleanup_loop (&loop);
3549
3550   return gfc_finish_block (&block);
3551 }
3552
3553
3554 /* Assign a single component of a derived type constructor.  */
3555
3556 static tree
3557 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3558 {
3559   gfc_se se;
3560   gfc_se lse;
3561   gfc_ss *rss;
3562   stmtblock_t block;
3563   tree tmp;
3564   tree offset;
3565   int n;
3566
3567   gfc_start_block (&block);
3568
3569   if (cm->attr.pointer)
3570     {
3571       gfc_init_se (&se, NULL);
3572       /* Pointer component.  */
3573       if (cm->attr.dimension)
3574         {
3575           /* Array pointer.  */
3576           if (expr->expr_type == EXPR_NULL)
3577             gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3578           else
3579             {
3580               rss = gfc_walk_expr (expr);
3581               se.direct_byref = 1;
3582               se.expr = dest;
3583               gfc_conv_expr_descriptor (&se, expr, rss);
3584               gfc_add_block_to_block (&block, &se.pre);
3585               gfc_add_block_to_block (&block, &se.post);
3586             }
3587         }
3588       else
3589         {
3590           /* Scalar pointers.  */
3591           se.want_pointer = 1;
3592           gfc_conv_expr (&se, expr);
3593           gfc_add_block_to_block (&block, &se.pre);
3594           gfc_add_modify (&block, dest,
3595                                fold_convert (TREE_TYPE (dest), se.expr));
3596           gfc_add_block_to_block (&block, &se.post);
3597         }
3598     }
3599   else if (cm->attr.dimension)
3600     {
3601       if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
3602         gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
3603       else if (cm->attr.allocatable)
3604         {
3605           tree tmp2;
3606
3607           gfc_init_se (&se, NULL);
3608  
3609           rss = gfc_walk_expr (expr);
3610           se.want_pointer = 0;
3611           gfc_conv_expr_descriptor (&se, expr, rss);
3612           gfc_add_block_to_block (&block, &se.pre);
3613
3614           tmp = fold_convert (TREE_TYPE (dest), se.expr);
3615           gfc_add_modify (&block, dest, tmp);
3616
3617           if (cm->ts.type == BT_DERIVED && cm->ts.derived->attr.alloc_comp)
3618             tmp = gfc_copy_alloc_comp (cm->ts.derived, se.expr, dest,
3619                                        cm->as->rank);
3620           else
3621             tmp = gfc_duplicate_allocatable (dest, se.expr,
3622                                              TREE_TYPE(cm->backend_decl),
3623                                              cm->as->rank);
3624
3625           gfc_add_expr_to_block (&block, tmp);
3626           gfc_add_block_to_block (&block, &se.post);
3627
3628           if (expr->expr_type != EXPR_VARIABLE)
3629             gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
3630
3631           /* Shift the lbound and ubound of temporaries to being unity, rather
3632              than zero, based.  Calculate the offset for all cases.  */
3633           offset = gfc_conv_descriptor_offset (dest);
3634           gfc_add_modify (&block, offset, gfc_index_zero_node);
3635           tmp2 =gfc_create_var (gfc_array_index_type, NULL);
3636           for (n = 0; n < expr->rank; n++)
3637             {
3638               if (expr->expr_type != EXPR_VARIABLE
3639                     && expr->expr_type != EXPR_CONSTANT)
3640                 {
3641                   tree span;
3642                   tmp = gfc_conv_descriptor_ubound (dest, gfc_rank_cst[n]);
3643                   span = fold_build2 (MINUS_EXPR, gfc_array_index_type, tmp,
3644                             gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]));
3645                   gfc_add_modify (&block, tmp,
3646                                        fold_build2 (PLUS_EXPR,
3647                                                     gfc_array_index_type,
3648                                                     span, gfc_index_one_node));
3649                   tmp = gfc_conv_descriptor_lbound (dest, gfc_rank_cst[n]);
3650                   gfc_add_modify (&block, tmp, gfc_index_one_node);
3651                 }
3652               tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
3653                                  gfc_conv_descriptor_lbound (dest,
3654                                                              gfc_rank_cst[n]),
3655                                  gfc_conv_descriptor_stride (dest,
3656                                                              gfc_rank_cst[n]));
3657               gfc_add_modify (&block, tmp2, tmp);
3658               tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
3659               gfc_add_modify (&block, offset, tmp);
3660             }
3661
3662           if (expr->expr_type == EXPR_FUNCTION
3663                 && expr->value.function.isym
3664                 && expr->value.function.isym->conversion
3665                 && expr->value.function.actual->expr
3666                 && expr->value.function.actual->expr->expr_type
3667                                                 == EXPR_VARIABLE)
3668             {
3669               /* If a conversion expression has a null data pointer
3670                  argument, nullify the allocatable component.  */
3671               gfc_symbol *s;
3672               tree non_null_expr;
3673               tree null_expr;
3674               s = expr->value.function.actual->expr->symtree->n.sym;
3675               if (s->attr.allocatable || s->attr.pointer)
3676                 {
3677                   non_null_expr = gfc_finish_block (&block);
3678                   gfc_start_block (&block);
3679                   gfc_conv_descriptor_data_set (&block, dest,
3680                                                 null_pointer_node);
3681                   null_expr = gfc_finish_block (&block);
3682                   tmp = gfc_conv_descriptor_data_get (s->backend_decl);
3683                   tmp = build2 (EQ_EXPR, boolean_type_node, tmp,
3684                                 fold_convert (TREE_TYPE (tmp),
3685                                               null_pointer_node));
3686                   return build3_v (COND_EXPR, tmp, null_expr,
3687                                    non_null_expr);
3688                 }
3689             }
3690         }
3691       else
3692         {
3693           tmp = gfc_trans_subarray_assign (dest, cm, expr);
3694           gfc_add_expr_to_block (&block, tmp);
3695         }
3696     }
3697   else if (expr->ts.type == BT_DERIVED)
3698     {
3699       if (expr->expr_type != EXPR_STRUCTURE)
3700         {
3701           gfc_init_se (&se, NULL);
3702           gfc_conv_expr (&se, expr);
3703           gfc_add_block_to_block (&block, &se.pre);
3704           gfc_add_modify (&block, dest,
3705                                fold_convert (TREE_TYPE (dest), se.expr));
3706           gfc_add_block_to_block (&block, &se.post);
3707         }
3708       else
3709         {
3710           /* Nested constructors.  */
3711           tmp = gfc_trans_structure_assign (dest, expr);
3712           gfc_add_expr_to_block (&block, tmp);
3713         }
3714     }
3715   else
3716     {
3717       /* Scalar component.  */
3718       gfc_init_se (&se, NULL);
3719       gfc_init_se (&lse, NULL);
3720
3721       gfc_conv_expr (&se, expr);
3722       if (cm->ts.type == BT_CHARACTER)
3723         lse.string_length = cm->ts.cl->backend_decl;
3724       lse.expr = dest;
3725       tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
3726       gfc_add_expr_to_block (&block, tmp);
3727     }
3728   return gfc_finish_block (&block);
3729 }
3730
3731 /* Assign a derived type constructor to a variable.  */
3732
3733 static tree
3734 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
3735 {
3736   gfc_constructor *c;
3737   gfc_component *cm;
3738   stmtblock_t block;
3739   tree field;
3740   tree tmp;
3741
3742   gfc_start_block (&block);
3743   cm = expr->ts.derived->components;
3744   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3745     {
3746       /* Skip absent members in default initializers.  */
3747       if (!c->expr)
3748         continue;
3749
3750       field = cm->backend_decl;
3751       tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
3752                          dest, field, NULL_TREE);
3753       tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
3754       gfc_add_expr_to_block (&block, tmp);
3755     }
3756   return gfc_finish_block (&block);
3757 }
3758
3759 /* Build an expression for a constructor. If init is nonzero then
3760    this is part of a static variable initializer.  */
3761
3762 void
3763 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
3764 {
3765   gfc_constructor *c;
3766   gfc_component *cm;
3767   tree val;
3768   tree type;
3769   tree tmp;
3770   VEC(constructor_elt,gc) *v = NULL;
3771
3772   gcc_assert (se->ss == NULL);
3773   gcc_assert (expr->expr_type == EXPR_STRUCTURE);
3774   type = gfc_typenode_for_spec (&expr->ts);
3775
3776   if (!init)
3777     {
3778       /* Create a temporary variable and fill it in.  */
3779       se->expr = gfc_create_var (type, expr->ts.derived->name);
3780       tmp = gfc_trans_structure_assign (se->expr, expr);
3781       gfc_add_expr_to_block (&se->pre, tmp);
3782       return;
3783     }
3784
3785   cm = expr->ts.derived->components;
3786
3787   for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
3788     {
3789       /* Skip absent members in default initializers and allocatable
3790          components.  Although the latter have a default initializer
3791          of EXPR_NULL,... by default, the static nullify is not needed
3792          since this is done every time we come into scope.  */
3793       if (!c->expr || cm->attr.allocatable)
3794         continue;
3795
3796       val = gfc_conv_initializer (c->expr, &cm->ts,
3797           TREE_TYPE (cm->backend_decl), cm->attr.dimension, cm->attr.pointer);
3798
3799       /* Append it to the constructor list.  */
3800       CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
3801     }
3802   se->expr = build_constructor (type, v);
3803   if (init) 
3804     TREE_CONSTANT (se->expr) = 1;
3805 }
3806
3807
3808 /* Translate a substring expression.  */
3809
3810 static void
3811 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
3812 {
3813   gfc_ref *ref;
3814
3815   ref = expr->ref;
3816
3817   gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
3818
3819   se->expr = gfc_build_wide_string_const (expr->ts.kind,
3820                                           expr->value.character.length,
3821                                           expr->value.character.string);
3822
3823   se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
3824   TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
3825
3826   if (ref)
3827     gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
3828 }
3829
3830
3831 /* Entry point for expression translation.  Evaluates a scalar quantity.
3832    EXPR is the expression to be translated, and SE is the state structure if
3833    called from within the scalarized.  */
3834
3835 void
3836 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
3837 {
3838   if (se->ss && se->ss->expr == expr
3839       && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
3840     {
3841       /* Substitute a scalar expression evaluated outside the scalarization
3842          loop.  */
3843       se->expr = se->ss->data.scalar.expr;
3844       se->string_length = se->ss->string_length;
3845       gfc_advance_se_ss_chain (se);
3846       return;
3847     }
3848
3849   /* We need to convert the expressions for the iso_c_binding derived types.
3850      C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
3851      null_pointer_node.  C_PTR and C_FUNPTR are converted to match the
3852      typespec for the C_PTR and C_FUNPTR symbols, which has already been
3853      updated to be an integer with a kind equal to the size of a (void *).  */
3854   if (expr->ts.type == BT_DERIVED && expr->ts.derived
3855       && expr->ts.derived->attr.is_iso_c)
3856     {
3857       if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
3858           || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR)
3859         {
3860           /* Set expr_type to EXPR_NULL, which will result in
3861              null_pointer_node being used below.  */
3862           expr->expr_type = EXPR_NULL;
3863         }
3864       else
3865         {
3866           /* Update the type/kind of the expression to be what the new
3867              type/kind are for the updated symbols of C_PTR/C_FUNPTR.  */
3868           expr->ts.type = expr->ts.derived->ts.type;
3869           expr->ts.f90_type = expr->ts.derived->ts.f90_type;
3870           expr->ts.kind = expr->ts.derived->ts.kind;
3871         }
3872     }
3873   
3874   switch (expr->expr_type)
3875     {
3876     case EXPR_OP:
3877       gfc_conv_expr_op (se, expr);
3878       break;
3879
3880     case EXPR_FUNCTION:
3881       gfc_conv_function_expr (se, expr);
3882       break;
3883
3884     case EXPR_CONSTANT:
3885       gfc_conv_constant (se, expr);
3886       break;
3887
3888     case EXPR_VARIABLE:
3889       gfc_conv_variable (se, expr);
3890       break;
3891
3892     case EXPR_NULL:
3893       se->expr = null_pointer_node;
3894       break;
3895
3896     case EXPR_SUBSTRING:
3897       gfc_conv_substring_expr (se, expr);
3898       break;
3899
3900     case EXPR_STRUCTURE:
3901       gfc_conv_structure (se, expr, 0);
3902       break;
3903
3904     case EXPR_ARRAY:
3905       gfc_conv_array_constructor_expr (se, expr);
3906       break;
3907
3908     default:
3909       gcc_unreachable ();
3910       break;
3911     }
3912 }
3913
3914 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
3915    of an assignment.  */
3916 void
3917 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
3918 {
3919   gfc_conv_expr (se, expr);
3920   /* All numeric lvalues should have empty post chains.  If not we need to
3921      figure out a way of rewriting an lvalue so that it has no post chain.  */
3922   gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
3923 }
3924
3925 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
3926    numeric expressions.  Used for scalar values where inserting cleanup code
3927    is inconvenient.  */
3928 void
3929 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
3930 {
3931   tree val;
3932
3933   gcc_assert (expr->ts.type != BT_CHARACTER);
3934   gfc_conv_expr (se, expr);
3935   if (se->post.head)
3936     {
3937       val = gfc_create_var (TREE_TYPE (se->expr), NULL);
3938       gfc_add_modify (&se->pre, val, se->expr);
3939       se->expr = val;
3940       gfc_add_block_to_block (&se->pre, &se->post);
3941     }
3942 }
3943
3944 /* Helper to translate an expression and convert it to a particular type.  */
3945 void
3946 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
3947 {
3948   gfc_conv_expr_val (se, expr);
3949   se->expr = convert (type, se->expr);
3950 }
3951
3952
3953 /* Converts an expression so that it can be passed by reference.  Scalar
3954    values only.  */
3955
3956 void
3957 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
3958 {
3959   tree var;
3960
3961   if (se->ss && se->ss->expr == expr
3962       && se->ss->type == GFC_SS_REFERENCE)
3963     {
3964       se->expr = se->ss->data.scalar.expr;
3965       se->string_length = se->ss->string_length;
3966       gfc_advance_se_ss_chain (se);
3967       return;
3968     }
3969
3970   if (expr->ts.type == BT_CHARACTER)
3971     {
3972       gfc_conv_expr (se, expr);
3973       gfc_conv_string_parameter (se);
3974       return;
3975     }
3976
3977   if (expr->expr_type == EXPR_VARIABLE)
3978     {
3979       se->want_pointer = 1;
3980       gfc_conv_expr (se, expr);
3981       if (se->post.head)
3982         {
3983           var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3984           gfc_add_modify (&se->pre, var, se->expr);
3985           gfc_add_block_to_block (&se->pre, &se->post);
3986           se->expr = var;
3987         }
3988       return;
3989     }
3990
3991   if (expr->expr_type == EXPR_FUNCTION
3992         && expr->symtree->n.sym->attr.pointer
3993         && !expr->symtree->n.sym->attr.dimension)
3994     {
3995       se->want_pointer = 1;
3996       gfc_conv_expr (se, expr);
3997       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
3998       gfc_add_modify (&se->pre, var, se->expr);
3999       se->expr = var;
4000       return;
4001     }
4002
4003
4004   gfc_conv_expr (se, expr);
4005
4006   /* Create a temporary var to hold the value.  */
4007   if (TREE_CONSTANT (se->expr))
4008     {
4009       tree tmp = se->expr;
4010       STRIP_TYPE_NOPS (tmp);
4011       var = build_decl (CONST_DECL, NULL, TREE_TYPE (tmp));
4012       DECL_INITIAL (var) = tmp;
4013       TREE_STATIC (var) = 1;
4014       pushdecl (var);
4015     }
4016   else
4017     {
4018       var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4019       gfc_add_modify (&se->pre, var, se->expr);
4020     }
4021   gfc_add_block_to_block (&se->pre, &se->post);
4022
4023   /* Take the address of that value.  */
4024   se->expr = gfc_build_addr_expr (NULL_TREE, var);
4025 }
4026
4027
4028 tree
4029 gfc_trans_pointer_assign (gfc_code * code)
4030 {
4031   return gfc_trans_pointer_assignment (code->expr, code->expr2);
4032 }
4033
4034
4035 /* Generate code for a pointer assignment.  */
4036
4037 tree
4038 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
4039 {
4040   gfc_se lse;
4041   gfc_se rse;
4042   gfc_ss *lss;
4043   gfc_ss *rss;
4044   stmtblock_t block;
4045   tree desc;
4046   tree tmp;
4047   tree decl;
4048
4049   gfc_start_block (&block);
4050
4051   gfc_init_se (&lse, NULL);
4052
4053   lss = gfc_walk_expr (expr1);
4054   rss = gfc_walk_expr (expr2);
4055   if (lss == gfc_ss_terminator)
4056     {
4057       /* Scalar pointers.  */
4058       lse.want_pointer = 1;
4059       gfc_conv_expr (&lse, expr1);
4060       gcc_assert (rss == gfc_ss_terminator);
4061       gfc_init_se (&rse, NULL);
4062       rse.want_pointer = 1;
4063       gfc_conv_expr (&rse, expr2);
4064
4065       if (expr1->symtree->n.sym->attr.proc_pointer
4066           && expr1->symtree->n.sym->attr.dummy)
4067         lse.expr = build_fold_indirect_ref (lse.expr);
4068
4069       gfc_add_block_to_block (&block, &lse.pre);
4070       gfc_add_block_to_block (&block, &rse.pre);
4071
4072       /* Check character lengths if character expression.  The test is only
4073          really added if -fbounds-check is enabled.  */
4074       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4075         {
4076           gcc_assert (expr2->ts.type == BT_CHARACTER);
4077           gcc_assert (lse.string_length && rse.string_length);
4078           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4079                                        lse.string_length, rse.string_length,
4080                                        &block);
4081         }
4082
4083       gfc_add_modify (&block, lse.expr,
4084                            fold_convert (TREE_TYPE (lse.expr), rse.expr));
4085
4086       gfc_add_block_to_block (&block, &rse.post);
4087       gfc_add_block_to_block (&block, &lse.post);
4088     }
4089   else
4090     {
4091       tree strlen_lhs;
4092       tree strlen_rhs = NULL_TREE;
4093
4094       /* Array pointer.  */
4095       gfc_conv_expr_descriptor (&lse, expr1, lss);
4096       strlen_lhs = lse.string_length;
4097       switch (expr2->expr_type)
4098         {
4099         case EXPR_NULL:
4100           /* Just set the data pointer to null.  */
4101           gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
4102           break;
4103
4104         case EXPR_VARIABLE:
4105           /* Assign directly to the pointer's descriptor.  */
4106           lse.direct_byref = 1;
4107           gfc_conv_expr_descriptor (&lse, expr2, rss);
4108           strlen_rhs = lse.string_length;
4109
4110           /* If this is a subreference array pointer assignment, use the rhs
4111              descriptor element size for the lhs span.  */
4112           if (expr1->symtree->n.sym->attr.subref_array_pointer)
4113             {
4114               decl = expr1->symtree->n.sym->backend_decl;
4115               gfc_init_se (&rse, NULL);
4116               rse.descriptor_only = 1;
4117               gfc_conv_expr (&rse, expr2);
4118               tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
4119               tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
4120               if (!INTEGER_CST_P (tmp))
4121                 gfc_add_block_to_block (&lse.post, &rse.pre);
4122               gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
4123             }
4124
4125           break;
4126
4127         default:
4128           /* Assign to a temporary descriptor and then copy that
4129              temporary to the pointer.  */
4130           desc = lse.expr;
4131           tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
4132
4133           lse.expr = tmp;
4134           lse.direct_byref = 1;
4135           gfc_conv_expr_descriptor (&lse, expr2, rss);
4136           strlen_rhs = lse.string_length;
4137           gfc_add_modify (&lse.pre, desc, tmp);
4138           break;
4139         }
4140
4141       gfc_add_block_to_block (&block, &lse.pre);
4142
4143       /* Check string lengths if applicable.  The check is only really added
4144          to the output code if -fbounds-check is enabled.  */
4145       if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4146         {
4147           gcc_assert (expr2->ts.type == BT_CHARACTER);
4148           gcc_assert (strlen_lhs && strlen_rhs);
4149           gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4150                                        strlen_lhs, strlen_rhs, &block);
4151         }
4152
4153       gfc_add_block_to_block (&block, &lse.post);
4154     }
4155   return gfc_finish_block (&block);
4156 }
4157
4158
4159 /* Makes sure se is suitable for passing as a function string parameter.  */
4160 /* TODO: Need to check all callers of this function.  It may be abused.  */
4161
4162 void
4163 gfc_conv_string_parameter (gfc_se * se)
4164 {
4165   tree type;
4166
4167   if (TREE_CODE (se->expr) == STRING_CST)
4168     {
4169       type = TREE_TYPE (TREE_TYPE (se->expr));
4170       se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4171       return;
4172     }
4173
4174   if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
4175     {
4176       if (TREE_CODE (se->expr) != INDIRECT_REF)
4177         {
4178           type = TREE_TYPE (se->expr);
4179           se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4180         }
4181       else
4182         {
4183           type = gfc_get_character_type_len (gfc_default_character_kind,
4184                                              se->string_length);
4185           type = build_pointer_type (type);
4186           se->expr = gfc_build_addr_expr (type, se->expr);
4187         }
4188     }
4189
4190   gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
4191   gcc_assert (se->string_length
4192           && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
4193 }
4194
4195
4196 /* Generate code for assignment of scalar variables.  Includes character
4197    strings and derived types with allocatable components.  */
4198
4199 tree
4200 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
4201                          bool l_is_temp, bool r_is_var)
4202 {
4203   stmtblock_t block;
4204   tree tmp;
4205   tree cond;
4206
4207   gfc_init_block (&block);
4208
4209   if (ts.type == BT_CHARACTER)
4210     {
4211       tree rlen = NULL;
4212       tree llen = NULL;
4213
4214       if (lse->string_length != NULL_TREE)
4215         {
4216           gfc_conv_string_parameter (lse);
4217           gfc_add_block_to_block (&block, &lse->pre);
4218           llen = lse->string_length;
4219         }
4220
4221       if (rse->string_length != NULL_TREE)
4222         {
4223           gcc_assert (rse->string_length != NULL_TREE);
4224           gfc_conv_string_parameter (rse);
4225           gfc_add_block_to_block (&block, &rse->pre);
4226           rlen = rse->string_length;
4227         }
4228
4229       gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
4230                              rse->expr, ts.kind);
4231     }
4232   else if (ts.type == BT_DERIVED && ts.derived->attr.alloc_comp)
4233     {
4234       cond = NULL_TREE;
4235         
4236       /* Are the rhs and the lhs the same?  */
4237       if (r_is_var)
4238         {
4239           cond = fold_build2 (EQ_EXPR, boolean_type_node,
4240                               gfc_build_addr_expr (NULL_TREE, lse->expr),
4241                               gfc_build_addr_expr (NULL_TREE, rse->expr));
4242           cond = gfc_evaluate_now (cond, &lse->pre);
4243         }
4244
4245       /* Deallocate the lhs allocated components as long as it is not
4246          the same as the rhs.  This must be done following the assignment
4247          to prevent deallocating data that could be used in the rhs
4248          expression.  */
4249       if (!l_is_temp)
4250         {
4251           tmp = gfc_evaluate_now (lse->expr, &lse->pre);
4252           tmp = gfc_deallocate_alloc_comp (ts.derived, tmp, 0);
4253           if (r_is_var)
4254             tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
4255           gfc_add_expr_to_block (&lse->post, tmp);
4256         }
4257
4258       gfc_add_block_to_block (&block, &rse->pre);
4259       gfc_add_block_to_block (&block, &lse->pre);
4260
4261       gfc_add_modify (&block, lse->expr,
4262                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
4263
4264       /* Do a deep copy if the rhs is a variable, if it is not the
4265          same as the lhs.  */
4266       if (r_is_var)
4267         {
4268           tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
4269           tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
4270           gfc_add_expr_to_block (&block, tmp);
4271         }
4272     }
4273   else
4274     {
4275       gfc_add_block_to_block (&block, &lse->pre);
4276       gfc_add_block_to_block (&block, &rse->pre);
4277
4278       gfc_add_modify (&block, lse->expr,
4279                            fold_convert (TREE_TYPE (lse->expr), rse->expr));
4280     }
4281
4282   gfc_add_block_to_block (&block, &lse->post);
4283   gfc_add_block_to_block (&block, &rse->post);
4284
4285   return gfc_finish_block (&block);
4286 }
4287
4288
4289 /* Try to translate array(:) = func (...), where func is a transformational
4290    array function, without using a temporary.  Returns NULL is this isn't the
4291    case.  */
4292
4293 static tree
4294 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
4295 {
4296   gfc_se se;
4297   gfc_ss *ss;
4298   gfc_ref * ref;
4299   bool seen_array_ref;
4300
4301   /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION.  */
4302   if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
4303     return NULL;
4304
4305   /* Elemental functions don't need a temporary anyway.  */
4306   if (expr2->value.function.esym != NULL
4307       && expr2->value.function.esym->attr.elemental)
4308     return NULL;
4309
4310   /* Fail if EXPR1 can't be expressed as a descriptor.  */
4311   if (gfc_ref_needs_temporary_p (expr1->ref))
4312     return NULL;
4313
4314   /* Functions returning pointers need temporaries.  */
4315   if (expr2->symtree->n.sym->attr.pointer 
4316       || expr2->symtree->n.sym->attr.allocatable)
4317     return NULL;
4318
4319   /* Character array functions need temporaries unless the
4320      character lengths are the same.  */
4321   if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
4322     {
4323       if (expr1->ts.cl->length == NULL
4324             || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
4325         return NULL;
4326
4327       if (expr2->ts.cl->length == NULL
4328             || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
4329         return NULL;
4330
4331       if (mpz_cmp (expr1->ts.cl->length->value.integer,
4332                      expr2->ts.cl->length->value.integer) != 0)
4333         return NULL;
4334     }
4335
4336   /* Check that no LHS component references appear during an array
4337      reference. This is needed because we do not have the means to
4338      span any arbitrary stride with an array descriptor. This check
4339      is not needed for the rhs because the function result has to be
4340      a complete type.  */
4341   seen_array_ref = false;
4342   for (ref = expr1->ref; ref; ref = ref->next)
4343     {
4344       if (ref->type == REF_ARRAY)
4345         seen_array_ref= true;
4346       else if (ref->type == REF_COMPONENT && seen_array_ref)
4347         return NULL;
4348     }
4349
4350   /* Check for a dependency.  */
4351   if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
4352                                    expr2->value.function.esym,
4353                                    expr2->value.function.actual,
4354                                    NOT_ELEMENTAL))
4355     return NULL;
4356
4357   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
4358      functions.  */
4359   gcc_assert (expr2->value.function.isym
4360               || (gfc_return_by_reference (expr2->value.function.esym)
4361               && expr2->value.function.esym->result->attr.dimension));
4362
4363   ss = gfc_walk_expr (expr1);
4364   gcc_assert (ss != gfc_ss_terminator);
4365   gfc_init_se (&se, NULL);
4366   gfc_start_block (&se.pre);
4367   se.want_pointer = 1;
4368
4369   gfc_conv_array_parameter (&se, expr1, ss, 0, NULL, NULL);
4370
4371   se.direct_byref = 1;
4372   se.ss = gfc_walk_expr (expr2);
4373   gcc_assert (se.ss != gfc_ss_terminator);
4374   gfc_conv_function_expr (&se, expr2);
4375   gfc_add_block_to_block (&se.pre, &se.post);
4376
4377   return gfc_finish_block (&se.pre);
4378 }
4379
4380 /* Determine whether the given EXPR_CONSTANT is a zero initializer.  */
4381
4382 static bool
4383 is_zero_initializer_p (gfc_expr * expr)
4384 {
4385   if (expr->expr_type != EXPR_CONSTANT)
4386     return false;
4387
4388   /* We ignore constants with prescribed memory representations for now.  */
4389   if (expr->representation.string)
4390     return false;
4391
4392   switch (expr->ts.type)
4393     {
4394     case BT_INTEGER:
4395       return mpz_cmp_si (expr->value.integer, 0) == 0;
4396
4397     case BT_REAL:
4398       return mpfr_zero_p (expr->value.real)
4399              && MPFR_SIGN (expr->value.real) >= 0;
4400
4401     case BT_LOGICAL:
4402       return expr->value.logical == 0;
4403
4404     case BT_COMPLEX:
4405       return mpfr_zero_p (expr->value.complex.r)
4406              && MPFR_SIGN (expr->value.complex.r) >= 0
4407              && mpfr_zero_p (expr->value.complex.i)
4408              && MPFR_SIGN (expr->value.complex.i) >= 0;
4409
4410     default:
4411       break;
4412     }
4413   return false;
4414 }
4415
4416 /* Try to efficiently translate array(:) = 0.  Return NULL if this
4417    can't be done.  */
4418
4419 static tree
4420 gfc_trans_zero_assign (gfc_expr * expr)
4421 {
4422   tree dest, len, type;
4423   tree tmp;
4424   gfc_symbol *sym;
4425
4426   sym = expr->symtree->n.sym;
4427   dest = gfc_get_symbol_decl (sym);
4428
4429   type = TREE_TYPE (dest);
4430   if (POINTER_TYPE_P (type))
4431     type = TREE_TYPE (type);
4432   if (!GFC_ARRAY_TYPE_P (type))
4433     return NULL_TREE;
4434
4435   /* Determine the length of the array.  */
4436   len = GFC_TYPE_ARRAY_SIZE (type);
4437   if (!len || TREE_CODE (len) != INTEGER_CST)
4438     return NULL_TREE;
4439
4440   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
4441   len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4442                      fold_convert (gfc_array_index_type, tmp));
4443
4444   /* Convert arguments to the correct types.  */
4445   if (!POINTER_TYPE_P (TREE_TYPE (dest)))
4446     dest = gfc_build_addr_expr (pvoid_type_node, dest);
4447   else
4448     dest = fold_convert (pvoid_type_node, dest);
4449   len = fold_convert (size_type_node, len);
4450
4451   /* Construct call to __builtin_memset.  */
4452   tmp = build_call_expr (built_in_decls[BUILT_IN_MEMSET],
4453                          3, dest, integer_zero_node, len);
4454   return fold_convert (void_type_node, tmp);
4455 }
4456
4457
4458 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
4459    that constructs the call to __builtin_memcpy.  */
4460
4461 tree
4462 gfc_build_memcpy_call (tree dst, tree src, tree len)
4463 {
4464   tree tmp;
4465
4466   /* Convert arguments to the correct types.  */
4467   if (!POINTER_TYPE_P (TREE_TYPE (dst)))
4468     dst = gfc_build_addr_expr (pvoid_type_node, dst);
4469   else
4470     dst = fold_convert (pvoid_type_node, dst);
4471
4472   if (!POINTER_TYPE_P (TREE_TYPE (src)))
4473     src = gfc_build_addr_expr (pvoid_type_node, src);
4474   else
4475     src = fold_convert (pvoid_type_node, src);
4476
4477   len = fold_convert (size_type_node, len);
4478
4479   /* Construct call to __builtin_memcpy.  */
4480   tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
4481   return fold_convert (void_type_node, tmp);
4482 }
4483
4484
4485 /* Try to efficiently translate dst(:) = src(:).  Return NULL if this
4486    can't be done.  EXPR1 is the destination/lhs and EXPR2 is the
4487    source/rhs, both are gfc_full_array_ref_p which have been checked for
4488    dependencies.  */
4489
4490 static tree
4491 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
4492 {
4493   tree dst, dlen, dtype;
4494   tree src, slen, stype;
4495   tree tmp;
4496
4497   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4498   src = gfc_get_symbol_decl (expr2->symtree->n.sym);
4499
4500   dtype = TREE_TYPE (dst);
4501   if (POINTER_TYPE_P (dtype))
4502     dtype = TREE_TYPE (dtype);
4503   stype = TREE_TYPE (src);
4504   if (POINTER_TYPE_P (stype))
4505     stype = TREE_TYPE (stype);
4506
4507   if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
4508     return NULL_TREE;
4509
4510   /* Determine the lengths of the arrays.  */
4511   dlen = GFC_TYPE_ARRAY_SIZE (dtype);
4512   if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
4513     return NULL_TREE;
4514   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4515   dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen,
4516                       fold_convert (gfc_array_index_type, tmp));
4517
4518   slen = GFC_TYPE_ARRAY_SIZE (stype);
4519   if (!slen || TREE_CODE (slen) != INTEGER_CST)
4520     return NULL_TREE;
4521   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
4522   slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen,
4523                       fold_convert (gfc_array_index_type, tmp));
4524
4525   /* Sanity check that they are the same.  This should always be
4526      the case, as we should already have checked for conformance.  */
4527   if (!tree_int_cst_equal (slen, dlen))
4528     return NULL_TREE;
4529
4530   return gfc_build_memcpy_call (dst, src, dlen);
4531 }
4532
4533
4534 /* Try to efficiently translate array(:) = (/ ... /).  Return NULL if
4535    this can't be done.  EXPR1 is the destination/lhs for which
4536    gfc_full_array_ref_p is true, and EXPR2 is the source/rhs.  */
4537
4538 static tree
4539 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
4540 {
4541   unsigned HOST_WIDE_INT nelem;
4542   tree dst, dtype;
4543   tree src, stype;
4544   tree len;
4545   tree tmp;
4546
4547   nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
4548   if (nelem == 0)
4549     return NULL_TREE;
4550
4551   dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
4552   dtype = TREE_TYPE (dst);
4553   if (POINTER_TYPE_P (dtype))
4554     dtype = TREE_TYPE (dtype);
4555   if (!GFC_ARRAY_TYPE_P (dtype))
4556     return NULL_TREE;
4557
4558   /* Determine the lengths of the array.  */
4559   len = GFC_TYPE_ARRAY_SIZE (dtype);
4560   if (!len || TREE_CODE (len) != INTEGER_CST)
4561     return NULL_TREE;
4562
4563   /* Confirm that the constructor is the same size.  */
4564   if (compare_tree_int (len, nelem) != 0)
4565     return NULL_TREE;
4566
4567   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
4568   len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4569                      fold_convert (gfc_array_index_type, tmp));
4570
4571   stype = gfc_typenode_for_spec (&expr2->ts);
4572   src = gfc_build_constant_array_constructor (expr2, stype);
4573
4574   stype = TREE_TYPE (src);
4575   if (POINTER_TYPE_P (stype))
4576     stype = TREE_TYPE (stype);
4577
4578   return gfc_build_memcpy_call (dst, src, len);
4579 }
4580
4581
4582 /* Subroutine of gfc_trans_assignment that actually scalarizes the
4583    assignment.  EXPR1 is the destination/RHS and EXPR2 is the source/LHS.  */
4584
4585 static tree
4586 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4587 {
4588   gfc_se lse;
4589   gfc_se rse;
4590   gfc_ss *lss;
4591   gfc_ss *lss_section;
4592   gfc_ss *rss;
4593   gfc_loopinfo loop;
4594   tree tmp;
4595   stmtblock_t block;
4596   stmtblock_t body;
4597   bool l_is_temp;
4598   bool scalar_to_array;
4599   tree string_length;
4600
4601   /* Assignment of the form lhs = rhs.  */
4602   gfc_start_block (&block);
4603
4604   gfc_init_se (&lse, NULL);
4605   gfc_init_se (&rse, NULL);
4606
4607   /* Walk the lhs.  */
4608   lss = gfc_walk_expr (expr1);
4609   rss = NULL;
4610   if (lss != gfc_ss_terminator)
4611     {
4612       /* Allow the scalarizer to workshare array assignments.  */
4613       if (ompws_flags & OMPWS_WORKSHARE_FLAG)
4614         ompws_flags |= OMPWS_SCALARIZER_WS;
4615
4616       /* The assignment needs scalarization.  */
4617       lss_section = lss;
4618
4619       /* Find a non-scalar SS from the lhs.  */
4620       while (lss_section != gfc_ss_terminator
4621              && lss_section->type != GFC_SS_SECTION)
4622         lss_section = lss_section->next;
4623
4624       gcc_assert (lss_section != gfc_ss_terminator);
4625
4626       /* Initialize the scalarizer.  */
4627       gfc_init_loopinfo (&loop);
4628
4629       /* Walk the rhs.  */
4630       rss = gfc_walk_expr (expr2);
4631       if (rss == gfc_ss_terminator)
4632         {
4633           /* The rhs is scalar.  Add a ss for the expression.  */
4634           rss = gfc_get_ss ();
4635           rss->next = gfc_ss_terminator;
4636           rss->type = GFC_SS_SCALAR;
4637           rss->expr = expr2;
4638         }
4639       /* Associate the SS with the loop.  */
4640       gfc_add_ss_to_loop (&loop, lss);
4641       gfc_add_ss_to_loop (&loop, rss);
4642
4643       /* Calculate the bounds of the scalarization.  */
4644       gfc_conv_ss_startstride (&loop);
4645       /* Resolve any data dependencies in the statement.  */
4646       gfc_conv_resolve_dependencies (&loop, lss, rss);
4647       /* Setup the scalarizing loops.  */
4648       gfc_conv_loop_setup (&loop, &expr2->where);
4649
4650       /* Setup the gfc_se structures.  */
4651       gfc_copy_loopinfo_to_se (&lse, &loop);
4652       gfc_copy_loopinfo_to_se (&rse, &loop);
4653
4654       rse.ss = rss;
4655       gfc_mark_ss_chain_used (rss, 1);
4656       if (loop.temp_ss == NULL)
4657         {
4658           lse.ss = lss;
4659           gfc_mark_ss_chain_used (lss, 1);
4660         }
4661       else
4662         {
4663           lse.ss = loop.temp_ss;
4664           gfc_mark_ss_chain_used (lss, 3);
4665           gfc_mark_ss_chain_used (loop.temp_ss, 3);
4666         }
4667
4668       /* Start the scalarized loop body.  */
4669       gfc_start_scalarized_body (&loop, &body);
4670     }
4671   else
4672     gfc_init_block (&body);
4673
4674   l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
4675
4676   /* Translate the expression.  */
4677   gfc_conv_expr (&rse, expr2);
4678
4679   /* Stabilize a string length for temporaries.  */
4680   if (expr2->ts.type == BT_CHARACTER)
4681     string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
4682   else
4683     string_length = NULL_TREE;
4684
4685   if (l_is_temp)
4686     {
4687       gfc_conv_tmp_array_ref (&lse);
4688       gfc_advance_se_ss_chain (&lse);
4689       if (expr2->ts.type == BT_CHARACTER)
4690         lse.string_length = string_length;
4691     }
4692   else
4693     gfc_conv_expr (&lse, expr1);
4694
4695   /* Assignments of scalar derived types with allocatable components
4696      to arrays must be done with a deep copy and the rhs temporary
4697      must have its components deallocated afterwards.  */
4698   scalar_to_array = (expr2->ts.type == BT_DERIVED
4699                        && expr2->ts.derived->attr.alloc_comp
4700                        && expr2->expr_type != EXPR_VARIABLE
4701                        && !gfc_is_constant_expr (expr2)
4702                        && expr1->rank && !expr2->rank);
4703   if (scalar_to_array)
4704     {
4705       tmp = gfc_deallocate_alloc_comp (expr2->ts.derived, rse.expr, 0);
4706       gfc_add_expr_to_block (&loop.post, tmp);
4707     }
4708
4709   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4710                                  l_is_temp || init_flag,
4711                                  (expr2->expr_type == EXPR_VARIABLE)
4712                                     || scalar_to_array);
4713   gfc_add_expr_to_block (&body, tmp);
4714
4715   if (lss == gfc_ss_terminator)
4716     {
4717       /* Use the scalar assignment as is.  */
4718       gfc_add_block_to_block (&block, &body);
4719     }
4720   else
4721     {
4722       gcc_assert (lse.ss == gfc_ss_terminator
4723                   && rse.ss == gfc_ss_terminator);
4724
4725       if (l_is_temp)
4726         {
4727           gfc_trans_scalarized_loop_boundary (&loop, &body);
4728
4729           /* We need to copy the temporary to the actual lhs.  */
4730           gfc_init_se (&lse, NULL);
4731           gfc_init_se (&rse, NULL);
4732           gfc_copy_loopinfo_to_se (&lse, &loop);
4733           gfc_copy_loopinfo_to_se (&rse, &loop);
4734
4735           rse.ss = loop.temp_ss;
4736           lse.ss = lss;
4737
4738           gfc_conv_tmp_array_ref (&rse);
4739           gfc_advance_se_ss_chain (&rse);
4740           gfc_conv_expr (&lse, expr1);
4741
4742           gcc_assert (lse.ss == gfc_ss_terminator
4743                       && rse.ss == gfc_ss_terminator);
4744
4745           if (expr2->ts.type == BT_CHARACTER)
4746             rse.string_length = string_length;
4747
4748           tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
4749                                          false, false);
4750           gfc_add_expr_to_block (&body, tmp);
4751         }
4752
4753       /* Generate the copying loops.  */
4754       gfc_trans_scalarizing_loops (&loop, &body);
4755
4756       /* Wrap the whole thing up.  */
4757       gfc_add_block_to_block (&block, &loop.pre);
4758       gfc_add_block_to_block (&block, &loop.post);
4759
4760       gfc_cleanup_loop (&loop);
4761     }
4762
4763   return gfc_finish_block (&block);
4764 }
4765
4766
4767 /* Check whether EXPR is a copyable array.  */
4768
4769 static bool
4770 copyable_array_p (gfc_expr * expr)
4771 {
4772   if (expr->expr_type != EXPR_VARIABLE)
4773     return false;
4774
4775   /* First check it's an array.  */
4776   if (expr->rank < 1 || !expr->ref || expr->ref->next)
4777     return false;
4778
4779   if (!gfc_full_array_ref_p (expr->ref))
4780     return false;
4781
4782   /* Next check that it's of a simple enough type.  */
4783   switch (expr->ts.type)
4784     {
4785     case BT_INTEGER:
4786     case BT_REAL:
4787     case BT_COMPLEX:
4788     case BT_LOGICAL:
4789       return true;
4790
4791     case BT_CHARACTER:
4792       return false;
4793
4794     case BT_DERIVED:
4795       return !expr->ts.derived->attr.alloc_comp;
4796
4797     default:
4798       break;
4799     }
4800
4801   return false;
4802 }
4803
4804 /* Translate an assignment.  */
4805
4806 tree
4807 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
4808 {
4809   tree tmp;
4810
4811   /* Special case a single function returning an array.  */
4812   if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
4813     {
4814       tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
4815       if (tmp)
4816         return tmp;
4817     }
4818
4819   /* Special case assigning an array to zero.  */
4820   if (copyable_array_p (expr1)
4821       && is_zero_initializer_p (expr2))
4822     {
4823       tmp = gfc_trans_zero_assign (expr1);
4824       if (tmp)
4825         return tmp;
4826     }
4827
4828   /* Special case copying one array to another.  */
4829   if (copyable_array_p (expr1)
4830       && copyable_array_p (expr2)
4831       && gfc_compare_types (&expr1->ts, &expr2->ts)
4832       && !gfc_check_dependency (expr1, expr2, 0))
4833     {
4834       tmp = gfc_trans_array_copy (expr1, expr2);
4835       if (tmp)
4836         return tmp;
4837     }
4838
4839   /* Special case initializing an array from a constant array constructor.  */
4840   if (copyable_array_p (expr1)
4841       && expr2->expr_type == EXPR_ARRAY
4842       && gfc_compare_types (&expr1->ts, &expr2->ts))
4843     {
4844       tmp = gfc_trans_array_constructor_copy (expr1, expr2);
4845       if (tmp)
4846         return tmp;
4847     }
4848
4849   /* Fallback to the scalarizer to generate explicit loops.  */
4850   return gfc_trans_assignment_1 (expr1, expr2, init_flag);
4851 }
4852
4853 tree
4854 gfc_trans_init_assign (gfc_code * code)
4855 {
4856   return gfc_trans_assignment (code->expr, code->expr2, true);
4857 }
4858
4859 tree
4860 gfc_trans_assign (gfc_code * code)
4861 {
4862   return gfc_trans_assignment (code->expr, code->expr2, false);
4863 }