OSDN Git Service

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