2006-03-15 Paul Brook <paul@codesourcery.com>
[official-gcc.git] / gcc / fortran / intrinsic.c
blob56f92a2dca33861d7d2b6b831c6464711a6e3af1
1 /* Build up a list of intrinsic subroutines and functions for the
2 name-resolution stage.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
4 Inc.
5 Contributed by Andy Vaught & Katherine Holcomb
7 This file is part of GCC.
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.
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.
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, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
25 #include "config.h"
26 #include "system.h"
27 #include "flags.h"
28 #include "gfortran.h"
29 #include "intrinsic.h"
32 /* Namespace to hold the resolved symbols for intrinsic subroutines. */
33 static gfc_namespace *gfc_intrinsic_namespace;
35 int gfc_init_expr = 0;
37 /* Pointers to an intrinsic function and its argument names that are being
38 checked. */
40 const char *gfc_current_intrinsic;
41 const char *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
42 locus *gfc_current_intrinsic_where;
44 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
45 static gfc_intrinsic_arg *next_arg;
47 static int nfunc, nsub, nargs, nconv;
49 static enum
50 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
51 sizing;
53 #define REQUIRED 0
54 #define OPTIONAL 1
56 /* Return a letter based on the passed type. Used to construct the
57 name of a type-dependent subroutine. */
59 char
60 gfc_type_letter (bt type)
62 char c;
64 switch (type)
66 case BT_LOGICAL:
67 c = 'l';
68 break;
69 case BT_CHARACTER:
70 c = 's';
71 break;
72 case BT_INTEGER:
73 c = 'i';
74 break;
75 case BT_REAL:
76 c = 'r';
77 break;
78 case BT_COMPLEX:
79 c = 'c';
80 break;
82 case BT_HOLLERITH:
83 c = 'h';
84 break;
86 default:
87 c = 'u';
88 break;
91 return c;
95 /* Get a symbol for a resolved name. */
97 gfc_symbol *
98 gfc_get_intrinsic_sub_symbol (const char * name)
100 gfc_symbol *sym;
102 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
103 sym->attr.always_explicit = 1;
104 sym->attr.subroutine = 1;
105 sym->attr.flavor = FL_PROCEDURE;
106 sym->attr.proc = PROC_INTRINSIC;
108 return sym;
112 /* Return a pointer to the name of a conversion function given two
113 typespecs. */
115 static const char *
116 conv_name (gfc_typespec * from, gfc_typespec * to)
118 static char name[30];
120 sprintf (name, "__convert_%c%d_%c%d", gfc_type_letter (from->type),
121 from->kind, gfc_type_letter (to->type), to->kind);
123 return gfc_get_string (name);
127 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
128 corresponds to the conversion. Returns NULL if the conversion
129 isn't found. */
131 static gfc_intrinsic_sym *
132 find_conv (gfc_typespec * from, gfc_typespec * to)
134 gfc_intrinsic_sym *sym;
135 const char *target;
136 int i;
138 target = conv_name (from, to);
139 sym = conversion;
141 for (i = 0; i < nconv; i++, sym++)
142 if (strcmp (target, sym->name) == 0)
143 return sym;
145 return NULL;
149 /* Interface to the check functions. We break apart an argument list
150 and call the proper check function rather than forcing each
151 function to manipulate the argument list. */
153 static try
154 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
156 gfc_expr *a1, *a2, *a3, *a4, *a5;
158 if (arg == NULL)
159 return (*specific->check.f0) ();
161 a1 = arg->expr;
162 arg = arg->next;
163 if (arg == NULL)
164 return (*specific->check.f1) (a1);
166 a2 = arg->expr;
167 arg = arg->next;
168 if (arg == NULL)
169 return (*specific->check.f2) (a1, a2);
171 a3 = arg->expr;
172 arg = arg->next;
173 if (arg == NULL)
174 return (*specific->check.f3) (a1, a2, a3);
176 a4 = arg->expr;
177 arg = arg->next;
178 if (arg == NULL)
179 return (*specific->check.f4) (a1, a2, a3, a4);
181 a5 = arg->expr;
182 arg = arg->next;
183 if (arg == NULL)
184 return (*specific->check.f5) (a1, a2, a3, a4, a5);
186 gfc_internal_error ("do_check(): too many args");
190 /*********** Subroutines to build the intrinsic list ****************/
192 /* Add a single intrinsic symbol to the current list.
194 Argument list:
195 char * name of function
196 int whether function is elemental
197 int If the function can be used as an actual argument
198 bt return type of function
199 int kind of return type of function
200 int Fortran standard version
201 check pointer to check function
202 simplify pointer to simplification function
203 resolve pointer to resolution function
205 Optional arguments come in multiples of four:
206 char * name of argument
207 bt type of argument
208 int kind of argument
209 int arg optional flag (1=optional, 0=required)
211 The sequence is terminated by a NULL name.
213 TODO: Are checks on actual_ok implemented elsewhere, or is that just
214 missing here? */
216 static void
217 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
218 bt type, int kind, int standard, gfc_check_f check,
219 gfc_simplify_f simplify, gfc_resolve_f resolve, ...)
221 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
222 int optional, first_flag;
223 va_list argp;
225 /* First check that the intrinsic belongs to the selected standard.
226 If not, don't add it to the symbol list. */
227 if (!(gfc_option.allow_std & standard))
228 return;
230 switch (sizing)
232 case SZ_SUBS:
233 nsub++;
234 break;
236 case SZ_FUNCS:
237 nfunc++;
238 break;
240 case SZ_NOTHING:
241 next_sym->name = gfc_get_string (name);
243 strcpy (buf, "_gfortran_");
244 strcat (buf, name);
245 next_sym->lib_name = gfc_get_string (buf);
247 next_sym->elemental = elemental;
248 next_sym->ts.type = type;
249 next_sym->ts.kind = kind;
250 next_sym->standard = standard;
251 next_sym->simplify = simplify;
252 next_sym->check = check;
253 next_sym->resolve = resolve;
254 next_sym->specific = 0;
255 next_sym->generic = 0;
256 break;
258 default:
259 gfc_internal_error ("add_sym(): Bad sizing mode");
262 va_start (argp, resolve);
264 first_flag = 1;
266 for (;;)
268 name = va_arg (argp, char *);
269 if (name == NULL)
270 break;
272 type = (bt) va_arg (argp, int);
273 kind = va_arg (argp, int);
274 optional = va_arg (argp, int);
276 if (sizing != SZ_NOTHING)
277 nargs++;
278 else
280 next_arg++;
282 if (first_flag)
283 next_sym->formal = next_arg;
284 else
285 (next_arg - 1)->next = next_arg;
287 first_flag = 0;
289 strcpy (next_arg->name, name);
290 next_arg->ts.type = type;
291 next_arg->ts.kind = kind;
292 next_arg->optional = optional;
296 va_end (argp);
298 next_sym++;
302 /* Add a symbol to the function list where the function takes
303 0 arguments. */
305 static void
306 add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
307 int kind, int standard,
308 try (*check)(void),
309 gfc_expr *(*simplify)(void),
310 void (*resolve)(gfc_expr *))
312 gfc_simplify_f sf;
313 gfc_check_f cf;
314 gfc_resolve_f rf;
316 cf.f0 = check;
317 sf.f0 = simplify;
318 rf.f0 = resolve;
320 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
321 (void*)0);
325 /* Add a symbol to the subroutine list where the subroutine takes
326 0 arguments. */
328 static void
329 add_sym_0s (const char * name, int actual_ok, int standard,
330 void (*resolve)(gfc_code *))
332 gfc_check_f cf;
333 gfc_simplify_f sf;
334 gfc_resolve_f rf;
336 cf.f1 = NULL;
337 sf.f1 = NULL;
338 rf.s1 = resolve;
340 add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, standard, cf, sf, rf,
341 (void*)0);
345 /* Add a symbol to the function list where the function takes
346 1 arguments. */
348 static void
349 add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
350 int kind, int standard,
351 try (*check)(gfc_expr *),
352 gfc_expr *(*simplify)(gfc_expr *),
353 void (*resolve)(gfc_expr *,gfc_expr *),
354 const char* a1, bt type1, int kind1, int optional1)
356 gfc_check_f cf;
357 gfc_simplify_f sf;
358 gfc_resolve_f rf;
360 cf.f1 = check;
361 sf.f1 = simplify;
362 rf.f1 = resolve;
364 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
365 a1, type1, kind1, optional1,
366 (void*)0);
370 /* Add a symbol to the subroutine list where the subroutine takes
371 1 arguments. */
373 static void
374 add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
375 int kind, int standard,
376 try (*check)(gfc_expr *),
377 gfc_expr *(*simplify)(gfc_expr *),
378 void (*resolve)(gfc_code *),
379 const char* a1, bt type1, int kind1, int optional1)
381 gfc_check_f cf;
382 gfc_simplify_f sf;
383 gfc_resolve_f rf;
385 cf.f1 = check;
386 sf.f1 = simplify;
387 rf.s1 = resolve;
389 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
390 a1, type1, kind1, optional1,
391 (void*)0);
395 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
396 function. MAX et al take 2 or more arguments. */
398 static void
399 add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
400 int kind, int standard,
401 try (*check)(gfc_actual_arglist *),
402 gfc_expr *(*simplify)(gfc_expr *),
403 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
404 const char* a1, bt type1, int kind1, int optional1,
405 const char* a2, bt type2, int kind2, int optional2)
407 gfc_check_f cf;
408 gfc_simplify_f sf;
409 gfc_resolve_f rf;
411 cf.f1m = check;
412 sf.f1 = simplify;
413 rf.f1m = resolve;
415 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
416 a1, type1, kind1, optional1,
417 a2, type2, kind2, optional2,
418 (void*)0);
422 /* Add a symbol to the function list where the function takes
423 2 arguments. */
425 static void
426 add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
427 int kind, int standard,
428 try (*check)(gfc_expr *,gfc_expr *),
429 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
430 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
431 const char* a1, bt type1, int kind1, int optional1,
432 const char* a2, bt type2, int kind2, int optional2)
434 gfc_check_f cf;
435 gfc_simplify_f sf;
436 gfc_resolve_f rf;
438 cf.f2 = check;
439 sf.f2 = simplify;
440 rf.f2 = resolve;
442 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
443 a1, type1, kind1, optional1,
444 a2, type2, kind2, optional2,
445 (void*)0);
449 /* Add a symbol to the subroutine list where the subroutine takes
450 2 arguments. */
452 static void
453 add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
454 int kind, int standard,
455 try (*check)(gfc_expr *,gfc_expr *),
456 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
457 void (*resolve)(gfc_code *),
458 const char* a1, bt type1, int kind1, int optional1,
459 const char* a2, bt type2, int kind2, int optional2)
461 gfc_check_f cf;
462 gfc_simplify_f sf;
463 gfc_resolve_f rf;
465 cf.f2 = check;
466 sf.f2 = simplify;
467 rf.s1 = resolve;
469 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
470 a1, type1, kind1, optional1,
471 a2, type2, kind2, optional2,
472 (void*)0);
476 /* Add a symbol to the function list where the function takes
477 3 arguments. */
479 static void
480 add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
481 int kind, int standard,
482 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
483 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
484 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
485 const char* a1, bt type1, int kind1, int optional1,
486 const char* a2, bt type2, int kind2, int optional2,
487 const char* a3, bt type3, int kind3, int optional3)
489 gfc_check_f cf;
490 gfc_simplify_f sf;
491 gfc_resolve_f rf;
493 cf.f3 = check;
494 sf.f3 = simplify;
495 rf.f3 = resolve;
497 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
498 a1, type1, kind1, optional1,
499 a2, type2, kind2, optional2,
500 a3, type3, kind3, optional3,
501 (void*)0);
505 /* MINLOC and MAXLOC get special treatment because their argument
506 might have to be reordered. */
508 static void
509 add_sym_3ml (const char *name, int elemental,
510 int actual_ok, bt type, int kind, int standard,
511 try (*check)(gfc_actual_arglist *),
512 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
513 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
514 const char* a1, bt type1, int kind1, int optional1,
515 const char* a2, bt type2, int kind2, int optional2,
516 const char* a3, bt type3, int kind3, int optional3)
518 gfc_check_f cf;
519 gfc_simplify_f sf;
520 gfc_resolve_f rf;
522 cf.f3ml = check;
523 sf.f3 = simplify;
524 rf.f3 = resolve;
526 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
527 a1, type1, kind1, optional1,
528 a2, type2, kind2, optional2,
529 a3, type3, kind3, optional3,
530 (void*)0);
534 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
535 their argument also might have to be reordered. */
537 static void
538 add_sym_3red (const char *name, int elemental,
539 int actual_ok, bt type, int kind, int standard,
540 try (*check)(gfc_actual_arglist *),
541 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
542 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
543 const char* a1, bt type1, int kind1, int optional1,
544 const char* a2, bt type2, int kind2, int optional2,
545 const char* a3, bt type3, int kind3, int optional3)
547 gfc_check_f cf;
548 gfc_simplify_f sf;
549 gfc_resolve_f rf;
551 cf.f3red = check;
552 sf.f3 = simplify;
553 rf.f3 = resolve;
555 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
556 a1, type1, kind1, optional1,
557 a2, type2, kind2, optional2,
558 a3, type3, kind3, optional3,
559 (void*)0);
563 /* Add a symbol to the subroutine list where the subroutine takes
564 3 arguments. */
566 static void
567 add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
568 int kind, int standard,
569 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
570 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
571 void (*resolve)(gfc_code *),
572 const char* a1, bt type1, int kind1, int optional1,
573 const char* a2, bt type2, int kind2, int optional2,
574 const char* a3, bt type3, int kind3, int optional3)
576 gfc_check_f cf;
577 gfc_simplify_f sf;
578 gfc_resolve_f rf;
580 cf.f3 = check;
581 sf.f3 = simplify;
582 rf.s1 = resolve;
584 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
585 a1, type1, kind1, optional1,
586 a2, type2, kind2, optional2,
587 a3, type3, kind3, optional3,
588 (void*)0);
592 /* Add a symbol to the function list where the function takes
593 4 arguments. */
595 static void
596 add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
597 int kind, int standard,
598 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
599 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
600 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
601 const char* a1, bt type1, int kind1, int optional1,
602 const char* a2, bt type2, int kind2, int optional2,
603 const char* a3, bt type3, int kind3, int optional3,
604 const char* a4, bt type4, int kind4, int optional4 )
606 gfc_check_f cf;
607 gfc_simplify_f sf;
608 gfc_resolve_f rf;
610 cf.f4 = check;
611 sf.f4 = simplify;
612 rf.f4 = resolve;
614 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
615 a1, type1, kind1, optional1,
616 a2, type2, kind2, optional2,
617 a3, type3, kind3, optional3,
618 a4, type4, kind4, optional4,
619 (void*)0);
623 /* Add a symbol to the subroutine list where the subroutine takes
624 4 arguments. */
626 static void
627 add_sym_4s (const char *name, int elemental, int actual_ok,
628 bt type, int kind, int standard,
629 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
630 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
631 void (*resolve)(gfc_code *),
632 const char* a1, bt type1, int kind1, int optional1,
633 const char* a2, bt type2, int kind2, int optional2,
634 const char* a3, bt type3, int kind3, int optional3,
635 const char* a4, bt type4, int kind4, int optional4)
637 gfc_check_f cf;
638 gfc_simplify_f sf;
639 gfc_resolve_f rf;
641 cf.f4 = check;
642 sf.f4 = simplify;
643 rf.s1 = resolve;
645 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
646 a1, type1, kind1, optional1,
647 a2, type2, kind2, optional2,
648 a3, type3, kind3, optional3,
649 a4, type4, kind4, optional4,
650 (void*)0);
654 /* Add a symbol to the subroutine list where the subroutine takes
655 5 arguments. */
657 static void
658 add_sym_5s (const char *name, int elemental, int actual_ok,
659 bt type, int kind, int standard,
660 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
661 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
662 void (*resolve)(gfc_code *),
663 const char* a1, bt type1, int kind1, int optional1,
664 const char* a2, bt type2, int kind2, int optional2,
665 const char* a3, bt type3, int kind3, int optional3,
666 const char* a4, bt type4, int kind4, int optional4,
667 const char* a5, bt type5, int kind5, int optional5)
669 gfc_check_f cf;
670 gfc_simplify_f sf;
671 gfc_resolve_f rf;
673 cf.f5 = check;
674 sf.f5 = simplify;
675 rf.s1 = resolve;
677 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
678 a1, type1, kind1, optional1,
679 a2, type2, kind2, optional2,
680 a3, type3, kind3, optional3,
681 a4, type4, kind4, optional4,
682 a5, type5, kind5, optional5,
683 (void*)0);
687 /* Locate an intrinsic symbol given a base pointer, number of elements
688 in the table and a pointer to a name. Returns the NULL pointer if
689 a name is not found. */
691 static gfc_intrinsic_sym *
692 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
695 while (n > 0)
697 if (strcmp (name, start->name) == 0)
698 return start;
700 start++;
701 n--;
704 return NULL;
708 /* Given a name, find a function in the intrinsic function table.
709 Returns NULL if not found. */
711 gfc_intrinsic_sym *
712 gfc_find_function (const char *name)
714 gfc_intrinsic_sym *sym;
716 sym = find_sym (functions, nfunc, name);
717 if (!sym)
718 sym = find_sym (conversion, nconv, name);
720 return sym;
724 /* Given a name, find a function in the intrinsic subroutine table.
725 Returns NULL if not found. */
727 static gfc_intrinsic_sym *
728 find_subroutine (const char *name)
731 return find_sym (subroutines, nsub, name);
735 /* Given a string, figure out if it is the name of a generic intrinsic
736 function or not. */
739 gfc_generic_intrinsic (const char *name)
741 gfc_intrinsic_sym *sym;
743 sym = gfc_find_function (name);
744 return (sym == NULL) ? 0 : sym->generic;
748 /* Given a string, figure out if it is the name of a specific
749 intrinsic function or not. */
752 gfc_specific_intrinsic (const char *name)
754 gfc_intrinsic_sym *sym;
756 sym = gfc_find_function (name);
757 return (sym == NULL) ? 0 : sym->specific;
761 /* Given a string, figure out if it is the name of an intrinsic
762 subroutine or function. There are no generic intrinsic
763 subroutines, they are all specific. */
766 gfc_intrinsic_name (const char *name, int subroutine_flag)
769 return subroutine_flag ?
770 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
774 /* Collect a set of intrinsic functions into a generic collection.
775 The first argument is the name of the generic function, which is
776 also the name of a specific function. The rest of the specifics
777 currently in the table are placed into the list of specific
778 functions associated with that generic. */
780 static void
781 make_generic (const char *name, gfc_generic_isym_id generic_id, int standard)
783 gfc_intrinsic_sym *g;
785 if (!(gfc_option.allow_std & standard))
786 return;
788 if (sizing != SZ_NOTHING)
789 return;
791 g = gfc_find_function (name);
792 if (g == NULL)
793 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
794 name);
796 g->generic = 1;
797 g->specific = 1;
798 g->generic_id = generic_id;
799 if ((g + 1)->name != NULL)
800 g->specific_head = g + 1;
801 g++;
803 while (g->name != NULL)
805 g->next = g + 1;
806 g->specific = 1;
807 g->generic_id = generic_id;
808 g++;
811 g--;
812 g->next = NULL;
816 /* Create a duplicate intrinsic function entry for the current
817 function, the only difference being the alternate name. Note that
818 we use argument lists more than once, but all argument lists are
819 freed as a single block. */
821 static void
822 make_alias (const char *name, int standard)
825 /* First check that the intrinsic belongs to the selected standard.
826 If not, don't add it to the symbol list. */
827 if (!(gfc_option.allow_std & standard))
828 return;
830 switch (sizing)
832 case SZ_FUNCS:
833 nfunc++;
834 break;
836 case SZ_SUBS:
837 nsub++;
838 break;
840 case SZ_NOTHING:
841 next_sym[0] = next_sym[-1];
842 next_sym->name = gfc_get_string (name);
843 next_sym++;
844 break;
846 default:
847 break;
851 /* Make the current subroutine noreturn. */
853 static void
854 make_noreturn(void)
856 if (sizing == SZ_NOTHING)
857 next_sym[-1].noreturn = 1;
860 /* Add intrinsic functions. */
862 static void
863 add_functions (void)
866 /* Argument names as in the standard (to be used as argument keywords). */
867 const char
868 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
869 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
870 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
871 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
872 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
873 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
874 *p = "p", *ar = "array", *shp = "shape", *src = "source",
875 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
876 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
877 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
878 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
879 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
880 *num = "number", *tm = "time";
882 int di, dr, dd, dl, dc, dz, ii;
884 di = gfc_default_integer_kind;
885 dr = gfc_default_real_kind;
886 dd = gfc_default_double_kind;
887 dl = gfc_default_logical_kind;
888 dc = gfc_default_character_kind;
889 dz = gfc_default_complex_kind;
890 ii = gfc_index_integer_kind;
892 add_sym_1 ("abs", 1, 1, BT_REAL, dr, GFC_STD_F77,
893 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
894 a, BT_REAL, dr, REQUIRED);
896 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di, GFC_STD_F77,
897 NULL, gfc_simplify_abs, gfc_resolve_abs,
898 a, BT_INTEGER, di, REQUIRED);
900 add_sym_1 ("dabs", 1, 1, BT_REAL, dd, GFC_STD_F77,
901 NULL, gfc_simplify_abs, gfc_resolve_abs,
902 a, BT_REAL, dd, REQUIRED);
904 add_sym_1 ("cabs", 1, 1, BT_REAL, dr, GFC_STD_F77,
905 NULL, gfc_simplify_abs, gfc_resolve_abs,
906 a, BT_COMPLEX, dz, REQUIRED);
908 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, GFC_STD_GNU,
909 NULL, gfc_simplify_abs, gfc_resolve_abs,
910 a, BT_COMPLEX, dd, REQUIRED);
912 make_alias ("cdabs", GFC_STD_GNU);
914 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
916 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
917 gfc_check_achar, gfc_simplify_achar, NULL,
918 i, BT_INTEGER, di, REQUIRED);
920 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
922 add_sym_1 ("acos", 1, 1, BT_REAL, dr, GFC_STD_F77,
923 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
924 x, BT_REAL, dr, REQUIRED);
926 add_sym_1 ("dacos", 1, 1, BT_REAL, dd, GFC_STD_F77,
927 NULL, gfc_simplify_acos, gfc_resolve_acos,
928 x, BT_REAL, dd, REQUIRED);
930 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
932 add_sym_1 ("acosh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
933 gfc_check_fn_r, gfc_simplify_acosh, gfc_resolve_acosh,
934 x, BT_REAL, dr, REQUIRED);
936 add_sym_1 ("dacosh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
937 NULL, gfc_simplify_acosh, gfc_resolve_acosh,
938 x, BT_REAL, dd, REQUIRED);
940 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_GNU);
942 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
943 NULL, gfc_simplify_adjustl, NULL,
944 stg, BT_CHARACTER, dc, REQUIRED);
946 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
948 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
949 NULL, gfc_simplify_adjustr, NULL,
950 stg, BT_CHARACTER, dc, REQUIRED);
952 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
954 add_sym_1 ("aimag", 1, 1, BT_REAL, dr, GFC_STD_F77,
955 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
956 z, BT_COMPLEX, dz, REQUIRED);
958 make_alias ("imag", GFC_STD_GNU);
959 make_alias ("imagpart", GFC_STD_GNU);
961 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, GFC_STD_GNU,
962 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
963 z, BT_COMPLEX, dd, REQUIRED);
966 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
968 add_sym_2 ("aint", 1, 1, BT_REAL, dr, GFC_STD_F77,
969 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
970 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
972 add_sym_1 ("dint", 1, 1, BT_REAL, dd, GFC_STD_F77,
973 NULL, gfc_simplify_dint, gfc_resolve_dint,
974 a, BT_REAL, dd, REQUIRED);
976 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
978 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
979 gfc_check_all_any, NULL, gfc_resolve_all,
980 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
982 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
984 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
985 gfc_check_allocated, NULL, NULL,
986 ar, BT_UNKNOWN, 0, REQUIRED);
988 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
990 add_sym_2 ("anint", 1, 1, BT_REAL, dr, GFC_STD_F77,
991 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
992 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
994 add_sym_1 ("dnint", 1, 1, BT_REAL, dd, GFC_STD_F77,
995 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
996 a, BT_REAL, dd, REQUIRED);
998 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1000 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1001 gfc_check_all_any, NULL, gfc_resolve_any,
1002 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1004 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1006 add_sym_1 ("asin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1007 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1008 x, BT_REAL, dr, REQUIRED);
1010 add_sym_1 ("dasin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1011 NULL, gfc_simplify_asin, gfc_resolve_asin,
1012 x, BT_REAL, dd, REQUIRED);
1014 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1016 add_sym_1 ("asinh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1017 gfc_check_fn_r, gfc_simplify_asinh, gfc_resolve_asinh,
1018 x, BT_REAL, dr, REQUIRED);
1020 add_sym_1 ("dasinh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1021 NULL, gfc_simplify_asinh, gfc_resolve_asinh,
1022 x, BT_REAL, dd, REQUIRED);
1024 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_GNU);
1026 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1027 gfc_check_associated, NULL, NULL,
1028 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1030 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1032 add_sym_1 ("atan", 1, 1, BT_REAL, dr, GFC_STD_F77,
1033 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1034 x, BT_REAL, dr, REQUIRED);
1036 add_sym_1 ("datan", 1, 1, BT_REAL, dd, GFC_STD_F77,
1037 NULL, gfc_simplify_atan, gfc_resolve_atan,
1038 x, BT_REAL, dd, REQUIRED);
1040 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1042 add_sym_1 ("atanh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1043 gfc_check_fn_r, gfc_simplify_atanh, gfc_resolve_atanh,
1044 x, BT_REAL, dr, REQUIRED);
1046 add_sym_1 ("datanh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1047 NULL, gfc_simplify_atanh, gfc_resolve_atanh,
1048 x, BT_REAL, dd, REQUIRED);
1050 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_GNU);
1052 add_sym_2 ("atan2", 1, 1, BT_REAL, dr, GFC_STD_F77,
1053 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1054 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1056 add_sym_2 ("datan2", 1, 1, BT_REAL, dd, GFC_STD_F77,
1057 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
1058 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1060 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1062 /* Bessel and Neumann functions for G77 compatibility. */
1063 add_sym_1 ("besj0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1064 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1065 x, BT_REAL, dr, REQUIRED);
1067 add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1068 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1069 x, BT_REAL, dd, REQUIRED);
1071 make_generic ("besj0", GFC_ISYM_J0, GFC_STD_GNU);
1073 add_sym_1 ("besj1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1074 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1075 x, BT_REAL, dr, REQUIRED);
1077 add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1078 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1079 x, BT_REAL, dd, REQUIRED);
1081 make_generic ("besj1", GFC_ISYM_J1, GFC_STD_GNU);
1083 add_sym_2 ("besjn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1084 gfc_check_besn, NULL, gfc_resolve_besn,
1085 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1087 add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1088 gfc_check_besn, NULL, gfc_resolve_besn,
1089 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1091 make_generic ("besjn", GFC_ISYM_JN, GFC_STD_GNU);
1093 add_sym_1 ("besy0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1094 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1095 x, BT_REAL, dr, REQUIRED);
1097 add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1098 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1099 x, BT_REAL, dd, REQUIRED);
1101 make_generic ("besy0", GFC_ISYM_Y0, GFC_STD_GNU);
1103 add_sym_1 ("besy1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1104 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1105 x, BT_REAL, dr, REQUIRED);
1107 add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1108 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1109 x, BT_REAL, dd, REQUIRED);
1111 make_generic ("besy1", GFC_ISYM_Y1, GFC_STD_GNU);
1113 add_sym_2 ("besyn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1114 gfc_check_besn, NULL, gfc_resolve_besn,
1115 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1117 add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1118 gfc_check_besn, NULL, gfc_resolve_besn,
1119 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1121 make_generic ("besyn", GFC_ISYM_YN, GFC_STD_GNU);
1123 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1124 gfc_check_i, gfc_simplify_bit_size, NULL,
1125 i, BT_INTEGER, di, REQUIRED);
1127 make_generic ("bit_size", GFC_ISYM_NONE, GFC_STD_F95);
1129 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl, GFC_STD_F95,
1130 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1131 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1133 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1135 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1136 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1137 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1139 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1141 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc, GFC_STD_F77,
1142 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1143 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1145 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1147 add_sym_1 ("chdir", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1148 gfc_check_chdir, NULL, gfc_resolve_chdir,
1149 a, BT_CHARACTER, dc, REQUIRED);
1151 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1153 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1154 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1155 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1156 kind, BT_INTEGER, di, OPTIONAL);
1158 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1160 add_sym_2 ("complex", 1, 1, BT_COMPLEX, dz, GFC_STD_GNU,
1161 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1162 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1164 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1166 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1167 complex instead of the default complex. */
1169 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1170 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1171 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1173 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1175 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1176 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1177 z, BT_COMPLEX, dz, REQUIRED);
1179 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1180 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1181 z, BT_COMPLEX, dd, REQUIRED);
1183 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1185 add_sym_1 ("cos", 1, 1, BT_REAL, dr, GFC_STD_F77,
1186 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1187 x, BT_REAL, dr, REQUIRED);
1189 add_sym_1 ("dcos", 1, 1, BT_REAL, dd, GFC_STD_F77,
1190 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1191 x, BT_REAL, dd, REQUIRED);
1193 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1194 NULL, gfc_simplify_cos, gfc_resolve_cos,
1195 x, BT_COMPLEX, dz, REQUIRED);
1197 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1198 NULL, gfc_simplify_cos, gfc_resolve_cos,
1199 x, BT_COMPLEX, dd, REQUIRED);
1201 make_alias ("cdcos", GFC_STD_GNU);
1203 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1205 add_sym_1 ("cosh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1206 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1207 x, BT_REAL, dr, REQUIRED);
1209 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1210 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1211 x, BT_REAL, dd, REQUIRED);
1213 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1215 add_sym_2 ("count", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1216 gfc_check_count, NULL, gfc_resolve_count,
1217 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1219 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1221 add_sym_3 ("cshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1222 gfc_check_cshift, NULL, gfc_resolve_cshift,
1223 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1224 dm, BT_INTEGER, ii, OPTIONAL);
1226 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1228 add_sym_1 ("ctime", 0, 1, BT_CHARACTER, 0, GFC_STD_GNU,
1229 gfc_check_ctime, NULL, gfc_resolve_ctime,
1230 tm, BT_INTEGER, di, REQUIRED);
1232 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1234 add_sym_1 ("dble", 1, 1, BT_REAL, dd, GFC_STD_F77,
1235 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1236 a, BT_REAL, dr, REQUIRED);
1238 make_alias ("dfloat", GFC_STD_GNU);
1240 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1242 add_sym_1 ("digits", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1243 gfc_check_digits, gfc_simplify_digits, NULL,
1244 x, BT_UNKNOWN, dr, REQUIRED);
1246 make_generic ("digits", GFC_ISYM_NONE, GFC_STD_F95);
1248 add_sym_2 ("dim", 1, 1, BT_REAL, dr, GFC_STD_F77,
1249 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1250 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1252 add_sym_2 ("idim", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1253 NULL, gfc_simplify_dim, gfc_resolve_dim,
1254 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1256 add_sym_2 ("ddim", 1, 1, BT_REAL, dd, GFC_STD_F77,
1257 NULL, gfc_simplify_dim, gfc_resolve_dim,
1258 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1260 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1262 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1263 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1264 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1266 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1268 add_sym_2 ("dprod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1269 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1270 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1272 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1274 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1275 NULL, NULL, NULL,
1276 a, BT_COMPLEX, dd, REQUIRED);
1278 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1280 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1281 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1282 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1283 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1285 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1287 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr, GFC_STD_F95,
1288 gfc_check_x, gfc_simplify_epsilon, NULL,
1289 x, BT_REAL, dr, REQUIRED);
1291 make_generic ("epsilon", GFC_ISYM_NONE, GFC_STD_F95);
1293 /* G77 compatibility for the ERF() and ERFC() functions. */
1294 add_sym_1 ("erf", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1295 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1296 x, BT_REAL, dr, REQUIRED);
1298 add_sym_1 ("derf", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1299 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1300 x, BT_REAL, dd, REQUIRED);
1302 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_GNU);
1304 add_sym_1 ("erfc", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1305 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1306 x, BT_REAL, dr, REQUIRED);
1308 add_sym_1 ("derfc", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1309 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1310 x, BT_REAL, dd, REQUIRED);
1312 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_GNU);
1314 /* G77 compatibility */
1315 add_sym_1 ("etime", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1316 gfc_check_etime, NULL, NULL,
1317 x, BT_REAL, 4, REQUIRED);
1319 make_alias ("dtime", GFC_STD_GNU);
1321 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1323 add_sym_1 ("exp", 1, 1, BT_REAL, dr, GFC_STD_F77,
1324 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1325 x, BT_REAL, dr, REQUIRED);
1327 add_sym_1 ("dexp", 1, 1, BT_REAL, dd, GFC_STD_F77,
1328 NULL, gfc_simplify_exp, gfc_resolve_exp,
1329 x, BT_REAL, dd, REQUIRED);
1331 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1332 NULL, gfc_simplify_exp, gfc_resolve_exp,
1333 x, BT_COMPLEX, dz, REQUIRED);
1335 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1336 NULL, gfc_simplify_exp, gfc_resolve_exp,
1337 x, BT_COMPLEX, dd, REQUIRED);
1339 make_alias ("cdexp", GFC_STD_GNU);
1341 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1343 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1344 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1345 x, BT_REAL, dr, REQUIRED);
1347 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1349 add_sym_0 ("fdate", 1, 0, BT_CHARACTER, dc, GFC_STD_GNU,
1350 NULL, NULL, gfc_resolve_fdate);
1352 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1354 add_sym_2 ("floor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1355 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1356 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1358 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1360 /* G77 compatible fnum */
1361 add_sym_1 ("fnum", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1362 gfc_check_fnum, NULL, gfc_resolve_fnum,
1363 ut, BT_INTEGER, di, REQUIRED);
1365 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1367 add_sym_1 ("fraction", 1, 1, BT_REAL, dr, GFC_STD_F95,
1368 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1369 x, BT_REAL, dr, REQUIRED);
1371 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1373 add_sym_2 ("fstat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1374 gfc_check_fstat, NULL, gfc_resolve_fstat,
1375 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1377 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1379 add_sym_1 ("ftell", 0, 1, BT_INTEGER, ii, GFC_STD_GNU,
1380 gfc_check_ftell, NULL, gfc_resolve_ftell,
1381 ut, BT_INTEGER, di, REQUIRED);
1383 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1385 add_sym_2 ("fgetc", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1386 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1387 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1389 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1391 add_sym_1 ("fget", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1392 gfc_check_fgetput, NULL, gfc_resolve_fget,
1393 c, BT_CHARACTER, dc, REQUIRED);
1395 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1397 add_sym_2 ("fputc", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1398 gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1399 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1401 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1403 add_sym_1 ("fput", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1404 gfc_check_fgetput, NULL, gfc_resolve_fput,
1405 c, BT_CHARACTER, dc, REQUIRED);
1407 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1409 /* Unix IDs (g77 compatibility) */
1410 add_sym_1 ("getcwd", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1411 NULL, NULL, gfc_resolve_getcwd,
1412 c, BT_CHARACTER, dc, REQUIRED);
1414 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1416 add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1417 NULL, NULL, gfc_resolve_getgid);
1419 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1421 add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1422 NULL, NULL, gfc_resolve_getpid);
1424 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1426 add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1427 NULL, NULL, gfc_resolve_getuid);
1429 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1431 add_sym_1 ("hostnm", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1432 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1433 a, BT_CHARACTER, dc, REQUIRED);
1435 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1437 add_sym_1 ("huge", 0, 1, BT_REAL, dr, GFC_STD_F95,
1438 gfc_check_huge, gfc_simplify_huge, NULL,
1439 x, BT_UNKNOWN, dr, REQUIRED);
1441 make_generic ("huge", GFC_ISYM_NONE, GFC_STD_F95);
1443 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1444 gfc_check_ichar_iachar, gfc_simplify_iachar, NULL,
1445 c, BT_CHARACTER, dc, REQUIRED);
1447 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1449 add_sym_2 ("iand", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1450 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1451 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1453 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1455 add_sym_2 ("and", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1456 gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1457 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1459 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1461 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1462 NULL, NULL, NULL);
1464 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1466 add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, GFC_STD_F2003,
1467 NULL, NULL, NULL);
1469 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1470 GFC_STD_F2003);
1472 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1473 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1474 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1476 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1478 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1479 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1480 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1481 ln, BT_INTEGER, di, REQUIRED);
1483 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1485 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1486 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1487 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1489 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1491 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1492 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1493 c, BT_CHARACTER, dc, REQUIRED);
1495 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1497 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1498 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1499 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1501 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1503 add_sym_2 ("xor", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1504 gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1505 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1507 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1509 add_sym_0 ("ierrno", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1510 NULL, NULL, gfc_resolve_ierrno);
1512 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1514 add_sym_3 ("index", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1515 gfc_check_index, gfc_simplify_index, NULL,
1516 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1517 bck, BT_LOGICAL, dl, OPTIONAL);
1519 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1521 add_sym_2 ("int", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1522 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1523 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1525 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1526 NULL, gfc_simplify_ifix, NULL,
1527 a, BT_REAL, dr, REQUIRED);
1529 add_sym_1 ("idint", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1530 NULL, gfc_simplify_idint, NULL,
1531 a, BT_REAL, dd, REQUIRED);
1533 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1535 add_sym_2 ("ior", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1536 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1537 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1539 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1541 add_sym_2 ("or", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1542 gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1543 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1545 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1547 /* The following function is for G77 compatibility. */
1548 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4, GFC_STD_GNU,
1549 gfc_check_irand, NULL, NULL,
1550 i, BT_INTEGER, 4, OPTIONAL);
1552 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1554 add_sym_1 ("isatty", 0, 0, BT_LOGICAL, dl, GFC_STD_GNU,
1555 gfc_check_isatty, NULL, gfc_resolve_isatty,
1556 ut, BT_INTEGER, di, REQUIRED);
1558 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1560 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1561 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1562 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1564 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1566 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1567 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1568 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1569 sz, BT_INTEGER, di, OPTIONAL);
1571 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1573 add_sym_2 ("kill", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1574 gfc_check_kill, NULL, gfc_resolve_kill,
1575 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1577 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1579 add_sym_1 ("kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1580 gfc_check_kind, gfc_simplify_kind, NULL,
1581 x, BT_REAL, dr, REQUIRED);
1583 make_generic ("kind", GFC_ISYM_NONE, GFC_STD_F95);
1585 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1586 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1587 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL);
1589 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1591 add_sym_1 ("len", 0, 1, BT_INTEGER, di, GFC_STD_F77,
1592 NULL, gfc_simplify_len, gfc_resolve_len,
1593 stg, BT_CHARACTER, dc, REQUIRED);
1595 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1597 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1598 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1599 stg, BT_CHARACTER, dc, REQUIRED);
1601 make_alias ("lnblnk", GFC_STD_GNU);
1603 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1605 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1606 NULL, gfc_simplify_lge, NULL,
1607 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1609 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1611 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1612 NULL, gfc_simplify_lgt, NULL,
1613 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1615 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1617 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1618 NULL, gfc_simplify_lle, NULL,
1619 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1621 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1623 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1624 NULL, gfc_simplify_llt, NULL,
1625 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1627 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1629 add_sym_2 ("link", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1630 gfc_check_link, NULL, gfc_resolve_link,
1631 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1633 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1635 add_sym_1 ("log", 1, 1, BT_REAL, dr, GFC_STD_F77,
1636 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1637 x, BT_REAL, dr, REQUIRED);
1639 add_sym_1 ("alog", 1, 1, BT_REAL, dr, GFC_STD_F77,
1640 NULL, gfc_simplify_log, gfc_resolve_log,
1641 x, BT_REAL, dr, REQUIRED);
1643 add_sym_1 ("dlog", 1, 1, BT_REAL, dd, GFC_STD_F77,
1644 NULL, gfc_simplify_log, gfc_resolve_log,
1645 x, BT_REAL, dd, REQUIRED);
1647 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1648 NULL, gfc_simplify_log, gfc_resolve_log,
1649 x, BT_COMPLEX, dz, REQUIRED);
1651 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1652 NULL, gfc_simplify_log, gfc_resolve_log,
1653 x, BT_COMPLEX, dd, REQUIRED);
1655 make_alias ("cdlog", GFC_STD_GNU);
1657 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
1659 add_sym_1 ("log10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1660 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
1661 x, BT_REAL, dr, REQUIRED);
1663 add_sym_1 ("alog10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1664 NULL, gfc_simplify_log10, gfc_resolve_log10,
1665 x, BT_REAL, dr, REQUIRED);
1667 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd, GFC_STD_F77,
1668 NULL, gfc_simplify_log10, gfc_resolve_log10,
1669 x, BT_REAL, dd, REQUIRED);
1671 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
1673 add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1674 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1675 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1677 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
1679 add_sym_1 ("malloc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU, gfc_check_malloc,
1680 NULL, gfc_resolve_malloc, a, BT_INTEGER, di, REQUIRED);
1682 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
1684 add_sym_2 ("matmul", 0, 1, BT_REAL, dr, GFC_STD_F95,
1685 gfc_check_matmul, NULL, gfc_resolve_matmul,
1686 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
1688 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
1690 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1691 int(max). The max function must take at least two arguments. */
1693 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1694 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1695 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
1697 add_sym_1m ("max0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1698 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1699 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1701 add_sym_1m ("amax0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1702 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1703 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1705 add_sym_1m ("amax1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1706 gfc_check_min_max_real, gfc_simplify_max, NULL,
1707 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1709 add_sym_1m ("max1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1710 gfc_check_min_max_real, gfc_simplify_max, NULL,
1711 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1713 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1714 gfc_check_min_max_double, gfc_simplify_max, NULL,
1715 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1717 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
1719 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1720 gfc_check_x, gfc_simplify_maxexponent, NULL,
1721 x, BT_UNKNOWN, dr, REQUIRED);
1723 make_generic ("maxexponent", GFC_ISYM_NONE, GFC_STD_F95);
1725 add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1726 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1727 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1728 msk, BT_LOGICAL, dl, OPTIONAL);
1730 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
1732 add_sym_3red ("maxval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1733 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1734 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1735 msk, BT_LOGICAL, dl, OPTIONAL);
1737 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
1739 add_sym_3 ("merge", 1, 1, BT_REAL, dr, GFC_STD_F95,
1740 gfc_check_merge, NULL, gfc_resolve_merge,
1741 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
1742 msk, BT_LOGICAL, dl, REQUIRED);
1744 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
1746 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
1747 int(min). */
1749 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1750 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1751 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1753 add_sym_1m ("min0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1754 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1755 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1757 add_sym_1m ("amin0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1758 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1759 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1761 add_sym_1m ("amin1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1762 gfc_check_min_max_real, gfc_simplify_min, NULL,
1763 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1765 add_sym_1m ("min1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1766 gfc_check_min_max_real, gfc_simplify_min, NULL,
1767 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1769 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1770 gfc_check_min_max_double, gfc_simplify_min, NULL,
1771 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1773 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
1775 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1776 gfc_check_x, gfc_simplify_minexponent, NULL,
1777 x, BT_UNKNOWN, dr, REQUIRED);
1779 make_generic ("minexponent", GFC_ISYM_NONE, GFC_STD_F95);
1781 add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1782 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1783 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1784 msk, BT_LOGICAL, dl, OPTIONAL);
1786 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
1788 add_sym_3red ("minval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1789 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1790 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1791 msk, BT_LOGICAL, dl, OPTIONAL);
1793 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
1795 add_sym_2 ("mod", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1796 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1797 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
1799 add_sym_2 ("amod", 1, 1, BT_REAL, dr, GFC_STD_F77,
1800 NULL, gfc_simplify_mod, gfc_resolve_mod,
1801 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
1803 add_sym_2 ("dmod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1804 NULL, gfc_simplify_mod, gfc_resolve_mod,
1805 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
1807 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
1809 add_sym_2 ("modulo", 1, 1, BT_REAL, di, GFC_STD_F95,
1810 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1811 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
1813 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
1815 add_sym_2 ("nearest", 1, 1, BT_REAL, dr, GFC_STD_F95,
1816 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1817 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
1819 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
1821 add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1822 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1823 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1825 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1826 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1827 a, BT_REAL, dd, REQUIRED);
1829 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
1831 add_sym_1 ("not", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1832 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1833 i, BT_INTEGER, di, REQUIRED);
1835 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
1837 add_sym_1 ("null", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1838 gfc_check_null, gfc_simplify_null, NULL,
1839 mo, BT_INTEGER, di, OPTIONAL);
1841 make_generic ("null", GFC_ISYM_NONE, GFC_STD_F95);
1843 add_sym_3 ("pack", 0, 1, BT_REAL, dr, GFC_STD_F95,
1844 gfc_check_pack, NULL, gfc_resolve_pack,
1845 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1846 v, BT_REAL, dr, OPTIONAL);
1848 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
1850 add_sym_1 ("precision", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1851 gfc_check_precision, gfc_simplify_precision, NULL,
1852 x, BT_UNKNOWN, 0, REQUIRED);
1854 make_generic ("precision", GFC_ISYM_NONE, GFC_STD_F95);
1856 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1857 gfc_check_present, NULL, NULL,
1858 a, BT_REAL, dr, REQUIRED);
1860 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
1862 add_sym_3red ("product", 0, 1, BT_REAL, dr, GFC_STD_F95,
1863 gfc_check_product_sum, NULL, gfc_resolve_product,
1864 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1865 msk, BT_LOGICAL, dl, OPTIONAL);
1867 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
1869 add_sym_1 ("radix", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1870 gfc_check_radix, gfc_simplify_radix, NULL,
1871 x, BT_UNKNOWN, 0, REQUIRED);
1873 make_generic ("radix", GFC_ISYM_NONE, GFC_STD_F95);
1875 /* The following function is for G77 compatibility. */
1876 add_sym_1 ("rand", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1877 gfc_check_rand, NULL, NULL,
1878 i, BT_INTEGER, 4, OPTIONAL);
1880 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
1881 use slightly different shoddy multiplicative congruential PRNG. */
1882 make_alias ("ran", GFC_STD_GNU);
1884 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
1886 add_sym_1 ("range", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1887 gfc_check_range, gfc_simplify_range, NULL,
1888 x, BT_REAL, dr, REQUIRED);
1890 make_generic ("range", GFC_ISYM_NONE, GFC_STD_F95);
1892 add_sym_2 ("real", 1, 0, BT_REAL, dr, GFC_STD_F77,
1893 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1894 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1896 /* This provides compatibility with g77. */
1897 add_sym_1 ("realpart", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1898 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
1899 a, BT_UNKNOWN, dr, REQUIRED);
1901 add_sym_1 ("float", 1, 0, BT_REAL, dr, GFC_STD_F77,
1902 NULL, gfc_simplify_float, NULL,
1903 a, BT_INTEGER, di, REQUIRED);
1905 add_sym_1 ("sngl", 1, 0, BT_REAL, dr, GFC_STD_F77,
1906 NULL, gfc_simplify_sngl, NULL,
1907 a, BT_REAL, dd, REQUIRED);
1909 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
1911 add_sym_2 ("rename", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1912 gfc_check_rename, NULL, gfc_resolve_rename,
1913 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1915 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
1917 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
1918 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1919 stg, BT_CHARACTER, dc, REQUIRED, n, BT_INTEGER, di, REQUIRED);
1921 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
1923 add_sym_4 ("reshape", 0, 1, BT_REAL, dr, GFC_STD_F95,
1924 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1925 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
1926 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
1928 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
1930 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1931 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1932 x, BT_REAL, dr, REQUIRED);
1934 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
1936 add_sym_2 ("scale", 1, 1, BT_REAL, dr, GFC_STD_F95,
1937 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1938 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1940 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
1942 add_sym_3 ("scan", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1943 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1944 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
1945 bck, BT_LOGICAL, dl, OPTIONAL);
1947 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
1949 /* Added for G77 compatibility garbage. */
1950 add_sym_0 ("second", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1951 NULL, NULL, NULL);
1953 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
1955 /* Added for G77 compatibility. */
1956 add_sym_1 ("secnds", 0, 1, BT_REAL, dr, GFC_STD_GNU,
1957 gfc_check_secnds, NULL, gfc_resolve_secnds,
1958 x, BT_REAL, dr, REQUIRED);
1960 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
1962 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1963 gfc_check_selected_int_kind, gfc_simplify_selected_int_kind, NULL,
1964 r, BT_INTEGER, di, REQUIRED);
1966 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
1968 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1969 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1970 NULL,
1971 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
1973 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
1975 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr, GFC_STD_F95,
1976 gfc_check_set_exponent, gfc_simplify_set_exponent,
1977 gfc_resolve_set_exponent,
1978 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1980 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
1982 add_sym_1 ("shape", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1983 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1984 src, BT_REAL, dr, REQUIRED);
1986 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
1988 add_sym_2 ("sign", 1, 1, BT_REAL, dr, GFC_STD_F77,
1989 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1990 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
1992 add_sym_2 ("isign", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1993 NULL, gfc_simplify_sign, gfc_resolve_sign,
1994 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1996 add_sym_2 ("dsign", 1, 1, BT_REAL, dd, GFC_STD_F77,
1997 NULL, gfc_simplify_sign, gfc_resolve_sign,
1998 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2000 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2002 add_sym_2 ("signal", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
2003 gfc_check_signal, NULL, gfc_resolve_signal,
2004 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2006 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2008 add_sym_1 ("sin", 1, 1, BT_REAL, dr, GFC_STD_F77,
2009 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2010 x, BT_REAL, dr, REQUIRED);
2012 add_sym_1 ("dsin", 1, 1, BT_REAL, dd, GFC_STD_F77,
2013 NULL, gfc_simplify_sin, gfc_resolve_sin,
2014 x, BT_REAL, dd, REQUIRED);
2016 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2017 NULL, gfc_simplify_sin, gfc_resolve_sin,
2018 x, BT_COMPLEX, dz, REQUIRED);
2020 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2021 NULL, gfc_simplify_sin, gfc_resolve_sin,
2022 x, BT_COMPLEX, dd, REQUIRED);
2024 make_alias ("cdsin", GFC_STD_GNU);
2026 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2028 add_sym_1 ("sinh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2029 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
2030 x, BT_REAL, dr, REQUIRED);
2032 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2033 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
2034 x, BT_REAL, dd, REQUIRED);
2036 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2038 add_sym_2 ("size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
2039 gfc_check_size, gfc_simplify_size, NULL,
2040 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2042 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2044 add_sym_1 ("spacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
2045 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2046 x, BT_REAL, dr, REQUIRED);
2048 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2050 add_sym_3 ("spread", 0, 1, BT_REAL, dr, GFC_STD_F95,
2051 gfc_check_spread, NULL, gfc_resolve_spread,
2052 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2053 n, BT_INTEGER, di, REQUIRED);
2055 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2057 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr, GFC_STD_F77,
2058 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2059 x, BT_REAL, dr, REQUIRED);
2061 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd, GFC_STD_F77,
2062 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2063 x, BT_REAL, dd, REQUIRED);
2065 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2066 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2067 x, BT_COMPLEX, dz, REQUIRED);
2069 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2070 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2071 x, BT_COMPLEX, dd, REQUIRED);
2073 make_alias ("cdsqrt", GFC_STD_GNU);
2075 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2077 add_sym_2 ("stat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2078 gfc_check_stat, NULL, gfc_resolve_stat,
2079 a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2081 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2083 add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2084 gfc_check_product_sum, NULL, gfc_resolve_sum,
2085 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2086 msk, BT_LOGICAL, dl, OPTIONAL);
2088 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2090 add_sym_2 ("symlnk", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2091 gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2092 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
2094 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2096 add_sym_1 ("system", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
2097 NULL, NULL, NULL,
2098 c, BT_CHARACTER, dc, REQUIRED);
2100 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2102 add_sym_1 ("tan", 1, 1, BT_REAL, dr, GFC_STD_F77,
2103 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2104 x, BT_REAL, dr, REQUIRED);
2106 add_sym_1 ("dtan", 1, 1, BT_REAL, dd, GFC_STD_F77,
2107 NULL, gfc_simplify_tan, gfc_resolve_tan,
2108 x, BT_REAL, dd, REQUIRED);
2110 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2112 add_sym_1 ("tanh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2113 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2114 x, BT_REAL, dr, REQUIRED);
2116 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2117 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
2118 x, BT_REAL, dd, REQUIRED);
2120 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2122 add_sym_0 ("time", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2123 NULL, NULL, gfc_resolve_time);
2125 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2127 add_sym_0 ("time8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2128 NULL, NULL, gfc_resolve_time8);
2130 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2132 add_sym_1 ("tiny", 0, 1, BT_REAL, dr, GFC_STD_F95,
2133 gfc_check_x, gfc_simplify_tiny, NULL,
2134 x, BT_REAL, dr, REQUIRED);
2136 make_generic ("tiny", GFC_ISYM_NONE, GFC_STD_F95);
2138 add_sym_3 ("transfer", 0, 1, BT_REAL, dr, GFC_STD_F95,
2139 gfc_check_transfer, NULL, gfc_resolve_transfer,
2140 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2141 sz, BT_INTEGER, di, OPTIONAL);
2143 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2145 add_sym_1 ("transpose", 0, 1, BT_REAL, dr, GFC_STD_F95,
2146 gfc_check_transpose, NULL, gfc_resolve_transpose,
2147 m, BT_REAL, dr, REQUIRED);
2149 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2151 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
2152 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2153 stg, BT_CHARACTER, dc, REQUIRED);
2155 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2157 add_sym_1 ("ttynam", 0, 1, BT_CHARACTER, 0, GFC_STD_GNU,
2158 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2159 ut, BT_INTEGER, di, REQUIRED);
2161 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2163 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
2164 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2165 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2167 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2169 /* g77 compatibility for UMASK. */
2170 add_sym_1 ("umask", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2171 gfc_check_umask, NULL, gfc_resolve_umask,
2172 a, BT_INTEGER, di, REQUIRED);
2174 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2176 /* g77 compatibility for UNLINK. */
2177 add_sym_1 ("unlink", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2178 gfc_check_unlink, NULL, gfc_resolve_unlink,
2179 a, BT_CHARACTER, dc, REQUIRED);
2181 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2183 add_sym_3 ("unpack", 0, 1, BT_REAL, dr, GFC_STD_F95,
2184 gfc_check_unpack, NULL, gfc_resolve_unpack,
2185 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2186 f, BT_REAL, dr, REQUIRED);
2188 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2190 add_sym_3 ("verify", 1, 1, BT_INTEGER, di, GFC_STD_F95,
2191 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2192 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2193 bck, BT_LOGICAL, dl, OPTIONAL);
2195 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2197 add_sym_1 ("loc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU,
2198 gfc_check_loc, NULL, gfc_resolve_loc,
2199 ar, BT_UNKNOWN, 0, REQUIRED);
2201 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2206 /* Add intrinsic subroutines. */
2208 static void
2209 add_subroutines (void)
2211 /* Argument names as in the standard (to be used as argument keywords). */
2212 const char
2213 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2214 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2215 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2216 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2217 *com = "command", *length = "length", *st = "status",
2218 *val = "value", *num = "number", *name = "name",
2219 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2220 *sec = "seconds", *res = "result", *of = "offset";
2222 int di, dr, dc, dl, ii;
2224 di = gfc_default_integer_kind;
2225 dr = gfc_default_real_kind;
2226 dc = gfc_default_character_kind;
2227 dl = gfc_default_logical_kind;
2228 ii = gfc_index_integer_kind;
2230 add_sym_0s ("abort", 1, GFC_STD_GNU, NULL);
2232 make_noreturn();
2234 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2235 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2236 tm, BT_REAL, dr, REQUIRED);
2238 /* More G77 compatibility garbage. */
2239 add_sym_2s ("ctime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2240 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2241 tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2243 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2244 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2245 tm, BT_REAL, dr, REQUIRED);
2247 add_sym_2s ("chdir", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2248 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2249 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2251 add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2252 gfc_check_date_and_time, NULL, NULL,
2253 dt, BT_CHARACTER, dc, OPTIONAL, tm, BT_CHARACTER, dc, OPTIONAL,
2254 zn, BT_CHARACTER, dc, OPTIONAL, vl, BT_INTEGER, di, OPTIONAL);
2256 /* More G77 compatibility garbage. */
2257 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2258 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2259 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2261 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2262 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2263 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2265 add_sym_1s ("fdate", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2266 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2267 dt, BT_CHARACTER, dc, REQUIRED);
2269 add_sym_1s ("gerror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2270 gfc_check_gerror, NULL, gfc_resolve_gerror, c, BT_CHARACTER,
2271 dc, REQUIRED);
2273 add_sym_2s ("getcwd", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2274 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2275 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2277 add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2278 NULL, NULL, NULL,
2279 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2281 add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2282 NULL, NULL, gfc_resolve_getarg,
2283 c, BT_INTEGER, di, REQUIRED, vl, BT_CHARACTER, dc, REQUIRED);
2285 add_sym_1s ("getlog", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2286 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2287 dc, REQUIRED);
2289 /* F2003 commandline routines. */
2291 add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2292 NULL, NULL, gfc_resolve_get_command,
2293 com, BT_CHARACTER, dc, OPTIONAL, length, BT_INTEGER, di, OPTIONAL,
2294 st, BT_INTEGER, di, OPTIONAL);
2296 add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2297 NULL, NULL, gfc_resolve_get_command_argument,
2298 num, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2299 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL);
2301 /* F2003 subroutine to get environment variables. */
2303 add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2304 NULL, NULL, gfc_resolve_get_environment_variable,
2305 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2306 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL,
2307 trim_name, BT_LOGICAL, dl, OPTIONAL);
2309 add_sym_5s ("mvbits", 1, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2310 gfc_check_mvbits, gfc_simplify_mvbits, gfc_resolve_mvbits,
2311 f, BT_INTEGER, di, REQUIRED, fp, BT_INTEGER, di, REQUIRED,
2312 ln, BT_INTEGER, di, REQUIRED, t, BT_INTEGER, di, REQUIRED,
2313 tp, BT_INTEGER, di, REQUIRED);
2315 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2316 gfc_check_random_number, NULL, gfc_resolve_random_number,
2317 h, BT_REAL, dr, REQUIRED);
2319 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2320 gfc_check_random_seed, NULL, NULL,
2321 sz, BT_INTEGER, di, OPTIONAL, pt, BT_INTEGER, di, OPTIONAL,
2322 gt, BT_INTEGER, di, OPTIONAL);
2324 /* More G77 compatibility garbage. */
2325 add_sym_3s ("alarm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2326 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2327 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2328 st, BT_INTEGER, di, OPTIONAL);
2330 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di, GFC_STD_GNU,
2331 gfc_check_srand, NULL, gfc_resolve_srand,
2332 c, BT_INTEGER, 4, REQUIRED);
2334 add_sym_1s ("exit", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2335 gfc_check_exit, NULL, gfc_resolve_exit,
2336 c, BT_INTEGER, di, OPTIONAL);
2338 make_noreturn();
2340 add_sym_3s ("fgetc", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2341 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2342 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2343 st, BT_INTEGER, di, OPTIONAL);
2345 add_sym_2s ("fget", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2346 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2347 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2349 add_sym_1s ("flush", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2350 gfc_check_flush, NULL, gfc_resolve_flush,
2351 c, BT_INTEGER, di, OPTIONAL);
2353 add_sym_3s ("fputc", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2354 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2355 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2356 st, BT_INTEGER, di, OPTIONAL);
2358 add_sym_2s ("fput", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2359 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2360 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2362 add_sym_1s ("free", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_free,
2363 NULL, gfc_resolve_free, c, BT_INTEGER, ii, REQUIRED);
2365 add_sym_2s ("ftell", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2366 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2367 ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2369 add_sym_2s ("hostnm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2370 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2371 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2373 add_sym_3s ("kill", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2374 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2375 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2377 add_sym_3s ("link", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2378 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2379 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2380 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2382 add_sym_1s ("perror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2383 gfc_check_perror, NULL, gfc_resolve_perror,
2384 c, BT_CHARACTER, dc, REQUIRED);
2386 add_sym_3s ("rename", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2387 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2388 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2389 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2391 add_sym_1s ("sleep", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2392 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2393 val, BT_CHARACTER, dc, REQUIRED);
2395 add_sym_3s ("fstat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2396 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2397 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2398 st, BT_INTEGER, di, OPTIONAL);
2400 add_sym_3s ("stat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2401 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2402 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2403 st, BT_INTEGER, di, OPTIONAL);
2405 add_sym_3s ("signal", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2406 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2407 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2408 st, BT_INTEGER, di, OPTIONAL);
2410 add_sym_3s ("symlnk", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2411 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2412 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2413 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2415 add_sym_2s ("system", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2416 NULL, NULL, gfc_resolve_system_sub,
2417 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2419 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2420 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2421 c, BT_INTEGER, di, OPTIONAL, cr, BT_INTEGER, di, OPTIONAL,
2422 cm, BT_INTEGER, di, OPTIONAL);
2424 add_sym_2s ("ttynam", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2425 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2426 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
2428 add_sym_2s ("umask", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2429 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2430 val, BT_INTEGER, di, REQUIRED, num, BT_INTEGER, di, OPTIONAL);
2432 add_sym_2s ("unlink", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2433 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2434 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2439 /* Add a function to the list of conversion symbols. */
2441 static void
2442 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2445 gfc_typespec from, to;
2446 gfc_intrinsic_sym *sym;
2448 if (sizing == SZ_CONVS)
2450 nconv++;
2451 return;
2454 gfc_clear_ts (&from);
2455 from.type = from_type;
2456 from.kind = from_kind;
2458 gfc_clear_ts (&to);
2459 to.type = to_type;
2460 to.kind = to_kind;
2462 sym = conversion + nconv;
2464 sym->name = conv_name (&from, &to);
2465 sym->lib_name = sym->name;
2466 sym->simplify.cc = gfc_convert_constant;
2467 sym->standard = standard;
2468 sym->elemental = 1;
2469 sym->ts = to;
2470 sym->generic_id = GFC_ISYM_CONVERSION;
2472 nconv++;
2476 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2477 functions by looping over the kind tables. */
2479 static void
2480 add_conversions (void)
2482 int i, j;
2484 /* Integer-Integer conversions. */
2485 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2486 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2488 if (i == j)
2489 continue;
2491 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2492 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2495 /* Integer-Real/Complex conversions. */
2496 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2497 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2499 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2500 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2502 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2503 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2505 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2506 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2508 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2509 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2512 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2514 /* Hollerith-Integer conversions. */
2515 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2516 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2517 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2518 /* Hollerith-Real conversions. */
2519 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2520 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2521 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2522 /* Hollerith-Complex conversions. */
2523 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2524 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2525 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2527 /* Hollerith-Character conversions. */
2528 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2529 gfc_default_character_kind, GFC_STD_LEGACY);
2531 /* Hollerith-Logical conversions. */
2532 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2533 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2534 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2537 /* Real/Complex - Real/Complex conversions. */
2538 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2539 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2541 if (i != j)
2543 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2544 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2546 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2547 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2550 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2551 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2553 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2554 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2557 /* Logical/Logical kind conversion. */
2558 for (i = 0; gfc_logical_kinds[i].kind; i++)
2559 for (j = 0; gfc_logical_kinds[j].kind; j++)
2561 if (i == j)
2562 continue;
2564 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2565 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
2568 /* Integer-Logical and Logical-Integer conversions. */
2569 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2570 for (i=0; gfc_integer_kinds[i].kind; i++)
2571 for (j=0; gfc_logical_kinds[j].kind; j++)
2573 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2574 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
2575 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
2576 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2581 /* Initialize the table of intrinsics. */
2582 void
2583 gfc_intrinsic_init_1 (void)
2585 int i;
2587 nargs = nfunc = nsub = nconv = 0;
2589 /* Create a namespace to hold the resolved intrinsic symbols. */
2590 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
2592 sizing = SZ_FUNCS;
2593 add_functions ();
2594 sizing = SZ_SUBS;
2595 add_subroutines ();
2596 sizing = SZ_CONVS;
2597 add_conversions ();
2599 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2600 + sizeof (gfc_intrinsic_arg) * nargs);
2602 next_sym = functions;
2603 subroutines = functions + nfunc;
2605 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2607 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2609 sizing = SZ_NOTHING;
2610 nconv = 0;
2612 add_functions ();
2613 add_subroutines ();
2614 add_conversions ();
2616 /* Set the pure flag. All intrinsic functions are pure, and
2617 intrinsic subroutines are pure if they are elemental. */
2619 for (i = 0; i < nfunc; i++)
2620 functions[i].pure = 1;
2622 for (i = 0; i < nsub; i++)
2623 subroutines[i].pure = subroutines[i].elemental;
2627 void
2628 gfc_intrinsic_done_1 (void)
2630 gfc_free (functions);
2631 gfc_free (conversion);
2632 gfc_free_namespace (gfc_intrinsic_namespace);
2636 /******** Subroutines to check intrinsic interfaces ***********/
2638 /* Given a formal argument list, remove any NULL arguments that may
2639 have been left behind by a sort against some formal argument list. */
2641 static void
2642 remove_nullargs (gfc_actual_arglist ** ap)
2644 gfc_actual_arglist *head, *tail, *next;
2646 tail = NULL;
2648 for (head = *ap; head; head = next)
2650 next = head->next;
2652 if (head->expr == NULL)
2654 head->next = NULL;
2655 gfc_free_actual_arglist (head);
2657 else
2659 if (tail == NULL)
2660 *ap = head;
2661 else
2662 tail->next = head;
2664 tail = head;
2665 tail->next = NULL;
2669 if (tail == NULL)
2670 *ap = NULL;
2674 /* Given an actual arglist and a formal arglist, sort the actual
2675 arglist so that its arguments are in a one-to-one correspondence
2676 with the format arglist. Arguments that are not present are given
2677 a blank gfc_actual_arglist structure. If something is obviously
2678 wrong (say, a missing required argument) we abort sorting and
2679 return FAILURE. */
2681 static try
2682 sort_actual (const char *name, gfc_actual_arglist ** ap,
2683 gfc_intrinsic_arg * formal, locus * where)
2686 gfc_actual_arglist *actual, *a;
2687 gfc_intrinsic_arg *f;
2689 remove_nullargs (ap);
2690 actual = *ap;
2692 for (f = formal; f; f = f->next)
2693 f->actual = NULL;
2695 f = formal;
2696 a = actual;
2698 if (f == NULL && a == NULL) /* No arguments */
2699 return SUCCESS;
2701 for (;;)
2702 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2703 if (f == NULL)
2704 break;
2705 if (a == NULL)
2706 goto optional;
2708 if (a->name != NULL)
2709 goto keywords;
2711 f->actual = a;
2713 f = f->next;
2714 a = a->next;
2717 if (a == NULL)
2718 goto do_sort;
2720 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2721 return FAILURE;
2723 keywords:
2724 /* Associate the remaining actual arguments, all of which have
2725 to be keyword arguments. */
2726 for (; a; a = a->next)
2728 for (f = formal; f; f = f->next)
2729 if (strcmp (a->name, f->name) == 0)
2730 break;
2732 if (f == NULL)
2734 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2735 a->name, name, where);
2736 return FAILURE;
2739 if (f->actual != NULL)
2741 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2742 f->name, name, where);
2743 return FAILURE;
2746 f->actual = a;
2749 optional:
2750 /* At this point, all unmatched formal args must be optional. */
2751 for (f = formal; f; f = f->next)
2753 if (f->actual == NULL && f->optional == 0)
2755 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2756 f->name, name, where);
2757 return FAILURE;
2761 do_sort:
2762 /* Using the formal argument list, string the actual argument list
2763 together in a way that corresponds with the formal list. */
2764 actual = NULL;
2766 for (f = formal; f; f = f->next)
2768 if (f->actual == NULL)
2770 a = gfc_get_actual_arglist ();
2771 a->missing_arg_type = f->ts.type;
2773 else
2774 a = f->actual;
2776 if (actual == NULL)
2777 *ap = a;
2778 else
2779 actual->next = a;
2781 actual = a;
2783 actual->next = NULL; /* End the sorted argument list. */
2785 return SUCCESS;
2789 /* Compare an actual argument list with an intrinsic's formal argument
2790 list. The lists are checked for agreement of type. We don't check
2791 for arrayness here. */
2793 static try
2794 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2795 int error_flag)
2797 gfc_actual_arglist *actual;
2798 gfc_intrinsic_arg *formal;
2799 int i;
2801 formal = sym->formal;
2802 actual = *ap;
2804 i = 0;
2805 for (; formal; formal = formal->next, actual = actual->next, i++)
2807 if (actual->expr == NULL)
2808 continue;
2810 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2812 if (error_flag)
2813 gfc_error
2814 ("Type of argument '%s' in call to '%s' at %L should be "
2815 "%s, not %s", gfc_current_intrinsic_arg[i],
2816 gfc_current_intrinsic, &actual->expr->where,
2817 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2818 return FAILURE;
2822 return SUCCESS;
2826 /* Given a pointer to an intrinsic symbol and an expression node that
2827 represent the function call to that subroutine, figure out the type
2828 of the result. This may involve calling a resolution subroutine. */
2830 static void
2831 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2833 gfc_expr *a1, *a2, *a3, *a4, *a5;
2834 gfc_actual_arglist *arg;
2836 if (specific->resolve.f1 == NULL)
2838 if (e->value.function.name == NULL)
2839 e->value.function.name = specific->lib_name;
2841 if (e->ts.type == BT_UNKNOWN)
2842 e->ts = specific->ts;
2843 return;
2846 arg = e->value.function.actual;
2848 /* Special case hacks for MIN and MAX. */
2849 if (specific->resolve.f1m == gfc_resolve_max
2850 || specific->resolve.f1m == gfc_resolve_min)
2852 (*specific->resolve.f1m) (e, arg);
2853 return;
2856 if (arg == NULL)
2858 (*specific->resolve.f0) (e);
2859 return;
2862 a1 = arg->expr;
2863 arg = arg->next;
2865 if (arg == NULL)
2867 (*specific->resolve.f1) (e, a1);
2868 return;
2871 a2 = arg->expr;
2872 arg = arg->next;
2874 if (arg == NULL)
2876 (*specific->resolve.f2) (e, a1, a2);
2877 return;
2880 a3 = arg->expr;
2881 arg = arg->next;
2883 if (arg == NULL)
2885 (*specific->resolve.f3) (e, a1, a2, a3);
2886 return;
2889 a4 = arg->expr;
2890 arg = arg->next;
2892 if (arg == NULL)
2894 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2895 return;
2898 a5 = arg->expr;
2899 arg = arg->next;
2901 if (arg == NULL)
2903 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2904 return;
2907 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2911 /* Given an intrinsic symbol node and an expression node, call the
2912 simplification function (if there is one), perhaps replacing the
2913 expression with something simpler. We return FAILURE on an error
2914 of the simplification, SUCCESS if the simplification worked, even
2915 if nothing has changed in the expression itself. */
2917 static try
2918 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2920 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2921 gfc_actual_arglist *arg;
2923 /* Check the arguments if there are Hollerith constants. We deal with
2924 them at run-time. */
2925 for (arg = e->value.function.actual; arg != NULL; arg = arg->next)
2927 if (arg->expr && arg->expr->from_H)
2929 result = NULL;
2930 goto finish;
2933 /* Max and min require special handling due to the variable number
2934 of args. */
2935 if (specific->simplify.f1 == gfc_simplify_min)
2937 result = gfc_simplify_min (e);
2938 goto finish;
2941 if (specific->simplify.f1 == gfc_simplify_max)
2943 result = gfc_simplify_max (e);
2944 goto finish;
2947 if (specific->simplify.f1 == NULL)
2949 result = NULL;
2950 goto finish;
2953 arg = e->value.function.actual;
2955 if (arg == NULL)
2957 result = (*specific->simplify.f0) ();
2958 goto finish;
2961 a1 = arg->expr;
2962 arg = arg->next;
2964 if (specific->simplify.cc == gfc_convert_constant)
2966 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2967 goto finish;
2970 /* TODO: Warn if -pedantic and initialization expression and arg
2971 types not integer or character */
2973 if (arg == NULL)
2974 result = (*specific->simplify.f1) (a1);
2975 else
2977 a2 = arg->expr;
2978 arg = arg->next;
2980 if (arg == NULL)
2981 result = (*specific->simplify.f2) (a1, a2);
2982 else
2984 a3 = arg->expr;
2985 arg = arg->next;
2987 if (arg == NULL)
2988 result = (*specific->simplify.f3) (a1, a2, a3);
2989 else
2991 a4 = arg->expr;
2992 arg = arg->next;
2994 if (arg == NULL)
2995 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2996 else
2998 a5 = arg->expr;
2999 arg = arg->next;
3001 if (arg == NULL)
3002 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3003 else
3004 gfc_internal_error
3005 ("do_simplify(): Too many args for intrinsic");
3011 finish:
3012 if (result == &gfc_bad_expr)
3013 return FAILURE;
3015 if (result == NULL)
3016 resolve_intrinsic (specific, e); /* Must call at run-time */
3017 else
3019 result->where = e->where;
3020 gfc_replace_expr (e, result);
3023 return SUCCESS;
3027 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3028 error messages. This subroutine returns FAILURE if a subroutine
3029 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3030 list cannot match any intrinsic. */
3032 static void
3033 init_arglist (gfc_intrinsic_sym * isym)
3035 gfc_intrinsic_arg *formal;
3036 int i;
3038 gfc_current_intrinsic = isym->name;
3040 i = 0;
3041 for (formal = isym->formal; formal; formal = formal->next)
3043 if (i >= MAX_INTRINSIC_ARGS)
3044 gfc_internal_error ("init_arglist(): too many arguments");
3045 gfc_current_intrinsic_arg[i++] = formal->name;
3050 /* Given a pointer to an intrinsic symbol and an expression consisting
3051 of a function call, see if the function call is consistent with the
3052 intrinsic's formal argument list. Return SUCCESS if the expression
3053 and intrinsic match, FAILURE otherwise. */
3055 static try
3056 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
3058 gfc_actual_arglist *arg, **ap;
3059 int r;
3060 try t;
3062 ap = &expr->value.function.actual;
3064 init_arglist (specific);
3066 /* Don't attempt to sort the argument list for min or max. */
3067 if (specific->check.f1m == gfc_check_min_max
3068 || specific->check.f1m == gfc_check_min_max_integer
3069 || specific->check.f1m == gfc_check_min_max_real
3070 || specific->check.f1m == gfc_check_min_max_double)
3071 return (*specific->check.f1m) (*ap);
3073 if (sort_actual (specific->name, ap, specific->formal,
3074 &expr->where) == FAILURE)
3075 return FAILURE;
3077 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3078 /* This is special because we might have to reorder the argument
3079 list. */
3080 t = gfc_check_minloc_maxloc (*ap);
3081 else if (specific->check.f3red == gfc_check_minval_maxval)
3082 /* This is also special because we also might have to reorder the
3083 argument list. */
3084 t = gfc_check_minval_maxval (*ap);
3085 else if (specific->check.f3red == gfc_check_product_sum)
3086 /* Same here. The difference to the previous case is that we allow a
3087 general numeric type. */
3088 t = gfc_check_product_sum (*ap);
3089 else
3091 if (specific->check.f1 == NULL)
3093 t = check_arglist (ap, specific, error_flag);
3094 if (t == SUCCESS)
3095 expr->ts = specific->ts;
3097 else
3098 t = do_check (specific, *ap);
3101 /* Check ranks for elemental intrinsics. */
3102 if (t == SUCCESS && specific->elemental)
3104 r = 0;
3105 for (arg = expr->value.function.actual; arg; arg = arg->next)
3107 if (arg->expr == NULL || arg->expr->rank == 0)
3108 continue;
3109 if (r == 0)
3111 r = arg->expr->rank;
3112 continue;
3115 if (arg->expr->rank != r)
3117 gfc_error
3118 ("Ranks of arguments to elemental intrinsic '%s' differ "
3119 "at %L", specific->name, &arg->expr->where);
3120 return FAILURE;
3125 if (t == FAILURE)
3126 remove_nullargs (ap);
3128 return t;
3132 /* See if an intrinsic is one of the intrinsics we evaluate
3133 as an extension. */
3135 static int
3136 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
3138 /* FIXME: This should be moved into the intrinsic definitions. */
3139 static const char * const init_expr_extensions[] = {
3140 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
3141 "precision", "present", "radix", "range", "selected_real_kind",
3142 "tiny", NULL
3145 int i;
3147 for (i = 0; init_expr_extensions[i]; i++)
3148 if (strcmp (init_expr_extensions[i], isym->name) == 0)
3149 return 0;
3151 return 1;
3155 /* Check whether an intrinsic belongs to whatever standard the user
3156 has chosen. */
3158 static void
3159 check_intrinsic_standard (const char *name, int standard, locus * where)
3161 if (!gfc_option.warn_nonstd_intrinsics)
3162 return;
3164 gfc_notify_std (standard, "Intrinsic '%s' at %L is not included "
3165 "in the selected standard", name, where);
3169 /* See if a function call corresponds to an intrinsic function call.
3170 We return:
3172 MATCH_YES if the call corresponds to an intrinsic, simplification
3173 is done if possible.
3175 MATCH_NO if the call does not correspond to an intrinsic
3177 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3178 error during the simplification process.
3180 The error_flag parameter enables an error reporting. */
3182 match
3183 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
3185 gfc_intrinsic_sym *isym, *specific;
3186 gfc_actual_arglist *actual;
3187 const char *name;
3188 int flag;
3190 if (expr->value.function.isym != NULL)
3191 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3192 ? MATCH_ERROR : MATCH_YES;
3194 gfc_suppress_error = !error_flag;
3195 flag = 0;
3197 for (actual = expr->value.function.actual; actual; actual = actual->next)
3198 if (actual->expr != NULL)
3199 flag |= (actual->expr->ts.type != BT_INTEGER
3200 && actual->expr->ts.type != BT_CHARACTER);
3202 name = expr->symtree->n.sym->name;
3204 isym = specific = gfc_find_function (name);
3205 if (isym == NULL)
3207 gfc_suppress_error = 0;
3208 return MATCH_NO;
3211 gfc_current_intrinsic_where = &expr->where;
3213 /* Bypass the generic list for min and max. */
3214 if (isym->check.f1m == gfc_check_min_max)
3216 init_arglist (isym);
3218 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3219 goto got_specific;
3221 gfc_suppress_error = 0;
3222 return MATCH_NO;
3225 /* If the function is generic, check all of its specific
3226 incarnations. If the generic name is also a specific, we check
3227 that name last, so that any error message will correspond to the
3228 specific. */
3229 gfc_suppress_error = 1;
3231 if (isym->generic)
3233 for (specific = isym->specific_head; specific;
3234 specific = specific->next)
3236 if (specific == isym)
3237 continue;
3238 if (check_specific (specific, expr, 0) == SUCCESS)
3239 goto got_specific;
3243 gfc_suppress_error = !error_flag;
3245 if (check_specific (isym, expr, error_flag) == FAILURE)
3247 gfc_suppress_error = 0;
3248 return MATCH_NO;
3251 specific = isym;
3253 got_specific:
3254 expr->value.function.isym = specific;
3255 gfc_intrinsic_symbol (expr->symtree->n.sym);
3257 gfc_suppress_error = 0;
3258 if (do_simplify (specific, expr) == FAILURE)
3259 return MATCH_ERROR;
3261 /* TODO: We should probably only allow elemental functions here. */
3262 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
3264 if (pedantic && gfc_init_expr
3265 && flag && gfc_init_expr_extensions (specific))
3267 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
3268 "nonstandard initialization expression at %L", &expr->where)
3269 == FAILURE)
3271 return MATCH_ERROR;
3275 check_intrinsic_standard (name, isym->standard, &expr->where);
3277 return MATCH_YES;
3281 /* See if a CALL statement corresponds to an intrinsic subroutine.
3282 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3283 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3284 correspond). */
3286 match
3287 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
3289 gfc_intrinsic_sym *isym;
3290 const char *name;
3292 name = c->symtree->n.sym->name;
3294 isym = find_subroutine (name);
3295 if (isym == NULL)
3296 return MATCH_NO;
3298 gfc_suppress_error = !error_flag;
3300 init_arglist (isym);
3302 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3303 goto fail;
3305 if (isym->check.f1 != NULL)
3307 if (do_check (isym, c->ext.actual) == FAILURE)
3308 goto fail;
3310 else
3312 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3313 goto fail;
3316 /* The subroutine corresponds to an intrinsic. Allow errors to be
3317 seen at this point. */
3318 gfc_suppress_error = 0;
3320 if (isym->resolve.s1 != NULL)
3321 isym->resolve.s1 (c);
3322 else
3323 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3325 if (gfc_pure (NULL) && !isym->elemental)
3327 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3328 &c->loc);
3329 return MATCH_ERROR;
3332 c->resolved_sym->attr.noreturn = isym->noreturn;
3333 check_intrinsic_standard (name, isym->standard, &c->loc);
3335 return MATCH_YES;
3337 fail:
3338 gfc_suppress_error = 0;
3339 return MATCH_NO;
3343 /* Call gfc_convert_type() with warning enabled. */
3346 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
3348 return gfc_convert_type_warn (expr, ts, eflag, 1);
3352 /* Try to convert an expression (in place) from one type to another.
3353 'eflag' controls the behavior on error.
3355 The possible values are:
3357 1 Generate a gfc_error()
3358 2 Generate a gfc_internal_error().
3360 'wflag' controls the warning related to conversion. */
3363 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
3364 int wflag)
3366 gfc_intrinsic_sym *sym;
3367 gfc_typespec from_ts;
3368 locus old_where;
3369 gfc_expr *new;
3370 int rank;
3371 mpz_t *shape;
3373 from_ts = expr->ts; /* expr->ts gets clobbered */
3375 if (ts->type == BT_UNKNOWN)
3376 goto bad;
3378 /* NULL and zero size arrays get their type here. */
3379 if (expr->expr_type == EXPR_NULL
3380 || (expr->expr_type == EXPR_ARRAY
3381 && expr->value.constructor == NULL))
3383 /* Sometimes the RHS acquire the type. */
3384 expr->ts = *ts;
3385 return SUCCESS;
3388 if (expr->ts.type == BT_UNKNOWN)
3389 goto bad;
3391 if (expr->ts.type == BT_DERIVED
3392 && ts->type == BT_DERIVED
3393 && gfc_compare_types (&expr->ts, ts))
3394 return SUCCESS;
3396 sym = find_conv (&expr->ts, ts);
3397 if (sym == NULL)
3398 goto bad;
3400 /* At this point, a conversion is necessary. A warning may be needed. */
3401 if ((gfc_option.warn_std & sym->standard) != 0)
3402 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3403 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3404 else if (wflag && gfc_option.warn_conversion)
3405 gfc_warning_now ("Conversion from %s to %s at %L",
3406 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3408 /* Insert a pre-resolved function call to the right function. */
3409 old_where = expr->where;
3410 rank = expr->rank;
3411 shape = expr->shape;
3413 new = gfc_get_expr ();
3414 *new = *expr;
3416 new = gfc_build_conversion (new);
3417 new->value.function.name = sym->lib_name;
3418 new->value.function.isym = sym;
3419 new->where = old_where;
3420 new->rank = rank;
3421 new->shape = gfc_copy_shape (shape, rank);
3423 gfc_get_ha_sym_tree (sym->name, &new->symtree);
3424 new->symtree->n.sym->ts = *ts;
3425 new->symtree->n.sym->attr.flavor = FL_PROCEDURE;
3426 new->symtree->n.sym->attr.function = 1;
3427 new->symtree->n.sym->attr.intrinsic = 1;
3428 new->symtree->n.sym->attr.elemental = 1;
3429 new->symtree->n.sym->attr.pure = 1;
3430 new->symtree->n.sym->attr.referenced = 1;
3431 gfc_intrinsic_symbol(new->symtree->n.sym);
3432 gfc_commit_symbol (new->symtree->n.sym);
3434 *expr = *new;
3436 gfc_free (new);
3437 expr->ts = *ts;
3439 if (gfc_is_constant_expr (expr->value.function.actual->expr)
3440 && do_simplify (sym, expr) == FAILURE)
3443 if (eflag == 2)
3444 goto bad;
3445 return FAILURE; /* Error already generated in do_simplify() */
3448 return SUCCESS;
3450 bad:
3451 if (eflag == 1)
3453 gfc_error ("Can't convert %s to %s at %L",
3454 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3455 return FAILURE;
3458 gfc_internal_error ("Can't convert %s to %s at %L",
3459 gfc_typename (&from_ts), gfc_typename (ts),
3460 &expr->where);
3461 /* Not reached */