1 /* Build up a list of intrinsic subroutines and functions for the
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
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
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.
213 TODO: Are checks on actual_ok implemented elsewhere, or is that just
217 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
218 bt type, int kind, int standard, gfc_check_f check,
219 gfc_simplify_f simplify, gfc_resolve_f resolve, ...)
221 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
222 int optional, first_flag;
225 /* First check that the intrinsic belongs to the selected standard.
226 If not, don't add it to the symbol list. */
227 if (!(gfc_option.allow_std & standard))
241 next_sym->name = gfc_get_string (name);
243 strcpy (buf, "_gfortran_");
245 next_sym->lib_name = gfc_get_string (buf);
247 next_sym->elemental = elemental;
248 next_sym->ts.type = type;
249 next_sym->ts.kind = kind;
250 next_sym->standard = standard;
251 next_sym->simplify = simplify;
252 next_sym->check = check;
253 next_sym->resolve = resolve;
254 next_sym->specific = 0;
255 next_sym->generic = 0;
259 gfc_internal_error ("add_sym(): Bad sizing mode");
262 va_start (argp, resolve);
268 name = va_arg (argp, char *);
272 type = (bt) va_arg (argp, int);
273 kind = va_arg (argp, int);
274 optional = va_arg (argp, int);
276 if (sizing != SZ_NOTHING)
283 next_sym->formal = next_arg;
285 (next_arg - 1)->next = next_arg;
289 strcpy (next_arg->name, name);
290 next_arg->ts.type = type;
291 next_arg->ts.kind = kind;
292 next_arg->optional = optional;
302 /* Add a symbol to the function list where the function takes
306 add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
307 int kind, int standard,
309 gfc_expr *(*simplify)(void),
310 void (*resolve)(gfc_expr *))
320 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
325 /* Add a symbol to the subroutine list where the subroutine takes
329 add_sym_0s (const char * name, int actual_ok, int standard,
330 void (*resolve)(gfc_code *))
340 add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, standard, cf, sf, rf,
345 /* Add a symbol to the function list where the function takes
349 add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
350 int kind, int standard,
351 try (*check)(gfc_expr *),
352 gfc_expr *(*simplify)(gfc_expr *),
353 void (*resolve)(gfc_expr *,gfc_expr *),
354 const char* a1, bt type1, int kind1, int optional1)
364 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
365 a1, type1, kind1, optional1,
370 /* Add a symbol to the subroutine list where the subroutine takes
374 add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
375 int kind, int standard,
376 try (*check)(gfc_expr *),
377 gfc_expr *(*simplify)(gfc_expr *),
378 void (*resolve)(gfc_code *),
379 const char* a1, bt type1, int kind1, int optional1)
389 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
390 a1, type1, kind1, optional1,
395 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
396 function. MAX et al take 2 or more arguments. */
399 add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
400 int kind, int standard,
401 try (*check)(gfc_actual_arglist *),
402 gfc_expr *(*simplify)(gfc_expr *),
403 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
404 const char* a1, bt type1, int kind1, int optional1,
405 const char* a2, bt type2, int kind2, int optional2)
415 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
416 a1, type1, kind1, optional1,
417 a2, type2, kind2, optional2,
422 /* Add a symbol to the function list where the function takes
426 add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
427 int kind, int standard,
428 try (*check)(gfc_expr *,gfc_expr *),
429 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
430 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
431 const char* a1, bt type1, int kind1, int optional1,
432 const char* a2, bt type2, int kind2, int optional2)
442 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
443 a1, type1, kind1, optional1,
444 a2, type2, kind2, optional2,
449 /* Add a symbol to the subroutine list where the subroutine takes
453 add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
454 int kind, int standard,
455 try (*check)(gfc_expr *,gfc_expr *),
456 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
457 void (*resolve)(gfc_code *),
458 const char* a1, bt type1, int kind1, int optional1,
459 const char* a2, bt type2, int kind2, int optional2)
469 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
470 a1, type1, kind1, optional1,
471 a2, type2, kind2, optional2,
476 /* Add a symbol to the function list where the function takes
480 add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
481 int kind, int standard,
482 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
483 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
484 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
485 const char* a1, bt type1, int kind1, int optional1,
486 const char* a2, bt type2, int kind2, int optional2,
487 const char* a3, bt type3, int kind3, int optional3)
497 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
498 a1, type1, kind1, optional1,
499 a2, type2, kind2, optional2,
500 a3, type3, kind3, optional3,
505 /* MINLOC and MAXLOC get special treatment because their argument
506 might have to be reordered. */
509 add_sym_3ml (const char *name, int elemental,
510 int actual_ok, bt type, int kind, int standard,
511 try (*check)(gfc_actual_arglist *),
512 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
513 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
514 const char* a1, bt type1, int kind1, int optional1,
515 const char* a2, bt type2, int kind2, int optional2,
516 const char* a3, bt type3, int kind3, int optional3)
526 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
527 a1, type1, kind1, optional1,
528 a2, type2, kind2, optional2,
529 a3, type3, kind3, optional3,
534 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
535 their argument also might have to be reordered. */
538 add_sym_3red (const char *name, int elemental,
539 int actual_ok, bt type, int kind, int standard,
540 try (*check)(gfc_actual_arglist *),
541 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
542 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
543 const char* a1, bt type1, int kind1, int optional1,
544 const char* a2, bt type2, int kind2, int optional2,
545 const char* a3, bt type3, int kind3, int optional3)
555 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
556 a1, type1, kind1, optional1,
557 a2, type2, kind2, optional2,
558 a3, type3, kind3, optional3,
563 /* Add a symbol to the subroutine list where the subroutine takes
567 add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
568 int kind, int standard,
569 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
570 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
571 void (*resolve)(gfc_code *),
572 const char* a1, bt type1, int kind1, int optional1,
573 const char* a2, bt type2, int kind2, int optional2,
574 const char* a3, bt type3, int kind3, int optional3)
584 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
585 a1, type1, kind1, optional1,
586 a2, type2, kind2, optional2,
587 a3, type3, kind3, optional3,
592 /* Add a symbol to the function list where the function takes
596 add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
597 int kind, int standard,
598 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
599 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
600 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
601 const char* a1, bt type1, int kind1, int optional1,
602 const char* a2, bt type2, int kind2, int optional2,
603 const char* a3, bt type3, int kind3, int optional3,
604 const char* a4, bt type4, int kind4, int optional4 )
614 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
615 a1, type1, kind1, optional1,
616 a2, type2, kind2, optional2,
617 a3, type3, kind3, optional3,
618 a4, type4, kind4, optional4,
623 /* Add a symbol to the subroutine list where the subroutine takes
627 add_sym_4s (const char *name, int elemental, int actual_ok,
628 bt type, int kind, int standard,
629 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
630 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
631 void (*resolve)(gfc_code *),
632 const char* a1, bt type1, int kind1, int optional1,
633 const char* a2, bt type2, int kind2, int optional2,
634 const char* a3, bt type3, int kind3, int optional3,
635 const char* a4, bt type4, int kind4, int optional4)
645 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
646 a1, type1, kind1, optional1,
647 a2, type2, kind2, optional2,
648 a3, type3, kind3, optional3,
649 a4, type4, kind4, optional4,
654 /* Add a symbol to the subroutine list where the subroutine takes
658 add_sym_5s (const char *name, int elemental, int actual_ok,
659 bt type, int kind, int standard,
660 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
661 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
662 void (*resolve)(gfc_code *),
663 const char* a1, bt type1, int kind1, int optional1,
664 const char* a2, bt type2, int kind2, int optional2,
665 const char* a3, bt type3, int kind3, int optional3,
666 const char* a4, bt type4, int kind4, int optional4,
667 const char* a5, bt type5, int kind5, int optional5)
677 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
678 a1, type1, kind1, optional1,
679 a2, type2, kind2, optional2,
680 a3, type3, kind3, optional3,
681 a4, type4, kind4, optional4,
682 a5, type5, kind5, optional5,
687 /* Locate an intrinsic symbol given a base pointer, number of elements
688 in the table and a pointer to a name. Returns the NULL pointer if
689 a name is not found. */
691 static gfc_intrinsic_sym *
692 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
697 if (strcmp (name, start->name) == 0)
708 /* Given a name, find a function in the intrinsic function table.
709 Returns NULL if not found. */
712 gfc_find_function (const char *name)
715 return find_sym (functions, nfunc, name);
719 /* Given a name, find a function in the intrinsic subroutine table.
720 Returns NULL if not found. */
722 static gfc_intrinsic_sym *
723 find_subroutine (const char *name)
726 return find_sym (subroutines, nsub, name);
730 /* Given a string, figure out if it is the name of a generic intrinsic
734 gfc_generic_intrinsic (const char *name)
736 gfc_intrinsic_sym *sym;
738 sym = gfc_find_function (name);
739 return (sym == NULL) ? 0 : sym->generic;
743 /* Given a string, figure out if it is the name of a specific
744 intrinsic function or not. */
747 gfc_specific_intrinsic (const char *name)
749 gfc_intrinsic_sym *sym;
751 sym = gfc_find_function (name);
752 return (sym == NULL) ? 0 : sym->specific;
756 /* Given a string, figure out if it is the name of an intrinsic
757 subroutine or function. There are no generic intrinsic
758 subroutines, they are all specific. */
761 gfc_intrinsic_name (const char *name, int subroutine_flag)
764 return subroutine_flag ?
765 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
769 /* Collect a set of intrinsic functions into a generic collection.
770 The first argument is the name of the generic function, which is
771 also the name of a specific function. The rest of the specifics
772 currently in the table are placed into the list of specific
773 functions associated with that generic. */
776 make_generic (const char *name, gfc_generic_isym_id generic_id, int standard)
778 gfc_intrinsic_sym *g;
780 if (!(gfc_option.allow_std & standard))
783 if (sizing != SZ_NOTHING)
786 g = gfc_find_function (name);
788 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
793 g->generic_id = generic_id;
794 if ((g + 1)->name != NULL)
795 g->specific_head = g + 1;
798 while (g->name != NULL)
802 g->generic_id = generic_id;
811 /* Create a duplicate intrinsic function entry for the current
812 function, the only difference being the alternate name. Note that
813 we use argument lists more than once, but all argument lists are
814 freed as a single block. */
817 make_alias (const char *name, int standard)
820 /* First check that the intrinsic belongs to the selected standard.
821 If not, don't add it to the symbol list. */
822 if (!(gfc_option.allow_std & standard))
836 next_sym[0] = next_sym[-1];
837 next_sym->name = gfc_get_string (name);
846 /* Make the current subroutine noreturn. */
851 if (sizing == SZ_NOTHING)
852 next_sym[-1].noreturn = 1;
855 /* Add intrinsic functions. */
861 /* Argument names as in the standard (to be used as argument keywords). */
863 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
864 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
865 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
866 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
867 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
868 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
869 *p = "p", *ar = "array", *shp = "shape", *src = "source",
870 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
871 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
872 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
873 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
874 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
877 int di, dr, dd, dl, dc, dz, ii;
879 di = gfc_default_integer_kind;
880 dr = gfc_default_real_kind;
881 dd = gfc_default_double_kind;
882 dl = gfc_default_logical_kind;
883 dc = gfc_default_character_kind;
884 dz = gfc_default_complex_kind;
885 ii = gfc_index_integer_kind;
887 add_sym_1 ("abs", 1, 1, BT_REAL, dr, GFC_STD_F77,
888 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
889 a, BT_REAL, dr, REQUIRED);
891 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di, GFC_STD_F77,
892 NULL, gfc_simplify_abs, gfc_resolve_abs,
893 a, BT_INTEGER, di, REQUIRED);
895 add_sym_1 ("dabs", 1, 1, BT_REAL, dd, GFC_STD_F77,
896 NULL, gfc_simplify_abs, gfc_resolve_abs,
897 a, BT_REAL, dd, REQUIRED);
899 add_sym_1 ("cabs", 1, 1, BT_REAL, dr, GFC_STD_F77,
900 NULL, gfc_simplify_abs, gfc_resolve_abs,
901 a, BT_COMPLEX, dz, REQUIRED);
903 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, GFC_STD_GNU,
904 NULL, gfc_simplify_abs, gfc_resolve_abs,
905 a, BT_COMPLEX, dd, REQUIRED);
907 make_alias ("cdabs", GFC_STD_GNU);
909 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
911 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
912 gfc_check_achar, gfc_simplify_achar, NULL,
913 i, BT_INTEGER, di, REQUIRED);
915 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
917 add_sym_1 ("acos", 1, 1, BT_REAL, dr, GFC_STD_F77,
918 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
919 x, BT_REAL, dr, REQUIRED);
921 add_sym_1 ("dacos", 1, 1, BT_REAL, dd, GFC_STD_F77,
922 NULL, gfc_simplify_acos, gfc_resolve_acos,
923 x, BT_REAL, dd, REQUIRED);
925 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
927 add_sym_1 ("acosh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
928 gfc_check_fn_r, gfc_simplify_acosh, gfc_resolve_acosh,
929 x, BT_REAL, dr, REQUIRED);
931 add_sym_1 ("dacosh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
932 NULL, gfc_simplify_acosh, gfc_resolve_acosh,
933 x, BT_REAL, dd, REQUIRED);
935 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_GNU);
937 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
938 NULL, gfc_simplify_adjustl, NULL,
939 stg, BT_CHARACTER, dc, REQUIRED);
941 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
943 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
944 NULL, gfc_simplify_adjustr, NULL,
945 stg, BT_CHARACTER, dc, REQUIRED);
947 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
949 add_sym_1 ("aimag", 1, 1, BT_REAL, dr, GFC_STD_F77,
950 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
951 z, BT_COMPLEX, dz, REQUIRED);
953 make_alias ("imag", GFC_STD_GNU);
954 make_alias ("imagpart", GFC_STD_GNU);
956 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, GFC_STD_GNU,
957 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
958 z, BT_COMPLEX, dd, REQUIRED);
961 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
963 add_sym_2 ("aint", 1, 1, BT_REAL, dr, GFC_STD_F77,
964 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
965 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
967 add_sym_1 ("dint", 1, 1, BT_REAL, dd, GFC_STD_F77,
968 NULL, gfc_simplify_dint, gfc_resolve_dint,
969 a, BT_REAL, dd, REQUIRED);
971 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
973 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
974 gfc_check_all_any, NULL, gfc_resolve_all,
975 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
977 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
979 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
980 gfc_check_allocated, NULL, NULL,
981 ar, BT_UNKNOWN, 0, REQUIRED);
983 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
985 add_sym_2 ("anint", 1, 1, BT_REAL, dr, GFC_STD_F77,
986 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
987 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
989 add_sym_1 ("dnint", 1, 1, BT_REAL, dd, GFC_STD_F77,
990 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
991 a, BT_REAL, dd, REQUIRED);
993 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
995 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
996 gfc_check_all_any, NULL, gfc_resolve_any,
997 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
999 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1001 add_sym_1 ("asin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1002 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1003 x, BT_REAL, dr, REQUIRED);
1005 add_sym_1 ("dasin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1006 NULL, gfc_simplify_asin, gfc_resolve_asin,
1007 x, BT_REAL, dd, REQUIRED);
1009 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1011 add_sym_1 ("asinh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1012 gfc_check_fn_r, gfc_simplify_asinh, gfc_resolve_asinh,
1013 x, BT_REAL, dr, REQUIRED);
1015 add_sym_1 ("dasinh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1016 NULL, gfc_simplify_asinh, gfc_resolve_asinh,
1017 x, BT_REAL, dd, REQUIRED);
1019 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_GNU);
1021 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1022 gfc_check_associated, NULL, NULL,
1023 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1025 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1027 add_sym_1 ("atan", 1, 1, BT_REAL, dr, GFC_STD_F77,
1028 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1029 x, BT_REAL, dr, REQUIRED);
1031 add_sym_1 ("datan", 1, 1, BT_REAL, dd, GFC_STD_F77,
1032 NULL, gfc_simplify_atan, gfc_resolve_atan,
1033 x, BT_REAL, dd, REQUIRED);
1035 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1037 add_sym_1 ("atanh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1038 gfc_check_fn_r, gfc_simplify_atanh, gfc_resolve_atanh,
1039 x, BT_REAL, dr, REQUIRED);
1041 add_sym_1 ("datanh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1042 NULL, gfc_simplify_atanh, gfc_resolve_atanh,
1043 x, BT_REAL, dd, REQUIRED);
1045 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_GNU);
1047 add_sym_2 ("atan2", 1, 1, BT_REAL, dr, GFC_STD_F77,
1048 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1049 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1051 add_sym_2 ("datan2", 1, 1, BT_REAL, dd, GFC_STD_F77,
1052 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
1053 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1055 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1057 /* Bessel and Neumann functions for G77 compatibility. */
1058 add_sym_1 ("besj0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1059 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1060 x, BT_REAL, dr, REQUIRED);
1062 add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1063 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1064 x, BT_REAL, dd, REQUIRED);
1066 make_generic ("besj0", GFC_ISYM_J0, GFC_STD_GNU);
1068 add_sym_1 ("besj1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1069 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1070 x, BT_REAL, dr, REQUIRED);
1072 add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1073 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1074 x, BT_REAL, dd, REQUIRED);
1076 make_generic ("besj1", GFC_ISYM_J1, GFC_STD_GNU);
1078 add_sym_2 ("besjn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1079 gfc_check_besn, NULL, gfc_resolve_besn,
1080 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1082 add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1083 gfc_check_besn, NULL, gfc_resolve_besn,
1084 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1086 make_generic ("besjn", GFC_ISYM_JN, GFC_STD_GNU);
1088 add_sym_1 ("besy0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1089 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1090 x, BT_REAL, dr, REQUIRED);
1092 add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1093 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1094 x, BT_REAL, dd, REQUIRED);
1096 make_generic ("besy0", GFC_ISYM_Y0, GFC_STD_GNU);
1098 add_sym_1 ("besy1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1099 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1100 x, BT_REAL, dr, REQUIRED);
1102 add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1103 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1104 x, BT_REAL, dd, REQUIRED);
1106 make_generic ("besy1", GFC_ISYM_Y1, GFC_STD_GNU);
1108 add_sym_2 ("besyn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1109 gfc_check_besn, NULL, gfc_resolve_besn,
1110 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1112 add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1113 gfc_check_besn, NULL, gfc_resolve_besn,
1114 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1116 make_generic ("besyn", GFC_ISYM_YN, GFC_STD_GNU);
1118 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1119 gfc_check_i, gfc_simplify_bit_size, NULL,
1120 i, BT_INTEGER, di, REQUIRED);
1122 make_generic ("bit_size", GFC_ISYM_NONE, GFC_STD_F95);
1124 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl, GFC_STD_F95,
1125 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1126 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1128 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1130 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1131 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1132 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1134 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1136 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc, GFC_STD_F77,
1137 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1138 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1140 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1142 add_sym_1 ("chdir", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1143 gfc_check_chdir, NULL, gfc_resolve_chdir,
1144 a, BT_CHARACTER, dc, REQUIRED);
1146 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1148 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1149 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1150 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1151 kind, BT_INTEGER, di, OPTIONAL);
1153 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1155 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1156 complex instead of the default complex. */
1158 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1159 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1160 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1162 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1164 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1165 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1166 z, BT_COMPLEX, dz, REQUIRED);
1168 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1169 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1170 z, BT_COMPLEX, dd, REQUIRED);
1172 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1174 add_sym_1 ("cos", 1, 1, BT_REAL, dr, GFC_STD_F77,
1175 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1176 x, BT_REAL, dr, REQUIRED);
1178 add_sym_1 ("dcos", 1, 1, BT_REAL, dd, GFC_STD_F77,
1179 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1180 x, BT_REAL, dd, REQUIRED);
1182 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1183 NULL, gfc_simplify_cos, gfc_resolve_cos,
1184 x, BT_COMPLEX, dz, REQUIRED);
1186 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1187 NULL, gfc_simplify_cos, gfc_resolve_cos,
1188 x, BT_COMPLEX, dd, REQUIRED);
1190 make_alias ("cdcos", GFC_STD_GNU);
1192 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1194 add_sym_1 ("cosh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1195 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1196 x, BT_REAL, dr, REQUIRED);
1198 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1199 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1200 x, BT_REAL, dd, REQUIRED);
1202 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1204 add_sym_2 ("count", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1205 gfc_check_count, NULL, gfc_resolve_count,
1206 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1208 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1210 add_sym_3 ("cshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1211 gfc_check_cshift, NULL, gfc_resolve_cshift,
1212 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1213 dm, BT_INTEGER, ii, OPTIONAL);
1215 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1217 add_sym_1 ("dble", 1, 1, BT_REAL, dd, GFC_STD_F77,
1218 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1219 a, BT_REAL, dr, REQUIRED);
1221 make_alias ("dfloat", GFC_STD_GNU);
1223 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1225 add_sym_1 ("digits", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1226 gfc_check_digits, gfc_simplify_digits, NULL,
1227 x, BT_UNKNOWN, dr, REQUIRED);
1229 make_generic ("digits", GFC_ISYM_NONE, GFC_STD_F95);
1231 add_sym_2 ("dim", 1, 1, BT_REAL, dr, GFC_STD_F77,
1232 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1233 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1235 add_sym_2 ("idim", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1236 NULL, gfc_simplify_dim, gfc_resolve_dim,
1237 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1239 add_sym_2 ("ddim", 1, 1, BT_REAL, dd, GFC_STD_F77,
1240 NULL, gfc_simplify_dim, gfc_resolve_dim,
1241 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1243 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1245 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1246 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1247 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1249 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1251 add_sym_2 ("dprod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1252 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1253 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1255 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1257 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1259 a, BT_COMPLEX, dd, REQUIRED);
1261 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1263 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1264 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1265 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1266 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1268 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1270 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr, GFC_STD_F95,
1271 gfc_check_x, gfc_simplify_epsilon, NULL,
1272 x, BT_REAL, dr, REQUIRED);
1274 make_generic ("epsilon", GFC_ISYM_NONE, GFC_STD_F95);
1276 /* G77 compatibility for the ERF() and ERFC() functions. */
1277 add_sym_1 ("erf", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1278 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1279 x, BT_REAL, dr, REQUIRED);
1281 add_sym_1 ("derf", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1282 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1283 x, BT_REAL, dd, REQUIRED);
1285 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_GNU);
1287 add_sym_1 ("erfc", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1288 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1289 x, BT_REAL, dr, REQUIRED);
1291 add_sym_1 ("derfc", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1292 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1293 x, BT_REAL, dd, REQUIRED);
1295 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_GNU);
1297 /* G77 compatibility */
1298 add_sym_1 ("etime", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1299 gfc_check_etime, NULL, NULL,
1300 x, BT_REAL, 4, REQUIRED);
1302 make_alias ("dtime", GFC_STD_GNU);
1304 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1306 add_sym_1 ("exp", 1, 1, BT_REAL, dr, GFC_STD_F77,
1307 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1308 x, BT_REAL, dr, REQUIRED);
1310 add_sym_1 ("dexp", 1, 1, BT_REAL, dd, GFC_STD_F77,
1311 NULL, gfc_simplify_exp, gfc_resolve_exp,
1312 x, BT_REAL, dd, REQUIRED);
1314 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1315 NULL, gfc_simplify_exp, gfc_resolve_exp,
1316 x, BT_COMPLEX, dz, REQUIRED);
1318 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1319 NULL, gfc_simplify_exp, gfc_resolve_exp,
1320 x, BT_COMPLEX, dd, REQUIRED);
1322 make_alias ("cdexp", GFC_STD_GNU);
1324 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1326 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1327 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1328 x, BT_REAL, dr, REQUIRED);
1330 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1332 add_sym_2 ("floor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1333 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1334 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1336 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1338 /* G77 compatible fnum */
1339 add_sym_1 ("fnum", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1340 gfc_check_fnum, NULL, gfc_resolve_fnum,
1341 ut, BT_INTEGER, di, REQUIRED);
1343 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1345 add_sym_1 ("fraction", 1, 1, BT_REAL, dr, GFC_STD_F95,
1346 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1347 x, BT_REAL, dr, REQUIRED);
1349 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1351 add_sym_2 ("fstat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1352 gfc_check_fstat, NULL, gfc_resolve_fstat,
1353 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1355 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1357 /* Unix IDs (g77 compatibility) */
1358 add_sym_1 ("getcwd", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1359 NULL, NULL, gfc_resolve_getcwd,
1360 c, BT_CHARACTER, dc, REQUIRED);
1362 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1364 add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1365 NULL, NULL, gfc_resolve_getgid);
1367 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1369 add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1370 NULL, NULL, gfc_resolve_getpid);
1372 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1374 add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1375 NULL, NULL, gfc_resolve_getuid);
1377 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1379 add_sym_1 ("hostnm", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1380 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1381 a, BT_CHARACTER, dc, REQUIRED);
1383 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1385 add_sym_1 ("huge", 0, 1, BT_REAL, dr, GFC_STD_F95,
1386 gfc_check_huge, gfc_simplify_huge, NULL,
1387 x, BT_UNKNOWN, dr, REQUIRED);
1389 make_generic ("huge", GFC_ISYM_NONE, GFC_STD_F95);
1391 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1392 gfc_check_ichar_iachar, gfc_simplify_iachar, NULL,
1393 c, BT_CHARACTER, dc, REQUIRED);
1395 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1397 add_sym_2 ("iand", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1398 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1399 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1401 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1403 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1406 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1408 add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, GFC_STD_F2003,
1411 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1414 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1415 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1416 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1418 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1420 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1421 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1422 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1423 ln, BT_INTEGER, di, REQUIRED);
1425 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1427 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1428 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1429 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1431 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1433 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1434 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1435 c, BT_CHARACTER, dc, REQUIRED);
1437 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1439 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1440 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1441 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1443 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1445 add_sym_0 ("ierrno", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1446 NULL, NULL, gfc_resolve_ierrno);
1448 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1450 add_sym_3 ("index", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1451 gfc_check_index, gfc_simplify_index, NULL,
1452 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1453 bck, BT_LOGICAL, dl, OPTIONAL);
1455 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1457 add_sym_2 ("int", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1458 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1459 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1461 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1462 NULL, gfc_simplify_ifix, NULL,
1463 a, BT_REAL, dr, REQUIRED);
1465 add_sym_1 ("idint", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1466 NULL, gfc_simplify_idint, NULL,
1467 a, BT_REAL, dd, REQUIRED);
1469 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1471 add_sym_2 ("ior", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1472 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1473 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1475 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1477 /* The following function is for G77 compatibility. */
1478 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4, GFC_STD_GNU,
1479 gfc_check_irand, NULL, NULL,
1480 i, BT_INTEGER, 4, OPTIONAL);
1482 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1484 add_sym_1 ("isatty", 0, 0, BT_LOGICAL, dl, GFC_STD_GNU,
1485 gfc_check_isatty, NULL, gfc_resolve_isatty,
1486 ut, BT_INTEGER, di, REQUIRED);
1488 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1490 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1491 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1492 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1494 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1496 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1497 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1498 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1499 sz, BT_INTEGER, di, OPTIONAL);
1501 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1503 add_sym_2 ("kill", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1504 gfc_check_kill, NULL, gfc_resolve_kill,
1505 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1507 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1509 add_sym_1 ("kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1510 gfc_check_kind, gfc_simplify_kind, NULL,
1511 x, BT_REAL, dr, REQUIRED);
1513 make_generic ("kind", GFC_ISYM_NONE, GFC_STD_F95);
1515 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1516 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1517 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL);
1519 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1521 add_sym_1 ("len", 0, 1, BT_INTEGER, di, GFC_STD_F77,
1522 NULL, gfc_simplify_len, gfc_resolve_len,
1523 stg, BT_CHARACTER, dc, REQUIRED);
1525 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1527 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1528 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1529 stg, BT_CHARACTER, dc, REQUIRED);
1531 make_alias ("lnblnk", GFC_STD_GNU);
1533 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1535 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1536 NULL, gfc_simplify_lge, NULL,
1537 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1539 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1541 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1542 NULL, gfc_simplify_lgt, NULL,
1543 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1545 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1547 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1548 NULL, gfc_simplify_lle, NULL,
1549 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1551 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1553 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1554 NULL, gfc_simplify_llt, NULL,
1555 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1557 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1559 add_sym_2 ("link", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1560 gfc_check_link, NULL, gfc_resolve_link,
1561 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1563 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1565 add_sym_1 ("log", 1, 1, BT_REAL, dr, GFC_STD_F77,
1566 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1567 x, BT_REAL, dr, REQUIRED);
1569 add_sym_1 ("alog", 1, 1, BT_REAL, dr, GFC_STD_F77,
1570 NULL, gfc_simplify_log, gfc_resolve_log,
1571 x, BT_REAL, dr, REQUIRED);
1573 add_sym_1 ("dlog", 1, 1, BT_REAL, dd, GFC_STD_F77,
1574 NULL, gfc_simplify_log, gfc_resolve_log,
1575 x, BT_REAL, dd, REQUIRED);
1577 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1578 NULL, gfc_simplify_log, gfc_resolve_log,
1579 x, BT_COMPLEX, dz, REQUIRED);
1581 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1582 NULL, gfc_simplify_log, gfc_resolve_log,
1583 x, BT_COMPLEX, dd, REQUIRED);
1585 make_alias ("cdlog", GFC_STD_GNU);
1587 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
1589 add_sym_1 ("log10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1590 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
1591 x, BT_REAL, dr, REQUIRED);
1593 add_sym_1 ("alog10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1594 NULL, gfc_simplify_log10, gfc_resolve_log10,
1595 x, BT_REAL, dr, REQUIRED);
1597 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd, GFC_STD_F77,
1598 NULL, gfc_simplify_log10, gfc_resolve_log10,
1599 x, BT_REAL, dd, REQUIRED);
1601 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
1603 add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1604 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1605 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1607 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
1609 add_sym_1 ("malloc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU, gfc_check_malloc,
1610 NULL, gfc_resolve_malloc, a, BT_INTEGER, di, REQUIRED);
1612 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
1614 add_sym_2 ("matmul", 0, 1, BT_REAL, dr, GFC_STD_F95,
1615 gfc_check_matmul, NULL, gfc_resolve_matmul,
1616 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
1618 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
1620 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1621 int(max). The max function must take at least two arguments. */
1623 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1624 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1625 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
1627 add_sym_1m ("max0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1628 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1629 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1631 add_sym_1m ("amax0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1632 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1633 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1635 add_sym_1m ("amax1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1636 gfc_check_min_max_real, gfc_simplify_max, NULL,
1637 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1639 add_sym_1m ("max1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1640 gfc_check_min_max_real, gfc_simplify_max, NULL,
1641 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1643 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1644 gfc_check_min_max_double, gfc_simplify_max, NULL,
1645 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1647 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
1649 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1650 gfc_check_x, gfc_simplify_maxexponent, NULL,
1651 x, BT_UNKNOWN, dr, REQUIRED);
1653 make_generic ("maxexponent", GFC_ISYM_NONE, GFC_STD_F95);
1655 add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1656 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1657 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1658 msk, BT_LOGICAL, dl, OPTIONAL);
1660 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
1662 add_sym_3red ("maxval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1663 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1664 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1665 msk, BT_LOGICAL, dl, OPTIONAL);
1667 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
1669 add_sym_3 ("merge", 1, 1, BT_REAL, dr, GFC_STD_F95,
1670 gfc_check_merge, NULL, gfc_resolve_merge,
1671 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
1672 msk, BT_LOGICAL, dl, REQUIRED);
1674 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
1676 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
1679 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1680 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1681 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1683 add_sym_1m ("min0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1684 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1685 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1687 add_sym_1m ("amin0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1688 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1689 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1691 add_sym_1m ("amin1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1692 gfc_check_min_max_real, gfc_simplify_min, NULL,
1693 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1695 add_sym_1m ("min1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1696 gfc_check_min_max_real, gfc_simplify_min, NULL,
1697 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1699 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1700 gfc_check_min_max_double, gfc_simplify_min, NULL,
1701 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1703 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
1705 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1706 gfc_check_x, gfc_simplify_minexponent, NULL,
1707 x, BT_UNKNOWN, dr, REQUIRED);
1709 make_generic ("minexponent", GFC_ISYM_NONE, GFC_STD_F95);
1711 add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1712 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1713 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1714 msk, BT_LOGICAL, dl, OPTIONAL);
1716 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
1718 add_sym_3red ("minval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1719 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1720 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1721 msk, BT_LOGICAL, dl, OPTIONAL);
1723 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
1725 add_sym_2 ("mod", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1726 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1727 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
1729 add_sym_2 ("amod", 1, 1, BT_REAL, dr, GFC_STD_F77,
1730 NULL, gfc_simplify_mod, gfc_resolve_mod,
1731 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
1733 add_sym_2 ("dmod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1734 NULL, gfc_simplify_mod, gfc_resolve_mod,
1735 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
1737 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
1739 add_sym_2 ("modulo", 1, 1, BT_REAL, di, GFC_STD_F95,
1740 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1741 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
1743 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
1745 add_sym_2 ("nearest", 1, 1, BT_REAL, dr, GFC_STD_F95,
1746 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1747 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
1749 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
1751 add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1752 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1753 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1755 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1756 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1757 a, BT_REAL, dd, REQUIRED);
1759 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
1761 add_sym_1 ("not", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1762 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1763 i, BT_INTEGER, di, REQUIRED);
1765 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
1767 add_sym_1 ("null", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1768 gfc_check_null, gfc_simplify_null, NULL,
1769 mo, BT_INTEGER, di, OPTIONAL);
1771 make_generic ("null", GFC_ISYM_NONE, GFC_STD_F95);
1773 add_sym_3 ("pack", 0, 1, BT_REAL, dr, GFC_STD_F95,
1774 gfc_check_pack, NULL, gfc_resolve_pack,
1775 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1776 v, BT_REAL, dr, OPTIONAL);
1778 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
1780 add_sym_1 ("precision", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1781 gfc_check_precision, gfc_simplify_precision, NULL,
1782 x, BT_UNKNOWN, 0, REQUIRED);
1784 make_generic ("precision", GFC_ISYM_NONE, GFC_STD_F95);
1786 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1787 gfc_check_present, NULL, NULL,
1788 a, BT_REAL, dr, REQUIRED);
1790 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
1792 add_sym_3red ("product", 0, 1, BT_REAL, dr, GFC_STD_F95,
1793 gfc_check_product_sum, NULL, gfc_resolve_product,
1794 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1795 msk, BT_LOGICAL, dl, OPTIONAL);
1797 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
1799 add_sym_1 ("radix", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1800 gfc_check_radix, gfc_simplify_radix, NULL,
1801 x, BT_UNKNOWN, 0, REQUIRED);
1803 make_generic ("radix", GFC_ISYM_NONE, GFC_STD_F95);
1805 /* The following function is for G77 compatibility. */
1806 add_sym_1 ("rand", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1807 gfc_check_rand, NULL, NULL,
1808 i, BT_INTEGER, 4, OPTIONAL);
1810 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
1811 use slightly different shoddy multiplicative congruential PRNG. */
1812 make_alias ("ran", GFC_STD_GNU);
1814 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
1816 add_sym_1 ("range", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1817 gfc_check_range, gfc_simplify_range, NULL,
1818 x, BT_REAL, dr, REQUIRED);
1820 make_generic ("range", GFC_ISYM_NONE, GFC_STD_F95);
1822 add_sym_2 ("real", 1, 0, BT_REAL, dr, GFC_STD_F77,
1823 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1824 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1826 /* This provides compatibility with g77. */
1827 add_sym_1 ("realpart", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1828 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
1829 a, BT_UNKNOWN, dr, REQUIRED);
1831 add_sym_1 ("float", 1, 0, BT_REAL, dr, GFC_STD_F77,
1832 NULL, gfc_simplify_float, NULL,
1833 a, BT_INTEGER, di, REQUIRED);
1835 add_sym_1 ("sngl", 1, 0, BT_REAL, dr, GFC_STD_F77,
1836 NULL, gfc_simplify_sngl, NULL,
1837 a, BT_REAL, dd, REQUIRED);
1839 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
1841 add_sym_2 ("rename", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1842 gfc_check_rename, NULL, gfc_resolve_rename,
1843 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1845 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
1847 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
1848 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1849 stg, BT_CHARACTER, dc, REQUIRED, n, BT_INTEGER, di, REQUIRED);
1851 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
1853 add_sym_4 ("reshape", 0, 1, BT_REAL, dr, GFC_STD_F95,
1854 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1855 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
1856 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
1858 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
1860 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1861 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1862 x, BT_REAL, dr, REQUIRED);
1864 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
1866 add_sym_2 ("scale", 1, 1, BT_REAL, dr, GFC_STD_F95,
1867 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1868 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1870 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
1872 add_sym_3 ("scan", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1873 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1874 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
1875 bck, BT_LOGICAL, dl, OPTIONAL);
1877 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
1879 /* Added for G77 compatibility garbage. */
1880 add_sym_0 ("second", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1883 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
1885 /* Added for G77 compatibility. */
1886 add_sym_1 ("secnds", 0, 1, BT_REAL, dr, GFC_STD_GNU,
1887 gfc_check_secnds, NULL, gfc_resolve_secnds,
1888 x, BT_REAL, dr, REQUIRED);
1890 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
1892 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1893 gfc_check_selected_int_kind, gfc_simplify_selected_int_kind, NULL,
1894 r, BT_INTEGER, di, REQUIRED);
1896 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
1898 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1899 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1901 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
1903 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
1905 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr, GFC_STD_F95,
1906 gfc_check_set_exponent, gfc_simplify_set_exponent,
1907 gfc_resolve_set_exponent,
1908 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1910 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
1912 add_sym_1 ("shape", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1913 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1914 src, BT_REAL, dr, REQUIRED);
1916 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
1918 add_sym_2 ("sign", 1, 1, BT_REAL, dr, GFC_STD_F77,
1919 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1920 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
1922 add_sym_2 ("isign", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1923 NULL, gfc_simplify_sign, gfc_resolve_sign,
1924 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1926 add_sym_2 ("dsign", 1, 1, BT_REAL, dd, GFC_STD_F77,
1927 NULL, gfc_simplify_sign, gfc_resolve_sign,
1928 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
1930 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
1932 add_sym_2 ("signal", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1933 gfc_check_signal, NULL, gfc_resolve_signal,
1934 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
1936 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
1938 add_sym_1 ("sin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1939 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
1940 x, BT_REAL, dr, REQUIRED);
1942 add_sym_1 ("dsin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1943 NULL, gfc_simplify_sin, gfc_resolve_sin,
1944 x, BT_REAL, dd, REQUIRED);
1946 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1947 NULL, gfc_simplify_sin, gfc_resolve_sin,
1948 x, BT_COMPLEX, dz, REQUIRED);
1950 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1951 NULL, gfc_simplify_sin, gfc_resolve_sin,
1952 x, BT_COMPLEX, dd, REQUIRED);
1954 make_alias ("cdsin", GFC_STD_GNU);
1956 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
1958 add_sym_1 ("sinh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1959 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
1960 x, BT_REAL, dr, REQUIRED);
1962 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1963 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1964 x, BT_REAL, dd, REQUIRED);
1966 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
1968 add_sym_2 ("size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1969 gfc_check_size, gfc_simplify_size, NULL,
1970 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1972 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
1974 add_sym_1 ("spacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1975 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
1976 x, BT_REAL, dr, REQUIRED);
1978 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
1980 add_sym_3 ("spread", 0, 1, BT_REAL, dr, GFC_STD_F95,
1981 gfc_check_spread, NULL, gfc_resolve_spread,
1982 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
1983 n, BT_INTEGER, di, REQUIRED);
1985 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
1987 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr, GFC_STD_F77,
1988 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
1989 x, BT_REAL, dr, REQUIRED);
1991 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd, GFC_STD_F77,
1992 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1993 x, BT_REAL, dd, REQUIRED);
1995 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1996 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1997 x, BT_COMPLEX, dz, REQUIRED);
1999 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2000 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2001 x, BT_COMPLEX, dd, REQUIRED);
2003 make_alias ("cdsqrt", GFC_STD_GNU);
2005 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2007 add_sym_2 ("stat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2008 gfc_check_stat, NULL, gfc_resolve_stat,
2009 a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2011 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2013 add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2014 gfc_check_product_sum, NULL, gfc_resolve_sum,
2015 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2016 msk, BT_LOGICAL, dl, OPTIONAL);
2018 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2020 add_sym_2 ("symlnk", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2021 gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2022 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
2024 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2026 add_sym_1 ("system", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
2028 c, BT_CHARACTER, dc, REQUIRED);
2030 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2032 add_sym_1 ("tan", 1, 1, BT_REAL, dr, GFC_STD_F77,
2033 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2034 x, BT_REAL, dr, REQUIRED);
2036 add_sym_1 ("dtan", 1, 1, BT_REAL, dd, GFC_STD_F77,
2037 NULL, gfc_simplify_tan, gfc_resolve_tan,
2038 x, BT_REAL, dd, REQUIRED);
2040 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2042 add_sym_1 ("tanh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2043 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2044 x, BT_REAL, dr, REQUIRED);
2046 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2047 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
2048 x, BT_REAL, dd, REQUIRED);
2050 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2052 add_sym_0 ("time", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2053 NULL, NULL, gfc_resolve_time);
2055 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2057 add_sym_0 ("time8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2058 NULL, NULL, gfc_resolve_time8);
2060 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2062 add_sym_1 ("tiny", 0, 1, BT_REAL, dr, GFC_STD_F95,
2063 gfc_check_x, gfc_simplify_tiny, NULL,
2064 x, BT_REAL, dr, REQUIRED);
2066 make_generic ("tiny", GFC_ISYM_NONE, GFC_STD_F95);
2068 add_sym_3 ("transfer", 0, 1, BT_REAL, dr, GFC_STD_F95,
2069 gfc_check_transfer, NULL, gfc_resolve_transfer,
2070 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2071 sz, BT_INTEGER, di, OPTIONAL);
2073 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2075 add_sym_1 ("transpose", 0, 1, BT_REAL, dr, GFC_STD_F95,
2076 gfc_check_transpose, NULL, gfc_resolve_transpose,
2077 m, BT_REAL, dr, REQUIRED);
2079 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2081 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
2082 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2083 stg, BT_CHARACTER, dc, REQUIRED);
2085 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2087 add_sym_1 ("ttynam", 0, 1, BT_CHARACTER, 0, GFC_STD_GNU,
2088 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2089 ut, BT_INTEGER, di, REQUIRED);
2091 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2093 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
2094 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2095 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2097 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2099 /* g77 compatibility for UMASK. */
2100 add_sym_1 ("umask", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2101 gfc_check_umask, NULL, gfc_resolve_umask,
2102 a, BT_INTEGER, di, REQUIRED);
2104 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2106 /* g77 compatibility for UNLINK. */
2107 add_sym_1 ("unlink", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2108 gfc_check_unlink, NULL, gfc_resolve_unlink,
2109 a, BT_CHARACTER, dc, REQUIRED);
2111 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2113 add_sym_3 ("unpack", 0, 1, BT_REAL, dr, GFC_STD_F95,
2114 gfc_check_unpack, NULL, gfc_resolve_unpack,
2115 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2116 f, BT_REAL, dr, REQUIRED);
2118 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2120 add_sym_3 ("verify", 1, 1, BT_INTEGER, di, GFC_STD_F95,
2121 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2122 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2123 bck, BT_LOGICAL, dl, OPTIONAL);
2125 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2127 add_sym_1 ("loc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU,
2128 gfc_check_loc, NULL, gfc_resolve_loc,
2129 ar, BT_UNKNOWN, 0, REQUIRED);
2131 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2136 /* Add intrinsic subroutines. */
2139 add_subroutines (void)
2141 /* Argument names as in the standard (to be used as argument keywords). */
2143 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2144 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2145 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2146 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2147 *com = "command", *length = "length", *st = "status",
2148 *val = "value", *num = "number", *name = "name",
2149 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2152 int di, dr, dc, dl, ii;
2154 di = gfc_default_integer_kind;
2155 dr = gfc_default_real_kind;
2156 dc = gfc_default_character_kind;
2157 dl = gfc_default_logical_kind;
2158 ii = gfc_index_integer_kind;
2160 add_sym_0s ("abort", 1, GFC_STD_GNU, NULL);
2164 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2165 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2166 tm, BT_REAL, dr, REQUIRED);
2168 /* More G77 compatibility garbage. */
2169 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2170 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2171 tm, BT_REAL, dr, REQUIRED);
2173 add_sym_2s ("chdir", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2174 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2175 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2177 add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2178 gfc_check_date_and_time, NULL, NULL,
2179 dt, BT_CHARACTER, dc, OPTIONAL, tm, BT_CHARACTER, dc, OPTIONAL,
2180 zn, BT_CHARACTER, dc, OPTIONAL, vl, BT_INTEGER, di, OPTIONAL);
2182 /* More G77 compatibility garbage. */
2183 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2184 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2185 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2187 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2188 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2189 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2191 add_sym_1s ("gerror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2192 gfc_check_gerror, NULL, gfc_resolve_gerror, c, BT_CHARACTER,
2195 add_sym_2s ("getcwd", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2196 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2197 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2199 add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2201 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2203 add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2204 NULL, NULL, gfc_resolve_getarg,
2205 c, BT_INTEGER, di, REQUIRED, vl, BT_CHARACTER, dc, REQUIRED);
2207 add_sym_1s ("getlog", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2208 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2211 /* F2003 commandline routines. */
2213 add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2214 NULL, NULL, gfc_resolve_get_command,
2215 com, BT_CHARACTER, dc, OPTIONAL, length, BT_INTEGER, di, OPTIONAL,
2216 st, BT_INTEGER, di, OPTIONAL);
2218 add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2219 NULL, NULL, gfc_resolve_get_command_argument,
2220 num, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2221 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL);
2223 /* F2003 subroutine to get environment variables. */
2225 add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2226 NULL, NULL, gfc_resolve_get_environment_variable,
2227 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2228 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL,
2229 trim_name, BT_LOGICAL, dl, OPTIONAL);
2231 add_sym_5s ("mvbits", 1, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2232 gfc_check_mvbits, gfc_simplify_mvbits, gfc_resolve_mvbits,
2233 f, BT_INTEGER, di, REQUIRED, fp, BT_INTEGER, di, REQUIRED,
2234 ln, BT_INTEGER, di, REQUIRED, t, BT_INTEGER, di, REQUIRED,
2235 tp, BT_INTEGER, di, REQUIRED);
2237 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2238 gfc_check_random_number, NULL, gfc_resolve_random_number,
2239 h, BT_REAL, dr, REQUIRED);
2241 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2242 gfc_check_random_seed, NULL, NULL,
2243 sz, BT_INTEGER, di, OPTIONAL, pt, BT_INTEGER, di, OPTIONAL,
2244 gt, BT_INTEGER, di, OPTIONAL);
2246 /* More G77 compatibility garbage. */
2247 add_sym_3s ("alarm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2248 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2249 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2250 st, BT_INTEGER, di, OPTIONAL);
2252 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di, GFC_STD_GNU,
2253 gfc_check_srand, NULL, gfc_resolve_srand,
2254 c, BT_INTEGER, 4, REQUIRED);
2256 add_sym_1s ("exit", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2257 gfc_check_exit, NULL, gfc_resolve_exit,
2258 c, BT_INTEGER, di, OPTIONAL);
2262 add_sym_1s ("flush", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2263 gfc_check_flush, NULL, gfc_resolve_flush,
2264 c, BT_INTEGER, di, OPTIONAL);
2266 add_sym_1s ("free", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_free,
2267 NULL, gfc_resolve_free, c, BT_INTEGER, ii, REQUIRED);
2269 add_sym_2s ("hostnm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2270 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2271 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2273 add_sym_3s ("kill", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2274 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2275 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2277 add_sym_3s ("link", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2278 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2279 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2280 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2282 add_sym_1s ("perror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2283 gfc_check_perror, NULL, gfc_resolve_perror,
2284 c, BT_CHARACTER, dc, REQUIRED);
2286 add_sym_3s ("rename", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2287 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2288 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2289 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2291 add_sym_1s ("sleep", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2292 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2293 val, BT_CHARACTER, dc, REQUIRED);
2295 add_sym_3s ("fstat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2296 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2297 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2298 st, BT_INTEGER, di, OPTIONAL);
2300 add_sym_3s ("stat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2301 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2302 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2303 st, BT_INTEGER, di, OPTIONAL);
2305 add_sym_3s ("signal", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2306 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2307 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2308 st, BT_INTEGER, di, OPTIONAL);
2310 add_sym_3s ("symlnk", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2311 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2312 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2313 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2315 add_sym_2s ("system", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2316 NULL, NULL, gfc_resolve_system_sub,
2317 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2319 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2320 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2321 c, BT_INTEGER, di, OPTIONAL, cr, BT_INTEGER, di, OPTIONAL,
2322 cm, BT_INTEGER, di, OPTIONAL);
2324 add_sym_2s ("ttynam", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2325 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2326 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
2328 add_sym_2s ("umask", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2329 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2330 val, BT_INTEGER, di, REQUIRED, num, BT_INTEGER, di, OPTIONAL);
2332 add_sym_2s ("unlink", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2333 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2334 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2339 /* Add a function to the list of conversion symbols. */
2342 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2345 gfc_typespec from, to;
2346 gfc_intrinsic_sym *sym;
2348 if (sizing == SZ_CONVS)
2354 gfc_clear_ts (&from);
2355 from.type = from_type;
2356 from.kind = from_kind;
2362 sym = conversion + nconv;
2364 sym->name = conv_name (&from, &to);
2365 sym->lib_name = sym->name;
2366 sym->simplify.cc = gfc_convert_constant;
2367 sym->standard = standard;
2370 sym->generic_id = GFC_ISYM_CONVERSION;
2376 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2377 functions by looping over the kind tables. */
2380 add_conversions (void)
2384 /* Integer-Integer conversions. */
2385 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2386 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2391 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2392 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2395 /* Integer-Real/Complex conversions. */
2396 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2397 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2399 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2400 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2402 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2403 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2405 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2406 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2408 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2409 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2412 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2414 /* Hollerith-Integer conversions. */
2415 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2416 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2417 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2418 /* Hollerith-Real conversions. */
2419 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2420 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2421 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2422 /* Hollerith-Complex conversions. */
2423 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2424 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2425 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2427 /* Hollerith-Character conversions. */
2428 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2429 gfc_default_character_kind, GFC_STD_LEGACY);
2431 /* Hollerith-Logical conversions. */
2432 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2433 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2434 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2437 /* Real/Complex - Real/Complex conversions. */
2438 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2439 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2443 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2444 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2446 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2447 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2450 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2451 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2453 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2454 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2457 /* Logical/Logical kind conversion. */
2458 for (i = 0; gfc_logical_kinds[i].kind; i++)
2459 for (j = 0; gfc_logical_kinds[j].kind; j++)
2464 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2465 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
2468 /* Integer-Logical and Logical-Integer conversions. */
2469 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2470 for (i=0; gfc_integer_kinds[i].kind; i++)
2471 for (j=0; gfc_logical_kinds[j].kind; j++)
2473 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2474 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
2475 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
2476 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2481 /* Initialize the table of intrinsics. */
2483 gfc_intrinsic_init_1 (void)
2487 nargs = nfunc = nsub = nconv = 0;
2489 /* Create a namespace to hold the resolved intrinsic symbols. */
2490 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
2499 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2500 + sizeof (gfc_intrinsic_arg) * nargs);
2502 next_sym = functions;
2503 subroutines = functions + nfunc;
2505 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2507 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2509 sizing = SZ_NOTHING;
2516 /* Set the pure flag. All intrinsic functions are pure, and
2517 intrinsic subroutines are pure if they are elemental. */
2519 for (i = 0; i < nfunc; i++)
2520 functions[i].pure = 1;
2522 for (i = 0; i < nsub; i++)
2523 subroutines[i].pure = subroutines[i].elemental;
2528 gfc_intrinsic_done_1 (void)
2530 gfc_free (functions);
2531 gfc_free (conversion);
2532 gfc_free_namespace (gfc_intrinsic_namespace);
2536 /******** Subroutines to check intrinsic interfaces ***********/
2538 /* Given a formal argument list, remove any NULL arguments that may
2539 have been left behind by a sort against some formal argument list. */
2542 remove_nullargs (gfc_actual_arglist ** ap)
2544 gfc_actual_arglist *head, *tail, *next;
2548 for (head = *ap; head; head = next)
2552 if (head->expr == NULL)
2555 gfc_free_actual_arglist (head);
2574 /* Given an actual arglist and a formal arglist, sort the actual
2575 arglist so that its arguments are in a one-to-one correspondence
2576 with the format arglist. Arguments that are not present are given
2577 a blank gfc_actual_arglist structure. If something is obviously
2578 wrong (say, a missing required argument) we abort sorting and
2582 sort_actual (const char *name, gfc_actual_arglist ** ap,
2583 gfc_intrinsic_arg * formal, locus * where)
2586 gfc_actual_arglist *actual, *a;
2587 gfc_intrinsic_arg *f;
2589 remove_nullargs (ap);
2592 for (f = formal; f; f = f->next)
2598 if (f == NULL && a == NULL) /* No arguments */
2602 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2608 if (a->name != NULL)
2620 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2624 /* Associate the remaining actual arguments, all of which have
2625 to be keyword arguments. */
2626 for (; a; a = a->next)
2628 for (f = formal; f; f = f->next)
2629 if (strcmp (a->name, f->name) == 0)
2634 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2635 a->name, name, where);
2639 if (f->actual != NULL)
2641 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2642 f->name, name, where);
2650 /* At this point, all unmatched formal args must be optional. */
2651 for (f = formal; f; f = f->next)
2653 if (f->actual == NULL && f->optional == 0)
2655 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2656 f->name, name, where);
2662 /* Using the formal argument list, string the actual argument list
2663 together in a way that corresponds with the formal list. */
2666 for (f = formal; f; f = f->next)
2668 if (f->actual == NULL)
2670 a = gfc_get_actual_arglist ();
2671 a->missing_arg_type = f->ts.type;
2683 actual->next = NULL; /* End the sorted argument list. */
2689 /* Compare an actual argument list with an intrinsic's formal argument
2690 list. The lists are checked for agreement of type. We don't check
2691 for arrayness here. */
2694 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2697 gfc_actual_arglist *actual;
2698 gfc_intrinsic_arg *formal;
2701 formal = sym->formal;
2705 for (; formal; formal = formal->next, actual = actual->next, i++)
2707 if (actual->expr == NULL)
2710 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2714 ("Type of argument '%s' in call to '%s' at %L should be "
2715 "%s, not %s", gfc_current_intrinsic_arg[i],
2716 gfc_current_intrinsic, &actual->expr->where,
2717 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2726 /* Given a pointer to an intrinsic symbol and an expression node that
2727 represent the function call to that subroutine, figure out the type
2728 of the result. This may involve calling a resolution subroutine. */
2731 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2733 gfc_expr *a1, *a2, *a3, *a4, *a5;
2734 gfc_actual_arglist *arg;
2736 if (specific->resolve.f1 == NULL)
2738 if (e->value.function.name == NULL)
2739 e->value.function.name = specific->lib_name;
2741 if (e->ts.type == BT_UNKNOWN)
2742 e->ts = specific->ts;
2746 arg = e->value.function.actual;
2748 /* Special case hacks for MIN and MAX. */
2749 if (specific->resolve.f1m == gfc_resolve_max
2750 || specific->resolve.f1m == gfc_resolve_min)
2752 (*specific->resolve.f1m) (e, arg);
2758 (*specific->resolve.f0) (e);
2767 (*specific->resolve.f1) (e, a1);
2776 (*specific->resolve.f2) (e, a1, a2);
2785 (*specific->resolve.f3) (e, a1, a2, a3);
2794 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2803 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2807 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2811 /* Given an intrinsic symbol node and an expression node, call the
2812 simplification function (if there is one), perhaps replacing the
2813 expression with something simpler. We return FAILURE on an error
2814 of the simplification, SUCCESS if the simplification worked, even
2815 if nothing has changed in the expression itself. */
2818 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2820 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2821 gfc_actual_arglist *arg;
2823 /* Check the arguments if there are Hollerith constants. We deal with
2824 them at run-time. */
2825 for (arg = e->value.function.actual; arg != NULL; arg = arg->next)
2827 if (arg->expr && arg->expr->from_H)
2833 /* Max and min require special handling due to the variable number
2835 if (specific->simplify.f1 == gfc_simplify_min)
2837 result = gfc_simplify_min (e);
2841 if (specific->simplify.f1 == gfc_simplify_max)
2843 result = gfc_simplify_max (e);
2847 if (specific->simplify.f1 == NULL)
2853 arg = e->value.function.actual;
2857 result = (*specific->simplify.f0) ();
2864 if (specific->simplify.cc == gfc_convert_constant)
2866 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2870 /* TODO: Warn if -pedantic and initialization expression and arg
2871 types not integer or character */
2874 result = (*specific->simplify.f1) (a1);
2881 result = (*specific->simplify.f2) (a1, a2);
2888 result = (*specific->simplify.f3) (a1, a2, a3);
2895 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2902 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
2905 ("do_simplify(): Too many args for intrinsic");
2912 if (result == &gfc_bad_expr)
2916 resolve_intrinsic (specific, e); /* Must call at run-time */
2919 result->where = e->where;
2920 gfc_replace_expr (e, result);
2927 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
2928 error messages. This subroutine returns FAILURE if a subroutine
2929 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
2930 list cannot match any intrinsic. */
2933 init_arglist (gfc_intrinsic_sym * isym)
2935 gfc_intrinsic_arg *formal;
2938 gfc_current_intrinsic = isym->name;
2941 for (formal = isym->formal; formal; formal = formal->next)
2943 if (i >= MAX_INTRINSIC_ARGS)
2944 gfc_internal_error ("init_arglist(): too many arguments");
2945 gfc_current_intrinsic_arg[i++] = formal->name;
2950 /* Given a pointer to an intrinsic symbol and an expression consisting
2951 of a function call, see if the function call is consistent with the
2952 intrinsic's formal argument list. Return SUCCESS if the expression
2953 and intrinsic match, FAILURE otherwise. */
2956 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
2958 gfc_actual_arglist *arg, **ap;
2962 ap = &expr->value.function.actual;
2964 init_arglist (specific);
2966 /* Don't attempt to sort the argument list for min or max. */
2967 if (specific->check.f1m == gfc_check_min_max
2968 || specific->check.f1m == gfc_check_min_max_integer
2969 || specific->check.f1m == gfc_check_min_max_real
2970 || specific->check.f1m == gfc_check_min_max_double)
2971 return (*specific->check.f1m) (*ap);
2973 if (sort_actual (specific->name, ap, specific->formal,
2974 &expr->where) == FAILURE)
2977 if (specific->check.f3ml == gfc_check_minloc_maxloc)
2978 /* This is special because we might have to reorder the argument
2980 t = gfc_check_minloc_maxloc (*ap);
2981 else if (specific->check.f3red == gfc_check_minval_maxval)
2982 /* This is also special because we also might have to reorder the
2984 t = gfc_check_minval_maxval (*ap);
2985 else if (specific->check.f3red == gfc_check_product_sum)
2986 /* Same here. The difference to the previous case is that we allow a
2987 general numeric type. */
2988 t = gfc_check_product_sum (*ap);
2991 if (specific->check.f1 == NULL)
2993 t = check_arglist (ap, specific, error_flag);
2995 expr->ts = specific->ts;
2998 t = do_check (specific, *ap);
3001 /* Check ranks for elemental intrinsics. */
3002 if (t == SUCCESS && specific->elemental)
3005 for (arg = expr->value.function.actual; arg; arg = arg->next)
3007 if (arg->expr == NULL || arg->expr->rank == 0)
3011 r = arg->expr->rank;
3015 if (arg->expr->rank != r)
3018 ("Ranks of arguments to elemental intrinsic '%s' differ "
3019 "at %L", specific->name, &arg->expr->where);
3026 remove_nullargs (ap);
3032 /* See if an intrinsic is one of the intrinsics we evaluate
3036 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
3038 /* FIXME: This should be moved into the intrinsic definitions. */
3039 static const char * const init_expr_extensions[] = {
3040 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
3041 "precision", "present", "radix", "range", "selected_real_kind",
3047 for (i = 0; init_expr_extensions[i]; i++)
3048 if (strcmp (init_expr_extensions[i], isym->name) == 0)
3055 /* Check whether an intrinsic belongs to whatever standard the user
3059 check_intrinsic_standard (const char *name, int standard, locus * where)
3061 if (!gfc_option.warn_nonstd_intrinsics)
3064 gfc_notify_std (standard, "Intrinsic '%s' at %L is not included "
3065 "in the selected standard", name, where);
3069 /* See if a function call corresponds to an intrinsic function call.
3072 MATCH_YES if the call corresponds to an intrinsic, simplification
3073 is done if possible.
3075 MATCH_NO if the call does not correspond to an intrinsic
3077 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3078 error during the simplification process.
3080 The error_flag parameter enables an error reporting. */
3083 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
3085 gfc_intrinsic_sym *isym, *specific;
3086 gfc_actual_arglist *actual;
3090 if (expr->value.function.isym != NULL)
3091 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3092 ? MATCH_ERROR : MATCH_YES;
3094 gfc_suppress_error = !error_flag;
3097 for (actual = expr->value.function.actual; actual; actual = actual->next)
3098 if (actual->expr != NULL)
3099 flag |= (actual->expr->ts.type != BT_INTEGER
3100 && actual->expr->ts.type != BT_CHARACTER);
3102 name = expr->symtree->n.sym->name;
3104 isym = specific = gfc_find_function (name);
3107 gfc_suppress_error = 0;
3111 gfc_current_intrinsic_where = &expr->where;
3113 /* Bypass the generic list for min and max. */
3114 if (isym->check.f1m == gfc_check_min_max)
3116 init_arglist (isym);
3118 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3121 gfc_suppress_error = 0;
3125 /* If the function is generic, check all of its specific
3126 incarnations. If the generic name is also a specific, we check
3127 that name last, so that any error message will correspond to the
3129 gfc_suppress_error = 1;
3133 for (specific = isym->specific_head; specific;
3134 specific = specific->next)
3136 if (specific == isym)
3138 if (check_specific (specific, expr, 0) == SUCCESS)
3143 gfc_suppress_error = !error_flag;
3145 if (check_specific (isym, expr, error_flag) == FAILURE)
3147 gfc_suppress_error = 0;
3154 expr->value.function.isym = specific;
3155 gfc_intrinsic_symbol (expr->symtree->n.sym);
3157 gfc_suppress_error = 0;
3158 if (do_simplify (specific, expr) == FAILURE)
3161 /* TODO: We should probably only allow elemental functions here. */
3162 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
3164 if (pedantic && gfc_init_expr
3165 && flag && gfc_init_expr_extensions (specific))
3167 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
3168 "nonstandard initialization expression at %L", &expr->where)
3175 check_intrinsic_standard (name, isym->standard, &expr->where);
3181 /* See if a CALL statement corresponds to an intrinsic subroutine.
3182 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3183 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3187 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
3189 gfc_intrinsic_sym *isym;
3192 name = c->symtree->n.sym->name;
3194 isym = find_subroutine (name);
3198 gfc_suppress_error = !error_flag;
3200 init_arglist (isym);
3202 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3205 if (isym->check.f1 != NULL)
3207 if (do_check (isym, c->ext.actual) == FAILURE)
3212 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3216 /* The subroutine corresponds to an intrinsic. Allow errors to be
3217 seen at this point. */
3218 gfc_suppress_error = 0;
3220 if (isym->resolve.s1 != NULL)
3221 isym->resolve.s1 (c);
3223 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3225 if (gfc_pure (NULL) && !isym->elemental)
3227 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3232 c->resolved_sym->attr.noreturn = isym->noreturn;
3233 check_intrinsic_standard (name, isym->standard, &c->loc);
3238 gfc_suppress_error = 0;
3243 /* Call gfc_convert_type() with warning enabled. */
3246 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
3248 return gfc_convert_type_warn (expr, ts, eflag, 1);
3252 /* Try to convert an expression (in place) from one type to another.
3253 'eflag' controls the behavior on error.
3255 The possible values are:
3257 1 Generate a gfc_error()
3258 2 Generate a gfc_internal_error().
3260 'wflag' controls the warning related to conversion. */
3263 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
3266 gfc_intrinsic_sym *sym;
3267 gfc_typespec from_ts;
3273 from_ts = expr->ts; /* expr->ts gets clobbered */
3275 if (ts->type == BT_UNKNOWN)
3278 /* NULL and zero size arrays get their type here. */
3279 if (expr->expr_type == EXPR_NULL
3280 || (expr->expr_type == EXPR_ARRAY
3281 && expr->value.constructor == NULL))
3283 /* Sometimes the RHS acquire the type. */
3288 if (expr->ts.type == BT_UNKNOWN)
3291 if (expr->ts.type == BT_DERIVED
3292 && ts->type == BT_DERIVED
3293 && gfc_compare_types (&expr->ts, ts))
3296 sym = find_conv (&expr->ts, ts);
3300 /* At this point, a conversion is necessary. A warning may be needed. */
3301 if ((gfc_option.warn_std & sym->standard) != 0)
3302 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3303 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3304 else if (wflag && gfc_option.warn_conversion)
3305 gfc_warning_now ("Conversion from %s to %s at %L",
3306 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3308 /* Insert a pre-resolved function call to the right function. */
3309 old_where = expr->where;
3311 shape = expr->shape;
3313 new = gfc_get_expr ();
3316 new = gfc_build_conversion (new);
3317 new->value.function.name = sym->lib_name;
3318 new->value.function.isym = sym;
3319 new->where = old_where;
3321 new->shape = gfc_copy_shape (shape, rank);
3328 if (gfc_is_constant_expr (expr->value.function.actual->expr)
3329 && do_simplify (sym, expr) == FAILURE)
3334 return FAILURE; /* Error already generated in do_simplify() */
3342 gfc_error ("Can't convert %s to %s at %L",
3343 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3347 gfc_internal_error ("Can't convert %s to %s at %L",
3348 gfc_typename (&from_ts), gfc_typename (ts),