]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/iresolve.c
re PR libfortran/19308 (I/O library should support more real and integer kinds)
[thirdparty/gcc.git] / gcc / fortran / iresolve.c
1 /* Intrinsic function resolution.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
3 Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
22
23
24 /* Assign name and types to intrinsic procedures. For functions, the
25 first argument to a resolution function is an expression pointer to
26 the original function node and the rest are pointers to the
27 arguments of the function call. For subroutines, a pointer to the
28 code node is passed. The result type and library subroutine name
29 are generally set according to the function arguments. */
30
31 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "tree.h"
35 #include "gfortran.h"
36 #include "intrinsic.h"
37
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 /********************** Resolution functions **********************/
63
64
65 void
66 gfc_resolve_abs (gfc_expr * f, gfc_expr * a)
67 {
68 f->ts = a->ts;
69 if (f->ts.type == BT_COMPLEX)
70 f->ts.type = BT_REAL;
71
72 f->value.function.name =
73 gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
74 }
75
76
77 void
78 gfc_resolve_acos (gfc_expr * f, gfc_expr * x)
79 {
80 f->ts = x->ts;
81 f->value.function.name =
82 gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
83 }
84
85
86 void
87 gfc_resolve_acosh (gfc_expr * f, gfc_expr * x)
88 {
89 f->ts = x->ts;
90 f->value.function.name =
91 gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
92 }
93
94
95 void
96 gfc_resolve_aimag (gfc_expr * f, gfc_expr * x)
97 {
98 f->ts.type = BT_REAL;
99 f->ts.kind = x->ts.kind;
100 f->value.function.name =
101 gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
102 }
103
104
105 void
106 gfc_resolve_aint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
107 {
108 f->ts.type = a->ts.type;
109 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
110
111 /* The resolved name is only used for specific intrinsics where
112 the return kind is the same as the arg kind. */
113 f->value.function.name =
114 gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
115 }
116
117
118 void
119 gfc_resolve_dint (gfc_expr * f, gfc_expr * a)
120 {
121 gfc_resolve_aint (f, a, NULL);
122 }
123
124
125 void
126 gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
127 {
128 f->ts = mask->ts;
129
130 if (dim != NULL)
131 {
132 gfc_resolve_dim_arg (dim);
133 f->rank = mask->rank - 1;
134 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
135 }
136
137 f->value.function.name =
138 gfc_get_string (PREFIX("all_%c%d"), gfc_type_letter (mask->ts.type),
139 mask->ts.kind);
140 }
141
142
143 void
144 gfc_resolve_anint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
145 {
146 f->ts.type = a->ts.type;
147 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
148
149 /* The resolved name is only used for specific intrinsics where
150 the return kind is the same as the arg kind. */
151 f->value.function.name =
152 gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
153 }
154
155
156 void
157 gfc_resolve_dnint (gfc_expr * f, gfc_expr * a)
158 {
159 gfc_resolve_anint (f, a, NULL);
160 }
161
162
163 void
164 gfc_resolve_any (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
165 {
166 f->ts = mask->ts;
167
168 if (dim != NULL)
169 {
170 gfc_resolve_dim_arg (dim);
171 f->rank = mask->rank - 1;
172 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
173 }
174
175 f->value.function.name =
176 gfc_get_string (PREFIX("any_%c%d"), gfc_type_letter (mask->ts.type),
177 mask->ts.kind);
178 }
179
180
181 void
182 gfc_resolve_asin (gfc_expr * f, gfc_expr * x)
183 {
184 f->ts = x->ts;
185 f->value.function.name =
186 gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
187 }
188
189 void
190 gfc_resolve_asinh (gfc_expr * f, gfc_expr * x)
191 {
192 f->ts = x->ts;
193 f->value.function.name =
194 gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
195 }
196
197 void
198 gfc_resolve_atan (gfc_expr * f, gfc_expr * x)
199 {
200 f->ts = x->ts;
201 f->value.function.name =
202 gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
203 }
204
205 void
206 gfc_resolve_atanh (gfc_expr * f, gfc_expr * x)
207 {
208 f->ts = x->ts;
209 f->value.function.name =
210 gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
211 }
212
213 void
214 gfc_resolve_atan2 (gfc_expr * f, gfc_expr * x,
215 gfc_expr * y ATTRIBUTE_UNUSED)
216 {
217 f->ts = x->ts;
218 f->value.function.name =
219 gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
220 }
221
222
223 /* Resolve the BESYN and BESJN intrinsics. */
224
225 void
226 gfc_resolve_besn (gfc_expr * f, gfc_expr * n, gfc_expr * x)
227 {
228 gfc_typespec ts;
229
230 f->ts = x->ts;
231 if (n->ts.kind != gfc_c_int_kind)
232 {
233 ts.type = BT_INTEGER;
234 ts.kind = gfc_c_int_kind;
235 gfc_convert_type (n, &ts, 2);
236 }
237 f->value.function.name = gfc_get_string ("<intrinsic>");
238 }
239
240
241 void
242 gfc_resolve_btest (gfc_expr * f, gfc_expr * i, gfc_expr * pos)
243 {
244 f->ts.type = BT_LOGICAL;
245 f->ts.kind = gfc_default_logical_kind;
246
247 f->value.function.name = gfc_get_string ("__btest_%d_%d", i->ts.kind,
248 pos->ts.kind);
249 }
250
251
252 void
253 gfc_resolve_ceiling (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
254 {
255 f->ts.type = BT_INTEGER;
256 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
257 : mpz_get_si (kind->value.integer);
258
259 f->value.function.name =
260 gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
261 gfc_type_letter (a->ts.type), a->ts.kind);
262 }
263
264
265 void
266 gfc_resolve_char (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
267 {
268 f->ts.type = BT_CHARACTER;
269 f->ts.kind = (kind == NULL) ? gfc_default_character_kind
270 : mpz_get_si (kind->value.integer);
271
272 f->value.function.name =
273 gfc_get_string ("__char_%d_%c%d", f->ts.kind,
274 gfc_type_letter (a->ts.type), a->ts.kind);
275 }
276
277
278 void
279 gfc_resolve_chdir (gfc_expr * f, gfc_expr * d ATTRIBUTE_UNUSED)
280 {
281 f->ts.type = BT_INTEGER;
282 f->ts.kind = gfc_default_integer_kind;
283 f->value.function.name = gfc_get_string (PREFIX("chdir_i%d"), f->ts.kind);
284 }
285
286
287 void
288 gfc_resolve_chdir_sub (gfc_code * c)
289 {
290 const char *name;
291 int kind;
292
293 if (c->ext.actual->next->expr != NULL)
294 kind = c->ext.actual->next->expr->ts.kind;
295 else
296 kind = gfc_default_integer_kind;
297
298 name = gfc_get_string (PREFIX("chdir_i%d_sub"), kind);
299 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
300 }
301
302
303 void
304 gfc_resolve_cmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y, gfc_expr * kind)
305 {
306 f->ts.type = BT_COMPLEX;
307 f->ts.kind = (kind == NULL) ? gfc_default_real_kind
308 : mpz_get_si (kind->value.integer);
309
310 if (y == NULL)
311 f->value.function.name =
312 gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
313 gfc_type_letter (x->ts.type), x->ts.kind);
314 else
315 f->value.function.name =
316 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
317 gfc_type_letter (x->ts.type), x->ts.kind,
318 gfc_type_letter (y->ts.type), y->ts.kind);
319 }
320
321 void
322 gfc_resolve_dcmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y)
323 {
324 gfc_resolve_cmplx (f, x, y, gfc_int_expr (gfc_default_double_kind));
325 }
326
327 void
328 gfc_resolve_conjg (gfc_expr * f, gfc_expr * x)
329 {
330 f->ts = x->ts;
331 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
332 }
333
334
335 void
336 gfc_resolve_cos (gfc_expr * f, gfc_expr * x)
337 {
338 f->ts = x->ts;
339 f->value.function.name =
340 gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
341 }
342
343
344 void
345 gfc_resolve_cosh (gfc_expr * f, gfc_expr * x)
346 {
347 f->ts = x->ts;
348 f->value.function.name =
349 gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
350 }
351
352
353 void
354 gfc_resolve_count (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
355 {
356 f->ts.type = BT_INTEGER;
357 f->ts.kind = gfc_default_integer_kind;
358
359 if (dim != NULL)
360 {
361 f->rank = mask->rank - 1;
362 gfc_resolve_dim_arg (dim);
363 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
364 }
365
366 f->value.function.name =
367 gfc_get_string (PREFIX("count_%d_%c%d"), f->ts.kind,
368 gfc_type_letter (mask->ts.type), mask->ts.kind);
369 }
370
371
372 void
373 gfc_resolve_cshift (gfc_expr * f, gfc_expr * array,
374 gfc_expr * shift,
375 gfc_expr * dim)
376 {
377 int n;
378
379 f->ts = array->ts;
380 f->rank = array->rank;
381 f->shape = gfc_copy_shape (array->shape, array->rank);
382
383 if (shift->rank > 0)
384 n = 1;
385 else
386 n = 0;
387
388 /* Convert shift to at least gfc_default_integer_kind, so we don't need
389 kind=1 and kind=2 versions of the library functions. */
390 if (shift->ts.kind < gfc_default_integer_kind)
391 {
392 gfc_typespec ts;
393 ts.type = BT_INTEGER;
394 ts.kind = gfc_default_integer_kind;
395 gfc_convert_type_warn (shift, &ts, 2, 0);
396 }
397
398 if (dim != NULL)
399 {
400 gfc_resolve_dim_arg (dim);
401 /* Convert dim to shift's kind, so we don't need so many variations. */
402 if (dim->ts.kind != shift->ts.kind)
403 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
404 }
405 f->value.function.name =
406 gfc_get_string (PREFIX("cshift%d_%d%s"), n, shift->ts.kind,
407 array->ts.type == BT_CHARACTER ? "_char" : "");
408 }
409
410
411 void
412 gfc_resolve_dble (gfc_expr * f, gfc_expr * a)
413 {
414 f->ts.type = BT_REAL;
415 f->ts.kind = gfc_default_double_kind;
416 f->value.function.name =
417 gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
418 }
419
420
421 void
422 gfc_resolve_dim (gfc_expr * f, gfc_expr * x,
423 gfc_expr * y ATTRIBUTE_UNUSED)
424 {
425 f->ts = x->ts;
426 f->value.function.name =
427 gfc_get_string ("__dim_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
428 }
429
430
431 void
432 gfc_resolve_dot_product (gfc_expr * f, gfc_expr * a, gfc_expr * b)
433 {
434 gfc_expr temp;
435
436 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
437 {
438 f->ts.type = BT_LOGICAL;
439 f->ts.kind = gfc_default_logical_kind;
440 }
441 else
442 {
443 temp.expr_type = EXPR_OP;
444 gfc_clear_ts (&temp.ts);
445 temp.value.op.operator = INTRINSIC_NONE;
446 temp.value.op.op1 = a;
447 temp.value.op.op2 = b;
448 gfc_type_convert_binary (&temp);
449 f->ts = temp.ts;
450 }
451
452 f->value.function.name =
453 gfc_get_string (PREFIX("dot_product_%c%d"), gfc_type_letter (f->ts.type),
454 f->ts.kind);
455 }
456
457
458 void
459 gfc_resolve_dprod (gfc_expr * f,
460 gfc_expr * a ATTRIBUTE_UNUSED,
461 gfc_expr * b ATTRIBUTE_UNUSED)
462 {
463 f->ts.kind = gfc_default_double_kind;
464 f->ts.type = BT_REAL;
465
466 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
467 }
468
469
470 void
471 gfc_resolve_eoshift (gfc_expr * f, gfc_expr * array,
472 gfc_expr * shift,
473 gfc_expr * boundary,
474 gfc_expr * dim)
475 {
476 int n;
477
478 f->ts = array->ts;
479 f->rank = array->rank;
480 f->shape = gfc_copy_shape (array->shape, array->rank);
481
482 n = 0;
483 if (shift->rank > 0)
484 n = n | 1;
485 if (boundary && boundary->rank > 0)
486 n = n | 2;
487
488 /* Convert shift to at least gfc_default_integer_kind, so we don't need
489 kind=1 and kind=2 versions of the library functions. */
490 if (shift->ts.kind < gfc_default_integer_kind)
491 {
492 gfc_typespec ts;
493 ts.type = BT_INTEGER;
494 ts.kind = gfc_default_integer_kind;
495 gfc_convert_type_warn (shift, &ts, 2, 0);
496 }
497
498 if (dim != NULL)
499 {
500 gfc_resolve_dim_arg (dim);
501 /* Convert dim to shift's kind, so we don't need so many variations. */
502 if (dim->ts.kind != shift->ts.kind)
503 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
504 }
505
506 f->value.function.name =
507 gfc_get_string (PREFIX("eoshift%d_%d%s"), n, shift->ts.kind,
508 array->ts.type == BT_CHARACTER ? "_char" : "");
509 }
510
511
512 void
513 gfc_resolve_exp (gfc_expr * f, gfc_expr * x)
514 {
515 f->ts = x->ts;
516 f->value.function.name =
517 gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
518 }
519
520
521 void
522 gfc_resolve_exponent (gfc_expr * f, gfc_expr * x)
523 {
524 f->ts.type = BT_INTEGER;
525 f->ts.kind = gfc_default_integer_kind;
526
527 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
528 }
529
530
531 void
532 gfc_resolve_floor (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
533 {
534 f->ts.type = BT_INTEGER;
535 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
536 : mpz_get_si (kind->value.integer);
537
538 f->value.function.name =
539 gfc_get_string ("__floor%d_%c%d", f->ts.kind,
540 gfc_type_letter (a->ts.type), a->ts.kind);
541 }
542
543
544 void
545 gfc_resolve_fnum (gfc_expr * f, gfc_expr * n)
546 {
547 f->ts.type = BT_INTEGER;
548 f->ts.kind = gfc_default_integer_kind;
549 if (n->ts.kind != f->ts.kind)
550 gfc_convert_type (n, &f->ts, 2);
551 f->value.function.name = gfc_get_string (PREFIX("fnum_i%d"), f->ts.kind);
552 }
553
554
555 void
556 gfc_resolve_fraction (gfc_expr * f, gfc_expr * x)
557 {
558 f->ts = x->ts;
559 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
560 }
561
562
563 /* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
564
565 void
566 gfc_resolve_g77_math1 (gfc_expr * f, gfc_expr * x)
567 {
568 f->ts = x->ts;
569 f->value.function.name = gfc_get_string ("<intrinsic>");
570 }
571
572
573 void
574 gfc_resolve_getcwd (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
575 {
576 f->ts.type = BT_INTEGER;
577 f->ts.kind = 4;
578 f->value.function.name = gfc_get_string (PREFIX("getcwd"));
579 }
580
581
582 void
583 gfc_resolve_getgid (gfc_expr * f)
584 {
585 f->ts.type = BT_INTEGER;
586 f->ts.kind = 4;
587 f->value.function.name = gfc_get_string (PREFIX("getgid"));
588 }
589
590
591 void
592 gfc_resolve_getpid (gfc_expr * f)
593 {
594 f->ts.type = BT_INTEGER;
595 f->ts.kind = 4;
596 f->value.function.name = gfc_get_string (PREFIX("getpid"));
597 }
598
599
600 void
601 gfc_resolve_getuid (gfc_expr * f)
602 {
603 f->ts.type = BT_INTEGER;
604 f->ts.kind = 4;
605 f->value.function.name = gfc_get_string (PREFIX("getuid"));
606 }
607
608 void
609 gfc_resolve_hostnm (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
610 {
611 f->ts.type = BT_INTEGER;
612 f->ts.kind = 4;
613 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
614 }
615
616 void
617 gfc_resolve_iand (gfc_expr * f, gfc_expr * i, gfc_expr * j)
618 {
619 /* If the kind of i and j are different, then g77 cross-promoted the
620 kinds to the largest value. The Fortran 95 standard requires the
621 kinds to match. */
622 if (i->ts.kind != j->ts.kind)
623 {
624 if (i->ts.kind == gfc_kind_max (i,j))
625 gfc_convert_type(j, &i->ts, 2);
626 else
627 gfc_convert_type(i, &j->ts, 2);
628 }
629
630 f->ts = i->ts;
631 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
632 }
633
634
635 void
636 gfc_resolve_ibclr (gfc_expr * f, gfc_expr * i, gfc_expr * pos ATTRIBUTE_UNUSED)
637 {
638 f->ts = i->ts;
639 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
640 }
641
642
643 void
644 gfc_resolve_ibits (gfc_expr * f, gfc_expr * i,
645 gfc_expr * pos ATTRIBUTE_UNUSED,
646 gfc_expr * len ATTRIBUTE_UNUSED)
647 {
648 f->ts = i->ts;
649 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
650 }
651
652
653 void
654 gfc_resolve_ibset (gfc_expr * f, gfc_expr * i,
655 gfc_expr * pos ATTRIBUTE_UNUSED)
656 {
657 f->ts = i->ts;
658 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
659 }
660
661
662 void
663 gfc_resolve_ichar (gfc_expr * f, gfc_expr * c)
664 {
665 f->ts.type = BT_INTEGER;
666 f->ts.kind = gfc_default_integer_kind;
667
668 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
669 }
670
671
672 void
673 gfc_resolve_idnint (gfc_expr * f, gfc_expr * a)
674 {
675 gfc_resolve_nint (f, a, NULL);
676 }
677
678
679 void
680 gfc_resolve_ierrno (gfc_expr * f)
681 {
682 f->ts.type = BT_INTEGER;
683 f->ts.kind = gfc_default_integer_kind;
684 f->value.function.name = gfc_get_string (PREFIX("ierrno_i%d"), f->ts.kind);
685 }
686
687
688 void
689 gfc_resolve_ieor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
690 {
691 /* If the kind of i and j are different, then g77 cross-promoted the
692 kinds to the largest value. The Fortran 95 standard requires the
693 kinds to match. */
694 if (i->ts.kind != j->ts.kind)
695 {
696 if (i->ts.kind == gfc_kind_max (i,j))
697 gfc_convert_type(j, &i->ts, 2);
698 else
699 gfc_convert_type(i, &j->ts, 2);
700 }
701
702 f->ts = i->ts;
703 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
704 }
705
706
707 void
708 gfc_resolve_ior (gfc_expr * f, gfc_expr * i, gfc_expr * j)
709 {
710 /* If the kind of i and j are different, then g77 cross-promoted the
711 kinds to the largest value. The Fortran 95 standard requires the
712 kinds to match. */
713 if (i->ts.kind != j->ts.kind)
714 {
715 if (i->ts.kind == gfc_kind_max (i,j))
716 gfc_convert_type(j, &i->ts, 2);
717 else
718 gfc_convert_type(i, &j->ts, 2);
719 }
720
721 f->ts = i->ts;
722 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
723 }
724
725
726 void
727 gfc_resolve_int (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
728 {
729 f->ts.type = BT_INTEGER;
730 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
731 : mpz_get_si (kind->value.integer);
732
733 f->value.function.name =
734 gfc_get_string ("__int_%d_%c%d", f->ts.kind, gfc_type_letter (a->ts.type),
735 a->ts.kind);
736 }
737
738
739 void
740 gfc_resolve_isatty (gfc_expr * f, gfc_expr * u)
741 {
742 gfc_typespec ts;
743
744 f->ts.type = BT_LOGICAL;
745 f->ts.kind = gfc_default_integer_kind;
746 if (u->ts.kind != gfc_c_int_kind)
747 {
748 ts.type = BT_INTEGER;
749 ts.kind = gfc_c_int_kind;
750 ts.derived = NULL;
751 ts.cl = NULL;
752 gfc_convert_type (u, &ts, 2);
753 }
754
755 f->value.function.name = gfc_get_string (PREFIX("isatty_l%d"), f->ts.kind);
756 }
757
758
759 void
760 gfc_resolve_ishft (gfc_expr * f, gfc_expr * i, gfc_expr * shift)
761 {
762 f->ts = i->ts;
763 f->value.function.name =
764 gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
765 }
766
767
768 void
769 gfc_resolve_ishftc (gfc_expr * f, gfc_expr * i, gfc_expr * shift,
770 gfc_expr * size)
771 {
772 int s_kind;
773
774 s_kind = (size == NULL) ? gfc_default_integer_kind : shift->ts.kind;
775
776 f->ts = i->ts;
777 f->value.function.name =
778 gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
779 }
780
781
782 void
783 gfc_resolve_kill (gfc_expr * f, ATTRIBUTE_UNUSED gfc_expr * p,
784 ATTRIBUTE_UNUSED gfc_expr * s)
785 {
786 f->ts.type = BT_INTEGER;
787 f->ts.kind = gfc_default_integer_kind;
788
789 f->value.function.name = gfc_get_string (PREFIX("kill_i%d"), f->ts.kind);
790 }
791
792
793 void
794 gfc_resolve_lbound (gfc_expr * f, gfc_expr * array,
795 gfc_expr * dim)
796 {
797 static char lbound[] = "__lbound";
798
799 f->ts.type = BT_INTEGER;
800 f->ts.kind = gfc_default_integer_kind;
801
802 if (dim == NULL)
803 {
804 f->rank = 1;
805 f->shape = gfc_get_shape (1);
806 mpz_init_set_ui (f->shape[0], array->rank);
807 }
808
809 f->value.function.name = lbound;
810 }
811
812
813 void
814 gfc_resolve_len (gfc_expr * f, gfc_expr * string)
815 {
816 f->ts.type = BT_INTEGER;
817 f->ts.kind = gfc_default_integer_kind;
818 f->value.function.name = gfc_get_string ("__len_%d", string->ts.kind);
819 }
820
821
822 void
823 gfc_resolve_len_trim (gfc_expr * f, gfc_expr * string)
824 {
825 f->ts.type = BT_INTEGER;
826 f->ts.kind = gfc_default_integer_kind;
827 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
828 }
829
830
831 void
832 gfc_resolve_link (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
833 gfc_expr * p2 ATTRIBUTE_UNUSED)
834 {
835 f->ts.type = BT_INTEGER;
836 f->ts.kind = gfc_default_integer_kind;
837 f->value.function.name = gfc_get_string (PREFIX("link_i%d"), f->ts.kind);
838 }
839
840
841 void
842 gfc_resolve_log (gfc_expr * f, gfc_expr * x)
843 {
844 f->ts = x->ts;
845 f->value.function.name =
846 gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
847 }
848
849
850 void
851 gfc_resolve_log10 (gfc_expr * f, gfc_expr * x)
852 {
853 f->ts = x->ts;
854 f->value.function.name =
855 gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
856 }
857
858
859 void
860 gfc_resolve_logical (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
861 {
862 f->ts.type = BT_LOGICAL;
863 f->ts.kind = (kind == NULL) ? gfc_default_logical_kind
864 : mpz_get_si (kind->value.integer);
865 f->rank = a->rank;
866
867 f->value.function.name =
868 gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
869 gfc_type_letter (a->ts.type), a->ts.kind);
870 }
871
872
873 void
874 gfc_resolve_matmul (gfc_expr * f, gfc_expr * a, gfc_expr * b)
875 {
876 gfc_expr temp;
877
878 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
879 {
880 f->ts.type = BT_LOGICAL;
881 f->ts.kind = gfc_default_logical_kind;
882 }
883 else
884 {
885 temp.expr_type = EXPR_OP;
886 gfc_clear_ts (&temp.ts);
887 temp.value.op.operator = INTRINSIC_NONE;
888 temp.value.op.op1 = a;
889 temp.value.op.op2 = b;
890 gfc_type_convert_binary (&temp);
891 f->ts = temp.ts;
892 }
893
894 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
895
896 f->value.function.name =
897 gfc_get_string (PREFIX("matmul_%c%d"), gfc_type_letter (f->ts.type),
898 f->ts.kind);
899 }
900
901
902 static void
903 gfc_resolve_minmax (const char * name, gfc_expr * f, gfc_actual_arglist * args)
904 {
905 gfc_actual_arglist *a;
906
907 f->ts.type = args->expr->ts.type;
908 f->ts.kind = args->expr->ts.kind;
909 /* Find the largest type kind. */
910 for (a = args->next; a; a = a->next)
911 {
912 if (a->expr->ts.kind > f->ts.kind)
913 f->ts.kind = a->expr->ts.kind;
914 }
915
916 /* Convert all parameters to the required kind. */
917 for (a = args; a; a = a->next)
918 {
919 if (a->expr->ts.kind != f->ts.kind)
920 gfc_convert_type (a->expr, &f->ts, 2);
921 }
922
923 f->value.function.name =
924 gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
925 }
926
927
928 void
929 gfc_resolve_max (gfc_expr * f, gfc_actual_arglist * args)
930 {
931 gfc_resolve_minmax ("__max_%c%d", f, args);
932 }
933
934
935 void
936 gfc_resolve_maxloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
937 gfc_expr * mask)
938 {
939 const char *name;
940
941 f->ts.type = BT_INTEGER;
942 f->ts.kind = gfc_default_integer_kind;
943
944 if (dim == NULL)
945 f->rank = 1;
946 else
947 {
948 f->rank = array->rank - 1;
949 gfc_resolve_dim_arg (dim);
950 }
951
952 name = mask ? "mmaxloc" : "maxloc";
953 f->value.function.name =
954 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
955 gfc_type_letter (array->ts.type), array->ts.kind);
956 }
957
958
959 void
960 gfc_resolve_maxval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
961 gfc_expr * mask)
962 {
963 f->ts = array->ts;
964
965 if (dim != NULL)
966 {
967 f->rank = array->rank - 1;
968 gfc_resolve_dim_arg (dim);
969 }
970
971 f->value.function.name =
972 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mmaxval" : "maxval",
973 gfc_type_letter (array->ts.type), array->ts.kind);
974 }
975
976
977 void
978 gfc_resolve_merge (gfc_expr * f, gfc_expr * tsource,
979 gfc_expr * fsource ATTRIBUTE_UNUSED,
980 gfc_expr * mask ATTRIBUTE_UNUSED)
981 {
982 f->ts = tsource->ts;
983 f->value.function.name =
984 gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
985 tsource->ts.kind);
986 }
987
988
989 void
990 gfc_resolve_min (gfc_expr * f, gfc_actual_arglist * args)
991 {
992 gfc_resolve_minmax ("__min_%c%d", f, args);
993 }
994
995
996 void
997 gfc_resolve_minloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
998 gfc_expr * mask)
999 {
1000 const char *name;
1001
1002 f->ts.type = BT_INTEGER;
1003 f->ts.kind = gfc_default_integer_kind;
1004
1005 if (dim == NULL)
1006 f->rank = 1;
1007 else
1008 {
1009 f->rank = array->rank - 1;
1010 gfc_resolve_dim_arg (dim);
1011 }
1012
1013 name = mask ? "mminloc" : "minloc";
1014 f->value.function.name =
1015 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1016 gfc_type_letter (array->ts.type), array->ts.kind);
1017 }
1018
1019
1020 void
1021 gfc_resolve_minval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1022 gfc_expr * mask)
1023 {
1024 f->ts = array->ts;
1025
1026 if (dim != NULL)
1027 {
1028 f->rank = array->rank - 1;
1029 gfc_resolve_dim_arg (dim);
1030 }
1031
1032 f->value.function.name =
1033 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mminval" : "minval",
1034 gfc_type_letter (array->ts.type), array->ts.kind);
1035 }
1036
1037
1038 void
1039 gfc_resolve_mod (gfc_expr * f, gfc_expr * a,
1040 gfc_expr * p ATTRIBUTE_UNUSED)
1041 {
1042 f->ts = a->ts;
1043 f->value.function.name =
1044 gfc_get_string ("__mod_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1045 }
1046
1047
1048 void
1049 gfc_resolve_modulo (gfc_expr * f, gfc_expr * a,
1050 gfc_expr * p ATTRIBUTE_UNUSED)
1051 {
1052 f->ts = a->ts;
1053 f->value.function.name =
1054 gfc_get_string ("__modulo_%c%d", gfc_type_letter (a->ts.type),
1055 a->ts.kind);
1056 }
1057
1058 void
1059 gfc_resolve_nearest (gfc_expr * f, gfc_expr * a, gfc_expr *p ATTRIBUTE_UNUSED)
1060 {
1061 f->ts = a->ts;
1062 f->value.function.name =
1063 gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1064 a->ts.kind);
1065 }
1066
1067 void
1068 gfc_resolve_nint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1069 {
1070 f->ts.type = BT_INTEGER;
1071 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
1072 : mpz_get_si (kind->value.integer);
1073
1074 f->value.function.name =
1075 gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1076 }
1077
1078
1079 void
1080 gfc_resolve_not (gfc_expr * f, gfc_expr * i)
1081 {
1082 f->ts = i->ts;
1083 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1084 }
1085
1086
1087 void
1088 gfc_resolve_pack (gfc_expr * f, gfc_expr * array, gfc_expr * mask,
1089 gfc_expr * vector ATTRIBUTE_UNUSED)
1090 {
1091 f->ts = array->ts;
1092 f->rank = 1;
1093
1094 if (mask->rank != 0)
1095 f->value.function.name = (array->ts.type == BT_CHARACTER
1096 ? PREFIX("pack_char")
1097 : PREFIX("pack"));
1098 else
1099 {
1100 /* We convert mask to default logical only in the scalar case.
1101 In the array case we can simply read the array as if it were
1102 of type default logical. */
1103 if (mask->ts.kind != gfc_default_logical_kind)
1104 {
1105 gfc_typespec ts;
1106
1107 ts.type = BT_LOGICAL;
1108 ts.kind = gfc_default_logical_kind;
1109 gfc_convert_type (mask, &ts, 2);
1110 }
1111
1112 f->value.function.name = (array->ts.type == BT_CHARACTER
1113 ? PREFIX("pack_s_char")
1114 : PREFIX("pack_s"));
1115 }
1116 }
1117
1118
1119 void
1120 gfc_resolve_product (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1121 gfc_expr * mask)
1122 {
1123 f->ts = array->ts;
1124
1125 if (dim != NULL)
1126 {
1127 f->rank = array->rank - 1;
1128 gfc_resolve_dim_arg (dim);
1129 }
1130
1131 f->value.function.name =
1132 gfc_get_string (PREFIX("%s_%c%d"), mask ? "mproduct" : "product",
1133 gfc_type_letter (array->ts.type), array->ts.kind);
1134 }
1135
1136
1137 void
1138 gfc_resolve_real (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1139 {
1140 f->ts.type = BT_REAL;
1141
1142 if (kind != NULL)
1143 f->ts.kind = mpz_get_si (kind->value.integer);
1144 else
1145 f->ts.kind = (a->ts.type == BT_COMPLEX) ?
1146 a->ts.kind : gfc_default_real_kind;
1147
1148 f->value.function.name =
1149 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1150 gfc_type_letter (a->ts.type), a->ts.kind);
1151 }
1152
1153
1154 void
1155 gfc_resolve_realpart (gfc_expr * f, gfc_expr * a)
1156 {
1157 f->ts.type = BT_REAL;
1158 f->ts.kind = a->ts.kind;
1159 f->value.function.name =
1160 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1161 gfc_type_letter (a->ts.type), a->ts.kind);
1162 }
1163
1164
1165 void
1166 gfc_resolve_rename (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1167 gfc_expr * p2 ATTRIBUTE_UNUSED)
1168 {
1169 f->ts.type = BT_INTEGER;
1170 f->ts.kind = gfc_default_integer_kind;
1171 f->value.function.name = gfc_get_string (PREFIX("rename_i%d"), f->ts.kind);
1172 }
1173
1174
1175 void
1176 gfc_resolve_repeat (gfc_expr * f, gfc_expr * string,
1177 gfc_expr * ncopies ATTRIBUTE_UNUSED)
1178 {
1179 f->ts.type = BT_CHARACTER;
1180 f->ts.kind = string->ts.kind;
1181 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
1182 }
1183
1184
1185 void
1186 gfc_resolve_reshape (gfc_expr * f, gfc_expr * source, gfc_expr * shape,
1187 gfc_expr * pad ATTRIBUTE_UNUSED,
1188 gfc_expr * order ATTRIBUTE_UNUSED)
1189 {
1190 mpz_t rank;
1191 int kind;
1192 int i;
1193
1194 f->ts = source->ts;
1195
1196 gfc_array_size (shape, &rank);
1197 f->rank = mpz_get_si (rank);
1198 mpz_clear (rank);
1199 switch (source->ts.type)
1200 {
1201 case BT_COMPLEX:
1202 kind = source->ts.kind * 2;
1203 break;
1204
1205 case BT_REAL:
1206 case BT_INTEGER:
1207 case BT_LOGICAL:
1208 kind = source->ts.kind;
1209 break;
1210
1211 default:
1212 kind = 0;
1213 break;
1214 }
1215
1216 switch (kind)
1217 {
1218 case 4:
1219 case 8:
1220 case 10:
1221 case 16:
1222 if (source->ts.type == BT_COMPLEX)
1223 f->value.function.name =
1224 gfc_get_string (PREFIX("reshape_%c%d"),
1225 gfc_type_letter (BT_COMPLEX), source->ts.kind);
1226 else
1227 f->value.function.name =
1228 gfc_get_string (PREFIX("reshape_%d"), source->ts.kind);
1229
1230 break;
1231
1232 default:
1233 f->value.function.name = (source->ts.type == BT_CHARACTER
1234 ? PREFIX("reshape_char")
1235 : PREFIX("reshape"));
1236 break;
1237 }
1238
1239 /* TODO: Make this work with a constant ORDER parameter. */
1240 if (shape->expr_type == EXPR_ARRAY
1241 && gfc_is_constant_expr (shape)
1242 && order == NULL)
1243 {
1244 gfc_constructor *c;
1245 f->shape = gfc_get_shape (f->rank);
1246 c = shape->value.constructor;
1247 for (i = 0; i < f->rank; i++)
1248 {
1249 mpz_init_set (f->shape[i], c->expr->value.integer);
1250 c = c->next;
1251 }
1252 }
1253
1254 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1255 so many runtime variations. */
1256 if (shape->ts.kind != gfc_index_integer_kind)
1257 {
1258 gfc_typespec ts = shape->ts;
1259 ts.kind = gfc_index_integer_kind;
1260 gfc_convert_type_warn (shape, &ts, 2, 0);
1261 }
1262 if (order && order->ts.kind != gfc_index_integer_kind)
1263 gfc_convert_type_warn (order, &shape->ts, 2, 0);
1264 }
1265
1266
1267 void
1268 gfc_resolve_rrspacing (gfc_expr * f, gfc_expr * x)
1269 {
1270 f->ts = x->ts;
1271 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1272 }
1273
1274
1275 void
1276 gfc_resolve_scale (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1277 {
1278 f->ts = x->ts;
1279
1280 /* The implementation calls scalbn which takes an int as the
1281 second argument. */
1282 if (i->ts.kind != gfc_c_int_kind)
1283 {
1284 gfc_typespec ts;
1285
1286 ts.type = BT_INTEGER;
1287 ts.kind = gfc_default_integer_kind;
1288
1289 gfc_convert_type_warn (i, &ts, 2, 0);
1290 }
1291
1292 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
1293 }
1294
1295
1296 void
1297 gfc_resolve_scan (gfc_expr * f, gfc_expr * string,
1298 gfc_expr * set ATTRIBUTE_UNUSED,
1299 gfc_expr * back ATTRIBUTE_UNUSED)
1300 {
1301 f->ts.type = BT_INTEGER;
1302 f->ts.kind = gfc_default_integer_kind;
1303 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1304 }
1305
1306
1307 void
1308 gfc_resolve_set_exponent (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1309 {
1310 f->ts = x->ts;
1311
1312 /* The library implementation uses GFC_INTEGER_4 unconditionally,
1313 convert type so we don't have to implement all possible
1314 permutations. */
1315 if (i->ts.kind != 4)
1316 {
1317 gfc_typespec ts;
1318
1319 ts.type = BT_INTEGER;
1320 ts.kind = gfc_default_integer_kind;
1321
1322 gfc_convert_type_warn (i, &ts, 2, 0);
1323 }
1324
1325 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
1326 }
1327
1328
1329 void
1330 gfc_resolve_shape (gfc_expr * f, gfc_expr * array)
1331 {
1332 f->ts.type = BT_INTEGER;
1333 f->ts.kind = gfc_default_integer_kind;
1334 f->rank = 1;
1335 f->value.function.name = gfc_get_string (PREFIX("shape_%d"), f->ts.kind);
1336 f->shape = gfc_get_shape (1);
1337 mpz_init_set_ui (f->shape[0], array->rank);
1338 }
1339
1340
1341 void
1342 gfc_resolve_sign (gfc_expr * f, gfc_expr * a, gfc_expr * b ATTRIBUTE_UNUSED)
1343 {
1344 f->ts = a->ts;
1345 f->value.function.name =
1346 gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1347 }
1348
1349
1350 void
1351 gfc_resolve_sin (gfc_expr * f, gfc_expr * x)
1352 {
1353 f->ts = x->ts;
1354 f->value.function.name =
1355 gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1356 }
1357
1358
1359 void
1360 gfc_resolve_sinh (gfc_expr * f, gfc_expr * x)
1361 {
1362 f->ts = x->ts;
1363 f->value.function.name =
1364 gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1365 }
1366
1367
1368 void
1369 gfc_resolve_spacing (gfc_expr * f, gfc_expr * x)
1370 {
1371 f->ts = x->ts;
1372 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1373 }
1374
1375
1376 void
1377 gfc_resolve_spread (gfc_expr * f, gfc_expr * source,
1378 gfc_expr * dim,
1379 gfc_expr * ncopies)
1380 {
1381 f->ts = source->ts;
1382 f->rank = source->rank + 1;
1383 f->value.function.name = (source->ts.type == BT_CHARACTER
1384 ? PREFIX("spread_char")
1385 : PREFIX("spread"));
1386
1387 gfc_resolve_dim_arg (dim);
1388 gfc_resolve_index (ncopies, 1);
1389 }
1390
1391
1392 void
1393 gfc_resolve_sqrt (gfc_expr * f, gfc_expr * x)
1394 {
1395 f->ts = x->ts;
1396 f->value.function.name =
1397 gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1398 }
1399
1400
1401 /* Resolve the g77 compatibility function STAT AND FSTAT. */
1402
1403 void
1404 gfc_resolve_stat (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED,
1405 gfc_expr * a ATTRIBUTE_UNUSED)
1406 {
1407 f->ts.type = BT_INTEGER;
1408 f->ts.kind = gfc_default_integer_kind;
1409 f->value.function.name = gfc_get_string (PREFIX("stat_i%d"), f->ts.kind);
1410 }
1411
1412
1413 void
1414 gfc_resolve_fstat (gfc_expr * f, gfc_expr * n, gfc_expr * a ATTRIBUTE_UNUSED)
1415 {
1416 f->ts.type = BT_INTEGER;
1417 f->ts.kind = gfc_default_integer_kind;
1418 if (n->ts.kind != f->ts.kind)
1419 gfc_convert_type (n, &f->ts, 2);
1420
1421 f->value.function.name = gfc_get_string (PREFIX("fstat_i%d"), f->ts.kind);
1422 }
1423
1424
1425 void
1426 gfc_resolve_sum (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1427 gfc_expr * mask)
1428 {
1429 f->ts = array->ts;
1430
1431 if (dim != NULL)
1432 {
1433 f->rank = array->rank - 1;
1434 gfc_resolve_dim_arg (dim);
1435 }
1436
1437 f->value.function.name =
1438 gfc_get_string (PREFIX("%s_%c%d"), mask ? "msum" : "sum",
1439 gfc_type_letter (array->ts.type), array->ts.kind);
1440 }
1441
1442
1443 void
1444 gfc_resolve_symlnk (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1445 gfc_expr * p2 ATTRIBUTE_UNUSED)
1446 {
1447 f->ts.type = BT_INTEGER;
1448 f->ts.kind = gfc_default_integer_kind;
1449 f->value.function.name = gfc_get_string (PREFIX("symlnk_i%d"), f->ts.kind);
1450 }
1451
1452
1453 /* Resolve the g77 compatibility function SYSTEM. */
1454
1455 void
1456 gfc_resolve_system (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1457 {
1458 f->ts.type = BT_INTEGER;
1459 f->ts.kind = 4;
1460 f->value.function.name = gfc_get_string (PREFIX("system"));
1461 }
1462
1463
1464 void
1465 gfc_resolve_tan (gfc_expr * f, gfc_expr * x)
1466 {
1467 f->ts = x->ts;
1468 f->value.function.name =
1469 gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1470 }
1471
1472
1473 void
1474 gfc_resolve_tanh (gfc_expr * f, gfc_expr * x)
1475 {
1476 f->ts = x->ts;
1477 f->value.function.name =
1478 gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1479 }
1480
1481
1482 void
1483 gfc_resolve_time (gfc_expr * f)
1484 {
1485 f->ts.type = BT_INTEGER;
1486 f->ts.kind = 4;
1487 f->value.function.name = gfc_get_string (PREFIX("time_func"));
1488 }
1489
1490
1491 void
1492 gfc_resolve_time8 (gfc_expr * f)
1493 {
1494 f->ts.type = BT_INTEGER;
1495 f->ts.kind = 8;
1496 f->value.function.name = gfc_get_string (PREFIX("time8_func"));
1497 }
1498
1499
1500 void
1501 gfc_resolve_transfer (gfc_expr * f, gfc_expr * source ATTRIBUTE_UNUSED,
1502 gfc_expr * mold, gfc_expr * size)
1503 {
1504 /* TODO: Make this do something meaningful. */
1505 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
1506
1507 f->ts = mold->ts;
1508
1509 if (size == NULL && mold->rank == 0)
1510 {
1511 f->rank = 0;
1512 f->value.function.name = transfer0;
1513 }
1514 else
1515 {
1516 f->rank = 1;
1517 f->value.function.name = transfer1;
1518 }
1519 }
1520
1521
1522 void
1523 gfc_resolve_transpose (gfc_expr * f, gfc_expr * matrix)
1524 {
1525 int kind;
1526
1527 f->ts = matrix->ts;
1528 f->rank = 2;
1529 if (matrix->shape)
1530 {
1531 f->shape = gfc_get_shape (2);
1532 mpz_init_set (f->shape[0], matrix->shape[1]);
1533 mpz_init_set (f->shape[1], matrix->shape[0]);
1534 }
1535
1536 kind = matrix->ts.kind;
1537
1538 switch (kind)
1539 {
1540 case 4:
1541 case 8:
1542 case 10:
1543 case 16:
1544 switch (matrix->ts.type)
1545 {
1546 case BT_COMPLEX:
1547 f->value.function.name =
1548 gfc_get_string (PREFIX("transpose_c%d"), kind);
1549 break;
1550
1551 case BT_INTEGER:
1552 case BT_REAL:
1553 case BT_LOGICAL:
1554 /* Use the integer routines for real and logical cases. This
1555 assumes they all have the same alignment requirements. */
1556 f->value.function.name =
1557 gfc_get_string (PREFIX("transpose_i%d"), kind);
1558 break;
1559
1560 default:
1561 f->value.function.name = PREFIX("transpose");
1562 break;
1563 }
1564 break;
1565
1566 default:
1567 f->value.function.name = (matrix->ts.type == BT_CHARACTER
1568 ? PREFIX("transpose_char")
1569 : PREFIX("transpose"));
1570 break;
1571 }
1572 }
1573
1574
1575 void
1576 gfc_resolve_trim (gfc_expr * f, gfc_expr * string)
1577 {
1578 f->ts.type = BT_CHARACTER;
1579 f->ts.kind = string->ts.kind;
1580 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
1581 }
1582
1583
1584 void
1585 gfc_resolve_ubound (gfc_expr * f, gfc_expr * array,
1586 gfc_expr * dim)
1587 {
1588 static char ubound[] = "__ubound";
1589
1590 f->ts.type = BT_INTEGER;
1591 f->ts.kind = gfc_default_integer_kind;
1592
1593 if (dim == NULL)
1594 {
1595 f->rank = 1;
1596 f->shape = gfc_get_shape (1);
1597 mpz_init_set_ui (f->shape[0], array->rank);
1598 }
1599
1600 f->value.function.name = ubound;
1601 }
1602
1603
1604 /* Resolve the g77 compatibility function UMASK. */
1605
1606 void
1607 gfc_resolve_umask (gfc_expr * f, gfc_expr * n)
1608 {
1609 f->ts.type = BT_INTEGER;
1610 f->ts.kind = n->ts.kind;
1611 f->value.function.name = gfc_get_string (PREFIX("umask_i%d"), n->ts.kind);
1612 }
1613
1614
1615 /* Resolve the g77 compatibility function UNLINK. */
1616
1617 void
1618 gfc_resolve_unlink (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1619 {
1620 f->ts.type = BT_INTEGER;
1621 f->ts.kind = 4;
1622 f->value.function.name = gfc_get_string (PREFIX("unlink"));
1623 }
1624
1625 void
1626 gfc_resolve_unpack (gfc_expr * f, gfc_expr * vector, gfc_expr * mask,
1627 gfc_expr * field ATTRIBUTE_UNUSED)
1628 {
1629 f->ts = vector->ts;
1630 f->rank = mask->rank;
1631
1632 f->value.function.name =
1633 gfc_get_string (PREFIX("unpack%d%s"), field->rank > 0 ? 1 : 0,
1634 vector->ts.type == BT_CHARACTER ? "_char" : "");
1635 }
1636
1637
1638 void
1639 gfc_resolve_verify (gfc_expr * f, gfc_expr * string,
1640 gfc_expr * set ATTRIBUTE_UNUSED,
1641 gfc_expr * back ATTRIBUTE_UNUSED)
1642 {
1643 f->ts.type = BT_INTEGER;
1644 f->ts.kind = gfc_default_integer_kind;
1645 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
1646 }
1647
1648
1649 /* Intrinsic subroutine resolution. */
1650
1651 void
1652 gfc_resolve_cpu_time (gfc_code * c ATTRIBUTE_UNUSED)
1653 {
1654 const char *name;
1655
1656 name = gfc_get_string (PREFIX("cpu_time_%d"),
1657 c->ext.actual->expr->ts.kind);
1658 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1659 }
1660
1661
1662 void
1663 gfc_resolve_mvbits (gfc_code * c)
1664 {
1665 const char *name;
1666 int kind;
1667
1668 kind = c->ext.actual->expr->ts.kind;
1669 name = gfc_get_string (PREFIX("mvbits_i%d"), kind);
1670
1671 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1672 }
1673
1674
1675 void
1676 gfc_resolve_random_number (gfc_code * c ATTRIBUTE_UNUSED)
1677 {
1678 const char *name;
1679 int kind;
1680
1681 kind = c->ext.actual->expr->ts.kind;
1682 if (c->ext.actual->expr->rank == 0)
1683 name = gfc_get_string (PREFIX("random_r%d"), kind);
1684 else
1685 name = gfc_get_string (PREFIX("arandom_r%d"), kind);
1686
1687 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1688 }
1689
1690
1691 void
1692 gfc_resolve_rename_sub (gfc_code * c)
1693 {
1694 const char *name;
1695 int kind;
1696
1697 if (c->ext.actual->next->next->expr != NULL)
1698 kind = c->ext.actual->next->next->expr->ts.kind;
1699 else
1700 kind = gfc_default_integer_kind;
1701
1702 name = gfc_get_string (PREFIX("rename_i%d_sub"), kind);
1703 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1704 }
1705
1706
1707 void
1708 gfc_resolve_kill_sub (gfc_code * c)
1709 {
1710 const char *name;
1711 int kind;
1712
1713 if (c->ext.actual->next->next->expr != NULL)
1714 kind = c->ext.actual->next->next->expr->ts.kind;
1715 else
1716 kind = gfc_default_integer_kind;
1717
1718 name = gfc_get_string (PREFIX("kill_i%d_sub"), kind);
1719 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1720 }
1721
1722
1723 void
1724 gfc_resolve_link_sub (gfc_code * c)
1725 {
1726 const char *name;
1727 int kind;
1728
1729 if (c->ext.actual->next->next->expr != NULL)
1730 kind = c->ext.actual->next->next->expr->ts.kind;
1731 else
1732 kind = gfc_default_integer_kind;
1733
1734 name = gfc_get_string (PREFIX("link_i%d_sub"), kind);
1735 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1736 }
1737
1738
1739 void
1740 gfc_resolve_symlnk_sub (gfc_code * c)
1741 {
1742 const char *name;
1743 int kind;
1744
1745 if (c->ext.actual->next->next->expr != NULL)
1746 kind = c->ext.actual->next->next->expr->ts.kind;
1747 else
1748 kind = gfc_default_integer_kind;
1749
1750 name = gfc_get_string (PREFIX("symlnk_i%d_sub"), kind);
1751 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1752 }
1753
1754
1755 /* G77 compatibility subroutines etime() and dtime(). */
1756
1757 void
1758 gfc_resolve_etime_sub (gfc_code * c)
1759 {
1760 const char *name;
1761
1762 name = gfc_get_string (PREFIX("etime_sub"));
1763 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1764 }
1765
1766
1767 /* G77 compatibility subroutine second(). */
1768
1769 void
1770 gfc_resolve_second_sub (gfc_code * c)
1771 {
1772 const char *name;
1773
1774 name = gfc_get_string (PREFIX("second_sub"));
1775 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1776 }
1777
1778
1779 void
1780 gfc_resolve_sleep_sub (gfc_code * c)
1781 {
1782 const char *name;
1783 int kind;
1784
1785 if (c->ext.actual->expr != NULL)
1786 kind = c->ext.actual->expr->ts.kind;
1787 else
1788 kind = gfc_default_integer_kind;
1789
1790 name = gfc_get_string (PREFIX("sleep_i%d_sub"), kind);
1791 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1792 }
1793
1794
1795 /* G77 compatibility function srand(). */
1796
1797 void
1798 gfc_resolve_srand (gfc_code * c)
1799 {
1800 const char *name;
1801 name = gfc_get_string (PREFIX("srand"));
1802 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1803 }
1804
1805
1806 /* Resolve the getarg intrinsic subroutine. */
1807
1808 void
1809 gfc_resolve_getarg (gfc_code * c)
1810 {
1811 const char *name;
1812 int kind;
1813
1814 kind = gfc_default_integer_kind;
1815 name = gfc_get_string (PREFIX("getarg_i%d"), kind);
1816 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1817 }
1818
1819 /* Resolve the getcwd intrinsic subroutine. */
1820
1821 void
1822 gfc_resolve_getcwd_sub (gfc_code * c)
1823 {
1824 const char *name;
1825 int kind;
1826
1827 if (c->ext.actual->next->expr != NULL)
1828 kind = c->ext.actual->next->expr->ts.kind;
1829 else
1830 kind = gfc_default_integer_kind;
1831
1832 name = gfc_get_string (PREFIX("getcwd_i%d_sub"), kind);
1833 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1834 }
1835
1836
1837 /* Resolve the get_command intrinsic subroutine. */
1838
1839 void
1840 gfc_resolve_get_command (gfc_code * c)
1841 {
1842 const char *name;
1843 int kind;
1844
1845 kind = gfc_default_integer_kind;
1846 name = gfc_get_string (PREFIX("get_command_i%d"), kind);
1847 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1848 }
1849
1850
1851 /* Resolve the get_command_argument intrinsic subroutine. */
1852
1853 void
1854 gfc_resolve_get_command_argument (gfc_code * c)
1855 {
1856 const char *name;
1857 int kind;
1858
1859 kind = gfc_default_integer_kind;
1860 name = gfc_get_string (PREFIX("get_command_argument_i%d"), kind);
1861 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1862 }
1863
1864 /* Resolve the get_environment_variable intrinsic subroutine. */
1865
1866 void
1867 gfc_resolve_get_environment_variable (gfc_code * code)
1868 {
1869 const char *name;
1870 int kind;
1871
1872 kind = gfc_default_integer_kind;
1873 name = gfc_get_string (PREFIX("get_environment_variable_i%d"), kind);
1874 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1875 }
1876
1877 /* Resolve the SYSTEM intrinsic subroutine. */
1878
1879 void
1880 gfc_resolve_system_sub (gfc_code * c)
1881 {
1882 const char *name;
1883
1884 name = gfc_get_string (PREFIX("system_sub"));
1885 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1886 }
1887
1888 /* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
1889
1890 void
1891 gfc_resolve_system_clock (gfc_code * c)
1892 {
1893 const char *name;
1894 int kind;
1895
1896 if (c->ext.actual->expr != NULL)
1897 kind = c->ext.actual->expr->ts.kind;
1898 else if (c->ext.actual->next->expr != NULL)
1899 kind = c->ext.actual->next->expr->ts.kind;
1900 else if (c->ext.actual->next->next->expr != NULL)
1901 kind = c->ext.actual->next->next->expr->ts.kind;
1902 else
1903 kind = gfc_default_integer_kind;
1904
1905 name = gfc_get_string (PREFIX("system_clock_%d"), kind);
1906 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1907 }
1908
1909 /* Resolve the EXIT intrinsic subroutine. */
1910
1911 void
1912 gfc_resolve_exit (gfc_code * c)
1913 {
1914 const char *name;
1915 int kind;
1916
1917 if (c->ext.actual->expr != NULL)
1918 kind = c->ext.actual->expr->ts.kind;
1919 else
1920 kind = gfc_default_integer_kind;
1921
1922 name = gfc_get_string (PREFIX("exit_i%d"), kind);
1923 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1924 }
1925
1926 /* Resolve the FLUSH intrinsic subroutine. */
1927
1928 void
1929 gfc_resolve_flush (gfc_code * c)
1930 {
1931 const char *name;
1932 gfc_typespec ts;
1933 gfc_expr *n;
1934
1935 ts.type = BT_INTEGER;
1936 ts.kind = gfc_default_integer_kind;
1937 n = c->ext.actual->expr;
1938 if (n != NULL
1939 && n->ts.kind != ts.kind)
1940 gfc_convert_type (n, &ts, 2);
1941
1942 name = gfc_get_string (PREFIX("flush_i%d"), ts.kind);
1943 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1944 }
1945
1946
1947 void
1948 gfc_resolve_gerror (gfc_code * c)
1949 {
1950 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
1951 }
1952
1953
1954 void
1955 gfc_resolve_getlog (gfc_code * c)
1956 {
1957 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
1958 }
1959
1960
1961 void
1962 gfc_resolve_hostnm_sub (gfc_code * c)
1963 {
1964 const char *name;
1965 int kind;
1966
1967 if (c->ext.actual->next->expr != NULL)
1968 kind = c->ext.actual->next->expr->ts.kind;
1969 else
1970 kind = gfc_default_integer_kind;
1971
1972 name = gfc_get_string (PREFIX("hostnm_i%d_sub"), kind);
1973 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1974 }
1975
1976
1977 void
1978 gfc_resolve_perror (gfc_code * c)
1979 {
1980 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
1981 }
1982
1983 /* Resolve the STAT and FSTAT intrinsic subroutines. */
1984
1985 void
1986 gfc_resolve_stat_sub (gfc_code * c)
1987 {
1988 const char *name;
1989
1990 name = gfc_get_string (PREFIX("stat_i%d_sub"), gfc_default_integer_kind);
1991 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
1992 }
1993
1994
1995 void
1996 gfc_resolve_fstat_sub (gfc_code * c)
1997 {
1998 const char *name;
1999 gfc_expr *u;
2000 gfc_typespec *ts;
2001
2002 u = c->ext.actual->expr;
2003 ts = &c->ext.actual->next->expr->ts;
2004 if (u->ts.kind != ts->kind)
2005 gfc_convert_type (u, ts, 2);
2006 name = gfc_get_string (PREFIX("fstat_i%d_sub"), ts->kind);
2007 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2008 }
2009
2010
2011 void
2012 gfc_resolve_ttynam_sub (gfc_code * c)
2013 {
2014 gfc_typespec ts;
2015
2016 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
2017 {
2018 ts.type = BT_INTEGER;
2019 ts.kind = gfc_c_int_kind;
2020 ts.derived = NULL;
2021 ts.cl = NULL;
2022 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2023 }
2024
2025 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ttynam_sub"));
2026 }
2027
2028
2029 /* Resolve the UMASK intrinsic subroutine. */
2030
2031 void
2032 gfc_resolve_umask_sub (gfc_code * c)
2033 {
2034 const char *name;
2035 int kind;
2036
2037 if (c->ext.actual->next->expr != NULL)
2038 kind = c->ext.actual->next->expr->ts.kind;
2039 else
2040 kind = gfc_default_integer_kind;
2041
2042 name = gfc_get_string (PREFIX("umask_i%d_sub"), kind);
2043 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2044 }
2045
2046 /* Resolve the UNLINK intrinsic subroutine. */
2047
2048 void
2049 gfc_resolve_unlink_sub (gfc_code * c)
2050 {
2051 const char *name;
2052 int kind;
2053
2054 if (c->ext.actual->next->expr != NULL)
2055 kind = c->ext.actual->next->expr->ts.kind;
2056 else
2057 kind = gfc_default_integer_kind;
2058
2059 name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind);
2060 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2061 }