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
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
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. */
27 #include "coretypes.h"
34 #include "langhooks.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 *,
50 /* Copy the scalarization loop variables. */
53 gfc_copy_se_loopvars (gfc_se * dest, gfc_se * src)
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. */
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);
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.
85 gfc_advance_se_ss_chain (gfc_se * se)
89 gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator);
92 /* Walk down the parent chain. */
95 /* Simple consistency check. */
96 gcc_assert (p->parent == NULL || p->parent->ss == p->ss);
105 /* Ensures the result of the expression as either a temporary variable
106 or a constant so that it can be used repeatedly. */
109 gfc_make_safe_expr (gfc_se * se)
113 if (CONSTANT_CLASS_P (se->expr))
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);
123 /* Return an expression which determines if a dummy parameter is present.
124 Also used for arguments to procedures with multiple entry points. */
127 gfc_conv_expr_present (gfc_symbol * sym)
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
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. */
150 gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
155 present = gfc_conv_expr_present (arg->symtree->n.sym);
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,
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);
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);
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;
190 /* Get the character length of an expression, looking through gfc_refs
194 gfc_get_expr_charlen (gfc_expr *e)
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)
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;
213 /* First candidate: if the variable is of type CHARACTER, the
214 expression's length could be the length of the character
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)
225 if (r->u.c.component->ts.type == BT_CHARACTER)
226 length = r->u.c.component->ts.u.cl->backend_decl;
234 /* We should never got substring references here. These will be
235 broken down by the scalarizer. */
241 gcc_assert (length != NULL);
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). */
251 flatten_array_ctors_without_strlen (gfc_expr* e)
253 gfc_actual_arglist* arg;
259 switch (e->expr_type)
263 flatten_array_ctors_without_strlen (e->value.op.op1);
264 flatten_array_ctors_without_strlen (e->value.op.op2);
268 /* TODO: Implement as with EXPR_FUNCTION when needed. */
272 for (arg = e->value.function.actual; arg; arg = arg->next)
273 flatten_array_ctors_without_strlen (arg->expr);
278 /* We've found what we're looking for. */
279 if (e->ts.type == BT_CHARACTER && !e->ts.u.cl->length)
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);
292 /* Otherwise, fall through to handle constructor elements. */
294 for (c = e->value.constructor; c; c = c->next)
295 flatten_array_ctors_without_strlen (c->expr);
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. */
311 gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock)
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. */
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);
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);
349 cl->backend_decl = gfc_evaluate_now (se.expr, pblock);
354 gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind,
355 const char *name, locus *where)
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);
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)))
385 tmp = build_fold_indirect_ref_loc (input_location,
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;
397 gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
398 gfc_add_block_to_block (&se->pre, &end.pre);
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,
416 asprintf (&msg, "Substring out of bounds: lower bound (%%ld) of '%s' "
417 "is less than one", name);
419 asprintf (&msg, "Substring out of bounds: lower bound (%%ld)"
421 gfc_trans_runtime_check (true, false, fault, &se->pre, where, msg,
422 fold_convert (long_integer_type_node,
426 /* Check upper bound. */
427 fault = fold_build2 (GT_EXPR, boolean_type_node, end.expr,
429 fault = fold_build2 (TRUTH_ANDIF_EXPR, boolean_type_node,
432 asprintf (&msg, "Substring out of bounds: upper bound (%%ld) of '%s' "
433 "exceeds string length (%%ld)", name);
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,
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. */
457 gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
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);
471 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field), decl, field, NULL_TREE);
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,
491 /* This function deals with component references to components of the
492 parent type for derived type extensons. */
494 conv_parent_component_references (gfc_se * se, gfc_ref * ref)
502 c = ref->u.c.component;
504 /* Build a gfc_ref to recursively call gfc_conv_component_ref. */
505 parent.type = REF_COMPONENT;
508 parent.u.c.component = dt->components;
510 if (dt->attr.extension && dt->components)
512 if (dt->attr.is_class)
513 cmp = dt->components;
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)
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). */
533 gfc_conv_variable (gfc_se * se, gfc_expr * expr)
540 bool alternate_entry;
543 sym = expr->symtree->n.sym;
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)
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
576 && sym->ns->proc_name->backend_decl == parent_decl
577 && (alternate_entry || entry_master)))
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
592 gfc_entry_list *el = NULL;
594 for (el = sym->ns->entries; el; el = el->next)
597 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
602 else if (entry_master
603 && (sym->ns->proc_name->backend_decl == current_function_decl
605 se_expr = gfc_get_fake_result_decl (sym, parent_flag);
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);
623 /* Dereference the expression, where needed. Since characters
624 are entirely different from other types, they are treated
626 if (sym->ts.type == BT_CHARACTER)
628 /* Dereference character pointer dummy arguments
630 if ((sym->attr.pointer || sym->attr.allocatable)
632 || sym->attr.function
633 || sym->attr.result))
634 se->expr = build_fold_indirect_ref_loc (input_location,
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,
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,
653 /* Dereference non-character pointer variables.
654 These must be dummies, results, or scalars. */
655 if ((sym->attr.pointer || sym->attr.allocatable)
657 || sym->attr.function
659 || !sym->attr.dimension))
660 se->expr = build_fold_indirect_ref_loc (input_location,
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;
675 se->string_length = sym->ts.u.cl->backend_decl;
676 gcc_assert (se->string_length);
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)
688 /* TODO: Pointers to single elements of array sections, eg elemental subs. */
689 /* Return the descriptor for array pointers and allocations. */
691 && ref->next == NULL && (se->descriptor_only))
694 gfc_conv_array_ref (se, &ref->u.ar, sym, &expr->where);
695 /* Return a pointer to an element. */
699 if (ref->u.c.sym->attr.extension)
700 conv_parent_component_references (se, ref);
702 gfc_conv_component_ref (se, ref);
706 gfc_conv_substring (se, ref, expr->ts.kind,
707 expr->symtree->name, &expr->where);
716 /* Pointer assignment, allocation or pass by reference. Arrays are handled
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);
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. */
731 gfc_conv_unary_op (enum tree_code code, gfc_se * se, gfc_expr * expr)
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));
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
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. */
811 gfc_conv_powi (gfc_se * se, unsigned HOST_WIDE_INT n, tree * tmpvar)
818 if (n < POWI_TABLE_SIZE)
823 op0 = gfc_conv_powi (se, n - powi_table[n], tmpvar);
824 op1 = gfc_conv_powi (se, powi_table[n], tmpvar);
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);
834 op0 = gfc_conv_powi (se, n >> 1, tmpvar);
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)
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. */
852 gfc_conv_cst_int_power (gfc_se * se, tree lhs, tree rhs)
857 tree vartmp[POWI_TABLE_SIZE];
859 unsigned HOST_WIDE_INT n;
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)))
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))
882 se->expr = gfc_build_const (type, integer_one_node);
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));
895 result = (lhs == 1 || lhs == -1) ? 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));
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);
913 memset (vartmp, 0, sizeof (vartmp));
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);
927 /* Power op (**). Constant integer exponent has special handling. */
930 gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
932 tree gfc_int4_type_node;
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))
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)
959 ikind = expr->value.op.op2->ts.kind;
964 rse.expr = convert (gfc_int4_type_node, rse.expr);
986 if (expr->value.op.op1->ts.type == BT_INTEGER)
987 lse.expr = convert (gfc_int4_type_node, lse.expr);
1012 switch (expr->value.op.op1->ts.type)
1015 if (kind == 3) /* Case 16 was not handled properly above. */
1017 fndecl = gfor_fndecl_math_powi[kind][ikind].integer;
1021 /* Use builtins for real ** int4. */
1027 fndecl = built_in_decls[BUILT_IN_POWIF];
1031 fndecl = built_in_decls[BUILT_IN_POWI];
1036 fndecl = built_in_decls[BUILT_IN_POWIL];
1044 fndecl = gfor_fndecl_math_powi[kind][ikind].real;
1048 fndecl = gfor_fndecl_math_powi[kind][ikind].cmplx;
1060 fndecl = built_in_decls[BUILT_IN_POWF];
1063 fndecl = built_in_decls[BUILT_IN_POW];
1067 fndecl = built_in_decls[BUILT_IN_POWL];
1078 fndecl = built_in_decls[BUILT_IN_CPOWF];
1081 fndecl = built_in_decls[BUILT_IN_CPOW];
1085 fndecl = built_in_decls[BUILT_IN_CPOWL];
1097 se->expr = build_call_expr_loc (input_location,
1098 fndecl, 2, lse.expr, rse.expr);
1102 /* Generate code to allocate a string temporary. */
1105 gfc_conv_string_tmp (gfc_se * se, tree type, tree len)
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);
1122 tmp = build_array_type (TREE_TYPE (type), tmp);
1124 var = gfc_create_var (tmp, "str");
1125 var = gfc_build_addr_expr (type, var);
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);
1146 /* Handle a string concatenation operation. A temporary will be allocated to
1150 gfc_conv_concat_op (gfc_se * se, gfc_expr * expr)
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;
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);
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
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. */
1211 gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
1213 enum tree_code code;
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)));
1234 case INTRINSIC_UPLUS:
1235 gfc_conv_expr (se, expr->value.op.op1);
1238 case INTRINSIC_UMINUS:
1239 gfc_conv_unary_op (NEGATE_EXPR, se, expr);
1243 gfc_conv_unary_op (TRUTH_NOT_EXPR, se, expr);
1246 case INTRINSIC_PLUS:
1250 case INTRINSIC_MINUS:
1254 case INTRINSIC_TIMES:
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
1262 if (expr->ts.type == BT_INTEGER)
1263 code = TRUNC_DIV_EXPR;
1268 case INTRINSIC_POWER:
1269 gfc_conv_power_op (se, expr);
1272 case INTRINSIC_CONCAT:
1273 gfc_conv_concat_op (se, expr);
1277 code = TRUTH_ANDIF_EXPR;
1282 code = TRUTH_ORIF_EXPR;
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. */
1289 case INTRINSIC_EQ_OS:
1297 case INTRINSIC_NE_OS:
1298 case INTRINSIC_NEQV:
1305 case INTRINSIC_GT_OS:
1312 case INTRINSIC_GE_OS:
1319 case INTRINSIC_LT_OS:
1326 case INTRINSIC_LE_OS:
1332 case INTRINSIC_USER:
1333 case INTRINSIC_ASSIGN:
1334 /* These should be converted into function calls by the frontend. */
1338 fatal_error ("Unknown intrinsic op");
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)
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);
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);
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);
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);
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. */
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,
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;
1424 /* If we have a constant character expression, make it into an
1426 if ((*expr)->expr_type == EXPR_CONSTANT)
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),
1449 ((*expr)->symtree->n.sym)),
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),
1466 /* Compare two strings. If they are all single characters, the result is the
1467 subtraction of them. Otherwise, we build a library call. */
1470 gfc_build_compare_string (tree len1, tree str1, tree len2, tree str2, int kind)
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);
1491 /* Build a call for the comparison. */
1495 fndecl = gfor_fndecl_compare_string;
1497 fndecl = gfor_fndecl_compare_string_char4;
1501 tmp = build_call_expr_loc (input_location,
1502 fndecl, 4, len1, str1, len2, str2);
1509 /* Return the backend_decl for a procedure pointer component. */
1512 get_proc_ptr_comp (gfc_expr *e)
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);
1521 return build_fold_addr_expr_loc (input_location, comp_se.expr);
1525 /* Select a class typebound procedure at runtime. */
1527 select_class_proc (gfc_se *se, gfc_class_esym_list *elist,
1528 tree declared, gfc_expr *expr)
1535 gfc_class_esym_list *next_elist, *tmp_elist;
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)
1559 /* Skip abstract base types. */
1560 if (elist->derived->attr.abstract)
1563 /* Run through the chain picking up all the cases that call the
1566 for (; elist; elist = elist->next)
1570 if (elist->esym != tmp_elist->esym)
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
1583 elist->derived = NULL;
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. */
1607 next_elist = elist->next;
1608 if (elist->hash_value)
1609 gfc_free_expr (elist->hash_value);
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;
1637 conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr)
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,
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,
1668 gcc_assert (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1669 && TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) == FUNCTION_TYPE);
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
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);
1698 /* Initialize MAPPING. */
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). */
1711 gfc_free_interface_mapping (gfc_interface_mapping * mapping)
1713 gfc_interface_sym_mapping *sym;
1714 gfc_interface_sym_mapping *nextsym;
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);
1727 for (cl = mapping->charlens; cl; cl = nextcl)
1730 gfc_free_expr (cl->length);
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,
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;
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. */
1761 gfc_get_interface_mapping_array (stmtblock_t * block, gfc_symbol * sym,
1762 gfc_packed packed, tree data)
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));
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. */
1784 gfc_set_interface_mapping_bounds (stmtblock_t * block, tree type, tree desc)
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),
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. */
1829 gfc_add_interface_mapping (gfc_interface_mapping * mapping,
1830 gfc_symbol * sym, gfc_se * se,
1833 gfc_interface_sym_mapping *sm;
1837 gfc_symbol *new_sym;
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. */
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;
1871 sm->new_sym = new_symtree;
1872 sm->expr = gfc_copy_expr (expr);
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;
1898 /* Use the passed value as-is if the argument is a function. */
1899 if (sym->attr.flavor == FL_PROCEDURE)
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,
1913 value = fold_convert (tmp, value);
1916 /* If the argument is a scalar, a pointer to an array or an allocatable,
1918 else if (!sym->attr.dimension || sym->attr.pointer || sym->attr.allocatable)
1919 value = build_fold_indirect_ref_loc (input_location,
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,
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,
1936 /* Create the replacement variable. */
1937 tmp = gfc_conv_descriptor_data_get (desc);
1938 value = gfc_get_interface_mapping_array (&se->pre, sym,
1941 /* Use DESC to work out the upper bounds, strides and offset. */
1942 gfc_set_interface_mapping_bounds (&se->pre, TREE_TYPE (value), desc);
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. */
1959 gfc_finish_interface_mapping (gfc_interface_mapping * mapping,
1960 stmtblock_t * pre, stmtblock_t * post)
1962 gfc_interface_sym_mapping *sym;
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
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);
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
2008 gfc_apply_interface_mapping_to_ref (gfc_interface_mapping * mapping,
2013 for (; ref; ref = ref->next)
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);
2030 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.start);
2031 gfc_apply_interface_mapping_to_expr (mapping, ref->u.ss.end);
2037 /* Convert intrinsic function calls into result expressions. */
2040 gfc_map_intrinsic_function (gfc_expr *expr, gfc_interface_mapping *mapping)
2048 arg1 = expr->value.function.actual->expr;
2049 if (expr->value.function.actual->next)
2050 arg2 = expr->value.function.actual->next->expr;
2054 sym = arg1->symtree->n.sym;
2056 if (sym->attr.dummy)
2061 switch (expr->value.function.isym->id)
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)))
2071 new_expr = gfc_copy_expr (arg1->ts.u.cl->length);
2078 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2080 dup = mpz_get_si (arg2->value.integer);
2085 dup = sym->as->rank;
2089 for (; d < dup; d++)
2093 if (!sym->as->upper[d] || !sym->as->lower[d])
2095 gfc_free_expr (new_expr);
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]));
2102 new_expr = gfc_multiply (new_expr, tmp);
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. */
2116 if (arg2 && arg2->expr_type == EXPR_CONSTANT)
2117 d = mpz_get_si (arg2->value.integer) - 1;
2119 /* TODO: If the need arises, this could produce an array of
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]);
2130 if (sym->as->upper[d])
2131 new_expr = gfc_copy_expr (sym->as->upper[d]);
2139 gfc_apply_interface_mapping_to_expr (mapping, new_expr);
2143 gfc_replace_expr (expr, new_expr);
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)
2163 gfc_add_interface_mapping (mapping, f->sym, NULL, actual->expr);
2166 if (map_expr->symtree->n.sym->attr.dimension)
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. */
2199 gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
2202 gfc_interface_sym_mapping *sym;
2203 gfc_actual_arglist *actual;
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;
2227 gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
2230 /* ...and to subexpressions in expr->value. */
2231 switch (expr->expr_type)
2236 case EXPR_SUBSTRING:
2240 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op1);
2241 gfc_apply_interface_mapping_to_expr (mapping, expr->value.op.op2);
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))
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;
2264 case EXPR_STRUCTURE:
2265 gfc_apply_interface_mapping_to_cons (mapping, expr->value.constructor);
2278 /* Evaluate interface expression EXPR using MAPPING. Store the result
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. */
2297 gfc_conv_subref_array_arg (gfc_se * parmse, gfc_expr * expr,
2298 int g77, sym_intent intent)
2314 gcc_assert (expr->expr_type == EXPR_VARIABLE);
2316 gfc_init_se (&lse, NULL);
2317 gfc_init_se (&rse, NULL);
2319 /* Walk the argument expression. */
2320 rss = gfc_walk_expr (expr);
2322 gcc_assert (rss != gfc_ss_terminator);
2324 /* Initialize the scalarizer. */
2325 gfc_init_loopinfo (&loop);
2326 gfc_add_ss_to_loop (&loop, rss);
2328 /* Calculate the bounds of the scalarization. */
2329 gfc_conv_ss_startstride (&loop);
2331 /* Build an ss for the temporary. */
2332 if (expr->ts.type == BT_CHARACTER && !expr->ts.u.cl->backend_decl)
2333 gfc_conv_string_length (expr->ts.u.cl, expr, &parmse->pre);
2335 base_type = gfc_typenode_for_spec (&expr->ts);
2336 if (GFC_ARRAY_TYPE_P (base_type)
2337 || GFC_DESCRIPTOR_TYPE_P (base_type))
2338 base_type = gfc_get_element_type (base_type);
2340 loop.temp_ss = gfc_get_ss ();;
2341 loop.temp_ss->type = GFC_SS_TEMP;
2342 loop.temp_ss->data.temp.type = base_type;
2344 if (expr->ts.type == BT_CHARACTER)
2345 loop.temp_ss->string_length = expr->ts.u.cl->backend_decl;
2347 loop.temp_ss->string_length = NULL;
2349 parmse->string_length = loop.temp_ss->string_length;
2350 loop.temp_ss->data.temp.dimen = loop.dimen;
2351 loop.temp_ss->next = gfc_ss_terminator;
2353 /* Associate the SS with the loop. */
2354 gfc_add_ss_to_loop (&loop, loop.temp_ss);
2356 /* Setup the scalarizing loops. */
2357 gfc_conv_loop_setup (&loop, &expr->where);
2359 /* Pass the temporary descriptor back to the caller. */
2360 info = &loop.temp_ss->data.info;
2361 parmse->expr = info->descriptor;
2363 /* Setup the gfc_se structures. */
2364 gfc_copy_loopinfo_to_se (&lse, &loop);
2365 gfc_copy_loopinfo_to_se (&rse, &loop);
2368 lse.ss = loop.temp_ss;
2369 gfc_mark_ss_chain_used (rss, 1);
2370 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2372 /* Start the scalarized loop body. */
2373 gfc_start_scalarized_body (&loop, &body);
2375 /* Translate the expression. */
2376 gfc_conv_expr (&rse, expr);
2378 gfc_conv_tmp_array_ref (&lse);
2379 gfc_advance_se_ss_chain (&lse);
2381 if (intent != INTENT_OUT)
2383 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, false);
2384 gfc_add_expr_to_block (&body, tmp);
2385 gcc_assert (rse.ss == gfc_ss_terminator);
2386 gfc_trans_scalarizing_loops (&loop, &body);
2390 /* Make sure that the temporary declaration survives by merging
2391 all the loop declarations into the current context. */
2392 for (n = 0; n < loop.dimen; n++)
2394 gfc_merge_block_scope (&body);
2395 body = loop.code[loop.order[n]];
2397 gfc_merge_block_scope (&body);
2400 /* Add the post block after the second loop, so that any
2401 freeing of allocated memory is done at the right time. */
2402 gfc_add_block_to_block (&parmse->pre, &loop.pre);
2404 /**********Copy the temporary back again.*********/
2406 gfc_init_se (&lse, NULL);
2407 gfc_init_se (&rse, NULL);
2409 /* Walk the argument expression. */
2410 lss = gfc_walk_expr (expr);
2411 rse.ss = loop.temp_ss;
2414 /* Initialize the scalarizer. */
2415 gfc_init_loopinfo (&loop2);
2416 gfc_add_ss_to_loop (&loop2, lss);
2418 /* Calculate the bounds of the scalarization. */
2419 gfc_conv_ss_startstride (&loop2);
2421 /* Setup the scalarizing loops. */
2422 gfc_conv_loop_setup (&loop2, &expr->where);
2424 gfc_copy_loopinfo_to_se (&lse, &loop2);
2425 gfc_copy_loopinfo_to_se (&rse, &loop2);
2427 gfc_mark_ss_chain_used (lss, 1);
2428 gfc_mark_ss_chain_used (loop.temp_ss, 1);
2430 /* Declare the variable to hold the temporary offset and start the
2431 scalarized loop body. */
2432 offset = gfc_create_var (gfc_array_index_type, NULL);
2433 gfc_start_scalarized_body (&loop2, &body);
2435 /* Build the offsets for the temporary from the loop variables. The
2436 temporary array has lbounds of zero and strides of one in all
2437 dimensions, so this is very simple. The offset is only computed
2438 outside the innermost loop, so the overall transfer could be
2439 optimized further. */
2440 info = &rse.ss->data.info;
2442 tmp_index = gfc_index_zero_node;
2443 for (n = info->dimen - 1; n > 0; n--)
2446 tmp = rse.loop->loopvar[n];
2447 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2448 tmp, rse.loop->from[n]);
2449 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2452 tmp_str = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2453 rse.loop->to[n-1], rse.loop->from[n-1]);
2454 tmp_str = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2455 tmp_str, gfc_index_one_node);
2457 tmp_index = fold_build2 (MULT_EXPR, gfc_array_index_type,
2461 tmp_index = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2462 tmp_index, rse.loop->from[0]);
2463 gfc_add_modify (&rse.loop->code[0], offset, tmp_index);
2465 tmp_index = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2466 rse.loop->loopvar[0], offset);
2468 /* Now use the offset for the reference. */
2469 tmp = build_fold_indirect_ref_loc (input_location,
2471 rse.expr = gfc_build_array_ref (tmp, tmp_index, NULL);
2473 if (expr->ts.type == BT_CHARACTER)
2474 rse.string_length = expr->ts.u.cl->backend_decl;
2476 gfc_conv_expr (&lse, expr);
2478 gcc_assert (lse.ss == gfc_ss_terminator);
2480 tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, false);
2481 gfc_add_expr_to_block (&body, tmp);
2483 /* Generate the copying loops. */
2484 gfc_trans_scalarizing_loops (&loop2, &body);
2486 /* Wrap the whole thing up by adding the second loop to the post-block
2487 and following it by the post-block of the first loop. In this way,
2488 if the temporary needs freeing, it is done after use! */
2489 if (intent != INTENT_IN)
2491 gfc_add_block_to_block (&parmse->post, &loop2.pre);
2492 gfc_add_block_to_block (&parmse->post, &loop2.post);
2495 gfc_add_block_to_block (&parmse->post, &loop.post);
2497 gfc_cleanup_loop (&loop);
2498 gfc_cleanup_loop (&loop2);
2500 /* Pass the string length to the argument expression. */
2501 if (expr->ts.type == BT_CHARACTER)
2502 parmse->string_length = expr->ts.u.cl->backend_decl;
2504 /* We want either the address for the data or the address of the descriptor,
2505 depending on the mode of passing array arguments. */
2507 parmse->expr = gfc_conv_descriptor_data_get (parmse->expr);
2509 parmse->expr = gfc_build_addr_expr (NULL_TREE, parmse->expr);
2515 /* Generate the code for argument list functions. */
2518 conv_arglist_function (gfc_se *se, gfc_expr *expr, const char *name)
2520 /* Pass by value for g77 %VAL(arg), pass the address
2521 indirectly for %LOC, else by reference. Thus %REF
2522 is a "do-nothing" and %LOC is the same as an F95
2524 if (strncmp (name, "%VAL", 4) == 0)
2525 gfc_conv_expr (se, expr);
2526 else if (strncmp (name, "%LOC", 4) == 0)
2528 gfc_conv_expr_reference (se, expr);
2529 se->expr = gfc_build_addr_expr (NULL, se->expr);
2531 else if (strncmp (name, "%REF", 4) == 0)
2532 gfc_conv_expr_reference (se, expr);
2534 gfc_error ("Unknown argument list function at %L", &expr->where);
2538 /* Takes a derived type expression and returns the address of a temporary
2539 class object of the 'declared' type. */
2541 gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e,
2542 gfc_typespec class_ts)
2546 gfc_symbol *declared = class_ts.u.derived;
2552 /* The derived type needs to be converted to a temporary
2554 tmp = gfc_typenode_for_spec (&class_ts);
2555 var = gfc_create_var (tmp, "class");
2558 cmp = gfc_find_component (declared, "$vptr", true, true);
2559 ctree = fold_build3 (COMPONENT_REF, TREE_TYPE (cmp->backend_decl),
2560 var, cmp->backend_decl, NULL_TREE);
2562 /* Remember the vtab corresponds to the derived type
2563 not to the class declared type. */
2564 vtab = gfc_find_derived_vtab (e->ts.u.derived);
2566 tmp = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtab));
2567 gfc_add_modify (&parmse->pre, ctree,
2568 fold_convert (TREE_TYPE (ctree), tmp));
2570 /* Now set the data field. */
2571 cmp = gfc_find_component (declared, "$data", true, true);
2572 ctree = fold_build3 (COMPONENT_REF, TREE_TYPE (cmp->backend_decl),
2573 var, cmp->backend_decl, NULL_TREE);
2574 ss = gfc_walk_expr (e);
2575 if (ss == gfc_ss_terminator)
2577 gfc_conv_expr_reference (parmse, e);
2578 tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
2579 gfc_add_modify (&parmse->pre, ctree, tmp);
2583 gfc_conv_expr (parmse, e);
2584 gfc_add_modify (&parmse->pre, ctree, parmse->expr);
2587 /* Pass the address of the class object. */
2588 parmse->expr = gfc_build_addr_expr (NULL_TREE, var);
2592 /* The following routine generates code for the intrinsic
2593 procedures from the ISO_C_BINDING module:
2595 * C_FUNLOC (function)
2596 * C_F_POINTER (subroutine)
2597 * C_F_PROCPOINTER (subroutine)
2598 * C_ASSOCIATED (function)
2599 One exception which is not handled here is C_F_POINTER with non-scalar
2600 arguments. Returns 1 if the call was replaced by inline code (else: 0). */
2603 conv_isocbinding_procedure (gfc_se * se, gfc_symbol * sym,
2604 gfc_actual_arglist * arg)
2609 if (sym->intmod_sym_id == ISOCBINDING_LOC)
2611 if (arg->expr->rank == 0)
2612 gfc_conv_expr_reference (se, arg->expr);
2616 /* This is really the actual arg because no formal arglist is
2617 created for C_LOC. */
2618 fsym = arg->expr->symtree->n.sym;
2620 /* We should want it to do g77 calling convention. */
2622 && !(fsym->attr.pointer || fsym->attr.allocatable)
2623 && fsym->as->type != AS_ASSUMED_SHAPE;
2624 f = f || !sym->attr.always_explicit;
2626 argss = gfc_walk_expr (arg->expr);
2627 gfc_conv_array_parameter (se, arg->expr, argss, f,
2631 /* TODO -- the following two lines shouldn't be necessary, but if
2632 they're removed, a bug is exposed later in the code path.
2633 This workaround was thus introduced, but will have to be
2634 removed; please see PR 35150 for details about the issue. */
2635 se->expr = convert (pvoid_type_node, se->expr);
2636 se->expr = gfc_evaluate_now (se->expr, &se->pre);
2640 else if (sym->intmod_sym_id == ISOCBINDING_FUNLOC)
2642 arg->expr->ts.type = sym->ts.u.derived->ts.type;
2643 arg->expr->ts.f90_type = sym->ts.u.derived->ts.f90_type;
2644 arg->expr->ts.kind = sym->ts.u.derived->ts.kind;
2645 gfc_conv_expr_reference (se, arg->expr);
2649 else if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER
2650 && arg->next->expr->rank == 0)
2651 || sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER)
2653 /* Convert c_f_pointer if fptr is a scalar
2654 and convert c_f_procpointer. */
2658 gfc_init_se (&cptrse, NULL);
2659 gfc_conv_expr (&cptrse, arg->expr);
2660 gfc_add_block_to_block (&se->pre, &cptrse.pre);
2661 gfc_add_block_to_block (&se->post, &cptrse.post);
2663 gfc_init_se (&fptrse, NULL);
2664 if (sym->intmod_sym_id == ISOCBINDING_F_POINTER
2665 || gfc_is_proc_ptr_comp (arg->next->expr, NULL))
2666 fptrse.want_pointer = 1;
2668 gfc_conv_expr (&fptrse, arg->next->expr);
2669 gfc_add_block_to_block (&se->pre, &fptrse.pre);
2670 gfc_add_block_to_block (&se->post, &fptrse.post);
2672 if (arg->next->expr->symtree->n.sym->attr.proc_pointer
2673 && arg->next->expr->symtree->n.sym->attr.dummy)
2674 fptrse.expr = build_fold_indirect_ref_loc (input_location,
2677 se->expr = fold_build2 (MODIFY_EXPR, TREE_TYPE (fptrse.expr),
2679 fold_convert (TREE_TYPE (fptrse.expr),
2684 else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)
2689 /* Build the addr_expr for the first argument. The argument is
2690 already an *address* so we don't need to set want_pointer in
2692 gfc_init_se (&arg1se, NULL);
2693 gfc_conv_expr (&arg1se, arg->expr);
2694 gfc_add_block_to_block (&se->pre, &arg1se.pre);
2695 gfc_add_block_to_block (&se->post, &arg1se.post);
2697 /* See if we were given two arguments. */
2698 if (arg->next == NULL)
2699 /* Only given one arg so generate a null and do a
2700 not-equal comparison against the first arg. */
2701 se->expr = fold_build2 (NE_EXPR, boolean_type_node, arg1se.expr,
2702 fold_convert (TREE_TYPE (arg1se.expr),
2703 null_pointer_node));
2709 /* Given two arguments so build the arg2se from second arg. */
2710 gfc_init_se (&arg2se, NULL);
2711 gfc_conv_expr (&arg2se, arg->next->expr);
2712 gfc_add_block_to_block (&se->pre, &arg2se.pre);
2713 gfc_add_block_to_block (&se->post, &arg2se.post);
2715 /* Generate test to compare that the two args are equal. */
2716 eq_expr = fold_build2 (EQ_EXPR, boolean_type_node,
2717 arg1se.expr, arg2se.expr);
2718 /* Generate test to ensure that the first arg is not null. */
2719 not_null_expr = fold_build2 (NE_EXPR, boolean_type_node,
2720 arg1se.expr, null_pointer_node);
2722 /* Finally, the generated test must check that both arg1 is not
2723 NULL and that it is equal to the second arg. */
2724 se->expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
2725 not_null_expr, eq_expr);
2731 /* Nothing was done. */
2736 /* Generate code for a procedure call. Note can return se->post != NULL.
2737 If se->direct_byref is set then se->expr contains the return parameter.
2738 Return nonzero, if the call has alternate specifiers.
2739 'expr' is only needed for procedure pointer components. */
2742 gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
2743 gfc_actual_arglist * arg, gfc_expr * expr,
2746 gfc_interface_mapping mapping;
2760 gfc_formal_arglist *formal;
2761 int has_alternate_specifier = 0;
2762 bool need_interface_mapping;
2769 enum {MISSING = 0, ELEMENTAL, SCALAR, SCALAR_POINTER, ARRAY};
2770 gfc_component *comp = NULL;
2772 arglist = NULL_TREE;
2773 retargs = NULL_TREE;
2774 stringargs = NULL_TREE;
2779 if (sym->from_intmod == INTMOD_ISO_C_BINDING
2780 && conv_isocbinding_procedure (se, sym, arg))
2783 gfc_is_proc_ptr_comp (expr, &comp);
2787 if (!sym->attr.elemental)
2789 gcc_assert (se->ss->type == GFC_SS_FUNCTION);
2790 if (se->ss->useflags)
2792 gcc_assert ((!comp && gfc_return_by_reference (sym)
2793 && sym->result->attr.dimension)
2794 || (comp && comp->attr.dimension));
2795 gcc_assert (se->loop != NULL);
2797 /* Access the previously obtained result. */
2798 gfc_conv_tmp_array_ref (se);
2799 gfc_advance_se_ss_chain (se);
2803 info = &se->ss->data.info;
2808 gfc_init_block (&post);
2809 gfc_init_interface_mapping (&mapping);
2812 formal = sym->formal;
2813 need_interface_mapping = sym->attr.dimension ||
2814 (sym->ts.type == BT_CHARACTER
2815 && sym->ts.u.cl->length
2816 && sym->ts.u.cl->length->expr_type
2821 formal = comp->formal;
2822 need_interface_mapping = comp->attr.dimension ||
2823 (comp->ts.type == BT_CHARACTER
2824 && comp->ts.u.cl->length
2825 && comp->ts.u.cl->length->expr_type
2829 /* Evaluate the arguments. */
2830 for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
2833 fsym = formal ? formal->sym : NULL;
2834 parm_kind = MISSING;
2838 if (se->ignore_optional)
2840 /* Some intrinsics have already been resolved to the correct
2844 else if (arg->label)
2846 has_alternate_specifier = 1;
2851 /* Pass a NULL pointer for an absent arg. */
2852 gfc_init_se (&parmse, NULL);
2853 parmse.expr = null_pointer_node;
2854 if (arg->missing_arg_type == BT_CHARACTER)
2855 parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
2858 else if (fsym && fsym->ts.type == BT_CLASS
2859 && e->ts.type == BT_DERIVED)
2861 /* The derived type needs to be converted to a temporary
2863 gfc_init_se (&parmse, se);
2864 gfc_conv_derived_to_class (&parmse, e, fsym->ts);
2866 else if (se->ss && se->ss->useflags)
2868 /* An elemental function inside a scalarized loop. */
2869 gfc_init_se (&parmse, se);
2870 gfc_conv_expr_reference (&parmse, e);
2871 parm_kind = ELEMENTAL;
2875 /* A scalar or transformational function. */
2876 gfc_init_se (&parmse, NULL);
2877 argss = gfc_walk_expr (e);
2879 if (argss == gfc_ss_terminator)
2881 if (e->expr_type == EXPR_VARIABLE
2882 && e->symtree->n.sym->attr.cray_pointee
2883 && fsym && fsym->attr.flavor == FL_PROCEDURE)
2885 /* The Cray pointer needs to be converted to a pointer to
2886 a type given by the expression. */
2887 gfc_conv_expr (&parmse, e);
2888 type = build_pointer_type (TREE_TYPE (parmse.expr));
2889 tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer);
2890 parmse.expr = convert (type, tmp);
2892 else if (fsym && fsym->attr.value)
2894 if (fsym->ts.type == BT_CHARACTER
2895 && fsym->ts.is_c_interop
2896 && fsym->ns->proc_name != NULL
2897 && fsym->ns->proc_name->attr.is_bind_c)
2900 gfc_conv_scalar_char_value (fsym, &parmse, &e);
2901 if (parmse.expr == NULL)
2902 gfc_conv_expr (&parmse, e);
2905 gfc_conv_expr (&parmse, e);
2907 else if (arg->name && arg->name[0] == '%')
2908 /* Argument list functions %VAL, %LOC and %REF are signalled
2909 through arg->name. */
2910 conv_arglist_function (&parmse, arg->expr, arg->name);
2911 else if ((e->expr_type == EXPR_FUNCTION)
2912 && ((e->value.function.esym
2913 && e->value.function.esym->result->attr.pointer)
2914 || (!e->value.function.esym
2915 && e->symtree->n.sym->attr.pointer))
2916 && fsym && fsym->attr.target)
2918 gfc_conv_expr (&parmse, e);
2919 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
2921 else if (e->expr_type == EXPR_FUNCTION
2922 && e->symtree->n.sym->result
2923 && e->symtree->n.sym->result != e->symtree->n.sym
2924 && e->symtree->n.sym->result->attr.proc_pointer)
2926 /* Functions returning procedure pointers. */
2927 gfc_conv_expr (&parmse, e);
2928 if (fsym && fsym->attr.proc_pointer)
2929 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
2933 gfc_conv_expr_reference (&parmse, e);
2935 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
2936 allocated on entry, it must be deallocated. */
2937 if (fsym && fsym->attr.allocatable
2938 && fsym->attr.intent == INTENT_OUT)
2942 gfc_init_block (&block);
2943 tmp = gfc_deallocate_with_status (parmse.expr, NULL_TREE,
2945 gfc_add_expr_to_block (&block, tmp);
2946 tmp = fold_build2 (MODIFY_EXPR, void_type_node,
2947 parmse.expr, null_pointer_node);
2948 gfc_add_expr_to_block (&block, tmp);
2950 if (fsym->attr.optional
2951 && e->expr_type == EXPR_VARIABLE
2952 && e->symtree->n.sym->attr.optional)
2954 tmp = fold_build3 (COND_EXPR, void_type_node,
2955 gfc_conv_expr_present (e->symtree->n.sym),
2956 gfc_finish_block (&block),
2957 build_empty_stmt (input_location));
2960 tmp = gfc_finish_block (&block);
2962 gfc_add_expr_to_block (&se->pre, tmp);
2965 if (fsym && e->expr_type != EXPR_NULL
2966 && ((fsym->attr.pointer
2967 && fsym->attr.flavor != FL_PROCEDURE)
2968 || (fsym->attr.proc_pointer
2969 && !(e->expr_type == EXPR_VARIABLE
2970 && e->symtree->n.sym->attr.dummy))
2971 || (e->expr_type == EXPR_VARIABLE
2972 && gfc_is_proc_ptr_comp (e, NULL))
2973 || fsym->attr.allocatable))
2975 /* Scalar pointer dummy args require an extra level of
2976 indirection. The null pointer already contains
2977 this level of indirection. */
2978 parm_kind = SCALAR_POINTER;
2979 parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr);
2985 /* If the procedure requires an explicit interface, the actual
2986 argument is passed according to the corresponding formal
2987 argument. If the corresponding formal argument is a POINTER,
2988 ALLOCATABLE or assumed shape, we do not use g77's calling
2989 convention, and pass the address of the array descriptor
2990 instead. Otherwise we use g77's calling convention. */
2993 && !(fsym->attr.pointer || fsym->attr.allocatable)
2994 && fsym->as->type != AS_ASSUMED_SHAPE;
2996 f = f || !comp->attr.always_explicit;
2998 f = f || !sym->attr.always_explicit;
3000 if (e->expr_type == EXPR_VARIABLE
3001 && is_subref_array (e))
3002 /* The actual argument is a component reference to an
3003 array of derived types. In this case, the argument
3004 is converted to a temporary, which is passed and then
3005 written back after the procedure call. */
3006 gfc_conv_subref_array_arg (&parmse, e, f,
3007 fsym ? fsym->attr.intent : INTENT_INOUT);
3009 gfc_conv_array_parameter (&parmse, e, argss, f, fsym,
3012 /* If an ALLOCATABLE dummy argument has INTENT(OUT) and is
3013 allocated on entry, it must be deallocated. */
3014 if (fsym && fsym->attr.allocatable
3015 && fsym->attr.intent == INTENT_OUT)
3017 tmp = build_fold_indirect_ref_loc (input_location,
3019 tmp = gfc_trans_dealloc_allocated (tmp);
3020 if (fsym->attr.optional
3021 && e->expr_type == EXPR_VARIABLE
3022 && e->symtree->n.sym->attr.optional)
3023 tmp = fold_build3 (COND_EXPR, void_type_node,
3024 gfc_conv_expr_present (e->symtree->n.sym),
3025 tmp, build_empty_stmt (input_location));
3026 gfc_add_expr_to_block (&se->pre, tmp);
3031 /* The case with fsym->attr.optional is that of a user subroutine
3032 with an interface indicating an optional argument. When we call
3033 an intrinsic subroutine, however, fsym is NULL, but we might still
3034 have an optional argument, so we proceed to the substitution
3036 if (e && (fsym == NULL || fsym->attr.optional))
3038 /* If an optional argument is itself an optional dummy argument,
3039 check its presence and substitute a null if absent. This is
3040 only needed when passing an array to an elemental procedure
3041 as then array elements are accessed - or no NULL pointer is
3042 allowed and a "1" or "0" should be passed if not present.
3043 When passing a non-array-descriptor full array to a
3044 non-array-descriptor dummy, no check is needed. For
3045 array-descriptor actual to array-descriptor dummy, see
3046 PR 41911 for why a check has to be inserted.
3047 fsym == NULL is checked as intrinsics required the descriptor
3048 but do not always set fsym. */
3049 if (e->expr_type == EXPR_VARIABLE
3050 && e->symtree->n.sym->attr.optional
3051 && ((e->rank > 0 && sym->attr.elemental)
3052 || e->representation.length || e->ts.type == BT_CHARACTER
3054 && (fsym == NULL || fsym->as->type == AS_ASSUMED_SHAPE
3055 || fsym->as->type == AS_DEFERRED))))
3056 gfc_conv_missing_dummy (&parmse, e, fsym ? fsym->ts : e->ts,
3057 e->representation.length);
3062 /* Obtain the character length of an assumed character length
3063 length procedure from the typespec. */
3064 if (fsym->ts.type == BT_CHARACTER
3065 && parmse.string_length == NULL_TREE
3066 && e->ts.type == BT_PROCEDURE
3067 && e->symtree->n.sym->ts.type == BT_CHARACTER
3068 && e->symtree->n.sym->ts.u.cl->length != NULL
3069 && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
3071 gfc_conv_const_charlen (e->symtree->n.sym->ts.u.cl);
3072 parmse.string_length = e->symtree->n.sym->ts.u.cl->backend_decl;
3076 if (fsym && need_interface_mapping && e)
3077 gfc_add_interface_mapping (&mapping, fsym, &parmse, e);
3079 gfc_add_block_to_block (&se->pre, &parmse.pre);
3080 gfc_add_block_to_block (&post, &parmse.post);
3082 /* Allocated allocatable components of derived types must be
3083 deallocated for non-variable scalars. Non-variable arrays are
3084 dealt with in trans-array.c(gfc_conv_array_parameter). */
3085 if (e && e->ts.type == BT_DERIVED
3086 && e->ts.u.derived->attr.alloc_comp
3087 && !(e->symtree && e->symtree->n.sym->attr.pointer)
3088 && (e->expr_type != EXPR_VARIABLE && !e->rank))
3091 tmp = build_fold_indirect_ref_loc (input_location,
3093 parm_rank = e->rank;
3101 case (SCALAR_POINTER):
3102 tmp = build_fold_indirect_ref_loc (input_location,
3107 if (e->expr_type == EXPR_OP
3108 && e->value.op.op == INTRINSIC_PARENTHESES
3109 && e->value.op.op1->expr_type == EXPR_VARIABLE)
3112 local_tmp = gfc_evaluate_now (tmp, &se->pre);
3113 local_tmp = gfc_copy_alloc_comp (e->ts.u.derived, local_tmp, tmp, parm_rank);
3114 gfc_add_expr_to_block (&se->post, local_tmp);
3117 tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp, parm_rank);
3119 gfc_add_expr_to_block (&se->post, tmp);
3122 /* Add argument checking of passing an unallocated/NULL actual to
3123 a nonallocatable/nonpointer dummy. */
3125 if (gfc_option.rtcheck & GFC_RTCHECK_POINTER && e != NULL)
3127 symbol_attribute *attr;
3131 if (e->expr_type == EXPR_VARIABLE)
3132 attr = &e->symtree->n.sym->attr;
3133 else if (e->expr_type == EXPR_FUNCTION)
3135 /* For intrinsic functions, the gfc_attr are not available. */
3136 if (e->symtree->n.sym->attr.generic && e->value.function.isym)
3137 goto end_pointer_check;
3139 if (e->symtree->n.sym->attr.generic)
3140 attr = &e->value.function.esym->attr;
3142 attr = &e->symtree->n.sym->result->attr;
3145 goto end_pointer_check;
3149 /* If the actual argument is an optional pointer/allocatable and
3150 the formal argument takes an nonpointer optional value,
3151 it is invalid to pass a non-present argument on, even
3152 though there is no technical reason for this in gfortran.
3153 See Fortran 2003, Section 12.4.1.6 item (7)+(8). */
3154 tree present, nullptr, type;
3156 if (attr->allocatable
3157 && (fsym == NULL || !fsym->attr.allocatable))
3158 asprintf (&msg, "Allocatable actual argument '%s' is not "
3159 "allocated or not present", e->symtree->n.sym->name);
3160 else if (attr->pointer
3161 && (fsym == NULL || !fsym->attr.pointer))
3162 asprintf (&msg, "Pointer actual argument '%s' is not "
3163 "associated or not present",
3164 e->symtree->n.sym->name);
3165 else if (attr->proc_pointer
3166 && (fsym == NULL || !fsym->attr.proc_pointer))
3167 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3168 "associated or not present",
3169 e->symtree->n.sym->name);
3171 goto end_pointer_check;
3173 present = gfc_conv_expr_present (e->symtree->n.sym);
3174 type = TREE_TYPE (present);
3175 present = fold_build2 (EQ_EXPR, boolean_type_node, present,
3176 fold_convert (type, null_pointer_node));
3177 type = TREE_TYPE (parmse.expr);
3178 nullptr = fold_build2 (EQ_EXPR, boolean_type_node, parmse.expr,
3179 fold_convert (type, null_pointer_node));
3180 cond = fold_build2 (TRUTH_ORIF_EXPR, boolean_type_node,
3185 if (attr->allocatable
3186 && (fsym == NULL || !fsym->attr.allocatable))
3187 asprintf (&msg, "Allocatable actual argument '%s' is not "
3188 "allocated", e->symtree->n.sym->name);
3189 else if (attr->pointer
3190 && (fsym == NULL || !fsym->attr.pointer))
3191 asprintf (&msg, "Pointer actual argument '%s' is not "
3192 "associated", e->symtree->n.sym->name);
3193 else if (attr->proc_pointer
3194 && (fsym == NULL || !fsym->attr.proc_pointer))
3195 asprintf (&msg, "Proc-pointer actual argument '%s' is not "
3196 "associated", e->symtree->n.sym->name);
3198 goto end_pointer_check;
3201 cond = fold_build2 (EQ_EXPR, boolean_type_node, parmse.expr,
3202 fold_convert (TREE_TYPE (parmse.expr),
3203 null_pointer_node));
3206 gfc_trans_runtime_check (true, false, cond, &se->pre, &e->where,
3213 /* Character strings are passed as two parameters, a length and a
3214 pointer - except for Bind(c) which only passes the pointer. */
3215 if (parmse.string_length != NULL_TREE && !sym->attr.is_bind_c)
3216 stringargs = gfc_chainon_list (stringargs, parmse.string_length);
3218 arglist = gfc_chainon_list (arglist, parmse.expr);
3220 gfc_finish_interface_mapping (&mapping, &se->pre, &se->post);
3227 if (ts.type == BT_CHARACTER && sym->attr.is_bind_c)
3228 se->string_length = build_int_cst (gfc_charlen_type_node, 1);
3229 else if (ts.type == BT_CHARACTER)
3231 if (ts.u.cl->length == NULL)
3233 /* Assumed character length results are not allowed by 5.1.1.5 of the
3234 standard and are trapped in resolve.c; except in the case of SPREAD
3235 (and other intrinsics?) and dummy functions. In the case of SPREAD,
3236 we take the character length of the first argument for the result.
3237 For dummies, we have to look through the formal argument list for
3238 this function and use the character length found there.*/
3239 if (!sym->attr.dummy)
3240 cl.backend_decl = TREE_VALUE (stringargs);
3243 formal = sym->ns->proc_name->formal;
3244 for (; formal; formal = formal->next)
3245 if (strcmp (formal->sym->name, sym->name) == 0)
3246 cl.backend_decl = formal->sym->ts.u.cl->backend_decl;
3253 /* Calculate the length of the returned string. */
3254 gfc_init_se (&parmse, NULL);
3255 if (need_interface_mapping)
3256 gfc_apply_interface_mapping (&mapping, &parmse, ts.u.cl->length);
3258 gfc_conv_expr (&parmse, ts.u.cl->length);
3259 gfc_add_block_to_block (&se->pre, &parmse.pre);
3260 gfc_add_block_to_block (&se->post, &parmse.post);
3262 tmp = fold_convert (gfc_charlen_type_node, parmse.expr);
3263 tmp = fold_build2 (MAX_EXPR, gfc_charlen_type_node, tmp,
3264 build_int_cst (gfc_charlen_type_node, 0));
3265 cl.backend_decl = tmp;
3268 /* Set up a charlen structure for it. */
3273 len = cl.backend_decl;
3276 byref = (comp && (comp->attr.dimension || comp->ts.type == BT_CHARACTER))
3277 || (!comp && gfc_return_by_reference (sym));
3280 if (se->direct_byref)
3282 /* Sometimes, too much indirection can be applied; e.g. for
3283 function_result = array_valued_recursive_function. */
3284 if (TREE_TYPE (TREE_TYPE (se->expr))
3285 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))
3286 && GFC_DESCRIPTOR_TYPE_P
3287 (TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr)))))
3288 se->expr = build_fold_indirect_ref_loc (input_location,
3291 retargs = gfc_chainon_list (retargs, se->expr);
3293 else if (comp && comp->attr.dimension)
3295 gcc_assert (se->loop && info);
3297 /* Set the type of the array. */
3298 tmp = gfc_typenode_for_spec (&comp->ts);
3299 info->dimen = se->loop->dimen;
3301 /* Evaluate the bounds of the result, if known. */
3302 gfc_set_loop_bounds_from_array_spec (&mapping, se, comp->as);
3304 /* Create a temporary to store the result. In case the function
3305 returns a pointer, the temporary will be a shallow copy and
3306 mustn't be deallocated. */
3307 callee_alloc = comp->attr.allocatable || comp->attr.pointer;
3308 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3309 NULL_TREE, false, !comp->attr.pointer,
3310 callee_alloc, &se->ss->expr->where);
3312 /* Pass the temporary as the first argument. */
3313 tmp = info->descriptor;
3314 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
3315 retargs = gfc_chainon_list (retargs, tmp);
3317 else if (!comp && sym->result->attr.dimension)
3319 gcc_assert (se->loop && info);
3321 /* Set the type of the array. */
3322 tmp = gfc_typenode_for_spec (&ts);
3323 info->dimen = se->loop->dimen;
3325 /* Evaluate the bounds of the result, if known. */
3326 gfc_set_loop_bounds_from_array_spec (&mapping, se, sym->result->as);
3328 /* Create a temporary to store the result. In case the function
3329 returns a pointer, the temporary will be a shallow copy and
3330 mustn't be deallocated. */
3331 callee_alloc = sym->attr.allocatable || sym->attr.pointer;
3332 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop, info, tmp,
3333 NULL_TREE, false, !sym->attr.pointer,
3334 callee_alloc, &se->ss->expr->where);
3336 /* Pass the temporary as the first argument. */
3337 tmp = info->descriptor;
3338 tmp = gfc_build_addr_expr (NULL_TREE, tmp);
3339 retargs = gfc_chainon_list (retargs, tmp);
3341 else if (ts.type == BT_CHARACTER)
3343 /* Pass the string length. */
3344 type = gfc_get_character_type (ts.kind, ts.u.cl);
3345 type = build_pointer_type (type);
3347 /* Return an address to a char[0:len-1]* temporary for
3348 character pointers. */
3349 if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3350 || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3352 var = gfc_create_var (type, "pstr");
3354 if ((!comp && sym->attr.allocatable)
3355 || (comp && comp->attr.allocatable))
3356 gfc_add_modify (&se->pre, var,
3357 fold_convert (TREE_TYPE (var),
3358 null_pointer_node));
3360 /* Provide an address expression for the function arguments. */
3361 var = gfc_build_addr_expr (NULL_TREE, var);
3364 var = gfc_conv_string_tmp (se, type, len);
3366 retargs = gfc_chainon_list (retargs, var);
3370 gcc_assert (gfc_option.flag_f2c && ts.type == BT_COMPLEX);
3372 type = gfc_get_complex_type (ts.kind);
3373 var = gfc_build_addr_expr (NULL_TREE, gfc_create_var (type, "cmplx"));
3374 retargs = gfc_chainon_list (retargs, var);
3377 /* Add the string length to the argument list. */
3378 if (ts.type == BT_CHARACTER)
3379 retargs = gfc_chainon_list (retargs, len);
3381 gfc_free_interface_mapping (&mapping);
3383 /* Add the return arguments. */
3384 arglist = chainon (retargs, arglist);
3386 /* Add the hidden string length parameters to the arguments. */
3387 arglist = chainon (arglist, stringargs);
3389 /* We may want to append extra arguments here. This is used e.g. for
3390 calls to libgfortran_matmul_??, which need extra information. */
3391 if (append_args != NULL_TREE)
3392 arglist = chainon (arglist, append_args);
3394 /* Generate the actual call. */
3395 conv_function_val (se, sym, expr);
3397 /* If there are alternate return labels, function type should be
3398 integer. Can't modify the type in place though, since it can be shared
3399 with other functions. For dummy arguments, the typing is done to
3400 to this result, even if it has to be repeated for each call. */
3401 if (has_alternate_specifier
3402 && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
3404 if (!sym->attr.dummy)
3406 TREE_TYPE (sym->backend_decl)
3407 = build_function_type (integer_type_node,
3408 TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
3409 se->expr = gfc_build_addr_expr (NULL_TREE, sym->backend_decl);
3412 TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
3415 fntype = TREE_TYPE (TREE_TYPE (se->expr));
3416 se->expr = build_call_list (TREE_TYPE (fntype), se->expr, arglist);
3418 /* If we have a pointer function, but we don't want a pointer, e.g.
3421 where f is pointer valued, we have to dereference the result. */
3422 if (!se->want_pointer && !byref
3423 && (sym->attr.pointer || sym->attr.allocatable)
3424 && !gfc_is_proc_ptr_comp (expr, NULL))
3425 se->expr = build_fold_indirect_ref_loc (input_location,
3428 /* f2c calling conventions require a scalar default real function to
3429 return a double precision result. Convert this back to default
3430 real. We only care about the cases that can happen in Fortran 77.
3432 if (gfc_option.flag_f2c && sym->ts.type == BT_REAL
3433 && sym->ts.kind == gfc_default_real_kind
3434 && !sym->attr.always_explicit)
3435 se->expr = fold_convert (gfc_get_real_type (sym->ts.kind), se->expr);
3437 /* A pure function may still have side-effects - it may modify its
3439 TREE_SIDE_EFFECTS (se->expr) = 1;
3441 if (!sym->attr.pure)
3442 TREE_SIDE_EFFECTS (se->expr) = 1;
3447 /* Add the function call to the pre chain. There is no expression. */
3448 gfc_add_expr_to_block (&se->pre, se->expr);
3449 se->expr = NULL_TREE;
3451 if (!se->direct_byref)
3453 if (sym->attr.dimension || (comp && comp->attr.dimension))
3455 if (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)
3457 /* Check the data pointer hasn't been modified. This would
3458 happen in a function returning a pointer. */
3459 tmp = gfc_conv_descriptor_data_get (info->descriptor);
3460 tmp = fold_build2 (NE_EXPR, boolean_type_node,
3462 gfc_trans_runtime_check (true, false, tmp, &se->pre, NULL,
3465 se->expr = info->descriptor;
3466 /* Bundle in the string length. */
3467 se->string_length = len;
3469 else if (ts.type == BT_CHARACTER)
3471 /* Dereference for character pointer results. */
3472 if ((!comp && (sym->attr.pointer || sym->attr.allocatable))
3473 || (comp && (comp->attr.pointer || comp->attr.allocatable)))
3474 se->expr = build_fold_indirect_ref_loc (input_location, var);
3478 se->string_length = len;
3482 gcc_assert (ts.type == BT_COMPLEX && gfc_option.flag_f2c);
3483 se->expr = build_fold_indirect_ref_loc (input_location, var);
3488 /* Follow the function call with the argument post block. */
3490 gfc_add_block_to_block (&se->pre, &post);
3492 gfc_add_block_to_block (&se->post, &post);
3494 return has_alternate_specifier;
3498 /* Fill a character string with spaces. */
3501 fill_with_spaces (tree start, tree type, tree size)
3503 stmtblock_t block, loop;
3504 tree i, el, exit_label, cond, tmp;
3506 /* For a simple char type, we can call memset(). */
3507 if (compare_tree_int (TYPE_SIZE_UNIT (type), 1) == 0)
3508 return build_call_expr_loc (input_location,
3509 built_in_decls[BUILT_IN_MEMSET], 3, start,
3510 build_int_cst (gfc_get_int_type (gfc_c_int_kind),
3511 lang_hooks.to_target_charset (' ')),
3514 /* Otherwise, we use a loop:
3515 for (el = start, i = size; i > 0; el--, i+= TYPE_SIZE_UNIT (type))
3519 /* Initialize variables. */
3520 gfc_init_block (&block);
3521 i = gfc_create_var (sizetype, "i");
3522 gfc_add_modify (&block, i, fold_convert (sizetype, size));
3523 el = gfc_create_var (build_pointer_type (type), "el");
3524 gfc_add_modify (&block, el, fold_convert (TREE_TYPE (el), start));
3525 exit_label = gfc_build_label_decl (NULL_TREE);
3526 TREE_USED (exit_label) = 1;
3530 gfc_init_block (&loop);
3532 /* Exit condition. */
3533 cond = fold_build2 (LE_EXPR, boolean_type_node, i,
3534 fold_convert (sizetype, integer_zero_node));
3535 tmp = build1_v (GOTO_EXPR, exit_label);
3536 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
3537 build_empty_stmt (input_location));
3538 gfc_add_expr_to_block (&loop, tmp);
3541 gfc_add_modify (&loop, fold_build1 (INDIRECT_REF, type, el),
3542 build_int_cst (type,
3543 lang_hooks.to_target_charset (' ')));
3545 /* Increment loop variables. */
3546 gfc_add_modify (&loop, i, fold_build2 (MINUS_EXPR, sizetype, i,
3547 TYPE_SIZE_UNIT (type)));
3548 gfc_add_modify (&loop, el, fold_build2 (POINTER_PLUS_EXPR,
3550 TYPE_SIZE_UNIT (type)));
3552 /* Making the loop... actually loop! */
3553 tmp = gfc_finish_block (&loop);
3554 tmp = build1_v (LOOP_EXPR, tmp);
3555 gfc_add_expr_to_block (&block, tmp);
3557 /* The exit label. */
3558 tmp = build1_v (LABEL_EXPR, exit_label);
3559 gfc_add_expr_to_block (&block, tmp);
3562 return gfc_finish_block (&block);
3566 /* Generate code to copy a string. */
3569 gfc_trans_string_copy (stmtblock_t * block, tree dlength, tree dest,
3570 int dkind, tree slength, tree src, int skind)
3572 tree tmp, dlen, slen;
3581 stmtblock_t tempblock;
3583 gcc_assert (dkind == skind);
3585 if (slength != NULL_TREE)
3587 slen = fold_convert (size_type_node, gfc_evaluate_now (slength, block));
3588 ssc = string_to_single_character (slen, src, skind);
3592 slen = build_int_cst (size_type_node, 1);
3596 if (dlength != NULL_TREE)
3598 dlen = fold_convert (size_type_node, gfc_evaluate_now (dlength, block));
3599 dsc = string_to_single_character (slen, dest, dkind);
3603 dlen = build_int_cst (size_type_node, 1);
3607 if (slength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (src)))
3608 ssc = string_to_single_character (slen, src, skind);
3609 if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
3610 dsc = string_to_single_character (dlen, dest, dkind);
3613 /* Assign directly if the types are compatible. */
3614 if (dsc != NULL_TREE && ssc != NULL_TREE
3615 && TREE_TYPE (dsc) == TREE_TYPE (ssc))
3617 gfc_add_modify (block, dsc, ssc);
3621 /* Do nothing if the destination length is zero. */
3622 cond = fold_build2 (GT_EXPR, boolean_type_node, dlen,
3623 build_int_cst (size_type_node, 0));
3625 /* The following code was previously in _gfortran_copy_string:
3627 // The two strings may overlap so we use memmove.
3629 copy_string (GFC_INTEGER_4 destlen, char * dest,
3630 GFC_INTEGER_4 srclen, const char * src)
3632 if (srclen >= destlen)
3634 // This will truncate if too long.
3635 memmove (dest, src, destlen);
3639 memmove (dest, src, srclen);
3641 memset (&dest[srclen], ' ', destlen - srclen);
3645 We're now doing it here for better optimization, but the logic
3648 /* For non-default character kinds, we have to multiply the string
3649 length by the base type size. */
3650 chartype = gfc_get_char_type (dkind);
3651 slen = fold_build2 (MULT_EXPR, size_type_node,
3652 fold_convert (size_type_node, slen),
3653 fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3654 dlen = fold_build2 (MULT_EXPR, size_type_node,
3655 fold_convert (size_type_node, dlen),
3656 fold_convert (size_type_node, TYPE_SIZE_UNIT (chartype)));
3659 dest = fold_convert (pvoid_type_node, dest);
3661 dest = gfc_build_addr_expr (pvoid_type_node, dest);
3664 src = fold_convert (pvoid_type_node, src);
3666 src = gfc_build_addr_expr (pvoid_type_node, src);
3668 /* Truncate string if source is too long. */
3669 cond2 = fold_build2 (GE_EXPR, boolean_type_node, slen, dlen);
3670 tmp2 = build_call_expr_loc (input_location,
3671 built_in_decls[BUILT_IN_MEMMOVE],
3672 3, dest, src, dlen);
3674 /* Else copy and pad with spaces. */
3675 tmp3 = build_call_expr_loc (input_location,
3676 built_in_decls[BUILT_IN_MEMMOVE],
3677 3, dest, src, slen);
3679 tmp4 = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest,
3680 fold_convert (sizetype, slen));
3681 tmp4 = fill_with_spaces (tmp4, chartype,
3682 fold_build2 (MINUS_EXPR, TREE_TYPE(dlen),
3685 gfc_init_block (&tempblock);
3686 gfc_add_expr_to_block (&tempblock, tmp3);
3687 gfc_add_expr_to_block (&tempblock, tmp4);
3688 tmp3 = gfc_finish_block (&tempblock);
3690 /* The whole copy_string function is there. */
3691 tmp = fold_build3 (COND_EXPR, void_type_node, cond2, tmp2, tmp3);
3692 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
3693 build_empty_stmt (input_location));
3694 gfc_add_expr_to_block (block, tmp);
3698 /* Translate a statement function.
3699 The value of a statement function reference is obtained by evaluating the
3700 expression using the values of the actual arguments for the values of the
3701 corresponding dummy arguments. */
3704 gfc_conv_statement_function (gfc_se * se, gfc_expr * expr)
3708 gfc_formal_arglist *fargs;
3709 gfc_actual_arglist *args;
3712 gfc_saved_var *saved_vars;
3718 sym = expr->symtree->n.sym;
3719 args = expr->value.function.actual;
3720 gfc_init_se (&lse, NULL);
3721 gfc_init_se (&rse, NULL);
3724 for (fargs = sym->formal; fargs; fargs = fargs->next)
3726 saved_vars = (gfc_saved_var *)gfc_getmem (n * sizeof (gfc_saved_var));
3727 temp_vars = (tree *)gfc_getmem (n * sizeof (tree));
3729 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3731 /* Each dummy shall be specified, explicitly or implicitly, to be
3733 gcc_assert (fargs->sym->attr.dimension == 0);
3736 /* Create a temporary to hold the value. */
3737 type = gfc_typenode_for_spec (&fsym->ts);
3738 temp_vars[n] = gfc_create_var (type, fsym->name);
3740 if (fsym->ts.type == BT_CHARACTER)
3742 /* Copy string arguments. */
3745 gcc_assert (fsym->ts.u.cl && fsym->ts.u.cl->length
3746 && fsym->ts.u.cl->length->expr_type == EXPR_CONSTANT);
3748 arglen = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
3749 tmp = gfc_build_addr_expr (build_pointer_type (type),
3752 gfc_conv_expr (&rse, args->expr);
3753 gfc_conv_string_parameter (&rse);
3754 gfc_add_block_to_block (&se->pre, &lse.pre);
3755 gfc_add_block_to_block (&se->pre, &rse.pre);
3757 gfc_trans_string_copy (&se->pre, arglen, tmp, fsym->ts.kind,
3758 rse.string_length, rse.expr, fsym->ts.kind);
3759 gfc_add_block_to_block (&se->pre, &lse.post);
3760 gfc_add_block_to_block (&se->pre, &rse.post);
3764 /* For everything else, just evaluate the expression. */
3765 gfc_conv_expr (&lse, args->expr);
3767 gfc_add_block_to_block (&se->pre, &lse.pre);
3768 gfc_add_modify (&se->pre, temp_vars[n], lse.expr);
3769 gfc_add_block_to_block (&se->pre, &lse.post);
3775 /* Use the temporary variables in place of the real ones. */
3776 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3777 gfc_shadow_sym (fargs->sym, temp_vars[n], &saved_vars[n]);
3779 gfc_conv_expr (se, sym->value);
3781 if (sym->ts.type == BT_CHARACTER)
3783 gfc_conv_const_charlen (sym->ts.u.cl);
3785 /* Force the expression to the correct length. */
3786 if (!INTEGER_CST_P (se->string_length)
3787 || tree_int_cst_lt (se->string_length,
3788 sym->ts.u.cl->backend_decl))
3790 type = gfc_get_character_type (sym->ts.kind, sym->ts.u.cl);
3791 tmp = gfc_create_var (type, sym->name);
3792 tmp = gfc_build_addr_expr (build_pointer_type (type), tmp);
3793 gfc_trans_string_copy (&se->pre, sym->ts.u.cl->backend_decl, tmp,
3794 sym->ts.kind, se->string_length, se->expr,
3798 se->string_length = sym->ts.u.cl->backend_decl;
3801 /* Restore the original variables. */
3802 for (fargs = sym->formal, n = 0; fargs; fargs = fargs->next, n++)
3803 gfc_restore_sym (fargs->sym, &saved_vars[n]);
3804 gfc_free (saved_vars);
3808 /* Translate a function expression. */
3811 gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
3815 if (expr->value.function.isym)
3817 gfc_conv_intrinsic_function (se, expr);
3821 /* We distinguish statement functions from general functions to improve
3822 runtime performance. */
3823 if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
3825 gfc_conv_statement_function (se, expr);
3829 /* expr.value.function.esym is the resolved (specific) function symbol for
3830 most functions. However this isn't set for dummy procedures. */
3831 sym = expr->value.function.esym;
3833 sym = expr->symtree->n.sym;
3835 gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr,
3841 gfc_conv_array_constructor_expr (gfc_se * se, gfc_expr * expr)
3843 gcc_assert (se->ss != NULL && se->ss != gfc_ss_terminator);
3844 gcc_assert (se->ss->expr == expr && se->ss->type == GFC_SS_CONSTRUCTOR);
3846 gfc_conv_tmp_array_ref (se);
3847 gfc_advance_se_ss_chain (se);
3851 /* Build a static initializer. EXPR is the expression for the initial value.
3852 The other parameters describe the variable of the component being
3853 initialized. EXPR may be null. */
3856 gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type,
3857 bool array, bool pointer)
3861 if (!(expr || pointer))
3864 /* Check if we have ISOCBINDING_NULL_PTR or ISOCBINDING_NULL_FUNPTR
3865 (these are the only two iso_c_binding derived types that can be
3866 used as initialization expressions). If so, we need to modify
3867 the 'expr' to be that for a (void *). */
3868 if (expr != NULL && expr->ts.type == BT_DERIVED
3869 && expr->ts.is_iso_c && expr->ts.u.derived)
3871 gfc_symbol *derived = expr->ts.u.derived;
3873 expr = gfc_int_expr (0);
3875 /* The derived symbol has already been converted to a (void *). Use
3877 expr->ts.f90_type = derived->ts.f90_type;
3878 expr->ts.kind = derived->ts.kind;
3883 /* Arrays need special handling. */
3885 return gfc_build_null_descriptor (type);
3887 return gfc_conv_array_initializer (type, expr);
3890 return fold_convert (type, null_pointer_node);
3897 gfc_init_se (&se, NULL);
3898 gfc_conv_structure (&se, expr, 1);
3902 return gfc_conv_string_init (ts->u.cl->backend_decl,expr);
3905 gfc_init_se (&se, NULL);
3906 gfc_conv_constant (&se, expr);
3913 gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
3925 gfc_start_block (&block);
3927 /* Initialize the scalarizer. */
3928 gfc_init_loopinfo (&loop);
3930 gfc_init_se (&lse, NULL);
3931 gfc_init_se (&rse, NULL);
3934 rss = gfc_walk_expr (expr);
3935 if (rss == gfc_ss_terminator)
3937 /* The rhs is scalar. Add a ss for the expression. */
3938 rss = gfc_get_ss ();
3939 rss->next = gfc_ss_terminator;
3940 rss->type = GFC_SS_SCALAR;
3944 /* Create a SS for the destination. */
3945 lss = gfc_get_ss ();
3946 lss->type = GFC_SS_COMPONENT;
3948 lss->shape = gfc_get_shape (cm->as->rank);
3949 lss->next = gfc_ss_terminator;
3950 lss->data.info.dimen = cm->as->rank;
3951 lss->data.info.descriptor = dest;
3952 lss->data.info.data = gfc_conv_array_data (dest);
3953 lss->data.info.offset = gfc_conv_array_offset (dest);
3954 for (n = 0; n < cm->as->rank; n++)
3956 lss->data.info.dim[n] = n;
3957 lss->data.info.start[n] = gfc_conv_array_lbound (dest, n);
3958 lss->data.info.stride[n] = gfc_index_one_node;
3960 mpz_init (lss->shape[n]);
3961 mpz_sub (lss->shape[n], cm->as->upper[n]->value.integer,
3962 cm->as->lower[n]->value.integer);
3963 mpz_add_ui (lss->shape[n], lss->shape[n], 1);
3966 /* Associate the SS with the loop. */
3967 gfc_add_ss_to_loop (&loop, lss);
3968 gfc_add_ss_to_loop (&loop, rss);
3970 /* Calculate the bounds of the scalarization. */
3971 gfc_conv_ss_startstride (&loop);
3973 /* Setup the scalarizing loops. */
3974 gfc_conv_loop_setup (&loop, &expr->where);
3976 /* Setup the gfc_se structures. */
3977 gfc_copy_loopinfo_to_se (&lse, &loop);
3978 gfc_copy_loopinfo_to_se (&rse, &loop);
3981 gfc_mark_ss_chain_used (rss, 1);
3983 gfc_mark_ss_chain_used (lss, 1);
3985 /* Start the scalarized loop body. */
3986 gfc_start_scalarized_body (&loop, &body);
3988 gfc_conv_tmp_array_ref (&lse);
3989 if (cm->ts.type == BT_CHARACTER)
3990 lse.string_length = cm->ts.u.cl->backend_decl;
3992 gfc_conv_expr (&rse, expr);
3994 tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts, true, false);
3995 gfc_add_expr_to_block (&body, tmp);
3997 gcc_assert (rse.ss == gfc_ss_terminator);
3999 /* Generate the copying loops. */
4000 gfc_trans_scalarizing_loops (&loop, &body);
4002 /* Wrap the whole thing up. */
4003 gfc_add_block_to_block (&block, &loop.pre);
4004 gfc_add_block_to_block (&block, &loop.post);
4006 for (n = 0; n < cm->as->rank; n++)
4007 mpz_clear (lss->shape[n]);
4008 gfc_free (lss->shape);
4010 gfc_cleanup_loop (&loop);
4012 return gfc_finish_block (&block);
4016 /* Assign a single component of a derived type constructor. */
4019 gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
4029 gfc_start_block (&block);
4031 if (cm->attr.pointer)
4033 gfc_init_se (&se, NULL);
4034 /* Pointer component. */
4035 if (cm->attr.dimension)
4037 /* Array pointer. */
4038 if (expr->expr_type == EXPR_NULL)
4039 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4042 rss = gfc_walk_expr (expr);
4043 se.direct_byref = 1;
4045 gfc_conv_expr_descriptor (&se, expr, rss);
4046 gfc_add_block_to_block (&block, &se.pre);
4047 gfc_add_block_to_block (&block, &se.post);
4052 /* Scalar pointers. */
4053 se.want_pointer = 1;
4054 gfc_conv_expr (&se, expr);
4055 gfc_add_block_to_block (&block, &se.pre);
4056 gfc_add_modify (&block, dest,
4057 fold_convert (TREE_TYPE (dest), se.expr));
4058 gfc_add_block_to_block (&block, &se.post);
4061 else if (cm->ts.type == BT_CLASS && expr->expr_type == EXPR_NULL)
4063 /* NULL initialization for CLASS components. */
4064 tmp = gfc_trans_structure_assign (dest,
4065 gfc_default_initializer (&cm->ts));
4066 gfc_add_expr_to_block (&block, tmp);
4068 else if (cm->attr.dimension)
4070 if (cm->attr.allocatable && expr->expr_type == EXPR_NULL)
4071 gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
4072 else if (cm->attr.allocatable)
4076 gfc_init_se (&se, NULL);
4078 rss = gfc_walk_expr (expr);
4079 se.want_pointer = 0;
4080 gfc_conv_expr_descriptor (&se, expr, rss);
4081 gfc_add_block_to_block (&block, &se.pre);
4082 gfc_add_modify (&block, dest, se.expr);
4084 if (cm->ts.type == BT_DERIVED && cm->ts.u.derived->attr.alloc_comp)
4085 tmp = gfc_copy_alloc_comp (cm->ts.u.derived, se.expr, dest,
4088 tmp = gfc_duplicate_allocatable (dest, se.expr,
4089 TREE_TYPE(cm->backend_decl),
4092 gfc_add_expr_to_block (&block, tmp);
4093 gfc_add_block_to_block (&block, &se.post);
4095 if (expr->expr_type != EXPR_VARIABLE)
4096 gfc_conv_descriptor_data_set (&block, se.expr, null_pointer_node);
4098 /* Shift the lbound and ubound of temporaries to being unity, rather
4099 than zero, based. Calculate the offset for all cases. */
4100 offset = gfc_conv_descriptor_offset_get (dest);
4101 gfc_add_modify (&block, offset, gfc_index_zero_node);
4102 tmp2 =gfc_create_var (gfc_array_index_type, NULL);
4103 for (n = 0; n < expr->rank; n++)
4105 if (expr->expr_type != EXPR_VARIABLE
4106 && expr->expr_type != EXPR_CONSTANT)
4109 tmp = gfc_conv_descriptor_ubound_get (dest, gfc_rank_cst[n]);
4110 span = fold_build2 (MINUS_EXPR, gfc_array_index_type, tmp,
4111 gfc_conv_descriptor_lbound_get (dest, gfc_rank_cst[n]));
4112 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
4113 span, gfc_index_one_node);
4114 gfc_conv_descriptor_ubound_set (&block, dest, gfc_rank_cst[n],
4116 gfc_conv_descriptor_lbound_set (&block, dest, gfc_rank_cst[n],
4117 gfc_index_one_node);
4119 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
4120 gfc_conv_descriptor_lbound_get (dest,
4122 gfc_conv_descriptor_stride_get (dest,
4124 gfc_add_modify (&block, tmp2, tmp);
4125 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type, offset, tmp2);
4126 gfc_conv_descriptor_offset_set (&block, dest, tmp);
4129 if (expr->expr_type == EXPR_FUNCTION
4130 && expr->value.function.isym
4131 && expr->value.function.isym->conversion
4132 && expr->value.function.actual->expr
4133 && expr->value.function.actual->expr->expr_type
4136 /* If a conversion expression has a null data pointer
4137 argument, nullify the allocatable component. */
4141 s = expr->value.function.actual->expr->symtree->n.sym;
4142 if (s->attr.allocatable || s->attr.pointer)
4144 non_null_expr = gfc_finish_block (&block);
4145 gfc_start_block (&block);
4146 gfc_conv_descriptor_data_set (&block, dest,
4148 null_expr = gfc_finish_block (&block);
4149 tmp = gfc_conv_descriptor_data_get (s->backend_decl);
4150 tmp = build2 (EQ_EXPR, boolean_type_node, tmp,
4151 fold_convert (TREE_TYPE (tmp),
4152 null_pointer_node));
4153 return build3_v (COND_EXPR, tmp, null_expr,
4160 tmp = gfc_trans_subarray_assign (dest, cm, expr);
4161 gfc_add_expr_to_block (&block, tmp);
4164 else if (expr->ts.type == BT_DERIVED)
4166 if (expr->expr_type != EXPR_STRUCTURE)
4168 gfc_init_se (&se, NULL);
4169 gfc_conv_expr (&se, expr);
4170 gfc_add_block_to_block (&block, &se.pre);
4171 gfc_add_modify (&block, dest,
4172 fold_convert (TREE_TYPE (dest), se.expr));
4173 gfc_add_block_to_block (&block, &se.post);
4177 /* Nested constructors. */
4178 tmp = gfc_trans_structure_assign (dest, expr);
4179 gfc_add_expr_to_block (&block, tmp);
4184 /* Scalar component. */
4185 gfc_init_se (&se, NULL);
4186 gfc_init_se (&lse, NULL);
4188 gfc_conv_expr (&se, expr);
4189 if (cm->ts.type == BT_CHARACTER)
4190 lse.string_length = cm->ts.u.cl->backend_decl;
4192 tmp = gfc_trans_scalar_assign (&lse, &se, cm->ts, true, false);
4193 gfc_add_expr_to_block (&block, tmp);
4195 return gfc_finish_block (&block);
4198 /* Assign a derived type constructor to a variable. */
4201 gfc_trans_structure_assign (tree dest, gfc_expr * expr)
4209 gfc_start_block (&block);
4210 cm = expr->ts.u.derived->components;
4211 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
4213 /* Skip absent members in default initializers. */
4217 /* Handle c_null_(fun)ptr. */
4218 if (c && c->expr && c->expr->ts.is_iso_c)
4220 field = cm->backend_decl;
4221 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
4222 dest, field, NULL_TREE);
4223 tmp = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp,
4224 fold_convert (TREE_TYPE (tmp),
4225 null_pointer_node));
4226 gfc_add_expr_to_block (&block, tmp);
4230 field = cm->backend_decl;
4231 tmp = fold_build3 (COMPONENT_REF, TREE_TYPE (field),
4232 dest, field, NULL_TREE);
4233 tmp = gfc_trans_subcomponent_assign (tmp, cm, c->expr);
4234 gfc_add_expr_to_block (&block, tmp);
4236 return gfc_finish_block (&block);
4239 /* Build an expression for a constructor. If init is nonzero then
4240 this is part of a static variable initializer. */
4243 gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init)
4250 VEC(constructor_elt,gc) *v = NULL;
4252 gcc_assert (se->ss == NULL);
4253 gcc_assert (expr->expr_type == EXPR_STRUCTURE);
4254 type = gfc_typenode_for_spec (&expr->ts);
4258 /* Create a temporary variable and fill it in. */
4259 se->expr = gfc_create_var (type, expr->ts.u.derived->name);
4260 tmp = gfc_trans_structure_assign (se->expr, expr);
4261 gfc_add_expr_to_block (&se->pre, tmp);
4265 cm = expr->ts.u.derived->components;
4267 for (c = expr->value.constructor; c; c = c->next, cm = cm->next)
4269 /* Skip absent members in default initializers and allocatable
4270 components. Although the latter have a default initializer
4271 of EXPR_NULL,... by default, the static nullify is not needed
4272 since this is done every time we come into scope. */
4273 if (!c->expr || cm->attr.allocatable)
4276 if (cm->ts.type == BT_CLASS)
4278 gfc_component *data;
4279 data = gfc_find_component (cm->ts.u.derived, "$data", true, true);
4280 val = gfc_conv_initializer (c->expr, &cm->ts,
4281 TREE_TYPE (data->backend_decl),
4282 data->attr.dimension,
4283 data->attr.pointer);
4285 CONSTRUCTOR_APPEND_ELT (v, data->backend_decl, val);
4287 else if (strcmp (cm->name, "$size") == 0)
4289 val = TYPE_SIZE_UNIT (gfc_get_derived_type (cm->ts.u.derived));
4290 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4292 else if (cm->initializer && cm->initializer->expr_type != EXPR_NULL
4293 && strcmp (cm->name, "$extends") == 0)
4296 vtabs = cm->initializer->symtree->n.sym;
4297 val = gfc_build_addr_expr (NULL_TREE, gfc_get_symbol_decl (vtabs));
4298 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4302 val = gfc_conv_initializer (c->expr, &cm->ts,
4303 TREE_TYPE (cm->backend_decl), cm->attr.dimension,
4304 cm->attr.pointer || cm->attr.proc_pointer);
4306 /* Append it to the constructor list. */
4307 CONSTRUCTOR_APPEND_ELT (v, cm->backend_decl, val);
4310 se->expr = build_constructor (type, v);
4312 TREE_CONSTANT (se->expr) = 1;
4316 /* Translate a substring expression. */
4319 gfc_conv_substring_expr (gfc_se * se, gfc_expr * expr)
4325 gcc_assert (ref == NULL || ref->type == REF_SUBSTRING);
4327 se->expr = gfc_build_wide_string_const (expr->ts.kind,
4328 expr->value.character.length,
4329 expr->value.character.string);
4331 se->string_length = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (se->expr)));
4332 TYPE_STRING_FLAG (TREE_TYPE (se->expr)) = 1;
4335 gfc_conv_substring (se, ref, expr->ts.kind, NULL, &expr->where);
4339 /* Entry point for expression translation. Evaluates a scalar quantity.
4340 EXPR is the expression to be translated, and SE is the state structure if
4341 called from within the scalarized. */
4344 gfc_conv_expr (gfc_se * se, gfc_expr * expr)
4346 if (se->ss && se->ss->expr == expr
4347 && (se->ss->type == GFC_SS_SCALAR || se->ss->type == GFC_SS_REFERENCE))
4349 /* Substitute a scalar expression evaluated outside the scalarization
4351 se->expr = se->ss->data.scalar.expr;
4352 se->string_length = se->ss->string_length;
4353 gfc_advance_se_ss_chain (se);
4357 /* We need to convert the expressions for the iso_c_binding derived types.
4358 C_NULL_PTR and C_NULL_FUNPTR will be made EXPR_NULL, which evaluates to
4359 null_pointer_node. C_PTR and C_FUNPTR are converted to match the
4360 typespec for the C_PTR and C_FUNPTR symbols, which has already been
4361 updated to be an integer with a kind equal to the size of a (void *). */
4362 if (expr->ts.type == BT_DERIVED && expr->ts.u.derived
4363 && expr->ts.u.derived->attr.is_iso_c)
4365 if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR
4366 || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR)
4368 /* Set expr_type to EXPR_NULL, which will result in
4369 null_pointer_node being used below. */
4370 expr->expr_type = EXPR_NULL;
4374 /* Update the type/kind of the expression to be what the new
4375 type/kind are for the updated symbols of C_PTR/C_FUNPTR. */
4376 expr->ts.type = expr->ts.u.derived->ts.type;
4377 expr->ts.f90_type = expr->ts.u.derived->ts.f90_type;
4378 expr->ts.kind = expr->ts.u.derived->ts.kind;
4382 switch (expr->expr_type)
4385 gfc_conv_expr_op (se, expr);
4389 gfc_conv_function_expr (se, expr);
4393 gfc_conv_constant (se, expr);
4397 gfc_conv_variable (se, expr);
4401 se->expr = null_pointer_node;
4404 case EXPR_SUBSTRING:
4405 gfc_conv_substring_expr (se, expr);
4408 case EXPR_STRUCTURE:
4409 gfc_conv_structure (se, expr, 0);
4413 gfc_conv_array_constructor_expr (se, expr);
4422 /* Like gfc_conv_expr_val, but the value is also suitable for use in the lhs
4423 of an assignment. */
4425 gfc_conv_expr_lhs (gfc_se * se, gfc_expr * expr)
4427 gfc_conv_expr (se, expr);
4428 /* All numeric lvalues should have empty post chains. If not we need to
4429 figure out a way of rewriting an lvalue so that it has no post chain. */
4430 gcc_assert (expr->ts.type == BT_CHARACTER || !se->post.head);
4433 /* Like gfc_conv_expr, but the POST block is guaranteed to be empty for
4434 numeric expressions. Used for scalar values where inserting cleanup code
4437 gfc_conv_expr_val (gfc_se * se, gfc_expr * expr)
4441 gcc_assert (expr->ts.type != BT_CHARACTER);
4442 gfc_conv_expr (se, expr);
4445 val = gfc_create_var (TREE_TYPE (se->expr), NULL);
4446 gfc_add_modify (&se->pre, val, se->expr);
4448 gfc_add_block_to_block (&se->pre, &se->post);
4452 /* Helper to translate an expression and convert it to a particular type. */
4454 gfc_conv_expr_type (gfc_se * se, gfc_expr * expr, tree type)
4456 gfc_conv_expr_val (se, expr);
4457 se->expr = convert (type, se->expr);
4461 /* Converts an expression so that it can be passed by reference. Scalar
4465 gfc_conv_expr_reference (gfc_se * se, gfc_expr * expr)
4469 if (se->ss && se->ss->expr == expr
4470 && se->ss->type == GFC_SS_REFERENCE)
4472 se->expr = se->ss->data.scalar.expr;
4473 se->string_length = se->ss->string_length;
4474 gfc_advance_se_ss_chain (se);
4478 if (expr->ts.type == BT_CHARACTER)
4480 gfc_conv_expr (se, expr);
4481 gfc_conv_string_parameter (se);
4485 if (expr->expr_type == EXPR_VARIABLE)
4487 se->want_pointer = 1;
4488 gfc_conv_expr (se, expr);
4491 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4492 gfc_add_modify (&se->pre, var, se->expr);
4493 gfc_add_block_to_block (&se->pre, &se->post);
4499 if (expr->expr_type == EXPR_FUNCTION
4500 && ((expr->value.function.esym
4501 && expr->value.function.esym->result->attr.pointer
4502 && !expr->value.function.esym->result->attr.dimension)
4503 || (!expr->value.function.esym
4504 && expr->symtree->n.sym->attr.pointer
4505 && !expr->symtree->n.sym->attr.dimension)))
4507 se->want_pointer = 1;
4508 gfc_conv_expr (se, expr);
4509 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4510 gfc_add_modify (&se->pre, var, se->expr);
4516 gfc_conv_expr (se, expr);
4518 /* Create a temporary var to hold the value. */
4519 if (TREE_CONSTANT (se->expr))
4521 tree tmp = se->expr;
4522 STRIP_TYPE_NOPS (tmp);
4523 var = build_decl (input_location,
4524 CONST_DECL, NULL, TREE_TYPE (tmp));
4525 DECL_INITIAL (var) = tmp;
4526 TREE_STATIC (var) = 1;
4531 var = gfc_create_var (TREE_TYPE (se->expr), NULL);
4532 gfc_add_modify (&se->pre, var, se->expr);
4534 gfc_add_block_to_block (&se->pre, &se->post);
4536 /* Take the address of that value. */
4537 se->expr = gfc_build_addr_expr (NULL_TREE, var);
4542 gfc_trans_pointer_assign (gfc_code * code)
4544 return gfc_trans_pointer_assignment (code->expr1, code->expr2);
4548 /* Generate code for a pointer assignment. */
4551 gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
4562 gfc_start_block (&block);
4564 gfc_init_se (&lse, NULL);
4566 lss = gfc_walk_expr (expr1);
4567 rss = gfc_walk_expr (expr2);
4568 if (lss == gfc_ss_terminator)
4570 /* Scalar pointers. */
4571 lse.want_pointer = 1;
4572 gfc_conv_expr (&lse, expr1);
4573 gcc_assert (rss == gfc_ss_terminator);
4574 gfc_init_se (&rse, NULL);
4575 rse.want_pointer = 1;
4576 gfc_conv_expr (&rse, expr2);
4578 if (expr1->symtree->n.sym->attr.proc_pointer
4579 && expr1->symtree->n.sym->attr.dummy)
4580 lse.expr = build_fold_indirect_ref_loc (input_location,
4583 if (expr2->symtree && expr2->symtree->n.sym->attr.proc_pointer
4584 && expr2->symtree->n.sym->attr.dummy)
4585 rse.expr = build_fold_indirect_ref_loc (input_location,
4588 gfc_add_block_to_block (&block, &lse.pre);
4589 gfc_add_block_to_block (&block, &rse.pre);
4591 /* Check character lengths if character expression. The test is only
4592 really added if -fbounds-check is enabled. */
4593 if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL
4594 && !expr1->symtree->n.sym->attr.proc_pointer
4595 && !gfc_is_proc_ptr_comp (expr1, NULL))
4597 gcc_assert (expr2->ts.type == BT_CHARACTER);
4598 gcc_assert (lse.string_length && rse.string_length);
4599 gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4600 lse.string_length, rse.string_length,
4604 gfc_add_modify (&block, lse.expr,
4605 fold_convert (TREE_TYPE (lse.expr), rse.expr));
4607 gfc_add_block_to_block (&block, &rse.post);
4608 gfc_add_block_to_block (&block, &lse.post);
4613 tree strlen_rhs = NULL_TREE;
4615 /* Array pointer. */
4616 gfc_conv_expr_descriptor (&lse, expr1, lss);
4617 strlen_lhs = lse.string_length;
4618 switch (expr2->expr_type)
4621 /* Just set the data pointer to null. */
4622 gfc_conv_descriptor_data_set (&lse.pre, lse.expr, null_pointer_node);
4626 /* Assign directly to the pointer's descriptor. */
4627 lse.direct_byref = 1;
4628 gfc_conv_expr_descriptor (&lse, expr2, rss);
4629 strlen_rhs = lse.string_length;
4631 /* If this is a subreference array pointer assignment, use the rhs
4632 descriptor element size for the lhs span. */
4633 if (expr1->symtree->n.sym->attr.subref_array_pointer)
4635 decl = expr1->symtree->n.sym->backend_decl;
4636 gfc_init_se (&rse, NULL);
4637 rse.descriptor_only = 1;
4638 gfc_conv_expr (&rse, expr2);
4639 tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
4640 tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
4641 if (!INTEGER_CST_P (tmp))
4642 gfc_add_block_to_block (&lse.post, &rse.pre);
4643 gfc_add_modify (&lse.post, GFC_DECL_SPAN(decl), tmp);
4649 /* Assign to a temporary descriptor and then copy that
4650 temporary to the pointer. */
4652 tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
4655 lse.direct_byref = 1;
4656 gfc_conv_expr_descriptor (&lse, expr2, rss);
4657 strlen_rhs = lse.string_length;
4658 gfc_add_modify (&lse.pre, desc, tmp);
4662 gfc_add_block_to_block (&block, &lse.pre);
4664 /* Check string lengths if applicable. The check is only really added
4665 to the output code if -fbounds-check is enabled. */
4666 if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
4668 gcc_assert (expr2->ts.type == BT_CHARACTER);
4669 gcc_assert (strlen_lhs && strlen_rhs);
4670 gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
4671 strlen_lhs, strlen_rhs, &block);
4674 gfc_add_block_to_block (&block, &lse.post);
4676 return gfc_finish_block (&block);
4680 /* Makes sure se is suitable for passing as a function string parameter. */
4681 /* TODO: Need to check all callers of this function. It may be abused. */
4684 gfc_conv_string_parameter (gfc_se * se)
4688 if (TREE_CODE (se->expr) == STRING_CST)
4690 type = TREE_TYPE (TREE_TYPE (se->expr));
4691 se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4695 if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
4697 if (TREE_CODE (se->expr) != INDIRECT_REF)
4699 type = TREE_TYPE (se->expr);
4700 se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
4704 type = gfc_get_character_type_len (gfc_default_character_kind,
4706 type = build_pointer_type (type);
4707 se->expr = gfc_build_addr_expr (type, se->expr);
4711 gcc_assert (POINTER_TYPE_P (TREE_TYPE (se->expr)));
4712 gcc_assert (se->string_length
4713 && TREE_CODE (TREE_TYPE (se->string_length)) == INTEGER_TYPE);
4717 /* Generate code for assignment of scalar variables. Includes character
4718 strings and derived types with allocatable components. */
4721 gfc_trans_scalar_assign (gfc_se * lse, gfc_se * rse, gfc_typespec ts,
4722 bool l_is_temp, bool r_is_var)
4728 gfc_init_block (&block);
4730 if (ts.type == BT_CHARACTER)
4735 if (lse->string_length != NULL_TREE)
4737 gfc_conv_string_parameter (lse);
4738 gfc_add_block_to_block (&block, &lse->pre);
4739 llen = lse->string_length;
4742 if (rse->string_length != NULL_TREE)
4744 gcc_assert (rse->string_length != NULL_TREE);
4745 gfc_conv_string_parameter (rse);
4746 gfc_add_block_to_block (&block, &rse->pre);
4747 rlen = rse->string_length;
4750 gfc_trans_string_copy (&block, llen, lse->expr, ts.kind, rlen,
4751 rse->expr, ts.kind);
4753 else if (ts.type == BT_DERIVED && ts.u.derived->attr.alloc_comp)
4757 /* Are the rhs and the lhs the same? */
4760 cond = fold_build2 (EQ_EXPR, boolean_type_node,
4761 gfc_build_addr_expr (NULL_TREE, lse->expr),
4762 gfc_build_addr_expr (NULL_TREE, rse->expr));
4763 cond = gfc_evaluate_now (cond, &lse->pre);
4766 /* Deallocate the lhs allocated components as long as it is not
4767 the same as the rhs. This must be done following the assignment
4768 to prevent deallocating data that could be used in the rhs
4772 tmp = gfc_evaluate_now (lse->expr, &lse->pre);
4773 tmp = gfc_deallocate_alloc_comp (ts.u.derived, tmp, 0);
4775 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
4777 gfc_add_expr_to_block (&lse->post, tmp);
4780 gfc_add_block_to_block (&block, &rse->pre);
4781 gfc_add_block_to_block (&block, &lse->pre);
4783 gfc_add_modify (&block, lse->expr,
4784 fold_convert (TREE_TYPE (lse->expr), rse->expr));
4786 /* Do a deep copy if the rhs is a variable, if it is not the
4790 tmp = gfc_copy_alloc_comp (ts.u.derived, rse->expr, lse->expr, 0);
4791 tmp = build3_v (COND_EXPR, cond, build_empty_stmt (input_location),
4793 gfc_add_expr_to_block (&block, tmp);
4796 else if (ts.type == BT_DERIVED || ts.type == BT_CLASS)
4798 gfc_add_block_to_block (&block, &lse->pre);
4799 gfc_add_block_to_block (&block, &rse->pre);
4800 tmp = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lse->expr), rse->expr);
4801 gfc_add_modify (&block, lse->expr, tmp);
4805 gfc_add_block_to_block (&block, &lse->pre);
4806 gfc_add_block_to_block (&block, &rse->pre);
4808 gfc_add_modify (&block, lse->expr,
4809 fold_convert (TREE_TYPE (lse->expr), rse->expr));
4812 gfc_add_block_to_block (&block, &lse->post);
4813 gfc_add_block_to_block (&block, &rse->post);
4815 return gfc_finish_block (&block);
4819 /* Try to translate array(:) = func (...), where func is a transformational
4820 array function, without using a temporary. Returns NULL is this isn't the
4824 gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
4829 bool seen_array_ref;
4831 gfc_component *comp = NULL;
4833 /* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
4834 if (expr2->value.function.isym && !gfc_is_intrinsic_libcall (expr2))
4837 /* Elemental functions don't need a temporary anyway. */
4838 if (expr2->value.function.esym != NULL
4839 && expr2->value.function.esym->attr.elemental)
4842 /* Fail if rhs is not FULL or a contiguous section. */
4843 if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
4846 /* Fail if EXPR1 can't be expressed as a descriptor. */
4847 if (gfc_ref_needs_temporary_p (expr1->ref))
4850 /* Functions returning pointers need temporaries. */
4851 if (expr2->symtree->n.sym->attr.pointer
4852 || expr2->symtree->n.sym->attr.allocatable)
4855 /* Character array functions need temporaries unless the
4856 character lengths are the same. */
4857 if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
4859 if (expr1->ts.u.cl->length == NULL
4860 || expr1->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4863 if (expr2->ts.u.cl->length == NULL
4864 || expr2->ts.u.cl->length->expr_type != EXPR_CONSTANT)
4867 if (mpz_cmp (expr1->ts.u.cl->length->value.integer,
4868 expr2->ts.u.cl->length->value.integer) != 0)
4872 /* Check that no LHS component references appear during an array
4873 reference. This is needed because we do not have the means to
4874 span any arbitrary stride with an array descriptor. This check
4875 is not needed for the rhs because the function result has to be
4877 seen_array_ref = false;
4878 for (ref = expr1->ref; ref; ref = ref->next)
4880 if (ref->type == REF_ARRAY)
4881 seen_array_ref= true;
4882 else if (ref->type == REF_COMPONENT && seen_array_ref)
4886 /* Check for a dependency. */
4887 if (gfc_check_fncall_dependency (expr1, INTENT_OUT,
4888 expr2->value.function.esym,
4889 expr2->value.function.actual,
4893 /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
4895 gcc_assert (expr2->value.function.isym
4896 || (gfc_is_proc_ptr_comp (expr2, &comp)
4897 && comp && comp->attr.dimension)
4898 || (!comp && gfc_return_by_reference (expr2->value.function.esym)
4899 && expr2->value.function.esym->result->attr.dimension));
4901 ss = gfc_walk_expr (expr1);
4902 gcc_assert (ss != gfc_ss_terminator);
4903 gfc_init_se (&se, NULL);
4904 gfc_start_block (&se.pre);
4905 se.want_pointer = 1;
4907 gfc_conv_array_parameter (&se, expr1, ss, 0, NULL, NULL, NULL);
4909 se.direct_byref = 1;
4910 se.ss = gfc_walk_expr (expr2);
4911 gcc_assert (se.ss != gfc_ss_terminator);
4912 gfc_conv_function_expr (&se, expr2);
4913 gfc_add_block_to_block (&se.pre, &se.post);
4915 return gfc_finish_block (&se.pre);
4918 /* Determine whether the given EXPR_CONSTANT is a zero initializer. */
4921 is_zero_initializer_p (gfc_expr * expr)
4923 if (expr->expr_type != EXPR_CONSTANT)
4926 /* We ignore constants with prescribed memory representations for now. */
4927 if (expr->representation.string)
4930 switch (expr->ts.type)
4933 return mpz_cmp_si (expr->value.integer, 0) == 0;
4936 return mpfr_zero_p (expr->value.real)
4937 && MPFR_SIGN (expr->value.real) >= 0;
4940 return expr->value.logical == 0;
4943 return mpfr_zero_p (mpc_realref (expr->value.complex))
4944 && MPFR_SIGN (mpc_realref (expr->value.complex)) >= 0
4945 && mpfr_zero_p (mpc_imagref (expr->value.complex))
4946 && MPFR_SIGN (mpc_imagref (expr->value.complex)) >= 0;
4954 /* Try to efficiently translate array(:) = 0. Return NULL if this
4958 gfc_trans_zero_assign (gfc_expr * expr)
4960 tree dest, len, type;
4964 sym = expr->symtree->n.sym;
4965 dest = gfc_get_symbol_decl (sym);
4967 type = TREE_TYPE (dest);
4968 if (POINTER_TYPE_P (type))
4969 type = TREE_TYPE (type);
4970 if (!GFC_ARRAY_TYPE_P (type))
4973 /* Determine the length of the array. */
4974 len = GFC_TYPE_ARRAY_SIZE (type);
4975 if (!len || TREE_CODE (len) != INTEGER_CST)
4978 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
4979 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
4980 fold_convert (gfc_array_index_type, tmp));
4982 /* If we are zeroing a local array avoid taking its address by emitting
4984 if (!POINTER_TYPE_P (TREE_TYPE (dest)))
4985 return build2 (MODIFY_EXPR, void_type_node,
4986 dest, build_constructor (TREE_TYPE (dest), NULL));
4988 /* Convert arguments to the correct types. */
4989 dest = fold_convert (pvoid_type_node, dest);
4990 len = fold_convert (size_type_node, len);
4992 /* Construct call to __builtin_memset. */
4993 tmp = build_call_expr_loc (input_location,
4994 built_in_decls[BUILT_IN_MEMSET],
4995 3, dest, integer_zero_node, len);
4996 return fold_convert (void_type_node, tmp);
5000 /* Helper for gfc_trans_array_copy and gfc_trans_array_constructor_copy
5001 that constructs the call to __builtin_memcpy. */
5004 gfc_build_memcpy_call (tree dst, tree src, tree len)
5008 /* Convert arguments to the correct types. */
5009 if (!POINTER_TYPE_P (TREE_TYPE (dst)))
5010 dst = gfc_build_addr_expr (pvoid_type_node, dst);
5012 dst = fold_convert (pvoid_type_node, dst);
5014 if (!POINTER_TYPE_P (TREE_TYPE (src)))
5015 src = gfc_build_addr_expr (pvoid_type_node, src);
5017 src = fold_convert (pvoid_type_node, src);
5019 len = fold_convert (size_type_node, len);
5021 /* Construct call to __builtin_memcpy. */
5022 tmp = build_call_expr_loc (input_location,
5023 built_in_decls[BUILT_IN_MEMCPY], 3, dst, src, len);
5024 return fold_convert (void_type_node, tmp);
5028 /* Try to efficiently translate dst(:) = src(:). Return NULL if this
5029 can't be done. EXPR1 is the destination/lhs and EXPR2 is the
5030 source/rhs, both are gfc_full_array_ref_p which have been checked for
5034 gfc_trans_array_copy (gfc_expr * expr1, gfc_expr * expr2)
5036 tree dst, dlen, dtype;
5037 tree src, slen, stype;
5040 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5041 src = gfc_get_symbol_decl (expr2->symtree->n.sym);
5043 dtype = TREE_TYPE (dst);
5044 if (POINTER_TYPE_P (dtype))
5045 dtype = TREE_TYPE (dtype);
5046 stype = TREE_TYPE (src);
5047 if (POINTER_TYPE_P (stype))
5048 stype = TREE_TYPE (stype);
5050 if (!GFC_ARRAY_TYPE_P (dtype) || !GFC_ARRAY_TYPE_P (stype))
5053 /* Determine the lengths of the arrays. */
5054 dlen = GFC_TYPE_ARRAY_SIZE (dtype);
5055 if (!dlen || TREE_CODE (dlen) != INTEGER_CST)
5057 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5058 dlen = fold_build2 (MULT_EXPR, gfc_array_index_type, dlen,
5059 fold_convert (gfc_array_index_type, tmp));
5061 slen = GFC_TYPE_ARRAY_SIZE (stype);
5062 if (!slen || TREE_CODE (slen) != INTEGER_CST)
5064 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (stype));
5065 slen = fold_build2 (MULT_EXPR, gfc_array_index_type, slen,
5066 fold_convert (gfc_array_index_type, tmp));
5068 /* Sanity check that they are the same. This should always be
5069 the case, as we should already have checked for conformance. */
5070 if (!tree_int_cst_equal (slen, dlen))
5073 return gfc_build_memcpy_call (dst, src, dlen);
5077 /* Try to efficiently translate array(:) = (/ ... /). Return NULL if
5078 this can't be done. EXPR1 is the destination/lhs for which
5079 gfc_full_array_ref_p is true, and EXPR2 is the source/rhs. */
5082 gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
5084 unsigned HOST_WIDE_INT nelem;
5090 nelem = gfc_constant_array_constructor_p (expr2->value.constructor);
5094 dst = gfc_get_symbol_decl (expr1->symtree->n.sym);
5095 dtype = TREE_TYPE (dst);
5096 if (POINTER_TYPE_P (dtype))
5097 dtype = TREE_TYPE (dtype);
5098 if (!GFC_ARRAY_TYPE_P (dtype))
5101 /* Determine the lengths of the array. */
5102 len = GFC_TYPE_ARRAY_SIZE (dtype);
5103 if (!len || TREE_CODE (len) != INTEGER_CST)
5106 /* Confirm that the constructor is the same size. */
5107 if (compare_tree_int (len, nelem) != 0)
5110 tmp = TYPE_SIZE_UNIT (gfc_get_element_type (dtype));
5111 len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
5112 fold_convert (gfc_array_index_type, tmp));
5114 stype = gfc_typenode_for_spec (&expr2->ts);
5115 src = gfc_build_constant_array_constructor (expr2, stype);
5117 stype = TREE_TYPE (src);
5118 if (POINTER_TYPE_P (stype))
5119 stype = TREE_TYPE (stype);
5121 return gfc_build_memcpy_call (dst, src, len);
5125 /* Subroutine of gfc_trans_assignment that actually scalarizes the
5126 assignment. EXPR1 is the destination/LHS and EXPR2 is the source/RHS. */
5129 gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
5134 gfc_ss *lss_section;
5141 bool scalar_to_array;
5144 /* Assignment of the form lhs = rhs. */
5145 gfc_start_block (&block);
5147 gfc_init_se (&lse, NULL);
5148 gfc_init_se (&rse, NULL);
5151 lss = gfc_walk_expr (expr1);
5153 if (lss != gfc_ss_terminator)
5155 /* Allow the scalarizer to workshare array assignments. */
5156 if (ompws_flags & OMPWS_WORKSHARE_FLAG)
5157 ompws_flags |= OMPWS_SCALARIZER_WS;
5159 /* The assignment needs scalarization. */
5162 /* Find a non-scalar SS from the lhs. */
5163 while (lss_section != gfc_ss_terminator
5164 && lss_section->type != GFC_SS_SECTION)
5165 lss_section = lss_section->next;
5167 gcc_assert (lss_section != gfc_ss_terminator);
5169 /* Initialize the scalarizer. */
5170 gfc_init_loopinfo (&loop);
5173 rss = gfc_walk_expr (expr2);
5174 if (rss == gfc_ss_terminator)
5176 /* The rhs is scalar. Add a ss for the expression. */
5177 rss = gfc_get_ss ();
5178 rss->next = gfc_ss_terminator;
5179 rss->type = GFC_SS_SCALAR;
5182 /* Associate the SS with the loop. */
5183 gfc_add_ss_to_loop (&loop, lss);
5184 gfc_add_ss_to_loop (&loop, rss);
5186 /* Calculate the bounds of the scalarization. */
5187 gfc_conv_ss_startstride (&loop);
5188 /* Resolve any data dependencies in the statement. */
5189 gfc_conv_resolve_dependencies (&loop, lss, rss);
5190 /* Setup the scalarizing loops. */
5191 gfc_conv_loop_setup (&loop, &expr2->where);
5193 /* Setup the gfc_se structures. */
5194 gfc_copy_loopinfo_to_se (&lse, &loop);
5195 gfc_copy_loopinfo_to_se (&rse, &loop);
5198 gfc_mark_ss_chain_used (rss, 1);
5199 if (loop.temp_ss == NULL)
5202 gfc_mark_ss_chain_used (lss, 1);
5206 lse.ss = loop.temp_ss;
5207 gfc_mark_ss_chain_used (lss, 3);
5208 gfc_mark_ss_chain_used (loop.temp_ss, 3);
5211 /* Start the scalarized loop body. */
5212 gfc_start_scalarized_body (&loop, &body);
5215 gfc_init_block (&body);
5217 l_is_temp = (lss != gfc_ss_terminator && loop.temp_ss != NULL);
5219 /* Translate the expression. */
5220 gfc_conv_expr (&rse, expr2);
5222 /* Stabilize a string length for temporaries. */
5223 if (expr2->ts.type == BT_CHARACTER)
5224 string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
5226 string_length = NULL_TREE;
5230 gfc_conv_tmp_array_ref (&lse);
5231 gfc_advance_se_ss_chain (&lse);
5232 if (expr2->ts.type == BT_CHARACTER)
5233 lse.string_length = string_length;
5236 gfc_conv_expr (&lse, expr1);
5238 /* Assignments of scalar derived types with allocatable components
5239 to arrays must be done with a deep copy and the rhs temporary
5240 must have its components deallocated afterwards. */
5241 scalar_to_array = (expr2->ts.type == BT_DERIVED
5242 && expr2->ts.u.derived->attr.alloc_comp
5243 && expr2->expr_type != EXPR_VARIABLE
5244 && !gfc_is_constant_expr (expr2)
5245 && expr1->rank && !expr2->rank);
5246 if (scalar_to_array)
5248 tmp = gfc_deallocate_alloc_comp (expr2->ts.u.derived, rse.expr, 0);
5249 gfc_add_expr_to_block (&loop.post, tmp);
5252 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
5253 l_is_temp || init_flag,
5254 (expr2->expr_type == EXPR_VARIABLE)
5255 || scalar_to_array);
5256 gfc_add_expr_to_block (&body, tmp);
5258 if (lss == gfc_ss_terminator)
5260 /* Use the scalar assignment as is. */
5261 gfc_add_block_to_block (&block, &body);
5265 gcc_assert (lse.ss == gfc_ss_terminator
5266 && rse.ss == gfc_ss_terminator);
5270 gfc_trans_scalarized_loop_boundary (&loop, &body);
5272 /* We need to copy the temporary to the actual lhs. */
5273 gfc_init_se (&lse, NULL);
5274 gfc_init_se (&rse, NULL);
5275 gfc_copy_loopinfo_to_se (&lse, &loop);
5276 gfc_copy_loopinfo_to_se (&rse, &loop);
5278 rse.ss = loop.temp_ss;
5281 gfc_conv_tmp_array_ref (&rse);
5282 gfc_advance_se_ss_chain (&rse);
5283 gfc_conv_expr (&lse, expr1);
5285 gcc_assert (lse.ss == gfc_ss_terminator
5286 && rse.ss == gfc_ss_terminator);
5288 if (expr2->ts.type == BT_CHARACTER)
5289 rse.string_length = string_length;
5291 tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
5293 gfc_add_expr_to_block (&body, tmp);
5296 /* Generate the copying loops. */
5297 gfc_trans_scalarizing_loops (&loop, &body);
5299 /* Wrap the whole thing up. */
5300 gfc_add_block_to_block (&block, &loop.pre);
5301 gfc_add_block_to_block (&block, &loop.post);
5303 gfc_cleanup_loop (&loop);
5306 return gfc_finish_block (&block);
5310 /* Check whether EXPR is a copyable array. */
5313 copyable_array_p (gfc_expr * expr)
5315 if (expr->expr_type != EXPR_VARIABLE)
5318 /* First check it's an array. */
5319 if (expr->rank < 1 || !expr->ref || expr->ref->next)
5322 if (!gfc_full_array_ref_p (expr->ref, NULL))
5325 /* Next check that it's of a simple enough type. */
5326 switch (expr->ts.type)
5338 return !expr->ts.u.derived->attr.alloc_comp;
5347 /* Translate an assignment. */
5350 gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag)
5354 /* Special case a single function returning an array. */
5355 if (expr2->expr_type == EXPR_FUNCTION && expr2->rank > 0)
5357 tmp = gfc_trans_arrayfunc_assign (expr1, expr2);
5362 /* Special case assigning an array to zero. */
5363 if (copyable_array_p (expr1)
5364 && is_zero_initializer_p (expr2))
5366 tmp = gfc_trans_zero_assign (expr1);
5371 /* Special case copying one array to another. */
5372 if (copyable_array_p (expr1)
5373 && copyable_array_p (expr2)
5374 && gfc_compare_types (&expr1->ts, &expr2->ts)
5375 && !gfc_check_dependency (expr1, expr2, 0))
5377 tmp = gfc_trans_array_copy (expr1, expr2);
5382 /* Special case initializing an array from a constant array constructor. */
5383 if (copyable_array_p (expr1)
5384 && expr2->expr_type == EXPR_ARRAY
5385 && gfc_compare_types (&expr1->ts, &expr2->ts))
5387 tmp = gfc_trans_array_constructor_copy (expr1, expr2);
5392 /* Fallback to the scalarizer to generate explicit loops. */
5393 return gfc_trans_assignment_1 (expr1, expr2, init_flag);
5397 gfc_trans_init_assign (gfc_code * code)
5399 return gfc_trans_assignment (code->expr1, code->expr2, true);
5403 gfc_trans_assign (gfc_code * code)
5405 return gfc_trans_assignment (code->expr1, code->expr2, false);
5409 /* Translate an assignment to a CLASS object
5410 (pointer or ordinary assignment). */
5413 gfc_trans_class_assign (gfc_code *code)
5420 gfc_start_block (&block);
5422 if (code->expr2->ts.type != BT_CLASS)
5424 /* Insert an additional assignment which sets the '$vptr' field. */
5425 lhs = gfc_copy_expr (code->expr1);
5426 gfc_add_component_ref (lhs, "$vptr");
5427 if (code->expr2->ts.type == BT_DERIVED)
5431 vtab = gfc_find_derived_vtab (code->expr2->ts.u.derived);
5434 rhs = gfc_get_expr ();
5435 rhs->expr_type = EXPR_VARIABLE;
5436 gfc_find_sym_tree (vtab->name, NULL, 1, &st);
5440 else if (code->expr2->expr_type == EXPR_NULL)
5441 rhs = gfc_int_expr (0);
5445 tmp = gfc_trans_pointer_assignment (lhs, rhs);
5446 gfc_add_expr_to_block (&block, tmp);
5448 gfc_free_expr (lhs);
5449 gfc_free_expr (rhs);
5452 /* Do the actual CLASS assignment. */
5453 if (code->expr2->ts.type == BT_CLASS)
5454 code->op = EXEC_ASSIGN;
5456 gfc_add_component_ref (code->expr1, "$data");
5458 if (code->op == EXEC_ASSIGN)
5459 tmp = gfc_trans_assign (code);
5460 else if (code->op == EXEC_POINTER_ASSIGN)
5461 tmp = gfc_trans_pointer_assign (code);
5465 gfc_add_expr_to_block (&block, tmp);
5467 return gfc_finish_block (&block);