1 /* Build up a list of intrinsic subroutines and functions for the
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Contributed by Andy Vaught & Katherine Holcomb
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, 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 COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
27 #include "intrinsic.h"
29 /* Namespace to hold the resolved symbols for intrinsic subroutines. */
30 static gfc_namespace *gfc_intrinsic_namespace;
32 int gfc_init_expr = 0;
34 /* Pointers to an intrinsic function and its argument names that are being
37 const char *gfc_current_intrinsic;
38 const char *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
39 locus *gfc_current_intrinsic_where;
41 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
42 static gfc_intrinsic_sym *char_conversions;
43 static gfc_intrinsic_arg *next_arg;
45 static int nfunc, nsub, nargs, nconv, ncharconv;
48 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
52 { NO_CLASS = 0, CLASS_ELEMENTAL, CLASS_INQUIRY, CLASS_TRANSFORMATIONAL };
61 /* Return a letter based on the passed type. Used to construct the
62 name of a type-dependent subroutine. */
65 gfc_type_letter (bt type)
100 /* Get a symbol for a resolved name. Note, if needed be, the elemental
101 attribute has be added afterwards. */
104 gfc_get_intrinsic_sub_symbol (const char *name)
108 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
109 sym->attr.always_explicit = 1;
110 sym->attr.subroutine = 1;
111 sym->attr.flavor = FL_PROCEDURE;
112 sym->attr.proc = PROC_INTRINSIC;
118 /* Return a pointer to the name of a conversion function given two
122 conv_name (gfc_typespec *from, gfc_typespec *to)
124 return gfc_get_string ("__convert_%c%d_%c%d",
125 gfc_type_letter (from->type), from->kind,
126 gfc_type_letter (to->type), to->kind);
130 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
131 corresponds to the conversion. Returns NULL if the conversion
134 static gfc_intrinsic_sym *
135 find_conv (gfc_typespec *from, gfc_typespec *to)
137 gfc_intrinsic_sym *sym;
141 target = conv_name (from, to);
144 for (i = 0; i < nconv; i++, sym++)
145 if (target == sym->name)
152 /* Given a pair of CHARACTER typespecs, find the gfc_intrinsic_sym node
153 that corresponds to the conversion. Returns NULL if the conversion
156 static gfc_intrinsic_sym *
157 find_char_conv (gfc_typespec *from, gfc_typespec *to)
159 gfc_intrinsic_sym *sym;
163 target = conv_name (from, to);
164 sym = char_conversions;
166 for (i = 0; i < ncharconv; i++, sym++)
167 if (target == sym->name)
174 /* Interface to the check functions. We break apart an argument list
175 and call the proper check function rather than forcing each
176 function to manipulate the argument list. */
179 do_check (gfc_intrinsic_sym *specific, gfc_actual_arglist *arg)
181 gfc_expr *a1, *a2, *a3, *a4, *a5;
184 return (*specific->check.f0) ();
189 return (*specific->check.f1) (a1);
194 return (*specific->check.f2) (a1, a2);
199 return (*specific->check.f3) (a1, a2, a3);
204 return (*specific->check.f4) (a1, a2, a3, a4);
209 return (*specific->check.f5) (a1, a2, a3, a4, a5);
211 gfc_internal_error ("do_check(): too many args");
215 /*********** Subroutines to build the intrinsic list ****************/
217 /* Add a single intrinsic symbol to the current list.
220 char * name of function
221 int whether function is elemental
222 int If the function can be used as an actual argument [1]
223 bt return type of function
224 int kind of return type of function
225 int Fortran standard version
226 check pointer to check function
227 simplify pointer to simplification function
228 resolve pointer to resolution function
230 Optional arguments come in multiples of five:
231 char * name of argument
234 int arg optional flag (1=optional, 0=required)
235 sym_intent intent of argument
237 The sequence is terminated by a NULL name.
240 [1] Whether a function can or cannot be used as an actual argument is
241 determined by its presence on the 13.6 list in Fortran 2003. The
242 following intrinsics, which are GNU extensions, are considered allowed
243 as actual arguments: ACOSH ATANH DACOSH DASINH DATANH DCONJG DIMAG
244 ZABS ZCOS ZEXP ZLOG ZSIN ZSQRT. */
247 add_sym (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type, int kind,
248 int standard, gfc_check_f check, gfc_simplify_f simplify,
249 gfc_resolve_f resolve, ...)
251 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
252 int optional, first_flag;
267 next_sym->name = gfc_get_string (name);
269 strcpy (buf, "_gfortran_");
271 next_sym->lib_name = gfc_get_string (buf);
273 next_sym->elemental = (cl == CLASS_ELEMENTAL);
274 next_sym->inquiry = (cl == CLASS_INQUIRY);
275 next_sym->transformational = (cl == CLASS_TRANSFORMATIONAL);
276 next_sym->actual_ok = actual_ok;
277 next_sym->ts.type = type;
278 next_sym->ts.kind = kind;
279 next_sym->standard = standard;
280 next_sym->simplify = simplify;
281 next_sym->check = check;
282 next_sym->resolve = resolve;
283 next_sym->specific = 0;
284 next_sym->generic = 0;
285 next_sym->conversion = 0;
290 gfc_internal_error ("add_sym(): Bad sizing mode");
293 va_start (argp, resolve);
299 name = va_arg (argp, char *);
303 type = (bt) va_arg (argp, int);
304 kind = va_arg (argp, int);
305 optional = va_arg (argp, int);
306 intent = (sym_intent) va_arg (argp, int);
308 if (sizing != SZ_NOTHING)
315 next_sym->formal = next_arg;
317 (next_arg - 1)->next = next_arg;
321 strcpy (next_arg->name, name);
322 next_arg->ts.type = type;
323 next_arg->ts.kind = kind;
324 next_arg->optional = optional;
325 next_arg->intent = intent;
335 /* Add a symbol to the function list where the function takes
339 add_sym_0 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
340 int kind, int standard,
341 gfc_try (*check) (void),
342 gfc_expr *(*simplify) (void),
343 void (*resolve) (gfc_expr *))
353 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
358 /* Add a symbol to the subroutine list where the subroutine takes
362 add_sym_0s (const char *name, gfc_isym_id id, int standard, void (*resolve) (gfc_code *))
372 add_sym (name, id, NO_CLASS, ACTUAL_NO, BT_UNKNOWN, 0, standard, cf, sf, rf,
377 /* Add a symbol to the function list where the function takes
381 add_sym_1 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
382 int kind, int standard,
383 gfc_try (*check) (gfc_expr *),
384 gfc_expr *(*simplify) (gfc_expr *),
385 void (*resolve) (gfc_expr *, gfc_expr *),
386 const char *a1, bt type1, int kind1, int optional1)
396 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
397 a1, type1, kind1, optional1, INTENT_IN,
402 /* Add a symbol to the subroutine list where the subroutine takes
406 add_sym_1s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
407 gfc_try (*check) (gfc_expr *),
408 gfc_expr *(*simplify) (gfc_expr *),
409 void (*resolve) (gfc_code *),
410 const char *a1, bt type1, int kind1, int optional1)
420 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
421 a1, type1, kind1, optional1, INTENT_IN,
426 /* Add a symbol to the function list where the function takes
427 1 arguments, specifying the intent of the argument. */
430 add_sym_1_intent (const char *name, gfc_isym_id id, enum klass cl,
431 int actual_ok, bt type, int kind, int standard,
432 gfc_try (*check) (gfc_expr *),
433 gfc_expr *(*simplify) (gfc_expr *),
434 void (*resolve) (gfc_expr *, gfc_expr *),
435 const char *a1, bt type1, int kind1, int optional1,
446 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
447 a1, type1, kind1, optional1, intent1,
452 /* Add a symbol to the subroutine list where the subroutine takes
453 1 arguments, specifying the intent of the argument. */
456 add_sym_1s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
457 int kind, int standard,
458 gfc_try (*check) (gfc_expr *),
459 gfc_expr *(*simplify) (gfc_expr *),
460 void (*resolve) (gfc_code *),
461 const char *a1, bt type1, int kind1, int optional1,
472 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
473 a1, type1, kind1, optional1, intent1,
478 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
479 function. MAX et al take 2 or more arguments. */
482 add_sym_1m (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
483 int kind, int standard,
484 gfc_try (*check) (gfc_actual_arglist *),
485 gfc_expr *(*simplify) (gfc_expr *),
486 void (*resolve) (gfc_expr *, gfc_actual_arglist *),
487 const char *a1, bt type1, int kind1, int optional1,
488 const char *a2, bt type2, int kind2, int optional2)
498 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
499 a1, type1, kind1, optional1, INTENT_IN,
500 a2, type2, kind2, optional2, INTENT_IN,
505 /* Add a symbol to the function list where the function takes
509 add_sym_2 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
510 int kind, int standard,
511 gfc_try (*check) (gfc_expr *, gfc_expr *),
512 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
513 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *),
514 const char *a1, bt type1, int kind1, int optional1,
515 const char *a2, bt type2, int kind2, int optional2)
525 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
526 a1, type1, kind1, optional1, INTENT_IN,
527 a2, type2, kind2, optional2, INTENT_IN,
532 /* Add a symbol to the subroutine list where the subroutine takes
536 add_sym_2s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
537 gfc_try (*check) (gfc_expr *, gfc_expr *),
538 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
539 void (*resolve) (gfc_code *),
540 const char *a1, bt type1, int kind1, int optional1,
541 const char *a2, bt type2, int kind2, int optional2)
551 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
552 a1, type1, kind1, optional1, INTENT_IN,
553 a2, type2, kind2, optional2, INTENT_IN,
558 /* Add a symbol to the subroutine list where the subroutine takes
559 2 arguments, specifying the intent of the arguments. */
562 add_sym_2s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
563 int kind, int standard,
564 gfc_try (*check) (gfc_expr *, gfc_expr *),
565 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
566 void (*resolve) (gfc_code *),
567 const char *a1, bt type1, int kind1, int optional1,
568 sym_intent intent1, const char *a2, bt type2, int kind2,
569 int optional2, sym_intent intent2)
579 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
580 a1, type1, kind1, optional1, intent1,
581 a2, type2, kind2, optional2, intent2,
586 /* Add a symbol to the function list where the function takes
590 add_sym_3 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
591 int kind, int standard,
592 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
593 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
594 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
595 const char *a1, bt type1, int kind1, int optional1,
596 const char *a2, bt type2, int kind2, int optional2,
597 const char *a3, bt type3, int kind3, int optional3)
607 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
608 a1, type1, kind1, optional1, INTENT_IN,
609 a2, type2, kind2, optional2, INTENT_IN,
610 a3, type3, kind3, optional3, INTENT_IN,
615 /* MINLOC and MAXLOC get special treatment because their argument
616 might have to be reordered. */
619 add_sym_3ml (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
620 int kind, int standard,
621 gfc_try (*check) (gfc_actual_arglist *),
622 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
623 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
624 const char *a1, bt type1, int kind1, int optional1,
625 const char *a2, bt type2, int kind2, int optional2,
626 const char *a3, bt type3, int kind3, int optional3)
636 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
637 a1, type1, kind1, optional1, INTENT_IN,
638 a2, type2, kind2, optional2, INTENT_IN,
639 a3, type3, kind3, optional3, INTENT_IN,
644 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
645 their argument also might have to be reordered. */
648 add_sym_3red (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
649 int kind, int standard,
650 gfc_try (*check) (gfc_actual_arglist *),
651 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
652 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
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)
665 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
666 a1, type1, kind1, optional1, INTENT_IN,
667 a2, type2, kind2, optional2, INTENT_IN,
668 a3, type3, kind3, optional3, INTENT_IN,
673 /* Add a symbol to the subroutine list where the subroutine takes
677 add_sym_3s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
678 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
679 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
680 void (*resolve) (gfc_code *),
681 const char *a1, bt type1, int kind1, int optional1,
682 const char *a2, bt type2, int kind2, int optional2,
683 const char *a3, bt type3, int kind3, int optional3)
693 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
694 a1, type1, kind1, optional1, INTENT_IN,
695 a2, type2, kind2, optional2, INTENT_IN,
696 a3, type3, kind3, optional3, INTENT_IN,
701 /* Add a symbol to the subroutine list where the subroutine takes
702 3 arguments, specifying the intent of the arguments. */
705 add_sym_3s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
706 int kind, int standard,
707 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
708 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
709 void (*resolve) (gfc_code *),
710 const char *a1, bt type1, int kind1, int optional1,
711 sym_intent intent1, const char *a2, bt type2, int kind2,
712 int optional2, sym_intent intent2, const char *a3, bt type3,
713 int kind3, int optional3, sym_intent intent3)
723 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
724 a1, type1, kind1, optional1, intent1,
725 a2, type2, kind2, optional2, intent2,
726 a3, type3, kind3, optional3, intent3,
731 /* Add a symbol to the function list where the function takes
735 add_sym_4 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
736 int kind, int standard,
737 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
738 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
740 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
742 const char *a1, bt type1, int kind1, int optional1,
743 const char *a2, bt type2, int kind2, int optional2,
744 const char *a3, bt type3, int kind3, int optional3,
745 const char *a4, bt type4, int kind4, int optional4 )
755 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
756 a1, type1, kind1, optional1, INTENT_IN,
757 a2, type2, kind2, optional2, INTENT_IN,
758 a3, type3, kind3, optional3, INTENT_IN,
759 a4, type4, kind4, optional4, INTENT_IN,
764 /* Add a symbol to the subroutine list where the subroutine takes
768 add_sym_4s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
770 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
771 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
773 void (*resolve) (gfc_code *),
774 const char *a1, bt type1, int kind1, int optional1,
775 sym_intent intent1, const char *a2, bt type2, int kind2,
776 int optional2, sym_intent intent2, const char *a3, bt type3,
777 int kind3, int optional3, sym_intent intent3, const char *a4,
778 bt type4, int kind4, int optional4, sym_intent intent4)
788 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
789 a1, type1, kind1, optional1, intent1,
790 a2, type2, kind2, optional2, intent2,
791 a3, type3, kind3, optional3, intent3,
792 a4, type4, kind4, optional4, intent4,
797 /* Add a symbol to the subroutine list where the subroutine takes
801 add_sym_5s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
803 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
805 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
806 gfc_expr *, gfc_expr *),
807 void (*resolve) (gfc_code *),
808 const char *a1, bt type1, int kind1, int optional1,
809 sym_intent intent1, const char *a2, bt type2, int kind2,
810 int optional2, sym_intent intent2, const char *a3, bt type3,
811 int kind3, int optional3, sym_intent intent3, const char *a4,
812 bt type4, int kind4, int optional4, sym_intent intent4,
813 const char *a5, bt type5, int kind5, int optional5,
824 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
825 a1, type1, kind1, optional1, intent1,
826 a2, type2, kind2, optional2, intent2,
827 a3, type3, kind3, optional3, intent3,
828 a4, type4, kind4, optional4, intent4,
829 a5, type5, kind5, optional5, intent5,
834 /* Locate an intrinsic symbol given a base pointer, number of elements
835 in the table and a pointer to a name. Returns the NULL pointer if
836 a name is not found. */
838 static gfc_intrinsic_sym *
839 find_sym (gfc_intrinsic_sym *start, int n, const char *name)
841 /* name may be a user-supplied string, so we must first make sure
842 that we're comparing against a pointer into the global string
844 const char *p = gfc_get_string (name);
848 if (p == start->name)
859 /* Given a name, find a function in the intrinsic function table.
860 Returns NULL if not found. */
863 gfc_find_function (const char *name)
865 gfc_intrinsic_sym *sym;
867 sym = find_sym (functions, nfunc, name);
869 sym = find_sym (conversion, nconv, name);
875 /* Given a name, find a function in the intrinsic subroutine table.
876 Returns NULL if not found. */
879 gfc_find_subroutine (const char *name)
881 return find_sym (subroutines, nsub, name);
885 /* Given a string, figure out if it is the name of a generic intrinsic
889 gfc_generic_intrinsic (const char *name)
891 gfc_intrinsic_sym *sym;
893 sym = gfc_find_function (name);
894 return (sym == NULL) ? 0 : sym->generic;
898 /* Given a string, figure out if it is the name of a specific
899 intrinsic function or not. */
902 gfc_specific_intrinsic (const char *name)
904 gfc_intrinsic_sym *sym;
906 sym = gfc_find_function (name);
907 return (sym == NULL) ? 0 : sym->specific;
911 /* Given a string, figure out if it is the name of an intrinsic function
912 or subroutine allowed as an actual argument or not. */
914 gfc_intrinsic_actual_ok (const char *name, const bool subroutine_flag)
916 gfc_intrinsic_sym *sym;
918 /* Intrinsic subroutines are not allowed as actual arguments. */
923 sym = gfc_find_function (name);
924 return (sym == NULL) ? 0 : sym->actual_ok;
929 /* Given a symbol, find out if it is (and is to be treated) an intrinsic. If
930 it's name refers to an intrinsic but this intrinsic is not included in the
931 selected standard, this returns FALSE and sets the symbol's external
935 gfc_is_intrinsic (gfc_symbol* sym, int subroutine_flag, locus loc)
937 gfc_intrinsic_sym* isym;
940 /* If INTRINSIC/EXTERNAL state is already known, return. */
941 if (sym->attr.intrinsic)
943 if (sym->attr.external)
947 isym = gfc_find_subroutine (sym->name);
949 isym = gfc_find_function (sym->name);
951 /* No such intrinsic available at all? */
955 /* See if this intrinsic is allowed in the current standard. */
956 if (gfc_check_intrinsic_standard (isym, &symstd, false, loc) == FAILURE)
958 if (sym->attr.proc == PROC_UNKNOWN)
960 if (gfc_option.warn_intrinsics_std)
961 gfc_warning_now ("The intrinsic '%s' at %L is not included in the"
962 " selected standard but %s and '%s' will be"
963 " treated as if declared EXTERNAL. Use an"
964 " appropriate -std=* option or define"
965 " -fall-intrinsics to allow this intrinsic.",
966 sym->name, &loc, symstd, sym->name);
967 gfc_add_external (&sym->attr, &loc);
977 /* Collect a set of intrinsic functions into a generic collection.
978 The first argument is the name of the generic function, which is
979 also the name of a specific function. The rest of the specifics
980 currently in the table are placed into the list of specific
981 functions associated with that generic.
984 FIXME: Remove the argument STANDARD if no regressions are
985 encountered. Change all callers (approx. 360).
989 make_generic (const char *name, gfc_isym_id id, int standard ATTRIBUTE_UNUSED)
991 gfc_intrinsic_sym *g;
993 if (sizing != SZ_NOTHING)
996 g = gfc_find_function (name);
998 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
1001 gcc_assert (g->id == id);
1005 if ((g + 1)->name != NULL)
1006 g->specific_head = g + 1;
1009 while (g->name != NULL)
1011 gcc_assert (g->id == id);
1023 /* Create a duplicate intrinsic function entry for the current
1024 function, the only differences being the alternate name and
1025 a different standard if necessary. Note that we use argument
1026 lists more than once, but all argument lists are freed as a
1030 make_alias (const char *name, int standard)
1043 next_sym[0] = next_sym[-1];
1044 next_sym->name = gfc_get_string (name);
1045 next_sym->standard = standard;
1055 /* Make the current subroutine noreturn. */
1058 make_noreturn (void)
1060 if (sizing == SZ_NOTHING)
1061 next_sym[-1].noreturn = 1;
1065 /* Add intrinsic functions. */
1068 add_functions (void)
1070 /* Argument names as in the standard (to be used as argument keywords). */
1072 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
1073 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
1074 *c = "c", *n = "n", *ncopies= "ncopies", *pos = "pos", *bck = "back",
1075 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
1076 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
1077 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
1078 *p = "p", *ar = "array", *shp = "shape", *src = "source",
1079 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
1080 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
1081 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
1082 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
1083 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
1084 *num = "number", *tm = "time", *nm = "name", *md = "mode",
1085 *vl = "values", *p1 = "path1", *p2 = "path2", *com = "command";
1087 int di, dr, dd, dl, dc, dz, ii;
1089 di = gfc_default_integer_kind;
1090 dr = gfc_default_real_kind;
1091 dd = gfc_default_double_kind;
1092 dl = gfc_default_logical_kind;
1093 dc = gfc_default_character_kind;
1094 dz = gfc_default_complex_kind;
1095 ii = gfc_index_integer_kind;
1097 add_sym_1 ("abs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1098 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
1099 a, BT_REAL, dr, REQUIRED);
1101 add_sym_1 ("iabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1102 NULL, gfc_simplify_abs, gfc_resolve_abs,
1103 a, BT_INTEGER, di, REQUIRED);
1105 add_sym_1 ("dabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1106 gfc_check_fn_d, gfc_simplify_abs, gfc_resolve_abs,
1107 a, BT_REAL, dd, REQUIRED);
1109 add_sym_1 ("cabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1110 NULL, gfc_simplify_abs, gfc_resolve_abs,
1111 a, BT_COMPLEX, dz, REQUIRED);
1113 add_sym_1 ("zabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1114 NULL, gfc_simplify_abs, gfc_resolve_abs,
1115 a, BT_COMPLEX, dd, REQUIRED);
1117 make_alias ("cdabs", GFC_STD_GNU);
1119 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
1121 /* The checking function for ACCESS is called gfc_check_access_func
1122 because the name gfc_check_access is already used in module.c. */
1123 add_sym_2 ("access", GFC_ISYM_ACCESS, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1124 gfc_check_access_func, NULL, gfc_resolve_access,
1125 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1127 make_generic ("access", GFC_ISYM_ACCESS, GFC_STD_GNU);
1129 add_sym_2 ("achar", GFC_ISYM_ACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1130 BT_CHARACTER, dc, GFC_STD_F95,
1131 gfc_check_achar, gfc_simplify_achar, gfc_resolve_achar,
1132 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1134 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
1136 add_sym_1 ("acos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1137 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
1138 x, BT_REAL, dr, REQUIRED);
1140 add_sym_1 ("dacos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1141 gfc_check_fn_d, gfc_simplify_acos, gfc_resolve_acos,
1142 x, BT_REAL, dd, REQUIRED);
1144 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
1146 add_sym_1 ("acosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1147 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_acosh,
1148 gfc_resolve_acosh, x, BT_REAL, dr, REQUIRED);
1150 add_sym_1 ("dacosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1151 gfc_check_fn_d, gfc_simplify_acosh, gfc_resolve_acosh,
1152 x, BT_REAL, dd, REQUIRED);
1154 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_F2008);
1156 add_sym_1 ("adjustl", GFC_ISYM_ADJUSTL, CLASS_ELEMENTAL, ACTUAL_NO,
1157 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustl,
1158 gfc_resolve_adjustl, stg, BT_CHARACTER, 0, REQUIRED);
1160 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
1162 add_sym_1 ("adjustr", GFC_ISYM_ADJUSTR, CLASS_ELEMENTAL, ACTUAL_NO,
1163 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustr,
1164 gfc_resolve_adjustr, stg, BT_CHARACTER, 0, REQUIRED);
1166 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
1168 add_sym_1 ("aimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1169 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
1170 z, BT_COMPLEX, dz, REQUIRED);
1172 make_alias ("imag", GFC_STD_GNU);
1173 make_alias ("imagpart", GFC_STD_GNU);
1175 add_sym_1 ("dimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1176 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
1177 z, BT_COMPLEX, dd, REQUIRED);
1179 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
1181 add_sym_2 ("aint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1182 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
1183 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1185 add_sym_1 ("dint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1186 NULL, gfc_simplify_dint, gfc_resolve_dint,
1187 a, BT_REAL, dd, REQUIRED);
1189 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
1191 add_sym_2 ("all", GFC_ISYM_ALL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1192 gfc_check_all_any, gfc_simplify_all, gfc_resolve_all,
1193 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1195 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
1197 add_sym_1 ("allocated", GFC_ISYM_ALLOCATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1198 gfc_check_allocated, NULL, NULL,
1199 ar, BT_UNKNOWN, 0, REQUIRED);
1201 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
1203 add_sym_2 ("anint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1204 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
1205 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1207 add_sym_1 ("dnint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1208 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
1209 a, BT_REAL, dd, REQUIRED);
1211 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1213 add_sym_2 ("any", GFC_ISYM_ANY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1214 gfc_check_all_any, gfc_simplify_any, gfc_resolve_any,
1215 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1217 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1219 add_sym_1 ("asin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1220 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1221 x, BT_REAL, dr, REQUIRED);
1223 add_sym_1 ("dasin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1224 gfc_check_fn_d, gfc_simplify_asin, gfc_resolve_asin,
1225 x, BT_REAL, dd, REQUIRED);
1227 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1229 add_sym_1 ("asinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1230 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_asinh,
1231 gfc_resolve_asinh, x, BT_REAL, dr, REQUIRED);
1233 add_sym_1 ("dasinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1234 gfc_check_fn_d, gfc_simplify_asinh, gfc_resolve_asinh,
1235 x, BT_REAL, dd, REQUIRED);
1237 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_F2008);
1239 add_sym_2 ("associated", GFC_ISYM_ASSOCIATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl,
1240 GFC_STD_F95, gfc_check_associated, NULL, NULL,
1241 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1243 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1245 add_sym_1 ("atan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1246 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1247 x, BT_REAL, dr, REQUIRED);
1249 add_sym_1 ("datan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1250 gfc_check_fn_d, gfc_simplify_atan, gfc_resolve_atan,
1251 x, BT_REAL, dd, REQUIRED);
1253 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1255 add_sym_1 ("atanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1256 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_atanh,
1257 gfc_resolve_atanh, x, BT_REAL, dr, REQUIRED);
1259 add_sym_1 ("datanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1260 gfc_check_fn_d, gfc_simplify_atanh, gfc_resolve_atanh,
1261 x, BT_REAL, dd, REQUIRED);
1263 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_F2008);
1265 add_sym_2 ("atan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1266 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1267 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1269 add_sym_2 ("datan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1270 gfc_check_datan2, gfc_simplify_atan2, gfc_resolve_atan2,
1271 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1273 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1275 /* Bessel and Neumann functions for G77 compatibility. */
1276 add_sym_1 ("besj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1277 gfc_check_fn_r, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1278 x, BT_REAL, dr, REQUIRED);
1280 make_alias ("bessel_j0", GFC_STD_F2008);
1282 add_sym_1 ("dbesj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1283 gfc_check_fn_d, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1284 x, BT_REAL, dd, REQUIRED);
1286 make_generic ("bessel_j0", GFC_ISYM_J0, GFC_STD_F2008);
1288 add_sym_1 ("besj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1289 gfc_check_fn_r, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1290 x, BT_REAL, dr, REQUIRED);
1292 make_alias ("bessel_j1", GFC_STD_F2008);
1294 add_sym_1 ("dbesj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1295 gfc_check_fn_d, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1296 x, BT_REAL, dd, REQUIRED);
1298 make_generic ("bessel_j1", GFC_ISYM_J1, GFC_STD_F2008);
1300 add_sym_2 ("besjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1301 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1302 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1304 make_alias ("bessel_jn", GFC_STD_F2008);
1306 add_sym_2 ("dbesjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1307 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1308 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1310 make_generic ("bessel_jn", GFC_ISYM_JN, GFC_STD_F2008);
1312 add_sym_1 ("besy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1313 gfc_check_fn_r, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1314 x, BT_REAL, dr, REQUIRED);
1316 make_alias ("bessel_y0", GFC_STD_F2008);
1318 add_sym_1 ("dbesy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1319 gfc_check_fn_d, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1320 x, BT_REAL, dd, REQUIRED);
1322 make_generic ("bessel_y0", GFC_ISYM_Y0, GFC_STD_F2008);
1324 add_sym_1 ("besy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1325 gfc_check_fn_r, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1326 x, BT_REAL, dr, REQUIRED);
1328 make_alias ("bessel_y1", GFC_STD_F2008);
1330 add_sym_1 ("dbesy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1331 gfc_check_fn_d, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1332 x, BT_REAL, dd, REQUIRED);
1334 make_generic ("bessel_y1", GFC_ISYM_Y1, GFC_STD_F2008);
1336 add_sym_2 ("besyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1337 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1338 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1340 make_alias ("bessel_yn", GFC_STD_F2008);
1342 add_sym_2 ("dbesyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1343 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1344 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1346 make_generic ("bessel_yn", GFC_ISYM_YN, GFC_STD_F2008);
1348 add_sym_1 ("bit_size", GFC_ISYM_BIT_SIZE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1349 gfc_check_i, gfc_simplify_bit_size, NULL,
1350 i, BT_INTEGER, di, REQUIRED);
1352 make_generic ("bit_size", GFC_ISYM_BIT_SIZE, GFC_STD_F95);
1354 add_sym_2 ("btest", GFC_ISYM_BTEST, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1355 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1356 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1358 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1360 add_sym_2 ("ceiling", GFC_ISYM_CEILING, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1361 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1362 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1364 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1366 add_sym_2 ("char", GFC_ISYM_CHAR, CLASS_ELEMENTAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F77,
1367 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1368 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1370 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1372 add_sym_1 ("chdir", GFC_ISYM_CHDIR, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1373 GFC_STD_GNU, gfc_check_chdir, NULL, gfc_resolve_chdir,
1374 nm, BT_CHARACTER, dc, REQUIRED);
1376 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1378 add_sym_2 ("chmod", GFC_ISYM_CHMOD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1379 gfc_check_chmod, NULL, gfc_resolve_chmod,
1380 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1382 make_generic ("chmod", GFC_ISYM_CHMOD, GFC_STD_GNU);
1384 add_sym_3 ("cmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_F77,
1385 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1386 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1387 kind, BT_INTEGER, di, OPTIONAL);
1389 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1391 add_sym_0 ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT, CLASS_INQUIRY,
1392 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003, NULL, NULL, NULL);
1394 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1397 add_sym_2 ("complex", GFC_ISYM_COMPLEX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_GNU,
1398 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1399 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1401 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1403 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1404 complex instead of the default complex. */
1406 add_sym_2 ("dcmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dd, GFC_STD_GNU,
1407 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1408 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1410 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1412 add_sym_1 ("conjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1413 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1414 z, BT_COMPLEX, dz, REQUIRED);
1416 add_sym_1 ("dconjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1417 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1418 z, BT_COMPLEX, dd, REQUIRED);
1420 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1422 add_sym_1 ("cos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1423 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1424 x, BT_REAL, dr, REQUIRED);
1426 add_sym_1 ("dcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1427 gfc_check_fn_d, gfc_simplify_cos, gfc_resolve_cos,
1428 x, BT_REAL, dd, REQUIRED);
1430 add_sym_1 ("ccos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1431 NULL, gfc_simplify_cos, gfc_resolve_cos,
1432 x, BT_COMPLEX, dz, REQUIRED);
1434 add_sym_1 ("zcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1435 NULL, gfc_simplify_cos, gfc_resolve_cos,
1436 x, BT_COMPLEX, dd, REQUIRED);
1438 make_alias ("cdcos", GFC_STD_GNU);
1440 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1442 add_sym_1 ("cosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1443 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1444 x, BT_REAL, dr, REQUIRED);
1446 add_sym_1 ("dcosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1447 gfc_check_fn_d, gfc_simplify_cosh, gfc_resolve_cosh,
1448 x, BT_REAL, dd, REQUIRED);
1450 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1452 add_sym_3 ("count", GFC_ISYM_COUNT, CLASS_TRANSFORMATIONAL, ACTUAL_NO,
1453 BT_INTEGER, di, GFC_STD_F95,
1454 gfc_check_count, gfc_simplify_count, gfc_resolve_count,
1455 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1456 kind, BT_INTEGER, di, OPTIONAL);
1458 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1460 add_sym_3 ("cshift", GFC_ISYM_CSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1461 gfc_check_cshift, NULL, gfc_resolve_cshift,
1462 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1463 dm, BT_INTEGER, ii, OPTIONAL);
1465 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1467 add_sym_1 ("ctime", GFC_ISYM_CTIME, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
1468 gfc_check_ctime, NULL, gfc_resolve_ctime,
1469 tm, BT_INTEGER, di, REQUIRED);
1471 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1473 add_sym_1 ("dble", GFC_ISYM_DBLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
1474 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1475 a, BT_REAL, dr, REQUIRED);
1477 make_alias ("dfloat", GFC_STD_GNU);
1479 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1481 add_sym_1 ("digits", GFC_ISYM_DIGITS, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1482 gfc_check_digits, gfc_simplify_digits, NULL,
1483 x, BT_UNKNOWN, dr, REQUIRED);
1485 make_generic ("digits", GFC_ISYM_DIGITS, GFC_STD_F95);
1487 add_sym_2 ("dim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1488 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1489 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1491 add_sym_2 ("idim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1492 NULL, gfc_simplify_dim, gfc_resolve_dim,
1493 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1495 add_sym_2 ("ddim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1496 gfc_check_x_yd, gfc_simplify_dim, gfc_resolve_dim,
1497 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1499 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1501 add_sym_2 ("dot_product", GFC_ISYM_DOT_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr,
1502 GFC_STD_F95, gfc_check_dot_product, gfc_simplify_dot_product, gfc_resolve_dot_product,
1503 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1505 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1507 add_sym_2 ("dprod", GFC_ISYM_DPROD,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1508 gfc_check_dprod, gfc_simplify_dprod, gfc_resolve_dprod,
1509 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1511 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1513 add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1515 a, BT_COMPLEX, dd, REQUIRED);
1517 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1519 add_sym_4 ("eoshift", GFC_ISYM_EOSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1520 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1521 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1522 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1524 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1526 add_sym_1 ("epsilon", GFC_ISYM_EPSILON, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1527 gfc_check_x, gfc_simplify_epsilon, NULL,
1528 x, BT_REAL, dr, REQUIRED);
1530 make_generic ("epsilon", GFC_ISYM_EPSILON, GFC_STD_F95);
1532 /* G77 compatibility for the ERF() and ERFC() functions. */
1533 add_sym_1 ("erf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1534 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erf,
1535 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1537 add_sym_1 ("derf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1538 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erf,
1539 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1541 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_F2008);
1543 add_sym_1 ("erfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1544 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erfc,
1545 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1547 add_sym_1 ("derfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1548 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erfc,
1549 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1551 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_F2008);
1553 add_sym_1 ("erfc_scaled", GFC_ISYM_ERFC_SCALED, CLASS_ELEMENTAL, ACTUAL_NO,
1554 BT_REAL, dr, GFC_STD_F2008, gfc_check_fn_r,
1555 gfc_simplify_erfc_scaled, gfc_resolve_g77_math1, x, BT_REAL,
1558 make_generic ("erfc_scaled", GFC_ISYM_ERFC_SCALED, GFC_STD_F2008);
1560 /* G77 compatibility */
1561 add_sym_1 ("dtime", GFC_ISYM_DTIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
1562 gfc_check_dtime_etime, NULL, NULL,
1563 x, BT_REAL, 4, REQUIRED);
1565 make_generic ("dtime", GFC_ISYM_DTIME, GFC_STD_GNU);
1567 add_sym_1 ("etime", GFC_ISYM_ETIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
1568 gfc_check_dtime_etime, NULL, NULL,
1569 x, BT_REAL, 4, REQUIRED);
1571 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1573 add_sym_1 ("exp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1574 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1575 x, BT_REAL, dr, REQUIRED);
1577 add_sym_1 ("dexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1578 gfc_check_fn_d, gfc_simplify_exp, gfc_resolve_exp,
1579 x, BT_REAL, dd, REQUIRED);
1581 add_sym_1 ("cexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1582 NULL, gfc_simplify_exp, gfc_resolve_exp,
1583 x, BT_COMPLEX, dz, REQUIRED);
1585 add_sym_1 ("zexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1586 NULL, gfc_simplify_exp, gfc_resolve_exp,
1587 x, BT_COMPLEX, dd, REQUIRED);
1589 make_alias ("cdexp", GFC_STD_GNU);
1591 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1593 add_sym_1 ("exponent", GFC_ISYM_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1594 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1595 x, BT_REAL, dr, REQUIRED);
1597 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1599 add_sym_0 ("fdate", GFC_ISYM_FDATE, NO_CLASS, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_GNU,
1600 NULL, NULL, gfc_resolve_fdate);
1602 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1604 add_sym_2 ("floor", GFC_ISYM_FLOOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1605 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1606 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1608 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1610 /* G77 compatible fnum */
1611 add_sym_1 ("fnum", GFC_ISYM_FNUM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1612 gfc_check_fnum, NULL, gfc_resolve_fnum,
1613 ut, BT_INTEGER, di, REQUIRED);
1615 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1617 add_sym_1 ("fraction", GFC_ISYM_FRACTION, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1618 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1619 x, BT_REAL, dr, REQUIRED);
1621 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1623 add_sym_2 ("fstat", GFC_ISYM_FSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1624 GFC_STD_GNU, gfc_check_fstat, NULL, gfc_resolve_fstat,
1625 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
1627 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1629 add_sym_1 ("ftell", GFC_ISYM_FTELL, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii, GFC_STD_GNU,
1630 gfc_check_ftell, NULL, gfc_resolve_ftell,
1631 ut, BT_INTEGER, di, REQUIRED);
1633 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1635 add_sym_2 ("fgetc", GFC_ISYM_FGETC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1636 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1637 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1639 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1641 add_sym_1 ("fget", GFC_ISYM_FGET, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1642 gfc_check_fgetput, NULL, gfc_resolve_fget,
1643 c, BT_CHARACTER, dc, REQUIRED);
1645 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1647 add_sym_2 ("fputc", GFC_ISYM_FPUTC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1648 gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1649 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1651 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1653 add_sym_1 ("fput", GFC_ISYM_FPUT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1654 gfc_check_fgetput, NULL, gfc_resolve_fput,
1655 c, BT_CHARACTER, dc, REQUIRED);
1657 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1659 add_sym_1 ("gamma", GFC_ISYM_GAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1660 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_gamma,
1661 gfc_resolve_gamma, x, BT_REAL, dr, REQUIRED);
1663 add_sym_1 ("dgamma", GFC_ISYM_GAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1664 gfc_check_fn_d, gfc_simplify_gamma, gfc_resolve_gamma,
1665 x, BT_REAL, dr, REQUIRED);
1667 make_generic ("gamma", GFC_ISYM_GAMMA, GFC_STD_F2008);
1669 /* Unix IDs (g77 compatibility) */
1670 add_sym_1 ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1671 NULL, NULL, gfc_resolve_getcwd,
1672 c, BT_CHARACTER, dc, REQUIRED);
1674 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1676 add_sym_0 ("getgid", GFC_ISYM_GETGID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1677 NULL, NULL, gfc_resolve_getgid);
1679 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1681 add_sym_0 ("getpid", GFC_ISYM_GETPID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1682 NULL, NULL, gfc_resolve_getpid);
1684 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1686 add_sym_0 ("getuid", GFC_ISYM_GETUID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1687 NULL, NULL, gfc_resolve_getuid);
1689 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1691 add_sym_1 ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1692 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1693 a, BT_CHARACTER, dc, REQUIRED);
1695 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1697 add_sym_1 ("huge", GFC_ISYM_HUGE, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1698 gfc_check_huge, gfc_simplify_huge, NULL,
1699 x, BT_UNKNOWN, dr, REQUIRED);
1701 make_generic ("huge", GFC_ISYM_HUGE, GFC_STD_F95);
1703 add_sym_2 ("hypot", GFC_ISYM_HYPOT, CLASS_ELEMENTAL, ACTUAL_NO,
1704 BT_REAL, dr, GFC_STD_F2008,
1705 gfc_check_hypot, gfc_simplify_hypot, gfc_resolve_hypot,
1706 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1708 make_generic ("hypot", GFC_ISYM_HYPOT, GFC_STD_F2008);
1710 add_sym_2 ("iachar", GFC_ISYM_IACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1711 BT_INTEGER, di, GFC_STD_F95,
1712 gfc_check_ichar_iachar, gfc_simplify_iachar, gfc_resolve_iachar,
1713 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1715 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1717 add_sym_2 ("iand", GFC_ISYM_IAND, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1718 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1719 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1721 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1723 add_sym_2 ("and", GFC_ISYM_AND, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1724 gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1725 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1727 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1729 add_sym_0 ("iargc", GFC_ISYM_IARGC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1732 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1734 add_sym_2 ("ibclr", GFC_ISYM_IBCLR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1735 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1736 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1738 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1740 add_sym_3 ("ibits", GFC_ISYM_IBITS, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1741 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1742 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1743 ln, BT_INTEGER, di, REQUIRED);
1745 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1747 add_sym_2 ("ibset", GFC_ISYM_IBSET, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1748 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1749 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1751 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1753 add_sym_2 ("ichar", GFC_ISYM_ICHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1754 BT_INTEGER, di, GFC_STD_F77,
1755 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1756 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1758 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1760 add_sym_2 ("ieor", GFC_ISYM_IEOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1761 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1762 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1764 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1766 add_sym_2 ("xor", GFC_ISYM_XOR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1767 gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1768 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1770 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1772 add_sym_0 ("ierrno", GFC_ISYM_IERRNO, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1773 NULL, NULL, gfc_resolve_ierrno);
1775 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1777 /* The resolution function for INDEX is called gfc_resolve_index_func
1778 because the name gfc_resolve_index is already used in resolve.c. */
1779 add_sym_4 ("index", GFC_ISYM_INDEX, CLASS_ELEMENTAL, ACTUAL_YES,
1780 BT_INTEGER, di, GFC_STD_F77,
1781 gfc_check_index, gfc_simplify_index, gfc_resolve_index_func,
1782 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1783 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
1785 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1787 add_sym_2 ("int", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1788 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1789 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1791 add_sym_1 ("ifix", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1792 NULL, gfc_simplify_ifix, NULL,
1793 a, BT_REAL, dr, REQUIRED);
1795 add_sym_1 ("idint", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1796 NULL, gfc_simplify_idint, NULL,
1797 a, BT_REAL, dd, REQUIRED);
1799 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1801 add_sym_1 ("int2", GFC_ISYM_INT2, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1802 gfc_check_intconv, gfc_simplify_int2, gfc_resolve_int2,
1803 a, BT_REAL, dr, REQUIRED);
1805 make_alias ("short", GFC_STD_GNU);
1807 make_generic ("int2", GFC_ISYM_INT2, GFC_STD_GNU);
1809 add_sym_1 ("int8", GFC_ISYM_INT8, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1810 gfc_check_intconv, gfc_simplify_int8, gfc_resolve_int8,
1811 a, BT_REAL, dr, REQUIRED);
1813 make_generic ("int8", GFC_ISYM_INT8, GFC_STD_GNU);
1815 add_sym_1 ("long", GFC_ISYM_LONG, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1816 gfc_check_intconv, gfc_simplify_long, gfc_resolve_long,
1817 a, BT_REAL, dr, REQUIRED);
1819 make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
1821 add_sym_2 ("ior", GFC_ISYM_IOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1822 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1823 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1825 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1827 add_sym_2 ("or", GFC_ISYM_OR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1828 gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1829 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1831 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1833 /* The following function is for G77 compatibility. */
1834 add_sym_1 ("irand", GFC_ISYM_IRAND, NO_CLASS, ACTUAL_NO, BT_INTEGER, 4, GFC_STD_GNU,
1835 gfc_check_irand, NULL, NULL,
1836 i, BT_INTEGER, 4, OPTIONAL);
1838 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1840 add_sym_1 ("isatty", GFC_ISYM_ISATTY, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1841 gfc_check_isatty, NULL, gfc_resolve_isatty,
1842 ut, BT_INTEGER, di, REQUIRED);
1844 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1846 add_sym_1 ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END,
1847 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1848 gfc_check_i, gfc_simplify_is_iostat_end, NULL,
1849 i, BT_INTEGER, 0, REQUIRED);
1851 make_generic ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END, GFC_STD_F2003);
1853 add_sym_1 ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR,
1854 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1855 gfc_check_i, gfc_simplify_is_iostat_eor, NULL,
1856 i, BT_INTEGER, 0, REQUIRED);
1858 make_generic ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR, GFC_STD_F2003);
1860 add_sym_1 ("isnan", GFC_ISYM_ISNAN, CLASS_ELEMENTAL, ACTUAL_NO,
1861 BT_LOGICAL, dl, GFC_STD_GNU,
1862 gfc_check_isnan, gfc_simplify_isnan, NULL,
1863 x, BT_REAL, 0, REQUIRED);
1865 make_generic ("isnan", GFC_ISYM_ISNAN, GFC_STD_GNU);
1867 add_sym_2 ("rshift", GFC_ISYM_RSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1868 gfc_check_ishft, NULL, gfc_resolve_rshift,
1869 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1871 make_generic ("rshift", GFC_ISYM_RSHIFT, GFC_STD_GNU);
1873 add_sym_2 ("lshift", GFC_ISYM_LSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1874 gfc_check_ishft, NULL, gfc_resolve_lshift,
1875 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1877 make_generic ("lshift", GFC_ISYM_LSHIFT, GFC_STD_GNU);
1879 add_sym_2 ("ishft", GFC_ISYM_ISHFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1880 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1881 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1883 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1885 add_sym_3 ("ishftc", GFC_ISYM_ISHFTC, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1886 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1887 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1888 sz, BT_INTEGER, di, OPTIONAL);
1890 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1892 add_sym_2 ("kill", GFC_ISYM_KILL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1893 gfc_check_kill, NULL, gfc_resolve_kill,
1894 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1896 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1898 add_sym_1 ("kind", GFC_ISYM_KIND, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1899 gfc_check_kind, gfc_simplify_kind, NULL,
1900 x, BT_REAL, dr, REQUIRED);
1902 make_generic ("kind", GFC_ISYM_KIND, GFC_STD_F95);
1904 add_sym_3 ("lbound", GFC_ISYM_LBOUND, CLASS_INQUIRY, ACTUAL_NO,
1905 BT_INTEGER, di, GFC_STD_F95,
1906 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1907 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL,
1908 kind, BT_INTEGER, di, OPTIONAL);
1910 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1912 add_sym_1 ("leadz", GFC_ISYM_LEADZ, CLASS_ELEMENTAL, ACTUAL_NO,
1913 BT_INTEGER, di, GFC_STD_F2008,
1914 gfc_check_i, gfc_simplify_leadz, NULL,
1915 i, BT_INTEGER, di, REQUIRED);
1917 make_generic ("leadz", GFC_ISYM_LEADZ, GFC_STD_F2008);
1919 add_sym_2 ("len", GFC_ISYM_LEN, CLASS_INQUIRY, ACTUAL_YES,
1920 BT_INTEGER, di, GFC_STD_F77,
1921 gfc_check_len_lentrim, gfc_simplify_len, gfc_resolve_len,
1922 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1924 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1926 add_sym_2 ("len_trim", GFC_ISYM_LEN_TRIM, CLASS_ELEMENTAL, ACTUAL_NO,
1927 BT_INTEGER, di, GFC_STD_F95,
1928 gfc_check_len_lentrim, gfc_simplify_len_trim, gfc_resolve_len_trim,
1929 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1931 make_alias ("lnblnk", GFC_STD_GNU);
1933 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1935 add_sym_1 ("lgamma", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL,
1937 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1938 x, BT_REAL, dr, REQUIRED);
1940 make_alias ("log_gamma", GFC_STD_F2008);
1942 add_sym_1 ("algama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1943 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1944 x, BT_REAL, dr, REQUIRED);
1946 add_sym_1 ("dlgama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1947 gfc_check_fn_d, gfc_simplify_lgamma, gfc_resolve_lgamma,
1948 x, BT_REAL, dr, REQUIRED);
1950 make_generic ("log_gamma", GFC_ISYM_LGAMMA, GFC_STD_F2008);
1953 add_sym_2 ("lge", GFC_ISYM_LGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1954 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lge, NULL,
1955 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1957 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1959 add_sym_2 ("lgt", GFC_ISYM_LGT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1960 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lgt, NULL,
1961 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1963 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1965 add_sym_2 ("lle",GFC_ISYM_LLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1966 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lle, NULL,
1967 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1969 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1971 add_sym_2 ("llt", GFC_ISYM_LLT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1972 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_llt, NULL,
1973 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1975 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1977 add_sym_2 ("link", GFC_ISYM_LINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1978 GFC_STD_GNU, gfc_check_link, NULL, gfc_resolve_link,
1979 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
1981 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1983 add_sym_1 ("log", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
1984 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1985 x, BT_REAL, dr, REQUIRED);
1987 add_sym_1 ("alog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1988 NULL, gfc_simplify_log, gfc_resolve_log,
1989 x, BT_REAL, dr, REQUIRED);
1991 add_sym_1 ("dlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1992 gfc_check_fn_d, gfc_simplify_log, gfc_resolve_log,
1993 x, BT_REAL, dd, REQUIRED);
1995 add_sym_1 ("clog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1996 NULL, gfc_simplify_log, gfc_resolve_log,
1997 x, BT_COMPLEX, dz, REQUIRED);
1999 add_sym_1 ("zlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2000 NULL, gfc_simplify_log, gfc_resolve_log,
2001 x, BT_COMPLEX, dd, REQUIRED);
2003 make_alias ("cdlog", GFC_STD_GNU);
2005 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
2007 add_sym_1 ("log10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2008 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
2009 x, BT_REAL, dr, REQUIRED);
2011 add_sym_1 ("alog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2012 NULL, gfc_simplify_log10, gfc_resolve_log10,
2013 x, BT_REAL, dr, REQUIRED);
2015 add_sym_1 ("dlog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2016 gfc_check_fn_d, gfc_simplify_log10, gfc_resolve_log10,
2017 x, BT_REAL, dd, REQUIRED);
2019 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
2021 add_sym_2 ("logical", GFC_ISYM_LOGICAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
2022 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
2023 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2025 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
2027 add_sym_2 ("lstat", GFC_ISYM_LSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2028 GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_lstat,
2029 nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2031 make_generic ("lstat", GFC_ISYM_LSTAT, GFC_STD_GNU);
2033 add_sym_1 ("malloc", GFC_ISYM_MALLOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2034 GFC_STD_GNU, gfc_check_malloc, NULL, gfc_resolve_malloc,
2035 sz, BT_INTEGER, di, REQUIRED);
2037 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
2039 add_sym_2 ("matmul", GFC_ISYM_MATMUL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2040 gfc_check_matmul, gfc_simplify_matmul, gfc_resolve_matmul,
2041 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
2043 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
2045 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
2046 int(max). The max function must take at least two arguments. */
2048 add_sym_1m ("max", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2049 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
2050 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
2052 add_sym_1m ("max0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2053 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2054 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2056 add_sym_1m ("amax0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2057 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2058 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2060 add_sym_1m ("amax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2061 gfc_check_min_max_real, gfc_simplify_max, NULL,
2062 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2064 add_sym_1m ("max1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2065 gfc_check_min_max_real, gfc_simplify_max, NULL,
2066 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2068 add_sym_1m ("dmax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2069 gfc_check_min_max_double, gfc_simplify_max, NULL,
2070 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2072 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
2074 add_sym_1 ("maxexponent", GFC_ISYM_MAXEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2075 GFC_STD_F95, gfc_check_x, gfc_simplify_maxexponent, NULL,
2076 x, BT_UNKNOWN, dr, REQUIRED);
2078 make_generic ("maxexponent", GFC_ISYM_MAXEXPONENT, GFC_STD_F95);
2080 add_sym_3ml ("maxloc", GFC_ISYM_MAXLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2081 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
2082 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2083 msk, BT_LOGICAL, dl, OPTIONAL);
2085 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
2087 add_sym_3red ("maxval", GFC_ISYM_MAXVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2088 gfc_check_minval_maxval, gfc_simplify_maxval, gfc_resolve_maxval,
2089 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2090 msk, BT_LOGICAL, dl, OPTIONAL);
2092 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
2094 add_sym_0 ("mclock", GFC_ISYM_MCLOCK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2095 GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock);
2097 make_generic ("mclock", GFC_ISYM_MCLOCK, GFC_STD_GNU);
2099 add_sym_0 ("mclock8", GFC_ISYM_MCLOCK8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2100 GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock8);
2102 make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU);
2104 add_sym_3 ("merge", GFC_ISYM_MERGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2105 gfc_check_merge, gfc_simplify_merge, gfc_resolve_merge,
2106 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
2107 msk, BT_LOGICAL, dl, REQUIRED);
2109 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
2111 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
2114 add_sym_1m ("min", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2115 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
2116 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2118 add_sym_1m ("min0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2119 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2120 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2122 add_sym_1m ("amin0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2123 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2124 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2126 add_sym_1m ("amin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2127 gfc_check_min_max_real, gfc_simplify_min, NULL,
2128 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2130 add_sym_1m ("min1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2131 gfc_check_min_max_real, gfc_simplify_min, NULL,
2132 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2134 add_sym_1m ("dmin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2135 gfc_check_min_max_double, gfc_simplify_min, NULL,
2136 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2138 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
2140 add_sym_1 ("minexponent", GFC_ISYM_MINEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2141 GFC_STD_F95, gfc_check_x, gfc_simplify_minexponent, NULL,
2142 x, BT_UNKNOWN, dr, REQUIRED);
2144 make_generic ("minexponent", GFC_ISYM_MINEXPONENT, GFC_STD_F95);
2146 add_sym_3ml ("minloc", GFC_ISYM_MINLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2147 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
2148 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2149 msk, BT_LOGICAL, dl, OPTIONAL);
2151 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
2153 add_sym_3red ("minval", GFC_ISYM_MINVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2154 gfc_check_minval_maxval, gfc_simplify_minval, gfc_resolve_minval,
2155 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2156 msk, BT_LOGICAL, dl, OPTIONAL);
2158 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
2160 add_sym_2 ("mod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2161 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
2162 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
2164 add_sym_2 ("amod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2165 NULL, gfc_simplify_mod, gfc_resolve_mod,
2166 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
2168 add_sym_2 ("dmod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2169 gfc_check_x_yd, gfc_simplify_mod, gfc_resolve_mod,
2170 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
2172 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
2174 add_sym_2 ("modulo", GFC_ISYM_MODULO, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, di, GFC_STD_F95,
2175 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
2176 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
2178 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
2180 add_sym_2 ("nearest", GFC_ISYM_NEAREST, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2181 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
2182 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
2184 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
2186 add_sym_1 ("new_line", GFC_ISYM_NEW_LINE, CLASS_INQUIRY, ACTUAL_NO, BT_CHARACTER, dc,
2187 GFC_STD_F2003, gfc_check_new_line, gfc_simplify_new_line, NULL,
2188 a, BT_CHARACTER, dc, REQUIRED);
2190 make_generic ("new_line", GFC_ISYM_NEW_LINE, GFC_STD_F2003);
2192 add_sym_2 ("nint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2193 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
2194 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2196 add_sym_1 ("idnint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2197 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
2198 a, BT_REAL, dd, REQUIRED);
2200 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
2202 add_sym_1 ("not", GFC_ISYM_NOT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2203 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
2204 i, BT_INTEGER, di, REQUIRED);
2206 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
2208 add_sym_1 ("null", GFC_ISYM_NULL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2209 gfc_check_null, gfc_simplify_null, NULL,
2210 mo, BT_INTEGER, di, OPTIONAL);
2212 make_generic ("null", GFC_ISYM_NULL, GFC_STD_F95);
2214 add_sym_3 ("pack", GFC_ISYM_PACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2215 gfc_check_pack, gfc_simplify_pack, gfc_resolve_pack,
2216 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2217 v, BT_REAL, dr, OPTIONAL);
2219 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
2221 add_sym_1 ("precision", GFC_ISYM_PRECISION, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2222 gfc_check_precision, gfc_simplify_precision, NULL,
2223 x, BT_UNKNOWN, 0, REQUIRED);
2225 make_generic ("precision", GFC_ISYM_PRECISION, GFC_STD_F95);
2227 add_sym_1_intent ("present", GFC_ISYM_PRESENT, CLASS_INQUIRY, ACTUAL_NO,
2228 BT_LOGICAL, dl, GFC_STD_F95, gfc_check_present, NULL, NULL,
2229 a, BT_REAL, dr, REQUIRED, INTENT_UNKNOWN);
2231 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
2233 add_sym_3red ("product", GFC_ISYM_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2234 gfc_check_product_sum, gfc_simplify_product, gfc_resolve_product,
2235 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2236 msk, BT_LOGICAL, dl, OPTIONAL);
2238 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
2240 add_sym_1 ("radix", GFC_ISYM_RADIX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2241 gfc_check_radix, gfc_simplify_radix, NULL,
2242 x, BT_UNKNOWN, 0, REQUIRED);
2244 make_generic ("radix", GFC_ISYM_RADIX, GFC_STD_F95);
2246 /* The following function is for G77 compatibility. */
2247 add_sym_1 ("rand", GFC_ISYM_RAND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2248 gfc_check_rand, NULL, NULL,
2249 i, BT_INTEGER, 4, OPTIONAL);
2251 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
2252 use slightly different shoddy multiplicative congruential PRNG. */
2253 make_alias ("ran", GFC_STD_GNU);
2255 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
2257 add_sym_1 ("range", GFC_ISYM_RANGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2258 gfc_check_range, gfc_simplify_range, NULL,
2259 x, BT_REAL, dr, REQUIRED);
2261 make_generic ("range", GFC_ISYM_RANGE, GFC_STD_F95);
2263 add_sym_2 ("real", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2264 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
2265 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2267 /* This provides compatibility with g77. */
2268 add_sym_1 ("realpart", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2269 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
2270 a, BT_UNKNOWN, dr, REQUIRED);
2272 add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2273 gfc_check_i, gfc_simplify_float, NULL,
2274 a, BT_INTEGER, di, REQUIRED);
2276 add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2277 NULL, gfc_simplify_sngl, NULL,
2278 a, BT_REAL, dd, REQUIRED);
2280 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
2282 add_sym_2 ("rename", GFC_ISYM_RENAME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2283 GFC_STD_GNU, gfc_check_rename, NULL, gfc_resolve_rename,
2284 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2286 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
2288 add_sym_2 ("repeat", GFC_ISYM_REPEAT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2289 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
2290 stg, BT_CHARACTER, dc, REQUIRED, ncopies, BT_INTEGER, di, REQUIRED);
2292 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
2294 add_sym_4 ("reshape", GFC_ISYM_RESHAPE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2295 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
2296 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
2297 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
2299 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
2301 add_sym_1 ("rrspacing", GFC_ISYM_RRSPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2302 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
2303 x, BT_REAL, dr, REQUIRED);
2305 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
2307 add_sym_2 ("scale", GFC_ISYM_SCALE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2308 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
2309 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2311 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
2313 add_sym_4 ("scan", GFC_ISYM_SCAN, CLASS_ELEMENTAL, ACTUAL_NO,
2314 BT_INTEGER, di, GFC_STD_F95,
2315 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
2316 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2317 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2319 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
2321 /* Added for G77 compatibility garbage. */
2322 add_sym_0 ("second", GFC_ISYM_SECOND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2325 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
2327 /* Added for G77 compatibility. */
2328 add_sym_1 ("secnds", GFC_ISYM_SECNDS, NO_CLASS, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2329 gfc_check_secnds, NULL, gfc_resolve_secnds,
2330 x, BT_REAL, dr, REQUIRED);
2332 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
2334 add_sym_1 ("selected_char_kind", GFC_ISYM_SC_KIND, CLASS_TRANSFORMATIONAL,
2335 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003,
2336 gfc_check_selected_char_kind, gfc_simplify_selected_char_kind,
2337 NULL, nm, BT_CHARACTER, dc, REQUIRED);
2339 make_generic ("selected_char_kind", GFC_ISYM_SC_KIND, GFC_STD_F2003);
2341 add_sym_1 ("selected_int_kind", GFC_ISYM_SI_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2342 GFC_STD_F95, gfc_check_selected_int_kind,
2343 gfc_simplify_selected_int_kind, NULL, r, BT_INTEGER, di, REQUIRED);
2345 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
2347 add_sym_2 ("selected_real_kind", GFC_ISYM_SR_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2348 GFC_STD_F95, gfc_check_selected_real_kind,
2349 gfc_simplify_selected_real_kind, NULL,
2350 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
2352 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
2354 add_sym_2 ("set_exponent", GFC_ISYM_SET_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2355 gfc_check_set_exponent, gfc_simplify_set_exponent,
2356 gfc_resolve_set_exponent,
2357 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2359 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
2361 add_sym_1 ("shape", GFC_ISYM_SHAPE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2362 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
2363 src, BT_REAL, dr, REQUIRED);
2365 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
2367 add_sym_2 ("sign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2368 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
2369 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
2371 add_sym_2 ("isign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2372 NULL, gfc_simplify_sign, gfc_resolve_sign,
2373 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2375 add_sym_2 ("dsign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2376 gfc_check_x_yd, gfc_simplify_sign, gfc_resolve_sign,
2377 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2379 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2381 add_sym_2 ("signal", GFC_ISYM_SIGNAL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2382 gfc_check_signal, NULL, gfc_resolve_signal,
2383 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2385 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2387 add_sym_1 ("sin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2388 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2389 x, BT_REAL, dr, REQUIRED);
2391 add_sym_1 ("dsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2392 gfc_check_fn_d, gfc_simplify_sin, gfc_resolve_sin,
2393 x, BT_REAL, dd, REQUIRED);
2395 add_sym_1 ("csin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2396 NULL, gfc_simplify_sin, gfc_resolve_sin,
2397 x, BT_COMPLEX, dz, REQUIRED);
2399 add_sym_1 ("zsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2400 NULL, gfc_simplify_sin, gfc_resolve_sin,
2401 x, BT_COMPLEX, dd, REQUIRED);
2403 make_alias ("cdsin", GFC_STD_GNU);
2405 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2407 add_sym_1 ("sinh", GFC_ISYM_SINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2408 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
2409 x, BT_REAL, dr, REQUIRED);
2411 add_sym_1 ("dsinh", GFC_ISYM_SINH,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2412 gfc_check_fn_d, gfc_simplify_sinh, gfc_resolve_sinh,
2413 x, BT_REAL, dd, REQUIRED);
2415 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2417 add_sym_3 ("size", GFC_ISYM_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2418 BT_INTEGER, di, GFC_STD_F95,
2419 gfc_check_size, gfc_simplify_size, gfc_resolve_size,
2420 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2421 kind, BT_INTEGER, di, OPTIONAL);
2423 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2425 add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2426 GFC_STD_GNU, gfc_check_sizeof, NULL, NULL,
2427 x, BT_UNKNOWN, 0, REQUIRED);
2429 make_generic ("sizeof", GFC_ISYM_SIZEOF, GFC_STD_GNU);
2430 make_alias ("c_sizeof", GFC_STD_F2008);
2432 add_sym_1 ("spacing", GFC_ISYM_SPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2433 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2434 x, BT_REAL, dr, REQUIRED);
2436 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2438 add_sym_3 ("spread", GFC_ISYM_SPREAD, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2439 gfc_check_spread, gfc_simplify_spread, gfc_resolve_spread,
2440 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2441 ncopies, BT_INTEGER, di, REQUIRED);
2443 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2445 add_sym_1 ("sqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2446 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2447 x, BT_REAL, dr, REQUIRED);
2449 add_sym_1 ("dsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2450 gfc_check_fn_d, gfc_simplify_sqrt, gfc_resolve_sqrt,
2451 x, BT_REAL, dd, REQUIRED);
2453 add_sym_1 ("csqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2454 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2455 x, BT_COMPLEX, dz, REQUIRED);
2457 add_sym_1 ("zsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2458 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2459 x, BT_COMPLEX, dd, REQUIRED);
2461 make_alias ("cdsqrt", GFC_STD_GNU);
2463 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2465 add_sym_2 ("stat", GFC_ISYM_STAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2466 GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_stat,
2467 nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2469 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2471 add_sym_3red ("sum", GFC_ISYM_SUM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2472 gfc_check_product_sum, gfc_simplify_sum, gfc_resolve_sum,
2473 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2474 msk, BT_LOGICAL, dl, OPTIONAL);
2476 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2478 add_sym_2 ("symlnk", GFC_ISYM_SYMLNK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2479 GFC_STD_GNU, gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2480 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2482 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2484 add_sym_1 ("system", GFC_ISYM_SYSTEM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2485 GFC_STD_GNU, NULL, NULL, NULL,
2486 com, BT_CHARACTER, dc, REQUIRED);
2488 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2490 add_sym_1 ("tan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2491 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2492 x, BT_REAL, dr, REQUIRED);
2494 add_sym_1 ("dtan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2495 gfc_check_fn_d, gfc_simplify_tan, gfc_resolve_tan,
2496 x, BT_REAL, dd, REQUIRED);
2498 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2500 add_sym_1 ("tanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2501 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2502 x, BT_REAL, dr, REQUIRED);
2504 add_sym_1 ("dtanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2505 gfc_check_fn_d, gfc_simplify_tanh, gfc_resolve_tanh,
2506 x, BT_REAL, dd, REQUIRED);
2508 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2510 add_sym_0 ("time", GFC_ISYM_TIME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2511 NULL, NULL, gfc_resolve_time);
2513 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2515 add_sym_0 ("time8", GFC_ISYM_TIME8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2516 NULL, NULL, gfc_resolve_time8);
2518 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2520 add_sym_1 ("tiny", GFC_ISYM_TINY, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2521 gfc_check_x, gfc_simplify_tiny, NULL,
2522 x, BT_REAL, dr, REQUIRED);
2524 make_generic ("tiny", GFC_ISYM_TINY, GFC_STD_F95);
2526 add_sym_1 ("trailz", GFC_ISYM_TRAILZ, CLASS_ELEMENTAL, ACTUAL_NO,
2527 BT_INTEGER, di, GFC_STD_F2008,
2528 gfc_check_i, gfc_simplify_trailz, NULL,
2529 i, BT_INTEGER, di, REQUIRED);
2531 make_generic ("trailz", GFC_ISYM_TRAILZ, GFC_STD_F2008);
2533 add_sym_3 ("transfer", GFC_ISYM_TRANSFER, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2534 gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2535 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2536 sz, BT_INTEGER, di, OPTIONAL);
2538 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2540 add_sym_1 ("transpose", GFC_ISYM_TRANSPOSE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2541 gfc_check_transpose, gfc_simplify_transpose, gfc_resolve_transpose,
2542 m, BT_REAL, dr, REQUIRED);
2544 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2546 add_sym_1 ("trim", GFC_ISYM_TRIM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2547 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2548 stg, BT_CHARACTER, dc, REQUIRED);
2550 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2552 add_sym_1 ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
2553 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2554 ut, BT_INTEGER, di, REQUIRED);
2556 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2558 add_sym_3 ("ubound", GFC_ISYM_UBOUND, CLASS_INQUIRY, ACTUAL_NO,
2559 BT_INTEGER, di, GFC_STD_F95,
2560 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2561 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2562 kind, BT_INTEGER, di, OPTIONAL);
2564 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2566 /* g77 compatibility for UMASK. */
2567 add_sym_1 ("umask", GFC_ISYM_UMASK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2568 GFC_STD_GNU, gfc_check_umask, NULL, gfc_resolve_umask,
2569 msk, BT_INTEGER, di, REQUIRED);
2571 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2573 /* g77 compatibility for UNLINK. */
2574 add_sym_1 ("unlink", GFC_ISYM_UNLINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2575 gfc_check_unlink, NULL, gfc_resolve_unlink,
2576 "path", BT_CHARACTER, dc, REQUIRED);
2578 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2580 add_sym_3 ("unpack", GFC_ISYM_UNPACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2581 gfc_check_unpack, gfc_simplify_unpack, gfc_resolve_unpack,
2582 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2583 f, BT_REAL, dr, REQUIRED);
2585 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2587 add_sym_4 ("verify", GFC_ISYM_VERIFY, CLASS_ELEMENTAL, ACTUAL_NO,
2588 BT_INTEGER, di, GFC_STD_F95,
2589 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2590 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2591 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2593 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2595 add_sym_1 ("loc", GFC_ISYM_LOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2596 GFC_STD_GNU, gfc_check_loc, NULL, gfc_resolve_loc,
2597 x, BT_UNKNOWN, 0, REQUIRED);
2599 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2603 /* Add intrinsic subroutines. */
2606 add_subroutines (void)
2608 /* Argument names as in the standard (to be used as argument keywords). */
2610 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2611 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2612 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2613 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2614 *com = "command", *length = "length", *st = "status",
2615 *val = "value", *num = "number", *name = "name",
2616 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2617 *sec = "seconds", *res = "result", *of = "offset", *md = "mode",
2618 *whence = "whence", *pos = "pos", *ptr = "ptr", *p1 = "path1",
2619 *p2 = "path2", *msk = "mask", *old = "old";
2621 int di, dr, dc, dl, ii;
2623 di = gfc_default_integer_kind;
2624 dr = gfc_default_real_kind;
2625 dc = gfc_default_character_kind;
2626 dl = gfc_default_logical_kind;
2627 ii = gfc_index_integer_kind;
2629 add_sym_0s ("abort", GFC_ISYM_ABORT, GFC_STD_GNU, NULL);
2633 add_sym_1s_intent ("cpu_time", GFC_ISYM_CPU_TIME, NO_CLASS, BT_UNKNOWN, 0,
2634 GFC_STD_F95, gfc_check_cpu_time, NULL,
2635 gfc_resolve_cpu_time,
2636 tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
2638 /* More G77 compatibility garbage. */
2639 add_sym_2s ("ctime", GFC_ISYM_CTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2640 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2641 tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2643 add_sym_1s ("idate", GFC_ISYM_IDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2644 gfc_check_itime_idate, NULL, gfc_resolve_idate,
2645 vl, BT_INTEGER, 4, REQUIRED);
2647 add_sym_1s ("itime", GFC_ISYM_ITIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2648 gfc_check_itime_idate, NULL, gfc_resolve_itime,
2649 vl, BT_INTEGER, 4, REQUIRED);
2651 add_sym_2s ("ltime", GFC_ISYM_LTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2652 gfc_check_ltime_gmtime, NULL, gfc_resolve_ltime,
2653 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2655 add_sym_2s ("gmtime", GFC_ISYM_GMTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2656 gfc_check_ltime_gmtime, NULL, gfc_resolve_gmtime,
2657 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2659 add_sym_1s ("second", GFC_ISYM_SECOND, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2660 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2661 tm, BT_REAL, dr, REQUIRED);
2663 add_sym_2s ("chdir", GFC_ISYM_CHDIR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2664 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2665 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2667 add_sym_3s ("chmod", GFC_ISYM_CHMOD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2668 gfc_check_chmod_sub, NULL, gfc_resolve_chmod_sub,
2669 name, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED,
2670 st, BT_INTEGER, di, OPTIONAL);
2672 add_sym_4s ("date_and_time", GFC_ISYM_DATE_AND_TIME, NO_CLASS, BT_UNKNOWN, 0,
2673 GFC_STD_F95, gfc_check_date_and_time, NULL, NULL,
2674 dt, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2675 tm, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2676 zn, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2677 vl, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2679 /* More G77 compatibility garbage. */
2680 add_sym_2s ("etime", GFC_ISYM_ETIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2681 gfc_check_dtime_etime_sub, NULL, gfc_resolve_etime_sub,
2682 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2684 add_sym_2s ("dtime", GFC_ISYM_DTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2685 gfc_check_dtime_etime_sub, NULL, gfc_resolve_dtime_sub,
2686 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2688 add_sym_1s ("fdate", GFC_ISYM_FDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2689 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2690 dt, BT_CHARACTER, dc, REQUIRED);
2692 add_sym_1s ("gerror", GFC_ISYM_GERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2693 gfc_check_gerror, NULL, gfc_resolve_gerror, res, BT_CHARACTER,
2696 add_sym_2s ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2697 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2698 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2700 add_sym_2s ("getenv", GFC_ISYM_GETENV, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2702 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc,
2705 add_sym_2s ("getarg", GFC_ISYM_GETARG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2706 gfc_check_getarg, NULL, gfc_resolve_getarg,
2707 pos, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2709 add_sym_1s ("getlog", GFC_ISYM_GETLOG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2710 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2713 /* F2003 commandline routines. */
2715 add_sym_3s_intent ("get_command", GFC_ISYM_GET_COMMAND, NO_CLASS, BT_UNKNOWN,
2716 0, GFC_STD_F2003, NULL, NULL, gfc_resolve_get_command,
2717 com, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2718 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2719 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2721 add_sym_4s ("get_command_argument", GFC_ISYM_GET_COMMAND_ARGUMENT, NO_CLASS,
2722 BT_UNKNOWN, 0, GFC_STD_F2003, NULL, NULL,
2723 gfc_resolve_get_command_argument,
2724 num, BT_INTEGER, di, REQUIRED, INTENT_IN,
2725 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2726 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2727 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2729 /* F2003 subroutine to get environment variables. */
2731 add_sym_5s ("get_environment_variable", GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
2732 NO_CLASS, BT_UNKNOWN, 0, GFC_STD_F2003,
2733 NULL, NULL, gfc_resolve_get_environment_variable,
2734 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2735 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2736 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2737 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2738 trim_name, BT_LOGICAL, dl, OPTIONAL, INTENT_IN);
2740 add_sym_2s_intent ("move_alloc", GFC_ISYM_MOVE_ALLOC, NO_CLASS, BT_UNKNOWN, 0,
2741 GFC_STD_F2003, gfc_check_move_alloc, NULL, NULL,
2742 f, BT_UNKNOWN, 0, REQUIRED, INTENT_INOUT,
2743 t, BT_UNKNOWN, 0, REQUIRED, INTENT_OUT);
2745 add_sym_5s ("mvbits", GFC_ISYM_MVBITS, CLASS_ELEMENTAL, BT_UNKNOWN, 0,
2746 GFC_STD_F95, gfc_check_mvbits, gfc_simplify_mvbits,
2748 f, BT_INTEGER, di, REQUIRED, INTENT_IN,
2749 fp, BT_INTEGER, di, REQUIRED, INTENT_IN,
2750 ln, BT_INTEGER, di, REQUIRED, INTENT_IN,
2751 t, BT_INTEGER, di, REQUIRED, INTENT_INOUT,
2752 tp, BT_INTEGER, di, REQUIRED, INTENT_IN);
2754 add_sym_1s_intent ("random_number", GFC_ISYM_RANDOM_NUMBER, NO_CLASS,
2755 BT_UNKNOWN, 0, GFC_STD_F95, gfc_check_random_number, NULL,
2756 gfc_resolve_random_number,
2757 h, BT_REAL, dr, REQUIRED, INTENT_OUT);
2759 add_sym_3s_intent ("random_seed", GFC_ISYM_RANDOM_SEED, NO_CLASS,
2760 BT_UNKNOWN, 0, GFC_STD_F95,
2761 gfc_check_random_seed, NULL, gfc_resolve_random_seed,
2762 sz, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2763 pt, BT_INTEGER, di, OPTIONAL, INTENT_IN,
2764 gt, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2766 /* More G77 compatibility garbage. */
2767 add_sym_3s ("alarm", GFC_ISYM_ALARM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2768 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2769 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2770 st, BT_INTEGER, di, OPTIONAL);
2772 add_sym_1s ("srand", GFC_ISYM_SRAND, NO_CLASS, BT_UNKNOWN, di, GFC_STD_GNU,
2773 gfc_check_srand, NULL, gfc_resolve_srand,
2774 "seed", BT_INTEGER, 4, REQUIRED);
2776 add_sym_1s ("exit", GFC_ISYM_EXIT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2777 gfc_check_exit, NULL, gfc_resolve_exit,
2778 st, BT_INTEGER, di, OPTIONAL);
2782 add_sym_3s ("fgetc", GFC_ISYM_FGETC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2783 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2784 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2785 st, BT_INTEGER, di, OPTIONAL);
2787 add_sym_2s ("fget", GFC_ISYM_FGET, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2788 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2789 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2791 add_sym_1s ("flush", GFC_ISYM_FLUSH, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2792 gfc_check_flush, NULL, gfc_resolve_flush,
2793 ut, BT_INTEGER, di, OPTIONAL);
2795 add_sym_3s ("fputc", GFC_ISYM_FPUTC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2796 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2797 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2798 st, BT_INTEGER, di, OPTIONAL);
2800 add_sym_2s ("fput", GFC_ISYM_FPUT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2801 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2802 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2804 add_sym_1s ("free", GFC_ISYM_FREE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2805 gfc_check_free, NULL, gfc_resolve_free,
2806 ptr, BT_INTEGER, ii, REQUIRED);
2808 add_sym_4s ("fseek", GFC_ISYM_FSEEK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2809 gfc_check_fseek_sub, NULL, gfc_resolve_fseek_sub,
2810 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
2811 of, BT_INTEGER, di, REQUIRED, INTENT_IN,
2812 whence, BT_INTEGER, di, REQUIRED, INTENT_IN,
2813 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2815 add_sym_2s ("ftell", GFC_ISYM_FTELL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2816 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2817 ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2819 add_sym_2s ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2820 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2821 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2823 add_sym_3s ("kill", GFC_ISYM_KILL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2824 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2825 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2827 add_sym_3s ("link", GFC_ISYM_LINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2828 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2829 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2830 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2832 add_sym_1s ("perror", GFC_ISYM_PERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2833 gfc_check_perror, NULL, gfc_resolve_perror,
2834 "string", BT_CHARACTER, dc, REQUIRED);
2836 add_sym_3s ("rename", GFC_ISYM_RENAME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2837 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2838 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2839 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2841 add_sym_1s ("sleep", GFC_ISYM_SLEEP, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2842 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2843 sec, BT_INTEGER, di, REQUIRED);
2845 add_sym_3s ("fstat", GFC_ISYM_FSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2846 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2847 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2848 st, BT_INTEGER, di, OPTIONAL);
2850 add_sym_3s ("lstat", GFC_ISYM_LSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2851 gfc_check_stat_sub, NULL, gfc_resolve_lstat_sub,
2852 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2853 st, BT_INTEGER, di, OPTIONAL);
2855 add_sym_3s ("stat", GFC_ISYM_STAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2856 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2857 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2858 st, BT_INTEGER, di, OPTIONAL);
2860 add_sym_3s ("signal", GFC_ISYM_SIGNAL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2861 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2862 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2863 st, BT_INTEGER, di, OPTIONAL);
2865 add_sym_3s ("symlnk", GFC_ISYM_SYMLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2866 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2867 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2868 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2870 add_sym_2s ("system", GFC_ISYM_SYSTEM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2871 NULL, NULL, gfc_resolve_system_sub,
2872 com, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2874 add_sym_3s_intent ("system_clock", GFC_ISYM_SYSTEM_CLOCK, NO_CLASS,
2875 BT_UNKNOWN, 0, GFC_STD_F95,
2876 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2877 c, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2878 cr, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2879 cm, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2881 add_sym_2s ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2882 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2883 ut, BT_INTEGER, di, REQUIRED, name, BT_CHARACTER, dc, REQUIRED);
2885 add_sym_2s ("umask", GFC_ISYM_UMASK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2886 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2887 msk, BT_INTEGER, di, REQUIRED, old, BT_INTEGER, di, OPTIONAL);
2889 add_sym_2s ("unlink", GFC_ISYM_UNLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2890 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2891 "path", BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2895 /* Add a function to the list of conversion symbols. */
2898 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2900 gfc_typespec from, to;
2901 gfc_intrinsic_sym *sym;
2903 if (sizing == SZ_CONVS)
2909 gfc_clear_ts (&from);
2910 from.type = from_type;
2911 from.kind = from_kind;
2917 sym = conversion + nconv;
2919 sym->name = conv_name (&from, &to);
2920 sym->lib_name = sym->name;
2921 sym->simplify.cc = gfc_convert_constant;
2922 sym->standard = standard;
2924 sym->conversion = 1;
2926 sym->id = GFC_ISYM_CONVERSION;
2932 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2933 functions by looping over the kind tables. */
2936 add_conversions (void)
2940 /* Integer-Integer conversions. */
2941 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2942 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2947 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2948 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2951 /* Integer-Real/Complex conversions. */
2952 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2953 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2955 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2956 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2958 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2959 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2961 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2962 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2964 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2965 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2968 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2970 /* Hollerith-Integer conversions. */
2971 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2972 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2973 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2974 /* Hollerith-Real conversions. */
2975 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2976 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2977 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2978 /* Hollerith-Complex conversions. */
2979 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2980 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2981 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2983 /* Hollerith-Character conversions. */
2984 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2985 gfc_default_character_kind, GFC_STD_LEGACY);
2987 /* Hollerith-Logical conversions. */
2988 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2989 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2990 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2993 /* Real/Complex - Real/Complex conversions. */
2994 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2995 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2999 add_conv (BT_REAL, gfc_real_kinds[i].kind,
3000 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3002 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3003 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3006 add_conv (BT_REAL, gfc_real_kinds[i].kind,
3007 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3009 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3010 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3013 /* Logical/Logical kind conversion. */
3014 for (i = 0; gfc_logical_kinds[i].kind; i++)
3015 for (j = 0; gfc_logical_kinds[j].kind; j++)
3020 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
3021 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
3024 /* Integer-Logical and Logical-Integer conversions. */
3025 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3026 for (i=0; gfc_integer_kinds[i].kind; i++)
3027 for (j=0; gfc_logical_kinds[j].kind; j++)
3029 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3030 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
3031 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
3032 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3038 add_char_conversions (void)
3042 /* Count possible conversions. */
3043 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3044 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3048 /* Allocate memory. */
3049 char_conversions = XCNEWVEC (gfc_intrinsic_sym, ncharconv);
3051 /* Add the conversions themselves. */
3053 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3054 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3056 gfc_typespec from, to;
3061 gfc_clear_ts (&from);
3062 from.type = BT_CHARACTER;
3063 from.kind = gfc_character_kinds[i].kind;
3066 to.type = BT_CHARACTER;
3067 to.kind = gfc_character_kinds[j].kind;
3069 char_conversions[n].name = conv_name (&from, &to);
3070 char_conversions[n].lib_name = char_conversions[n].name;
3071 char_conversions[n].simplify.cc = gfc_convert_char_constant;
3072 char_conversions[n].standard = GFC_STD_F2003;
3073 char_conversions[n].elemental = 1;
3074 char_conversions[n].conversion = 0;
3075 char_conversions[n].ts = to;
3076 char_conversions[n].id = GFC_ISYM_CONVERSION;
3083 /* Initialize the table of intrinsics. */
3085 gfc_intrinsic_init_1 (void)
3089 nargs = nfunc = nsub = nconv = 0;
3091 /* Create a namespace to hold the resolved intrinsic symbols. */
3092 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
3101 functions = XCNEWVAR (struct gfc_intrinsic_sym,
3102 sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
3103 + sizeof (gfc_intrinsic_arg) * nargs);
3105 next_sym = functions;
3106 subroutines = functions + nfunc;
3108 conversion = XCNEWVEC (gfc_intrinsic_sym, nconv);
3110 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
3112 sizing = SZ_NOTHING;
3119 /* Character conversion intrinsics need to be treated separately. */
3120 add_char_conversions ();
3122 /* Set the pure flag. All intrinsic functions are pure, and
3123 intrinsic subroutines are pure if they are elemental. */
3125 for (i = 0; i < nfunc; i++)
3126 functions[i].pure = 1;
3128 for (i = 0; i < nsub; i++)
3129 subroutines[i].pure = subroutines[i].elemental;
3134 gfc_intrinsic_done_1 (void)
3136 gfc_free (functions);
3137 gfc_free (conversion);
3138 gfc_free (char_conversions);
3139 gfc_free_namespace (gfc_intrinsic_namespace);
3143 /******** Subroutines to check intrinsic interfaces ***********/
3145 /* Given a formal argument list, remove any NULL arguments that may
3146 have been left behind by a sort against some formal argument list. */
3149 remove_nullargs (gfc_actual_arglist **ap)
3151 gfc_actual_arglist *head, *tail, *next;
3155 for (head = *ap; head; head = next)
3159 if (head->expr == NULL && !head->label)
3162 gfc_free_actual_arglist (head);
3181 /* Given an actual arglist and a formal arglist, sort the actual
3182 arglist so that its arguments are in a one-to-one correspondence
3183 with the format arglist. Arguments that are not present are given
3184 a blank gfc_actual_arglist structure. If something is obviously
3185 wrong (say, a missing required argument) we abort sorting and
3189 sort_actual (const char *name, gfc_actual_arglist **ap,
3190 gfc_intrinsic_arg *formal, locus *where)
3192 gfc_actual_arglist *actual, *a;
3193 gfc_intrinsic_arg *f;
3195 remove_nullargs (ap);
3198 for (f = formal; f; f = f->next)
3204 if (f == NULL && a == NULL) /* No arguments */
3208 { /* Put the nonkeyword arguments in a 1:1 correspondence */
3214 if (a->name != NULL)
3226 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
3230 /* Associate the remaining actual arguments, all of which have
3231 to be keyword arguments. */
3232 for (; a; a = a->next)
3234 for (f = formal; f; f = f->next)
3235 if (strcmp (a->name, f->name) == 0)
3240 if (a->name[0] == '%')
3241 gfc_error ("The argument list functions %%VAL, %%LOC or %%REF "
3242 "are not allowed in this context at %L", where);
3244 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
3245 a->name, name, where);
3249 if (f->actual != NULL)
3251 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
3252 f->name, name, where);
3260 /* At this point, all unmatched formal args must be optional. */
3261 for (f = formal; f; f = f->next)
3263 if (f->actual == NULL && f->optional == 0)
3265 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
3266 f->name, name, where);
3272 /* Using the formal argument list, string the actual argument list
3273 together in a way that corresponds with the formal list. */
3276 for (f = formal; f; f = f->next)
3278 if (f->actual && f->actual->label != NULL && f->ts.type)
3280 gfc_error ("ALTERNATE RETURN not permitted at %L", where);
3284 if (f->actual == NULL)
3286 a = gfc_get_actual_arglist ();
3287 a->missing_arg_type = f->ts.type;
3299 actual->next = NULL; /* End the sorted argument list. */
3305 /* Compare an actual argument list with an intrinsic's formal argument
3306 list. The lists are checked for agreement of type. We don't check
3307 for arrayness here. */
3310 check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym,
3313 gfc_actual_arglist *actual;
3314 gfc_intrinsic_arg *formal;
3317 formal = sym->formal;
3321 for (; formal; formal = formal->next, actual = actual->next, i++)
3325 if (actual->expr == NULL)
3330 /* A kind of 0 means we don't check for kind. */
3332 ts.kind = actual->expr->ts.kind;
3334 if (!gfc_compare_types (&ts, &actual->expr->ts))
3337 gfc_error ("Type of argument '%s' in call to '%s' at %L should "
3338 "be %s, not %s", gfc_current_intrinsic_arg[i],
3339 gfc_current_intrinsic, &actual->expr->where,
3340 gfc_typename (&formal->ts),
3341 gfc_typename (&actual->expr->ts));
3350 /* Given a pointer to an intrinsic symbol and an expression node that
3351 represent the function call to that subroutine, figure out the type
3352 of the result. This may involve calling a resolution subroutine. */
3355 resolve_intrinsic (gfc_intrinsic_sym *specific, gfc_expr *e)
3357 gfc_expr *a1, *a2, *a3, *a4, *a5;
3358 gfc_actual_arglist *arg;
3360 if (specific->resolve.f1 == NULL)
3362 if (e->value.function.name == NULL)
3363 e->value.function.name = specific->lib_name;
3365 if (e->ts.type == BT_UNKNOWN)
3366 e->ts = specific->ts;
3370 arg = e->value.function.actual;
3372 /* Special case hacks for MIN and MAX. */
3373 if (specific->resolve.f1m == gfc_resolve_max
3374 || specific->resolve.f1m == gfc_resolve_min)
3376 (*specific->resolve.f1m) (e, arg);
3382 (*specific->resolve.f0) (e);
3391 (*specific->resolve.f1) (e, a1);
3400 (*specific->resolve.f2) (e, a1, a2);
3409 (*specific->resolve.f3) (e, a1, a2, a3);
3418 (*specific->resolve.f4) (e, a1, a2, a3, a4);
3427 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
3431 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
3435 /* Given an intrinsic symbol node and an expression node, call the
3436 simplification function (if there is one), perhaps replacing the
3437 expression with something simpler. We return FAILURE on an error
3438 of the simplification, SUCCESS if the simplification worked, even
3439 if nothing has changed in the expression itself. */
3442 do_simplify (gfc_intrinsic_sym *specific, gfc_expr *e)
3444 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
3445 gfc_actual_arglist *arg;
3447 /* Max and min require special handling due to the variable number
3449 if (specific->simplify.f1 == gfc_simplify_min)
3451 result = gfc_simplify_min (e);
3455 if (specific->simplify.f1 == gfc_simplify_max)
3457 result = gfc_simplify_max (e);
3461 if (specific->simplify.f1 == NULL)
3467 arg = e->value.function.actual;
3471 result = (*specific->simplify.f0) ();
3478 if (specific->simplify.cc == gfc_convert_constant
3479 || specific->simplify.cc == gfc_convert_char_constant)
3481 result = specific->simplify.cc (a1, specific->ts.type, specific->ts.kind);
3486 result = (*specific->simplify.f1) (a1);
3493 result = (*specific->simplify.f2) (a1, a2);
3500 result = (*specific->simplify.f3) (a1, a2, a3);
3507 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3514 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3517 ("do_simplify(): Too many args for intrinsic");
3524 if (result == &gfc_bad_expr)
3528 resolve_intrinsic (specific, e); /* Must call at run-time */
3531 result->where = e->where;
3532 gfc_replace_expr (e, result);
3539 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3540 error messages. This subroutine returns FAILURE if a subroutine
3541 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3542 list cannot match any intrinsic. */
3545 init_arglist (gfc_intrinsic_sym *isym)
3547 gfc_intrinsic_arg *formal;
3550 gfc_current_intrinsic = isym->name;
3553 for (formal = isym->formal; formal; formal = formal->next)
3555 if (i >= MAX_INTRINSIC_ARGS)
3556 gfc_internal_error ("init_arglist(): too many arguments");
3557 gfc_current_intrinsic_arg[i++] = formal->name;
3562 /* Given a pointer to an intrinsic symbol and an expression consisting
3563 of a function call, see if the function call is consistent with the
3564 intrinsic's formal argument list. Return SUCCESS if the expression
3565 and intrinsic match, FAILURE otherwise. */
3568 check_specific (gfc_intrinsic_sym *specific, gfc_expr *expr, int error_flag)
3570 gfc_actual_arglist *arg, **ap;
3573 ap = &expr->value.function.actual;
3575 init_arglist (specific);
3577 /* Don't attempt to sort the argument list for min or max. */
3578 if (specific->check.f1m == gfc_check_min_max
3579 || specific->check.f1m == gfc_check_min_max_integer
3580 || specific->check.f1m == gfc_check_min_max_real
3581 || specific->check.f1m == gfc_check_min_max_double)
3582 return (*specific->check.f1m) (*ap);
3584 if (sort_actual (specific->name, ap, specific->formal,
3585 &expr->where) == FAILURE)
3588 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3589 /* This is special because we might have to reorder the argument list. */
3590 t = gfc_check_minloc_maxloc (*ap);
3591 else if (specific->check.f3red == gfc_check_minval_maxval)
3592 /* This is also special because we also might have to reorder the
3594 t = gfc_check_minval_maxval (*ap);
3595 else if (specific->check.f3red == gfc_check_product_sum)
3596 /* Same here. The difference to the previous case is that we allow a
3597 general numeric type. */
3598 t = gfc_check_product_sum (*ap);
3601 if (specific->check.f1 == NULL)
3603 t = check_arglist (ap, specific, error_flag);
3605 expr->ts = specific->ts;
3608 t = do_check (specific, *ap);
3611 /* Check conformance of elemental intrinsics. */
3612 if (t == SUCCESS && specific->elemental)
3615 gfc_expr *first_expr;
3616 arg = expr->value.function.actual;
3618 /* There is no elemental intrinsic without arguments. */
3619 gcc_assert(arg != NULL);
3620 first_expr = arg->expr;
3622 for ( ; arg && arg->expr; arg = arg->next, n++)
3623 if (gfc_check_conformance (first_expr, arg->expr,
3624 "arguments '%s' and '%s' for "
3626 gfc_current_intrinsic_arg[0],
3627 gfc_current_intrinsic_arg[n],
3628 gfc_current_intrinsic) == FAILURE)
3633 remove_nullargs (ap);
3639 /* Check whether an intrinsic belongs to whatever standard the user
3640 has chosen, taking also into account -fall-intrinsics. Here, no
3641 warning/error is emitted; but if symstd is not NULL, it is pointed to a
3642 textual representation of the symbols standard status (like
3643 "new in Fortran 2008", "a GNU extension" or "obsolescent in Fortran 95") that
3644 can be used to construct a detailed warning/error message in case of
3648 gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym,
3649 const char** symstd, bool silent, locus where)
3651 const char* symstd_msg;
3653 /* For -fall-intrinsics, just succeed. */
3654 if (gfc_option.flag_all_intrinsics)
3657 /* Find the symbol's standard message for later usage. */
3658 switch (isym->standard)
3661 symstd_msg = "available since Fortran 77";
3664 case GFC_STD_F95_OBS:
3665 symstd_msg = "obsolescent in Fortran 95";
3668 case GFC_STD_F95_DEL:
3669 symstd_msg = "deleted in Fortran 95";
3673 symstd_msg = "new in Fortran 95";
3677 symstd_msg = "new in Fortran 2003";
3681 symstd_msg = "new in Fortran 2008";
3685 symstd_msg = "a GNU Fortran extension";
3688 case GFC_STD_LEGACY:
3689 symstd_msg = "for backward compatibility";
3693 gfc_internal_error ("Invalid standard code on intrinsic '%s' (%d)",
3694 isym->name, isym->standard);
3697 /* If warning about the standard, warn and succeed. */
3698 if (gfc_option.warn_std & isym->standard)
3700 /* Do only print a warning if not a GNU extension. */
3701 if (!silent && isym->standard != GFC_STD_GNU)
3702 gfc_warning ("Intrinsic '%s' (is %s) is used at %L",
3703 isym->name, _(symstd_msg), &where);
3708 /* If allowing the symbol's standard, succeed, too. */
3709 if (gfc_option.allow_std & isym->standard)
3712 /* Otherwise, fail. */
3714 *symstd = _(symstd_msg);
3719 /* See if a function call corresponds to an intrinsic function call.
3722 MATCH_YES if the call corresponds to an intrinsic, simplification
3723 is done if possible.
3725 MATCH_NO if the call does not correspond to an intrinsic
3727 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3728 error during the simplification process.
3730 The error_flag parameter enables an error reporting. */
3733 gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag)
3735 gfc_intrinsic_sym *isym, *specific;
3736 gfc_actual_arglist *actual;
3740 if (expr->value.function.isym != NULL)
3741 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3742 ? MATCH_ERROR : MATCH_YES;
3745 gfc_push_suppress_errors ();
3748 for (actual = expr->value.function.actual; actual; actual = actual->next)
3749 if (actual->expr != NULL)
3750 flag |= (actual->expr->ts.type != BT_INTEGER
3751 && actual->expr->ts.type != BT_CHARACTER);
3753 name = expr->symtree->n.sym->name;
3755 isym = specific = gfc_find_function (name);
3759 gfc_pop_suppress_errors ();
3763 if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
3764 || isym->id == GFC_ISYM_CMPLX)
3766 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
3767 "as initialization expression at %L", name,
3768 &expr->where) == FAILURE)
3771 gfc_pop_suppress_errors ();
3775 gfc_current_intrinsic_where = &expr->where;
3777 /* Bypass the generic list for min and max. */
3778 if (isym->check.f1m == gfc_check_min_max)
3780 init_arglist (isym);
3782 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3786 gfc_pop_suppress_errors ();
3790 /* If the function is generic, check all of its specific
3791 incarnations. If the generic name is also a specific, we check
3792 that name last, so that any error message will correspond to the
3794 gfc_push_suppress_errors ();
3798 for (specific = isym->specific_head; specific;
3799 specific = specific->next)
3801 if (specific == isym)
3803 if (check_specific (specific, expr, 0) == SUCCESS)
3805 gfc_pop_suppress_errors ();
3811 gfc_pop_suppress_errors ();
3813 if (check_specific (isym, expr, error_flag) == FAILURE)
3816 gfc_pop_suppress_errors ();
3823 expr->value.function.isym = specific;
3824 gfc_intrinsic_symbol (expr->symtree->n.sym);
3827 gfc_pop_suppress_errors ();
3829 if (do_simplify (specific, expr) == FAILURE)
3832 /* F95, 7.1.6.1, Initialization expressions
3833 (4) An elemental intrinsic function reference of type integer or
3834 character where each argument is an initialization expression
3835 of type integer or character
3837 F2003, 7.1.7 Initialization expression
3838 (4) A reference to an elemental standard intrinsic function,
3839 where each argument is an initialization expression */
3841 if (gfc_init_expr && isym->elemental && flag
3842 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Elemental function "
3843 "as initialization expression with non-integer/non-"
3844 "character arguments at %L", &expr->where) == FAILURE)
3851 /* See if a CALL statement corresponds to an intrinsic subroutine.
3852 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3853 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3857 gfc_intrinsic_sub_interface (gfc_code *c, int error_flag)
3859 gfc_intrinsic_sym *isym;
3862 name = c->symtree->n.sym->name;
3864 isym = gfc_find_subroutine (name);
3869 gfc_push_suppress_errors ();
3871 init_arglist (isym);
3873 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3876 if (isym->check.f1 != NULL)
3878 if (do_check (isym, c->ext.actual) == FAILURE)
3883 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3887 /* The subroutine corresponds to an intrinsic. Allow errors to be
3888 seen at this point. */
3890 gfc_pop_suppress_errors ();
3892 c->resolved_isym = isym;
3893 if (isym->resolve.s1 != NULL)
3894 isym->resolve.s1 (c);
3897 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3898 c->resolved_sym->attr.elemental = isym->elemental;
3901 if (gfc_pure (NULL) && !isym->elemental)
3903 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3908 c->resolved_sym->attr.noreturn = isym->noreturn;
3914 gfc_pop_suppress_errors ();
3919 /* Call gfc_convert_type() with warning enabled. */
3922 gfc_convert_type (gfc_expr *expr, gfc_typespec *ts, int eflag)
3924 return gfc_convert_type_warn (expr, ts, eflag, 1);
3928 /* Try to convert an expression (in place) from one type to another.
3929 'eflag' controls the behavior on error.
3931 The possible values are:
3933 1 Generate a gfc_error()
3934 2 Generate a gfc_internal_error().
3936 'wflag' controls the warning related to conversion. */
3939 gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
3941 gfc_intrinsic_sym *sym;
3942 gfc_typespec from_ts;
3948 from_ts = expr->ts; /* expr->ts gets clobbered */
3950 if (ts->type == BT_UNKNOWN)
3953 /* NULL and zero size arrays get their type here. */
3954 if (expr->expr_type == EXPR_NULL
3955 || (expr->expr_type == EXPR_ARRAY && expr->value.constructor == NULL))
3957 /* Sometimes the RHS acquire the type. */
3962 if (expr->ts.type == BT_UNKNOWN)
3965 if (expr->ts.type == BT_DERIVED && ts->type == BT_DERIVED
3966 && gfc_compare_types (&expr->ts, ts))
3969 sym = find_conv (&expr->ts, ts);
3973 /* At this point, a conversion is necessary. A warning may be needed. */
3974 if ((gfc_option.warn_std & sym->standard) != 0)
3975 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3976 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3977 else if (wflag && gfc_option.warn_conversion)
3978 gfc_warning_now ("Conversion from %s to %s at %L",
3979 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3981 /* Insert a pre-resolved function call to the right function. */
3982 old_where = expr->where;
3984 shape = expr->shape;
3986 new_expr = gfc_get_expr ();
3989 new_expr = gfc_build_conversion (new_expr);
3990 new_expr->value.function.name = sym->lib_name;
3991 new_expr->value.function.isym = sym;
3992 new_expr->where = old_where;
3993 new_expr->rank = rank;
3994 new_expr->shape = gfc_copy_shape (shape, rank);
3996 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
3997 new_expr->symtree->n.sym->result = new_expr->symtree->n.sym;
3998 new_expr->symtree->n.sym->ts = *ts;
3999 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4000 new_expr->symtree->n.sym->attr.function = 1;
4001 new_expr->symtree->n.sym->attr.elemental = 1;
4002 new_expr->symtree->n.sym->attr.pure = 1;
4003 new_expr->symtree->n.sym->attr.referenced = 1;
4004 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4005 gfc_commit_symbol (new_expr->symtree->n.sym);
4009 gfc_free (new_expr);
4012 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4013 && do_simplify (sym, expr) == FAILURE)
4018 return FAILURE; /* Error already generated in do_simplify() */
4026 gfc_error ("Can't convert %s to %s at %L",
4027 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
4031 gfc_internal_error ("Can't convert %s to %s at %L",
4032 gfc_typename (&from_ts), gfc_typename (ts),
4039 gfc_convert_chartype (gfc_expr *expr, gfc_typespec *ts)
4041 gfc_intrinsic_sym *sym;
4042 gfc_typespec from_ts;
4048 gcc_assert (expr->ts.type == BT_CHARACTER && ts->type == BT_CHARACTER);
4049 from_ts = expr->ts; /* expr->ts gets clobbered */
4051 sym = find_char_conv (&expr->ts, ts);
4054 /* Insert a pre-resolved function call to the right function. */
4055 old_where = expr->where;
4057 shape = expr->shape;
4059 new_expr = gfc_get_expr ();
4062 new_expr = gfc_build_conversion (new_expr);
4063 new_expr->value.function.name = sym->lib_name;
4064 new_expr->value.function.isym = sym;
4065 new_expr->where = old_where;
4066 new_expr->rank = rank;
4067 new_expr->shape = gfc_copy_shape (shape, rank);
4069 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4070 new_expr->symtree->n.sym->ts = *ts;
4071 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4072 new_expr->symtree->n.sym->attr.function = 1;
4073 new_expr->symtree->n.sym->attr.elemental = 1;
4074 new_expr->symtree->n.sym->attr.referenced = 1;
4075 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4076 gfc_commit_symbol (new_expr->symtree->n.sym);
4080 gfc_free (new_expr);
4083 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4084 && do_simplify (sym, expr) == FAILURE)
4086 /* Error already generated in do_simplify() */
4094 /* Check if the passed name is name of an intrinsic (taking into account the
4095 current -std=* and -fall-intrinsic settings). If it is, see if we should
4096 warn about this as a user-procedure having the same name as an intrinsic
4097 (-Wintrinsic-shadow enabled) and do so if we should. */
4100 gfc_warn_intrinsic_shadow (const gfc_symbol* sym, bool in_module, bool func)
4102 gfc_intrinsic_sym* isym;
4104 /* If the warning is disabled, do nothing at all. */
4105 if (!gfc_option.warn_intrinsic_shadow)
4108 /* Try to find an intrinsic of the same name. */
4110 isym = gfc_find_function (sym->name);
4112 isym = gfc_find_subroutine (sym->name);
4114 /* If no intrinsic was found with this name or it's not included in the
4115 selected standard, everything's fine. */
4116 if (!isym || gfc_check_intrinsic_standard (isym, NULL, true,
4117 sym->declared_at) == FAILURE)
4120 /* Emit the warning. */
4122 gfc_warning ("'%s' declared at %L may shadow the intrinsic of the same"
4123 " name. In order to call the intrinsic, explicit INTRINSIC"
4124 " declarations may be required.",
4125 sym->name, &sym->declared_at);
4127 gfc_warning ("'%s' declared at %L is also the name of an intrinsic. It can"
4128 " only be called via an explicit interface or if declared"
4129 " EXTERNAL.", sym->name, &sym->declared_at);