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
* a
, gfc_expr
* p
)
528 f
->ts
.type
= a
->ts
.type
;
530 f
->ts
.kind
= gfc_kind_max (a
,p
);
532 f
->ts
.kind
= a
->ts
.kind
;
534 if (p
!= NULL
&& a
->ts
.kind
!= p
->ts
.kind
)
536 if (a
->ts
.kind
== gfc_kind_max (a
,p
))
537 gfc_convert_type(p
, &a
->ts
, 2);
539 gfc_convert_type(a
, &p
->ts
, 2);
542 f
->value
.function
.name
=
543 gfc_get_string ("__dim_%c%d", gfc_type_letter (f
->ts
.type
), f
->ts
.kind
);
548 gfc_resolve_dot_product (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b
)
552 if (a
->ts
.type
== BT_LOGICAL
&& b
->ts
.type
== BT_LOGICAL
)
554 f
->ts
.type
= BT_LOGICAL
;
555 f
->ts
.kind
= gfc_default_logical_kind
;
559 temp
.expr_type
= EXPR_OP
;
560 gfc_clear_ts (&temp
.ts
);
561 temp
.value
.op
.operator = INTRINSIC_NONE
;
562 temp
.value
.op
.op1
= a
;
563 temp
.value
.op
.op2
= b
;
564 gfc_type_convert_binary (&temp
);
568 f
->value
.function
.name
=
569 gfc_get_string (PREFIX("dot_product_%c%d"), gfc_type_letter (f
->ts
.type
),
575 gfc_resolve_dprod (gfc_expr
* f
,
576 gfc_expr
* a ATTRIBUTE_UNUSED
,
577 gfc_expr
* b ATTRIBUTE_UNUSED
)
579 f
->ts
.kind
= gfc_default_double_kind
;
580 f
->ts
.type
= BT_REAL
;
582 f
->value
.function
.name
= gfc_get_string ("__dprod_r%d", f
->ts
.kind
);
587 gfc_resolve_eoshift (gfc_expr
* f
, gfc_expr
* array
,
595 f
->rank
= array
->rank
;
596 f
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
601 if (boundary
&& boundary
->rank
> 0)
604 /* Convert shift to at least gfc_default_integer_kind, so we don't need
605 kind=1 and kind=2 versions of the library functions. */
606 if (shift
->ts
.kind
< gfc_default_integer_kind
)
609 ts
.type
= BT_INTEGER
;
610 ts
.kind
= gfc_default_integer_kind
;
611 gfc_convert_type_warn (shift
, &ts
, 2, 0);
616 gfc_resolve_dim_arg (dim
);
617 /* Convert dim to shift's kind, so we don't need so many variations. */
618 if (dim
->ts
.kind
!= shift
->ts
.kind
)
619 gfc_convert_type_warn (dim
, &shift
->ts
, 2, 0);
622 f
->value
.function
.name
=
623 gfc_get_string (PREFIX("eoshift%d_%d%s"), n
, shift
->ts
.kind
,
624 array
->ts
.type
== BT_CHARACTER
? "_char" : "");
629 gfc_resolve_exp (gfc_expr
* f
, gfc_expr
* x
)
632 f
->value
.function
.name
=
633 gfc_get_string ("__exp_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
638 gfc_resolve_exponent (gfc_expr
* f
, gfc_expr
* x
)
640 f
->ts
.type
= BT_INTEGER
;
641 f
->ts
.kind
= gfc_default_integer_kind
;
643 f
->value
.function
.name
= gfc_get_string ("__exponent_%d", x
->ts
.kind
);
648 gfc_resolve_fdate (gfc_expr
* f
)
650 f
->ts
.type
= BT_CHARACTER
;
651 f
->ts
.kind
= gfc_default_character_kind
;
652 f
->value
.function
.name
= gfc_get_string (PREFIX("fdate"));
657 gfc_resolve_floor (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
659 f
->ts
.type
= BT_INTEGER
;
660 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
661 : mpz_get_si (kind
->value
.integer
);
663 f
->value
.function
.name
=
664 gfc_get_string ("__floor%d_%c%d", f
->ts
.kind
,
665 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
670 gfc_resolve_fnum (gfc_expr
* f
, gfc_expr
* n
)
672 f
->ts
.type
= BT_INTEGER
;
673 f
->ts
.kind
= gfc_default_integer_kind
;
674 if (n
->ts
.kind
!= f
->ts
.kind
)
675 gfc_convert_type (n
, &f
->ts
, 2);
676 f
->value
.function
.name
= gfc_get_string (PREFIX("fnum_i%d"), f
->ts
.kind
);
681 gfc_resolve_fraction (gfc_expr
* f
, gfc_expr
* x
)
684 f
->value
.function
.name
= gfc_get_string ("__fraction_%d", x
->ts
.kind
);
688 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
691 gfc_resolve_g77_math1 (gfc_expr
* f
, gfc_expr
* x
)
694 f
->value
.function
.name
= gfc_get_string ("<intrinsic>");
699 gfc_resolve_getcwd (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
701 f
->ts
.type
= BT_INTEGER
;
703 f
->value
.function
.name
= gfc_get_string (PREFIX("getcwd"));
708 gfc_resolve_getgid (gfc_expr
* f
)
710 f
->ts
.type
= BT_INTEGER
;
712 f
->value
.function
.name
= gfc_get_string (PREFIX("getgid"));
717 gfc_resolve_getpid (gfc_expr
* f
)
719 f
->ts
.type
= BT_INTEGER
;
721 f
->value
.function
.name
= gfc_get_string (PREFIX("getpid"));
726 gfc_resolve_getuid (gfc_expr
* f
)
728 f
->ts
.type
= BT_INTEGER
;
730 f
->value
.function
.name
= gfc_get_string (PREFIX("getuid"));
734 gfc_resolve_hostnm (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
736 f
->ts
.type
= BT_INTEGER
;
738 f
->value
.function
.name
= gfc_get_string (PREFIX ("hostnm"));
742 gfc_resolve_iand (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j
)
744 /* If the kind of i and j are different, then g77 cross-promoted the
745 kinds to the largest value. The Fortran 95 standard requires the
747 if (i
->ts
.kind
!= j
->ts
.kind
)
749 if (i
->ts
.kind
== gfc_kind_max (i
,j
))
750 gfc_convert_type(j
, &i
->ts
, 2);
752 gfc_convert_type(i
, &j
->ts
, 2);
756 f
->value
.function
.name
= gfc_get_string ("__iand_%d", i
->ts
.kind
);
761 gfc_resolve_ibclr (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* pos ATTRIBUTE_UNUSED
)
764 f
->value
.function
.name
= gfc_get_string ("__ibclr_%d", i
->ts
.kind
);
769 gfc_resolve_ibits (gfc_expr
* f
, gfc_expr
* i
,
770 gfc_expr
* pos ATTRIBUTE_UNUSED
,
771 gfc_expr
* len ATTRIBUTE_UNUSED
)
774 f
->value
.function
.name
= gfc_get_string ("__ibits_%d", i
->ts
.kind
);
779 gfc_resolve_ibset (gfc_expr
* f
, gfc_expr
* i
,
780 gfc_expr
* pos ATTRIBUTE_UNUSED
)
783 f
->value
.function
.name
= gfc_get_string ("__ibset_%d", i
->ts
.kind
);
788 gfc_resolve_ichar (gfc_expr
* f
, gfc_expr
* c
)
790 f
->ts
.type
= BT_INTEGER
;
791 f
->ts
.kind
= gfc_default_integer_kind
;
793 f
->value
.function
.name
= gfc_get_string ("__ichar_%d", c
->ts
.kind
);
798 gfc_resolve_idnint (gfc_expr
* f
, gfc_expr
* a
)
800 gfc_resolve_nint (f
, a
, NULL
);
805 gfc_resolve_ierrno (gfc_expr
* f
)
807 f
->ts
.type
= BT_INTEGER
;
808 f
->ts
.kind
= gfc_default_integer_kind
;
809 f
->value
.function
.name
= gfc_get_string (PREFIX("ierrno_i%d"), f
->ts
.kind
);
814 gfc_resolve_ieor (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j
)
816 /* If the kind of i and j are different, then g77 cross-promoted the
817 kinds to the largest value. The Fortran 95 standard requires the
819 if (i
->ts
.kind
!= j
->ts
.kind
)
821 if (i
->ts
.kind
== gfc_kind_max (i
,j
))
822 gfc_convert_type(j
, &i
->ts
, 2);
824 gfc_convert_type(i
, &j
->ts
, 2);
828 f
->value
.function
.name
= gfc_get_string ("__ieor_%d", i
->ts
.kind
);
833 gfc_resolve_ior (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j
)
835 /* If the kind of i and j are different, then g77 cross-promoted the
836 kinds to the largest value. The Fortran 95 standard requires the
838 if (i
->ts
.kind
!= j
->ts
.kind
)
840 if (i
->ts
.kind
== gfc_kind_max (i
,j
))
841 gfc_convert_type(j
, &i
->ts
, 2);
843 gfc_convert_type(i
, &j
->ts
, 2);
847 f
->value
.function
.name
= gfc_get_string ("__ior_%d", i
->ts
.kind
);
852 gfc_resolve_int (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
854 f
->ts
.type
= BT_INTEGER
;
855 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
856 : mpz_get_si (kind
->value
.integer
);
858 f
->value
.function
.name
=
859 gfc_get_string ("__int_%d_%c%d", f
->ts
.kind
, gfc_type_letter (a
->ts
.type
),
865 gfc_resolve_isatty (gfc_expr
* f
, gfc_expr
* u
)
869 f
->ts
.type
= BT_LOGICAL
;
870 f
->ts
.kind
= gfc_default_integer_kind
;
871 if (u
->ts
.kind
!= gfc_c_int_kind
)
873 ts
.type
= BT_INTEGER
;
874 ts
.kind
= gfc_c_int_kind
;
877 gfc_convert_type (u
, &ts
, 2);
880 f
->value
.function
.name
= gfc_get_string (PREFIX("isatty_l%d"), f
->ts
.kind
);
885 gfc_resolve_ishft (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* shift
)
888 f
->value
.function
.name
=
889 gfc_get_string ("__ishft_%d_%d", i
->ts
.kind
, shift
->ts
.kind
);
894 gfc_resolve_ishftc (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* shift
,
899 s_kind
= (size
== NULL
) ? gfc_default_integer_kind
: shift
->ts
.kind
;
902 f
->value
.function
.name
=
903 gfc_get_string ("__ishftc_%d_%d_%d", i
->ts
.kind
, shift
->ts
.kind
, s_kind
);
908 gfc_resolve_kill (gfc_expr
* f
, ATTRIBUTE_UNUSED gfc_expr
* p
,
909 ATTRIBUTE_UNUSED gfc_expr
* s
)
911 f
->ts
.type
= BT_INTEGER
;
912 f
->ts
.kind
= gfc_default_integer_kind
;
914 f
->value
.function
.name
= gfc_get_string (PREFIX("kill_i%d"), f
->ts
.kind
);
919 gfc_resolve_lbound (gfc_expr
* f
, gfc_expr
* array
,
922 static char lbound
[] = "__lbound";
924 f
->ts
.type
= BT_INTEGER
;
925 f
->ts
.kind
= gfc_default_integer_kind
;
930 f
->shape
= gfc_get_shape (1);
931 mpz_init_set_ui (f
->shape
[0], array
->rank
);
934 f
->value
.function
.name
= lbound
;
939 gfc_resolve_len (gfc_expr
* f
, gfc_expr
* string
)
941 f
->ts
.type
= BT_INTEGER
;
942 f
->ts
.kind
= gfc_default_integer_kind
;
943 f
->value
.function
.name
= gfc_get_string ("__len_%d", string
->ts
.kind
);
948 gfc_resolve_len_trim (gfc_expr
* f
, gfc_expr
* string
)
950 f
->ts
.type
= BT_INTEGER
;
951 f
->ts
.kind
= gfc_default_integer_kind
;
952 f
->value
.function
.name
= gfc_get_string ("__len_trim%d", string
->ts
.kind
);
957 gfc_resolve_link (gfc_expr
* f
, gfc_expr
* p1 ATTRIBUTE_UNUSED
,
958 gfc_expr
* p2 ATTRIBUTE_UNUSED
)
960 f
->ts
.type
= BT_INTEGER
;
961 f
->ts
.kind
= gfc_default_integer_kind
;
962 f
->value
.function
.name
= gfc_get_string (PREFIX("link_i%d"), f
->ts
.kind
);
967 gfc_resolve_loc (gfc_expr
*f
, gfc_expr
*x
)
969 f
->ts
.type
= BT_INTEGER
;
970 f
->ts
.kind
= gfc_index_integer_kind
;
971 f
->value
.function
.name
= gfc_get_string ("__loc_%d", x
->ts
.kind
);
976 gfc_resolve_log (gfc_expr
* f
, gfc_expr
* x
)
979 f
->value
.function
.name
=
980 gfc_get_string ("__log_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
985 gfc_resolve_log10 (gfc_expr
* f
, gfc_expr
* x
)
988 f
->value
.function
.name
=
989 gfc_get_string ("__log10_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
994 gfc_resolve_logical (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
996 f
->ts
.type
= BT_LOGICAL
;
997 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_logical_kind
998 : mpz_get_si (kind
->value
.integer
);
1001 f
->value
.function
.name
=
1002 gfc_get_string ("__logical_%d_%c%d", f
->ts
.kind
,
1003 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1008 gfc_resolve_malloc (gfc_expr
* f
, gfc_expr
* size
)
1010 if (size
->ts
.kind
< gfc_index_integer_kind
)
1014 ts
.type
= BT_INTEGER
;
1015 ts
.kind
= gfc_index_integer_kind
;
1016 gfc_convert_type_warn (size
, &ts
, 2, 0);
1019 f
->ts
.type
= BT_INTEGER
;
1020 f
->ts
.kind
= gfc_index_integer_kind
;
1021 f
->value
.function
.name
= gfc_get_string (PREFIX("malloc"));
1026 gfc_resolve_matmul (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b
)
1030 if (a
->ts
.type
== BT_LOGICAL
&& b
->ts
.type
== BT_LOGICAL
)
1032 f
->ts
.type
= BT_LOGICAL
;
1033 f
->ts
.kind
= gfc_default_logical_kind
;
1037 temp
.expr_type
= EXPR_OP
;
1038 gfc_clear_ts (&temp
.ts
);
1039 temp
.value
.op
.operator = INTRINSIC_NONE
;
1040 temp
.value
.op
.op1
= a
;
1041 temp
.value
.op
.op2
= b
;
1042 gfc_type_convert_binary (&temp
);
1046 f
->rank
= (a
->rank
== 2 && b
->rank
== 2) ? 2 : 1;
1048 f
->value
.function
.name
=
1049 gfc_get_string (PREFIX("matmul_%c%d"), gfc_type_letter (f
->ts
.type
),
1055 gfc_resolve_minmax (const char * name
, gfc_expr
* f
, gfc_actual_arglist
* args
)
1057 gfc_actual_arglist
*a
;
1059 f
->ts
.type
= args
->expr
->ts
.type
;
1060 f
->ts
.kind
= args
->expr
->ts
.kind
;
1061 /* Find the largest type kind. */
1062 for (a
= args
->next
; a
; a
= a
->next
)
1064 if (a
->expr
->ts
.kind
> f
->ts
.kind
)
1065 f
->ts
.kind
= a
->expr
->ts
.kind
;
1068 /* Convert all parameters to the required kind. */
1069 for (a
= args
; a
; a
= a
->next
)
1071 if (a
->expr
->ts
.kind
!= f
->ts
.kind
)
1072 gfc_convert_type (a
->expr
, &f
->ts
, 2);
1075 f
->value
.function
.name
=
1076 gfc_get_string (name
, gfc_type_letter (f
->ts
.type
), f
->ts
.kind
);
1081 gfc_resolve_max (gfc_expr
* f
, gfc_actual_arglist
* args
)
1083 gfc_resolve_minmax ("__max_%c%d", f
, args
);
1088 gfc_resolve_maxloc (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1093 f
->ts
.type
= BT_INTEGER
;
1094 f
->ts
.kind
= gfc_default_integer_kind
;
1100 f
->rank
= array
->rank
- 1;
1101 gfc_resolve_dim_arg (dim
);
1104 name
= mask
? "mmaxloc" : "maxloc";
1105 f
->value
.function
.name
=
1106 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name
, dim
!= NULL
, f
->ts
.kind
,
1107 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1112 gfc_resolve_maxval (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1119 f
->rank
= array
->rank
- 1;
1120 gfc_resolve_dim_arg (dim
);
1123 f
->value
.function
.name
=
1124 gfc_get_string (PREFIX("%s_%c%d"), mask
? "mmaxval" : "maxval",
1125 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1130 gfc_resolve_merge (gfc_expr
* f
, gfc_expr
* tsource
,
1131 gfc_expr
* fsource ATTRIBUTE_UNUSED
,
1132 gfc_expr
* mask ATTRIBUTE_UNUSED
)
1134 if (tsource
->ts
.type
== BT_CHARACTER
)
1135 check_charlen_present (tsource
);
1137 f
->ts
= tsource
->ts
;
1138 f
->value
.function
.name
=
1139 gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource
->ts
.type
),
1145 gfc_resolve_min (gfc_expr
* f
, gfc_actual_arglist
* args
)
1147 gfc_resolve_minmax ("__min_%c%d", f
, args
);
1152 gfc_resolve_minloc (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1157 f
->ts
.type
= BT_INTEGER
;
1158 f
->ts
.kind
= gfc_default_integer_kind
;
1164 f
->rank
= array
->rank
- 1;
1165 gfc_resolve_dim_arg (dim
);
1168 name
= mask
? "mminloc" : "minloc";
1169 f
->value
.function
.name
=
1170 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name
, dim
!= NULL
, f
->ts
.kind
,
1171 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1176 gfc_resolve_minval (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1183 f
->rank
= array
->rank
- 1;
1184 gfc_resolve_dim_arg (dim
);
1187 f
->value
.function
.name
=
1188 gfc_get_string (PREFIX("%s_%c%d"), mask
? "mminval" : "minval",
1189 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1194 gfc_resolve_mod (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* p
)
1196 f
->ts
.type
= a
->ts
.type
;
1198 f
->ts
.kind
= gfc_kind_max (a
,p
);
1200 f
->ts
.kind
= a
->ts
.kind
;
1202 if (p
!= NULL
&& a
->ts
.kind
!= p
->ts
.kind
)
1204 if (a
->ts
.kind
== gfc_kind_max (a
,p
))
1205 gfc_convert_type(p
, &a
->ts
, 2);
1207 gfc_convert_type(a
, &p
->ts
, 2);
1210 f
->value
.function
.name
=
1211 gfc_get_string ("__mod_%c%d", gfc_type_letter (f
->ts
.type
), f
->ts
.kind
);
1216 gfc_resolve_modulo (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* p
)
1218 f
->ts
.type
= a
->ts
.type
;
1220 f
->ts
.kind
= gfc_kind_max (a
,p
);
1222 f
->ts
.kind
= a
->ts
.kind
;
1224 if (p
!= NULL
&& a
->ts
.kind
!= p
->ts
.kind
)
1226 if (a
->ts
.kind
== gfc_kind_max (a
,p
))
1227 gfc_convert_type(p
, &a
->ts
, 2);
1229 gfc_convert_type(a
, &p
->ts
, 2);
1232 f
->value
.function
.name
=
1233 gfc_get_string ("__modulo_%c%d", gfc_type_letter (f
->ts
.type
),
1238 gfc_resolve_nearest (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
*p ATTRIBUTE_UNUSED
)
1241 f
->value
.function
.name
=
1242 gfc_get_string ("__nearest_%c%d", gfc_type_letter (a
->ts
.type
),
1247 gfc_resolve_nint (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
1249 f
->ts
.type
= BT_INTEGER
;
1250 f
->ts
.kind
= (kind
== NULL
) ? gfc_default_integer_kind
1251 : mpz_get_si (kind
->value
.integer
);
1253 f
->value
.function
.name
=
1254 gfc_get_string ("__nint_%d_%d", f
->ts
.kind
, a
->ts
.kind
);
1259 gfc_resolve_not (gfc_expr
* f
, gfc_expr
* i
)
1262 f
->value
.function
.name
= gfc_get_string ("__not_%d", i
->ts
.kind
);
1267 gfc_resolve_or (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j
)
1269 f
->ts
.type
= i
->ts
.type
;
1270 f
->ts
.kind
= gfc_kind_max (i
,j
);
1272 if (i
->ts
.kind
!= j
->ts
.kind
)
1274 if (i
->ts
.kind
== gfc_kind_max (i
,j
))
1275 gfc_convert_type(j
, &i
->ts
, 2);
1277 gfc_convert_type(i
, &j
->ts
, 2);
1280 f
->value
.function
.name
= gfc_get_string ("__or_%c%d",
1281 gfc_type_letter (i
->ts
.type
),
1287 gfc_resolve_pack (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* mask
,
1288 gfc_expr
* vector ATTRIBUTE_UNUSED
)
1293 if (mask
->rank
!= 0)
1294 f
->value
.function
.name
= (array
->ts
.type
== BT_CHARACTER
1295 ? PREFIX("pack_char")
1299 /* We convert mask to default logical only in the scalar case.
1300 In the array case we can simply read the array as if it were
1301 of type default logical. */
1302 if (mask
->ts
.kind
!= gfc_default_logical_kind
)
1306 ts
.type
= BT_LOGICAL
;
1307 ts
.kind
= gfc_default_logical_kind
;
1308 gfc_convert_type (mask
, &ts
, 2);
1311 f
->value
.function
.name
= (array
->ts
.type
== BT_CHARACTER
1312 ? PREFIX("pack_s_char")
1313 : PREFIX("pack_s"));
1319 gfc_resolve_product (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1326 f
->rank
= array
->rank
- 1;
1327 gfc_resolve_dim_arg (dim
);
1330 f
->value
.function
.name
=
1331 gfc_get_string (PREFIX("%s_%c%d"), mask
? "mproduct" : "product",
1332 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1337 gfc_resolve_real (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* kind
)
1339 f
->ts
.type
= BT_REAL
;
1342 f
->ts
.kind
= mpz_get_si (kind
->value
.integer
);
1344 f
->ts
.kind
= (a
->ts
.type
== BT_COMPLEX
) ?
1345 a
->ts
.kind
: gfc_default_real_kind
;
1347 f
->value
.function
.name
=
1348 gfc_get_string ("__real_%d_%c%d", f
->ts
.kind
,
1349 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1354 gfc_resolve_realpart (gfc_expr
* f
, gfc_expr
* a
)
1356 f
->ts
.type
= BT_REAL
;
1357 f
->ts
.kind
= a
->ts
.kind
;
1358 f
->value
.function
.name
=
1359 gfc_get_string ("__real_%d_%c%d", f
->ts
.kind
,
1360 gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1365 gfc_resolve_rename (gfc_expr
* f
, gfc_expr
* p1 ATTRIBUTE_UNUSED
,
1366 gfc_expr
* p2 ATTRIBUTE_UNUSED
)
1368 f
->ts
.type
= BT_INTEGER
;
1369 f
->ts
.kind
= gfc_default_integer_kind
;
1370 f
->value
.function
.name
= gfc_get_string (PREFIX("rename_i%d"), f
->ts
.kind
);
1375 gfc_resolve_repeat (gfc_expr
* f
, gfc_expr
* string
,
1376 gfc_expr
* ncopies ATTRIBUTE_UNUSED
)
1378 f
->ts
.type
= BT_CHARACTER
;
1379 f
->ts
.kind
= string
->ts
.kind
;
1380 f
->value
.function
.name
= gfc_get_string ("__repeat_%d", string
->ts
.kind
);
1385 gfc_resolve_reshape (gfc_expr
* f
, gfc_expr
* source
, gfc_expr
* shape
,
1386 gfc_expr
* pad ATTRIBUTE_UNUSED
,
1387 gfc_expr
* order ATTRIBUTE_UNUSED
)
1395 gfc_array_size (shape
, &rank
);
1396 f
->rank
= mpz_get_si (rank
);
1398 switch (source
->ts
.type
)
1401 kind
= source
->ts
.kind
* 2;
1407 kind
= source
->ts
.kind
;
1421 if (source
->ts
.type
== BT_COMPLEX
)
1422 f
->value
.function
.name
=
1423 gfc_get_string (PREFIX("reshape_%c%d"),
1424 gfc_type_letter (BT_COMPLEX
), source
->ts
.kind
);
1426 f
->value
.function
.name
=
1427 gfc_get_string (PREFIX("reshape_%d"), source
->ts
.kind
);
1432 f
->value
.function
.name
= (source
->ts
.type
== BT_CHARACTER
1433 ? PREFIX("reshape_char")
1434 : PREFIX("reshape"));
1438 /* TODO: Make this work with a constant ORDER parameter. */
1439 if (shape
->expr_type
== EXPR_ARRAY
1440 && gfc_is_constant_expr (shape
)
1444 f
->shape
= gfc_get_shape (f
->rank
);
1445 c
= shape
->value
.constructor
;
1446 for (i
= 0; i
< f
->rank
; i
++)
1448 mpz_init_set (f
->shape
[i
], c
->expr
->value
.integer
);
1453 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1454 so many runtime variations. */
1455 if (shape
->ts
.kind
!= gfc_index_integer_kind
)
1457 gfc_typespec ts
= shape
->ts
;
1458 ts
.kind
= gfc_index_integer_kind
;
1459 gfc_convert_type_warn (shape
, &ts
, 2, 0);
1461 if (order
&& order
->ts
.kind
!= gfc_index_integer_kind
)
1462 gfc_convert_type_warn (order
, &shape
->ts
, 2, 0);
1467 gfc_resolve_rrspacing (gfc_expr
* f
, gfc_expr
* x
)
1470 f
->value
.function
.name
= gfc_get_string ("__rrspacing_%d", x
->ts
.kind
);
1475 gfc_resolve_scale (gfc_expr
* f
, gfc_expr
* x
, gfc_expr
* i
)
1479 /* The implementation calls scalbn which takes an int as the
1481 if (i
->ts
.kind
!= gfc_c_int_kind
)
1485 ts
.type
= BT_INTEGER
;
1486 ts
.kind
= gfc_default_integer_kind
;
1488 gfc_convert_type_warn (i
, &ts
, 2, 0);
1491 f
->value
.function
.name
= gfc_get_string ("__scale_%d", x
->ts
.kind
);
1496 gfc_resolve_scan (gfc_expr
* f
, gfc_expr
* string
,
1497 gfc_expr
* set ATTRIBUTE_UNUSED
,
1498 gfc_expr
* back ATTRIBUTE_UNUSED
)
1500 f
->ts
.type
= BT_INTEGER
;
1501 f
->ts
.kind
= gfc_default_integer_kind
;
1502 f
->value
.function
.name
= gfc_get_string ("__scan_%d", string
->ts
.kind
);
1507 gfc_resolve_secnds (gfc_expr
* t1
, gfc_expr
* t0
)
1510 t1
->value
.function
.name
=
1511 gfc_get_string (PREFIX("secnds"));
1516 gfc_resolve_set_exponent (gfc_expr
* f
, gfc_expr
* x
, gfc_expr
* i
)
1520 /* The library implementation uses GFC_INTEGER_4 unconditionally,
1521 convert type so we don't have to implement all possible
1523 if (i
->ts
.kind
!= 4)
1527 ts
.type
= BT_INTEGER
;
1528 ts
.kind
= gfc_default_integer_kind
;
1530 gfc_convert_type_warn (i
, &ts
, 2, 0);
1533 f
->value
.function
.name
= gfc_get_string ("__set_exponent_%d", x
->ts
.kind
);
1538 gfc_resolve_shape (gfc_expr
* f
, gfc_expr
* array
)
1540 f
->ts
.type
= BT_INTEGER
;
1541 f
->ts
.kind
= gfc_default_integer_kind
;
1543 f
->value
.function
.name
= gfc_get_string (PREFIX("shape_%d"), f
->ts
.kind
);
1544 f
->shape
= gfc_get_shape (1);
1545 mpz_init_set_ui (f
->shape
[0], array
->rank
);
1550 gfc_resolve_sign (gfc_expr
* f
, gfc_expr
* a
, gfc_expr
* b ATTRIBUTE_UNUSED
)
1553 f
->value
.function
.name
=
1554 gfc_get_string ("__sign_%c%d", gfc_type_letter (a
->ts
.type
), a
->ts
.kind
);
1559 gfc_resolve_signal (gfc_expr
* f
, gfc_expr
*number
, gfc_expr
*handler
)
1561 f
->ts
.type
= BT_INTEGER
;
1562 f
->ts
.kind
= gfc_c_int_kind
;
1564 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1565 if (handler
->ts
.type
== BT_INTEGER
)
1567 if (handler
->ts
.kind
!= gfc_c_int_kind
)
1568 gfc_convert_type (handler
, &f
->ts
, 2);
1569 f
->value
.function
.name
= gfc_get_string (PREFIX("signal_func_int"));
1572 f
->value
.function
.name
= gfc_get_string (PREFIX("signal_func"));
1574 if (number
->ts
.kind
!= gfc_c_int_kind
)
1575 gfc_convert_type (number
, &f
->ts
, 2);
1580 gfc_resolve_sin (gfc_expr
* f
, gfc_expr
* x
)
1583 f
->value
.function
.name
=
1584 gfc_get_string ("__sin_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1589 gfc_resolve_sinh (gfc_expr
* f
, gfc_expr
* x
)
1592 f
->value
.function
.name
=
1593 gfc_get_string ("__sinh_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1598 gfc_resolve_spacing (gfc_expr
* f
, gfc_expr
* x
)
1601 f
->value
.function
.name
= gfc_get_string ("__spacing_%d", x
->ts
.kind
);
1606 gfc_resolve_spread (gfc_expr
* f
, gfc_expr
* source
,
1610 if (source
->ts
.type
== BT_CHARACTER
)
1611 check_charlen_present (source
);
1614 f
->rank
= source
->rank
+ 1;
1615 if (source
->rank
== 0)
1616 f
->value
.function
.name
= (source
->ts
.type
== BT_CHARACTER
1617 ? PREFIX("spread_char_scalar")
1618 : PREFIX("spread_scalar"));
1620 f
->value
.function
.name
= (source
->ts
.type
== BT_CHARACTER
1621 ? PREFIX("spread_char")
1622 : PREFIX("spread"));
1624 gfc_resolve_dim_arg (dim
);
1625 gfc_resolve_index (ncopies
, 1);
1630 gfc_resolve_sqrt (gfc_expr
* f
, gfc_expr
* x
)
1633 f
->value
.function
.name
=
1634 gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1638 /* Resolve the g77 compatibility function STAT AND FSTAT. */
1641 gfc_resolve_stat (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
,
1642 gfc_expr
* a ATTRIBUTE_UNUSED
)
1644 f
->ts
.type
= BT_INTEGER
;
1645 f
->ts
.kind
= gfc_default_integer_kind
;
1646 f
->value
.function
.name
= gfc_get_string (PREFIX("stat_i%d"), f
->ts
.kind
);
1651 gfc_resolve_fstat (gfc_expr
* f
, gfc_expr
* n
, gfc_expr
* a ATTRIBUTE_UNUSED
)
1653 f
->ts
.type
= BT_INTEGER
;
1654 f
->ts
.kind
= gfc_default_integer_kind
;
1655 if (n
->ts
.kind
!= f
->ts
.kind
)
1656 gfc_convert_type (n
, &f
->ts
, 2);
1658 f
->value
.function
.name
= gfc_get_string (PREFIX("fstat_i%d"), f
->ts
.kind
);
1663 gfc_resolve_fgetc (gfc_expr
* f
, gfc_expr
* u
, gfc_expr
* c ATTRIBUTE_UNUSED
)
1667 f
->ts
.type
= BT_INTEGER
;
1668 f
->ts
.kind
= gfc_c_int_kind
;
1669 if (u
->ts
.kind
!= gfc_c_int_kind
)
1671 ts
.type
= BT_INTEGER
;
1672 ts
.kind
= gfc_c_int_kind
;
1675 gfc_convert_type (u
, &ts
, 2);
1678 f
->value
.function
.name
= gfc_get_string (PREFIX("fgetc"));
1683 gfc_resolve_fget (gfc_expr
* f
, gfc_expr
* c ATTRIBUTE_UNUSED
)
1685 f
->ts
.type
= BT_INTEGER
;
1686 f
->ts
.kind
= gfc_c_int_kind
;
1687 f
->value
.function
.name
= gfc_get_string (PREFIX("fget"));
1692 gfc_resolve_fputc (gfc_expr
* f
, gfc_expr
* u
, gfc_expr
* c ATTRIBUTE_UNUSED
)
1696 f
->ts
.type
= BT_INTEGER
;
1697 f
->ts
.kind
= gfc_c_int_kind
;
1698 if (u
->ts
.kind
!= gfc_c_int_kind
)
1700 ts
.type
= BT_INTEGER
;
1701 ts
.kind
= gfc_c_int_kind
;
1704 gfc_convert_type (u
, &ts
, 2);
1707 f
->value
.function
.name
= gfc_get_string (PREFIX("fputc"));
1712 gfc_resolve_fput (gfc_expr
* f
, gfc_expr
* c ATTRIBUTE_UNUSED
)
1714 f
->ts
.type
= BT_INTEGER
;
1715 f
->ts
.kind
= gfc_c_int_kind
;
1716 f
->value
.function
.name
= gfc_get_string (PREFIX("fput"));
1721 gfc_resolve_ftell (gfc_expr
* f
, gfc_expr
* u
)
1725 f
->ts
.type
= BT_INTEGER
;
1726 f
->ts
.kind
= gfc_index_integer_kind
;
1727 if (u
->ts
.kind
!= gfc_c_int_kind
)
1729 ts
.type
= BT_INTEGER
;
1730 ts
.kind
= gfc_c_int_kind
;
1733 gfc_convert_type (u
, &ts
, 2);
1736 f
->value
.function
.name
= gfc_get_string (PREFIX("ftell"));
1741 gfc_resolve_sum (gfc_expr
* f
, gfc_expr
* array
, gfc_expr
* dim
,
1748 f
->rank
= array
->rank
- 1;
1749 gfc_resolve_dim_arg (dim
);
1752 f
->value
.function
.name
=
1753 gfc_get_string (PREFIX("%s_%c%d"), mask
? "msum" : "sum",
1754 gfc_type_letter (array
->ts
.type
), array
->ts
.kind
);
1759 gfc_resolve_symlnk (gfc_expr
* f
, gfc_expr
* p1 ATTRIBUTE_UNUSED
,
1760 gfc_expr
* p2 ATTRIBUTE_UNUSED
)
1762 f
->ts
.type
= BT_INTEGER
;
1763 f
->ts
.kind
= gfc_default_integer_kind
;
1764 f
->value
.function
.name
= gfc_get_string (PREFIX("symlnk_i%d"), f
->ts
.kind
);
1768 /* Resolve the g77 compatibility function SYSTEM. */
1771 gfc_resolve_system (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
1773 f
->ts
.type
= BT_INTEGER
;
1775 f
->value
.function
.name
= gfc_get_string (PREFIX("system"));
1780 gfc_resolve_tan (gfc_expr
* f
, gfc_expr
* x
)
1783 f
->value
.function
.name
=
1784 gfc_get_string ("__tan_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1789 gfc_resolve_tanh (gfc_expr
* f
, gfc_expr
* x
)
1792 f
->value
.function
.name
=
1793 gfc_get_string ("__tanh_%c%d", gfc_type_letter (x
->ts
.type
), x
->ts
.kind
);
1798 gfc_resolve_time (gfc_expr
* f
)
1800 f
->ts
.type
= BT_INTEGER
;
1802 f
->value
.function
.name
= gfc_get_string (PREFIX("time_func"));
1807 gfc_resolve_time8 (gfc_expr
* f
)
1809 f
->ts
.type
= BT_INTEGER
;
1811 f
->value
.function
.name
= gfc_get_string (PREFIX("time8_func"));
1816 gfc_resolve_transfer (gfc_expr
* f
, gfc_expr
* source ATTRIBUTE_UNUSED
,
1817 gfc_expr
* mold
, gfc_expr
* size
)
1819 /* TODO: Make this do something meaningful. */
1820 static char transfer0
[] = "__transfer0", transfer1
[] = "__transfer1";
1824 if (size
== NULL
&& mold
->rank
== 0)
1827 f
->value
.function
.name
= transfer0
;
1832 f
->value
.function
.name
= transfer1
;
1838 gfc_resolve_transpose (gfc_expr
* f
, gfc_expr
* matrix
)
1846 f
->shape
= gfc_get_shape (2);
1847 mpz_init_set (f
->shape
[0], matrix
->shape
[1]);
1848 mpz_init_set (f
->shape
[1], matrix
->shape
[0]);
1851 kind
= matrix
->ts
.kind
;
1859 switch (matrix
->ts
.type
)
1862 f
->value
.function
.name
=
1863 gfc_get_string (PREFIX("transpose_c%d"), kind
);
1869 /* Use the integer routines for real and logical cases. This
1870 assumes they all have the same alignment requirements. */
1871 f
->value
.function
.name
=
1872 gfc_get_string (PREFIX("transpose_i%d"), kind
);
1876 f
->value
.function
.name
= PREFIX("transpose");
1882 f
->value
.function
.name
= (matrix
->ts
.type
== BT_CHARACTER
1883 ? PREFIX("transpose_char")
1884 : PREFIX("transpose"));
1891 gfc_resolve_trim (gfc_expr
* f
, gfc_expr
* string
)
1893 f
->ts
.type
= BT_CHARACTER
;
1894 f
->ts
.kind
= string
->ts
.kind
;
1895 f
->value
.function
.name
= gfc_get_string ("__trim_%d", string
->ts
.kind
);
1900 gfc_resolve_ubound (gfc_expr
* f
, gfc_expr
* array
,
1903 static char ubound
[] = "__ubound";
1905 f
->ts
.type
= BT_INTEGER
;
1906 f
->ts
.kind
= gfc_default_integer_kind
;
1911 f
->shape
= gfc_get_shape (1);
1912 mpz_init_set_ui (f
->shape
[0], array
->rank
);
1915 f
->value
.function
.name
= ubound
;
1919 /* Resolve the g77 compatibility function UMASK. */
1922 gfc_resolve_umask (gfc_expr
* f
, gfc_expr
* n
)
1924 f
->ts
.type
= BT_INTEGER
;
1925 f
->ts
.kind
= n
->ts
.kind
;
1926 f
->value
.function
.name
= gfc_get_string (PREFIX("umask_i%d"), n
->ts
.kind
);
1930 /* Resolve the g77 compatibility function UNLINK. */
1933 gfc_resolve_unlink (gfc_expr
* f
, gfc_expr
* n ATTRIBUTE_UNUSED
)
1935 f
->ts
.type
= BT_INTEGER
;
1937 f
->value
.function
.name
= gfc_get_string (PREFIX("unlink"));
1942 gfc_resolve_ttynam (gfc_expr
* f
, gfc_expr
* unit
)
1946 f
->ts
.type
= BT_CHARACTER
;
1947 f
->ts
.kind
= gfc_default_character_kind
;
1949 if (unit
->ts
.kind
!= gfc_c_int_kind
)
1951 ts
.type
= BT_INTEGER
;
1952 ts
.kind
= gfc_c_int_kind
;
1955 gfc_convert_type (unit
, &ts
, 2);
1958 f
->value
.function
.name
= gfc_get_string (PREFIX("ttynam"));
1963 gfc_resolve_unpack (gfc_expr
* f
, gfc_expr
* vector
, gfc_expr
* mask
,
1964 gfc_expr
* field ATTRIBUTE_UNUSED
)
1967 f
->rank
= mask
->rank
;
1969 f
->value
.function
.name
=
1970 gfc_get_string (PREFIX("unpack%d%s"), field
->rank
> 0 ? 1 : 0,
1971 vector
->ts
.type
== BT_CHARACTER
? "_char" : "");
1976 gfc_resolve_verify (gfc_expr
* f
, gfc_expr
* string
,
1977 gfc_expr
* set ATTRIBUTE_UNUSED
,
1978 gfc_expr
* back ATTRIBUTE_UNUSED
)
1980 f
->ts
.type
= BT_INTEGER
;
1981 f
->ts
.kind
= gfc_default_integer_kind
;
1982 f
->value
.function
.name
= gfc_get_string ("__verify_%d", string
->ts
.kind
);
1987 gfc_resolve_xor (gfc_expr
* f
, gfc_expr
* i
, gfc_expr
* j
)
1989 f
->ts
.type
= i
->ts
.type
;
1990 f
->ts
.kind
= gfc_kind_max (i
,j
);
1992 if (i
->ts
.kind
!= j
->ts
.kind
)
1994 if (i
->ts
.kind
== gfc_kind_max (i
,j
))
1995 gfc_convert_type(j
, &i
->ts
, 2);
1997 gfc_convert_type(i
, &j
->ts
, 2);
2000 f
->value
.function
.name
= gfc_get_string ("__xor_%c%d",
2001 gfc_type_letter (i
->ts
.type
),
2006 /* Intrinsic subroutine resolution. */
2009 gfc_resolve_alarm_sub (gfc_code
* c
)
2012 gfc_expr
*seconds
, *handler
, *status
;
2015 seconds
= c
->ext
.actual
->expr
;
2016 handler
= c
->ext
.actual
->next
->expr
;
2017 status
= c
->ext
.actual
->next
->next
->expr
;
2018 ts
.type
= BT_INTEGER
;
2019 ts
.kind
= gfc_c_int_kind
;
2021 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2022 if (handler
->ts
.type
== BT_INTEGER
)
2024 if (handler
->ts
.kind
!= gfc_c_int_kind
)
2025 gfc_convert_type (handler
, &ts
, 2);
2026 name
= gfc_get_string (PREFIX("alarm_sub_int"));
2029 name
= gfc_get_string (PREFIX("alarm_sub"));
2031 if (seconds
->ts
.kind
!= gfc_c_int_kind
)
2032 gfc_convert_type (seconds
, &ts
, 2);
2033 if (status
!= NULL
&& status
->ts
.kind
!= gfc_c_int_kind
)
2034 gfc_convert_type (status
, &ts
, 2);
2036 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2040 gfc_resolve_cpu_time (gfc_code
* c ATTRIBUTE_UNUSED
)
2044 name
= gfc_get_string (PREFIX("cpu_time_%d"),
2045 c
->ext
.actual
->expr
->ts
.kind
);
2046 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2051 gfc_resolve_mvbits (gfc_code
* c
)
2056 kind
= c
->ext
.actual
->expr
->ts
.kind
;
2057 name
= gfc_get_string (PREFIX("mvbits_i%d"), kind
);
2059 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2064 gfc_resolve_random_number (gfc_code
* c ATTRIBUTE_UNUSED
)
2069 kind
= c
->ext
.actual
->expr
->ts
.kind
;
2070 if (c
->ext
.actual
->expr
->rank
== 0)
2071 name
= gfc_get_string (PREFIX("random_r%d"), kind
);
2073 name
= gfc_get_string (PREFIX("arandom_r%d"), kind
);
2075 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2080 gfc_resolve_rename_sub (gfc_code
* c
)
2085 if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
2086 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
2088 kind
= gfc_default_integer_kind
;
2090 name
= gfc_get_string (PREFIX("rename_i%d_sub"), kind
);
2091 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2096 gfc_resolve_kill_sub (gfc_code
* c
)
2101 if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
2102 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
2104 kind
= gfc_default_integer_kind
;
2106 name
= gfc_get_string (PREFIX("kill_i%d_sub"), kind
);
2107 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2112 gfc_resolve_link_sub (gfc_code
* c
)
2117 if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
2118 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
2120 kind
= gfc_default_integer_kind
;
2122 name
= gfc_get_string (PREFIX("link_i%d_sub"), kind
);
2123 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2128 gfc_resolve_symlnk_sub (gfc_code
* c
)
2133 if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
2134 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
2136 kind
= gfc_default_integer_kind
;
2138 name
= gfc_get_string (PREFIX("symlnk_i%d_sub"), kind
);
2139 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2143 /* G77 compatibility subroutines etime() and dtime(). */
2146 gfc_resolve_etime_sub (gfc_code
* c
)
2150 name
= gfc_get_string (PREFIX("etime_sub"));
2151 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2155 /* G77 compatibility subroutine second(). */
2158 gfc_resolve_second_sub (gfc_code
* c
)
2162 name
= gfc_get_string (PREFIX("second_sub"));
2163 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2168 gfc_resolve_sleep_sub (gfc_code
* c
)
2173 if (c
->ext
.actual
->expr
!= NULL
)
2174 kind
= c
->ext
.actual
->expr
->ts
.kind
;
2176 kind
= gfc_default_integer_kind
;
2178 name
= gfc_get_string (PREFIX("sleep_i%d_sub"), kind
);
2179 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2183 /* G77 compatibility function srand(). */
2186 gfc_resolve_srand (gfc_code
* c
)
2189 name
= gfc_get_string (PREFIX("srand"));
2190 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2194 /* Resolve the getarg intrinsic subroutine. */
2197 gfc_resolve_getarg (gfc_code
* c
)
2202 kind
= gfc_default_integer_kind
;
2203 name
= gfc_get_string (PREFIX("getarg_i%d"), kind
);
2204 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2207 /* Resolve the getcwd intrinsic subroutine. */
2210 gfc_resolve_getcwd_sub (gfc_code
* c
)
2215 if (c
->ext
.actual
->next
->expr
!= NULL
)
2216 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
2218 kind
= gfc_default_integer_kind
;
2220 name
= gfc_get_string (PREFIX("getcwd_i%d_sub"), kind
);
2221 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2225 /* Resolve the get_command intrinsic subroutine. */
2228 gfc_resolve_get_command (gfc_code
* c
)
2233 kind
= gfc_default_integer_kind
;
2234 name
= gfc_get_string (PREFIX("get_command_i%d"), kind
);
2235 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2239 /* Resolve the get_command_argument intrinsic subroutine. */
2242 gfc_resolve_get_command_argument (gfc_code
* c
)
2247 kind
= gfc_default_integer_kind
;
2248 name
= gfc_get_string (PREFIX("get_command_argument_i%d"), kind
);
2249 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2252 /* Resolve the get_environment_variable intrinsic subroutine. */
2255 gfc_resolve_get_environment_variable (gfc_code
* code
)
2260 kind
= gfc_default_integer_kind
;
2261 name
= gfc_get_string (PREFIX("get_environment_variable_i%d"), kind
);
2262 code
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2266 gfc_resolve_signal_sub (gfc_code
* c
)
2269 gfc_expr
*number
, *handler
, *status
;
2272 number
= c
->ext
.actual
->expr
;
2273 handler
= c
->ext
.actual
->next
->expr
;
2274 status
= c
->ext
.actual
->next
->next
->expr
;
2275 ts
.type
= BT_INTEGER
;
2276 ts
.kind
= gfc_c_int_kind
;
2278 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2279 if (handler
->ts
.type
== BT_INTEGER
)
2281 if (handler
->ts
.kind
!= gfc_c_int_kind
)
2282 gfc_convert_type (handler
, &ts
, 2);
2283 name
= gfc_get_string (PREFIX("signal_sub_int"));
2286 name
= gfc_get_string (PREFIX("signal_sub"));
2288 if (number
->ts
.kind
!= gfc_c_int_kind
)
2289 gfc_convert_type (number
, &ts
, 2);
2290 if (status
!= NULL
&& status
->ts
.kind
!= gfc_c_int_kind
)
2291 gfc_convert_type (status
, &ts
, 2);
2293 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2296 /* Resolve the SYSTEM intrinsic subroutine. */
2299 gfc_resolve_system_sub (gfc_code
* c
)
2303 name
= gfc_get_string (PREFIX("system_sub"));
2304 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2307 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2310 gfc_resolve_system_clock (gfc_code
* c
)
2315 if (c
->ext
.actual
->expr
!= NULL
)
2316 kind
= c
->ext
.actual
->expr
->ts
.kind
;
2317 else if (c
->ext
.actual
->next
->expr
!= NULL
)
2318 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
2319 else if (c
->ext
.actual
->next
->next
->expr
!= NULL
)
2320 kind
= c
->ext
.actual
->next
->next
->expr
->ts
.kind
;
2322 kind
= gfc_default_integer_kind
;
2324 name
= gfc_get_string (PREFIX("system_clock_%d"), kind
);
2325 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2328 /* Resolve the EXIT intrinsic subroutine. */
2331 gfc_resolve_exit (gfc_code
* c
)
2336 if (c
->ext
.actual
->expr
!= NULL
)
2337 kind
= c
->ext
.actual
->expr
->ts
.kind
;
2339 kind
= gfc_default_integer_kind
;
2341 name
= gfc_get_string (PREFIX("exit_i%d"), kind
);
2342 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2345 /* Resolve the FLUSH intrinsic subroutine. */
2348 gfc_resolve_flush (gfc_code
* c
)
2354 ts
.type
= BT_INTEGER
;
2355 ts
.kind
= gfc_default_integer_kind
;
2356 n
= c
->ext
.actual
->expr
;
2358 && n
->ts
.kind
!= ts
.kind
)
2359 gfc_convert_type (n
, &ts
, 2);
2361 name
= gfc_get_string (PREFIX("flush_i%d"), ts
.kind
);
2362 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2367 gfc_resolve_free (gfc_code
* c
)
2372 ts
.type
= BT_INTEGER
;
2373 ts
.kind
= gfc_index_integer_kind
;
2374 n
= c
->ext
.actual
->expr
;
2375 if (n
->ts
.kind
!= ts
.kind
)
2376 gfc_convert_type (n
, &ts
, 2);
2378 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX("free"));
2383 gfc_resolve_ctime_sub (gfc_code
* c
)
2387 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2388 if (c
->ext
.actual
->expr
->ts
.kind
!= 8)
2390 ts
.type
= BT_INTEGER
;
2394 gfc_convert_type (c
->ext
.actual
->expr
, &ts
, 2);
2397 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX("ctime_sub"));
2402 gfc_resolve_fdate_sub (gfc_code
* c
)
2404 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2409 gfc_resolve_gerror (gfc_code
* c
)
2411 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2416 gfc_resolve_getlog (gfc_code
* c
)
2418 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2423 gfc_resolve_hostnm_sub (gfc_code
* c
)
2428 if (c
->ext
.actual
->next
->expr
!= NULL
)
2429 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
2431 kind
= gfc_default_integer_kind
;
2433 name
= gfc_get_string (PREFIX("hostnm_i%d_sub"), kind
);
2434 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2439 gfc_resolve_perror (gfc_code
* c
)
2441 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2444 /* Resolve the STAT and FSTAT intrinsic subroutines. */
2447 gfc_resolve_stat_sub (gfc_code
* c
)
2451 name
= gfc_get_string (PREFIX("stat_i%d_sub"), gfc_default_integer_kind
);
2452 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2457 gfc_resolve_fstat_sub (gfc_code
* c
)
2463 u
= c
->ext
.actual
->expr
;
2464 ts
= &c
->ext
.actual
->next
->expr
->ts
;
2465 if (u
->ts
.kind
!= ts
->kind
)
2466 gfc_convert_type (u
, ts
, 2);
2467 name
= gfc_get_string (PREFIX("fstat_i%d_sub"), ts
->kind
);
2468 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2473 gfc_resolve_fgetc_sub (gfc_code
* c
)
2479 u
= c
->ext
.actual
->expr
;
2480 st
= c
->ext
.actual
->next
->next
->expr
;
2482 if (u
->ts
.kind
!= gfc_c_int_kind
)
2484 ts
.type
= BT_INTEGER
;
2485 ts
.kind
= gfc_c_int_kind
;
2488 gfc_convert_type (u
, &ts
, 2);
2492 name
= gfc_get_string (PREFIX("fgetc_i%d_sub"), st
->ts
.kind
);
2494 name
= gfc_get_string (PREFIX("fgetc_i%d_sub"), gfc_default_integer_kind
);
2496 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2501 gfc_resolve_fget_sub (gfc_code
* c
)
2506 st
= c
->ext
.actual
->next
->expr
;
2508 name
= gfc_get_string (PREFIX("fget_i%d_sub"), st
->ts
.kind
);
2510 name
= gfc_get_string (PREFIX("fget_i%d_sub"), gfc_default_integer_kind
);
2512 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2517 gfc_resolve_fputc_sub (gfc_code
* c
)
2523 u
= c
->ext
.actual
->expr
;
2524 st
= c
->ext
.actual
->next
->next
->expr
;
2526 if (u
->ts
.kind
!= gfc_c_int_kind
)
2528 ts
.type
= BT_INTEGER
;
2529 ts
.kind
= gfc_c_int_kind
;
2532 gfc_convert_type (u
, &ts
, 2);
2536 name
= gfc_get_string (PREFIX("fputc_i%d_sub"), st
->ts
.kind
);
2538 name
= gfc_get_string (PREFIX("fputc_i%d_sub"), gfc_default_integer_kind
);
2540 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2545 gfc_resolve_fput_sub (gfc_code
* c
)
2550 st
= c
->ext
.actual
->next
->expr
;
2552 name
= gfc_get_string (PREFIX("fput_i%d_sub"), st
->ts
.kind
);
2554 name
= gfc_get_string (PREFIX("fput_i%d_sub"), gfc_default_integer_kind
);
2556 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2561 gfc_resolve_ftell_sub (gfc_code
* c
)
2568 unit
= c
->ext
.actual
->expr
;
2569 offset
= c
->ext
.actual
->next
->expr
;
2571 if (unit
->ts
.kind
!= gfc_c_int_kind
)
2573 ts
.type
= BT_INTEGER
;
2574 ts
.kind
= gfc_c_int_kind
;
2577 gfc_convert_type (unit
, &ts
, 2);
2580 name
= gfc_get_string (PREFIX("ftell_i%d_sub"), offset
->ts
.kind
);
2581 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2586 gfc_resolve_ttynam_sub (gfc_code
* c
)
2590 if (c
->ext
.actual
->expr
->ts
.kind
!= gfc_c_int_kind
)
2592 ts
.type
= BT_INTEGER
;
2593 ts
.kind
= gfc_c_int_kind
;
2596 gfc_convert_type (c
->ext
.actual
->expr
, &ts
, 2);
2599 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (PREFIX("ttynam_sub"));
2603 /* Resolve the UMASK intrinsic subroutine. */
2606 gfc_resolve_umask_sub (gfc_code
* c
)
2611 if (c
->ext
.actual
->next
->expr
!= NULL
)
2612 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
2614 kind
= gfc_default_integer_kind
;
2616 name
= gfc_get_string (PREFIX("umask_i%d_sub"), kind
);
2617 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);
2620 /* Resolve the UNLINK intrinsic subroutine. */
2623 gfc_resolve_unlink_sub (gfc_code
* c
)
2628 if (c
->ext
.actual
->next
->expr
!= NULL
)
2629 kind
= c
->ext
.actual
->next
->expr
->ts
.kind
;
2631 kind
= gfc_default_integer_kind
;
2633 name
= gfc_get_string (PREFIX("unlink_i%d_sub"), kind
);
2634 c
->resolved_sym
= gfc_get_intrinsic_sub_symbol (name
);