OSDN Git Service

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