1 /* Build up a list of intrinsic subroutines and functions for the
3 Copyright (C) 2000, 2001, 2002, 2003, 2004 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, 59 Temple Place - Suite 330, Boston, MA
35 #include "intrinsic.h"
38 /* Nanespace to hold the resolved symbols for intrinsic subroutines. */
39 static gfc_namespace *gfc_intrinsic_namespace;
41 int gfc_init_expr = 0;
43 /* Pointers to a intrinsic function and its argument names being
46 char *gfc_current_intrinsic, *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
47 locus *gfc_current_intrinsic_where;
49 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
50 static gfc_intrinsic_arg *next_arg;
52 static int nfunc, nsub, nargs, nconv;
55 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
59 /* Return a letter based on the passed type. Used to construct the
60 name of a type-dependent subroutine. */
63 gfc_type_letter (bt type)
94 /* Get a symbol for a resolved name. */
97 gfc_get_intrinsic_sub_symbol (const char * name)
101 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
102 sym->attr.always_explicit = 1;
103 sym->attr.subroutine = 1;
104 sym->attr.flavor = FL_PROCEDURE;
105 sym->attr.proc = PROC_INTRINSIC;
111 /* Return a pointer to the name of a conversion function given two
115 conv_name (gfc_typespec * from, gfc_typespec * to)
117 static char name[30];
119 sprintf (name, "__convert_%c%d_%c%d", gfc_type_letter (from->type),
120 from->kind, gfc_type_letter (to->type), to->kind);
126 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
127 corresponds to the conversion. Returns NULL if the conversion
130 static gfc_intrinsic_sym *
131 find_conv (gfc_typespec * from, gfc_typespec * to)
133 gfc_intrinsic_sym *sym;
137 target = conv_name (from, to);
140 for (i = 0; i < nconv; i++, sym++)
141 if (strcmp (target, sym->name) == 0)
148 /* Interface to the check functions. We break apart an argument list
149 and call the proper check function rather than forcing each
150 function to manipulate the argument list. */
153 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
155 gfc_expr *a1, *a2, *a3, *a4, *a5;
162 t = (*specific->check.f1) (a1);
169 t = (*specific->check.f2) (a1, a2);
176 t = (*specific->check.f3) (a1, a2, a3);
183 t = (*specific->check.f4) (a1, a2, a3, a4);
190 t = (*specific->check.f5) (a1, a2, a3, a4, a5);
193 gfc_internal_error ("do_check(): too many args");
204 /*********** Subroutines to build the intrinsic list ****************/
206 /* Add a single intrinsic symbol to the current list.
209 char * name of function
210 int whether function is elemental
211 int If the function can be used as an actual argument
212 bt return type of function
213 int kind of return type of function
214 check pointer to check function
215 simplify pointer to simplification function
216 resolve pointer to resolution function
218 Optional arguments come in multiples of four:
219 char * name of argument
222 int arg optional flag (1=optional, 0=required)
224 The sequence is terminated by a NULL name.
226 TODO: Are checks on actual_ok implemented elsewhere, or is that just
230 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
231 bt type, int kind, gfc_check_f check, gfc_simplify_f simplify,
232 gfc_resolve_f resolve, ...)
235 int optional, first_flag;
249 strcpy (next_sym->name, name);
251 strcpy (next_sym->lib_name, "_gfortran_");
252 strcat (next_sym->lib_name, name);
254 next_sym->elemental = elemental;
255 next_sym->ts.type = type;
256 next_sym->ts.kind = kind;
257 next_sym->simplify = simplify;
258 next_sym->check = check;
259 next_sym->resolve = resolve;
260 next_sym->specific = 0;
261 next_sym->generic = 0;
265 gfc_internal_error ("add_sym(): Bad sizing mode");
268 va_start (argp, resolve);
274 name = va_arg (argp, char *);
278 type = (bt) va_arg (argp, int);
279 kind = va_arg (argp, int);
280 optional = va_arg (argp, int);
282 if (sizing != SZ_NOTHING)
289 next_sym->formal = next_arg;
291 (next_arg - 1)->next = next_arg;
295 strcpy (next_arg->name, name);
296 next_arg->ts.type = type;
297 next_arg->ts.kind = kind;
298 next_arg->optional = optional;
308 static void add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
310 try (*check)(gfc_expr *),
311 gfc_expr *(*simplify)(gfc_expr *),
312 void (*resolve)(gfc_expr *,gfc_expr *)
322 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
327 static void add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
329 try (*check)(gfc_expr *),
330 gfc_expr *(*simplify)(gfc_expr *),
331 void (*resolve)(gfc_expr *,gfc_expr *),
332 const char* a1, bt type1, int kind1, int optional1
342 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
343 a1, type1, kind1, optional1,
349 add_sym_0s (const char * name, int actual_ok,
350 void (*resolve)(gfc_code *))
360 add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, cf, sf, rf,
365 static void add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
367 try (*check)(gfc_expr *),
368 gfc_expr *(*simplify)(gfc_expr *),
369 void (*resolve)(gfc_code *),
370 const char* a1, bt type1, int kind1, int optional1
380 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
381 a1, type1, kind1, optional1,
386 static void add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
388 try (*check)(gfc_actual_arglist *),
389 gfc_expr *(*simplify)(gfc_expr *),
390 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
391 const char* a1, bt type1, int kind1, int optional1,
392 const char* a2, bt type2, int kind2, int optional2
402 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
403 a1, type1, kind1, optional1,
404 a2, type2, kind2, optional2,
409 static void add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
411 try (*check)(gfc_expr *,gfc_expr *),
412 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
413 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
414 const char* a1, bt type1, int kind1, int optional1,
415 const char* a2, bt type2, int kind2, int optional2
425 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
426 a1, type1, kind1, optional1,
427 a2, type2, kind2, optional2,
432 /* Add the name of an intrinsic subroutine with two arguments to the list
433 of intrinsic names. */
435 static void add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
437 try (*check)(gfc_expr *,gfc_expr *),
438 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
439 void (*resolve)(gfc_code *),
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, cf, sf, rf,
452 a1, type1, kind1, optional1,
453 a2, type2, kind2, optional2,
458 static void add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
460 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
461 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
462 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
463 const char* a1, bt type1, int kind1, int optional1,
464 const char* a2, bt type2, int kind2, int optional2,
465 const char* a3, bt type3, int kind3, int optional3
475 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
476 a1, type1, kind1, optional1,
477 a2, type2, kind2, optional2,
478 a3, type3, kind3, optional3,
482 /* MINLOC and MAXLOC get special treatment because their argument
483 might have to be reordered. */
485 static void add_sym_3ml (const char *name, int elemental,
486 int actual_ok, bt type, int kind,
487 try (*check)(gfc_actual_arglist *),
488 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
489 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
490 const char* a1, bt type1, int kind1, int optional1,
491 const char* a2, bt type2, int kind2, int optional2,
492 const char* a3, bt type3, int kind3, int optional3
502 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
503 a1, type1, kind1, optional1,
504 a2, type2, kind2, optional2,
505 a3, type3, kind3, optional3,
509 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
510 their argument also might have to be reordered. */
512 static void add_sym_3red (const char *name, int elemental,
513 int actual_ok, bt type, int kind,
514 try (*check)(gfc_actual_arglist *),
515 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
516 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
517 const char* a1, bt type1, int kind1, int optional1,
518 const char* a2, bt type2, int kind2, int optional2,
519 const char* a3, bt type3, int kind3, int optional3
529 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
530 a1, type1, kind1, optional1,
531 a2, type2, kind2, optional2,
532 a3, type3, kind3, optional3,
536 /* Add the name of an intrinsic subroutine with three arguments to the list
537 of intrinsic names. */
539 static void add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
541 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
542 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
543 void (*resolve)(gfc_code *),
544 const char* a1, bt type1, int kind1, int optional1,
545 const char* a2, bt type2, int kind2, int optional2,
546 const char* a3, bt type3, int kind3, int optional3
556 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
557 a1, type1, kind1, optional1,
558 a2, type2, kind2, optional2,
559 a3, type3, kind3, optional3,
564 static void add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
566 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
567 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
568 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
569 const char* a1, bt type1, int kind1, int optional1,
570 const char* a2, bt type2, int kind2, int optional2,
571 const char* a3, bt type3, int kind3, int optional3,
572 const char* a4, bt type4, int kind4, int optional4
582 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
583 a1, type1, kind1, optional1,
584 a2, type2, kind2, optional2,
585 a3, type3, kind3, optional3,
586 a4, type4, kind4, optional4,
591 static void add_sym_4s (const char *name, int elemental, int actual_ok,
593 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
594 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
595 void (*resolve)(gfc_code *),
596 const char* a1, bt type1, int kind1, int optional1,
597 const char* a2, bt type2, int kind2, int optional2,
598 const char* a3, bt type3, int kind3, int optional3,
599 const char* a4, bt type4, int kind4, int optional4)
609 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
610 a1, type1, kind1, optional1,
611 a2, type2, kind2, optional2,
612 a3, type3, kind3, optional3,
613 a4, type4, kind4, optional4,
618 static void add_sym_5 (const char *name, int elemental, int actual_ok, bt type,
620 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
621 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
622 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
623 const char* a1, bt type1, int kind1, int optional1,
624 const char* a2, bt type2, int kind2, int optional2,
625 const char* a3, bt type3, int kind3, int optional3,
626 const char* a4, bt type4, int kind4, int optional4,
627 const char* a5, bt type5, int kind5, int optional5
637 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
638 a1, type1, kind1, optional1,
639 a2, type2, kind2, optional2,
640 a3, type3, kind3, optional3,
641 a4, type4, kind4, optional4,
642 a5, type5, kind5, optional5,
647 static void add_sym_5s
649 const char *name, int elemental, int actual_ok, bt type, int kind,
650 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
651 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
652 void (*resolve)(gfc_code *),
653 const char* a1, bt type1, int kind1, int optional1,
654 const char* a2, bt type2, int kind2, int optional2,
655 const char* a3, bt type3, int kind3, int optional3,
656 const char* a4, bt type4, int kind4, int optional4,
657 const char* a5, bt type5, int kind5, int optional5)
667 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
668 a1, type1, kind1, optional1,
669 a2, type2, kind2, optional2,
670 a3, type3, kind3, optional3,
671 a4, type4, kind4, optional4,
672 a5, type5, kind5, optional5,
677 /* Locate an intrinsic symbol given a base pointer, number of elements
678 in the table and a pointer to a name. Returns the NULL pointer if
679 a name is not found. */
681 static gfc_intrinsic_sym *
682 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
687 if (strcmp (name, start->name) == 0)
698 /* Given a name, find a function in the intrinsic function table.
699 Returns NULL if not found. */
702 gfc_find_function (const char *name)
705 return find_sym (functions, nfunc, name);
709 /* Given a name, find a function in the intrinsic subroutine table.
710 Returns NULL if not found. */
712 static gfc_intrinsic_sym *
713 find_subroutine (const char *name)
716 return find_sym (subroutines, nsub, name);
720 /* Given a string, figure out if it is the name of a generic intrinsic
724 gfc_generic_intrinsic (const char *name)
726 gfc_intrinsic_sym *sym;
728 sym = gfc_find_function (name);
729 return (sym == NULL) ? 0 : sym->generic;
733 /* Given a string, figure out if it is the name of a specific
734 intrinsic function or not. */
737 gfc_specific_intrinsic (const char *name)
739 gfc_intrinsic_sym *sym;
741 sym = gfc_find_function (name);
742 return (sym == NULL) ? 0 : sym->specific;
746 /* Given a string, figure out if it is the name of an intrinsic
747 subroutine or function. There are no generic intrinsic
748 subroutines, they are all specific. */
751 gfc_intrinsic_name (const char *name, int subroutine_flag)
754 return subroutine_flag ?
755 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
759 /* Collect a set of intrinsic functions into a generic collection.
760 The first argument is the name of the generic function, which is
761 also the name of a specific function. The rest of the specifics
762 currently in the table are placed into the list of specific
763 functions associated with that generic. */
766 make_generic (const char *name, gfc_generic_isym_id generic_id)
768 gfc_intrinsic_sym *g;
770 if (sizing != SZ_NOTHING)
773 g = gfc_find_function (name);
775 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
780 g->generic_id = generic_id;
781 if ((g + 1)->name[0] != '\0')
782 g->specific_head = g + 1;
785 while (g->name[0] != '\0')
789 g->generic_id = generic_id;
798 /* Create a duplicate intrinsic function entry for the current
799 function, the only difference being the alternate name. Note that
800 we use argument lists more than once, but all argument lists are
801 freed as a single block. */
804 make_alias (const char *name)
818 next_sym[0] = next_sym[-1];
819 strcpy (next_sym->name, name);
829 /* Add intrinsic functions. */
835 /* Argument names as in the standard (to be used as argument keywords). */
837 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
838 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
839 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
840 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
841 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
842 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
843 *p = "p", *ar = "array", *shp = "shape", *src = "source",
844 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
845 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
846 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
847 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
848 *z = "z", *ln = "len";
850 int di, dr, dd, dl, dc, dz, ii;
852 di = gfc_default_integer_kind;
853 dr = gfc_default_real_kind;
854 dd = gfc_default_double_kind;
855 dl = gfc_default_logical_kind;
856 dc = gfc_default_character_kind;
857 dz = gfc_default_complex_kind;
858 ii = gfc_index_integer_kind;
860 add_sym_1 ("abs", 1, 1, BT_REAL, dr,
861 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
864 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di,
865 NULL, gfc_simplify_abs, gfc_resolve_abs,
866 a, BT_INTEGER, di, 0);
868 add_sym_1 ("dabs", 1, 1, BT_REAL, dd,
869 NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_REAL, dd, 0);
871 add_sym_1 ("cabs", 1, 1, BT_REAL, dr,
872 NULL, gfc_simplify_abs, gfc_resolve_abs,
873 a, BT_COMPLEX, dz, 0);
875 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_COMPLEX, dd, 0); /* Extension */
877 make_alias ("cdabs");
879 make_generic ("abs", GFC_ISYM_ABS);
881 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc,
882 NULL, gfc_simplify_achar, NULL, i, BT_INTEGER, di, 0);
884 make_generic ("achar", GFC_ISYM_ACHAR);
886 add_sym_1 ("acos", 1, 1, BT_REAL, dr,
887 NULL, gfc_simplify_acos, gfc_resolve_acos,
890 add_sym_1 ("dacos", 1, 1, BT_REAL, dd,
891 NULL, gfc_simplify_acos, gfc_resolve_acos,
894 make_generic ("acos", GFC_ISYM_ACOS);
896 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc,
897 NULL, gfc_simplify_adjustl, NULL, stg, BT_CHARACTER, dc, 0);
899 make_generic ("adjustl", GFC_ISYM_ADJUSTL);
901 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc,
902 NULL, gfc_simplify_adjustr, NULL, stg, BT_CHARACTER, dc, 0);
904 make_generic ("adjustr", GFC_ISYM_ADJUSTR);
906 add_sym_1 ("aimag", 1, 1, BT_REAL, dr,
907 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
908 z, BT_COMPLEX, dz, 0);
910 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, NULL, gfc_simplify_aimag, gfc_resolve_aimag, z, BT_COMPLEX, dd, 0); /* Extension */
912 make_generic ("aimag", GFC_ISYM_AIMAG);
914 add_sym_2 ("aint", 1, 1, BT_REAL, dr,
915 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
916 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
918 add_sym_1 ("dint", 1, 1, BT_REAL, dd,
919 NULL, gfc_simplify_dint, gfc_resolve_dint,
922 make_generic ("aint", GFC_ISYM_AINT);
924 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0,
925 gfc_check_all_any, NULL, gfc_resolve_all,
926 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
928 make_generic ("all", GFC_ISYM_ALL);
930 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl,
931 gfc_check_allocated, NULL, NULL, ar, BT_UNKNOWN, 0, 0);
933 make_generic ("allocated", GFC_ISYM_ALLOCATED);
935 add_sym_2 ("anint", 1, 1, BT_REAL, dr,
936 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
937 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
939 add_sym_1 ("dnint", 1, 1, BT_REAL, dd,
940 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
943 make_generic ("anint", GFC_ISYM_ANINT);
945 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0,
946 gfc_check_all_any, NULL, gfc_resolve_any,
947 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
949 make_generic ("any", GFC_ISYM_ANY);
951 add_sym_1 ("asin", 1, 1, BT_REAL, dr,
952 NULL, gfc_simplify_asin, gfc_resolve_asin,
955 add_sym_1 ("dasin", 1, 1, BT_REAL, dd,
956 NULL, gfc_simplify_asin, gfc_resolve_asin,
959 make_generic ("asin", GFC_ISYM_ASIN);
961 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl,
962 gfc_check_associated, NULL, NULL,
963 pt, BT_UNKNOWN, 0, 0, tg, BT_UNKNOWN, 0, 1);
965 make_generic ("associated", GFC_ISYM_ASSOCIATED);
967 add_sym_1 ("atan", 1, 1, BT_REAL, dr,
968 NULL, gfc_simplify_atan, gfc_resolve_atan,
971 add_sym_1 ("datan", 1, 1, BT_REAL, dd,
972 NULL, gfc_simplify_atan, gfc_resolve_atan,
975 make_generic ("atan", GFC_ISYM_ATAN);
977 add_sym_2 ("atan2", 1, 1, BT_REAL, dr,
978 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
979 y, BT_REAL, dr, 0, x, BT_REAL, dr, 0);
981 add_sym_2 ("datan2", 1, 1, BT_REAL, dd,
982 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
983 y, BT_REAL, dd, 0, x, BT_REAL, dd, 0);
985 make_generic ("atan2", GFC_ISYM_ATAN2);
987 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di,
988 gfc_check_i, gfc_simplify_bit_size, NULL,
989 i, BT_INTEGER, di, 0);
991 make_generic ("bit_size", GFC_ISYM_NONE);
993 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl,
994 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
995 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
997 make_generic ("btest", GFC_ISYM_BTEST);
999 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di,
1000 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1001 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1003 make_generic ("ceiling", GFC_ISYM_CEILING);
1005 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc,
1006 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1007 i, BT_INTEGER, di, 0, kind, BT_INTEGER, di, 1);
1009 make_generic ("char", GFC_ISYM_CHAR);
1011 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz,
1012 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1013 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 1,
1014 kind, BT_INTEGER, di, 1);
1016 make_generic ("cmplx", GFC_ISYM_CMPLX);
1018 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1019 complex instead of the default complex. */
1021 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd,
1022 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1023 x, BT_REAL, dd, 0, y, BT_REAL, dd, 1); /* Extension */
1025 make_generic ("dcmplx", GFC_ISYM_CMPLX);
1027 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz,
1028 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1029 z, BT_COMPLEX, dz, 0);
1031 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_conjg, gfc_resolve_conjg, z, BT_COMPLEX, dd, 0); /* Extension */
1033 make_generic ("conjg", GFC_ISYM_CONJG);
1035 add_sym_1 ("cos", 1, 1, BT_REAL, dr,
1036 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dr, 0);
1038 add_sym_1 ("dcos", 1, 1, BT_REAL, dd,
1039 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dd, 0);
1041 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz,
1042 NULL, gfc_simplify_cos, gfc_resolve_cos,
1043 x, BT_COMPLEX, dz, 0);
1045 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_COMPLEX, dd, 0); /* Extension */
1047 make_alias ("cdcos");
1049 make_generic ("cos", GFC_ISYM_COS);
1051 add_sym_1 ("cosh", 1, 1, BT_REAL, dr,
1052 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1055 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd,
1056 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1059 make_generic ("cosh", GFC_ISYM_COSH);
1061 add_sym_2 ("count", 0, 1, BT_INTEGER, di,
1062 gfc_check_count, NULL, gfc_resolve_count,
1063 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
1065 make_generic ("count", GFC_ISYM_COUNT);
1067 add_sym_3 ("cshift", 0, 1, BT_REAL, dr,
1068 gfc_check_cshift, NULL, gfc_resolve_cshift,
1069 ar, BT_REAL, dr, 0, sh, BT_INTEGER, di, 0,
1070 dm, BT_INTEGER, ii, 1);
1072 make_generic ("cshift", GFC_ISYM_CSHIFT);
1074 add_sym_1 ("dble", 1, 1, BT_REAL, dd,
1075 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1078 make_alias ("dfloat");
1080 make_generic ("dble", GFC_ISYM_DBLE);
1082 add_sym_1 ("digits", 0, 1, BT_INTEGER, di,
1083 gfc_check_digits, gfc_simplify_digits, NULL,
1084 x, BT_UNKNOWN, dr, 0);
1086 make_generic ("digits", GFC_ISYM_NONE);
1088 add_sym_2 ("dim", 1, 1, BT_REAL, dr,
1089 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1090 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 0);
1092 add_sym_2 ("idim", 1, 1, BT_INTEGER, di,
1093 NULL, gfc_simplify_dim, gfc_resolve_dim,
1094 x, BT_INTEGER, di, 0, y, BT_INTEGER, di, 0);
1096 add_sym_2 ("ddim", 1, 1, BT_REAL, dd,
1097 NULL, gfc_simplify_dim, gfc_resolve_dim,
1098 x, BT_REAL, dd, 0, y, BT_REAL, dd, 0);
1100 make_generic ("dim", GFC_ISYM_DIM);
1102 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0,
1103 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1104 va, BT_REAL, dr, 0, vb, BT_REAL, dr, 0);
1106 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT);
1108 add_sym_2 ("dprod", 1, 1, BT_REAL, dd,
1109 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1110 x, BT_REAL, dr, 0, y, BT_REAL, dr, 0);
1112 make_generic ("dprod", GFC_ISYM_DPROD);
1114 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, NULL, NULL, NULL, a, BT_COMPLEX, dd, 0); /* Extension */
1116 make_generic ("dreal", GFC_ISYM_REAL);
1118 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr,
1119 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1120 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, 0,
1121 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, 1);
1123 make_generic ("eoshift", GFC_ISYM_EOSHIFT);
1125 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr,
1126 gfc_check_x, gfc_simplify_epsilon, NULL,
1129 make_generic ("epsilon", GFC_ISYM_NONE);
1131 /* G77 compatibility */
1132 add_sym_1 ("etime", 0, 1, BT_REAL, 4,
1133 gfc_check_etime, NULL, NULL,
1136 make_alias ("dtime");
1138 make_generic ("etime", GFC_ISYM_ETIME);
1141 add_sym_1 ("exp", 1, 1, BT_REAL, dr,
1142 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dr, 0);
1144 add_sym_1 ("dexp", 1, 1, BT_REAL, dd,
1145 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dd, 0);
1147 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz,
1148 NULL, gfc_simplify_exp, gfc_resolve_exp,
1149 x, BT_COMPLEX, dz, 0);
1151 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_COMPLEX, dd, 0); /* Extension */
1153 make_alias ("cdexp");
1155 make_generic ("exp", GFC_ISYM_EXP);
1157 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di,
1158 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1161 make_generic ("exponent", GFC_ISYM_EXPONENT);
1163 add_sym_2 ("floor", 1, 1, BT_INTEGER, di,
1164 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1165 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1167 make_generic ("floor", GFC_ISYM_FLOOR);
1169 add_sym_1 ("fraction", 1, 1, BT_REAL, dr,
1170 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1173 make_generic ("fraction", GFC_ISYM_FRACTION);
1175 add_sym_1 ("huge", 0, 1, BT_REAL, dr,
1176 gfc_check_huge, gfc_simplify_huge, NULL,
1177 x, BT_UNKNOWN, dr, 0);
1179 make_generic ("huge", GFC_ISYM_NONE);
1181 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di,
1182 NULL, gfc_simplify_iachar, NULL, c, BT_CHARACTER, dc, 0);
1184 make_generic ("iachar", GFC_ISYM_IACHAR);
1186 add_sym_2 ("iand", 1, 1, BT_INTEGER, di,
1187 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1188 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1190 make_generic ("iand", GFC_ISYM_IAND);
1192 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, NULL, NULL, NULL); /* Extension, takes no arguments */
1193 make_generic ("iargc", GFC_ISYM_IARGC);
1195 add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, NULL, NULL, NULL);
1196 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT);
1198 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di,
1199 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1200 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1202 make_generic ("ibclr", GFC_ISYM_IBCLR);
1204 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di,
1205 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1206 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0,
1207 ln, BT_INTEGER, di, 0);
1209 make_generic ("ibits", GFC_ISYM_IBITS);
1211 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di,
1212 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1213 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1215 make_generic ("ibset", GFC_ISYM_IBSET);
1217 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di,
1218 NULL, gfc_simplify_ichar, gfc_resolve_ichar,
1219 c, BT_CHARACTER, dc, 0);
1221 make_generic ("ichar", GFC_ISYM_ICHAR);
1223 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di,
1224 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1225 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1227 make_generic ("ieor", GFC_ISYM_IEOR);
1229 add_sym_3 ("index", 1, 1, BT_INTEGER, di,
1230 gfc_check_index, gfc_simplify_index, NULL,
1231 stg, BT_CHARACTER, dc, 0, ssg, BT_CHARACTER, dc, 0,
1232 bck, BT_LOGICAL, dl, 1);
1234 make_generic ("index", GFC_ISYM_INDEX);
1236 add_sym_2 ("int", 1, 1, BT_INTEGER, di,
1237 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1238 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1240 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di,
1241 NULL, gfc_simplify_ifix, NULL, a, BT_REAL, dr, 0);
1243 add_sym_1 ("idint", 1, 0, BT_INTEGER, di,
1244 NULL, gfc_simplify_idint, NULL, a, BT_REAL, dd, 0);
1246 make_generic ("int", GFC_ISYM_INT);
1248 add_sym_2 ("ior", 1, 1, BT_INTEGER, di,
1249 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1250 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1252 make_generic ("ior", GFC_ISYM_IOR);
1254 /* The following function is for G77 compatibility. */
1255 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4,
1256 gfc_check_irand, NULL, NULL,
1257 i, BT_INTEGER, 4, 0);
1259 make_generic ("irand", GFC_ISYM_IRAND);
1261 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di,
1262 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1263 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0);
1265 make_generic ("ishft", GFC_ISYM_ISHFT);
1267 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di,
1268 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1269 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0,
1270 sz, BT_INTEGER, di, 1);
1272 make_generic ("ishftc", GFC_ISYM_ISHFTC);
1274 add_sym_1 ("kind", 0, 1, BT_INTEGER, di,
1275 gfc_check_kind, gfc_simplify_kind, NULL, x, BT_REAL, dr, 0);
1277 make_generic ("kind", GFC_ISYM_NONE);
1279 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di,
1280 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1281 ar, BT_REAL, dr, 0, dm, BT_INTEGER, di, 1);
1283 make_generic ("lbound", GFC_ISYM_LBOUND);
1285 add_sym_1 ("len", 0, 1, BT_INTEGER, di,
1286 NULL, gfc_simplify_len, gfc_resolve_len,
1287 stg, BT_CHARACTER, dc, 0);
1289 make_generic ("len", GFC_ISYM_LEN);
1291 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di,
1292 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1293 stg, BT_CHARACTER, dc, 0);
1295 make_generic ("len_trim", GFC_ISYM_LEN_TRIM);
1297 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl,
1298 NULL, gfc_simplify_lge, NULL,
1299 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1301 make_generic ("lge", GFC_ISYM_LGE);
1303 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl,
1304 NULL, gfc_simplify_lgt, NULL,
1305 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1307 make_generic ("lgt", GFC_ISYM_LGT);
1309 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl,
1310 NULL, gfc_simplify_lle, NULL,
1311 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1313 make_generic ("lle", GFC_ISYM_LLE);
1315 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl,
1316 NULL, gfc_simplify_llt, NULL,
1317 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1319 make_generic ("llt", GFC_ISYM_LLT);
1321 add_sym_1 ("log", 1, 1, BT_REAL, dr,
1322 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1324 add_sym_1 ("alog", 1, 1, BT_REAL, dr,
1325 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1327 add_sym_1 ("dlog", 1, 1, BT_REAL, dd,
1328 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dd, 0);
1330 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz,
1331 NULL, gfc_simplify_log, gfc_resolve_log,
1332 x, BT_COMPLEX, dz, 0);
1334 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_log, gfc_resolve_log, x, BT_COMPLEX, dd, 0); /* Extension */
1336 make_alias ("cdlog");
1338 make_generic ("log", GFC_ISYM_LOG);
1340 add_sym_1 ("log10", 1, 1, BT_REAL, dr,
1341 NULL, gfc_simplify_log10, gfc_resolve_log10,
1344 add_sym_1 ("alog10", 1, 1, BT_REAL, dr,
1345 NULL, gfc_simplify_log10, gfc_resolve_log10,
1348 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd,
1349 NULL, gfc_simplify_log10, gfc_resolve_log10,
1352 make_generic ("log10", GFC_ISYM_LOG10);
1354 add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl,
1355 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1356 l, BT_LOGICAL, dl, 0, kind, BT_INTEGER, di, 1);
1358 make_generic ("logical", GFC_ISYM_LOGICAL);
1360 add_sym_2 ("matmul", 0, 1, BT_REAL, dr,
1361 gfc_check_matmul, NULL, gfc_resolve_matmul,
1362 ma, BT_REAL, dr, 0, mb, BT_REAL, dr, 0);
1364 make_generic ("matmul", GFC_ISYM_MATMUL);
1366 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1367 int(max). The max function must take at least two arguments. */
1369 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0,
1370 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1371 a1, BT_UNKNOWN, dr, 0, a2, BT_UNKNOWN, dr, 0);
1373 add_sym_1m ("max0", 1, 0, BT_INTEGER, di,
1374 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1375 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1377 add_sym_1m ("amax0", 1, 0, BT_REAL, dr,
1378 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1379 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1381 add_sym_1m ("amax1", 1, 0, BT_REAL, dr,
1382 gfc_check_min_max_real, gfc_simplify_max, NULL,
1383 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1385 add_sym_1m ("max1", 1, 0, BT_INTEGER, di,
1386 gfc_check_min_max_real, gfc_simplify_max, NULL,
1387 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1389 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd,
1390 gfc_check_min_max_double, gfc_simplify_max, NULL,
1391 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1393 make_generic ("max", GFC_ISYM_MAX);
1395 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di,
1396 gfc_check_x, gfc_simplify_maxexponent, NULL,
1397 x, BT_UNKNOWN, dr, 0);
1399 make_generic ("maxexponent", GFC_ISYM_NONE);
1401 add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di,
1402 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1403 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1404 msk, BT_LOGICAL, dl, 1);
1406 make_generic ("maxloc", GFC_ISYM_MAXLOC);
1408 add_sym_3red ("maxval", 0, 1, BT_REAL, dr,
1409 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1410 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1411 msk, BT_LOGICAL, dl, 1);
1413 make_generic ("maxval", GFC_ISYM_MAXVAL);
1415 add_sym_3 ("merge", 1, 1, BT_REAL, dr,
1416 gfc_check_merge, NULL, gfc_resolve_merge,
1417 ts, BT_REAL, dr, 0, fs, BT_REAL, dr, 0,
1418 msk, BT_LOGICAL, dl, 0);
1420 make_generic ("merge", GFC_ISYM_MERGE);
1422 /* Note: amin0 is equivalent to real(min), min1 is equivalent to int(min). */
1424 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0,
1425 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1426 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1428 add_sym_1m ("min0", 1, 0, BT_INTEGER, di,
1429 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1430 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1432 add_sym_1m ("amin0", 1, 0, BT_REAL, dr,
1433 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1434 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1436 add_sym_1m ("amin1", 1, 0, BT_REAL, dr,
1437 gfc_check_min_max_real, gfc_simplify_min, NULL,
1438 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1440 add_sym_1m ("min1", 1, 0, BT_INTEGER, di,
1441 gfc_check_min_max_real, gfc_simplify_min, NULL,
1442 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1444 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd,
1445 gfc_check_min_max_double, gfc_simplify_min, NULL,
1446 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1448 make_generic ("min", GFC_ISYM_MIN);
1450 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di,
1451 gfc_check_x, gfc_simplify_minexponent, NULL,
1452 x, BT_UNKNOWN, dr, 0);
1454 make_generic ("minexponent", GFC_ISYM_NONE);
1456 add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di,
1457 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1458 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1459 msk, BT_LOGICAL, dl, 1);
1461 make_generic ("minloc", GFC_ISYM_MINLOC);
1463 add_sym_3red ("minval", 0, 1, BT_REAL, dr,
1464 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1465 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1466 msk, BT_LOGICAL, dl, 1);
1468 make_generic ("minval", GFC_ISYM_MINVAL);
1470 add_sym_2 ("mod", 1, 1, BT_INTEGER, di,
1471 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1472 a, BT_INTEGER, di, 0, p, BT_INTEGER, di, 0);
1474 add_sym_2 ("amod", 1, 1, BT_REAL, dr,
1475 NULL, gfc_simplify_mod, gfc_resolve_mod,
1476 a, BT_REAL, dr, 0, p, BT_REAL, dr, 0);
1478 add_sym_2 ("dmod", 1, 1, BT_REAL, dd,
1479 NULL, gfc_simplify_mod, gfc_resolve_mod,
1480 a, BT_REAL, dd, 0, p, BT_REAL, dd, 0);
1482 make_generic ("mod", GFC_ISYM_MOD);
1484 add_sym_2 ("modulo", 1, 1, BT_REAL, di,
1485 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1486 a, BT_REAL, di, 0, p, BT_REAL, di, 0);
1488 make_generic ("modulo", GFC_ISYM_MODULO);
1490 add_sym_2 ("nearest", 1, 1, BT_REAL, dr,
1491 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1492 x, BT_REAL, dr, 0, s, BT_REAL, dr, 0);
1494 make_generic ("nearest", GFC_ISYM_NEAREST);
1496 add_sym_2 ("nint", 1, 1, BT_INTEGER, di,
1497 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1498 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1500 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di,
1501 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1504 make_generic ("nint", GFC_ISYM_NINT);
1506 add_sym_1 ("not", 1, 1, BT_INTEGER, di,
1507 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1508 i, BT_INTEGER, di, 0);
1510 make_generic ("not", GFC_ISYM_NOT);
1512 add_sym_1 ("null", 0, 1, BT_INTEGER, di,
1513 gfc_check_null, gfc_simplify_null, NULL,
1514 mo, BT_INTEGER, di, 1);
1516 make_generic ("null", GFC_ISYM_NONE);
1518 add_sym_3 ("pack", 0, 1, BT_REAL, dr,
1519 gfc_check_pack, NULL, gfc_resolve_pack,
1520 ar, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1523 make_generic ("pack", GFC_ISYM_PACK);
1525 add_sym_1 ("precision", 0, 1, BT_INTEGER, di,
1526 gfc_check_precision, gfc_simplify_precision, NULL,
1527 x, BT_UNKNOWN, 0, 0);
1529 make_generic ("precision", GFC_ISYM_NONE);
1531 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl,
1532 gfc_check_present, NULL, NULL, a, BT_REAL, dr, 0);
1534 make_generic ("present", GFC_ISYM_PRESENT);
1536 add_sym_3red ("product", 0, 1, BT_REAL, dr,
1537 gfc_check_product_sum, NULL, gfc_resolve_product,
1538 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1539 msk, BT_LOGICAL, dl, 1);
1541 make_generic ("product", GFC_ISYM_PRODUCT);
1543 add_sym_1 ("radix", 0, 1, BT_INTEGER, di,
1544 gfc_check_radix, gfc_simplify_radix, NULL,
1545 x, BT_UNKNOWN, 0, 0);
1547 make_generic ("radix", GFC_ISYM_NONE);
1549 /* The following function is for G77 compatibility. */
1550 add_sym_1 ("rand", 0, 1, BT_REAL, 4,
1551 gfc_check_rand, NULL, NULL,
1552 i, BT_INTEGER, 4, 0);
1554 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and
1555 ran() use slightly different shoddy multiplicative congruential
1559 make_generic ("rand", GFC_ISYM_RAND);
1561 add_sym_1 ("range", 0, 1, BT_INTEGER, di,
1562 gfc_check_range, gfc_simplify_range, NULL,
1565 make_generic ("range", GFC_ISYM_NONE);
1567 add_sym_2 ("real", 1, 0, BT_REAL, dr,
1568 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1569 a, BT_UNKNOWN, dr, 0, kind, BT_INTEGER, di, 1);
1571 add_sym_1 ("float", 1, 0, BT_REAL, dr,
1572 NULL, gfc_simplify_float, NULL, a, BT_INTEGER, di, 0);
1574 add_sym_1 ("sngl", 1, 0, BT_REAL, dr,
1575 NULL, gfc_simplify_sngl, NULL, a, BT_REAL, dd, 0);
1577 make_generic ("real", GFC_ISYM_REAL);
1579 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc,
1580 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1581 stg, BT_CHARACTER, dc, 0, n, BT_INTEGER, di, 0);
1583 make_generic ("repeat", GFC_ISYM_REPEAT);
1585 add_sym_4 ("reshape", 0, 1, BT_REAL, dr,
1586 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1587 src, BT_REAL, dr, 0, shp, BT_INTEGER, ii, 0,
1588 pad, BT_REAL, dr, 1, ord, BT_INTEGER, ii, 1);
1590 make_generic ("reshape", GFC_ISYM_RESHAPE);
1592 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr,
1593 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1596 make_generic ("rrspacing", GFC_ISYM_RRSPACING);
1598 add_sym_2 ("scale", 1, 1, BT_REAL, dr,
1599 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1600 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1602 make_generic ("scale", GFC_ISYM_SCALE);
1604 add_sym_3 ("scan", 1, 1, BT_INTEGER, di,
1605 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1606 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1607 bck, BT_LOGICAL, dl, 1);
1609 make_generic ("scan", GFC_ISYM_SCAN);
1611 /* Added for G77 compatibility garbage. */
1612 add_sym_0 ("second", 0, 1, BT_REAL, 4, NULL, NULL, NULL);
1614 make_generic ("second", GFC_ISYM_SECOND);
1616 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di,
1617 NULL, gfc_simplify_selected_int_kind, NULL,
1618 r, BT_INTEGER, di, 0);
1620 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND);
1622 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di,
1623 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1624 NULL, p, BT_INTEGER, di, 1, r, BT_INTEGER, di, 1);
1626 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND);
1628 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr,
1629 gfc_check_set_exponent, gfc_simplify_set_exponent,
1630 gfc_resolve_set_exponent,
1631 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1633 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT);
1635 add_sym_1 ("shape", 0, 1, BT_INTEGER, di,
1636 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1637 src, BT_REAL, dr, 0);
1639 make_generic ("shape", GFC_ISYM_SHAPE);
1641 add_sym_2 ("sign", 1, 1, BT_REAL, dr,
1642 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1643 a, BT_REAL, dr, 0, b, BT_REAL, dr, 0);
1645 add_sym_2 ("isign", 1, 1, BT_INTEGER, di,
1646 NULL, gfc_simplify_sign, gfc_resolve_sign,
1647 a, BT_INTEGER, di, 0, b, BT_INTEGER, di, 0);
1649 add_sym_2 ("dsign", 1, 1, BT_REAL, dd,
1650 NULL, gfc_simplify_sign, gfc_resolve_sign,
1651 a, BT_REAL, dd, 0, b, BT_REAL, dd, 0);
1653 make_generic ("sign", GFC_ISYM_SIGN);
1655 add_sym_1 ("sin", 1, 1, BT_REAL, dr,
1656 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dr, 0);
1658 add_sym_1 ("dsin", 1, 1, BT_REAL, dd,
1659 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dd, 0);
1661 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz,
1662 NULL, gfc_simplify_sin, gfc_resolve_sin,
1663 x, BT_COMPLEX, dz, 0);
1665 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_COMPLEX, dd, 0); /* Extension */
1667 make_alias ("cdsin");
1669 make_generic ("sin", GFC_ISYM_SIN);
1671 add_sym_1 ("sinh", 1, 1, BT_REAL, dr,
1672 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1675 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd,
1676 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1679 make_generic ("sinh", GFC_ISYM_SINH);
1681 add_sym_2 ("size", 0, 1, BT_INTEGER, di,
1682 gfc_check_size, gfc_simplify_size, NULL,
1683 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1685 make_generic ("size", GFC_ISYM_SIZE);
1687 add_sym_1 ("spacing", 1, 1, BT_REAL, dr,
1688 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
1691 make_generic ("spacing", GFC_ISYM_SPACING);
1693 add_sym_3 ("spread", 0, 1, BT_REAL, dr,
1694 gfc_check_spread, NULL, gfc_resolve_spread,
1695 src, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 0,
1696 n, BT_INTEGER, di, 0);
1698 make_generic ("spread", GFC_ISYM_SPREAD);
1700 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr,
1701 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1704 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd,
1705 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1708 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz,
1709 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1710 x, BT_COMPLEX, dz, 0);
1712 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sqrt, gfc_resolve_sqrt, x, BT_COMPLEX, dd, 0); /* Extension */
1714 make_alias ("cdsqrt");
1716 make_generic ("sqrt", GFC_ISYM_SQRT);
1718 add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0,
1719 gfc_check_product_sum, NULL, gfc_resolve_sum,
1720 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1721 msk, BT_LOGICAL, dl, 1);
1723 make_generic ("sum", GFC_ISYM_SUM);
1725 add_sym_1 ("tan", 1, 1, BT_REAL, dr,
1726 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dr, 0);
1728 add_sym_1 ("dtan", 1, 1, BT_REAL, dd,
1729 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dd, 0);
1731 make_generic ("tan", GFC_ISYM_TAN);
1733 add_sym_1 ("tanh", 1, 1, BT_REAL, dr,
1734 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1737 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd,
1738 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1741 make_generic ("tanh", GFC_ISYM_TANH);
1743 add_sym_1 ("tiny", 0, 1, BT_REAL, dr,
1744 gfc_check_x, gfc_simplify_tiny, NULL, x, BT_REAL, dr, 0);
1746 make_generic ("tiny", GFC_ISYM_NONE);
1748 add_sym_3 ("transfer", 0, 1, BT_REAL, dr,
1749 gfc_check_transfer, NULL, gfc_resolve_transfer,
1750 src, BT_REAL, dr, 0, mo, BT_REAL, dr, 0,
1751 sz, BT_INTEGER, di, 1);
1753 make_generic ("transfer", GFC_ISYM_TRANSFER);
1755 add_sym_1 ("transpose", 0, 1, BT_REAL, dr,
1756 gfc_check_transpose, NULL, gfc_resolve_transpose,
1759 make_generic ("transpose", GFC_ISYM_TRANSPOSE);
1761 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc,
1762 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
1763 stg, BT_CHARACTER, dc, 0);
1765 make_generic ("trim", GFC_ISYM_TRIM);
1767 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di,
1768 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
1769 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1771 make_generic ("ubound", GFC_ISYM_UBOUND);
1773 add_sym_3 ("unpack", 0, 1, BT_REAL, dr,
1774 gfc_check_unpack, NULL, gfc_resolve_unpack,
1775 v, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1778 make_generic ("unpack", GFC_ISYM_UNPACK);
1780 add_sym_3 ("verify", 1, 1, BT_INTEGER, di,
1781 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
1782 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1783 bck, BT_LOGICAL, dl, 1);
1785 make_generic ("verify", GFC_ISYM_VERIFY);
1792 /* Add intrinsic subroutines. */
1795 add_subroutines (void)
1797 /* Argument names as in the standard (to be used as argument keywords). */
1799 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
1800 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
1801 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
1802 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
1803 *com = "command", *length = "length", *st = "status",
1804 *val = "value", *num = "number", *name = "name",
1805 *trim_name = "trim_name";
1809 di = gfc_default_integer_kind;
1810 dr = gfc_default_real_kind;
1811 dc = gfc_default_character_kind;
1812 dl = gfc_default_logical_kind;
1814 add_sym_0s ("abort", 1, NULL);
1816 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0,
1817 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
1818 tm, BT_REAL, dr, 0);
1820 /* More G77 compatibility garbage. */
1821 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0,
1822 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
1823 tm, BT_REAL, dr, 0);
1825 add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0,
1826 gfc_check_date_and_time, NULL, NULL,
1827 dt, BT_CHARACTER, dc, 1, tm, BT_CHARACTER, dc, 1,
1828 zn, BT_CHARACTER, dc, 1, vl, BT_INTEGER, di, 1);
1830 /* More G77 compatibility garbage. */
1831 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0,
1832 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1833 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1835 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0,
1836 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1837 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1839 add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0,
1841 name, BT_CHARACTER, dc, 0,
1842 val, BT_CHARACTER, dc, 0);
1844 add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0,
1845 NULL, NULL, gfc_resolve_getarg,
1846 c, BT_INTEGER, di, 0, vl, BT_CHARACTER, dc, 0);
1848 /* F2003 commandline routines. */
1850 add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0,
1851 NULL, NULL, gfc_resolve_get_command,
1852 com, BT_CHARACTER, dc, 1,
1853 length, BT_INTEGER, di, 1,
1854 st, BT_INTEGER, di, 1);
1856 add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0,
1857 NULL, NULL, gfc_resolve_get_command_argument,
1858 num, BT_INTEGER, di, 0,
1859 val, BT_CHARACTER, dc, 1,
1860 length, BT_INTEGER, di, 1,
1861 st, BT_INTEGER, di, 1);
1864 /* F2003 subroutine to get environment variables. */
1866 add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0,
1867 NULL, NULL, gfc_resolve_get_environment_variable,
1868 name, BT_CHARACTER, dc, 0,
1869 val, BT_CHARACTER, dc, 1,
1870 length, BT_INTEGER, di, 1,
1871 st, BT_INTEGER, di, 1,
1872 trim_name, BT_LOGICAL, dl, 1);
1875 /* This needs changing to add_sym_5s if it gets a resolution function. */
1876 add_sym_5 ("mvbits", 1, 1, BT_UNKNOWN, 0,
1877 gfc_check_mvbits, gfc_simplify_mvbits, NULL,
1878 f, BT_INTEGER, di, 0, fp, BT_INTEGER, di, 0,
1879 ln, BT_INTEGER, di, 0, t, BT_INTEGER, di, 0,
1880 tp, BT_INTEGER, di, 0);
1882 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0,
1883 gfc_check_random_number, NULL, gfc_resolve_random_number,
1886 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0,
1887 gfc_check_random_seed, NULL, NULL,
1888 sz, BT_INTEGER, di, 1, pt, BT_INTEGER, di, 1,
1889 gt, BT_INTEGER, di, 1);
1891 /* More G77 compatibility garbage. */
1892 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di,
1893 gfc_check_srand, NULL, gfc_resolve_srand,
1894 c, BT_INTEGER, 4, 0);
1896 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0,
1897 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
1898 c, BT_INTEGER, di, 1, cr, BT_INTEGER, di, 1,
1899 cm, BT_INTEGER, di, 1);
1903 /* Add a function to the list of conversion symbols. */
1906 add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
1907 gfc_expr * (*simplify) (gfc_expr *, bt, int))
1910 gfc_typespec from, to;
1911 gfc_intrinsic_sym *sym;
1913 if (sizing == SZ_CONVS)
1919 gfc_clear_ts (&from);
1920 from.type = from_type;
1921 from.kind = from_kind;
1927 sym = conversion + nconv;
1929 strcpy (sym->name, conv_name (&from, &to));
1930 strcpy (sym->lib_name, sym->name);
1931 sym->simplify.cc = simplify;
1934 sym->generic_id = GFC_ISYM_CONVERSION;
1940 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
1941 functions by looping over the kind tables. */
1944 add_conversions (void)
1948 /* Integer-Integer conversions. */
1949 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
1950 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
1955 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1956 BT_INTEGER, gfc_integer_kinds[j].kind, gfc_convert_constant);
1959 /* Integer-Real/Complex conversions. */
1960 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
1961 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
1963 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1964 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1966 add_conv (BT_REAL, gfc_real_kinds[j].kind,
1967 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
1969 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1970 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1972 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
1973 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
1976 /* Real/Complex - Real/Complex conversions. */
1977 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
1978 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
1982 add_conv (BT_REAL, gfc_real_kinds[i].kind,
1983 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1985 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
1986 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1989 add_conv (BT_REAL, gfc_real_kinds[i].kind,
1990 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1992 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
1993 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1996 /* Logical/Logical kind conversion. */
1997 for (i = 0; gfc_logical_kinds[i].kind; i++)
1998 for (j = 0; gfc_logical_kinds[j].kind; j++)
2003 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2004 BT_LOGICAL, gfc_logical_kinds[j].kind, gfc_convert_constant);
2009 /* Initialize the table of intrinsics. */
2011 gfc_intrinsic_init_1 (void)
2015 nargs = nfunc = nsub = nconv = 0;
2017 /* Create a namespace to hold the resolved intrinsic symbols. */
2018 gfc_intrinsic_namespace = gfc_get_namespace (NULL);
2027 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2028 + sizeof (gfc_intrinsic_arg) * nargs);
2030 next_sym = functions;
2031 subroutines = functions + nfunc;
2033 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2035 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2037 sizing = SZ_NOTHING;
2044 /* Set the pure flag. All intrinsic functions are pure, and
2045 intrinsic subroutines are pure if they are elemental. */
2047 for (i = 0; i < nfunc; i++)
2048 functions[i].pure = 1;
2050 for (i = 0; i < nsub; i++)
2051 subroutines[i].pure = subroutines[i].elemental;
2056 gfc_intrinsic_done_1 (void)
2058 gfc_free (functions);
2059 gfc_free (conversion);
2060 gfc_free_namespace (gfc_intrinsic_namespace);
2064 /******** Subroutines to check intrinsic interfaces ***********/
2066 /* Given a formal argument list, remove any NULL arguments that may
2067 have been left behind by a sort against some formal argument list. */
2070 remove_nullargs (gfc_actual_arglist ** ap)
2072 gfc_actual_arglist *head, *tail, *next;
2076 for (head = *ap; head; head = next)
2080 if (head->expr == NULL)
2083 gfc_free_actual_arglist (head);
2102 /* Given an actual arglist and a formal arglist, sort the actual
2103 arglist so that its arguments are in a one-to-one correspondence
2104 with the format arglist. Arguments that are not present are given
2105 a blank gfc_actual_arglist structure. If something is obviously
2106 wrong (say, a missing required argument) we abort sorting and
2110 sort_actual (const char *name, gfc_actual_arglist ** ap,
2111 gfc_intrinsic_arg * formal, locus * where)
2114 gfc_actual_arglist *actual, *a;
2115 gfc_intrinsic_arg *f;
2117 remove_nullargs (ap);
2120 for (f = formal; f; f = f->next)
2126 if (f == NULL && a == NULL) /* No arguments */
2130 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2136 if (a->name[0] != '\0')
2148 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2152 /* Associate the remaining actual arguments, all of which have
2153 to be keyword arguments. */
2154 for (; a; a = a->next)
2156 for (f = formal; f; f = f->next)
2157 if (strcmp (a->name, f->name) == 0)
2162 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2163 a->name, name, where);
2167 if (f->actual != NULL)
2169 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2170 f->name, name, where);
2178 /* At this point, all unmatched formal args must be optional. */
2179 for (f = formal; f; f = f->next)
2181 if (f->actual == NULL && f->optional == 0)
2183 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2184 f->name, name, where);
2190 /* Using the formal argument list, string the actual argument list
2191 together in a way that corresponds with the formal list. */
2194 for (f = formal; f; f = f->next)
2196 if (f->actual == NULL)
2198 a = gfc_get_actual_arglist ();
2199 a->missing_arg_type = f->ts.type;
2211 actual->next = NULL; /* End the sorted argument list. */
2217 /* Compare an actual argument list with an intrinsic's formal argument
2218 list. The lists are checked for agreement of type. We don't check
2219 for arrayness here. */
2222 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2225 gfc_actual_arglist *actual;
2226 gfc_intrinsic_arg *formal;
2229 formal = sym->formal;
2233 for (; formal; formal = formal->next, actual = actual->next, i++)
2235 if (actual->expr == NULL)
2238 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2242 ("Type of argument '%s' in call to '%s' at %L should be "
2243 "%s, not %s", gfc_current_intrinsic_arg[i],
2244 gfc_current_intrinsic, &actual->expr->where,
2245 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2254 /* Given a pointer to an intrinsic symbol and an expression node that
2255 represent the function call to that subroutine, figure out the type
2256 of the result. This may involve calling a resolution subroutine. */
2259 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2261 gfc_expr *a1, *a2, *a3, *a4, *a5;
2262 gfc_actual_arglist *arg;
2264 if (specific->resolve.f1 == NULL)
2266 if (e->value.function.name == NULL)
2267 e->value.function.name = specific->lib_name;
2269 if (e->ts.type == BT_UNKNOWN)
2270 e->ts = specific->ts;
2274 arg = e->value.function.actual;
2276 /* At present only the iargc extension intrinsic takes no arguments,
2277 and it doesn't need a resolution function, but this is here for
2281 (*specific->resolve.f0) (e);
2285 /* Special case hacks for MIN and MAX. */
2286 if (specific->resolve.f1m == gfc_resolve_max
2287 || specific->resolve.f1m == gfc_resolve_min)
2289 (*specific->resolve.f1m) (e, arg);
2298 (*specific->resolve.f1) (e, a1);
2307 (*specific->resolve.f2) (e, a1, a2);
2316 (*specific->resolve.f3) (e, a1, a2, a3);
2325 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2334 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2338 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2342 /* Given an intrinsic symbol node and an expression node, call the
2343 simplification function (if there is one), perhaps replacing the
2344 expression with something simpler. We return FAILURE on an error
2345 of the simplification, SUCCESS if the simplification worked, even
2346 if nothing has changed in the expression itself. */
2349 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2351 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2352 gfc_actual_arglist *arg;
2354 /* Max and min require special handling due to the variable number
2356 if (specific->simplify.f1 == gfc_simplify_min)
2358 result = gfc_simplify_min (e);
2362 if (specific->simplify.f1 == gfc_simplify_max)
2364 result = gfc_simplify_max (e);
2368 if (specific->simplify.f1 == NULL)
2374 arg = e->value.function.actual;
2379 if (specific->simplify.cc == gfc_convert_constant)
2381 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2385 /* TODO: Warn if -pedantic and initialization expression and arg
2386 types not integer or character */
2389 result = (*specific->simplify.f1) (a1);
2396 result = (*specific->simplify.f2) (a1, a2);
2403 result = (*specific->simplify.f3) (a1, a2, a3);
2410 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2417 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
2420 ("do_simplify(): Too many args for intrinsic");
2427 if (result == &gfc_bad_expr)
2431 resolve_intrinsic (specific, e); /* Must call at run-time */
2434 result->where = e->where;
2435 gfc_replace_expr (e, result);
2442 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
2443 error messages. This subroutine returns FAILURE if a subroutine
2444 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
2445 list cannot match any intrinsic. */
2448 init_arglist (gfc_intrinsic_sym * isym)
2450 gfc_intrinsic_arg *formal;
2453 gfc_current_intrinsic = isym->name;
2456 for (formal = isym->formal; formal; formal = formal->next)
2458 if (i >= MAX_INTRINSIC_ARGS)
2459 gfc_internal_error ("init_arglist(): too many arguments");
2460 gfc_current_intrinsic_arg[i++] = formal->name;
2465 /* Given a pointer to an intrinsic symbol and an expression consisting
2466 of a function call, see if the function call is consistent with the
2467 intrinsic's formal argument list. Return SUCCESS if the expression
2468 and intrinsic match, FAILURE otherwise. */
2471 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
2473 gfc_actual_arglist *arg, **ap;
2477 ap = &expr->value.function.actual;
2479 init_arglist (specific);
2481 /* Don't attempt to sort the argument list for min or max. */
2482 if (specific->check.f1m == gfc_check_min_max
2483 || specific->check.f1m == gfc_check_min_max_integer
2484 || specific->check.f1m == gfc_check_min_max_real
2485 || specific->check.f1m == gfc_check_min_max_double)
2486 return (*specific->check.f1m) (*ap);
2488 if (sort_actual (specific->name, ap, specific->formal,
2489 &expr->where) == FAILURE)
2492 if (specific->check.f3ml == gfc_check_minloc_maxloc)
2493 /* This is special because we might have to reorder the argument
2495 t = gfc_check_minloc_maxloc (*ap);
2496 else if (specific->check.f3red == gfc_check_minval_maxval)
2497 /* This is also special because we also might have to reorder the
2499 t = gfc_check_minval_maxval (*ap);
2500 else if (specific->check.f3red == gfc_check_product_sum)
2501 /* Same here. The difference to the previous case is that we allow a
2502 general numeric type. */
2503 t = gfc_check_product_sum (*ap);
2506 if (specific->check.f1 == NULL)
2508 t = check_arglist (ap, specific, error_flag);
2510 expr->ts = specific->ts;
2513 t = do_check (specific, *ap);
2516 /* Check ranks for elemental intrinsics. */
2517 if (t == SUCCESS && specific->elemental)
2520 for (arg = expr->value.function.actual; arg; arg = arg->next)
2522 if (arg->expr == NULL || arg->expr->rank == 0)
2526 r = arg->expr->rank;
2530 if (arg->expr->rank != r)
2533 ("Ranks of arguments to elemental intrinsic '%s' differ "
2534 "at %L", specific->name, &arg->expr->where);
2541 remove_nullargs (ap);
2547 /* See if an intrinsic is one of the intrinsics we evaluate
2551 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
2553 /* FIXME: This should be moved into the intrinsic definitions. */
2554 static const char * const init_expr_extensions[] = {
2555 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
2556 "precision", "present", "radix", "range", "selected_real_kind",
2562 for (i = 0; init_expr_extensions[i]; i++)
2563 if (strcmp (init_expr_extensions[i], isym->name) == 0)
2570 /* See if a function call corresponds to an intrinsic function call.
2573 MATCH_YES if the call corresponds to an intrinsic, simplification
2574 is done if possible.
2576 MATCH_NO if the call does not correspond to an intrinsic
2578 MATCH_ERROR if the call corresponds to an intrinsic but there was an
2579 error during the simplification process.
2581 The error_flag parameter enables an error reporting. */
2584 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
2586 gfc_intrinsic_sym *isym, *specific;
2587 gfc_actual_arglist *actual;
2591 if (expr->value.function.isym != NULL)
2592 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
2593 ? MATCH_ERROR : MATCH_YES;
2595 gfc_suppress_error = !error_flag;
2598 for (actual = expr->value.function.actual; actual; actual = actual->next)
2599 if (actual->expr != NULL)
2600 flag |= (actual->expr->ts.type != BT_INTEGER
2601 && actual->expr->ts.type != BT_CHARACTER);
2603 name = expr->symtree->n.sym->name;
2605 isym = specific = gfc_find_function (name);
2608 gfc_suppress_error = 0;
2612 gfc_current_intrinsic_where = &expr->where;
2614 /* Bypass the generic list for min and max. */
2615 if (isym->check.f1m == gfc_check_min_max)
2617 init_arglist (isym);
2619 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
2622 gfc_suppress_error = 0;
2626 /* If the function is generic, check all of its specific
2627 incarnations. If the generic name is also a specific, we check
2628 that name last, so that any error message will correspond to the
2630 gfc_suppress_error = 1;
2634 for (specific = isym->specific_head; specific;
2635 specific = specific->next)
2637 if (specific == isym)
2639 if (check_specific (specific, expr, 0) == SUCCESS)
2644 gfc_suppress_error = !error_flag;
2646 if (check_specific (isym, expr, error_flag) == FAILURE)
2648 gfc_suppress_error = 0;
2655 expr->value.function.isym = specific;
2656 gfc_intrinsic_symbol (expr->symtree->n.sym);
2658 if (do_simplify (specific, expr) == FAILURE)
2660 gfc_suppress_error = 0;
2664 /* TODO: We should probably only allow elemental functions here. */
2665 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
2667 gfc_suppress_error = 0;
2668 if (pedantic && gfc_init_expr
2669 && flag && gfc_init_expr_extensions (specific))
2671 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
2672 "nonstandard initialization expression at %L", &expr->where)
2683 /* See if a CALL statement corresponds to an intrinsic subroutine.
2684 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
2685 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
2689 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
2691 gfc_intrinsic_sym *isym;
2694 name = c->symtree->n.sym->name;
2696 isym = find_subroutine (name);
2700 gfc_suppress_error = !error_flag;
2702 init_arglist (isym);
2704 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
2707 if (isym->check.f1 != NULL)
2709 if (do_check (isym, c->ext.actual) == FAILURE)
2714 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
2718 /* The subroutine corresponds to an intrinsic. Allow errors to be
2719 seen at this point. */
2720 gfc_suppress_error = 0;
2722 if (isym->resolve.s1 != NULL)
2723 isym->resolve.s1 (c);
2725 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
2727 if (gfc_pure (NULL) && !isym->elemental)
2729 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
2737 gfc_suppress_error = 0;
2742 /* Call gfc_convert_type() with warning enabled. */
2745 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
2747 return gfc_convert_type_warn (expr, ts, eflag, 1);
2751 /* Try to convert an expression (in place) from one type to another.
2752 'eflag' controls the behavior on error.
2754 The possible values are:
2756 1 Generate a gfc_error()
2757 2 Generate a gfc_internal_error().
2759 'wflag' controls the warning related to conversion. */
2762 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
2765 gfc_intrinsic_sym *sym;
2766 gfc_typespec from_ts;
2771 from_ts = expr->ts; /* expr->ts gets clobbered */
2773 if (ts->type == BT_UNKNOWN)
2776 /* NULL and zero size arrays get their type here. */
2777 if (expr->expr_type == EXPR_NULL
2778 || (expr->expr_type == EXPR_ARRAY
2779 && expr->value.constructor == NULL))
2781 /* Sometimes the RHS acquire the type. */
2786 if (expr->ts.type == BT_UNKNOWN)
2789 if (expr->ts.type == BT_DERIVED
2790 && ts->type == BT_DERIVED
2791 && gfc_compare_types (&expr->ts, ts))
2794 sym = find_conv (&expr->ts, ts);
2798 /* At this point, a conversion is necessary. A warning may be needed. */
2799 if (wflag && gfc_option.warn_conversion)
2800 gfc_warning_now ("Conversion from %s to %s at %L",
2801 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2803 /* Insert a pre-resolved function call to the right function. */
2804 old_where = expr->where;
2806 new = gfc_get_expr ();
2809 new = gfc_build_conversion (new);
2810 new->value.function.name = sym->lib_name;
2811 new->value.function.isym = sym;
2812 new->where = old_where;
2820 if (gfc_is_constant_expr (expr->value.function.actual->expr)
2821 && do_simplify (sym, expr) == FAILURE)
2826 return FAILURE; /* Error already generated in do_simplify() */
2834 gfc_error ("Can't convert %s to %s at %L",
2835 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2839 gfc_internal_error ("Can't convert %s to %s at %L",
2840 gfc_typename (&from_ts), gfc_typename (ts),