]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/iresolve.c
re PR tree-optimization/26804 (Alias Time explosion)
[gcc.git] / gcc / fortran / iresolve.c
CommitLineData
6de9cd9a 1/* Intrinsic function resolution.
ec378180 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
9fc4d79b 3 Inc.
6de9cd9a
DN
4 Contributed by Andy Vaught & Katherine Holcomb
5
9fc4d79b 6This file is part of GCC.
6de9cd9a 7
9fc4d79b
TS
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
6de9cd9a 12
9fc4d79b
TS
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
6de9cd9a
DN
17
18You should have received a copy of the GNU General Public License
9fc4d79b 19along with GCC; see the file COPYING. If not, write to the Free
ab57747b
KC
20Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2102110-1301, USA. */
6de9cd9a
DN
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"
6b25a558
RH
32#include "system.h"
33#include "coretypes.h"
34#include "tree.h"
6de9cd9a
DN
35#include "gfortran.h"
36#include "intrinsic.h"
37
38
6b25a558 39/* Given printf-like arguments, return a stable version of the result string.
6de9cd9a 40
6b25a558
RH
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. */
6de9cd9a 45
6b25a558 46const char *
6de9cd9a
DN
47gfc_get_string (const char *format, ...)
48{
6b25a558 49 char temp_name[128];
6de9cd9a 50 va_list ap;
6b25a558 51 tree ident;
6de9cd9a
DN
52
53 va_start (ap, format);
6b25a558 54 vsnprintf (temp_name, sizeof(temp_name), format, ap);
6de9cd9a 55 va_end (ap);
6b25a558 56 temp_name[sizeof(temp_name)-1] = 0;
6de9cd9a 57
6b25a558
RH
58 ident = get_identifier (temp_name);
59 return IDENTIFIER_POINTER (ident);
6de9cd9a
DN
60}
61
2853e512
PT
62/* MERGE and SPREAD need to have source charlen's present for passing
63 to the result expression. */
64static void
65check_charlen_present (gfc_expr *source)
66{
67 if (source->expr_type == EXPR_CONSTANT && source->ts.cl == NULL)
68 {
69 source->ts.cl = gfc_get_charlen ();
70 source->ts.cl->next = gfc_current_ns->cl_list;
71 gfc_current_ns->cl_list = source->ts.cl;
72 source->ts.cl->length = gfc_int_expr (source->value.character.length);
73 source->rank = 0;
74 }
75}
76
6de9cd9a
DN
77/********************** Resolution functions **********************/
78
79
80void
81gfc_resolve_abs (gfc_expr * f, gfc_expr * a)
82{
6de9cd9a
DN
83 f->ts = a->ts;
84 if (f->ts.type == BT_COMPLEX)
85 f->ts.type = BT_REAL;
86
87 f->value.function.name =
88 gfc_get_string ("__abs_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
89}
90
91
92void
93gfc_resolve_acos (gfc_expr * f, gfc_expr * x)
94{
6de9cd9a
DN
95 f->ts = x->ts;
96 f->value.function.name =
97 gfc_get_string ("__acos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
98}
99
100
1e399e23
JD
101void
102gfc_resolve_acosh (gfc_expr * f, gfc_expr * x)
103{
104 f->ts = x->ts;
105 f->value.function.name =
106 gfc_get_string ("__acosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
107}
108
109
6de9cd9a
DN
110void
111gfc_resolve_aimag (gfc_expr * f, gfc_expr * x)
112{
6de9cd9a
DN
113 f->ts.type = BT_REAL;
114 f->ts.kind = x->ts.kind;
115 f->value.function.name =
116 gfc_get_string ("__aimag_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
117}
118
119
5d723e54
FXC
120void
121gfc_resolve_and (gfc_expr * f, gfc_expr * i, gfc_expr * j)
122{
123 f->ts.type = i->ts.type;
124 f->ts.kind = gfc_kind_max (i,j);
125
126 if (i->ts.kind != j->ts.kind)
127 {
128 if (i->ts.kind == gfc_kind_max (i,j))
129 gfc_convert_type(j, &i->ts, 2);
130 else
131 gfc_convert_type(i, &j->ts, 2);
132 }
133
134 f->value.function.name = gfc_get_string ("__and_%c%d",
135 gfc_type_letter (i->ts.type),
136 f->ts.kind);
137}
138
139
6de9cd9a
DN
140void
141gfc_resolve_aint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
142{
5dd17af5
SK
143 gfc_typespec ts;
144
6de9cd9a
DN
145 f->ts.type = a->ts.type;
146 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
147
5dd17af5
SK
148 if (a->ts.kind != f->ts.kind)
149 {
150 ts.type = f->ts.type;
151 ts.kind = f->ts.kind;
152 gfc_convert_type (a, &ts, 2);
153 }
6de9cd9a
DN
154 /* The resolved name is only used for specific intrinsics where
155 the return kind is the same as the arg kind. */
156 f->value.function.name =
157 gfc_get_string ("__aint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
158}
159
160
161void
162gfc_resolve_dint (gfc_expr * f, gfc_expr * a)
163{
164 gfc_resolve_aint (f, a, NULL);
165}
166
167
168void
169gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
170{
6de9cd9a
DN
171 f->ts = mask->ts;
172
173 if (dim != NULL)
174 {
bf302220 175 gfc_resolve_dim_arg (dim);
6de9cd9a 176 f->rank = mask->rank - 1;
94538bd1 177 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
6de9cd9a
DN
178 }
179
180 f->value.function.name =
7f68c75f 181 gfc_get_string (PREFIX("all_%c%d"), gfc_type_letter (mask->ts.type),
6de9cd9a
DN
182 mask->ts.kind);
183}
184
185
186void
187gfc_resolve_anint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
188{
5dd17af5
SK
189 gfc_typespec ts;
190
6de9cd9a
DN
191 f->ts.type = a->ts.type;
192 f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
193
5dd17af5
SK
194 if (a->ts.kind != f->ts.kind)
195 {
196 ts.type = f->ts.type;
197 ts.kind = f->ts.kind;
198 gfc_convert_type (a, &ts, 2);
199 }
200
6de9cd9a
DN
201 /* The resolved name is only used for specific intrinsics where
202 the return kind is the same as the arg kind. */
203 f->value.function.name =
204 gfc_get_string ("__anint_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
205}
206
207
208void
209gfc_resolve_dnint (gfc_expr * f, gfc_expr * a)
210{
211 gfc_resolve_anint (f, a, NULL);
212}
213
214
215void
216gfc_resolve_any (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
217{
6de9cd9a
DN
218 f->ts = mask->ts;
219
220 if (dim != NULL)
221 {
bf302220 222 gfc_resolve_dim_arg (dim);
6de9cd9a 223 f->rank = mask->rank - 1;
94538bd1 224 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
6de9cd9a
DN
225 }
226
227 f->value.function.name =
7f68c75f 228 gfc_get_string (PREFIX("any_%c%d"), gfc_type_letter (mask->ts.type),
6de9cd9a
DN
229 mask->ts.kind);
230}
231
232
233void
234gfc_resolve_asin (gfc_expr * f, gfc_expr * x)
235{
6de9cd9a
DN
236 f->ts = x->ts;
237 f->value.function.name =
238 gfc_get_string ("__asin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
239}
240
1e399e23
JD
241void
242gfc_resolve_asinh (gfc_expr * f, gfc_expr * x)
243{
244 f->ts = x->ts;
245 f->value.function.name =
246 gfc_get_string ("__asinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
247}
6de9cd9a
DN
248
249void
250gfc_resolve_atan (gfc_expr * f, gfc_expr * x)
251{
6de9cd9a
DN
252 f->ts = x->ts;
253 f->value.function.name =
254 gfc_get_string ("__atan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
255}
256
1e399e23
JD
257void
258gfc_resolve_atanh (gfc_expr * f, gfc_expr * x)
259{
260 f->ts = x->ts;
261 f->value.function.name =
262 gfc_get_string ("__atanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
263}
6de9cd9a
DN
264
265void
266gfc_resolve_atan2 (gfc_expr * f, gfc_expr * x,
267 gfc_expr * y ATTRIBUTE_UNUSED)
268{
6de9cd9a
DN
269 f->ts = x->ts;
270 f->value.function.name =
271 gfc_get_string ("__atan2_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
272}
273
274
e8525382
SK
275/* Resolve the BESYN and BESJN intrinsics. */
276
277void
278gfc_resolve_besn (gfc_expr * f, gfc_expr * n, gfc_expr * x)
279{
280 gfc_typespec ts;
281
282 f->ts = x->ts;
283 if (n->ts.kind != gfc_c_int_kind)
284 {
285 ts.type = BT_INTEGER;
286 ts.kind = gfc_c_int_kind;
287 gfc_convert_type (n, &ts, 2);
288 }
289 f->value.function.name = gfc_get_string ("<intrinsic>");
290}
291
292
6de9cd9a
DN
293void
294gfc_resolve_btest (gfc_expr * f, gfc_expr * i, gfc_expr * pos)
295{
6de9cd9a 296 f->ts.type = BT_LOGICAL;
9d64df18 297 f->ts.kind = gfc_default_logical_kind;
6de9cd9a
DN
298
299 f->value.function.name = gfc_get_string ("__btest_%d_%d", i->ts.kind,
300 pos->ts.kind);
301}
302
303
304void
305gfc_resolve_ceiling (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
306{
6de9cd9a 307 f->ts.type = BT_INTEGER;
9d64df18 308 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
6de9cd9a
DN
309 : mpz_get_si (kind->value.integer);
310
311 f->value.function.name =
312 gfc_get_string ("__ceiling_%d_%c%d", f->ts.kind,
313 gfc_type_letter (a->ts.type), a->ts.kind);
314}
315
316
317void
318gfc_resolve_char (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
319{
6de9cd9a 320 f->ts.type = BT_CHARACTER;
9d64df18 321 f->ts.kind = (kind == NULL) ? gfc_default_character_kind
6de9cd9a
DN
322 : mpz_get_si (kind->value.integer);
323
324 f->value.function.name =
325 gfc_get_string ("__char_%d_%c%d", f->ts.kind,
326 gfc_type_letter (a->ts.type), a->ts.kind);
327}
328
329
f77b6ca3
FXC
330void
331gfc_resolve_chdir (gfc_expr * f, gfc_expr * d ATTRIBUTE_UNUSED)
332{
333 f->ts.type = BT_INTEGER;
334 f->ts.kind = gfc_default_integer_kind;
335 f->value.function.name = gfc_get_string (PREFIX("chdir_i%d"), f->ts.kind);
336}
337
338
339void
340gfc_resolve_chdir_sub (gfc_code * c)
341{
342 const char *name;
343 int kind;
344
345 if (c->ext.actual->next->expr != NULL)
346 kind = c->ext.actual->next->expr->ts.kind;
347 else
348 kind = gfc_default_integer_kind;
349
350 name = gfc_get_string (PREFIX("chdir_i%d_sub"), kind);
351 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
352}
353
354
6de9cd9a
DN
355void
356gfc_resolve_cmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y, gfc_expr * kind)
357{
6de9cd9a 358 f->ts.type = BT_COMPLEX;
9d64df18 359 f->ts.kind = (kind == NULL) ? gfc_default_real_kind
6de9cd9a
DN
360 : mpz_get_si (kind->value.integer);
361
362 if (y == NULL)
363 f->value.function.name =
364 gfc_get_string ("__cmplx0_%d_%c%d", f->ts.kind,
365 gfc_type_letter (x->ts.type), x->ts.kind);
366 else
367 f->value.function.name =
368 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
369 gfc_type_letter (x->ts.type), x->ts.kind,
370 gfc_type_letter (y->ts.type), y->ts.kind);
371}
372
373void
374gfc_resolve_dcmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y)
375{
9d64df18 376 gfc_resolve_cmplx (f, x, y, gfc_int_expr (gfc_default_double_kind));
6de9cd9a
DN
377}
378
5d723e54
FXC
379void
380gfc_resolve_complex (gfc_expr * f, gfc_expr * x, gfc_expr * y)
381{
382 int kind;
383
384 if (x->ts.type == BT_INTEGER)
385 {
386 if (y->ts.type == BT_INTEGER)
387 kind = gfc_default_real_kind;
388 else
389 kind = y->ts.kind;
390 }
391 else
392 {
393 if (y->ts.type == BT_REAL)
394 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
395 else
396 kind = x->ts.kind;
397 }
398
399 f->ts.type = BT_COMPLEX;
400 f->ts.kind = kind;
401
402 f->value.function.name =
403 gfc_get_string ("__cmplx1_%d_%c%d_%c%d", f->ts.kind,
404 gfc_type_letter (x->ts.type), x->ts.kind,
405 gfc_type_letter (y->ts.type), y->ts.kind);
406}
407
408
6de9cd9a
DN
409void
410gfc_resolve_conjg (gfc_expr * f, gfc_expr * x)
411{
6de9cd9a
DN
412 f->ts = x->ts;
413 f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
414}
415
416
417void
418gfc_resolve_cos (gfc_expr * f, gfc_expr * x)
419{
6de9cd9a
DN
420 f->ts = x->ts;
421 f->value.function.name =
422 gfc_get_string ("__cos_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
423}
424
425
426void
427gfc_resolve_cosh (gfc_expr * f, gfc_expr * x)
428{
6de9cd9a
DN
429 f->ts = x->ts;
430 f->value.function.name =
431 gfc_get_string ("__cosh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
432}
433
434
435void
436gfc_resolve_count (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
437{
6de9cd9a 438 f->ts.type = BT_INTEGER;
9d64df18 439 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
440
441 if (dim != NULL)
442 {
443 f->rank = mask->rank - 1;
bf302220 444 gfc_resolve_dim_arg (dim);
94538bd1 445 f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
6de9cd9a
DN
446 }
447
448 f->value.function.name =
7f68c75f 449 gfc_get_string (PREFIX("count_%d_%c%d"), f->ts.kind,
6de9cd9a
DN
450 gfc_type_letter (mask->ts.type), mask->ts.kind);
451}
452
453
454void
455gfc_resolve_cshift (gfc_expr * f, gfc_expr * array,
456 gfc_expr * shift,
457 gfc_expr * dim)
458{
459 int n;
460
461 f->ts = array->ts;
462 f->rank = array->rank;
94538bd1 463 f->shape = gfc_copy_shape (array->shape, array->rank);
6de9cd9a
DN
464
465 if (shift->rank > 0)
466 n = 1;
467 else
468 n = 0;
469
bf302220
TK
470 /* Convert shift to at least gfc_default_integer_kind, so we don't need
471 kind=1 and kind=2 versions of the library functions. */
472 if (shift->ts.kind < gfc_default_integer_kind)
473 {
474 gfc_typespec ts;
475 ts.type = BT_INTEGER;
476 ts.kind = gfc_default_integer_kind;
477 gfc_convert_type_warn (shift, &ts, 2, 0);
478 }
479
6de9cd9a
DN
480 if (dim != NULL)
481 {
bf302220 482 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
483 /* Convert dim to shift's kind, so we don't need so many variations. */
484 if (dim->ts.kind != shift->ts.kind)
323c74da 485 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
6de9cd9a
DN
486 }
487 f->value.function.name =
7823229b
RS
488 gfc_get_string (PREFIX("cshift%d_%d%s"), n, shift->ts.kind,
489 array->ts.type == BT_CHARACTER ? "_char" : "");
6de9cd9a
DN
490}
491
492
35059811
FXC
493void
494gfc_resolve_ctime (gfc_expr * f, gfc_expr * time)
495{
496 gfc_typespec ts;
497
498 f->ts.type = BT_CHARACTER;
499 f->ts.kind = gfc_default_character_kind;
500
501 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
502 if (time->ts.kind != 8)
503 {
504 ts.type = BT_INTEGER;
505 ts.kind = 8;
506 ts.derived = NULL;
507 ts.cl = NULL;
508 gfc_convert_type (time, &ts, 2);
509 }
510
511 f->value.function.name = gfc_get_string (PREFIX("ctime"));
512}
513
514
6de9cd9a
DN
515void
516gfc_resolve_dble (gfc_expr * f, gfc_expr * a)
517{
6de9cd9a 518 f->ts.type = BT_REAL;
9d64df18 519 f->ts.kind = gfc_default_double_kind;
6de9cd9a
DN
520 f->value.function.name =
521 gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
522}
523
524
525void
991bb832 526gfc_resolve_dim (gfc_expr * f, gfc_expr * a, gfc_expr * p)
6de9cd9a 527{
991bb832
FXC
528 f->ts.type = a->ts.type;
529 if (p != NULL)
530 f->ts.kind = gfc_kind_max (a,p);
531 else
532 f->ts.kind = a->ts.kind;
533
534 if (p != NULL && a->ts.kind != p->ts.kind)
535 {
536 if (a->ts.kind == gfc_kind_max (a,p))
537 gfc_convert_type(p, &a->ts, 2);
538 else
539 gfc_convert_type(a, &p->ts, 2);
540 }
541
6de9cd9a 542 f->value.function.name =
991bb832 543 gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
6de9cd9a
DN
544}
545
546
547void
548gfc_resolve_dot_product (gfc_expr * f, gfc_expr * a, gfc_expr * b)
549{
550 gfc_expr temp;
551
61321991
PT
552 temp.expr_type = EXPR_OP;
553 gfc_clear_ts (&temp.ts);
554 temp.value.op.operator = INTRINSIC_NONE;
555 temp.value.op.op1 = a;
556 temp.value.op.op2 = b;
557 gfc_type_convert_binary (&temp);
558 f->ts = temp.ts;
6de9cd9a
DN
559
560 f->value.function.name =
7f68c75f 561 gfc_get_string (PREFIX("dot_product_%c%d"), gfc_type_letter (f->ts.type),
6de9cd9a
DN
562 f->ts.kind);
563}
564
565
566void
567gfc_resolve_dprod (gfc_expr * f,
568 gfc_expr * a ATTRIBUTE_UNUSED,
569 gfc_expr * b ATTRIBUTE_UNUSED)
570{
9d64df18 571 f->ts.kind = gfc_default_double_kind;
6de9cd9a
DN
572 f->ts.type = BT_REAL;
573
574 f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
575}
576
577
578void
579gfc_resolve_eoshift (gfc_expr * f, gfc_expr * array,
580 gfc_expr * shift,
581 gfc_expr * boundary,
582 gfc_expr * dim)
583{
584 int n;
585
586 f->ts = array->ts;
587 f->rank = array->rank;
94538bd1 588 f->shape = gfc_copy_shape (array->shape, array->rank);
6de9cd9a
DN
589
590 n = 0;
591 if (shift->rank > 0)
592 n = n | 1;
593 if (boundary && boundary->rank > 0)
594 n = n | 2;
595
bf302220
TK
596 /* Convert shift to at least gfc_default_integer_kind, so we don't need
597 kind=1 and kind=2 versions of the library functions. */
598 if (shift->ts.kind < gfc_default_integer_kind)
599 {
600 gfc_typespec ts;
601 ts.type = BT_INTEGER;
602 ts.kind = gfc_default_integer_kind;
603 gfc_convert_type_warn (shift, &ts, 2, 0);
604 }
605
606 if (dim != NULL)
607 {
608 gfc_resolve_dim_arg (dim);
609 /* Convert dim to shift's kind, so we don't need so many variations. */
610 if (dim->ts.kind != shift->ts.kind)
611 gfc_convert_type_warn (dim, &shift->ts, 2, 0);
612 }
6de9cd9a
DN
613
614 f->value.function.name =
7823229b
RS
615 gfc_get_string (PREFIX("eoshift%d_%d%s"), n, shift->ts.kind,
616 array->ts.type == BT_CHARACTER ? "_char" : "");
6de9cd9a
DN
617}
618
619
620void
621gfc_resolve_exp (gfc_expr * f, gfc_expr * x)
622{
6de9cd9a
DN
623 f->ts = x->ts;
624 f->value.function.name =
625 gfc_get_string ("__exp_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
626}
627
628
629void
630gfc_resolve_exponent (gfc_expr * f, gfc_expr * x)
631{
6de9cd9a 632 f->ts.type = BT_INTEGER;
9d64df18 633 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
634
635 f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
636}
637
638
35059811
FXC
639void
640gfc_resolve_fdate (gfc_expr * f)
641{
642 f->ts.type = BT_CHARACTER;
643 f->ts.kind = gfc_default_character_kind;
644 f->value.function.name = gfc_get_string (PREFIX("fdate"));
645}
646
647
6de9cd9a
DN
648void
649gfc_resolve_floor (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
650{
6de9cd9a 651 f->ts.type = BT_INTEGER;
9d64df18 652 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
6de9cd9a
DN
653 : mpz_get_si (kind->value.integer);
654
655 f->value.function.name =
656 gfc_get_string ("__floor%d_%c%d", f->ts.kind,
657 gfc_type_letter (a->ts.type), a->ts.kind);
658}
659
660
df65f093
SK
661void
662gfc_resolve_fnum (gfc_expr * f, gfc_expr * n)
663{
df65f093
SK
664 f->ts.type = BT_INTEGER;
665 f->ts.kind = gfc_default_integer_kind;
666 if (n->ts.kind != f->ts.kind)
667 gfc_convert_type (n, &f->ts, 2);
668 f->value.function.name = gfc_get_string (PREFIX("fnum_i%d"), f->ts.kind);
669}
670
671
6de9cd9a
DN
672void
673gfc_resolve_fraction (gfc_expr * f, gfc_expr * x)
674{
6de9cd9a
DN
675 f->ts = x->ts;
676 f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
677}
678
679
e8525382
SK
680/* Resolve single-argument g77 math intrinsics, eg BESY0, ERF. */
681
682void
683gfc_resolve_g77_math1 (gfc_expr * f, gfc_expr * x)
684{
685 f->ts = x->ts;
686 f->value.function.name = gfc_get_string ("<intrinsic>");
687}
688
689
a8c60d7f 690void
2124d608 691gfc_resolve_getcwd (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
a8c60d7f
SK
692{
693 f->ts.type = BT_INTEGER;
694 f->ts.kind = 4;
695 f->value.function.name = gfc_get_string (PREFIX("getcwd"));
696}
697
698
4c0c6b9f
SK
699void
700gfc_resolve_getgid (gfc_expr * f)
701{
702 f->ts.type = BT_INTEGER;
703 f->ts.kind = 4;
704 f->value.function.name = gfc_get_string (PREFIX("getgid"));
705}
706
707
708void
709gfc_resolve_getpid (gfc_expr * f)
710{
711 f->ts.type = BT_INTEGER;
712 f->ts.kind = 4;
713 f->value.function.name = gfc_get_string (PREFIX("getpid"));
714}
715
716
717void
718gfc_resolve_getuid (gfc_expr * f)
719{
720 f->ts.type = BT_INTEGER;
721 f->ts.kind = 4;
722 f->value.function.name = gfc_get_string (PREFIX("getuid"));
723}
724
f77b6ca3
FXC
725void
726gfc_resolve_hostnm (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
727{
728 f->ts.type = BT_INTEGER;
729 f->ts.kind = 4;
730 f->value.function.name = gfc_get_string (PREFIX ("hostnm"));
731}
732
6de9cd9a 733void
c3d003d2 734gfc_resolve_iand (gfc_expr * f, gfc_expr * i, gfc_expr * j)
6de9cd9a 735{
c3d003d2
SK
736 /* If the kind of i and j are different, then g77 cross-promoted the
737 kinds to the largest value. The Fortran 95 standard requires the
738 kinds to match. */
739 if (i->ts.kind != j->ts.kind)
740 {
741 if (i->ts.kind == gfc_kind_max (i,j))
742 gfc_convert_type(j, &i->ts, 2);
743 else
744 gfc_convert_type(i, &j->ts, 2);
745 }
6de9cd9a
DN
746
747 f->ts = i->ts;
748 f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
749}
750
751
752void
753gfc_resolve_ibclr (gfc_expr * f, gfc_expr * i, gfc_expr * pos ATTRIBUTE_UNUSED)
754{
6de9cd9a
DN
755 f->ts = i->ts;
756 f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
757}
758
759
760void
761gfc_resolve_ibits (gfc_expr * f, gfc_expr * i,
762 gfc_expr * pos ATTRIBUTE_UNUSED,
763 gfc_expr * len ATTRIBUTE_UNUSED)
764{
6de9cd9a
DN
765 f->ts = i->ts;
766 f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
767}
768
769
770void
771gfc_resolve_ibset (gfc_expr * f, gfc_expr * i,
772 gfc_expr * pos ATTRIBUTE_UNUSED)
773{
6de9cd9a
DN
774 f->ts = i->ts;
775 f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
776}
777
778
779void
780gfc_resolve_ichar (gfc_expr * f, gfc_expr * c)
781{
6de9cd9a 782 f->ts.type = BT_INTEGER;
9d64df18 783 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
784
785 f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
786}
787
788
789void
790gfc_resolve_idnint (gfc_expr * f, gfc_expr * a)
791{
792 gfc_resolve_nint (f, a, NULL);
793}
794
795
f77b6ca3
FXC
796void
797gfc_resolve_ierrno (gfc_expr * f)
798{
799 f->ts.type = BT_INTEGER;
800 f->ts.kind = gfc_default_integer_kind;
801 f->value.function.name = gfc_get_string (PREFIX("ierrno_i%d"), f->ts.kind);
802}
803
804
6de9cd9a 805void
c3d003d2 806gfc_resolve_ieor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
6de9cd9a 807{
c3d003d2
SK
808 /* If the kind of i and j are different, then g77 cross-promoted the
809 kinds to the largest value. The Fortran 95 standard requires the
810 kinds to match. */
811 if (i->ts.kind != j->ts.kind)
812 {
813 if (i->ts.kind == gfc_kind_max (i,j))
814 gfc_convert_type(j, &i->ts, 2);
815 else
816 gfc_convert_type(i, &j->ts, 2);
817 }
6de9cd9a
DN
818
819 f->ts = i->ts;
820 f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
821}
822
823
824void
c3d003d2 825gfc_resolve_ior (gfc_expr * f, gfc_expr * i, gfc_expr * j)
6de9cd9a 826{
c3d003d2
SK
827 /* If the kind of i and j are different, then g77 cross-promoted the
828 kinds to the largest value. The Fortran 95 standard requires the
829 kinds to match. */
830 if (i->ts.kind != j->ts.kind)
831 {
832 if (i->ts.kind == gfc_kind_max (i,j))
833 gfc_convert_type(j, &i->ts, 2);
834 else
835 gfc_convert_type(i, &j->ts, 2);
836 }
6de9cd9a
DN
837
838 f->ts = i->ts;
839 f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
840}
841
842
843void
844gfc_resolve_int (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
845{
6de9cd9a 846 f->ts.type = BT_INTEGER;
9d64df18 847 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
6de9cd9a
DN
848 : mpz_get_si (kind->value.integer);
849
850 f->value.function.name =
851 gfc_get_string ("__int_%d_%c%d", f->ts.kind, gfc_type_letter (a->ts.type),
852 a->ts.kind);
853}
854
855
ae8b8789
FXC
856void
857gfc_resolve_isatty (gfc_expr * f, gfc_expr * u)
858{
859 gfc_typespec ts;
860
861 f->ts.type = BT_LOGICAL;
862 f->ts.kind = gfc_default_integer_kind;
863 if (u->ts.kind != gfc_c_int_kind)
864 {
865 ts.type = BT_INTEGER;
866 ts.kind = gfc_c_int_kind;
867 ts.derived = NULL;
868 ts.cl = NULL;
869 gfc_convert_type (u, &ts, 2);
870 }
871
872 f->value.function.name = gfc_get_string (PREFIX("isatty_l%d"), f->ts.kind);
873}
874
875
6de9cd9a
DN
876void
877gfc_resolve_ishft (gfc_expr * f, gfc_expr * i, gfc_expr * shift)
878{
6de9cd9a
DN
879 f->ts = i->ts;
880 f->value.function.name =
881 gfc_get_string ("__ishft_%d_%d", i->ts.kind, shift->ts.kind);
882}
883
884
885void
886gfc_resolve_ishftc (gfc_expr * f, gfc_expr * i, gfc_expr * shift,
887 gfc_expr * size)
888{
889 int s_kind;
890
9d64df18 891 s_kind = (size == NULL) ? gfc_default_integer_kind : shift->ts.kind;
6de9cd9a
DN
892
893 f->ts = i->ts;
894 f->value.function.name =
895 gfc_get_string ("__ishftc_%d_%d_%d", i->ts.kind, shift->ts.kind, s_kind);
896}
897
898
f77b6ca3
FXC
899void
900gfc_resolve_kill (gfc_expr * f, ATTRIBUTE_UNUSED gfc_expr * p,
901 ATTRIBUTE_UNUSED gfc_expr * s)
902{
903 f->ts.type = BT_INTEGER;
904 f->ts.kind = gfc_default_integer_kind;
905
906 f->value.function.name = gfc_get_string (PREFIX("kill_i%d"), f->ts.kind);
907}
908
909
6de9cd9a 910void
94538bd1 911gfc_resolve_lbound (gfc_expr * f, gfc_expr * array,
6de9cd9a
DN
912 gfc_expr * dim)
913{
914 static char lbound[] = "__lbound";
915
916 f->ts.type = BT_INTEGER;
9d64df18 917 f->ts.kind = gfc_default_integer_kind;
6de9cd9a 918
94538bd1
VL
919 if (dim == NULL)
920 {
921 f->rank = 1;
922 f->shape = gfc_get_shape (1);
923 mpz_init_set_ui (f->shape[0], array->rank);
924 }
925
6de9cd9a
DN
926 f->value.function.name = lbound;
927}
928
929
930void
931gfc_resolve_len (gfc_expr * f, gfc_expr * string)
932{
6de9cd9a 933 f->ts.type = BT_INTEGER;
9d64df18 934 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
935 f->value.function.name = gfc_get_string ("__len_%d", string->ts.kind);
936}
937
938
939void
940gfc_resolve_len_trim (gfc_expr * f, gfc_expr * string)
941{
6de9cd9a 942 f->ts.type = BT_INTEGER;
9d64df18 943 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
944 f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
945}
946
947
f77b6ca3
FXC
948void
949gfc_resolve_link (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
950 gfc_expr * p2 ATTRIBUTE_UNUSED)
951{
952 f->ts.type = BT_INTEGER;
953 f->ts.kind = gfc_default_integer_kind;
954 f->value.function.name = gfc_get_string (PREFIX("link_i%d"), f->ts.kind);
955}
956
957
83d890b9
AL
958void
959gfc_resolve_loc (gfc_expr *f, gfc_expr *x)
960{
961 f->ts.type= BT_INTEGER;
962 f->ts.kind = gfc_index_integer_kind;
963 f->value.function.name = gfc_get_string ("__loc_%d", x->ts.kind);
964}
965
966
6de9cd9a
DN
967void
968gfc_resolve_log (gfc_expr * f, gfc_expr * x)
969{
6de9cd9a
DN
970 f->ts = x->ts;
971 f->value.function.name =
972 gfc_get_string ("__log_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
973}
974
975
976void
977gfc_resolve_log10 (gfc_expr * f, gfc_expr * x)
978{
6de9cd9a
DN
979 f->ts = x->ts;
980 f->value.function.name =
981 gfc_get_string ("__log10_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
982}
983
984
985void
986gfc_resolve_logical (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
987{
6de9cd9a 988 f->ts.type = BT_LOGICAL;
9d64df18 989 f->ts.kind = (kind == NULL) ? gfc_default_logical_kind
6de9cd9a
DN
990 : mpz_get_si (kind->value.integer);
991 f->rank = a->rank;
992
993 f->value.function.name =
994 gfc_get_string ("__logical_%d_%c%d", f->ts.kind,
995 gfc_type_letter (a->ts.type), a->ts.kind);
996}
997
998
0d519038
FXC
999void
1000gfc_resolve_malloc (gfc_expr * f, gfc_expr * size)
1001{
1002 if (size->ts.kind < gfc_index_integer_kind)
1003 {
1004 gfc_typespec ts;
1005
1006 ts.type = BT_INTEGER;
1007 ts.kind = gfc_index_integer_kind;
1008 gfc_convert_type_warn (size, &ts, 2, 0);
1009 }
1010
1011 f->ts.type = BT_INTEGER;
1012 f->ts.kind = gfc_index_integer_kind;
1013 f->value.function.name = gfc_get_string (PREFIX("malloc"));
1014}
1015
1016
6de9cd9a
DN
1017void
1018gfc_resolve_matmul (gfc_expr * f, gfc_expr * a, gfc_expr * b)
1019{
1020 gfc_expr temp;
1021
1022 if (a->ts.type == BT_LOGICAL && b->ts.type == BT_LOGICAL)
1023 {
1024 f->ts.type = BT_LOGICAL;
9d64df18 1025 f->ts.kind = gfc_default_logical_kind;
6de9cd9a
DN
1026 }
1027 else
1028 {
1029 temp.expr_type = EXPR_OP;
1030 gfc_clear_ts (&temp.ts);
58b03ab2
TS
1031 temp.value.op.operator = INTRINSIC_NONE;
1032 temp.value.op.op1 = a;
1033 temp.value.op.op2 = b;
6de9cd9a
DN
1034 gfc_type_convert_binary (&temp);
1035 f->ts = temp.ts;
1036 }
1037
1038 f->rank = (a->rank == 2 && b->rank == 2) ? 2 : 1;
1039
1040 f->value.function.name =
7f68c75f 1041 gfc_get_string (PREFIX("matmul_%c%d"), gfc_type_letter (f->ts.type),
6de9cd9a
DN
1042 f->ts.kind);
1043}
1044
1045
1046static void
1047gfc_resolve_minmax (const char * name, gfc_expr * f, gfc_actual_arglist * args)
1048{
1049 gfc_actual_arglist *a;
1050
1051 f->ts.type = args->expr->ts.type;
1052 f->ts.kind = args->expr->ts.kind;
1053 /* Find the largest type kind. */
1054 for (a = args->next; a; a = a->next)
1055 {
1056 if (a->expr->ts.kind > f->ts.kind)
1057 f->ts.kind = a->expr->ts.kind;
1058 }
1059
1060 /* Convert all parameters to the required kind. */
1061 for (a = args; a; a = a->next)
1062 {
1063 if (a->expr->ts.kind != f->ts.kind)
1064 gfc_convert_type (a->expr, &f->ts, 2);
1065 }
1066
1067 f->value.function.name =
1068 gfc_get_string (name, gfc_type_letter (f->ts.type), f->ts.kind);
1069}
1070
1071
1072void
1073gfc_resolve_max (gfc_expr * f, gfc_actual_arglist * args)
1074{
1075 gfc_resolve_minmax ("__max_%c%d", f, args);
1076}
1077
1078
1079void
1080gfc_resolve_maxloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1081 gfc_expr * mask)
1082{
1083 const char *name;
1084
1085 f->ts.type = BT_INTEGER;
9d64df18 1086 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
1087
1088 if (dim == NULL)
1089 f->rank = 1;
1090 else
1091 {
1092 f->rank = array->rank - 1;
bf302220 1093 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1094 }
1095
97a62038
TK
1096 if (mask)
1097 {
1098 if (mask->rank == 0)
1099 name = "smaxloc";
1100 else
1101 name = "mmaxloc";
1102
1103 /* The mask can be kind 4 or 8 for the array case. For the
1104 scalar case, coerce it to default kind unconditionally. */
1105 if ((mask->ts.kind < gfc_default_logical_kind)
1106 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1107 {
1108 gfc_typespec ts;
1109 ts.type = BT_LOGICAL;
1110 ts.kind = gfc_default_logical_kind;
1111 gfc_convert_type_warn (mask, &ts, 2, 0);
1112 }
1113 }
1114 else
1115 name = "maxloc";
1116
6de9cd9a 1117 f->value.function.name =
7f68c75f 1118 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
6de9cd9a
DN
1119 gfc_type_letter (array->ts.type), array->ts.kind);
1120}
1121
1122
1123void
1124gfc_resolve_maxval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1125 gfc_expr * mask)
1126{
97a62038
TK
1127 const char *name;
1128
6de9cd9a
DN
1129 f->ts = array->ts;
1130
1131 if (dim != NULL)
1132 {
1133 f->rank = array->rank - 1;
bf302220 1134 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1135 }
1136
97a62038
TK
1137 if (mask)
1138 {
1139 if (mask->rank == 0)
1140 name = "smaxval";
1141 else
1142 name = "mmaxval";
1143
1144 /* The mask can be kind 4 or 8 for the array case. For the
1145 scalar case, coerce it to default kind unconditionally. */
1146 if ((mask->ts.kind < gfc_default_logical_kind)
1147 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1148 {
1149 gfc_typespec ts;
1150 ts.type = BT_LOGICAL;
1151 ts.kind = gfc_default_logical_kind;
1152 gfc_convert_type_warn (mask, &ts, 2, 0);
1153 }
1154 }
1155 else
1156 name = "maxval";
1157
6de9cd9a 1158 f->value.function.name =
97a62038 1159 gfc_get_string (PREFIX("%s_%c%d"), name,
6de9cd9a
DN
1160 gfc_type_letter (array->ts.type), array->ts.kind);
1161}
1162
1163
1164void
1165gfc_resolve_merge (gfc_expr * f, gfc_expr * tsource,
1166 gfc_expr * fsource ATTRIBUTE_UNUSED,
1167 gfc_expr * mask ATTRIBUTE_UNUSED)
1168{
2853e512
PT
1169 if (tsource->ts.type == BT_CHARACTER)
1170 check_charlen_present (tsource);
1171
6de9cd9a
DN
1172 f->ts = tsource->ts;
1173 f->value.function.name =
1174 gfc_get_string ("__merge_%c%d", gfc_type_letter (tsource->ts.type),
1175 tsource->ts.kind);
1176}
1177
1178
1179void
1180gfc_resolve_min (gfc_expr * f, gfc_actual_arglist * args)
1181{
1182 gfc_resolve_minmax ("__min_%c%d", f, args);
1183}
1184
1185
1186void
1187gfc_resolve_minloc (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1188 gfc_expr * mask)
1189{
1190 const char *name;
1191
1192 f->ts.type = BT_INTEGER;
9d64df18 1193 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
1194
1195 if (dim == NULL)
1196 f->rank = 1;
1197 else
1198 {
1199 f->rank = array->rank - 1;
bf302220 1200 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1201 }
1202
97a62038
TK
1203 if (mask)
1204 {
1205 if (mask->rank == 0)
1206 name = "sminloc";
1207 else
1208 name = "mminloc";
1209
1210 /* The mask can be kind 4 or 8 for the array case. For the
1211 scalar case, coerce it to default kind unconditionally. */
1212 if ((mask->ts.kind < gfc_default_logical_kind)
1213 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1214 {
1215 gfc_typespec ts;
1216 ts.type = BT_LOGICAL;
1217 ts.kind = gfc_default_logical_kind;
1218 gfc_convert_type_warn (mask, &ts, 2, 0);
1219 }
1220 }
1221 else
1222 name = "minloc";
1223
6de9cd9a 1224 f->value.function.name =
7f68c75f 1225 gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
6de9cd9a
DN
1226 gfc_type_letter (array->ts.type), array->ts.kind);
1227}
1228
7551270e 1229
6de9cd9a
DN
1230void
1231gfc_resolve_minval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1232 gfc_expr * mask)
1233{
97a62038
TK
1234 const char *name;
1235
6de9cd9a
DN
1236 f->ts = array->ts;
1237
1238 if (dim != NULL)
1239 {
1240 f->rank = array->rank - 1;
bf302220 1241 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1242 }
1243
97a62038
TK
1244 if (mask)
1245 {
1246 if (mask->rank == 0)
1247 name = "sminval";
1248 else
1249 name = "mminval";
1250
1251 /* The mask can be kind 4 or 8 for the array case. For the
1252 scalar case, coerce it to default kind unconditionally. */
1253 if ((mask->ts.kind < gfc_default_logical_kind)
1254 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1255 {
1256 gfc_typespec ts;
1257 ts.type = BT_LOGICAL;
1258 ts.kind = gfc_default_logical_kind;
1259 gfc_convert_type_warn (mask, &ts, 2, 0);
1260 }
1261 }
1262 else
1263 name = "minval";
1264
6de9cd9a 1265 f->value.function.name =
97a62038 1266 gfc_get_string (PREFIX("%s_%c%d"), name,
6de9cd9a
DN
1267 gfc_type_letter (array->ts.type), array->ts.kind);
1268}
1269
1270
1271void
991bb832 1272gfc_resolve_mod (gfc_expr * f, gfc_expr * a, gfc_expr * p)
6de9cd9a 1273{
991bb832
FXC
1274 f->ts.type = a->ts.type;
1275 if (p != NULL)
1276 f->ts.kind = gfc_kind_max (a,p);
1277 else
1278 f->ts.kind = a->ts.kind;
1279
1280 if (p != NULL && a->ts.kind != p->ts.kind)
1281 {
1282 if (a->ts.kind == gfc_kind_max (a,p))
1283 gfc_convert_type(p, &a->ts, 2);
1284 else
1285 gfc_convert_type(a, &p->ts, 2);
1286 }
1287
6de9cd9a 1288 f->value.function.name =
991bb832 1289 gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
6de9cd9a
DN
1290}
1291
1292
1293void
991bb832 1294gfc_resolve_modulo (gfc_expr * f, gfc_expr * a, gfc_expr * p)
6de9cd9a 1295{
991bb832
FXC
1296 f->ts.type = a->ts.type;
1297 if (p != NULL)
1298 f->ts.kind = gfc_kind_max (a,p);
1299 else
1300 f->ts.kind = a->ts.kind;
1301
1302 if (p != NULL && a->ts.kind != p->ts.kind)
1303 {
1304 if (a->ts.kind == gfc_kind_max (a,p))
1305 gfc_convert_type(p, &a->ts, 2);
1306 else
1307 gfc_convert_type(a, &p->ts, 2);
1308 }
1309
6de9cd9a 1310 f->value.function.name =
991bb832
FXC
1311 gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
1312 f->ts.kind);
6de9cd9a
DN
1313}
1314
8765339d 1315void
7f68c75f 1316gfc_resolve_nearest (gfc_expr * f, gfc_expr * a, gfc_expr *p ATTRIBUTE_UNUSED)
8765339d 1317{
8765339d
TS
1318 f->ts = a->ts;
1319 f->value.function.name =
1320 gfc_get_string ("__nearest_%c%d", gfc_type_letter (a->ts.type),
1321 a->ts.kind);
1322}
6de9cd9a
DN
1323
1324void
1325gfc_resolve_nint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1326{
6de9cd9a 1327 f->ts.type = BT_INTEGER;
9d64df18 1328 f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
6de9cd9a
DN
1329 : mpz_get_si (kind->value.integer);
1330
1331 f->value.function.name =
1332 gfc_get_string ("__nint_%d_%d", f->ts.kind, a->ts.kind);
1333}
1334
1335
1336void
1337gfc_resolve_not (gfc_expr * f, gfc_expr * i)
1338{
6de9cd9a
DN
1339 f->ts = i->ts;
1340 f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1341}
1342
1343
5d723e54
FXC
1344void
1345gfc_resolve_or (gfc_expr * f, gfc_expr * i, gfc_expr * j)
1346{
1347 f->ts.type = i->ts.type;
1348 f->ts.kind = gfc_kind_max (i,j);
1349
1350 if (i->ts.kind != j->ts.kind)
1351 {
1352 if (i->ts.kind == gfc_kind_max (i,j))
1353 gfc_convert_type(j, &i->ts, 2);
1354 else
1355 gfc_convert_type(i, &j->ts, 2);
1356 }
1357
1358 f->value.function.name = gfc_get_string ("__or_%c%d",
1359 gfc_type_letter (i->ts.type),
1360 f->ts.kind);
1361}
1362
1363
6de9cd9a 1364void
7823229b 1365gfc_resolve_pack (gfc_expr * f, gfc_expr * array, gfc_expr * mask,
6de9cd9a
DN
1366 gfc_expr * vector ATTRIBUTE_UNUSED)
1367{
6de9cd9a
DN
1368 f->ts = array->ts;
1369 f->rank = 1;
1370
58c5b409 1371 if (mask->rank != 0)
7823229b
RS
1372 f->value.function.name = (array->ts.type == BT_CHARACTER
1373 ? PREFIX("pack_char")
1374 : PREFIX("pack"));
58c5b409
TS
1375 else
1376 {
1377 /* We convert mask to default logical only in the scalar case.
1378 In the array case we can simply read the array as if it were
1379 of type default logical. */
1380 if (mask->ts.kind != gfc_default_logical_kind)
1381 {
1382 gfc_typespec ts;
1383
1384 ts.type = BT_LOGICAL;
1385 ts.kind = gfc_default_logical_kind;
1386 gfc_convert_type (mask, &ts, 2);
1387 }
1388
7823229b
RS
1389 f->value.function.name = (array->ts.type == BT_CHARACTER
1390 ? PREFIX("pack_s_char")
1391 : PREFIX("pack_s"));
58c5b409 1392 }
6de9cd9a
DN
1393}
1394
1395
1396void
1397gfc_resolve_product (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1398 gfc_expr * mask)
1399{
97a62038
TK
1400 const char *name;
1401
6de9cd9a
DN
1402 f->ts = array->ts;
1403
1404 if (dim != NULL)
1405 {
1406 f->rank = array->rank - 1;
bf302220 1407 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1408 }
1409
97a62038
TK
1410 if (mask)
1411 {
1412 if (mask->rank == 0)
1413 name = "sproduct";
1414 else
1415 name = "mproduct";
1416
1417 /* The mask can be kind 4 or 8 for the array case. For the
1418 scalar case, coerce it to default kind unconditionally. */
1419 if ((mask->ts.kind < gfc_default_logical_kind)
1420 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1421 {
1422 gfc_typespec ts;
1423 ts.type = BT_LOGICAL;
1424 ts.kind = gfc_default_logical_kind;
1425 gfc_convert_type_warn (mask, &ts, 2, 0);
1426 }
1427 }
1428 else
1429 name = "product";
1430
6de9cd9a 1431 f->value.function.name =
97a62038 1432 gfc_get_string (PREFIX("%s_%c%d"), name,
6de9cd9a
DN
1433 gfc_type_letter (array->ts.type), array->ts.kind);
1434}
1435
1436
1437void
1438gfc_resolve_real (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1439{
6de9cd9a
DN
1440 f->ts.type = BT_REAL;
1441
1442 if (kind != NULL)
1443 f->ts.kind = mpz_get_si (kind->value.integer);
1444 else
1445 f->ts.kind = (a->ts.type == BT_COMPLEX) ?
9d64df18 1446 a->ts.kind : gfc_default_real_kind;
6de9cd9a
DN
1447
1448 f->value.function.name =
1449 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1450 gfc_type_letter (a->ts.type), a->ts.kind);
1451}
1452
1453
6970fcc8
SK
1454void
1455gfc_resolve_realpart (gfc_expr * f, gfc_expr * a)
1456{
1457 f->ts.type = BT_REAL;
1458 f->ts.kind = a->ts.kind;
1459 f->value.function.name =
1460 gfc_get_string ("__real_%d_%c%d", f->ts.kind,
1461 gfc_type_letter (a->ts.type), a->ts.kind);
1462}
1463
1464
f77b6ca3
FXC
1465void
1466gfc_resolve_rename (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1467 gfc_expr * p2 ATTRIBUTE_UNUSED)
1468{
1469 f->ts.type = BT_INTEGER;
1470 f->ts.kind = gfc_default_integer_kind;
1471 f->value.function.name = gfc_get_string (PREFIX("rename_i%d"), f->ts.kind);
1472}
1473
1474
6de9cd9a
DN
1475void
1476gfc_resolve_repeat (gfc_expr * f, gfc_expr * string,
7f68c75f 1477 gfc_expr * ncopies ATTRIBUTE_UNUSED)
6de9cd9a 1478{
6de9cd9a
DN
1479 f->ts.type = BT_CHARACTER;
1480 f->ts.kind = string->ts.kind;
1481 f->value.function.name = gfc_get_string ("__repeat_%d", string->ts.kind);
1482}
1483
1484
1485void
1486gfc_resolve_reshape (gfc_expr * f, gfc_expr * source, gfc_expr * shape,
1487 gfc_expr * pad ATTRIBUTE_UNUSED,
1488 gfc_expr * order ATTRIBUTE_UNUSED)
1489{
6de9cd9a
DN
1490 mpz_t rank;
1491 int kind;
1492 int i;
1493
1494 f->ts = source->ts;
1495
1496 gfc_array_size (shape, &rank);
1497 f->rank = mpz_get_si (rank);
1498 mpz_clear (rank);
1499 switch (source->ts.type)
1500 {
1501 case BT_COMPLEX:
1502 kind = source->ts.kind * 2;
1503 break;
1504
1505 case BT_REAL:
1506 case BT_INTEGER:
1507 case BT_LOGICAL:
1508 kind = source->ts.kind;
1509 break;
1510
1511 default:
1512 kind = 0;
1513 break;
1514 }
1515
1516 switch (kind)
1517 {
1518 case 4:
1519 case 8:
644cb69f
FXC
1520 case 10:
1521 case 16:
8f4dc7af
TK
1522 if (source->ts.type == BT_COMPLEX)
1523 f->value.function.name =
1524 gfc_get_string (PREFIX("reshape_%c%d"),
1525 gfc_type_letter (BT_COMPLEX), source->ts.kind);
1526 else
1527 f->value.function.name =
1528 gfc_get_string (PREFIX("reshape_%d"), source->ts.kind);
1529
6de9cd9a
DN
1530 break;
1531
1532 default:
7823229b
RS
1533 f->value.function.name = (source->ts.type == BT_CHARACTER
1534 ? PREFIX("reshape_char")
1535 : PREFIX("reshape"));
6de9cd9a
DN
1536 break;
1537 }
1538
1539 /* TODO: Make this work with a constant ORDER parameter. */
1540 if (shape->expr_type == EXPR_ARRAY
1541 && gfc_is_constant_expr (shape)
1542 && order == NULL)
1543 {
1544 gfc_constructor *c;
1545 f->shape = gfc_get_shape (f->rank);
1546 c = shape->value.constructor;
1547 for (i = 0; i < f->rank; i++)
1548 {
1549 mpz_init_set (f->shape[i], c->expr->value.integer);
1550 c = c->next;
1551 }
1552 }
323c74da
RH
1553
1554 /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1555 so many runtime variations. */
1556 if (shape->ts.kind != gfc_index_integer_kind)
1557 {
1558 gfc_typespec ts = shape->ts;
1559 ts.kind = gfc_index_integer_kind;
1560 gfc_convert_type_warn (shape, &ts, 2, 0);
1561 }
1562 if (order && order->ts.kind != gfc_index_integer_kind)
1563 gfc_convert_type_warn (order, &shape->ts, 2, 0);
6de9cd9a
DN
1564}
1565
1566
1567void
1568gfc_resolve_rrspacing (gfc_expr * f, gfc_expr * x)
1569{
6de9cd9a
DN
1570 f->ts = x->ts;
1571 f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1572}
1573
1574
1575void
49e4d580 1576gfc_resolve_scale (gfc_expr * f, gfc_expr * x, gfc_expr * i)
6de9cd9a 1577{
6de9cd9a 1578 f->ts = x->ts;
49e4d580
TS
1579
1580 /* The implementation calls scalbn which takes an int as the
1581 second argument. */
1582 if (i->ts.kind != gfc_c_int_kind)
1583 {
1584 gfc_typespec ts;
1585
1586 ts.type = BT_INTEGER;
1587 ts.kind = gfc_default_integer_kind;
1588
1589 gfc_convert_type_warn (i, &ts, 2, 0);
1590 }
1591
1592 f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
6de9cd9a
DN
1593}
1594
1595
1596void
1597gfc_resolve_scan (gfc_expr * f, gfc_expr * string,
1598 gfc_expr * set ATTRIBUTE_UNUSED,
1599 gfc_expr * back ATTRIBUTE_UNUSED)
1600{
6de9cd9a 1601 f->ts.type = BT_INTEGER;
9d64df18 1602 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
1603 f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1604}
1605
1606
53096259
PT
1607void
1608gfc_resolve_secnds (gfc_expr * t1, gfc_expr * t0)
1609{
1610 t1->ts = t0->ts;
1611 t1->value.function.name =
1612 gfc_get_string (PREFIX("secnds"));
1613}
1614
1615
6de9cd9a
DN
1616void
1617gfc_resolve_set_exponent (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1618{
6de9cd9a 1619 f->ts = x->ts;
49e4d580
TS
1620
1621 /* The library implementation uses GFC_INTEGER_4 unconditionally,
43a5ef69 1622 convert type so we don't have to implement all possible
49e4d580
TS
1623 permutations. */
1624 if (i->ts.kind != 4)
1625 {
1626 gfc_typespec ts;
1627
1628 ts.type = BT_INTEGER;
1629 ts.kind = gfc_default_integer_kind;
1630
1631 gfc_convert_type_warn (i, &ts, 2, 0);
1632 }
1633
1634 f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
6de9cd9a
DN
1635}
1636
1637
1638void
1639gfc_resolve_shape (gfc_expr * f, gfc_expr * array)
1640{
6de9cd9a 1641 f->ts.type = BT_INTEGER;
9d64df18 1642 f->ts.kind = gfc_default_integer_kind;
6de9cd9a 1643 f->rank = 1;
7f68c75f 1644 f->value.function.name = gfc_get_string (PREFIX("shape_%d"), f->ts.kind);
6de9cd9a
DN
1645 f->shape = gfc_get_shape (1);
1646 mpz_init_set_ui (f->shape[0], array->rank);
1647}
1648
1649
1650void
1651gfc_resolve_sign (gfc_expr * f, gfc_expr * a, gfc_expr * b ATTRIBUTE_UNUSED)
1652{
6de9cd9a
DN
1653 f->ts = a->ts;
1654 f->value.function.name =
1655 gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1656}
1657
1658
185d7d97
FXC
1659void
1660gfc_resolve_signal (gfc_expr * f, gfc_expr *number, gfc_expr *handler)
1661{
1662 f->ts.type = BT_INTEGER;
1663 f->ts.kind = gfc_c_int_kind;
1664
1665 /* handler can be either BT_INTEGER or BT_PROCEDURE */
1666 if (handler->ts.type == BT_INTEGER)
1667 {
1668 if (handler->ts.kind != gfc_c_int_kind)
1669 gfc_convert_type (handler, &f->ts, 2);
1670 f->value.function.name = gfc_get_string (PREFIX("signal_func_int"));
1671 }
1672 else
1673 f->value.function.name = gfc_get_string (PREFIX("signal_func"));
1674
1675 if (number->ts.kind != gfc_c_int_kind)
1676 gfc_convert_type (number, &f->ts, 2);
1677}
1678
1679
6de9cd9a
DN
1680void
1681gfc_resolve_sin (gfc_expr * f, gfc_expr * x)
1682{
6de9cd9a
DN
1683 f->ts = x->ts;
1684 f->value.function.name =
1685 gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1686}
1687
1688
1689void
1690gfc_resolve_sinh (gfc_expr * f, gfc_expr * x)
1691{
6de9cd9a
DN
1692 f->ts = x->ts;
1693 f->value.function.name =
1694 gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1695}
1696
1697
1698void
1699gfc_resolve_spacing (gfc_expr * f, gfc_expr * x)
1700{
6de9cd9a
DN
1701 f->ts = x->ts;
1702 f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1703}
1704
1705
1706void
1707gfc_resolve_spread (gfc_expr * f, gfc_expr * source,
1708 gfc_expr * dim,
1709 gfc_expr * ncopies)
1710{
2853e512
PT
1711 if (source->ts.type == BT_CHARACTER)
1712 check_charlen_present (source);
1713
6de9cd9a
DN
1714 f->ts = source->ts;
1715 f->rank = source->rank + 1;
2853e512
PT
1716 if (source->rank == 0)
1717 f->value.function.name = (source->ts.type == BT_CHARACTER
1718 ? PREFIX("spread_char_scalar")
1719 : PREFIX("spread_scalar"));
1720 else
1721 f->value.function.name = (source->ts.type == BT_CHARACTER
1722 ? PREFIX("spread_char")
1723 : PREFIX("spread"));
6de9cd9a 1724
bf302220 1725 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1726 gfc_resolve_index (ncopies, 1);
1727}
1728
1729
1730void
1731gfc_resolve_sqrt (gfc_expr * f, gfc_expr * x)
1732{
6de9cd9a
DN
1733 f->ts = x->ts;
1734 f->value.function.name =
1735 gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1736}
1737
1738
df65f093
SK
1739/* Resolve the g77 compatibility function STAT AND FSTAT. */
1740
1741void
1742gfc_resolve_stat (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED,
1743 gfc_expr * a ATTRIBUTE_UNUSED)
1744{
df65f093
SK
1745 f->ts.type = BT_INTEGER;
1746 f->ts.kind = gfc_default_integer_kind;
1747 f->value.function.name = gfc_get_string (PREFIX("stat_i%d"), f->ts.kind);
1748}
1749
1750
1751void
1752gfc_resolve_fstat (gfc_expr * f, gfc_expr * n, gfc_expr * a ATTRIBUTE_UNUSED)
1753{
df65f093
SK
1754 f->ts.type = BT_INTEGER;
1755 f->ts.kind = gfc_default_integer_kind;
1756 if (n->ts.kind != f->ts.kind)
1757 gfc_convert_type (n, &f->ts, 2);
1758
1759 f->value.function.name = gfc_get_string (PREFIX("fstat_i%d"), f->ts.kind);
1760}
1761
1762
5d723e54
FXC
1763void
1764gfc_resolve_fgetc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1765{
1766 gfc_typespec ts;
1767
1768 f->ts.type = BT_INTEGER;
1769 f->ts.kind = gfc_c_int_kind;
1770 if (u->ts.kind != gfc_c_int_kind)
1771 {
1772 ts.type = BT_INTEGER;
1773 ts.kind = gfc_c_int_kind;
1774 ts.derived = NULL;
1775 ts.cl = NULL;
1776 gfc_convert_type (u, &ts, 2);
1777 }
1778
1779 f->value.function.name = gfc_get_string (PREFIX("fgetc"));
1780}
1781
1782
1783void
1784gfc_resolve_fget (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1785{
1786 f->ts.type = BT_INTEGER;
1787 f->ts.kind = gfc_c_int_kind;
1788 f->value.function.name = gfc_get_string (PREFIX("fget"));
1789}
1790
1791
1792void
1793gfc_resolve_fputc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1794{
1795 gfc_typespec ts;
1796
1797 f->ts.type = BT_INTEGER;
1798 f->ts.kind = gfc_c_int_kind;
1799 if (u->ts.kind != gfc_c_int_kind)
1800 {
1801 ts.type = BT_INTEGER;
1802 ts.kind = gfc_c_int_kind;
1803 ts.derived = NULL;
1804 ts.cl = NULL;
1805 gfc_convert_type (u, &ts, 2);
1806 }
1807
1808 f->value.function.name = gfc_get_string (PREFIX("fputc"));
1809}
1810
1811
1812void
1813gfc_resolve_fput (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1814{
1815 f->ts.type = BT_INTEGER;
1816 f->ts.kind = gfc_c_int_kind;
1817 f->value.function.name = gfc_get_string (PREFIX("fput"));
1818}
1819
1820
1821void
1822gfc_resolve_ftell (gfc_expr * f, gfc_expr * u)
1823{
1824 gfc_typespec ts;
1825
1826 f->ts.type = BT_INTEGER;
1827 f->ts.kind = gfc_index_integer_kind;
1828 if (u->ts.kind != gfc_c_int_kind)
1829 {
1830 ts.type = BT_INTEGER;
1831 ts.kind = gfc_c_int_kind;
1832 ts.derived = NULL;
1833 ts.cl = NULL;
1834 gfc_convert_type (u, &ts, 2);
1835 }
1836
1837 f->value.function.name = gfc_get_string (PREFIX("ftell"));
1838}
1839
1840
6de9cd9a
DN
1841void
1842gfc_resolve_sum (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1843 gfc_expr * mask)
1844{
97a62038
TK
1845 const char *name;
1846
6de9cd9a
DN
1847 f->ts = array->ts;
1848
97a62038
TK
1849 if (mask)
1850 {
1851 if (mask->rank == 0)
1852 name = "ssum";
1853 else
1854 name = "msum";
1855
1856 /* The mask can be kind 4 or 8 for the array case. For the
1857 scalar case, coerce it to default kind unconditionally. */
1858 if ((mask->ts.kind < gfc_default_logical_kind)
1859 || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1860 {
1861 gfc_typespec ts;
1862 ts.type = BT_LOGICAL;
1863 ts.kind = gfc_default_logical_kind;
1864 gfc_convert_type_warn (mask, &ts, 2, 0);
1865 }
1866 }
1867 else
1868 name = "sum";
1869
6de9cd9a
DN
1870 if (dim != NULL)
1871 {
1872 f->rank = array->rank - 1;
bf302220 1873 gfc_resolve_dim_arg (dim);
6de9cd9a
DN
1874 }
1875
1876 f->value.function.name =
97a62038 1877 gfc_get_string (PREFIX("%s_%c%d"), name,
6de9cd9a
DN
1878 gfc_type_letter (array->ts.type), array->ts.kind);
1879}
1880
1881
f77b6ca3
FXC
1882void
1883gfc_resolve_symlnk (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1884 gfc_expr * p2 ATTRIBUTE_UNUSED)
1885{
1886 f->ts.type = BT_INTEGER;
1887 f->ts.kind = gfc_default_integer_kind;
1888 f->value.function.name = gfc_get_string (PREFIX("symlnk_i%d"), f->ts.kind);
1889}
1890
1891
5b1374e9
TS
1892/* Resolve the g77 compatibility function SYSTEM. */
1893
1894void
1895gfc_resolve_system (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1896{
1897 f->ts.type = BT_INTEGER;
1898 f->ts.kind = 4;
1899 f->value.function.name = gfc_get_string (PREFIX("system"));
1900}
1901
1902
6de9cd9a
DN
1903void
1904gfc_resolve_tan (gfc_expr * f, gfc_expr * x)
1905{
6de9cd9a
DN
1906 f->ts = x->ts;
1907 f->value.function.name =
1908 gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1909}
1910
1911
1912void
1913gfc_resolve_tanh (gfc_expr * f, gfc_expr * x)
1914{
6de9cd9a
DN
1915 f->ts = x->ts;
1916 f->value.function.name =
1917 gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1918}
1919
1920
f77b6ca3
FXC
1921void
1922gfc_resolve_time (gfc_expr * f)
1923{
1924 f->ts.type = BT_INTEGER;
1925 f->ts.kind = 4;
1926 f->value.function.name = gfc_get_string (PREFIX("time_func"));
1927}
1928
1929
1930void
1931gfc_resolve_time8 (gfc_expr * f)
1932{
1933 f->ts.type = BT_INTEGER;
1934 f->ts.kind = 8;
1935 f->value.function.name = gfc_get_string (PREFIX("time8_func"));
1936}
1937
1938
6de9cd9a
DN
1939void
1940gfc_resolve_transfer (gfc_expr * f, gfc_expr * source ATTRIBUTE_UNUSED,
1941 gfc_expr * mold, gfc_expr * size)
1942{
1943 /* TODO: Make this do something meaningful. */
1944 static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
1945
1946 f->ts = mold->ts;
1947
1948 if (size == NULL && mold->rank == 0)
1949 {
1950 f->rank = 0;
1951 f->value.function.name = transfer0;
1952 }
1953 else
1954 {
1955 f->rank = 1;
1956 f->value.function.name = transfer1;
1957 }
1958}
1959
1960
1961void
1962gfc_resolve_transpose (gfc_expr * f, gfc_expr * matrix)
1963{
6de9cd9a
DN
1964 int kind;
1965
1966 f->ts = matrix->ts;
1967 f->rank = 2;
94538bd1
VL
1968 if (matrix->shape)
1969 {
1970 f->shape = gfc_get_shape (2);
1971 mpz_init_set (f->shape[0], matrix->shape[1]);
1972 mpz_init_set (f->shape[1], matrix->shape[0]);
1973 }
6de9cd9a 1974
58757957 1975 kind = matrix->ts.kind;
6de9cd9a
DN
1976
1977 switch (kind)
1978 {
1979 case 4:
1980 case 8:
644cb69f
FXC
1981 case 10:
1982 case 16:
58757957
JM
1983 switch (matrix->ts.type)
1984 {
1985 case BT_COMPLEX:
1986 f->value.function.name =
1987 gfc_get_string (PREFIX("transpose_c%d"), kind);
1988 break;
1989
1990 case BT_INTEGER:
1991 case BT_REAL:
1992 case BT_LOGICAL:
1993 /* Use the integer routines for real and logical cases. This
1994 assumes they all have the same alignment requirements. */
1995 f->value.function.name =
1996 gfc_get_string (PREFIX("transpose_i%d"), kind);
1997 break;
1998
1999 default:
2000 f->value.function.name = PREFIX("transpose");
2001 break;
2002 }
6de9cd9a
DN
2003 break;
2004
2005 default:
7823229b
RS
2006 f->value.function.name = (matrix->ts.type == BT_CHARACTER
2007 ? PREFIX("transpose_char")
2008 : PREFIX("transpose"));
2009 break;
6de9cd9a
DN
2010 }
2011}
2012
2013
2014void
2015gfc_resolve_trim (gfc_expr * f, gfc_expr * string)
2016{
6de9cd9a
DN
2017 f->ts.type = BT_CHARACTER;
2018 f->ts.kind = string->ts.kind;
2019 f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
2020}
2021
2022
2023void
94538bd1 2024gfc_resolve_ubound (gfc_expr * f, gfc_expr * array,
6de9cd9a
DN
2025 gfc_expr * dim)
2026{
2027 static char ubound[] = "__ubound";
2028
2029 f->ts.type = BT_INTEGER;
9d64df18 2030 f->ts.kind = gfc_default_integer_kind;
6de9cd9a 2031
94538bd1
VL
2032 if (dim == NULL)
2033 {
2034 f->rank = 1;
2035 f->shape = gfc_get_shape (1);
2036 mpz_init_set_ui (f->shape[0], array->rank);
2037 }
2038
6de9cd9a
DN
2039 f->value.function.name = ubound;
2040}
2041
2042
d8fe26b2
SK
2043/* Resolve the g77 compatibility function UMASK. */
2044
2045void
2046gfc_resolve_umask (gfc_expr * f, gfc_expr * n)
2047{
d8fe26b2
SK
2048 f->ts.type = BT_INTEGER;
2049 f->ts.kind = n->ts.kind;
2050 f->value.function.name = gfc_get_string (PREFIX("umask_i%d"), n->ts.kind);
2051}
2052
2053
2054/* Resolve the g77 compatibility function UNLINK. */
2055
2056void
2057gfc_resolve_unlink (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
2058{
d8fe26b2
SK
2059 f->ts.type = BT_INTEGER;
2060 f->ts.kind = 4;
2061 f->value.function.name = gfc_get_string (PREFIX("unlink"));
2062}
2063
25fc05eb
FXC
2064
2065void
2066gfc_resolve_ttynam (gfc_expr * f, gfc_expr * unit)
2067{
2068 gfc_typespec ts;
2069
2070 f->ts.type = BT_CHARACTER;
2071 f->ts.kind = gfc_default_character_kind;
2072
2073 if (unit->ts.kind != gfc_c_int_kind)
2074 {
2075 ts.type = BT_INTEGER;
2076 ts.kind = gfc_c_int_kind;
2077 ts.derived = NULL;
2078 ts.cl = NULL;
2079 gfc_convert_type (unit, &ts, 2);
2080 }
2081
2082 f->value.function.name = gfc_get_string (PREFIX("ttynam"));
2083}
2084
2085
6de9cd9a
DN
2086void
2087gfc_resolve_unpack (gfc_expr * f, gfc_expr * vector, gfc_expr * mask,
2088 gfc_expr * field ATTRIBUTE_UNUSED)
2089{
7823229b 2090 f->ts = vector->ts;
6de9cd9a
DN
2091 f->rank = mask->rank;
2092
2093 f->value.function.name =
7823229b
RS
2094 gfc_get_string (PREFIX("unpack%d%s"), field->rank > 0 ? 1 : 0,
2095 vector->ts.type == BT_CHARACTER ? "_char" : "");
6de9cd9a
DN
2096}
2097
2098
2099void
2100gfc_resolve_verify (gfc_expr * f, gfc_expr * string,
2101 gfc_expr * set ATTRIBUTE_UNUSED,
2102 gfc_expr * back ATTRIBUTE_UNUSED)
2103{
6de9cd9a 2104 f->ts.type = BT_INTEGER;
9d64df18 2105 f->ts.kind = gfc_default_integer_kind;
6de9cd9a
DN
2106 f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
2107}
2108
2109
5d723e54
FXC
2110void
2111gfc_resolve_xor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
2112{
2113 f->ts.type = i->ts.type;
2114 f->ts.kind = gfc_kind_max (i,j);
2115
2116 if (i->ts.kind != j->ts.kind)
2117 {
2118 if (i->ts.kind == gfc_kind_max (i,j))
2119 gfc_convert_type(j, &i->ts, 2);
2120 else
2121 gfc_convert_type(i, &j->ts, 2);
2122 }
2123
2124 f->value.function.name = gfc_get_string ("__xor_%c%d",
2125 gfc_type_letter (i->ts.type),
2126 f->ts.kind);
2127}
2128
2129
6de9cd9a
DN
2130/* Intrinsic subroutine resolution. */
2131
185d7d97
FXC
2132void
2133gfc_resolve_alarm_sub (gfc_code * c)
2134{
2135 const char *name;
2136 gfc_expr *seconds, *handler, *status;
2137 gfc_typespec ts;
2138
2139 seconds = c->ext.actual->expr;
2140 handler = c->ext.actual->next->expr;
2141 status = c->ext.actual->next->next->expr;
2142 ts.type = BT_INTEGER;
2143 ts.kind = gfc_c_int_kind;
2144
2145 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2146 if (handler->ts.type == BT_INTEGER)
2147 {
2148 if (handler->ts.kind != gfc_c_int_kind)
2149 gfc_convert_type (handler, &ts, 2);
2150 name = gfc_get_string (PREFIX("alarm_sub_int"));
2151 }
2152 else
2153 name = gfc_get_string (PREFIX("alarm_sub"));
2154
2155 if (seconds->ts.kind != gfc_c_int_kind)
2156 gfc_convert_type (seconds, &ts, 2);
2157 if (status != NULL && status->ts.kind != gfc_c_int_kind)
2158 gfc_convert_type (status, &ts, 2);
2159
2160 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2161}
2162
6de9cd9a
DN
2163void
2164gfc_resolve_cpu_time (gfc_code * c ATTRIBUTE_UNUSED)
2165{
2166 const char *name;
2167
2168 name = gfc_get_string (PREFIX("cpu_time_%d"),
2169 c->ext.actual->expr->ts.kind);
2170 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2171}
2172
2173
ee569894
TS
2174void
2175gfc_resolve_mvbits (gfc_code * c)
2176{
2177 const char *name;
2178 int kind;
2179
2180 kind = c->ext.actual->expr->ts.kind;
2181 name = gfc_get_string (PREFIX("mvbits_i%d"), kind);
2182
2183 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2184}
2185
2186
6de9cd9a
DN
2187void
2188gfc_resolve_random_number (gfc_code * c ATTRIBUTE_UNUSED)
2189{
2190 const char *name;
2191 int kind;
2192
2193 kind = c->ext.actual->expr->ts.kind;
5f251c26
SK
2194 if (c->ext.actual->expr->rank == 0)
2195 name = gfc_get_string (PREFIX("random_r%d"), kind);
2196 else
2197 name = gfc_get_string (PREFIX("arandom_r%d"), kind);
2198
6de9cd9a 2199 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2bd74949
SK
2200}
2201
2202
f77b6ca3
FXC
2203void
2204gfc_resolve_rename_sub (gfc_code * c)
2205{
2206 const char *name;
2207 int kind;
2208
2209 if (c->ext.actual->next->next->expr != NULL)
2210 kind = c->ext.actual->next->next->expr->ts.kind;
2211 else
2212 kind = gfc_default_integer_kind;
2213
2214 name = gfc_get_string (PREFIX("rename_i%d_sub"), kind);
2215 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2216}
2217
2218
2219void
2220gfc_resolve_kill_sub (gfc_code * c)
2221{
2222 const char *name;
2223 int kind;
2224
2225 if (c->ext.actual->next->next->expr != NULL)
2226 kind = c->ext.actual->next->next->expr->ts.kind;
2227 else
2228 kind = gfc_default_integer_kind;
2229
2230 name = gfc_get_string (PREFIX("kill_i%d_sub"), kind);
2231 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2232}
2233
2234
2235void
2236gfc_resolve_link_sub (gfc_code * c)
2237{
2238 const char *name;
2239 int kind;
2240
2241 if (c->ext.actual->next->next->expr != NULL)
2242 kind = c->ext.actual->next->next->expr->ts.kind;
2243 else
2244 kind = gfc_default_integer_kind;
2245
2246 name = gfc_get_string (PREFIX("link_i%d_sub"), kind);
2247 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2248}
2249
2250
2251void
2252gfc_resolve_symlnk_sub (gfc_code * c)
2253{
2254 const char *name;
2255 int kind;
2256
2257 if (c->ext.actual->next->next->expr != NULL)
2258 kind = c->ext.actual->next->next->expr->ts.kind;
2259 else
2260 kind = gfc_default_integer_kind;
2261
2262 name = gfc_get_string (PREFIX("symlnk_i%d_sub"), kind);
2263 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2264}
2265
2266
2bd74949
SK
2267/* G77 compatibility subroutines etime() and dtime(). */
2268
2269void
2270gfc_resolve_etime_sub (gfc_code * c)
2271{
2272 const char *name;
2273
2274 name = gfc_get_string (PREFIX("etime_sub"));
2275 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2276}
2277
2278
2279/* G77 compatibility subroutine second(). */
2280
2281void
2282gfc_resolve_second_sub (gfc_code * c)
2283{
2284 const char *name;
2285
2286 name = gfc_get_string (PREFIX("second_sub"));
2287 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2288}
2289
2290
f77b6ca3
FXC
2291void
2292gfc_resolve_sleep_sub (gfc_code * c)
2293{
2294 const char *name;
2295 int kind;
2296
2297 if (c->ext.actual->expr != NULL)
2298 kind = c->ext.actual->expr->ts.kind;
2299 else
2300 kind = gfc_default_integer_kind;
2301
2302 name = gfc_get_string (PREFIX("sleep_i%d_sub"), kind);
2303 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2304}
2305
2306
2bd74949
SK
2307/* G77 compatibility function srand(). */
2308
2309void
2310gfc_resolve_srand (gfc_code * c)
2311{
2312 const char *name;
2313 name = gfc_get_string (PREFIX("srand"));
2314 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
6de9cd9a
DN
2315}
2316
5f251c26 2317
b41b2534
JB
2318/* Resolve the getarg intrinsic subroutine. */
2319
2320void
2321gfc_resolve_getarg (gfc_code * c)
2322{
2323 const char *name;
2324 int kind;
2325
9d64df18 2326 kind = gfc_default_integer_kind;
b41b2534
JB
2327 name = gfc_get_string (PREFIX("getarg_i%d"), kind);
2328 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2329}
2330
a8c60d7f
SK
2331/* Resolve the getcwd intrinsic subroutine. */
2332
2333void
2334gfc_resolve_getcwd_sub (gfc_code * c)
2335{
2336 const char *name;
2337 int kind;
2338
2339 if (c->ext.actual->next->expr != NULL)
2340 kind = c->ext.actual->next->expr->ts.kind;
2341 else
2342 kind = gfc_default_integer_kind;
2343
2344 name = gfc_get_string (PREFIX("getcwd_i%d_sub"), kind);
2345 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2346}
2347
b41b2534
JB
2348
2349/* Resolve the get_command intrinsic subroutine. */
2350
2351void
2352gfc_resolve_get_command (gfc_code * c)
2353{
2354 const char *name;
2355 int kind;
2356
9d64df18 2357 kind = gfc_default_integer_kind;
b41b2534
JB
2358 name = gfc_get_string (PREFIX("get_command_i%d"), kind);
2359 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2360}
2361
2362
2363/* Resolve the get_command_argument intrinsic subroutine. */
2364
2365void
2366gfc_resolve_get_command_argument (gfc_code * c)
2367{
2368 const char *name;
2369 int kind;
2370
9d64df18 2371 kind = gfc_default_integer_kind;
b41b2534
JB
2372 name = gfc_get_string (PREFIX("get_command_argument_i%d"), kind);
2373 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2374}
2375
f7b529fa 2376/* Resolve the get_environment_variable intrinsic subroutine. */
aa6fc635
JB
2377
2378void
2379gfc_resolve_get_environment_variable (gfc_code * code)
2380{
2381 const char *name;
2382 int kind;
2383
9d64df18 2384 kind = gfc_default_integer_kind;
aa6fc635
JB
2385 name = gfc_get_string (PREFIX("get_environment_variable_i%d"), kind);
2386 code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2387}
2388
185d7d97
FXC
2389void
2390gfc_resolve_signal_sub (gfc_code * c)
2391{
2392 const char *name;
2393 gfc_expr *number, *handler, *status;
2394 gfc_typespec ts;
2395
2396 number = c->ext.actual->expr;
2397 handler = c->ext.actual->next->expr;
2398 status = c->ext.actual->next->next->expr;
2399 ts.type = BT_INTEGER;
2400 ts.kind = gfc_c_int_kind;
2401
2402 /* handler can be either BT_INTEGER or BT_PROCEDURE */
2403 if (handler->ts.type == BT_INTEGER)
2404 {
2405 if (handler->ts.kind != gfc_c_int_kind)
2406 gfc_convert_type (handler, &ts, 2);
2407 name = gfc_get_string (PREFIX("signal_sub_int"));
2408 }
2409 else
2410 name = gfc_get_string (PREFIX("signal_sub"));
2411
2412 if (number->ts.kind != gfc_c_int_kind)
2413 gfc_convert_type (number, &ts, 2);
2414 if (status != NULL && status->ts.kind != gfc_c_int_kind)
2415 gfc_convert_type (status, &ts, 2);
2416
2417 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2418}
2419
5b1374e9
TS
2420/* Resolve the SYSTEM intrinsic subroutine. */
2421
2422void
2423gfc_resolve_system_sub (gfc_code * c)
2424{
2425 const char *name;
2426
2427 name = gfc_get_string (PREFIX("system_sub"));
2428 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2429}
b41b2534 2430
21fdfcc1
SK
2431/* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2432
2433void
2434gfc_resolve_system_clock (gfc_code * c)
2435{
2436 const char *name;
2437 int kind;
2438
2439 if (c->ext.actual->expr != NULL)
2440 kind = c->ext.actual->expr->ts.kind;
2441 else if (c->ext.actual->next->expr != NULL)
2442 kind = c->ext.actual->next->expr->ts.kind;
2443 else if (c->ext.actual->next->next->expr != NULL)
2444 kind = c->ext.actual->next->next->expr->ts.kind;
2445 else
9d64df18 2446 kind = gfc_default_integer_kind;
21fdfcc1
SK
2447
2448 name = gfc_get_string (PREFIX("system_clock_%d"), kind);
2449 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2450}
2451
d8fe26b2
SK
2452/* Resolve the EXIT intrinsic subroutine. */
2453
2454void
2455gfc_resolve_exit (gfc_code * c)
2456{
2457 const char *name;
2458 int kind;
2459
2460 if (c->ext.actual->expr != NULL)
2461 kind = c->ext.actual->expr->ts.kind;
2462 else
2463 kind = gfc_default_integer_kind;
2464
2465 name = gfc_get_string (PREFIX("exit_i%d"), kind);
2466 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2467}
2468
df65f093
SK
2469/* Resolve the FLUSH intrinsic subroutine. */
2470
2471void
2472gfc_resolve_flush (gfc_code * c)
2473{
2474 const char *name;
2475 gfc_typespec ts;
2476 gfc_expr *n;
2477
2478 ts.type = BT_INTEGER;
2479 ts.kind = gfc_default_integer_kind;
2480 n = c->ext.actual->expr;
2481 if (n != NULL
2482 && n->ts.kind != ts.kind)
2483 gfc_convert_type (n, &ts, 2);
2484
2485 name = gfc_get_string (PREFIX("flush_i%d"), ts.kind);
2486 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2487}
2488
f77b6ca3 2489
0d519038
FXC
2490void
2491gfc_resolve_free (gfc_code * c)
2492{
2493 gfc_typespec ts;
2494 gfc_expr *n;
2495
2496 ts.type = BT_INTEGER;
2497 ts.kind = gfc_index_integer_kind;
2498 n = c->ext.actual->expr;
2499 if (n->ts.kind != ts.kind)
2500 gfc_convert_type (n, &ts, 2);
2501
2502 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("free"));
2503}
2504
2505
35059811
FXC
2506void
2507gfc_resolve_ctime_sub (gfc_code * c)
2508{
2509 gfc_typespec ts;
2510
2511 /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2512 if (c->ext.actual->expr->ts.kind != 8)
2513 {
2514 ts.type = BT_INTEGER;
2515 ts.kind = 8;
2516 ts.derived = NULL;
2517 ts.cl = NULL;
2518 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2519 }
2520
2521 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ctime_sub"));
2522}
2523
2524
2525void
2526gfc_resolve_fdate_sub (gfc_code * c)
2527{
2528 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2529}
2530
2531
f77b6ca3
FXC
2532void
2533gfc_resolve_gerror (gfc_code * c)
2534{
2535 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2536}
2537
2538
2539void
2540gfc_resolve_getlog (gfc_code * c)
2541{
2542 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2543}
2544
2545
2546void
2547gfc_resolve_hostnm_sub (gfc_code * c)
2548{
2549 const char *name;
2550 int kind;
2551
2552 if (c->ext.actual->next->expr != NULL)
2553 kind = c->ext.actual->next->expr->ts.kind;
2554 else
2555 kind = gfc_default_integer_kind;
2556
2557 name = gfc_get_string (PREFIX("hostnm_i%d_sub"), kind);
2558 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2559}
2560
2561
2562void
2563gfc_resolve_perror (gfc_code * c)
2564{
2565 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2566}
2567
df65f093
SK
2568/* Resolve the STAT and FSTAT intrinsic subroutines. */
2569
2570void
2571gfc_resolve_stat_sub (gfc_code * c)
2572{
2573 const char *name;
2574
2575 name = gfc_get_string (PREFIX("stat_i%d_sub"), gfc_default_integer_kind);
2576 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2577}
2578
2579
2580void
2581gfc_resolve_fstat_sub (gfc_code * c)
2582{
2583 const char *name;
2584 gfc_expr *u;
2585 gfc_typespec *ts;
2586
2587 u = c->ext.actual->expr;
2588 ts = &c->ext.actual->next->expr->ts;
2589 if (u->ts.kind != ts->kind)
2590 gfc_convert_type (u, ts, 2);
2591 name = gfc_get_string (PREFIX("fstat_i%d_sub"), ts->kind);
2592 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2593}
2594
ae8b8789 2595
5d723e54
FXC
2596void
2597gfc_resolve_fgetc_sub (gfc_code * c)
2598{
2599 const char *name;
2600 gfc_typespec ts;
2601 gfc_expr *u, *st;
2602
2603 u = c->ext.actual->expr;
2604 st = c->ext.actual->next->next->expr;
2605
2606 if (u->ts.kind != gfc_c_int_kind)
2607 {
2608 ts.type = BT_INTEGER;
2609 ts.kind = gfc_c_int_kind;
2610 ts.derived = NULL;
2611 ts.cl = NULL;
2612 gfc_convert_type (u, &ts, 2);
2613 }
2614
2615 if (st != NULL)
2616 name = gfc_get_string (PREFIX("fgetc_i%d_sub"), st->ts.kind);
2617 else
2618 name = gfc_get_string (PREFIX("fgetc_i%d_sub"), gfc_default_integer_kind);
2619
2620 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2621}
2622
2623
2624void
2625gfc_resolve_fget_sub (gfc_code * c)
2626{
2627 const char *name;
2628 gfc_expr *st;
2629
2630 st = c->ext.actual->next->expr;
2631 if (st != NULL)
2632 name = gfc_get_string (PREFIX("fget_i%d_sub"), st->ts.kind);
2633 else
2634 name = gfc_get_string (PREFIX("fget_i%d_sub"), gfc_default_integer_kind);
2635
2636 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2637}
2638
2639
2640void
2641gfc_resolve_fputc_sub (gfc_code * c)
2642{
2643 const char *name;
2644 gfc_typespec ts;
2645 gfc_expr *u, *st;
2646
2647 u = c->ext.actual->expr;
2648 st = c->ext.actual->next->next->expr;
2649
2650 if (u->ts.kind != gfc_c_int_kind)
2651 {
2652 ts.type = BT_INTEGER;
2653 ts.kind = gfc_c_int_kind;
2654 ts.derived = NULL;
2655 ts.cl = NULL;
2656 gfc_convert_type (u, &ts, 2);
2657 }
2658
2659 if (st != NULL)
2660 name = gfc_get_string (PREFIX("fputc_i%d_sub"), st->ts.kind);
2661 else
2662 name = gfc_get_string (PREFIX("fputc_i%d_sub"), gfc_default_integer_kind);
2663
2664 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2665}
2666
2667
2668void
2669gfc_resolve_fput_sub (gfc_code * c)
2670{
2671 const char *name;
2672 gfc_expr *st;
2673
2674 st = c->ext.actual->next->expr;
2675 if (st != NULL)
2676 name = gfc_get_string (PREFIX("fput_i%d_sub"), st->ts.kind);
2677 else
2678 name = gfc_get_string (PREFIX("fput_i%d_sub"), gfc_default_integer_kind);
2679
2680 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2681}
2682
2683
2684void
2685gfc_resolve_ftell_sub (gfc_code * c)
2686{
2687 const char *name;
2688 gfc_expr *unit;
2689 gfc_expr *offset;
2690 gfc_typespec ts;
2691
2692 unit = c->ext.actual->expr;
2693 offset = c->ext.actual->next->expr;
2694
2695 if (unit->ts.kind != gfc_c_int_kind)
2696 {
2697 ts.type = BT_INTEGER;
2698 ts.kind = gfc_c_int_kind;
2699 ts.derived = NULL;
2700 ts.cl = NULL;
2701 gfc_convert_type (unit, &ts, 2);
2702 }
2703
2704 name = gfc_get_string (PREFIX("ftell_i%d_sub"), offset->ts.kind);
2705 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2706}
2707
2708
ae8b8789
FXC
2709void
2710gfc_resolve_ttynam_sub (gfc_code * c)
2711{
2712 gfc_typespec ts;
2713
2714 if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
2715 {
2716 ts.type = BT_INTEGER;
2717 ts.kind = gfc_c_int_kind;
2718 ts.derived = NULL;
2719 ts.cl = NULL;
2720 gfc_convert_type (c->ext.actual->expr, &ts, 2);
2721 }
2722
2723 c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ttynam_sub"));
2724}
2725
2726
d8fe26b2
SK
2727/* Resolve the UMASK intrinsic subroutine. */
2728
2729void
2730gfc_resolve_umask_sub (gfc_code * c)
2731{
2732 const char *name;
2733 int kind;
2734
2735 if (c->ext.actual->next->expr != NULL)
2736 kind = c->ext.actual->next->expr->ts.kind;
2737 else
2738 kind = gfc_default_integer_kind;
2739
2740 name = gfc_get_string (PREFIX("umask_i%d_sub"), kind);
2741 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2742}
2743
2744/* Resolve the UNLINK intrinsic subroutine. */
2745
2746void
2747gfc_resolve_unlink_sub (gfc_code * c)
2748{
2749 const char *name;
2750 int kind;
2751
2752 if (c->ext.actual->next->expr != NULL)
2753 kind = c->ext.actual->next->expr->ts.kind;
2754 else
2755 kind = gfc_default_integer_kind;
2756
2757 name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind);
2758 c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2759}
This page took 0.859515 seconds and 5 git commands to generate.