Merged revision 156805 into branch.
[official-gcc.git] / gcc / fortran / trans-expr.c
blob5c3aa850d3d353bd9c13c940c5315a86d9ac45f8
1 /* Expression translation
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Paul Brook <paul@nowt.org>
5 and Steven Bosscher <s.bosscher@student.tudelft.nl>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* trans-expr.c-- generate GENERIC trees for gfc_expr. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tree.h"
29 #include "convert.h"
30 #include "ggc.h"
31 #include "toplev.h"
32 #include "real.h"
33 #include "gimple.h"
34 #include "langhooks.h"
35 #include "flags.h"
36 #include "gfortran.h"
37 #include "arith.h"
38 #include "trans.h"
39 #include "trans-const.h"
40 #include "trans-types.h"
41 #include "trans-array.h"
42 /* Only for gfc_trans_assign and gfc_trans_pointer_assign. */
43 #include "trans-stmt.h"
44 #include "dependency.h"
46 static tree gfc_trans_structure_assign (tree dest, gfc_expr * expr);
47 static void gfc_apply_interface_mapping_to_expr (gfc_interface_mapping *,
48 gfc_expr *);
50 /* Copy the scalarization loop variables. */
52 static void
53 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
55 dest->ss = src->ss;
56 dest->loop = src->loop;
60 /* Initialize a simple expression holder.
62 Care must be taken when multiple se are created with the same parent.
63 The child se must be kept in sync. The easiest way is to delay creation
64 of a child se until after after the previous se has been translated. */
66 void
67 gfc_init_se (gfc_se * se, gfc_se * parent)
69 memset (se, 0, sizeof (gfc_se));
70 gfc_init_block (&se->pre);
71 gfc_init_block (&se->post);
73 se->parent = parent;
75 if (parent)
76 gfc_copy_se_loopvars (se, parent);
80 /* Advances to the next SS in the chain. Use this rather than setting
81 se->ss = se->ss->next because all the parents needs to be kept in sync.
82 See gfc_init_se. */
84 void
85 gfc_advance_se_ss_chain (gfc_se * se)
87 gfc_se *p;
89 gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
91 p = se;
92 /* Walk down the parent chain. */
93 while (p != NULL)
95 /* Simple consistency check. */
96 gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
98 p->ss = p->ss->next;
100 p = p->parent;
105 /* Ensures the result of the expression as either a temporary variable
106 or a constant so that it can be used repeatedly. */
108 void
109 gfc_make_safe_expr (gfc_se * se)
111 tree var;
113 if (CONSTANT_CLASS_P (se->expr))
114 return;
116 /* We need a temporary for this result. */
117 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
118 gfc_add_modify (&se->pre, var, se->expr);
119 se->expr = var;
123 /* Return an expression which determines if a dummy parameter is present.
124 Also used for arguments to procedures with multiple entry points. */
126 tree
127 gfc_conv_expr_present (gfc_symbol * sym)
129 tree decl;
131 gcc_assert (sym->attr.dummy);
133 decl = gfc_get_symbol_decl (sym);
134 if (TREE_CODE (decl) != PARM_DECL)
136 /* Array parameters use a temporary descriptor, we want the real
137 parameter. */
138 gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
139 || GFC_ARRAY_TYPE_P (TREE_TYPE (decl)));
140 decl = GFC_DECL_SAVED_DESCRIPTOR (decl);
142 return fold_build2 (NE_EXPR, boolean_type_node, decl,
143 fold_convert (TREE_TYPE (decl), null_pointer_node));
147 /* Converts a missing, dummy argument into a null or zero. */
149 void
150 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
152 tree present;
153 tree tmp;
155 present = gfc_conv_expr_present (arg->symtree->n.sym);
157 if (kind > 0)
159 /* Create a temporary and convert it to the correct type. */
160 tmp = gfc_get_int_type (kind);
161 tmp = fold_convert (tmp, build_fold_indirect_ref_loc (input_location,
162 se->expr));
164 /* Test for a NULL value. */
165 tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, tmp,
166 fold_convert (TREE_TYPE (tmp), integer_one_node));
167 tmp = gfc_evaluate_now (tmp, &se->pre);
168 se->expr = gfc_build_addr_expr (NULL_TREE, tmp);
170 else
172 tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
173 fold_convert (TREE_TYPE (se->expr), integer_zero_node));
174 tmp = gfc_evaluate_now (tmp, &se->pre);
175 se->expr = tmp;
178 if (ts.type == BT_CHARACTER)
180 tmp = build_int_cst (gfc_charlen_type_node, 0);
181 tmp = fold_build3 (COND_EXPR, gfc_charlen_type_node,
182 present, se->string_length, tmp);
183 tmp = gfc_evaluate_now (tmp, &se->pre);
184 se->string_length = tmp;
186 return;
190 /* Get the character length of an expression, looking through gfc_refs
191 if necessary. */
193 tree
194 gfc_get_expr_charlen (gfc_expr *e)
196 gfc_ref *r;
197 tree length;
199 gcc_assert (e->expr_type == EXPR_VARIABLE
200 && e->ts.type == BT_CHARACTER);
202 length = NULL; /* To silence compiler warning. */
204 if (is_subref_array (e) && e->ts.u.cl->length)
206 gfc_se tmpse;
207 gfc_init_se (&tmpse, NULL);
208 gfc_conv_expr_type (&tmpse, e->ts.u.cl->length, gfc_charlen_type_node);
209 e->ts.u.cl->backend_decl = tmpse.expr;
210 return tmpse.expr;
213 /* First candidate: if the variable is of type CHARACTER, the
214 expression's length could be the length of the character
215 variable. */
216 if (e->symtree->n.sym->ts.type == BT_CHARACTER)
217 length = e->symtree->n.sym->ts.u.cl->backend_decl;
219 /* Look through the reference chain for component references. */
220 for (r = e->ref; r; r = r->next)
222 switch (r->type)
224 case REF_COMPONENT:
225 if (r->u.c.component->ts.type == BT_CHARACTER)
226 length = r->u.c.component->ts.u.cl->backend_decl;
227 break;
229 case REF_ARRAY:
230 /* Do nothing. */
231 break;
233 default:
234 /* We should never got substring references here. These will be
235 broken down by the scalarizer. */
236 gcc_unreachable ();
237 break;
241 gcc_assert (length != NULL);
242 return length;
246 /* For each character array constructor subexpression without a ts.u.cl->length,
247 replace it by its first element (if there aren't any elements, the length
248 should already be set to zero). */
250 static void
251 flatten_array_ctors_without_strlen (gfc_expr* e)
253 gfc_actual_arglist* arg;
254 gfc_constructor* c;
256 if (!e)
257 return;
259 switch (e->expr_type)
262 case EXPR_OP:
263 flatten_array_ctors_without_strlen (e->value.op.op1);
264 flatten_array_ctors_without_strlen (e->value.op.op2);
265 break;
267 case EXPR_COMPCALL:
268 /* TODO: Implement as with EXPR_FUNCTION when needed. */
269 gcc_unreachable ();
271 case EXPR_FUNCTION:
272 for (arg = e->value.function.actual; arg; arg = arg->next)
273 flatten_array_ctors_without_strlen (arg->expr);
274 break;
276 case EXPR_ARRAY:
278 /* We've found what we're looking for. */
279 if (e->ts.type == BT_CHARACTER && !e->ts.u.cl->length)
281 gfc_expr* new_expr;
282 gcc_assert (e->value.constructor);
284 new_expr = e->value.constructor->expr;
285 e->value.constructor->expr = NULL;
287 flatten_array_ctors_without_strlen (new_expr);
288 gfc_replace_expr (e, new_expr);
289 break;
292 /* Otherwise, fall through to handle constructor elements. */
293 case EXPR_STRUCTURE:
294 for (c = e->value.constructor; c; c = c->next)
295 flatten_array_ctors_without_strlen (c->expr);
296 break;
298 default:
299 break;
305 /* Generate code to initialize a string length variable. Returns the
306 value. For array constructors, cl->length might be NULL and in this case,
307 the first element of the constructor is needed. expr is the original
308 expression so we can access it but can be NULL if this is not needed. */
310 void
311 gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock)
313 gfc_se se;
315 gfc_init_se (&se, NULL);
317 /* If cl->length is NULL, use gfc_conv_expr to obtain the string length but
318 "flatten" array constructors by taking their first element; all elements
319 should be the same length or a cl->length should be present. */
320 if (!cl->length)
322 gfc_expr* expr_flat;
323 gcc_assert (expr);
325 expr_flat = gfc_copy_expr (expr);
326 flatten_array_ctors_without_strlen (expr_flat);
327 gfc_resolve_expr (expr_flat);
329 gfc_conv_expr (&se, expr_flat);
330 gfc_add_block_to_block (pblock, &se.pre);
331 cl->backend_decl = convert (gfc_charlen_type_node, se.string_length);
333 gfc_free_expr (expr_flat);
334 return;
337 /* Convert cl->length. */
339 gcc_assert (cl->length);
341 gfc_conv_expr_type (&se, cl->length, gfc_charlen_type_node);
342 se.expr = fold_build2 (MAX_EXPR, gfc_charlen_type_node, se.expr,
343 build_int_cst (gfc_charlen_type_node, 0));
344 gfc_add_block_to_block (pblock, &se.pre);
346 if (cl->backend_decl)
347 gfc_add_modify (pblock, cl->backend_decl, se.expr);
348 else
349 cl->backend_decl = gfc_evaluate_now (se.expr, pblock);
353 static void
354 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
355 const char *name, locus *where)
357 tree tmp;
358 tree type;
359 tree fault;
360 gfc_se start;
361 gfc_se end;
362 char *msg;
364 type = gfc_get_character_type (kind, ref->u.ss.length);
365 type = build_pointer_type (type);
367 gfc_init_se (&start, se);
368 gfc_conv_expr_type (&start, ref->u.ss.start, gfc_charlen_type_node);
369 gfc_add_block_to_block (&se->pre, &start.pre);
371 if (integer_onep (start.expr))
372 gfc_conv_string_parameter (se);
373 else
375 tmp = start.expr;
376 STRIP_NOPS (tmp);
377 /* Avoid multiple evaluation of substring start. */
378 if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
379 start.expr = gfc_evaluate_now (start.expr, &se->pre);
381 /* Change the start of the string. */
382 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
383 tmp = se->expr;
384 else
385 tmp = build_fold_indirect_ref_loc (input_location,
386 se->expr);
387 tmp = gfc_build_array_ref (tmp, start.expr, NULL);
388 se->expr = gfc_build_addr_expr (type, tmp);
391 /* Length = end + 1 - start. */
392 gfc_init_se (&end, se);
393 if (ref->u.ss.end == NULL)
394 end.expr = se->string_length;
395 else
397 gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
398 gfc_add_block_to_block (&se->pre, &end.pre);
400 tmp = end.expr;
401 STRIP_NOPS (tmp);
402 if (!CONSTANT_CLASS_P (tmp) && !DECL_P (tmp))
403 end.expr = gfc_evaluate_now (end.expr, &se->pre);
405 if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
407 tree nonempty = fold_build2 (LE_EXPR, boolean_type_node,
408 start.expr, end.expr);
410 /* Check lower bound. */
411 fault = fold_build2 (LT_EXPR, boolean_type_node, start.expr,
412 build_int_cst (gfc_charlen_type_node, 1));
413 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
414 nonempty, fault);
415 if (name)
416 asprintf (&msg, "Substring out of bounds: lower bound (%%ld) of '%s' "
417 "is less than one", name);
418 else
419 asprintf (&msg, "Substring out of bounds: lower bound (%%ld)"
420 "is less than one");
421 gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
422 fold_convert (long_integer_type_node,
423 start.expr));
424 gfc_free (msg);
426 /* Check upper bound. */
427 fault = fold_build2 (GT_EXPR, boolean_type_node, end.expr,
428 se->string_length);
429 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
430 nonempty, fault);
431 if (name)
432 asprintf (&msg, "Substring out of bounds: upper bound (%%ld) of '%s' "
433 "exceeds string length (%%ld)", name);
434 else
435 asprintf (&msg, "Substring out of bounds: upper bound (%%ld) "
436 "exceeds string length (%%ld)");
437 gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
438 fold_convert (long_integer_type_node, end.expr),
439 fold_convert (long_integer_type_node,
440 se->string_length));
441 gfc_free (msg);
444 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
445 end.expr, start.expr);
446 tmp = fold_build2 (PLUS_EXPR, gfc_charlen_type_node,
447 build_int_cst (gfc_charlen_type_node, 1), tmp);
448 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
449 build_int_cst (gfc_charlen_type_node, 0));
450 se->string_length = tmp;
454 /* Convert a derived type component reference. */
456 static void
457 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
459 gfc_component *c;
460 tree tmp;
461 tree decl;
462 tree field;
464 c = ref->u.c.component;
466 gcc_assert (c->backend_decl);
468 field = c->backend_decl;
469 gcc_assert (TREE_CODE (field) == FIELD_DECL);
470 decl = se->expr;
471 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
473 se->expr = tmp;
475 if (c->ts.type == BT_CHARACTER && !c->attr.proc_pointer)
477 tmp = c->ts.u.cl->backend_decl;
478 /* Components must always be constant length. */
479 gcc_assert (tmp && INTEGER_CST_P (tmp));
480 se->string_length = tmp;
483 if (((c->attr.pointer || c->attr.allocatable) && c->attr.dimension == 0
484 && c->ts.type != BT_CHARACTER)
485 || c->attr.proc_pointer)
486 se->expr = build_fold_indirect_ref_loc (input_location,
487 se->expr);
491 /* This function deals with component references to components of the
492 parent type for derived type extensons. */
493 static void
494 conv_parent_component_references (gfc_se * se, gfc_ref * ref)
496 gfc_component *c;
497 gfc_component *cmp;
498 gfc_symbol *dt;
499 gfc_ref parent;
501 dt = ref->u.c.sym;
502 c = ref->u.c.component;
504 /* Build a gfc_ref to recursively call gfc_conv_component_ref. */
505 parent.type = REF_COMPONENT;
506 parent.next = NULL;
507 parent.u.c.sym = dt;
508 parent.u.c.component = dt->components;
510 if (dt->attr.extension && dt->components)
512 if (dt->attr.is_class)
513 cmp = dt->components;
514 else
515 cmp = dt->components->next;
516 /* Return if the component is not in the parent type. */
517 for (; cmp; cmp = cmp->next)
518 if (strcmp (c->name, cmp->name) == 0)
519 return;
521 /* Otherwise build the reference and call self. */
522 gfc_conv_component_ref (se, &parent);
523 parent.u.c.sym = dt->components->ts.u.derived;
524 parent.u.c.component = c;
525 conv_parent_component_references (se, &parent);
529 /* Return the contents of a variable. Also handles reference/pointer
530 variables (all Fortran pointer references are implicit). */
532 static void
533 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
535 gfc_ref *ref;
536 gfc_symbol *sym;
537 tree parent_decl;
538 int parent_flag;
539 bool return_value;
540 bool alternate_entry;
541 bool entry_master;
543 sym = expr->symtree->n.sym;
544 if (se->ss != NULL)
546 /* Check that something hasn't gone horribly wrong. */
547 gcc_assert (se->ss != gfc_ss_terminator);
548 gcc_assert (se->ss->expr == expr);
550 /* A scalarized term. We already know the descriptor. */
551 se->expr = se->ss->data.info.descriptor;
552 se->string_length = se->ss->string_length;
553 for (ref = se->ss->data.info.ref; ref; ref = ref->next)
554 if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT)
555 break;
557 else
559 tree se_expr = NULL_TREE;
561 se->expr = gfc_get_symbol_decl (sym);
563 /* Deal with references to a parent results or entries by storing
564 the current_function_decl and moving to the parent_decl. */
565 return_value = sym->attr.function && sym->result == sym;
566 alternate_entry = sym->attr.function && sym->attr.entry
567 && sym->result == sym;
568 entry_master = sym->attr.result
569 && sym->ns->proc_name->attr.entry_master
570 && !gfc_return_by_reference (sym->ns->proc_name);
571 parent_decl = DECL_CONTEXT (current_function_decl);
573 if ((se->expr == parent_decl && return_value)
574 || (sym->ns && sym->ns->proc_name
575 && parent_decl
576 && sym->ns->proc_name->backend_decl == parent_decl
577 && (alternate_entry || entry_master)))
578 parent_flag = 1;
579 else
580 parent_flag = 0;
582 /* Special case for assigning the return value of a function.
583 Self recursive functions must have an explicit return value. */
584 if (return_value && (se->expr == current_function_decl || parent_flag))
585 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
587 /* Similarly for alternate entry points. */
588 else if (alternate_entry
589 && (sym->ns->proc_name->backend_decl == current_function_decl
590 || parent_flag))
592 gfc_entry_list *el = NULL;
594 for (el = sym->ns->entries; el; el = el->next)
595 if (sym == el->sym)
597 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
598 break;
602 else if (entry_master
603 && (sym->ns->proc_name->backend_decl == current_function_decl
604 || parent_flag))
605 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
607 if (se_expr)
608 se->expr = se_expr;
610 /* Procedure actual arguments. */
611 else if (sym->attr.flavor == FL_PROCEDURE
612 && se->expr != current_function_decl)
614 if (!sym->attr.dummy && !sym->attr.proc_pointer)
616 gcc_assert (TREE_CODE (se->expr) == FUNCTION_DECL);
617 se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
619 return;
623 /* Dereference the expression, where needed. Since characters
624 are entirely different from other types, they are treated
625 separately. */
626 if (sym->ts.type == BT_CHARACTER)
628 /* Dereference character pointer dummy arguments
629 or results. */
630 if ((sym->attr.pointer || sym->attr.allocatable)
631 && (sym->attr.dummy
632 || sym->attr.function
633 || sym->attr.result))
634 se->expr = build_fold_indirect_ref_loc (input_location,
635 se->expr);
638 else if (!sym->attr.value)
640 /* Dereference non-character scalar dummy arguments. */
641 if (sym->attr.dummy && !sym->attr.dimension)
642 se->expr = build_fold_indirect_ref_loc (input_location,
643 se->expr);
645 /* Dereference scalar hidden result. */
646 if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
647 && (sym->attr.function || sym->attr.result)
648 && !sym->attr.dimension && !sym->attr.pointer
649 && !sym->attr.always_explicit)
650 se->expr = build_fold_indirect_ref_loc (input_location,
651 se->expr);
653 /* Dereference non-character pointer variables.
654 These must be dummies, results, or scalars. */
655 if ((sym->attr.pointer || sym->attr.allocatable)
656 && (sym->attr.dummy
657 || sym->attr.function
658 || sym->attr.result
659 || !sym->attr.dimension))
660 se->expr = build_fold_indirect_ref_loc (input_location,
661 se->expr);
664 ref = expr->ref;
667 /* For character variables, also get the length. */
668 if (sym->ts.type == BT_CHARACTER)
670 /* If the character length of an entry isn't set, get the length from
671 the master function instead. */
672 if (sym->attr.entry && !sym->ts.u.cl->backend_decl)
673 se->string_length = sym->ns->proc_name->ts.u.cl->backend_decl;
674 else
675 se->string_length = sym->ts.u.cl->backend_decl;
676 gcc_assert (se->string_length);
679 while (ref)
681 switch (ref->type)
683 case REF_ARRAY:
684 /* Return the descriptor if that's what we want and this is an array
685 section reference. */
686 if (se->descriptor_only && ref->u.ar.type != AR_ELEMENT)
687 return;
688 /* TODO: Pointers to single elements of array sections, eg elemental subs. */
689 /* Return the descriptor for array pointers and allocations. */
690 if (se->want_pointer
691 && ref->next == NULL && (se->descriptor_only))
692 return;
694 gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
695 /* Return a pointer to an element. */
696 break;
698 case REF_COMPONENT:
699 if (ref->u.c.sym->attr.extension)
700 conv_parent_component_references (se, ref);
702 gfc_conv_component_ref (se, ref);
703 break;
705 case REF_SUBSTRING:
706 gfc_conv_substring (se, ref, expr->ts.kind,
707 expr->symtree->name, &expr->where);
708 break;
710 default:
711 gcc_unreachable ();
712 break;
714 ref = ref->next;
716 /* Pointer assignment, allocation or pass by reference. Arrays are handled
717 separately. */
718 if (se->want_pointer)
720 if (expr->ts.type == BT_CHARACTER && !gfc_is_proc_ptr_comp (expr, NULL))
721 gfc_conv_string_parameter (se);
722 else
723 se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
728 /* Unary ops are easy... Or they would be if ! was a valid op. */
730 static void
731 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
733 gfc_se operand;
734 tree type;
736 gcc_assert (expr->ts.type != BT_CHARACTER);
737 /* Initialize the operand. */
738 gfc_init_se (&operand, se);
739 gfc_conv_expr_val (&operand, expr->value.op.op1);
740 gfc_add_block_to_block (&se->pre, &operand.pre);
742 type = gfc_typenode_for_spec (&expr->ts);
744 /* TRUTH_NOT_EXPR is not a "true" unary operator in GCC.
745 We must convert it to a compare to 0 (e.g. EQ_EXPR (op1, 0)).
746 All other unary operators have an equivalent GIMPLE unary operator. */
747 if (code == TRUTH_NOT_EXPR)
748 se->expr = fold_build2 (EQ_EXPR, type, operand.expr,
749 build_int_cst (type, 0));
750 else
751 se->expr = fold_build1 (code, type, operand.expr);
755 /* Expand power operator to optimal multiplications when a value is raised
756 to a constant integer n. See section 4.6.3, "Evaluation of Powers" of
757 Donald E. Knuth, "Seminumerical Algorithms", Vol. 2, "The Art of Computer
758 Programming", 3rd Edition, 1998. */
760 /* This code is mostly duplicated from expand_powi in the backend.
761 We establish the "optimal power tree" lookup table with the defined size.
762 The items in the table are the exponents used to calculate the index
763 exponents. Any integer n less than the value can get an "addition chain",
764 with the first node being one. */
765 #define POWI_TABLE_SIZE 256
767 /* The table is from builtins.c. */
768 static const unsigned char powi_table[POWI_TABLE_SIZE] =
770 0, 1, 1, 2, 2, 3, 3, 4, /* 0 - 7 */
771 4, 6, 5, 6, 6, 10, 7, 9, /* 8 - 15 */
772 8, 16, 9, 16, 10, 12, 11, 13, /* 16 - 23 */
773 12, 17, 13, 18, 14, 24, 15, 26, /* 24 - 31 */
774 16, 17, 17, 19, 18, 33, 19, 26, /* 32 - 39 */
775 20, 25, 21, 40, 22, 27, 23, 44, /* 40 - 47 */
776 24, 32, 25, 34, 26, 29, 27, 44, /* 48 - 55 */
777 28, 31, 29, 34, 30, 60, 31, 36, /* 56 - 63 */
778 32, 64, 33, 34, 34, 46, 35, 37, /* 64 - 71 */
779 36, 65, 37, 50, 38, 48, 39, 69, /* 72 - 79 */
780 40, 49, 41, 43, 42, 51, 43, 58, /* 80 - 87 */
781 44, 64, 45, 47, 46, 59, 47, 76, /* 88 - 95 */
782 48, 65, 49, 66, 50, 67, 51, 66, /* 96 - 103 */
783 52, 70, 53, 74, 54, 104, 55, 74, /* 104 - 111 */
784 56, 64, 57, 69, 58, 78, 59, 68, /* 112 - 119 */
785 60, 61, 61, 80, 62, 75, 63, 68, /* 120 - 127 */
786 64, 65, 65, 128, 66, 129, 67, 90, /* 128 - 135 */
787 68, 73, 69, 131, 70, 94, 71, 88, /* 136 - 143 */
788 72, 128, 73, 98, 74, 132, 75, 121, /* 144 - 151 */
789 76, 102, 77, 124, 78, 132, 79, 106, /* 152 - 159 */
790 80, 97, 81, 160, 82, 99, 83, 134, /* 160 - 167 */
791 84, 86, 85, 95, 86, 160, 87, 100, /* 168 - 175 */
792 88, 113, 89, 98, 90, 107, 91, 122, /* 176 - 183 */
793 92, 111, 93, 102, 94, 126, 95, 150, /* 184 - 191 */
794 96, 128, 97, 130, 98, 133, 99, 195, /* 192 - 199 */
795 100, 128, 101, 123, 102, 164, 103, 138, /* 200 - 207 */
796 104, 145, 105, 146, 106, 109, 107, 149, /* 208 - 215 */
797 108, 200, 109, 146, 110, 170, 111, 157, /* 216 - 223 */
798 112, 128, 113, 130, 114, 182, 115, 132, /* 224 - 231 */
799 116, 200, 117, 132, 118, 158, 119, 206, /* 232 - 239 */
800 120, 240, 121, 162, 122, 147, 123, 152, /* 240 - 247 */
801 124, 166, 125, 214, 126, 138, 127, 153, /* 248 - 255 */
804 /* If n is larger than lookup table's max index, we use the "window
805 method". */
806 #define POWI_WINDOW_SIZE 3
808 /* Recursive function to expand the power operator. The temporary
809 values are put in tmpvar. The function returns tmpvar[1] ** n. */
810 static tree
811 gfc_conv_powi (gfc_se * se, unsigned HOST_WIDE_INT n, tree * tmpvar)
813 tree op0;
814 tree op1;
815 tree tmp;
816 int digit;
818 if (n < POWI_TABLE_SIZE)
820 if (tmpvar[n])
821 return tmpvar[n];
823 op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
824 op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
826 else if (n & 1)
828 digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
829 op0 = gfc_conv_powi (se, n - digit, tmpvar);
830 op1 = gfc_conv_powi (se, digit, tmpvar);
832 else
834 op0 = gfc_conv_powi (se, n >> 1, tmpvar);
835 op1 = op0;
838 tmp = fold_build2 (MULT_EXPR, TREE_TYPE (op0), op0, op1);
839 tmp = gfc_evaluate_now (tmp, &se->pre);
841 if (n < POWI_TABLE_SIZE)
842 tmpvar[n] = tmp;
844 return tmp;
848 /* Expand lhs ** rhs. rhs is a constant integer. If it expands successfully,
849 return 1. Else return 0 and a call to runtime library functions
850 will have to be built. */
851 static int
852 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
854 tree cond;
855 tree tmp;
856 tree type;
857 tree vartmp[POWI_TABLE_SIZE];
858 HOST_WIDE_INT m;
859 unsigned HOST_WIDE_INT n;
860 int sgn;
862 /* If exponent is too large, we won't expand it anyway, so don't bother
863 with large integer values. */
864 if (!double_int_fits_in_shwi_p (TREE_INT_CST (rhs)))
865 return 0;
867 m = double_int_to_shwi (TREE_INT_CST (rhs));
868 /* There's no ABS for HOST_WIDE_INT, so here we go. It also takes care
869 of the asymmetric range of the integer type. */
870 n = (unsigned HOST_WIDE_INT) (m < 0 ? -m : m);
872 type = TREE_TYPE (lhs);
873 sgn = tree_int_cst_sgn (rhs);
875 if (((FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
876 || optimize_size) && (m > 2 || m < -1))
877 return 0;
879 /* rhs == 0 */
880 if (sgn == 0)
882 se->expr = gfc_build_const (type, integer_one_node);
883 return 1;
886 /* If rhs < 0 and lhs is an integer, the result is -1, 0 or 1. */
887 if ((sgn == -1) && (TREE_CODE (type) == INTEGER_TYPE))
889 tmp = fold_build2 (EQ_EXPR, boolean_type_node,
890 lhs, build_int_cst (TREE_TYPE (lhs), -1));
891 cond = fold_build2 (EQ_EXPR, boolean_type_node,
892 lhs, build_int_cst (TREE_TYPE (lhs), 1));
894 /* If rhs is even,
895 result = (lhs == 1 || lhs == -1) ? 1 : 0. */
896 if ((n & 1) == 0)
898 tmp = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, tmp, cond);
899 se->expr = fold_build3 (COND_EXPR, type,
900 tmp, build_int_cst (type, 1),
901 build_int_cst (type, 0));
902 return 1;
904 /* If rhs is odd,
905 result = (lhs == 1) ? 1 : (lhs == -1) ? -1 : 0. */
906 tmp = fold_build3 (COND_EXPR, type, tmp, build_int_cst (type, -1),
907 build_int_cst (type, 0));
908 se->expr = fold_build3 (COND_EXPR, type,
909 cond, build_int_cst (type, 1), tmp);
910 return 1;
913 memset (vartmp, 0, sizeof (vartmp));
914 vartmp[1] = lhs;
915 if (sgn == -1)
917 tmp = gfc_build_const (type, integer_one_node);
918 vartmp[1] = fold_build2 (RDIV_EXPR, type, tmp, vartmp[1]);
921 se->expr = gfc_conv_powi (se, n, vartmp);
923 return 1;
927 /* Power op (**). Constant integer exponent has special handling. */
929 static void
930 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
932 tree gfc_int4_type_node;
933 int kind;
934 int ikind;
935 gfc_se lse;
936 gfc_se rse;
937 tree fndecl;
939 gfc_init_se (&lse, se);
940 gfc_conv_expr_val (&lse, expr->value.op.op1);
941 lse.expr = gfc_evaluate_now (lse.expr, &lse.pre);
942 gfc_add_block_to_block (&se->pre, &lse.pre);
944 gfc_init_se (&rse, se);
945 gfc_conv_expr_val (&rse, expr->value.op.op2);
946 gfc_add_block_to_block (&se->pre, &rse.pre);
948 if (expr->value.op.op2->ts.type == BT_INTEGER
949 && expr->value.op.op2->expr_type == EXPR_CONSTANT)
950 if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
951 return;
953 gfc_int4_type_node = gfc_get_int_type (4);
955 kind = expr->value.op.op1->ts.kind;
956 switch (expr->value.op.op2->ts.type)
958 case BT_INTEGER:
959 ikind = expr->value.op.op2->ts.kind;
960 switch (ikind)
962 case 1:
963 case 2:
964 rse.expr = convert (gfc_int4_type_node, rse.expr);
965 /* Fall through. */
967 case 4:
968 ikind = 0;
969 break;
971 case 8:
972 ikind = 1;
973 break;
975 case 16:
976 ikind = 2;
977 break;
979 default:
980 gcc_unreachable ();
982 switch (kind)
984 case 1:
985 case 2:
986 if (expr->value.op.op1->ts.type == BT_INTEGER)
987 lse.expr = convert (gfc_int4_type_node, lse.expr);
988 else
989 gcc_unreachable ();
990 /* Fall through. */
992 case 4:
993 kind = 0;
994 break;
996 case 8:
997 kind = 1;
998 break;
1000 case 10:
1001 kind = 2;
1002 break;
1004 case 16:
1005 kind = 3;
1006 break;
1008 default:
1009 gcc_unreachable ();
1012 switch (expr->value.op.op1->ts.type)
1014 case BT_INTEGER:
1015 if (kind == 3) /* Case 16 was not handled properly above. */
1016 kind = 2;
1017 fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
1018 break;
1020 case BT_REAL:
1021 /* Use builtins for real ** int4. */
1022 if (ikind == 0)
1024 switch (kind)
1026 case 0:
1027 fndecl = built_in_decls[BUILT_IN_POWIF];
1028 break;
1030 case 1:
1031 fndecl = built_in_decls[BUILT_IN_POWI];
1032 break;
1034 case 2:
1035 case 3:
1036 fndecl = built_in_decls[BUILT_IN_POWIL];
1037 break;
1039 default:
1040 gcc_unreachable ();
1043 else
1044 fndecl = gfor_fndecl_math_powi[kind][ikind].real;
1045 break;
1047 case BT_COMPLEX:
1048 fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
1049 break;
1051 default:
1052 gcc_unreachable ();
1054 break;
1056 case BT_REAL:
1057 switch (kind)
1059 case 4:
1060 fndecl = built_in_decls[BUILT_IN_POWF];
1061 break;
1062 case 8:
1063 fndecl = built_in_decls[BUILT_IN_POW];
1064 break;
1065 case 10:
1066 case 16:
1067 fndecl = built_in_decls[BUILT_IN_POWL];
1068 break;
1069 default:
1070 gcc_unreachable ();
1072 break;
1074 case BT_COMPLEX:
1075 switch (kind)
1077 case 4:
1078 fndecl = built_in_decls[BUILT_IN_CPOWF];
1079 break;
1080 case 8:
1081 fndecl = built_in_decls[BUILT_IN_CPOW];
1082 break;
1083 case 10:
1084 case 16:
1085 fndecl = built_in_decls[BUILT_IN_CPOWL];
1086 break;
1087 default:
1088 gcc_unreachable ();
1090 break;
1092 default:
1093 gcc_unreachable ();
1094 break;
1097 se->expr = build_call_expr_loc (input_location,
1098 fndecl, 2, lse.expr, rse.expr);
1102 /* Generate code to allocate a string temporary. */
1104 tree
1105 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
1107 tree var;
1108 tree tmp;
1110 gcc_assert (types_compatible_p (TREE_TYPE (len), gfc_charlen_type_node));
1112 if (gfc_can_put_var_on_stack (len))
1114 /* Create a temporary variable to hold the result. */
1115 tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
1116 build_int_cst (gfc_charlen_type_node, 1));
1117 tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
1119 if (TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
1120 tmp = build_array_type (TREE_TYPE (TREE_TYPE (type)), tmp);
1121 else
1122 tmp = build_array_type (TREE_TYPE (type), tmp);
1124 var = gfc_create_var (tmp, "str");
1125 var = gfc_build_addr_expr (type, var);
1127 else
1129 /* Allocate a temporary to hold the result. */
1130 var = gfc_create_var (type, "pstr");
1131 tmp = gfc_call_malloc (&se->pre, type,
1132 fold_build2 (MULT_EXPR, TREE_TYPE (len), len,
1133 fold_convert (TREE_TYPE (len),
1134 TYPE_SIZE (type))));
1135 gfc_add_modify (&se->pre, var, tmp);
1137 /* Free the temporary afterwards. */
1138 tmp = gfc_call_free (convert (pvoid_type_node, var));
1139 gfc_add_expr_to_block (&se->post, tmp);
1142 return var;
1146 /* Handle a string concatenation operation. A temporary will be allocated to
1147 hold the result. */
1149 static void
1150 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
1152 gfc_se lse, rse;
1153 tree len, type, var, tmp, fndecl;
1155 gcc_assert (expr->value.op.op1->ts.type == BT_CHARACTER
1156 && expr->value.op.op2->ts.type == BT_CHARACTER);
1157 gcc_assert (expr->value.op.op1->ts.kind == expr->value.op.op2->ts.kind);
1159 gfc_init_se (&lse, se);
1160 gfc_conv_expr (&lse, expr->value.op.op1);
1161 gfc_conv_string_parameter (&lse);
1162 gfc_init_se (&rse, se);
1163 gfc_conv_expr (&rse, expr->value.op.op2);
1164 gfc_conv_string_parameter (&rse);
1166 gfc_add_block_to_block (&se->pre, &lse.pre);
1167 gfc_add_block_to_block (&se->pre, &rse.pre);
1169 type = gfc_get_character_type (expr->ts.kind, expr->ts.u.cl);
1170 len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
1171 if (len == NULL_TREE)
1173 len = fold_build2 (PLUS_EXPR, TREE_TYPE (lse.string_length),
1174 lse.string_length, rse.string_length);
1177 type = build_pointer_type (type);
1179 var = gfc_conv_string_tmp (se, type, len);
1181 /* Do the actual concatenation. */
1182 if (expr->ts.kind == 1)
1183 fndecl = gfor_fndecl_concat_string;
1184 else if (expr->ts.kind == 4)
1185 fndecl = gfor_fndecl_concat_string_char4;
1186 else
1187 gcc_unreachable ();
1189 tmp = build_call_expr_loc (input_location,
1190 fndecl, 6, len, var, lse.string_length, lse.expr,
1191 rse.string_length, rse.expr);
1192 gfc_add_expr_to_block (&se->pre, tmp);
1194 /* Add the cleanup for the operands. */
1195 gfc_add_block_to_block (&se->pre, &rse.post);
1196 gfc_add_block_to_block (&se->pre, &lse.post);
1198 se->expr = var;
1199 se->string_length = len;
1202 /* Translates an op expression. Common (binary) cases are handled by this
1203 function, others are passed on. Recursion is used in either case.
1204 We use the fact that (op1.ts == op2.ts) (except for the power
1205 operator **).
1206 Operators need no special handling for scalarized expressions as long as
1207 they call gfc_conv_simple_val to get their operands.
1208 Character strings get special handling. */
1210 static void
1211 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
1213 enum tree_code code;
1214 gfc_se lse;
1215 gfc_se rse;
1216 tree tmp, type;
1217 int lop;
1218 int checkstring;
1220 checkstring = 0;
1221 lop = 0;
1222 switch (expr->value.op.op)
1224 case INTRINSIC_PARENTHESES:
1225 if (expr->ts.type == BT_REAL
1226 || expr->ts.type == BT_COMPLEX)
1228 gfc_conv_unary_op (PAREN_EXPR, se, expr);
1229 gcc_assert (FLOAT_TYPE_P (TREE_TYPE (se->expr)));
1230 return;
1233 /* Fallthrough. */
1234 case INTRINSIC_UPLUS:
1235 gfc_conv_expr (se, expr->value.op.op1);
1236 return;
1238 case INTRINSIC_UMINUS:
1239 gfc_conv_unary_op (NEGATE_EXPR, se, expr);
1240 return;
1242 case INTRINSIC_NOT:
1243 gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
1244 return;
1246 case INTRINSIC_PLUS:
1247 code = PLUS_EXPR;
1248 break;
1250 case INTRINSIC_MINUS:
1251 code = MINUS_EXPR;
1252 break;
1254 case INTRINSIC_TIMES:
1255 code = MULT_EXPR;
1256 break;
1258 case INTRINSIC_DIVIDE:
1259 /* If expr is a real or complex expr, use an RDIV_EXPR. If op1 is
1260 an integer, we must round towards zero, so we use a
1261 TRUNC_DIV_EXPR. */
1262 if (expr->ts.type == BT_INTEGER)
1263 code = TRUNC_DIV_EXPR;
1264 else
1265 code = RDIV_EXPR;
1266 break;
1268 case INTRINSIC_POWER:
1269 gfc_conv_power_op (se, expr);
1270 return;
1272 case INTRINSIC_CONCAT:
1273 gfc_conv_concat_op (se, expr);
1274 return;
1276 case INTRINSIC_AND:
1277 code = TRUTH_ANDIF_EXPR;
1278 lop = 1;
1279 break;
1281 case INTRINSIC_OR:
1282 code = TRUTH_ORIF_EXPR;
1283 lop = 1;
1284 break;
1286 /* EQV and NEQV only work on logicals, but since we represent them
1287 as integers, we can use EQ_EXPR and NE_EXPR for them in GIMPLE. */
1288 case INTRINSIC_EQ:
1289 case INTRINSIC_EQ_OS:
1290 case INTRINSIC_EQV:
1291 code = EQ_EXPR;
1292 checkstring = 1;
1293 lop = 1;
1294 break;
1296 case INTRINSIC_NE:
1297 case INTRINSIC_NE_OS:
1298 case INTRINSIC_NEQV:
1299 code = NE_EXPR;
1300 checkstring = 1;
1301 lop = 1;
1302 break;
1304 case INTRINSIC_GT:
1305 case INTRINSIC_GT_OS:
1306 code = GT_EXPR;
1307 checkstring = 1;
1308 lop = 1;
1309 break;
1311 case INTRINSIC_GE:
1312 case INTRINSIC_GE_OS:
1313 code = GE_EXPR;
1314 checkstring = 1;
1315 lop = 1;
1316 break;
1318 case INTRINSIC_LT:
1319 case INTRINSIC_LT_OS:
1320 code = LT_EXPR;
1321 checkstring = 1;
1322 lop = 1;
1323 break;
1325 case INTRINSIC_LE:
1326 case INTRINSIC_LE_OS:
1327 code = LE_EXPR;
1328 checkstring = 1;
1329 lop = 1;
1330 break;
1332 case INTRINSIC_USER:
1333 case INTRINSIC_ASSIGN:
1334 /* These should be converted into function calls by the frontend. */
1335 gcc_unreachable ();
1337 default:
1338 fatal_error ("Unknown intrinsic op");
1339 return;
1342 /* The only exception to this is **, which is handled separately anyway. */
1343 gcc_assert (expr->value.op.op1->ts.type == expr->value.op.op2->ts.type);
1345 if (checkstring && expr->value.op.op1->ts.type != BT_CHARACTER)
1346 checkstring = 0;
1348 /* lhs */
1349 gfc_init_se (&lse, se);
1350 gfc_conv_expr (&lse, expr->value.op.op1);
1351 gfc_add_block_to_block (&se->pre, &lse.pre);
1353 /* rhs */
1354 gfc_init_se (&rse, se);
1355 gfc_conv_expr (&rse, expr->value.op.op2);
1356 gfc_add_block_to_block (&se->pre, &rse.pre);
1358 if (checkstring)
1360 gfc_conv_string_parameter (&lse);
1361 gfc_conv_string_parameter (&rse);
1363 lse.expr = gfc_build_compare_string (lse.string_length, lse.expr,
1364 rse.string_length, rse.expr,
1365 expr->value.op.op1->ts.kind);
1366 rse.expr = build_int_cst (TREE_TYPE (lse.expr), 0);
1367 gfc_add_block_to_block (&lse.post, &rse.post);
1370 type = gfc_typenode_for_spec (&expr->ts);
1372 if (lop)
1374 /* The result of logical ops is always boolean_type_node. */
1375 tmp = fold_build2 (code, boolean_type_node, lse.expr, rse.expr);
1376 se->expr = convert (type, tmp);
1378 else
1379 se->expr = fold_build2 (code, type, lse.expr, rse.expr);
1381 /* Add the post blocks. */
1382 gfc_add_block_to_block (&se->post, &rse.post);
1383 gfc_add_block_to_block (&se->post, &lse.post);
1386 /* If a string's length is one, we convert it to a single character. */
1388 static tree
1389 string_to_single_character (tree len, tree str, int kind)
1391 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str)));
1393 if (INTEGER_CST_P (len) && TREE_INT_CST_LOW (len) == 1
1394 && TREE_INT_CST_HIGH (len) == 0)
1396 str = fold_convert (gfc_get_pchar_type (kind), str);
1397 return build_fold_indirect_ref_loc (input_location,
1398 str);
1401 return NULL_TREE;
1405 void
1406 gfc_conv_scalar_char_value (gfc_symbol *sym, gfc_se *se, gfc_expr **expr)
1409 if (sym->backend_decl)
1411 /* This becomes the nominal_type in
1412 function.c:assign_parm_find_data_types. */
1413 TREE_TYPE (sym->backend_decl) = unsigned_char_type_node;
1414 /* This becomes the passed_type in
1415 function.c:assign_parm_find_data_types. C promotes char to
1416 integer for argument passing. */
1417 DECL_ARG_TYPE (sym->backend_decl) = unsigned_type_node;
1419 DECL_BY_REFERENCE (sym->backend_decl) = 0;
1422 if (expr != NULL)
1424 /* If we have a constant character expression, make it into an
1425 integer. */
1426 if ((*expr)->expr_type == EXPR_CONSTANT)
1428 gfc_typespec ts;
1429 gfc_clear_ts (&ts);
1431 *expr = gfc_int_expr ((int)(*expr)->value.character.string[0]);
1432 if ((*expr)->ts.kind != gfc_c_int_kind)
1434 /* The expr needs to be compatible with a C int. If the
1435 conversion fails, then the 2 causes an ICE. */
1436 ts.type = BT_INTEGER;
1437 ts.kind = gfc_c_int_kind;
1438 gfc_convert_type (*expr, &ts, 2);
1441 else if (se != NULL && (*expr)->expr_type == EXPR_VARIABLE)
1443 if ((*expr)->ref == NULL)
1445 se->expr = string_to_single_character
1446 (build_int_cst (integer_type_node, 1),
1447 gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
1448 gfc_get_symbol_decl
1449 ((*expr)->symtree->n.sym)),
1450 (*expr)->ts.kind);
1452 else
1454 gfc_conv_variable (se, *expr);
1455 se->expr = string_to_single_character
1456 (build_int_cst (integer_type_node, 1),
1457 gfc_build_addr_expr (gfc_get_pchar_type ((*expr)->ts.kind),
1458 se->expr),
1459 (*expr)->ts.kind);
1466 /* Compare two strings. If they are all single characters, the result is the
1467 subtraction of them. Otherwise, we build a library call. */
1469 tree
1470 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2, int kind)
1472 tree sc1;
1473 tree sc2;
1474 tree tmp;
1476 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str1)));
1477 gcc_assert (POINTER_TYPE_P (TREE_TYPE (str2)));
1479 sc1 = string_to_single_character (len1, str1, kind);
1480 sc2 = string_to_single_character (len2, str2, kind);
1482 if (sc1 != NULL_TREE && sc2 != NULL_TREE)
1484 /* Deal with single character specially. */
1485 sc1 = fold_convert (integer_type_node, sc1);
1486 sc2 = fold_convert (integer_type_node, sc2);
1487 tmp = fold_build2 (MINUS_EXPR, integer_type_node, sc1, sc2);
1489 else
1491 /* Build a call for the comparison. */
1492 tree fndecl;
1494 if (kind == 1)
1495 fndecl = gfor_fndecl_compare_string;
1496 else if (kind == 4)
1497 fndecl = gfor_fndecl_compare_string_char4;
1498 else
1499 gcc_unreachable ();
1501 tmp = build_call_expr_loc (input_location,
1502 fndecl, 4, len1, str1, len2, str2);
1505 return tmp;
1509 /* Return the backend_decl for a procedure pointer component. */
1511 static tree
1512 get_proc_ptr_comp (gfc_expr *e)
1514 gfc_se comp_se;
1515 gfc_expr *e2;
1516 gfc_init_se (&comp_se, NULL);
1517 e2 = gfc_copy_expr (e);
1518 e2->expr_type = EXPR_VARIABLE;
1519 gfc_conv_expr (&comp_se, e2);
1520 gfc_free_expr (e2);
1521 return build_fold_addr_expr_loc (input_location, comp_se.expr);
1525 /* Select a class typebound procedure at runtime. */
1526 static void
1527 select_class_proc (gfc_se *se, gfc_class_esym_list *elist,
1528 tree declared, gfc_expr *expr)
1530 tree end_label;
1531 tree label;
1532 tree tmp;
1533 tree hash;
1534 stmtblock_t body;
1535 gfc_class_esym_list *next_elist, *tmp_elist;
1536 gfc_se tmpse;
1538 /* Convert the hash expression. */
1539 gfc_init_se (&tmpse, NULL);
1540 gfc_conv_expr (&tmpse, elist->hash_value);
1541 gfc_add_block_to_block (&se->pre, &tmpse.pre);
1542 hash = gfc_evaluate_now (tmpse.expr, &se->pre);
1543 gfc_add_block_to_block (&se->post, &tmpse.post);
1545 /* Fix the function type to be that of the declared type method. */
1546 declared = gfc_create_var (TREE_TYPE (declared), "method");
1548 end_label = gfc_build_label_decl (NULL_TREE);
1550 gfc_init_block (&body);
1552 /* Go through the list of extensions. */
1553 for (; elist; elist = next_elist)
1555 /* This case has already been added. */
1556 if (elist->derived == NULL)
1557 goto free_elist;
1559 /* Skip abstract base types. */
1560 if (elist->derived->attr.abstract)
1561 goto free_elist;
1563 /* Run through the chain picking up all the cases that call the
1564 same procedure. */
1565 tmp_elist = elist;
1566 for (; elist; elist = elist->next)
1568 tree cval;
1570 if (elist->esym != tmp_elist->esym)
1571 continue;
1573 cval = build_int_cst (TREE_TYPE (hash),
1574 elist->derived->hash_value);
1575 /* Build a label for the hash value. */
1576 label = gfc_build_label_decl (NULL_TREE);
1577 tmp = fold_build3 (CASE_LABEL_EXPR, void_type_node,
1578 cval, NULL_TREE, label);
1579 gfc_add_expr_to_block (&body, tmp);
1581 /* Null the reference the derived type so that this case is
1582 not used again. */
1583 elist->derived = NULL;
1586 elist = tmp_elist;
1588 /* Get a pointer to the procedure, */
1589 tmp = gfc_get_symbol_decl (elist->esym);
1590 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1592 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1593 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
1596 /* Assign the pointer to the appropriate procedure. */
1597 gfc_add_modify (&body, declared,
1598 fold_convert (TREE_TYPE (declared), tmp));
1600 /* Break to the end of the construct. */
1601 tmp = build1_v (GOTO_EXPR, end_label);
1602 gfc_add_expr_to_block (&body, tmp);
1604 /* Free the elists as we go; freeing them in gfc_free_expr causes
1605 segfaults because it occurs too early and too often. */
1606 free_elist:
1607 next_elist = elist->next;
1608 if (elist->hash_value)
1609 gfc_free_expr (elist->hash_value);
1610 gfc_free (elist);
1611 elist = NULL;
1614 /* Default is an error. */
1615 label = gfc_build_label_decl (NULL_TREE);
1616 tmp = fold_build3 (CASE_LABEL_EXPR, void_type_node,
1617 NULL_TREE, NULL_TREE, label);
1618 gfc_add_expr_to_block (&body, tmp);
1619 tmp = gfc_trans_runtime_error (true, &expr->where,
1620 "internal error: bad hash value in dynamic dispatch");
1621 gfc_add_expr_to_block (&body, tmp);
1623 /* Write the switch expression. */
1624 tmp = gfc_finish_block (&body);
1625 tmp = build3_v (SWITCH_EXPR, hash, tmp, NULL_TREE);
1626 gfc_add_expr_to_block (&se->pre, tmp);
1628 tmp = build1_v (LABEL_EXPR, end_label);
1629 gfc_add_expr_to_block (&se->pre, tmp);
1631 se->expr = declared;
1632 return;
1636 static void
1637 conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr)
1639 tree tmp;
1641 if (expr && expr->symtree
1642 && expr->value.function.class_esym)
1644 if (!sym->backend_decl)
1645 sym->backend_decl = gfc_get_extern_function_decl (sym);
1647 tmp = sym->backend_decl;
1649 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1651 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1652 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
1655 select_class_proc (se, expr->value.function.class_esym,
1656 tmp, expr);
1657 return;
1660 if (gfc_is_proc_ptr_comp (expr, NULL))
1661 tmp = get_proc_ptr_comp (expr);
1662 else if (sym->attr.dummy)
1664 tmp = gfc_get_symbol_decl (sym);
1665 if (sym->attr.proc_pointer)
1666 tmp = build_fold_indirect_ref_loc (input_location,
1667 tmp);
1668 gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1669 && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
1671 else
1673 if (!sym->backend_decl)
1674 sym->backend_decl = gfc_get_extern_function_decl (sym);
1676 tmp = sym->backend_decl;
1678 if (sym->attr.cray_pointee)
1680 /* TODO - make the cray pointee a pointer to a procedure,
1681 assign the pointer to it and use it for the call. This
1682 will do for now! */
1683 tmp = convert (build_pointer_type (TREE_TYPE (tmp)),
1684 gfc_get_symbol_decl (sym->cp_pointer));
1685 tmp = gfc_evaluate_now (tmp, &se->pre);
1688 if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
1690 gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL);
1691 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
1694 se->expr = tmp;
1698 /* Initialize MAPPING. */
1700 void
1701 gfc_init_interface_mapping (gfc_interface_mapping * mapping)
1703 mapping->syms = NULL;
1704 mapping->charlens = NULL;
1708 /* Free all memory held by MAPPING (but not MAPPING itself). */
1710 void
1711 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1713 gfc_interface_sym_mapping *sym;
1714 gfc_interface_sym_mapping *nextsym;
1715 gfc_charlen *cl;
1716 gfc_charlen *nextcl;
1718 for (sym = mapping->syms; sym; sym = nextsym)
1720 nextsym = sym->next;
1721 sym->new_sym->n.sym->formal = NULL;
1722 gfc_free_symbol (sym->new_sym->n.sym);
1723 gfc_free_expr (sym->expr);
1724 gfc_free (sym->new_sym);
1725 gfc_free (sym);
1727 for (cl = mapping->charlens; cl; cl = nextcl)
1729 nextcl = cl->next;
1730 gfc_free_expr (cl->length);
1731 gfc_free (cl);
1736 /* Return a copy of gfc_charlen CL. Add the returned structure to
1737 MAPPING so that it will be freed by gfc_free_interface_mapping. */
1739 static gfc_charlen *
1740 gfc_get_interface_mapping_charlen (gfc_interface_mapping * mapping,
1741 gfc_charlen * cl)
1743 gfc_charlen *new_charlen;
1745 new_charlen = gfc_get_charlen ();
1746 new_charlen->next = mapping->charlens;
1747 new_charlen->length = gfc_copy_expr (cl->length);
1749 mapping->charlens = new_charlen;
1750 return new_charlen;
1754 /* A subroutine of gfc_add_interface_mapping. Return a descriptorless
1755 array variable that can be used as the actual argument for dummy
1756 argument SYM. Add any initialization code to BLOCK. PACKED is as
1757 for gfc_get_nodesc_array_type and DATA points to the first element
1758 in the passed array. */
1760 static tree
1761 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1762 gfc_packed packed, tree data)
1764 tree type;
1765 tree var;
1767 type = gfc_typenode_for_spec (&sym->ts);
1768 type = gfc_get_nodesc_array_type (type, sym->as, packed,
1769 !sym->attr.target && !sym->attr.pointer
1770 && !sym->attr.proc_pointer);
1772 var = gfc_create_var (type, "ifm");
1773 gfc_add_modify (block, var, fold_convert (type, data));
1775 return var;
1779 /* A subroutine of gfc_add_interface_mapping. Set the stride, upper bounds
1780 and offset of descriptorless array type TYPE given that it has the same
1781 size as DESC. Add any set-up code to BLOCK. */
1783 static void
1784 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
1786 int n;
1787 tree dim;
1788 tree offset;
1789 tree tmp;
1791 offset = gfc_index_zero_node;
1792 for (n = 0; n < GFC_TYPE_ARRAY_RANK (type); n++)
1794 dim = gfc_rank_cst[n];
1795 GFC_TYPE_ARRAY_STRIDE (type, n) = gfc_conv_array_stride (desc, n);
1796 if (GFC_TYPE_ARRAY_LBOUND (type, n) == NULL_TREE)
1798 GFC_TYPE_ARRAY_LBOUND (type, n)
1799 = gfc_conv_descriptor_lbound_get (desc, dim);
1800 GFC_TYPE_ARRAY_UBOUND (type, n)
1801 = gfc_conv_descriptor_ubound_get (desc, dim);
1803 else if (GFC_TYPE_ARRAY_UBOUND (type, n) == NULL_TREE)
1805 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
1806 gfc_conv_descriptor_ubound_get (desc, dim),
1807 gfc_conv_descriptor_lbound_get (desc, dim));
1808 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
1809 GFC_TYPE_ARRAY_LBOUND (type, n),
1810 tmp);
1811 tmp = gfc_evaluate_now (tmp, block);
1812 GFC_TYPE_ARRAY_UBOUND (type, n) = tmp;
1814 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
1815 GFC_TYPE_ARRAY_LBOUND (type, n),
1816 GFC_TYPE_ARRAY_STRIDE (type, n));
1817 offset = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp);
1819 offset = gfc_evaluate_now (offset, block);
1820 GFC_TYPE_ARRAY_OFFSET (type) = offset;
1824 /* Extend MAPPING so that it maps dummy argument SYM to the value stored
1825 in SE. The caller may still use se->expr and se->string_length after
1826 calling this function. */
1828 void
1829 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1830 gfc_symbol * sym, gfc_se * se,
1831 gfc_expr *expr)
1833 gfc_interface_sym_mapping *sm;
1834 tree desc;
1835 tree tmp;
1836 tree value;
1837 gfc_symbol *new_sym;
1838 gfc_symtree *root;
1839 gfc_symtree *new_symtree;
1841 /* Create a new symbol to represent the actual argument. */
1842 new_sym = gfc_new_symbol (sym->name, NULL);
1843 new_sym->ts = sym->ts;
1844 new_sym->as = gfc_copy_array_spec (sym->as);
1845 new_sym->attr.referenced = 1;
1846 new_sym->attr.dimension = sym->attr.dimension;
1847 new_sym->attr.pointer = sym->attr.pointer;
1848 new_sym->attr.allocatable = sym->attr.allocatable;
1849 new_sym->attr.flavor = sym->attr.flavor;
1850 new_sym->attr.function = sym->attr.function;
1852 /* Ensure that the interface is available and that
1853 descriptors are passed for array actual arguments. */
1854 if (sym->attr.flavor == FL_PROCEDURE)
1856 new_sym->formal = expr->symtree->n.sym->formal;
1857 new_sym->attr.always_explicit
1858 = expr->symtree->n.sym->attr.always_explicit;
1861 /* Create a fake symtree for it. */
1862 root = NULL;
1863 new_symtree = gfc_new_symtree (&root, sym->name);
1864 new_symtree->n.sym = new_sym;
1865 gcc_assert (new_symtree == root);
1867 /* Create a dummy->actual mapping. */
1868 sm = XCNEW (gfc_interface_sym_mapping);
1869 sm->next = mapping->syms;
1870 sm->old = sym;
1871 sm->new_sym = new_symtree;
1872 sm->expr = gfc_copy_expr (expr);
1873 mapping->syms = sm;
1875 /* Stabilize the argument's value. */
1876 if (!sym->attr.function && se)
1877 se->expr = gfc_evaluate_now (se->expr, &se->pre);
1879 if (sym->ts.type == BT_CHARACTER)
1881 /* Create a copy of the dummy argument's length. */
1882 new_sym->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, sym->ts.u.cl);
1883 sm->expr->ts.u.cl = new_sym->ts.u.cl;
1885 /* If the length is specified as "*", record the length that
1886 the caller is passing. We should use the callee's length
1887 in all other cases. */
1888 if (!new_sym->ts.u.cl->length && se)
1890 se->string_length = gfc_evaluate_now (se->string_length, &se->pre);
1891 new_sym->ts.u.cl->backend_decl = se->string_length;
1895 if (!se)
1896 return;
1898 /* Use the passed value as-is if the argument is a function. */
1899 if (sym->attr.flavor == FL_PROCEDURE)
1900 value = se->expr;
1902 /* If the argument is either a string or a pointer to a string,
1903 convert it to a boundless character type. */
1904 else if (!sym->attr.dimension && sym->ts.type == BT_CHARACTER)
1906 tmp = gfc_get_character_type_len (sym->ts.kind, NULL);
1907 tmp = build_pointer_type (tmp);
1908 if (sym->attr.pointer)
1909 value = build_fold_indirect_ref_loc (input_location,
1910 se->expr);
1911 else
1912 value = se->expr;
1913 value = fold_convert (tmp, value);
1916 /* If the argument is a scalar, a pointer to an array or an allocatable,
1917 dereference it. */
1918 else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1919 value = build_fold_indirect_ref_loc (input_location,
1920 se->expr);
1922 /* For character(*), use the actual argument's descriptor. */
1923 else if (sym->ts.type == BT_CHARACTER && !new_sym->ts.u.cl->length)
1924 value = build_fold_indirect_ref_loc (input_location,
1925 se->expr);
1927 /* If the argument is an array descriptor, use it to determine
1928 information about the actual argument's shape. */
1929 else if (POINTER_TYPE_P (TREE_TYPE (se->expr))
1930 && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (se->expr))))
1932 /* Get the actual argument's descriptor. */
1933 desc = build_fold_indirect_ref_loc (input_location,
1934 se->expr);
1936 /* Create the replacement variable. */
1937 tmp = gfc_conv_descriptor_data_get (desc);
1938 value = gfc_get_interface_mapping_array (&se->pre, sym,
1939 PACKED_NO, tmp);
1941 /* Use DESC to work out the upper bounds, strides and offset. */
1942 gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
1944 else
1945 /* Otherwise we have a packed array. */
1946 value = gfc_get_interface_mapping_array (&se->pre, sym,
1947 PACKED_FULL, se->expr);
1949 new_sym->backend_decl = value;
1953 /* Called once all dummy argument mappings have been added to MAPPING,
1954 but before the mapping is used to evaluate expressions. Pre-evaluate
1955 the length of each argument, adding any initialization code to PRE and
1956 any finalization code to POST. */
1958 void
1959 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1960 stmtblock_t * pre, stmtblock_t * post)
1962 gfc_interface_sym_mapping *sym;
1963 gfc_expr *expr;
1964 gfc_se se;
1966 for (sym = mapping->syms; sym; sym = sym->next)
1967 if (sym->new_sym->n.sym->ts.type == BT_CHARACTER
1968 && !sym->new_sym->n.sym->ts.u.cl->backend_decl)
1970 expr = sym->new_sym->n.sym->ts.u.cl->length;
1971 gfc_apply_interface_mapping_to_expr (mapping, expr);
1972 gfc_init_se (&se, NULL);
1973 gfc_conv_expr (&se, expr);
1974 se.expr = fold_convert (gfc_charlen_type_node, se.expr);
1975 se.expr = gfc_evaluate_now (se.expr, &se.pre);
1976 gfc_add_block_to_block (pre, &se.pre);
1977 gfc_add_block_to_block (post, &se.post);
1979 sym->new_sym->n.sym->ts.u.cl->backend_decl = se.expr;
1984 /* Like gfc_apply_interface_mapping_to_expr, but applied to
1985 constructor C. */
1987 static void
1988 gfc_apply_interface_mapping_to_cons (gfc_interface_mapping * mapping,
1989 gfc_constructor * c)
1991 for (; c; c = c->next)
1993 gfc_apply_interface_mapping_to_expr (mapping, c->expr);
1994 if (c->iterator)
1996 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->start);
1997 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->end);
1998 gfc_apply_interface_mapping_to_expr (mapping, c->iterator->step);
2004 /* Like gfc_apply_interface_mapping_to_expr, but applied to
2005 reference REF. */
2007 static void
2008 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
2009 gfc_ref * ref)
2011 int n;
2013 for (; ref; ref = ref->next)
2014 switch (ref->type)
2016 case REF_ARRAY:
2017 for (n = 0; n < ref->u.ar.dimen; n++)
2019 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.start[n]);
2020 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.end[n]);
2021 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.stride[n]);
2023 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ar.offset);
2024 break;
2026 case REF_COMPONENT:
2027 break;
2029 case REF_SUBSTRING:
2030 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
2031 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
2032 break;
2037 /* Convert intrinsic function calls into result expressions. */
2039 static bool
2040 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping)
2042 gfc_symbol *sym;
2043 gfc_expr *new_expr;
2044 gfc_expr *arg1;
2045 gfc_expr *arg2;
2046 int d, dup;
2048 arg1 = expr->value.function.actual->expr;
2049 if (expr->value.function.actual->next)
2050 arg2 = expr->value.function.actual->next->expr;
2051 else
2052 arg2 = NULL;
2054 sym = arg1->symtree->n.sym;
2056 if (sym->attr.dummy)
2057 return false;
2059 new_expr = NULL;
2061 switch (expr->value.function.isym->id)
2063 case GFC_ISYM_LEN:
2064 /* TODO figure out why this condition is necessary. */
2065 if (sym->attr.function
2066 && (arg1->ts.u.cl->length == NULL
2067 || (arg1->ts.u.cl->length->expr_type != EXPR_CONSTANT
2068 && arg1->ts.u.cl->length->expr_type != EXPR_VARIABLE)))
2069 return false;
2071 new_expr = gfc_copy_expr (arg1->ts.u.cl->length);
2072 break;
2074 case GFC_ISYM_SIZE:
2075 if (!sym->as)
2076 return false;
2078 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2080 dup = mpz_get_si (arg2->value.integer);
2081 d = dup - 1;
2083 else
2085 dup = sym->as->rank;
2086 d = 0;
2089 for (; d < dup; d++)
2091 gfc_expr *tmp;
2093 if (!sym->as->upper[d] || !sym->as->lower[d])
2095 gfc_free_expr (new_expr);
2096 return false;
2099 tmp = gfc_add (gfc_copy_expr (sym->as->upper[d]), gfc_int_expr (1));
2100 tmp = gfc_subtract (tmp, gfc_copy_expr (sym->as->lower[d]));
2101 if (new_expr)
2102 new_expr = gfc_multiply (new_expr, tmp);
2103 else
2104 new_expr = tmp;
2106 break;
2108 case GFC_ISYM_LBOUND:
2109 case GFC_ISYM_UBOUND:
2110 /* TODO These implementations of lbound and ubound do not limit if
2111 the size < 0, according to F95's 13.14.53 and 13.14.113. */
2113 if (!sym->as)
2114 return false;
2116 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2117 d = mpz_get_si (arg2->value.integer) - 1;
2118 else
2119 /* TODO: If the need arises, this could produce an array of
2120 ubound/lbounds. */
2121 gcc_unreachable ();
2123 if (expr->value.function.isym->id == GFC_ISYM_LBOUND)
2125 if (sym->as->lower[d])
2126 new_expr = gfc_copy_expr (sym->as->lower[d]);
2128 else
2130 if (sym->as->upper[d])
2131 new_expr = gfc_copy_expr (sym->as->upper[d]);
2133 break;
2135 default:
2136 break;
2139 gfc_apply_interface_mapping_to_expr (mapping, new_expr);
2140 if (!new_expr)
2141 return false;
2143 gfc_replace_expr (expr, new_expr);
2144 return true;
2148 static void
2149 gfc_map_fcn_formal_to_actual (gfc_expr *expr, gfc_expr *map_expr,
2150 gfc_interface_mapping * mapping)
2152 gfc_formal_arglist *f;
2153 gfc_actual_arglist *actual;
2155 actual = expr->value.function.actual;
2156 f = map_expr->symtree->n.sym->formal;
2158 for (; f && actual; f = f->next, actual = actual->next)
2160 if (!actual->expr)
2161 continue;
2163 gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
2166 if (map_expr->symtree->n.sym->attr.dimension)
2168 int d;
2169 gfc_array_spec *as;
2171 as = gfc_copy_array_spec (map_expr->symtree->n.sym->as);
2173 for (d = 0; d < as->rank; d++)
2175 gfc_apply_interface_mapping_to_expr (mapping, as->lower[d]);
2176 gfc_apply_interface_mapping_to_expr (mapping, as->upper[d]);
2179 expr->value.function.esym->as = as;
2182 if (map_expr->symtree->n.sym->ts.type == BT_CHARACTER)
2184 expr->value.function.esym->ts.u.cl->length
2185 = gfc_copy_expr (map_expr->symtree->n.sym->ts.u.cl->length);
2187 gfc_apply_interface_mapping_to_expr (mapping,
2188 expr->value.function.esym->ts.u.cl->length);
2193 /* EXPR is a copy of an expression that appeared in the interface
2194 associated with MAPPING. Walk it recursively looking for references to
2195 dummy arguments that MAPPING maps to actual arguments. Replace each such
2196 reference with a reference to the associated actual argument. */
2198 static void
2199 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
2200 gfc_expr * expr)
2202 gfc_interface_sym_mapping *sym;
2203 gfc_actual_arglist *actual;
2205 if (!expr)
2206 return;
2208 /* Copying an expression does not copy its length, so do that here. */
2209 if (expr->ts.type == BT_CHARACTER && expr->ts.u.cl)
2211 expr->ts.u.cl = gfc_get_interface_mapping_charlen (mapping, expr->ts.u.cl);
2212 gfc_apply_interface_mapping_to_expr (mapping, expr->ts.u.cl->length);
2215 /* Apply the mapping to any references. */
2216 gfc_apply_interface_mapping_to_ref (mapping, expr->ref);
2218 /* ...and to the expression's symbol, if it has one. */
2219 /* TODO Find out why the condition on expr->symtree had to be moved into
2220 the loop rather than being outside it, as originally. */
2221 for (sym = mapping->syms; sym; sym = sym->next)
2222 if (expr->symtree && sym->old == expr->symtree->n.sym)
2224 if (sym->new_sym->n.sym->backend_decl)
2225 expr->symtree = sym->new_sym;
2226 else if (sym->expr)
2227 gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
2230 /* ...and to subexpressions in expr->value. */
2231 switch (expr->expr_type)
2233 case EXPR_VARIABLE:
2234 case EXPR_CONSTANT:
2235 case EXPR_NULL:
2236 case EXPR_SUBSTRING:
2237 break;
2239 case EXPR_OP:
2240 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
2241 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
2242 break;
2244 case EXPR_FUNCTION:
2245 for (actual = expr->value.function.actual; actual; actual = actual->next)
2246 gfc_apply_interface_mapping_to_expr (mapping, actual->expr);
2248 if (expr->value.function.esym == NULL
2249 && expr->value.function.isym != NULL
2250 && expr->value.function.actual->expr->symtree
2251 && gfc_map_intrinsic_function (expr, mapping))
2252 break;
2254 for (sym = mapping->syms; sym; sym = sym->next)
2255 if (sym->old == expr->value.function.esym)
2257 expr->value.function.esym = sym->new_sym->n.sym;
2258 gfc_map_fcn_formal_to_actual (expr, sym->expr, mapping);
2259 expr->value.function.esym->result = sym->new_sym->n.sym;
2261 break;
2263 case EXPR_ARRAY:
2264 case EXPR_STRUCTURE:
2265 gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
2266 break;
2268 case EXPR_COMPCALL:
2269 case EXPR_PPC:
2270 gcc_unreachable ();
2271 break;
2274 return;
2278 /* Evaluate interface expression EXPR using MAPPING. Store the result
2279 in SE. */
2281 void
2282 gfc_apply_interface_mapping (gfc_interface_mapping * mapping,
2283 gfc_se * se, gfc_expr * expr)
2285 expr = gfc_copy_expr (expr);
2286 gfc_apply_interface_mapping_to_expr (mapping, expr);
2287 gfc_conv_expr (se, expr);
2288 se->expr = gfc_evaluate_now (se->expr, &se->pre);
2289 gfc_free_expr (expr);
2293 /* Returns a reference to a temporary array into which a component of
2294 an actual argument derived type array is copied and then returned
2295 after the function call. */
2296 void
2297 gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr, int g77,
2298 sym_intent intent, bool formal_ptr)
2300 gfc_se lse;
2301 gfc_se rse;
2302 gfc_ss *lss;
2303 gfc_ss *rss;
2304 gfc_loopinfo loop;
2305 gfc_loopinfo loop2;
2306 gfc_ss_info *info;
2307 tree offset;
2308 tree tmp_index;
2309 tree tmp;
2310 tree base_type;
2311 tree size;
2312 stmtblock_t body;
2313 int n;
2314 int dimen;
2316 gcc_assert (expr->expr_type == EXPR_VARIABLE);
2318 gfc_init_se (&lse, NULL);
2319 gfc_init_se (&rse, NULL);
2321 /* Walk the argument expression. */
2322 rss = gfc_walk_expr (expr);
2324 gcc_assert (rss != gfc_ss_terminator);
2326 /* Initialize the scalarizer. */
2327 gfc_init_loopinfo (&loop);
2328 gfc_add_ss_to_loop (&loop, rss);
2330 /* Calculate the bounds of the scalarization. */
2331 gfc_conv_ss_startstride (&loop);
2333 /* Build an ss for the temporary. */
2334 if (expr->ts.type == BT_CHARACTER && !expr->ts.u.cl->backend_decl)
2335 gfc_conv_string_length (expr->ts.u.cl, expr, &parmse->pre);
2337 base_type = gfc_typenode_for_spec (&expr->ts);
2338 if (GFC_ARRAY_TYPE_P (base_type)
2339 || GFC_DESCRIPTOR_TYPE_P (base_type))
2340 base_type = gfc_get_element_type (base_type);
2342 loop.temp_ss = gfc_get_ss ();;
2343 loop.temp_ss->type = GFC_SS_TEMP;
2344 loop.temp_ss->data.temp.type = base_type;
2346 if (expr->ts.type == BT_CHARACTER)
2347 loop.temp_ss->string_length = expr->ts.u.cl->backend_decl;
2348 else
2349 loop.temp_ss->string_length = NULL;
2351 parmse->string_length = loop.temp_ss->string_length;
2352 loop.temp_ss->data.temp.dimen = loop.dimen;
2353 loop.temp_ss->next = gfc_ss_terminator;
2355 /* Associate the SS with the loop. */
2356 gfc_add_ss_to_loop (&loop, loop.temp_ss);
2358 /* Setup the scalarizing loops. */
2359 gfc_conv_loop_setup (&loop, &expr->where);
2361 /* Pass the temporary descriptor back to the caller. */
2362 info = &loop.temp_ss->data.info;
2363 parmse->expr = info->descriptor;
2365 /* Setup the gfc_se structures. */
2366 gfc_copy_loopinfo_to_se (&lse, &loop);
2367 gfc_copy_loopinfo_to_se (&rse, &loop);
2369 rse.ss = rss;
2370 lse.ss = loop.temp_ss;
2371 gfc_mark_ss_chain_used (rss, 1);
2372 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2374 /* Start the scalarized loop body. */
2375 gfc_start_scalarized_body (&loop, &body);
2377 /* Translate the expression. */
2378 gfc_conv_expr (&rse, expr);
2380 gfc_conv_tmp_array_ref (&lse);
2381 gfc_advance_se_ss_chain (&lse);
2383 if (intent != INTENT_OUT)
2385 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false);
2386 gfc_add_expr_to_block (&body, tmp);
2387 gcc_assert (rse.ss == gfc_ss_terminator);
2388 gfc_trans_scalarizing_loops (&loop, &body);
2390 else
2392 /* Make sure that the temporary declaration survives by merging
2393 all the loop declarations into the current context. */
2394 for (n = 0; n < loop.dimen; n++)
2396 gfc_merge_block_scope (&body);
2397 body = loop.code[loop.order[n]];
2399 gfc_merge_block_scope (&body);
2402 /* Add the post block after the second loop, so that any
2403 freeing of allocated memory is done at the right time. */
2404 gfc_add_block_to_block (&parmse->pre, &loop.pre);
2406 /**********Copy the temporary back again.*********/
2408 gfc_init_se (&lse, NULL);
2409 gfc_init_se (&rse, NULL);
2411 /* Walk the argument expression. */
2412 lss = gfc_walk_expr (expr);
2413 rse.ss = loop.temp_ss;
2414 lse.ss = lss;
2416 /* Initialize the scalarizer. */
2417 gfc_init_loopinfo (&loop2);
2418 gfc_add_ss_to_loop (&loop2, lss);
2420 /* Calculate the bounds of the scalarization. */
2421 gfc_conv_ss_startstride (&loop2);
2423 /* Setup the scalarizing loops. */
2424 gfc_conv_loop_setup (&loop2, &expr->where);
2426 gfc_copy_loopinfo_to_se (&lse, &loop2);
2427 gfc_copy_loopinfo_to_se (&rse, &loop2);
2429 gfc_mark_ss_chain_used (lss, 1);
2430 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2432 /* Declare the variable to hold the temporary offset and start the
2433 scalarized loop body. */
2434 offset = gfc_create_var (gfc_array_index_type, NULL);
2435 gfc_start_scalarized_body (&loop2, &body);
2437 /* Build the offsets for the temporary from the loop variables. The
2438 temporary array has lbounds of zero and strides of one in all
2439 dimensions, so this is very simple. The offset is only computed
2440 outside the innermost loop, so the overall transfer could be
2441 optimized further. */
2442 info = &rse.ss->data.info;
2443 dimen = info->dimen;
2445 tmp_index = gfc_index_zero_node;
2446 for (n = dimen - 1; n > 0; n--)
2448 tree tmp_str;
2449 tmp = rse.loop->loopvar[n];
2450 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2451 tmp, rse.loop->from[n]);
2452 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2453 tmp, tmp_index);
2455 tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2456 rse.loop->to[n-1], rse.loop->from[n-1]);
2457 tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2458 tmp_str, gfc_index_one_node);
2460 tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
2461 tmp, tmp_str);
2464 tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2465 tmp_index, rse.loop->from[0]);
2466 gfc_add_modify (&rse.loop->code[0], offset, tmp_index);
2468 tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2469 rse.loop->loopvar[0], offset);
2471 /* Now use the offset for the reference. */
2472 tmp = build_fold_indirect_ref_loc (input_location,
2473 info->data);
2474 rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
2476 if (expr->ts.type == BT_CHARACTER)
2477 rse.string_length = expr->ts.u.cl->backend_decl;
2479 gfc_conv_expr (&lse, expr);
2481 gcc_assert (lse.ss == gfc_ss_terminator);
2483 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
2484 gfc_add_expr_to_block (&body, tmp);
2486 /* Generate the copying loops. */
2487 gfc_trans_scalarizing_loops (&loop2, &body);
2489 /* Wrap the whole thing up by adding the second loop to the post-block
2490 and following it by the post-block of the first loop. In this way,
2491 if the temporary needs freeing, it is done after use! */
2492 if (intent != INTENT_IN)
2494 gfc_add_block_to_block (&parmse->post, &loop2.pre);
2495 gfc_add_block_to_block (&parmse->post, &loop2.post);
2498 gfc_add_block_to_block (&parmse->post, &loop.post);
2500 gfc_cleanup_loop (&loop);
2501 gfc_cleanup_loop (&loop2);
2503 /* Pass the string length to the argument expression. */
2504 if (expr->ts.type == BT_CHARACTER)
2505 parmse->string_length = expr->ts.u.cl->backend_decl;
2507 /* Determine the offset for pointer formal arguments and set the
2508 lbounds to one. */
2509 if (formal_ptr)
2511 size = gfc_index_one_node;
2512 offset = gfc_index_zero_node;
2513 for (n = 0; n < dimen; n++)
2515 tmp = gfc_conv_descriptor_ubound_get (parmse->expr,
2516 gfc_rank_cst[n]);
2517 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2518 tmp, gfc_index_one_node);
2519 gfc_conv_descriptor_ubound_set (&parmse->pre,
2520 parmse->expr,
2521 gfc_rank_cst[n],
2522 tmp);
2523 gfc_conv_descriptor_lbound_set (&parmse->pre,
2524 parmse->expr,
2525 gfc_rank_cst[n],
2526 gfc_index_one_node);
2527 size = gfc_evaluate_now (size, &parmse->pre);
2528 offset = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2529 offset, size);
2530 offset = gfc_evaluate_now (offset, &parmse->pre);
2531 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2532 rse.loop->to[n], rse.loop->from[n]);
2533 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2534 tmp, gfc_index_one_node);
2535 size = fold_build2 (MULT_EXPR, gfc_array_index_type,
2536 size, tmp);
2539 gfc_conv_descriptor_offset_set (&parmse->pre, parmse->expr,
2540 offset);
2543 /* We want either the address for the data or the address of the descriptor,
2544 depending on the mode of passing array arguments. */
2545 if (g77)
2546 parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
2547 else
2548 parmse->expr = gfc_build_addr_expr (NULL_TREE, parmse->expr);
2550 return;
2554 /* Generate the code for argument list functions. */
2556 static void
2557 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
2559 /* Pass by value for g77 %VAL(arg), pass the address
2560 indirectly for %LOC, else by reference. Thus %REF
2561 is a "do-nothing" and %LOC is the same as an F95
2562 pointer. */
2563 if (strncmp (name, "%VAL", 4) == 0)
2564 gfc_conv_expr (se, expr);
2565 else if (strncmp (name, "%LOC", 4) == 0)
2567 gfc_conv_expr_reference (se, expr);
2568 se->expr = gfc_build_addr_expr (NULL, se->expr);
2570 else if (strncmp (name, "%REF", 4) == 0)
2571 gfc_conv_expr_reference (se, expr);
2572 else
2573 gfc_error ("Unknown argument list function at %L", &expr->where);
2577 /* Takes a derived type expression and returns the address of a temporary
2578 class object of the 'declared' type. */
2579 static void
2580 gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e,
2581 gfc_typespec class_ts)
2583 gfc_component *cmp;
2584 gfc_symbol *vtab;
2585 gfc_symbol *declared = class_ts.u.derived;
2586 gfc_ss *ss;
2587 tree ctree;
2588 tree var;
2589 tree tmp;
2591 /* The derived type needs to be converted to a temporary
2592 CLASS object. */
2593 tmp = gfc_typenode_for_spec (&class_ts);
2594 var = gfc_create_var (tmp, "class");
2596 /* Set the vptr. */
2597 cmp = gfc_find_component (declared, "$vptr", true, true);
2598 ctree = fold_build3 (COMPONENT_REF, TREE_TYPE (cmp->backend_decl),
2599 var, cmp->backend_decl, NULL_TREE);
2601 /* Remember the vtab corresponds to the derived type
2602 not to the class declared type. */
2603 vtab = gfc_find_derived_vtab (e->ts.u.derived);
2604 gcc_assert (vtab);
2605 tmp = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtab));
2606 gfc_add_modify (&parmse->pre, ctree,
2607 fold_convert (TREE_TYPE (ctree), tmp));
2609 /* Now set the data field. */
2610 cmp = gfc_find_component (declared, "$data", true, true);
2611 ctree = fold_build3 (COMPONENT_REF, TREE_TYPE (cmp->backend_decl),
2612 var, cmp->backend_decl, NULL_TREE);
2613 ss = gfc_walk_expr (e);
2614 if (ss == gfc_ss_terminator)
2616 gfc_conv_expr_reference (parmse, e);
2617 tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
2618 gfc_add_modify (&parmse->pre, ctree, tmp);
2620 else
2622 gfc_conv_expr (parmse, e);
2623 gfc_add_modify (&parmse->pre, ctree, parmse->expr);
2626 /* Pass the address of the class object. */
2627 parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
2631 /* The following routine generates code for the intrinsic
2632 procedures from the ISO_C_BINDING module:
2633 * C_LOC (function)
2634 * C_FUNLOC (function)
2635 * C_F_POINTER (subroutine)
2636 * C_F_PROCPOINTER (subroutine)
2637 * C_ASSOCIATED (function)
2638 One exception which is not handled here is C_F_POINTER with non-scalar
2639 arguments. Returns 1 if the call was replaced by inline code (else: 0). */
2641 static int
2642 conv_isocbinding_procedure (gfc_se * se, gfc_symbol * sym,
2643 gfc_actual_arglist * arg)
2645 gfc_symbol *fsym;
2646 gfc_ss *argss;
2648 if (sym->intmod_sym_id == ISOCBINDING_LOC)
2650 if (arg->expr->rank == 0)
2651 gfc_conv_expr_reference (se, arg->expr);
2652 else
2654 int f;
2655 /* This is really the actual arg because no formal arglist is
2656 created for C_LOC. */
2657 fsym = arg->expr->symtree->n.sym;
2659 /* We should want it to do g77 calling convention. */
2660 f = (fsym != NULL)
2661 && !(fsym->attr.pointer || fsym->attr.allocatable)
2662 && fsym->as->type != AS_ASSUMED_SHAPE;
2663 f = f || !sym->attr.always_explicit;
2665 argss = gfc_walk_expr (arg->expr);
2666 gfc_conv_array_parameter (se, arg->expr, argss, f,
2667 NULL, NULL, NULL);
2670 /* TODO -- the following two lines shouldn't be necessary, but if
2671 they're removed, a bug is exposed later in the code path.
2672 This workaround was thus introduced, but will have to be
2673 removed; please see PR 35150 for details about the issue. */
2674 se->expr = convert (pvoid_type_node, se->expr);
2675 se->expr = gfc_evaluate_now (se->expr, &se->pre);
2677 return 1;
2679 else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2681 arg->expr->ts.type = sym->ts.u.derived->ts.type;
2682 arg->expr->ts.f90_type = sym->ts.u.derived->ts.f90_type;
2683 arg->expr->ts.kind = sym->ts.u.derived->ts.kind;
2684 gfc_conv_expr_reference (se, arg->expr);
2686 return 1;
2688 else if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER
2689 && arg->next->expr->rank == 0)
2690 || sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER)
2692 /* Convert c_f_pointer if fptr is a scalar
2693 and convert c_f_procpointer. */
2694 gfc_se cptrse;
2695 gfc_se fptrse;
2697 gfc_init_se (&cptrse, NULL);
2698 gfc_conv_expr (&cptrse, arg->expr);
2699 gfc_add_block_to_block (&se->pre, &cptrse.pre);
2700 gfc_add_block_to_block (&se->post, &cptrse.post);
2702 gfc_init_se (&fptrse, NULL);
2703 if (sym->intmod_sym_id == ISOCBINDING_F_POINTER
2704 || gfc_is_proc_ptr_comp (arg->next->expr, NULL))
2705 fptrse.want_pointer = 1;
2707 gfc_conv_expr (&fptrse, arg->next->expr);
2708 gfc_add_block_to_block (&se->pre, &fptrse.pre);
2709 gfc_add_block_to_block (&se->post, &fptrse.post);
2711 if (arg->next->expr->symtree->n.sym->attr.proc_pointer
2712 && arg->next->expr->symtree->n.sym->attr.dummy)
2713 fptrse.expr = build_fold_indirect_ref_loc (input_location,
2714 fptrse.expr);
2716 se->expr = fold_build2 (MODIFY_EXPR, TREE_TYPE (fptrse.expr),
2717 fptrse.expr,
2718 fold_convert (TREE_TYPE (fptrse.expr),
2719 cptrse.expr));
2721 return 1;
2723 else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2725 gfc_se arg1se;
2726 gfc_se arg2se;
2728 /* Build the addr_expr for the first argument. The argument is
2729 already an *address* so we don't need to set want_pointer in
2730 the gfc_se. */
2731 gfc_init_se (&arg1se, NULL);
2732 gfc_conv_expr (&arg1se, arg->expr);
2733 gfc_add_block_to_block (&se->pre, &arg1se.pre);
2734 gfc_add_block_to_block (&se->post, &arg1se.post);
2736 /* See if we were given two arguments. */
2737 if (arg->next == NULL)
2738 /* Only given one arg so generate a null and do a
2739 not-equal comparison against the first arg. */
2740 se->expr = fold_build2 (NE_EXPR, boolean_type_node, arg1se.expr,
2741 fold_convert (TREE_TYPE (arg1se.expr),
2742 null_pointer_node));
2743 else
2745 tree eq_expr;
2746 tree not_null_expr;
2748 /* Given two arguments so build the arg2se from second arg. */
2749 gfc_init_se (&arg2se, NULL);
2750 gfc_conv_expr (&arg2se, arg->next->expr);
2751 gfc_add_block_to_block (&se->pre, &arg2se.pre);
2752 gfc_add_block_to_block (&se->post, &arg2se.post);
2754 /* Generate test to compare that the two args are equal. */
2755 eq_expr = fold_build2 (EQ_EXPR, boolean_type_node,
2756 arg1se.expr, arg2se.expr);
2757 /* Generate test to ensure that the first arg is not null. */
2758 not_null_expr = fold_build2 (NE_EXPR, boolean_type_node,
2759 arg1se.expr, null_pointer_node);
2761 /* Finally, the generated test must check that both arg1 is not
2762 NULL and that it is equal to the second arg. */
2763 se->expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
2764 not_null_expr, eq_expr);
2767 return 1;
2770 /* Nothing was done. */
2771 return 0;
2775 /* Generate code for a procedure call. Note can return se->post != NULL.
2776 If se->direct_byref is set then se->expr contains the return parameter.
2777 Return nonzero, if the call has alternate specifiers.
2778 'expr' is only needed for procedure pointer components. */
2781 gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
2782 gfc_actual_arglist * arg, gfc_expr * expr,
2783 tree append_args)
2785 gfc_interface_mapping mapping;
2786 tree arglist;
2787 tree retargs;
2788 tree tmp;
2789 tree fntype;
2790 gfc_se parmse;
2791 gfc_ss *argss;
2792 gfc_ss_info *info;
2793 int byref;
2794 int parm_kind;
2795 tree type;
2796 tree var;
2797 tree len;
2798 tree stringargs;
2799 tree result = NULL;
2800 gfc_formal_arglist *formal;
2801 int has_alternate_specifier = 0;
2802 bool need_interface_mapping;
2803 bool callee_alloc;
2804 gfc_typespec ts;
2805 gfc_charlen cl;
2806 gfc_expr *e;
2807 gfc_symbol *fsym;
2808 stmtblock_t post;
2809 enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
2810 gfc_component *comp = NULL;
2812 arglist = NULL_TREE;
2813 retargs = NULL_TREE;
2814 stringargs = NULL_TREE;
2815 var = NULL_TREE;
2816 len = NULL_TREE;
2817 gfc_clear_ts (&ts);
2819 if (sym->from_intmod == INTMOD_ISO_C_BINDING
2820 && conv_isocbinding_procedure (se, sym, arg))
2821 return 0;
2823 gfc_is_proc_ptr_comp (expr, &comp);
2825 if (se->ss != NULL)
2827 if (!sym->attr.elemental)
2829 gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2830 if (se->ss->useflags)
2832 gcc_assert ((!comp && gfc_return_by_reference (sym)
2833 && sym->result->attr.dimension)
2834 || (comp && comp->attr.dimension));
2835 gcc_assert (se->loop != NULL);
2837 /* Access the previously obtained result. */
2838 gfc_conv_tmp_array_ref (se);
2839 gfc_advance_se_ss_chain (se);
2840 return 0;
2843 info = &se->ss->data.info;
2845 else
2846 info = NULL;
2848 gfc_init_block (&post);
2849 gfc_init_interface_mapping (&mapping);
2850 if (!comp)
2852 formal = sym->formal;
2853 need_interface_mapping = sym->attr.dimension ||
2854 (sym->ts.type == BT_CHARACTER
2855 && sym->ts.u.cl->length
2856 && sym->ts.u.cl->length->expr_type
2857 != EXPR_CONSTANT);
2859 else
2861 formal = comp->formal;
2862 need_interface_mapping = comp->attr.dimension ||
2863 (comp->ts.type == BT_CHARACTER
2864 && comp->ts.u.cl->length
2865 && comp->ts.u.cl->length->expr_type
2866 != EXPR_CONSTANT);
2869 /* Evaluate the arguments. */
2870 for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2872 e = arg->expr;
2873 fsym = formal ? formal->sym : NULL;
2874 parm_kind = MISSING;
2875 if (e == NULL)
2878 if (se->ignore_optional)
2880 /* Some intrinsics have already been resolved to the correct
2881 parameters. */
2882 continue;
2884 else if (arg->label)
2886 has_alternate_specifier = 1;
2887 continue;
2889 else
2891 /* Pass a NULL pointer for an absent arg. */
2892 gfc_init_se (&parmse, NULL);
2893 parmse.expr = null_pointer_node;
2894 if (arg->missing_arg_type == BT_CHARACTER)
2895 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2898 else if (fsym && fsym->ts.type == BT_CLASS
2899 && e->ts.type == BT_DERIVED)
2901 /* The derived type needs to be converted to a temporary
2902 CLASS object. */
2903 gfc_init_se (&parmse, se);
2904 gfc_conv_derived_to_class (&parmse, e, fsym->ts);
2906 else if (se->ss && se->ss->useflags)
2908 /* An elemental function inside a scalarized loop. */
2909 gfc_init_se (&parmse, se);
2910 gfc_conv_expr_reference (&parmse, e);
2911 parm_kind = ELEMENTAL;
2913 else
2915 /* A scalar or transformational function. */
2916 gfc_init_se (&parmse, NULL);
2917 argss = gfc_walk_expr (e);
2919 if (argss == gfc_ss_terminator)
2921 if (e->expr_type == EXPR_VARIABLE
2922 && e->symtree->n.sym->attr.cray_pointee
2923 && fsym && fsym->attr.flavor == FL_PROCEDURE)
2925 /* The Cray pointer needs to be converted to a pointer to
2926 a type given by the expression. */
2927 gfc_conv_expr (&parmse, e);
2928 type = build_pointer_type (TREE_TYPE (parmse.expr));
2929 tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer);
2930 parmse.expr = convert (type, tmp);
2932 else if (fsym && fsym->attr.value)
2934 if (fsym->ts.type == BT_CHARACTER
2935 && fsym->ts.is_c_interop
2936 && fsym->ns->proc_name != NULL
2937 && fsym->ns->proc_name->attr.is_bind_c)
2939 parmse.expr = NULL;
2940 gfc_conv_scalar_char_value (fsym, &parmse, &e);
2941 if (parmse.expr == NULL)
2942 gfc_conv_expr (&parmse, e);
2944 else
2945 gfc_conv_expr (&parmse, e);
2947 else if (arg->name && arg->name[0] == '%')
2948 /* Argument list functions %VAL, %LOC and %REF are signalled
2949 through arg->name. */
2950 conv_arglist_function (&parmse, arg->expr, arg->name);
2951 else if ((e->expr_type == EXPR_FUNCTION)
2952 && ((e->value.function.esym
2953 && e->value.function.esym->result->attr.pointer)
2954 || (!e->value.function.esym
2955 && e->symtree->n.sym->attr.pointer))
2956 && fsym && fsym->attr.target)
2958 gfc_conv_expr (&parmse, e);
2959 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
2961 else if (e->expr_type == EXPR_FUNCTION
2962 && e->symtree->n.sym->result
2963 && e->symtree->n.sym->result != e->symtree->n.sym
2964 && e->symtree->n.sym->result->attr.proc_pointer)
2966 /* Functions returning procedure pointers. */
2967 gfc_conv_expr (&parmse, e);
2968 if (fsym && fsym->attr.proc_pointer)
2969 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
2971 else
2973 gfc_conv_expr_reference (&parmse, e);
2975 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
2976 allocated on entry, it must be deallocated. */
2977 if (fsym && fsym->attr.allocatable
2978 && fsym->attr.intent == INTENT_OUT)
2980 stmtblock_t block;
2982 gfc_init_block (&block);
2983 tmp = gfc_deallocate_with_status (parmse.expr, NULL_TREE,
2984 true, NULL);
2985 gfc_add_expr_to_block (&block, tmp);
2986 tmp = fold_build2 (MODIFY_EXPR, void_type_node,
2987 parmse.expr, null_pointer_node);
2988 gfc_add_expr_to_block (&block, tmp);
2990 if (fsym->attr.optional
2991 && e->expr_type == EXPR_VARIABLE
2992 && e->symtree->n.sym->attr.optional)
2994 tmp = fold_build3 (COND_EXPR, void_type_node,
2995 gfc_conv_expr_present (e->symtree->n.sym),
2996 gfc_finish_block (&block),
2997 build_empty_stmt (input_location));
2999 else
3000 tmp = gfc_finish_block (&block);
3002 gfc_add_expr_to_block (&se->pre, tmp);
3005 if (fsym && e->expr_type != EXPR_NULL
3006 && ((fsym->attr.pointer
3007 && fsym->attr.flavor != FL_PROCEDURE)
3008 || (fsym->attr.proc_pointer
3009 && !(e->expr_type == EXPR_VARIABLE
3010 && e->symtree->n.sym->attr.dummy))
3011 || (e->expr_type == EXPR_VARIABLE
3012 && gfc_is_proc_ptr_comp (e, NULL))
3013 || fsym->attr.allocatable))
3015 /* Scalar pointer dummy args require an extra level of
3016 indirection. The null pointer already contains
3017 this level of indirection. */
3018 parm_kind = SCALAR_POINTER;
3019 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
3023 else
3025 /* If the procedure requires an explicit interface, the actual
3026 argument is passed according to the corresponding formal
3027 argument. If the corresponding formal argument is a POINTER,
3028 ALLOCATABLE or assumed shape, we do not use g77's calling
3029 convention, and pass the address of the array descriptor
3030 instead. Otherwise we use g77's calling convention. */
3031 int f;
3032 f = (fsym != NULL)
3033 && !(fsym->attr.pointer || fsym->attr.allocatable)
3034 && fsym->as->type != AS_ASSUMED_SHAPE;
3035 if (comp)
3036 f = f || !comp->attr.always_explicit;
3037 else
3038 f = f || !sym->attr.always_explicit;
3040 if (e->expr_type == EXPR_VARIABLE
3041 && is_subref_array (e))
3042 /* The actual argument is a component reference to an
3043 array of derived types. In this case, the argument
3044 is converted to a temporary, which is passed and then
3045 written back after the procedure call. */
3046 gfc_conv_subref_array_arg (&parmse, e, f,
3047 fsym ? fsym->attr.intent : INTENT_INOUT,
3048 fsym && fsym->attr.pointer);
3049 else
3050 gfc_conv_array_parameter (&parmse, e, argss, f, fsym,
3051 sym->name, NULL);
3053 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
3054 allocated on entry, it must be deallocated. */
3055 if (fsym && fsym->attr.allocatable
3056 && fsym->attr.intent == INTENT_OUT)
3058 tmp = build_fold_indirect_ref_loc (input_location,
3059 parmse.expr);
3060 tmp = gfc_trans_dealloc_allocated (tmp);
3061 if (fsym->attr.optional
3062 && e->expr_type == EXPR_VARIABLE
3063 && e->symtree->n.sym->attr.optional)
3064 tmp = fold_build3 (COND_EXPR, void_type_node,
3065 gfc_conv_expr_present (e->symtree->n.sym),
3066 tmp, build_empty_stmt (input_location));
3067 gfc_add_expr_to_block (&se->pre, tmp);
3072 /* The case with fsym->attr.optional is that of a user subroutine
3073 with an interface indicating an optional argument. When we call
3074 an intrinsic subroutine, however, fsym is NULL, but we might still
3075 have an optional argument, so we proceed to the substitution
3076 just in case. */
3077 if (e && (fsym == NULL || fsym->attr.optional))
3079 /* If an optional argument is itself an optional dummy argument,
3080 check its presence and substitute a null if absent. This is
3081 only needed when passing an array to an elemental procedure
3082 as then array elements are accessed - or no NULL pointer is
3083 allowed and a "1" or "0" should be passed if not present.
3084 When passing a non-array-descriptor full array to a
3085 non-array-descriptor dummy, no check is needed. For
3086 array-descriptor actual to array-descriptor dummy, see
3087 PR 41911 for why a check has to be inserted.
3088 fsym == NULL is checked as intrinsics required the descriptor
3089 but do not always set fsym. */
3090 if (e->expr_type == EXPR_VARIABLE
3091 && e->symtree->n.sym->attr.optional
3092 && ((e->rank > 0 && sym->attr.elemental)
3093 || e->representation.length || e->ts.type == BT_CHARACTER
3094 || (e->rank > 0
3095 && (fsym == NULL || fsym->as->type == AS_ASSUMED_SHAPE
3096 || fsym->as->type == AS_DEFERRED))))
3097 gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
3098 e->representation.length);
3101 if (fsym && e)
3103 /* Obtain the character length of an assumed character length
3104 length procedure from the typespec. */
3105 if (fsym->ts.type == BT_CHARACTER
3106 && parmse.string_length == NULL_TREE
3107 && e->ts.type == BT_PROCEDURE
3108 && e->symtree->n.sym->ts.type == BT_CHARACTER
3109 && e->symtree->n.sym->ts.u.cl->length != NULL
3110 && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
3112 gfc_conv_const_charlen (e->symtree->n.sym->ts.u.cl);
3113 parmse.string_length = e->symtree->n.sym->ts.u.cl->backend_decl;
3117 if (fsym && need_interface_mapping && e)
3118 gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
3120 gfc_add_block_to_block (&se->pre, &parmse.pre);
3121 gfc_add_block_to_block (&post, &parmse.post);
3123 /* Allocated allocatable components of derived types must be
3124 deallocated for non-variable scalars. Non-variable arrays are
3125 dealt with in trans-array.c(gfc_conv_array_parameter). */
3126 if (e && e->ts.type == BT_DERIVED
3127 && e->ts.u.derived->attr.alloc_comp
3128 && !(e->symtree && e->symtree->n.sym->attr.pointer)
3129 && (e->expr_type != EXPR_VARIABLE && !e->rank))
3131 int parm_rank;
3132 tmp = build_fold_indirect_ref_loc (input_location,
3133 parmse.expr);
3134 parm_rank = e->rank;
3135 switch (parm_kind)
3137 case (ELEMENTAL):
3138 case (SCALAR):
3139 parm_rank = 0;
3140 break;
3142 case (SCALAR_POINTER):
3143 tmp = build_fold_indirect_ref_loc (input_location,
3144 tmp);
3145 break;
3148 if (e->expr_type == EXPR_OP
3149 && e->value.op.op == INTRINSIC_PARENTHESES
3150 && e->value.op.op1->expr_type == EXPR_VARIABLE)
3152 tree local_tmp;
3153 local_tmp = gfc_evaluate_now (tmp, &se->pre);
3154 local_tmp = gfc_copy_alloc_comp (e->ts.u.derived, local_tmp, tmp, parm_rank);
3155 gfc_add_expr_to_block (&se->post, local_tmp);
3158 tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp, parm_rank);
3160 gfc_add_expr_to_block (&se->post, tmp);
3163 /* Add argument checking of passing an unallocated/NULL actual to
3164 a nonallocatable/nonpointer dummy. */
3166 if (gfc_option.rtcheck & GFC_RTCHECK_POINTER && e != NULL)
3168 symbol_attribute *attr;
3169 char *msg;
3170 tree cond;
3172 if (e->expr_type == EXPR_VARIABLE)
3173 attr = &e->symtree->n.sym->attr;
3174 else if (e->expr_type == EXPR_FUNCTION)
3176 /* For intrinsic functions, the gfc_attr are not available. */
3177 if (e->symtree->n.sym->attr.generic && e->value.function.isym)
3178 goto end_pointer_check;
3180 if (e->symtree->n.sym->attr.generic)
3181 attr = &e->value.function.esym->attr;
3182 else
3183 attr = &e->symtree->n.sym->result->attr;
3185 else
3186 goto end_pointer_check;
3188 if (attr->optional)
3190 /* If the actual argument is an optional pointer/allocatable and
3191 the formal argument takes an nonpointer optional value,
3192 it is invalid to pass a non-present argument on, even
3193 though there is no technical reason for this in gfortran.
3194 See Fortran 2003, Section 12.4.1.6 item (7)+(8). */
3195 tree present, nullptr, type;
3197 if (attr->allocatable
3198 && (fsym == NULL || !fsym->attr.allocatable))
3199 asprintf (&msg, "Allocatable actual argument '%s' is not "
3200 "allocated or not present", e->symtree->n.sym->name);
3201 else if (attr->pointer
3202 && (fsym == NULL || !fsym->attr.pointer))
3203 asprintf (&msg, "Pointer actual argument '%s' is not "
3204 "associated or not present",
3205 e->symtree->n.sym->name);
3206 else if (attr->proc_pointer
3207 && (fsym == NULL || !fsym->attr.proc_pointer))
3208 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3209 "associated or not present",
3210 e->symtree->n.sym->name);
3211 else
3212 goto end_pointer_check;
3214 present = gfc_conv_expr_present (e->symtree->n.sym);
3215 type = TREE_TYPE (present);
3216 present = fold_build2 (EQ_EXPR, boolean_type_node, present,
3217 fold_convert (type, null_pointer_node));
3218 type = TREE_TYPE (parmse.expr);
3219 nullptr = fold_build2 (EQ_EXPR, boolean_type_node, parmse.expr,
3220 fold_convert (type, null_pointer_node));
3221 cond = fold_build2 (TRUTH_ORIF_EXPR, boolean_type_node,
3222 present, nullptr);
3224 else
3226 if (attr->allocatable
3227 && (fsym == NULL || !fsym->attr.allocatable))
3228 asprintf (&msg, "Allocatable actual argument '%s' is not "
3229 "allocated", e->symtree->n.sym->name);
3230 else if (attr->pointer
3231 && (fsym == NULL || !fsym->attr.pointer))
3232 asprintf (&msg, "Pointer actual argument '%s' is not "
3233 "associated", e->symtree->n.sym->name);
3234 else if (attr->proc_pointer
3235 && (fsym == NULL || !fsym->attr.proc_pointer))
3236 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3237 "associated", e->symtree->n.sym->name);
3238 else
3239 goto end_pointer_check;
3242 cond = fold_build2 (EQ_EXPR, boolean_type_node, parmse.expr,
3243 fold_convert (TREE_TYPE (parmse.expr),
3244 null_pointer_node));
3247 gfc_trans_runtime_check (true, false, cond, &se->pre, &e->where,
3248 msg);
3249 gfc_free (msg);
3251 end_pointer_check:
3254 /* Character strings are passed as two parameters, a length and a
3255 pointer - except for Bind(c) which only passes the pointer. */
3256 if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
3257 stringargs = gfc_chainon_list (stringargs, parmse.string_length);
3259 arglist = gfc_chainon_list (arglist, parmse.expr);
3261 gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
3263 if (comp)
3264 ts = comp->ts;
3265 else
3266 ts = sym->ts;
3268 if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
3269 se->string_length = build_int_cst (gfc_charlen_type_node, 1);
3270 else if (ts.type == BT_CHARACTER)
3272 if (ts.u.cl->length == NULL)
3274 /* Assumed character length results are not allowed by 5.1.1.5 of the
3275 standard and are trapped in resolve.c; except in the case of SPREAD
3276 (and other intrinsics?) and dummy functions. In the case of SPREAD,
3277 we take the character length of the first argument for the result.
3278 For dummies, we have to look through the formal argument list for
3279 this function and use the character length found there.*/
3280 if (!sym->attr.dummy)
3281 cl.backend_decl = TREE_VALUE (stringargs);
3282 else
3284 formal = sym->ns->proc_name->formal;
3285 for (; formal; formal = formal->next)
3286 if (strcmp (formal->sym->name, sym->name) == 0)
3287 cl.backend_decl = formal->sym->ts.u.cl->backend_decl;
3290 else
3292 tree tmp;
3294 /* Calculate the length of the returned string. */
3295 gfc_init_se (&parmse, NULL);
3296 if (need_interface_mapping)
3297 gfc_apply_interface_mapping (&mapping, &parmse, ts.u.cl->length);
3298 else
3299 gfc_conv_expr (&parmse, ts.u.cl->length);
3300 gfc_add_block_to_block (&se->pre, &parmse.pre);
3301 gfc_add_block_to_block (&se->post, &parmse.post);
3303 tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
3304 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
3305 build_int_cst (gfc_charlen_type_node, 0));
3306 cl.backend_decl = tmp;
3309 /* Set up a charlen structure for it. */
3310 cl.next = NULL;
3311 cl.length = NULL;
3312 ts.u.cl = &cl;
3314 len = cl.backend_decl;
3317 byref = (comp && (comp->attr.dimension || comp->ts.type == BT_CHARACTER))
3318 || (!comp && gfc_return_by_reference (sym));
3319 if (byref)
3321 if (se->direct_byref)
3323 /* Sometimes, too much indirection can be applied; e.g. for
3324 function_result = array_valued_recursive_function. */
3325 if (TREE_TYPE (TREE_TYPE (se->expr))
3326 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
3327 && GFC_DESCRIPTOR_TYPE_P
3328 (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
3329 se->expr = build_fold_indirect_ref_loc (input_location,
3330 se->expr);
3332 result = build_fold_indirect_ref_loc (input_location,
3333 se->expr);
3334 retargs = gfc_chainon_list (retargs, se->expr);
3336 else if (comp && comp->attr.dimension)
3338 gcc_assert (se->loop && info);
3340 /* Set the type of the array. */
3341 tmp = gfc_typenode_for_spec (&comp->ts);
3342 info->dimen = se->loop->dimen;
3344 /* Evaluate the bounds of the result, if known. */
3345 gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
3347 /* Create a temporary to store the result. In case the function
3348 returns a pointer, the temporary will be a shallow copy and
3349 mustn't be deallocated. */
3350 callee_alloc = comp->attr.allocatable || comp->attr.pointer;
3351 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3352 NULL_TREE, false, !comp->attr.pointer,
3353 callee_alloc, &se->ss->expr->where);
3355 /* Pass the temporary as the first argument. */
3356 result = info->descriptor;
3357 tmp = gfc_build_addr_expr (NULL_TREE, result);
3358 retargs = gfc_chainon_list (retargs, tmp);
3360 else if (!comp && sym->result->attr.dimension)
3362 gcc_assert (se->loop && info);
3364 /* Set the type of the array. */
3365 tmp = gfc_typenode_for_spec (&ts);
3366 info->dimen = se->loop->dimen;
3368 /* Evaluate the bounds of the result, if known. */
3369 gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
3371 /* Create a temporary to store the result. In case the function
3372 returns a pointer, the temporary will be a shallow copy and
3373 mustn't be deallocated. */
3374 callee_alloc = sym->attr.allocatable || sym->attr.pointer;
3375 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3376 NULL_TREE, false, !sym->attr.pointer,
3377 callee_alloc, &se->ss->expr->where);
3379 /* Pass the temporary as the first argument. */
3380 result = info->descriptor;
3381 tmp = gfc_build_addr_expr (NULL_TREE, result);
3382 retargs = gfc_chainon_list (retargs, tmp);
3384 else if (ts.type == BT_CHARACTER)
3386 /* Pass the string length. */
3387 type = gfc_get_character_type (ts.kind, ts.u.cl);
3388 type = build_pointer_type (type);
3390 /* Return an address to a char[0:len-1]* temporary for
3391 character pointers. */
3392 if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3393 || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3395 var = gfc_create_var (type, "pstr");
3397 if ((!comp && sym->attr.allocatable)
3398 || (comp && comp->attr.allocatable))
3399 gfc_add_modify (&se->pre, var,
3400 fold_convert (TREE_TYPE (var),
3401 null_pointer_node));
3403 /* Provide an address expression for the function arguments. */
3404 var = gfc_build_addr_expr (NULL_TREE, var);
3406 else
3407 var = gfc_conv_string_tmp (se, type, len);
3409 retargs = gfc_chainon_list (retargs, var);
3411 else
3413 gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
3415 type = gfc_get_complex_type (ts.kind);
3416 var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
3417 retargs = gfc_chainon_list (retargs, var);
3420 /* Add the string length to the argument list. */
3421 if (ts.type == BT_CHARACTER)
3422 retargs = gfc_chainon_list (retargs, len);
3424 gfc_free_interface_mapping (&mapping);
3426 /* Add the return arguments. */
3427 arglist = chainon (retargs, arglist);
3429 /* Add the hidden string length parameters to the arguments. */
3430 arglist = chainon (arglist, stringargs);
3432 /* We may want to append extra arguments here. This is used e.g. for
3433 calls to libgfortran_matmul_??, which need extra information. */
3434 if (append_args != NULL_TREE)
3435 arglist = chainon (arglist, append_args);
3437 /* Generate the actual call. */
3438 conv_function_val (se, sym, expr);
3440 /* If there are alternate return labels, function type should be
3441 integer. Can't modify the type in place though, since it can be shared
3442 with other functions. For dummy arguments, the typing is done to
3443 to this result, even if it has to be repeated for each call. */
3444 if (has_alternate_specifier
3445 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
3447 if (!sym->attr.dummy)
3449 TREE_TYPE (sym->backend_decl)
3450 = build_function_type (integer_type_node,
3451 TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
3452 se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
3454 else
3455 TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
3458 fntype = TREE_TYPE (TREE_TYPE (se->expr));
3459 se->expr = build_call_list (TREE_TYPE (fntype), se->expr, arglist);
3461 /* If we have a pointer function, but we don't want a pointer, e.g.
3462 something like
3463 x = f()
3464 where f is pointer valued, we have to dereference the result. */
3465 if (!se->want_pointer && !byref
3466 && (sym->attr.pointer || sym->attr.allocatable)
3467 && !gfc_is_proc_ptr_comp (expr, NULL))
3468 se->expr = build_fold_indirect_ref_loc (input_location,
3469 se->expr);
3471 /* f2c calling conventions require a scalar default real function to
3472 return a double precision result. Convert this back to default
3473 real. We only care about the cases that can happen in Fortran 77.
3475 if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
3476 && sym->ts.kind == gfc_default_real_kind
3477 && !sym->attr.always_explicit)
3478 se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
3480 /* A pure function may still have side-effects - it may modify its
3481 parameters. */
3482 TREE_SIDE_EFFECTS (se->expr) = 1;
3483 #if 0
3484 if (!sym->attr.pure)
3485 TREE_SIDE_EFFECTS (se->expr) = 1;
3486 #endif
3488 if (byref)
3490 /* Add the function call to the pre chain. There is no expression. */
3491 gfc_add_expr_to_block (&se->pre, se->expr);
3492 se->expr = NULL_TREE;
3494 if (!se->direct_byref)
3496 if (sym->attr.dimension || (comp && comp->attr.dimension))
3498 if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
3500 /* Check the data pointer hasn't been modified. This would
3501 happen in a function returning a pointer. */
3502 tmp = gfc_conv_descriptor_data_get (info->descriptor);
3503 tmp = fold_build2 (NE_EXPR, boolean_type_node,
3504 tmp, info->data);
3505 gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
3506 gfc_msg_fault);
3508 se->expr = info->descriptor;
3509 /* Bundle in the string length. */
3510 se->string_length = len;
3512 else if (ts.type == BT_CHARACTER)
3514 /* Dereference for character pointer results. */
3515 if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3516 || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3517 se->expr = build_fold_indirect_ref_loc (input_location, var);
3518 else
3519 se->expr = var;
3521 se->string_length = len;
3523 else
3525 gcc_assert (ts.type == BT_COMPLEX && gfc_option.flag_f2c);
3526 se->expr = build_fold_indirect_ref_loc (input_location, var);
3531 /* Follow the function call with the argument post block. */
3532 if (byref)
3534 gfc_add_block_to_block (&se->pre, &post);
3536 /* Transformational functions of derived types with allocatable
3537 components must have the result allocatable components copied. */
3538 arg = expr->value.function.actual;
3539 if (result && arg && expr->rank
3540 && expr->value.function.isym
3541 && expr->value.function.isym->transformational
3542 && arg->expr->ts.type == BT_DERIVED
3543 && arg->expr->ts.u.derived->attr.alloc_comp)
3545 tree tmp2;
3546 /* Copy the allocatable components. We have to use a
3547 temporary here to prevent source allocatable components
3548 from being corrupted. */
3549 tmp2 = gfc_evaluate_now (result, &se->pre);
3550 tmp = gfc_copy_alloc_comp (arg->expr->ts.u.derived,
3551 result, tmp2, expr->rank);
3552 gfc_add_expr_to_block (&se->pre, tmp);
3553 tmp = gfc_copy_allocatable_data (result, tmp2, TREE_TYPE(tmp2),
3554 expr->rank);
3555 gfc_add_expr_to_block (&se->pre, tmp);
3557 /* Finally free the temporary's data field. */
3558 tmp = gfc_conv_descriptor_data_get (tmp2);
3559 tmp = gfc_deallocate_with_status (tmp, NULL_TREE, true, NULL);
3560 gfc_add_expr_to_block (&se->pre, tmp);
3563 else
3564 gfc_add_block_to_block (&se->post, &post);
3566 return has_alternate_specifier;
3570 /* Fill a character string with spaces. */
3572 static tree
3573 fill_with_spaces (tree start, tree type, tree size)
3575 stmtblock_t block, loop;
3576 tree i, el, exit_label, cond, tmp;
3578 /* For a simple char type, we can call memset(). */
3579 if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
3580 return build_call_expr_loc (input_location,
3581 built_in_decls[BUILT_IN_MEMSET], 3, start,
3582 build_int_cst (gfc_get_int_type (gfc_c_int_kind),
3583 lang_hooks.to_target_charset (' ')),
3584 size);
3586 /* Otherwise, we use a loop:
3587 for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
3588 *el = (type) ' ';
3591 /* Initialize variables. */
3592 gfc_init_block (&block);
3593 i = gfc_create_var (sizetype, "i");
3594 gfc_add_modify (&block, i, fold_convert (sizetype, size));
3595 el = gfc_create_var (build_pointer_type (type), "el");
3596 gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
3597 exit_label = gfc_build_label_decl (NULL_TREE);
3598 TREE_USED (exit_label) = 1;
3601 /* Loop body. */
3602 gfc_init_block (&loop);
3604 /* Exit condition. */
3605 cond = fold_build2 (LE_EXPR, boolean_type_node, i,
3606 fold_convert (sizetype, integer_zero_node));
3607 tmp = build1_v (GOTO_EXPR, exit_label);
3608 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
3609 build_empty_stmt (input_location));
3610 gfc_add_expr_to_block (&loop, tmp);
3612 /* Assignment. */
3613 gfc_add_modify (&loop, fold_build1 (INDIRECT_REF, type, el),
3614 build_int_cst (type,
3615 lang_hooks.to_target_charset (' ')));
3617 /* Increment loop variables. */
3618 gfc_add_modify (&loop, i, fold_build2 (MINUS_EXPR, sizetype, i,
3619 TYPE_SIZE_UNIT (type)));
3620 gfc_add_modify (&loop, el, fold_build2 (POINTER_PLUS_EXPR,
3621 TREE_TYPE (el), el,
3622 TYPE_SIZE_UNIT (type)));
3624 /* Making the loop... actually loop! */
3625 tmp = gfc_finish_block (&loop);
3626 tmp = build1_v (LOOP_EXPR, tmp);
3627 gfc_add_expr_to_block (&block, tmp);
3629 /* The exit label. */
3630 tmp = build1_v (LABEL_EXPR, exit_label);
3631 gfc_add_expr_to_block (&block, tmp);
3634 return gfc_finish_block (&block);
3638 /* Generate code to copy a string. */
3640 void
3641 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
3642 int dkind, tree slength, tree src, int skind)
3644 tree tmp, dlen, slen;
3645 tree dsc;
3646 tree ssc;
3647 tree cond;
3648 tree cond2;
3649 tree tmp2;
3650 tree tmp3;
3651 tree tmp4;
3652 tree chartype;
3653 stmtblock_t tempblock;
3655 gcc_assert (dkind == skind);
3657 if (slength != NULL_TREE)
3659 slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
3660 ssc = string_to_single_character (slen, src, skind);
3662 else
3664 slen = build_int_cst (size_type_node, 1);
3665 ssc = src;
3668 if (dlength != NULL_TREE)
3670 dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
3671 dsc = string_to_single_character (slen, dest, dkind);
3673 else
3675 dlen = build_int_cst (size_type_node, 1);
3676 dsc = dest;
3679 if (slength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (src)))
3680 ssc = string_to_single_character (slen, src, skind);
3681 if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
3682 dsc = string_to_single_character (dlen, dest, dkind);
3685 /* Assign directly if the types are compatible. */
3686 if (dsc != NULL_TREE && ssc != NULL_TREE
3687 && TREE_TYPE (dsc) == TREE_TYPE (ssc))
3689 gfc_add_modify (block, dsc, ssc);
3690 return;
3693 /* Do nothing if the destination length is zero. */
3694 cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
3695 build_int_cst (size_type_node, 0));
3697 /* The following code was previously in _gfortran_copy_string:
3699 // The two strings may overlap so we use memmove.
3700 void
3701 copy_string (GFC_INTEGER_4 destlen, char * dest,
3702 GFC_INTEGER_4 srclen, const char * src)
3704 if (srclen >= destlen)
3706 // This will truncate if too long.
3707 memmove (dest, src, destlen);
3709 else
3711 memmove (dest, src, srclen);
3712 // Pad with spaces.
3713 memset (&dest[srclen], ' ', destlen - srclen);
3717 We're now doing it here for better optimization, but the logic
3718 is the same. */
3720 /* For non-default character kinds, we have to multiply the string
3721 length by the base type size. */
3722 chartype = gfc_get_char_type (dkind);
3723 slen = fold_build2 (MULT_EXPR, size_type_node,
3724 fold_convert (size_type_node, slen),
3725 fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3726 dlen = fold_build2 (MULT_EXPR, size_type_node,
3727 fold_convert (size_type_node, dlen),
3728 fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3730 if (dlength)
3731 dest = fold_convert (pvoid_type_node, dest);
3732 else
3733 dest = gfc_build_addr_expr (pvoid_type_node, dest);
3735 if (slength)
3736 src = fold_convert (pvoid_type_node, src);
3737 else
3738 src = gfc_build_addr_expr (pvoid_type_node, src);
3740 /* Truncate string if source is too long. */
3741 cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
3742 tmp2 = build_call_expr_loc (input_location,
3743 built_in_decls[BUILT_IN_MEMMOVE],
3744 3, dest, src, dlen);
3746 /* Else copy and pad with spaces. */
3747 tmp3 = build_call_expr_loc (input_location,
3748 built_in_decls[BUILT_IN_MEMMOVE],
3749 3, dest, src, slen);
3751 tmp4 = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest,
3752 fold_convert (sizetype, slen));
3753 tmp4 = fill_with_spaces (tmp4, chartype,
3754 fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
3755 dlen, slen));
3757 gfc_init_block (&tempblock);
3758 gfc_add_expr_to_block (&tempblock, tmp3);
3759 gfc_add_expr_to_block (&tempblock, tmp4);
3760 tmp3 = gfc_finish_block (&tempblock);
3762 /* The whole copy_string function is there. */
3763 tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
3764 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
3765 build_empty_stmt (input_location));
3766 gfc_add_expr_to_block (block, tmp);
3770 /* Translate a statement function.
3771 The value of a statement function reference is obtained by evaluating the
3772 expression using the values of the actual arguments for the values of the
3773 corresponding dummy arguments. */
3775 static void
3776 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
3778 gfc_symbol *sym;
3779 gfc_symbol *fsym;
3780 gfc_formal_arglist *fargs;
3781 gfc_actual_arglist *args;
3782 gfc_se lse;
3783 gfc_se rse;
3784 gfc_saved_var *saved_vars;
3785 tree *temp_vars;
3786 tree type;
3787 tree tmp;
3788 int n;
3790 sym = expr->symtree->n.sym;
3791 args = expr->value.function.actual;
3792 gfc_init_se (&lse, NULL);
3793 gfc_init_se (&rse, NULL);
3795 n = 0;
3796 for (fargs = sym->formal; fargs; fargs = fargs->next)
3797 n++;
3798 saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
3799 temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
3801 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3803 /* Each dummy shall be specified, explicitly or implicitly, to be
3804 scalar. */
3805 gcc_assert (fargs->sym->attr.dimension == 0);
3806 fsym = fargs->sym;
3808 /* Create a temporary to hold the value. */
3809 type = gfc_typenode_for_spec (&fsym->ts);
3810 temp_vars[n] = gfc_create_var (type, fsym->name);
3812 if (fsym->ts.type == BT_CHARACTER)
3814 /* Copy string arguments. */
3815 tree arglen;
3817 gcc_assert (fsym->ts.u.cl && fsym->ts.u.cl->length
3818 && fsym->ts.u.cl->length->expr_type == EXPR_CONSTANT);
3820 arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3821 tmp = gfc_build_addr_expr (build_pointer_type (type),
3822 temp_vars[n]);
3824 gfc_conv_expr (&rse, args->expr);
3825 gfc_conv_string_parameter (&rse);
3826 gfc_add_block_to_block (&se->pre, &lse.pre);
3827 gfc_add_block_to_block (&se->pre, &rse.pre);
3829 gfc_trans_string_copy (&se->pre, arglen, tmp, fsym->ts.kind,
3830 rse.string_length, rse.expr, fsym->ts.kind);
3831 gfc_add_block_to_block (&se->pre, &lse.post);
3832 gfc_add_block_to_block (&se->pre, &rse.post);
3834 else
3836 /* For everything else, just evaluate the expression. */
3837 gfc_conv_expr (&lse, args->expr);
3839 gfc_add_block_to_block (&se->pre, &lse.pre);
3840 gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
3841 gfc_add_block_to_block (&se->pre, &lse.post);
3844 args = args->next;
3847 /* Use the temporary variables in place of the real ones. */
3848 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3849 gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
3851 gfc_conv_expr (se, sym->value);
3853 if (sym->ts.type == BT_CHARACTER)
3855 gfc_conv_const_charlen (sym->ts.u.cl);
3857 /* Force the expression to the correct length. */
3858 if (!INTEGER_CST_P (se->string_length)
3859 || tree_int_cst_lt (se->string_length,
3860 sym->ts.u.cl->backend_decl))
3862 type = gfc_get_character_type (sym->ts.kind, sym->ts.u.cl);
3863 tmp = gfc_create_var (type, sym->name);
3864 tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
3865 gfc_trans_string_copy (&se->pre, sym->ts.u.cl->backend_decl, tmp,
3866 sym->ts.kind, se->string_length, se->expr,
3867 sym->ts.kind);
3868 se->expr = tmp;
3870 se->string_length = sym->ts.u.cl->backend_decl;
3873 /* Restore the original variables. */
3874 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3875 gfc_restore_sym (fargs->sym, &saved_vars[n]);
3876 gfc_free (saved_vars);
3880 /* Translate a function expression. */
3882 static void
3883 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
3885 gfc_symbol *sym;
3887 if (expr->value.function.isym)
3889 gfc_conv_intrinsic_function (se, expr);
3890 return;
3893 /* We distinguish statement functions from general functions to improve
3894 runtime performance. */
3895 if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3897 gfc_conv_statement_function (se, expr);
3898 return;
3901 /* expr.value.function.esym is the resolved (specific) function symbol for
3902 most functions. However this isn't set for dummy procedures. */
3903 sym = expr->value.function.esym;
3904 if (!sym)
3905 sym = expr->symtree->n.sym;
3907 gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr,
3908 NULL_TREE);
3912 static void
3913 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
3915 gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
3916 gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
3918 gfc_conv_tmp_array_ref (se);
3919 gfc_advance_se_ss_chain (se);
3923 /* Build a static initializer. EXPR is the expression for the initial value.
3924 The other parameters describe the variable of the component being
3925 initialized. EXPR may be null. */
3927 tree
3928 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
3929 bool array, bool pointer)
3931 gfc_se se;
3933 if (!(expr || pointer))
3934 return NULL_TREE;
3936 /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
3937 (these are the only two iso_c_binding derived types that can be
3938 used as initialization expressions). If so, we need to modify
3939 the 'expr' to be that for a (void *). */
3940 if (expr != NULL && expr->ts.type == BT_DERIVED
3941 && expr->ts.is_iso_c && expr->ts.u.derived)
3943 gfc_symbol *derived = expr->ts.u.derived;
3945 expr = gfc_int_expr (0);
3947 /* The derived symbol has already been converted to a (void *). Use
3948 its kind. */
3949 expr->ts.f90_type = derived->ts.f90_type;
3950 expr->ts.kind = derived->ts.kind;
3953 if (array)
3955 /* Arrays need special handling. */
3956 if (pointer)
3957 return gfc_build_null_descriptor (type);
3958 else
3959 return gfc_conv_array_initializer (type, expr);
3961 else if (pointer)
3962 return fold_convert (type, null_pointer_node);
3963 else
3965 switch (ts->type)
3967 case BT_DERIVED:
3968 case BT_CLASS:
3969 gfc_init_se (&se, NULL);
3970 gfc_conv_structure (&se, expr, 1);
3971 return se.expr;
3973 case BT_CHARACTER:
3974 return gfc_conv_string_init (ts->u.cl->backend_decl,expr);
3976 default:
3977 gfc_init_se (&se, NULL);
3978 gfc_conv_constant (&se, expr);
3979 return se.expr;
3984 static tree
3985 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3987 gfc_se rse;
3988 gfc_se lse;
3989 gfc_ss *rss;
3990 gfc_ss *lss;
3991 stmtblock_t body;
3992 stmtblock_t block;
3993 gfc_loopinfo loop;
3994 int n;
3995 tree tmp;
3997 gfc_start_block (&block);
3999 /* Initialize the scalarizer. */
4000 gfc_init_loopinfo (&loop);
4002 gfc_init_se (&lse, NULL);
4003 gfc_init_se (&rse, NULL);
4005 /* Walk the rhs. */
4006 rss = gfc_walk_expr (expr);
4007 if (rss == gfc_ss_terminator)
4009 /* The rhs is scalar. Add a ss for the expression. */
4010 rss = gfc_get_ss ();
4011 rss->next = gfc_ss_terminator;
4012 rss->type = GFC_SS_SCALAR;
4013 rss->expr = expr;
4016 /* Create a SS for the destination. */
4017 lss = gfc_get_ss ();
4018 lss->type = GFC_SS_COMPONENT;
4019 lss->expr = NULL;
4020 lss->shape = gfc_get_shape (cm->as->rank);
4021 lss->next = gfc_ss_terminator;
4022 lss->data.info.dimen = cm->as->rank;
4023 lss->data.info.descriptor = dest;
4024 lss->data.info.data = gfc_conv_array_data (dest);
4025 lss->data.info.offset = gfc_conv_array_offset (dest);
4026 for (n = 0; n < cm->as->rank; n++)
4028 lss->data.info.dim[n] = n;
4029 lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
4030 lss->data.info.stride[n] = gfc_index_one_node;
4032 mpz_init (lss->shape[n]);
4033 mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
4034 cm->as->lower[n]->value.integer);
4035 mpz_add_ui (lss->shape[n], lss->shape[n], 1);
4038 /* Associate the SS with the loop. */
4039 gfc_add_ss_to_loop (&loop, lss);
4040 gfc_add_ss_to_loop (&loop, rss);
4042 /* Calculate the bounds of the scalarization. */
4043 gfc_conv_ss_startstride (&loop);
4045 /* Setup the scalarizing loops. */
4046 gfc_conv_loop_setup (&loop, &expr->where);
4048 /* Setup the gfc_se structures. */
4049 gfc_copy_loopinfo_to_se (&lse, &loop);
4050 gfc_copy_loopinfo_to_se (&rse, &loop);
4052 rse.ss = rss;
4053 gfc_mark_ss_chain_used (rss, 1);
4054 lse.ss = lss;
4055 gfc_mark_ss_chain_used (lss, 1);
4057 /* Start the scalarized loop body. */
4058 gfc_start_scalarized_body (&loop, &body);
4060 gfc_conv_tmp_array_ref (&lse);
4061 if (cm->ts.type == BT_CHARACTER)
4062 lse.string_length = cm->ts.u.cl->backend_decl;
4064 gfc_conv_expr (&rse, expr);
4066 tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
4067 gfc_add_expr_to_block (&body, tmp);
4069 gcc_assert (rse.ss == gfc_ss_terminator);
4071 /* Generate the copying loops. */
4072 gfc_trans_scalarizing_loops (&loop, &body);
4074 /* Wrap the whole thing up. */
4075 gfc_add_block_to_block (&block, &loop.pre);
4076 gfc_add_block_to_block (&block, &loop.post);
4078 for (n = 0; n < cm->as->rank; n++)
4079 mpz_clear (lss->shape[n]);
4080 gfc_free (lss->shape);
4082 gfc_cleanup_loop (&loop);
4084 return gfc_finish_block (&block);
4088 static tree
4089 gfc_trans_alloc_subarray_assign (tree dest, gfc_component * cm,
4090 gfc_expr * expr)
4092 gfc_se se;
4093 gfc_ss *rss;
4094 stmtblock_t block;
4095 tree offset;
4096 int n;
4097 tree tmp;
4098 tree tmp2;
4099 gfc_array_spec *as;
4100 gfc_expr *arg = NULL;
4102 gfc_start_block (&block);
4103 gfc_init_se (&se, NULL);
4105 /* Get the descriptor for the expressions. */
4106 rss = gfc_walk_expr (expr);
4107 se.want_pointer = 0;
4108 gfc_conv_expr_descriptor (&se, expr, rss);
4109 gfc_add_block_to_block (&block, &se.pre);
4110 gfc_add_modify (&block, dest, se.expr);
4112 /* Deal with arrays of derived types with allocatable components. */
4113 if (cm->ts.type == BT_DERIVED
4114 && cm->ts.u.derived->attr.alloc_comp)
4115 tmp = gfc_copy_alloc_comp (cm->ts.u.derived,
4116 se.expr, dest,
4117 cm->as->rank);
4118 else
4119 tmp = gfc_duplicate_allocatable (dest, se.expr,
4120 TREE_TYPE(cm->backend_decl),
4121 cm->as->rank);
4123 gfc_add_expr_to_block (&block, tmp);
4124 gfc_add_block_to_block (&block, &se.post);
4126 if (expr->expr_type != EXPR_VARIABLE)
4127 gfc_conv_descriptor_data_set (&block, se.expr,
4128 null_pointer_node);
4130 /* We need to know if the argument of a conversion function is a
4131 variable, so that the correct lower bound can be used. */
4132 if (expr->expr_type == EXPR_FUNCTION
4133 && expr->value.function.isym
4134 && expr->value.function.isym->conversion
4135 && expr->value.function.actual->expr
4136 && expr->value.function.actual->expr->expr_type == EXPR_VARIABLE)
4137 arg = expr->value.function.actual->expr;
4139 /* Obtain the array spec of full array references. */
4140 if (arg)
4141 as = gfc_get_full_arrayspec_from_expr (arg);
4142 else
4143 as = gfc_get_full_arrayspec_from_expr (expr);
4145 /* Shift the lbound and ubound of temporaries to being unity,
4146 rather than zero, based. Always calculate the offset. */
4147 offset = gfc_conv_descriptor_offset_get (dest);
4148 gfc_add_modify (&block, offset, gfc_index_zero_node);
4149 tmp2 =gfc_create_var (gfc_array_index_type, NULL);
4151 for (n = 0; n < expr->rank; n++)
4153 tree span;
4154 tree lbound;
4156 /* Obtain the correct lbound - ISO/IEC TR 15581:2001 page 9.
4157 TODO It looks as if gfc_conv_expr_descriptor should return
4158 the correct bounds and that the following should not be
4159 necessary. This would simplify gfc_conv_intrinsic_bound
4160 as well. */
4161 if (as && as->lower[n])
4163 gfc_se lbse;
4164 gfc_init_se (&lbse, NULL);
4165 gfc_conv_expr (&lbse, as->lower[n]);
4166 gfc_add_block_to_block (&block, &lbse.pre);
4167 lbound = gfc_evaluate_now (lbse.expr, &block);
4169 else if (as && arg)
4171 tmp = gfc_get_symbol_decl (arg->symtree->n.sym);
4172 lbound = gfc_conv_descriptor_lbound_get (tmp,
4173 gfc_rank_cst[n]);
4175 else if (as)
4176 lbound = gfc_conv_descriptor_lbound_get (dest,
4177 gfc_rank_cst[n]);
4178 else
4179 lbound = gfc_index_one_node;
4181 lbound = fold_convert (gfc_array_index_type, lbound);
4183 /* Shift the bounds and set the offset accordingly. */
4184 tmp = gfc_conv_descriptor_ubound_get (dest, gfc_rank_cst[n]);
4185 span = fold_build2 (MINUS_EXPR, gfc_array_index_type, tmp,
4186 gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]));
4187 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type, span, lbound);
4188 gfc_conv_descriptor_ubound_set (&block, dest,
4189 gfc_rank_cst[n], tmp);
4190 gfc_conv_descriptor_lbound_set (&block, dest,
4191 gfc_rank_cst[n], lbound);
4193 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
4194 gfc_conv_descriptor_lbound_get (dest,
4195 gfc_rank_cst[n]),
4196 gfc_conv_descriptor_stride_get (dest,
4197 gfc_rank_cst[n]));
4198 gfc_add_modify (&block, tmp2, tmp);
4199 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
4200 gfc_conv_descriptor_offset_set (&block, dest, tmp);
4203 if (arg)
4205 /* If a conversion expression has a null data pointer
4206 argument, nullify the allocatable component. */
4207 tree non_null_expr;
4208 tree null_expr;
4210 if (arg->symtree->n.sym->attr.allocatable
4211 || arg->symtree->n.sym->attr.pointer)
4213 non_null_expr = gfc_finish_block (&block);
4214 gfc_start_block (&block);
4215 gfc_conv_descriptor_data_set (&block, dest,
4216 null_pointer_node);
4217 null_expr = gfc_finish_block (&block);
4218 tmp = gfc_conv_descriptor_data_get (arg->symtree->n.sym->backend_decl);
4219 tmp = build2 (EQ_EXPR, boolean_type_node, tmp,
4220 fold_convert (TREE_TYPE (tmp),
4221 null_pointer_node));
4222 return build3_v (COND_EXPR, tmp,
4223 null_expr, non_null_expr);
4227 return gfc_finish_block (&block);
4231 /* Assign a single component of a derived type constructor. */
4233 static tree
4234 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
4236 gfc_se se;
4237 gfc_se lse;
4238 gfc_ss *rss;
4239 stmtblock_t block;
4240 tree tmp;
4242 gfc_start_block (&block);
4244 if (cm->attr.pointer)
4246 gfc_init_se (&se, NULL);
4247 /* Pointer component. */
4248 if (cm->attr.dimension)
4250 /* Array pointer. */
4251 if (expr->expr_type == EXPR_NULL)
4252 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4253 else
4255 rss = gfc_walk_expr (expr);
4256 se.direct_byref = 1;
4257 se.expr = dest;
4258 gfc_conv_expr_descriptor (&se, expr, rss);
4259 gfc_add_block_to_block (&block, &se.pre);
4260 gfc_add_block_to_block (&block, &se.post);
4263 else
4265 /* Scalar pointers. */
4266 se.want_pointer = 1;
4267 gfc_conv_expr (&se, expr);
4268 gfc_add_block_to_block (&block, &se.pre);
4269 gfc_add_modify (&block, dest,
4270 fold_convert (TREE_TYPE (dest), se.expr));
4271 gfc_add_block_to_block (&block, &se.post);
4274 else if (cm->ts.type == BT_CLASS && expr->expr_type == EXPR_NULL)
4276 /* NULL initialization for CLASS components. */
4277 tmp = gfc_trans_structure_assign (dest,
4278 gfc_default_initializer (&cm->ts));
4279 gfc_add_expr_to_block (&block, tmp);
4281 else if (cm->attr.dimension)
4283 if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
4284 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4285 else if (cm->attr.allocatable)
4287 tmp = gfc_trans_alloc_subarray_assign (dest, cm, expr);
4288 gfc_add_expr_to_block (&block, tmp);
4290 else
4292 tmp = gfc_trans_subarray_assign (dest, cm, expr);
4293 gfc_add_expr_to_block (&block, tmp);
4296 else if (expr->ts.type == BT_DERIVED)
4298 if (expr->expr_type != EXPR_STRUCTURE)
4300 gfc_init_se (&se, NULL);
4301 gfc_conv_expr (&se, expr);
4302 gfc_add_block_to_block (&block, &se.pre);
4303 gfc_add_modify (&block, dest,
4304 fold_convert (TREE_TYPE (dest), se.expr));
4305 gfc_add_block_to_block (&block, &se.post);
4307 else
4309 /* Nested constructors. */
4310 tmp = gfc_trans_structure_assign (dest, expr);
4311 gfc_add_expr_to_block (&block, tmp);
4314 else
4316 /* Scalar component. */
4317 gfc_init_se (&se, NULL);
4318 gfc_init_se (&lse, NULL);
4320 gfc_conv_expr (&se, expr);
4321 if (cm->ts.type == BT_CHARACTER)
4322 lse.string_length = cm->ts.u.cl->backend_decl;
4323 lse.expr = dest;
4324 tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
4325 gfc_add_expr_to_block (&block, tmp);
4327 return gfc_finish_block (&block);
4330 /* Assign a derived type constructor to a variable. */
4332 static tree
4333 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
4335 gfc_constructor *c;
4336 gfc_component *cm;
4337 stmtblock_t block;
4338 tree field;
4339 tree tmp;
4341 gfc_start_block (&block);
4342 cm = expr->ts.u.derived->components;
4343 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
4345 /* Skip absent members in default initializers. */
4346 if (!c->expr)
4347 continue;
4349 /* Handle c_null_(fun)ptr. */
4350 if (c && c->expr && c->expr->ts.is_iso_c)
4352 field = cm->backend_decl;
4353 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
4354 dest, field, NULL_TREE);
4355 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp,
4356 fold_convert (TREE_TYPE (tmp),
4357 null_pointer_node));
4358 gfc_add_expr_to_block (&block, tmp);
4359 continue;
4362 field = cm->backend_decl;
4363 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
4364 dest, field, NULL_TREE);
4365 tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
4366 gfc_add_expr_to_block (&block, tmp);
4368 return gfc_finish_block (&block);
4371 /* Build an expression for a constructor. If init is nonzero then
4372 this is part of a static variable initializer. */
4374 void
4375 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
4377 gfc_constructor *c;
4378 gfc_component *cm;
4379 tree val;
4380 tree type;
4381 tree tmp;
4382 VEC(constructor_elt,gc) *v = NULL;
4384 gcc_assert (se->ss == NULL);
4385 gcc_assert (expr->expr_type == EXPR_STRUCTURE);
4386 type = gfc_typenode_for_spec (&expr->ts);
4388 if (!init)
4390 /* Create a temporary variable and fill it in. */
4391 se->expr = gfc_create_var (type, expr->ts.u.derived->name);
4392 tmp = gfc_trans_structure_assign (se->expr, expr);
4393 gfc_add_expr_to_block (&se->pre, tmp);
4394 return;
4397 cm = expr->ts.u.derived->components;
4399 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
4401 /* Skip absent members in default initializers and allocatable
4402 components. Although the latter have a default initializer
4403 of EXPR_NULL,... by default, the static nullify is not needed
4404 since this is done every time we come into scope. */
4405 if (!c->expr || cm->attr.allocatable)
4406 continue;
4408 if (cm->ts.type == BT_CLASS)
4410 gfc_component *data;
4411 data = gfc_find_component (cm->ts.u.derived, "$data", true, true);
4412 val = gfc_conv_initializer (c->expr, &cm->ts,
4413 TREE_TYPE (data->backend_decl),
4414 data->attr.dimension,
4415 data->attr.pointer);
4417 CONSTRUCTOR_APPEND_ELT (v, data->backend_decl, val);
4419 else if (strcmp (cm->name, "$size") == 0)
4421 val = TYPE_SIZE_UNIT (gfc_get_derived_type (cm->ts.u.derived));
4422 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4424 else if (cm->initializer && cm->initializer->expr_type != EXPR_NULL
4425 && strcmp (cm->name, "$extends") == 0)
4427 gfc_symbol *vtabs;
4428 vtabs = cm->initializer->symtree->n.sym;
4429 val = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtabs));
4430 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4432 else
4434 val = gfc_conv_initializer (c->expr, &cm->ts,
4435 TREE_TYPE (cm->backend_decl), cm->attr.dimension,
4436 cm->attr.pointer || cm->attr.proc_pointer);
4438 /* Append it to the constructor list. */
4439 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4442 se->expr = build_constructor (type, v);
4443 if (init)
4444 TREE_CONSTANT (se->expr) = 1;
4448 /* Translate a substring expression. */
4450 static void
4451 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
4453 gfc_ref *ref;
4455 ref = expr->ref;
4457 gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
4459 se->expr = gfc_build_wide_string_const (expr->ts.kind,
4460 expr->value.character.length,
4461 expr->value.character.string);
4463 se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
4464 TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
4466 if (ref)
4467 gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
4471 /* Entry point for expression translation. Evaluates a scalar quantity.
4472 EXPR is the expression to be translated, and SE is the state structure if
4473 called from within the scalarized. */
4475 void
4476 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
4478 if (se->ss && se->ss->expr == expr
4479 && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
4481 /* Substitute a scalar expression evaluated outside the scalarization
4482 loop. */
4483 se->expr = se->ss->data.scalar.expr;
4484 se->string_length = se->ss->string_length;
4485 gfc_advance_se_ss_chain (se);
4486 return;
4489 /* We need to convert the expressions for the iso_c_binding derived types.
4490 C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
4491 null_pointer_node. C_PTR and C_FUNPTR are converted to match the
4492 typespec for the C_PTR and C_FUNPTR symbols, which has already been
4493 updated to be an integer with a kind equal to the size of a (void *). */
4494 if (expr->ts.type == BT_DERIVED && expr->ts.u.derived
4495 && expr->ts.u.derived->attr.is_iso_c)
4497 if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
4498 || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR)
4500 /* Set expr_type to EXPR_NULL, which will result in
4501 null_pointer_node being used below. */
4502 expr->expr_type = EXPR_NULL;
4504 else
4506 /* Update the type/kind of the expression to be what the new
4507 type/kind are for the updated symbols of C_PTR/C_FUNPTR. */
4508 expr->ts.type = expr->ts.u.derived->ts.type;
4509 expr->ts.f90_type = expr->ts.u.derived->ts.f90_type;
4510 expr->ts.kind = expr->ts.u.derived->ts.kind;
4514 switch (expr->expr_type)
4516 case EXPR_OP:
4517 gfc_conv_expr_op (se, expr);
4518 break;
4520 case EXPR_FUNCTION:
4521 gfc_conv_function_expr (se, expr);
4522 break;
4524 case EXPR_CONSTANT:
4525 gfc_conv_constant (se, expr);
4526 break;
4528 case EXPR_VARIABLE:
4529 gfc_conv_variable (se, expr);
4530 break;
4532 case EXPR_NULL:
4533 se->expr = null_pointer_node;
4534 break;
4536 case EXPR_SUBSTRING:
4537 gfc_conv_substring_expr (se, expr);
4538 break;
4540 case EXPR_STRUCTURE:
4541 gfc_conv_structure (se, expr, 0);
4542 break;
4544 case EXPR_ARRAY:
4545 gfc_conv_array_constructor_expr (se, expr);
4546 break;
4548 default:
4549 gcc_unreachable ();
4550 break;
4554 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
4555 of an assignment. */
4556 void
4557 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
4559 gfc_conv_expr (se, expr);
4560 /* All numeric lvalues should have empty post chains. If not we need to
4561 figure out a way of rewriting an lvalue so that it has no post chain. */
4562 gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
4565 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
4566 numeric expressions. Used for scalar values where inserting cleanup code
4567 is inconvenient. */
4568 void
4569 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
4571 tree val;
4573 gcc_assert (expr->ts.type != BT_CHARACTER);
4574 gfc_conv_expr (se, expr);
4575 if (se->post.head)
4577 val = gfc_create_var (TREE_TYPE (se->expr), NULL);
4578 gfc_add_modify (&se->pre, val, se->expr);
4579 se->expr = val;
4580 gfc_add_block_to_block (&se->pre, &se->post);
4584 /* Helper to translate an expression and convert it to a particular type. */
4585 void
4586 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
4588 gfc_conv_expr_val (se, expr);
4589 se->expr = convert (type, se->expr);
4593 /* Converts an expression so that it can be passed by reference. Scalar
4594 values only. */
4596 void
4597 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
4599 tree var;
4601 if (se->ss && se->ss->expr == expr
4602 && se->ss->type == GFC_SS_REFERENCE)
4604 se->expr = se->ss->data.scalar.expr;
4605 se->string_length = se->ss->string_length;
4606 gfc_advance_se_ss_chain (se);
4607 return;
4610 if (expr->ts.type == BT_CHARACTER)
4612 gfc_conv_expr (se, expr);
4613 gfc_conv_string_parameter (se);
4614 return;
4617 if (expr->expr_type == EXPR_VARIABLE)
4619 se->want_pointer = 1;
4620 gfc_conv_expr (se, expr);
4621 if (se->post.head)
4623 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4624 gfc_add_modify (&se->pre, var, se->expr);
4625 gfc_add_block_to_block (&se->pre, &se->post);
4626 se->expr = var;
4628 return;
4631 if (expr->expr_type == EXPR_FUNCTION
4632 && ((expr->value.function.esym
4633 && expr->value.function.esym->result->attr.pointer
4634 && !expr->value.function.esym->result->attr.dimension)
4635 || (!expr->value.function.esym
4636 && expr->symtree->n.sym->attr.pointer
4637 && !expr->symtree->n.sym->attr.dimension)))
4639 se->want_pointer = 1;
4640 gfc_conv_expr (se, expr);
4641 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4642 gfc_add_modify (&se->pre, var, se->expr);
4643 se->expr = var;
4644 return;
4648 gfc_conv_expr (se, expr);
4650 /* Create a temporary var to hold the value. */
4651 if (TREE_CONSTANT (se->expr))
4653 tree tmp = se->expr;
4654 STRIP_TYPE_NOPS (tmp);
4655 var = build_decl (input_location,
4656 CONST_DECL, NULL, TREE_TYPE (tmp));
4657 DECL_INITIAL (var) = tmp;
4658 TREE_STATIC (var) = 1;
4659 pushdecl (var);
4661 else
4663 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4664 gfc_add_modify (&se->pre, var, se->expr);
4666 gfc_add_block_to_block (&se->pre, &se->post);
4668 /* Take the address of that value. */
4669 se->expr = gfc_build_addr_expr (NULL_TREE, var);
4673 tree
4674 gfc_trans_pointer_assign (gfc_code * code)
4676 return gfc_trans_pointer_assignment (code->expr1, code->expr2);
4680 /* Generate code for a pointer assignment. */
4682 tree
4683 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
4685 gfc_se lse;
4686 gfc_se rse;
4687 gfc_ss *lss;
4688 gfc_ss *rss;
4689 stmtblock_t block;
4690 tree desc;
4691 tree tmp;
4692 tree decl;
4694 gfc_start_block (&block);
4696 gfc_init_se (&lse, NULL);
4698 lss = gfc_walk_expr (expr1);
4699 rss = gfc_walk_expr (expr2);
4700 if (lss == gfc_ss_terminator)
4702 /* Scalar pointers. */
4703 lse.want_pointer = 1;
4704 gfc_conv_expr (&lse, expr1);
4705 gcc_assert (rss == gfc_ss_terminator);
4706 gfc_init_se (&rse, NULL);
4707 rse.want_pointer = 1;
4708 gfc_conv_expr (&rse, expr2);
4710 if (expr1->symtree->n.sym->attr.proc_pointer
4711 && expr1->symtree->n.sym->attr.dummy)
4712 lse.expr = build_fold_indirect_ref_loc (input_location,
4713 lse.expr);
4715 if (expr2->symtree && expr2->symtree->n.sym->attr.proc_pointer
4716 && expr2->symtree->n.sym->attr.dummy)
4717 rse.expr = build_fold_indirect_ref_loc (input_location,
4718 rse.expr);
4720 gfc_add_block_to_block (&block, &lse.pre);
4721 gfc_add_block_to_block (&block, &rse.pre);
4723 /* Check character lengths if character expression. The test is only
4724 really added if -fbounds-check is enabled. */
4725 if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL
4726 && !expr1->symtree->n.sym->attr.proc_pointer
4727 && !gfc_is_proc_ptr_comp (expr1, NULL))
4729 gcc_assert (expr2->ts.type == BT_CHARACTER);
4730 gcc_assert (lse.string_length && rse.string_length);
4731 gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4732 lse.string_length, rse.string_length,
4733 &block);
4736 gfc_add_modify (&block, lse.expr,
4737 fold_convert (TREE_TYPE (lse.expr), rse.expr));
4739 gfc_add_block_to_block (&block, &rse.post);
4740 gfc_add_block_to_block (&block, &lse.post);
4742 else
4744 tree strlen_lhs;
4745 tree strlen_rhs = NULL_TREE;
4747 /* Array pointer. */
4748 gfc_conv_expr_descriptor (&lse, expr1, lss);
4749 strlen_lhs = lse.string_length;
4750 switch (expr2->expr_type)
4752 case EXPR_NULL:
4753 /* Just set the data pointer to null. */
4754 gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
4755 break;
4757 case EXPR_VARIABLE:
4758 /* Assign directly to the pointer's descriptor. */
4759 lse.direct_byref = 1;
4760 gfc_conv_expr_descriptor (&lse, expr2, rss);
4761 strlen_rhs = lse.string_length;
4763 /* If this is a subreference array pointer assignment, use the rhs
4764 descriptor element size for the lhs span. */
4765 if (expr1->symtree->n.sym->attr.subref_array_pointer)
4767 decl = expr1->symtree->n.sym->backend_decl;
4768 gfc_init_se (&rse, NULL);
4769 rse.descriptor_only = 1;
4770 gfc_conv_expr (&rse, expr2);
4771 tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
4772 tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
4773 if (!INTEGER_CST_P (tmp))
4774 gfc_add_block_to_block (&lse.post, &rse.pre);
4775 gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
4778 break;
4780 default:
4781 /* Assign to a temporary descriptor and then copy that
4782 temporary to the pointer. */
4783 desc = lse.expr;
4784 tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
4786 lse.expr = tmp;
4787 lse.direct_byref = 1;
4788 gfc_conv_expr_descriptor (&lse, expr2, rss);
4789 strlen_rhs = lse.string_length;
4790 gfc_add_modify (&lse.pre, desc, tmp);
4791 break;
4794 gfc_add_block_to_block (&block, &lse.pre);
4796 /* Check string lengths if applicable. The check is only really added
4797 to the output code if -fbounds-check is enabled. */
4798 if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4800 gcc_assert (expr2->ts.type == BT_CHARACTER);
4801 gcc_assert (strlen_lhs && strlen_rhs);
4802 gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4803 strlen_lhs, strlen_rhs, &block);
4806 gfc_add_block_to_block (&block, &lse.post);
4808 return gfc_finish_block (&block);
4812 /* Makes sure se is suitable for passing as a function string parameter. */
4813 /* TODO: Need to check all callers of this function. It may be abused. */
4815 void
4816 gfc_conv_string_parameter (gfc_se * se)
4818 tree type;
4820 if (TREE_CODE (se->expr) == STRING_CST)
4822 type = TREE_TYPE (TREE_TYPE (se->expr));
4823 se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4824 return;
4827 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
4829 if (TREE_CODE (se->expr) != INDIRECT_REF)
4831 type = TREE_TYPE (se->expr);
4832 se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4834 else
4836 type = gfc_get_character_type_len (gfc_default_character_kind,
4837 se->string_length);
4838 type = build_pointer_type (type);
4839 se->expr = gfc_build_addr_expr (type, se->expr);
4843 gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
4844 gcc_assert (se->string_length
4845 && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
4849 /* Generate code for assignment of scalar variables. Includes character
4850 strings and derived types with allocatable components. */
4852 tree
4853 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
4854 bool l_is_temp, bool r_is_var)
4856 stmtblock_t block;
4857 tree tmp;
4858 tree cond;
4860 gfc_init_block (&block);
4862 if (ts.type == BT_CHARACTER)
4864 tree rlen = NULL;
4865 tree llen = NULL;
4867 if (lse->string_length != NULL_TREE)
4869 gfc_conv_string_parameter (lse);
4870 gfc_add_block_to_block (&block, &lse->pre);
4871 llen = lse->string_length;
4874 if (rse->string_length != NULL_TREE)
4876 gcc_assert (rse->string_length != NULL_TREE);
4877 gfc_conv_string_parameter (rse);
4878 gfc_add_block_to_block (&block, &rse->pre);
4879 rlen = rse->string_length;
4882 gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
4883 rse->expr, ts.kind);
4885 else if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
4887 cond = NULL_TREE;
4889 /* Are the rhs and the lhs the same? */
4890 if (r_is_var)
4892 cond = fold_build2 (EQ_EXPR, boolean_type_node,
4893 gfc_build_addr_expr (NULL_TREE, lse->expr),
4894 gfc_build_addr_expr (NULL_TREE, rse->expr));
4895 cond = gfc_evaluate_now (cond, &lse->pre);
4898 /* Deallocate the lhs allocated components as long as it is not
4899 the same as the rhs. This must be done following the assignment
4900 to prevent deallocating data that could be used in the rhs
4901 expression. */
4902 if (!l_is_temp)
4904 tmp = gfc_evaluate_now (lse->expr, &lse->pre);
4905 tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
4906 if (r_is_var)
4907 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
4908 tmp);
4909 gfc_add_expr_to_block (&lse->post, tmp);
4912 gfc_add_block_to_block (&block, &rse->pre);
4913 gfc_add_block_to_block (&block, &lse->pre);
4915 gfc_add_modify (&block, lse->expr,
4916 fold_convert (TREE_TYPE (lse->expr), rse->expr));
4918 /* Do a deep copy if the rhs is a variable, if it is not the
4919 same as the lhs. */
4920 if (r_is_var)
4922 tmp = gfc_copy_alloc_comp (ts.u.derived, rse->expr, lse->expr, 0);
4923 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
4924 tmp);
4925 gfc_add_expr_to_block (&block, tmp);
4928 else if (ts.type == BT_DERIVED || ts.type == BT_CLASS)
4930 gfc_add_block_to_block (&block, &lse->pre);
4931 gfc_add_block_to_block (&block, &rse->pre);
4932 tmp = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lse->expr), rse->expr);
4933 gfc_add_modify (&block, lse->expr, tmp);
4935 else
4937 gfc_add_block_to_block (&block, &lse->pre);
4938 gfc_add_block_to_block (&block, &rse->pre);
4940 gfc_add_modify (&block, lse->expr,
4941 fold_convert (TREE_TYPE (lse->expr), rse->expr));
4944 gfc_add_block_to_block (&block, &lse->post);
4945 gfc_add_block_to_block (&block, &rse->post);
4947 return gfc_finish_block (&block);
4951 /* Try to translate array(:) = func (...), where func is a transformational
4952 array function, without using a temporary. Returns NULL is this isn't the
4953 case. */
4955 static tree
4956 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
4958 gfc_se se;
4959 gfc_ss *ss;
4960 gfc_ref * ref;
4961 bool seen_array_ref;
4962 bool c = false;
4963 gfc_component *comp = NULL;
4965 /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
4966 if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
4967 return NULL;
4969 /* Elemental functions don't need a temporary anyway. */
4970 if (expr2->value.function.esym != NULL
4971 && expr2->value.function.esym->attr.elemental)
4972 return NULL;
4974 /* Fail if rhs is not FULL or a contiguous section. */
4975 if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
4976 return NULL;
4978 /* Fail if EXPR1 can't be expressed as a descriptor. */
4979 if (gfc_ref_needs_temporary_p (expr1->ref))
4980 return NULL;
4982 /* Functions returning pointers need temporaries. */
4983 if (expr2->symtree->n.sym->attr.pointer
4984 || expr2->symtree->n.sym->attr.allocatable)
4985 return NULL;
4987 /* Character array functions need temporaries unless the
4988 character lengths are the same. */
4989 if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
4991 if (expr1->ts.u.cl->length == NULL
4992 || expr1->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4993 return NULL;
4995 if (expr2->ts.u.cl->length == NULL
4996 || expr2->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4997 return NULL;
4999 if (mpz_cmp (expr1->ts.u.cl->length->value.integer,
5000 expr2->ts.u.cl->length->value.integer) != 0)
5001 return NULL;
5004 /* Check that no LHS component references appear during an array
5005 reference. This is needed because we do not have the means to
5006 span any arbitrary stride with an array descriptor. This check
5007 is not needed for the rhs because the function result has to be
5008 a complete type. */
5009 seen_array_ref = false;
5010 for (ref = expr1->ref; ref; ref = ref->next)
5012 if (ref->type == REF_ARRAY)
5013 seen_array_ref= true;
5014 else if (ref->type == REF_COMPONENT && seen_array_ref)
5015 return NULL;
5018 /* Check for a dependency. */
5019 if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
5020 expr2->value.function.esym,
5021 expr2->value.function.actual,
5022 NOT_ELEMENTAL))
5023 return NULL;
5025 /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
5026 functions. */
5027 gcc_assert (expr2->value.function.isym
5028 || (gfc_is_proc_ptr_comp (expr2, &comp)
5029 && comp && comp->attr.dimension)
5030 || (!comp && gfc_return_by_reference (expr2->value.function.esym)
5031 && expr2->value.function.esym->result->attr.dimension));
5033 ss = gfc_walk_expr (expr1);
5034 gcc_assert (ss != gfc_ss_terminator);
5035 gfc_init_se (&se, NULL);
5036 gfc_start_block (&se.pre);
5037 se.want_pointer = 1;
5039 gfc_conv_array_parameter (&se, expr1, ss, 0, NULL, NULL, NULL);
5041 if (expr1->ts.type == BT_DERIVED
5042 && expr1->ts.u.derived->attr.alloc_comp)
5044 tree tmp;
5045 tmp = gfc_deallocate_alloc_comp (expr1->ts.u.derived, se.expr,
5046 expr1->rank);
5047 gfc_add_expr_to_block (&se.pre, tmp);
5050 se.direct_byref = 1;
5051 se.ss = gfc_walk_expr (expr2);
5052 gcc_assert (se.ss != gfc_ss_terminator);
5053 gfc_conv_function_expr (&se, expr2);
5054 gfc_add_block_to_block (&se.pre, &se.post);
5056 return gfc_finish_block (&se.pre);
5059 /* Determine whether the given EXPR_CONSTANT is a zero initializer. */
5061 static bool
5062 is_zero_initializer_p (gfc_expr * expr)
5064 if (expr->expr_type != EXPR_CONSTANT)
5065 return false;
5067 /* We ignore constants with prescribed memory representations for now. */
5068 if (expr->representation.string)
5069 return false;
5071 switch (expr->ts.type)
5073 case BT_INTEGER:
5074 return mpz_cmp_si (expr->value.integer, 0) == 0;
5076 case BT_REAL:
5077 return mpfr_zero_p (expr->value.real)
5078 && MPFR_SIGN (expr->value.real) >= 0;
5080 case BT_LOGICAL:
5081 return expr->value.logical == 0;
5083 case BT_COMPLEX:
5084 return mpfr_zero_p (mpc_realref (expr->value.complex))
5085 && MPFR_SIGN (mpc_realref (expr->value.complex)) >= 0
5086 && mpfr_zero_p (mpc_imagref (expr->value.complex))
5087 && MPFR_SIGN (mpc_imagref (expr->value.complex)) >= 0;
5089 default:
5090 break;
5092 return false;
5095 /* Try to efficiently translate array(:) = 0. Return NULL if this
5096 can't be done. */
5098 static tree
5099 gfc_trans_zero_assign (gfc_expr * expr)
5101 tree dest, len, type;
5102 tree tmp;
5103 gfc_symbol *sym;
5105 sym = expr->symtree->n.sym;
5106 dest = gfc_get_symbol_decl (sym);
5108 type = TREE_TYPE (dest);
5109 if (POINTER_TYPE_P (type))
5110 type = TREE_TYPE (type);
5111 if (!GFC_ARRAY_TYPE_P (type))
5112 return NULL_TREE;
5114 /* Determine the length of the array. */
5115 len = GFC_TYPE_ARRAY_SIZE (type);
5116 if (!len || TREE_CODE (len) != INTEGER_CST)
5117 return NULL_TREE;
5119 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
5120 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
5121 fold_convert (gfc_array_index_type, tmp));
5123 /* If we are zeroing a local array avoid taking its address by emitting
5124 a = {} instead. */
5125 if (!POINTER_TYPE_P (TREE_TYPE (dest)))
5126 return build2 (MODIFY_EXPR, void_type_node,
5127 dest, build_constructor (TREE_TYPE (dest), NULL));
5129 /* Convert arguments to the correct types. */
5130 dest = fold_convert (pvoid_type_node, dest);
5131 len = fold_convert (size_type_node, len);
5133 /* Construct call to __builtin_memset. */
5134 tmp = build_call_expr_loc (input_location,
5135 built_in_decls[BUILT_IN_MEMSET],
5136 3, dest, integer_zero_node, len);
5137 return fold_convert (void_type_node, tmp);
5141 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
5142 that constructs the call to __builtin_memcpy. */
5144 tree
5145 gfc_build_memcpy_call (tree dst, tree src, tree len)
5147 tree tmp;
5149 /* Convert arguments to the correct types. */
5150 if (!POINTER_TYPE_P (TREE_TYPE (dst)))
5151 dst = gfc_build_addr_expr (pvoid_type_node, dst);
5152 else
5153 dst = fold_convert (pvoid_type_node, dst);
5155 if (!POINTER_TYPE_P (TREE_TYPE (src)))
5156 src = gfc_build_addr_expr (pvoid_type_node, src);
5157 else
5158 src = fold_convert (pvoid_type_node, src);
5160 len = fold_convert (size_type_node, len);
5162 /* Construct call to __builtin_memcpy. */
5163 tmp = build_call_expr_loc (input_location,
5164 built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
5165 return fold_convert (void_type_node, tmp);
5169 /* Try to efficiently translate dst(:) = src(:). Return NULL if this
5170 can't be done. EXPR1 is the destination/lhs and EXPR2 is the
5171 source/rhs, both are gfc_full_array_ref_p which have been checked for
5172 dependencies. */
5174 static tree
5175 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
5177 tree dst, dlen, dtype;
5178 tree src, slen, stype;
5179 tree tmp;
5181 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5182 src = gfc_get_symbol_decl (expr2->symtree->n.sym);
5184 dtype = TREE_TYPE (dst);
5185 if (POINTER_TYPE_P (dtype))
5186 dtype = TREE_TYPE (dtype);
5187 stype = TREE_TYPE (src);
5188 if (POINTER_TYPE_P (stype))
5189 stype = TREE_TYPE (stype);
5191 if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
5192 return NULL_TREE;
5194 /* Determine the lengths of the arrays. */
5195 dlen = GFC_TYPE_ARRAY_SIZE (dtype);
5196 if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
5197 return NULL_TREE;
5198 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5199 dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen,
5200 fold_convert (gfc_array_index_type, tmp));
5202 slen = GFC_TYPE_ARRAY_SIZE (stype);
5203 if (!slen || TREE_CODE (slen) != INTEGER_CST)
5204 return NULL_TREE;
5205 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
5206 slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen,
5207 fold_convert (gfc_array_index_type, tmp));
5209 /* Sanity check that they are the same. This should always be
5210 the case, as we should already have checked for conformance. */
5211 if (!tree_int_cst_equal (slen, dlen))
5212 return NULL_TREE;
5214 return gfc_build_memcpy_call (dst, src, dlen);
5218 /* Try to efficiently translate array(:) = (/ ... /). Return NULL if
5219 this can't be done. EXPR1 is the destination/lhs for which
5220 gfc_full_array_ref_p is true, and EXPR2 is the source/rhs. */
5222 static tree
5223 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
5225 unsigned HOST_WIDE_INT nelem;
5226 tree dst, dtype;
5227 tree src, stype;
5228 tree len;
5229 tree tmp;
5231 nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
5232 if (nelem == 0)
5233 return NULL_TREE;
5235 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5236 dtype = TREE_TYPE (dst);
5237 if (POINTER_TYPE_P (dtype))
5238 dtype = TREE_TYPE (dtype);
5239 if (!GFC_ARRAY_TYPE_P (dtype))
5240 return NULL_TREE;
5242 /* Determine the lengths of the array. */
5243 len = GFC_TYPE_ARRAY_SIZE (dtype);
5244 if (!len || TREE_CODE (len) != INTEGER_CST)
5245 return NULL_TREE;
5247 /* Confirm that the constructor is the same size. */
5248 if (compare_tree_int (len, nelem) != 0)
5249 return NULL_TREE;
5251 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5252 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
5253 fold_convert (gfc_array_index_type, tmp));
5255 stype = gfc_typenode_for_spec (&expr2->ts);
5256 src = gfc_build_constant_array_constructor (expr2, stype);
5258 stype = TREE_TYPE (src);
5259 if (POINTER_TYPE_P (stype))
5260 stype = TREE_TYPE (stype);
5262 return gfc_build_memcpy_call (dst, src, len);
5266 /* Subroutine of gfc_trans_assignment that actually scalarizes the
5267 assignment. EXPR1 is the destination/LHS and EXPR2 is the source/RHS. */
5269 static tree
5270 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
5272 gfc_se lse;
5273 gfc_se rse;
5274 gfc_ss *lss;
5275 gfc_ss *lss_section;
5276 gfc_ss *rss;
5277 gfc_loopinfo loop;
5278 tree tmp;
5279 stmtblock_t block;
5280 stmtblock_t body;
5281 bool l_is_temp;
5282 bool scalar_to_array;
5283 tree string_length;
5285 /* Assignment of the form lhs = rhs. */
5286 gfc_start_block (&block);
5288 gfc_init_se (&lse, NULL);
5289 gfc_init_se (&rse, NULL);
5291 /* Walk the lhs. */
5292 lss = gfc_walk_expr (expr1);
5293 rss = NULL;
5294 if (lss != gfc_ss_terminator)
5296 /* Allow the scalarizer to workshare array assignments. */
5297 if (ompws_flags & OMPWS_WORKSHARE_FLAG)
5298 ompws_flags |= OMPWS_SCALARIZER_WS;
5300 /* The assignment needs scalarization. */
5301 lss_section = lss;
5303 /* Find a non-scalar SS from the lhs. */
5304 while (lss_section != gfc_ss_terminator
5305 && lss_section->type != GFC_SS_SECTION)
5306 lss_section = lss_section->next;
5308 gcc_assert (lss_section != gfc_ss_terminator);
5310 /* Initialize the scalarizer. */
5311 gfc_init_loopinfo (&loop);
5313 /* Walk the rhs. */
5314 rss = gfc_walk_expr (expr2);
5315 if (rss == gfc_ss_terminator)
5317 /* The rhs is scalar. Add a ss for the expression. */
5318 rss = gfc_get_ss ();
5319 rss->next = gfc_ss_terminator;
5320 rss->type = GFC_SS_SCALAR;
5321 rss->expr = expr2;
5323 /* Associate the SS with the loop. */
5324 gfc_add_ss_to_loop (&loop, lss);
5325 gfc_add_ss_to_loop (&loop, rss);
5327 /* Calculate the bounds of the scalarization. */
5328 gfc_conv_ss_startstride (&loop);
5329 /* Resolve any data dependencies in the statement. */
5330 gfc_conv_resolve_dependencies (&loop, lss, rss);
5331 /* Setup the scalarizing loops. */
5332 gfc_conv_loop_setup (&loop, &expr2->where);
5334 /* Setup the gfc_se structures. */
5335 gfc_copy_loopinfo_to_se (&lse, &loop);
5336 gfc_copy_loopinfo_to_se (&rse, &loop);
5338 rse.ss = rss;
5339 gfc_mark_ss_chain_used (rss, 1);
5340 if (loop.temp_ss == NULL)
5342 lse.ss = lss;
5343 gfc_mark_ss_chain_used (lss, 1);
5345 else
5347 lse.ss = loop.temp_ss;
5348 gfc_mark_ss_chain_used (lss, 3);
5349 gfc_mark_ss_chain_used (loop.temp_ss, 3);
5352 /* Start the scalarized loop body. */
5353 gfc_start_scalarized_body (&loop, &body);
5355 else
5356 gfc_init_block (&body);
5358 l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
5360 /* Translate the expression. */
5361 gfc_conv_expr (&rse, expr2);
5363 /* Stabilize a string length for temporaries. */
5364 if (expr2->ts.type == BT_CHARACTER)
5365 string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
5366 else
5367 string_length = NULL_TREE;
5369 if (l_is_temp)
5371 gfc_conv_tmp_array_ref (&lse);
5372 gfc_advance_se_ss_chain (&lse);
5373 if (expr2->ts.type == BT_CHARACTER)
5374 lse.string_length = string_length;
5376 else
5377 gfc_conv_expr (&lse, expr1);
5379 /* Assignments of scalar derived types with allocatable components
5380 to arrays must be done with a deep copy and the rhs temporary
5381 must have its components deallocated afterwards. */
5382 scalar_to_array = (expr2->ts.type == BT_DERIVED
5383 && expr2->ts.u.derived->attr.alloc_comp
5384 && expr2->expr_type != EXPR_VARIABLE
5385 && !gfc_is_constant_expr (expr2)
5386 && expr1->rank && !expr2->rank);
5387 if (scalar_to_array)
5389 tmp = gfc_deallocate_alloc_comp (expr2->ts.u.derived, rse.expr, 0);
5390 gfc_add_expr_to_block (&loop.post, tmp);
5393 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
5394 l_is_temp || init_flag,
5395 (expr2->expr_type == EXPR_VARIABLE)
5396 || scalar_to_array);
5397 gfc_add_expr_to_block (&body, tmp);
5399 if (lss == gfc_ss_terminator)
5401 /* Use the scalar assignment as is. */
5402 gfc_add_block_to_block (&block, &body);
5404 else
5406 gcc_assert (lse.ss == gfc_ss_terminator
5407 && rse.ss == gfc_ss_terminator);
5409 if (l_is_temp)
5411 gfc_trans_scalarized_loop_boundary (&loop, &body);
5413 /* We need to copy the temporary to the actual lhs. */
5414 gfc_init_se (&lse, NULL);
5415 gfc_init_se (&rse, NULL);
5416 gfc_copy_loopinfo_to_se (&lse, &loop);
5417 gfc_copy_loopinfo_to_se (&rse, &loop);
5419 rse.ss = loop.temp_ss;
5420 lse.ss = lss;
5422 gfc_conv_tmp_array_ref (&rse);
5423 gfc_advance_se_ss_chain (&rse);
5424 gfc_conv_expr (&lse, expr1);
5426 gcc_assert (lse.ss == gfc_ss_terminator
5427 && rse.ss == gfc_ss_terminator);
5429 if (expr2->ts.type == BT_CHARACTER)
5430 rse.string_length = string_length;
5432 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
5433 false, false);
5434 gfc_add_expr_to_block (&body, tmp);
5437 /* Generate the copying loops. */
5438 gfc_trans_scalarizing_loops (&loop, &body);
5440 /* Wrap the whole thing up. */
5441 gfc_add_block_to_block (&block, &loop.pre);
5442 gfc_add_block_to_block (&block, &loop.post);
5444 gfc_cleanup_loop (&loop);
5447 return gfc_finish_block (&block);
5451 /* Check whether EXPR is a copyable array. */
5453 static bool
5454 copyable_array_p (gfc_expr * expr)
5456 if (expr->expr_type != EXPR_VARIABLE)
5457 return false;
5459 /* First check it's an array. */
5460 if (expr->rank < 1 || !expr->ref || expr->ref->next)
5461 return false;
5463 if (!gfc_full_array_ref_p (expr->ref, NULL))
5464 return false;
5466 /* Next check that it's of a simple enough type. */
5467 switch (expr->ts.type)
5469 case BT_INTEGER:
5470 case BT_REAL:
5471 case BT_COMPLEX:
5472 case BT_LOGICAL:
5473 return true;
5475 case BT_CHARACTER:
5476 return false;
5478 case BT_DERIVED:
5479 return !expr->ts.u.derived->attr.alloc_comp;
5481 default:
5482 break;
5485 return false;
5488 /* Translate an assignment. */
5490 tree
5491 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
5493 tree tmp;
5495 /* Special case a single function returning an array. */
5496 if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
5498 tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
5499 if (tmp)
5500 return tmp;
5503 /* Special case assigning an array to zero. */
5504 if (copyable_array_p (expr1)
5505 && is_zero_initializer_p (expr2))
5507 tmp = gfc_trans_zero_assign (expr1);
5508 if (tmp)
5509 return tmp;
5512 /* Special case copying one array to another. */
5513 if (copyable_array_p (expr1)
5514 && copyable_array_p (expr2)
5515 && gfc_compare_types (&expr1->ts, &expr2->ts)
5516 && !gfc_check_dependency (expr1, expr2, 0))
5518 tmp = gfc_trans_array_copy (expr1, expr2);
5519 if (tmp)
5520 return tmp;
5523 /* Special case initializing an array from a constant array constructor. */
5524 if (copyable_array_p (expr1)
5525 && expr2->expr_type == EXPR_ARRAY
5526 && gfc_compare_types (&expr1->ts, &expr2->ts))
5528 tmp = gfc_trans_array_constructor_copy (expr1, expr2);
5529 if (tmp)
5530 return tmp;
5533 /* Fallback to the scalarizer to generate explicit loops. */
5534 return gfc_trans_assignment_1 (expr1, expr2, init_flag);
5537 tree
5538 gfc_trans_init_assign (gfc_code * code)
5540 return gfc_trans_assignment (code->expr1, code->expr2, true);
5543 tree
5544 gfc_trans_assign (gfc_code * code)
5546 return gfc_trans_assignment (code->expr1, code->expr2, false);
5550 /* Translate an assignment to a CLASS object
5551 (pointer or ordinary assignment). */
5553 tree
5554 gfc_trans_class_assign (gfc_code *code)
5556 stmtblock_t block;
5557 tree tmp;
5558 gfc_expr *lhs;
5559 gfc_expr *rhs;
5561 gfc_start_block (&block);
5563 if (code->op == EXEC_INIT_ASSIGN)
5565 /* Special case for initializing a CLASS variable on allocation.
5566 A MEMCPY is needed to copy the full data of the dynamic type,
5567 which may be different from the declared type. */
5568 gfc_se dst,src;
5569 tree memsz;
5570 gfc_init_se (&dst, NULL);
5571 gfc_init_se (&src, NULL);
5572 gfc_add_component_ref (code->expr1, "$data");
5573 gfc_conv_expr (&dst, code->expr1);
5574 gfc_conv_expr (&src, code->expr2);
5575 gfc_add_block_to_block (&block, &src.pre);
5576 memsz = TYPE_SIZE_UNIT (gfc_typenode_for_spec (&code->expr2->ts));
5577 tmp = gfc_build_memcpy_call (dst.expr, src.expr, memsz);
5578 gfc_add_expr_to_block (&block, tmp);
5579 return gfc_finish_block (&block);
5582 if (code->expr2->ts.type != BT_CLASS)
5584 /* Insert an additional assignment which sets the '$vptr' field. */
5585 lhs = gfc_copy_expr (code->expr1);
5586 gfc_add_component_ref (lhs, "$vptr");
5587 if (code->expr2->ts.type == BT_DERIVED)
5589 gfc_symbol *vtab;
5590 gfc_symtree *st;
5591 vtab = gfc_find_derived_vtab (code->expr2->ts.u.derived);
5592 gcc_assert (vtab);
5594 rhs = gfc_get_expr ();
5595 rhs->expr_type = EXPR_VARIABLE;
5596 gfc_find_sym_tree (vtab->name, NULL, 1, &st);
5597 rhs->symtree = st;
5598 rhs->ts = vtab->ts;
5600 else if (code->expr2->expr_type == EXPR_NULL)
5601 rhs = gfc_int_expr (0);
5602 else
5603 gcc_unreachable ();
5605 tmp = gfc_trans_pointer_assignment (lhs, rhs);
5606 gfc_add_expr_to_block (&block, tmp);
5608 gfc_free_expr (lhs);
5609 gfc_free_expr (rhs);
5612 /* Do the actual CLASS assignment. */
5613 if (code->expr2->ts.type == BT_CLASS)
5614 code->op = EXEC_ASSIGN;
5615 else
5616 gfc_add_component_ref (code->expr1, "$data");
5618 if (code->op == EXEC_ASSIGN)
5619 tmp = gfc_trans_assign (code);
5620 else if (code->op == EXEC_POINTER_ASSIGN)
5621 tmp = gfc_trans_pointer_assign (code);
5622 else
5623 gcc_unreachable();
5625 gfc_add_expr_to_block (&block, tmp);
5627 return gfc_finish_block (&block);