1 /* Build up a list of intrinsic subroutines and functions for the
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, 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
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
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
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
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;
50 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
56 /* Return a letter based on the passed type. Used to construct the
57 name of a type-dependent subroutine. */
60 gfc_type_letter (bt type)
95 /* Get a symbol for a resolved name. */
98 gfc_get_intrinsic_sub_symbol (const char * name)
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;
112 /* Return a pointer to the name of a conversion function given two
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
131 static gfc_intrinsic_sym *
132 find_conv (gfc_typespec * from, gfc_typespec * to)
134 gfc_intrinsic_sym *sym;
138 target = conv_name (from, to);
141 for (i = 0; i < nconv; i++, sym++)
142 if (strcmp (target, sym->name) == 0)
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. */
154 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
156 gfc_expr *a1, *a2, *a3, *a4, *a5;
159 return (*specific->check.f0) ();
164 return (*specific->check.f1) (a1);
169 return (*specific->check.f2) (a1, a2);
174 return (*specific->check.f3) (a1, a2, a3);
179 return (*specific->check.f4) (a1, a2, a3, a4);
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.
195 char * name of function
196 int whether function is elemental
197 int If the function can be used as an actual argument [1] [2]
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
209 int arg optional flag (1=optional, 0=required)
211 The sequence is terminated by a NULL name.
214 [1] Whether a function can or cannot be used as an actual argument is
215 determined by its presence on the 13.6 list in Fortran 2003. The
216 following intrinsics, which are GNU extensions, are considered allowed
217 as actual arguments: ACOSH ATANH DACOSH DASINH DATANH DCONJG DIMAG
218 ZABS ZCOS ZEXP ZLOG ZSIN ZSQRT.
219 [2] The value 2 is used in this field for CHAR, which is allowed as an
220 actual argument in F2003, but not in F95. It is the only such
221 intrinsic function. */
224 add_sym (const char *name, int elemental, int actual_ok, bt type, int kind,
225 int standard, gfc_check_f check, gfc_simplify_f simplify,
226 gfc_resolve_f resolve, ...)
228 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
229 int optional, first_flag;
232 /* First check that the intrinsic belongs to the selected standard.
233 If not, don't add it to the symbol list. */
234 if (!(gfc_option.allow_std & standard)
235 && gfc_option.flag_all_intrinsics == 0)
249 next_sym->name = gfc_get_string (name);
251 strcpy (buf, "_gfortran_");
253 next_sym->lib_name = gfc_get_string (buf);
255 next_sym->elemental = elemental;
256 next_sym->actual_ok = actual_ok;
257 next_sym->ts.type = type;
258 next_sym->ts.kind = kind;
259 next_sym->standard = standard;
260 next_sym->simplify = simplify;
261 next_sym->check = check;
262 next_sym->resolve = resolve;
263 next_sym->specific = 0;
264 next_sym->generic = 0;
268 gfc_internal_error ("add_sym(): Bad sizing mode");
271 va_start (argp, resolve);
277 name = va_arg (argp, char *);
281 type = (bt) va_arg (argp, int);
282 kind = va_arg (argp, int);
283 optional = va_arg (argp, int);
285 if (sizing != SZ_NOTHING)
292 next_sym->formal = next_arg;
294 (next_arg - 1)->next = next_arg;
298 strcpy (next_arg->name, name);
299 next_arg->ts.type = type;
300 next_arg->ts.kind = kind;
301 next_arg->optional = optional;
311 /* Add a symbol to the function list where the function takes
315 add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
316 int kind, int standard,
318 gfc_expr *(*simplify)(void),
319 void (*resolve)(gfc_expr *))
329 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
334 /* Add a symbol to the subroutine list where the subroutine takes
338 add_sym_0s (const char * name, int standard,
339 void (*resolve)(gfc_code *))
349 add_sym (name, 1, 0, BT_UNKNOWN, 0, standard, cf, sf, rf,
354 /* Add a symbol to the function list where the function takes
358 add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
359 int kind, int standard,
360 try (*check)(gfc_expr *),
361 gfc_expr *(*simplify)(gfc_expr *),
362 void (*resolve)(gfc_expr *,gfc_expr *),
363 const char* a1, bt type1, int kind1, int optional1)
373 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
374 a1, type1, kind1, optional1,
379 /* Add a symbol to the subroutine list where the subroutine takes
383 add_sym_1s (const char *name, int elemental, bt type,
384 int kind, int standard,
385 try (*check)(gfc_expr *),
386 gfc_expr *(*simplify)(gfc_expr *),
387 void (*resolve)(gfc_code *),
388 const char* a1, bt type1, int kind1, int optional1)
398 add_sym (name, elemental, 0, type, kind, standard, cf, sf, rf,
399 a1, type1, kind1, optional1,
404 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
405 function. MAX et al take 2 or more arguments. */
408 add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
409 int kind, int standard,
410 try (*check)(gfc_actual_arglist *),
411 gfc_expr *(*simplify)(gfc_expr *),
412 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
413 const char* a1, bt type1, int kind1, int optional1,
414 const char* a2, bt type2, int kind2, int optional2)
424 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
425 a1, type1, kind1, optional1,
426 a2, type2, kind2, optional2,
431 /* Add a symbol to the function list where the function takes
435 add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
436 int kind, int standard,
437 try (*check)(gfc_expr *,gfc_expr *),
438 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
439 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
440 const char* a1, bt type1, int kind1, int optional1,
441 const char* a2, bt type2, int kind2, int optional2)
451 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
452 a1, type1, kind1, optional1,
453 a2, type2, kind2, optional2,
458 /* Add a symbol to the subroutine list where the subroutine takes
462 add_sym_2s (const char *name, int elemental, bt type,
463 int kind, int standard,
464 try (*check)(gfc_expr *,gfc_expr *),
465 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
466 void (*resolve)(gfc_code *),
467 const char* a1, bt type1, int kind1, int optional1,
468 const char* a2, bt type2, int kind2, int optional2)
478 add_sym (name, elemental, 0, type, kind, standard, cf, sf, rf,
479 a1, type1, kind1, optional1,
480 a2, type2, kind2, optional2,
485 /* Add a symbol to the function list where the function takes
489 add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
490 int kind, int standard,
491 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
492 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
493 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
494 const char* a1, bt type1, int kind1, int optional1,
495 const char* a2, bt type2, int kind2, int optional2,
496 const char* a3, bt type3, int kind3, int optional3)
506 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
507 a1, type1, kind1, optional1,
508 a2, type2, kind2, optional2,
509 a3, type3, kind3, optional3,
514 /* MINLOC and MAXLOC get special treatment because their argument
515 might have to be reordered. */
518 add_sym_3ml (const char *name, int elemental,
519 int actual_ok, bt type, int kind, int standard,
520 try (*check)(gfc_actual_arglist *),
521 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
522 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
523 const char* a1, bt type1, int kind1, int optional1,
524 const char* a2, bt type2, int kind2, int optional2,
525 const char* a3, bt type3, int kind3, int optional3)
535 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
536 a1, type1, kind1, optional1,
537 a2, type2, kind2, optional2,
538 a3, type3, kind3, optional3,
543 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
544 their argument also might have to be reordered. */
547 add_sym_3red (const char *name, int elemental,
548 int actual_ok, bt type, int kind, int standard,
549 try (*check)(gfc_actual_arglist *),
550 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
551 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
552 const char* a1, bt type1, int kind1, int optional1,
553 const char* a2, bt type2, int kind2, int optional2,
554 const char* a3, bt type3, int kind3, int optional3)
564 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
565 a1, type1, kind1, optional1,
566 a2, type2, kind2, optional2,
567 a3, type3, kind3, optional3,
572 /* Add a symbol to the subroutine list where the subroutine takes
576 add_sym_3s (const char *name, int elemental, bt type,
577 int kind, int standard,
578 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
579 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
580 void (*resolve)(gfc_code *),
581 const char* a1, bt type1, int kind1, int optional1,
582 const char* a2, bt type2, int kind2, int optional2,
583 const char* a3, bt type3, int kind3, int optional3)
593 add_sym (name, elemental, 0, type, kind, standard, cf, sf, rf,
594 a1, type1, kind1, optional1,
595 a2, type2, kind2, optional2,
596 a3, type3, kind3, optional3,
601 /* Add a symbol to the function list where the function takes
605 add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
606 int kind, int standard,
607 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
608 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
609 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
610 const char* a1, bt type1, int kind1, int optional1,
611 const char* a2, bt type2, int kind2, int optional2,
612 const char* a3, bt type3, int kind3, int optional3,
613 const char* a4, bt type4, int kind4, int optional4 )
623 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
624 a1, type1, kind1, optional1,
625 a2, type2, kind2, optional2,
626 a3, type3, kind3, optional3,
627 a4, type4, kind4, optional4,
632 /* Add a symbol to the subroutine list where the subroutine takes
636 add_sym_4s (const char *name, int elemental,
637 bt type, int kind, int standard,
638 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
639 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
640 void (*resolve)(gfc_code *),
641 const char* a1, bt type1, int kind1, int optional1,
642 const char* a2, bt type2, int kind2, int optional2,
643 const char* a3, bt type3, int kind3, int optional3,
644 const char* a4, bt type4, int kind4, int optional4)
654 add_sym (name, elemental, 0, type, kind, standard, cf, sf, rf,
655 a1, type1, kind1, optional1,
656 a2, type2, kind2, optional2,
657 a3, type3, kind3, optional3,
658 a4, type4, kind4, optional4,
663 /* Add a symbol to the subroutine list where the subroutine takes
667 add_sym_5s (const char *name, int elemental,
668 bt type, int kind, int standard,
669 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
670 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
671 void (*resolve)(gfc_code *),
672 const char* a1, bt type1, int kind1, int optional1,
673 const char* a2, bt type2, int kind2, int optional2,
674 const char* a3, bt type3, int kind3, int optional3,
675 const char* a4, bt type4, int kind4, int optional4,
676 const char* a5, bt type5, int kind5, int optional5)
686 add_sym (name, elemental, 0, type, kind, standard, cf, sf, rf,
687 a1, type1, kind1, optional1,
688 a2, type2, kind2, optional2,
689 a3, type3, kind3, optional3,
690 a4, type4, kind4, optional4,
691 a5, type5, kind5, optional5,
696 /* Locate an intrinsic symbol given a base pointer, number of elements
697 in the table and a pointer to a name. Returns the NULL pointer if
698 a name is not found. */
700 static gfc_intrinsic_sym *
701 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
706 if (strcmp (name, start->name) == 0)
717 /* Given a name, find a function in the intrinsic function table.
718 Returns NULL if not found. */
721 gfc_find_function (const char *name)
723 gfc_intrinsic_sym *sym;
725 sym = find_sym (functions, nfunc, name);
727 sym = find_sym (conversion, nconv, name);
733 /* Given a name, find a function in the intrinsic subroutine table.
734 Returns NULL if not found. */
736 static gfc_intrinsic_sym *
737 find_subroutine (const char *name)
740 return find_sym (subroutines, nsub, name);
744 /* Given a string, figure out if it is the name of a generic intrinsic
748 gfc_generic_intrinsic (const char *name)
750 gfc_intrinsic_sym *sym;
752 sym = gfc_find_function (name);
753 return (sym == NULL) ? 0 : sym->generic;
757 /* Given a string, figure out if it is the name of a specific
758 intrinsic function or not. */
761 gfc_specific_intrinsic (const char *name)
763 gfc_intrinsic_sym *sym;
765 sym = gfc_find_function (name);
766 return (sym == NULL) ? 0 : sym->specific;
770 /* Given a string, figure out if it is the name of an intrinsic function
771 or subroutine allowed as an actual argument or not. */
773 gfc_intrinsic_actual_ok (const char *name, const bool subroutine_flag)
775 gfc_intrinsic_sym *sym;
777 /* Intrinsic subroutines are not allowed as actual arguments. */
782 sym = gfc_find_function (name);
783 return (sym == NULL) ? 0 : sym->actual_ok;
788 /* Given a string, figure out if it is the name of an intrinsic
789 subroutine or function. There are no generic intrinsic
790 subroutines, they are all specific. */
793 gfc_intrinsic_name (const char *name, int subroutine_flag)
796 return subroutine_flag ?
797 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
801 /* Collect a set of intrinsic functions into a generic collection.
802 The first argument is the name of the generic function, which is
803 also the name of a specific function. The rest of the specifics
804 currently in the table are placed into the list of specific
805 functions associated with that generic. */
808 make_generic (const char *name, gfc_generic_isym_id generic_id, int standard)
810 gfc_intrinsic_sym *g;
812 if (!(gfc_option.allow_std & standard)
813 && gfc_option.flag_all_intrinsics == 0)
816 if (sizing != SZ_NOTHING)
819 g = gfc_find_function (name);
821 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
826 g->generic_id = generic_id;
827 if ((g + 1)->name != NULL)
828 g->specific_head = g + 1;
831 while (g->name != NULL)
835 g->generic_id = generic_id;
844 /* Create a duplicate intrinsic function entry for the current
845 function, the only difference being the alternate name. Note that
846 we use argument lists more than once, but all argument lists are
847 freed as a single block. */
850 make_alias (const char *name, int standard)
853 /* First check that the intrinsic belongs to the selected standard.
854 If not, don't add it to the symbol list. */
855 if (!(gfc_option.allow_std & standard)
856 && gfc_option.flag_all_intrinsics == 0)
870 next_sym[0] = next_sym[-1];
871 next_sym->name = gfc_get_string (name);
880 /* Make the current subroutine noreturn. */
885 if (sizing == SZ_NOTHING)
886 next_sym[-1].noreturn = 1;
889 /* Add intrinsic functions. */
895 /* Argument names as in the standard (to be used as argument keywords). */
897 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
898 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
899 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
900 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
901 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
902 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
903 *p = "p", *ar = "array", *shp = "shape", *src = "source",
904 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
905 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
906 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
907 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
908 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
909 *num = "number", *tm = "time", *nm = "name", *md = "mode";
911 int di, dr, dd, dl, dc, dz, ii;
913 di = gfc_default_integer_kind;
914 dr = gfc_default_real_kind;
915 dd = gfc_default_double_kind;
916 dl = gfc_default_logical_kind;
917 dc = gfc_default_character_kind;
918 dz = gfc_default_complex_kind;
919 ii = gfc_index_integer_kind;
921 add_sym_1 ("abs", 1, 1, BT_REAL, dr, GFC_STD_F77,
922 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
923 a, BT_REAL, dr, REQUIRED);
925 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di, GFC_STD_F77,
926 NULL, gfc_simplify_abs, gfc_resolve_abs,
927 a, BT_INTEGER, di, REQUIRED);
929 add_sym_1 ("dabs", 1, 1, BT_REAL, dd, GFC_STD_F77,
930 NULL, gfc_simplify_abs, gfc_resolve_abs,
931 a, BT_REAL, dd, REQUIRED);
933 add_sym_1 ("cabs", 1, 1, BT_REAL, dr, GFC_STD_F77,
934 NULL, gfc_simplify_abs, gfc_resolve_abs,
935 a, BT_COMPLEX, dz, REQUIRED);
937 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, GFC_STD_GNU,
938 NULL, gfc_simplify_abs, gfc_resolve_abs,
939 a, BT_COMPLEX, dd, REQUIRED);
941 make_alias ("cdabs", GFC_STD_GNU);
943 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
945 /* The checking function for ACCESS is called gfc_check_access_func
946 because the name gfc_check_access is already used in module.c. */
947 add_sym_2 ("access", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
948 gfc_check_access_func, NULL, gfc_resolve_access,
949 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
951 make_generic ("access", GFC_ISYM_ACCESS, GFC_STD_GNU);
953 add_sym_1 ("achar", 1, 0, BT_CHARACTER, dc, GFC_STD_F95,
954 gfc_check_achar, gfc_simplify_achar, NULL,
955 i, BT_INTEGER, di, REQUIRED);
957 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
959 add_sym_1 ("acos", 1, 1, BT_REAL, dr, GFC_STD_F77,
960 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
961 x, BT_REAL, dr, REQUIRED);
963 add_sym_1 ("dacos", 1, 1, BT_REAL, dd, GFC_STD_F77,
964 NULL, gfc_simplify_acos, gfc_resolve_acos,
965 x, BT_REAL, dd, REQUIRED);
967 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
969 add_sym_1 ("acosh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
970 gfc_check_fn_r, gfc_simplify_acosh, gfc_resolve_acosh,
971 x, BT_REAL, dr, REQUIRED);
973 add_sym_1 ("dacosh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
974 NULL, gfc_simplify_acosh, gfc_resolve_acosh,
975 x, BT_REAL, dd, REQUIRED);
977 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_GNU);
979 add_sym_1 ("adjustl", 1, 0, BT_CHARACTER, dc, GFC_STD_F95,
980 NULL, gfc_simplify_adjustl, NULL,
981 stg, BT_CHARACTER, dc, REQUIRED);
983 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
985 add_sym_1 ("adjustr", 1, 0, BT_CHARACTER, dc, GFC_STD_F95,
986 NULL, gfc_simplify_adjustr, NULL,
987 stg, BT_CHARACTER, dc, REQUIRED);
989 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
991 add_sym_1 ("aimag", 1, 1, BT_REAL, dr, GFC_STD_F77,
992 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
993 z, BT_COMPLEX, dz, REQUIRED);
995 make_alias ("imag", GFC_STD_GNU);
996 make_alias ("imagpart", GFC_STD_GNU);
998 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, GFC_STD_GNU,
999 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
1000 z, BT_COMPLEX, dd, REQUIRED);
1002 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
1004 add_sym_2 ("aint", 1, 1, BT_REAL, dr, GFC_STD_F77,
1005 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
1006 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1008 add_sym_1 ("dint", 1, 1, BT_REAL, dd, GFC_STD_F77,
1009 NULL, gfc_simplify_dint, gfc_resolve_dint,
1010 a, BT_REAL, dd, REQUIRED);
1012 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
1014 add_sym_2 ("all", 0, 0, BT_UNKNOWN, 0, GFC_STD_F95,
1015 gfc_check_all_any, NULL, gfc_resolve_all,
1016 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1018 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
1020 add_sym_1 ("allocated", 0, 0, BT_LOGICAL, dl, GFC_STD_F95,
1021 gfc_check_allocated, NULL, NULL,
1022 ar, BT_UNKNOWN, 0, REQUIRED);
1024 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
1026 add_sym_2 ("anint", 1, 1, BT_REAL, dr, GFC_STD_F77,
1027 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
1028 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1030 add_sym_1 ("dnint", 1, 1, BT_REAL, dd, GFC_STD_F77,
1031 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
1032 a, BT_REAL, dd, REQUIRED);
1034 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1036 add_sym_2 ("any", 0, 0, BT_UNKNOWN, 0, GFC_STD_F95,
1037 gfc_check_all_any, NULL, gfc_resolve_any,
1038 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1040 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1042 add_sym_1 ("asin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1043 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1044 x, BT_REAL, dr, REQUIRED);
1046 add_sym_1 ("dasin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1047 NULL, gfc_simplify_asin, gfc_resolve_asin,
1048 x, BT_REAL, dd, REQUIRED);
1050 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1052 add_sym_1 ("asinh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1053 gfc_check_fn_r, gfc_simplify_asinh, gfc_resolve_asinh,
1054 x, BT_REAL, dr, REQUIRED);
1056 add_sym_1 ("dasinh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1057 NULL, gfc_simplify_asinh, gfc_resolve_asinh,
1058 x, BT_REAL, dd, REQUIRED);
1060 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_GNU);
1062 add_sym_2 ("associated", 0, 0, BT_LOGICAL, dl, GFC_STD_F95,
1063 gfc_check_associated, NULL, NULL,
1064 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1066 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1068 add_sym_1 ("atan", 1, 1, BT_REAL, dr, GFC_STD_F77,
1069 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1070 x, BT_REAL, dr, REQUIRED);
1072 add_sym_1 ("datan", 1, 1, BT_REAL, dd, GFC_STD_F77,
1073 NULL, gfc_simplify_atan, gfc_resolve_atan,
1074 x, BT_REAL, dd, REQUIRED);
1076 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1078 add_sym_1 ("atanh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1079 gfc_check_fn_r, gfc_simplify_atanh, gfc_resolve_atanh,
1080 x, BT_REAL, dr, REQUIRED);
1082 add_sym_1 ("datanh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1083 NULL, gfc_simplify_atanh, gfc_resolve_atanh,
1084 x, BT_REAL, dd, REQUIRED);
1086 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_GNU);
1088 add_sym_2 ("atan2", 1, 1, BT_REAL, dr, GFC_STD_F77,
1089 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1090 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1092 add_sym_2 ("datan2", 1, 1, BT_REAL, dd, GFC_STD_F77,
1093 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
1094 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1096 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1098 /* Bessel and Neumann functions for G77 compatibility. */
1099 add_sym_1 ("besj0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1100 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1101 x, BT_REAL, dr, REQUIRED);
1103 add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1104 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1105 x, BT_REAL, dd, REQUIRED);
1107 make_generic ("besj0", GFC_ISYM_J0, GFC_STD_GNU);
1109 add_sym_1 ("besj1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1110 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1111 x, BT_REAL, dr, REQUIRED);
1113 add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1114 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1115 x, BT_REAL, dd, REQUIRED);
1117 make_generic ("besj1", GFC_ISYM_J1, GFC_STD_GNU);
1119 add_sym_2 ("besjn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1120 gfc_check_besn, NULL, gfc_resolve_besn,
1121 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1123 add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1124 gfc_check_besn, NULL, gfc_resolve_besn,
1125 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1127 make_generic ("besjn", GFC_ISYM_JN, GFC_STD_GNU);
1129 add_sym_1 ("besy0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1130 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1131 x, BT_REAL, dr, REQUIRED);
1133 add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1134 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1135 x, BT_REAL, dd, REQUIRED);
1137 make_generic ("besy0", GFC_ISYM_Y0, GFC_STD_GNU);
1139 add_sym_1 ("besy1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1140 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1141 x, BT_REAL, dr, REQUIRED);
1143 add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1144 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1145 x, BT_REAL, dd, REQUIRED);
1147 make_generic ("besy1", GFC_ISYM_Y1, GFC_STD_GNU);
1149 add_sym_2 ("besyn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1150 gfc_check_besn, NULL, gfc_resolve_besn,
1151 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1153 add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1154 gfc_check_besn, NULL, gfc_resolve_besn,
1155 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1157 make_generic ("besyn", GFC_ISYM_YN, GFC_STD_GNU);
1159 add_sym_1 ("bit_size", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1160 gfc_check_i, gfc_simplify_bit_size, NULL,
1161 i, BT_INTEGER, di, REQUIRED);
1163 make_generic ("bit_size", GFC_ISYM_NONE, GFC_STD_F95);
1165 add_sym_2 ("btest", 1, 0, BT_LOGICAL, dl, GFC_STD_F95,
1166 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1167 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1169 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1171 add_sym_2 ("ceiling", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1172 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1173 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1175 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1177 add_sym_2 ("char", 1, 2, BT_CHARACTER, dc, GFC_STD_F77,
1178 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1179 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1181 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1183 add_sym_1 ("chdir", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1184 gfc_check_chdir, NULL, gfc_resolve_chdir,
1185 a, BT_CHARACTER, dc, REQUIRED);
1187 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1189 add_sym_2 ("chmod", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1190 gfc_check_chmod, NULL, gfc_resolve_chmod,
1191 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1193 make_generic ("chmod", GFC_ISYM_CHMOD, GFC_STD_GNU);
1195 add_sym_3 ("cmplx", 1, 0, BT_COMPLEX, dz, GFC_STD_F77,
1196 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1197 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1198 kind, BT_INTEGER, di, OPTIONAL);
1200 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1202 add_sym_0 ("command_argument_count", 1, 0, BT_INTEGER, di, GFC_STD_F2003,
1205 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1208 add_sym_2 ("complex", 1, 0, BT_COMPLEX, dz, GFC_STD_GNU,
1209 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1210 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1212 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1214 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1215 complex instead of the default complex. */
1217 add_sym_2 ("dcmplx", 1, 0, BT_COMPLEX, dd, GFC_STD_GNU,
1218 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1219 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1221 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1223 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1224 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1225 z, BT_COMPLEX, dz, REQUIRED);
1227 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1228 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1229 z, BT_COMPLEX, dd, REQUIRED);
1231 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1233 add_sym_1 ("cos", 1, 1, BT_REAL, dr, GFC_STD_F77,
1234 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1235 x, BT_REAL, dr, REQUIRED);
1237 add_sym_1 ("dcos", 1, 1, BT_REAL, dd, GFC_STD_F77,
1238 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1239 x, BT_REAL, dd, REQUIRED);
1241 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1242 NULL, gfc_simplify_cos, gfc_resolve_cos,
1243 x, BT_COMPLEX, dz, REQUIRED);
1245 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1246 NULL, gfc_simplify_cos, gfc_resolve_cos,
1247 x, BT_COMPLEX, dd, REQUIRED);
1249 make_alias ("cdcos", GFC_STD_GNU);
1251 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1253 add_sym_1 ("cosh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1254 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1255 x, BT_REAL, dr, REQUIRED);
1257 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1258 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1259 x, BT_REAL, dd, REQUIRED);
1261 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1263 add_sym_2 ("count", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1264 gfc_check_count, NULL, gfc_resolve_count,
1265 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1267 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1269 add_sym_3 ("cshift", 0, 0, BT_REAL, dr, GFC_STD_F95,
1270 gfc_check_cshift, NULL, gfc_resolve_cshift,
1271 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1272 dm, BT_INTEGER, ii, OPTIONAL);
1274 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1276 add_sym_1 ("ctime", 0, 0, BT_CHARACTER, 0, GFC_STD_GNU,
1277 gfc_check_ctime, NULL, gfc_resolve_ctime,
1278 tm, BT_INTEGER, di, REQUIRED);
1280 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1282 add_sym_1 ("dble", 1, 0, BT_REAL, dd, GFC_STD_F77,
1283 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1284 a, BT_REAL, dr, REQUIRED);
1286 make_alias ("dfloat", GFC_STD_GNU);
1288 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1290 add_sym_1 ("digits", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1291 gfc_check_digits, gfc_simplify_digits, NULL,
1292 x, BT_UNKNOWN, dr, REQUIRED);
1294 make_generic ("digits", GFC_ISYM_NONE, GFC_STD_F95);
1296 add_sym_2 ("dim", 1, 1, BT_REAL, dr, GFC_STD_F77,
1297 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1298 x, BT_REAL, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1300 add_sym_2 ("idim", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1301 NULL, gfc_simplify_dim, gfc_resolve_dim,
1302 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1304 add_sym_2 ("ddim", 1, 1, BT_REAL, dd, GFC_STD_F77,
1305 NULL, gfc_simplify_dim, gfc_resolve_dim,
1306 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1308 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1310 add_sym_2 ("dot_product", 0, 0, BT_UNKNOWN, 0, GFC_STD_F95,
1311 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1312 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1314 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1316 add_sym_2 ("dprod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1317 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1318 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1320 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1322 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1324 a, BT_COMPLEX, dd, REQUIRED);
1326 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1328 add_sym_4 ("eoshift", 0, 0, BT_REAL, dr, GFC_STD_F95,
1329 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1330 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1331 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1333 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1335 add_sym_1 ("epsilon", 0, 0, BT_REAL, dr, GFC_STD_F95,
1336 gfc_check_x, gfc_simplify_epsilon, NULL,
1337 x, BT_REAL, dr, REQUIRED);
1339 make_generic ("epsilon", GFC_ISYM_NONE, GFC_STD_F95);
1341 /* G77 compatibility for the ERF() and ERFC() functions. */
1342 add_sym_1 ("erf", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1343 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1344 x, BT_REAL, dr, REQUIRED);
1346 add_sym_1 ("derf", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1347 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1348 x, BT_REAL, dd, REQUIRED);
1350 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_GNU);
1352 add_sym_1 ("erfc", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1353 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1354 x, BT_REAL, dr, REQUIRED);
1356 add_sym_1 ("derfc", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1357 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1358 x, BT_REAL, dd, REQUIRED);
1360 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_GNU);
1362 /* G77 compatibility */
1363 add_sym_1 ("etime", 0, 0, BT_REAL, 4, GFC_STD_GNU,
1364 gfc_check_etime, NULL, NULL,
1365 x, BT_REAL, 4, REQUIRED);
1367 make_alias ("dtime", GFC_STD_GNU);
1369 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1371 add_sym_1 ("exp", 1, 1, BT_REAL, dr, GFC_STD_F77,
1372 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1373 x, BT_REAL, dr, REQUIRED);
1375 add_sym_1 ("dexp", 1, 1, BT_REAL, dd, GFC_STD_F77,
1376 NULL, gfc_simplify_exp, gfc_resolve_exp,
1377 x, BT_REAL, dd, REQUIRED);
1379 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1380 NULL, gfc_simplify_exp, gfc_resolve_exp,
1381 x, BT_COMPLEX, dz, REQUIRED);
1383 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1384 NULL, gfc_simplify_exp, gfc_resolve_exp,
1385 x, BT_COMPLEX, dd, REQUIRED);
1387 make_alias ("cdexp", GFC_STD_GNU);
1389 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1391 add_sym_1 ("exponent", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1392 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1393 x, BT_REAL, dr, REQUIRED);
1395 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1397 add_sym_0 ("fdate", 1, 0, BT_CHARACTER, dc, GFC_STD_GNU,
1398 NULL, NULL, gfc_resolve_fdate);
1400 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1402 add_sym_2 ("floor", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1403 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1404 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1406 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1408 /* G77 compatible fnum */
1409 add_sym_1 ("fnum", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1410 gfc_check_fnum, NULL, gfc_resolve_fnum,
1411 ut, BT_INTEGER, di, REQUIRED);
1413 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1415 add_sym_1 ("fraction", 1, 0, BT_REAL, dr, GFC_STD_F95,
1416 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1417 x, BT_REAL, dr, REQUIRED);
1419 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1421 add_sym_2 ("fstat", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1422 gfc_check_fstat, NULL, gfc_resolve_fstat,
1423 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1425 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1427 add_sym_1 ("ftell", 0, 0, BT_INTEGER, ii, GFC_STD_GNU,
1428 gfc_check_ftell, NULL, gfc_resolve_ftell,
1429 ut, BT_INTEGER, di, REQUIRED);
1431 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1433 add_sym_2 ("fgetc", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1434 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1435 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1437 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1439 add_sym_1 ("fget", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1440 gfc_check_fgetput, NULL, gfc_resolve_fget,
1441 c, BT_CHARACTER, dc, REQUIRED);
1443 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1445 add_sym_2 ("fputc", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1446 gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1447 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1449 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1451 add_sym_1 ("fput", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1452 gfc_check_fgetput, NULL, gfc_resolve_fput,
1453 c, BT_CHARACTER, dc, REQUIRED);
1455 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1457 /* Unix IDs (g77 compatibility) */
1458 add_sym_1 ("getcwd", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1459 NULL, NULL, gfc_resolve_getcwd,
1460 c, BT_CHARACTER, dc, REQUIRED);
1462 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1464 add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1465 NULL, NULL, gfc_resolve_getgid);
1467 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1469 add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1470 NULL, NULL, gfc_resolve_getpid);
1472 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1474 add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1475 NULL, NULL, gfc_resolve_getuid);
1477 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1479 add_sym_1 ("hostnm", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1480 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1481 a, BT_CHARACTER, dc, REQUIRED);
1483 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1485 add_sym_1 ("huge", 0, 0, BT_REAL, dr, GFC_STD_F95,
1486 gfc_check_huge, gfc_simplify_huge, NULL,
1487 x, BT_UNKNOWN, dr, REQUIRED);
1489 make_generic ("huge", GFC_ISYM_NONE, GFC_STD_F95);
1491 add_sym_1 ("iachar", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1492 gfc_check_ichar_iachar, gfc_simplify_iachar, NULL,
1493 c, BT_CHARACTER, dc, REQUIRED);
1495 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1497 add_sym_2 ("iand", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1498 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1499 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1501 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1503 add_sym_2 ("and", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1504 gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1505 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1507 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1509 add_sym_0 ("iargc", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1512 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1514 add_sym_2 ("ibclr", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1515 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1516 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1518 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1520 add_sym_3 ("ibits", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1521 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1522 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1523 ln, BT_INTEGER, di, REQUIRED);
1525 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1527 add_sym_2 ("ibset", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1528 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1529 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1531 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1533 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1534 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1535 c, BT_CHARACTER, dc, REQUIRED);
1537 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1539 add_sym_2 ("ieor", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1540 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1541 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1543 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1545 add_sym_2 ("xor", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1546 gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1547 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1549 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1551 add_sym_0 ("ierrno", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1552 NULL, NULL, gfc_resolve_ierrno);
1554 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1556 /* The resolution function for INDEX is called gfc_resolve_index_func
1557 because the name gfc_resolve_index is already used in resolve.c. */
1558 add_sym_3 ("index", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1559 gfc_check_index, gfc_simplify_index, gfc_resolve_index_func,
1560 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1561 bck, BT_LOGICAL, dl, OPTIONAL);
1563 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1565 add_sym_2 ("int", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1566 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1567 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1569 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1570 NULL, gfc_simplify_ifix, NULL,
1571 a, BT_REAL, dr, REQUIRED);
1573 add_sym_1 ("idint", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1574 NULL, gfc_simplify_idint, NULL,
1575 a, BT_REAL, dd, REQUIRED);
1577 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1579 add_sym_1 ("int2", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1580 gfc_check_intconv, gfc_simplify_int2, gfc_resolve_int2,
1581 a, BT_REAL, dr, REQUIRED);
1583 make_alias ("short", GFC_STD_GNU);
1585 make_generic ("int2", GFC_ISYM_INT2, GFC_STD_GNU);
1587 add_sym_1 ("int8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1588 gfc_check_intconv, gfc_simplify_int8, gfc_resolve_int8,
1589 a, BT_REAL, dr, REQUIRED);
1591 make_generic ("int8", GFC_ISYM_INT8, GFC_STD_GNU);
1593 add_sym_1 ("long", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1594 gfc_check_intconv, gfc_simplify_long, gfc_resolve_long,
1595 a, BT_REAL, dr, REQUIRED);
1597 make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
1599 add_sym_2 ("ior", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1600 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1601 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1603 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1605 add_sym_2 ("or", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1606 gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1607 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1609 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1611 /* The following function is for G77 compatibility. */
1612 add_sym_1 ("irand", 0, 0, BT_INTEGER, 4, GFC_STD_GNU,
1613 gfc_check_irand, NULL, NULL,
1614 i, BT_INTEGER, 4, OPTIONAL);
1616 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1618 add_sym_1 ("isatty", 0, 0, BT_LOGICAL, dl, GFC_STD_GNU,
1619 gfc_check_isatty, NULL, gfc_resolve_isatty,
1620 ut, BT_INTEGER, di, REQUIRED);
1622 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1624 add_sym_2 ("rshift", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1625 gfc_check_ishft, NULL, gfc_resolve_rshift,
1626 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1628 make_generic ("rshift", GFC_ISYM_RSHIFT, GFC_STD_GNU);
1630 add_sym_2 ("lshift", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1631 gfc_check_ishft, NULL, gfc_resolve_lshift,
1632 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1634 make_generic ("lshift", GFC_ISYM_LSHIFT, GFC_STD_GNU);
1636 add_sym_2 ("ishft", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1637 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1638 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1640 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1642 add_sym_3 ("ishftc", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1643 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1644 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1645 sz, BT_INTEGER, di, OPTIONAL);
1647 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1649 add_sym_2 ("kill", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1650 gfc_check_kill, NULL, gfc_resolve_kill,
1651 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1653 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1655 add_sym_1 ("kind", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1656 gfc_check_kind, gfc_simplify_kind, NULL,
1657 x, BT_REAL, dr, REQUIRED);
1659 make_generic ("kind", GFC_ISYM_NONE, GFC_STD_F95);
1661 add_sym_2 ("lbound", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1662 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1663 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL);
1665 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1667 add_sym_1 ("len", 0, 1, BT_INTEGER, di, GFC_STD_F77,
1668 NULL, gfc_simplify_len, gfc_resolve_len,
1669 stg, BT_CHARACTER, dc, REQUIRED);
1671 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1673 add_sym_1 ("len_trim", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1674 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1675 stg, BT_CHARACTER, dc, REQUIRED);
1677 make_alias ("lnblnk", GFC_STD_GNU);
1679 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1681 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1682 NULL, gfc_simplify_lge, NULL,
1683 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1685 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1687 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1688 NULL, gfc_simplify_lgt, NULL,
1689 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1691 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1693 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1694 NULL, gfc_simplify_lle, NULL,
1695 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1697 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1699 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1700 NULL, gfc_simplify_llt, NULL,
1701 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1703 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1705 add_sym_2 ("link", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1706 gfc_check_link, NULL, gfc_resolve_link,
1707 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1709 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1711 add_sym_1 ("log", 1, 0, BT_REAL, dr, GFC_STD_F77,
1712 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1713 x, BT_REAL, dr, REQUIRED);
1715 add_sym_1 ("alog", 1, 1, BT_REAL, dr, GFC_STD_F77,
1716 NULL, gfc_simplify_log, gfc_resolve_log,
1717 x, BT_REAL, dr, REQUIRED);
1719 add_sym_1 ("dlog", 1, 1, BT_REAL, dd, GFC_STD_F77,
1720 NULL, gfc_simplify_log, gfc_resolve_log,
1721 x, BT_REAL, dd, REQUIRED);
1723 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1724 NULL, gfc_simplify_log, gfc_resolve_log,
1725 x, BT_COMPLEX, dz, REQUIRED);
1727 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1728 NULL, gfc_simplify_log, gfc_resolve_log,
1729 x, BT_COMPLEX, dd, REQUIRED);
1731 make_alias ("cdlog", GFC_STD_GNU);
1733 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
1735 add_sym_1 ("log10", 1, 0, BT_REAL, dr, GFC_STD_F77,
1736 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
1737 x, BT_REAL, dr, REQUIRED);
1739 add_sym_1 ("alog10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1740 NULL, gfc_simplify_log10, gfc_resolve_log10,
1741 x, BT_REAL, dr, REQUIRED);
1743 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd, GFC_STD_F77,
1744 NULL, gfc_simplify_log10, gfc_resolve_log10,
1745 x, BT_REAL, dd, REQUIRED);
1747 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
1749 add_sym_2 ("logical", 1, 0, BT_LOGICAL, dl, GFC_STD_F95,
1750 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1751 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1753 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
1755 add_sym_2 ("lstat", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
1756 gfc_check_stat, NULL, gfc_resolve_lstat,
1757 a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1759 make_generic ("lstat", GFC_ISYM_LSTAT, GFC_STD_GNU);
1761 add_sym_1 ("malloc", 0, 0, BT_INTEGER, ii, GFC_STD_GNU, gfc_check_malloc,
1762 NULL, gfc_resolve_malloc, a, BT_INTEGER, di, REQUIRED);
1764 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
1766 add_sym_2 ("matmul", 0, 0, BT_REAL, dr, GFC_STD_F95,
1767 gfc_check_matmul, NULL, gfc_resolve_matmul,
1768 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
1770 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
1772 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1773 int(max). The max function must take at least two arguments. */
1775 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1776 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1777 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
1779 add_sym_1m ("max0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1780 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1781 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1783 add_sym_1m ("amax0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1784 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1785 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1787 add_sym_1m ("amax1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1788 gfc_check_min_max_real, gfc_simplify_max, NULL,
1789 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1791 add_sym_1m ("max1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1792 gfc_check_min_max_real, gfc_simplify_max, NULL,
1793 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1795 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1796 gfc_check_min_max_double, gfc_simplify_max, NULL,
1797 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1799 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
1801 add_sym_1 ("maxexponent", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1802 gfc_check_x, gfc_simplify_maxexponent, NULL,
1803 x, BT_UNKNOWN, dr, REQUIRED);
1805 make_generic ("maxexponent", GFC_ISYM_NONE, GFC_STD_F95);
1807 add_sym_3ml ("maxloc", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1808 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1809 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1810 msk, BT_LOGICAL, dl, OPTIONAL);
1812 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
1814 add_sym_3red ("maxval", 0, 0, BT_REAL, dr, GFC_STD_F95,
1815 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1816 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1817 msk, BT_LOGICAL, dl, OPTIONAL);
1819 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
1821 add_sym_0 ("mclock", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1822 NULL, NULL, gfc_resolve_mclock);
1824 make_generic ("mclock", GFC_ISYM_MCLOCK, GFC_STD_GNU);
1826 add_sym_0 ("mclock8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1827 NULL, NULL, gfc_resolve_mclock8);
1829 make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU);
1831 add_sym_3 ("merge", 1, 0, BT_REAL, dr, GFC_STD_F95,
1832 gfc_check_merge, NULL, gfc_resolve_merge,
1833 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
1834 msk, BT_LOGICAL, dl, REQUIRED);
1836 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
1838 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
1841 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1842 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1843 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1845 add_sym_1m ("min0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1846 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1847 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1849 add_sym_1m ("amin0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1850 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1851 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1853 add_sym_1m ("amin1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1854 gfc_check_min_max_real, gfc_simplify_min, NULL,
1855 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1857 add_sym_1m ("min1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1858 gfc_check_min_max_real, gfc_simplify_min, NULL,
1859 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1861 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1862 gfc_check_min_max_double, gfc_simplify_min, NULL,
1863 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1865 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
1867 add_sym_1 ("minexponent", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1868 gfc_check_x, gfc_simplify_minexponent, NULL,
1869 x, BT_UNKNOWN, dr, REQUIRED);
1871 make_generic ("minexponent", GFC_ISYM_NONE, GFC_STD_F95);
1873 add_sym_3ml ("minloc", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1874 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1875 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1876 msk, BT_LOGICAL, dl, OPTIONAL);
1878 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
1880 add_sym_3red ("minval", 0, 0, BT_REAL, dr, GFC_STD_F95,
1881 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1882 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1883 msk, BT_LOGICAL, dl, OPTIONAL);
1885 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
1887 add_sym_2 ("mod", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1888 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1889 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
1891 add_sym_2 ("amod", 1, 1, BT_REAL, dr, GFC_STD_F77,
1892 NULL, gfc_simplify_mod, gfc_resolve_mod,
1893 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
1895 add_sym_2 ("dmod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1896 NULL, gfc_simplify_mod, gfc_resolve_mod,
1897 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
1899 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
1901 add_sym_2 ("modulo", 1, 0, BT_REAL, di, GFC_STD_F95,
1902 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1903 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
1905 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
1907 add_sym_2 ("nearest", 1, 0, BT_REAL, dr, GFC_STD_F95,
1908 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1909 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
1911 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
1913 add_sym_1 ("new_line", 0, 0, BT_CHARACTER, dc, GFC_STD_F2003,
1914 gfc_check_new_line, gfc_simplify_new_line, NULL,
1915 i, BT_CHARACTER, dc, REQUIRED);
1917 add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1918 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1919 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1921 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1922 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1923 a, BT_REAL, dd, REQUIRED);
1925 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
1927 add_sym_1 ("not", 1, 0, BT_INTEGER, di, GFC_STD_F95,
1928 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1929 i, BT_INTEGER, di, REQUIRED);
1931 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
1933 add_sym_1 ("null", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1934 gfc_check_null, gfc_simplify_null, NULL,
1935 mo, BT_INTEGER, di, OPTIONAL);
1937 make_generic ("null", GFC_ISYM_NONE, GFC_STD_F95);
1939 add_sym_3 ("pack", 0, 0, BT_REAL, dr, GFC_STD_F95,
1940 gfc_check_pack, NULL, gfc_resolve_pack,
1941 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1942 v, BT_REAL, dr, OPTIONAL);
1944 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
1946 add_sym_1 ("precision", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1947 gfc_check_precision, gfc_simplify_precision, NULL,
1948 x, BT_UNKNOWN, 0, REQUIRED);
1950 make_generic ("precision", GFC_ISYM_NONE, GFC_STD_F95);
1952 add_sym_1 ("present", 0, 0, BT_LOGICAL, dl, GFC_STD_F95,
1953 gfc_check_present, NULL, NULL,
1954 a, BT_REAL, dr, REQUIRED);
1956 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
1958 add_sym_3red ("product", 0, 0, BT_REAL, dr, GFC_STD_F95,
1959 gfc_check_product_sum, NULL, gfc_resolve_product,
1960 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1961 msk, BT_LOGICAL, dl, OPTIONAL);
1963 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
1965 add_sym_1 ("radix", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1966 gfc_check_radix, gfc_simplify_radix, NULL,
1967 x, BT_UNKNOWN, 0, REQUIRED);
1969 make_generic ("radix", GFC_ISYM_NONE, GFC_STD_F95);
1971 /* The following function is for G77 compatibility. */
1972 add_sym_1 ("rand", 0, 0, BT_REAL, 4, GFC_STD_GNU,
1973 gfc_check_rand, NULL, NULL,
1974 i, BT_INTEGER, 4, OPTIONAL);
1976 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
1977 use slightly different shoddy multiplicative congruential PRNG. */
1978 make_alias ("ran", GFC_STD_GNU);
1980 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
1982 add_sym_1 ("range", 0, 0, BT_INTEGER, di, GFC_STD_F95,
1983 gfc_check_range, gfc_simplify_range, NULL,
1984 x, BT_REAL, dr, REQUIRED);
1986 make_generic ("range", GFC_ISYM_NONE, GFC_STD_F95);
1988 add_sym_2 ("real", 1, 0, BT_REAL, dr, GFC_STD_F77,
1989 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1990 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1992 /* This provides compatibility with g77. */
1993 add_sym_1 ("realpart", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1994 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
1995 a, BT_UNKNOWN, dr, REQUIRED);
1997 add_sym_1 ("float", 1, 0, BT_REAL, dr, GFC_STD_F77,
1998 gfc_check_i, gfc_simplify_float, NULL,
1999 a, BT_INTEGER, di, REQUIRED);
2001 add_sym_1 ("sngl", 1, 0, BT_REAL, dr, GFC_STD_F77,
2002 NULL, gfc_simplify_sngl, NULL,
2003 a, BT_REAL, dd, REQUIRED);
2005 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
2007 add_sym_2 ("rename", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
2008 gfc_check_rename, NULL, gfc_resolve_rename,
2009 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
2011 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
2013 add_sym_2 ("repeat", 0, 0, BT_CHARACTER, dc, GFC_STD_F95,
2014 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
2015 stg, BT_CHARACTER, dc, REQUIRED, n, BT_INTEGER, di, REQUIRED);
2017 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
2019 add_sym_4 ("reshape", 0, 0, BT_REAL, dr, GFC_STD_F95,
2020 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
2021 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
2022 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
2024 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
2026 add_sym_1 ("rrspacing", 1, 0, BT_REAL, dr, GFC_STD_F95,
2027 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
2028 x, BT_REAL, dr, REQUIRED);
2030 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
2032 add_sym_2 ("scale", 1, 0, BT_REAL, dr, GFC_STD_F95,
2033 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
2034 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2036 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
2038 add_sym_3 ("scan", 1, 0, BT_INTEGER, di, GFC_STD_F95,
2039 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
2040 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2041 bck, BT_LOGICAL, dl, OPTIONAL);
2043 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
2045 /* Added for G77 compatibility garbage. */
2046 add_sym_0 ("second", 0, 0, BT_REAL, 4, GFC_STD_GNU,
2049 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
2051 /* Added for G77 compatibility. */
2052 add_sym_1 ("secnds", 0, 0, BT_REAL, dr, GFC_STD_GNU,
2053 gfc_check_secnds, NULL, gfc_resolve_secnds,
2054 x, BT_REAL, dr, REQUIRED);
2056 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
2058 add_sym_1 ("selected_int_kind", 0, 0, BT_INTEGER, di, GFC_STD_F95,
2059 gfc_check_selected_int_kind, gfc_simplify_selected_int_kind, NULL,
2060 r, BT_INTEGER, di, REQUIRED);
2062 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
2064 add_sym_2 ("selected_real_kind", 0, 0, BT_INTEGER, di, GFC_STD_F95,
2065 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
2067 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
2069 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
2071 add_sym_2 ("set_exponent", 1, 0, BT_REAL, dr, GFC_STD_F95,
2072 gfc_check_set_exponent, gfc_simplify_set_exponent,
2073 gfc_resolve_set_exponent,
2074 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2076 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
2078 add_sym_1 ("shape", 0, 0, BT_INTEGER, di, GFC_STD_F95,
2079 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
2080 src, BT_REAL, dr, REQUIRED);
2082 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
2084 add_sym_2 ("sign", 1, 1, BT_REAL, dr, GFC_STD_F77,
2085 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
2086 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
2088 add_sym_2 ("isign", 1, 1, BT_INTEGER, di, GFC_STD_F77,
2089 NULL, gfc_simplify_sign, gfc_resolve_sign,
2090 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2092 add_sym_2 ("dsign", 1, 1, BT_REAL, dd, GFC_STD_F77,
2093 NULL, gfc_simplify_sign, gfc_resolve_sign,
2094 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2096 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2098 add_sym_2 ("signal", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2099 gfc_check_signal, NULL, gfc_resolve_signal,
2100 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2102 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2104 add_sym_1 ("sin", 1, 1, BT_REAL, dr, GFC_STD_F77,
2105 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2106 x, BT_REAL, dr, REQUIRED);
2108 add_sym_1 ("dsin", 1, 1, BT_REAL, dd, GFC_STD_F77,
2109 NULL, gfc_simplify_sin, gfc_resolve_sin,
2110 x, BT_REAL, dd, REQUIRED);
2112 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2113 NULL, gfc_simplify_sin, gfc_resolve_sin,
2114 x, BT_COMPLEX, dz, REQUIRED);
2116 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2117 NULL, gfc_simplify_sin, gfc_resolve_sin,
2118 x, BT_COMPLEX, dd, REQUIRED);
2120 make_alias ("cdsin", GFC_STD_GNU);
2122 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2124 add_sym_1 ("sinh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2125 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
2126 x, BT_REAL, dr, REQUIRED);
2128 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2129 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
2130 x, BT_REAL, dd, REQUIRED);
2132 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2134 add_sym_2 ("size", 0, 0, BT_INTEGER, di, GFC_STD_F95,
2135 gfc_check_size, gfc_simplify_size, NULL,
2136 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2138 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2140 add_sym_1 ("spacing", 1, 0, BT_REAL, dr, GFC_STD_F95,
2141 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2142 x, BT_REAL, dr, REQUIRED);
2144 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2146 add_sym_3 ("spread", 0, 0, BT_REAL, dr, GFC_STD_F95,
2147 gfc_check_spread, NULL, gfc_resolve_spread,
2148 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2149 n, BT_INTEGER, di, REQUIRED);
2151 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2153 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr, GFC_STD_F77,
2154 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2155 x, BT_REAL, dr, REQUIRED);
2157 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd, GFC_STD_F77,
2158 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2159 x, BT_REAL, dd, REQUIRED);
2161 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2162 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2163 x, BT_COMPLEX, dz, REQUIRED);
2165 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2166 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2167 x, BT_COMPLEX, dd, REQUIRED);
2169 make_alias ("cdsqrt", GFC_STD_GNU);
2171 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2173 add_sym_2 ("stat", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
2174 gfc_check_stat, NULL, gfc_resolve_stat,
2175 a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2177 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2179 add_sym_3red ("sum", 0, 0, BT_UNKNOWN, 0, GFC_STD_F95,
2180 gfc_check_product_sum, NULL, gfc_resolve_sum,
2181 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2182 msk, BT_LOGICAL, dl, OPTIONAL);
2184 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2186 add_sym_2 ("symlnk", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
2187 gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2188 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
2190 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2192 add_sym_1 ("system", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2194 c, BT_CHARACTER, dc, REQUIRED);
2196 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2198 add_sym_1 ("tan", 1, 1, BT_REAL, dr, GFC_STD_F77,
2199 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2200 x, BT_REAL, dr, REQUIRED);
2202 add_sym_1 ("dtan", 1, 1, BT_REAL, dd, GFC_STD_F77,
2203 NULL, gfc_simplify_tan, gfc_resolve_tan,
2204 x, BT_REAL, dd, REQUIRED);
2206 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2208 add_sym_1 ("tanh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2209 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2210 x, BT_REAL, dr, REQUIRED);
2212 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2213 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
2214 x, BT_REAL, dd, REQUIRED);
2216 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2218 add_sym_0 ("time", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2219 NULL, NULL, gfc_resolve_time);
2221 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2223 add_sym_0 ("time8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2224 NULL, NULL, gfc_resolve_time8);
2226 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2228 add_sym_1 ("tiny", 0, 0, BT_REAL, dr, GFC_STD_F95,
2229 gfc_check_x, gfc_simplify_tiny, NULL,
2230 x, BT_REAL, dr, REQUIRED);
2232 make_generic ("tiny", GFC_ISYM_NONE, GFC_STD_F95);
2234 add_sym_3 ("transfer", 0, 0, BT_REAL, dr, GFC_STD_F95,
2235 gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2236 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2237 sz, BT_INTEGER, di, OPTIONAL);
2239 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2241 add_sym_1 ("transpose", 0, 0, BT_REAL, dr, GFC_STD_F95,
2242 gfc_check_transpose, NULL, gfc_resolve_transpose,
2243 m, BT_REAL, dr, REQUIRED);
2245 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2247 add_sym_1 ("trim", 0, 0, BT_CHARACTER, dc, GFC_STD_F95,
2248 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2249 stg, BT_CHARACTER, dc, REQUIRED);
2251 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2253 add_sym_1 ("ttynam", 0, 0, BT_CHARACTER, 0, GFC_STD_GNU,
2254 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2255 ut, BT_INTEGER, di, REQUIRED);
2257 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2259 add_sym_2 ("ubound", 0, 0, BT_INTEGER, di, GFC_STD_F95,
2260 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2261 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2263 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2265 /* g77 compatibility for UMASK. */
2266 add_sym_1 ("umask", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
2267 gfc_check_umask, NULL, gfc_resolve_umask,
2268 a, BT_INTEGER, di, REQUIRED);
2270 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2272 /* g77 compatibility for UNLINK. */
2273 add_sym_1 ("unlink", 0, 0, BT_INTEGER, di, GFC_STD_GNU,
2274 gfc_check_unlink, NULL, gfc_resolve_unlink,
2275 a, BT_CHARACTER, dc, REQUIRED);
2277 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2279 add_sym_3 ("unpack", 0, 0, BT_REAL, dr, GFC_STD_F95,
2280 gfc_check_unpack, NULL, gfc_resolve_unpack,
2281 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2282 f, BT_REAL, dr, REQUIRED);
2284 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2286 add_sym_3 ("verify", 1, 0, BT_INTEGER, di, GFC_STD_F95,
2287 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2288 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2289 bck, BT_LOGICAL, dl, OPTIONAL);
2291 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2293 add_sym_1 ("loc", 0, 0, BT_INTEGER, ii, GFC_STD_GNU,
2294 gfc_check_loc, NULL, gfc_resolve_loc,
2295 ar, BT_UNKNOWN, 0, REQUIRED);
2297 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2302 /* Add intrinsic subroutines. */
2305 add_subroutines (void)
2307 /* Argument names as in the standard (to be used as argument keywords). */
2309 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2310 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2311 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2312 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2313 *com = "command", *length = "length", *st = "status",
2314 *val = "value", *num = "number", *name = "name",
2315 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2316 *sec = "seconds", *res = "result", *of = "offset", *md = "mode";
2318 int di, dr, dc, dl, ii;
2320 di = gfc_default_integer_kind;
2321 dr = gfc_default_real_kind;
2322 dc = gfc_default_character_kind;
2323 dl = gfc_default_logical_kind;
2324 ii = gfc_index_integer_kind;
2326 add_sym_0s ("abort", GFC_STD_GNU, NULL);
2328 if ((gfc_option.allow_std & GFC_STD_GNU) || gfc_option.flag_all_intrinsics)
2331 add_sym_1s ("cpu_time", 0, BT_UNKNOWN, 0, GFC_STD_F95,
2332 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2333 tm, BT_REAL, dr, REQUIRED);
2335 /* More G77 compatibility garbage. */
2336 add_sym_2s ("ctime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2337 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2338 tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2340 add_sym_1s ("idate", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2341 gfc_check_itime_idate, NULL, gfc_resolve_idate,
2342 vl, BT_INTEGER, 4, REQUIRED);
2344 add_sym_1s ("itime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2345 gfc_check_itime_idate, NULL, gfc_resolve_itime,
2346 vl, BT_INTEGER, 4, REQUIRED);
2348 add_sym_2s ("ltime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2349 gfc_check_ltime_gmtime, NULL, gfc_resolve_ltime,
2350 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2352 add_sym_2s ("gmtime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2353 gfc_check_ltime_gmtime, NULL, gfc_resolve_gmtime,
2354 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2356 add_sym_1s ("second", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2357 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2358 tm, BT_REAL, dr, REQUIRED);
2360 add_sym_2s ("chdir", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2361 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2362 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2364 add_sym_3s ("chmod", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2365 gfc_check_chmod_sub, NULL, gfc_resolve_chmod_sub,
2366 name, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED,
2367 st, BT_INTEGER, di, OPTIONAL);
2369 add_sym_4s ("date_and_time", 0, BT_UNKNOWN, 0, GFC_STD_F95,
2370 gfc_check_date_and_time, NULL, NULL,
2371 dt, BT_CHARACTER, dc, OPTIONAL, tm, BT_CHARACTER, dc, OPTIONAL,
2372 zn, BT_CHARACTER, dc, OPTIONAL, vl, BT_INTEGER, di, OPTIONAL);
2374 /* More G77 compatibility garbage. */
2375 add_sym_2s ("etime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2376 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2377 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2379 add_sym_2s ("dtime", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2380 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2381 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2383 add_sym_1s ("fdate", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2384 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2385 dt, BT_CHARACTER, dc, REQUIRED);
2387 add_sym_1s ("gerror", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2388 gfc_check_gerror, NULL, gfc_resolve_gerror, c, BT_CHARACTER,
2391 add_sym_2s ("getcwd", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2392 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2393 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2395 add_sym_2s ("getenv", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2397 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2399 add_sym_2s ("getarg", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2400 NULL, NULL, gfc_resolve_getarg,
2401 c, BT_INTEGER, di, REQUIRED, vl, BT_CHARACTER, dc, REQUIRED);
2403 add_sym_1s ("getlog", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2404 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2407 /* F2003 commandline routines. */
2409 add_sym_3s ("get_command", 0, BT_UNKNOWN, 0, GFC_STD_F2003,
2410 NULL, NULL, gfc_resolve_get_command,
2411 com, BT_CHARACTER, dc, OPTIONAL, length, BT_INTEGER, di, OPTIONAL,
2412 st, BT_INTEGER, di, OPTIONAL);
2414 add_sym_4s ("get_command_argument", 0, BT_UNKNOWN, 0, GFC_STD_F2003,
2415 NULL, NULL, gfc_resolve_get_command_argument,
2416 num, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2417 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL);
2419 /* F2003 subroutine to get environment variables. */
2421 add_sym_5s ("get_environment_variable", 0, BT_UNKNOWN, 0, GFC_STD_F2003,
2422 NULL, NULL, gfc_resolve_get_environment_variable,
2423 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2424 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL,
2425 trim_name, BT_LOGICAL, dl, OPTIONAL);
2427 add_sym_5s ("mvbits", 1, BT_UNKNOWN, 0, GFC_STD_F95,
2428 gfc_check_mvbits, gfc_simplify_mvbits, gfc_resolve_mvbits,
2429 f, BT_INTEGER, di, REQUIRED, fp, BT_INTEGER, di, REQUIRED,
2430 ln, BT_INTEGER, di, REQUIRED, t, BT_INTEGER, di, REQUIRED,
2431 tp, BT_INTEGER, di, REQUIRED);
2433 add_sym_1s ("random_number", 0, BT_UNKNOWN, 0, GFC_STD_F95,
2434 gfc_check_random_number, NULL, gfc_resolve_random_number,
2435 h, BT_REAL, dr, REQUIRED);
2437 add_sym_3s ("random_seed", 0, BT_UNKNOWN, 0, GFC_STD_F95,
2438 gfc_check_random_seed, NULL, NULL,
2439 sz, BT_INTEGER, di, OPTIONAL, pt, BT_INTEGER, di, OPTIONAL,
2440 gt, BT_INTEGER, di, OPTIONAL);
2442 /* More G77 compatibility garbage. */
2443 add_sym_3s ("alarm", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2444 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2445 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2446 st, BT_INTEGER, di, OPTIONAL);
2448 add_sym_1s ("srand", 0, BT_UNKNOWN, di, GFC_STD_GNU,
2449 gfc_check_srand, NULL, gfc_resolve_srand,
2450 c, BT_INTEGER, 4, REQUIRED);
2452 add_sym_1s ("exit", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2453 gfc_check_exit, NULL, gfc_resolve_exit,
2454 c, BT_INTEGER, di, OPTIONAL);
2456 if ((gfc_option.allow_std & GFC_STD_GNU) || gfc_option.flag_all_intrinsics)
2459 add_sym_3s ("fgetc", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2460 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2461 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2462 st, BT_INTEGER, di, OPTIONAL);
2464 add_sym_2s ("fget", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2465 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2466 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2468 add_sym_1s ("flush", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2469 gfc_check_flush, NULL, gfc_resolve_flush,
2470 c, BT_INTEGER, di, OPTIONAL);
2472 add_sym_3s ("fputc", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2473 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2474 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2475 st, BT_INTEGER, di, OPTIONAL);
2477 add_sym_2s ("fput", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2478 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2479 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2481 add_sym_1s ("free", 0, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_free,
2482 NULL, gfc_resolve_free, c, BT_INTEGER, ii, REQUIRED);
2484 add_sym_2s ("ftell", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2485 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2486 ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2488 add_sym_2s ("hostnm", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2489 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2490 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2492 add_sym_3s ("kill", 0, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2493 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2494 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2496 add_sym_3s ("link", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2497 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2498 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2499 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2501 add_sym_1s ("perror", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2502 gfc_check_perror, NULL, gfc_resolve_perror,
2503 c, BT_CHARACTER, dc, REQUIRED);
2505 add_sym_3s ("rename", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2506 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2507 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2508 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2510 add_sym_1s ("sleep", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2511 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2512 val, BT_CHARACTER, dc, REQUIRED);
2514 add_sym_3s ("fstat", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2515 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2516 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2517 st, BT_INTEGER, di, OPTIONAL);
2519 add_sym_3s ("lstat", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2520 gfc_check_stat_sub, NULL, gfc_resolve_lstat_sub,
2521 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2522 st, BT_INTEGER, di, OPTIONAL);
2524 add_sym_3s ("stat", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2525 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2526 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2527 st, BT_INTEGER, di, OPTIONAL);
2529 add_sym_3s ("signal", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2530 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2531 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2532 st, BT_INTEGER, di, OPTIONAL);
2534 add_sym_3s ("symlnk", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2535 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2536 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2537 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2539 add_sym_2s ("system", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2540 NULL, NULL, gfc_resolve_system_sub,
2541 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2543 add_sym_3s ("system_clock", 0, BT_UNKNOWN, 0, GFC_STD_F95,
2544 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2545 c, BT_INTEGER, di, OPTIONAL, cr, BT_INTEGER, di, OPTIONAL,
2546 cm, BT_INTEGER, di, OPTIONAL);
2548 add_sym_2s ("ttynam", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2549 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2550 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
2552 add_sym_2s ("umask", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2553 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2554 val, BT_INTEGER, di, REQUIRED, num, BT_INTEGER, di, OPTIONAL);
2556 add_sym_2s ("unlink", 0, BT_UNKNOWN, 0, GFC_STD_GNU,
2557 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2558 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2563 /* Add a function to the list of conversion symbols. */
2566 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2569 gfc_typespec from, to;
2570 gfc_intrinsic_sym *sym;
2572 if (sizing == SZ_CONVS)
2578 gfc_clear_ts (&from);
2579 from.type = from_type;
2580 from.kind = from_kind;
2586 sym = conversion + nconv;
2588 sym->name = conv_name (&from, &to);
2589 sym->lib_name = sym->name;
2590 sym->simplify.cc = gfc_convert_constant;
2591 sym->standard = standard;
2594 sym->generic_id = GFC_ISYM_CONVERSION;
2600 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2601 functions by looping over the kind tables. */
2604 add_conversions (void)
2608 /* Integer-Integer conversions. */
2609 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2610 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2615 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2616 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2619 /* Integer-Real/Complex conversions. */
2620 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2621 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2623 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2624 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2626 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2627 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2629 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2630 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2632 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2633 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2636 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2638 /* Hollerith-Integer conversions. */
2639 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2640 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2641 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2642 /* Hollerith-Real conversions. */
2643 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2644 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2645 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2646 /* Hollerith-Complex conversions. */
2647 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2648 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2649 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2651 /* Hollerith-Character conversions. */
2652 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2653 gfc_default_character_kind, GFC_STD_LEGACY);
2655 /* Hollerith-Logical conversions. */
2656 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2657 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2658 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2661 /* Real/Complex - Real/Complex conversions. */
2662 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2663 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2667 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2668 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2670 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2671 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2674 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2675 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2677 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2678 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2681 /* Logical/Logical kind conversion. */
2682 for (i = 0; gfc_logical_kinds[i].kind; i++)
2683 for (j = 0; gfc_logical_kinds[j].kind; j++)
2688 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2689 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
2692 /* Integer-Logical and Logical-Integer conversions. */
2693 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2694 for (i=0; gfc_integer_kinds[i].kind; i++)
2695 for (j=0; gfc_logical_kinds[j].kind; j++)
2697 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2698 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
2699 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
2700 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2705 /* Initialize the table of intrinsics. */
2707 gfc_intrinsic_init_1 (void)
2711 nargs = nfunc = nsub = nconv = 0;
2713 /* Create a namespace to hold the resolved intrinsic symbols. */
2714 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
2723 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2724 + sizeof (gfc_intrinsic_arg) * nargs);
2726 next_sym = functions;
2727 subroutines = functions + nfunc;
2729 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2731 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2733 sizing = SZ_NOTHING;
2740 /* Set the pure flag. All intrinsic functions are pure, and
2741 intrinsic subroutines are pure if they are elemental. */
2743 for (i = 0; i < nfunc; i++)
2744 functions[i].pure = 1;
2746 for (i = 0; i < nsub; i++)
2747 subroutines[i].pure = subroutines[i].elemental;
2752 gfc_intrinsic_done_1 (void)
2754 gfc_free (functions);
2755 gfc_free (conversion);
2756 gfc_free_namespace (gfc_intrinsic_namespace);
2760 /******** Subroutines to check intrinsic interfaces ***********/
2762 /* Given a formal argument list, remove any NULL arguments that may
2763 have been left behind by a sort against some formal argument list. */
2766 remove_nullargs (gfc_actual_arglist ** ap)
2768 gfc_actual_arglist *head, *tail, *next;
2772 for (head = *ap; head; head = next)
2776 if (head->expr == NULL)
2779 gfc_free_actual_arglist (head);
2798 /* Given an actual arglist and a formal arglist, sort the actual
2799 arglist so that its arguments are in a one-to-one correspondence
2800 with the format arglist. Arguments that are not present are given
2801 a blank gfc_actual_arglist structure. If something is obviously
2802 wrong (say, a missing required argument) we abort sorting and
2806 sort_actual (const char *name, gfc_actual_arglist ** ap,
2807 gfc_intrinsic_arg * formal, locus * where)
2810 gfc_actual_arglist *actual, *a;
2811 gfc_intrinsic_arg *f;
2813 remove_nullargs (ap);
2816 for (f = formal; f; f = f->next)
2822 if (f == NULL && a == NULL) /* No arguments */
2826 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2832 if (a->name != NULL)
2844 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2848 /* Associate the remaining actual arguments, all of which have
2849 to be keyword arguments. */
2850 for (; a; a = a->next)
2852 for (f = formal; f; f = f->next)
2853 if (strcmp (a->name, f->name) == 0)
2858 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2859 a->name, name, where);
2863 if (f->actual != NULL)
2865 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2866 f->name, name, where);
2874 /* At this point, all unmatched formal args must be optional. */
2875 for (f = formal; f; f = f->next)
2877 if (f->actual == NULL && f->optional == 0)
2879 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2880 f->name, name, where);
2886 /* Using the formal argument list, string the actual argument list
2887 together in a way that corresponds with the formal list. */
2890 for (f = formal; f; f = f->next)
2892 if (f->actual == NULL)
2894 a = gfc_get_actual_arglist ();
2895 a->missing_arg_type = f->ts.type;
2907 actual->next = NULL; /* End the sorted argument list. */
2913 /* Compare an actual argument list with an intrinsic's formal argument
2914 list. The lists are checked for agreement of type. We don't check
2915 for arrayness here. */
2918 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2921 gfc_actual_arglist *actual;
2922 gfc_intrinsic_arg *formal;
2925 formal = sym->formal;
2929 for (; formal; formal = formal->next, actual = actual->next, i++)
2931 if (actual->expr == NULL)
2934 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2938 ("Type of argument '%s' in call to '%s' at %L should be "
2939 "%s, not %s", gfc_current_intrinsic_arg[i],
2940 gfc_current_intrinsic, &actual->expr->where,
2941 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2950 /* Given a pointer to an intrinsic symbol and an expression node that
2951 represent the function call to that subroutine, figure out the type
2952 of the result. This may involve calling a resolution subroutine. */
2955 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2957 gfc_expr *a1, *a2, *a3, *a4, *a5;
2958 gfc_actual_arglist *arg;
2960 if (specific->resolve.f1 == NULL)
2962 if (e->value.function.name == NULL)
2963 e->value.function.name = specific->lib_name;
2965 if (e->ts.type == BT_UNKNOWN)
2966 e->ts = specific->ts;
2970 arg = e->value.function.actual;
2972 /* Special case hacks for MIN and MAX. */
2973 if (specific->resolve.f1m == gfc_resolve_max
2974 || specific->resolve.f1m == gfc_resolve_min)
2976 (*specific->resolve.f1m) (e, arg);
2982 (*specific->resolve.f0) (e);
2991 (*specific->resolve.f1) (e, a1);
3000 (*specific->resolve.f2) (e, a1, a2);
3009 (*specific->resolve.f3) (e, a1, a2, a3);
3018 (*specific->resolve.f4) (e, a1, a2, a3, a4);
3027 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
3031 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
3035 /* Given an intrinsic symbol node and an expression node, call the
3036 simplification function (if there is one), perhaps replacing the
3037 expression with something simpler. We return FAILURE on an error
3038 of the simplification, SUCCESS if the simplification worked, even
3039 if nothing has changed in the expression itself. */
3042 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
3044 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
3045 gfc_actual_arglist *arg;
3047 /* Check the arguments if there are Hollerith constants. We deal with
3048 them at run-time. */
3049 for (arg = e->value.function.actual; arg != NULL; arg = arg->next)
3051 if (arg->expr && arg->expr->from_H)
3057 /* Max and min require special handling due to the variable number
3059 if (specific->simplify.f1 == gfc_simplify_min)
3061 result = gfc_simplify_min (e);
3065 if (specific->simplify.f1 == gfc_simplify_max)
3067 result = gfc_simplify_max (e);
3071 if (specific->simplify.f1 == NULL)
3077 arg = e->value.function.actual;
3081 result = (*specific->simplify.f0) ();
3088 if (specific->simplify.cc == gfc_convert_constant)
3090 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
3094 /* TODO: Warn if -pedantic and initialization expression and arg
3095 types not integer or character */
3098 result = (*specific->simplify.f1) (a1);
3105 result = (*specific->simplify.f2) (a1, a2);
3112 result = (*specific->simplify.f3) (a1, a2, a3);
3119 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3126 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3129 ("do_simplify(): Too many args for intrinsic");
3136 if (result == &gfc_bad_expr)
3140 resolve_intrinsic (specific, e); /* Must call at run-time */
3143 result->where = e->where;
3144 gfc_replace_expr (e, result);
3151 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3152 error messages. This subroutine returns FAILURE if a subroutine
3153 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3154 list cannot match any intrinsic. */
3157 init_arglist (gfc_intrinsic_sym * isym)
3159 gfc_intrinsic_arg *formal;
3162 gfc_current_intrinsic = isym->name;
3165 for (formal = isym->formal; formal; formal = formal->next)
3167 if (i >= MAX_INTRINSIC_ARGS)
3168 gfc_internal_error ("init_arglist(): too many arguments");
3169 gfc_current_intrinsic_arg[i++] = formal->name;
3174 /* Given a pointer to an intrinsic symbol and an expression consisting
3175 of a function call, see if the function call is consistent with the
3176 intrinsic's formal argument list. Return SUCCESS if the expression
3177 and intrinsic match, FAILURE otherwise. */
3180 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
3182 gfc_actual_arglist *arg, **ap;
3186 ap = &expr->value.function.actual;
3188 init_arglist (specific);
3190 /* Don't attempt to sort the argument list for min or max. */
3191 if (specific->check.f1m == gfc_check_min_max
3192 || specific->check.f1m == gfc_check_min_max_integer
3193 || specific->check.f1m == gfc_check_min_max_real
3194 || specific->check.f1m == gfc_check_min_max_double)
3195 return (*specific->check.f1m) (*ap);
3197 if (sort_actual (specific->name, ap, specific->formal,
3198 &expr->where) == FAILURE)
3201 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3202 /* This is special because we might have to reorder the argument
3204 t = gfc_check_minloc_maxloc (*ap);
3205 else if (specific->check.f3red == gfc_check_minval_maxval)
3206 /* This is also special because we also might have to reorder the
3208 t = gfc_check_minval_maxval (*ap);
3209 else if (specific->check.f3red == gfc_check_product_sum)
3210 /* Same here. The difference to the previous case is that we allow a
3211 general numeric type. */
3212 t = gfc_check_product_sum (*ap);
3215 if (specific->check.f1 == NULL)
3217 t = check_arglist (ap, specific, error_flag);
3219 expr->ts = specific->ts;
3222 t = do_check (specific, *ap);
3225 /* Check ranks for elemental intrinsics. */
3226 if (t == SUCCESS && specific->elemental)
3229 for (arg = expr->value.function.actual; arg; arg = arg->next)
3231 if (arg->expr == NULL || arg->expr->rank == 0)
3235 r = arg->expr->rank;
3239 if (arg->expr->rank != r)
3242 ("Ranks of arguments to elemental intrinsic '%s' differ "
3243 "at %L", specific->name, &arg->expr->where);
3250 remove_nullargs (ap);
3256 /* See if an intrinsic is one of the intrinsics we evaluate
3260 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
3262 /* FIXME: This should be moved into the intrinsic definitions. */
3263 static const char * const init_expr_extensions[] = {
3264 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
3265 "precision", "present", "radix", "range", "selected_real_kind",
3271 for (i = 0; init_expr_extensions[i]; i++)
3272 if (strcmp (init_expr_extensions[i], isym->name) == 0)
3279 /* Check whether an intrinsic belongs to whatever standard the user
3283 check_intrinsic_standard (const char *name, int standard, locus * where)
3285 if (!gfc_option.warn_nonstd_intrinsics)
3288 gfc_notify_std (standard, "Intrinsic '%s' at %L is not included "
3289 "in the selected standard", name, where);
3293 /* See if a function call corresponds to an intrinsic function call.
3296 MATCH_YES if the call corresponds to an intrinsic, simplification
3297 is done if possible.
3299 MATCH_NO if the call does not correspond to an intrinsic
3301 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3302 error during the simplification process.
3304 The error_flag parameter enables an error reporting. */
3307 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
3309 gfc_intrinsic_sym *isym, *specific;
3310 gfc_actual_arglist *actual;
3314 if (expr->value.function.isym != NULL)
3315 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3316 ? MATCH_ERROR : MATCH_YES;
3318 gfc_suppress_error = !error_flag;
3321 for (actual = expr->value.function.actual; actual; actual = actual->next)
3322 if (actual->expr != NULL)
3323 flag |= (actual->expr->ts.type != BT_INTEGER
3324 && actual->expr->ts.type != BT_CHARACTER);
3326 name = expr->symtree->n.sym->name;
3328 isym = specific = gfc_find_function (name);
3331 gfc_suppress_error = 0;
3335 gfc_current_intrinsic_where = &expr->where;
3337 /* Bypass the generic list for min and max. */
3338 if (isym->check.f1m == gfc_check_min_max)
3340 init_arglist (isym);
3342 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3345 gfc_suppress_error = 0;
3349 /* If the function is generic, check all of its specific
3350 incarnations. If the generic name is also a specific, we check
3351 that name last, so that any error message will correspond to the
3353 gfc_suppress_error = 1;
3357 for (specific = isym->specific_head; specific;
3358 specific = specific->next)
3360 if (specific == isym)
3362 if (check_specific (specific, expr, 0) == SUCCESS)
3367 gfc_suppress_error = !error_flag;
3369 if (check_specific (isym, expr, error_flag) == FAILURE)
3371 gfc_suppress_error = 0;
3378 expr->value.function.isym = specific;
3379 gfc_intrinsic_symbol (expr->symtree->n.sym);
3381 gfc_suppress_error = 0;
3382 if (do_simplify (specific, expr) == FAILURE)
3385 /* TODO: We should probably only allow elemental functions here. */
3386 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
3388 if (pedantic && gfc_init_expr
3389 && flag && gfc_init_expr_extensions (specific))
3391 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
3392 "nonstandard initialization expression at %L", &expr->where)
3399 check_intrinsic_standard (name, isym->standard, &expr->where);
3405 /* See if a CALL statement corresponds to an intrinsic subroutine.
3406 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3407 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3411 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
3413 gfc_intrinsic_sym *isym;
3416 name = c->symtree->n.sym->name;
3418 isym = find_subroutine (name);
3422 gfc_suppress_error = !error_flag;
3424 init_arglist (isym);
3426 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3429 if (isym->check.f1 != NULL)
3431 if (do_check (isym, c->ext.actual) == FAILURE)
3436 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3440 /* The subroutine corresponds to an intrinsic. Allow errors to be
3441 seen at this point. */
3442 gfc_suppress_error = 0;
3444 if (isym->resolve.s1 != NULL)
3445 isym->resolve.s1 (c);
3447 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3449 if (gfc_pure (NULL) && !isym->elemental)
3451 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3456 c->resolved_sym->attr.noreturn = isym->noreturn;
3457 check_intrinsic_standard (name, isym->standard, &c->loc);
3462 gfc_suppress_error = 0;
3467 /* Call gfc_convert_type() with warning enabled. */
3470 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
3472 return gfc_convert_type_warn (expr, ts, eflag, 1);
3476 /* Try to convert an expression (in place) from one type to another.
3477 'eflag' controls the behavior on error.
3479 The possible values are:
3481 1 Generate a gfc_error()
3482 2 Generate a gfc_internal_error().
3484 'wflag' controls the warning related to conversion. */
3487 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
3490 gfc_intrinsic_sym *sym;
3491 gfc_typespec from_ts;
3497 from_ts = expr->ts; /* expr->ts gets clobbered */
3499 if (ts->type == BT_UNKNOWN)
3502 /* NULL and zero size arrays get their type here. */
3503 if (expr->expr_type == EXPR_NULL
3504 || (expr->expr_type == EXPR_ARRAY
3505 && expr->value.constructor == NULL))
3507 /* Sometimes the RHS acquire the type. */
3512 if (expr->ts.type == BT_UNKNOWN)
3515 if (expr->ts.type == BT_DERIVED
3516 && ts->type == BT_DERIVED
3517 && gfc_compare_types (&expr->ts, ts))
3520 sym = find_conv (&expr->ts, ts);
3524 /* At this point, a conversion is necessary. A warning may be needed. */
3525 if ((gfc_option.warn_std & sym->standard) != 0)
3526 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3527 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3528 else if (wflag && gfc_option.warn_conversion)
3529 gfc_warning_now ("Conversion from %s to %s at %L",
3530 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3532 /* Insert a pre-resolved function call to the right function. */
3533 old_where = expr->where;
3535 shape = expr->shape;
3537 new = gfc_get_expr ();
3540 new = gfc_build_conversion (new);
3541 new->value.function.name = sym->lib_name;
3542 new->value.function.isym = sym;
3543 new->where = old_where;
3545 new->shape = gfc_copy_shape (shape, rank);
3547 gfc_get_ha_sym_tree (sym->name, &new->symtree);
3548 new->symtree->n.sym->ts = *ts;
3549 new->symtree->n.sym->attr.flavor = FL_PROCEDURE;
3550 new->symtree->n.sym->attr.function = 1;
3551 new->symtree->n.sym->attr.intrinsic = 1;
3552 new->symtree->n.sym->attr.elemental = 1;
3553 new->symtree->n.sym->attr.pure = 1;
3554 new->symtree->n.sym->attr.referenced = 1;
3555 gfc_intrinsic_symbol(new->symtree->n.sym);
3556 gfc_commit_symbol (new->symtree->n.sym);
3563 if (gfc_is_constant_expr (expr->value.function.actual->expr)
3564 && do_simplify (sym, expr) == FAILURE)
3569 return FAILURE; /* Error already generated in do_simplify() */
3577 gfc_error ("Can't convert %s to %s at %L",
3578 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3582 gfc_internal_error ("Can't convert %s to %s at %L",
3583 gfc_typename (&from_ts), gfc_typename (ts),