]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/iresolve.c
Factor unrelated declarations out of tree.h.
[thirdparty/gcc.git] / gcc / fortran / iresolve.c
1 /* Intrinsic function resolution.
2 Copyright (C) 2000-2013 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21
22 /* Assign name and types to intrinsic procedures. For functions, the
23 first argument to a resolution function is an expression pointer to
24 the original function node and the rest are pointers to the
25 arguments of the function call. For subroutines, a pointer to the
26 code node is passed. The result type and library subroutine name
27 are generally set according to the function arguments. */
28
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tree.h"
33 #include "stringpool.h"
34 #include "gfortran.h"
35 #include "intrinsic.h"
36 #include "constructor.h"
37 #include "arith.h"
38
39 /* Given printf-like arguments, return a stable version of the result string.
40
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. */
45
46 const char *
47 gfc_get_string (const char *format, ...)
48 {
49 char temp_name[128];
50 va_list ap;
51 tree ident;
52
53 va_start (ap, format);
54 vsnprintf (temp_name, sizeof (temp_name), format, ap);
55 va_end (ap);
56 temp_name[sizeof (temp_name) - 1] = 0;
57
58 ident = get_identifier (temp_name);
59 return IDENTIFIER_POINTER (ident);
60 }
61
62 /* MERGE and SPREAD need to have source charlen's present for passing
63 to the result expression. */
64 static void
65 check_charlen_present (gfc_expr *source)
66 {
67 if (source->ts.u.cl == NULL)
68 source->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
69
70 if (source->expr_type == EXPR_CONSTANT)
71 {
72 source->ts.u.cl->length
73 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
74 source->value.character.length);
75 source->rank = 0;
76 }
77 else if (source->expr_type == EXPR_ARRAY)
78 {
79 gfc_constructor *c = gfc_constructor_first (source->value.constructor);
80 source->ts.u.cl->length
81 = gfc_get_int_expr (gfc_default_integer_kind, NULL,
82 c->expr->value.character.length);
83 }
84 }
85
86 /* Helper function for resolving the "mask" argument. */
87
88 static void
89 resolve_mask_arg (gfc_expr *mask)
90 {
91
92 gfc_typespec ts;
93 gfc_clear_ts (&ts);
94
95 if (mask->rank == 0)
96 {
97 /* For the scalar case, coerce the mask to kind=4 unconditionally
98 (because this is the only kind we have a library function
99 for). */
100
101 if (mask->ts.kind != 4)
102 {
103 ts.type = BT_LOGICAL;
104 ts.kind = 4;
105 gfc_convert_type (mask, &ts, 2);
106 }
107 }
108 else
109 {
110 /* In the library, we access the mask with a GFC_LOGICAL_1
111 argument. No need to waste memory if we are about to create
112 a temporary array. */
113 if (mask->expr_type == EXPR_OP && mask->ts.kind != 1)
114 {
115 ts.type = BT_LOGICAL;
116 ts.kind = 1;
117 gfc_convert_type_warn (mask, &ts, 2, 0);
118 }
119 }
120 }
121
122
123 static void
124 resolve_bound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind,
125 const char *name, bool coarray)
126 {
127 f->ts.type = BT_INTEGER;
128 if (kind)
129 f->ts.kind = mpz_get_si (kind->value.integer);
130 else
131 f->ts.kind = gfc_default_integer_kind;
132
133 if (dim == NULL)
134 {
135 f->rank = 1;
136 if (array->rank != -1)
137 {
138 f->shape = gfc_get_shape (1);
139 mpz_init_set_ui (f->shape[0], coarray ? gfc_get_corank (array)
140 : array->rank);
141 }
142 }
143
144 f->value.function.name = gfc_get_string (name);
145 }
146
147
148 static void
149 resolve_transformational (const char *name, gfc_expr *f, gfc_expr *array,
150 gfc_expr *dim, gfc_expr *mask)
151 {
152 const char *prefix;
153
154 f->ts = array->ts;
155
156 if (mask)
157 {
158 if (mask->rank == 0)
159 prefix = "s";
160 else
161 prefix = "m";
162
163 resolve_mask_arg (mask);
164 }
165 else
166 prefix = "";
167
168 if (dim != NULL)
169 {
170 f->rank = array->rank - 1;
171 f->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
172 gfc_resolve_dim_arg (dim);
173 }
174
175 f->value.function.name
176 = gfc_get_string (PREFIX ("%s%s_%c%d"), prefix, name,
177 gfc_type_letter (array->ts.type), array->ts.kind);
178 }
179
180
181 /********************** Resolution functions **********************/
182
183
184 void
185 gfc_resolve_abs (gfc_expr *f, gfc_expr *a)
186 {
187 f->ts = a->ts;
188 if (f->ts.type == BT_COMPLEX)
189 f->ts.type = BT_REAL;
190
191 f->value.function.name
192 = gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
193 }
194
195
196 void
197 gfc_resolve_access (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
198 gfc_expr *mode ATTRIBUTE_UNUSED)
199 {
200 f->ts.type = BT_INTEGER;
201 f->ts.kind = gfc_c_int_kind;
202 f->value.function.name = PREFIX ("access_func");
203 }
204
205
206 void
207 gfc_resolve_adjustl (gfc_expr *f, gfc_expr *string)
208 {
209 f->ts.type = BT_CHARACTER;
210 f->ts.kind = string->ts.kind;
211 f->value.function.name = gfc_get_string ("__adjustl_s%d", f->ts.kind);
212 }
213
214
215 void
216 gfc_resolve_adjustr (gfc_expr *f, gfc_expr *string)
217 {
218 f->ts.type = BT_CHARACTER;
219 f->ts.kind = string->ts.kind;
220 f->value.function.name = gfc_get_string ("__adjustr_s%d", f->ts.kind);
221 }
222
223
224 static void
225 gfc_resolve_char_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind,
226 const char *name)
227 {
228 f->ts.type = BT_CHARACTER;
229 f->ts.kind = (kind == NULL)
230 ? gfc_default_character_kind : mpz_get_si (kind->value.integer);
231 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
232 f->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
233
234 f->value.function.name = gfc_get_string (name, f->ts.kind,
235 gfc_type_letter (x->ts.type),
236 x->ts.kind);
237 }
238
239
240 void
241 gfc_resolve_achar (gfc_expr *f, gfc_expr *x, gfc_expr *kind)
242 {
243 gfc_resolve_char_achar (f, x, kind, "__achar_%d_%c%d");
244 }
245
246
247 void
248 gfc_resolve_acos (gfc_expr *f, gfc_expr *x)
249 {
250 f->ts = x->ts;
251 f->value.function.name
252 = gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
253 }
254
255
256 void
257 gfc_resolve_acosh (gfc_expr *f, gfc_expr *x)
258 {
259 f->ts = x->ts;
260 f->value.function.name
261 = gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type),
262 x->ts.kind);
263 }
264
265
266 void
267 gfc_resolve_aimag (gfc_expr *f, gfc_expr *x)
268 {
269 f->ts.type = BT_REAL;
270 f->ts.kind = x->ts.kind;
271 f->value.function.name
272 = gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type),
273 x->ts.kind);
274 }
275
276
277 void
278 gfc_resolve_and (gfc_expr *f, gfc_expr *i, gfc_expr *j)
279 {
280 f->ts.type = i->ts.type;
281 f->ts.kind = gfc_kind_max (i, j);
282
283 if (i->ts.kind != j->ts.kind)
284 {
285 if (i->ts.kind == gfc_kind_max (i, j))
286 gfc_convert_type (j, &i->ts, 2);
287 else
288 gfc_convert_type (i, &j->ts, 2);
289 }
290
291 f->value.function.name
292 = gfc_get_string ("__and_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
293 }
294
295
296 void
297 gfc_resolve_aint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
298 {
299 gfc_typespec ts;
300 gfc_clear_ts (&ts);
301
302 f->ts.type = a->ts.type;
303 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
304
305 if (a->ts.kind != f->ts.kind)
306 {
307 ts.type = f->ts.type;
308 ts.kind = f->ts.kind;
309 gfc_convert_type (a, &ts, 2);
310 }
311 /* The resolved name is only used for specific intrinsics where
312 the return kind is the same as the arg kind. */
313 f->value.function.name
314 = gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
315 }
316
317
318 void
319 gfc_resolve_dint (gfc_expr *f, gfc_expr *a)
320 {
321 gfc_resolve_aint (f, a, NULL);
322 }
323
324
325 void
326 gfc_resolve_all (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
327 {
328 f->ts = mask->ts;
329
330 if (dim != NULL)
331 {
332 gfc_resolve_dim_arg (dim);
333 f->rank = mask->rank - 1;
334 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
335 }
336
337 f->value.function.name
338 = gfc_get_string (PREFIX ("all_%c%d"), gfc_type_letter (mask->ts.type),
339 mask->ts.kind);
340 }
341
342
343 void
344 gfc_resolve_anint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
345 {
346 gfc_typespec ts;
347 gfc_clear_ts (&ts);
348
349 f->ts.type = a->ts.type;
350 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
351
352 if (a->ts.kind != f->ts.kind)
353 {
354 ts.type = f->ts.type;
355 ts.kind = f->ts.kind;
356 gfc_convert_type (a, &ts, 2);
357 }
358
359 /* The resolved name is only used for specific intrinsics where
360 the return kind is the same as the arg kind. */
361 f->value.function.name
362 = gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type),
363 a->ts.kind);
364 }
365
366
367 void
368 gfc_resolve_dnint (gfc_expr *f, gfc_expr *a)
369 {
370 gfc_resolve_anint (f, a, NULL);
371 }
372
373
374 void
375 gfc_resolve_any (gfc_expr *f, gfc_expr *mask, gfc_expr *dim)
376 {
377 f->ts = mask->ts;
378
379 if (dim != NULL)
380 {
381 gfc_resolve_dim_arg (dim);
382 f->rank = mask->rank - 1;
383 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
384 }
385
386 f->value.function.name
387 = gfc_get_string (PREFIX ("any_%c%d"), gfc_type_letter (mask->ts.type),
388 mask->ts.kind);
389 }
390
391
392 void
393 gfc_resolve_asin (gfc_expr *f, gfc_expr *x)
394 {
395 f->ts = x->ts;
396 f->value.function.name
397 = gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
398 }
399
400 void
401 gfc_resolve_asinh (gfc_expr *f, gfc_expr *x)
402 {
403 f->ts = x->ts;
404 f->value.function.name
405 = gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type),
406 x->ts.kind);
407 }
408
409 void
410 gfc_resolve_atan (gfc_expr *f, gfc_expr *x)
411 {
412 f->ts = x->ts;
413 f->value.function.name
414 = gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
415 }
416
417 void
418 gfc_resolve_atanh (gfc_expr *f, gfc_expr *x)
419 {
420 f->ts = x->ts;
421 f->value.function.name
422 = gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type),
423 x->ts.kind);
424 }
425
426 void
427 gfc_resolve_atan2 (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
428 {
429 f->ts = x->ts;
430 f->value.function.name
431 = gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type),
432 x->ts.kind);
433 }
434
435
436 /* Resolve the BESYN and BESJN intrinsics. */
437
438 void
439 gfc_resolve_besn (gfc_expr *f, gfc_expr *n, gfc_expr *x)
440 {
441 gfc_typespec ts;
442 gfc_clear_ts (&ts);
443
444 f->ts = x->ts;
445 if (n->ts.kind != gfc_c_int_kind)
446 {
447 ts.type = BT_INTEGER;
448 ts.kind = gfc_c_int_kind;
449 gfc_convert_type (n, &ts, 2);
450 }
451 f->value.function.name = gfc_get_string ("<intrinsic>");
452 }
453
454
455 void
456 gfc_resolve_bessel_n2 (gfc_expr *f, gfc_expr *n1, gfc_expr *n2, gfc_expr *x)
457 {
458 gfc_typespec ts;
459 gfc_clear_ts (&ts);
460
461 f->ts = x->ts;
462 f->rank = 1;
463 if (n1->expr_type == EXPR_CONSTANT && n2->expr_type == EXPR_CONSTANT)
464 {
465 f->shape = gfc_get_shape (1);
466 mpz_init (f->shape[0]);
467 mpz_sub (f->shape[0], n2->value.integer, n1->value.integer);
468 mpz_add_ui (f->shape[0], f->shape[0], 1);
469 }
470
471 if (n1->ts.kind != gfc_c_int_kind)
472 {
473 ts.type = BT_INTEGER;
474 ts.kind = gfc_c_int_kind;
475 gfc_convert_type (n1, &ts, 2);
476 }
477
478 if (n2->ts.kind != gfc_c_int_kind)
479 {
480 ts.type = BT_INTEGER;
481 ts.kind = gfc_c_int_kind;
482 gfc_convert_type (n2, &ts, 2);
483 }
484
485 if (f->value.function.isym->id == GFC_ISYM_JN2)
486 f->value.function.name = gfc_get_string (PREFIX ("bessel_jn_r%d"),
487 f->ts.kind);
488 else
489 f->value.function.name = gfc_get_string (PREFIX ("bessel_yn_r%d"),
490 f->ts.kind);
491 }
492
493
494 void
495 gfc_resolve_btest (gfc_expr *f, gfc_expr *i, gfc_expr *pos)
496 {
497 f->ts.type = BT_LOGICAL;
498 f->ts.kind = gfc_default_logical_kind;
499 f->value.function.name
500 = gfc_get_string ("__btest_%d_%d", i->ts.kind, pos->ts.kind);
501 }
502
503
504 void
505 gfc_resolve_c_loc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
506 {
507 f->ts = f->value.function.isym->ts;
508 }
509
510
511 void
512 gfc_resolve_c_funloc (gfc_expr *f, gfc_expr *x ATTRIBUTE_UNUSED)
513 {
514 f->ts = f->value.function.isym->ts;
515 }
516
517
518 void
519 gfc_resolve_ceiling (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
520 {
521 f->ts.type = BT_INTEGER;
522 f->ts.kind = (kind == NULL)
523 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
524 f->value.function.name
525 = gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
526 gfc_type_letter (a->ts.type), a->ts.kind);
527 }
528
529
530 void
531 gfc_resolve_char (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
532 {
533 gfc_resolve_char_achar (f, a, kind, "__char_%d_%c%d");
534 }
535
536
537 void
538 gfc_resolve_chdir (gfc_expr *f, gfc_expr *d ATTRIBUTE_UNUSED)
539 {
540 f->ts.type = BT_INTEGER;
541 f->ts.kind = gfc_default_integer_kind;
542 f->value.function.name = gfc_get_string (PREFIX ("chdir_i%d"), f->ts.kind);
543 }
544
545
546 void
547 gfc_resolve_chdir_sub (gfc_code *c)
548 {
549 const char *name;
550 int kind;
551
552 if (c->ext.actual->next->expr != NULL)
553 kind = c->ext.actual->next->expr->ts.kind;
554 else
555 kind = gfc_default_integer_kind;
556
557 name = gfc_get_string (PREFIX ("chdir_i%d_sub"), kind);
558 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
559 }
560
561
562 void
563 gfc_resolve_chmod (gfc_expr *f, gfc_expr *name ATTRIBUTE_UNUSED,
564 gfc_expr *mode ATTRIBUTE_UNUSED)
565 {
566 f->ts.type = BT_INTEGER;
567 f->ts.kind = gfc_c_int_kind;
568 f->value.function.name = PREFIX ("chmod_func");
569 }
570
571
572 void
573 gfc_resolve_chmod_sub (gfc_code *c)
574 {
575 const char *name;
576 int kind;
577
578 if (c->ext.actual->next->next->expr != NULL)
579 kind = c->ext.actual->next->next->expr->ts.kind;
580 else
581 kind = gfc_default_integer_kind;
582
583 name = gfc_get_string (PREFIX ("chmod_i%d_sub"), kind);
584 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
585 }
586
587
588 void
589 gfc_resolve_cmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y, gfc_expr *kind)
590 {
591 f->ts.type = BT_COMPLEX;
592 f->ts.kind = (kind == NULL)
593 ? gfc_default_real_kind : mpz_get_si (kind->value.integer);
594
595 if (y == NULL)
596 f->value.function.name
597 = gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
598 gfc_type_letter (x->ts.type), x->ts.kind);
599 else
600 f->value.function.name
601 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
602 gfc_type_letter (x->ts.type), x->ts.kind,
603 gfc_type_letter (y->ts.type), y->ts.kind);
604 }
605
606
607 void
608 gfc_resolve_dcmplx (gfc_expr *f, gfc_expr *x, gfc_expr *y)
609 {
610 gfc_resolve_cmplx (f, x, y, gfc_get_int_expr (gfc_default_integer_kind, NULL,
611 gfc_default_double_kind));
612 }
613
614
615 void
616 gfc_resolve_complex (gfc_expr *f, gfc_expr *x, gfc_expr *y)
617 {
618 int kind;
619
620 if (x->ts.type == BT_INTEGER)
621 {
622 if (y->ts.type == BT_INTEGER)
623 kind = gfc_default_real_kind;
624 else
625 kind = y->ts.kind;
626 }
627 else
628 {
629 if (y->ts.type == BT_REAL)
630 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
631 else
632 kind = x->ts.kind;
633 }
634
635 f->ts.type = BT_COMPLEX;
636 f->ts.kind = kind;
637 f->value.function.name
638 = gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
639 gfc_type_letter (x->ts.type), x->ts.kind,
640 gfc_type_letter (y->ts.type), y->ts.kind);
641 }
642
643
644 void
645 gfc_resolve_conjg (gfc_expr *f, gfc_expr *x)
646 {
647 f->ts = x->ts;
648 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
649 }
650
651
652 void
653 gfc_resolve_cos (gfc_expr *f, gfc_expr *x)
654 {
655 f->ts = x->ts;
656 f->value.function.name
657 = gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
658 }
659
660
661 void
662 gfc_resolve_cosh (gfc_expr *f, gfc_expr *x)
663 {
664 f->ts = x->ts;
665 f->value.function.name
666 = gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
667 }
668
669
670 void
671 gfc_resolve_count (gfc_expr *f, gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
672 {
673 f->ts.type = BT_INTEGER;
674 if (kind)
675 f->ts.kind = mpz_get_si (kind->value.integer);
676 else
677 f->ts.kind = gfc_default_integer_kind;
678
679 if (dim != NULL)
680 {
681 f->rank = mask->rank - 1;
682 gfc_resolve_dim_arg (dim);
683 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
684 }
685
686 resolve_mask_arg (mask);
687
688 f->value.function.name
689 = gfc_get_string (PREFIX ("count_%d_%c"), f->ts.kind,
690 gfc_type_letter (mask->ts.type));
691 }
692
693
694 void
695 gfc_resolve_cshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
696 gfc_expr *dim)
697 {
698 int n, m;
699
700 if (array->ts.type == BT_CHARACTER && array->ref)
701 gfc_resolve_substring_charlen (array);
702
703 f->ts = array->ts;
704 f->rank = array->rank;
705 f->shape = gfc_copy_shape (array->shape, array->rank);
706
707 if (shift->rank > 0)
708 n = 1;
709 else
710 n = 0;
711
712 /* If dim kind is greater than default integer we need to use the larger. */
713 m = gfc_default_integer_kind;
714 if (dim != NULL)
715 m = m < dim->ts.kind ? dim->ts.kind : m;
716
717 /* Convert shift to at least m, so we don't need
718 kind=1 and kind=2 versions of the library functions. */
719 if (shift->ts.kind < m)
720 {
721 gfc_typespec ts;
722 gfc_clear_ts (&ts);
723 ts.type = BT_INTEGER;
724 ts.kind = m;
725 gfc_convert_type_warn (shift, &ts, 2, 0);
726 }
727
728 if (dim != NULL)
729 {
730 if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
731 && dim->symtree->n.sym->attr.optional)
732 {
733 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
734 dim->representation.length = shift->ts.kind;
735 }
736 else
737 {
738 gfc_resolve_dim_arg (dim);
739 /* Convert dim to shift's kind to reduce variations. */
740 if (dim->ts.kind != shift->ts.kind)
741 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
742 }
743 }
744
745 if (array->ts.type == BT_CHARACTER)
746 {
747 if (array->ts.kind == gfc_default_character_kind)
748 f->value.function.name
749 = gfc_get_string (PREFIX ("cshift%d_%d_char"), n, shift->ts.kind);
750 else
751 f->value.function.name
752 = gfc_get_string (PREFIX ("cshift%d_%d_char%d"), n, shift->ts.kind,
753 array->ts.kind);
754 }
755 else
756 f->value.function.name
757 = gfc_get_string (PREFIX ("cshift%d_%d"), n, shift->ts.kind);
758 }
759
760
761 void
762 gfc_resolve_ctime (gfc_expr *f, gfc_expr *time)
763 {
764 gfc_typespec ts;
765 gfc_clear_ts (&ts);
766
767 f->ts.type = BT_CHARACTER;
768 f->ts.kind = gfc_default_character_kind;
769
770 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
771 if (time->ts.kind != 8)
772 {
773 ts.type = BT_INTEGER;
774 ts.kind = 8;
775 ts.u.derived = NULL;
776 ts.u.cl = NULL;
777 gfc_convert_type (time, &ts, 2);
778 }
779
780 f->value.function.name = gfc_get_string (PREFIX ("ctime"));
781 }
782
783
784 void
785 gfc_resolve_dble (gfc_expr *f, gfc_expr *a)
786 {
787 f->ts.type = BT_REAL;
788 f->ts.kind = gfc_default_double_kind;
789 f->value.function.name
790 = gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
791 }
792
793
794 void
795 gfc_resolve_dim (gfc_expr *f, gfc_expr *a, gfc_expr *p)
796 {
797 f->ts.type = a->ts.type;
798 if (p != NULL)
799 f->ts.kind = gfc_kind_max (a,p);
800 else
801 f->ts.kind = a->ts.kind;
802
803 if (p != NULL && a->ts.kind != p->ts.kind)
804 {
805 if (a->ts.kind == gfc_kind_max (a,p))
806 gfc_convert_type (p, &a->ts, 2);
807 else
808 gfc_convert_type (a, &p->ts, 2);
809 }
810
811 f->value.function.name
812 = gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
813 }
814
815
816 void
817 gfc_resolve_dot_product (gfc_expr *f, gfc_expr *a, gfc_expr *b)
818 {
819 gfc_expr temp;
820
821 temp.expr_type = EXPR_OP;
822 gfc_clear_ts (&temp.ts);
823 temp.value.op.op = INTRINSIC_NONE;
824 temp.value.op.op1 = a;
825 temp.value.op.op2 = b;
826 gfc_type_convert_binary (&temp, 1);
827 f->ts = temp.ts;
828 f->value.function.name
829 = gfc_get_string (PREFIX ("dot_product_%c%d"),
830 gfc_type_letter (f->ts.type), f->ts.kind);
831 }
832
833
834 void
835 gfc_resolve_dprod (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
836 gfc_expr *b ATTRIBUTE_UNUSED)
837 {
838 f->ts.kind = gfc_default_double_kind;
839 f->ts.type = BT_REAL;
840 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
841 }
842
843
844 void
845 gfc_resolve_dshift (gfc_expr *f, gfc_expr *i, gfc_expr *j ATTRIBUTE_UNUSED,
846 gfc_expr *shift ATTRIBUTE_UNUSED)
847 {
848 f->ts = i->ts;
849 if (f->value.function.isym->id == GFC_ISYM_DSHIFTL)
850 f->value.function.name = gfc_get_string ("dshiftl_i%d", f->ts.kind);
851 else if (f->value.function.isym->id == GFC_ISYM_DSHIFTR)
852 f->value.function.name = gfc_get_string ("dshiftr_i%d", f->ts.kind);
853 else
854 gcc_unreachable ();
855 }
856
857
858 void
859 gfc_resolve_eoshift (gfc_expr *f, gfc_expr *array, gfc_expr *shift,
860 gfc_expr *boundary, gfc_expr *dim)
861 {
862 int n, m;
863
864 if (array->ts.type == BT_CHARACTER && array->ref)
865 gfc_resolve_substring_charlen (array);
866
867 f->ts = array->ts;
868 f->rank = array->rank;
869 f->shape = gfc_copy_shape (array->shape, array->rank);
870
871 n = 0;
872 if (shift->rank > 0)
873 n = n | 1;
874 if (boundary && boundary->rank > 0)
875 n = n | 2;
876
877 /* If dim kind is greater than default integer we need to use the larger. */
878 m = gfc_default_integer_kind;
879 if (dim != NULL)
880 m = m < dim->ts.kind ? dim->ts.kind : m;
881
882 /* Convert shift to at least m, so we don't need
883 kind=1 and kind=2 versions of the library functions. */
884 if (shift->ts.kind < m)
885 {
886 gfc_typespec ts;
887 gfc_clear_ts (&ts);
888 ts.type = BT_INTEGER;
889 ts.kind = m;
890 gfc_convert_type_warn (shift, &ts, 2, 0);
891 }
892
893 if (dim != NULL)
894 {
895 if (dim->expr_type != EXPR_CONSTANT && dim->symtree != NULL
896 && dim->symtree->n.sym->attr.optional)
897 {
898 /* Mark this for later setting the type in gfc_conv_missing_dummy. */
899 dim->representation.length = shift->ts.kind;
900 }
901 else
902 {
903 gfc_resolve_dim_arg (dim);
904 /* Convert dim to shift's kind to reduce variations. */
905 if (dim->ts.kind != shift->ts.kind)
906 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
907 }
908 }
909
910 if (array->ts.type == BT_CHARACTER)
911 {
912 if (array->ts.kind == gfc_default_character_kind)
913 f->value.function.name
914 = gfc_get_string (PREFIX ("eoshift%d_%d_char"), n, shift->ts.kind);
915 else
916 f->value.function.name
917 = gfc_get_string (PREFIX ("eoshift%d_%d_char%d"), n, shift->ts.kind,
918 array->ts.kind);
919 }
920 else
921 f->value.function.name
922 = gfc_get_string (PREFIX ("eoshift%d_%d"), n, shift->ts.kind);
923 }
924
925
926 void
927 gfc_resolve_exp (gfc_expr *f, gfc_expr *x)
928 {
929 f->ts = x->ts;
930 f->value.function.name
931 = gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
932 }
933
934
935 void
936 gfc_resolve_exponent (gfc_expr *f, gfc_expr *x)
937 {
938 f->ts.type = BT_INTEGER;
939 f->ts.kind = gfc_default_integer_kind;
940 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
941 }
942
943
944 /* Resolve the EXTENDS_TYPE_OF intrinsic function. */
945
946 void
947 gfc_resolve_extends_type_of (gfc_expr *f, gfc_expr *a, gfc_expr *mo)
948 {
949 gfc_symbol *vtab;
950 gfc_symtree *st;
951
952 /* Prevent double resolution. */
953 if (f->ts.type == BT_LOGICAL)
954 return;
955
956 /* Replace the first argument with the corresponding vtab. */
957 if (a->ts.type == BT_CLASS)
958 gfc_add_vptr_component (a);
959 else if (a->ts.type == BT_DERIVED)
960 {
961 vtab = gfc_find_derived_vtab (a->ts.u.derived);
962 /* Clear the old expr. */
963 gfc_free_ref_list (a->ref);
964 memset (a, '\0', sizeof (gfc_expr));
965 /* Construct a new one. */
966 a->expr_type = EXPR_VARIABLE;
967 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
968 a->symtree = st;
969 a->ts = vtab->ts;
970 }
971
972 /* Replace the second argument with the corresponding vtab. */
973 if (mo->ts.type == BT_CLASS)
974 gfc_add_vptr_component (mo);
975 else if (mo->ts.type == BT_DERIVED)
976 {
977 vtab = gfc_find_derived_vtab (mo->ts.u.derived);
978 /* Clear the old expr. */
979 gfc_free_ref_list (mo->ref);
980 memset (mo, '\0', sizeof (gfc_expr));
981 /* Construct a new one. */
982 mo->expr_type = EXPR_VARIABLE;
983 st = gfc_find_symtree (vtab->ns->sym_root, vtab->name);
984 mo->symtree = st;
985 mo->ts = vtab->ts;
986 }
987
988 f->ts.type = BT_LOGICAL;
989 f->ts.kind = 4;
990
991 f->value.function.isym->formal->ts = a->ts;
992 f->value.function.isym->formal->next->ts = mo->ts;
993
994 /* Call library function. */
995 f->value.function.name = gfc_get_string (PREFIX ("is_extension_of"));
996 }
997
998
999 void
1000 gfc_resolve_fdate (gfc_expr *f)
1001 {
1002 f->ts.type = BT_CHARACTER;
1003 f->ts.kind = gfc_default_character_kind;
1004 f->value.function.name = gfc_get_string (PREFIX ("fdate"));
1005 }
1006
1007
1008 void
1009 gfc_resolve_floor (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1010 {
1011 f->ts.type = BT_INTEGER;
1012 f->ts.kind = (kind == NULL)
1013 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1014 f->value.function.name
1015 = gfc_get_string ("__floor%d_%c%d", f->ts.kind,
1016 gfc_type_letter (a->ts.type), a->ts.kind);
1017 }
1018
1019
1020 void
1021 gfc_resolve_fnum (gfc_expr *f, gfc_expr *n)
1022 {
1023 f->ts.type = BT_INTEGER;
1024 f->ts.kind = gfc_default_integer_kind;
1025 if (n->ts.kind != f->ts.kind)
1026 gfc_convert_type (n, &f->ts, 2);
1027 f->value.function.name = gfc_get_string (PREFIX ("fnum_i%d"), f->ts.kind);
1028 }
1029
1030
1031 void
1032 gfc_resolve_fraction (gfc_expr *f, gfc_expr *x)
1033 {
1034 f->ts = x->ts;
1035 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
1036 }
1037
1038
1039 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
1040
1041 void
1042 gfc_resolve_g77_math1 (gfc_expr *f, gfc_expr *x)
1043 {
1044 f->ts = x->ts;
1045 f->value.function.name = gfc_get_string ("<intrinsic>");
1046 }
1047
1048
1049 void
1050 gfc_resolve_gamma (gfc_expr *f, gfc_expr *x)
1051 {
1052 f->ts = x->ts;
1053 f->value.function.name
1054 = gfc_get_string ("__tgamma_%d", x->ts.kind);
1055 }
1056
1057
1058 void
1059 gfc_resolve_getcwd (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
1060 {
1061 f->ts.type = BT_INTEGER;
1062 f->ts.kind = 4;
1063 f->value.function.name = gfc_get_string (PREFIX ("getcwd"));
1064 }
1065
1066
1067 void
1068 gfc_resolve_getgid (gfc_expr *f)
1069 {
1070 f->ts.type = BT_INTEGER;
1071 f->ts.kind = 4;
1072 f->value.function.name = gfc_get_string (PREFIX ("getgid"));
1073 }
1074
1075
1076 void
1077 gfc_resolve_getpid (gfc_expr *f)
1078 {
1079 f->ts.type = BT_INTEGER;
1080 f->ts.kind = 4;
1081 f->value.function.name = gfc_get_string (PREFIX ("getpid"));
1082 }
1083
1084
1085 void
1086 gfc_resolve_getuid (gfc_expr *f)
1087 {
1088 f->ts.type = BT_INTEGER;
1089 f->ts.kind = 4;
1090 f->value.function.name = gfc_get_string (PREFIX ("getuid"));
1091 }
1092
1093
1094 void
1095 gfc_resolve_hostnm (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
1096 {
1097 f->ts.type = BT_INTEGER;
1098 f->ts.kind = 4;
1099 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
1100 }
1101
1102
1103 void
1104 gfc_resolve_hypot (gfc_expr *f, gfc_expr *x, gfc_expr *y ATTRIBUTE_UNUSED)
1105 {
1106 f->ts = x->ts;
1107 f->value.function.name = gfc_get_string ("__hypot_r%d", x->ts.kind);
1108 }
1109
1110
1111 void
1112 gfc_resolve_iall (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1113 {
1114 resolve_transformational ("iall", f, array, dim, mask);
1115 }
1116
1117
1118 void
1119 gfc_resolve_iand (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1120 {
1121 /* If the kind of i and j are different, then g77 cross-promoted the
1122 kinds to the largest value. The Fortran 95 standard requires the
1123 kinds to match. */
1124 if (i->ts.kind != j->ts.kind)
1125 {
1126 if (i->ts.kind == gfc_kind_max (i, j))
1127 gfc_convert_type (j, &i->ts, 2);
1128 else
1129 gfc_convert_type (i, &j->ts, 2);
1130 }
1131
1132 f->ts = i->ts;
1133 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
1134 }
1135
1136
1137 void
1138 gfc_resolve_iany (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1139 {
1140 resolve_transformational ("iany", f, array, dim, mask);
1141 }
1142
1143
1144 void
1145 gfc_resolve_ibclr (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
1146 {
1147 f->ts = i->ts;
1148 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
1149 }
1150
1151
1152 void
1153 gfc_resolve_ibits (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED,
1154 gfc_expr *len ATTRIBUTE_UNUSED)
1155 {
1156 f->ts = i->ts;
1157 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
1158 }
1159
1160
1161 void
1162 gfc_resolve_ibset (gfc_expr *f, gfc_expr *i, gfc_expr *pos ATTRIBUTE_UNUSED)
1163 {
1164 f->ts = i->ts;
1165 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
1166 }
1167
1168
1169 void
1170 gfc_resolve_iachar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
1171 {
1172 f->ts.type = BT_INTEGER;
1173 if (kind)
1174 f->ts.kind = mpz_get_si (kind->value.integer);
1175 else
1176 f->ts.kind = gfc_default_integer_kind;
1177 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
1178 }
1179
1180
1181 void
1182 gfc_resolve_ichar (gfc_expr *f, gfc_expr *c, gfc_expr *kind)
1183 {
1184 f->ts.type = BT_INTEGER;
1185 if (kind)
1186 f->ts.kind = mpz_get_si (kind->value.integer);
1187 else
1188 f->ts.kind = gfc_default_integer_kind;
1189 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
1190 }
1191
1192
1193 void
1194 gfc_resolve_idnint (gfc_expr *f, gfc_expr *a)
1195 {
1196 gfc_resolve_nint (f, a, NULL);
1197 }
1198
1199
1200 void
1201 gfc_resolve_ierrno (gfc_expr *f)
1202 {
1203 f->ts.type = BT_INTEGER;
1204 f->ts.kind = gfc_default_integer_kind;
1205 f->value.function.name = gfc_get_string (PREFIX ("ierrno_i%d"), f->ts.kind);
1206 }
1207
1208
1209 void
1210 gfc_resolve_ieor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1211 {
1212 /* If the kind of i and j are different, then g77 cross-promoted the
1213 kinds to the largest value. The Fortran 95 standard requires the
1214 kinds to match. */
1215 if (i->ts.kind != j->ts.kind)
1216 {
1217 if (i->ts.kind == gfc_kind_max (i, j))
1218 gfc_convert_type (j, &i->ts, 2);
1219 else
1220 gfc_convert_type (i, &j->ts, 2);
1221 }
1222
1223 f->ts = i->ts;
1224 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
1225 }
1226
1227
1228 void
1229 gfc_resolve_ior (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1230 {
1231 /* If the kind of i and j are different, then g77 cross-promoted the
1232 kinds to the largest value. The Fortran 95 standard requires the
1233 kinds to match. */
1234 if (i->ts.kind != j->ts.kind)
1235 {
1236 if (i->ts.kind == gfc_kind_max (i, j))
1237 gfc_convert_type (j, &i->ts, 2);
1238 else
1239 gfc_convert_type (i, &j->ts, 2);
1240 }
1241
1242 f->ts = i->ts;
1243 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
1244 }
1245
1246
1247 void
1248 gfc_resolve_index_func (gfc_expr *f, gfc_expr *str,
1249 gfc_expr *sub_str ATTRIBUTE_UNUSED, gfc_expr *back,
1250 gfc_expr *kind)
1251 {
1252 gfc_typespec ts;
1253 gfc_clear_ts (&ts);
1254
1255 f->ts.type = BT_INTEGER;
1256 if (kind)
1257 f->ts.kind = mpz_get_si (kind->value.integer);
1258 else
1259 f->ts.kind = gfc_default_integer_kind;
1260
1261 if (back && back->ts.kind != gfc_default_integer_kind)
1262 {
1263 ts.type = BT_LOGICAL;
1264 ts.kind = gfc_default_integer_kind;
1265 ts.u.derived = NULL;
1266 ts.u.cl = NULL;
1267 gfc_convert_type (back, &ts, 2);
1268 }
1269
1270 f->value.function.name
1271 = gfc_get_string ("__index_%d_i%d", str->ts.kind, f->ts.kind);
1272 }
1273
1274
1275 void
1276 gfc_resolve_int (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1277 {
1278 f->ts.type = BT_INTEGER;
1279 f->ts.kind = (kind == NULL)
1280 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1281 f->value.function.name
1282 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1283 gfc_type_letter (a->ts.type), a->ts.kind);
1284 }
1285
1286
1287 void
1288 gfc_resolve_int2 (gfc_expr *f, gfc_expr *a)
1289 {
1290 f->ts.type = BT_INTEGER;
1291 f->ts.kind = 2;
1292 f->value.function.name
1293 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1294 gfc_type_letter (a->ts.type), a->ts.kind);
1295 }
1296
1297
1298 void
1299 gfc_resolve_int8 (gfc_expr *f, gfc_expr *a)
1300 {
1301 f->ts.type = BT_INTEGER;
1302 f->ts.kind = 8;
1303 f->value.function.name
1304 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1305 gfc_type_letter (a->ts.type), a->ts.kind);
1306 }
1307
1308
1309 void
1310 gfc_resolve_long (gfc_expr *f, gfc_expr *a)
1311 {
1312 f->ts.type = BT_INTEGER;
1313 f->ts.kind = 4;
1314 f->value.function.name
1315 = gfc_get_string ("__int_%d_%c%d", f->ts.kind,
1316 gfc_type_letter (a->ts.type), a->ts.kind);
1317 }
1318
1319
1320 void
1321 gfc_resolve_iparity (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
1322 {
1323 resolve_transformational ("iparity", f, array, dim, mask);
1324 }
1325
1326
1327 void
1328 gfc_resolve_isatty (gfc_expr *f, gfc_expr *u)
1329 {
1330 gfc_typespec ts;
1331 gfc_clear_ts (&ts);
1332
1333 f->ts.type = BT_LOGICAL;
1334 f->ts.kind = gfc_default_integer_kind;
1335 if (u->ts.kind != gfc_c_int_kind)
1336 {
1337 ts.type = BT_INTEGER;
1338 ts.kind = gfc_c_int_kind;
1339 ts.u.derived = NULL;
1340 ts.u.cl = NULL;
1341 gfc_convert_type (u, &ts, 2);
1342 }
1343
1344 f->value.function.name = gfc_get_string (PREFIX ("isatty_l%d"), f->ts.kind);
1345 }
1346
1347
1348 void
1349 gfc_resolve_ishft (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1350 {
1351 f->ts = i->ts;
1352 f->value.function.name
1353 = gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
1354 }
1355
1356
1357 void
1358 gfc_resolve_rshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1359 {
1360 f->ts = i->ts;
1361 f->value.function.name
1362 = gfc_get_string ("__rshift_%d_%d", i->ts.kind, shift->ts.kind);
1363 }
1364
1365
1366 void
1367 gfc_resolve_lshift (gfc_expr *f, gfc_expr *i, gfc_expr *shift)
1368 {
1369 f->ts = i->ts;
1370 f->value.function.name
1371 = gfc_get_string ("__lshift_%d_%d", i->ts.kind, shift->ts.kind);
1372 }
1373
1374
1375 void
1376 gfc_resolve_ishftc (gfc_expr *f, gfc_expr *i, gfc_expr *shift, gfc_expr *size)
1377 {
1378 int s_kind;
1379
1380 s_kind = (size == NULL) ? gfc_default_integer_kind : size->ts.kind;
1381
1382 f->ts = i->ts;
1383 f->value.function.name
1384 = gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
1385 }
1386
1387
1388 void
1389 gfc_resolve_kill (gfc_expr *f, gfc_expr *p ATTRIBUTE_UNUSED,
1390 gfc_expr *s ATTRIBUTE_UNUSED)
1391 {
1392 f->ts.type = BT_INTEGER;
1393 f->ts.kind = gfc_default_integer_kind;
1394 f->value.function.name = gfc_get_string (PREFIX ("kill_i%d"), f->ts.kind);
1395 }
1396
1397
1398 void
1399 gfc_resolve_lbound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1400 {
1401 resolve_bound (f, array, dim, kind, "__lbound", false);
1402 }
1403
1404
1405 void
1406 gfc_resolve_lcobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
1407 {
1408 resolve_bound (f, array, dim, kind, "__lcobound", true);
1409 }
1410
1411
1412 void
1413 gfc_resolve_len (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1414 {
1415 f->ts.type = BT_INTEGER;
1416 if (kind)
1417 f->ts.kind = mpz_get_si (kind->value.integer);
1418 else
1419 f->ts.kind = gfc_default_integer_kind;
1420 f->value.function.name
1421 = gfc_get_string ("__len_%d_i%d", string->ts.kind,
1422 gfc_default_integer_kind);
1423 }
1424
1425
1426 void
1427 gfc_resolve_len_trim (gfc_expr *f, gfc_expr *string, gfc_expr *kind)
1428 {
1429 f->ts.type = BT_INTEGER;
1430 if (kind)
1431 f->ts.kind = mpz_get_si (kind->value.integer);
1432 else
1433 f->ts.kind = gfc_default_integer_kind;
1434 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
1435 }
1436
1437
1438 void
1439 gfc_resolve_lgamma (gfc_expr *f, gfc_expr *x)
1440 {
1441 f->ts = x->ts;
1442 f->value.function.name
1443 = gfc_get_string ("__lgamma_%d", x->ts.kind);
1444 }
1445
1446
1447 void
1448 gfc_resolve_link (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
1449 gfc_expr *p2 ATTRIBUTE_UNUSED)
1450 {
1451 f->ts.type = BT_INTEGER;
1452 f->ts.kind = gfc_default_integer_kind;
1453 f->value.function.name = gfc_get_string (PREFIX ("link_i%d"), f->ts.kind);
1454 }
1455
1456
1457 void
1458 gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
1459 {
1460 f->ts.type= BT_INTEGER;
1461 f->ts.kind = gfc_index_integer_kind;
1462 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
1463 }
1464
1465
1466 void
1467 gfc_resolve_log (gfc_expr *f, gfc_expr *x)
1468 {
1469 f->ts = x->ts;
1470 f->value.function.name
1471 = gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1472 }
1473
1474
1475 void
1476 gfc_resolve_log10 (gfc_expr *f, gfc_expr *x)
1477 {
1478 f->ts = x->ts;
1479 f->value.function.name
1480 = gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type),
1481 x->ts.kind);
1482 }
1483
1484
1485 void
1486 gfc_resolve_logical (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1487 {
1488 f->ts.type = BT_LOGICAL;
1489 f->ts.kind = (kind == NULL)
1490 ? gfc_default_logical_kind : mpz_get_si (kind->value.integer);
1491 f->rank = a->rank;
1492
1493 f->value.function.name
1494 = gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
1495 gfc_type_letter (a->ts.type), a->ts.kind);
1496 }
1497
1498
1499 void
1500 gfc_resolve_malloc (gfc_expr *f, gfc_expr *size)
1501 {
1502 if (size->ts.kind < gfc_index_integer_kind)
1503 {
1504 gfc_typespec ts;
1505 gfc_clear_ts (&ts);
1506
1507 ts.type = BT_INTEGER;
1508 ts.kind = gfc_index_integer_kind;
1509 gfc_convert_type_warn (size, &ts, 2, 0);
1510 }
1511
1512 f->ts.type = BT_INTEGER;
1513 f->ts.kind = gfc_index_integer_kind;
1514 f->value.function.name = gfc_get_string (PREFIX ("malloc"));
1515 }
1516
1517
1518 void
1519 gfc_resolve_matmul (gfc_expr *f, gfc_expr *a, gfc_expr *b)
1520 {
1521 gfc_expr temp;
1522
1523 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1524 {
1525 f->ts.type = BT_LOGICAL;
1526 f->ts.kind = gfc_default_logical_kind;
1527 }
1528 else
1529 {
1530 temp.expr_type = EXPR_OP;
1531 gfc_clear_ts (&temp.ts);
1532 temp.value.op.op = INTRINSIC_NONE;
1533 temp.value.op.op1 = a;
1534 temp.value.op.op2 = b;
1535 gfc_type_convert_binary (&temp, 1);
1536 f->ts = temp.ts;
1537 }
1538
1539 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1540
1541 if (a->rank == 2 && b->rank == 2)
1542 {
1543 if (a->shape && b->shape)
1544 {
1545 f->shape = gfc_get_shape (f->rank);
1546 mpz_init_set (f->shape[0], a->shape[0]);
1547 mpz_init_set (f->shape[1], b->shape[1]);
1548 }
1549 }
1550 else if (a->rank == 1)
1551 {
1552 if (b->shape)
1553 {
1554 f->shape = gfc_get_shape (f->rank);
1555 mpz_init_set (f->shape[0], b->shape[1]);
1556 }
1557 }
1558 else
1559 {
1560 /* b->rank == 1 and a->rank == 2 here, all other cases have
1561 been caught in check.c. */
1562 if (a->shape)
1563 {
1564 f->shape = gfc_get_shape (f->rank);
1565 mpz_init_set (f->shape[0], a->shape[0]);
1566 }
1567 }
1568
1569 f->value.function.name
1570 = gfc_get_string (PREFIX ("matmul_%c%d"), gfc_type_letter (f->ts.type),
1571 f->ts.kind);
1572 }
1573
1574
1575 static void
1576 gfc_resolve_minmax (const char *name, gfc_expr *f, gfc_actual_arglist *args)
1577 {
1578 gfc_actual_arglist *a;
1579
1580 f->ts.type = args->expr->ts.type;
1581 f->ts.kind = args->expr->ts.kind;
1582 /* Find the largest type kind. */
1583 for (a = args->next; a; a = a->next)
1584 {
1585 if (a->expr->ts.kind > f->ts.kind)
1586 f->ts.kind = a->expr->ts.kind;
1587 }
1588
1589 /* Convert all parameters to the required kind. */
1590 for (a = args; a; a = a->next)
1591 {
1592 if (a->expr->ts.kind != f->ts.kind)
1593 gfc_convert_type (a->expr, &f->ts, 2);
1594 }
1595
1596 f->value.function.name
1597 = gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1598 }
1599
1600
1601 void
1602 gfc_resolve_max (gfc_expr *f, gfc_actual_arglist *args)
1603 {
1604 gfc_resolve_minmax ("__max_%c%d", f, args);
1605 }
1606
1607
1608 void
1609 gfc_resolve_maxloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1610 gfc_expr *mask)
1611 {
1612 const char *name;
1613 int i, j, idim;
1614
1615 f->ts.type = BT_INTEGER;
1616 f->ts.kind = gfc_default_integer_kind;
1617
1618 if (dim == NULL)
1619 {
1620 f->rank = 1;
1621 f->shape = gfc_get_shape (1);
1622 mpz_init_set_si (f->shape[0], array->rank);
1623 }
1624 else
1625 {
1626 f->rank = array->rank - 1;
1627 gfc_resolve_dim_arg (dim);
1628 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1629 {
1630 idim = (int) mpz_get_si (dim->value.integer);
1631 f->shape = gfc_get_shape (f->rank);
1632 for (i = 0, j = 0; i < f->rank; i++, j++)
1633 {
1634 if (i == (idim - 1))
1635 j++;
1636 mpz_init_set (f->shape[i], array->shape[j]);
1637 }
1638 }
1639 }
1640
1641 if (mask)
1642 {
1643 if (mask->rank == 0)
1644 name = "smaxloc";
1645 else
1646 name = "mmaxloc";
1647
1648 resolve_mask_arg (mask);
1649 }
1650 else
1651 name = "maxloc";
1652
1653 f->value.function.name
1654 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1655 gfc_type_letter (array->ts.type), array->ts.kind);
1656 }
1657
1658
1659 void
1660 gfc_resolve_maxval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1661 gfc_expr *mask)
1662 {
1663 const char *name;
1664 int i, j, idim;
1665
1666 f->ts = array->ts;
1667
1668 if (dim != NULL)
1669 {
1670 f->rank = array->rank - 1;
1671 gfc_resolve_dim_arg (dim);
1672
1673 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1674 {
1675 idim = (int) mpz_get_si (dim->value.integer);
1676 f->shape = gfc_get_shape (f->rank);
1677 for (i = 0, j = 0; i < f->rank; i++, j++)
1678 {
1679 if (i == (idim - 1))
1680 j++;
1681 mpz_init_set (f->shape[i], array->shape[j]);
1682 }
1683 }
1684 }
1685
1686 if (mask)
1687 {
1688 if (mask->rank == 0)
1689 name = "smaxval";
1690 else
1691 name = "mmaxval";
1692
1693 resolve_mask_arg (mask);
1694 }
1695 else
1696 name = "maxval";
1697
1698 f->value.function.name
1699 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1700 gfc_type_letter (array->ts.type), array->ts.kind);
1701 }
1702
1703
1704 void
1705 gfc_resolve_mclock (gfc_expr *f)
1706 {
1707 f->ts.type = BT_INTEGER;
1708 f->ts.kind = 4;
1709 f->value.function.name = PREFIX ("mclock");
1710 }
1711
1712
1713 void
1714 gfc_resolve_mclock8 (gfc_expr *f)
1715 {
1716 f->ts.type = BT_INTEGER;
1717 f->ts.kind = 8;
1718 f->value.function.name = PREFIX ("mclock8");
1719 }
1720
1721
1722 void
1723 gfc_resolve_mask (gfc_expr *f, gfc_expr *i ATTRIBUTE_UNUSED,
1724 gfc_expr *kind)
1725 {
1726 f->ts.type = BT_INTEGER;
1727 f->ts.kind = kind ? mpz_get_si (kind->value.integer)
1728 : gfc_default_integer_kind;
1729
1730 if (f->value.function.isym->id == GFC_ISYM_MASKL)
1731 f->value.function.name = gfc_get_string ("__maskl_i%d", f->ts.kind);
1732 else
1733 f->value.function.name = gfc_get_string ("__maskr_i%d", f->ts.kind);
1734 }
1735
1736
1737 void
1738 gfc_resolve_merge (gfc_expr *f, gfc_expr *tsource,
1739 gfc_expr *fsource ATTRIBUTE_UNUSED,
1740 gfc_expr *mask ATTRIBUTE_UNUSED)
1741 {
1742 if (tsource->ts.type == BT_CHARACTER && tsource->ref)
1743 gfc_resolve_substring_charlen (tsource);
1744
1745 if (fsource->ts.type == BT_CHARACTER && fsource->ref)
1746 gfc_resolve_substring_charlen (fsource);
1747
1748 if (tsource->ts.type == BT_CHARACTER)
1749 check_charlen_present (tsource);
1750
1751 f->ts = tsource->ts;
1752 f->value.function.name
1753 = gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1754 tsource->ts.kind);
1755 }
1756
1757
1758 void
1759 gfc_resolve_merge_bits (gfc_expr *f, gfc_expr *i,
1760 gfc_expr *j ATTRIBUTE_UNUSED,
1761 gfc_expr *mask ATTRIBUTE_UNUSED)
1762 {
1763 f->ts = i->ts;
1764 f->value.function.name = gfc_get_string ("__merge_bits_i%d", i->ts.kind);
1765 }
1766
1767
1768 void
1769 gfc_resolve_min (gfc_expr *f, gfc_actual_arglist *args)
1770 {
1771 gfc_resolve_minmax ("__min_%c%d", f, args);
1772 }
1773
1774
1775 void
1776 gfc_resolve_minloc (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1777 gfc_expr *mask)
1778 {
1779 const char *name;
1780 int i, j, idim;
1781
1782 f->ts.type = BT_INTEGER;
1783 f->ts.kind = gfc_default_integer_kind;
1784
1785 if (dim == NULL)
1786 {
1787 f->rank = 1;
1788 f->shape = gfc_get_shape (1);
1789 mpz_init_set_si (f->shape[0], array->rank);
1790 }
1791 else
1792 {
1793 f->rank = array->rank - 1;
1794 gfc_resolve_dim_arg (dim);
1795 if (array->shape && dim->expr_type == EXPR_CONSTANT)
1796 {
1797 idim = (int) mpz_get_si (dim->value.integer);
1798 f->shape = gfc_get_shape (f->rank);
1799 for (i = 0, j = 0; i < f->rank; i++, j++)
1800 {
1801 if (i == (idim - 1))
1802 j++;
1803 mpz_init_set (f->shape[i], array->shape[j]);
1804 }
1805 }
1806 }
1807
1808 if (mask)
1809 {
1810 if (mask->rank == 0)
1811 name = "sminloc";
1812 else
1813 name = "mminloc";
1814
1815 resolve_mask_arg (mask);
1816 }
1817 else
1818 name = "minloc";
1819
1820 f->value.function.name
1821 = gfc_get_string (PREFIX ("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1822 gfc_type_letter (array->ts.type), array->ts.kind);
1823 }
1824
1825
1826 void
1827 gfc_resolve_minval (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
1828 gfc_expr *mask)
1829 {
1830 const char *name;
1831 int i, j, idim;
1832
1833 f->ts = array->ts;
1834
1835 if (dim != NULL)
1836 {
1837 f->rank = array->rank - 1;
1838 gfc_resolve_dim_arg (dim);
1839
1840 if (f->rank && array->shape && dim->expr_type == EXPR_CONSTANT)
1841 {
1842 idim = (int) mpz_get_si (dim->value.integer);
1843 f->shape = gfc_get_shape (f->rank);
1844 for (i = 0, j = 0; i < f->rank; i++, j++)
1845 {
1846 if (i == (idim - 1))
1847 j++;
1848 mpz_init_set (f->shape[i], array->shape[j]);
1849 }
1850 }
1851 }
1852
1853 if (mask)
1854 {
1855 if (mask->rank == 0)
1856 name = "sminval";
1857 else
1858 name = "mminval";
1859
1860 resolve_mask_arg (mask);
1861 }
1862 else
1863 name = "minval";
1864
1865 f->value.function.name
1866 = gfc_get_string (PREFIX ("%s_%c%d"), name,
1867 gfc_type_letter (array->ts.type), array->ts.kind);
1868 }
1869
1870
1871 void
1872 gfc_resolve_mod (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1873 {
1874 f->ts.type = a->ts.type;
1875 if (p != NULL)
1876 f->ts.kind = gfc_kind_max (a,p);
1877 else
1878 f->ts.kind = a->ts.kind;
1879
1880 if (p != NULL && a->ts.kind != p->ts.kind)
1881 {
1882 if (a->ts.kind == gfc_kind_max (a,p))
1883 gfc_convert_type (p, &a->ts, 2);
1884 else
1885 gfc_convert_type (a, &p->ts, 2);
1886 }
1887
1888 f->value.function.name
1889 = gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
1890 }
1891
1892
1893 void
1894 gfc_resolve_modulo (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1895 {
1896 f->ts.type = a->ts.type;
1897 if (p != NULL)
1898 f->ts.kind = gfc_kind_max (a,p);
1899 else
1900 f->ts.kind = a->ts.kind;
1901
1902 if (p != NULL && a->ts.kind != p->ts.kind)
1903 {
1904 if (a->ts.kind == gfc_kind_max (a,p))
1905 gfc_convert_type (p, &a->ts, 2);
1906 else
1907 gfc_convert_type (a, &p->ts, 2);
1908 }
1909
1910 f->value.function.name
1911 = gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
1912 f->ts.kind);
1913 }
1914
1915 void
1916 gfc_resolve_nearest (gfc_expr *f, gfc_expr *a, gfc_expr *p)
1917 {
1918 if (p->ts.kind != a->ts.kind)
1919 gfc_convert_type (p, &a->ts, 2);
1920
1921 f->ts = a->ts;
1922 f->value.function.name
1923 = gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1924 a->ts.kind);
1925 }
1926
1927 void
1928 gfc_resolve_nint (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
1929 {
1930 f->ts.type = BT_INTEGER;
1931 f->ts.kind = (kind == NULL)
1932 ? gfc_default_integer_kind : mpz_get_si (kind->value.integer);
1933 f->value.function.name
1934 = gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1935 }
1936
1937
1938 void
1939 gfc_resolve_norm2 (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
1940 {
1941 resolve_transformational ("norm2", f, array, dim, NULL);
1942 }
1943
1944
1945 void
1946 gfc_resolve_not (gfc_expr *f, gfc_expr *i)
1947 {
1948 f->ts = i->ts;
1949 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1950 }
1951
1952
1953 void
1954 gfc_resolve_or (gfc_expr *f, gfc_expr *i, gfc_expr *j)
1955 {
1956 f->ts.type = i->ts.type;
1957 f->ts.kind = gfc_kind_max (i, j);
1958
1959 if (i->ts.kind != j->ts.kind)
1960 {
1961 if (i->ts.kind == gfc_kind_max (i, j))
1962 gfc_convert_type (j, &i->ts, 2);
1963 else
1964 gfc_convert_type (i, &j->ts, 2);
1965 }
1966
1967 f->value.function.name
1968 = gfc_get_string ("__or_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
1969 }
1970
1971
1972 void
1973 gfc_resolve_pack (gfc_expr *f, gfc_expr *array, gfc_expr *mask,
1974 gfc_expr *vector ATTRIBUTE_UNUSED)
1975 {
1976 if (array->ts.type == BT_CHARACTER && array->ref)
1977 gfc_resolve_substring_charlen (array);
1978
1979 f->ts = array->ts;
1980 f->rank = 1;
1981
1982 resolve_mask_arg (mask);
1983
1984 if (mask->rank != 0)
1985 {
1986 if (array->ts.type == BT_CHARACTER)
1987 f->value.function.name
1988 = array->ts.kind == 1 ? PREFIX ("pack_char")
1989 : gfc_get_string
1990 (PREFIX ("pack_char%d"),
1991 array->ts.kind);
1992 else
1993 f->value.function.name = PREFIX ("pack");
1994 }
1995 else
1996 {
1997 if (array->ts.type == BT_CHARACTER)
1998 f->value.function.name
1999 = array->ts.kind == 1 ? PREFIX ("pack_s_char")
2000 : gfc_get_string
2001 (PREFIX ("pack_s_char%d"),
2002 array->ts.kind);
2003 else
2004 f->value.function.name = PREFIX ("pack_s");
2005 }
2006 }
2007
2008
2009 void
2010 gfc_resolve_parity (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
2011 {
2012 resolve_transformational ("parity", f, array, dim, NULL);
2013 }
2014
2015
2016 void
2017 gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
2018 gfc_expr *mask)
2019 {
2020 resolve_transformational ("product", f, array, dim, mask);
2021 }
2022
2023
2024 void
2025 gfc_resolve_rank (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED)
2026 {
2027 f->ts.type = BT_INTEGER;
2028 f->ts.kind = gfc_default_integer_kind;
2029 f->value.function.name = gfc_get_string ("__rank");
2030 }
2031
2032
2033 void
2034 gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
2035 {
2036 f->ts.type = BT_REAL;
2037
2038 if (kind != NULL)
2039 f->ts.kind = mpz_get_si (kind->value.integer);
2040 else
2041 f->ts.kind = (a->ts.type == BT_COMPLEX)
2042 ? a->ts.kind : gfc_default_real_kind;
2043
2044 f->value.function.name
2045 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
2046 gfc_type_letter (a->ts.type), a->ts.kind);
2047 }
2048
2049
2050 void
2051 gfc_resolve_realpart (gfc_expr *f, gfc_expr *a)
2052 {
2053 f->ts.type = BT_REAL;
2054 f->ts.kind = a->ts.kind;
2055 f->value.function.name
2056 = gfc_get_string ("__real_%d_%c%d", f->ts.kind,
2057 gfc_type_letter (a->ts.type), a->ts.kind);
2058 }
2059
2060
2061 void
2062 gfc_resolve_rename (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2063 gfc_expr *p2 ATTRIBUTE_UNUSED)
2064 {
2065 f->ts.type = BT_INTEGER;
2066 f->ts.kind = gfc_default_integer_kind;
2067 f->value.function.name = gfc_get_string (PREFIX ("rename_i%d"), f->ts.kind);
2068 }
2069
2070
2071 void
2072 gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
2073 gfc_expr *ncopies)
2074 {
2075 int len;
2076 gfc_expr *tmp;
2077 f->ts.type = BT_CHARACTER;
2078 f->ts.kind = string->ts.kind;
2079 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
2080
2081 /* If possible, generate a character length. */
2082 if (f->ts.u.cl == NULL)
2083 f->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
2084
2085 tmp = NULL;
2086 if (string->expr_type == EXPR_CONSTANT)
2087 {
2088 len = string->value.character.length;
2089 tmp = gfc_get_int_expr (gfc_default_integer_kind, NULL , len);
2090 }
2091 else if (string->ts.u.cl && string->ts.u.cl->length)
2092 {
2093 tmp = gfc_copy_expr (string->ts.u.cl->length);
2094 }
2095
2096 if (tmp)
2097 f->ts.u.cl->length = gfc_multiply (tmp, gfc_copy_expr (ncopies));
2098 }
2099
2100
2101 void
2102 gfc_resolve_reshape (gfc_expr *f, gfc_expr *source, gfc_expr *shape,
2103 gfc_expr *pad ATTRIBUTE_UNUSED,
2104 gfc_expr *order ATTRIBUTE_UNUSED)
2105 {
2106 mpz_t rank;
2107 int kind;
2108 int i;
2109
2110 if (source->ts.type == BT_CHARACTER && source->ref)
2111 gfc_resolve_substring_charlen (source);
2112
2113 f->ts = source->ts;
2114
2115 gfc_array_size (shape, &rank);
2116 f->rank = mpz_get_si (rank);
2117 mpz_clear (rank);
2118 switch (source->ts.type)
2119 {
2120 case BT_COMPLEX:
2121 case BT_REAL:
2122 case BT_INTEGER:
2123 case BT_LOGICAL:
2124 case BT_CHARACTER:
2125 kind = source->ts.kind;
2126 break;
2127
2128 default:
2129 kind = 0;
2130 break;
2131 }
2132
2133 switch (kind)
2134 {
2135 case 4:
2136 case 8:
2137 case 10:
2138 case 16:
2139 if (source->ts.type == BT_COMPLEX || source->ts.type == BT_REAL)
2140 f->value.function.name
2141 = gfc_get_string (PREFIX ("reshape_%c%d"),
2142 gfc_type_letter (source->ts.type),
2143 source->ts.kind);
2144 else if (source->ts.type == BT_CHARACTER)
2145 f->value.function.name = gfc_get_string (PREFIX ("reshape_char%d"),
2146 kind);
2147 else
2148 f->value.function.name
2149 = gfc_get_string (PREFIX ("reshape_%d"), source->ts.kind);
2150 break;
2151
2152 default:
2153 f->value.function.name = (source->ts.type == BT_CHARACTER
2154 ? PREFIX ("reshape_char") : PREFIX ("reshape"));
2155 break;
2156 }
2157
2158 if (shape->expr_type == EXPR_ARRAY && gfc_is_constant_expr (shape))
2159 {
2160 gfc_constructor *c;
2161 f->shape = gfc_get_shape (f->rank);
2162 c = gfc_constructor_first (shape->value.constructor);
2163 for (i = 0; i < f->rank; i++)
2164 {
2165 mpz_init_set (f->shape[i], c->expr->value.integer);
2166 c = gfc_constructor_next (c);
2167 }
2168 }
2169
2170 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
2171 so many runtime variations. */
2172 if (shape->ts.kind != gfc_index_integer_kind)
2173 {
2174 gfc_typespec ts = shape->ts;
2175 ts.kind = gfc_index_integer_kind;
2176 gfc_convert_type_warn (shape, &ts, 2, 0);
2177 }
2178 if (order && order->ts.kind != gfc_index_integer_kind)
2179 gfc_convert_type_warn (order, &shape->ts, 2, 0);
2180 }
2181
2182
2183 void
2184 gfc_resolve_rrspacing (gfc_expr *f, gfc_expr *x)
2185 {
2186 f->ts = x->ts;
2187 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
2188 }
2189
2190
2191 void
2192 gfc_resolve_scale (gfc_expr *f, gfc_expr *x, gfc_expr *i ATTRIBUTE_UNUSED)
2193 {
2194 f->ts = x->ts;
2195 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
2196 }
2197
2198
2199 void
2200 gfc_resolve_scan (gfc_expr *f, gfc_expr *string,
2201 gfc_expr *set ATTRIBUTE_UNUSED,
2202 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
2203 {
2204 f->ts.type = BT_INTEGER;
2205 if (kind)
2206 f->ts.kind = mpz_get_si (kind->value.integer);
2207 else
2208 f->ts.kind = gfc_default_integer_kind;
2209 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
2210 }
2211
2212
2213 void
2214 gfc_resolve_secnds (gfc_expr *t1, gfc_expr *t0)
2215 {
2216 t1->ts = t0->ts;
2217 t1->value.function.name = gfc_get_string (PREFIX ("secnds"));
2218 }
2219
2220
2221 void
2222 gfc_resolve_set_exponent (gfc_expr *f, gfc_expr *x,
2223 gfc_expr *i ATTRIBUTE_UNUSED)
2224 {
2225 f->ts = x->ts;
2226 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
2227 }
2228
2229
2230 void
2231 gfc_resolve_shape (gfc_expr *f, gfc_expr *array, gfc_expr *kind)
2232 {
2233 f->ts.type = BT_INTEGER;
2234
2235 if (kind)
2236 f->ts.kind = mpz_get_si (kind->value.integer);
2237 else
2238 f->ts.kind = gfc_default_integer_kind;
2239
2240 f->rank = 1;
2241 if (array->rank != -1)
2242 {
2243 f->shape = gfc_get_shape (1);
2244 mpz_init_set_ui (f->shape[0], array->rank);
2245 }
2246
2247 f->value.function.name = gfc_get_string (PREFIX ("shape_%d"), f->ts.kind);
2248 }
2249
2250
2251 void
2252 gfc_resolve_shift (gfc_expr *f, gfc_expr *i, gfc_expr *shift ATTRIBUTE_UNUSED)
2253 {
2254 f->ts = i->ts;
2255 if (f->value.function.isym->id == GFC_ISYM_SHIFTA)
2256 f->value.function.name = gfc_get_string ("shifta_i%d", f->ts.kind);
2257 else if (f->value.function.isym->id == GFC_ISYM_SHIFTL)
2258 f->value.function.name = gfc_get_string ("shiftl_i%d", f->ts.kind);
2259 else if (f->value.function.isym->id == GFC_ISYM_SHIFTR)
2260 f->value.function.name = gfc_get_string ("shiftr_i%d", f->ts.kind);
2261 else
2262 gcc_unreachable ();
2263 }
2264
2265
2266 void
2267 gfc_resolve_sign (gfc_expr *f, gfc_expr *a, gfc_expr *b ATTRIBUTE_UNUSED)
2268 {
2269 f->ts = a->ts;
2270 f->value.function.name
2271 = gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
2272 }
2273
2274
2275 void
2276 gfc_resolve_signal (gfc_expr *f, gfc_expr *number, gfc_expr *handler)
2277 {
2278 f->ts.type = BT_INTEGER;
2279 f->ts.kind = gfc_c_int_kind;
2280
2281 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2282 if (handler->ts.type == BT_INTEGER)
2283 {
2284 if (handler->ts.kind != gfc_c_int_kind)
2285 gfc_convert_type (handler, &f->ts, 2);
2286 f->value.function.name = gfc_get_string (PREFIX ("signal_func_int"));
2287 }
2288 else
2289 f->value.function.name = gfc_get_string (PREFIX ("signal_func"));
2290
2291 if (number->ts.kind != gfc_c_int_kind)
2292 gfc_convert_type (number, &f->ts, 2);
2293 }
2294
2295
2296 void
2297 gfc_resolve_sin (gfc_expr *f, gfc_expr *x)
2298 {
2299 f->ts = x->ts;
2300 f->value.function.name
2301 = gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2302 }
2303
2304
2305 void
2306 gfc_resolve_sinh (gfc_expr *f, gfc_expr *x)
2307 {
2308 f->ts = x->ts;
2309 f->value.function.name
2310 = gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2311 }
2312
2313
2314 void
2315 gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2316 gfc_expr *dim ATTRIBUTE_UNUSED, gfc_expr *kind)
2317 {
2318 f->ts.type = BT_INTEGER;
2319 if (kind)
2320 f->ts.kind = mpz_get_si (kind->value.integer);
2321 else
2322 f->ts.kind = gfc_default_integer_kind;
2323 }
2324
2325
2326 void
2327 gfc_resolve_stride (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2328 gfc_expr *dim ATTRIBUTE_UNUSED)
2329 {
2330 f->ts.type = BT_INTEGER;
2331 f->ts.kind = gfc_index_integer_kind;
2332 }
2333
2334
2335 void
2336 gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
2337 {
2338 f->ts = x->ts;
2339 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
2340 }
2341
2342
2343 void
2344 gfc_resolve_spread (gfc_expr *f, gfc_expr *source, gfc_expr *dim,
2345 gfc_expr *ncopies)
2346 {
2347 if (source->ts.type == BT_CHARACTER && source->ref)
2348 gfc_resolve_substring_charlen (source);
2349
2350 if (source->ts.type == BT_CHARACTER)
2351 check_charlen_present (source);
2352
2353 f->ts = source->ts;
2354 f->rank = source->rank + 1;
2355 if (source->rank == 0)
2356 {
2357 if (source->ts.type == BT_CHARACTER)
2358 f->value.function.name
2359 = source->ts.kind == 1 ? PREFIX ("spread_char_scalar")
2360 : gfc_get_string
2361 (PREFIX ("spread_char%d_scalar"),
2362 source->ts.kind);
2363 else
2364 f->value.function.name = PREFIX ("spread_scalar");
2365 }
2366 else
2367 {
2368 if (source->ts.type == BT_CHARACTER)
2369 f->value.function.name
2370 = source->ts.kind == 1 ? PREFIX ("spread_char")
2371 : gfc_get_string
2372 (PREFIX ("spread_char%d"),
2373 source->ts.kind);
2374 else
2375 f->value.function.name = PREFIX ("spread");
2376 }
2377
2378 if (dim && gfc_is_constant_expr (dim)
2379 && ncopies && gfc_is_constant_expr (ncopies) && source->shape[0])
2380 {
2381 int i, idim;
2382 idim = mpz_get_ui (dim->value.integer);
2383 f->shape = gfc_get_shape (f->rank);
2384 for (i = 0; i < (idim - 1); i++)
2385 mpz_init_set (f->shape[i], source->shape[i]);
2386
2387 mpz_init_set (f->shape[idim - 1], ncopies->value.integer);
2388
2389 for (i = idim; i < f->rank ; i++)
2390 mpz_init_set (f->shape[i], source->shape[i-1]);
2391 }
2392
2393
2394 gfc_resolve_dim_arg (dim);
2395 gfc_resolve_index (ncopies, 1);
2396 }
2397
2398
2399 void
2400 gfc_resolve_sqrt (gfc_expr *f, gfc_expr *x)
2401 {
2402 f->ts = x->ts;
2403 f->value.function.name
2404 = gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2405 }
2406
2407
2408 /* Resolve the g77 compatibility function STAT AND FSTAT. */
2409
2410 void
2411 gfc_resolve_stat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2412 gfc_expr *a ATTRIBUTE_UNUSED)
2413 {
2414 f->ts.type = BT_INTEGER;
2415 f->ts.kind = gfc_default_integer_kind;
2416 f->value.function.name = gfc_get_string (PREFIX ("stat_i%d"), f->ts.kind);
2417 }
2418
2419
2420 void
2421 gfc_resolve_lstat (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED,
2422 gfc_expr *a ATTRIBUTE_UNUSED)
2423 {
2424 f->ts.type = BT_INTEGER;
2425 f->ts.kind = gfc_default_integer_kind;
2426 f->value.function.name = gfc_get_string (PREFIX ("lstat_i%d"), f->ts.kind);
2427 }
2428
2429
2430 void
2431 gfc_resolve_fstat (gfc_expr *f, gfc_expr *n, gfc_expr *a ATTRIBUTE_UNUSED)
2432 {
2433 f->ts.type = BT_INTEGER;
2434 f->ts.kind = gfc_default_integer_kind;
2435 if (n->ts.kind != f->ts.kind)
2436 gfc_convert_type (n, &f->ts, 2);
2437
2438 f->value.function.name = gfc_get_string (PREFIX ("fstat_i%d"), f->ts.kind);
2439 }
2440
2441
2442 void
2443 gfc_resolve_fgetc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2444 {
2445 gfc_typespec ts;
2446 gfc_clear_ts (&ts);
2447
2448 f->ts.type = BT_INTEGER;
2449 f->ts.kind = gfc_c_int_kind;
2450 if (u->ts.kind != gfc_c_int_kind)
2451 {
2452 ts.type = BT_INTEGER;
2453 ts.kind = gfc_c_int_kind;
2454 ts.u.derived = NULL;
2455 ts.u.cl = NULL;
2456 gfc_convert_type (u, &ts, 2);
2457 }
2458
2459 f->value.function.name = gfc_get_string (PREFIX ("fgetc"));
2460 }
2461
2462
2463 void
2464 gfc_resolve_fget (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2465 {
2466 f->ts.type = BT_INTEGER;
2467 f->ts.kind = gfc_c_int_kind;
2468 f->value.function.name = gfc_get_string (PREFIX ("fget"));
2469 }
2470
2471
2472 void
2473 gfc_resolve_fputc (gfc_expr *f, gfc_expr *u, gfc_expr *c ATTRIBUTE_UNUSED)
2474 {
2475 gfc_typespec ts;
2476 gfc_clear_ts (&ts);
2477
2478 f->ts.type = BT_INTEGER;
2479 f->ts.kind = gfc_c_int_kind;
2480 if (u->ts.kind != gfc_c_int_kind)
2481 {
2482 ts.type = BT_INTEGER;
2483 ts.kind = gfc_c_int_kind;
2484 ts.u.derived = NULL;
2485 ts.u.cl = NULL;
2486 gfc_convert_type (u, &ts, 2);
2487 }
2488
2489 f->value.function.name = gfc_get_string (PREFIX ("fputc"));
2490 }
2491
2492
2493 void
2494 gfc_resolve_fput (gfc_expr *f, gfc_expr *c ATTRIBUTE_UNUSED)
2495 {
2496 f->ts.type = BT_INTEGER;
2497 f->ts.kind = gfc_c_int_kind;
2498 f->value.function.name = gfc_get_string (PREFIX ("fput"));
2499 }
2500
2501
2502 void
2503 gfc_resolve_ftell (gfc_expr *f, gfc_expr *u)
2504 {
2505 gfc_typespec ts;
2506 gfc_clear_ts (&ts);
2507
2508 f->ts.type = BT_INTEGER;
2509 f->ts.kind = gfc_intio_kind;
2510 if (u->ts.kind != gfc_c_int_kind)
2511 {
2512 ts.type = BT_INTEGER;
2513 ts.kind = gfc_c_int_kind;
2514 ts.u.derived = NULL;
2515 ts.u.cl = NULL;
2516 gfc_convert_type (u, &ts, 2);
2517 }
2518
2519 f->value.function.name = gfc_get_string (PREFIX ("ftell2"));
2520 }
2521
2522
2523 void
2524 gfc_resolve_storage_size (gfc_expr *f, gfc_expr *a ATTRIBUTE_UNUSED,
2525 gfc_expr *kind)
2526 {
2527 f->ts.type = BT_INTEGER;
2528 if (kind)
2529 f->ts.kind = mpz_get_si (kind->value.integer);
2530 else
2531 f->ts.kind = gfc_default_integer_kind;
2532 }
2533
2534
2535 void
2536 gfc_resolve_sum (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2537 {
2538 resolve_transformational ("sum", f, array, dim, mask);
2539 }
2540
2541
2542 void
2543 gfc_resolve_symlnk (gfc_expr *f, gfc_expr *p1 ATTRIBUTE_UNUSED,
2544 gfc_expr *p2 ATTRIBUTE_UNUSED)
2545 {
2546 f->ts.type = BT_INTEGER;
2547 f->ts.kind = gfc_default_integer_kind;
2548 f->value.function.name = gfc_get_string (PREFIX ("symlnk_i%d"), f->ts.kind);
2549 }
2550
2551
2552 /* Resolve the g77 compatibility function SYSTEM. */
2553
2554 void
2555 gfc_resolve_system (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2556 {
2557 f->ts.type = BT_INTEGER;
2558 f->ts.kind = 4;
2559 f->value.function.name = gfc_get_string (PREFIX ("system"));
2560 }
2561
2562
2563 void
2564 gfc_resolve_tan (gfc_expr *f, gfc_expr *x)
2565 {
2566 f->ts = x->ts;
2567 f->value.function.name
2568 = gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2569 }
2570
2571
2572 void
2573 gfc_resolve_tanh (gfc_expr *f, gfc_expr *x)
2574 {
2575 f->ts = x->ts;
2576 f->value.function.name
2577 = gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
2578 }
2579
2580
2581 void
2582 gfc_resolve_image_index (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
2583 gfc_expr *sub ATTRIBUTE_UNUSED)
2584 {
2585 static char image_index[] = "__image_index";
2586 f->ts.type = BT_INTEGER;
2587 f->ts.kind = gfc_default_integer_kind;
2588 f->value.function.name = image_index;
2589 }
2590
2591
2592 void
2593 gfc_resolve_this_image (gfc_expr *f, gfc_expr *array, gfc_expr *dim)
2594 {
2595 static char this_image[] = "__this_image";
2596 if (array)
2597 resolve_bound (f, array, dim, NULL, "__this_image", true);
2598 else
2599 {
2600 f->ts.type = BT_INTEGER;
2601 f->ts.kind = gfc_default_integer_kind;
2602 f->value.function.name = this_image;
2603 }
2604 }
2605
2606
2607 void
2608 gfc_resolve_time (gfc_expr *f)
2609 {
2610 f->ts.type = BT_INTEGER;
2611 f->ts.kind = 4;
2612 f->value.function.name = gfc_get_string (PREFIX ("time_func"));
2613 }
2614
2615
2616 void
2617 gfc_resolve_time8 (gfc_expr *f)
2618 {
2619 f->ts.type = BT_INTEGER;
2620 f->ts.kind = 8;
2621 f->value.function.name = gfc_get_string (PREFIX ("time8_func"));
2622 }
2623
2624
2625 void
2626 gfc_resolve_transfer (gfc_expr *f, gfc_expr *source ATTRIBUTE_UNUSED,
2627 gfc_expr *mold, gfc_expr *size)
2628 {
2629 /* TODO: Make this do something meaningful. */
2630 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
2631
2632 if (mold->ts.type == BT_CHARACTER
2633 && !mold->ts.u.cl->length
2634 && gfc_is_constant_expr (mold))
2635 {
2636 int len;
2637 if (mold->expr_type == EXPR_CONSTANT)
2638 {
2639 len = mold->value.character.length;
2640 mold->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
2641 NULL, len);
2642 }
2643 else
2644 {
2645 gfc_constructor *c = gfc_constructor_first (mold->value.constructor);
2646 len = c->expr->value.character.length;
2647 mold->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
2648 NULL, len);
2649 }
2650 }
2651
2652 f->ts = mold->ts;
2653
2654 if (size == NULL && mold->rank == 0)
2655 {
2656 f->rank = 0;
2657 f->value.function.name = transfer0;
2658 }
2659 else
2660 {
2661 f->rank = 1;
2662 f->value.function.name = transfer1;
2663 if (size && gfc_is_constant_expr (size))
2664 {
2665 f->shape = gfc_get_shape (1);
2666 mpz_init_set (f->shape[0], size->value.integer);
2667 }
2668 }
2669 }
2670
2671
2672 void
2673 gfc_resolve_transpose (gfc_expr *f, gfc_expr *matrix)
2674 {
2675
2676 if (matrix->ts.type == BT_CHARACTER && matrix->ref)
2677 gfc_resolve_substring_charlen (matrix);
2678
2679 f->ts = matrix->ts;
2680 f->rank = 2;
2681 if (matrix->shape)
2682 {
2683 f->shape = gfc_get_shape (2);
2684 mpz_init_set (f->shape[0], matrix->shape[1]);
2685 mpz_init_set (f->shape[1], matrix->shape[0]);
2686 }
2687
2688 switch (matrix->ts.kind)
2689 {
2690 case 4:
2691 case 8:
2692 case 10:
2693 case 16:
2694 switch (matrix->ts.type)
2695 {
2696 case BT_REAL:
2697 case BT_COMPLEX:
2698 f->value.function.name
2699 = gfc_get_string (PREFIX ("transpose_%c%d"),
2700 gfc_type_letter (matrix->ts.type),
2701 matrix->ts.kind);
2702 break;
2703
2704 case BT_INTEGER:
2705 case BT_LOGICAL:
2706 /* Use the integer routines for real and logical cases. This
2707 assumes they all have the same alignment requirements. */
2708 f->value.function.name
2709 = gfc_get_string (PREFIX ("transpose_i%d"), matrix->ts.kind);
2710 break;
2711
2712 default:
2713 if (matrix->ts.type == BT_CHARACTER && matrix->ts.kind == 4)
2714 f->value.function.name = PREFIX ("transpose_char4");
2715 else
2716 f->value.function.name = PREFIX ("transpose");
2717 break;
2718 }
2719 break;
2720
2721 default:
2722 f->value.function.name = (matrix->ts.type == BT_CHARACTER
2723 ? PREFIX ("transpose_char")
2724 : PREFIX ("transpose"));
2725 break;
2726 }
2727 }
2728
2729
2730 void
2731 gfc_resolve_trim (gfc_expr *f, gfc_expr *string)
2732 {
2733 f->ts.type = BT_CHARACTER;
2734 f->ts.kind = string->ts.kind;
2735 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
2736 }
2737
2738
2739 void
2740 gfc_resolve_ubound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2741 {
2742 resolve_bound (f, array, dim, kind, "__ubound", false);
2743 }
2744
2745
2746 void
2747 gfc_resolve_ucobound (gfc_expr *f, gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2748 {
2749 resolve_bound (f, array, dim, kind, "__ucobound", true);
2750 }
2751
2752
2753 /* Resolve the g77 compatibility function UMASK. */
2754
2755 void
2756 gfc_resolve_umask (gfc_expr *f, gfc_expr *n)
2757 {
2758 f->ts.type = BT_INTEGER;
2759 f->ts.kind = n->ts.kind;
2760 f->value.function.name = gfc_get_string (PREFIX ("umask_i%d"), n->ts.kind);
2761 }
2762
2763
2764 /* Resolve the g77 compatibility function UNLINK. */
2765
2766 void
2767 gfc_resolve_unlink (gfc_expr *f, gfc_expr *n ATTRIBUTE_UNUSED)
2768 {
2769 f->ts.type = BT_INTEGER;
2770 f->ts.kind = 4;
2771 f->value.function.name = gfc_get_string (PREFIX ("unlink"));
2772 }
2773
2774
2775 void
2776 gfc_resolve_ttynam (gfc_expr *f, gfc_expr *unit)
2777 {
2778 gfc_typespec ts;
2779 gfc_clear_ts (&ts);
2780
2781 f->ts.type = BT_CHARACTER;
2782 f->ts.kind = gfc_default_character_kind;
2783
2784 if (unit->ts.kind != gfc_c_int_kind)
2785 {
2786 ts.type = BT_INTEGER;
2787 ts.kind = gfc_c_int_kind;
2788 ts.u.derived = NULL;
2789 ts.u.cl = NULL;
2790 gfc_convert_type (unit, &ts, 2);
2791 }
2792
2793 f->value.function.name = gfc_get_string (PREFIX ("ttynam"));
2794 }
2795
2796
2797 void
2798 gfc_resolve_unpack (gfc_expr *f, gfc_expr *vector, gfc_expr *mask,
2799 gfc_expr *field ATTRIBUTE_UNUSED)
2800 {
2801 if (vector->ts.type == BT_CHARACTER && vector->ref)
2802 gfc_resolve_substring_charlen (vector);
2803
2804 f->ts = vector->ts;
2805 f->rank = mask->rank;
2806 resolve_mask_arg (mask);
2807
2808 if (vector->ts.type == BT_CHARACTER)
2809 {
2810 if (vector->ts.kind == 1)
2811 f->value.function.name
2812 = gfc_get_string (PREFIX ("unpack%d_char"), field->rank > 0 ? 1 : 0);
2813 else
2814 f->value.function.name
2815 = gfc_get_string (PREFIX ("unpack%d_char%d"),
2816 field->rank > 0 ? 1 : 0, vector->ts.kind);
2817 }
2818 else
2819 f->value.function.name
2820 = gfc_get_string (PREFIX ("unpack%d"), field->rank > 0 ? 1 : 0);
2821 }
2822
2823
2824 void
2825 gfc_resolve_verify (gfc_expr *f, gfc_expr *string,
2826 gfc_expr *set ATTRIBUTE_UNUSED,
2827 gfc_expr *back ATTRIBUTE_UNUSED, gfc_expr *kind)
2828 {
2829 f->ts.type = BT_INTEGER;
2830 if (kind)
2831 f->ts.kind = mpz_get_si (kind->value.integer);
2832 else
2833 f->ts.kind = gfc_default_integer_kind;
2834 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
2835 }
2836
2837
2838 void
2839 gfc_resolve_xor (gfc_expr *f, gfc_expr *i, gfc_expr *j)
2840 {
2841 f->ts.type = i->ts.type;
2842 f->ts.kind = gfc_kind_max (i, j);
2843
2844 if (i->ts.kind != j->ts.kind)
2845 {
2846 if (i->ts.kind == gfc_kind_max (i, j))
2847 gfc_convert_type (j, &i->ts, 2);
2848 else
2849 gfc_convert_type (i, &j->ts, 2);
2850 }
2851
2852 f->value.function.name
2853 = gfc_get_string ("__xor_%c%d", gfc_type_letter (i->ts.type), f->ts.kind);
2854 }
2855
2856
2857 /* Intrinsic subroutine resolution. */
2858
2859 void
2860 gfc_resolve_alarm_sub (gfc_code *c)
2861 {
2862 const char *name;
2863 gfc_expr *seconds, *handler;
2864 gfc_typespec ts;
2865 gfc_clear_ts (&ts);
2866
2867 seconds = c->ext.actual->expr;
2868 handler = c->ext.actual->next->expr;
2869 ts.type = BT_INTEGER;
2870 ts.kind = gfc_c_int_kind;
2871
2872 /* handler can be either BT_INTEGER or BT_PROCEDURE.
2873 In all cases, the status argument is of default integer kind
2874 (enforced in check.c) so that the function suffix is fixed. */
2875 if (handler->ts.type == BT_INTEGER)
2876 {
2877 if (handler->ts.kind != gfc_c_int_kind)
2878 gfc_convert_type (handler, &ts, 2);
2879 name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
2880 gfc_default_integer_kind);
2881 }
2882 else
2883 name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
2884 gfc_default_integer_kind);
2885
2886 if (seconds->ts.kind != gfc_c_int_kind)
2887 gfc_convert_type (seconds, &ts, 2);
2888
2889 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2890 }
2891
2892 void
2893 gfc_resolve_cpu_time (gfc_code *c)
2894 {
2895 const char *name;
2896 name = gfc_get_string (PREFIX ("cpu_time_%d"), c->ext.actual->expr->ts.kind);
2897 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2898 }
2899
2900
2901 /* Create a formal arglist based on an actual one and set the INTENTs given. */
2902
2903 static gfc_formal_arglist*
2904 create_formal_for_intents (gfc_actual_arglist* actual, const sym_intent* ints)
2905 {
2906 gfc_formal_arglist* head;
2907 gfc_formal_arglist* tail;
2908 int i;
2909
2910 if (!actual)
2911 return NULL;
2912
2913 head = tail = gfc_get_formal_arglist ();
2914 for (i = 0; actual; actual = actual->next, tail = tail->next, ++i)
2915 {
2916 gfc_symbol* sym;
2917
2918 sym = gfc_new_symbol ("dummyarg", NULL);
2919 sym->ts = actual->expr->ts;
2920
2921 sym->attr.intent = ints[i];
2922 tail->sym = sym;
2923
2924 if (actual->next)
2925 tail->next = gfc_get_formal_arglist ();
2926 }
2927
2928 return head;
2929 }
2930
2931
2932 void
2933 gfc_resolve_atomic_def (gfc_code *c)
2934 {
2935 const char *name = "atomic_define";
2936 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2937 }
2938
2939
2940 void
2941 gfc_resolve_atomic_ref (gfc_code *c)
2942 {
2943 const char *name = "atomic_ref";
2944 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2945 }
2946
2947
2948 void
2949 gfc_resolve_mvbits (gfc_code *c)
2950 {
2951 static const sym_intent INTENTS[] = {INTENT_IN, INTENT_IN, INTENT_IN,
2952 INTENT_INOUT, INTENT_IN};
2953
2954 const char *name;
2955 gfc_typespec ts;
2956 gfc_clear_ts (&ts);
2957
2958 /* FROMPOS, LEN and TOPOS are restricted to small values. As such,
2959 they will be converted so that they fit into a C int. */
2960 ts.type = BT_INTEGER;
2961 ts.kind = gfc_c_int_kind;
2962 if (c->ext.actual->next->expr->ts.kind != gfc_c_int_kind)
2963 gfc_convert_type (c->ext.actual->next->expr, &ts, 2);
2964 if (c->ext.actual->next->next->expr->ts.kind != gfc_c_int_kind)
2965 gfc_convert_type (c->ext.actual->next->next->expr, &ts, 2);
2966 if (c->ext.actual->next->next->next->next->expr->ts.kind != gfc_c_int_kind)
2967 gfc_convert_type (c->ext.actual->next->next->next->next->expr, &ts, 2);
2968
2969 /* TO and FROM are guaranteed to have the same kind parameter. */
2970 name = gfc_get_string (PREFIX ("mvbits_i%d"),
2971 c->ext.actual->expr->ts.kind);
2972 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2973 /* Mark as elemental subroutine as this does not happen automatically. */
2974 c->resolved_sym->attr.elemental = 1;
2975
2976 /* Create a dummy formal arglist so the INTENTs are known later for purpose
2977 of creating temporaries. */
2978 c->resolved_sym->formal = create_formal_for_intents (c->ext.actual, INTENTS);
2979 }
2980
2981
2982 void
2983 gfc_resolve_random_number (gfc_code *c)
2984 {
2985 const char *name;
2986 int kind;
2987
2988 kind = c->ext.actual->expr->ts.kind;
2989 if (c->ext.actual->expr->rank == 0)
2990 name = gfc_get_string (PREFIX ("random_r%d"), kind);
2991 else
2992 name = gfc_get_string (PREFIX ("arandom_r%d"), kind);
2993
2994 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2995 }
2996
2997
2998 void
2999 gfc_resolve_random_seed (gfc_code *c)
3000 {
3001 const char *name;
3002
3003 name = gfc_get_string (PREFIX ("random_seed_i%d"), gfc_default_integer_kind);
3004 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3005 }
3006
3007
3008 void
3009 gfc_resolve_rename_sub (gfc_code *c)
3010 {
3011 const char *name;
3012 int kind;
3013
3014 if (c->ext.actual->next->next->expr != NULL)
3015 kind = c->ext.actual->next->next->expr->ts.kind;
3016 else
3017 kind = gfc_default_integer_kind;
3018
3019 name = gfc_get_string (PREFIX ("rename_i%d_sub"), kind);
3020 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3021 }
3022
3023
3024 void
3025 gfc_resolve_kill_sub (gfc_code *c)
3026 {
3027 const char *name;
3028 int kind;
3029
3030 if (c->ext.actual->next->next->expr != NULL)
3031 kind = c->ext.actual->next->next->expr->ts.kind;
3032 else
3033 kind = gfc_default_integer_kind;
3034
3035 name = gfc_get_string (PREFIX ("kill_i%d_sub"), kind);
3036 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3037 }
3038
3039
3040 void
3041 gfc_resolve_link_sub (gfc_code *c)
3042 {
3043 const char *name;
3044 int kind;
3045
3046 if (c->ext.actual->next->next->expr != NULL)
3047 kind = c->ext.actual->next->next->expr->ts.kind;
3048 else
3049 kind = gfc_default_integer_kind;
3050
3051 name = gfc_get_string (PREFIX ("link_i%d_sub"), kind);
3052 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3053 }
3054
3055
3056 void
3057 gfc_resolve_symlnk_sub (gfc_code *c)
3058 {
3059 const char *name;
3060 int kind;
3061
3062 if (c->ext.actual->next->next->expr != NULL)
3063 kind = c->ext.actual->next->next->expr->ts.kind;
3064 else
3065 kind = gfc_default_integer_kind;
3066
3067 name = gfc_get_string (PREFIX ("symlnk_i%d_sub"), kind);
3068 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3069 }
3070
3071
3072 /* G77 compatibility subroutines dtime() and etime(). */
3073
3074 void
3075 gfc_resolve_dtime_sub (gfc_code *c)
3076 {
3077 const char *name;
3078 name = gfc_get_string (PREFIX ("dtime_sub"));
3079 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3080 }
3081
3082 void
3083 gfc_resolve_etime_sub (gfc_code *c)
3084 {
3085 const char *name;
3086 name = gfc_get_string (PREFIX ("etime_sub"));
3087 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3088 }
3089
3090
3091 /* G77 compatibility subroutines itime(), idate(), ltime() and gmtime(). */
3092
3093 void
3094 gfc_resolve_itime (gfc_code *c)
3095 {
3096 c->resolved_sym
3097 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("itime_i%d"),
3098 gfc_default_integer_kind));
3099 }
3100
3101 void
3102 gfc_resolve_idate (gfc_code *c)
3103 {
3104 c->resolved_sym
3105 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("idate_i%d"),
3106 gfc_default_integer_kind));
3107 }
3108
3109 void
3110 gfc_resolve_ltime (gfc_code *c)
3111 {
3112 c->resolved_sym
3113 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("ltime_i%d"),
3114 gfc_default_integer_kind));
3115 }
3116
3117 void
3118 gfc_resolve_gmtime (gfc_code *c)
3119 {
3120 c->resolved_sym
3121 = gfc_get_intrinsic_sub_symbol (gfc_get_string (PREFIX ("gmtime_i%d"),
3122 gfc_default_integer_kind));
3123 }
3124
3125
3126 /* G77 compatibility subroutine second(). */
3127
3128 void
3129 gfc_resolve_second_sub (gfc_code *c)
3130 {
3131 const char *name;
3132 name = gfc_get_string (PREFIX ("second_sub"));
3133 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3134 }
3135
3136
3137 void
3138 gfc_resolve_sleep_sub (gfc_code *c)
3139 {
3140 const char *name;
3141 int kind;
3142
3143 if (c->ext.actual->expr != NULL)
3144 kind = c->ext.actual->expr->ts.kind;
3145 else
3146 kind = gfc_default_integer_kind;
3147
3148 name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
3149 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3150 }
3151
3152
3153 /* G77 compatibility function srand(). */
3154
3155 void
3156 gfc_resolve_srand (gfc_code *c)
3157 {
3158 const char *name;
3159 name = gfc_get_string (PREFIX ("srand"));
3160 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3161 }
3162
3163
3164 /* Resolve the getarg intrinsic subroutine. */
3165
3166 void
3167 gfc_resolve_getarg (gfc_code *c)
3168 {
3169 const char *name;
3170
3171 if (c->ext.actual->expr->ts.kind != gfc_default_integer_kind)
3172 {
3173 gfc_typespec ts;
3174 gfc_clear_ts (&ts);
3175
3176 ts.type = BT_INTEGER;
3177 ts.kind = gfc_default_integer_kind;
3178
3179 gfc_convert_type (c->ext.actual->expr, &ts, 2);
3180 }
3181
3182 name = gfc_get_string (PREFIX ("getarg_i%d"), gfc_default_integer_kind);
3183 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3184 }
3185
3186
3187 /* Resolve the getcwd intrinsic subroutine. */
3188
3189 void
3190 gfc_resolve_getcwd_sub (gfc_code *c)
3191 {
3192 const char *name;
3193 int kind;
3194
3195 if (c->ext.actual->next->expr != NULL)
3196 kind = c->ext.actual->next->expr->ts.kind;
3197 else
3198 kind = gfc_default_integer_kind;
3199
3200 name = gfc_get_string (PREFIX ("getcwd_i%d_sub"), kind);
3201 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3202 }
3203
3204
3205 /* Resolve the get_command intrinsic subroutine. */
3206
3207 void
3208 gfc_resolve_get_command (gfc_code *c)
3209 {
3210 const char *name;
3211 int kind;
3212 kind = gfc_default_integer_kind;
3213 name = gfc_get_string (PREFIX ("get_command_i%d"), kind);
3214 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3215 }
3216
3217
3218 /* Resolve the get_command_argument intrinsic subroutine. */
3219
3220 void
3221 gfc_resolve_get_command_argument (gfc_code *c)
3222 {
3223 const char *name;
3224 int kind;
3225 kind = gfc_default_integer_kind;
3226 name = gfc_get_string (PREFIX ("get_command_argument_i%d"), kind);
3227 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3228 }
3229
3230
3231 /* Resolve the get_environment_variable intrinsic subroutine. */
3232
3233 void
3234 gfc_resolve_get_environment_variable (gfc_code *code)
3235 {
3236 const char *name;
3237 int kind;
3238 kind = gfc_default_integer_kind;
3239 name = gfc_get_string (PREFIX ("get_environment_variable_i%d"), kind);
3240 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3241 }
3242
3243
3244 void
3245 gfc_resolve_signal_sub (gfc_code *c)
3246 {
3247 const char *name;
3248 gfc_expr *number, *handler, *status;
3249 gfc_typespec ts;
3250 gfc_clear_ts (&ts);
3251
3252 number = c->ext.actual->expr;
3253 handler = c->ext.actual->next->expr;
3254 status = c->ext.actual->next->next->expr;
3255 ts.type = BT_INTEGER;
3256 ts.kind = gfc_c_int_kind;
3257
3258 /* handler can be either BT_INTEGER or BT_PROCEDURE */
3259 if (handler->ts.type == BT_INTEGER)
3260 {
3261 if (handler->ts.kind != gfc_c_int_kind)
3262 gfc_convert_type (handler, &ts, 2);
3263 name = gfc_get_string (PREFIX ("signal_sub_int"));
3264 }
3265 else
3266 name = gfc_get_string (PREFIX ("signal_sub"));
3267
3268 if (number->ts.kind != gfc_c_int_kind)
3269 gfc_convert_type (number, &ts, 2);
3270 if (status != NULL && status->ts.kind != gfc_c_int_kind)
3271 gfc_convert_type (status, &ts, 2);
3272
3273 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3274 }
3275
3276
3277 /* Resolve the SYSTEM intrinsic subroutine. */
3278
3279 void
3280 gfc_resolve_system_sub (gfc_code *c)
3281 {
3282 const char *name;
3283 name = gfc_get_string (PREFIX ("system_sub"));
3284 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3285 }
3286
3287
3288 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
3289
3290 void
3291 gfc_resolve_system_clock (gfc_code *c)
3292 {
3293 const char *name;
3294 int kind;
3295
3296 if (c->ext.actual->expr != NULL)
3297 kind = c->ext.actual->expr->ts.kind;
3298 else if (c->ext.actual->next->expr != NULL)
3299 kind = c->ext.actual->next->expr->ts.kind;
3300 else if (c->ext.actual->next->next->expr != NULL)
3301 kind = c->ext.actual->next->next->expr->ts.kind;
3302 else
3303 kind = gfc_default_integer_kind;
3304
3305 name = gfc_get_string (PREFIX ("system_clock_%d"), kind);
3306 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3307 }
3308
3309
3310 /* Resolve the EXECUTE_COMMAND_LINE intrinsic subroutine. */
3311 void
3312 gfc_resolve_execute_command_line (gfc_code *c)
3313 {
3314 const char *name;
3315 name = gfc_get_string (PREFIX ("execute_command_line_i%d"),
3316 gfc_default_integer_kind);
3317 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3318 }
3319
3320
3321 /* Resolve the EXIT intrinsic subroutine. */
3322
3323 void
3324 gfc_resolve_exit (gfc_code *c)
3325 {
3326 const char *name;
3327 gfc_typespec ts;
3328 gfc_expr *n;
3329 gfc_clear_ts (&ts);
3330
3331 /* The STATUS argument has to be of default kind. If it is not,
3332 we convert it. */
3333 ts.type = BT_INTEGER;
3334 ts.kind = gfc_default_integer_kind;
3335 n = c->ext.actual->expr;
3336 if (n != NULL && n->ts.kind != ts.kind)
3337 gfc_convert_type (n, &ts, 2);
3338
3339 name = gfc_get_string (PREFIX ("exit_i%d"), ts.kind);
3340 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3341 }
3342
3343
3344 /* Resolve the FLUSH intrinsic subroutine. */
3345
3346 void
3347 gfc_resolve_flush (gfc_code *c)
3348 {
3349 const char *name;
3350 gfc_typespec ts;
3351 gfc_expr *n;
3352 gfc_clear_ts (&ts);
3353
3354 ts.type = BT_INTEGER;
3355 ts.kind = gfc_default_integer_kind;
3356 n = c->ext.actual->expr;
3357 if (n != NULL && n->ts.kind != ts.kind)
3358 gfc_convert_type (n, &ts, 2);
3359
3360 name = gfc_get_string (PREFIX ("flush_i%d"), ts.kind);
3361 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3362 }
3363
3364
3365 void
3366 gfc_resolve_free (gfc_code *c)
3367 {
3368 gfc_typespec ts;
3369 gfc_expr *n;
3370 gfc_clear_ts (&ts);
3371
3372 ts.type = BT_INTEGER;
3373 ts.kind = gfc_index_integer_kind;
3374 n = c->ext.actual->expr;
3375 if (n->ts.kind != ts.kind)
3376 gfc_convert_type (n, &ts, 2);
3377
3378 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("free"));
3379 }
3380
3381
3382 void
3383 gfc_resolve_ctime_sub (gfc_code *c)
3384 {
3385 gfc_typespec ts;
3386 gfc_clear_ts (&ts);
3387
3388 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
3389 if (c->ext.actual->expr->ts.kind != 8)
3390 {
3391 ts.type = BT_INTEGER;
3392 ts.kind = 8;
3393 ts.u.derived = NULL;
3394 ts.u.cl = NULL;
3395 gfc_convert_type (c->ext.actual->expr, &ts, 2);
3396 }
3397
3398 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ctime_sub"));
3399 }
3400
3401
3402 void
3403 gfc_resolve_fdate_sub (gfc_code *c)
3404 {
3405 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
3406 }
3407
3408
3409 void
3410 gfc_resolve_gerror (gfc_code *c)
3411 {
3412 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
3413 }
3414
3415
3416 void
3417 gfc_resolve_getlog (gfc_code *c)
3418 {
3419 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
3420 }
3421
3422
3423 void
3424 gfc_resolve_hostnm_sub (gfc_code *c)
3425 {
3426 const char *name;
3427 int kind;
3428
3429 if (c->ext.actual->next->expr != NULL)
3430 kind = c->ext.actual->next->expr->ts.kind;
3431 else
3432 kind = gfc_default_integer_kind;
3433
3434 name = gfc_get_string (PREFIX ("hostnm_i%d_sub"), kind);
3435 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3436 }
3437
3438
3439 void
3440 gfc_resolve_perror (gfc_code *c)
3441 {
3442 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
3443 }
3444
3445 /* Resolve the STAT and FSTAT intrinsic subroutines. */
3446
3447 void
3448 gfc_resolve_stat_sub (gfc_code *c)
3449 {
3450 const char *name;
3451 name = gfc_get_string (PREFIX ("stat_i%d_sub"), gfc_default_integer_kind);
3452 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3453 }
3454
3455
3456 void
3457 gfc_resolve_lstat_sub (gfc_code *c)
3458 {
3459 const char *name;
3460 name = gfc_get_string (PREFIX ("lstat_i%d_sub"), gfc_default_integer_kind);
3461 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3462 }
3463
3464
3465 void
3466 gfc_resolve_fstat_sub (gfc_code *c)
3467 {
3468 const char *name;
3469 gfc_expr *u;
3470 gfc_typespec *ts;
3471
3472 u = c->ext.actual->expr;
3473 ts = &c->ext.actual->next->expr->ts;
3474 if (u->ts.kind != ts->kind)
3475 gfc_convert_type (u, ts, 2);
3476 name = gfc_get_string (PREFIX ("fstat_i%d_sub"), ts->kind);
3477 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3478 }
3479
3480
3481 void
3482 gfc_resolve_fgetc_sub (gfc_code *c)
3483 {
3484 const char *name;
3485 gfc_typespec ts;
3486 gfc_expr *u, *st;
3487 gfc_clear_ts (&ts);
3488
3489 u = c->ext.actual->expr;
3490 st = c->ext.actual->next->next->expr;
3491
3492 if (u->ts.kind != gfc_c_int_kind)
3493 {
3494 ts.type = BT_INTEGER;
3495 ts.kind = gfc_c_int_kind;
3496 ts.u.derived = NULL;
3497 ts.u.cl = NULL;
3498 gfc_convert_type (u, &ts, 2);
3499 }
3500
3501 if (st != NULL)
3502 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), st->ts.kind);
3503 else
3504 name = gfc_get_string (PREFIX ("fgetc_i%d_sub"), gfc_default_integer_kind);
3505
3506 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3507 }
3508
3509
3510 void
3511 gfc_resolve_fget_sub (gfc_code *c)
3512 {
3513 const char *name;
3514 gfc_expr *st;
3515
3516 st = c->ext.actual->next->expr;
3517 if (st != NULL)
3518 name = gfc_get_string (PREFIX ("fget_i%d_sub"), st->ts.kind);
3519 else
3520 name = gfc_get_string (PREFIX ("fget_i%d_sub"), gfc_default_integer_kind);
3521
3522 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3523 }
3524
3525
3526 void
3527 gfc_resolve_fputc_sub (gfc_code *c)
3528 {
3529 const char *name;
3530 gfc_typespec ts;
3531 gfc_expr *u, *st;
3532 gfc_clear_ts (&ts);
3533
3534 u = c->ext.actual->expr;
3535 st = c->ext.actual->next->next->expr;
3536
3537 if (u->ts.kind != gfc_c_int_kind)
3538 {
3539 ts.type = BT_INTEGER;
3540 ts.kind = gfc_c_int_kind;
3541 ts.u.derived = NULL;
3542 ts.u.cl = NULL;
3543 gfc_convert_type (u, &ts, 2);
3544 }
3545
3546 if (st != NULL)
3547 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), st->ts.kind);
3548 else
3549 name = gfc_get_string (PREFIX ("fputc_i%d_sub"), gfc_default_integer_kind);
3550
3551 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3552 }
3553
3554
3555 void
3556 gfc_resolve_fput_sub (gfc_code *c)
3557 {
3558 const char *name;
3559 gfc_expr *st;
3560
3561 st = c->ext.actual->next->expr;
3562 if (st != NULL)
3563 name = gfc_get_string (PREFIX ("fput_i%d_sub"), st->ts.kind);
3564 else
3565 name = gfc_get_string (PREFIX ("fput_i%d_sub"), gfc_default_integer_kind);
3566
3567 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3568 }
3569
3570
3571 void
3572 gfc_resolve_fseek_sub (gfc_code *c)
3573 {
3574 gfc_expr *unit;
3575 gfc_expr *offset;
3576 gfc_expr *whence;
3577 gfc_typespec ts;
3578 gfc_clear_ts (&ts);
3579
3580 unit = c->ext.actual->expr;
3581 offset = c->ext.actual->next->expr;
3582 whence = c->ext.actual->next->next->expr;
3583
3584 if (unit->ts.kind != gfc_c_int_kind)
3585 {
3586 ts.type = BT_INTEGER;
3587 ts.kind = gfc_c_int_kind;
3588 ts.u.derived = NULL;
3589 ts.u.cl = NULL;
3590 gfc_convert_type (unit, &ts, 2);
3591 }
3592
3593 if (offset->ts.kind != gfc_intio_kind)
3594 {
3595 ts.type = BT_INTEGER;
3596 ts.kind = gfc_intio_kind;
3597 ts.u.derived = NULL;
3598 ts.u.cl = NULL;
3599 gfc_convert_type (offset, &ts, 2);
3600 }
3601
3602 if (whence->ts.kind != gfc_c_int_kind)
3603 {
3604 ts.type = BT_INTEGER;
3605 ts.kind = gfc_c_int_kind;
3606 ts.u.derived = NULL;
3607 ts.u.cl = NULL;
3608 gfc_convert_type (whence, &ts, 2);
3609 }
3610
3611 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fseek_sub"));
3612 }
3613
3614 void
3615 gfc_resolve_ftell_sub (gfc_code *c)
3616 {
3617 const char *name;
3618 gfc_expr *unit;
3619 gfc_expr *offset;
3620 gfc_typespec ts;
3621 gfc_clear_ts (&ts);
3622
3623 unit = c->ext.actual->expr;
3624 offset = c->ext.actual->next->expr;
3625
3626 if (unit->ts.kind != gfc_c_int_kind)
3627 {
3628 ts.type = BT_INTEGER;
3629 ts.kind = gfc_c_int_kind;
3630 ts.u.derived = NULL;
3631 ts.u.cl = NULL;
3632 gfc_convert_type (unit, &ts, 2);
3633 }
3634
3635 name = gfc_get_string (PREFIX ("ftell_i%d_sub"), offset->ts.kind);
3636 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3637 }
3638
3639
3640 void
3641 gfc_resolve_ttynam_sub (gfc_code *c)
3642 {
3643 gfc_typespec ts;
3644 gfc_clear_ts (&ts);
3645
3646 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
3647 {
3648 ts.type = BT_INTEGER;
3649 ts.kind = gfc_c_int_kind;
3650 ts.u.derived = NULL;
3651 ts.u.cl = NULL;
3652 gfc_convert_type (c->ext.actual->expr, &ts, 2);
3653 }
3654
3655 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("ttynam_sub"));
3656 }
3657
3658
3659 /* Resolve the UMASK intrinsic subroutine. */
3660
3661 void
3662 gfc_resolve_umask_sub (gfc_code *c)
3663 {
3664 const char *name;
3665 int kind;
3666
3667 if (c->ext.actual->next->expr != NULL)
3668 kind = c->ext.actual->next->expr->ts.kind;
3669 else
3670 kind = gfc_default_integer_kind;
3671
3672 name = gfc_get_string (PREFIX ("umask_i%d_sub"), kind);
3673 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3674 }
3675
3676 /* Resolve the UNLINK intrinsic subroutine. */
3677
3678 void
3679 gfc_resolve_unlink_sub (gfc_code *c)
3680 {
3681 const char *name;
3682 int kind;
3683
3684 if (c->ext.actual->next->expr != NULL)
3685 kind = c->ext.actual->next->expr->ts.kind;
3686 else
3687 kind = gfc_default_integer_kind;
3688
3689 name = gfc_get_string (PREFIX ("unlink_i%d_sub"), kind);
3690 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
3691 }