]> gcc.gnu.org Git - gcc.git/blob - gcc/fortran/intrinsic.c
check.c (gfc_check_getcwd_sub): New function.
[gcc.git] / gcc / fortran / intrinsic.c
1 /* Build up a list of intrinsic subroutines and functions for the
2 name-resolution stage.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
4 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 2, 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 COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA. */
23
24
25 #include "config.h"
26 #include "system.h"
27 #include "flags.h"
28
29 #include <stdio.h>
30 #include <stdarg.h>
31 #include <string.h>
32 #include <gmp.h>
33
34 #include "gfortran.h"
35 #include "intrinsic.h"
36
37
38 /* Nanespace to hold the resolved symbols for intrinsic subroutines. */
39 static gfc_namespace *gfc_intrinsic_namespace;
40
41 int gfc_init_expr = 0;
42
43 /* Pointers to a intrinsic function and its argument names being
44 checked. */
45
46 char *gfc_current_intrinsic, *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
47 locus *gfc_current_intrinsic_where;
48
49 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
50 static gfc_intrinsic_arg *next_arg;
51
52 static int nfunc, nsub, nargs, nconv;
53
54 static enum
55 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
56 sizing;
57
58
59 /* Return a letter based on the passed type. Used to construct the
60 name of a type-dependent subroutine. */
61
62 char
63 gfc_type_letter (bt type)
64 {
65 char c;
66
67 switch (type)
68 {
69 case BT_LOGICAL:
70 c = 'l';
71 break;
72 case BT_CHARACTER:
73 c = 's';
74 break;
75 case BT_INTEGER:
76 c = 'i';
77 break;
78 case BT_REAL:
79 c = 'r';
80 break;
81 case BT_COMPLEX:
82 c = 'c';
83 break;
84
85 default:
86 c = 'u';
87 break;
88 }
89
90 return c;
91 }
92
93
94 /* Get a symbol for a resolved name. */
95
96 gfc_symbol *
97 gfc_get_intrinsic_sub_symbol (const char * name)
98 {
99 gfc_symbol *sym;
100
101 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
102 sym->attr.always_explicit = 1;
103 sym->attr.subroutine = 1;
104 sym->attr.flavor = FL_PROCEDURE;
105 sym->attr.proc = PROC_INTRINSIC;
106
107 return sym;
108 }
109
110
111 /* Return a pointer to the name of a conversion function given two
112 typespecs. */
113
114 static char *
115 conv_name (gfc_typespec * from, gfc_typespec * to)
116 {
117 static char name[30];
118
119 sprintf (name, "__convert_%c%d_%c%d", gfc_type_letter (from->type),
120 from->kind, gfc_type_letter (to->type), to->kind);
121
122 return name;
123 }
124
125
126 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
127 corresponds to the conversion. Returns NULL if the conversion
128 isn't found. */
129
130 static gfc_intrinsic_sym *
131 find_conv (gfc_typespec * from, gfc_typespec * to)
132 {
133 gfc_intrinsic_sym *sym;
134 char *target;
135 int i;
136
137 target = conv_name (from, to);
138 sym = conversion;
139
140 for (i = 0; i < nconv; i++, sym++)
141 if (strcmp (target, sym->name) == 0)
142 return sym;
143
144 return NULL;
145 }
146
147
148 /* Interface to the check functions. We break apart an argument list
149 and call the proper check function rather than forcing each
150 function to manipulate the argument list. */
151
152 static try
153 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
154 {
155 gfc_expr *a1, *a2, *a3, *a4, *a5;
156
157 if (arg == NULL)
158 return (*specific->check.f0) ();
159
160 a1 = arg->expr;
161 arg = arg->next;
162 if (arg == NULL)
163 return (*specific->check.f1) (a1);
164
165 a2 = arg->expr;
166 arg = arg->next;
167 if (arg == NULL)
168 return (*specific->check.f2) (a1, a2);
169
170 a3 = arg->expr;
171 arg = arg->next;
172 if (arg == NULL)
173 return (*specific->check.f3) (a1, a2, a3);
174
175 a4 = arg->expr;
176 arg = arg->next;
177 if (arg == NULL)
178 return (*specific->check.f4) (a1, a2, a3, a4);
179
180 a5 = arg->expr;
181 arg = arg->next;
182 if (arg == NULL)
183 return (*specific->check.f5) (a1, a2, a3, a4, a5);
184
185 gfc_internal_error ("do_check(): too many args");
186 }
187
188
189 /*********** Subroutines to build the intrinsic list ****************/
190
191 /* Add a single intrinsic symbol to the current list.
192
193 Argument list:
194 char * name of function
195 int whether function is elemental
196 int If the function can be used as an actual argument
197 bt return type of function
198 int kind of return type of function
199 check pointer to check function
200 simplify pointer to simplification function
201 resolve pointer to resolution function
202
203 Optional arguments come in multiples of four:
204 char * name of argument
205 bt type of argument
206 int kind of argument
207 int arg optional flag (1=optional, 0=required)
208
209 The sequence is terminated by a NULL name.
210
211 TODO: Are checks on actual_ok implemented elsewhere, or is that just
212 missing here? */
213
214 static void
215 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
216 bt type, int kind, gfc_check_f check, gfc_simplify_f simplify,
217 gfc_resolve_f resolve, ...)
218 {
219
220 int optional, first_flag;
221 va_list argp;
222
223 switch (sizing)
224 {
225 case SZ_SUBS:
226 nsub++;
227 break;
228
229 case SZ_FUNCS:
230 nfunc++;
231 break;
232
233 case SZ_NOTHING:
234 strcpy (next_sym->name, name);
235
236 strcpy (next_sym->lib_name, "_gfortran_");
237 strcat (next_sym->lib_name, name);
238
239 next_sym->elemental = elemental;
240 next_sym->ts.type = type;
241 next_sym->ts.kind = kind;
242 next_sym->simplify = simplify;
243 next_sym->check = check;
244 next_sym->resolve = resolve;
245 next_sym->specific = 0;
246 next_sym->generic = 0;
247 break;
248
249 default:
250 gfc_internal_error ("add_sym(): Bad sizing mode");
251 }
252
253 va_start (argp, resolve);
254
255 first_flag = 1;
256
257 for (;;)
258 {
259 name = va_arg (argp, char *);
260 if (name == NULL)
261 break;
262
263 type = (bt) va_arg (argp, int);
264 kind = va_arg (argp, int);
265 optional = va_arg (argp, int);
266
267 if (sizing != SZ_NOTHING)
268 nargs++;
269 else
270 {
271 next_arg++;
272
273 if (first_flag)
274 next_sym->formal = next_arg;
275 else
276 (next_arg - 1)->next = next_arg;
277
278 first_flag = 0;
279
280 strcpy (next_arg->name, name);
281 next_arg->ts.type = type;
282 next_arg->ts.kind = kind;
283 next_arg->optional = optional;
284 }
285 }
286
287 va_end (argp);
288
289 next_sym++;
290 }
291
292
293 static void add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
294 int kind,
295 try (*check)(void),
296 gfc_expr *(*simplify)(void),
297 void (*resolve)(gfc_expr *)
298 ) {
299 gfc_simplify_f sf;
300 gfc_check_f cf;
301 gfc_resolve_f rf;
302
303 cf.f0 = check;
304 sf.f0 = simplify;
305 rf.f0 = resolve;
306
307 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
308 (void*)0);
309 }
310
311
312 static void add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
313 int kind,
314 try (*check)(gfc_expr *),
315 gfc_expr *(*simplify)(gfc_expr *),
316 void (*resolve)(gfc_expr *,gfc_expr *),
317 const char* a1, bt type1, int kind1, int optional1
318 ) {
319 gfc_check_f cf;
320 gfc_simplify_f sf;
321 gfc_resolve_f rf;
322
323 cf.f1 = check;
324 sf.f1 = simplify;
325 rf.f1 = resolve;
326
327 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
328 a1, type1, kind1, optional1,
329 (void*)0);
330 }
331
332
333 static void
334 add_sym_0s (const char * name, int actual_ok,
335 void (*resolve)(gfc_code *))
336 {
337 gfc_check_f cf;
338 gfc_simplify_f sf;
339 gfc_resolve_f rf;
340
341 cf.f1 = NULL;
342 sf.f1 = NULL;
343 rf.s1 = resolve;
344
345 add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, cf, sf, rf,
346 (void*)0);
347 }
348
349
350 static void add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
351 int kind,
352 try (*check)(gfc_expr *),
353 gfc_expr *(*simplify)(gfc_expr *),
354 void (*resolve)(gfc_code *),
355 const char* a1, bt type1, int kind1, int optional1
356 ) {
357 gfc_check_f cf;
358 gfc_simplify_f sf;
359 gfc_resolve_f rf;
360
361 cf.f1 = check;
362 sf.f1 = simplify;
363 rf.s1 = resolve;
364
365 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
366 a1, type1, kind1, optional1,
367 (void*)0);
368 }
369
370
371 static void add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
372 int kind,
373 try (*check)(gfc_actual_arglist *),
374 gfc_expr *(*simplify)(gfc_expr *),
375 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
376 const char* a1, bt type1, int kind1, int optional1,
377 const char* a2, bt type2, int kind2, int optional2
378 ) {
379 gfc_check_f cf;
380 gfc_simplify_f sf;
381 gfc_resolve_f rf;
382
383 cf.f1m = check;
384 sf.f1 = simplify;
385 rf.f1m = resolve;
386
387 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
388 a1, type1, kind1, optional1,
389 a2, type2, kind2, optional2,
390 (void*)0);
391 }
392
393
394 static void add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
395 int kind,
396 try (*check)(gfc_expr *,gfc_expr *),
397 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
398 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
399 const char* a1, bt type1, int kind1, int optional1,
400 const char* a2, bt type2, int kind2, int optional2
401 ) {
402 gfc_check_f cf;
403 gfc_simplify_f sf;
404 gfc_resolve_f rf;
405
406 cf.f2 = check;
407 sf.f2 = simplify;
408 rf.f2 = resolve;
409
410 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
411 a1, type1, kind1, optional1,
412 a2, type2, kind2, optional2,
413 (void*)0);
414 }
415
416
417 /* Add the name of an intrinsic subroutine with two arguments to the list
418 of intrinsic names. */
419
420 static void add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
421 int kind,
422 try (*check)(gfc_expr *,gfc_expr *),
423 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
424 void (*resolve)(gfc_code *),
425 const char* a1, bt type1, int kind1, int optional1,
426 const char* a2, bt type2, int kind2, int optional2
427 ) {
428 gfc_check_f cf;
429 gfc_simplify_f sf;
430 gfc_resolve_f rf;
431
432 cf.f2 = check;
433 sf.f2 = simplify;
434 rf.s1 = resolve;
435
436 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
437 a1, type1, kind1, optional1,
438 a2, type2, kind2, optional2,
439 (void*)0);
440 }
441
442
443 static void add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
444 int kind,
445 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
446 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
447 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
448 const char* a1, bt type1, int kind1, int optional1,
449 const char* a2, bt type2, int kind2, int optional2,
450 const char* a3, bt type3, int kind3, int optional3
451 ) {
452 gfc_check_f cf;
453 gfc_simplify_f sf;
454 gfc_resolve_f rf;
455
456 cf.f3 = check;
457 sf.f3 = simplify;
458 rf.f3 = resolve;
459
460 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
461 a1, type1, kind1, optional1,
462 a2, type2, kind2, optional2,
463 a3, type3, kind3, optional3,
464 (void*)0);
465 }
466
467 /* MINLOC and MAXLOC get special treatment because their argument
468 might have to be reordered. */
469
470 static void add_sym_3ml (const char *name, int elemental,
471 int actual_ok, bt type, int kind,
472 try (*check)(gfc_actual_arglist *),
473 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
474 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
475 const char* a1, bt type1, int kind1, int optional1,
476 const char* a2, bt type2, int kind2, int optional2,
477 const char* a3, bt type3, int kind3, int optional3
478 ) {
479 gfc_check_f cf;
480 gfc_simplify_f sf;
481 gfc_resolve_f rf;
482
483 cf.f3ml = check;
484 sf.f3 = simplify;
485 rf.f3 = resolve;
486
487 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
488 a1, type1, kind1, optional1,
489 a2, type2, kind2, optional2,
490 a3, type3, kind3, optional3,
491 (void*)0);
492 }
493
494 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
495 their argument also might have to be reordered. */
496
497 static void add_sym_3red (const char *name, int elemental,
498 int actual_ok, bt type, int kind,
499 try (*check)(gfc_actual_arglist *),
500 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
501 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
502 const char* a1, bt type1, int kind1, int optional1,
503 const char* a2, bt type2, int kind2, int optional2,
504 const char* a3, bt type3, int kind3, int optional3
505 ) {
506 gfc_check_f cf;
507 gfc_simplify_f sf;
508 gfc_resolve_f rf;
509
510 cf.f3red = check;
511 sf.f3 = simplify;
512 rf.f3 = resolve;
513
514 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
515 a1, type1, kind1, optional1,
516 a2, type2, kind2, optional2,
517 a3, type3, kind3, optional3,
518 (void*)0);
519 }
520
521 /* Add the name of an intrinsic subroutine with three arguments to the list
522 of intrinsic names. */
523
524 static void add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
525 int kind,
526 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
527 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
528 void (*resolve)(gfc_code *),
529 const char* a1, bt type1, int kind1, int optional1,
530 const char* a2, bt type2, int kind2, int optional2,
531 const char* a3, bt type3, int kind3, int optional3
532 ) {
533 gfc_check_f cf;
534 gfc_simplify_f sf;
535 gfc_resolve_f rf;
536
537 cf.f3 = check;
538 sf.f3 = simplify;
539 rf.s1 = resolve;
540
541 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
542 a1, type1, kind1, optional1,
543 a2, type2, kind2, optional2,
544 a3, type3, kind3, optional3,
545 (void*)0);
546 }
547
548
549 static void add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
550 int kind,
551 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
552 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
553 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
554 const char* a1, bt type1, int kind1, int optional1,
555 const char* a2, bt type2, int kind2, int optional2,
556 const char* a3, bt type3, int kind3, int optional3,
557 const char* a4, bt type4, int kind4, int optional4
558 ) {
559 gfc_check_f cf;
560 gfc_simplify_f sf;
561 gfc_resolve_f rf;
562
563 cf.f4 = check;
564 sf.f4 = simplify;
565 rf.f4 = resolve;
566
567 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
568 a1, type1, kind1, optional1,
569 a2, type2, kind2, optional2,
570 a3, type3, kind3, optional3,
571 a4, type4, kind4, optional4,
572 (void*)0);
573 }
574
575
576 static void add_sym_4s (const char *name, int elemental, int actual_ok,
577 bt type, int kind,
578 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
579 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
580 void (*resolve)(gfc_code *),
581 const char* a1, bt type1, int kind1, int optional1,
582 const char* a2, bt type2, int kind2, int optional2,
583 const char* a3, bt type3, int kind3, int optional3,
584 const char* a4, bt type4, int kind4, int optional4)
585 {
586 gfc_check_f cf;
587 gfc_simplify_f sf;
588 gfc_resolve_f rf;
589
590 cf.f4 = check;
591 sf.f4 = simplify;
592 rf.s1 = resolve;
593
594 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
595 a1, type1, kind1, optional1,
596 a2, type2, kind2, optional2,
597 a3, type3, kind3, optional3,
598 a4, type4, kind4, optional4,
599 (void*)0);
600 }
601
602
603 static void add_sym_5 (const char *name, int elemental, int actual_ok, bt type,
604 int kind,
605 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
606 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
607 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
608 const char* a1, bt type1, int kind1, int optional1,
609 const char* a2, bt type2, int kind2, int optional2,
610 const char* a3, bt type3, int kind3, int optional3,
611 const char* a4, bt type4, int kind4, int optional4,
612 const char* a5, bt type5, int kind5, int optional5
613 ) {
614 gfc_check_f cf;
615 gfc_simplify_f sf;
616 gfc_resolve_f rf;
617
618 cf.f5 = check;
619 sf.f5 = simplify;
620 rf.f5 = resolve;
621
622 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
623 a1, type1, kind1, optional1,
624 a2, type2, kind2, optional2,
625 a3, type3, kind3, optional3,
626 a4, type4, kind4, optional4,
627 a5, type5, kind5, optional5,
628 (void*)0);
629 }
630
631
632 static void add_sym_5s
633 (
634 const char *name, int elemental, int actual_ok, bt type, int kind,
635 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
636 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
637 void (*resolve)(gfc_code *),
638 const char* a1, bt type1, int kind1, int optional1,
639 const char* a2, bt type2, int kind2, int optional2,
640 const char* a3, bt type3, int kind3, int optional3,
641 const char* a4, bt type4, int kind4, int optional4,
642 const char* a5, bt type5, int kind5, int optional5)
643 {
644 gfc_check_f cf;
645 gfc_simplify_f sf;
646 gfc_resolve_f rf;
647
648 cf.f5 = check;
649 sf.f5 = simplify;
650 rf.s1 = resolve;
651
652 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
653 a1, type1, kind1, optional1,
654 a2, type2, kind2, optional2,
655 a3, type3, kind3, optional3,
656 a4, type4, kind4, optional4,
657 a5, type5, kind5, optional5,
658 (void*)0);
659 }
660
661
662 /* Locate an intrinsic symbol given a base pointer, number of elements
663 in the table and a pointer to a name. Returns the NULL pointer if
664 a name is not found. */
665
666 static gfc_intrinsic_sym *
667 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
668 {
669
670 while (n > 0)
671 {
672 if (strcmp (name, start->name) == 0)
673 return start;
674
675 start++;
676 n--;
677 }
678
679 return NULL;
680 }
681
682
683 /* Given a name, find a function in the intrinsic function table.
684 Returns NULL if not found. */
685
686 gfc_intrinsic_sym *
687 gfc_find_function (const char *name)
688 {
689
690 return find_sym (functions, nfunc, name);
691 }
692
693
694 /* Given a name, find a function in the intrinsic subroutine table.
695 Returns NULL if not found. */
696
697 static gfc_intrinsic_sym *
698 find_subroutine (const char *name)
699 {
700
701 return find_sym (subroutines, nsub, name);
702 }
703
704
705 /* Given a string, figure out if it is the name of a generic intrinsic
706 function or not. */
707
708 int
709 gfc_generic_intrinsic (const char *name)
710 {
711 gfc_intrinsic_sym *sym;
712
713 sym = gfc_find_function (name);
714 return (sym == NULL) ? 0 : sym->generic;
715 }
716
717
718 /* Given a string, figure out if it is the name of a specific
719 intrinsic function or not. */
720
721 int
722 gfc_specific_intrinsic (const char *name)
723 {
724 gfc_intrinsic_sym *sym;
725
726 sym = gfc_find_function (name);
727 return (sym == NULL) ? 0 : sym->specific;
728 }
729
730
731 /* Given a string, figure out if it is the name of an intrinsic
732 subroutine or function. There are no generic intrinsic
733 subroutines, they are all specific. */
734
735 int
736 gfc_intrinsic_name (const char *name, int subroutine_flag)
737 {
738
739 return subroutine_flag ?
740 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
741 }
742
743
744 /* Collect a set of intrinsic functions into a generic collection.
745 The first argument is the name of the generic function, which is
746 also the name of a specific function. The rest of the specifics
747 currently in the table are placed into the list of specific
748 functions associated with that generic. */
749
750 static void
751 make_generic (const char *name, gfc_generic_isym_id generic_id)
752 {
753 gfc_intrinsic_sym *g;
754
755 if (sizing != SZ_NOTHING)
756 return;
757
758 g = gfc_find_function (name);
759 if (g == NULL)
760 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
761 name);
762
763 g->generic = 1;
764 g->specific = 1;
765 g->generic_id = generic_id;
766 if ((g + 1)->name[0] != '\0')
767 g->specific_head = g + 1;
768 g++;
769
770 while (g->name[0] != '\0')
771 {
772 g->next = g + 1;
773 g->specific = 1;
774 g->generic_id = generic_id;
775 g++;
776 }
777
778 g--;
779 g->next = NULL;
780 }
781
782
783 /* Create a duplicate intrinsic function entry for the current
784 function, the only difference being the alternate name. Note that
785 we use argument lists more than once, but all argument lists are
786 freed as a single block. */
787
788 static void
789 make_alias (const char *name)
790 {
791
792 switch (sizing)
793 {
794 case SZ_FUNCS:
795 nfunc++;
796 break;
797
798 case SZ_SUBS:
799 nsub++;
800 break;
801
802 case SZ_NOTHING:
803 next_sym[0] = next_sym[-1];
804 strcpy (next_sym->name, name);
805 next_sym++;
806 break;
807
808 default:
809 break;
810 }
811 }
812
813
814 /* Add intrinsic functions. */
815
816 static void
817 add_functions (void)
818 {
819
820 /* Argument names as in the standard (to be used as argument keywords). */
821 const char
822 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
823 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
824 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
825 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
826 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
827 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
828 *p = "p", *ar = "array", *shp = "shape", *src = "source",
829 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
830 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
831 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
832 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
833 *z = "z", *ln = "len";
834
835 int di, dr, dd, dl, dc, dz, ii;
836
837 di = gfc_default_integer_kind;
838 dr = gfc_default_real_kind;
839 dd = gfc_default_double_kind;
840 dl = gfc_default_logical_kind;
841 dc = gfc_default_character_kind;
842 dz = gfc_default_complex_kind;
843 ii = gfc_index_integer_kind;
844
845 add_sym_1 ("abs", 1, 1, BT_REAL, dr,
846 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
847 a, BT_REAL, dr, 0);
848
849 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di,
850 NULL, gfc_simplify_abs, gfc_resolve_abs,
851 a, BT_INTEGER, di, 0);
852
853 add_sym_1 ("dabs", 1, 1, BT_REAL, dd,
854 NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_REAL, dd, 0);
855
856 add_sym_1 ("cabs", 1, 1, BT_REAL, dr,
857 NULL, gfc_simplify_abs, gfc_resolve_abs,
858 a, BT_COMPLEX, dz, 0);
859
860 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_COMPLEX, dd, 0); /* Extension */
861
862 make_alias ("cdabs");
863
864 make_generic ("abs", GFC_ISYM_ABS);
865
866 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc,
867 NULL, gfc_simplify_achar, NULL, i, BT_INTEGER, di, 0);
868
869 make_generic ("achar", GFC_ISYM_ACHAR);
870
871 add_sym_1 ("acos", 1, 1, BT_REAL, dr,
872 NULL, gfc_simplify_acos, gfc_resolve_acos,
873 x, BT_REAL, dr, 0);
874
875 add_sym_1 ("dacos", 1, 1, BT_REAL, dd,
876 NULL, gfc_simplify_acos, gfc_resolve_acos,
877 x, BT_REAL, dd, 0);
878
879 make_generic ("acos", GFC_ISYM_ACOS);
880
881 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc,
882 NULL, gfc_simplify_adjustl, NULL, stg, BT_CHARACTER, dc, 0);
883
884 make_generic ("adjustl", GFC_ISYM_ADJUSTL);
885
886 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc,
887 NULL, gfc_simplify_adjustr, NULL, stg, BT_CHARACTER, dc, 0);
888
889 make_generic ("adjustr", GFC_ISYM_ADJUSTR);
890
891 add_sym_1 ("aimag", 1, 1, BT_REAL, dr,
892 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
893 z, BT_COMPLEX, dz, 0);
894
895 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, NULL, gfc_simplify_aimag, gfc_resolve_aimag, z, BT_COMPLEX, dd, 0); /* Extension */
896
897 make_generic ("aimag", GFC_ISYM_AIMAG);
898
899 add_sym_2 ("aint", 1, 1, BT_REAL, dr,
900 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
901 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
902
903 add_sym_1 ("dint", 1, 1, BT_REAL, dd,
904 NULL, gfc_simplify_dint, gfc_resolve_dint,
905 a, BT_REAL, dd, 0);
906
907 make_generic ("aint", GFC_ISYM_AINT);
908
909 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0,
910 gfc_check_all_any, NULL, gfc_resolve_all,
911 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
912
913 make_generic ("all", GFC_ISYM_ALL);
914
915 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl,
916 gfc_check_allocated, NULL, NULL, ar, BT_UNKNOWN, 0, 0);
917
918 make_generic ("allocated", GFC_ISYM_ALLOCATED);
919
920 add_sym_2 ("anint", 1, 1, BT_REAL, dr,
921 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
922 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
923
924 add_sym_1 ("dnint", 1, 1, BT_REAL, dd,
925 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
926 a, BT_REAL, dd, 0);
927
928 make_generic ("anint", GFC_ISYM_ANINT);
929
930 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0,
931 gfc_check_all_any, NULL, gfc_resolve_any,
932 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
933
934 make_generic ("any", GFC_ISYM_ANY);
935
936 add_sym_1 ("asin", 1, 1, BT_REAL, dr,
937 NULL, gfc_simplify_asin, gfc_resolve_asin,
938 x, BT_REAL, dr, 0);
939
940 add_sym_1 ("dasin", 1, 1, BT_REAL, dd,
941 NULL, gfc_simplify_asin, gfc_resolve_asin,
942 x, BT_REAL, dd, 0);
943
944 make_generic ("asin", GFC_ISYM_ASIN);
945
946 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl,
947 gfc_check_associated, NULL, NULL,
948 pt, BT_UNKNOWN, 0, 0, tg, BT_UNKNOWN, 0, 1);
949
950 make_generic ("associated", GFC_ISYM_ASSOCIATED);
951
952 add_sym_1 ("atan", 1, 1, BT_REAL, dr,
953 NULL, gfc_simplify_atan, gfc_resolve_atan,
954 x, BT_REAL, dr, 0);
955
956 add_sym_1 ("datan", 1, 1, BT_REAL, dd,
957 NULL, gfc_simplify_atan, gfc_resolve_atan,
958 x, BT_REAL, dd, 0);
959
960 make_generic ("atan", GFC_ISYM_ATAN);
961
962 add_sym_2 ("atan2", 1, 1, BT_REAL, dr,
963 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
964 y, BT_REAL, dr, 0, x, BT_REAL, dr, 0);
965
966 add_sym_2 ("datan2", 1, 1, BT_REAL, dd,
967 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
968 y, BT_REAL, dd, 0, x, BT_REAL, dd, 0);
969
970 make_generic ("atan2", GFC_ISYM_ATAN2);
971
972 /* Bessel and Neumann functions for G77 compatibility. */
973
974 add_sym_1 ("besj0", 1, 0, BT_REAL, dr,
975 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
976 x, BT_REAL, dr, 0);
977
978 add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd,
979 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
980 x, BT_REAL, dd, 0);
981
982 make_generic ("besj0", GFC_ISYM_J0);
983
984 add_sym_1 ("besj1", 1, 0, BT_REAL, dr,
985 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
986 x, BT_REAL, dr, 1);
987
988 add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd,
989 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
990 x, BT_REAL, dd, 1);
991
992 make_generic ("besj1", GFC_ISYM_J1);
993
994 add_sym_2 ("besjn", 1, 0, BT_REAL, dr,
995 gfc_check_besn, NULL, gfc_resolve_besn, n, BT_INTEGER, di, 1,
996 x, BT_REAL, dr, 1);
997
998 add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd,
999 gfc_check_besn, NULL, gfc_resolve_besn, n, BT_INTEGER, di, 1,
1000 x, BT_REAL, dd, 1);
1001
1002 make_generic ("besjn", GFC_ISYM_JN);
1003
1004 add_sym_1 ("besy0", 1, 0, BT_REAL, dr,
1005 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1006 x, BT_REAL, dr, 0);
1007
1008 add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd,
1009 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1010 x, BT_REAL, dd, 0);
1011
1012 make_generic ("besy0", GFC_ISYM_Y0);
1013
1014 add_sym_1 ("besy1", 1, 0, BT_REAL, dr,
1015 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1016 x, BT_REAL, dr, 1);
1017
1018 add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd,
1019 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1020 x, BT_REAL, dd, 1);
1021
1022 make_generic ("besy1", GFC_ISYM_Y1);
1023
1024 add_sym_2 ("besyn", 1, 0, BT_REAL, dr,
1025 gfc_check_besn, NULL, gfc_resolve_besn, n, BT_INTEGER, di, 1,
1026 x, BT_REAL, dr, 1);
1027
1028 add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd,
1029 gfc_check_besn, NULL, gfc_resolve_besn, n, BT_INTEGER, di, 1,
1030 x, BT_REAL, dd, 1);
1031
1032 make_generic ("besyn", GFC_ISYM_YN);
1033
1034 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di,
1035 gfc_check_i, gfc_simplify_bit_size, NULL,
1036 i, BT_INTEGER, di, 0);
1037
1038 make_generic ("bit_size", GFC_ISYM_NONE);
1039
1040 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl,
1041 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1042 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1043
1044 make_generic ("btest", GFC_ISYM_BTEST);
1045
1046 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di,
1047 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1048 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1049
1050 make_generic ("ceiling", GFC_ISYM_CEILING);
1051
1052 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc,
1053 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1054 i, BT_INTEGER, di, 0, kind, BT_INTEGER, di, 1);
1055
1056 make_generic ("char", GFC_ISYM_CHAR);
1057
1058 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz,
1059 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1060 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 1,
1061 kind, BT_INTEGER, di, 1);
1062
1063 make_generic ("cmplx", GFC_ISYM_CMPLX);
1064
1065 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1066 complex instead of the default complex. */
1067
1068 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd,
1069 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1070 x, BT_REAL, dd, 0, y, BT_REAL, dd, 1); /* Extension */
1071
1072 make_generic ("dcmplx", GFC_ISYM_CMPLX);
1073
1074 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz,
1075 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1076 z, BT_COMPLEX, dz, 0);
1077
1078 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_conjg, gfc_resolve_conjg, z, BT_COMPLEX, dd, 0); /* Extension */
1079
1080 make_generic ("conjg", GFC_ISYM_CONJG);
1081
1082 add_sym_1 ("cos", 1, 1, BT_REAL, dr,
1083 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dr, 0);
1084
1085 add_sym_1 ("dcos", 1, 1, BT_REAL, dd,
1086 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dd, 0);
1087
1088 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz,
1089 NULL, gfc_simplify_cos, gfc_resolve_cos,
1090 x, BT_COMPLEX, dz, 0);
1091
1092 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_COMPLEX, dd, 0); /* Extension */
1093
1094 make_alias ("cdcos");
1095
1096 make_generic ("cos", GFC_ISYM_COS);
1097
1098 add_sym_1 ("cosh", 1, 1, BT_REAL, dr,
1099 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1100 x, BT_REAL, dr, 0);
1101
1102 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd,
1103 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1104 x, BT_REAL, dd, 0);
1105
1106 make_generic ("cosh", GFC_ISYM_COSH);
1107
1108 add_sym_2 ("count", 0, 1, BT_INTEGER, di,
1109 gfc_check_count, NULL, gfc_resolve_count,
1110 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
1111
1112 make_generic ("count", GFC_ISYM_COUNT);
1113
1114 add_sym_3 ("cshift", 0, 1, BT_REAL, dr,
1115 gfc_check_cshift, NULL, gfc_resolve_cshift,
1116 ar, BT_REAL, dr, 0, sh, BT_INTEGER, di, 0,
1117 dm, BT_INTEGER, ii, 1);
1118
1119 make_generic ("cshift", GFC_ISYM_CSHIFT);
1120
1121 add_sym_1 ("dble", 1, 1, BT_REAL, dd,
1122 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1123 a, BT_REAL, dr, 0);
1124
1125 make_alias ("dfloat");
1126
1127 make_generic ("dble", GFC_ISYM_DBLE);
1128
1129 add_sym_1 ("digits", 0, 1, BT_INTEGER, di,
1130 gfc_check_digits, gfc_simplify_digits, NULL,
1131 x, BT_UNKNOWN, dr, 0);
1132
1133 make_generic ("digits", GFC_ISYM_NONE);
1134
1135 add_sym_2 ("dim", 1, 1, BT_REAL, dr,
1136 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1137 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 0);
1138
1139 add_sym_2 ("idim", 1, 1, BT_INTEGER, di,
1140 NULL, gfc_simplify_dim, gfc_resolve_dim,
1141 x, BT_INTEGER, di, 0, y, BT_INTEGER, di, 0);
1142
1143 add_sym_2 ("ddim", 1, 1, BT_REAL, dd,
1144 NULL, gfc_simplify_dim, gfc_resolve_dim,
1145 x, BT_REAL, dd, 0, y, BT_REAL, dd, 0);
1146
1147 make_generic ("dim", GFC_ISYM_DIM);
1148
1149 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0,
1150 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1151 va, BT_REAL, dr, 0, vb, BT_REAL, dr, 0);
1152
1153 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT);
1154
1155 add_sym_2 ("dprod", 1, 1, BT_REAL, dd,
1156 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1157 x, BT_REAL, dr, 0, y, BT_REAL, dr, 0);
1158
1159 make_generic ("dprod", GFC_ISYM_DPROD);
1160
1161 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, NULL, NULL, NULL, a, BT_COMPLEX, dd, 0); /* Extension */
1162
1163 make_generic ("dreal", GFC_ISYM_REAL);
1164
1165 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr,
1166 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1167 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, 0,
1168 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, 1);
1169
1170 make_generic ("eoshift", GFC_ISYM_EOSHIFT);
1171
1172 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr,
1173 gfc_check_x, gfc_simplify_epsilon, NULL,
1174 x, BT_REAL, dr, 0);
1175
1176 make_generic ("epsilon", GFC_ISYM_NONE);
1177
1178 /* G77 compatibility for the ERF() and ERFC() functions. */
1179 add_sym_1 ("erf", 1, 0, BT_REAL, dr,
1180 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1181 x, BT_REAL, dr, 0);
1182
1183 add_sym_1 ("derf", 1, 0, BT_REAL, dd,
1184 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1185 x, BT_REAL, dd, 0);
1186
1187 make_generic ("erf", GFC_ISYM_ERF);
1188
1189 add_sym_1 ("erfc", 1, 0, BT_REAL, dr,
1190 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1191 x, BT_REAL, dr, 0);
1192
1193 add_sym_1 ("derfc", 1, 0, BT_REAL, dd,
1194 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1195 x, BT_REAL, dd, 0);
1196
1197 make_generic ("erfc", GFC_ISYM_ERFC);
1198
1199 /* G77 compatibility */
1200 add_sym_1 ("etime", 0, 1, BT_REAL, 4,
1201 gfc_check_etime, NULL, NULL,
1202 x, BT_REAL, 4, 0);
1203
1204 make_alias ("dtime");
1205
1206 make_generic ("etime", GFC_ISYM_ETIME);
1207
1208
1209 add_sym_1 ("exp", 1, 1, BT_REAL, dr,
1210 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dr, 0);
1211
1212 add_sym_1 ("dexp", 1, 1, BT_REAL, dd,
1213 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dd, 0);
1214
1215 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz,
1216 NULL, gfc_simplify_exp, gfc_resolve_exp,
1217 x, BT_COMPLEX, dz, 0);
1218
1219 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_COMPLEX, dd, 0); /* Extension */
1220
1221 make_alias ("cdexp");
1222
1223 make_generic ("exp", GFC_ISYM_EXP);
1224
1225 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di,
1226 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1227 x, BT_REAL, dr, 0);
1228
1229 make_generic ("exponent", GFC_ISYM_EXPONENT);
1230
1231 add_sym_2 ("floor", 1, 1, BT_INTEGER, di,
1232 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1233 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1234
1235 make_generic ("floor", GFC_ISYM_FLOOR);
1236
1237 add_sym_1 ("fraction", 1, 1, BT_REAL, dr,
1238 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1239 x, BT_REAL, dr, 0);
1240
1241 make_generic ("fraction", GFC_ISYM_FRACTION);
1242
1243 /* Unix IDs (g77 compatibility) */
1244 add_sym_1 ("getcwd", 0, 1, BT_INTEGER, di, NULL, NULL, gfc_resolve_getcwd,
1245 c, BT_CHARACTER, dc, 0);
1246 make_generic ("getcwd", GFC_ISYM_GETCWD);
1247
1248 add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getgid);
1249 make_generic ("getgid", GFC_ISYM_GETGID);
1250
1251 add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getpid);
1252 make_generic ("getpid", GFC_ISYM_GETPID);
1253
1254 add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, NULL, NULL, gfc_resolve_getuid);
1255 make_generic ("getuid", GFC_ISYM_GETUID);
1256
1257 add_sym_1 ("huge", 0, 1, BT_REAL, dr,
1258 gfc_check_huge, gfc_simplify_huge, NULL,
1259 x, BT_UNKNOWN, dr, 0);
1260
1261 make_generic ("huge", GFC_ISYM_NONE);
1262
1263 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di,
1264 NULL, gfc_simplify_iachar, NULL, c, BT_CHARACTER, dc, 0);
1265
1266 make_generic ("iachar", GFC_ISYM_IACHAR);
1267
1268 add_sym_2 ("iand", 1, 1, BT_INTEGER, di,
1269 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1270 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1271
1272 make_generic ("iand", GFC_ISYM_IAND);
1273
1274 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, NULL, NULL, NULL); /* Extension, takes no arguments */
1275 make_generic ("iargc", GFC_ISYM_IARGC);
1276
1277 add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, NULL, NULL, NULL);
1278 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT);
1279
1280 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di,
1281 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1282 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1283
1284 make_generic ("ibclr", GFC_ISYM_IBCLR);
1285
1286 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di,
1287 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1288 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0,
1289 ln, BT_INTEGER, di, 0);
1290
1291 make_generic ("ibits", GFC_ISYM_IBITS);
1292
1293 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di,
1294 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1295 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1296
1297 make_generic ("ibset", GFC_ISYM_IBSET);
1298
1299 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di,
1300 NULL, gfc_simplify_ichar, gfc_resolve_ichar,
1301 c, BT_CHARACTER, dc, 0);
1302
1303 make_generic ("ichar", GFC_ISYM_ICHAR);
1304
1305 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di,
1306 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1307 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1308
1309 make_generic ("ieor", GFC_ISYM_IEOR);
1310
1311 add_sym_3 ("index", 1, 1, BT_INTEGER, di,
1312 gfc_check_index, gfc_simplify_index, NULL,
1313 stg, BT_CHARACTER, dc, 0, ssg, BT_CHARACTER, dc, 0,
1314 bck, BT_LOGICAL, dl, 1);
1315
1316 make_generic ("index", GFC_ISYM_INDEX);
1317
1318 add_sym_2 ("int", 1, 1, BT_INTEGER, di,
1319 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1320 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1321
1322 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di,
1323 NULL, gfc_simplify_ifix, NULL, a, BT_REAL, dr, 0);
1324
1325 add_sym_1 ("idint", 1, 0, BT_INTEGER, di,
1326 NULL, gfc_simplify_idint, NULL, a, BT_REAL, dd, 0);
1327
1328 make_generic ("int", GFC_ISYM_INT);
1329
1330 add_sym_2 ("ior", 1, 1, BT_INTEGER, di,
1331 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1332 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1333
1334 make_generic ("ior", GFC_ISYM_IOR);
1335
1336 /* The following function is for G77 compatibility. */
1337 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4,
1338 gfc_check_irand, NULL, NULL,
1339 i, BT_INTEGER, 4, 0);
1340
1341 make_generic ("irand", GFC_ISYM_IRAND);
1342
1343 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di,
1344 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1345 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0);
1346
1347 make_generic ("ishft", GFC_ISYM_ISHFT);
1348
1349 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di,
1350 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1351 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0,
1352 sz, BT_INTEGER, di, 1);
1353
1354 make_generic ("ishftc", GFC_ISYM_ISHFTC);
1355
1356 add_sym_1 ("kind", 0, 1, BT_INTEGER, di,
1357 gfc_check_kind, gfc_simplify_kind, NULL, x, BT_REAL, dr, 0);
1358
1359 make_generic ("kind", GFC_ISYM_NONE);
1360
1361 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di,
1362 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1363 ar, BT_REAL, dr, 0, dm, BT_INTEGER, di, 1);
1364
1365 make_generic ("lbound", GFC_ISYM_LBOUND);
1366
1367 add_sym_1 ("len", 0, 1, BT_INTEGER, di,
1368 NULL, gfc_simplify_len, gfc_resolve_len,
1369 stg, BT_CHARACTER, dc, 0);
1370
1371 make_generic ("len", GFC_ISYM_LEN);
1372
1373 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di,
1374 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1375 stg, BT_CHARACTER, dc, 0);
1376
1377 make_generic ("len_trim", GFC_ISYM_LEN_TRIM);
1378
1379 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl,
1380 NULL, gfc_simplify_lge, NULL,
1381 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1382
1383 make_generic ("lge", GFC_ISYM_LGE);
1384
1385 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl,
1386 NULL, gfc_simplify_lgt, NULL,
1387 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1388
1389 make_generic ("lgt", GFC_ISYM_LGT);
1390
1391 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl,
1392 NULL, gfc_simplify_lle, NULL,
1393 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1394
1395 make_generic ("lle", GFC_ISYM_LLE);
1396
1397 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl,
1398 NULL, gfc_simplify_llt, NULL,
1399 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1400
1401 make_generic ("llt", GFC_ISYM_LLT);
1402
1403 add_sym_1 ("log", 1, 1, BT_REAL, dr,
1404 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1405
1406 add_sym_1 ("alog", 1, 1, BT_REAL, dr,
1407 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1408
1409 add_sym_1 ("dlog", 1, 1, BT_REAL, dd,
1410 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dd, 0);
1411
1412 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz,
1413 NULL, gfc_simplify_log, gfc_resolve_log,
1414 x, BT_COMPLEX, dz, 0);
1415
1416 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_log, gfc_resolve_log, x, BT_COMPLEX, dd, 0); /* Extension */
1417
1418 make_alias ("cdlog");
1419
1420 make_generic ("log", GFC_ISYM_LOG);
1421
1422 add_sym_1 ("log10", 1, 1, BT_REAL, dr,
1423 NULL, gfc_simplify_log10, gfc_resolve_log10,
1424 x, BT_REAL, dr, 0);
1425
1426 add_sym_1 ("alog10", 1, 1, BT_REAL, dr,
1427 NULL, gfc_simplify_log10, gfc_resolve_log10,
1428 x, BT_REAL, dr, 0);
1429
1430 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd,
1431 NULL, gfc_simplify_log10, gfc_resolve_log10,
1432 x, BT_REAL, dd, 0);
1433
1434 make_generic ("log10", GFC_ISYM_LOG10);
1435
1436 add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl,
1437 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1438 l, BT_LOGICAL, dl, 0, kind, BT_INTEGER, di, 1);
1439
1440 make_generic ("logical", GFC_ISYM_LOGICAL);
1441
1442 add_sym_2 ("matmul", 0, 1, BT_REAL, dr,
1443 gfc_check_matmul, NULL, gfc_resolve_matmul,
1444 ma, BT_REAL, dr, 0, mb, BT_REAL, dr, 0);
1445
1446 make_generic ("matmul", GFC_ISYM_MATMUL);
1447
1448 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1449 int(max). The max function must take at least two arguments. */
1450
1451 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0,
1452 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1453 a1, BT_UNKNOWN, dr, 0, a2, BT_UNKNOWN, dr, 0);
1454
1455 add_sym_1m ("max0", 1, 0, BT_INTEGER, di,
1456 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1457 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1458
1459 add_sym_1m ("amax0", 1, 0, BT_REAL, dr,
1460 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1461 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1462
1463 add_sym_1m ("amax1", 1, 0, BT_REAL, dr,
1464 gfc_check_min_max_real, gfc_simplify_max, NULL,
1465 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1466
1467 add_sym_1m ("max1", 1, 0, BT_INTEGER, di,
1468 gfc_check_min_max_real, gfc_simplify_max, NULL,
1469 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1470
1471 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd,
1472 gfc_check_min_max_double, gfc_simplify_max, NULL,
1473 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1474
1475 make_generic ("max", GFC_ISYM_MAX);
1476
1477 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di,
1478 gfc_check_x, gfc_simplify_maxexponent, NULL,
1479 x, BT_UNKNOWN, dr, 0);
1480
1481 make_generic ("maxexponent", GFC_ISYM_NONE);
1482
1483 add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di,
1484 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1485 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1486 msk, BT_LOGICAL, dl, 1);
1487
1488 make_generic ("maxloc", GFC_ISYM_MAXLOC);
1489
1490 add_sym_3red ("maxval", 0, 1, BT_REAL, dr,
1491 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1492 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1493 msk, BT_LOGICAL, dl, 1);
1494
1495 make_generic ("maxval", GFC_ISYM_MAXVAL);
1496
1497 add_sym_3 ("merge", 1, 1, BT_REAL, dr,
1498 gfc_check_merge, NULL, gfc_resolve_merge,
1499 ts, BT_REAL, dr, 0, fs, BT_REAL, dr, 0,
1500 msk, BT_LOGICAL, dl, 0);
1501
1502 make_generic ("merge", GFC_ISYM_MERGE);
1503
1504 /* Note: amin0 is equivalent to real(min), min1 is equivalent to int(min). */
1505
1506 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0,
1507 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1508 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1509
1510 add_sym_1m ("min0", 1, 0, BT_INTEGER, di,
1511 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1512 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1513
1514 add_sym_1m ("amin0", 1, 0, BT_REAL, dr,
1515 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1516 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1517
1518 add_sym_1m ("amin1", 1, 0, BT_REAL, dr,
1519 gfc_check_min_max_real, gfc_simplify_min, NULL,
1520 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1521
1522 add_sym_1m ("min1", 1, 0, BT_INTEGER, di,
1523 gfc_check_min_max_real, gfc_simplify_min, NULL,
1524 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1525
1526 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd,
1527 gfc_check_min_max_double, gfc_simplify_min, NULL,
1528 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1529
1530 make_generic ("min", GFC_ISYM_MIN);
1531
1532 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di,
1533 gfc_check_x, gfc_simplify_minexponent, NULL,
1534 x, BT_UNKNOWN, dr, 0);
1535
1536 make_generic ("minexponent", GFC_ISYM_NONE);
1537
1538 add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di,
1539 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1540 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1541 msk, BT_LOGICAL, dl, 1);
1542
1543 make_generic ("minloc", GFC_ISYM_MINLOC);
1544
1545 add_sym_3red ("minval", 0, 1, BT_REAL, dr,
1546 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1547 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1548 msk, BT_LOGICAL, dl, 1);
1549
1550 make_generic ("minval", GFC_ISYM_MINVAL);
1551
1552 add_sym_2 ("mod", 1, 1, BT_INTEGER, di,
1553 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1554 a, BT_INTEGER, di, 0, p, BT_INTEGER, di, 0);
1555
1556 add_sym_2 ("amod", 1, 1, BT_REAL, dr,
1557 NULL, gfc_simplify_mod, gfc_resolve_mod,
1558 a, BT_REAL, dr, 0, p, BT_REAL, dr, 0);
1559
1560 add_sym_2 ("dmod", 1, 1, BT_REAL, dd,
1561 NULL, gfc_simplify_mod, gfc_resolve_mod,
1562 a, BT_REAL, dd, 0, p, BT_REAL, dd, 0);
1563
1564 make_generic ("mod", GFC_ISYM_MOD);
1565
1566 add_sym_2 ("modulo", 1, 1, BT_REAL, di,
1567 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1568 a, BT_REAL, di, 0, p, BT_REAL, di, 0);
1569
1570 make_generic ("modulo", GFC_ISYM_MODULO);
1571
1572 add_sym_2 ("nearest", 1, 1, BT_REAL, dr,
1573 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1574 x, BT_REAL, dr, 0, s, BT_REAL, dr, 0);
1575
1576 make_generic ("nearest", GFC_ISYM_NEAREST);
1577
1578 add_sym_2 ("nint", 1, 1, BT_INTEGER, di,
1579 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1580 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1581
1582 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di,
1583 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1584 a, BT_REAL, dd, 0);
1585
1586 make_generic ("nint", GFC_ISYM_NINT);
1587
1588 add_sym_1 ("not", 1, 1, BT_INTEGER, di,
1589 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1590 i, BT_INTEGER, di, 0);
1591
1592 make_generic ("not", GFC_ISYM_NOT);
1593
1594 add_sym_1 ("null", 0, 1, BT_INTEGER, di,
1595 gfc_check_null, gfc_simplify_null, NULL,
1596 mo, BT_INTEGER, di, 1);
1597
1598 make_generic ("null", GFC_ISYM_NONE);
1599
1600 add_sym_3 ("pack", 0, 1, BT_REAL, dr,
1601 gfc_check_pack, NULL, gfc_resolve_pack,
1602 ar, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1603 v, BT_REAL, dr, 1);
1604
1605 make_generic ("pack", GFC_ISYM_PACK);
1606
1607 add_sym_1 ("precision", 0, 1, BT_INTEGER, di,
1608 gfc_check_precision, gfc_simplify_precision, NULL,
1609 x, BT_UNKNOWN, 0, 0);
1610
1611 make_generic ("precision", GFC_ISYM_NONE);
1612
1613 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl,
1614 gfc_check_present, NULL, NULL, a, BT_REAL, dr, 0);
1615
1616 make_generic ("present", GFC_ISYM_PRESENT);
1617
1618 add_sym_3red ("product", 0, 1, BT_REAL, dr,
1619 gfc_check_product_sum, NULL, gfc_resolve_product,
1620 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1621 msk, BT_LOGICAL, dl, 1);
1622
1623 make_generic ("product", GFC_ISYM_PRODUCT);
1624
1625 add_sym_1 ("radix", 0, 1, BT_INTEGER, di,
1626 gfc_check_radix, gfc_simplify_radix, NULL,
1627 x, BT_UNKNOWN, 0, 0);
1628
1629 make_generic ("radix", GFC_ISYM_NONE);
1630
1631 /* The following function is for G77 compatibility. */
1632 add_sym_1 ("rand", 0, 1, BT_REAL, 4,
1633 gfc_check_rand, NULL, NULL,
1634 i, BT_INTEGER, 4, 0);
1635
1636 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and
1637 ran() use slightly different shoddy multiplicative congruential
1638 PRNG. */
1639 make_alias ("ran");
1640
1641 make_generic ("rand", GFC_ISYM_RAND);
1642
1643 add_sym_1 ("range", 0, 1, BT_INTEGER, di,
1644 gfc_check_range, gfc_simplify_range, NULL,
1645 x, BT_REAL, dr, 0);
1646
1647 make_generic ("range", GFC_ISYM_NONE);
1648
1649 add_sym_2 ("real", 1, 0, BT_REAL, dr,
1650 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1651 a, BT_UNKNOWN, dr, 0, kind, BT_INTEGER, di, 1);
1652
1653 add_sym_1 ("float", 1, 0, BT_REAL, dr,
1654 NULL, gfc_simplify_float, NULL, a, BT_INTEGER, di, 0);
1655
1656 add_sym_1 ("sngl", 1, 0, BT_REAL, dr,
1657 NULL, gfc_simplify_sngl, NULL, a, BT_REAL, dd, 0);
1658
1659 make_generic ("real", GFC_ISYM_REAL);
1660
1661 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc,
1662 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1663 stg, BT_CHARACTER, dc, 0, n, BT_INTEGER, di, 0);
1664
1665 make_generic ("repeat", GFC_ISYM_REPEAT);
1666
1667 add_sym_4 ("reshape", 0, 1, BT_REAL, dr,
1668 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1669 src, BT_REAL, dr, 0, shp, BT_INTEGER, ii, 0,
1670 pad, BT_REAL, dr, 1, ord, BT_INTEGER, ii, 1);
1671
1672 make_generic ("reshape", GFC_ISYM_RESHAPE);
1673
1674 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr,
1675 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1676 x, BT_REAL, dr, 0);
1677
1678 make_generic ("rrspacing", GFC_ISYM_RRSPACING);
1679
1680 add_sym_2 ("scale", 1, 1, BT_REAL, dr,
1681 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1682 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1683
1684 make_generic ("scale", GFC_ISYM_SCALE);
1685
1686 add_sym_3 ("scan", 1, 1, BT_INTEGER, di,
1687 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1688 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1689 bck, BT_LOGICAL, dl, 1);
1690
1691 make_generic ("scan", GFC_ISYM_SCAN);
1692
1693 /* Added for G77 compatibility garbage. */
1694 add_sym_0 ("second", 0, 1, BT_REAL, 4, NULL, NULL, NULL);
1695
1696 make_generic ("second", GFC_ISYM_SECOND);
1697
1698 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di,
1699 NULL, gfc_simplify_selected_int_kind, NULL,
1700 r, BT_INTEGER, di, 0);
1701
1702 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND);
1703
1704 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di,
1705 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1706 NULL, p, BT_INTEGER, di, 1, r, BT_INTEGER, di, 1);
1707
1708 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND);
1709
1710 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr,
1711 gfc_check_set_exponent, gfc_simplify_set_exponent,
1712 gfc_resolve_set_exponent,
1713 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1714
1715 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT);
1716
1717 add_sym_1 ("shape", 0, 1, BT_INTEGER, di,
1718 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1719 src, BT_REAL, dr, 0);
1720
1721 make_generic ("shape", GFC_ISYM_SHAPE);
1722
1723 add_sym_2 ("sign", 1, 1, BT_REAL, dr,
1724 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1725 a, BT_REAL, dr, 0, b, BT_REAL, dr, 0);
1726
1727 add_sym_2 ("isign", 1, 1, BT_INTEGER, di,
1728 NULL, gfc_simplify_sign, gfc_resolve_sign,
1729 a, BT_INTEGER, di, 0, b, BT_INTEGER, di, 0);
1730
1731 add_sym_2 ("dsign", 1, 1, BT_REAL, dd,
1732 NULL, gfc_simplify_sign, gfc_resolve_sign,
1733 a, BT_REAL, dd, 0, b, BT_REAL, dd, 0);
1734
1735 make_generic ("sign", GFC_ISYM_SIGN);
1736
1737 add_sym_1 ("sin", 1, 1, BT_REAL, dr,
1738 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dr, 0);
1739
1740 add_sym_1 ("dsin", 1, 1, BT_REAL, dd,
1741 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dd, 0);
1742
1743 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz,
1744 NULL, gfc_simplify_sin, gfc_resolve_sin,
1745 x, BT_COMPLEX, dz, 0);
1746
1747 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_COMPLEX, dd, 0); /* Extension */
1748
1749 make_alias ("cdsin");
1750
1751 make_generic ("sin", GFC_ISYM_SIN);
1752
1753 add_sym_1 ("sinh", 1, 1, BT_REAL, dr,
1754 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1755 x, BT_REAL, dr, 0);
1756
1757 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd,
1758 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1759 x, BT_REAL, dd, 0);
1760
1761 make_generic ("sinh", GFC_ISYM_SINH);
1762
1763 add_sym_2 ("size", 0, 1, BT_INTEGER, di,
1764 gfc_check_size, gfc_simplify_size, NULL,
1765 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1766
1767 make_generic ("size", GFC_ISYM_SIZE);
1768
1769 add_sym_1 ("spacing", 1, 1, BT_REAL, dr,
1770 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
1771 x, BT_REAL, dr, 0);
1772
1773 make_generic ("spacing", GFC_ISYM_SPACING);
1774
1775 add_sym_3 ("spread", 0, 1, BT_REAL, dr,
1776 gfc_check_spread, NULL, gfc_resolve_spread,
1777 src, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 0,
1778 n, BT_INTEGER, di, 0);
1779
1780 make_generic ("spread", GFC_ISYM_SPREAD);
1781
1782 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr,
1783 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1784 x, BT_REAL, dr, 0);
1785
1786 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd,
1787 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1788 x, BT_REAL, dd, 0);
1789
1790 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz,
1791 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1792 x, BT_COMPLEX, dz, 0);
1793
1794 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sqrt, gfc_resolve_sqrt, x, BT_COMPLEX, dd, 0); /* Extension */
1795
1796 make_alias ("cdsqrt");
1797
1798 make_generic ("sqrt", GFC_ISYM_SQRT);
1799
1800 add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0,
1801 gfc_check_product_sum, NULL, gfc_resolve_sum,
1802 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1803 msk, BT_LOGICAL, dl, 1);
1804
1805 make_generic ("sum", GFC_ISYM_SUM);
1806
1807 add_sym_1 ("tan", 1, 1, BT_REAL, dr,
1808 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dr, 0);
1809
1810 add_sym_1 ("dtan", 1, 1, BT_REAL, dd,
1811 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dd, 0);
1812
1813 make_generic ("tan", GFC_ISYM_TAN);
1814
1815 add_sym_1 ("tanh", 1, 1, BT_REAL, dr,
1816 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1817 x, BT_REAL, dr, 0);
1818
1819 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd,
1820 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1821 x, BT_REAL, dd, 0);
1822
1823 make_generic ("tanh", GFC_ISYM_TANH);
1824
1825 add_sym_1 ("tiny", 0, 1, BT_REAL, dr,
1826 gfc_check_x, gfc_simplify_tiny, NULL, x, BT_REAL, dr, 0);
1827
1828 make_generic ("tiny", GFC_ISYM_NONE);
1829
1830 add_sym_3 ("transfer", 0, 1, BT_REAL, dr,
1831 gfc_check_transfer, NULL, gfc_resolve_transfer,
1832 src, BT_REAL, dr, 0, mo, BT_REAL, dr, 0,
1833 sz, BT_INTEGER, di, 1);
1834
1835 make_generic ("transfer", GFC_ISYM_TRANSFER);
1836
1837 add_sym_1 ("transpose", 0, 1, BT_REAL, dr,
1838 gfc_check_transpose, NULL, gfc_resolve_transpose,
1839 m, BT_REAL, dr, 0);
1840
1841 make_generic ("transpose", GFC_ISYM_TRANSPOSE);
1842
1843 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc,
1844 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
1845 stg, BT_CHARACTER, dc, 0);
1846
1847 make_generic ("trim", GFC_ISYM_TRIM);
1848
1849 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di,
1850 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
1851 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1852
1853 make_generic ("ubound", GFC_ISYM_UBOUND);
1854
1855 add_sym_3 ("unpack", 0, 1, BT_REAL, dr,
1856 gfc_check_unpack, NULL, gfc_resolve_unpack,
1857 v, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1858 f, BT_REAL, dr, 0);
1859
1860 make_generic ("unpack", GFC_ISYM_UNPACK);
1861
1862 add_sym_3 ("verify", 1, 1, BT_INTEGER, di,
1863 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
1864 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1865 bck, BT_LOGICAL, dl, 1);
1866
1867 make_generic ("verify", GFC_ISYM_VERIFY);
1868
1869
1870 }
1871
1872
1873
1874 /* Add intrinsic subroutines. */
1875
1876 static void
1877 add_subroutines (void)
1878 {
1879 /* Argument names as in the standard (to be used as argument keywords). */
1880 const char
1881 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
1882 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
1883 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
1884 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
1885 *com = "command", *length = "length", *st = "status",
1886 *val = "value", *num = "number", *name = "name",
1887 *trim_name = "trim_name";
1888
1889 int di, dr, dc, dl;
1890
1891 di = gfc_default_integer_kind;
1892 dr = gfc_default_real_kind;
1893 dc = gfc_default_character_kind;
1894 dl = gfc_default_logical_kind;
1895
1896 add_sym_0s ("abort", 1, NULL);
1897
1898 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0,
1899 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
1900 tm, BT_REAL, dr, 0);
1901
1902 /* More G77 compatibility garbage. */
1903 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0,
1904 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
1905 tm, BT_REAL, dr, 0);
1906
1907 add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0,
1908 gfc_check_date_and_time, NULL, NULL,
1909 dt, BT_CHARACTER, dc, 1, tm, BT_CHARACTER, dc, 1,
1910 zn, BT_CHARACTER, dc, 1, vl, BT_INTEGER, di, 1);
1911
1912 /* More G77 compatibility garbage. */
1913 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0,
1914 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1915 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1916
1917 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0,
1918 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1919 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1920
1921 add_sym_2s ("getcwd", 0, 1, BT_UNKNOWN, 0,
1922 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
1923 c, BT_CHARACTER, dc, 0,
1924 st, BT_INTEGER, di, 1);
1925
1926 add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0,
1927 NULL, NULL, NULL,
1928 name, BT_CHARACTER, dc, 0,
1929 val, BT_CHARACTER, dc, 0);
1930
1931 add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0,
1932 NULL, NULL, gfc_resolve_getarg,
1933 c, BT_INTEGER, di, 0, vl, BT_CHARACTER, dc, 0);
1934
1935
1936 /* F2003 commandline routines. */
1937
1938 add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0,
1939 NULL, NULL, gfc_resolve_get_command,
1940 com, BT_CHARACTER, dc, 1,
1941 length, BT_INTEGER, di, 1,
1942 st, BT_INTEGER, di, 1);
1943
1944 add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0,
1945 NULL, NULL, gfc_resolve_get_command_argument,
1946 num, BT_INTEGER, di, 0,
1947 val, BT_CHARACTER, dc, 1,
1948 length, BT_INTEGER, di, 1,
1949 st, BT_INTEGER, di, 1);
1950
1951
1952 /* F2003 subroutine to get environment variables. */
1953
1954 add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0,
1955 NULL, NULL, gfc_resolve_get_environment_variable,
1956 name, BT_CHARACTER, dc, 0,
1957 val, BT_CHARACTER, dc, 1,
1958 length, BT_INTEGER, di, 1,
1959 st, BT_INTEGER, di, 1,
1960 trim_name, BT_LOGICAL, dl, 1);
1961
1962
1963 /* This needs changing to add_sym_5s if it gets a resolution function. */
1964 add_sym_5 ("mvbits", 1, 1, BT_UNKNOWN, 0,
1965 gfc_check_mvbits, gfc_simplify_mvbits, NULL,
1966 f, BT_INTEGER, di, 0, fp, BT_INTEGER, di, 0,
1967 ln, BT_INTEGER, di, 0, t, BT_INTEGER, di, 0,
1968 tp, BT_INTEGER, di, 0);
1969
1970 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0,
1971 gfc_check_random_number, NULL, gfc_resolve_random_number,
1972 h, BT_REAL, dr, 0);
1973
1974 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0,
1975 gfc_check_random_seed, NULL, NULL,
1976 sz, BT_INTEGER, di, 1, pt, BT_INTEGER, di, 1,
1977 gt, BT_INTEGER, di, 1);
1978
1979 /* More G77 compatibility garbage. */
1980 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di,
1981 gfc_check_srand, NULL, gfc_resolve_srand,
1982 c, BT_INTEGER, 4, 0);
1983
1984 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0,
1985 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
1986 c, BT_INTEGER, di, 1, cr, BT_INTEGER, di, 1,
1987 cm, BT_INTEGER, di, 1);
1988 }
1989
1990
1991 /* Add a function to the list of conversion symbols. */
1992
1993 static void
1994 add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
1995 gfc_expr * (*simplify) (gfc_expr *, bt, int))
1996 {
1997
1998 gfc_typespec from, to;
1999 gfc_intrinsic_sym *sym;
2000
2001 if (sizing == SZ_CONVS)
2002 {
2003 nconv++;
2004 return;
2005 }
2006
2007 gfc_clear_ts (&from);
2008 from.type = from_type;
2009 from.kind = from_kind;
2010
2011 gfc_clear_ts (&to);
2012 to.type = to_type;
2013 to.kind = to_kind;
2014
2015 sym = conversion + nconv;
2016
2017 strcpy (sym->name, conv_name (&from, &to));
2018 strcpy (sym->lib_name, sym->name);
2019 sym->simplify.cc = simplify;
2020 sym->elemental = 1;
2021 sym->ts = to;
2022 sym->generic_id = GFC_ISYM_CONVERSION;
2023
2024 nconv++;
2025 }
2026
2027
2028 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2029 functions by looping over the kind tables. */
2030
2031 static void
2032 add_conversions (void)
2033 {
2034 int i, j;
2035
2036 /* Integer-Integer conversions. */
2037 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2038 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2039 {
2040 if (i == j)
2041 continue;
2042
2043 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2044 BT_INTEGER, gfc_integer_kinds[j].kind, gfc_convert_constant);
2045 }
2046
2047 /* Integer-Real/Complex conversions. */
2048 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2049 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2050 {
2051 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2052 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2053
2054 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2055 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
2056
2057 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2058 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2059
2060 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2061 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
2062 }
2063
2064 /* Real/Complex - Real/Complex conversions. */
2065 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2066 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2067 {
2068 if (i != j)
2069 {
2070 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2071 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2072
2073 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2074 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2075 }
2076
2077 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2078 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2079
2080 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2081 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2082 }
2083
2084 /* Logical/Logical kind conversion. */
2085 for (i = 0; gfc_logical_kinds[i].kind; i++)
2086 for (j = 0; gfc_logical_kinds[j].kind; j++)
2087 {
2088 if (i == j)
2089 continue;
2090
2091 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2092 BT_LOGICAL, gfc_logical_kinds[j].kind, gfc_convert_constant);
2093 }
2094 }
2095
2096
2097 /* Initialize the table of intrinsics. */
2098 void
2099 gfc_intrinsic_init_1 (void)
2100 {
2101 int i;
2102
2103 nargs = nfunc = nsub = nconv = 0;
2104
2105 /* Create a namespace to hold the resolved intrinsic symbols. */
2106 gfc_intrinsic_namespace = gfc_get_namespace (NULL);
2107
2108 sizing = SZ_FUNCS;
2109 add_functions ();
2110 sizing = SZ_SUBS;
2111 add_subroutines ();
2112 sizing = SZ_CONVS;
2113 add_conversions ();
2114
2115 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2116 + sizeof (gfc_intrinsic_arg) * nargs);
2117
2118 next_sym = functions;
2119 subroutines = functions + nfunc;
2120
2121 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2122
2123 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2124
2125 sizing = SZ_NOTHING;
2126 nconv = 0;
2127
2128 add_functions ();
2129 add_subroutines ();
2130 add_conversions ();
2131
2132 /* Set the pure flag. All intrinsic functions are pure, and
2133 intrinsic subroutines are pure if they are elemental. */
2134
2135 for (i = 0; i < nfunc; i++)
2136 functions[i].pure = 1;
2137
2138 for (i = 0; i < nsub; i++)
2139 subroutines[i].pure = subroutines[i].elemental;
2140 }
2141
2142
2143 void
2144 gfc_intrinsic_done_1 (void)
2145 {
2146 gfc_free (functions);
2147 gfc_free (conversion);
2148 gfc_free_namespace (gfc_intrinsic_namespace);
2149 }
2150
2151
2152 /******** Subroutines to check intrinsic interfaces ***********/
2153
2154 /* Given a formal argument list, remove any NULL arguments that may
2155 have been left behind by a sort against some formal argument list. */
2156
2157 static void
2158 remove_nullargs (gfc_actual_arglist ** ap)
2159 {
2160 gfc_actual_arglist *head, *tail, *next;
2161
2162 tail = NULL;
2163
2164 for (head = *ap; head; head = next)
2165 {
2166 next = head->next;
2167
2168 if (head->expr == NULL)
2169 {
2170 head->next = NULL;
2171 gfc_free_actual_arglist (head);
2172 }
2173 else
2174 {
2175 if (tail == NULL)
2176 *ap = head;
2177 else
2178 tail->next = head;
2179
2180 tail = head;
2181 tail->next = NULL;
2182 }
2183 }
2184
2185 if (tail == NULL)
2186 *ap = NULL;
2187 }
2188
2189
2190 /* Given an actual arglist and a formal arglist, sort the actual
2191 arglist so that its arguments are in a one-to-one correspondence
2192 with the format arglist. Arguments that are not present are given
2193 a blank gfc_actual_arglist structure. If something is obviously
2194 wrong (say, a missing required argument) we abort sorting and
2195 return FAILURE. */
2196
2197 static try
2198 sort_actual (const char *name, gfc_actual_arglist ** ap,
2199 gfc_intrinsic_arg * formal, locus * where)
2200 {
2201
2202 gfc_actual_arglist *actual, *a;
2203 gfc_intrinsic_arg *f;
2204
2205 remove_nullargs (ap);
2206 actual = *ap;
2207
2208 for (f = formal; f; f = f->next)
2209 f->actual = NULL;
2210
2211 f = formal;
2212 a = actual;
2213
2214 if (f == NULL && a == NULL) /* No arguments */
2215 return SUCCESS;
2216
2217 for (;;)
2218 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2219 if (f == NULL)
2220 break;
2221 if (a == NULL)
2222 goto optional;
2223
2224 if (a->name[0] != '\0')
2225 goto keywords;
2226
2227 f->actual = a;
2228
2229 f = f->next;
2230 a = a->next;
2231 }
2232
2233 if (a == NULL)
2234 goto do_sort;
2235
2236 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2237 return FAILURE;
2238
2239 keywords:
2240 /* Associate the remaining actual arguments, all of which have
2241 to be keyword arguments. */
2242 for (; a; a = a->next)
2243 {
2244 for (f = formal; f; f = f->next)
2245 if (strcmp (a->name, f->name) == 0)
2246 break;
2247
2248 if (f == NULL)
2249 {
2250 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2251 a->name, name, where);
2252 return FAILURE;
2253 }
2254
2255 if (f->actual != NULL)
2256 {
2257 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2258 f->name, name, where);
2259 return FAILURE;
2260 }
2261
2262 f->actual = a;
2263 }
2264
2265 optional:
2266 /* At this point, all unmatched formal args must be optional. */
2267 for (f = formal; f; f = f->next)
2268 {
2269 if (f->actual == NULL && f->optional == 0)
2270 {
2271 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2272 f->name, name, where);
2273 return FAILURE;
2274 }
2275 }
2276
2277 do_sort:
2278 /* Using the formal argument list, string the actual argument list
2279 together in a way that corresponds with the formal list. */
2280 actual = NULL;
2281
2282 for (f = formal; f; f = f->next)
2283 {
2284 if (f->actual == NULL)
2285 {
2286 a = gfc_get_actual_arglist ();
2287 a->missing_arg_type = f->ts.type;
2288 }
2289 else
2290 a = f->actual;
2291
2292 if (actual == NULL)
2293 *ap = a;
2294 else
2295 actual->next = a;
2296
2297 actual = a;
2298 }
2299 actual->next = NULL; /* End the sorted argument list. */
2300
2301 return SUCCESS;
2302 }
2303
2304
2305 /* Compare an actual argument list with an intrinsic's formal argument
2306 list. The lists are checked for agreement of type. We don't check
2307 for arrayness here. */
2308
2309 static try
2310 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2311 int error_flag)
2312 {
2313 gfc_actual_arglist *actual;
2314 gfc_intrinsic_arg *formal;
2315 int i;
2316
2317 formal = sym->formal;
2318 actual = *ap;
2319
2320 i = 0;
2321 for (; formal; formal = formal->next, actual = actual->next, i++)
2322 {
2323 if (actual->expr == NULL)
2324 continue;
2325
2326 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2327 {
2328 if (error_flag)
2329 gfc_error
2330 ("Type of argument '%s' in call to '%s' at %L should be "
2331 "%s, not %s", gfc_current_intrinsic_arg[i],
2332 gfc_current_intrinsic, &actual->expr->where,
2333 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2334 return FAILURE;
2335 }
2336 }
2337
2338 return SUCCESS;
2339 }
2340
2341
2342 /* Given a pointer to an intrinsic symbol and an expression node that
2343 represent the function call to that subroutine, figure out the type
2344 of the result. This may involve calling a resolution subroutine. */
2345
2346 static void
2347 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2348 {
2349 gfc_expr *a1, *a2, *a3, *a4, *a5;
2350 gfc_actual_arglist *arg;
2351
2352 if (specific->resolve.f1 == NULL)
2353 {
2354 if (e->value.function.name == NULL)
2355 e->value.function.name = specific->lib_name;
2356
2357 if (e->ts.type == BT_UNKNOWN)
2358 e->ts = specific->ts;
2359 return;
2360 }
2361
2362 arg = e->value.function.actual;
2363
2364 /* Special case hacks for MIN and MAX. */
2365 if (specific->resolve.f1m == gfc_resolve_max
2366 || specific->resolve.f1m == gfc_resolve_min)
2367 {
2368 (*specific->resolve.f1m) (e, arg);
2369 return;
2370 }
2371
2372 if (arg == NULL)
2373 {
2374 (*specific->resolve.f0) (e);
2375 return;
2376 }
2377
2378 a1 = arg->expr;
2379 arg = arg->next;
2380
2381 if (arg == NULL)
2382 {
2383 (*specific->resolve.f1) (e, a1);
2384 return;
2385 }
2386
2387 a2 = arg->expr;
2388 arg = arg->next;
2389
2390 if (arg == NULL)
2391 {
2392 (*specific->resolve.f2) (e, a1, a2);
2393 return;
2394 }
2395
2396 a3 = arg->expr;
2397 arg = arg->next;
2398
2399 if (arg == NULL)
2400 {
2401 (*specific->resolve.f3) (e, a1, a2, a3);
2402 return;
2403 }
2404
2405 a4 = arg->expr;
2406 arg = arg->next;
2407
2408 if (arg == NULL)
2409 {
2410 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2411 return;
2412 }
2413
2414 a5 = arg->expr;
2415 arg = arg->next;
2416
2417 if (arg == NULL)
2418 {
2419 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2420 return;
2421 }
2422
2423 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2424 }
2425
2426
2427 /* Given an intrinsic symbol node and an expression node, call the
2428 simplification function (if there is one), perhaps replacing the
2429 expression with something simpler. We return FAILURE on an error
2430 of the simplification, SUCCESS if the simplification worked, even
2431 if nothing has changed in the expression itself. */
2432
2433 static try
2434 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2435 {
2436 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2437 gfc_actual_arglist *arg;
2438
2439 /* Max and min require special handling due to the variable number
2440 of args. */
2441 if (specific->simplify.f1 == gfc_simplify_min)
2442 {
2443 result = gfc_simplify_min (e);
2444 goto finish;
2445 }
2446
2447 if (specific->simplify.f1 == gfc_simplify_max)
2448 {
2449 result = gfc_simplify_max (e);
2450 goto finish;
2451 }
2452
2453 if (specific->simplify.f1 == NULL)
2454 {
2455 result = NULL;
2456 goto finish;
2457 }
2458
2459 arg = e->value.function.actual;
2460
2461 if (arg == NULL)
2462 {
2463 result = (*specific->simplify.f0) ();
2464 goto finish;
2465 }
2466
2467 a1 = arg->expr;
2468 arg = arg->next;
2469
2470 if (specific->simplify.cc == gfc_convert_constant)
2471 {
2472 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2473 goto finish;
2474 }
2475
2476 /* TODO: Warn if -pedantic and initialization expression and arg
2477 types not integer or character */
2478
2479 if (arg == NULL)
2480 result = (*specific->simplify.f1) (a1);
2481 else
2482 {
2483 a2 = arg->expr;
2484 arg = arg->next;
2485
2486 if (arg == NULL)
2487 result = (*specific->simplify.f2) (a1, a2);
2488 else
2489 {
2490 a3 = arg->expr;
2491 arg = arg->next;
2492
2493 if (arg == NULL)
2494 result = (*specific->simplify.f3) (a1, a2, a3);
2495 else
2496 {
2497 a4 = arg->expr;
2498 arg = arg->next;
2499
2500 if (arg == NULL)
2501 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2502 else
2503 {
2504 a5 = arg->expr;
2505 arg = arg->next;
2506
2507 if (arg == NULL)
2508 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
2509 else
2510 gfc_internal_error
2511 ("do_simplify(): Too many args for intrinsic");
2512 }
2513 }
2514 }
2515 }
2516
2517 finish:
2518 if (result == &gfc_bad_expr)
2519 return FAILURE;
2520
2521 if (result == NULL)
2522 resolve_intrinsic (specific, e); /* Must call at run-time */
2523 else
2524 {
2525 result->where = e->where;
2526 gfc_replace_expr (e, result);
2527 }
2528
2529 return SUCCESS;
2530 }
2531
2532
2533 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
2534 error messages. This subroutine returns FAILURE if a subroutine
2535 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
2536 list cannot match any intrinsic. */
2537
2538 static void
2539 init_arglist (gfc_intrinsic_sym * isym)
2540 {
2541 gfc_intrinsic_arg *formal;
2542 int i;
2543
2544 gfc_current_intrinsic = isym->name;
2545
2546 i = 0;
2547 for (formal = isym->formal; formal; formal = formal->next)
2548 {
2549 if (i >= MAX_INTRINSIC_ARGS)
2550 gfc_internal_error ("init_arglist(): too many arguments");
2551 gfc_current_intrinsic_arg[i++] = formal->name;
2552 }
2553 }
2554
2555
2556 /* Given a pointer to an intrinsic symbol and an expression consisting
2557 of a function call, see if the function call is consistent with the
2558 intrinsic's formal argument list. Return SUCCESS if the expression
2559 and intrinsic match, FAILURE otherwise. */
2560
2561 static try
2562 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
2563 {
2564 gfc_actual_arglist *arg, **ap;
2565 int r;
2566 try t;
2567
2568 ap = &expr->value.function.actual;
2569
2570 init_arglist (specific);
2571
2572 /* Don't attempt to sort the argument list for min or max. */
2573 if (specific->check.f1m == gfc_check_min_max
2574 || specific->check.f1m == gfc_check_min_max_integer
2575 || specific->check.f1m == gfc_check_min_max_real
2576 || specific->check.f1m == gfc_check_min_max_double)
2577 return (*specific->check.f1m) (*ap);
2578
2579 if (sort_actual (specific->name, ap, specific->formal,
2580 &expr->where) == FAILURE)
2581 return FAILURE;
2582
2583 if (specific->check.f3ml == gfc_check_minloc_maxloc)
2584 /* This is special because we might have to reorder the argument
2585 list. */
2586 t = gfc_check_minloc_maxloc (*ap);
2587 else if (specific->check.f3red == gfc_check_minval_maxval)
2588 /* This is also special because we also might have to reorder the
2589 argument list. */
2590 t = gfc_check_minval_maxval (*ap);
2591 else if (specific->check.f3red == gfc_check_product_sum)
2592 /* Same here. The difference to the previous case is that we allow a
2593 general numeric type. */
2594 t = gfc_check_product_sum (*ap);
2595 else
2596 {
2597 if (specific->check.f1 == NULL)
2598 {
2599 t = check_arglist (ap, specific, error_flag);
2600 if (t == SUCCESS)
2601 expr->ts = specific->ts;
2602 }
2603 else
2604 t = do_check (specific, *ap);
2605 }
2606
2607 /* Check ranks for elemental intrinsics. */
2608 if (t == SUCCESS && specific->elemental)
2609 {
2610 r = 0;
2611 for (arg = expr->value.function.actual; arg; arg = arg->next)
2612 {
2613 if (arg->expr == NULL || arg->expr->rank == 0)
2614 continue;
2615 if (r == 0)
2616 {
2617 r = arg->expr->rank;
2618 continue;
2619 }
2620
2621 if (arg->expr->rank != r)
2622 {
2623 gfc_error
2624 ("Ranks of arguments to elemental intrinsic '%s' differ "
2625 "at %L", specific->name, &arg->expr->where);
2626 return FAILURE;
2627 }
2628 }
2629 }
2630
2631 if (t == FAILURE)
2632 remove_nullargs (ap);
2633
2634 return t;
2635 }
2636
2637
2638 /* See if an intrinsic is one of the intrinsics we evaluate
2639 as an extension. */
2640
2641 static int
2642 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
2643 {
2644 /* FIXME: This should be moved into the intrinsic definitions. */
2645 static const char * const init_expr_extensions[] = {
2646 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
2647 "precision", "present", "radix", "range", "selected_real_kind",
2648 "tiny", NULL
2649 };
2650
2651 int i;
2652
2653 for (i = 0; init_expr_extensions[i]; i++)
2654 if (strcmp (init_expr_extensions[i], isym->name) == 0)
2655 return 0;
2656
2657 return 1;
2658 }
2659
2660
2661 /* See if a function call corresponds to an intrinsic function call.
2662 We return:
2663
2664 MATCH_YES if the call corresponds to an intrinsic, simplification
2665 is done if possible.
2666
2667 MATCH_NO if the call does not correspond to an intrinsic
2668
2669 MATCH_ERROR if the call corresponds to an intrinsic but there was an
2670 error during the simplification process.
2671
2672 The error_flag parameter enables an error reporting. */
2673
2674 match
2675 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
2676 {
2677 gfc_intrinsic_sym *isym, *specific;
2678 gfc_actual_arglist *actual;
2679 const char *name;
2680 int flag;
2681
2682 if (expr->value.function.isym != NULL)
2683 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
2684 ? MATCH_ERROR : MATCH_YES;
2685
2686 gfc_suppress_error = !error_flag;
2687 flag = 0;
2688
2689 for (actual = expr->value.function.actual; actual; actual = actual->next)
2690 if (actual->expr != NULL)
2691 flag |= (actual->expr->ts.type != BT_INTEGER
2692 && actual->expr->ts.type != BT_CHARACTER);
2693
2694 name = expr->symtree->n.sym->name;
2695
2696 isym = specific = gfc_find_function (name);
2697 if (isym == NULL)
2698 {
2699 gfc_suppress_error = 0;
2700 return MATCH_NO;
2701 }
2702
2703 gfc_current_intrinsic_where = &expr->where;
2704
2705 /* Bypass the generic list for min and max. */
2706 if (isym->check.f1m == gfc_check_min_max)
2707 {
2708 init_arglist (isym);
2709
2710 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
2711 goto got_specific;
2712
2713 gfc_suppress_error = 0;
2714 return MATCH_NO;
2715 }
2716
2717 /* If the function is generic, check all of its specific
2718 incarnations. If the generic name is also a specific, we check
2719 that name last, so that any error message will correspond to the
2720 specific. */
2721 gfc_suppress_error = 1;
2722
2723 if (isym->generic)
2724 {
2725 for (specific = isym->specific_head; specific;
2726 specific = specific->next)
2727 {
2728 if (specific == isym)
2729 continue;
2730 if (check_specific (specific, expr, 0) == SUCCESS)
2731 goto got_specific;
2732 }
2733 }
2734
2735 gfc_suppress_error = !error_flag;
2736
2737 if (check_specific (isym, expr, error_flag) == FAILURE)
2738 {
2739 gfc_suppress_error = 0;
2740 return MATCH_NO;
2741 }
2742
2743 specific = isym;
2744
2745 got_specific:
2746 expr->value.function.isym = specific;
2747 gfc_intrinsic_symbol (expr->symtree->n.sym);
2748
2749 if (do_simplify (specific, expr) == FAILURE)
2750 {
2751 gfc_suppress_error = 0;
2752 return MATCH_ERROR;
2753 }
2754
2755 /* TODO: We should probably only allow elemental functions here. */
2756 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
2757
2758 gfc_suppress_error = 0;
2759 if (pedantic && gfc_init_expr
2760 && flag && gfc_init_expr_extensions (specific))
2761 {
2762 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
2763 "nonstandard initialization expression at %L", &expr->where)
2764 == FAILURE)
2765 {
2766 return MATCH_ERROR;
2767 }
2768 }
2769
2770 return MATCH_YES;
2771 }
2772
2773
2774 /* See if a CALL statement corresponds to an intrinsic subroutine.
2775 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
2776 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
2777 correspond). */
2778
2779 match
2780 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
2781 {
2782 gfc_intrinsic_sym *isym;
2783 const char *name;
2784
2785 name = c->symtree->n.sym->name;
2786
2787 isym = find_subroutine (name);
2788 if (isym == NULL)
2789 return MATCH_NO;
2790
2791 gfc_suppress_error = !error_flag;
2792
2793 init_arglist (isym);
2794
2795 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
2796 goto fail;
2797
2798 if (isym->check.f1 != NULL)
2799 {
2800 if (do_check (isym, c->ext.actual) == FAILURE)
2801 goto fail;
2802 }
2803 else
2804 {
2805 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
2806 goto fail;
2807 }
2808
2809 /* The subroutine corresponds to an intrinsic. Allow errors to be
2810 seen at this point. */
2811 gfc_suppress_error = 0;
2812
2813 if (isym->resolve.s1 != NULL)
2814 isym->resolve.s1 (c);
2815 else
2816 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
2817
2818 if (gfc_pure (NULL) && !isym->elemental)
2819 {
2820 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
2821 &c->loc);
2822 return MATCH_ERROR;
2823 }
2824
2825 return MATCH_YES;
2826
2827 fail:
2828 gfc_suppress_error = 0;
2829 return MATCH_NO;
2830 }
2831
2832
2833 /* Call gfc_convert_type() with warning enabled. */
2834
2835 try
2836 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
2837 {
2838 return gfc_convert_type_warn (expr, ts, eflag, 1);
2839 }
2840
2841
2842 /* Try to convert an expression (in place) from one type to another.
2843 'eflag' controls the behavior on error.
2844
2845 The possible values are:
2846
2847 1 Generate a gfc_error()
2848 2 Generate a gfc_internal_error().
2849
2850 'wflag' controls the warning related to conversion. */
2851
2852 try
2853 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
2854 int wflag)
2855 {
2856 gfc_intrinsic_sym *sym;
2857 gfc_typespec from_ts;
2858 locus old_where;
2859 gfc_expr *new;
2860 int rank;
2861
2862 from_ts = expr->ts; /* expr->ts gets clobbered */
2863
2864 if (ts->type == BT_UNKNOWN)
2865 goto bad;
2866
2867 /* NULL and zero size arrays get their type here. */
2868 if (expr->expr_type == EXPR_NULL
2869 || (expr->expr_type == EXPR_ARRAY
2870 && expr->value.constructor == NULL))
2871 {
2872 /* Sometimes the RHS acquire the type. */
2873 expr->ts = *ts;
2874 return SUCCESS;
2875 }
2876
2877 if (expr->ts.type == BT_UNKNOWN)
2878 goto bad;
2879
2880 if (expr->ts.type == BT_DERIVED
2881 && ts->type == BT_DERIVED
2882 && gfc_compare_types (&expr->ts, ts))
2883 return SUCCESS;
2884
2885 sym = find_conv (&expr->ts, ts);
2886 if (sym == NULL)
2887 goto bad;
2888
2889 /* At this point, a conversion is necessary. A warning may be needed. */
2890 if (wflag && gfc_option.warn_conversion)
2891 gfc_warning_now ("Conversion from %s to %s at %L",
2892 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2893
2894 /* Insert a pre-resolved function call to the right function. */
2895 old_where = expr->where;
2896 rank = expr->rank;
2897 new = gfc_get_expr ();
2898 *new = *expr;
2899
2900 new = gfc_build_conversion (new);
2901 new->value.function.name = sym->lib_name;
2902 new->value.function.isym = sym;
2903 new->where = old_where;
2904 new->rank = rank;
2905
2906 *expr = *new;
2907
2908 gfc_free (new);
2909 expr->ts = *ts;
2910
2911 if (gfc_is_constant_expr (expr->value.function.actual->expr)
2912 && do_simplify (sym, expr) == FAILURE)
2913 {
2914
2915 if (eflag == 2)
2916 goto bad;
2917 return FAILURE; /* Error already generated in do_simplify() */
2918 }
2919
2920 return SUCCESS;
2921
2922 bad:
2923 if (eflag == 1)
2924 {
2925 gfc_error ("Can't convert %s to %s at %L",
2926 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2927 return FAILURE;
2928 }
2929
2930 gfc_internal_error ("Can't convert %s to %s at %L",
2931 gfc_typename (&from_ts), gfc_typename (ts),
2932 &expr->where);
2933 /* Not reached */
2934 }
This page took 0.170585 seconds and 5 git commands to generate.