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