1 /* Intrinsic function resolution.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
24 /* Assign name and types to intrinsic procedures. For functions, the
25 first argument to a resolution function is an expression pointer to
26 the original function node and the rest are pointers to the
27 arguments of the function call. For subroutines, a pointer to the
28 code node is passed. The result type and library subroutine name
29 are generally set according to the function arguments. */
33 #include "coretypes.h"
36 #include "intrinsic.h"
39 /* Given printf-like arguments, return a stable version of the result string.
41 We already have a working, optimized string hashing table in the form of
42 the identifier table. Reusing this table is likely not to be wasted,
43 since if the function name makes it to the gimple output of the frontend,
44 we'll have to create the identifier anyway. */
47 gfc_get_string (const char *format, ...)
53 va_start (ap, format);
54 vsnprintf (temp_name, sizeof(temp_name), format, ap);
56 temp_name[sizeof(temp_name)-1] = 0;
58 ident = get_identifier (temp_name);
59 return IDENTIFIER_POINTER (ident);
62 /* MERGE and SPREAD need to have source charlen's present for passing
63 to the result expression. */
65 check_charlen_present (gfc_expr *source)
67 if (source->expr_type == EXPR_CONSTANT && source->ts.cl == NULL)
69 source->ts.cl = gfc_get_charlen ();
70 source->ts.cl->next = gfc_current_ns->cl_list;
71 gfc_current_ns->cl_list = source->ts.cl;
72 source->ts.cl->length = gfc_int_expr (source->value.character.length);
77 /********************** Resolution functions **********************/
81 gfc_resolve_abs (gfc_expr * f, gfc_expr * a)
84 if (f->ts.type == BT_COMPLEX)
87 f->value.function.name =
88 gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
93 gfc_resolve_acos (gfc_expr * f, gfc_expr * x)
96 f->value.function.name =
97 gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
102 gfc_resolve_acosh (gfc_expr * f, gfc_expr * x)
105 f->value.function.name =
106 gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
111 gfc_resolve_aimag (gfc_expr * f, gfc_expr * x)
113 f->ts.type = BT_REAL;
114 f->ts.kind = x->ts.kind;
115 f->value.function.name =
116 gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
121 gfc_resolve_and (gfc_expr * f, gfc_expr * i, gfc_expr * j)
123 f->ts.type = i->ts.type;
124 f->ts.kind = gfc_kind_max (i,j);
126 if (i->ts.kind != j->ts.kind)
128 if (i->ts.kind == gfc_kind_max (i,j))
129 gfc_convert_type(j, &i->ts, 2);
131 gfc_convert_type(i, &j->ts, 2);
134 f->value.function.name = gfc_get_string ("__and_%c%d",
135 gfc_type_letter (i->ts.type),
141 gfc_resolve_aint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
145 f->ts.type = a->ts.type;
146 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
148 if (a->ts.kind != f->ts.kind)
150 ts.type = f->ts.type;
151 ts.kind = f->ts.kind;
152 gfc_convert_type (a, &ts, 2);
154 /* The resolved name is only used for specific intrinsics where
155 the return kind is the same as the arg kind. */
156 f->value.function.name =
157 gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
162 gfc_resolve_dint (gfc_expr * f, gfc_expr * a)
164 gfc_resolve_aint (f, a, NULL);
169 gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
175 gfc_resolve_dim_arg (dim);
176 f->rank = mask->rank - 1;
177 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
180 f->value.function.name =
181 gfc_get_string (PREFIX("all_%c%d"), gfc_type_letter (mask->ts.type),
187 gfc_resolve_anint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
191 f->ts.type = a->ts.type;
192 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
194 if (a->ts.kind != f->ts.kind)
196 ts.type = f->ts.type;
197 ts.kind = f->ts.kind;
198 gfc_convert_type (a, &ts, 2);
201 /* The resolved name is only used for specific intrinsics where
202 the return kind is the same as the arg kind. */
203 f->value.function.name =
204 gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
209 gfc_resolve_dnint (gfc_expr * f, gfc_expr * a)
211 gfc_resolve_anint (f, a, NULL);
216 gfc_resolve_any (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
222 gfc_resolve_dim_arg (dim);
223 f->rank = mask->rank - 1;
224 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
227 f->value.function.name =
228 gfc_get_string (PREFIX("any_%c%d"), gfc_type_letter (mask->ts.type),
234 gfc_resolve_asin (gfc_expr * f, gfc_expr * x)
237 f->value.function.name =
238 gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
242 gfc_resolve_asinh (gfc_expr * f, gfc_expr * x)
245 f->value.function.name =
246 gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
250 gfc_resolve_atan (gfc_expr * f, gfc_expr * x)
253 f->value.function.name =
254 gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
258 gfc_resolve_atanh (gfc_expr * f, gfc_expr * x)
261 f->value.function.name =
262 gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
266 gfc_resolve_atan2 (gfc_expr * f, gfc_expr * x,
267 gfc_expr * y ATTRIBUTE_UNUSED)
270 f->value.function.name =
271 gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
275 /* Resolve the BESYN and BESJN intrinsics. */
278 gfc_resolve_besn (gfc_expr * f, gfc_expr * n, gfc_expr * x)
283 if (n->ts.kind != gfc_c_int_kind)
285 ts.type = BT_INTEGER;
286 ts.kind = gfc_c_int_kind;
287 gfc_convert_type (n, &ts, 2);
289 f->value.function.name = gfc_get_string ("<intrinsic>");
294 gfc_resolve_btest (gfc_expr * f, gfc_expr * i, gfc_expr * pos)
296 f->ts.type = BT_LOGICAL;
297 f->ts.kind = gfc_default_logical_kind;
299 f->value.function.name = gfc_get_string ("__btest_%d_%d", i->ts.kind,
305 gfc_resolve_ceiling (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
307 f->ts.type = BT_INTEGER;
308 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
309 : mpz_get_si (kind->value.integer);
311 f->value.function.name =
312 gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
313 gfc_type_letter (a->ts.type), a->ts.kind);
318 gfc_resolve_char (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
320 f->ts.type = BT_CHARACTER;
321 f->ts.kind = (kind == NULL) ? gfc_default_character_kind
322 : mpz_get_si (kind->value.integer);
324 f->value.function.name =
325 gfc_get_string ("__char_%d_%c%d", f->ts.kind,
326 gfc_type_letter (a->ts.type), a->ts.kind);
331 gfc_resolve_chdir (gfc_expr * f, gfc_expr * d ATTRIBUTE_UNUSED)
333 f->ts.type = BT_INTEGER;
334 f->ts.kind = gfc_default_integer_kind;
335 f->value.function.name = gfc_get_string (PREFIX("chdir_i%d"), f->ts.kind);
340 gfc_resolve_chdir_sub (gfc_code * c)
345 if (c->ext.actual->next->expr != NULL)
346 kind = c->ext.actual->next->expr->ts.kind;
348 kind = gfc_default_integer_kind;
350 name = gfc_get_string (PREFIX("chdir_i%d_sub"), kind);
351 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
356 gfc_resolve_cmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y, gfc_expr * kind)
358 f->ts.type = BT_COMPLEX;
359 f->ts.kind = (kind == NULL) ? gfc_default_real_kind
360 : mpz_get_si (kind->value.integer);
363 f->value.function.name =
364 gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
365 gfc_type_letter (x->ts.type), x->ts.kind);
367 f->value.function.name =
368 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
369 gfc_type_letter (x->ts.type), x->ts.kind,
370 gfc_type_letter (y->ts.type), y->ts.kind);
374 gfc_resolve_dcmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y)
376 gfc_resolve_cmplx (f, x, y, gfc_int_expr (gfc_default_double_kind));
380 gfc_resolve_complex (gfc_expr * f, gfc_expr * x, gfc_expr * y)
384 if (x->ts.type == BT_INTEGER)
386 if (y->ts.type == BT_INTEGER)
387 kind = gfc_default_real_kind;
393 if (y->ts.type == BT_REAL)
394 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
399 f->ts.type = BT_COMPLEX;
402 f->value.function.name =
403 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
404 gfc_type_letter (x->ts.type), x->ts.kind,
405 gfc_type_letter (y->ts.type), y->ts.kind);
410 gfc_resolve_conjg (gfc_expr * f, gfc_expr * x)
413 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
418 gfc_resolve_cos (gfc_expr * f, gfc_expr * x)
421 f->value.function.name =
422 gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
427 gfc_resolve_cosh (gfc_expr * f, gfc_expr * x)
430 f->value.function.name =
431 gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
436 gfc_resolve_count (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
438 f->ts.type = BT_INTEGER;
439 f->ts.kind = gfc_default_integer_kind;
443 f->rank = mask->rank - 1;
444 gfc_resolve_dim_arg (dim);
445 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
448 f->value.function.name =
449 gfc_get_string (PREFIX("count_%d_%c%d"), f->ts.kind,
450 gfc_type_letter (mask->ts.type), mask->ts.kind);
455 gfc_resolve_cshift (gfc_expr * f, gfc_expr * array,
462 f->rank = array->rank;
463 f->shape = gfc_copy_shape (array->shape, array->rank);
470 /* Convert shift to at least gfc_default_integer_kind, so we don't need
471 kind=1 and kind=2 versions of the library functions. */
472 if (shift->ts.kind < gfc_default_integer_kind)
475 ts.type = BT_INTEGER;
476 ts.kind = gfc_default_integer_kind;
477 gfc_convert_type_warn (shift, &ts, 2, 0);
482 gfc_resolve_dim_arg (dim);
483 /* Convert dim to shift's kind, so we don't need so many variations. */
484 if (dim->ts.kind != shift->ts.kind)
485 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
487 f->value.function.name =
488 gfc_get_string (PREFIX("cshift%d_%d%s"), n, shift->ts.kind,
489 array->ts.type == BT_CHARACTER ? "_char" : "");
494 gfc_resolve_ctime (gfc_expr * f, gfc_expr * time)
498 f->ts.type = BT_CHARACTER;
499 f->ts.kind = gfc_default_character_kind;
501 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
502 if (time->ts.kind != 8)
504 ts.type = BT_INTEGER;
508 gfc_convert_type (time, &ts, 2);
511 f->value.function.name = gfc_get_string (PREFIX("ctime"));
516 gfc_resolve_dble (gfc_expr * f, gfc_expr * a)
518 f->ts.type = BT_REAL;
519 f->ts.kind = gfc_default_double_kind;
520 f->value.function.name =
521 gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
526 gfc_resolve_dim (gfc_expr * f, gfc_expr * x,
527 gfc_expr * y ATTRIBUTE_UNUSED)
530 f->value.function.name =
531 gfc_get_string ("__dim_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
536 gfc_resolve_dot_product (gfc_expr * f, gfc_expr * a, gfc_expr * b)
540 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
542 f->ts.type = BT_LOGICAL;
543 f->ts.kind = gfc_default_logical_kind;
547 temp.expr_type = EXPR_OP;
548 gfc_clear_ts (&temp.ts);
549 temp.value.op.operator = INTRINSIC_NONE;
550 temp.value.op.op1 = a;
551 temp.value.op.op2 = b;
552 gfc_type_convert_binary (&temp);
556 f->value.function.name =
557 gfc_get_string (PREFIX("dot_product_%c%d"), gfc_type_letter (f->ts.type),
563 gfc_resolve_dprod (gfc_expr * f,
564 gfc_expr * a ATTRIBUTE_UNUSED,
565 gfc_expr * b ATTRIBUTE_UNUSED)
567 f->ts.kind = gfc_default_double_kind;
568 f->ts.type = BT_REAL;
570 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
575 gfc_resolve_eoshift (gfc_expr * f, gfc_expr * array,
583 f->rank = array->rank;
584 f->shape = gfc_copy_shape (array->shape, array->rank);
589 if (boundary && boundary->rank > 0)
592 /* Convert shift to at least gfc_default_integer_kind, so we don't need
593 kind=1 and kind=2 versions of the library functions. */
594 if (shift->ts.kind < gfc_default_integer_kind)
597 ts.type = BT_INTEGER;
598 ts.kind = gfc_default_integer_kind;
599 gfc_convert_type_warn (shift, &ts, 2, 0);
604 gfc_resolve_dim_arg (dim);
605 /* Convert dim to shift's kind, so we don't need so many variations. */
606 if (dim->ts.kind != shift->ts.kind)
607 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
610 f->value.function.name =
611 gfc_get_string (PREFIX("eoshift%d_%d%s"), n, shift->ts.kind,
612 array->ts.type == BT_CHARACTER ? "_char" : "");
617 gfc_resolve_exp (gfc_expr * f, gfc_expr * x)
620 f->value.function.name =
621 gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
626 gfc_resolve_exponent (gfc_expr * f, gfc_expr * x)
628 f->ts.type = BT_INTEGER;
629 f->ts.kind = gfc_default_integer_kind;
631 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
636 gfc_resolve_fdate (gfc_expr * f)
638 f->ts.type = BT_CHARACTER;
639 f->ts.kind = gfc_default_character_kind;
640 f->value.function.name = gfc_get_string (PREFIX("fdate"));
645 gfc_resolve_floor (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
647 f->ts.type = BT_INTEGER;
648 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
649 : mpz_get_si (kind->value.integer);
651 f->value.function.name =
652 gfc_get_string ("__floor%d_%c%d", f->ts.kind,
653 gfc_type_letter (a->ts.type), a->ts.kind);
658 gfc_resolve_fnum (gfc_expr * f, gfc_expr * n)
660 f->ts.type = BT_INTEGER;
661 f->ts.kind = gfc_default_integer_kind;
662 if (n->ts.kind != f->ts.kind)
663 gfc_convert_type (n, &f->ts, 2);
664 f->value.function.name = gfc_get_string (PREFIX("fnum_i%d"), f->ts.kind);
669 gfc_resolve_fraction (gfc_expr * f, gfc_expr * x)
672 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
676 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
679 gfc_resolve_g77_math1 (gfc_expr * f, gfc_expr * x)
682 f->value.function.name = gfc_get_string ("<intrinsic>");
687 gfc_resolve_getcwd (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
689 f->ts.type = BT_INTEGER;
691 f->value.function.name = gfc_get_string (PREFIX("getcwd"));
696 gfc_resolve_getgid (gfc_expr * f)
698 f->ts.type = BT_INTEGER;
700 f->value.function.name = gfc_get_string (PREFIX("getgid"));
705 gfc_resolve_getpid (gfc_expr * f)
707 f->ts.type = BT_INTEGER;
709 f->value.function.name = gfc_get_string (PREFIX("getpid"));
714 gfc_resolve_getuid (gfc_expr * f)
716 f->ts.type = BT_INTEGER;
718 f->value.function.name = gfc_get_string (PREFIX("getuid"));
722 gfc_resolve_hostnm (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
724 f->ts.type = BT_INTEGER;
726 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
730 gfc_resolve_iand (gfc_expr * f, gfc_expr * i, gfc_expr * j)
732 /* If the kind of i and j are different, then g77 cross-promoted the
733 kinds to the largest value. The Fortran 95 standard requires the
735 if (i->ts.kind != j->ts.kind)
737 if (i->ts.kind == gfc_kind_max (i,j))
738 gfc_convert_type(j, &i->ts, 2);
740 gfc_convert_type(i, &j->ts, 2);
744 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
749 gfc_resolve_ibclr (gfc_expr * f, gfc_expr * i, gfc_expr * pos ATTRIBUTE_UNUSED)
752 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
757 gfc_resolve_ibits (gfc_expr * f, gfc_expr * i,
758 gfc_expr * pos ATTRIBUTE_UNUSED,
759 gfc_expr * len ATTRIBUTE_UNUSED)
762 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
767 gfc_resolve_ibset (gfc_expr * f, gfc_expr * i,
768 gfc_expr * pos ATTRIBUTE_UNUSED)
771 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
776 gfc_resolve_ichar (gfc_expr * f, gfc_expr * c)
778 f->ts.type = BT_INTEGER;
779 f->ts.kind = gfc_default_integer_kind;
781 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
786 gfc_resolve_idnint (gfc_expr * f, gfc_expr * a)
788 gfc_resolve_nint (f, a, NULL);
793 gfc_resolve_ierrno (gfc_expr * f)
795 f->ts.type = BT_INTEGER;
796 f->ts.kind = gfc_default_integer_kind;
797 f->value.function.name = gfc_get_string (PREFIX("ierrno_i%d"), f->ts.kind);
802 gfc_resolve_ieor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
804 /* If the kind of i and j are different, then g77 cross-promoted the
805 kinds to the largest value. The Fortran 95 standard requires the
807 if (i->ts.kind != j->ts.kind)
809 if (i->ts.kind == gfc_kind_max (i,j))
810 gfc_convert_type(j, &i->ts, 2);
812 gfc_convert_type(i, &j->ts, 2);
816 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
821 gfc_resolve_ior (gfc_expr * f, gfc_expr * i, gfc_expr * j)
823 /* If the kind of i and j are different, then g77 cross-promoted the
824 kinds to the largest value. The Fortran 95 standard requires the
826 if (i->ts.kind != j->ts.kind)
828 if (i->ts.kind == gfc_kind_max (i,j))
829 gfc_convert_type(j, &i->ts, 2);
831 gfc_convert_type(i, &j->ts, 2);
835 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
840 gfc_resolve_int (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
842 f->ts.type = BT_INTEGER;
843 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
844 : mpz_get_si (kind->value.integer);
846 f->value.function.name =
847 gfc_get_string ("__int_%d_%c%d", f->ts.kind, gfc_type_letter (a->ts.type),
853 gfc_resolve_isatty (gfc_expr * f, gfc_expr * u)
857 f->ts.type = BT_LOGICAL;
858 f->ts.kind = gfc_default_integer_kind;
859 if (u->ts.kind != gfc_c_int_kind)
861 ts.type = BT_INTEGER;
862 ts.kind = gfc_c_int_kind;
865 gfc_convert_type (u, &ts, 2);
868 f->value.function.name = gfc_get_string (PREFIX("isatty_l%d"), f->ts.kind);
873 gfc_resolve_ishft (gfc_expr * f, gfc_expr * i, gfc_expr * shift)
876 f->value.function.name =
877 gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
882 gfc_resolve_ishftc (gfc_expr * f, gfc_expr * i, gfc_expr * shift,
887 s_kind = (size == NULL) ? gfc_default_integer_kind : shift->ts.kind;
890 f->value.function.name =
891 gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
896 gfc_resolve_kill (gfc_expr * f, ATTRIBUTE_UNUSED gfc_expr * p,
897 ATTRIBUTE_UNUSED gfc_expr * s)
899 f->ts.type = BT_INTEGER;
900 f->ts.kind = gfc_default_integer_kind;
902 f->value.function.name = gfc_get_string (PREFIX("kill_i%d"), f->ts.kind);
907 gfc_resolve_lbound (gfc_expr * f, gfc_expr * array,
910 static char lbound[] = "__lbound";
912 f->ts.type = BT_INTEGER;
913 f->ts.kind = gfc_default_integer_kind;
918 f->shape = gfc_get_shape (1);
919 mpz_init_set_ui (f->shape[0], array->rank);
922 f->value.function.name = lbound;
927 gfc_resolve_len (gfc_expr * f, gfc_expr * string)
929 f->ts.type = BT_INTEGER;
930 f->ts.kind = gfc_default_integer_kind;
931 f->value.function.name = gfc_get_string ("__len_%d", string->ts.kind);
936 gfc_resolve_len_trim (gfc_expr * f, gfc_expr * string)
938 f->ts.type = BT_INTEGER;
939 f->ts.kind = gfc_default_integer_kind;
940 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
945 gfc_resolve_link (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
946 gfc_expr * p2 ATTRIBUTE_UNUSED)
948 f->ts.type = BT_INTEGER;
949 f->ts.kind = gfc_default_integer_kind;
950 f->value.function.name = gfc_get_string (PREFIX("link_i%d"), f->ts.kind);
955 gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
957 f->ts.type= BT_INTEGER;
958 f->ts.kind = gfc_index_integer_kind;
959 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
964 gfc_resolve_log (gfc_expr * f, gfc_expr * x)
967 f->value.function.name =
968 gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
973 gfc_resolve_log10 (gfc_expr * f, gfc_expr * x)
976 f->value.function.name =
977 gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
982 gfc_resolve_logical (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
984 f->ts.type = BT_LOGICAL;
985 f->ts.kind = (kind == NULL) ? gfc_default_logical_kind
986 : mpz_get_si (kind->value.integer);
989 f->value.function.name =
990 gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
991 gfc_type_letter (a->ts.type), a->ts.kind);
996 gfc_resolve_malloc (gfc_expr * f, gfc_expr * size)
998 if (size->ts.kind < gfc_index_integer_kind)
1002 ts.type = BT_INTEGER;
1003 ts.kind = gfc_index_integer_kind;
1004 gfc_convert_type_warn (size, &ts, 2, 0);
1007 f->ts.type = BT_INTEGER;
1008 f->ts.kind = gfc_index_integer_kind;
1009 f->value.function.name = gfc_get_string (PREFIX("malloc"));
1014 gfc_resolve_matmul (gfc_expr * f, gfc_expr * a, gfc_expr * b)
1018 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1020 f->ts.type = BT_LOGICAL;
1021 f->ts.kind = gfc_default_logical_kind;
1025 temp.expr_type = EXPR_OP;
1026 gfc_clear_ts (&temp.ts);
1027 temp.value.op.operator = INTRINSIC_NONE;
1028 temp.value.op.op1 = a;
1029 temp.value.op.op2 = b;
1030 gfc_type_convert_binary (&temp);
1034 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1036 f->value.function.name =
1037 gfc_get_string (PREFIX("matmul_%c%d"), gfc_type_letter (f->ts.type),
1043 gfc_resolve_minmax (const char * name, gfc_expr * f, gfc_actual_arglist * args)
1045 gfc_actual_arglist *a;
1047 f->ts.type = args->expr->ts.type;
1048 f->ts.kind = args->expr->ts.kind;
1049 /* Find the largest type kind. */
1050 for (a = args->next; a; a = a->next)
1052 if (a->expr->ts.kind > f->ts.kind)
1053 f->ts.kind = a->expr->ts.kind;
1056 /* Convert all parameters to the required kind. */
1057 for (a = args; a; a = a->next)
1059 if (a->expr->ts.kind != f->ts.kind)
1060 gfc_convert_type (a->expr, &f->ts, 2);
1063 f->value.function.name =
1064 gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1069 gfc_resolve_max (gfc_expr * f, gfc_actual_arglist * args)
1071 gfc_resolve_minmax ("__max_%c%d", f, args);
1076 gfc_resolve_maxloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1081 f->ts.type = BT_INTEGER;
1082 f->ts.kind = gfc_default_integer_kind;
1088 f->rank = array->rank - 1;
1089 gfc_resolve_dim_arg (dim);
1092 name = mask ? "mmaxloc" : "maxloc";
1093 f->value.function.name =
1094 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1095 gfc_type_letter (array->ts.type), array->ts.kind);
1100 gfc_resolve_maxval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1107 f->rank = array->rank - 1;
1108 gfc_resolve_dim_arg (dim);
1111 f->value.function.name =
1112 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mmaxval" : "maxval",
1113 gfc_type_letter (array->ts.type), array->ts.kind);
1118 gfc_resolve_merge (gfc_expr * f, gfc_expr * tsource,
1119 gfc_expr * fsource ATTRIBUTE_UNUSED,
1120 gfc_expr * mask ATTRIBUTE_UNUSED)
1122 if (tsource->ts.type == BT_CHARACTER)
1123 check_charlen_present (tsource);
1125 f->ts = tsource->ts;
1126 f->value.function.name =
1127 gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1133 gfc_resolve_min (gfc_expr * f, gfc_actual_arglist * args)
1135 gfc_resolve_minmax ("__min_%c%d", f, args);
1140 gfc_resolve_minloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1145 f->ts.type = BT_INTEGER;
1146 f->ts.kind = gfc_default_integer_kind;
1152 f->rank = array->rank - 1;
1153 gfc_resolve_dim_arg (dim);
1156 name = mask ? "mminloc" : "minloc";
1157 f->value.function.name =
1158 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1159 gfc_type_letter (array->ts.type), array->ts.kind);
1164 gfc_resolve_minval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1171 f->rank = array->rank - 1;
1172 gfc_resolve_dim_arg (dim);
1175 f->value.function.name =
1176 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mminval" : "minval",
1177 gfc_type_letter (array->ts.type), array->ts.kind);
1182 gfc_resolve_mod (gfc_expr * f, gfc_expr * a,
1183 gfc_expr * p ATTRIBUTE_UNUSED)
1186 f->value.function.name =
1187 gfc_get_string ("__mod_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1192 gfc_resolve_modulo (gfc_expr * f, gfc_expr * a,
1193 gfc_expr * p ATTRIBUTE_UNUSED)
1196 f->value.function.name =
1197 gfc_get_string ("__modulo_%c%d", gfc_type_letter (a->ts.type),
1202 gfc_resolve_nearest (gfc_expr * f, gfc_expr * a, gfc_expr *p ATTRIBUTE_UNUSED)
1205 f->value.function.name =
1206 gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1211 gfc_resolve_nint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1213 f->ts.type = BT_INTEGER;
1214 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
1215 : mpz_get_si (kind->value.integer);
1217 f->value.function.name =
1218 gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1223 gfc_resolve_not (gfc_expr * f, gfc_expr * i)
1226 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1231 gfc_resolve_or (gfc_expr * f, gfc_expr * i, gfc_expr * j)
1233 f->ts.type = i->ts.type;
1234 f->ts.kind = gfc_kind_max (i,j);
1236 if (i->ts.kind != j->ts.kind)
1238 if (i->ts.kind == gfc_kind_max (i,j))
1239 gfc_convert_type(j, &i->ts, 2);
1241 gfc_convert_type(i, &j->ts, 2);
1244 f->value.function.name = gfc_get_string ("__or_%c%d",
1245 gfc_type_letter (i->ts.type),
1251 gfc_resolve_pack (gfc_expr * f, gfc_expr * array, gfc_expr * mask,
1252 gfc_expr * vector ATTRIBUTE_UNUSED)
1257 if (mask->rank != 0)
1258 f->value.function.name = (array->ts.type == BT_CHARACTER
1259 ? PREFIX("pack_char")
1263 /* We convert mask to default logical only in the scalar case.
1264 In the array case we can simply read the array as if it were
1265 of type default logical. */
1266 if (mask->ts.kind != gfc_default_logical_kind)
1270 ts.type = BT_LOGICAL;
1271 ts.kind = gfc_default_logical_kind;
1272 gfc_convert_type (mask, &ts, 2);
1275 f->value.function.name = (array->ts.type == BT_CHARACTER
1276 ? PREFIX("pack_s_char")
1277 : PREFIX("pack_s"));
1283 gfc_resolve_product (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1290 f->rank = array->rank - 1;
1291 gfc_resolve_dim_arg (dim);
1294 f->value.function.name =
1295 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mproduct" : "product",
1296 gfc_type_letter (array->ts.type), array->ts.kind);
1301 gfc_resolve_real (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1303 f->ts.type = BT_REAL;
1306 f->ts.kind = mpz_get_si (kind->value.integer);
1308 f->ts.kind = (a->ts.type == BT_COMPLEX) ?
1309 a->ts.kind : gfc_default_real_kind;
1311 f->value.function.name =
1312 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1313 gfc_type_letter (a->ts.type), a->ts.kind);
1318 gfc_resolve_realpart (gfc_expr * f, gfc_expr * a)
1320 f->ts.type = BT_REAL;
1321 f->ts.kind = a->ts.kind;
1322 f->value.function.name =
1323 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1324 gfc_type_letter (a->ts.type), a->ts.kind);
1329 gfc_resolve_rename (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1330 gfc_expr * p2 ATTRIBUTE_UNUSED)
1332 f->ts.type = BT_INTEGER;
1333 f->ts.kind = gfc_default_integer_kind;
1334 f->value.function.name = gfc_get_string (PREFIX("rename_i%d"), f->ts.kind);
1339 gfc_resolve_repeat (gfc_expr * f, gfc_expr * string,
1340 gfc_expr * ncopies ATTRIBUTE_UNUSED)
1342 f->ts.type = BT_CHARACTER;
1343 f->ts.kind = string->ts.kind;
1344 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
1349 gfc_resolve_reshape (gfc_expr * f, gfc_expr * source, gfc_expr * shape,
1350 gfc_expr * pad ATTRIBUTE_UNUSED,
1351 gfc_expr * order ATTRIBUTE_UNUSED)
1359 gfc_array_size (shape, &rank);
1360 f->rank = mpz_get_si (rank);
1362 switch (source->ts.type)
1365 kind = source->ts.kind * 2;
1371 kind = source->ts.kind;
1385 if (source->ts.type == BT_COMPLEX)
1386 f->value.function.name =
1387 gfc_get_string (PREFIX("reshape_%c%d"),
1388 gfc_type_letter (BT_COMPLEX), source->ts.kind);
1390 f->value.function.name =
1391 gfc_get_string (PREFIX("reshape_%d"), source->ts.kind);
1396 f->value.function.name = (source->ts.type == BT_CHARACTER
1397 ? PREFIX("reshape_char")
1398 : PREFIX("reshape"));
1402 /* TODO: Make this work with a constant ORDER parameter. */
1403 if (shape->expr_type == EXPR_ARRAY
1404 && gfc_is_constant_expr (shape)
1408 f->shape = gfc_get_shape (f->rank);
1409 c = shape->value.constructor;
1410 for (i = 0; i < f->rank; i++)
1412 mpz_init_set (f->shape[i], c->expr->value.integer);
1417 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1418 so many runtime variations. */
1419 if (shape->ts.kind != gfc_index_integer_kind)
1421 gfc_typespec ts = shape->ts;
1422 ts.kind = gfc_index_integer_kind;
1423 gfc_convert_type_warn (shape, &ts, 2, 0);
1425 if (order && order->ts.kind != gfc_index_integer_kind)
1426 gfc_convert_type_warn (order, &shape->ts, 2, 0);
1431 gfc_resolve_rrspacing (gfc_expr * f, gfc_expr * x)
1434 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1439 gfc_resolve_scale (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1443 /* The implementation calls scalbn which takes an int as the
1445 if (i->ts.kind != gfc_c_int_kind)
1449 ts.type = BT_INTEGER;
1450 ts.kind = gfc_default_integer_kind;
1452 gfc_convert_type_warn (i, &ts, 2, 0);
1455 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
1460 gfc_resolve_scan (gfc_expr * f, gfc_expr * string,
1461 gfc_expr * set ATTRIBUTE_UNUSED,
1462 gfc_expr * back ATTRIBUTE_UNUSED)
1464 f->ts.type = BT_INTEGER;
1465 f->ts.kind = gfc_default_integer_kind;
1466 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1471 gfc_resolve_secnds (gfc_expr * t1, gfc_expr * t0)
1474 t1->value.function.name =
1475 gfc_get_string (PREFIX("secnds"));
1480 gfc_resolve_set_exponent (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1484 /* The library implementation uses GFC_INTEGER_4 unconditionally,
1485 convert type so we don't have to implement all possible
1487 if (i->ts.kind != 4)
1491 ts.type = BT_INTEGER;
1492 ts.kind = gfc_default_integer_kind;
1494 gfc_convert_type_warn (i, &ts, 2, 0);
1497 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
1502 gfc_resolve_shape (gfc_expr * f, gfc_expr * array)
1504 f->ts.type = BT_INTEGER;
1505 f->ts.kind = gfc_default_integer_kind;
1507 f->value.function.name = gfc_get_string (PREFIX("shape_%d"), f->ts.kind);
1508 f->shape = gfc_get_shape (1);
1509 mpz_init_set_ui (f->shape[0], array->rank);
1514 gfc_resolve_sign (gfc_expr * f, gfc_expr * a, gfc_expr * b ATTRIBUTE_UNUSED)
1517 f->value.function.name =
1518 gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1523 gfc_resolve_signal (gfc_expr * f, gfc_expr *number, gfc_expr *handler)
1525 f->ts.type = BT_INTEGER;
1526 f->ts.kind = gfc_c_int_kind;
1528 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1529 if (handler->ts.type == BT_INTEGER)
1531 if (handler->ts.kind != gfc_c_int_kind)
1532 gfc_convert_type (handler, &f->ts, 2);
1533 f->value.function.name = gfc_get_string (PREFIX("signal_func_int"));
1536 f->value.function.name = gfc_get_string (PREFIX("signal_func"));
1538 if (number->ts.kind != gfc_c_int_kind)
1539 gfc_convert_type (number, &f->ts, 2);
1544 gfc_resolve_sin (gfc_expr * f, gfc_expr * x)
1547 f->value.function.name =
1548 gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1553 gfc_resolve_sinh (gfc_expr * f, gfc_expr * x)
1556 f->value.function.name =
1557 gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1562 gfc_resolve_spacing (gfc_expr * f, gfc_expr * x)
1565 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1570 gfc_resolve_spread (gfc_expr * f, gfc_expr * source,
1574 if (source->ts.type == BT_CHARACTER)
1575 check_charlen_present (source);
1578 f->rank = source->rank + 1;
1579 if (source->rank == 0)
1580 f->value.function.name = (source->ts.type == BT_CHARACTER
1581 ? PREFIX("spread_char_scalar")
1582 : PREFIX("spread_scalar"));
1584 f->value.function.name = (source->ts.type == BT_CHARACTER
1585 ? PREFIX("spread_char")
1586 : PREFIX("spread"));
1588 gfc_resolve_dim_arg (dim);
1589 gfc_resolve_index (ncopies, 1);
1594 gfc_resolve_sqrt (gfc_expr * f, gfc_expr * x)
1597 f->value.function.name =
1598 gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1602 /* Resolve the g77 compatibility function STAT AND FSTAT. */
1605 gfc_resolve_stat (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED,
1606 gfc_expr * a ATTRIBUTE_UNUSED)
1608 f->ts.type = BT_INTEGER;
1609 f->ts.kind = gfc_default_integer_kind;
1610 f->value.function.name = gfc_get_string (PREFIX("stat_i%d"), f->ts.kind);
1615 gfc_resolve_fstat (gfc_expr * f, gfc_expr * n, gfc_expr * a ATTRIBUTE_UNUSED)
1617 f->ts.type = BT_INTEGER;
1618 f->ts.kind = gfc_default_integer_kind;
1619 if (n->ts.kind != f->ts.kind)
1620 gfc_convert_type (n, &f->ts, 2);
1622 f->value.function.name = gfc_get_string (PREFIX("fstat_i%d"), f->ts.kind);
1627 gfc_resolve_fgetc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1631 f->ts.type = BT_INTEGER;
1632 f->ts.kind = gfc_c_int_kind;
1633 if (u->ts.kind != gfc_c_int_kind)
1635 ts.type = BT_INTEGER;
1636 ts.kind = gfc_c_int_kind;
1639 gfc_convert_type (u, &ts, 2);
1642 f->value.function.name = gfc_get_string (PREFIX("fgetc"));
1647 gfc_resolve_fget (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1649 f->ts.type = BT_INTEGER;
1650 f->ts.kind = gfc_c_int_kind;
1651 f->value.function.name = gfc_get_string (PREFIX("fget"));
1656 gfc_resolve_fputc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1660 f->ts.type = BT_INTEGER;
1661 f->ts.kind = gfc_c_int_kind;
1662 if (u->ts.kind != gfc_c_int_kind)
1664 ts.type = BT_INTEGER;
1665 ts.kind = gfc_c_int_kind;
1668 gfc_convert_type (u, &ts, 2);
1671 f->value.function.name = gfc_get_string (PREFIX("fputc"));
1676 gfc_resolve_fput (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1678 f->ts.type = BT_INTEGER;
1679 f->ts.kind = gfc_c_int_kind;
1680 f->value.function.name = gfc_get_string (PREFIX("fput"));
1685 gfc_resolve_ftell (gfc_expr * f, gfc_expr * u)
1689 f->ts.type = BT_INTEGER;
1690 f->ts.kind = gfc_index_integer_kind;
1691 if (u->ts.kind != gfc_c_int_kind)
1693 ts.type = BT_INTEGER;
1694 ts.kind = gfc_c_int_kind;
1697 gfc_convert_type (u, &ts, 2);
1700 f->value.function.name = gfc_get_string (PREFIX("ftell"));
1705 gfc_resolve_sum (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1712 f->rank = array->rank - 1;
1713 gfc_resolve_dim_arg (dim);
1716 f->value.function.name =
1717 gfc_get_string (PREFIX("%s_%c%d"), mask ? "msum" : "sum",
1718 gfc_type_letter (array->ts.type), array->ts.kind);
1723 gfc_resolve_symlnk (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1724 gfc_expr * p2 ATTRIBUTE_UNUSED)
1726 f->ts.type = BT_INTEGER;
1727 f->ts.kind = gfc_default_integer_kind;
1728 f->value.function.name = gfc_get_string (PREFIX("symlnk_i%d"), f->ts.kind);
1732 /* Resolve the g77 compatibility function SYSTEM. */
1735 gfc_resolve_system (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1737 f->ts.type = BT_INTEGER;
1739 f->value.function.name = gfc_get_string (PREFIX("system"));
1744 gfc_resolve_tan (gfc_expr * f, gfc_expr * x)
1747 f->value.function.name =
1748 gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1753 gfc_resolve_tanh (gfc_expr * f, gfc_expr * x)
1756 f->value.function.name =
1757 gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1762 gfc_resolve_time (gfc_expr * f)
1764 f->ts.type = BT_INTEGER;
1766 f->value.function.name = gfc_get_string (PREFIX("time_func"));
1771 gfc_resolve_time8 (gfc_expr * f)
1773 f->ts.type = BT_INTEGER;
1775 f->value.function.name = gfc_get_string (PREFIX("time8_func"));
1780 gfc_resolve_transfer (gfc_expr * f, gfc_expr * source ATTRIBUTE_UNUSED,
1781 gfc_expr * mold, gfc_expr * size)
1783 /* TODO: Make this do something meaningful. */
1784 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
1788 if (size == NULL && mold->rank == 0)
1791 f->value.function.name = transfer0;
1796 f->value.function.name = transfer1;
1802 gfc_resolve_transpose (gfc_expr * f, gfc_expr * matrix)
1810 f->shape = gfc_get_shape (2);
1811 mpz_init_set (f->shape[0], matrix->shape[1]);
1812 mpz_init_set (f->shape[1], matrix->shape[0]);
1815 kind = matrix->ts.kind;
1823 switch (matrix->ts.type)
1826 f->value.function.name =
1827 gfc_get_string (PREFIX("transpose_c%d"), kind);
1833 /* Use the integer routines for real and logical cases. This
1834 assumes they all have the same alignment requirements. */
1835 f->value.function.name =
1836 gfc_get_string (PREFIX("transpose_i%d"), kind);
1840 f->value.function.name = PREFIX("transpose");
1846 f->value.function.name = (matrix->ts.type == BT_CHARACTER
1847 ? PREFIX("transpose_char")
1848 : PREFIX("transpose"));
1855 gfc_resolve_trim (gfc_expr * f, gfc_expr * string)
1857 f->ts.type = BT_CHARACTER;
1858 f->ts.kind = string->ts.kind;
1859 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
1864 gfc_resolve_ubound (gfc_expr * f, gfc_expr * array,
1867 static char ubound[] = "__ubound";
1869 f->ts.type = BT_INTEGER;
1870 f->ts.kind = gfc_default_integer_kind;
1875 f->shape = gfc_get_shape (1);
1876 mpz_init_set_ui (f->shape[0], array->rank);
1879 f->value.function.name = ubound;
1883 /* Resolve the g77 compatibility function UMASK. */
1886 gfc_resolve_umask (gfc_expr * f, gfc_expr * n)
1888 f->ts.type = BT_INTEGER;
1889 f->ts.kind = n->ts.kind;
1890 f->value.function.name = gfc_get_string (PREFIX("umask_i%d"), n->ts.kind);
1894 /* Resolve the g77 compatibility function UNLINK. */
1897 gfc_resolve_unlink (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1899 f->ts.type = BT_INTEGER;
1901 f->value.function.name = gfc_get_string (PREFIX("unlink"));
1906 gfc_resolve_ttynam (gfc_expr * f, gfc_expr * unit)
1910 f->ts.type = BT_CHARACTER;
1911 f->ts.kind = gfc_default_character_kind;
1913 if (unit->ts.kind != gfc_c_int_kind)
1915 ts.type = BT_INTEGER;
1916 ts.kind = gfc_c_int_kind;
1919 gfc_convert_type (unit, &ts, 2);
1922 f->value.function.name = gfc_get_string (PREFIX("ttynam"));
1927 gfc_resolve_unpack (gfc_expr * f, gfc_expr * vector, gfc_expr * mask,
1928 gfc_expr * field ATTRIBUTE_UNUSED)
1931 f->rank = mask->rank;
1933 f->value.function.name =
1934 gfc_get_string (PREFIX("unpack%d%s"), field->rank > 0 ? 1 : 0,
1935 vector->ts.type == BT_CHARACTER ? "_char" : "");
1940 gfc_resolve_verify (gfc_expr * f, gfc_expr * string,
1941 gfc_expr * set ATTRIBUTE_UNUSED,
1942 gfc_expr * back ATTRIBUTE_UNUSED)
1944 f->ts.type = BT_INTEGER;
1945 f->ts.kind = gfc_default_integer_kind;
1946 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
1951 gfc_resolve_xor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
1953 f->ts.type = i->ts.type;
1954 f->ts.kind = gfc_kind_max (i,j);
1956 if (i->ts.kind != j->ts.kind)
1958 if (i->ts.kind == gfc_kind_max (i,j))
1959 gfc_convert_type(j, &i->ts, 2);
1961 gfc_convert_type(i, &j->ts, 2);
1964 f->value.function.name = gfc_get_string ("__xor_%c%d",
1965 gfc_type_letter (i->ts.type),
1970 /* Intrinsic subroutine resolution. */
1973 gfc_resolve_alarm_sub (gfc_code * c)
1976 gfc_expr *seconds, *handler, *status;
1979 seconds = c->ext.actual->expr;
1980 handler = c->ext.actual->next->expr;
1981 status = c->ext.actual->next->next->expr;
1982 ts.type = BT_INTEGER;
1983 ts.kind = gfc_c_int_kind;
1985 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1986 if (handler->ts.type == BT_INTEGER)
1988 if (handler->ts.kind != gfc_c_int_kind)
1989 gfc_convert_type (handler, &ts, 2);
1990 name = gfc_get_string (PREFIX("alarm_sub_int"));
1993 name = gfc_get_string (PREFIX("alarm_sub"));
1995 if (seconds->ts.kind != gfc_c_int_kind)
1996 gfc_convert_type (seconds, &ts, 2);
1997 if (status != NULL && status->ts.kind != gfc_c_int_kind)
1998 gfc_convert_type (status, &ts, 2);
2000 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2004 gfc_resolve_cpu_time (gfc_code * c ATTRIBUTE_UNUSED)
2008 name = gfc_get_string (PREFIX("cpu_time_%d"),
2009 c->ext.actual->expr->ts.kind);
2010 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2015 gfc_resolve_mvbits (gfc_code * c)
2020 kind = c->ext.actual->expr->ts.kind;
2021 name = gfc_get_string (PREFIX("mvbits_i%d"), kind);
2023 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2028 gfc_resolve_random_number (gfc_code * c ATTRIBUTE_UNUSED)
2033 kind = c->ext.actual->expr->ts.kind;
2034 if (c->ext.actual->expr->rank == 0)
2035 name = gfc_get_string (PREFIX("random_r%d"), kind);
2037 name = gfc_get_string (PREFIX("arandom_r%d"), kind);
2039 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2044 gfc_resolve_rename_sub (gfc_code * c)
2049 if (c->ext.actual->next->next->expr != NULL)
2050 kind = c->ext.actual->next->next->expr->ts.kind;
2052 kind = gfc_default_integer_kind;
2054 name = gfc_get_string (PREFIX("rename_i%d_sub"), kind);
2055 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2060 gfc_resolve_kill_sub (gfc_code * c)
2065 if (c->ext.actual->next->next->expr != NULL)
2066 kind = c->ext.actual->next->next->expr->ts.kind;
2068 kind = gfc_default_integer_kind;
2070 name = gfc_get_string (PREFIX("kill_i%d_sub"), kind);
2071 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2076 gfc_resolve_link_sub (gfc_code * c)
2081 if (c->ext.actual->next->next->expr != NULL)
2082 kind = c->ext.actual->next->next->expr->ts.kind;
2084 kind = gfc_default_integer_kind;
2086 name = gfc_get_string (PREFIX("link_i%d_sub"), kind);
2087 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2092 gfc_resolve_symlnk_sub (gfc_code * c)
2097 if (c->ext.actual->next->next->expr != NULL)
2098 kind = c->ext.actual->next->next->expr->ts.kind;
2100 kind = gfc_default_integer_kind;
2102 name = gfc_get_string (PREFIX("symlnk_i%d_sub"), kind);
2103 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2107 /* G77 compatibility subroutines etime() and dtime(). */
2110 gfc_resolve_etime_sub (gfc_code * c)
2114 name = gfc_get_string (PREFIX("etime_sub"));
2115 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2119 /* G77 compatibility subroutine second(). */
2122 gfc_resolve_second_sub (gfc_code * c)
2126 name = gfc_get_string (PREFIX("second_sub"));
2127 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2132 gfc_resolve_sleep_sub (gfc_code * c)
2137 if (c->ext.actual->expr != NULL)
2138 kind = c->ext.actual->expr->ts.kind;
2140 kind = gfc_default_integer_kind;
2142 name = gfc_get_string (PREFIX("sleep_i%d_sub"), kind);
2143 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2147 /* G77 compatibility function srand(). */
2150 gfc_resolve_srand (gfc_code * c)
2153 name = gfc_get_string (PREFIX("srand"));
2154 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2158 /* Resolve the getarg intrinsic subroutine. */
2161 gfc_resolve_getarg (gfc_code * c)
2166 kind = gfc_default_integer_kind;
2167 name = gfc_get_string (PREFIX("getarg_i%d"), kind);
2168 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2171 /* Resolve the getcwd intrinsic subroutine. */
2174 gfc_resolve_getcwd_sub (gfc_code * c)
2179 if (c->ext.actual->next->expr != NULL)
2180 kind = c->ext.actual->next->expr->ts.kind;
2182 kind = gfc_default_integer_kind;
2184 name = gfc_get_string (PREFIX("getcwd_i%d_sub"), kind);
2185 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2189 /* Resolve the get_command intrinsic subroutine. */
2192 gfc_resolve_get_command (gfc_code * c)
2197 kind = gfc_default_integer_kind;
2198 name = gfc_get_string (PREFIX("get_command_i%d"), kind);
2199 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2203 /* Resolve the get_command_argument intrinsic subroutine. */
2206 gfc_resolve_get_command_argument (gfc_code * c)
2211 kind = gfc_default_integer_kind;
2212 name = gfc_get_string (PREFIX("get_command_argument_i%d"), kind);
2213 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2216 /* Resolve the get_environment_variable intrinsic subroutine. */
2219 gfc_resolve_get_environment_variable (gfc_code * code)
2224 kind = gfc_default_integer_kind;
2225 name = gfc_get_string (PREFIX("get_environment_variable_i%d"), kind);
2226 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2230 gfc_resolve_signal_sub (gfc_code * c)
2233 gfc_expr *number, *handler, *status;
2236 number = c->ext.actual->expr;
2237 handler = c->ext.actual->next->expr;
2238 status = c->ext.actual->next->next->expr;
2239 ts.type = BT_INTEGER;
2240 ts.kind = gfc_c_int_kind;
2242 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2243 if (handler->ts.type == BT_INTEGER)
2245 if (handler->ts.kind != gfc_c_int_kind)
2246 gfc_convert_type (handler, &ts, 2);
2247 name = gfc_get_string (PREFIX("signal_sub_int"));
2250 name = gfc_get_string (PREFIX("signal_sub"));
2252 if (number->ts.kind != gfc_c_int_kind)
2253 gfc_convert_type (number, &ts, 2);
2254 if (status != NULL && status->ts.kind != gfc_c_int_kind)
2255 gfc_convert_type (status, &ts, 2);
2257 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2260 /* Resolve the SYSTEM intrinsic subroutine. */
2263 gfc_resolve_system_sub (gfc_code * c)
2267 name = gfc_get_string (PREFIX("system_sub"));
2268 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2271 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2274 gfc_resolve_system_clock (gfc_code * c)
2279 if (c->ext.actual->expr != NULL)
2280 kind = c->ext.actual->expr->ts.kind;
2281 else if (c->ext.actual->next->expr != NULL)
2282 kind = c->ext.actual->next->expr->ts.kind;
2283 else if (c->ext.actual->next->next->expr != NULL)
2284 kind = c->ext.actual->next->next->expr->ts.kind;
2286 kind = gfc_default_integer_kind;
2288 name = gfc_get_string (PREFIX("system_clock_%d"), kind);
2289 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2292 /* Resolve the EXIT intrinsic subroutine. */
2295 gfc_resolve_exit (gfc_code * c)
2300 if (c->ext.actual->expr != NULL)
2301 kind = c->ext.actual->expr->ts.kind;
2303 kind = gfc_default_integer_kind;
2305 name = gfc_get_string (PREFIX("exit_i%d"), kind);
2306 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2309 /* Resolve the FLUSH intrinsic subroutine. */
2312 gfc_resolve_flush (gfc_code * c)
2318 ts.type = BT_INTEGER;
2319 ts.kind = gfc_default_integer_kind;
2320 n = c->ext.actual->expr;
2322 && n->ts.kind != ts.kind)
2323 gfc_convert_type (n, &ts, 2);
2325 name = gfc_get_string (PREFIX("flush_i%d"), ts.kind);
2326 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2331 gfc_resolve_free (gfc_code * c)
2336 ts.type = BT_INTEGER;
2337 ts.kind = gfc_index_integer_kind;
2338 n = c->ext.actual->expr;
2339 if (n->ts.kind != ts.kind)
2340 gfc_convert_type (n, &ts, 2);
2342 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("free"));
2347 gfc_resolve_ctime_sub (gfc_code * c)
2351 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2352 if (c->ext.actual->expr->ts.kind != 8)
2354 ts.type = BT_INTEGER;
2358 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2361 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ctime_sub"));
2366 gfc_resolve_fdate_sub (gfc_code * c)
2368 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2373 gfc_resolve_gerror (gfc_code * c)
2375 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2380 gfc_resolve_getlog (gfc_code * c)
2382 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2387 gfc_resolve_hostnm_sub (gfc_code * c)
2392 if (c->ext.actual->next->expr != NULL)
2393 kind = c->ext.actual->next->expr->ts.kind;
2395 kind = gfc_default_integer_kind;
2397 name = gfc_get_string (PREFIX("hostnm_i%d_sub"), kind);
2398 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2403 gfc_resolve_perror (gfc_code * c)
2405 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2408 /* Resolve the STAT and FSTAT intrinsic subroutines. */
2411 gfc_resolve_stat_sub (gfc_code * c)
2415 name = gfc_get_string (PREFIX("stat_i%d_sub"), gfc_default_integer_kind);
2416 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2421 gfc_resolve_fstat_sub (gfc_code * c)
2427 u = c->ext.actual->expr;
2428 ts = &c->ext.actual->next->expr->ts;
2429 if (u->ts.kind != ts->kind)
2430 gfc_convert_type (u, ts, 2);
2431 name = gfc_get_string (PREFIX("fstat_i%d_sub"), ts->kind);
2432 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2437 gfc_resolve_fgetc_sub (gfc_code * c)
2443 u = c->ext.actual->expr;
2444 st = c->ext.actual->next->next->expr;
2446 if (u->ts.kind != gfc_c_int_kind)
2448 ts.type = BT_INTEGER;
2449 ts.kind = gfc_c_int_kind;
2452 gfc_convert_type (u, &ts, 2);
2456 name = gfc_get_string (PREFIX("fgetc_i%d_sub"), st->ts.kind);
2458 name = gfc_get_string (PREFIX("fgetc_i%d_sub"), gfc_default_integer_kind);
2460 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2465 gfc_resolve_fget_sub (gfc_code * c)
2470 st = c->ext.actual->next->expr;
2472 name = gfc_get_string (PREFIX("fget_i%d_sub"), st->ts.kind);
2474 name = gfc_get_string (PREFIX("fget_i%d_sub"), gfc_default_integer_kind);
2476 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2481 gfc_resolve_fputc_sub (gfc_code * c)
2487 u = c->ext.actual->expr;
2488 st = c->ext.actual->next->next->expr;
2490 if (u->ts.kind != gfc_c_int_kind)
2492 ts.type = BT_INTEGER;
2493 ts.kind = gfc_c_int_kind;
2496 gfc_convert_type (u, &ts, 2);
2500 name = gfc_get_string (PREFIX("fputc_i%d_sub"), st->ts.kind);
2502 name = gfc_get_string (PREFIX("fputc_i%d_sub"), gfc_default_integer_kind);
2504 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2509 gfc_resolve_fput_sub (gfc_code * c)
2514 st = c->ext.actual->next->expr;
2516 name = gfc_get_string (PREFIX("fput_i%d_sub"), st->ts.kind);
2518 name = gfc_get_string (PREFIX("fput_i%d_sub"), gfc_default_integer_kind);
2520 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2525 gfc_resolve_ftell_sub (gfc_code * c)
2532 unit = c->ext.actual->expr;
2533 offset = c->ext.actual->next->expr;
2535 if (unit->ts.kind != gfc_c_int_kind)
2537 ts.type = BT_INTEGER;
2538 ts.kind = gfc_c_int_kind;
2541 gfc_convert_type (unit, &ts, 2);
2544 name = gfc_get_string (PREFIX("ftell_i%d_sub"), offset->ts.kind);
2545 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2550 gfc_resolve_ttynam_sub (gfc_code * c)
2554 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
2556 ts.type = BT_INTEGER;
2557 ts.kind = gfc_c_int_kind;
2560 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2563 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ttynam_sub"));
2567 /* Resolve the UMASK intrinsic subroutine. */
2570 gfc_resolve_umask_sub (gfc_code * c)
2575 if (c->ext.actual->next->expr != NULL)
2576 kind = c->ext.actual->next->expr->ts.kind;
2578 kind = gfc_default_integer_kind;
2580 name = gfc_get_string (PREFIX("umask_i%d_sub"), kind);
2581 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2584 /* Resolve the UNLINK intrinsic subroutine. */
2587 gfc_resolve_unlink_sub (gfc_code * c)
2592 if (c->ext.actual->next->expr != NULL)
2593 kind = c->ext.actual->next->expr->ts.kind;
2595 kind = gfc_default_integer_kind;
2597 name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind);
2598 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);