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 *,gfc_expr *),
438 gfc_expr *(*simplify)(gfc_expr *,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 /* Add the name of an intrinsic subroutine with three arguments to the list
483 of intrinsic names. */
485 static void add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
487 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
488 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
489 void (*resolve)(gfc_code *),
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,
510 static void add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
512 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
513 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
514 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
515 const char* a1, bt type1, int kind1, int optional1,
516 const char* a2, bt type2, int kind2, int optional2,
517 const char* a3, bt type3, int kind3, int optional3,
518 const char* a4, bt type4, int kind4, int optional4
528 add_sym (name, elemental, actual_ok, type, kind, cf, sf, rf,
529 a1, type1, kind1, optional1,
530 a2, type2, kind2, optional2,
531 a3, type3, kind3, optional3,
532 a4, type4, kind4, optional4,
537 static void add_sym_5 (const char *name, int elemental, int actual_ok, bt type,
539 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
540 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
541 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
542 const char* a1, bt type1, int kind1, int optional1,
543 const char* a2, bt type2, int kind2, int optional2,
544 const char* a3, bt type3, int kind3, int optional3,
545 const char* a4, bt type4, int kind4, int optional4,
546 const char* a5, bt type5, int kind5, int optional5
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,
560 a4, type4, kind4, optional4,
561 a5, type5, kind5, optional5,
566 /* Locate an intrinsic symbol given a base pointer, number of elements
567 in the table and a pointer to a name. Returns the NULL pointer if
568 a name is not found. */
570 static gfc_intrinsic_sym *
571 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
576 if (strcmp (name, start->name) == 0)
587 /* Given a name, find a function in the intrinsic function table.
588 Returns NULL if not found. */
591 gfc_find_function (const char *name)
594 return find_sym (functions, nfunc, name);
598 /* Given a name, find a function in the intrinsic subroutine table.
599 Returns NULL if not found. */
601 static gfc_intrinsic_sym *
602 find_subroutine (const char *name)
605 return find_sym (subroutines, nsub, name);
609 /* Given a string, figure out if it is the name of a generic intrinsic
613 gfc_generic_intrinsic (const char *name)
615 gfc_intrinsic_sym *sym;
617 sym = gfc_find_function (name);
618 return (sym == NULL) ? 0 : sym->generic;
622 /* Given a string, figure out if it is the name of a specific
623 intrinsic function or not. */
626 gfc_specific_intrinsic (const char *name)
628 gfc_intrinsic_sym *sym;
630 sym = gfc_find_function (name);
631 return (sym == NULL) ? 0 : sym->specific;
635 /* Given a string, figure out if it is the name of an intrinsic
636 subroutine or function. There are no generic intrinsic
637 subroutines, they are all specific. */
640 gfc_intrinsic_name (const char *name, int subroutine_flag)
643 return subroutine_flag ?
644 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
648 /* Collect a set of intrinsic functions into a generic collection.
649 The first argument is the name of the generic function, which is
650 also the name of a specific function. The rest of the specifics
651 currently in the table are placed into the list of specific
652 functions associated with that generic. */
655 make_generic (const char *name, gfc_generic_isym_id generic_id)
657 gfc_intrinsic_sym *g;
659 if (sizing != SZ_NOTHING)
662 g = gfc_find_function (name);
664 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
669 g->generic_id = generic_id;
670 if ((g + 1)->name[0] != '\0')
671 g->specific_head = g + 1;
674 while (g->name[0] != '\0')
678 g->generic_id = generic_id;
687 /* Create a duplicate intrinsic function entry for the current
688 function, the only difference being the alternate name. Note that
689 we use argument lists more than once, but all argument lists are
690 freed as a single block. */
693 make_alias (const char *name)
707 next_sym[0] = next_sym[-1];
708 strcpy (next_sym->name, name);
718 /* Add intrinsic functions. */
724 /* Argument names as in the standard (to be used as argument keywords). */
726 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
727 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
728 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
729 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
730 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
731 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
732 *p = "p", *ar = "array", *shp = "shape", *src = "source",
733 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
734 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
735 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
736 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
737 *z = "z", *ln = "len";
739 int di, dr, dd, dl, dc, dz, ii;
741 di = gfc_default_integer_kind ();
742 dr = gfc_default_real_kind ();
743 dd = gfc_default_double_kind ();
744 dl = gfc_default_logical_kind ();
745 dc = gfc_default_character_kind ();
746 dz = gfc_default_complex_kind ();
747 ii = gfc_index_integer_kind;
749 add_sym_1 ("abs", 1, 1, BT_REAL, dr,
750 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
753 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di,
754 NULL, gfc_simplify_abs, gfc_resolve_abs,
755 a, BT_INTEGER, di, 0);
757 add_sym_1 ("dabs", 1, 1, BT_REAL, dd,
758 NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_REAL, dd, 0);
760 add_sym_1 ("cabs", 1, 1, BT_REAL, dr,
761 NULL, gfc_simplify_abs, gfc_resolve_abs,
762 a, BT_COMPLEX, dz, 0);
764 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, NULL, gfc_simplify_abs, gfc_resolve_abs, a, BT_COMPLEX, dd, 0); /* Extension */
766 make_alias ("cdabs");
768 make_generic ("abs", GFC_ISYM_ABS);
770 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc,
771 NULL, gfc_simplify_achar, NULL, i, BT_INTEGER, di, 0);
773 make_generic ("achar", GFC_ISYM_ACHAR);
775 add_sym_1 ("acos", 1, 1, BT_REAL, dr,
776 NULL, gfc_simplify_acos, gfc_resolve_acos,
779 add_sym_1 ("dacos", 1, 1, BT_REAL, dd,
780 NULL, gfc_simplify_acos, gfc_resolve_acos,
783 make_generic ("acos", GFC_ISYM_ACOS);
785 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc,
786 NULL, gfc_simplify_adjustl, NULL, stg, BT_CHARACTER, dc, 0);
788 make_generic ("adjustl", GFC_ISYM_ADJUSTL);
790 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc,
791 NULL, gfc_simplify_adjustr, NULL, stg, BT_CHARACTER, dc, 0);
793 make_generic ("adjustr", GFC_ISYM_ADJUSTR);
795 add_sym_1 ("aimag", 1, 1, BT_REAL, dr,
796 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
797 z, BT_COMPLEX, dz, 0);
799 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, NULL, gfc_simplify_aimag, gfc_resolve_aimag, z, BT_COMPLEX, dd, 0); /* Extension */
801 make_generic ("aimag", GFC_ISYM_AIMAG);
803 add_sym_2 ("aint", 1, 1, BT_REAL, dr,
804 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
805 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
807 add_sym_1 ("dint", 1, 1, BT_REAL, dd,
808 NULL, gfc_simplify_dint, gfc_resolve_dint,
811 make_generic ("aint", GFC_ISYM_AINT);
813 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0,
814 gfc_check_all_any, NULL, gfc_resolve_all,
815 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
817 make_generic ("all", GFC_ISYM_ALL);
819 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl,
820 gfc_check_allocated, NULL, NULL, ar, BT_UNKNOWN, 0, 0);
822 make_generic ("allocated", GFC_ISYM_ALLOCATED);
824 add_sym_2 ("anint", 1, 1, BT_REAL, dr,
825 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
826 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
828 add_sym_1 ("dnint", 1, 1, BT_REAL, dd,
829 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
832 make_generic ("anint", GFC_ISYM_ANINT);
834 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0,
835 gfc_check_all_any, NULL, gfc_resolve_any,
836 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
838 make_generic ("any", GFC_ISYM_ANY);
840 add_sym_1 ("asin", 1, 1, BT_REAL, dr,
841 NULL, gfc_simplify_asin, gfc_resolve_asin,
844 add_sym_1 ("dasin", 1, 1, BT_REAL, dd,
845 NULL, gfc_simplify_asin, gfc_resolve_asin,
848 make_generic ("asin", GFC_ISYM_ASIN);
850 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl,
851 gfc_check_associated, NULL, NULL,
852 pt, BT_UNKNOWN, 0, 0, tg, BT_UNKNOWN, 0, 1);
854 make_generic ("associated", GFC_ISYM_ASSOCIATED);
856 add_sym_1 ("atan", 1, 1, BT_REAL, dr,
857 NULL, gfc_simplify_atan, gfc_resolve_atan,
860 add_sym_1 ("datan", 1, 1, BT_REAL, dd,
861 NULL, gfc_simplify_atan, gfc_resolve_atan,
864 make_generic ("atan", GFC_ISYM_ATAN);
866 add_sym_2 ("atan2", 1, 1, BT_REAL, dr,
867 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
868 y, BT_REAL, dr, 0, x, BT_REAL, dr, 0);
870 add_sym_2 ("datan2", 1, 1, BT_REAL, dd,
871 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
872 y, BT_REAL, dd, 0, x, BT_REAL, dd, 0);
874 make_generic ("atan2", GFC_ISYM_ATAN2);
876 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di,
877 gfc_check_i, gfc_simplify_bit_size, NULL,
878 i, BT_INTEGER, di, 0);
880 make_generic ("bit_size", GFC_ISYM_NONE);
882 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl,
883 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
884 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
886 make_generic ("btest", GFC_ISYM_BTEST);
888 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di,
889 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
890 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
892 make_generic ("ceiling", GFC_ISYM_CEILING);
894 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc,
895 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
896 i, BT_INTEGER, di, 0, kind, BT_INTEGER, di, 1);
898 make_generic ("char", GFC_ISYM_CHAR);
900 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz,
901 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
902 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 1,
903 kind, BT_INTEGER, di, 1);
905 make_generic ("cmplx", GFC_ISYM_CMPLX);
907 /* Making dcmplx a specific of cmplx causes cmplx to return a double
908 complex instead of the default complex. */
910 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd,
911 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
912 x, BT_REAL, dd, 0, y, BT_REAL, dd, 1); /* Extension */
914 make_generic ("dcmplx", GFC_ISYM_CMPLX);
916 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz,
917 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
918 z, BT_COMPLEX, dz, 0);
920 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_conjg, gfc_resolve_conjg, z, BT_COMPLEX, dd, 0); /* Extension */
922 make_generic ("conjg", GFC_ISYM_CONJG);
924 add_sym_1 ("cos", 1, 1, BT_REAL, dr,
925 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dr, 0);
927 add_sym_1 ("dcos", 1, 1, BT_REAL, dd,
928 NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_REAL, dd, 0);
930 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz,
931 NULL, gfc_simplify_cos, gfc_resolve_cos,
932 x, BT_COMPLEX, dz, 0);
934 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_cos, gfc_resolve_cos, x, BT_COMPLEX, dd, 0); /* Extension */
936 make_alias ("cdcos");
938 make_generic ("cos", GFC_ISYM_COS);
940 add_sym_1 ("cosh", 1, 1, BT_REAL, dr,
941 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
944 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd,
945 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
948 make_generic ("cosh", GFC_ISYM_COSH);
950 add_sym_2 ("count", 0, 1, BT_INTEGER, di,
951 gfc_check_count, NULL, gfc_resolve_count,
952 msk, BT_LOGICAL, dl, 0, dm, BT_INTEGER, ii, 1);
954 make_generic ("count", GFC_ISYM_COUNT);
956 add_sym_3 ("cshift", 0, 1, BT_REAL, dr,
957 gfc_check_cshift, NULL, gfc_resolve_cshift,
958 ar, BT_REAL, dr, 0, sh, BT_INTEGER, di, 0,
959 dm, BT_INTEGER, ii, 1);
961 make_generic ("cshift", GFC_ISYM_CSHIFT);
963 add_sym_1 ("dble", 1, 1, BT_REAL, dd,
964 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
967 make_generic ("dble", GFC_ISYM_DBLE);
969 add_sym_1 ("digits", 0, 1, BT_INTEGER, di,
970 gfc_check_digits, gfc_simplify_digits, NULL,
971 x, BT_UNKNOWN, dr, 0);
973 make_generic ("digits", GFC_ISYM_NONE);
975 add_sym_2 ("dim", 1, 1, BT_REAL, dr,
976 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
977 x, BT_UNKNOWN, dr, 0, y, BT_UNKNOWN, dr, 0);
979 add_sym_2 ("idim", 1, 1, BT_INTEGER, di,
980 NULL, gfc_simplify_dim, gfc_resolve_dim,
981 x, BT_INTEGER, di, 0, y, BT_INTEGER, di, 0);
983 add_sym_2 ("ddim", 1, 1, BT_REAL, dd,
984 NULL, gfc_simplify_dim, gfc_resolve_dim,
985 x, BT_REAL, dd, 0, y, BT_REAL, dd, 0);
987 make_generic ("dim", GFC_ISYM_DIM);
989 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0,
990 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
991 va, BT_REAL, dr, 0, vb, BT_REAL, dr, 0);
993 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT);
995 add_sym_2 ("dprod", 1, 1, BT_REAL, dd,
996 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
997 x, BT_REAL, dr, 0, y, BT_REAL, dr, 0);
999 make_generic ("dprod", GFC_ISYM_DPROD);
1001 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, NULL, NULL, NULL, a, BT_COMPLEX, dd, 0); /* Extension */
1003 make_generic ("dreal", GFC_ISYM_REAL);
1005 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr,
1006 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1007 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, 0,
1008 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, 1);
1010 make_generic ("eoshift", GFC_ISYM_EOSHIFT);
1012 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr,
1013 gfc_check_x, gfc_simplify_epsilon, NULL,
1016 make_generic ("epsilon", GFC_ISYM_NONE);
1018 /* G77 compatibility */
1019 add_sym_1 ("etime", 0, 1, BT_REAL, 4,
1020 gfc_check_etime, NULL, NULL,
1023 make_alias ("dtime");
1025 make_generic ("etime", GFC_ISYM_ETIME);
1028 add_sym_1 ("exp", 1, 1, BT_REAL, dr,
1029 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dr, 0);
1031 add_sym_1 ("dexp", 1, 1, BT_REAL, dd,
1032 NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_REAL, dd, 0);
1034 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz,
1035 NULL, gfc_simplify_exp, gfc_resolve_exp,
1036 x, BT_COMPLEX, dz, 0);
1038 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_exp, gfc_resolve_exp, x, BT_COMPLEX, dd, 0); /* Extension */
1040 make_alias ("cdexp");
1042 make_generic ("exp", GFC_ISYM_EXP);
1044 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di,
1045 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1048 make_generic ("exponent", GFC_ISYM_EXPONENT);
1050 add_sym_2 ("floor", 1, 1, BT_INTEGER, di,
1051 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1052 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1054 make_generic ("floor", GFC_ISYM_FLOOR);
1056 add_sym_1 ("fraction", 1, 1, BT_REAL, dr,
1057 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1060 make_generic ("fraction", GFC_ISYM_FRACTION);
1062 add_sym_1 ("huge", 0, 1, BT_REAL, dr,
1063 gfc_check_huge, gfc_simplify_huge, NULL,
1064 x, BT_UNKNOWN, dr, 0);
1066 make_generic ("huge", GFC_ISYM_NONE);
1068 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di,
1069 NULL, gfc_simplify_iachar, NULL, c, BT_CHARACTER, dc, 0);
1071 make_generic ("iachar", GFC_ISYM_IACHAR);
1073 add_sym_2 ("iand", 1, 1, BT_INTEGER, di,
1074 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1075 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1077 make_generic ("iand", GFC_ISYM_IAND);
1079 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, NULL, NULL, NULL); /* Extension, takes no arguments */
1081 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di,
1082 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1083 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1085 make_generic ("ibclr", GFC_ISYM_IBCLR);
1087 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di,
1088 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1089 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0,
1090 ln, BT_INTEGER, di, 0);
1092 make_generic ("ibits", GFC_ISYM_IBITS);
1094 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di,
1095 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1096 i, BT_INTEGER, di, 0, pos, BT_INTEGER, di, 0);
1098 make_generic ("ibset", GFC_ISYM_IBSET);
1100 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di,
1101 NULL, gfc_simplify_ichar, gfc_resolve_ichar,
1102 c, BT_CHARACTER, dc, 0);
1104 make_generic ("ichar", GFC_ISYM_ICHAR);
1106 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di,
1107 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1108 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1110 make_generic ("ieor", GFC_ISYM_IEOR);
1112 add_sym_3 ("index", 1, 1, BT_INTEGER, di,
1113 gfc_check_index, gfc_simplify_index, NULL,
1114 stg, BT_CHARACTER, dc, 0, ssg, BT_CHARACTER, dc, 0,
1115 bck, BT_LOGICAL, dl, 1);
1117 make_generic ("index", GFC_ISYM_INDEX);
1119 add_sym_2 ("int", 1, 1, BT_INTEGER, di,
1120 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1121 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1123 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di,
1124 NULL, gfc_simplify_ifix, NULL, a, BT_REAL, dr, 0);
1126 add_sym_1 ("idint", 1, 0, BT_INTEGER, di,
1127 NULL, gfc_simplify_idint, NULL, a, BT_REAL, dd, 0);
1129 make_generic ("int", GFC_ISYM_INT);
1131 add_sym_2 ("ior", 1, 1, BT_INTEGER, di,
1132 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1133 i, BT_INTEGER, di, 0, j, BT_INTEGER, di, 0);
1135 make_generic ("ior", GFC_ISYM_IOR);
1137 /* The following function is for G77 compatibility. */
1138 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4,
1139 gfc_check_irand, NULL, NULL,
1140 i, BT_INTEGER, 4, 0);
1142 make_generic ("irand", GFC_ISYM_IRAND);
1144 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di,
1145 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1146 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0);
1148 make_generic ("ishft", GFC_ISYM_ISHFT);
1150 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di,
1151 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1152 i, BT_INTEGER, di, 0, sh, BT_INTEGER, di, 0,
1153 sz, BT_INTEGER, di, 1);
1155 make_generic ("ishftc", GFC_ISYM_ISHFTC);
1157 add_sym_1 ("kind", 0, 1, BT_INTEGER, di,
1158 gfc_check_kind, gfc_simplify_kind, NULL, x, BT_REAL, dr, 0);
1160 make_generic ("kind", GFC_ISYM_NONE);
1162 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di,
1163 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1164 ar, BT_REAL, dr, 0, dm, BT_INTEGER, di, 1);
1166 make_generic ("lbound", GFC_ISYM_LBOUND);
1168 add_sym_1 ("len", 0, 1, BT_INTEGER, di,
1169 NULL, gfc_simplify_len, gfc_resolve_len,
1170 stg, BT_CHARACTER, dc, 0);
1172 make_generic ("len", GFC_ISYM_LEN);
1174 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di,
1175 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1176 stg, BT_CHARACTER, dc, 0);
1178 make_generic ("len_trim", GFC_ISYM_LEN_TRIM);
1180 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl,
1181 NULL, gfc_simplify_lge, NULL,
1182 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1184 make_generic ("lge", GFC_ISYM_LGE);
1186 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl,
1187 NULL, gfc_simplify_lgt, NULL,
1188 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1190 make_generic ("lgt", GFC_ISYM_LGT);
1192 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl,
1193 NULL, gfc_simplify_lle, NULL,
1194 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1196 make_generic ("lle", GFC_ISYM_LLE);
1198 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl,
1199 NULL, gfc_simplify_llt, NULL,
1200 sta, BT_CHARACTER, dc, 0, stb, BT_CHARACTER, dc, 0);
1202 make_generic ("llt", GFC_ISYM_LLT);
1204 add_sym_1 ("log", 1, 1, BT_REAL, dr,
1205 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1207 add_sym_1 ("alog", 1, 1, BT_REAL, dr,
1208 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dr, 0);
1210 add_sym_1 ("dlog", 1, 1, BT_REAL, dd,
1211 NULL, gfc_simplify_log, gfc_resolve_log, x, BT_REAL, dd, 0);
1213 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz,
1214 NULL, gfc_simplify_log, gfc_resolve_log,
1215 x, BT_COMPLEX, dz, 0);
1217 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_log, gfc_resolve_log, x, BT_COMPLEX, dd, 0); /* Extension */
1219 make_alias ("cdlog");
1221 make_generic ("log", GFC_ISYM_LOG);
1223 add_sym_1 ("log10", 1, 1, BT_REAL, dr,
1224 NULL, gfc_simplify_log10, gfc_resolve_log10,
1227 add_sym_1 ("alog10", 1, 1, BT_REAL, dr,
1228 NULL, gfc_simplify_log10, gfc_resolve_log10,
1231 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd,
1232 NULL, gfc_simplify_log10, gfc_resolve_log10,
1235 make_generic ("log10", GFC_ISYM_LOG10);
1237 add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl,
1238 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1239 l, BT_LOGICAL, dl, 0, kind, BT_INTEGER, di, 1);
1241 make_generic ("logical", GFC_ISYM_LOGICAL);
1243 add_sym_2 ("matmul", 0, 1, BT_REAL, dr,
1244 gfc_check_matmul, NULL, gfc_resolve_matmul,
1245 ma, BT_REAL, dr, 0, mb, BT_REAL, dr, 0);
1247 make_generic ("matmul", GFC_ISYM_MATMUL);
1249 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1250 int(max). The max function must take at least two arguments. */
1252 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0,
1253 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1254 a1, BT_UNKNOWN, dr, 0, a2, BT_UNKNOWN, dr, 0);
1256 add_sym_1m ("max0", 1, 0, BT_INTEGER, di,
1257 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1258 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1260 add_sym_1m ("amax0", 1, 0, BT_REAL, dr,
1261 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1262 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1264 add_sym_1m ("amax1", 1, 0, BT_REAL, dr,
1265 gfc_check_min_max_real, gfc_simplify_max, NULL,
1266 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1268 add_sym_1m ("max1", 1, 0, BT_INTEGER, di,
1269 gfc_check_min_max_real, gfc_simplify_max, NULL,
1270 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1272 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd,
1273 gfc_check_min_max_double, gfc_simplify_max, NULL,
1274 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1276 make_generic ("max", GFC_ISYM_MAX);
1278 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di,
1279 gfc_check_x, gfc_simplify_maxexponent, NULL,
1280 x, BT_UNKNOWN, dr, 0);
1282 make_generic ("maxexponent", GFC_ISYM_NONE);
1284 add_sym_3 ("maxloc", 0, 1, BT_INTEGER, di,
1285 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1286 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1287 msk, BT_LOGICAL, dl, 1);
1289 make_generic ("maxloc", GFC_ISYM_MAXLOC);
1291 add_sym_3 ("maxval", 0, 1, BT_REAL, dr,
1292 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1293 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1294 msk, BT_LOGICAL, dl, 1);
1296 make_generic ("maxval", GFC_ISYM_MAXVAL);
1298 add_sym_3 ("merge", 1, 1, BT_REAL, dr,
1299 gfc_check_merge, NULL, gfc_resolve_merge,
1300 ts, BT_REAL, dr, 0, fs, BT_REAL, dr, 0,
1301 msk, BT_LOGICAL, dl, 0);
1303 make_generic ("merge", GFC_ISYM_MERGE);
1305 /* Note: amin0 is equivalent to real(min), min1 is equivalent to int(min). */
1307 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0,
1308 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1309 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1311 add_sym_1m ("min0", 1, 0, BT_INTEGER, di,
1312 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1313 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1315 add_sym_1m ("amin0", 1, 0, BT_REAL, dr,
1316 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1317 a1, BT_INTEGER, di, 0, a2, BT_INTEGER, di, 0);
1319 add_sym_1m ("amin1", 1, 0, BT_REAL, dr,
1320 gfc_check_min_max_real, gfc_simplify_min, NULL,
1321 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1323 add_sym_1m ("min1", 1, 0, BT_INTEGER, di,
1324 gfc_check_min_max_real, gfc_simplify_min, NULL,
1325 a1, BT_REAL, dr, 0, a2, BT_REAL, dr, 0);
1327 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd,
1328 gfc_check_min_max_double, gfc_simplify_min, NULL,
1329 a1, BT_REAL, dd, 0, a2, BT_REAL, dd, 0);
1331 make_generic ("min", GFC_ISYM_MIN);
1333 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di,
1334 gfc_check_x, gfc_simplify_minexponent, NULL,
1335 x, BT_UNKNOWN, dr, 0);
1337 make_generic ("minexponent", GFC_ISYM_NONE);
1339 add_sym_3 ("minloc", 0, 1, BT_INTEGER, di,
1340 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1341 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1342 msk, BT_LOGICAL, dl, 1);
1344 make_generic ("minloc", GFC_ISYM_MINLOC);
1346 add_sym_3 ("minval", 0, 1, BT_REAL, dr,
1347 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1348 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1349 msk, BT_LOGICAL, dl, 1);
1351 make_generic ("minval", GFC_ISYM_MINVAL);
1353 add_sym_2 ("mod", 1, 1, BT_INTEGER, di,
1354 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1355 a, BT_INTEGER, di, 0, p, BT_INTEGER, di, 0);
1357 add_sym_2 ("amod", 1, 1, BT_REAL, dr,
1358 NULL, gfc_simplify_mod, gfc_resolve_mod,
1359 a, BT_REAL, dr, 0, p, BT_REAL, dr, 0);
1361 add_sym_2 ("dmod", 1, 1, BT_REAL, dd,
1362 NULL, gfc_simplify_mod, gfc_resolve_mod,
1363 a, BT_REAL, dd, 0, p, BT_REAL, dd, 0);
1365 make_generic ("mod", GFC_ISYM_MOD);
1367 add_sym_2 ("modulo", 1, 1, BT_REAL, di,
1368 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1369 a, BT_REAL, di, 0, p, BT_REAL, di, 0);
1371 make_generic ("modulo", GFC_ISYM_MODULO);
1373 add_sym_2 ("nearest", 1, 1, BT_REAL, dr,
1374 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1375 x, BT_REAL, dr, 0, s, BT_REAL, dr, 0);
1377 make_generic ("nearest", GFC_ISYM_NEAREST);
1379 add_sym_2 ("nint", 1, 1, BT_INTEGER, di,
1380 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1381 a, BT_REAL, dr, 0, kind, BT_INTEGER, di, 1);
1383 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di,
1384 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1387 make_generic ("nint", GFC_ISYM_NINT);
1389 add_sym_1 ("not", 1, 1, BT_INTEGER, di,
1390 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1391 i, BT_INTEGER, di, 0);
1393 make_generic ("not", GFC_ISYM_NOT);
1395 add_sym_1 ("null", 0, 1, BT_INTEGER, di,
1396 gfc_check_null, gfc_simplify_null, NULL,
1397 mo, BT_INTEGER, di, 1);
1399 make_generic ("null", GFC_ISYM_NONE);
1401 add_sym_3 ("pack", 0, 1, BT_REAL, dr,
1402 gfc_check_pack, NULL, gfc_resolve_pack,
1403 ar, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1406 make_generic ("pack", GFC_ISYM_PACK);
1408 add_sym_1 ("precision", 0, 1, BT_INTEGER, di,
1409 gfc_check_precision, gfc_simplify_precision, NULL,
1410 x, BT_UNKNOWN, 0, 0);
1412 make_generic ("precision", GFC_ISYM_NONE);
1414 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl,
1415 gfc_check_present, NULL, NULL, a, BT_REAL, dr, 0);
1417 make_generic ("present", GFC_ISYM_PRESENT);
1419 add_sym_3 ("product", 0, 1, BT_REAL, dr,
1420 gfc_check_product, NULL, gfc_resolve_product,
1421 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1422 msk, BT_LOGICAL, dl, 1);
1424 make_generic ("product", GFC_ISYM_PRODUCT);
1426 add_sym_1 ("radix", 0, 1, BT_INTEGER, di,
1427 gfc_check_radix, gfc_simplify_radix, NULL,
1428 x, BT_UNKNOWN, 0, 0);
1430 make_generic ("radix", GFC_ISYM_NONE);
1432 /* The following function is for G77 compatibility. */
1433 add_sym_1 ("rand", 0, 1, BT_REAL, 4,
1434 gfc_check_rand, NULL, NULL,
1435 i, BT_INTEGER, 4, 0);
1437 make_generic ("rand", GFC_ISYM_RAND);
1439 add_sym_1 ("range", 0, 1, BT_INTEGER, di,
1440 gfc_check_range, gfc_simplify_range, NULL,
1443 make_generic ("range", GFC_ISYM_NONE);
1445 add_sym_2 ("real", 1, 0, BT_REAL, dr,
1446 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1447 a, BT_UNKNOWN, dr, 0, kind, BT_INTEGER, di, 1);
1449 add_sym_1 ("float", 1, 0, BT_REAL, dr,
1450 NULL, gfc_simplify_float, NULL, a, BT_INTEGER, di, 0);
1452 add_sym_1 ("sngl", 1, 0, BT_REAL, dr,
1453 NULL, gfc_simplify_sngl, NULL, a, BT_REAL, dd, 0);
1455 make_generic ("real", GFC_ISYM_REAL);
1457 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc,
1458 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1459 stg, BT_CHARACTER, dc, 0, n, BT_INTEGER, di, 0);
1461 make_generic ("repeat", GFC_ISYM_REPEAT);
1463 add_sym_4 ("reshape", 0, 1, BT_REAL, dr,
1464 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1465 src, BT_REAL, dr, 0, shp, BT_INTEGER, ii, 0,
1466 pad, BT_REAL, dr, 1, ord, BT_INTEGER, ii, 1);
1468 make_generic ("reshape", GFC_ISYM_RESHAPE);
1470 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr,
1471 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1474 make_generic ("rrspacing", GFC_ISYM_RRSPACING);
1476 add_sym_2 ("scale", 1, 1, BT_REAL, dr,
1477 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1478 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1480 make_generic ("scale", GFC_ISYM_SCALE);
1482 add_sym_3 ("scan", 1, 1, BT_INTEGER, di,
1483 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1484 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1485 bck, BT_LOGICAL, dl, 1);
1487 make_generic ("scan", GFC_ISYM_SCAN);
1489 /* Added for G77 compatibility garbage. */
1490 add_sym_0 ("second", 0, 1, BT_REAL, 4, NULL, NULL, NULL);
1492 make_generic ("second", GFC_ISYM_SECOND);
1494 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di,
1495 NULL, gfc_simplify_selected_int_kind, NULL,
1496 r, BT_INTEGER, di, 0);
1498 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND);
1500 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di,
1501 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1502 NULL, p, BT_INTEGER, di, 1, r, BT_INTEGER, di, 1);
1504 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND);
1506 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr,
1507 gfc_check_set_exponent, gfc_simplify_set_exponent,
1508 gfc_resolve_set_exponent,
1509 x, BT_REAL, dr, 0, i, BT_INTEGER, di, 0);
1511 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT);
1513 add_sym_1 ("shape", 0, 1, BT_INTEGER, di,
1514 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1515 src, BT_REAL, dr, 0);
1517 make_generic ("shape", GFC_ISYM_SHAPE);
1519 add_sym_2 ("sign", 1, 1, BT_REAL, dr,
1520 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1521 a, BT_REAL, dr, 0, b, BT_REAL, dr, 0);
1523 add_sym_2 ("isign", 1, 1, BT_INTEGER, di,
1524 NULL, gfc_simplify_sign, gfc_resolve_sign,
1525 a, BT_INTEGER, di, 0, b, BT_INTEGER, di, 0);
1527 add_sym_2 ("dsign", 1, 1, BT_REAL, dd,
1528 NULL, gfc_simplify_sign, gfc_resolve_sign,
1529 a, BT_REAL, dd, 0, b, BT_REAL, dd, 0);
1531 make_generic ("sign", GFC_ISYM_SIGN);
1533 add_sym_1 ("sin", 1, 1, BT_REAL, dr,
1534 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dr, 0);
1536 add_sym_1 ("dsin", 1, 1, BT_REAL, dd,
1537 NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_REAL, dd, 0);
1539 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz,
1540 NULL, gfc_simplify_sin, gfc_resolve_sin,
1541 x, BT_COMPLEX, dz, 0);
1543 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sin, gfc_resolve_sin, x, BT_COMPLEX, dd, 0); /* Extension */
1545 make_alias ("cdsin");
1547 make_generic ("sin", GFC_ISYM_SIN);
1549 add_sym_1 ("sinh", 1, 1, BT_REAL, dr,
1550 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1553 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd,
1554 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1557 make_generic ("sinh", GFC_ISYM_SINH);
1559 add_sym_2 ("size", 0, 1, BT_INTEGER, di,
1560 gfc_check_size, gfc_simplify_size, NULL,
1561 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1563 make_generic ("size", GFC_ISYM_SIZE);
1565 add_sym_1 ("spacing", 1, 1, BT_REAL, dr,
1566 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
1569 make_generic ("spacing", GFC_ISYM_SPACING);
1571 add_sym_3 ("spread", 0, 1, BT_REAL, dr,
1572 gfc_check_spread, NULL, gfc_resolve_spread,
1573 src, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 0,
1574 n, BT_INTEGER, di, 0);
1576 make_generic ("spread", GFC_ISYM_SPREAD);
1578 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr,
1579 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1582 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd,
1583 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1586 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz,
1587 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1588 x, BT_COMPLEX, dz, 0);
1590 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, NULL, gfc_simplify_sqrt, gfc_resolve_sqrt, x, BT_COMPLEX, dd, 0); /* Extension */
1592 make_alias ("cdsqrt");
1594 make_generic ("sqrt", GFC_ISYM_SQRT);
1596 add_sym_3 ("sum", 0, 1, BT_UNKNOWN, 0,
1597 gfc_check_sum, NULL, gfc_resolve_sum,
1598 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1,
1599 msk, BT_LOGICAL, dl, 1);
1601 make_generic ("sum", GFC_ISYM_SUM);
1603 add_sym_1 ("tan", 1, 1, BT_REAL, dr,
1604 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dr, 0);
1606 add_sym_1 ("dtan", 1, 1, BT_REAL, dd,
1607 NULL, gfc_simplify_tan, gfc_resolve_tan, x, BT_REAL, dd, 0);
1609 make_generic ("tan", GFC_ISYM_TAN);
1611 add_sym_1 ("tanh", 1, 1, BT_REAL, dr,
1612 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1615 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd,
1616 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1619 make_generic ("tanh", GFC_ISYM_TANH);
1621 add_sym_1 ("tiny", 0, 1, BT_REAL, dr,
1622 gfc_check_x, gfc_simplify_tiny, NULL, x, BT_REAL, dr, 0);
1624 make_generic ("tiny", GFC_ISYM_NONE);
1626 add_sym_3 ("transfer", 0, 1, BT_REAL, dr,
1627 gfc_check_transfer, NULL, gfc_resolve_transfer,
1628 src, BT_REAL, dr, 0, mo, BT_REAL, dr, 0,
1629 sz, BT_INTEGER, di, 1);
1631 make_generic ("transfer", GFC_ISYM_TRANSFER);
1633 add_sym_1 ("transpose", 0, 1, BT_REAL, dr,
1634 gfc_check_transpose, NULL, gfc_resolve_transpose,
1637 make_generic ("transpose", GFC_ISYM_TRANSPOSE);
1639 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc,
1640 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
1641 stg, BT_CHARACTER, dc, 0);
1643 make_generic ("trim", GFC_ISYM_TRIM);
1645 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di,
1646 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
1647 ar, BT_REAL, dr, 0, dm, BT_INTEGER, ii, 1);
1649 make_generic ("ubound", GFC_ISYM_UBOUND);
1651 add_sym_3 ("unpack", 0, 1, BT_REAL, dr,
1652 gfc_check_unpack, NULL, gfc_resolve_unpack,
1653 v, BT_REAL, dr, 0, msk, BT_LOGICAL, dl, 0,
1656 make_generic ("unpack", GFC_ISYM_UNPACK);
1658 add_sym_3 ("verify", 1, 1, BT_INTEGER, di,
1659 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
1660 stg, BT_CHARACTER, dc, 0, set, BT_CHARACTER, dc, 0,
1661 bck, BT_LOGICAL, dl, 1);
1663 make_generic ("verify", GFC_ISYM_VERIFY);
1670 /* Add intrinsic subroutines. */
1673 add_subroutines (void)
1675 /* Argument names as in the standard (to be used as argument keywords). */
1677 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
1678 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
1679 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
1680 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate";
1684 di = gfc_default_integer_kind ();
1685 dr = gfc_default_real_kind ();
1686 dc = gfc_default_character_kind ();
1688 add_sym_0s ("abort", 1, NULL);
1690 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0,
1691 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
1692 tm, BT_REAL, dr, 0);
1694 /* More G77 compatibility garbage. */
1695 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0,
1696 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
1697 tm, BT_REAL, dr, 0);
1699 add_sym_4 ("date_and_time", 0, 1, BT_UNKNOWN, 0,
1700 gfc_check_date_and_time, NULL, NULL,
1701 dt, BT_CHARACTER, dc, 1, tm, BT_CHARACTER, dc, 1,
1702 zn, BT_CHARACTER, dc, 1, vl, BT_INTEGER, di, 1);
1704 /* More G77 compatibility garbage. */
1705 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0,
1706 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1707 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1709 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0,
1710 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
1711 vl, BT_REAL, 4, 0, tm, BT_REAL, 4, 0);
1713 add_sym_2 ("getarg", 0, 1, BT_UNKNOWN, 0,
1715 c, BT_INTEGER, di, 0, vl, BT_CHARACTER, dc, 0);
1718 add_sym_5 ("mvbits", 1, 1, BT_UNKNOWN, 0,
1719 gfc_check_mvbits, gfc_simplify_mvbits, NULL,
1720 f, BT_INTEGER, di, 0, fp, BT_INTEGER, di, 0,
1721 ln, BT_INTEGER, di, 0, t, BT_INTEGER, di, 0,
1722 tp, BT_INTEGER, di, 0);
1724 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0,
1725 gfc_check_random_number, NULL, gfc_resolve_random_number,
1728 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0,
1729 gfc_check_random_seed, NULL, NULL,
1730 sz, BT_INTEGER, di, 1, pt, BT_INTEGER, di, 1,
1731 gt, BT_INTEGER, di, 1);
1733 /* More G77 compatibility garbage. */
1734 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di,
1735 gfc_check_srand, NULL, gfc_resolve_srand,
1736 c, BT_INTEGER, 4, 0);
1738 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0,
1739 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
1740 c, BT_INTEGER, di, 1, cr, BT_INTEGER, di, 1,
1741 cm, BT_INTEGER, di, 1);
1745 /* Add a function to the list of conversion symbols. */
1748 add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
1749 gfc_expr * (*simplify) (gfc_expr *, bt, int))
1752 gfc_typespec from, to;
1753 gfc_intrinsic_sym *sym;
1755 if (sizing == SZ_CONVS)
1761 gfc_clear_ts (&from);
1762 from.type = from_type;
1763 from.kind = from_kind;
1769 sym = conversion + nconv;
1771 strcpy (sym->name, conv_name (&from, &to));
1772 strcpy (sym->lib_name, sym->name);
1773 sym->simplify.cc = simplify;
1776 sym->generic_id = GFC_ISYM_CONVERSION;
1782 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
1783 functions by looping over the kind tables. */
1786 add_conversions (void)
1790 /* Integer-Integer conversions. */
1791 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
1792 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
1797 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1798 BT_INTEGER, gfc_integer_kinds[j].kind, gfc_convert_constant);
1801 /* Integer-Real/Complex conversions. */
1802 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
1803 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
1805 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1806 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1808 add_conv (BT_REAL, gfc_real_kinds[j].kind,
1809 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
1811 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
1812 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1814 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
1815 BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
1818 /* Real/Complex - Real/Complex conversions. */
1819 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
1820 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
1824 add_conv (BT_REAL, gfc_real_kinds[i].kind,
1825 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1827 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
1828 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1831 add_conv (BT_REAL, gfc_real_kinds[i].kind,
1832 BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
1834 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
1835 BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
1838 /* Logical/Logical kind conversion. */
1839 for (i = 0; gfc_logical_kinds[i].kind; i++)
1840 for (j = 0; gfc_logical_kinds[j].kind; j++)
1845 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
1846 BT_LOGICAL, gfc_logical_kinds[j].kind, gfc_convert_constant);
1851 /* Initialize the table of intrinsics. */
1853 gfc_intrinsic_init_1 (void)
1857 nargs = nfunc = nsub = nconv = 0;
1859 /* Create a namespace to hold the resolved intrinsic symbols. */
1860 gfc_intrinsic_namespace = gfc_get_namespace (NULL);
1869 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
1870 + sizeof (gfc_intrinsic_arg) * nargs);
1872 next_sym = functions;
1873 subroutines = functions + nfunc;
1875 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
1877 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
1879 sizing = SZ_NOTHING;
1886 /* Set the pure flag. All intrinsic functions are pure, and
1887 intrinsic subroutines are pure if they are elemental. */
1889 for (i = 0; i < nfunc; i++)
1890 functions[i].pure = 1;
1892 for (i = 0; i < nsub; i++)
1893 subroutines[i].pure = subroutines[i].elemental;
1898 gfc_intrinsic_done_1 (void)
1900 gfc_free (functions);
1901 gfc_free (conversion);
1902 gfc_free_namespace (gfc_intrinsic_namespace);
1906 /******** Subroutines to check intrinsic interfaces ***********/
1908 /* Given a formal argument list, remove any NULL arguments that may
1909 have been left behind by a sort against some formal argument list. */
1912 remove_nullargs (gfc_actual_arglist ** ap)
1914 gfc_actual_arglist *head, *tail, *next;
1918 for (head = *ap; head; head = next)
1922 if (head->expr == NULL)
1925 gfc_free_actual_arglist (head);
1944 /* Given an actual arglist and a formal arglist, sort the actual
1945 arglist so that its arguments are in a one-to-one correspondence
1946 with the format arglist. Arguments that are not present are given
1947 a blank gfc_actual_arglist structure. If something is obviously
1948 wrong (say, a missing required argument) we abort sorting and
1952 sort_actual (const char *name, gfc_actual_arglist ** ap,
1953 gfc_intrinsic_arg * formal, locus * where)
1956 gfc_actual_arglist *actual, *a;
1957 gfc_intrinsic_arg *f;
1959 remove_nullargs (ap);
1962 for (f = formal; f; f = f->next)
1968 if (f == NULL && a == NULL) /* No arguments */
1972 { /* Put the nonkeyword arguments in a 1:1 correspondence */
1978 if (a->name[0] != '\0')
1990 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
1994 /* Associate the remaining actual arguments, all of which have
1995 to be keyword arguments. */
1996 for (; a; a = a->next)
1998 for (f = formal; f; f = f->next)
1999 if (strcmp (a->name, f->name) == 0)
2004 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2005 a->name, name, where);
2009 if (f->actual != NULL)
2011 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2012 f->name, name, where);
2020 /* At this point, all unmatched formal args must be optional. */
2021 for (f = formal; f; f = f->next)
2023 if (f->actual == NULL && f->optional == 0)
2025 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2026 f->name, name, where);
2032 /* Using the formal argument list, string the actual argument list
2033 together in a way that corresponds with the formal list. */
2036 for (f = formal; f; f = f->next)
2038 if (f->actual == NULL)
2040 a = gfc_get_actual_arglist ();
2041 a->missing_arg_type = f->ts.type;
2053 actual->next = NULL; /* End the sorted argument list. */
2059 /* Compare an actual argument list with an intrinsic's formal argument
2060 list. The lists are checked for agreement of type. We don't check
2061 for arrayness here. */
2064 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2067 gfc_actual_arglist *actual;
2068 gfc_intrinsic_arg *formal;
2071 formal = sym->formal;
2075 for (; formal; formal = formal->next, actual = actual->next, i++)
2077 if (actual->expr == NULL)
2080 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2084 ("Type of argument '%s' in call to '%s' at %L should be "
2085 "%s, not %s", gfc_current_intrinsic_arg[i],
2086 gfc_current_intrinsic, &actual->expr->where,
2087 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2096 /* Given a pointer to an intrinsic symbol and an expression node that
2097 represent the function call to that subroutine, figure out the type
2098 of the result. This may involve calling a resolution subroutine. */
2101 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2103 gfc_expr *a1, *a2, *a3, *a4, *a5;
2104 gfc_actual_arglist *arg;
2106 if (specific->resolve.f1 == NULL)
2108 if (e->value.function.name == NULL)
2109 e->value.function.name = specific->lib_name;
2111 if (e->ts.type == BT_UNKNOWN)
2112 e->ts = specific->ts;
2116 arg = e->value.function.actual;
2118 /* At present only the iargc extension intrinsic takes no arguments,
2119 and it doesn't need a resolution function, but this is here for
2123 (*specific->resolve.f0) (e);
2127 /* Special case hacks for MIN and MAX. */
2128 if (specific->resolve.f1m == gfc_resolve_max
2129 || specific->resolve.f1m == gfc_resolve_min)
2131 (*specific->resolve.f1m) (e, arg);
2140 (*specific->resolve.f1) (e, a1);
2149 (*specific->resolve.f2) (e, a1, a2);
2158 (*specific->resolve.f3) (e, a1, a2, a3);
2167 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2176 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2180 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2184 /* Given an intrinsic symbol node and an expression node, call the
2185 simplification function (if there is one), perhaps replacing the
2186 expression with something simpler. We return FAILURE on an error
2187 of the simplification, SUCCESS if the simplification worked, even
2188 if nothing has changed in the expression itself. */
2191 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2193 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2194 gfc_actual_arglist *arg;
2196 /* Max and min require special handling due to the variable number
2198 if (specific->simplify.f1 == gfc_simplify_min)
2200 result = gfc_simplify_min (e);
2204 if (specific->simplify.f1 == gfc_simplify_max)
2206 result = gfc_simplify_max (e);
2210 if (specific->simplify.f1 == NULL)
2216 arg = e->value.function.actual;
2221 if (specific->simplify.cc == gfc_convert_constant)
2223 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2227 /* TODO: Warn if -pedantic and initialization expression and arg
2228 types not integer or character */
2231 result = (*specific->simplify.f1) (a1);
2238 result = (*specific->simplify.f2) (a1, a2);
2245 result = (*specific->simplify.f3) (a1, a2, a3);
2252 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2259 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
2262 ("do_simplify(): Too many args for intrinsic");
2269 if (result == &gfc_bad_expr)
2273 resolve_intrinsic (specific, e); /* Must call at run-time */
2276 result->where = e->where;
2277 gfc_replace_expr (e, result);
2284 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
2285 error messages. This subroutine returns FAILURE if a subroutine
2286 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
2287 list cannot match any intrinsic. */
2290 init_arglist (gfc_intrinsic_sym * isym)
2292 gfc_intrinsic_arg *formal;
2295 gfc_current_intrinsic = isym->name;
2298 for (formal = isym->formal; formal; formal = formal->next)
2300 if (i >= MAX_INTRINSIC_ARGS)
2301 gfc_internal_error ("init_arglist(): too many arguments");
2302 gfc_current_intrinsic_arg[i++] = formal->name;
2307 /* Given a pointer to an intrinsic symbol and an expression consisting
2308 of a function call, see if the function call is consistent with the
2309 intrinsic's formal argument list. Return SUCCESS if the expression
2310 and intrinsic match, FAILURE otherwise. */
2313 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
2315 gfc_actual_arglist *arg, **ap;
2319 ap = &expr->value.function.actual;
2321 init_arglist (specific);
2323 /* Don't attempt to sort the argument list for min or max. */
2324 if (specific->check.f1m == gfc_check_min_max
2325 || specific->check.f1m == gfc_check_min_max_integer
2326 || specific->check.f1m == gfc_check_min_max_real
2327 || specific->check.f1m == gfc_check_min_max_double)
2328 return (*specific->check.f1m) (*ap);
2330 if (sort_actual (specific->name, ap, specific->formal,
2331 &expr->where) == FAILURE)
2334 if (specific->check.f1 == NULL)
2336 t = check_arglist (ap, specific, error_flag);
2338 expr->ts = specific->ts;
2341 t = do_check (specific, *ap);
2343 /* Check ranks for elemental intrinsics. */
2344 if (t == SUCCESS && specific->elemental)
2347 for (arg = expr->value.function.actual; arg; arg = arg->next)
2349 if (arg->expr == NULL || arg->expr->rank == 0)
2353 r = arg->expr->rank;
2357 if (arg->expr->rank != r)
2360 ("Ranks of arguments to elemental intrinsic '%s' differ "
2361 "at %L", specific->name, &arg->expr->where);
2368 remove_nullargs (ap);
2374 /* See if an intrinsic is one of the intrinsics we evaluate
2378 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
2380 /* FIXME: This should be moved into the intrinsic definitions. */
2381 static const char * const init_expr_extensions[] = {
2382 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
2383 "precision", "present", "radix", "range", "selected_real_kind",
2389 for (i = 0; init_expr_extensions[i]; i++)
2390 if (strcmp (init_expr_extensions[i], isym->name) == 0)
2397 /* See if a function call corresponds to an intrinsic function call.
2400 MATCH_YES if the call corresponds to an intrinsic, simplification
2401 is done if possible.
2403 MATCH_NO if the call does not correspond to an intrinsic
2405 MATCH_ERROR if the call corresponds to an intrinsic but there was an
2406 error during the simplification process.
2408 The error_flag parameter enables an error reporting. */
2411 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
2413 gfc_intrinsic_sym *isym, *specific;
2414 gfc_actual_arglist *actual;
2418 if (expr->value.function.isym != NULL)
2419 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
2420 ? MATCH_ERROR : MATCH_YES;
2422 gfc_suppress_error = !error_flag;
2425 for (actual = expr->value.function.actual; actual; actual = actual->next)
2426 if (actual->expr != NULL)
2427 flag |= (actual->expr->ts.type != BT_INTEGER
2428 && actual->expr->ts.type != BT_CHARACTER);
2430 name = expr->symtree->n.sym->name;
2432 isym = specific = gfc_find_function (name);
2435 gfc_suppress_error = 0;
2439 gfc_current_intrinsic_where = &expr->where;
2441 /* Bypass the generic list for min and max. */
2442 if (isym->check.f1m == gfc_check_min_max)
2444 init_arglist (isym);
2446 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
2449 gfc_suppress_error = 0;
2453 /* If the function is generic, check all of its specific
2454 incarnations. If the generic name is also a specific, we check
2455 that name last, so that any error message will correspond to the
2457 gfc_suppress_error = 1;
2461 for (specific = isym->specific_head; specific;
2462 specific = specific->next)
2464 if (specific == isym)
2466 if (check_specific (specific, expr, 0) == SUCCESS)
2471 gfc_suppress_error = !error_flag;
2473 if (check_specific (isym, expr, error_flag) == FAILURE)
2475 gfc_suppress_error = 0;
2482 expr->value.function.isym = specific;
2483 gfc_intrinsic_symbol (expr->symtree->n.sym);
2485 if (do_simplify (specific, expr) == FAILURE)
2487 gfc_suppress_error = 0;
2491 /* TODO: We should probably only allow elemental functions here. */
2492 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
2494 gfc_suppress_error = 0;
2495 if (pedantic && gfc_init_expr
2496 && flag && gfc_init_expr_extensions (specific))
2498 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
2499 "nonstandard initialization expression at %L", &expr->where)
2510 /* See if a CALL statement corresponds to an intrinsic subroutine.
2511 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
2512 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
2516 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
2518 gfc_intrinsic_sym *isym;
2521 name = c->symtree->n.sym->name;
2523 isym = find_subroutine (name);
2527 gfc_suppress_error = !error_flag;
2529 init_arglist (isym);
2531 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
2534 if (isym->check.f1 != NULL)
2536 if (do_check (isym, c->ext.actual) == FAILURE)
2541 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
2545 /* The subroutine corresponds to an intrinsic. Allow errors to be
2546 seen at this point. */
2547 gfc_suppress_error = 0;
2549 if (isym->resolve.s1 != NULL)
2550 isym->resolve.s1 (c);
2552 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
2554 if (gfc_pure (NULL) && !isym->elemental)
2556 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
2564 gfc_suppress_error = 0;
2569 /* Call gfc_convert_type() with warning enabled. */
2572 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
2574 return gfc_convert_type_warn (expr, ts, eflag, 1);
2578 /* Try to convert an expression (in place) from one type to another.
2579 'eflag' controls the behavior on error.
2581 The possible values are:
2583 1 Generate a gfc_error()
2584 2 Generate a gfc_internal_error().
2586 'wflag' controls the warning related to conversion. */
2589 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
2592 gfc_intrinsic_sym *sym;
2593 gfc_typespec from_ts;
2598 from_ts = expr->ts; /* expr->ts gets clobbered */
2600 if (ts->type == BT_UNKNOWN)
2603 /* NULL and zero size arrays get their type here. */
2604 if (expr->expr_type == EXPR_NULL
2605 || (expr->expr_type == EXPR_ARRAY
2606 && expr->value.constructor == NULL))
2608 /* Sometimes the RHS acquire the type. */
2613 if (expr->ts.type == BT_UNKNOWN)
2616 if (expr->ts.type == BT_DERIVED
2617 && ts->type == BT_DERIVED
2618 && gfc_compare_types (&expr->ts, ts))
2621 sym = find_conv (&expr->ts, ts);
2625 /* At this point, a conversion is necessary. A warning may be needed. */
2626 if (wflag && gfc_option.warn_conversion)
2627 gfc_warning_now ("Conversion from %s to %s at %L",
2628 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2630 /* Insert a pre-resolved function call to the right function. */
2631 old_where = expr->where;
2633 new = gfc_get_expr ();
2636 new = gfc_build_conversion (new);
2637 new->value.function.name = sym->lib_name;
2638 new->value.function.isym = sym;
2639 new->where = old_where;
2647 if (gfc_is_constant_expr (expr->value.function.actual->expr)
2648 && do_simplify (sym, expr) == FAILURE)
2653 return FAILURE; /* Error already generated in do_simplify() */
2661 gfc_error ("Can't convert %s to %s at %L",
2662 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
2666 gfc_internal_error ("Can't convert %s to %s at %L",
2667 gfc_typename (&from_ts), gfc_typename (ts),