OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [fortran/] [iresolve.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Intrinsic function resolution.
2
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
3
   Free Software Foundation, 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
/* MERGE and SPREAD need to have source charlen's present for passing
63
   to the result expression.  */
64
static void
65
check_charlen_present (gfc_expr *source)
66
{
67
  if (source->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
 
77
/********************** Resolution functions **********************/
78
 
79
 
80
void
81
gfc_resolve_abs (gfc_expr * f, gfc_expr * a)
82
{
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
 
92
void
93
gfc_resolve_acos (gfc_expr * f, gfc_expr * x)
94
{
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
 
101
void
102
gfc_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
 
110
void
111
gfc_resolve_aimag (gfc_expr * f, gfc_expr * x)
112
{
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
 
120
void
121
gfc_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
 
140
void
141
gfc_resolve_aint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
142
{
143
  gfc_typespec ts;
144
 
145
  f->ts.type = a->ts.type;
146
  f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
147
 
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
    }
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
 
161
void
162
gfc_resolve_dint (gfc_expr * f, gfc_expr * a)
163
{
164
  gfc_resolve_aint (f, a, NULL);
165
}
166
 
167
 
168
void
169
gfc_resolve_all (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
170
{
171
  f->ts = mask->ts;
172
 
173
  if (dim != NULL)
174
    {
175
      gfc_resolve_dim_arg (dim);
176
      f->rank = mask->rank - 1;
177
      f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
178
    }
179
 
180
  f->value.function.name =
181
    gfc_get_string (PREFIX("all_%c%d"), gfc_type_letter (mask->ts.type),
182
                    mask->ts.kind);
183
}
184
 
185
 
186
void
187
gfc_resolve_anint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
188
{
189
  gfc_typespec ts;
190
 
191
  f->ts.type = a->ts.type;
192
  f->ts.kind = (kind == NULL) ? a->ts.kind : mpz_get_si (kind->value.integer);
193
 
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
 
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
 
208
void
209
gfc_resolve_dnint (gfc_expr * f, gfc_expr * a)
210
{
211
  gfc_resolve_anint (f, a, NULL);
212
}
213
 
214
 
215
void
216
gfc_resolve_any (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
217
{
218
  f->ts = mask->ts;
219
 
220
  if (dim != NULL)
221
    {
222
      gfc_resolve_dim_arg (dim);
223
      f->rank = mask->rank - 1;
224
      f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
225
    }
226
 
227
  f->value.function.name =
228
    gfc_get_string (PREFIX("any_%c%d"), gfc_type_letter (mask->ts.type),
229
                    mask->ts.kind);
230
}
231
 
232
 
233
void
234
gfc_resolve_asin (gfc_expr * f, gfc_expr * x)
235
{
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
 
241
void
242
gfc_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
}
248
 
249
void
250
gfc_resolve_atan (gfc_expr * f, gfc_expr * x)
251
{
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
 
257
void
258
gfc_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
}
264
 
265
void
266
gfc_resolve_atan2 (gfc_expr * f, gfc_expr * x,
267
                   gfc_expr * y ATTRIBUTE_UNUSED)
268
{
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
 
275
/* Resolve the BESYN and BESJN intrinsics.  */
276
 
277
void
278
gfc_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
 
293
void
294
gfc_resolve_btest (gfc_expr * f, gfc_expr * i, gfc_expr * pos)
295
{
296
  f->ts.type = BT_LOGICAL;
297
  f->ts.kind = gfc_default_logical_kind;
298
 
299
  f->value.function.name = gfc_get_string ("__btest_%d_%d", i->ts.kind,
300
                                           pos->ts.kind);
301
}
302
 
303
 
304
void
305
gfc_resolve_ceiling (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
306
{
307
  f->ts.type = BT_INTEGER;
308
  f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
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
 
317
void
318
gfc_resolve_char (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
319
{
320
  f->ts.type = BT_CHARACTER;
321
  f->ts.kind = (kind == NULL) ? gfc_default_character_kind
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
 
330
void
331
gfc_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
 
339
void
340
gfc_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
 
355
void
356
gfc_resolve_cmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y, gfc_expr * kind)
357
{
358
  f->ts.type = BT_COMPLEX;
359
  f->ts.kind = (kind == NULL) ? gfc_default_real_kind
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
 
373
void
374
gfc_resolve_dcmplx (gfc_expr * f, gfc_expr * x, gfc_expr * y)
375
{
376
  gfc_resolve_cmplx (f, x, y, gfc_int_expr (gfc_default_double_kind));
377
}
378
 
379
void
380
gfc_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
 
409
void
410
gfc_resolve_conjg (gfc_expr * f, gfc_expr * x)
411
{
412
  f->ts = x->ts;
413
  f->value.function.name = gfc_get_string ("__conjg_%d", x->ts.kind);
414
}
415
 
416
 
417
void
418
gfc_resolve_cos (gfc_expr * f, gfc_expr * x)
419
{
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
 
426
void
427
gfc_resolve_cosh (gfc_expr * f, gfc_expr * x)
428
{
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
 
435
void
436
gfc_resolve_count (gfc_expr * f, gfc_expr * mask, gfc_expr * dim)
437
{
438
  f->ts.type = BT_INTEGER;
439
  f->ts.kind = gfc_default_integer_kind;
440
 
441
  if (dim != NULL)
442
    {
443
      f->rank = mask->rank - 1;
444
      gfc_resolve_dim_arg (dim);
445
      f->shape = gfc_copy_shape_excluding (mask->shape, mask->rank, dim);
446
    }
447
 
448
  f->value.function.name =
449
    gfc_get_string (PREFIX("count_%d_%c%d"), f->ts.kind,
450
                    gfc_type_letter (mask->ts.type), mask->ts.kind);
451
}
452
 
453
 
454
void
455
gfc_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;
463
  f->shape = gfc_copy_shape (array->shape, array->rank);
464
 
465
  if (shift->rank > 0)
466
    n = 1;
467
  else
468
    n = 0;
469
 
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
 
480
  if (dim != NULL)
481
    {
482
      gfc_resolve_dim_arg (dim);
483
      /* Convert dim to shift's kind, so we don't need so many variations.  */
484
      if (dim->ts.kind != shift->ts.kind)
485
        gfc_convert_type_warn (dim, &shift->ts, 2, 0);
486
    }
487
  f->value.function.name =
488
    gfc_get_string (PREFIX("cshift%d_%d%s"), n, shift->ts.kind,
489
                    array->ts.type == BT_CHARACTER ? "_char" : "");
490
}
491
 
492
 
493
void
494
gfc_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
 
515
void
516
gfc_resolve_dble (gfc_expr * f, gfc_expr * a)
517
{
518
  f->ts.type = BT_REAL;
519
  f->ts.kind = gfc_default_double_kind;
520
  f->value.function.name =
521
    gfc_get_string ("__dble_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
522
}
523
 
524
 
525
void
526
gfc_resolve_dim (gfc_expr * f, gfc_expr * a, gfc_expr * p)
527
{
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
 
542
  f->value.function.name =
543
    gfc_get_string ("__dim_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
544
}
545
 
546
 
547
void
548
gfc_resolve_dot_product (gfc_expr * f, gfc_expr * a, gfc_expr * b)
549
{
550
  gfc_expr temp;
551
 
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;
559
 
560
  f->value.function.name =
561
    gfc_get_string (PREFIX("dot_product_%c%d"), gfc_type_letter (f->ts.type),
562
                    f->ts.kind);
563
}
564
 
565
 
566
void
567
gfc_resolve_dprod (gfc_expr * f,
568
                   gfc_expr * a ATTRIBUTE_UNUSED,
569
                   gfc_expr * b ATTRIBUTE_UNUSED)
570
{
571
  f->ts.kind = gfc_default_double_kind;
572
  f->ts.type = BT_REAL;
573
 
574
  f->value.function.name = gfc_get_string ("__dprod_r%d", f->ts.kind);
575
}
576
 
577
 
578
void
579
gfc_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;
588
  f->shape = gfc_copy_shape (array->shape, array->rank);
589
 
590
  n = 0;
591
  if (shift->rank > 0)
592
    n = n | 1;
593
  if (boundary && boundary->rank > 0)
594
    n = n | 2;
595
 
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
    }
613
 
614
  f->value.function.name =
615
    gfc_get_string (PREFIX("eoshift%d_%d%s"), n, shift->ts.kind,
616
                    array->ts.type == BT_CHARACTER ? "_char" : "");
617
}
618
 
619
 
620
void
621
gfc_resolve_exp (gfc_expr * f, gfc_expr * x)
622
{
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
 
629
void
630
gfc_resolve_exponent (gfc_expr * f, gfc_expr * x)
631
{
632
  f->ts.type = BT_INTEGER;
633
  f->ts.kind = gfc_default_integer_kind;
634
 
635
  f->value.function.name = gfc_get_string ("__exponent_%d", x->ts.kind);
636
}
637
 
638
 
639
void
640
gfc_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
 
648
void
649
gfc_resolve_floor (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
650
{
651
  f->ts.type = BT_INTEGER;
652
  f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
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
 
661
void
662
gfc_resolve_fnum (gfc_expr * f, gfc_expr * n)
663
{
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
 
672
void
673
gfc_resolve_fraction (gfc_expr * f, gfc_expr * x)
674
{
675
  f->ts = x->ts;
676
  f->value.function.name = gfc_get_string ("__fraction_%d", x->ts.kind);
677
}
678
 
679
 
680
/* Resolve single-argument g77 math intrinsics, eg BESY0, ERF.  */
681
 
682
void
683
gfc_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
 
690
void
691
gfc_resolve_getcwd (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
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
 
699
void
700
gfc_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
 
708
void
709
gfc_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
 
717
void
718
gfc_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
 
725
void
726
gfc_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
 
733
void
734
gfc_resolve_iand (gfc_expr * f, gfc_expr * i, gfc_expr * j)
735
{
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
    }
746
 
747
  f->ts = i->ts;
748
  f->value.function.name = gfc_get_string ("__iand_%d", i->ts.kind);
749
}
750
 
751
 
752
void
753
gfc_resolve_ibclr (gfc_expr * f, gfc_expr * i, gfc_expr * pos ATTRIBUTE_UNUSED)
754
{
755
  f->ts = i->ts;
756
  f->value.function.name = gfc_get_string ("__ibclr_%d", i->ts.kind);
757
}
758
 
759
 
760
void
761
gfc_resolve_ibits (gfc_expr * f, gfc_expr * i,
762
                   gfc_expr * pos ATTRIBUTE_UNUSED,
763
                   gfc_expr * len ATTRIBUTE_UNUSED)
764
{
765
  f->ts = i->ts;
766
  f->value.function.name = gfc_get_string ("__ibits_%d", i->ts.kind);
767
}
768
 
769
 
770
void
771
gfc_resolve_ibset (gfc_expr * f, gfc_expr * i,
772
                   gfc_expr * pos ATTRIBUTE_UNUSED)
773
{
774
  f->ts = i->ts;
775
  f->value.function.name = gfc_get_string ("__ibset_%d", i->ts.kind);
776
}
777
 
778
 
779
void
780
gfc_resolve_ichar (gfc_expr * f, gfc_expr * c)
781
{
782
  f->ts.type = BT_INTEGER;
783
  f->ts.kind = gfc_default_integer_kind;
784
 
785
  f->value.function.name = gfc_get_string ("__ichar_%d", c->ts.kind);
786
}
787
 
788
 
789
void
790
gfc_resolve_idnint (gfc_expr * f, gfc_expr * a)
791
{
792
  gfc_resolve_nint (f, a, NULL);
793
}
794
 
795
 
796
void
797
gfc_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
 
805
void
806
gfc_resolve_ieor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
807
{
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
    }
818
 
819
  f->ts = i->ts;
820
  f->value.function.name = gfc_get_string ("__ieor_%d", i->ts.kind);
821
}
822
 
823
 
824
void
825
gfc_resolve_ior (gfc_expr * f, gfc_expr * i, gfc_expr * j)
826
{
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
    }
837
 
838
  f->ts = i->ts;
839
  f->value.function.name = gfc_get_string ("__ior_%d", i->ts.kind);
840
}
841
 
842
 
843
void
844
gfc_resolve_int (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
845
{
846
  f->ts.type = BT_INTEGER;
847
  f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
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
 
856
void
857
gfc_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
 
876
void
877
gfc_resolve_ishft (gfc_expr * f, gfc_expr * i, gfc_expr * shift)
878
{
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
 
885
void
886
gfc_resolve_ishftc (gfc_expr * f, gfc_expr * i, gfc_expr * shift,
887
                    gfc_expr * size)
888
{
889
  int s_kind;
890
 
891
  s_kind = (size == NULL) ? gfc_default_integer_kind : shift->ts.kind;
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
 
899
void
900
gfc_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
 
910
void
911
gfc_resolve_lbound (gfc_expr * f, gfc_expr * array,
912
                    gfc_expr * dim)
913
{
914
  static char lbound[] = "__lbound";
915
 
916
  f->ts.type = BT_INTEGER;
917
  f->ts.kind = gfc_default_integer_kind;
918
 
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
 
926
  f->value.function.name = lbound;
927
}
928
 
929
 
930
void
931
gfc_resolve_len (gfc_expr * f, gfc_expr * string)
932
{
933
  f->ts.type = BT_INTEGER;
934
  f->ts.kind = gfc_default_integer_kind;
935
  f->value.function.name = gfc_get_string ("__len_%d", string->ts.kind);
936
}
937
 
938
 
939
void
940
gfc_resolve_len_trim (gfc_expr * f, gfc_expr * string)
941
{
942
  f->ts.type = BT_INTEGER;
943
  f->ts.kind = gfc_default_integer_kind;
944
  f->value.function.name = gfc_get_string ("__len_trim%d", string->ts.kind);
945
}
946
 
947
 
948
void
949
gfc_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
 
958
void
959
gfc_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
 
967
void
968
gfc_resolve_log (gfc_expr * f, gfc_expr * x)
969
{
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
 
976
void
977
gfc_resolve_log10 (gfc_expr * f, gfc_expr * x)
978
{
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
 
985
void
986
gfc_resolve_logical (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
987
{
988
  f->ts.type = BT_LOGICAL;
989
  f->ts.kind = (kind == NULL) ? gfc_default_logical_kind
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
 
999
void
1000
gfc_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
 
1017
void
1018
gfc_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;
1025
      f->ts.kind = gfc_default_logical_kind;
1026
    }
1027
  else
1028
    {
1029
      temp.expr_type = EXPR_OP;
1030
      gfc_clear_ts (&temp.ts);
1031
      temp.value.op.operator = INTRINSIC_NONE;
1032
      temp.value.op.op1 = a;
1033
      temp.value.op.op2 = b;
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 =
1041
    gfc_get_string (PREFIX("matmul_%c%d"), gfc_type_letter (f->ts.type),
1042
                    f->ts.kind);
1043
}
1044
 
1045
 
1046
static void
1047
gfc_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
 
1072
void
1073
gfc_resolve_max (gfc_expr * f, gfc_actual_arglist * args)
1074
{
1075
  gfc_resolve_minmax ("__max_%c%d", f, args);
1076
}
1077
 
1078
 
1079
void
1080
gfc_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;
1086
  f->ts.kind = gfc_default_integer_kind;
1087
 
1088
  if (dim == NULL)
1089
    f->rank = 1;
1090
  else
1091
    {
1092
      f->rank = array->rank - 1;
1093
      gfc_resolve_dim_arg (dim);
1094
    }
1095
 
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
 
1117
  f->value.function.name =
1118
    gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1119
                    gfc_type_letter (array->ts.type), array->ts.kind);
1120
}
1121
 
1122
 
1123
void
1124
gfc_resolve_maxval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1125
                    gfc_expr * mask)
1126
{
1127
  const char *name;
1128
 
1129
  f->ts = array->ts;
1130
 
1131
  if (dim != NULL)
1132
    {
1133
      f->rank = array->rank - 1;
1134
      gfc_resolve_dim_arg (dim);
1135
    }
1136
 
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
 
1158
  f->value.function.name =
1159
    gfc_get_string (PREFIX("%s_%c%d"), name,
1160
                    gfc_type_letter (array->ts.type), array->ts.kind);
1161
}
1162
 
1163
 
1164
void
1165
gfc_resolve_merge (gfc_expr * f, gfc_expr * tsource,
1166
                   gfc_expr * fsource ATTRIBUTE_UNUSED,
1167
                   gfc_expr * mask ATTRIBUTE_UNUSED)
1168
{
1169
  if (tsource->ts.type == BT_CHARACTER)
1170
    check_charlen_present (tsource);
1171
 
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
 
1179
void
1180
gfc_resolve_min (gfc_expr * f, gfc_actual_arglist * args)
1181
{
1182
  gfc_resolve_minmax ("__min_%c%d", f, args);
1183
}
1184
 
1185
 
1186
void
1187
gfc_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;
1193
  f->ts.kind = gfc_default_integer_kind;
1194
 
1195
  if (dim == NULL)
1196
    f->rank = 1;
1197
  else
1198
    {
1199
      f->rank = array->rank - 1;
1200
      gfc_resolve_dim_arg (dim);
1201
    }
1202
 
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
 
1224
  f->value.function.name =
1225
    gfc_get_string (PREFIX("%s%d_%d_%c%d"), name, dim != NULL, f->ts.kind,
1226
                    gfc_type_letter (array->ts.type), array->ts.kind);
1227
}
1228
 
1229
 
1230
void
1231
gfc_resolve_minval (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1232
                    gfc_expr * mask)
1233
{
1234
  const char *name;
1235
 
1236
  f->ts = array->ts;
1237
 
1238
  if (dim != NULL)
1239
    {
1240
      f->rank = array->rank - 1;
1241
      gfc_resolve_dim_arg (dim);
1242
    }
1243
 
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
 
1265
  f->value.function.name =
1266
    gfc_get_string (PREFIX("%s_%c%d"), name,
1267
                    gfc_type_letter (array->ts.type), array->ts.kind);
1268
}
1269
 
1270
 
1271
void
1272
gfc_resolve_mod (gfc_expr * f, gfc_expr * a, gfc_expr * p)
1273
{
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
 
1288
  f->value.function.name =
1289
    gfc_get_string ("__mod_%c%d", gfc_type_letter (f->ts.type), f->ts.kind);
1290
}
1291
 
1292
 
1293
void
1294
gfc_resolve_modulo (gfc_expr * f, gfc_expr * a, gfc_expr * p)
1295
{
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
 
1310
  f->value.function.name =
1311
    gfc_get_string ("__modulo_%c%d", gfc_type_letter (f->ts.type),
1312
                    f->ts.kind);
1313
}
1314
 
1315
void
1316
gfc_resolve_nearest (gfc_expr * f, gfc_expr * a, gfc_expr *p ATTRIBUTE_UNUSED)
1317
{
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
}
1323
 
1324
void
1325
gfc_resolve_nint (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1326
{
1327
  f->ts.type = BT_INTEGER;
1328
  f->ts.kind = (kind == NULL) ? gfc_default_integer_kind
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
 
1336
void
1337
gfc_resolve_not (gfc_expr * f, gfc_expr * i)
1338
{
1339
  f->ts = i->ts;
1340
  f->value.function.name = gfc_get_string ("__not_%d", i->ts.kind);
1341
}
1342
 
1343
 
1344
void
1345
gfc_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
 
1364
void
1365
gfc_resolve_pack (gfc_expr * f, gfc_expr * array, gfc_expr * mask,
1366
                  gfc_expr * vector ATTRIBUTE_UNUSED)
1367
{
1368
  f->ts = array->ts;
1369
  f->rank = 1;
1370
 
1371
  if (mask->rank != 0)
1372
    f->value.function.name = (array->ts.type == BT_CHARACTER
1373
                              ? PREFIX("pack_char")
1374
                              : PREFIX("pack"));
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
 
1389
      f->value.function.name = (array->ts.type == BT_CHARACTER
1390
                                ? PREFIX("pack_s_char")
1391
                                : PREFIX("pack_s"));
1392
    }
1393
}
1394
 
1395
 
1396
void
1397
gfc_resolve_product (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1398
                     gfc_expr * mask)
1399
{
1400
  const char *name;
1401
 
1402
  f->ts = array->ts;
1403
 
1404
  if (dim != NULL)
1405
    {
1406
      f->rank = array->rank - 1;
1407
      gfc_resolve_dim_arg (dim);
1408
    }
1409
 
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
 
1431
  f->value.function.name =
1432
    gfc_get_string (PREFIX("%s_%c%d"), name,
1433
                    gfc_type_letter (array->ts.type), array->ts.kind);
1434
}
1435
 
1436
 
1437
void
1438
gfc_resolve_real (gfc_expr * f, gfc_expr * a, gfc_expr * kind)
1439
{
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) ?
1446
      a->ts.kind : gfc_default_real_kind;
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
 
1454
void
1455
gfc_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
 
1465
void
1466
gfc_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
 
1475
void
1476
gfc_resolve_repeat (gfc_expr * f, gfc_expr * string,
1477
                    gfc_expr * ncopies ATTRIBUTE_UNUSED)
1478
{
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
 
1485
void
1486
gfc_resolve_reshape (gfc_expr * f, gfc_expr * source, gfc_expr * shape,
1487
                     gfc_expr * pad ATTRIBUTE_UNUSED,
1488
                     gfc_expr * order ATTRIBUTE_UNUSED)
1489
{
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
    case BT_REAL:
1503
    case BT_INTEGER:
1504
    case BT_LOGICAL:
1505
      kind = source->ts.kind;
1506
      break;
1507
 
1508
    default:
1509
      kind = 0;
1510
      break;
1511
    }
1512
 
1513
  switch (kind)
1514
    {
1515
    case 4:
1516
    case 8:
1517
    case 10:
1518
    case 16:
1519
      if (source->ts.type == BT_COMPLEX)
1520
        f->value.function.name =
1521
          gfc_get_string (PREFIX("reshape_%c%d"),
1522
                          gfc_type_letter (BT_COMPLEX), source->ts.kind);
1523
      else if (source->ts.type == BT_REAL && (kind == 10 || kind == 16))
1524
        f->value.function.name =
1525
          gfc_get_string (PREFIX("reshape_%c%d"),
1526
                          gfc_type_letter (BT_REAL), source->ts.kind);
1527
      else
1528
        f->value.function.name =
1529
          gfc_get_string (PREFIX("reshape_%d"), source->ts.kind);
1530
 
1531
      break;
1532
 
1533
    default:
1534
      f->value.function.name = (source->ts.type == BT_CHARACTER
1535
                                ? PREFIX("reshape_char")
1536
                                : PREFIX("reshape"));
1537
      break;
1538
    }
1539
 
1540
  /* TODO: Make this work with a constant ORDER parameter.  */
1541
  if (shape->expr_type == EXPR_ARRAY
1542
      && gfc_is_constant_expr (shape)
1543
      && order == NULL)
1544
    {
1545
      gfc_constructor *c;
1546
      f->shape = gfc_get_shape (f->rank);
1547
      c = shape->value.constructor;
1548
      for (i = 0; i < f->rank; i++)
1549
        {
1550
          mpz_init_set (f->shape[i], c->expr->value.integer);
1551
          c = c->next;
1552
        }
1553
    }
1554
 
1555
  /* Force-convert both SHAPE and ORDER to index_kind so that we don't need
1556
     so many runtime variations.  */
1557
  if (shape->ts.kind != gfc_index_integer_kind)
1558
    {
1559
      gfc_typespec ts = shape->ts;
1560
      ts.kind = gfc_index_integer_kind;
1561
      gfc_convert_type_warn (shape, &ts, 2, 0);
1562
    }
1563
  if (order && order->ts.kind != gfc_index_integer_kind)
1564
    gfc_convert_type_warn (order, &shape->ts, 2, 0);
1565
}
1566
 
1567
 
1568
void
1569
gfc_resolve_rrspacing (gfc_expr * f, gfc_expr * x)
1570
{
1571
  f->ts = x->ts;
1572
  f->value.function.name = gfc_get_string ("__rrspacing_%d", x->ts.kind);
1573
}
1574
 
1575
 
1576
void
1577
gfc_resolve_scale (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1578
{
1579
  f->ts = x->ts;
1580
 
1581
  /* The implementation calls scalbn which takes an int as the
1582
     second argument.  */
1583
  if (i->ts.kind != gfc_c_int_kind)
1584
    {
1585
      gfc_typespec ts;
1586
 
1587
      ts.type = BT_INTEGER;
1588
      ts.kind = gfc_default_integer_kind;
1589
 
1590
      gfc_convert_type_warn (i, &ts, 2, 0);
1591
    }
1592
 
1593
  f->value.function.name = gfc_get_string ("__scale_%d", x->ts.kind);
1594
}
1595
 
1596
 
1597
void
1598
gfc_resolve_scan (gfc_expr * f, gfc_expr * string,
1599
                  gfc_expr * set ATTRIBUTE_UNUSED,
1600
                  gfc_expr * back ATTRIBUTE_UNUSED)
1601
{
1602
  f->ts.type = BT_INTEGER;
1603
  f->ts.kind = gfc_default_integer_kind;
1604
  f->value.function.name = gfc_get_string ("__scan_%d", string->ts.kind);
1605
}
1606
 
1607
 
1608
void
1609
gfc_resolve_secnds (gfc_expr * t1, gfc_expr * t0)
1610
{
1611
  t1->ts = t0->ts;
1612
  t1->value.function.name =
1613
    gfc_get_string (PREFIX("secnds"));
1614
}
1615
 
1616
 
1617
void
1618
gfc_resolve_set_exponent (gfc_expr * f, gfc_expr * x, gfc_expr * i)
1619
{
1620
  f->ts = x->ts;
1621
 
1622
  /* The library implementation uses GFC_INTEGER_4 unconditionally,
1623
     convert type so we don't have to implement all possible
1624
     permutations.  */
1625
  if (i->ts.kind != 4)
1626
    {
1627
      gfc_typespec ts;
1628
 
1629
      ts.type = BT_INTEGER;
1630
      ts.kind = gfc_default_integer_kind;
1631
 
1632
      gfc_convert_type_warn (i, &ts, 2, 0);
1633
    }
1634
 
1635
  f->value.function.name = gfc_get_string ("__set_exponent_%d", x->ts.kind);
1636
}
1637
 
1638
 
1639
void
1640
gfc_resolve_shape (gfc_expr * f, gfc_expr * array)
1641
{
1642
  f->ts.type = BT_INTEGER;
1643
  f->ts.kind = gfc_default_integer_kind;
1644
  f->rank = 1;
1645
  f->value.function.name = gfc_get_string (PREFIX("shape_%d"), f->ts.kind);
1646
  f->shape = gfc_get_shape (1);
1647
  mpz_init_set_ui (f->shape[0], array->rank);
1648
}
1649
 
1650
 
1651
void
1652
gfc_resolve_sign (gfc_expr * f, gfc_expr * a, gfc_expr * b ATTRIBUTE_UNUSED)
1653
{
1654
  f->ts = a->ts;
1655
  f->value.function.name =
1656
    gfc_get_string ("__sign_%c%d", gfc_type_letter (a->ts.type), a->ts.kind);
1657
}
1658
 
1659
 
1660
void
1661
gfc_resolve_signal (gfc_expr * f, gfc_expr *number, gfc_expr *handler)
1662
{
1663
  f->ts.type = BT_INTEGER;
1664
  f->ts.kind = gfc_c_int_kind;
1665
 
1666
  /* handler can be either BT_INTEGER or BT_PROCEDURE  */
1667
  if (handler->ts.type == BT_INTEGER)
1668
    {
1669
      if (handler->ts.kind != gfc_c_int_kind)
1670
        gfc_convert_type (handler, &f->ts, 2);
1671
      f->value.function.name = gfc_get_string (PREFIX("signal_func_int"));
1672
    }
1673
  else
1674
    f->value.function.name = gfc_get_string (PREFIX("signal_func"));
1675
 
1676
  if (number->ts.kind != gfc_c_int_kind)
1677
    gfc_convert_type (number, &f->ts, 2);
1678
}
1679
 
1680
 
1681
void
1682
gfc_resolve_sin (gfc_expr * f, gfc_expr * x)
1683
{
1684
  f->ts = x->ts;
1685
  f->value.function.name =
1686
    gfc_get_string ("__sin_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1687
}
1688
 
1689
 
1690
void
1691
gfc_resolve_sinh (gfc_expr * f, gfc_expr * x)
1692
{
1693
  f->ts = x->ts;
1694
  f->value.function.name =
1695
    gfc_get_string ("__sinh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1696
}
1697
 
1698
 
1699
void
1700
gfc_resolve_spacing (gfc_expr * f, gfc_expr * x)
1701
{
1702
  f->ts = x->ts;
1703
  f->value.function.name = gfc_get_string ("__spacing_%d", x->ts.kind);
1704
}
1705
 
1706
 
1707
void
1708
gfc_resolve_spread (gfc_expr * f, gfc_expr * source,
1709
                    gfc_expr * dim,
1710
                    gfc_expr * ncopies)
1711
{
1712
  if (source->ts.type == BT_CHARACTER)
1713
    check_charlen_present (source);
1714
 
1715
  f->ts = source->ts;
1716
  f->rank = source->rank + 1;
1717
  if (source->rank == 0)
1718
    f->value.function.name = (source->ts.type == BT_CHARACTER
1719
                              ? PREFIX("spread_char_scalar")
1720
                              : PREFIX("spread_scalar"));
1721
  else
1722
    f->value.function.name = (source->ts.type == BT_CHARACTER
1723
                              ? PREFIX("spread_char")
1724
                              : PREFIX("spread"));
1725
 
1726
  gfc_resolve_dim_arg (dim);
1727
  gfc_resolve_index (ncopies, 1);
1728
}
1729
 
1730
 
1731
void
1732
gfc_resolve_sqrt (gfc_expr * f, gfc_expr * x)
1733
{
1734
  f->ts = x->ts;
1735
  f->value.function.name =
1736
    gfc_get_string ("__sqrt_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1737
}
1738
 
1739
 
1740
/* Resolve the g77 compatibility function STAT AND FSTAT.  */
1741
 
1742
void
1743
gfc_resolve_stat (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED,
1744
                  gfc_expr * a ATTRIBUTE_UNUSED)
1745
{
1746
  f->ts.type = BT_INTEGER;
1747
  f->ts.kind = gfc_default_integer_kind;
1748
  f->value.function.name = gfc_get_string (PREFIX("stat_i%d"), f->ts.kind);
1749
}
1750
 
1751
 
1752
void
1753
gfc_resolve_fstat (gfc_expr * f, gfc_expr * n, gfc_expr * a ATTRIBUTE_UNUSED)
1754
{
1755
  f->ts.type = BT_INTEGER;
1756
  f->ts.kind = gfc_default_integer_kind;
1757
  if (n->ts.kind != f->ts.kind)
1758
    gfc_convert_type (n, &f->ts, 2);
1759
 
1760
  f->value.function.name = gfc_get_string (PREFIX("fstat_i%d"), f->ts.kind);
1761
}
1762
 
1763
 
1764
void
1765
gfc_resolve_fgetc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1766
{
1767
  gfc_typespec ts;
1768
 
1769
  f->ts.type = BT_INTEGER;
1770
  f->ts.kind = gfc_c_int_kind;
1771
  if (u->ts.kind != gfc_c_int_kind)
1772
    {
1773
      ts.type = BT_INTEGER;
1774
      ts.kind = gfc_c_int_kind;
1775
      ts.derived = NULL;
1776
      ts.cl = NULL;
1777
      gfc_convert_type (u, &ts, 2);
1778
    }
1779
 
1780
  f->value.function.name = gfc_get_string (PREFIX("fgetc"));
1781
}
1782
 
1783
 
1784
void
1785
gfc_resolve_fget (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1786
{
1787
  f->ts.type = BT_INTEGER;
1788
  f->ts.kind = gfc_c_int_kind;
1789
  f->value.function.name = gfc_get_string (PREFIX("fget"));
1790
}
1791
 
1792
 
1793
void
1794
gfc_resolve_fputc (gfc_expr * f, gfc_expr * u, gfc_expr * c ATTRIBUTE_UNUSED)
1795
{
1796
  gfc_typespec ts;
1797
 
1798
  f->ts.type = BT_INTEGER;
1799
  f->ts.kind = gfc_c_int_kind;
1800
  if (u->ts.kind != gfc_c_int_kind)
1801
    {
1802
      ts.type = BT_INTEGER;
1803
      ts.kind = gfc_c_int_kind;
1804
      ts.derived = NULL;
1805
      ts.cl = NULL;
1806
      gfc_convert_type (u, &ts, 2);
1807
    }
1808
 
1809
  f->value.function.name = gfc_get_string (PREFIX("fputc"));
1810
}
1811
 
1812
 
1813
void
1814
gfc_resolve_fput (gfc_expr * f, gfc_expr * c ATTRIBUTE_UNUSED)
1815
{
1816
  f->ts.type = BT_INTEGER;
1817
  f->ts.kind = gfc_c_int_kind;
1818
  f->value.function.name = gfc_get_string (PREFIX("fput"));
1819
}
1820
 
1821
 
1822
void
1823
gfc_resolve_ftell (gfc_expr * f, gfc_expr * u)
1824
{
1825
  gfc_typespec ts;
1826
 
1827
  f->ts.type = BT_INTEGER;
1828
  f->ts.kind = gfc_index_integer_kind;
1829
  if (u->ts.kind != gfc_c_int_kind)
1830
    {
1831
      ts.type = BT_INTEGER;
1832
      ts.kind = gfc_c_int_kind;
1833
      ts.derived = NULL;
1834
      ts.cl = NULL;
1835
      gfc_convert_type (u, &ts, 2);
1836
    }
1837
 
1838
  f->value.function.name = gfc_get_string (PREFIX("ftell"));
1839
}
1840
 
1841
 
1842
void
1843
gfc_resolve_sum (gfc_expr * f, gfc_expr * array, gfc_expr * dim,
1844
                 gfc_expr * mask)
1845
{
1846
  const char *name;
1847
 
1848
  f->ts = array->ts;
1849
 
1850
  if (mask)
1851
    {
1852
      if (mask->rank == 0)
1853
        name = "ssum";
1854
      else
1855
        name = "msum";
1856
 
1857
      /* The mask can be kind 4 or 8 for the array case.  For the
1858
         scalar case, coerce it to default kind unconditionally.  */
1859
      if ((mask->ts.kind < gfc_default_logical_kind)
1860
          || (mask->rank == 0 && mask->ts.kind != gfc_default_logical_kind))
1861
        {
1862
          gfc_typespec ts;
1863
          ts.type = BT_LOGICAL;
1864
          ts.kind = gfc_default_logical_kind;
1865
          gfc_convert_type_warn (mask, &ts, 2, 0);
1866
        }
1867
    }
1868
  else
1869
    name = "sum";
1870
 
1871
  if (dim != NULL)
1872
    {
1873
      f->rank = array->rank - 1;
1874
      gfc_resolve_dim_arg (dim);
1875
    }
1876
 
1877
  f->value.function.name =
1878
    gfc_get_string (PREFIX("%s_%c%d"), name,
1879
                    gfc_type_letter (array->ts.type), array->ts.kind);
1880
}
1881
 
1882
 
1883
void
1884
gfc_resolve_symlnk (gfc_expr * f, gfc_expr * p1 ATTRIBUTE_UNUSED,
1885
                    gfc_expr * p2 ATTRIBUTE_UNUSED)
1886
{
1887
  f->ts.type = BT_INTEGER;
1888
  f->ts.kind = gfc_default_integer_kind;
1889
  f->value.function.name = gfc_get_string (PREFIX("symlnk_i%d"), f->ts.kind);
1890
}
1891
 
1892
 
1893
/* Resolve the g77 compatibility function SYSTEM.  */
1894
 
1895
void
1896
gfc_resolve_system (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
1897
{
1898
  f->ts.type = BT_INTEGER;
1899
  f->ts.kind = 4;
1900
  f->value.function.name = gfc_get_string (PREFIX("system"));
1901
}
1902
 
1903
 
1904
void
1905
gfc_resolve_tan (gfc_expr * f, gfc_expr * x)
1906
{
1907
  f->ts = x->ts;
1908
  f->value.function.name =
1909
    gfc_get_string ("__tan_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1910
}
1911
 
1912
 
1913
void
1914
gfc_resolve_tanh (gfc_expr * f, gfc_expr * x)
1915
{
1916
  f->ts = x->ts;
1917
  f->value.function.name =
1918
    gfc_get_string ("__tanh_%c%d", gfc_type_letter (x->ts.type), x->ts.kind);
1919
}
1920
 
1921
 
1922
void
1923
gfc_resolve_time (gfc_expr * f)
1924
{
1925
  f->ts.type = BT_INTEGER;
1926
  f->ts.kind = 4;
1927
  f->value.function.name = gfc_get_string (PREFIX("time_func"));
1928
}
1929
 
1930
 
1931
void
1932
gfc_resolve_time8 (gfc_expr * f)
1933
{
1934
  f->ts.type = BT_INTEGER;
1935
  f->ts.kind = 8;
1936
  f->value.function.name = gfc_get_string (PREFIX("time8_func"));
1937
}
1938
 
1939
 
1940
void
1941
gfc_resolve_transfer (gfc_expr * f, gfc_expr * source ATTRIBUTE_UNUSED,
1942
                      gfc_expr * mold, gfc_expr * size)
1943
{
1944
  /* TODO: Make this do something meaningful.  */
1945
  static char transfer0[] = "__transfer0", transfer1[] = "__transfer1";
1946
 
1947
  f->ts = mold->ts;
1948
 
1949
  if (size == NULL && mold->rank == 0)
1950
    {
1951
      f->rank = 0;
1952
      f->value.function.name = transfer0;
1953
    }
1954
  else
1955
    {
1956
      f->rank = 1;
1957
      f->value.function.name = transfer1;
1958
      if (size && gfc_is_constant_expr (size))
1959
        {
1960
          f->shape = gfc_get_shape (1);
1961
          mpz_init_set (f->shape[0], size->value.integer);
1962
        }
1963
    }
1964
}
1965
 
1966
 
1967
void
1968
gfc_resolve_transpose (gfc_expr * f, gfc_expr * matrix)
1969
{
1970
  int kind;
1971
 
1972
  f->ts = matrix->ts;
1973
  f->rank = 2;
1974
  if (matrix->shape)
1975
    {
1976
      f->shape = gfc_get_shape (2);
1977
      mpz_init_set (f->shape[0], matrix->shape[1]);
1978
      mpz_init_set (f->shape[1], matrix->shape[0]);
1979
    }
1980
 
1981
  kind = matrix->ts.kind;
1982
 
1983
  switch (kind)
1984
    {
1985
    case 4:
1986
    case 8:
1987
    case 10:
1988
    case 16:
1989
      switch (matrix->ts.type)
1990
        {
1991
        case BT_COMPLEX:
1992
          f->value.function.name =
1993
            gfc_get_string (PREFIX("transpose_c%d"), kind);
1994
          break;
1995
 
1996
        case BT_REAL:
1997
          /* There is no kind=10 integer type and on 32-bit targets
1998
             there is usually no kind=16 integer type.  We need to
1999
             call the real version.  */
2000
          if (kind == 10 || kind == 16)
2001
            {
2002
              f->value.function.name =
2003
                gfc_get_string (PREFIX("transpose_r%d"), kind);
2004
              break;
2005
            }
2006
 
2007
          /* Fall through */
2008
 
2009
        case BT_INTEGER:
2010
        case BT_LOGICAL:
2011
          /* Use the integer routines for real and logical cases.  This
2012
             assumes they all have the same alignment requirements.  */
2013
          f->value.function.name =
2014
            gfc_get_string (PREFIX("transpose_i%d"), kind);
2015
          break;
2016
 
2017
        default:
2018
          f->value.function.name = PREFIX("transpose");
2019
          break;
2020
        }
2021
      break;
2022
 
2023
    default:
2024
      f->value.function.name = (matrix->ts.type == BT_CHARACTER
2025
                                ? PREFIX("transpose_char")
2026
                                : PREFIX("transpose"));
2027
      break;
2028
    }
2029
}
2030
 
2031
 
2032
void
2033
gfc_resolve_trim (gfc_expr * f, gfc_expr * string)
2034
{
2035
  f->ts.type = BT_CHARACTER;
2036
  f->ts.kind = string->ts.kind;
2037
  f->value.function.name = gfc_get_string ("__trim_%d", string->ts.kind);
2038
}
2039
 
2040
 
2041
void
2042
gfc_resolve_ubound (gfc_expr * f, gfc_expr * array,
2043
                    gfc_expr * dim)
2044
{
2045
  static char ubound[] = "__ubound";
2046
 
2047
  f->ts.type = BT_INTEGER;
2048
  f->ts.kind = gfc_default_integer_kind;
2049
 
2050
  if (dim == NULL)
2051
    {
2052
      f->rank = 1;
2053
      f->shape = gfc_get_shape (1);
2054
      mpz_init_set_ui (f->shape[0], array->rank);
2055
    }
2056
 
2057
  f->value.function.name = ubound;
2058
}
2059
 
2060
 
2061
/* Resolve the g77 compatibility function UMASK.  */
2062
 
2063
void
2064
gfc_resolve_umask (gfc_expr * f, gfc_expr * n)
2065
{
2066
  f->ts.type = BT_INTEGER;
2067
  f->ts.kind = n->ts.kind;
2068
  f->value.function.name = gfc_get_string (PREFIX("umask_i%d"), n->ts.kind);
2069
}
2070
 
2071
 
2072
/* Resolve the g77 compatibility function UNLINK.  */
2073
 
2074
void
2075
gfc_resolve_unlink (gfc_expr * f, gfc_expr * n ATTRIBUTE_UNUSED)
2076
{
2077
  f->ts.type = BT_INTEGER;
2078
  f->ts.kind = 4;
2079
  f->value.function.name = gfc_get_string (PREFIX("unlink"));
2080
}
2081
 
2082
 
2083
void
2084
gfc_resolve_ttynam (gfc_expr * f, gfc_expr * unit)
2085
{
2086
  gfc_typespec ts;
2087
 
2088
  f->ts.type = BT_CHARACTER;
2089
  f->ts.kind = gfc_default_character_kind;
2090
 
2091
  if (unit->ts.kind != gfc_c_int_kind)
2092
    {
2093
      ts.type = BT_INTEGER;
2094
      ts.kind = gfc_c_int_kind;
2095
      ts.derived = NULL;
2096
      ts.cl = NULL;
2097
      gfc_convert_type (unit, &ts, 2);
2098
    }
2099
 
2100
  f->value.function.name = gfc_get_string (PREFIX("ttynam"));
2101
}
2102
 
2103
 
2104
void
2105
gfc_resolve_unpack (gfc_expr * f, gfc_expr * vector, gfc_expr * mask,
2106
                    gfc_expr * field ATTRIBUTE_UNUSED)
2107
{
2108
  f->ts = vector->ts;
2109
  f->rank = mask->rank;
2110
 
2111
  f->value.function.name =
2112
    gfc_get_string (PREFIX("unpack%d%s"), field->rank > 0 ? 1 : 0,
2113
                    vector->ts.type == BT_CHARACTER ? "_char" : "");
2114
}
2115
 
2116
 
2117
void
2118
gfc_resolve_verify (gfc_expr * f, gfc_expr * string,
2119
                    gfc_expr * set ATTRIBUTE_UNUSED,
2120
                    gfc_expr * back ATTRIBUTE_UNUSED)
2121
{
2122
  f->ts.type = BT_INTEGER;
2123
  f->ts.kind = gfc_default_integer_kind;
2124
  f->value.function.name = gfc_get_string ("__verify_%d", string->ts.kind);
2125
}
2126
 
2127
 
2128
void
2129
gfc_resolve_xor (gfc_expr * f, gfc_expr * i, gfc_expr * j)
2130
{
2131
  f->ts.type = i->ts.type;
2132
  f->ts.kind = gfc_kind_max (i,j);
2133
 
2134
  if (i->ts.kind != j->ts.kind)
2135
    {
2136
      if (i->ts.kind == gfc_kind_max (i,j))
2137
        gfc_convert_type(j, &i->ts, 2);
2138
      else
2139
        gfc_convert_type(i, &j->ts, 2);
2140
    }
2141
 
2142
  f->value.function.name = gfc_get_string ("__xor_%c%d",
2143
                                           gfc_type_letter (i->ts.type),
2144
                                           f->ts.kind);
2145
}
2146
 
2147
 
2148
/* Intrinsic subroutine resolution.  */
2149
 
2150
void
2151
gfc_resolve_alarm_sub (gfc_code * c)
2152
{
2153
  const char *name;
2154
  gfc_expr *seconds, *handler, *status;
2155
  gfc_typespec ts;
2156
 
2157
  seconds = c->ext.actual->expr;
2158
  handler = c->ext.actual->next->expr;
2159
  status = c->ext.actual->next->next->expr;
2160
  ts.type = BT_INTEGER;
2161
  ts.kind = gfc_c_int_kind;
2162
 
2163
  /* handler can be either BT_INTEGER or BT_PROCEDURE  */
2164
  if (handler->ts.type == BT_INTEGER)
2165
    {
2166
      if (handler->ts.kind != gfc_c_int_kind)
2167
        gfc_convert_type (handler, &ts, 2);
2168
      name = gfc_get_string (PREFIX("alarm_sub_int"));
2169
    }
2170
  else
2171
    name = gfc_get_string (PREFIX("alarm_sub"));
2172
 
2173
  if (seconds->ts.kind != gfc_c_int_kind)
2174
    gfc_convert_type (seconds, &ts, 2);
2175
  if (status != NULL && status->ts.kind != gfc_c_int_kind)
2176
    gfc_convert_type (status, &ts, 2);
2177
 
2178
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2179
}
2180
 
2181
void
2182
gfc_resolve_cpu_time (gfc_code * c ATTRIBUTE_UNUSED)
2183
{
2184
  const char *name;
2185
 
2186
  name = gfc_get_string (PREFIX("cpu_time_%d"),
2187
                         c->ext.actual->expr->ts.kind);
2188
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2189
}
2190
 
2191
 
2192
void
2193
gfc_resolve_mvbits (gfc_code * c)
2194
{
2195
  const char *name;
2196
  int kind;
2197
 
2198
  kind = c->ext.actual->expr->ts.kind;
2199
  name = gfc_get_string (PREFIX("mvbits_i%d"), kind);
2200
 
2201
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2202
}
2203
 
2204
 
2205
void
2206
gfc_resolve_random_number (gfc_code * c ATTRIBUTE_UNUSED)
2207
{
2208
  const char *name;
2209
  int kind;
2210
 
2211
  kind = c->ext.actual->expr->ts.kind;
2212
  if (c->ext.actual->expr->rank == 0)
2213
    name = gfc_get_string (PREFIX("random_r%d"), kind);
2214
  else
2215
    name = gfc_get_string (PREFIX("arandom_r%d"), kind);
2216
 
2217
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2218
}
2219
 
2220
 
2221
void
2222
gfc_resolve_rename_sub (gfc_code * c)
2223
{
2224
  const char *name;
2225
  int kind;
2226
 
2227
  if (c->ext.actual->next->next->expr != NULL)
2228
    kind = c->ext.actual->next->next->expr->ts.kind;
2229
  else
2230
    kind = gfc_default_integer_kind;
2231
 
2232
  name = gfc_get_string (PREFIX("rename_i%d_sub"), kind);
2233
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2234
}
2235
 
2236
 
2237
void
2238
gfc_resolve_kill_sub (gfc_code * c)
2239
{
2240
  const char *name;
2241
  int kind;
2242
 
2243
  if (c->ext.actual->next->next->expr != NULL)
2244
    kind = c->ext.actual->next->next->expr->ts.kind;
2245
  else
2246
    kind = gfc_default_integer_kind;
2247
 
2248
  name = gfc_get_string (PREFIX("kill_i%d_sub"), kind);
2249
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2250
}
2251
 
2252
 
2253
void
2254
gfc_resolve_link_sub (gfc_code * c)
2255
{
2256
  const char *name;
2257
  int kind;
2258
 
2259
  if (c->ext.actual->next->next->expr != NULL)
2260
    kind = c->ext.actual->next->next->expr->ts.kind;
2261
  else
2262
    kind = gfc_default_integer_kind;
2263
 
2264
  name = gfc_get_string (PREFIX("link_i%d_sub"), kind);
2265
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2266
}
2267
 
2268
 
2269
void
2270
gfc_resolve_symlnk_sub (gfc_code * c)
2271
{
2272
  const char *name;
2273
  int kind;
2274
 
2275
  if (c->ext.actual->next->next->expr != NULL)
2276
    kind = c->ext.actual->next->next->expr->ts.kind;
2277
  else
2278
    kind = gfc_default_integer_kind;
2279
 
2280
  name = gfc_get_string (PREFIX("symlnk_i%d_sub"), kind);
2281
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2282
}
2283
 
2284
 
2285
/* G77 compatibility subroutines etime() and dtime().  */
2286
 
2287
void
2288
gfc_resolve_etime_sub (gfc_code * c)
2289
{
2290
  const char *name;
2291
 
2292
  name = gfc_get_string (PREFIX("etime_sub"));
2293
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2294
}
2295
 
2296
 
2297
/* G77 compatibility subroutine second().  */
2298
 
2299
void
2300
gfc_resolve_second_sub (gfc_code * c)
2301
{
2302
  const char *name;
2303
 
2304
  name = gfc_get_string (PREFIX("second_sub"));
2305
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2306
}
2307
 
2308
 
2309
void
2310
gfc_resolve_sleep_sub (gfc_code * c)
2311
{
2312
  const char *name;
2313
  int kind;
2314
 
2315
  if (c->ext.actual->expr != NULL)
2316
    kind = c->ext.actual->expr->ts.kind;
2317
  else
2318
    kind = gfc_default_integer_kind;
2319
 
2320
  name = gfc_get_string (PREFIX("sleep_i%d_sub"), kind);
2321
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2322
}
2323
 
2324
 
2325
/* G77 compatibility function srand().  */
2326
 
2327
void
2328
gfc_resolve_srand (gfc_code * c)
2329
{
2330
  const char *name;
2331
  name = gfc_get_string (PREFIX("srand"));
2332
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2333
}
2334
 
2335
 
2336
/* Resolve the getarg intrinsic subroutine.  */
2337
 
2338
void
2339
gfc_resolve_getarg (gfc_code * c)
2340
{
2341
  const char *name;
2342
  int kind;
2343
 
2344
  kind = gfc_default_integer_kind;
2345
  name = gfc_get_string (PREFIX("getarg_i%d"), kind);
2346
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2347
}
2348
 
2349
/* Resolve the getcwd intrinsic subroutine.  */
2350
 
2351
void
2352
gfc_resolve_getcwd_sub (gfc_code * c)
2353
{
2354
  const char *name;
2355
  int kind;
2356
 
2357
  if (c->ext.actual->next->expr != NULL)
2358
    kind = c->ext.actual->next->expr->ts.kind;
2359
  else
2360
    kind = gfc_default_integer_kind;
2361
 
2362
  name = gfc_get_string (PREFIX("getcwd_i%d_sub"), kind);
2363
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2364
}
2365
 
2366
 
2367
/* Resolve the get_command intrinsic subroutine.  */
2368
 
2369
void
2370
gfc_resolve_get_command (gfc_code * c)
2371
{
2372
  const char *name;
2373
  int kind;
2374
 
2375
  kind = gfc_default_integer_kind;
2376
  name = gfc_get_string (PREFIX("get_command_i%d"), kind);
2377
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2378
}
2379
 
2380
 
2381
/* Resolve the get_command_argument intrinsic subroutine.  */
2382
 
2383
void
2384
gfc_resolve_get_command_argument (gfc_code * c)
2385
{
2386
  const char *name;
2387
  int kind;
2388
 
2389
  kind = gfc_default_integer_kind;
2390
  name = gfc_get_string (PREFIX("get_command_argument_i%d"), kind);
2391
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2392
}
2393
 
2394
/* Resolve the get_environment_variable intrinsic subroutine.  */
2395
 
2396
void
2397
gfc_resolve_get_environment_variable (gfc_code * code)
2398
{
2399
  const char *name;
2400
  int kind;
2401
 
2402
  kind = gfc_default_integer_kind;
2403
  name = gfc_get_string (PREFIX("get_environment_variable_i%d"), kind);
2404
  code->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2405
}
2406
 
2407
void
2408
gfc_resolve_signal_sub (gfc_code * c)
2409
{
2410
  const char *name;
2411
  gfc_expr *number, *handler, *status;
2412
  gfc_typespec ts;
2413
 
2414
  number = c->ext.actual->expr;
2415
  handler = c->ext.actual->next->expr;
2416
  status = c->ext.actual->next->next->expr;
2417
  ts.type = BT_INTEGER;
2418
  ts.kind = gfc_c_int_kind;
2419
 
2420
  /* handler can be either BT_INTEGER or BT_PROCEDURE  */
2421
  if (handler->ts.type == BT_INTEGER)
2422
    {
2423
      if (handler->ts.kind != gfc_c_int_kind)
2424
        gfc_convert_type (handler, &ts, 2);
2425
      name = gfc_get_string (PREFIX("signal_sub_int"));
2426
    }
2427
  else
2428
    name = gfc_get_string (PREFIX("signal_sub"));
2429
 
2430
  if (number->ts.kind != gfc_c_int_kind)
2431
    gfc_convert_type (number, &ts, 2);
2432
  if (status != NULL && status->ts.kind != gfc_c_int_kind)
2433
    gfc_convert_type (status, &ts, 2);
2434
 
2435
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2436
}
2437
 
2438
/* Resolve the SYSTEM intrinsic subroutine.  */
2439
 
2440
void
2441
gfc_resolve_system_sub (gfc_code * c)
2442
{
2443
  const char *name;
2444
 
2445
  name = gfc_get_string (PREFIX("system_sub"));
2446
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2447
}
2448
 
2449
/* Determine if the arguments to SYSTEM_CLOCK are INTEGER(4) or INTEGER(8) */
2450
 
2451
void
2452
gfc_resolve_system_clock (gfc_code * c)
2453
{
2454
  const char *name;
2455
  int kind;
2456
 
2457
  if (c->ext.actual->expr != NULL)
2458
    kind = c->ext.actual->expr->ts.kind;
2459
  else if (c->ext.actual->next->expr != NULL)
2460
      kind = c->ext.actual->next->expr->ts.kind;
2461
  else if (c->ext.actual->next->next->expr != NULL)
2462
      kind = c->ext.actual->next->next->expr->ts.kind;
2463
  else
2464
    kind = gfc_default_integer_kind;
2465
 
2466
  name = gfc_get_string (PREFIX("system_clock_%d"), kind);
2467
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2468
}
2469
 
2470
/* Resolve the EXIT intrinsic subroutine.  */
2471
 
2472
void
2473
gfc_resolve_exit (gfc_code * c)
2474
{
2475
  const char *name;
2476
  int kind;
2477
 
2478
  if (c->ext.actual->expr != NULL)
2479
    kind = c->ext.actual->expr->ts.kind;
2480
  else
2481
    kind = gfc_default_integer_kind;
2482
 
2483
  name = gfc_get_string (PREFIX("exit_i%d"), kind);
2484
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2485
}
2486
 
2487
/* Resolve the FLUSH intrinsic subroutine.  */
2488
 
2489
void
2490
gfc_resolve_flush (gfc_code * c)
2491
{
2492
  const char *name;
2493
  gfc_typespec ts;
2494
  gfc_expr *n;
2495
 
2496
  ts.type = BT_INTEGER;
2497
  ts.kind = gfc_default_integer_kind;
2498
  n = c->ext.actual->expr;
2499
  if (n != NULL
2500
      && n->ts.kind != ts.kind)
2501
    gfc_convert_type (n, &ts, 2);
2502
 
2503
  name = gfc_get_string (PREFIX("flush_i%d"), ts.kind);
2504
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2505
}
2506
 
2507
 
2508
void
2509
gfc_resolve_free (gfc_code * c)
2510
{
2511
  gfc_typespec ts;
2512
  gfc_expr *n;
2513
 
2514
  ts.type = BT_INTEGER;
2515
  ts.kind = gfc_index_integer_kind;
2516
  n = c->ext.actual->expr;
2517
  if (n->ts.kind != ts.kind)
2518
    gfc_convert_type (n, &ts, 2);
2519
 
2520
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("free"));
2521
}
2522
 
2523
 
2524
void
2525
gfc_resolve_ctime_sub (gfc_code * c)
2526
{
2527
  gfc_typespec ts;
2528
 
2529
  /* ctime TIME argument is a INTEGER(KIND=8), says the doc */
2530
  if (c->ext.actual->expr->ts.kind != 8)
2531
    {
2532
      ts.type = BT_INTEGER;
2533
      ts.kind = 8;
2534
      ts.derived = NULL;
2535
      ts.cl = NULL;
2536
      gfc_convert_type (c->ext.actual->expr, &ts, 2);
2537
    }
2538
 
2539
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ctime_sub"));
2540
}
2541
 
2542
 
2543
void
2544
gfc_resolve_fdate_sub (gfc_code * c)
2545
{
2546
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("fdate_sub"));
2547
}
2548
 
2549
 
2550
void
2551
gfc_resolve_gerror (gfc_code * c)
2552
{
2553
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("gerror"));
2554
}
2555
 
2556
 
2557
void
2558
gfc_resolve_getlog (gfc_code * c)
2559
{
2560
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("getlog"));
2561
}
2562
 
2563
 
2564
void
2565
gfc_resolve_hostnm_sub (gfc_code * c)
2566
{
2567
  const char *name;
2568
  int kind;
2569
 
2570
  if (c->ext.actual->next->expr != NULL)
2571
    kind = c->ext.actual->next->expr->ts.kind;
2572
  else
2573
    kind = gfc_default_integer_kind;
2574
 
2575
  name = gfc_get_string (PREFIX("hostnm_i%d_sub"), kind);
2576
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2577
}
2578
 
2579
 
2580
void
2581
gfc_resolve_perror (gfc_code * c)
2582
{
2583
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX ("perror_sub"));
2584
}
2585
 
2586
/* Resolve the STAT and FSTAT intrinsic subroutines.  */
2587
 
2588
void
2589
gfc_resolve_stat_sub (gfc_code * c)
2590
{
2591
  const char *name;
2592
 
2593
  name = gfc_get_string (PREFIX("stat_i%d_sub"), gfc_default_integer_kind);
2594
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2595
}
2596
 
2597
 
2598
void
2599
gfc_resolve_fstat_sub (gfc_code * c)
2600
{
2601
  const char *name;
2602
  gfc_expr *u;
2603
  gfc_typespec *ts;
2604
 
2605
  u = c->ext.actual->expr;
2606
  ts = &c->ext.actual->next->expr->ts;
2607
  if (u->ts.kind != ts->kind)
2608
    gfc_convert_type (u, ts, 2);
2609
  name = gfc_get_string (PREFIX("fstat_i%d_sub"), ts->kind);
2610
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2611
}
2612
 
2613
 
2614
void
2615
gfc_resolve_fgetc_sub (gfc_code * c)
2616
{
2617
  const char *name;
2618
  gfc_typespec ts;
2619
  gfc_expr *u, *st;
2620
 
2621
  u = c->ext.actual->expr;
2622
  st = c->ext.actual->next->next->expr;
2623
 
2624
  if (u->ts.kind != gfc_c_int_kind)
2625
    {
2626
      ts.type = BT_INTEGER;
2627
      ts.kind = gfc_c_int_kind;
2628
      ts.derived = NULL;
2629
      ts.cl = NULL;
2630
      gfc_convert_type (u, &ts, 2);
2631
    }
2632
 
2633
  if (st != NULL)
2634
    name = gfc_get_string (PREFIX("fgetc_i%d_sub"), st->ts.kind);
2635
  else
2636
    name = gfc_get_string (PREFIX("fgetc_i%d_sub"), gfc_default_integer_kind);
2637
 
2638
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2639
}
2640
 
2641
 
2642
void
2643
gfc_resolve_fget_sub (gfc_code * c)
2644
{
2645
  const char *name;
2646
  gfc_expr *st;
2647
 
2648
  st = c->ext.actual->next->expr;
2649
  if (st != NULL)
2650
    name = gfc_get_string (PREFIX("fget_i%d_sub"), st->ts.kind);
2651
  else
2652
    name = gfc_get_string (PREFIX("fget_i%d_sub"), gfc_default_integer_kind);
2653
 
2654
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2655
}
2656
 
2657
 
2658
void
2659
gfc_resolve_fputc_sub (gfc_code * c)
2660
{
2661
  const char *name;
2662
  gfc_typespec ts;
2663
  gfc_expr *u, *st;
2664
 
2665
  u = c->ext.actual->expr;
2666
  st = c->ext.actual->next->next->expr;
2667
 
2668
  if (u->ts.kind != gfc_c_int_kind)
2669
    {
2670
      ts.type = BT_INTEGER;
2671
      ts.kind = gfc_c_int_kind;
2672
      ts.derived = NULL;
2673
      ts.cl = NULL;
2674
      gfc_convert_type (u, &ts, 2);
2675
    }
2676
 
2677
  if (st != NULL)
2678
    name = gfc_get_string (PREFIX("fputc_i%d_sub"), st->ts.kind);
2679
  else
2680
    name = gfc_get_string (PREFIX("fputc_i%d_sub"), gfc_default_integer_kind);
2681
 
2682
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2683
}
2684
 
2685
 
2686
void
2687
gfc_resolve_fput_sub (gfc_code * c)
2688
{
2689
  const char *name;
2690
  gfc_expr *st;
2691
 
2692
  st = c->ext.actual->next->expr;
2693
  if (st != NULL)
2694
    name = gfc_get_string (PREFIX("fput_i%d_sub"), st->ts.kind);
2695
  else
2696
    name = gfc_get_string (PREFIX("fput_i%d_sub"), gfc_default_integer_kind);
2697
 
2698
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2699
}
2700
 
2701
 
2702
void
2703
gfc_resolve_ftell_sub (gfc_code * c)
2704
{
2705
  const char *name;
2706
  gfc_expr *unit;
2707
  gfc_expr *offset;
2708
  gfc_typespec ts;
2709
 
2710
  unit = c->ext.actual->expr;
2711
  offset = c->ext.actual->next->expr;
2712
 
2713
  if (unit->ts.kind != gfc_c_int_kind)
2714
    {
2715
      ts.type = BT_INTEGER;
2716
      ts.kind = gfc_c_int_kind;
2717
      ts.derived = NULL;
2718
      ts.cl = NULL;
2719
      gfc_convert_type (unit, &ts, 2);
2720
    }
2721
 
2722
  name = gfc_get_string (PREFIX("ftell_i%d_sub"), offset->ts.kind);
2723
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2724
}
2725
 
2726
 
2727
void
2728
gfc_resolve_ttynam_sub (gfc_code * c)
2729
{
2730
  gfc_typespec ts;
2731
 
2732
  if (c->ext.actual->expr->ts.kind != gfc_c_int_kind)
2733
    {
2734
      ts.type = BT_INTEGER;
2735
      ts.kind = gfc_c_int_kind;
2736
      ts.derived = NULL;
2737
      ts.cl = NULL;
2738
      gfc_convert_type (c->ext.actual->expr, &ts, 2);
2739
    }
2740
 
2741
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (PREFIX("ttynam_sub"));
2742
}
2743
 
2744
 
2745
/* Resolve the UMASK intrinsic subroutine.  */
2746
 
2747
void
2748
gfc_resolve_umask_sub (gfc_code * c)
2749
{
2750
  const char *name;
2751
  int kind;
2752
 
2753
  if (c->ext.actual->next->expr != NULL)
2754
    kind = c->ext.actual->next->expr->ts.kind;
2755
  else
2756
    kind = gfc_default_integer_kind;
2757
 
2758
  name = gfc_get_string (PREFIX("umask_i%d_sub"), kind);
2759
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2760
}
2761
 
2762
/* Resolve the UNLINK intrinsic subroutine.  */
2763
 
2764
void
2765
gfc_resolve_unlink_sub (gfc_code * c)
2766
{
2767
  const char *name;
2768
  int kind;
2769
 
2770
  if (c->ext.actual->next->expr != NULL)
2771
    kind = c->ext.actual->next->expr->ts.kind;
2772
  else
2773
    kind = gfc_default_integer_kind;
2774
 
2775
  name = gfc_get_string (PREFIX("unlink_i%d_sub"), kind);
2776
  c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
2777
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.