OSDN Git Service

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