1 /* Intrinsic function resolution.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* Assign name and types to intrinsic procedures. For functions, the
24 first argument to a resolution function is an expression pointer to
25 the original function node and the rest are pointers to the
26 arguments of the function call. For subroutines, a pointer to the
27 code node is passed. The result type and library subroutine name
28 are generally set according to the function arguments. */
32 #include "coretypes.h"
35 #include "intrinsic.h"
37 /* Given printf-like arguments, return a stable version of the result string.
39 We already have a working, optimized string hashing table in the form of
40 the identifier table. Reusing this table is likely not to be wasted,
41 since if the function name makes it to the gimple output of the frontend,
42 we'll have to create the identifier anyway. */
45 gfc_get_string (const char *format, ...)
51 va_start (ap, format);
52 vsnprintf (temp_name, sizeof (temp_name), format, ap);
54 temp_name[sizeof (temp_name) - 1] = 0;
56 ident = get_identifier (temp_name);
57 return IDENTIFIER_POINTER (ident);
60 /* MERGE and SPREAD need to have source charlen's present for passing
61 to the result expression. */
63 check_charlen_present (gfc_expr *source)
65 if (source->ts.cl == NULL)
67 source->ts.cl = gfc_get_charlen ();
68 source->ts.cl->next = gfc_current_ns->cl_list;
69 gfc_current_ns->cl_list = source->ts.cl;
72 if (source->expr_type == EXPR_CONSTANT)
74 source->ts.cl->length = gfc_int_expr (source->value.character.length);
77 else if (source->expr_type == EXPR_ARRAY)
79 source->ts.cl->length =
80 gfc_int_expr (source->value.constructor->expr->value.character.length);
85 /* Helper function for resolving the "mask" argument. */
88 resolve_mask_arg (gfc_expr *mask)
96 /* For the scalar case, coerce the mask to kind=4 unconditionally
97 (because this is the only kind we have a library function
100 if (mask->ts.kind != 4)
102 ts.type = BT_LOGICAL;
104 gfc_convert_type (mask, &ts, 2);
109 /* In the library, we access the mask with a GFC_LOGICAL_1
110 argument. No need to waste memory if we are about to create
111 a temporary array. */
112 if (mask->expr_type == EXPR_OP)
114 ts.type = BT_LOGICAL;
116 gfc_convert_type (mask, &ts, 2);
121 /********************** Resolution functions **********************/
125 gfc_resolve_abs (gfc_expr *f, gfc_expr *a)
128 if (f->ts.type == BT_COMPLEX)
129 f->ts.type = BT_REAL;
131 f->value.function.name
132 = gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
137 gfc_resolve_access (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
138 gfc_expr *mode ATTRIBUTE_UNUSED)
140 f->ts.type = BT_INTEGER;
141 f->ts.kind = gfc_c_int_kind;
142 f->value.function.name = PREFIX ("access_func");
147 gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind,
150 f->ts.type = BT_CHARACTER;
151 f->ts.kind = (kind == NULL)
152 ? gfc_default_character_kind : mpz_get_si (kind->value.integer);
153 f->ts.cl = gfc_get_charlen ();
154 f->ts.cl->next = gfc_current_ns->cl_list;
155 gfc_current_ns->cl_list = f->ts.cl;
156 f->ts.cl->length = gfc_int_expr (1);
158 f->value.function.name = gfc_get_string (name, f->ts.kind,
159 gfc_type_letter (x->ts.type),
165 gfc_resolve_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind)
167 gfc_resolve_char_achar (f, x, kind, "__achar_%d_%c%d");
172 gfc_resolve_acos (gfc_expr *f, gfc_expr *x)
175 f->value.function.name
176 = gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
181 gfc_resolve_acosh (gfc_expr *f, gfc_expr *x)
184 f->value.function.name
185 = gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type),
191 gfc_resolve_aimag (gfc_expr *f, gfc_expr *x)
193 f->ts.type = BT_REAL;
194 f->ts.kind = x->ts.kind;
195 f->value.function.name
196 = gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type),
202 gfc_resolve_and (gfc_expr *f, gfc_expr *i, gfc_expr *j)
204 f->ts.type = i->ts.type;
205 f->ts.kind = gfc_kind_max (i, j);
207 if (i->ts.kind != j->ts.kind)
209 if (i->ts.kind == gfc_kind_max (i, j))
210 gfc_convert_type (j, &i->ts, 2);
212 gfc_convert_type (i, &j->ts, 2);
215 f->value.function.name
216 = gfc_get_string ("__and_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
221 gfc_resolve_aint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
226 f->ts.type = a->ts.type;
227 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
229 if (a->ts.kind != f->ts.kind)
231 ts.type = f->ts.type;
232 ts.kind = f->ts.kind;
233 gfc_convert_type (a, &ts, 2);
235 /* The resolved name is only used for specific intrinsics where
236 the return kind is the same as the arg kind. */
237 f->value.function.name
238 = gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
243 gfc_resolve_dint (gfc_expr *f, gfc_expr *a)
245 gfc_resolve_aint (f, a, NULL);
250 gfc_resolve_all (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
256 gfc_resolve_dim_arg (dim);
257 f->rank = mask->rank - 1;
258 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
261 f->value.function.name
262 = gfc_get_string (PREFIX ("all_%c%d"), gfc_type_letter (mask->ts.type),
268 gfc_resolve_anint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
273 f->ts.type = a->ts.type;
274 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
276 if (a->ts.kind != f->ts.kind)
278 ts.type = f->ts.type;
279 ts.kind = f->ts.kind;
280 gfc_convert_type (a, &ts, 2);
283 /* The resolved name is only used for specific intrinsics where
284 the return kind is the same as the arg kind. */
285 f->value.function.name
286 = gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type),
292 gfc_resolve_dnint (gfc_expr *f, gfc_expr *a)
294 gfc_resolve_anint (f, a, NULL);
299 gfc_resolve_any (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
305 gfc_resolve_dim_arg (dim);
306 f->rank = mask->rank - 1;
307 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
310 f->value.function.name
311 = gfc_get_string (PREFIX ("any_%c%d"), gfc_type_letter (mask->ts.type),
317 gfc_resolve_asin (gfc_expr *f, gfc_expr *x)
320 f->value.function.name
321 = gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
325 gfc_resolve_asinh (gfc_expr *f, gfc_expr *x)
328 f->value.function.name
329 = gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type),
334 gfc_resolve_atan (gfc_expr *f, gfc_expr *x)
337 f->value.function.name
338 = gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
342 gfc_resolve_atanh (gfc_expr *f, gfc_expr *x)
345 f->value.function.name
346 = gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type),
351 gfc_resolve_atan2 (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
354 f->value.function.name
355 = gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type),
360 /* Resolve the BESYN and BESJN intrinsics. */
363 gfc_resolve_besn (gfc_expr *f, gfc_expr *n, gfc_expr *x)
369 if (n->ts.kind != gfc_c_int_kind)
371 ts.type = BT_INTEGER;
372 ts.kind = gfc_c_int_kind;
373 gfc_convert_type (n, &ts, 2);
375 f->value.function.name = gfc_get_string ("<intrinsic>");
380 gfc_resolve_btest (gfc_expr *f, gfc_expr *i, gfc_expr *pos)
382 f->ts.type = BT_LOGICAL;
383 f->ts.kind = gfc_default_logical_kind;
384 f->value.function.name
385 = gfc_get_string ("__btest_%d_%d", i->ts.kind, pos->ts.kind);
390 gfc_resolve_ceiling (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
392 f->ts.type = BT_INTEGER;
393 f->ts.kind = (kind == NULL)
394 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
395 f->value.function.name
396 = gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
397 gfc_type_letter (a->ts.type), a->ts.kind);
402 gfc_resolve_char (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
404 gfc_resolve_char_achar (f, a, kind, "__char_%d_%c%d");
409 gfc_resolve_chdir (gfc_expr *f, gfc_expr *d ATTRIBUTE_UNUSED)
411 f->ts.type = BT_INTEGER;
412 f->ts.kind = gfc_default_integer_kind;
413 f->value.function.name = gfc_get_string (PREFIX ("chdir_i%d"), f->ts.kind);
418 gfc_resolve_chdir_sub (gfc_code *c)
423 if (c->ext.actual->next->expr != NULL)
424 kind = c->ext.actual->next->expr->ts.kind;
426 kind = gfc_default_integer_kind;
428 name = gfc_get_string (PREFIX ("chdir_i%d_sub"), kind);
429 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
434 gfc_resolve_chmod (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
435 gfc_expr *mode ATTRIBUTE_UNUSED)
437 f->ts.type = BT_INTEGER;
438 f->ts.kind = gfc_c_int_kind;
439 f->value.function.name = PREFIX ("chmod_func");
444 gfc_resolve_chmod_sub (gfc_code *c)
449 if (c->ext.actual->next->next->expr != NULL)
450 kind = c->ext.actual->next->next->expr->ts.kind;
452 kind = gfc_default_integer_kind;
454 name = gfc_get_string (PREFIX ("chmod_i%d_sub"), kind);
455 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
460 gfc_resolve_cmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y, gfc_expr *kind)
462 f->ts.type = BT_COMPLEX;
463 f->ts.kind = (kind == NULL)
464 ? gfc_default_real_kind : mpz_get_si (kind->value.integer);
467 f->value.function.name
468 = gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
469 gfc_type_letter (x->ts.type), x->ts.kind);
471 f->value.function.name
472 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
473 gfc_type_letter (x->ts.type), x->ts.kind,
474 gfc_type_letter (y->ts.type), y->ts.kind);
479 gfc_resolve_dcmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y)
481 gfc_resolve_cmplx (f, x, y, gfc_int_expr (gfc_default_double_kind));
486 gfc_resolve_complex (gfc_expr *f, gfc_expr *x, gfc_expr *y)
490 if (x->ts.type == BT_INTEGER)
492 if (y->ts.type == BT_INTEGER)
493 kind = gfc_default_real_kind;
499 if (y->ts.type == BT_REAL)
500 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
505 f->ts.type = BT_COMPLEX;
507 f->value.function.name
508 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
509 gfc_type_letter (x->ts.type), x->ts.kind,
510 gfc_type_letter (y->ts.type), y->ts.kind);
515 gfc_resolve_conjg (gfc_expr *f, gfc_expr *x)
518 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
523 gfc_resolve_cos (gfc_expr *f, gfc_expr *x)
526 f->value.function.name
527 = gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
532 gfc_resolve_cosh (gfc_expr *f, gfc_expr *x)
535 f->value.function.name
536 = gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
541 gfc_resolve_count (gfc_expr *f, gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
543 f->ts.type = BT_INTEGER;
545 f->ts.kind = mpz_get_si (kind->value.integer);
547 f->ts.kind = gfc_default_integer_kind;
551 f->rank = mask->rank - 1;
552 gfc_resolve_dim_arg (dim);
553 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
556 resolve_mask_arg (mask);
558 f->value.function.name
559 = gfc_get_string (PREFIX ("count_%d_%c"), f->ts.kind,
560 gfc_type_letter (mask->ts.type));
565 gfc_resolve_cshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
570 if (array->ts.type == BT_CHARACTER && array->ref)
571 gfc_resolve_substring_charlen (array);
574 f->rank = array->rank;
575 f->shape = gfc_copy_shape (array->shape, array->rank);
582 /* If dim kind is greater than default integer we need to use the larger. */
583 m = gfc_default_integer_kind;
585 m = m < dim->ts.kind ? dim->ts.kind : m;
587 /* Convert shift to at least m, so we don't need
588 kind=1 and kind=2 versions of the library functions. */
589 if (shift->ts.kind < m)
593 ts.type = BT_INTEGER;
595 gfc_convert_type_warn (shift, &ts, 2, 0);
600 if (dim->expr_type != EXPR_CONSTANT && dim->symtree->n.sym->attr.optional)
602 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
603 dim->representation.length = shift->ts.kind;
607 gfc_resolve_dim_arg (dim);
608 /* Convert dim to shift's kind to reduce variations. */
609 if (dim->ts.kind != shift->ts.kind)
610 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
614 f->value.function.name
615 = gfc_get_string (PREFIX ("cshift%d_%d%s"), n, shift->ts.kind,
616 array->ts.type == BT_CHARACTER ? "_char" : "");
621 gfc_resolve_ctime (gfc_expr *f, gfc_expr *time)
626 f->ts.type = BT_CHARACTER;
627 f->ts.kind = gfc_default_character_kind;
629 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
630 if (time->ts.kind != 8)
632 ts.type = BT_INTEGER;
636 gfc_convert_type (time, &ts, 2);
639 f->value.function.name = gfc_get_string (PREFIX ("ctime"));
644 gfc_resolve_dble (gfc_expr *f, gfc_expr *a)
646 f->ts.type = BT_REAL;
647 f->ts.kind = gfc_default_double_kind;
648 f->value.function.name
649 = gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
654 gfc_resolve_dim (gfc_expr *f, gfc_expr *a, gfc_expr *p)
656 f->ts.type = a->ts.type;
658 f->ts.kind = gfc_kind_max (a,p);
660 f->ts.kind = a->ts.kind;
662 if (p != NULL && a->ts.kind != p->ts.kind)
664 if (a->ts.kind == gfc_kind_max (a,p))
665 gfc_convert_type (p, &a->ts, 2);
667 gfc_convert_type (a, &p->ts, 2);
670 f->value.function.name
671 = gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
676 gfc_resolve_dot_product (gfc_expr *f, gfc_expr *a, gfc_expr *b)
680 temp.expr_type = EXPR_OP;
681 gfc_clear_ts (&temp.ts);
682 temp.value.op.operator = INTRINSIC_NONE;
683 temp.value.op.op1 = a;
684 temp.value.op.op2 = b;
685 gfc_type_convert_binary (&temp);
687 f->value.function.name
688 = gfc_get_string (PREFIX ("dot_product_%c%d"),
689 gfc_type_letter (f->ts.type), f->ts.kind);
694 gfc_resolve_dprod (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
695 gfc_expr *b ATTRIBUTE_UNUSED)
697 f->ts.kind = gfc_default_double_kind;
698 f->ts.type = BT_REAL;
699 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
704 gfc_resolve_eoshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
705 gfc_expr *boundary, gfc_expr *dim)
709 if (array->ts.type == BT_CHARACTER && array->ref)
710 gfc_resolve_substring_charlen (array);
713 f->rank = array->rank;
714 f->shape = gfc_copy_shape (array->shape, array->rank);
719 if (boundary && boundary->rank > 0)
722 /* If dim kind is greater than default integer we need to use the larger. */
723 m = gfc_default_integer_kind;
725 m = m < dim->ts.kind ? dim->ts.kind : m;
727 /* Convert shift to at least m, so we don't need
728 kind=1 and kind=2 versions of the library functions. */
729 if (shift->ts.kind < m)
733 ts.type = BT_INTEGER;
735 gfc_convert_type_warn (shift, &ts, 2, 0);
740 if (dim->expr_type != EXPR_CONSTANT && dim->symtree->n.sym->attr.optional)
742 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
743 dim->representation.length = shift->ts.kind;
747 gfc_resolve_dim_arg (dim);
748 /* Convert dim to shift's kind to reduce variations. */
749 if (dim->ts.kind != shift->ts.kind)
750 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
754 f->value.function.name
755 = gfc_get_string (PREFIX ("eoshift%d_%d%s"), n, shift->ts.kind,
756 array->ts.type == BT_CHARACTER ? "_char" : "");
761 gfc_resolve_exp (gfc_expr *f, gfc_expr *x)
764 f->value.function.name
765 = gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
770 gfc_resolve_exponent (gfc_expr *f, gfc_expr *x)
772 f->ts.type = BT_INTEGER;
773 f->ts.kind = gfc_default_integer_kind;
774 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
779 gfc_resolve_fdate (gfc_expr *f)
781 f->ts.type = BT_CHARACTER;
782 f->ts.kind = gfc_default_character_kind;
783 f->value.function.name = gfc_get_string (PREFIX ("fdate"));
788 gfc_resolve_floor (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
790 f->ts.type = BT_INTEGER;
791 f->ts.kind = (kind == NULL)
792 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
793 f->value.function.name
794 = gfc_get_string ("__floor%d_%c%d", f->ts.kind,
795 gfc_type_letter (a->ts.type), a->ts.kind);
800 gfc_resolve_fnum (gfc_expr *f, gfc_expr *n)
802 f->ts.type = BT_INTEGER;
803 f->ts.kind = gfc_default_integer_kind;
804 if (n->ts.kind != f->ts.kind)
805 gfc_convert_type (n, &f->ts, 2);
806 f->value.function.name = gfc_get_string (PREFIX ("fnum_i%d"), f->ts.kind);
811 gfc_resolve_fraction (gfc_expr *f, gfc_expr *x)
814 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
818 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
821 gfc_resolve_g77_math1 (gfc_expr *f, gfc_expr *x)
824 f->value.function.name = gfc_get_string ("<intrinsic>");
829 gfc_resolve_gamma (gfc_expr *f, gfc_expr *x)
832 f->value.function.name
833 = gfc_get_string ("__gamma_%d", x->ts.kind);
838 gfc_resolve_getcwd (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
840 f->ts.type = BT_INTEGER;
842 f->value.function.name = gfc_get_string (PREFIX ("getcwd"));
847 gfc_resolve_getgid (gfc_expr *f)
849 f->ts.type = BT_INTEGER;
851 f->value.function.name = gfc_get_string (PREFIX ("getgid"));
856 gfc_resolve_getpid (gfc_expr *f)
858 f->ts.type = BT_INTEGER;
860 f->value.function.name = gfc_get_string (PREFIX ("getpid"));
865 gfc_resolve_getuid (gfc_expr *f)
867 f->ts.type = BT_INTEGER;
869 f->value.function.name = gfc_get_string (PREFIX ("getuid"));
874 gfc_resolve_hostnm (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
876 f->ts.type = BT_INTEGER;
878 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
883 gfc_resolve_hypot (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
886 f->value.function.name = gfc_get_string ("__hypot_r%d", x->ts.kind);
891 gfc_resolve_iand (gfc_expr *f, gfc_expr *i, gfc_expr *j)
893 /* If the kind of i and j are different, then g77 cross-promoted the
894 kinds to the largest value. The Fortran 95 standard requires the
896 if (i->ts.kind != j->ts.kind)
898 if (i->ts.kind == gfc_kind_max (i, j))
899 gfc_convert_type (j, &i->ts, 2);
901 gfc_convert_type (i, &j->ts, 2);
905 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
910 gfc_resolve_ibclr (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
913 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
918 gfc_resolve_ibits (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED,
919 gfc_expr *len ATTRIBUTE_UNUSED)
922 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
927 gfc_resolve_ibset (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
930 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
935 gfc_resolve_iachar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
937 f->ts.type = BT_INTEGER;
939 f->ts.kind = mpz_get_si (kind->value.integer);
941 f->ts.kind = gfc_default_integer_kind;
942 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
947 gfc_resolve_ichar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
949 f->ts.type = BT_INTEGER;
951 f->ts.kind = mpz_get_si (kind->value.integer);
953 f->ts.kind = gfc_default_integer_kind;
954 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
959 gfc_resolve_idnint (gfc_expr *f, gfc_expr *a)
961 gfc_resolve_nint (f, a, NULL);
966 gfc_resolve_ierrno (gfc_expr *f)
968 f->ts.type = BT_INTEGER;
969 f->ts.kind = gfc_default_integer_kind;
970 f->value.function.name = gfc_get_string (PREFIX ("ierrno_i%d"), f->ts.kind);
975 gfc_resolve_ieor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
977 /* If the kind of i and j are different, then g77 cross-promoted the
978 kinds to the largest value. The Fortran 95 standard requires the
980 if (i->ts.kind != j->ts.kind)
982 if (i->ts.kind == gfc_kind_max (i, j))
983 gfc_convert_type (j, &i->ts, 2);
985 gfc_convert_type (i, &j->ts, 2);
989 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
994 gfc_resolve_ior (gfc_expr *f, gfc_expr *i, gfc_expr *j)
996 /* If the kind of i and j are different, then g77 cross-promoted the
997 kinds to the largest value. The Fortran 95 standard requires the
999 if (i->ts.kind != j->ts.kind)
1001 if (i->ts.kind == gfc_kind_max (i, j))
1002 gfc_convert_type (j, &i->ts, 2);
1004 gfc_convert_type (i, &j->ts, 2);
1008 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
1013 gfc_resolve_index_func (gfc_expr *f, gfc_expr *str,
1014 gfc_expr *sub_str ATTRIBUTE_UNUSED, gfc_expr *back,
1020 f->ts.type = BT_INTEGER;
1022 f->ts.kind = mpz_get_si (kind->value.integer);
1024 f->ts.kind = gfc_default_integer_kind;
1026 if (back && back->ts.kind != gfc_default_integer_kind)
1028 ts.type = BT_LOGICAL;
1029 ts.kind = gfc_default_integer_kind;
1032 gfc_convert_type (back, &ts, 2);
1035 f->value.function.name
1036 = gfc_get_string ("__index_%d_i%d", str->ts.kind, f->ts.kind);
1041 gfc_resolve_int (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1043 f->ts.type = BT_INTEGER;
1044 f->ts.kind = (kind == NULL)
1045 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1046 f->value.function.name
1047 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1048 gfc_type_letter (a->ts.type), a->ts.kind);
1053 gfc_resolve_int2 (gfc_expr *f, gfc_expr *a)
1055 f->ts.type = BT_INTEGER;
1057 f->value.function.name
1058 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1059 gfc_type_letter (a->ts.type), a->ts.kind);
1064 gfc_resolve_int8 (gfc_expr *f, gfc_expr *a)
1066 f->ts.type = BT_INTEGER;
1068 f->value.function.name
1069 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1070 gfc_type_letter (a->ts.type), a->ts.kind);
1075 gfc_resolve_long (gfc_expr *f, gfc_expr *a)
1077 f->ts.type = BT_INTEGER;
1079 f->value.function.name
1080 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1081 gfc_type_letter (a->ts.type), a->ts.kind);
1086 gfc_resolve_isatty (gfc_expr *f, gfc_expr *u)
1091 f->ts.type = BT_LOGICAL;
1092 f->ts.kind = gfc_default_integer_kind;
1093 if (u->ts.kind != gfc_c_int_kind)
1095 ts.type = BT_INTEGER;
1096 ts.kind = gfc_c_int_kind;
1099 gfc_convert_type (u, &ts, 2);
1102 f->value.function.name = gfc_get_string (PREFIX ("isatty_l%d"), f->ts.kind);
1107 gfc_resolve_ishft (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1110 f->value.function.name
1111 = gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
1116 gfc_resolve_rshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1119 f->value.function.name
1120 = gfc_get_string ("__rshift_%d_%d", i->ts.kind, shift->ts.kind);
1125 gfc_resolve_lshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1128 f->value.function.name
1129 = gfc_get_string ("__lshift_%d_%d", i->ts.kind, shift->ts.kind);
1134 gfc_resolve_ishftc (gfc_expr *f, gfc_expr *i, gfc_expr *shift, gfc_expr *size)
1138 s_kind = (size == NULL) ? gfc_default_integer_kind : size->ts.kind;
1141 f->value.function.name
1142 = gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
1147 gfc_resolve_kill (gfc_expr *f, gfc_expr *p ATTRIBUTE_UNUSED,
1148 gfc_expr *s ATTRIBUTE_UNUSED)
1150 f->ts.type = BT_INTEGER;
1151 f->ts.kind = gfc_default_integer_kind;
1152 f->value.function.name = gfc_get_string (PREFIX ("kill_i%d"), f->ts.kind);
1157 gfc_resolve_lbound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1159 static char lbound[] = "__lbound";
1161 f->ts.type = BT_INTEGER;
1163 f->ts.kind = mpz_get_si (kind->value.integer);
1165 f->ts.kind = gfc_default_integer_kind;
1170 f->shape = gfc_get_shape (1);
1171 mpz_init_set_ui (f->shape[0], array->rank);
1174 f->value.function.name = lbound;
1179 gfc_resolve_len (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1181 f->ts.type = BT_INTEGER;
1183 f->ts.kind = mpz_get_si (kind->value.integer);
1185 f->ts.kind = gfc_default_integer_kind;
1186 f->value.function.name
1187 = gfc_get_string ("__len_%d_i%d", string->ts.kind,
1188 gfc_default_integer_kind);
1193 gfc_resolve_len_trim (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1195 f->ts.type = BT_INTEGER;
1197 f->ts.kind = mpz_get_si (kind->value.integer);
1199 f->ts.kind = gfc_default_integer_kind;
1200 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
1205 gfc_resolve_lgamma (gfc_expr *f, gfc_expr *x)
1208 f->value.function.name
1209 = gfc_get_string ("__lgamma_%d", x->ts.kind);
1214 gfc_resolve_link (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1215 gfc_expr *p2 ATTRIBUTE_UNUSED)
1217 f->ts.type = BT_INTEGER;
1218 f->ts.kind = gfc_default_integer_kind;
1219 f->value.function.name = gfc_get_string (PREFIX ("link_i%d"), f->ts.kind);
1224 gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
1226 f->ts.type= BT_INTEGER;
1227 f->ts.kind = gfc_index_integer_kind;
1228 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
1233 gfc_resolve_log (gfc_expr *f, gfc_expr *x)
1236 f->value.function.name
1237 = gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1242 gfc_resolve_log10 (gfc_expr *f, gfc_expr *x)
1245 f->value.function.name
1246 = gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type),
1252 gfc_resolve_logical (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1254 f->ts.type = BT_LOGICAL;
1255 f->ts.kind = (kind == NULL)
1256 ? gfc_default_logical_kind : mpz_get_si (kind->value.integer);
1259 f->value.function.name
1260 = gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
1261 gfc_type_letter (a->ts.type), a->ts.kind);
1266 gfc_resolve_malloc (gfc_expr *f, gfc_expr *size)
1268 if (size->ts.kind < gfc_index_integer_kind)
1273 ts.type = BT_INTEGER;
1274 ts.kind = gfc_index_integer_kind;
1275 gfc_convert_type_warn (size, &ts, 2, 0);
1278 f->ts.type = BT_INTEGER;
1279 f->ts.kind = gfc_index_integer_kind;
1280 f->value.function.name = gfc_get_string (PREFIX ("malloc"));
1285 gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
1289 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1291 f->ts.type = BT_LOGICAL;
1292 f->ts.kind = gfc_default_logical_kind;
1296 temp.expr_type = EXPR_OP;
1297 gfc_clear_ts (&temp.ts);
1298 temp.value.op.operator = INTRINSIC_NONE;
1299 temp.value.op.op1 = a;
1300 temp.value.op.op2 = b;
1301 gfc_type_convert_binary (&temp);
1305 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1307 f->value.function.name
1308 = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
1314 gfc_resolve_minmax (const char *name, gfc_expr *f, gfc_actual_arglist *args)
1316 gfc_actual_arglist *a;
1318 f->ts.type = args->expr->ts.type;
1319 f->ts.kind = args->expr->ts.kind;
1320 /* Find the largest type kind. */
1321 for (a = args->next; a; a = a->next)
1323 if (a->expr->ts.kind > f->ts.kind)
1324 f->ts.kind = a->expr->ts.kind;
1327 /* Convert all parameters to the required kind. */
1328 for (a = args; a; a = a->next)
1330 if (a->expr->ts.kind != f->ts.kind)
1331 gfc_convert_type (a->expr, &f->ts, 2);
1334 f->value.function.name
1335 = gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1340 gfc_resolve_max (gfc_expr *f, gfc_actual_arglist *args)
1342 gfc_resolve_minmax ("__max_%c%d", f, args);
1347 gfc_resolve_maxloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1353 f->ts.type = BT_INTEGER;
1354 f->ts.kind = gfc_default_integer_kind;
1359 f->shape = gfc_get_shape (1);
1360 mpz_init_set_si (f->shape[0], array->rank);
1364 f->rank = array->rank - 1;
1365 gfc_resolve_dim_arg (dim);
1366 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1368 idim = (int) mpz_get_si (dim->value.integer);
1369 f->shape = gfc_get_shape (f->rank);
1370 for (i = 0, j = 0; i < f->rank; i++, j++)
1372 if (i == (idim - 1))
1374 mpz_init_set (f->shape[i], array->shape[j]);
1381 if (mask->rank == 0)
1386 resolve_mask_arg (mask);
1391 f->value.function.name
1392 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1393 gfc_type_letter (array->ts.type), array->ts.kind);
1398 gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1408 f->rank = array->rank - 1;
1409 gfc_resolve_dim_arg (dim);
1411 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1413 idim = (int) mpz_get_si (dim->value.integer);
1414 f->shape = gfc_get_shape (f->rank);
1415 for (i = 0, j = 0; i < f->rank; i++, j++)
1417 if (i == (idim - 1))
1419 mpz_init_set (f->shape[i], array->shape[j]);
1426 if (mask->rank == 0)
1431 resolve_mask_arg (mask);
1436 f->value.function.name
1437 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1438 gfc_type_letter (array->ts.type), array->ts.kind);
1443 gfc_resolve_mclock (gfc_expr *f)
1445 f->ts.type = BT_INTEGER;
1447 f->value.function.name = PREFIX ("mclock");
1452 gfc_resolve_mclock8 (gfc_expr *f)
1454 f->ts.type = BT_INTEGER;
1456 f->value.function.name = PREFIX ("mclock8");
1461 gfc_resolve_merge (gfc_expr *f, gfc_expr *tsource,
1462 gfc_expr *fsource ATTRIBUTE_UNUSED,
1463 gfc_expr *mask ATTRIBUTE_UNUSED)
1465 if (tsource->ts.type == BT_CHARACTER && tsource->ref)
1466 gfc_resolve_substring_charlen (tsource);
1468 if (fsource->ts.type == BT_CHARACTER && fsource->ref)
1469 gfc_resolve_substring_charlen (fsource);
1471 if (tsource->ts.type == BT_CHARACTER)
1472 check_charlen_present (tsource);
1474 f->ts = tsource->ts;
1475 f->value.function.name
1476 = gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1482 gfc_resolve_min (gfc_expr *f, gfc_actual_arglist *args)
1484 gfc_resolve_minmax ("__min_%c%d", f, args);
1489 gfc_resolve_minloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1495 f->ts.type = BT_INTEGER;
1496 f->ts.kind = gfc_default_integer_kind;
1501 f->shape = gfc_get_shape (1);
1502 mpz_init_set_si (f->shape[0], array->rank);
1506 f->rank = array->rank - 1;
1507 gfc_resolve_dim_arg (dim);
1508 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1510 idim = (int) mpz_get_si (dim->value.integer);
1511 f->shape = gfc_get_shape (f->rank);
1512 for (i = 0, j = 0; i < f->rank; i++, j++)
1514 if (i == (idim - 1))
1516 mpz_init_set (f->shape[i], array->shape[j]);
1523 if (mask->rank == 0)
1528 resolve_mask_arg (mask);
1533 f->value.function.name
1534 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1535 gfc_type_letter (array->ts.type), array->ts.kind);
1540 gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1550 f->rank = array->rank - 1;
1551 gfc_resolve_dim_arg (dim);
1553 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1555 idim = (int) mpz_get_si (dim->value.integer);
1556 f->shape = gfc_get_shape (f->rank);
1557 for (i = 0, j = 0; i < f->rank; i++, j++)
1559 if (i == (idim - 1))
1561 mpz_init_set (f->shape[i], array->shape[j]);
1568 if (mask->rank == 0)
1573 resolve_mask_arg (mask);
1578 f->value.function.name
1579 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1580 gfc_type_letter (array->ts.type), array->ts.kind);
1585 gfc_resolve_mod (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1587 f->ts.type = a->ts.type;
1589 f->ts.kind = gfc_kind_max (a,p);
1591 f->ts.kind = a->ts.kind;
1593 if (p != NULL && a->ts.kind != p->ts.kind)
1595 if (a->ts.kind == gfc_kind_max (a,p))
1596 gfc_convert_type (p, &a->ts, 2);
1598 gfc_convert_type (a, &p->ts, 2);
1601 f->value.function.name
1602 = gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
1607 gfc_resolve_modulo (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1609 f->ts.type = a->ts.type;
1611 f->ts.kind = gfc_kind_max (a,p);
1613 f->ts.kind = a->ts.kind;
1615 if (p != NULL && a->ts.kind != p->ts.kind)
1617 if (a->ts.kind == gfc_kind_max (a,p))
1618 gfc_convert_type (p, &a->ts, 2);
1620 gfc_convert_type (a, &p->ts, 2);
1623 f->value.function.name
1624 = gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
1629 gfc_resolve_nearest (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1631 if (p->ts.kind != a->ts.kind)
1632 gfc_convert_type (p, &a->ts, 2);
1635 f->value.function.name
1636 = gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1641 gfc_resolve_nint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1643 f->ts.type = BT_INTEGER;
1644 f->ts.kind = (kind == NULL)
1645 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1646 f->value.function.name
1647 = gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1652 gfc_resolve_not (gfc_expr *f, gfc_expr *i)
1655 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1660 gfc_resolve_or (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1662 f->ts.type = i->ts.type;
1663 f->ts.kind = gfc_kind_max (i, j);
1665 if (i->ts.kind != j->ts.kind)
1667 if (i->ts.kind == gfc_kind_max (i, j))
1668 gfc_convert_type (j, &i->ts, 2);
1670 gfc_convert_type (i, &j->ts, 2);
1673 f->value.function.name
1674 = gfc_get_string ("__or_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
1679 gfc_resolve_pack (gfc_expr *f, gfc_expr *array, gfc_expr *mask,
1680 gfc_expr *vector ATTRIBUTE_UNUSED)
1682 if (array->ts.type == BT_CHARACTER && array->ref)
1683 gfc_resolve_substring_charlen (array);
1688 resolve_mask_arg (mask);
1690 if (mask->rank != 0)
1691 f->value.function.name = (array->ts.type == BT_CHARACTER
1692 ? PREFIX ("pack_char") : PREFIX ("pack"));
1694 f->value.function.name = (array->ts.type == BT_CHARACTER
1695 ? PREFIX ("pack_s_char") : PREFIX ("pack_s"));
1700 gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1709 f->rank = array->rank - 1;
1710 gfc_resolve_dim_arg (dim);
1715 if (mask->rank == 0)
1720 resolve_mask_arg (mask);
1725 f->value.function.name
1726 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1727 gfc_type_letter (array->ts.type), array->ts.kind);
1732 gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1734 f->ts.type = BT_REAL;
1737 f->ts.kind = mpz_get_si (kind->value.integer);
1739 f->ts.kind = (a->ts.type == BT_COMPLEX)
1740 ? a->ts.kind : gfc_default_real_kind;
1742 f->value.function.name
1743 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1744 gfc_type_letter (a->ts.type), a->ts.kind);
1749 gfc_resolve_realpart (gfc_expr *f, gfc_expr *a)
1751 f->ts.type = BT_REAL;
1752 f->ts.kind = a->ts.kind;
1753 f->value.function.name
1754 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1755 gfc_type_letter (a->ts.type), a->ts.kind);
1760 gfc_resolve_rename (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1761 gfc_expr *p2 ATTRIBUTE_UNUSED)
1763 f->ts.type = BT_INTEGER;
1764 f->ts.kind = gfc_default_integer_kind;
1765 f->value.function.name = gfc_get_string (PREFIX ("rename_i%d"), f->ts.kind);
1770 gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
1771 gfc_expr *ncopies ATTRIBUTE_UNUSED)
1773 f->ts.type = BT_CHARACTER;
1774 f->ts.kind = string->ts.kind;
1775 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
1780 gfc_resolve_reshape (gfc_expr *f, gfc_expr *source, gfc_expr *shape,
1781 gfc_expr *pad ATTRIBUTE_UNUSED,
1782 gfc_expr *order ATTRIBUTE_UNUSED)
1788 if (source->ts.type == BT_CHARACTER && source->ref)
1789 gfc_resolve_substring_charlen (source);
1793 gfc_array_size (shape, &rank);
1794 f->rank = mpz_get_si (rank);
1796 switch (source->ts.type)
1802 kind = source->ts.kind;
1816 if (source->ts.type == BT_COMPLEX || source->ts.type == BT_REAL)
1817 f->value.function.name
1818 = gfc_get_string (PREFIX ("reshape_%c%d"),
1819 gfc_type_letter (source->ts.type),
1822 f->value.function.name
1823 = gfc_get_string (PREFIX ("reshape_%d"), source->ts.kind);
1828 f->value.function.name = (source->ts.type == BT_CHARACTER
1829 ? PREFIX ("reshape_char") : PREFIX ("reshape"));
1833 /* TODO: Make this work with a constant ORDER parameter. */
1834 if (shape->expr_type == EXPR_ARRAY
1835 && gfc_is_constant_expr (shape)
1839 f->shape = gfc_get_shape (f->rank);
1840 c = shape->value.constructor;
1841 for (i = 0; i < f->rank; i++)
1843 mpz_init_set (f->shape[i], c->expr->value.integer);
1848 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1849 so many runtime variations. */
1850 if (shape->ts.kind != gfc_index_integer_kind)
1852 gfc_typespec ts = shape->ts;
1853 ts.kind = gfc_index_integer_kind;
1854 gfc_convert_type_warn (shape, &ts, 2, 0);
1856 if (order && order->ts.kind != gfc_index_integer_kind)
1857 gfc_convert_type_warn (order, &shape->ts, 2, 0);
1862 gfc_resolve_rrspacing (gfc_expr *f, gfc_expr *x)
1865 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1870 gfc_resolve_scale (gfc_expr *f, gfc_expr *x, gfc_expr *i ATTRIBUTE_UNUSED)
1873 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
1878 gfc_resolve_scan (gfc_expr *f, gfc_expr *string,
1879 gfc_expr *set ATTRIBUTE_UNUSED,
1880 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
1882 f->ts.type = BT_INTEGER;
1884 f->ts.kind = mpz_get_si (kind->value.integer);
1886 f->ts.kind = gfc_default_integer_kind;
1887 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1892 gfc_resolve_secnds (gfc_expr *t1, gfc_expr *t0)
1895 t1->value.function.name = gfc_get_string (PREFIX ("secnds"));
1900 gfc_resolve_set_exponent (gfc_expr *f, gfc_expr *x,
1901 gfc_expr *i ATTRIBUTE_UNUSED)
1904 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
1909 gfc_resolve_shape (gfc_expr *f, gfc_expr *array)
1911 f->ts.type = BT_INTEGER;
1912 f->ts.kind = gfc_default_integer_kind;
1914 f->shape = gfc_get_shape (1);
1915 mpz_init_set_ui (f->shape[0], array->rank);
1916 f->value.function.name = gfc_get_string (PREFIX ("shape_%d"), f->ts.kind);
1921 gfc_resolve_sign (gfc_expr *f, gfc_expr *a, gfc_expr *b ATTRIBUTE_UNUSED)
1924 f->value.function.name
1925 = gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1930 gfc_resolve_signal (gfc_expr *f, gfc_expr *number, gfc_expr *handler)
1932 f->ts.type = BT_INTEGER;
1933 f->ts.kind = gfc_c_int_kind;
1935 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1936 if (handler->ts.type == BT_INTEGER)
1938 if (handler->ts.kind != gfc_c_int_kind)
1939 gfc_convert_type (handler, &f->ts, 2);
1940 f->value.function.name = gfc_get_string (PREFIX ("signal_func_int"));
1943 f->value.function.name = gfc_get_string (PREFIX ("signal_func"));
1945 if (number->ts.kind != gfc_c_int_kind)
1946 gfc_convert_type (number, &f->ts, 2);
1951 gfc_resolve_sin (gfc_expr *f, gfc_expr *x)
1954 f->value.function.name
1955 = gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1960 gfc_resolve_sinh (gfc_expr *f, gfc_expr *x)
1963 f->value.function.name
1964 = gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1969 gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
1970 gfc_expr *dim ATTRIBUTE_UNUSED, gfc_expr *kind)
1972 f->ts.type = BT_INTEGER;
1974 f->ts.kind = mpz_get_si (kind->value.integer);
1976 f->ts.kind = gfc_default_integer_kind;
1981 gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
1984 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1989 gfc_resolve_spread (gfc_expr *f, gfc_expr *source, gfc_expr *dim,
1992 if (source->ts.type == BT_CHARACTER && source->ref)
1993 gfc_resolve_substring_charlen (source);
1995 if (source->ts.type == BT_CHARACTER)
1996 check_charlen_present (source);
1999 f->rank = source->rank + 1;
2000 if (source->rank == 0)
2001 f->value.function.name = (source->ts.type == BT_CHARACTER
2002 ? PREFIX ("spread_char_scalar")
2003 : PREFIX ("spread_scalar"));
2005 f->value.function.name = (source->ts.type == BT_CHARACTER
2006 ? PREFIX ("spread_char")
2007 : PREFIX ("spread"));
2009 if (dim && gfc_is_constant_expr (dim)
2010 && ncopies && gfc_is_constant_expr (ncopies) && source->shape[0])
2013 idim = mpz_get_ui (dim->value.integer);
2014 f->shape = gfc_get_shape (f->rank);
2015 for (i = 0; i < (idim - 1); i++)
2016 mpz_init_set (f->shape[i], source->shape[i]);
2018 mpz_init_set (f->shape[idim - 1], ncopies->value.integer);
2020 for (i = idim; i < f->rank ; i++)
2021 mpz_init_set (f->shape[i], source->shape[i-1]);
2025 gfc_resolve_dim_arg (dim);
2026 gfc_resolve_index (ncopies, 1);
2031 gfc_resolve_sqrt (gfc_expr *f, gfc_expr *x)
2034 f->value.function.name
2035 = gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2039 /* Resolve the g77 compatibility function STAT AND FSTAT. */
2042 gfc_resolve_stat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2043 gfc_expr *a ATTRIBUTE_UNUSED)
2045 f->ts.type = BT_INTEGER;
2046 f->ts.kind = gfc_default_integer_kind;
2047 f->value.function.name = gfc_get_string (PREFIX ("stat_i%d"), f->ts.kind);
2052 gfc_resolve_lstat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2053 gfc_expr *a ATTRIBUTE_UNUSED)
2055 f->ts.type = BT_INTEGER;
2056 f->ts.kind = gfc_default_integer_kind;
2057 f->value.function.name = gfc_get_string (PREFIX ("lstat_i%d"), f->ts.kind);
2062 gfc_resolve_fstat (gfc_expr *f, gfc_expr *n, gfc_expr *a ATTRIBUTE_UNUSED)
2064 f->ts.type = BT_INTEGER;
2065 f->ts.kind = gfc_default_integer_kind;
2066 if (n->ts.kind != f->ts.kind)
2067 gfc_convert_type (n, &f->ts, 2);
2069 f->value.function.name = gfc_get_string (PREFIX ("fstat_i%d"), f->ts.kind);
2074 gfc_resolve_fgetc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2079 f->ts.type = BT_INTEGER;
2080 f->ts.kind = gfc_c_int_kind;
2081 if (u->ts.kind != gfc_c_int_kind)
2083 ts.type = BT_INTEGER;
2084 ts.kind = gfc_c_int_kind;
2087 gfc_convert_type (u, &ts, 2);
2090 f->value.function.name = gfc_get_string (PREFIX ("fgetc"));
2095 gfc_resolve_fget (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2097 f->ts.type = BT_INTEGER;
2098 f->ts.kind = gfc_c_int_kind;
2099 f->value.function.name = gfc_get_string (PREFIX ("fget"));
2104 gfc_resolve_fputc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2109 f->ts.type = BT_INTEGER;
2110 f->ts.kind = gfc_c_int_kind;
2111 if (u->ts.kind != gfc_c_int_kind)
2113 ts.type = BT_INTEGER;
2114 ts.kind = gfc_c_int_kind;
2117 gfc_convert_type (u, &ts, 2);
2120 f->value.function.name = gfc_get_string (PREFIX ("fputc"));
2125 gfc_resolve_fput (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2127 f->ts.type = BT_INTEGER;
2128 f->ts.kind = gfc_c_int_kind;
2129 f->value.function.name = gfc_get_string (PREFIX ("fput"));
2134 gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
2139 f->ts.type = BT_INTEGER;
2140 f->ts.kind = gfc_index_integer_kind;
2141 if (u->ts.kind != gfc_c_int_kind)
2143 ts.type = BT_INTEGER;
2144 ts.kind = gfc_c_int_kind;
2147 gfc_convert_type (u, &ts, 2);
2150 f->value.function.name = gfc_get_string (PREFIX ("ftell"));
2155 gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2163 if (mask->rank == 0)
2168 resolve_mask_arg (mask);
2175 f->rank = array->rank - 1;
2176 gfc_resolve_dim_arg (dim);
2179 f->value.function.name
2180 = gfc_get_string (PREFIX ("%s_%c%d"), name,
2181 gfc_type_letter (array->ts.type), array->ts.kind);
2186 gfc_resolve_symlnk (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2187 gfc_expr *p2 ATTRIBUTE_UNUSED)
2189 f->ts.type = BT_INTEGER;
2190 f->ts.kind = gfc_default_integer_kind;
2191 f->value.function.name = gfc_get_string (PREFIX ("symlnk_i%d"), f->ts.kind);
2195 /* Resolve the g77 compatibility function SYSTEM. */
2198 gfc_resolve_system (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2200 f->ts.type = BT_INTEGER;
2202 f->value.function.name = gfc_get_string (PREFIX ("system"));
2207 gfc_resolve_tan (gfc_expr *f, gfc_expr *x)
2210 f->value.function.name
2211 = gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2216 gfc_resolve_tanh (gfc_expr *f, gfc_expr *x)
2219 f->value.function.name
2220 = gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2225 gfc_resolve_time (gfc_expr *f)
2227 f->ts.type = BT_INTEGER;
2229 f->value.function.name = gfc_get_string (PREFIX ("time_func"));
2234 gfc_resolve_time8 (gfc_expr *f)
2236 f->ts.type = BT_INTEGER;
2238 f->value.function.name = gfc_get_string (PREFIX ("time8_func"));
2243 gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
2244 gfc_expr *mold, gfc_expr *size)
2246 /* TODO: Make this do something meaningful. */
2247 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
2249 if (mold->ts.type == BT_CHARACTER && !mold->ts.cl->length
2250 && !(mold->expr_type == EXPR_VARIABLE && mold->symtree->n.sym->attr.dummy))
2251 mold->ts.cl->length = gfc_int_expr (mold->value.character.length);
2255 if (size == NULL && mold->rank == 0)
2258 f->value.function.name = transfer0;
2263 f->value.function.name = transfer1;
2264 if (size && gfc_is_constant_expr (size))
2266 f->shape = gfc_get_shape (1);
2267 mpz_init_set (f->shape[0], size->value.integer);
2274 gfc_resolve_transpose (gfc_expr *f, gfc_expr *matrix)
2277 if (matrix->ts.type == BT_CHARACTER && matrix->ref)
2278 gfc_resolve_substring_charlen (matrix);
2284 f->shape = gfc_get_shape (2);
2285 mpz_init_set (f->shape[0], matrix->shape[1]);
2286 mpz_init_set (f->shape[1], matrix->shape[0]);
2289 switch (matrix->ts.kind)
2295 switch (matrix->ts.type)
2299 f->value.function.name
2300 = gfc_get_string (PREFIX ("transpose_%c%d"),
2301 gfc_type_letter (matrix->ts.type),
2307 /* Use the integer routines for real and logical cases. This
2308 assumes they all have the same alignment requirements. */
2309 f->value.function.name
2310 = gfc_get_string (PREFIX ("transpose_i%d"), matrix->ts.kind);
2314 f->value.function.name = PREFIX ("transpose");
2320 f->value.function.name = (matrix->ts.type == BT_CHARACTER
2321 ? PREFIX ("transpose_char")
2322 : PREFIX ("transpose"));
2329 gfc_resolve_trim (gfc_expr *f, gfc_expr *string)
2331 f->ts.type = BT_CHARACTER;
2332 f->ts.kind = string->ts.kind;
2333 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
2338 gfc_resolve_ubound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2340 static char ubound[] = "__ubound";
2342 f->ts.type = BT_INTEGER;
2344 f->ts.kind = mpz_get_si (kind->value.integer);
2346 f->ts.kind = gfc_default_integer_kind;
2351 f->shape = gfc_get_shape (1);
2352 mpz_init_set_ui (f->shape[0], array->rank);
2355 f->value.function.name = ubound;
2359 /* Resolve the g77 compatibility function UMASK. */
2362 gfc_resolve_umask (gfc_expr *f, gfc_expr *n)
2364 f->ts.type = BT_INTEGER;
2365 f->ts.kind = n->ts.kind;
2366 f->value.function.name = gfc_get_string (PREFIX ("umask_i%d"), n->ts.kind);
2370 /* Resolve the g77 compatibility function UNLINK. */
2373 gfc_resolve_unlink (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2375 f->ts.type = BT_INTEGER;
2377 f->value.function.name = gfc_get_string (PREFIX ("unlink"));
2382 gfc_resolve_ttynam (gfc_expr *f, gfc_expr *unit)
2387 f->ts.type = BT_CHARACTER;
2388 f->ts.kind = gfc_default_character_kind;
2390 if (unit->ts.kind != gfc_c_int_kind)
2392 ts.type = BT_INTEGER;
2393 ts.kind = gfc_c_int_kind;
2396 gfc_convert_type (unit, &ts, 2);
2399 f->value.function.name = gfc_get_string (PREFIX ("ttynam"));
2404 gfc_resolve_unpack (gfc_expr *f, gfc_expr *vector, gfc_expr *mask,
2405 gfc_expr *field ATTRIBUTE_UNUSED)
2407 if (vector->ts.type == BT_CHARACTER && vector->ref)
2408 gfc_resolve_substring_charlen (vector);
2411 f->rank = mask->rank;
2412 resolve_mask_arg (mask);
2414 f->value.function.name
2415 = gfc_get_string (PREFIX ("unpack%d%s"), field->rank > 0 ? 1 : 0,
2416 vector->ts.type == BT_CHARACTER ? "_char" : "");
2421 gfc_resolve_verify (gfc_expr *f, gfc_expr *string,
2422 gfc_expr *set ATTRIBUTE_UNUSED,
2423 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
2425 f->ts.type = BT_INTEGER;
2427 f->ts.kind = mpz_get_si (kind->value.integer);
2429 f->ts.kind = gfc_default_integer_kind;
2430 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
2435 gfc_resolve_xor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
2437 f->ts.type = i->ts.type;
2438 f->ts.kind = gfc_kind_max (i, j);
2440 if (i->ts.kind != j->ts.kind)
2442 if (i->ts.kind == gfc_kind_max (i, j))
2443 gfc_convert_type (j, &i->ts, 2);
2445 gfc_convert_type (i, &j->ts, 2);
2448 f->value.function.name
2449 = gfc_get_string ("__xor_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
2453 /* Intrinsic subroutine resolution. */
2456 gfc_resolve_alarm_sub (gfc_code *c)
2459 gfc_expr *seconds, *handler, *status;
2463 seconds = c->ext.actual->expr;
2464 handler = c->ext.actual->next->expr;
2465 status = c->ext.actual->next->next->expr;
2466 ts.type = BT_INTEGER;
2467 ts.kind = gfc_c_int_kind;
2469 /* handler can be either BT_INTEGER or BT_PROCEDURE.
2470 In all cases, the status argument is of default integer kind
2471 (enforced in check.c) so that the function suffix is fixed. */
2472 if (handler->ts.type == BT_INTEGER)
2474 if (handler->ts.kind != gfc_c_int_kind)
2475 gfc_convert_type (handler, &ts, 2);
2476 name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
2477 gfc_default_integer_kind);
2480 name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
2481 gfc_default_integer_kind);
2483 if (seconds->ts.kind != gfc_c_int_kind)
2484 gfc_convert_type (seconds, &ts, 2);
2486 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2490 gfc_resolve_cpu_time (gfc_code *c)
2493 name = gfc_get_string (PREFIX ("cpu_time_%d"), c->ext.actual->expr->ts.kind);
2494 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2499 gfc_resolve_mvbits (gfc_code *c)
2505 /* FROMPOS, LEN and TOPOS are restricted to small values. As such,
2506 they will be converted so that they fit into a C int. */
2507 ts.type = BT_INTEGER;
2508 ts.kind = gfc_c_int_kind;
2509 if (c->ext.actual->next->expr->ts.kind != gfc_c_int_kind)
2510 gfc_convert_type (c->ext.actual->next->expr, &ts, 2);
2511 if (c->ext.actual->next->next->expr->ts.kind != gfc_c_int_kind)
2512 gfc_convert_type (c->ext.actual->next->next->expr, &ts, 2);
2513 if (c->ext.actual->next->next->next->next->expr->ts.kind != gfc_c_int_kind)
2514 gfc_convert_type (c->ext.actual->next->next->next->next->expr, &ts, 2);
2516 /* TO and FROM are guaranteed to have the same kind parameter. */
2517 name = gfc_get_string (PREFIX ("mvbits_i%d"),
2518 c->ext.actual->expr->ts.kind);
2519 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2520 /* Mark as elemental subroutine as this does not happen automatically. */
2521 c->resolved_sym->attr.elemental = 1;
2526 gfc_resolve_random_number (gfc_code *c)
2531 kind = c->ext.actual->expr->ts.kind;
2532 if (c->ext.actual->expr->rank == 0)
2533 name = gfc_get_string (PREFIX ("random_r%d"), kind);
2535 name = gfc_get_string (PREFIX ("arandom_r%d"), kind);
2537 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2542 gfc_resolve_random_seed (gfc_code *c)
2546 name = gfc_get_string (PREFIX ("random_seed_i%d"), gfc_default_integer_kind);
2547 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2552 gfc_resolve_rename_sub (gfc_code *c)
2557 if (c->ext.actual->next->next->expr != NULL)
2558 kind = c->ext.actual->next->next->expr->ts.kind;
2560 kind = gfc_default_integer_kind;
2562 name = gfc_get_string (PREFIX ("rename_i%d_sub"), kind);
2563 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2568 gfc_resolve_kill_sub (gfc_code *c)
2573 if (c->ext.actual->next->next->expr != NULL)
2574 kind = c->ext.actual->next->next->expr->ts.kind;
2576 kind = gfc_default_integer_kind;
2578 name = gfc_get_string (PREFIX ("kill_i%d_sub"), kind);
2579 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2584 gfc_resolve_link_sub (gfc_code *c)
2589 if (c->ext.actual->next->next->expr != NULL)
2590 kind = c->ext.actual->next->next->expr->ts.kind;
2592 kind = gfc_default_integer_kind;
2594 name = gfc_get_string (PREFIX ("link_i%d_sub"), kind);
2595 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2600 gfc_resolve_symlnk_sub (gfc_code *c)
2605 if (c->ext.actual->next->next->expr != NULL)
2606 kind = c->ext.actual->next->next->expr->ts.kind;
2608 kind = gfc_default_integer_kind;
2610 name = gfc_get_string (PREFIX ("symlnk_i%d_sub"), kind);
2611 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2615 /* G77 compatibility subroutines dtime() and etime(). */
2618 gfc_resolve_dtime_sub (gfc_code *c)
2621 name = gfc_get_string (PREFIX ("dtime_sub"));
2622 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2626 gfc_resolve_etime_sub (gfc_code *c)
2629 name = gfc_get_string (PREFIX ("etime_sub"));
2630 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2634 /* G77 compatibility subroutines itime(), idate(), ltime() and gmtime(). */
2637 gfc_resolve_itime (gfc_code *c)
2640 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("itime_i%d"),
2641 gfc_default_integer_kind));
2645 gfc_resolve_idate (gfc_code *c)
2648 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("idate_i%d"),
2649 gfc_default_integer_kind));
2653 gfc_resolve_ltime (gfc_code *c)
2656 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("ltime_i%d"),
2657 gfc_default_integer_kind));
2661 gfc_resolve_gmtime (gfc_code *c)
2664 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("gmtime_i%d"),
2665 gfc_default_integer_kind));
2669 /* G77 compatibility subroutine second(). */
2672 gfc_resolve_second_sub (gfc_code *c)
2675 name = gfc_get_string (PREFIX ("second_sub"));
2676 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2681 gfc_resolve_sleep_sub (gfc_code *c)
2686 if (c->ext.actual->expr != NULL)
2687 kind = c->ext.actual->expr->ts.kind;
2689 kind = gfc_default_integer_kind;
2691 name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
2692 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2696 /* G77 compatibility function srand(). */
2699 gfc_resolve_srand (gfc_code *c)
2702 name = gfc_get_string (PREFIX ("srand"));
2703 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2707 /* Resolve the getarg intrinsic subroutine. */
2710 gfc_resolve_getarg (gfc_code *c)
2714 if (c->ext.actual->expr->ts.kind != gfc_default_integer_kind)
2719 ts.type = BT_INTEGER;
2720 ts.kind = gfc_default_integer_kind;
2722 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2725 name = gfc_get_string (PREFIX ("getarg_i%d"), gfc_default_integer_kind);
2726 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2730 /* Resolve the getcwd intrinsic subroutine. */
2733 gfc_resolve_getcwd_sub (gfc_code *c)
2738 if (c->ext.actual->next->expr != NULL)
2739 kind = c->ext.actual->next->expr->ts.kind;
2741 kind = gfc_default_integer_kind;
2743 name = gfc_get_string (PREFIX ("getcwd_i%d_sub"), kind);
2744 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2748 /* Resolve the get_command intrinsic subroutine. */
2751 gfc_resolve_get_command (gfc_code *c)
2755 kind = gfc_default_integer_kind;
2756 name = gfc_get_string (PREFIX ("get_command_i%d"), kind);
2757 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2761 /* Resolve the get_command_argument intrinsic subroutine. */
2764 gfc_resolve_get_command_argument (gfc_code *c)
2768 kind = gfc_default_integer_kind;
2769 name = gfc_get_string (PREFIX ("get_command_argument_i%d"), kind);
2770 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2774 /* Resolve the get_environment_variable intrinsic subroutine. */
2777 gfc_resolve_get_environment_variable (gfc_code *code)
2781 kind = gfc_default_integer_kind;
2782 name = gfc_get_string (PREFIX ("get_environment_variable_i%d"), kind);
2783 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2788 gfc_resolve_signal_sub (gfc_code *c)
2791 gfc_expr *number, *handler, *status;
2795 number = c->ext.actual->expr;
2796 handler = c->ext.actual->next->expr;
2797 status = c->ext.actual->next->next->expr;
2798 ts.type = BT_INTEGER;
2799 ts.kind = gfc_c_int_kind;
2801 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2802 if (handler->ts.type == BT_INTEGER)
2804 if (handler->ts.kind != gfc_c_int_kind)
2805 gfc_convert_type (handler, &ts, 2);
2806 name = gfc_get_string (PREFIX ("signal_sub_int"));
2809 name = gfc_get_string (PREFIX ("signal_sub"));
2811 if (number->ts.kind != gfc_c_int_kind)
2812 gfc_convert_type (number, &ts, 2);
2813 if (status != NULL && status->ts.kind != gfc_c_int_kind)
2814 gfc_convert_type (status, &ts, 2);
2816 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2820 /* Resolve the SYSTEM intrinsic subroutine. */
2823 gfc_resolve_system_sub (gfc_code *c)
2826 name = gfc_get_string (PREFIX ("system_sub"));
2827 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2831 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2834 gfc_resolve_system_clock (gfc_code *c)
2839 if (c->ext.actual->expr != NULL)
2840 kind = c->ext.actual->expr->ts.kind;
2841 else if (c->ext.actual->next->expr != NULL)
2842 kind = c->ext.actual->next->expr->ts.kind;
2843 else if (c->ext.actual->next->next->expr != NULL)
2844 kind = c->ext.actual->next->next->expr->ts.kind;
2846 kind = gfc_default_integer_kind;
2848 name = gfc_get_string (PREFIX ("system_clock_%d"), kind);
2849 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2853 /* Resolve the EXIT intrinsic subroutine. */
2856 gfc_resolve_exit (gfc_code *c)
2863 /* The STATUS argument has to be of default kind. If it is not,
2865 ts.type = BT_INTEGER;
2866 ts.kind = gfc_default_integer_kind;
2867 n = c->ext.actual->expr;
2868 if (n != NULL && n->ts.kind != ts.kind)
2869 gfc_convert_type (n, &ts, 2);
2871 name = gfc_get_string (PREFIX ("exit_i%d"), ts.kind);
2872 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2876 /* Resolve the FLUSH intrinsic subroutine. */
2879 gfc_resolve_flush (gfc_code *c)
2886 ts.type = BT_INTEGER;
2887 ts.kind = gfc_default_integer_kind;
2888 n = c->ext.actual->expr;
2889 if (n != NULL && n->ts.kind != ts.kind)
2890 gfc_convert_type (n, &ts, 2);
2892 name = gfc_get_string (PREFIX ("flush_i%d"), ts.kind);
2893 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2898 gfc_resolve_free (gfc_code *c)
2904 ts.type = BT_INTEGER;
2905 ts.kind = gfc_index_integer_kind;
2906 n = c->ext.actual->expr;
2907 if (n->ts.kind != ts.kind)
2908 gfc_convert_type (n, &ts, 2);
2910 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("free"));
2915 gfc_resolve_ctime_sub (gfc_code *c)
2920 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2921 if (c->ext.actual->expr->ts.kind != 8)
2923 ts.type = BT_INTEGER;
2927 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2930 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ctime_sub"));
2935 gfc_resolve_fdate_sub (gfc_code *c)
2937 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2942 gfc_resolve_gerror (gfc_code *c)
2944 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2949 gfc_resolve_getlog (gfc_code *c)
2951 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2956 gfc_resolve_hostnm_sub (gfc_code *c)
2961 if (c->ext.actual->next->expr != NULL)
2962 kind = c->ext.actual->next->expr->ts.kind;
2964 kind = gfc_default_integer_kind;
2966 name = gfc_get_string (PREFIX ("hostnm_i%d_sub"), kind);
2967 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2972 gfc_resolve_perror (gfc_code *c)
2974 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2977 /* Resolve the STAT and FSTAT intrinsic subroutines. */
2980 gfc_resolve_stat_sub (gfc_code *c)
2983 name = gfc_get_string (PREFIX ("stat_i%d_sub"), gfc_default_integer_kind);
2984 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2989 gfc_resolve_lstat_sub (gfc_code *c)
2992 name = gfc_get_string (PREFIX ("lstat_i%d_sub"), gfc_default_integer_kind);
2993 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2998 gfc_resolve_fstat_sub (gfc_code *c)
3004 u = c->ext.actual->expr;
3005 ts = &c->ext.actual->next->expr->ts;
3006 if (u->ts.kind != ts->kind)
3007 gfc_convert_type (u, ts, 2);
3008 name = gfc_get_string (PREFIX ("fstat_i%d_sub"), ts->kind);
3009 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3014 gfc_resolve_fgetc_sub (gfc_code *c)
3021 u = c->ext.actual->expr;
3022 st = c->ext.actual->next->next->expr;
3024 if (u->ts.kind != gfc_c_int_kind)
3026 ts.type = BT_INTEGER;
3027 ts.kind = gfc_c_int_kind;
3030 gfc_convert_type (u, &ts, 2);
3034 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), st->ts.kind);
3036 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), gfc_default_integer_kind);
3038 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3043 gfc_resolve_fget_sub (gfc_code *c)
3048 st = c->ext.actual->next->expr;
3050 name = gfc_get_string (PREFIX ("fget_i%d_sub"), st->ts.kind);
3052 name = gfc_get_string (PREFIX ("fget_i%d_sub"), gfc_default_integer_kind);
3054 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3059 gfc_resolve_fputc_sub (gfc_code *c)
3066 u = c->ext.actual->expr;
3067 st = c->ext.actual->next->next->expr;
3069 if (u->ts.kind != gfc_c_int_kind)
3071 ts.type = BT_INTEGER;
3072 ts.kind = gfc_c_int_kind;
3075 gfc_convert_type (u, &ts, 2);
3079 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), st->ts.kind);
3081 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), gfc_default_integer_kind);
3083 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3088 gfc_resolve_fput_sub (gfc_code *c)
3093 st = c->ext.actual->next->expr;
3095 name = gfc_get_string (PREFIX ("fput_i%d_sub"), st->ts.kind);
3097 name = gfc_get_string (PREFIX ("fput_i%d_sub"), gfc_default_integer_kind);
3099 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3104 gfc_resolve_fseek_sub (gfc_code *c)
3113 unit = c->ext.actual->expr;
3114 offset = c->ext.actual->next->expr;
3115 whence = c->ext.actual->next->next->expr;
3116 status = c->ext.actual->next->next->next->expr;
3118 if (unit->ts.kind != gfc_c_int_kind)
3120 ts.type = BT_INTEGER;
3121 ts.kind = gfc_c_int_kind;
3124 gfc_convert_type (unit, &ts, 2);
3127 if (offset->ts.kind != gfc_intio_kind)
3129 ts.type = BT_INTEGER;
3130 ts.kind = gfc_intio_kind;
3133 gfc_convert_type (offset, &ts, 2);
3136 if (whence->ts.kind != gfc_c_int_kind)
3138 ts.type = BT_INTEGER;
3139 ts.kind = gfc_c_int_kind;
3142 gfc_convert_type (whence, &ts, 2);
3145 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub"));
3149 gfc_resolve_ftell_sub (gfc_code *c)
3157 unit = c->ext.actual->expr;
3158 offset = c->ext.actual->next->expr;
3160 if (unit->ts.kind != gfc_c_int_kind)
3162 ts.type = BT_INTEGER;
3163 ts.kind = gfc_c_int_kind;
3166 gfc_convert_type (unit, &ts, 2);
3169 name = gfc_get_string (PREFIX ("ftell_i%d_sub"), offset->ts.kind);
3170 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3175 gfc_resolve_ttynam_sub (gfc_code *c)
3180 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
3182 ts.type = BT_INTEGER;
3183 ts.kind = gfc_c_int_kind;
3186 gfc_convert_type (c->ext.actual->expr, &ts, 2);
3189 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ttynam_sub"));
3193 /* Resolve the UMASK intrinsic subroutine. */
3196 gfc_resolve_umask_sub (gfc_code *c)
3201 if (c->ext.actual->next->expr != NULL)
3202 kind = c->ext.actual->next->expr->ts.kind;
3204 kind = gfc_default_integer_kind;
3206 name = gfc_get_string (PREFIX ("umask_i%d_sub"), kind);
3207 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3210 /* Resolve the UNLINK intrinsic subroutine. */
3213 gfc_resolve_unlink_sub (gfc_code *c)
3218 if (c->ext.actual->next->expr != NULL)
3219 kind = c->ext.actual->next->expr->ts.kind;
3221 kind = gfc_default_integer_kind;
3223 name = gfc_get_string (PREFIX ("unlink_i%d_sub"), kind);
3224 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);