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 != NULL
601 && dim->symtree->n.sym->attr.optional)
603 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
604 dim->representation.length = shift->ts.kind;
608 gfc_resolve_dim_arg (dim);
609 /* Convert dim to shift's kind to reduce variations. */
610 if (dim->ts.kind != shift->ts.kind)
611 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
615 f->value.function.name
616 = gfc_get_string (PREFIX ("cshift%d_%d%s"), n, shift->ts.kind,
617 array->ts.type == BT_CHARACTER ? "_char" : "");
622 gfc_resolve_ctime (gfc_expr *f, gfc_expr *time)
627 f->ts.type = BT_CHARACTER;
628 f->ts.kind = gfc_default_character_kind;
630 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
631 if (time->ts.kind != 8)
633 ts.type = BT_INTEGER;
637 gfc_convert_type (time, &ts, 2);
640 f->value.function.name = gfc_get_string (PREFIX ("ctime"));
645 gfc_resolve_dble (gfc_expr *f, gfc_expr *a)
647 f->ts.type = BT_REAL;
648 f->ts.kind = gfc_default_double_kind;
649 f->value.function.name
650 = gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
655 gfc_resolve_dim (gfc_expr *f, gfc_expr *a, gfc_expr *p)
657 f->ts.type = a->ts.type;
659 f->ts.kind = gfc_kind_max (a,p);
661 f->ts.kind = a->ts.kind;
663 if (p != NULL && a->ts.kind != p->ts.kind)
665 if (a->ts.kind == gfc_kind_max (a,p))
666 gfc_convert_type (p, &a->ts, 2);
668 gfc_convert_type (a, &p->ts, 2);
671 f->value.function.name
672 = gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
677 gfc_resolve_dot_product (gfc_expr *f, gfc_expr *a, gfc_expr *b)
681 temp.expr_type = EXPR_OP;
682 gfc_clear_ts (&temp.ts);
683 temp.value.op.operator = INTRINSIC_NONE;
684 temp.value.op.op1 = a;
685 temp.value.op.op2 = b;
686 gfc_type_convert_binary (&temp);
688 f->value.function.name
689 = gfc_get_string (PREFIX ("dot_product_%c%d"),
690 gfc_type_letter (f->ts.type), f->ts.kind);
695 gfc_resolve_dprod (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
696 gfc_expr *b ATTRIBUTE_UNUSED)
698 f->ts.kind = gfc_default_double_kind;
699 f->ts.type = BT_REAL;
700 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
705 gfc_resolve_eoshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
706 gfc_expr *boundary, gfc_expr *dim)
710 if (array->ts.type == BT_CHARACTER && array->ref)
711 gfc_resolve_substring_charlen (array);
714 f->rank = array->rank;
715 f->shape = gfc_copy_shape (array->shape, array->rank);
720 if (boundary && boundary->rank > 0)
723 /* If dim kind is greater than default integer we need to use the larger. */
724 m = gfc_default_integer_kind;
726 m = m < dim->ts.kind ? dim->ts.kind : m;
728 /* Convert shift to at least m, so we don't need
729 kind=1 and kind=2 versions of the library functions. */
730 if (shift->ts.kind < m)
734 ts.type = BT_INTEGER;
736 gfc_convert_type_warn (shift, &ts, 2, 0);
741 if (dim->expr_type != EXPR_CONSTANT && dim->symtree->n.sym->attr.optional)
743 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
744 dim->representation.length = shift->ts.kind;
748 gfc_resolve_dim_arg (dim);
749 /* Convert dim to shift's kind to reduce variations. */
750 if (dim->ts.kind != shift->ts.kind)
751 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
755 f->value.function.name
756 = gfc_get_string (PREFIX ("eoshift%d_%d%s"), n, shift->ts.kind,
757 array->ts.type == BT_CHARACTER ? "_char" : "");
762 gfc_resolve_exp (gfc_expr *f, gfc_expr *x)
765 f->value.function.name
766 = gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
771 gfc_resolve_exponent (gfc_expr *f, gfc_expr *x)
773 f->ts.type = BT_INTEGER;
774 f->ts.kind = gfc_default_integer_kind;
775 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
780 gfc_resolve_fdate (gfc_expr *f)
782 f->ts.type = BT_CHARACTER;
783 f->ts.kind = gfc_default_character_kind;
784 f->value.function.name = gfc_get_string (PREFIX ("fdate"));
789 gfc_resolve_floor (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
791 f->ts.type = BT_INTEGER;
792 f->ts.kind = (kind == NULL)
793 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
794 f->value.function.name
795 = gfc_get_string ("__floor%d_%c%d", f->ts.kind,
796 gfc_type_letter (a->ts.type), a->ts.kind);
801 gfc_resolve_fnum (gfc_expr *f, gfc_expr *n)
803 f->ts.type = BT_INTEGER;
804 f->ts.kind = gfc_default_integer_kind;
805 if (n->ts.kind != f->ts.kind)
806 gfc_convert_type (n, &f->ts, 2);
807 f->value.function.name = gfc_get_string (PREFIX ("fnum_i%d"), f->ts.kind);
812 gfc_resolve_fraction (gfc_expr *f, gfc_expr *x)
815 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
819 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
822 gfc_resolve_g77_math1 (gfc_expr *f, gfc_expr *x)
825 f->value.function.name = gfc_get_string ("<intrinsic>");
830 gfc_resolve_gamma (gfc_expr *f, gfc_expr *x)
833 f->value.function.name
834 = gfc_get_string ("__gamma_%d", x->ts.kind);
839 gfc_resolve_getcwd (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
841 f->ts.type = BT_INTEGER;
843 f->value.function.name = gfc_get_string (PREFIX ("getcwd"));
848 gfc_resolve_getgid (gfc_expr *f)
850 f->ts.type = BT_INTEGER;
852 f->value.function.name = gfc_get_string (PREFIX ("getgid"));
857 gfc_resolve_getpid (gfc_expr *f)
859 f->ts.type = BT_INTEGER;
861 f->value.function.name = gfc_get_string (PREFIX ("getpid"));
866 gfc_resolve_getuid (gfc_expr *f)
868 f->ts.type = BT_INTEGER;
870 f->value.function.name = gfc_get_string (PREFIX ("getuid"));
875 gfc_resolve_hostnm (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
877 f->ts.type = BT_INTEGER;
879 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
884 gfc_resolve_hypot (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
887 f->value.function.name = gfc_get_string ("__hypot_r%d", x->ts.kind);
892 gfc_resolve_iand (gfc_expr *f, gfc_expr *i, gfc_expr *j)
894 /* If the kind of i and j are different, then g77 cross-promoted the
895 kinds to the largest value. The Fortran 95 standard requires the
897 if (i->ts.kind != j->ts.kind)
899 if (i->ts.kind == gfc_kind_max (i, j))
900 gfc_convert_type (j, &i->ts, 2);
902 gfc_convert_type (i, &j->ts, 2);
906 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
911 gfc_resolve_ibclr (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
914 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
919 gfc_resolve_ibits (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED,
920 gfc_expr *len ATTRIBUTE_UNUSED)
923 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
928 gfc_resolve_ibset (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
931 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
936 gfc_resolve_iachar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
938 f->ts.type = BT_INTEGER;
940 f->ts.kind = mpz_get_si (kind->value.integer);
942 f->ts.kind = gfc_default_integer_kind;
943 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
948 gfc_resolve_ichar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
950 f->ts.type = BT_INTEGER;
952 f->ts.kind = mpz_get_si (kind->value.integer);
954 f->ts.kind = gfc_default_integer_kind;
955 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
960 gfc_resolve_idnint (gfc_expr *f, gfc_expr *a)
962 gfc_resolve_nint (f, a, NULL);
967 gfc_resolve_ierrno (gfc_expr *f)
969 f->ts.type = BT_INTEGER;
970 f->ts.kind = gfc_default_integer_kind;
971 f->value.function.name = gfc_get_string (PREFIX ("ierrno_i%d"), f->ts.kind);
976 gfc_resolve_ieor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
978 /* If the kind of i and j are different, then g77 cross-promoted the
979 kinds to the largest value. The Fortran 95 standard requires the
981 if (i->ts.kind != j->ts.kind)
983 if (i->ts.kind == gfc_kind_max (i, j))
984 gfc_convert_type (j, &i->ts, 2);
986 gfc_convert_type (i, &j->ts, 2);
990 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
995 gfc_resolve_ior (gfc_expr *f, gfc_expr *i, gfc_expr *j)
997 /* If the kind of i and j are different, then g77 cross-promoted the
998 kinds to the largest value. The Fortran 95 standard requires the
1000 if (i->ts.kind != j->ts.kind)
1002 if (i->ts.kind == gfc_kind_max (i, j))
1003 gfc_convert_type (j, &i->ts, 2);
1005 gfc_convert_type (i, &j->ts, 2);
1009 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
1014 gfc_resolve_index_func (gfc_expr *f, gfc_expr *str,
1015 gfc_expr *sub_str ATTRIBUTE_UNUSED, gfc_expr *back,
1021 f->ts.type = BT_INTEGER;
1023 f->ts.kind = mpz_get_si (kind->value.integer);
1025 f->ts.kind = gfc_default_integer_kind;
1027 if (back && back->ts.kind != gfc_default_integer_kind)
1029 ts.type = BT_LOGICAL;
1030 ts.kind = gfc_default_integer_kind;
1033 gfc_convert_type (back, &ts, 2);
1036 f->value.function.name
1037 = gfc_get_string ("__index_%d_i%d", str->ts.kind, f->ts.kind);
1042 gfc_resolve_int (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1044 f->ts.type = BT_INTEGER;
1045 f->ts.kind = (kind == NULL)
1046 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1047 f->value.function.name
1048 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1049 gfc_type_letter (a->ts.type), a->ts.kind);
1054 gfc_resolve_int2 (gfc_expr *f, gfc_expr *a)
1056 f->ts.type = BT_INTEGER;
1058 f->value.function.name
1059 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1060 gfc_type_letter (a->ts.type), a->ts.kind);
1065 gfc_resolve_int8 (gfc_expr *f, gfc_expr *a)
1067 f->ts.type = BT_INTEGER;
1069 f->value.function.name
1070 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1071 gfc_type_letter (a->ts.type), a->ts.kind);
1076 gfc_resolve_long (gfc_expr *f, gfc_expr *a)
1078 f->ts.type = BT_INTEGER;
1080 f->value.function.name
1081 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1082 gfc_type_letter (a->ts.type), a->ts.kind);
1087 gfc_resolve_isatty (gfc_expr *f, gfc_expr *u)
1092 f->ts.type = BT_LOGICAL;
1093 f->ts.kind = gfc_default_integer_kind;
1094 if (u->ts.kind != gfc_c_int_kind)
1096 ts.type = BT_INTEGER;
1097 ts.kind = gfc_c_int_kind;
1100 gfc_convert_type (u, &ts, 2);
1103 f->value.function.name = gfc_get_string (PREFIX ("isatty_l%d"), f->ts.kind);
1108 gfc_resolve_ishft (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1111 f->value.function.name
1112 = gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
1117 gfc_resolve_rshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1120 f->value.function.name
1121 = gfc_get_string ("__rshift_%d_%d", i->ts.kind, shift->ts.kind);
1126 gfc_resolve_lshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1129 f->value.function.name
1130 = gfc_get_string ("__lshift_%d_%d", i->ts.kind, shift->ts.kind);
1135 gfc_resolve_ishftc (gfc_expr *f, gfc_expr *i, gfc_expr *shift, gfc_expr *size)
1139 s_kind = (size == NULL) ? gfc_default_integer_kind : size->ts.kind;
1142 f->value.function.name
1143 = gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
1148 gfc_resolve_kill (gfc_expr *f, gfc_expr *p ATTRIBUTE_UNUSED,
1149 gfc_expr *s ATTRIBUTE_UNUSED)
1151 f->ts.type = BT_INTEGER;
1152 f->ts.kind = gfc_default_integer_kind;
1153 f->value.function.name = gfc_get_string (PREFIX ("kill_i%d"), f->ts.kind);
1158 gfc_resolve_lbound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1160 static char lbound[] = "__lbound";
1162 f->ts.type = BT_INTEGER;
1164 f->ts.kind = mpz_get_si (kind->value.integer);
1166 f->ts.kind = gfc_default_integer_kind;
1171 f->shape = gfc_get_shape (1);
1172 mpz_init_set_ui (f->shape[0], array->rank);
1175 f->value.function.name = lbound;
1180 gfc_resolve_len (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1182 f->ts.type = BT_INTEGER;
1184 f->ts.kind = mpz_get_si (kind->value.integer);
1186 f->ts.kind = gfc_default_integer_kind;
1187 f->value.function.name
1188 = gfc_get_string ("__len_%d_i%d", string->ts.kind,
1189 gfc_default_integer_kind);
1194 gfc_resolve_len_trim (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1196 f->ts.type = BT_INTEGER;
1198 f->ts.kind = mpz_get_si (kind->value.integer);
1200 f->ts.kind = gfc_default_integer_kind;
1201 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
1206 gfc_resolve_lgamma (gfc_expr *f, gfc_expr *x)
1209 f->value.function.name
1210 = gfc_get_string ("__lgamma_%d", x->ts.kind);
1215 gfc_resolve_link (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1216 gfc_expr *p2 ATTRIBUTE_UNUSED)
1218 f->ts.type = BT_INTEGER;
1219 f->ts.kind = gfc_default_integer_kind;
1220 f->value.function.name = gfc_get_string (PREFIX ("link_i%d"), f->ts.kind);
1225 gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
1227 f->ts.type= BT_INTEGER;
1228 f->ts.kind = gfc_index_integer_kind;
1229 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
1234 gfc_resolve_log (gfc_expr *f, gfc_expr *x)
1237 f->value.function.name
1238 = gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1243 gfc_resolve_log10 (gfc_expr *f, gfc_expr *x)
1246 f->value.function.name
1247 = gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type),
1253 gfc_resolve_logical (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1255 f->ts.type = BT_LOGICAL;
1256 f->ts.kind = (kind == NULL)
1257 ? gfc_default_logical_kind : mpz_get_si (kind->value.integer);
1260 f->value.function.name
1261 = gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
1262 gfc_type_letter (a->ts.type), a->ts.kind);
1267 gfc_resolve_malloc (gfc_expr *f, gfc_expr *size)
1269 if (size->ts.kind < gfc_index_integer_kind)
1274 ts.type = BT_INTEGER;
1275 ts.kind = gfc_index_integer_kind;
1276 gfc_convert_type_warn (size, &ts, 2, 0);
1279 f->ts.type = BT_INTEGER;
1280 f->ts.kind = gfc_index_integer_kind;
1281 f->value.function.name = gfc_get_string (PREFIX ("malloc"));
1286 gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
1290 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1292 f->ts.type = BT_LOGICAL;
1293 f->ts.kind = gfc_default_logical_kind;
1297 temp.expr_type = EXPR_OP;
1298 gfc_clear_ts (&temp.ts);
1299 temp.value.op.operator = INTRINSIC_NONE;
1300 temp.value.op.op1 = a;
1301 temp.value.op.op2 = b;
1302 gfc_type_convert_binary (&temp);
1306 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1308 f->value.function.name
1309 = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
1315 gfc_resolve_minmax (const char *name, gfc_expr *f, gfc_actual_arglist *args)
1317 gfc_actual_arglist *a;
1319 f->ts.type = args->expr->ts.type;
1320 f->ts.kind = args->expr->ts.kind;
1321 /* Find the largest type kind. */
1322 for (a = args->next; a; a = a->next)
1324 if (a->expr->ts.kind > f->ts.kind)
1325 f->ts.kind = a->expr->ts.kind;
1328 /* Convert all parameters to the required kind. */
1329 for (a = args; a; a = a->next)
1331 if (a->expr->ts.kind != f->ts.kind)
1332 gfc_convert_type (a->expr, &f->ts, 2);
1335 f->value.function.name
1336 = gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1341 gfc_resolve_max (gfc_expr *f, gfc_actual_arglist *args)
1343 gfc_resolve_minmax ("__max_%c%d", f, args);
1348 gfc_resolve_maxloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1354 f->ts.type = BT_INTEGER;
1355 f->ts.kind = gfc_default_integer_kind;
1360 f->shape = gfc_get_shape (1);
1361 mpz_init_set_si (f->shape[0], array->rank);
1365 f->rank = array->rank - 1;
1366 gfc_resolve_dim_arg (dim);
1367 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1369 idim = (int) mpz_get_si (dim->value.integer);
1370 f->shape = gfc_get_shape (f->rank);
1371 for (i = 0, j = 0; i < f->rank; i++, j++)
1373 if (i == (idim - 1))
1375 mpz_init_set (f->shape[i], array->shape[j]);
1382 if (mask->rank == 0)
1387 resolve_mask_arg (mask);
1392 f->value.function.name
1393 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1394 gfc_type_letter (array->ts.type), array->ts.kind);
1399 gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1409 f->rank = array->rank - 1;
1410 gfc_resolve_dim_arg (dim);
1412 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1414 idim = (int) mpz_get_si (dim->value.integer);
1415 f->shape = gfc_get_shape (f->rank);
1416 for (i = 0, j = 0; i < f->rank; i++, j++)
1418 if (i == (idim - 1))
1420 mpz_init_set (f->shape[i], array->shape[j]);
1427 if (mask->rank == 0)
1432 resolve_mask_arg (mask);
1437 f->value.function.name
1438 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1439 gfc_type_letter (array->ts.type), array->ts.kind);
1444 gfc_resolve_mclock (gfc_expr *f)
1446 f->ts.type = BT_INTEGER;
1448 f->value.function.name = PREFIX ("mclock");
1453 gfc_resolve_mclock8 (gfc_expr *f)
1455 f->ts.type = BT_INTEGER;
1457 f->value.function.name = PREFIX ("mclock8");
1462 gfc_resolve_merge (gfc_expr *f, gfc_expr *tsource,
1463 gfc_expr *fsource ATTRIBUTE_UNUSED,
1464 gfc_expr *mask ATTRIBUTE_UNUSED)
1466 if (tsource->ts.type == BT_CHARACTER && tsource->ref)
1467 gfc_resolve_substring_charlen (tsource);
1469 if (fsource->ts.type == BT_CHARACTER && fsource->ref)
1470 gfc_resolve_substring_charlen (fsource);
1472 if (tsource->ts.type == BT_CHARACTER)
1473 check_charlen_present (tsource);
1475 f->ts = tsource->ts;
1476 f->value.function.name
1477 = gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1483 gfc_resolve_min (gfc_expr *f, gfc_actual_arglist *args)
1485 gfc_resolve_minmax ("__min_%c%d", f, args);
1490 gfc_resolve_minloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1496 f->ts.type = BT_INTEGER;
1497 f->ts.kind = gfc_default_integer_kind;
1502 f->shape = gfc_get_shape (1);
1503 mpz_init_set_si (f->shape[0], array->rank);
1507 f->rank = array->rank - 1;
1508 gfc_resolve_dim_arg (dim);
1509 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1511 idim = (int) mpz_get_si (dim->value.integer);
1512 f->shape = gfc_get_shape (f->rank);
1513 for (i = 0, j = 0; i < f->rank; i++, j++)
1515 if (i == (idim - 1))
1517 mpz_init_set (f->shape[i], array->shape[j]);
1524 if (mask->rank == 0)
1529 resolve_mask_arg (mask);
1534 f->value.function.name
1535 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1536 gfc_type_letter (array->ts.type), array->ts.kind);
1541 gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1551 f->rank = array->rank - 1;
1552 gfc_resolve_dim_arg (dim);
1554 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1556 idim = (int) mpz_get_si (dim->value.integer);
1557 f->shape = gfc_get_shape (f->rank);
1558 for (i = 0, j = 0; i < f->rank; i++, j++)
1560 if (i == (idim - 1))
1562 mpz_init_set (f->shape[i], array->shape[j]);
1569 if (mask->rank == 0)
1574 resolve_mask_arg (mask);
1579 f->value.function.name
1580 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1581 gfc_type_letter (array->ts.type), array->ts.kind);
1586 gfc_resolve_mod (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1588 f->ts.type = a->ts.type;
1590 f->ts.kind = gfc_kind_max (a,p);
1592 f->ts.kind = a->ts.kind;
1594 if (p != NULL && a->ts.kind != p->ts.kind)
1596 if (a->ts.kind == gfc_kind_max (a,p))
1597 gfc_convert_type (p, &a->ts, 2);
1599 gfc_convert_type (a, &p->ts, 2);
1602 f->value.function.name
1603 = gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
1608 gfc_resolve_modulo (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1610 f->ts.type = a->ts.type;
1612 f->ts.kind = gfc_kind_max (a,p);
1614 f->ts.kind = a->ts.kind;
1616 if (p != NULL && a->ts.kind != p->ts.kind)
1618 if (a->ts.kind == gfc_kind_max (a,p))
1619 gfc_convert_type (p, &a->ts, 2);
1621 gfc_convert_type (a, &p->ts, 2);
1624 f->value.function.name
1625 = gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
1630 gfc_resolve_nearest (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1632 if (p->ts.kind != a->ts.kind)
1633 gfc_convert_type (p, &a->ts, 2);
1636 f->value.function.name
1637 = gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1642 gfc_resolve_nint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1644 f->ts.type = BT_INTEGER;
1645 f->ts.kind = (kind == NULL)
1646 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1647 f->value.function.name
1648 = gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1653 gfc_resolve_not (gfc_expr *f, gfc_expr *i)
1656 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1661 gfc_resolve_or (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1663 f->ts.type = i->ts.type;
1664 f->ts.kind = gfc_kind_max (i, j);
1666 if (i->ts.kind != j->ts.kind)
1668 if (i->ts.kind == gfc_kind_max (i, j))
1669 gfc_convert_type (j, &i->ts, 2);
1671 gfc_convert_type (i, &j->ts, 2);
1674 f->value.function.name
1675 = gfc_get_string ("__or_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
1680 gfc_resolve_pack (gfc_expr *f, gfc_expr *array, gfc_expr *mask,
1681 gfc_expr *vector ATTRIBUTE_UNUSED)
1683 if (array->ts.type == BT_CHARACTER && array->ref)
1684 gfc_resolve_substring_charlen (array);
1689 resolve_mask_arg (mask);
1691 if (mask->rank != 0)
1692 f->value.function.name = (array->ts.type == BT_CHARACTER
1693 ? PREFIX ("pack_char") : PREFIX ("pack"));
1695 f->value.function.name = (array->ts.type == BT_CHARACTER
1696 ? PREFIX ("pack_s_char") : PREFIX ("pack_s"));
1701 gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1710 f->rank = array->rank - 1;
1711 gfc_resolve_dim_arg (dim);
1716 if (mask->rank == 0)
1721 resolve_mask_arg (mask);
1726 f->value.function.name
1727 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1728 gfc_type_letter (array->ts.type), array->ts.kind);
1733 gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1735 f->ts.type = BT_REAL;
1738 f->ts.kind = mpz_get_si (kind->value.integer);
1740 f->ts.kind = (a->ts.type == BT_COMPLEX)
1741 ? a->ts.kind : gfc_default_real_kind;
1743 f->value.function.name
1744 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1745 gfc_type_letter (a->ts.type), a->ts.kind);
1750 gfc_resolve_realpart (gfc_expr *f, gfc_expr *a)
1752 f->ts.type = BT_REAL;
1753 f->ts.kind = a->ts.kind;
1754 f->value.function.name
1755 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1756 gfc_type_letter (a->ts.type), a->ts.kind);
1761 gfc_resolve_rename (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1762 gfc_expr *p2 ATTRIBUTE_UNUSED)
1764 f->ts.type = BT_INTEGER;
1765 f->ts.kind = gfc_default_integer_kind;
1766 f->value.function.name = gfc_get_string (PREFIX ("rename_i%d"), f->ts.kind);
1771 gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
1772 gfc_expr *ncopies ATTRIBUTE_UNUSED)
1774 f->ts.type = BT_CHARACTER;
1775 f->ts.kind = string->ts.kind;
1776 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
1781 gfc_resolve_reshape (gfc_expr *f, gfc_expr *source, gfc_expr *shape,
1782 gfc_expr *pad ATTRIBUTE_UNUSED,
1783 gfc_expr *order ATTRIBUTE_UNUSED)
1789 if (source->ts.type == BT_CHARACTER && source->ref)
1790 gfc_resolve_substring_charlen (source);
1794 gfc_array_size (shape, &rank);
1795 f->rank = mpz_get_si (rank);
1797 switch (source->ts.type)
1803 kind = source->ts.kind;
1817 if (source->ts.type == BT_COMPLEX || source->ts.type == BT_REAL)
1818 f->value.function.name
1819 = gfc_get_string (PREFIX ("reshape_%c%d"),
1820 gfc_type_letter (source->ts.type),
1823 f->value.function.name
1824 = gfc_get_string (PREFIX ("reshape_%d"), source->ts.kind);
1829 f->value.function.name = (source->ts.type == BT_CHARACTER
1830 ? PREFIX ("reshape_char") : PREFIX ("reshape"));
1834 /* TODO: Make this work with a constant ORDER parameter. */
1835 if (shape->expr_type == EXPR_ARRAY
1836 && gfc_is_constant_expr (shape)
1840 f->shape = gfc_get_shape (f->rank);
1841 c = shape->value.constructor;
1842 for (i = 0; i < f->rank; i++)
1844 mpz_init_set (f->shape[i], c->expr->value.integer);
1849 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1850 so many runtime variations. */
1851 if (shape->ts.kind != gfc_index_integer_kind)
1853 gfc_typespec ts = shape->ts;
1854 ts.kind = gfc_index_integer_kind;
1855 gfc_convert_type_warn (shape, &ts, 2, 0);
1857 if (order && order->ts.kind != gfc_index_integer_kind)
1858 gfc_convert_type_warn (order, &shape->ts, 2, 0);
1863 gfc_resolve_rrspacing (gfc_expr *f, gfc_expr *x)
1866 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1871 gfc_resolve_scale (gfc_expr *f, gfc_expr *x, gfc_expr *i ATTRIBUTE_UNUSED)
1874 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
1879 gfc_resolve_scan (gfc_expr *f, gfc_expr *string,
1880 gfc_expr *set ATTRIBUTE_UNUSED,
1881 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
1883 f->ts.type = BT_INTEGER;
1885 f->ts.kind = mpz_get_si (kind->value.integer);
1887 f->ts.kind = gfc_default_integer_kind;
1888 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1893 gfc_resolve_secnds (gfc_expr *t1, gfc_expr *t0)
1896 t1->value.function.name = gfc_get_string (PREFIX ("secnds"));
1901 gfc_resolve_set_exponent (gfc_expr *f, gfc_expr *x,
1902 gfc_expr *i ATTRIBUTE_UNUSED)
1905 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
1910 gfc_resolve_shape (gfc_expr *f, gfc_expr *array)
1912 f->ts.type = BT_INTEGER;
1913 f->ts.kind = gfc_default_integer_kind;
1915 f->shape = gfc_get_shape (1);
1916 mpz_init_set_ui (f->shape[0], array->rank);
1917 f->value.function.name = gfc_get_string (PREFIX ("shape_%d"), f->ts.kind);
1922 gfc_resolve_sign (gfc_expr *f, gfc_expr *a, gfc_expr *b ATTRIBUTE_UNUSED)
1925 f->value.function.name
1926 = gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1931 gfc_resolve_signal (gfc_expr *f, gfc_expr *number, gfc_expr *handler)
1933 f->ts.type = BT_INTEGER;
1934 f->ts.kind = gfc_c_int_kind;
1936 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1937 if (handler->ts.type == BT_INTEGER)
1939 if (handler->ts.kind != gfc_c_int_kind)
1940 gfc_convert_type (handler, &f->ts, 2);
1941 f->value.function.name = gfc_get_string (PREFIX ("signal_func_int"));
1944 f->value.function.name = gfc_get_string (PREFIX ("signal_func"));
1946 if (number->ts.kind != gfc_c_int_kind)
1947 gfc_convert_type (number, &f->ts, 2);
1952 gfc_resolve_sin (gfc_expr *f, gfc_expr *x)
1955 f->value.function.name
1956 = gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1961 gfc_resolve_sinh (gfc_expr *f, gfc_expr *x)
1964 f->value.function.name
1965 = gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1970 gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
1971 gfc_expr *dim ATTRIBUTE_UNUSED, gfc_expr *kind)
1973 f->ts.type = BT_INTEGER;
1975 f->ts.kind = mpz_get_si (kind->value.integer);
1977 f->ts.kind = gfc_default_integer_kind;
1982 gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
1985 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1990 gfc_resolve_spread (gfc_expr *f, gfc_expr *source, gfc_expr *dim,
1993 if (source->ts.type == BT_CHARACTER && source->ref)
1994 gfc_resolve_substring_charlen (source);
1996 if (source->ts.type == BT_CHARACTER)
1997 check_charlen_present (source);
2000 f->rank = source->rank + 1;
2001 if (source->rank == 0)
2002 f->value.function.name = (source->ts.type == BT_CHARACTER
2003 ? PREFIX ("spread_char_scalar")
2004 : PREFIX ("spread_scalar"));
2006 f->value.function.name = (source->ts.type == BT_CHARACTER
2007 ? PREFIX ("spread_char")
2008 : PREFIX ("spread"));
2010 if (dim && gfc_is_constant_expr (dim)
2011 && ncopies && gfc_is_constant_expr (ncopies) && source->shape[0])
2014 idim = mpz_get_ui (dim->value.integer);
2015 f->shape = gfc_get_shape (f->rank);
2016 for (i = 0; i < (idim - 1); i++)
2017 mpz_init_set (f->shape[i], source->shape[i]);
2019 mpz_init_set (f->shape[idim - 1], ncopies->value.integer);
2021 for (i = idim; i < f->rank ; i++)
2022 mpz_init_set (f->shape[i], source->shape[i-1]);
2026 gfc_resolve_dim_arg (dim);
2027 gfc_resolve_index (ncopies, 1);
2032 gfc_resolve_sqrt (gfc_expr *f, gfc_expr *x)
2035 f->value.function.name
2036 = gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2040 /* Resolve the g77 compatibility function STAT AND FSTAT. */
2043 gfc_resolve_stat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2044 gfc_expr *a ATTRIBUTE_UNUSED)
2046 f->ts.type = BT_INTEGER;
2047 f->ts.kind = gfc_default_integer_kind;
2048 f->value.function.name = gfc_get_string (PREFIX ("stat_i%d"), f->ts.kind);
2053 gfc_resolve_lstat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2054 gfc_expr *a ATTRIBUTE_UNUSED)
2056 f->ts.type = BT_INTEGER;
2057 f->ts.kind = gfc_default_integer_kind;
2058 f->value.function.name = gfc_get_string (PREFIX ("lstat_i%d"), f->ts.kind);
2063 gfc_resolve_fstat (gfc_expr *f, gfc_expr *n, gfc_expr *a ATTRIBUTE_UNUSED)
2065 f->ts.type = BT_INTEGER;
2066 f->ts.kind = gfc_default_integer_kind;
2067 if (n->ts.kind != f->ts.kind)
2068 gfc_convert_type (n, &f->ts, 2);
2070 f->value.function.name = gfc_get_string (PREFIX ("fstat_i%d"), f->ts.kind);
2075 gfc_resolve_fgetc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2080 f->ts.type = BT_INTEGER;
2081 f->ts.kind = gfc_c_int_kind;
2082 if (u->ts.kind != gfc_c_int_kind)
2084 ts.type = BT_INTEGER;
2085 ts.kind = gfc_c_int_kind;
2088 gfc_convert_type (u, &ts, 2);
2091 f->value.function.name = gfc_get_string (PREFIX ("fgetc"));
2096 gfc_resolve_fget (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2098 f->ts.type = BT_INTEGER;
2099 f->ts.kind = gfc_c_int_kind;
2100 f->value.function.name = gfc_get_string (PREFIX ("fget"));
2105 gfc_resolve_fputc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2110 f->ts.type = BT_INTEGER;
2111 f->ts.kind = gfc_c_int_kind;
2112 if (u->ts.kind != gfc_c_int_kind)
2114 ts.type = BT_INTEGER;
2115 ts.kind = gfc_c_int_kind;
2118 gfc_convert_type (u, &ts, 2);
2121 f->value.function.name = gfc_get_string (PREFIX ("fputc"));
2126 gfc_resolve_fput (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2128 f->ts.type = BT_INTEGER;
2129 f->ts.kind = gfc_c_int_kind;
2130 f->value.function.name = gfc_get_string (PREFIX ("fput"));
2135 gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
2140 f->ts.type = BT_INTEGER;
2141 f->ts.kind = gfc_index_integer_kind;
2142 if (u->ts.kind != gfc_c_int_kind)
2144 ts.type = BT_INTEGER;
2145 ts.kind = gfc_c_int_kind;
2148 gfc_convert_type (u, &ts, 2);
2151 f->value.function.name = gfc_get_string (PREFIX ("ftell"));
2156 gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2164 if (mask->rank == 0)
2169 resolve_mask_arg (mask);
2176 f->rank = array->rank - 1;
2177 gfc_resolve_dim_arg (dim);
2180 f->value.function.name
2181 = gfc_get_string (PREFIX ("%s_%c%d"), name,
2182 gfc_type_letter (array->ts.type), array->ts.kind);
2187 gfc_resolve_symlnk (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2188 gfc_expr *p2 ATTRIBUTE_UNUSED)
2190 f->ts.type = BT_INTEGER;
2191 f->ts.kind = gfc_default_integer_kind;
2192 f->value.function.name = gfc_get_string (PREFIX ("symlnk_i%d"), f->ts.kind);
2196 /* Resolve the g77 compatibility function SYSTEM. */
2199 gfc_resolve_system (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2201 f->ts.type = BT_INTEGER;
2203 f->value.function.name = gfc_get_string (PREFIX ("system"));
2208 gfc_resolve_tan (gfc_expr *f, gfc_expr *x)
2211 f->value.function.name
2212 = gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2217 gfc_resolve_tanh (gfc_expr *f, gfc_expr *x)
2220 f->value.function.name
2221 = gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2226 gfc_resolve_time (gfc_expr *f)
2228 f->ts.type = BT_INTEGER;
2230 f->value.function.name = gfc_get_string (PREFIX ("time_func"));
2235 gfc_resolve_time8 (gfc_expr *f)
2237 f->ts.type = BT_INTEGER;
2239 f->value.function.name = gfc_get_string (PREFIX ("time8_func"));
2244 gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
2245 gfc_expr *mold, gfc_expr *size)
2247 /* TODO: Make this do something meaningful. */
2248 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
2250 if (mold->ts.type == BT_CHARACTER && !mold->ts.cl->length
2251 && !(mold->expr_type == EXPR_VARIABLE && mold->symtree->n.sym->attr.dummy))
2252 mold->ts.cl->length = gfc_int_expr (mold->value.character.length);
2256 if (size == NULL && mold->rank == 0)
2259 f->value.function.name = transfer0;
2264 f->value.function.name = transfer1;
2265 if (size && gfc_is_constant_expr (size))
2267 f->shape = gfc_get_shape (1);
2268 mpz_init_set (f->shape[0], size->value.integer);
2275 gfc_resolve_transpose (gfc_expr *f, gfc_expr *matrix)
2278 if (matrix->ts.type == BT_CHARACTER && matrix->ref)
2279 gfc_resolve_substring_charlen (matrix);
2285 f->shape = gfc_get_shape (2);
2286 mpz_init_set (f->shape[0], matrix->shape[1]);
2287 mpz_init_set (f->shape[1], matrix->shape[0]);
2290 switch (matrix->ts.kind)
2296 switch (matrix->ts.type)
2300 f->value.function.name
2301 = gfc_get_string (PREFIX ("transpose_%c%d"),
2302 gfc_type_letter (matrix->ts.type),
2308 /* Use the integer routines for real and logical cases. This
2309 assumes they all have the same alignment requirements. */
2310 f->value.function.name
2311 = gfc_get_string (PREFIX ("transpose_i%d"), matrix->ts.kind);
2315 f->value.function.name = PREFIX ("transpose");
2321 f->value.function.name = (matrix->ts.type == BT_CHARACTER
2322 ? PREFIX ("transpose_char")
2323 : PREFIX ("transpose"));
2330 gfc_resolve_trim (gfc_expr *f, gfc_expr *string)
2332 f->ts.type = BT_CHARACTER;
2333 f->ts.kind = string->ts.kind;
2334 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
2339 gfc_resolve_ubound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2341 static char ubound[] = "__ubound";
2343 f->ts.type = BT_INTEGER;
2345 f->ts.kind = mpz_get_si (kind->value.integer);
2347 f->ts.kind = gfc_default_integer_kind;
2352 f->shape = gfc_get_shape (1);
2353 mpz_init_set_ui (f->shape[0], array->rank);
2356 f->value.function.name = ubound;
2360 /* Resolve the g77 compatibility function UMASK. */
2363 gfc_resolve_umask (gfc_expr *f, gfc_expr *n)
2365 f->ts.type = BT_INTEGER;
2366 f->ts.kind = n->ts.kind;
2367 f->value.function.name = gfc_get_string (PREFIX ("umask_i%d"), n->ts.kind);
2371 /* Resolve the g77 compatibility function UNLINK. */
2374 gfc_resolve_unlink (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2376 f->ts.type = BT_INTEGER;
2378 f->value.function.name = gfc_get_string (PREFIX ("unlink"));
2383 gfc_resolve_ttynam (gfc_expr *f, gfc_expr *unit)
2388 f->ts.type = BT_CHARACTER;
2389 f->ts.kind = gfc_default_character_kind;
2391 if (unit->ts.kind != gfc_c_int_kind)
2393 ts.type = BT_INTEGER;
2394 ts.kind = gfc_c_int_kind;
2397 gfc_convert_type (unit, &ts, 2);
2400 f->value.function.name = gfc_get_string (PREFIX ("ttynam"));
2405 gfc_resolve_unpack (gfc_expr *f, gfc_expr *vector, gfc_expr *mask,
2406 gfc_expr *field ATTRIBUTE_UNUSED)
2408 if (vector->ts.type == BT_CHARACTER && vector->ref)
2409 gfc_resolve_substring_charlen (vector);
2412 f->rank = mask->rank;
2413 resolve_mask_arg (mask);
2415 f->value.function.name
2416 = gfc_get_string (PREFIX ("unpack%d%s"), field->rank > 0 ? 1 : 0,
2417 vector->ts.type == BT_CHARACTER ? "_char" : "");
2422 gfc_resolve_verify (gfc_expr *f, gfc_expr *string,
2423 gfc_expr *set ATTRIBUTE_UNUSED,
2424 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
2426 f->ts.type = BT_INTEGER;
2428 f->ts.kind = mpz_get_si (kind->value.integer);
2430 f->ts.kind = gfc_default_integer_kind;
2431 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
2436 gfc_resolve_xor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
2438 f->ts.type = i->ts.type;
2439 f->ts.kind = gfc_kind_max (i, j);
2441 if (i->ts.kind != j->ts.kind)
2443 if (i->ts.kind == gfc_kind_max (i, j))
2444 gfc_convert_type (j, &i->ts, 2);
2446 gfc_convert_type (i, &j->ts, 2);
2449 f->value.function.name
2450 = gfc_get_string ("__xor_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
2454 /* Intrinsic subroutine resolution. */
2457 gfc_resolve_alarm_sub (gfc_code *c)
2460 gfc_expr *seconds, *handler, *status;
2464 seconds = c->ext.actual->expr;
2465 handler = c->ext.actual->next->expr;
2466 status = c->ext.actual->next->next->expr;
2467 ts.type = BT_INTEGER;
2468 ts.kind = gfc_c_int_kind;
2470 /* handler can be either BT_INTEGER or BT_PROCEDURE.
2471 In all cases, the status argument is of default integer kind
2472 (enforced in check.c) so that the function suffix is fixed. */
2473 if (handler->ts.type == BT_INTEGER)
2475 if (handler->ts.kind != gfc_c_int_kind)
2476 gfc_convert_type (handler, &ts, 2);
2477 name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
2478 gfc_default_integer_kind);
2481 name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
2482 gfc_default_integer_kind);
2484 if (seconds->ts.kind != gfc_c_int_kind)
2485 gfc_convert_type (seconds, &ts, 2);
2487 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2491 gfc_resolve_cpu_time (gfc_code *c)
2494 name = gfc_get_string (PREFIX ("cpu_time_%d"), c->ext.actual->expr->ts.kind);
2495 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2500 gfc_resolve_mvbits (gfc_code *c)
2506 /* FROMPOS, LEN and TOPOS are restricted to small values. As such,
2507 they will be converted so that they fit into a C int. */
2508 ts.type = BT_INTEGER;
2509 ts.kind = gfc_c_int_kind;
2510 if (c->ext.actual->next->expr->ts.kind != gfc_c_int_kind)
2511 gfc_convert_type (c->ext.actual->next->expr, &ts, 2);
2512 if (c->ext.actual->next->next->expr->ts.kind != gfc_c_int_kind)
2513 gfc_convert_type (c->ext.actual->next->next->expr, &ts, 2);
2514 if (c->ext.actual->next->next->next->next->expr->ts.kind != gfc_c_int_kind)
2515 gfc_convert_type (c->ext.actual->next->next->next->next->expr, &ts, 2);
2517 /* TO and FROM are guaranteed to have the same kind parameter. */
2518 name = gfc_get_string (PREFIX ("mvbits_i%d"),
2519 c->ext.actual->expr->ts.kind);
2520 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2521 /* Mark as elemental subroutine as this does not happen automatically. */
2522 c->resolved_sym->attr.elemental = 1;
2527 gfc_resolve_random_number (gfc_code *c)
2532 kind = c->ext.actual->expr->ts.kind;
2533 if (c->ext.actual->expr->rank == 0)
2534 name = gfc_get_string (PREFIX ("random_r%d"), kind);
2536 name = gfc_get_string (PREFIX ("arandom_r%d"), kind);
2538 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2543 gfc_resolve_random_seed (gfc_code *c)
2547 name = gfc_get_string (PREFIX ("random_seed_i%d"), gfc_default_integer_kind);
2548 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2553 gfc_resolve_rename_sub (gfc_code *c)
2558 if (c->ext.actual->next->next->expr != NULL)
2559 kind = c->ext.actual->next->next->expr->ts.kind;
2561 kind = gfc_default_integer_kind;
2563 name = gfc_get_string (PREFIX ("rename_i%d_sub"), kind);
2564 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2569 gfc_resolve_kill_sub (gfc_code *c)
2574 if (c->ext.actual->next->next->expr != NULL)
2575 kind = c->ext.actual->next->next->expr->ts.kind;
2577 kind = gfc_default_integer_kind;
2579 name = gfc_get_string (PREFIX ("kill_i%d_sub"), kind);
2580 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2585 gfc_resolve_link_sub (gfc_code *c)
2590 if (c->ext.actual->next->next->expr != NULL)
2591 kind = c->ext.actual->next->next->expr->ts.kind;
2593 kind = gfc_default_integer_kind;
2595 name = gfc_get_string (PREFIX ("link_i%d_sub"), kind);
2596 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2601 gfc_resolve_symlnk_sub (gfc_code *c)
2606 if (c->ext.actual->next->next->expr != NULL)
2607 kind = c->ext.actual->next->next->expr->ts.kind;
2609 kind = gfc_default_integer_kind;
2611 name = gfc_get_string (PREFIX ("symlnk_i%d_sub"), kind);
2612 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2616 /* G77 compatibility subroutines dtime() and etime(). */
2619 gfc_resolve_dtime_sub (gfc_code *c)
2622 name = gfc_get_string (PREFIX ("dtime_sub"));
2623 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2627 gfc_resolve_etime_sub (gfc_code *c)
2630 name = gfc_get_string (PREFIX ("etime_sub"));
2631 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2635 /* G77 compatibility subroutines itime(), idate(), ltime() and gmtime(). */
2638 gfc_resolve_itime (gfc_code *c)
2641 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("itime_i%d"),
2642 gfc_default_integer_kind));
2646 gfc_resolve_idate (gfc_code *c)
2649 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("idate_i%d"),
2650 gfc_default_integer_kind));
2654 gfc_resolve_ltime (gfc_code *c)
2657 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("ltime_i%d"),
2658 gfc_default_integer_kind));
2662 gfc_resolve_gmtime (gfc_code *c)
2665 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("gmtime_i%d"),
2666 gfc_default_integer_kind));
2670 /* G77 compatibility subroutine second(). */
2673 gfc_resolve_second_sub (gfc_code *c)
2676 name = gfc_get_string (PREFIX ("second_sub"));
2677 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2682 gfc_resolve_sleep_sub (gfc_code *c)
2687 if (c->ext.actual->expr != NULL)
2688 kind = c->ext.actual->expr->ts.kind;
2690 kind = gfc_default_integer_kind;
2692 name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
2693 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2697 /* G77 compatibility function srand(). */
2700 gfc_resolve_srand (gfc_code *c)
2703 name = gfc_get_string (PREFIX ("srand"));
2704 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2708 /* Resolve the getarg intrinsic subroutine. */
2711 gfc_resolve_getarg (gfc_code *c)
2715 if (c->ext.actual->expr->ts.kind != gfc_default_integer_kind)
2720 ts.type = BT_INTEGER;
2721 ts.kind = gfc_default_integer_kind;
2723 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2726 name = gfc_get_string (PREFIX ("getarg_i%d"), gfc_default_integer_kind);
2727 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2731 /* Resolve the getcwd intrinsic subroutine. */
2734 gfc_resolve_getcwd_sub (gfc_code *c)
2739 if (c->ext.actual->next->expr != NULL)
2740 kind = c->ext.actual->next->expr->ts.kind;
2742 kind = gfc_default_integer_kind;
2744 name = gfc_get_string (PREFIX ("getcwd_i%d_sub"), kind);
2745 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2749 /* Resolve the get_command intrinsic subroutine. */
2752 gfc_resolve_get_command (gfc_code *c)
2756 kind = gfc_default_integer_kind;
2757 name = gfc_get_string (PREFIX ("get_command_i%d"), kind);
2758 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2762 /* Resolve the get_command_argument intrinsic subroutine. */
2765 gfc_resolve_get_command_argument (gfc_code *c)
2769 kind = gfc_default_integer_kind;
2770 name = gfc_get_string (PREFIX ("get_command_argument_i%d"), kind);
2771 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2775 /* Resolve the get_environment_variable intrinsic subroutine. */
2778 gfc_resolve_get_environment_variable (gfc_code *code)
2782 kind = gfc_default_integer_kind;
2783 name = gfc_get_string (PREFIX ("get_environment_variable_i%d"), kind);
2784 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2789 gfc_resolve_signal_sub (gfc_code *c)
2792 gfc_expr *number, *handler, *status;
2796 number = c->ext.actual->expr;
2797 handler = c->ext.actual->next->expr;
2798 status = c->ext.actual->next->next->expr;
2799 ts.type = BT_INTEGER;
2800 ts.kind = gfc_c_int_kind;
2802 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2803 if (handler->ts.type == BT_INTEGER)
2805 if (handler->ts.kind != gfc_c_int_kind)
2806 gfc_convert_type (handler, &ts, 2);
2807 name = gfc_get_string (PREFIX ("signal_sub_int"));
2810 name = gfc_get_string (PREFIX ("signal_sub"));
2812 if (number->ts.kind != gfc_c_int_kind)
2813 gfc_convert_type (number, &ts, 2);
2814 if (status != NULL && status->ts.kind != gfc_c_int_kind)
2815 gfc_convert_type (status, &ts, 2);
2817 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2821 /* Resolve the SYSTEM intrinsic subroutine. */
2824 gfc_resolve_system_sub (gfc_code *c)
2827 name = gfc_get_string (PREFIX ("system_sub"));
2828 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2832 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2835 gfc_resolve_system_clock (gfc_code *c)
2840 if (c->ext.actual->expr != NULL)
2841 kind = c->ext.actual->expr->ts.kind;
2842 else if (c->ext.actual->next->expr != NULL)
2843 kind = c->ext.actual->next->expr->ts.kind;
2844 else if (c->ext.actual->next->next->expr != NULL)
2845 kind = c->ext.actual->next->next->expr->ts.kind;
2847 kind = gfc_default_integer_kind;
2849 name = gfc_get_string (PREFIX ("system_clock_%d"), kind);
2850 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2854 /* Resolve the EXIT intrinsic subroutine. */
2857 gfc_resolve_exit (gfc_code *c)
2864 /* The STATUS argument has to be of default kind. If it is not,
2866 ts.type = BT_INTEGER;
2867 ts.kind = gfc_default_integer_kind;
2868 n = c->ext.actual->expr;
2869 if (n != NULL && n->ts.kind != ts.kind)
2870 gfc_convert_type (n, &ts, 2);
2872 name = gfc_get_string (PREFIX ("exit_i%d"), ts.kind);
2873 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2877 /* Resolve the FLUSH intrinsic subroutine. */
2880 gfc_resolve_flush (gfc_code *c)
2887 ts.type = BT_INTEGER;
2888 ts.kind = gfc_default_integer_kind;
2889 n = c->ext.actual->expr;
2890 if (n != NULL && n->ts.kind != ts.kind)
2891 gfc_convert_type (n, &ts, 2);
2893 name = gfc_get_string (PREFIX ("flush_i%d"), ts.kind);
2894 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2899 gfc_resolve_free (gfc_code *c)
2905 ts.type = BT_INTEGER;
2906 ts.kind = gfc_index_integer_kind;
2907 n = c->ext.actual->expr;
2908 if (n->ts.kind != ts.kind)
2909 gfc_convert_type (n, &ts, 2);
2911 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("free"));
2916 gfc_resolve_ctime_sub (gfc_code *c)
2921 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2922 if (c->ext.actual->expr->ts.kind != 8)
2924 ts.type = BT_INTEGER;
2928 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2931 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ctime_sub"));
2936 gfc_resolve_fdate_sub (gfc_code *c)
2938 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2943 gfc_resolve_gerror (gfc_code *c)
2945 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2950 gfc_resolve_getlog (gfc_code *c)
2952 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2957 gfc_resolve_hostnm_sub (gfc_code *c)
2962 if (c->ext.actual->next->expr != NULL)
2963 kind = c->ext.actual->next->expr->ts.kind;
2965 kind = gfc_default_integer_kind;
2967 name = gfc_get_string (PREFIX ("hostnm_i%d_sub"), kind);
2968 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2973 gfc_resolve_perror (gfc_code *c)
2975 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2978 /* Resolve the STAT and FSTAT intrinsic subroutines. */
2981 gfc_resolve_stat_sub (gfc_code *c)
2984 name = gfc_get_string (PREFIX ("stat_i%d_sub"), gfc_default_integer_kind);
2985 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2990 gfc_resolve_lstat_sub (gfc_code *c)
2993 name = gfc_get_string (PREFIX ("lstat_i%d_sub"), gfc_default_integer_kind);
2994 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2999 gfc_resolve_fstat_sub (gfc_code *c)
3005 u = c->ext.actual->expr;
3006 ts = &c->ext.actual->next->expr->ts;
3007 if (u->ts.kind != ts->kind)
3008 gfc_convert_type (u, ts, 2);
3009 name = gfc_get_string (PREFIX ("fstat_i%d_sub"), ts->kind);
3010 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3015 gfc_resolve_fgetc_sub (gfc_code *c)
3022 u = c->ext.actual->expr;
3023 st = c->ext.actual->next->next->expr;
3025 if (u->ts.kind != gfc_c_int_kind)
3027 ts.type = BT_INTEGER;
3028 ts.kind = gfc_c_int_kind;
3031 gfc_convert_type (u, &ts, 2);
3035 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), st->ts.kind);
3037 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), gfc_default_integer_kind);
3039 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3044 gfc_resolve_fget_sub (gfc_code *c)
3049 st = c->ext.actual->next->expr;
3051 name = gfc_get_string (PREFIX ("fget_i%d_sub"), st->ts.kind);
3053 name = gfc_get_string (PREFIX ("fget_i%d_sub"), gfc_default_integer_kind);
3055 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3060 gfc_resolve_fputc_sub (gfc_code *c)
3067 u = c->ext.actual->expr;
3068 st = c->ext.actual->next->next->expr;
3070 if (u->ts.kind != gfc_c_int_kind)
3072 ts.type = BT_INTEGER;
3073 ts.kind = gfc_c_int_kind;
3076 gfc_convert_type (u, &ts, 2);
3080 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), st->ts.kind);
3082 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), gfc_default_integer_kind);
3084 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3089 gfc_resolve_fput_sub (gfc_code *c)
3094 st = c->ext.actual->next->expr;
3096 name = gfc_get_string (PREFIX ("fput_i%d_sub"), st->ts.kind);
3098 name = gfc_get_string (PREFIX ("fput_i%d_sub"), gfc_default_integer_kind);
3100 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3105 gfc_resolve_fseek_sub (gfc_code *c)
3114 unit = c->ext.actual->expr;
3115 offset = c->ext.actual->next->expr;
3116 whence = c->ext.actual->next->next->expr;
3117 status = c->ext.actual->next->next->next->expr;
3119 if (unit->ts.kind != gfc_c_int_kind)
3121 ts.type = BT_INTEGER;
3122 ts.kind = gfc_c_int_kind;
3125 gfc_convert_type (unit, &ts, 2);
3128 if (offset->ts.kind != gfc_intio_kind)
3130 ts.type = BT_INTEGER;
3131 ts.kind = gfc_intio_kind;
3134 gfc_convert_type (offset, &ts, 2);
3137 if (whence->ts.kind != gfc_c_int_kind)
3139 ts.type = BT_INTEGER;
3140 ts.kind = gfc_c_int_kind;
3143 gfc_convert_type (whence, &ts, 2);
3146 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub"));
3150 gfc_resolve_ftell_sub (gfc_code *c)
3158 unit = c->ext.actual->expr;
3159 offset = c->ext.actual->next->expr;
3161 if (unit->ts.kind != gfc_c_int_kind)
3163 ts.type = BT_INTEGER;
3164 ts.kind = gfc_c_int_kind;
3167 gfc_convert_type (unit, &ts, 2);
3170 name = gfc_get_string (PREFIX ("ftell_i%d_sub"), offset->ts.kind);
3171 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3176 gfc_resolve_ttynam_sub (gfc_code *c)
3181 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
3183 ts.type = BT_INTEGER;
3184 ts.kind = gfc_c_int_kind;
3187 gfc_convert_type (c->ext.actual->expr, &ts, 2);
3190 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ttynam_sub"));
3194 /* Resolve the UMASK intrinsic subroutine. */
3197 gfc_resolve_umask_sub (gfc_code *c)
3202 if (c->ext.actual->next->expr != NULL)
3203 kind = c->ext.actual->next->expr->ts.kind;
3205 kind = gfc_default_integer_kind;
3207 name = gfc_get_string (PREFIX ("umask_i%d_sub"), kind);
3208 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3211 /* Resolve the UNLINK intrinsic subroutine. */
3214 gfc_resolve_unlink_sub (gfc_code *c)
3219 if (c->ext.actual->next->expr != NULL)
3220 kind = c->ext.actual->next->expr->ts.kind;
3222 kind = gfc_default_integer_kind;
3224 name = gfc_get_string (PREFIX ("unlink_i%d_sub"), kind);
3225 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);