1 /* Build up a list of intrinsic subroutines and functions for the
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5 Free Software Foundation, Inc.
6 Contributed by Andy Vaught & Katherine Holcomb
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
28 #include "intrinsic.h"
30 /* Namespace to hold the resolved symbols for intrinsic subroutines. */
31 static gfc_namespace *gfc_intrinsic_namespace;
33 bool gfc_init_expr_flag = false;
35 /* Pointers to an intrinsic function and its argument names that are being
38 const char *gfc_current_intrinsic;
39 gfc_intrinsic_arg *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
40 locus *gfc_current_intrinsic_where;
42 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
43 static gfc_intrinsic_sym *char_conversions;
44 static gfc_intrinsic_arg *next_arg;
46 static int nfunc, nsub, nargs, nconv, ncharconv;
49 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
53 { CLASS_IMPURE = 0, CLASS_PURE, CLASS_ELEMENTAL,
54 CLASS_INQUIRY, CLASS_TRANSFORMATIONAL };
63 /* Return a letter based on the passed type. Used to construct the
64 name of a type-dependent subroutine. */
67 gfc_type_letter (bt type)
102 /* Get a symbol for a resolved name. Note, if needed be, the elemental
103 attribute has be added afterwards. */
106 gfc_get_intrinsic_sub_symbol (const char *name)
110 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
111 sym->attr.always_explicit = 1;
112 sym->attr.subroutine = 1;
113 sym->attr.flavor = FL_PROCEDURE;
114 sym->attr.proc = PROC_INTRINSIC;
116 gfc_commit_symbol (sym);
122 /* Return a pointer to the name of a conversion function given two
126 conv_name (gfc_typespec *from, gfc_typespec *to)
128 return gfc_get_string ("__convert_%c%d_%c%d",
129 gfc_type_letter (from->type), from->kind,
130 gfc_type_letter (to->type), to->kind);
134 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
135 corresponds to the conversion. Returns NULL if the conversion
138 static gfc_intrinsic_sym *
139 find_conv (gfc_typespec *from, gfc_typespec *to)
141 gfc_intrinsic_sym *sym;
145 target = conv_name (from, to);
148 for (i = 0; i < nconv; i++, sym++)
149 if (target == sym->name)
156 /* Given a pair of CHARACTER typespecs, find the gfc_intrinsic_sym node
157 that corresponds to the conversion. Returns NULL if the conversion
160 static gfc_intrinsic_sym *
161 find_char_conv (gfc_typespec *from, gfc_typespec *to)
163 gfc_intrinsic_sym *sym;
167 target = conv_name (from, to);
168 sym = char_conversions;
170 for (i = 0; i < ncharconv; i++, sym++)
171 if (target == sym->name)
178 /* Interface to the check functions. We break apart an argument list
179 and call the proper check function rather than forcing each
180 function to manipulate the argument list. */
183 do_check (gfc_intrinsic_sym *specific, gfc_actual_arglist *arg)
185 gfc_expr *a1, *a2, *a3, *a4, *a5;
188 return (*specific->check.f0) ();
193 return (*specific->check.f1) (a1);
198 return (*specific->check.f2) (a1, a2);
203 return (*specific->check.f3) (a1, a2, a3);
208 return (*specific->check.f4) (a1, a2, a3, a4);
213 return (*specific->check.f5) (a1, a2, a3, a4, a5);
215 gfc_internal_error ("do_check(): too many args");
219 /*********** Subroutines to build the intrinsic list ****************/
221 /* Add a single intrinsic symbol to the current list.
224 char * name of function
225 int whether function is elemental
226 int If the function can be used as an actual argument [1]
227 bt return type of function
228 int kind of return type of function
229 int Fortran standard version
230 check pointer to check function
231 simplify pointer to simplification function
232 resolve pointer to resolution function
234 Optional arguments come in multiples of five:
235 char * name of argument
238 int arg optional flag (1=optional, 0=required)
239 sym_intent intent of argument
241 The sequence is terminated by a NULL name.
244 [1] Whether a function can or cannot be used as an actual argument is
245 determined by its presence on the 13.6 list in Fortran 2003. The
246 following intrinsics, which are GNU extensions, are considered allowed
247 as actual arguments: ACOSH ATANH DACOSH DASINH DATANH DCONJG DIMAG
248 ZABS ZCOS ZEXP ZLOG ZSIN ZSQRT. */
251 add_sym (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type, int kind,
252 int standard, gfc_check_f check, gfc_simplify_f simplify,
253 gfc_resolve_f resolve, ...)
255 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
256 int optional, first_flag;
271 next_sym->name = gfc_get_string (name);
273 strcpy (buf, "_gfortran_");
275 next_sym->lib_name = gfc_get_string (buf);
277 next_sym->pure = (cl != CLASS_IMPURE);
278 next_sym->elemental = (cl == CLASS_ELEMENTAL);
279 next_sym->inquiry = (cl == CLASS_INQUIRY);
280 next_sym->transformational = (cl == CLASS_TRANSFORMATIONAL);
281 next_sym->actual_ok = actual_ok;
282 next_sym->ts.type = type;
283 next_sym->ts.kind = kind;
284 next_sym->standard = standard;
285 next_sym->simplify = simplify;
286 next_sym->check = check;
287 next_sym->resolve = resolve;
288 next_sym->specific = 0;
289 next_sym->generic = 0;
290 next_sym->conversion = 0;
295 gfc_internal_error ("add_sym(): Bad sizing mode");
298 va_start (argp, resolve);
304 name = va_arg (argp, char *);
308 type = (bt) va_arg (argp, int);
309 kind = va_arg (argp, int);
310 optional = va_arg (argp, int);
311 intent = (sym_intent) va_arg (argp, int);
313 if (sizing != SZ_NOTHING)
320 next_sym->formal = next_arg;
322 (next_arg - 1)->next = next_arg;
326 strcpy (next_arg->name, name);
327 next_arg->ts.type = type;
328 next_arg->ts.kind = kind;
329 next_arg->optional = optional;
331 next_arg->intent = intent;
341 /* Add a symbol to the function list where the function takes
345 add_sym_0 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
346 int kind, int standard,
347 gfc_try (*check) (void),
348 gfc_expr *(*simplify) (void),
349 void (*resolve) (gfc_expr *))
359 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
364 /* Add a symbol to the subroutine list where the subroutine takes
368 add_sym_0s (const char *name, gfc_isym_id id, int standard,
369 void (*resolve) (gfc_code *))
379 add_sym (name, id, CLASS_IMPURE, ACTUAL_NO, BT_UNKNOWN, 0, standard, cf, sf,
384 /* Add a symbol to the function list where the function takes
388 add_sym_1 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
389 int kind, int standard,
390 gfc_try (*check) (gfc_expr *),
391 gfc_expr *(*simplify) (gfc_expr *),
392 void (*resolve) (gfc_expr *, gfc_expr *),
393 const char *a1, bt type1, int kind1, int optional1)
403 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
404 a1, type1, kind1, optional1, INTENT_IN,
409 /* Add a symbol to the function list where the function takes
410 1 arguments, specifying the intent of the argument. */
413 add_sym_1_intent (const char *name, gfc_isym_id id, enum klass cl,
414 int actual_ok, bt type, int kind, int standard,
415 gfc_try (*check) (gfc_expr *),
416 gfc_expr *(*simplify) (gfc_expr *),
417 void (*resolve) (gfc_expr *, gfc_expr *),
418 const char *a1, bt type1, int kind1, int optional1,
429 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
430 a1, type1, kind1, optional1, intent1,
435 /* Add a symbol to the subroutine list where the subroutine takes
436 1 arguments, specifying the intent of the argument. */
439 add_sym_1s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
440 int standard, gfc_try (*check) (gfc_expr *),
441 gfc_expr *(*simplify) (gfc_expr *), void (*resolve) (gfc_code *),
442 const char *a1, bt type1, int kind1, int optional1,
453 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
454 a1, type1, kind1, optional1, intent1,
459 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
460 function. MAX et al take 2 or more arguments. */
463 add_sym_1m (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
464 int kind, int standard,
465 gfc_try (*check) (gfc_actual_arglist *),
466 gfc_expr *(*simplify) (gfc_expr *),
467 void (*resolve) (gfc_expr *, gfc_actual_arglist *),
468 const char *a1, bt type1, int kind1, int optional1,
469 const char *a2, bt type2, int kind2, int optional2)
479 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
480 a1, type1, kind1, optional1, INTENT_IN,
481 a2, type2, kind2, optional2, INTENT_IN,
486 /* Add a symbol to the function list where the function takes
490 add_sym_2 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
491 int kind, int standard,
492 gfc_try (*check) (gfc_expr *, gfc_expr *),
493 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
494 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *),
495 const char *a1, bt type1, int kind1, int optional1,
496 const char *a2, bt type2, int kind2, int optional2)
506 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
507 a1, type1, kind1, optional1, INTENT_IN,
508 a2, type2, kind2, optional2, INTENT_IN,
513 /* Add a symbol to the function list where the function takes
514 2 arguments; same as add_sym_2 - but allows to specify the intent. */
517 add_sym_2_intent (const char *name, gfc_isym_id id, enum klass cl,
518 int actual_ok, bt type, int kind, int standard,
519 gfc_try (*check) (gfc_expr *, gfc_expr *),
520 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
521 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *),
522 const char *a1, bt type1, int kind1, int optional1,
523 sym_intent intent1, const char *a2, bt type2, int kind2,
524 int optional2, sym_intent intent2)
534 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
535 a1, type1, kind1, optional1, intent1,
536 a2, type2, kind2, optional2, intent2,
541 /* Add a symbol to the subroutine list where the subroutine takes
542 2 arguments, specifying the intent of the arguments. */
545 add_sym_2s (const char *name, gfc_isym_id id, enum klass cl, bt type,
546 int kind, int standard,
547 gfc_try (*check) (gfc_expr *, gfc_expr *),
548 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
549 void (*resolve) (gfc_code *),
550 const char *a1, bt type1, int kind1, int optional1,
551 sym_intent intent1, const char *a2, bt type2, int kind2,
552 int optional2, sym_intent intent2)
562 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
563 a1, type1, kind1, optional1, intent1,
564 a2, type2, kind2, optional2, intent2,
569 /* Add a symbol to the function list where the function takes
573 add_sym_3 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
574 int kind, int standard,
575 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
576 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
577 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
578 const char *a1, bt type1, int kind1, int optional1,
579 const char *a2, bt type2, int kind2, int optional2,
580 const char *a3, bt type3, int kind3, int optional3)
590 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
591 a1, type1, kind1, optional1, INTENT_IN,
592 a2, type2, kind2, optional2, INTENT_IN,
593 a3, type3, kind3, optional3, INTENT_IN,
598 /* MINLOC and MAXLOC get special treatment because their argument
599 might have to be reordered. */
602 add_sym_3ml (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
603 int kind, int standard,
604 gfc_try (*check) (gfc_actual_arglist *),
605 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
606 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
607 const char *a1, bt type1, int kind1, int optional1,
608 const char *a2, bt type2, int kind2, int optional2,
609 const char *a3, bt type3, int kind3, int optional3)
619 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
620 a1, type1, kind1, optional1, INTENT_IN,
621 a2, type2, kind2, optional2, INTENT_IN,
622 a3, type3, kind3, optional3, INTENT_IN,
627 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
628 their argument also might have to be reordered. */
631 add_sym_3red (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
632 int kind, int standard,
633 gfc_try (*check) (gfc_actual_arglist *),
634 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
635 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
636 const char *a1, bt type1, int kind1, int optional1,
637 const char *a2, bt type2, int kind2, int optional2,
638 const char *a3, bt type3, int kind3, int optional3)
648 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
649 a1, type1, kind1, optional1, INTENT_IN,
650 a2, type2, kind2, optional2, INTENT_IN,
651 a3, type3, kind3, optional3, INTENT_IN,
656 /* Add a symbol to the subroutine list where the subroutine takes
657 3 arguments, specifying the intent of the arguments. */
660 add_sym_3s (const char *name, gfc_isym_id id, enum klass cl, bt type,
661 int kind, int standard,
662 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
663 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
664 void (*resolve) (gfc_code *),
665 const char *a1, bt type1, int kind1, int optional1,
666 sym_intent intent1, const char *a2, bt type2, int kind2,
667 int optional2, sym_intent intent2, const char *a3, bt type3,
668 int kind3, int optional3, sym_intent intent3)
678 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
679 a1, type1, kind1, optional1, intent1,
680 a2, type2, kind2, optional2, intent2,
681 a3, type3, kind3, optional3, intent3,
686 /* Add a symbol to the function list where the function takes
690 add_sym_4 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
691 int kind, int standard,
692 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
693 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
695 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
697 const char *a1, bt type1, int kind1, int optional1,
698 const char *a2, bt type2, int kind2, int optional2,
699 const char *a3, bt type3, int kind3, int optional3,
700 const char *a4, bt type4, int kind4, int optional4 )
710 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
711 a1, type1, kind1, optional1, INTENT_IN,
712 a2, type2, kind2, optional2, INTENT_IN,
713 a3, type3, kind3, optional3, INTENT_IN,
714 a4, type4, kind4, optional4, INTENT_IN,
719 /* Add a symbol to the subroutine list where the subroutine takes
723 add_sym_4s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
725 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
726 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
728 void (*resolve) (gfc_code *),
729 const char *a1, bt type1, int kind1, int optional1,
730 sym_intent intent1, const char *a2, bt type2, int kind2,
731 int optional2, sym_intent intent2, const char *a3, bt type3,
732 int kind3, int optional3, sym_intent intent3, const char *a4,
733 bt type4, int kind4, int optional4, sym_intent intent4)
743 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
744 a1, type1, kind1, optional1, intent1,
745 a2, type2, kind2, optional2, intent2,
746 a3, type3, kind3, optional3, intent3,
747 a4, type4, kind4, optional4, intent4,
752 /* Add a symbol to the subroutine list where the subroutine takes
756 add_sym_5s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
758 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
760 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
761 gfc_expr *, gfc_expr *),
762 void (*resolve) (gfc_code *),
763 const char *a1, bt type1, int kind1, int optional1,
764 sym_intent intent1, const char *a2, bt type2, int kind2,
765 int optional2, sym_intent intent2, const char *a3, bt type3,
766 int kind3, int optional3, sym_intent intent3, const char *a4,
767 bt type4, int kind4, int optional4, sym_intent intent4,
768 const char *a5, bt type5, int kind5, int optional5,
779 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
780 a1, type1, kind1, optional1, intent1,
781 a2, type2, kind2, optional2, intent2,
782 a3, type3, kind3, optional3, intent3,
783 a4, type4, kind4, optional4, intent4,
784 a5, type5, kind5, optional5, intent5,
789 /* Locate an intrinsic symbol given a base pointer, number of elements
790 in the table and a pointer to a name. Returns the NULL pointer if
791 a name is not found. */
793 static gfc_intrinsic_sym *
794 find_sym (gfc_intrinsic_sym *start, int n, const char *name)
796 /* name may be a user-supplied string, so we must first make sure
797 that we're comparing against a pointer into the global string
799 const char *p = gfc_get_string (name);
803 if (p == start->name)
815 gfc_intrinsic_function_by_id (gfc_isym_id id)
817 gfc_intrinsic_sym *start = functions;
832 /* Given a name, find a function in the intrinsic function table.
833 Returns NULL if not found. */
836 gfc_find_function (const char *name)
838 gfc_intrinsic_sym *sym;
840 sym = find_sym (functions, nfunc, name);
841 if (!sym || sym->from_module)
842 sym = find_sym (conversion, nconv, name);
844 return (!sym || sym->from_module) ? NULL : sym;
848 /* Given a name, find a function in the intrinsic subroutine table.
849 Returns NULL if not found. */
852 gfc_find_subroutine (const char *name)
854 gfc_intrinsic_sym *sym;
855 sym = find_sym (subroutines, nsub, name);
856 return (!sym || sym->from_module) ? NULL : sym;
860 /* Given a string, figure out if it is the name of a generic intrinsic
864 gfc_generic_intrinsic (const char *name)
866 gfc_intrinsic_sym *sym;
868 sym = gfc_find_function (name);
869 return (!sym || sym->from_module) ? 0 : sym->generic;
873 /* Given a string, figure out if it is the name of a specific
874 intrinsic function or not. */
877 gfc_specific_intrinsic (const char *name)
879 gfc_intrinsic_sym *sym;
881 sym = gfc_find_function (name);
882 return (!sym || sym->from_module) ? 0 : sym->specific;
886 /* Given a string, figure out if it is the name of an intrinsic function
887 or subroutine allowed as an actual argument or not. */
889 gfc_intrinsic_actual_ok (const char *name, const bool subroutine_flag)
891 gfc_intrinsic_sym *sym;
893 /* Intrinsic subroutines are not allowed as actual arguments. */
898 sym = gfc_find_function (name);
899 return (sym == NULL) ? 0 : sym->actual_ok;
904 /* Given a symbol, find out if it is (and is to be treated) an intrinsic. If
905 it's name refers to an intrinsic but this intrinsic is not included in the
906 selected standard, this returns FALSE and sets the symbol's external
910 gfc_is_intrinsic (gfc_symbol* sym, int subroutine_flag, locus loc)
912 gfc_intrinsic_sym* isym;
915 /* If INTRINSIC/EXTERNAL state is already known, return. */
916 if (sym->attr.intrinsic)
918 if (sym->attr.external)
922 isym = gfc_find_subroutine (sym->name);
924 isym = gfc_find_function (sym->name);
926 /* No such intrinsic available at all? */
930 /* See if this intrinsic is allowed in the current standard. */
931 if (gfc_check_intrinsic_standard (isym, &symstd, false, loc) == FAILURE)
933 if (sym->attr.proc == PROC_UNKNOWN
934 && gfc_option.warn_intrinsics_std)
935 gfc_warning_now ("The intrinsic '%s' at %L is not included in the"
936 " selected standard but %s and '%s' will be"
937 " treated as if declared EXTERNAL. Use an"
938 " appropriate -std=* option or define"
939 " -fall-intrinsics to allow this intrinsic.",
940 sym->name, &loc, symstd, sym->name);
949 /* Collect a set of intrinsic functions into a generic collection.
950 The first argument is the name of the generic function, which is
951 also the name of a specific function. The rest of the specifics
952 currently in the table are placed into the list of specific
953 functions associated with that generic.
956 FIXME: Remove the argument STANDARD if no regressions are
957 encountered. Change all callers (approx. 360).
961 make_generic (const char *name, gfc_isym_id id, int standard ATTRIBUTE_UNUSED)
963 gfc_intrinsic_sym *g;
965 if (sizing != SZ_NOTHING)
968 g = gfc_find_function (name);
970 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
973 gcc_assert (g->id == id);
977 if ((g + 1)->name != NULL)
978 g->specific_head = g + 1;
981 while (g->name != NULL)
993 /* Create a duplicate intrinsic function entry for the current
994 function, the only differences being the alternate name and
995 a different standard if necessary. Note that we use argument
996 lists more than once, but all argument lists are freed as a
1000 make_alias (const char *name, int standard)
1013 next_sym[0] = next_sym[-1];
1014 next_sym->name = gfc_get_string (name);
1015 next_sym->standard = standard;
1025 /* Make the current subroutine noreturn. */
1028 make_noreturn (void)
1030 if (sizing == SZ_NOTHING)
1031 next_sym[-1].noreturn = 1;
1035 /* Mark current intrinsic as module intrinsic. */
1037 make_from_module (void)
1039 if (sizing == SZ_NOTHING)
1040 next_sym[-1].from_module = 1;
1043 /* Set the attr.value of the current procedure. */
1046 set_attr_value (int n, ...)
1048 gfc_intrinsic_arg *arg;
1052 if (sizing != SZ_NOTHING)
1056 arg = next_sym[-1].formal;
1058 for (i = 0; i < n; i++)
1060 gcc_assert (arg != NULL);
1061 arg->value = va_arg (argp, int);
1068 /* Add intrinsic functions. */
1071 add_functions (void)
1073 /* Argument names as in the standard (to be used as argument keywords). */
1075 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
1076 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
1077 *c = "c", *n = "n", *ncopies= "ncopies", *pos = "pos", *bck = "back",
1078 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
1079 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
1080 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
1081 *p = "p", *ar = "array", *shp = "shape", *src = "source",
1082 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
1083 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
1084 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
1085 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
1086 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
1087 *num = "number", *tm = "time", *nm = "name", *md = "mode",
1088 *vl = "values", *p1 = "path1", *p2 = "path2", *com = "command",
1089 *ca = "coarray", *sub = "sub";
1091 int di, dr, dd, dl, dc, dz, ii;
1093 di = gfc_default_integer_kind;
1094 dr = gfc_default_real_kind;
1095 dd = gfc_default_double_kind;
1096 dl = gfc_default_logical_kind;
1097 dc = gfc_default_character_kind;
1098 dz = gfc_default_complex_kind;
1099 ii = gfc_index_integer_kind;
1101 add_sym_1 ("abs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1102 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
1103 a, BT_REAL, dr, REQUIRED);
1105 add_sym_1 ("iabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1106 NULL, gfc_simplify_abs, gfc_resolve_abs,
1107 a, BT_INTEGER, di, REQUIRED);
1109 add_sym_1 ("dabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1110 gfc_check_fn_d, gfc_simplify_abs, gfc_resolve_abs,
1111 a, BT_REAL, dd, REQUIRED);
1113 add_sym_1 ("cabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1114 NULL, gfc_simplify_abs, gfc_resolve_abs,
1115 a, BT_COMPLEX, dz, REQUIRED);
1117 add_sym_1 ("zabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1118 NULL, gfc_simplify_abs, gfc_resolve_abs,
1119 a, BT_COMPLEX, dd, REQUIRED);
1121 make_alias ("cdabs", GFC_STD_GNU);
1123 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
1125 /* The checking function for ACCESS is called gfc_check_access_func
1126 because the name gfc_check_access is already used in module.c. */
1127 add_sym_2 ("access", GFC_ISYM_ACCESS, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1128 di, GFC_STD_GNU, gfc_check_access_func, NULL, gfc_resolve_access,
1129 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1131 make_generic ("access", GFC_ISYM_ACCESS, GFC_STD_GNU);
1133 add_sym_2 ("achar", GFC_ISYM_ACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1134 BT_CHARACTER, dc, GFC_STD_F95,
1135 gfc_check_achar, gfc_simplify_achar, gfc_resolve_achar,
1136 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1138 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
1140 add_sym_1 ("acos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1141 gfc_check_fn_rc2008, gfc_simplify_acos, gfc_resolve_acos,
1142 x, BT_REAL, dr, REQUIRED);
1144 add_sym_1 ("dacos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1145 gfc_check_fn_d, gfc_simplify_acos, gfc_resolve_acos,
1146 x, BT_REAL, dd, REQUIRED);
1148 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
1150 add_sym_1 ("acosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1151 GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_acosh,
1152 gfc_resolve_acosh, x, BT_REAL, dr, REQUIRED);
1154 add_sym_1 ("dacosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1155 gfc_check_fn_d, gfc_simplify_acosh, gfc_resolve_acosh,
1156 x, BT_REAL, dd, REQUIRED);
1158 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_F2008);
1160 add_sym_1 ("adjustl", GFC_ISYM_ADJUSTL, CLASS_ELEMENTAL, ACTUAL_NO,
1161 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustl,
1162 gfc_resolve_adjustl, stg, BT_CHARACTER, 0, REQUIRED);
1164 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
1166 add_sym_1 ("adjustr", GFC_ISYM_ADJUSTR, CLASS_ELEMENTAL, ACTUAL_NO,
1167 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustr,
1168 gfc_resolve_adjustr, stg, BT_CHARACTER, 0, REQUIRED);
1170 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
1172 add_sym_1 ("aimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1173 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
1174 z, BT_COMPLEX, dz, REQUIRED);
1176 make_alias ("imag", GFC_STD_GNU);
1177 make_alias ("imagpart", GFC_STD_GNU);
1179 add_sym_1 ("dimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1180 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
1181 z, BT_COMPLEX, dd, REQUIRED);
1183 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
1185 add_sym_2 ("aint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1186 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
1187 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1189 add_sym_1 ("dint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1190 NULL, gfc_simplify_dint, gfc_resolve_dint,
1191 a, BT_REAL, dd, REQUIRED);
1193 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
1195 add_sym_2 ("all", GFC_ISYM_ALL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1196 gfc_check_all_any, gfc_simplify_all, gfc_resolve_all,
1197 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1199 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
1201 add_sym_1 ("allocated", GFC_ISYM_ALLOCATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1202 gfc_check_allocated, NULL, NULL,
1203 ar, BT_UNKNOWN, 0, REQUIRED);
1205 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
1207 add_sym_2 ("anint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1208 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
1209 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1211 add_sym_1 ("dnint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1212 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
1213 a, BT_REAL, dd, REQUIRED);
1215 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1217 add_sym_2 ("any", GFC_ISYM_ANY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1218 gfc_check_all_any, gfc_simplify_any, gfc_resolve_any,
1219 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1221 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1223 add_sym_1 ("asin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1224 gfc_check_fn_rc2008, gfc_simplify_asin, gfc_resolve_asin,
1225 x, BT_REAL, dr, REQUIRED);
1227 add_sym_1 ("dasin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1228 gfc_check_fn_d, gfc_simplify_asin, gfc_resolve_asin,
1229 x, BT_REAL, dd, REQUIRED);
1231 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1233 add_sym_1 ("asinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1234 GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_asinh,
1235 gfc_resolve_asinh, x, BT_REAL, dr, REQUIRED);
1237 add_sym_1 ("dasinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1238 gfc_check_fn_d, gfc_simplify_asinh, gfc_resolve_asinh,
1239 x, BT_REAL, dd, REQUIRED);
1241 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_F2008);
1243 add_sym_2 ("associated", GFC_ISYM_ASSOCIATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl,
1244 GFC_STD_F95, gfc_check_associated, NULL, NULL,
1245 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1247 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1249 add_sym_1 ("atan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1250 gfc_check_fn_rc2008, gfc_simplify_atan, gfc_resolve_atan,
1251 x, BT_REAL, dr, REQUIRED);
1253 add_sym_1 ("datan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1254 gfc_check_fn_d, gfc_simplify_atan, gfc_resolve_atan,
1255 x, BT_REAL, dd, REQUIRED);
1257 /* Two-argument version of atan, equivalent to atan2. */
1258 add_sym_2 ("atan", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2008,
1259 gfc_check_atan_2, gfc_simplify_atan2, gfc_resolve_atan2,
1260 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1262 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1264 add_sym_1 ("atanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1265 GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_atanh,
1266 gfc_resolve_atanh, x, BT_REAL, dr, REQUIRED);
1268 add_sym_1 ("datanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1269 gfc_check_fn_d, gfc_simplify_atanh, gfc_resolve_atanh,
1270 x, BT_REAL, dd, REQUIRED);
1272 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_F2008);
1274 add_sym_2 ("atan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1275 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1276 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1278 add_sym_2 ("datan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1279 gfc_check_datan2, gfc_simplify_atan2, gfc_resolve_atan2,
1280 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1282 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1284 /* Bessel and Neumann functions for G77 compatibility. */
1285 add_sym_1 ("besj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1286 gfc_check_fn_r, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1287 x, BT_REAL, dr, REQUIRED);
1289 make_alias ("bessel_j0", GFC_STD_F2008);
1291 add_sym_1 ("dbesj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1292 gfc_check_fn_d, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1293 x, BT_REAL, dd, REQUIRED);
1295 make_generic ("bessel_j0", GFC_ISYM_J0, GFC_STD_F2008);
1297 add_sym_1 ("besj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1298 gfc_check_fn_r, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1299 x, BT_REAL, dr, REQUIRED);
1301 make_alias ("bessel_j1", GFC_STD_F2008);
1303 add_sym_1 ("dbesj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1304 gfc_check_fn_d, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1305 x, BT_REAL, dd, REQUIRED);
1307 make_generic ("bessel_j1", GFC_ISYM_J1, GFC_STD_F2008);
1309 add_sym_2 ("besjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1310 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1311 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1313 make_alias ("bessel_jn", GFC_STD_F2008);
1315 add_sym_2 ("dbesjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1316 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1317 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1319 add_sym_3 ("bessel_jn", GFC_ISYM_JN2, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008,
1320 gfc_check_bessel_n2, gfc_simplify_bessel_jn2, gfc_resolve_bessel_n2,
1321 "n1", BT_INTEGER, di, REQUIRED,"n2", BT_INTEGER, di, REQUIRED,
1322 x, BT_REAL, dr, REQUIRED);
1323 set_attr_value (3, true, true, true);
1325 make_generic ("bessel_jn", GFC_ISYM_JN, GFC_STD_F2008);
1327 add_sym_1 ("besy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1328 gfc_check_fn_r, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1329 x, BT_REAL, dr, REQUIRED);
1331 make_alias ("bessel_y0", GFC_STD_F2008);
1333 add_sym_1 ("dbesy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1334 gfc_check_fn_d, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1335 x, BT_REAL, dd, REQUIRED);
1337 make_generic ("bessel_y0", GFC_ISYM_Y0, GFC_STD_F2008);
1339 add_sym_1 ("besy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1340 gfc_check_fn_r, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1341 x, BT_REAL, dr, REQUIRED);
1343 make_alias ("bessel_y1", GFC_STD_F2008);
1345 add_sym_1 ("dbesy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1346 gfc_check_fn_d, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1347 x, BT_REAL, dd, REQUIRED);
1349 make_generic ("bessel_y1", GFC_ISYM_Y1, GFC_STD_F2008);
1351 add_sym_2 ("besyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1352 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1353 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1355 make_alias ("bessel_yn", GFC_STD_F2008);
1357 add_sym_2 ("dbesyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1358 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1359 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1361 add_sym_3 ("bessel_yn", GFC_ISYM_YN2, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008,
1362 gfc_check_bessel_n2, gfc_simplify_bessel_yn2, gfc_resolve_bessel_n2,
1363 "n1", BT_INTEGER, di, REQUIRED,"n2", BT_INTEGER, di, REQUIRED,
1364 x, BT_REAL, dr, REQUIRED);
1365 set_attr_value (3, true, true, true);
1367 make_generic ("bessel_yn", GFC_ISYM_YN, GFC_STD_F2008);
1369 add_sym_2 ("bge", GFC_ISYM_BGE, CLASS_ELEMENTAL, ACTUAL_NO,
1370 BT_LOGICAL, dl, GFC_STD_F2008,
1371 gfc_check_bge_bgt_ble_blt, gfc_simplify_bge, NULL,
1372 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1374 make_generic ("bge", GFC_ISYM_BGE, GFC_STD_F2008);
1376 add_sym_2 ("bgt", GFC_ISYM_BGT, CLASS_ELEMENTAL, ACTUAL_NO,
1377 BT_LOGICAL, dl, GFC_STD_F2008,
1378 gfc_check_bge_bgt_ble_blt, gfc_simplify_bgt, NULL,
1379 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1381 make_generic ("bgt", GFC_ISYM_BGT, GFC_STD_F2008);
1383 add_sym_1 ("bit_size", GFC_ISYM_BIT_SIZE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1384 gfc_check_i, gfc_simplify_bit_size, NULL,
1385 i, BT_INTEGER, di, REQUIRED);
1387 make_generic ("bit_size", GFC_ISYM_BIT_SIZE, GFC_STD_F95);
1389 add_sym_2 ("ble", GFC_ISYM_BLE, CLASS_ELEMENTAL, ACTUAL_NO,
1390 BT_LOGICAL, dl, GFC_STD_F2008,
1391 gfc_check_bge_bgt_ble_blt, gfc_simplify_ble, NULL,
1392 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1394 make_generic ("ble", GFC_ISYM_BLE, GFC_STD_F2008);
1396 add_sym_2 ("blt", GFC_ISYM_BLT, CLASS_ELEMENTAL, ACTUAL_NO,
1397 BT_LOGICAL, dl, GFC_STD_F2008,
1398 gfc_check_bge_bgt_ble_blt, gfc_simplify_blt, NULL,
1399 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1401 make_generic ("blt", GFC_ISYM_BLT, GFC_STD_F2008);
1403 add_sym_2 ("btest", GFC_ISYM_BTEST, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1404 gfc_check_bitfcn, gfc_simplify_btest, gfc_resolve_btest,
1405 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1407 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1409 add_sym_2 ("ceiling", GFC_ISYM_CEILING, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1410 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1411 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1413 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1415 add_sym_2 ("char", GFC_ISYM_CHAR, CLASS_ELEMENTAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F77,
1416 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1417 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1419 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1421 add_sym_1 ("chdir", GFC_ISYM_CHDIR, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
1422 GFC_STD_GNU, gfc_check_chdir, NULL, gfc_resolve_chdir,
1423 nm, BT_CHARACTER, dc, REQUIRED);
1425 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1427 add_sym_2 ("chmod", GFC_ISYM_CHMOD, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1428 di, GFC_STD_GNU, gfc_check_chmod, NULL, gfc_resolve_chmod,
1429 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1431 make_generic ("chmod", GFC_ISYM_CHMOD, GFC_STD_GNU);
1433 add_sym_3 ("cmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_F77,
1434 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1435 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1436 kind, BT_INTEGER, di, OPTIONAL);
1438 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1440 add_sym_0 ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT, CLASS_INQUIRY,
1441 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003, NULL, NULL, NULL);
1443 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1446 add_sym_2 ("complex", GFC_ISYM_COMPLEX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_GNU,
1447 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1448 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1450 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1452 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1453 complex instead of the default complex. */
1455 add_sym_2 ("dcmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dd, GFC_STD_GNU,
1456 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1457 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1459 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1461 add_sym_1 ("conjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1462 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1463 z, BT_COMPLEX, dz, REQUIRED);
1465 add_sym_1 ("dconjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1466 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1467 z, BT_COMPLEX, dd, REQUIRED);
1469 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1471 add_sym_1 ("cos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1472 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1473 x, BT_REAL, dr, REQUIRED);
1475 add_sym_1 ("dcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1476 gfc_check_fn_d, gfc_simplify_cos, gfc_resolve_cos,
1477 x, BT_REAL, dd, REQUIRED);
1479 add_sym_1 ("ccos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1480 NULL, gfc_simplify_cos, gfc_resolve_cos,
1481 x, BT_COMPLEX, dz, REQUIRED);
1483 add_sym_1 ("zcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1484 NULL, gfc_simplify_cos, gfc_resolve_cos,
1485 x, BT_COMPLEX, dd, REQUIRED);
1487 make_alias ("cdcos", GFC_STD_GNU);
1489 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1491 add_sym_1 ("cosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1492 gfc_check_fn_rc2008, gfc_simplify_cosh, gfc_resolve_cosh,
1493 x, BT_REAL, dr, REQUIRED);
1495 add_sym_1 ("dcosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1496 gfc_check_fn_d, gfc_simplify_cosh, gfc_resolve_cosh,
1497 x, BT_REAL, dd, REQUIRED);
1499 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1501 add_sym_3 ("count", GFC_ISYM_COUNT, CLASS_TRANSFORMATIONAL, ACTUAL_NO,
1502 BT_INTEGER, di, GFC_STD_F95,
1503 gfc_check_count, gfc_simplify_count, gfc_resolve_count,
1504 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1505 kind, BT_INTEGER, di, OPTIONAL);
1507 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1509 add_sym_3 ("cshift", GFC_ISYM_CSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1510 gfc_check_cshift, NULL, gfc_resolve_cshift,
1511 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1512 dm, BT_INTEGER, ii, OPTIONAL);
1514 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1516 add_sym_1 ("ctime", GFC_ISYM_CTIME, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER,
1517 0, GFC_STD_GNU, gfc_check_ctime, NULL, gfc_resolve_ctime,
1518 tm, BT_INTEGER, di, REQUIRED);
1520 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1522 add_sym_1 ("dble", GFC_ISYM_DBLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
1523 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1524 a, BT_REAL, dr, REQUIRED);
1526 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1528 add_sym_1 ("digits", GFC_ISYM_DIGITS, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1529 gfc_check_digits, gfc_simplify_digits, NULL,
1530 x, BT_UNKNOWN, dr, REQUIRED);
1532 make_generic ("digits", GFC_ISYM_DIGITS, GFC_STD_F95);
1534 add_sym_2 ("dim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1535 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1536 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1538 add_sym_2 ("idim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1539 NULL, gfc_simplify_dim, gfc_resolve_dim,
1540 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1542 add_sym_2 ("ddim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1543 gfc_check_x_yd, gfc_simplify_dim, gfc_resolve_dim,
1544 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1546 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1548 add_sym_2 ("dot_product", GFC_ISYM_DOT_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr,
1549 GFC_STD_F95, gfc_check_dot_product, gfc_simplify_dot_product, gfc_resolve_dot_product,
1550 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1552 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1554 add_sym_2 ("dprod", GFC_ISYM_DPROD,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1555 gfc_check_dprod, gfc_simplify_dprod, gfc_resolve_dprod,
1556 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1558 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1560 add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1562 a, BT_COMPLEX, dd, REQUIRED);
1564 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1566 add_sym_3 ("dshiftl", GFC_ISYM_DSHIFTL, CLASS_ELEMENTAL, ACTUAL_NO,
1567 BT_INTEGER, di, GFC_STD_F2008,
1568 gfc_check_dshift, gfc_simplify_dshiftl, gfc_resolve_dshift,
1569 i, BT_INTEGER, di, REQUIRED,
1570 j, BT_INTEGER, di, REQUIRED,
1571 sh, BT_INTEGER, di, REQUIRED);
1573 make_generic ("dshiftl", GFC_ISYM_DSHIFTL, GFC_STD_F2008);
1575 add_sym_3 ("dshiftr", GFC_ISYM_DSHIFTR, CLASS_ELEMENTAL, ACTUAL_NO,
1576 BT_INTEGER, di, GFC_STD_F2008,
1577 gfc_check_dshift, gfc_simplify_dshiftr, gfc_resolve_dshift,
1578 i, BT_INTEGER, di, REQUIRED,
1579 j, BT_INTEGER, di, REQUIRED,
1580 sh, BT_INTEGER, di, REQUIRED);
1582 make_generic ("dshiftr", GFC_ISYM_DSHIFTR, GFC_STD_F2008);
1584 add_sym_4 ("eoshift", GFC_ISYM_EOSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1585 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1586 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, ii, REQUIRED,
1587 bd, BT_REAL, dr, OPTIONAL, dm, BT_INTEGER, ii, OPTIONAL);
1589 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1591 add_sym_1 ("epsilon", GFC_ISYM_EPSILON, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1592 gfc_check_x, gfc_simplify_epsilon, NULL,
1593 x, BT_REAL, dr, REQUIRED);
1595 make_generic ("epsilon", GFC_ISYM_EPSILON, GFC_STD_F95);
1597 /* G77 compatibility for the ERF() and ERFC() functions. */
1598 add_sym_1 ("erf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1599 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erf,
1600 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1602 add_sym_1 ("derf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1603 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erf,
1604 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1606 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_F2008);
1608 add_sym_1 ("erfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1609 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erfc,
1610 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1612 add_sym_1 ("derfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1613 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erfc,
1614 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1616 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_F2008);
1618 add_sym_1 ("erfc_scaled", GFC_ISYM_ERFC_SCALED, CLASS_ELEMENTAL, ACTUAL_NO,
1619 BT_REAL, dr, GFC_STD_F2008, gfc_check_fn_r,
1620 gfc_simplify_erfc_scaled, gfc_resolve_g77_math1, x, BT_REAL,
1623 make_generic ("erfc_scaled", GFC_ISYM_ERFC_SCALED, GFC_STD_F2008);
1625 /* G77 compatibility */
1626 add_sym_1 ("dtime", GFC_ISYM_DTIME, CLASS_IMPURE, ACTUAL_NO, BT_REAL,
1627 4, GFC_STD_GNU, gfc_check_dtime_etime, NULL, NULL,
1628 x, BT_REAL, 4, REQUIRED);
1630 make_generic ("dtime", GFC_ISYM_DTIME, GFC_STD_GNU);
1632 add_sym_1 ("etime", GFC_ISYM_ETIME, CLASS_IMPURE, ACTUAL_NO, BT_REAL,
1633 4, GFC_STD_GNU, gfc_check_dtime_etime, NULL, NULL,
1634 x, BT_REAL, 4, REQUIRED);
1636 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1638 add_sym_1 ("exp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1639 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1640 x, BT_REAL, dr, REQUIRED);
1642 add_sym_1 ("dexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1643 gfc_check_fn_d, gfc_simplify_exp, gfc_resolve_exp,
1644 x, BT_REAL, dd, REQUIRED);
1646 add_sym_1 ("cexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1647 NULL, gfc_simplify_exp, gfc_resolve_exp,
1648 x, BT_COMPLEX, dz, REQUIRED);
1650 add_sym_1 ("zexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1651 NULL, gfc_simplify_exp, gfc_resolve_exp,
1652 x, BT_COMPLEX, dd, REQUIRED);
1654 make_alias ("cdexp", GFC_STD_GNU);
1656 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1658 add_sym_1 ("exponent", GFC_ISYM_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1659 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1660 x, BT_REAL, dr, REQUIRED);
1662 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1664 add_sym_2 ("extends_type_of", GFC_ISYM_EXTENDS_TYPE_OF, CLASS_INQUIRY,
1665 ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1666 gfc_check_same_type_as, gfc_simplify_extends_type_of,
1667 gfc_resolve_extends_type_of,
1668 a, BT_UNKNOWN, 0, REQUIRED,
1669 mo, BT_UNKNOWN, 0, REQUIRED);
1671 add_sym_0 ("fdate", GFC_ISYM_FDATE, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER,
1672 dc, GFC_STD_GNU, NULL, NULL, gfc_resolve_fdate);
1674 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1676 add_sym_2 ("floor", GFC_ISYM_FLOOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1677 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1678 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1680 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1682 /* G77 compatible fnum */
1683 add_sym_1 ("fnum", GFC_ISYM_FNUM, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1684 di, GFC_STD_GNU, gfc_check_fnum, NULL, gfc_resolve_fnum,
1685 ut, BT_INTEGER, di, REQUIRED);
1687 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1689 add_sym_1 ("fraction", GFC_ISYM_FRACTION, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1690 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1691 x, BT_REAL, dr, REQUIRED);
1693 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1695 add_sym_2_intent ("fstat", GFC_ISYM_FSTAT, CLASS_IMPURE, ACTUAL_NO,
1696 BT_INTEGER, di, GFC_STD_GNU,
1697 gfc_check_fstat, NULL, gfc_resolve_fstat,
1698 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
1699 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT);
1701 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1703 add_sym_1 ("ftell", GFC_ISYM_FTELL, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1704 ii, GFC_STD_GNU, gfc_check_ftell, NULL, gfc_resolve_ftell,
1705 ut, BT_INTEGER, di, REQUIRED);
1707 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1709 add_sym_2_intent ("fgetc", GFC_ISYM_FGETC, CLASS_IMPURE, ACTUAL_NO,
1710 BT_INTEGER, di, GFC_STD_GNU,
1711 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1712 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
1713 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
1715 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1717 add_sym_1_intent ("fget", GFC_ISYM_FGET, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1718 di, GFC_STD_GNU, gfc_check_fgetput, NULL, gfc_resolve_fget,
1719 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
1721 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1723 add_sym_2 ("fputc", GFC_ISYM_FPUTC, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1724 di, GFC_STD_GNU, gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1725 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1727 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1729 add_sym_1 ("fput", GFC_ISYM_FPUT, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1730 di, GFC_STD_GNU, gfc_check_fgetput, NULL, gfc_resolve_fput,
1731 c, BT_CHARACTER, dc, REQUIRED);
1733 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1735 add_sym_1 ("gamma", GFC_ISYM_TGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1736 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_gamma,
1737 gfc_resolve_gamma, x, BT_REAL, dr, REQUIRED);
1739 add_sym_1 ("dgamma", GFC_ISYM_TGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1740 gfc_check_fn_d, gfc_simplify_gamma, gfc_resolve_gamma,
1741 x, BT_REAL, dr, REQUIRED);
1743 make_generic ("gamma", GFC_ISYM_TGAMMA, GFC_STD_F2008);
1745 /* Unix IDs (g77 compatibility) */
1746 add_sym_1 ("getcwd", GFC_ISYM_GETCWD, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1747 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_getcwd,
1748 c, BT_CHARACTER, dc, REQUIRED);
1750 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1752 add_sym_0 ("getgid", GFC_ISYM_GETGID, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1753 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_getgid);
1755 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1757 add_sym_0 ("getpid", GFC_ISYM_GETPID, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1758 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_getpid);
1760 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1762 add_sym_0 ("getuid", GFC_ISYM_GETUID, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1763 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_getuid);
1765 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1767 add_sym_1_intent ("hostnm", GFC_ISYM_HOSTNM, CLASS_IMPURE, ACTUAL_NO,
1768 BT_INTEGER, di, GFC_STD_GNU,
1769 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1770 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
1772 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1774 add_sym_1 ("huge", GFC_ISYM_HUGE, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1775 gfc_check_huge, gfc_simplify_huge, NULL,
1776 x, BT_UNKNOWN, dr, REQUIRED);
1778 make_generic ("huge", GFC_ISYM_HUGE, GFC_STD_F95);
1780 add_sym_2 ("hypot", GFC_ISYM_HYPOT, CLASS_ELEMENTAL, ACTUAL_NO,
1781 BT_REAL, dr, GFC_STD_F2008,
1782 gfc_check_hypot, gfc_simplify_hypot, gfc_resolve_hypot,
1783 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1785 make_generic ("hypot", GFC_ISYM_HYPOT, GFC_STD_F2008);
1787 add_sym_2 ("iachar", GFC_ISYM_IACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1788 BT_INTEGER, di, GFC_STD_F95,
1789 gfc_check_ichar_iachar, gfc_simplify_iachar, gfc_resolve_iachar,
1790 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1792 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1794 add_sym_2 ("iand", GFC_ISYM_IAND, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1795 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1796 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1798 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1800 add_sym_2 ("and", GFC_ISYM_AND, CLASS_IMPURE, ACTUAL_NO, BT_LOGICAL,
1801 dl, GFC_STD_GNU, gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1802 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1804 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1806 add_sym_3red ("iall", GFC_ISYM_IALL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008,
1807 gfc_check_transf_bit_intrins, gfc_simplify_iall, gfc_resolve_iall,
1808 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1809 msk, BT_LOGICAL, dl, OPTIONAL);
1811 make_generic ("iall", GFC_ISYM_IALL, GFC_STD_F2008);
1813 add_sym_3red ("iany", GFC_ISYM_IANY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008,
1814 gfc_check_transf_bit_intrins, gfc_simplify_iany, gfc_resolve_iany,
1815 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1816 msk, BT_LOGICAL, dl, OPTIONAL);
1818 make_generic ("iany", GFC_ISYM_IANY, GFC_STD_F2008);
1820 add_sym_0 ("iargc", GFC_ISYM_IARGC, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1821 di, GFC_STD_GNU, NULL, NULL, NULL);
1823 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1825 add_sym_2 ("ibclr", GFC_ISYM_IBCLR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1826 gfc_check_bitfcn, gfc_simplify_ibclr, gfc_resolve_ibclr,
1827 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1829 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1831 add_sym_3 ("ibits", GFC_ISYM_IBITS, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1832 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1833 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1834 ln, BT_INTEGER, di, REQUIRED);
1836 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1838 add_sym_2 ("ibset", GFC_ISYM_IBSET, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1839 gfc_check_bitfcn, gfc_simplify_ibset, gfc_resolve_ibset,
1840 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1842 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1844 add_sym_2 ("ichar", GFC_ISYM_ICHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1845 BT_INTEGER, di, GFC_STD_F77,
1846 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1847 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1849 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1851 add_sym_2 ("ieor", GFC_ISYM_IEOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1852 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1853 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1855 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1857 add_sym_2 ("xor", GFC_ISYM_XOR, CLASS_IMPURE, ACTUAL_NO, BT_LOGICAL,
1858 dl, GFC_STD_GNU, gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1859 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1861 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1863 add_sym_0 ("ierrno", GFC_ISYM_IERRNO, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1864 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_ierrno);
1866 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1868 add_sym_2 ("image_index", GFC_ISYM_IMAGE_INDEX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2008,
1869 gfc_check_image_index, gfc_simplify_image_index, gfc_resolve_image_index,
1870 ca, BT_REAL, dr, REQUIRED, sub, BT_INTEGER, ii, REQUIRED);
1872 /* The resolution function for INDEX is called gfc_resolve_index_func
1873 because the name gfc_resolve_index is already used in resolve.c. */
1874 add_sym_4 ("index", GFC_ISYM_INDEX, CLASS_ELEMENTAL, ACTUAL_YES,
1875 BT_INTEGER, di, GFC_STD_F77,
1876 gfc_check_index, gfc_simplify_index, gfc_resolve_index_func,
1877 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1878 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
1880 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1882 add_sym_2 ("int", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1883 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1884 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1886 add_sym_1 ("ifix", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1887 NULL, gfc_simplify_ifix, NULL,
1888 a, BT_REAL, dr, REQUIRED);
1890 add_sym_1 ("idint", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1891 NULL, gfc_simplify_idint, NULL,
1892 a, BT_REAL, dd, REQUIRED);
1894 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1896 add_sym_1 ("int2", GFC_ISYM_INT2, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1897 gfc_check_intconv, gfc_simplify_int2, gfc_resolve_int2,
1898 a, BT_REAL, dr, REQUIRED);
1900 make_alias ("short", GFC_STD_GNU);
1902 make_generic ("int2", GFC_ISYM_INT2, GFC_STD_GNU);
1904 add_sym_1 ("int8", GFC_ISYM_INT8, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1905 gfc_check_intconv, gfc_simplify_int8, gfc_resolve_int8,
1906 a, BT_REAL, dr, REQUIRED);
1908 make_generic ("int8", GFC_ISYM_INT8, GFC_STD_GNU);
1910 add_sym_1 ("long", GFC_ISYM_LONG, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1911 gfc_check_intconv, gfc_simplify_long, gfc_resolve_long,
1912 a, BT_REAL, dr, REQUIRED);
1914 make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
1916 add_sym_2 ("ior", GFC_ISYM_IOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1917 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1918 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1920 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1922 add_sym_2 ("or", GFC_ISYM_OR, CLASS_IMPURE, ACTUAL_NO, BT_LOGICAL,
1923 dl, GFC_STD_GNU, gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1924 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1926 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1928 add_sym_3red ("iparity", GFC_ISYM_IPARITY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008,
1929 gfc_check_transf_bit_intrins, gfc_simplify_iparity, gfc_resolve_iparity,
1930 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1931 msk, BT_LOGICAL, dl, OPTIONAL);
1933 make_generic ("iparity", GFC_ISYM_IPARITY, GFC_STD_F2008);
1935 /* The following function is for G77 compatibility. */
1936 add_sym_1 ("irand", GFC_ISYM_IRAND, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1937 4, GFC_STD_GNU, gfc_check_irand, NULL, NULL,
1938 i, BT_INTEGER, 4, OPTIONAL);
1940 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1942 add_sym_1 ("isatty", GFC_ISYM_ISATTY, CLASS_IMPURE, ACTUAL_NO, BT_LOGICAL,
1943 dl, GFC_STD_GNU, gfc_check_isatty, NULL, gfc_resolve_isatty,
1944 ut, BT_INTEGER, di, REQUIRED);
1946 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1948 add_sym_1 ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END,
1949 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1950 gfc_check_i, gfc_simplify_is_iostat_end, NULL,
1951 i, BT_INTEGER, 0, REQUIRED);
1953 make_generic ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END, GFC_STD_F2003);
1955 add_sym_1 ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR,
1956 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1957 gfc_check_i, gfc_simplify_is_iostat_eor, NULL,
1958 i, BT_INTEGER, 0, REQUIRED);
1960 make_generic ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR, GFC_STD_F2003);
1962 add_sym_1 ("isnan", GFC_ISYM_ISNAN, CLASS_ELEMENTAL, ACTUAL_NO,
1963 BT_LOGICAL, dl, GFC_STD_GNU,
1964 gfc_check_isnan, gfc_simplify_isnan, NULL,
1965 x, BT_REAL, 0, REQUIRED);
1967 make_generic ("isnan", GFC_ISYM_ISNAN, GFC_STD_GNU);
1969 add_sym_2 ("rshift", GFC_ISYM_RSHIFT, CLASS_ELEMENTAL, ACTUAL_NO,
1970 BT_INTEGER, di, GFC_STD_GNU,
1971 gfc_check_ishft, gfc_simplify_rshift, gfc_resolve_rshift,
1972 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1974 make_generic ("rshift", GFC_ISYM_RSHIFT, GFC_STD_GNU);
1976 add_sym_2 ("lshift", GFC_ISYM_LSHIFT, CLASS_ELEMENTAL, ACTUAL_NO,
1977 BT_INTEGER, di, GFC_STD_GNU,
1978 gfc_check_ishft, gfc_simplify_lshift, gfc_resolve_lshift,
1979 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1981 make_generic ("lshift", GFC_ISYM_LSHIFT, GFC_STD_GNU);
1983 add_sym_2 ("ishft", GFC_ISYM_ISHFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1984 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1985 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1987 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1989 add_sym_3 ("ishftc", GFC_ISYM_ISHFTC, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1990 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1991 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1992 sz, BT_INTEGER, di, OPTIONAL);
1994 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1996 add_sym_2 ("kill", GFC_ISYM_KILL, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
1997 di, GFC_STD_GNU, gfc_check_kill, NULL, gfc_resolve_kill,
1998 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2000 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
2002 add_sym_1 ("kind", GFC_ISYM_KIND, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2003 gfc_check_kind, gfc_simplify_kind, NULL,
2004 x, BT_REAL, dr, REQUIRED);
2006 make_generic ("kind", GFC_ISYM_KIND, GFC_STD_F95);
2008 add_sym_3 ("lbound", GFC_ISYM_LBOUND, CLASS_INQUIRY, ACTUAL_NO,
2009 BT_INTEGER, di, GFC_STD_F95,
2010 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
2011 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL,
2012 kind, BT_INTEGER, di, OPTIONAL);
2014 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
2016 add_sym_3 ("lcobound", GFC_ISYM_LCOBOUND, CLASS_INQUIRY, ACTUAL_NO,
2017 BT_INTEGER, di, GFC_STD_F2008,
2018 gfc_check_lcobound, gfc_simplify_lcobound, gfc_resolve_lcobound,
2019 ca, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2020 kind, BT_INTEGER, di, OPTIONAL);
2022 make_generic ("lcobound", GFC_ISYM_LCOBOUND, GFC_STD_F2008);
2024 add_sym_1 ("leadz", GFC_ISYM_LEADZ, CLASS_ELEMENTAL, ACTUAL_NO,
2025 BT_INTEGER, di, GFC_STD_F2008,
2026 gfc_check_i, gfc_simplify_leadz, NULL,
2027 i, BT_INTEGER, di, REQUIRED);
2029 make_generic ("leadz", GFC_ISYM_LEADZ, GFC_STD_F2008);
2031 add_sym_2 ("len", GFC_ISYM_LEN, CLASS_INQUIRY, ACTUAL_YES,
2032 BT_INTEGER, di, GFC_STD_F77,
2033 gfc_check_len_lentrim, gfc_simplify_len, gfc_resolve_len,
2034 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2036 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
2038 add_sym_2 ("len_trim", GFC_ISYM_LEN_TRIM, CLASS_ELEMENTAL, ACTUAL_NO,
2039 BT_INTEGER, di, GFC_STD_F95,
2040 gfc_check_len_lentrim, gfc_simplify_len_trim, gfc_resolve_len_trim,
2041 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2043 make_alias ("lnblnk", GFC_STD_GNU);
2045 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
2047 add_sym_1 ("lgamma", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL,
2049 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
2050 x, BT_REAL, dr, REQUIRED);
2052 make_alias ("log_gamma", GFC_STD_F2008);
2054 add_sym_1 ("algama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2055 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
2056 x, BT_REAL, dr, REQUIRED);
2058 add_sym_1 ("dlgama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2059 gfc_check_fn_d, gfc_simplify_lgamma, gfc_resolve_lgamma,
2060 x, BT_REAL, dr, REQUIRED);
2062 make_generic ("log_gamma", GFC_ISYM_LGAMMA, GFC_STD_F2008);
2065 add_sym_2 ("lge", GFC_ISYM_LGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
2066 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lge, NULL,
2067 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
2069 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
2071 add_sym_2 ("lgt", GFC_ISYM_LGT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
2072 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lgt, NULL,
2073 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
2075 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
2077 add_sym_2 ("lle",GFC_ISYM_LLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
2078 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lle, NULL,
2079 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
2081 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
2083 add_sym_2 ("llt", GFC_ISYM_LLT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
2084 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_llt, NULL,
2085 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
2087 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
2089 add_sym_2 ("link", GFC_ISYM_LINK, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2090 GFC_STD_GNU, gfc_check_link, NULL, gfc_resolve_link,
2091 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2093 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
2095 add_sym_1 ("log", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2096 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
2097 x, BT_REAL, dr, REQUIRED);
2099 add_sym_1 ("alog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2100 NULL, gfc_simplify_log, gfc_resolve_log,
2101 x, BT_REAL, dr, REQUIRED);
2103 add_sym_1 ("dlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2104 gfc_check_fn_d, gfc_simplify_log, gfc_resolve_log,
2105 x, BT_REAL, dd, REQUIRED);
2107 add_sym_1 ("clog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2108 NULL, gfc_simplify_log, gfc_resolve_log,
2109 x, BT_COMPLEX, dz, REQUIRED);
2111 add_sym_1 ("zlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2112 NULL, gfc_simplify_log, gfc_resolve_log,
2113 x, BT_COMPLEX, dd, REQUIRED);
2115 make_alias ("cdlog", GFC_STD_GNU);
2117 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
2119 add_sym_1 ("log10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2120 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
2121 x, BT_REAL, dr, REQUIRED);
2123 add_sym_1 ("alog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2124 NULL, gfc_simplify_log10, gfc_resolve_log10,
2125 x, BT_REAL, dr, REQUIRED);
2127 add_sym_1 ("dlog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2128 gfc_check_fn_d, gfc_simplify_log10, gfc_resolve_log10,
2129 x, BT_REAL, dd, REQUIRED);
2131 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
2133 add_sym_2 ("logical", GFC_ISYM_LOGICAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
2134 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
2135 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2137 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
2139 add_sym_2_intent ("lstat", GFC_ISYM_LSTAT, CLASS_IMPURE, ACTUAL_NO,
2140 BT_INTEGER, di, GFC_STD_GNU,
2141 gfc_check_stat, NULL, gfc_resolve_lstat,
2142 nm, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2143 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT);
2145 make_generic ("lstat", GFC_ISYM_LSTAT, GFC_STD_GNU);
2147 add_sym_1 ("malloc", GFC_ISYM_MALLOC, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, ii,
2148 GFC_STD_GNU, gfc_check_malloc, NULL, gfc_resolve_malloc,
2149 sz, BT_INTEGER, di, REQUIRED);
2151 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
2153 add_sym_2 ("maskl", GFC_ISYM_MASKL, CLASS_ELEMENTAL, ACTUAL_NO,
2154 BT_INTEGER, di, GFC_STD_F2008,
2155 gfc_check_mask, gfc_simplify_maskl, gfc_resolve_mask,
2156 i, BT_INTEGER, di, REQUIRED,
2157 kind, BT_INTEGER, di, OPTIONAL);
2159 make_generic ("maskl", GFC_ISYM_MASKL, GFC_STD_F2008);
2161 add_sym_2 ("maskr", GFC_ISYM_MASKR, CLASS_ELEMENTAL, ACTUAL_NO,
2162 BT_INTEGER, di, GFC_STD_F2008,
2163 gfc_check_mask, gfc_simplify_maskr, gfc_resolve_mask,
2164 i, BT_INTEGER, di, REQUIRED,
2165 kind, BT_INTEGER, di, OPTIONAL);
2167 make_generic ("maskr", GFC_ISYM_MASKR, GFC_STD_F2008);
2169 add_sym_2 ("matmul", GFC_ISYM_MATMUL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2170 gfc_check_matmul, gfc_simplify_matmul, gfc_resolve_matmul,
2171 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
2173 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
2175 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
2176 int(max). The max function must take at least two arguments. */
2178 add_sym_1m ("max", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2179 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
2180 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
2182 add_sym_1m ("max0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2183 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2184 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2186 add_sym_1m ("amax0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2187 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2188 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2190 add_sym_1m ("amax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2191 gfc_check_min_max_real, gfc_simplify_max, NULL,
2192 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2194 add_sym_1m ("max1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2195 gfc_check_min_max_real, gfc_simplify_max, NULL,
2196 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2198 add_sym_1m ("dmax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2199 gfc_check_min_max_double, gfc_simplify_max, NULL,
2200 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2202 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
2204 add_sym_1 ("maxexponent", GFC_ISYM_MAXEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2205 GFC_STD_F95, gfc_check_x, gfc_simplify_maxexponent, NULL,
2206 x, BT_UNKNOWN, dr, REQUIRED);
2208 make_generic ("maxexponent", GFC_ISYM_MAXEXPONENT, GFC_STD_F95);
2210 add_sym_3ml ("maxloc", GFC_ISYM_MAXLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2211 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
2212 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2213 msk, BT_LOGICAL, dl, OPTIONAL);
2215 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
2217 add_sym_3red ("maxval", GFC_ISYM_MAXVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2218 gfc_check_minval_maxval, gfc_simplify_maxval, gfc_resolve_maxval,
2219 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2220 msk, BT_LOGICAL, dl, OPTIONAL);
2222 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
2224 add_sym_0 ("mclock", GFC_ISYM_MCLOCK, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2225 GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock);
2227 make_generic ("mclock", GFC_ISYM_MCLOCK, GFC_STD_GNU);
2229 add_sym_0 ("mclock8", GFC_ISYM_MCLOCK8, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
2230 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock8);
2232 make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU);
2234 add_sym_3 ("merge", GFC_ISYM_MERGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2235 gfc_check_merge, gfc_simplify_merge, gfc_resolve_merge,
2236 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
2237 msk, BT_LOGICAL, dl, REQUIRED);
2239 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
2241 add_sym_3 ("merge_bits", GFC_ISYM_MERGE_BITS, CLASS_ELEMENTAL, ACTUAL_NO,
2242 BT_INTEGER, di, GFC_STD_F2008,
2243 gfc_check_merge_bits, gfc_simplify_merge_bits,
2244 gfc_resolve_merge_bits,
2245 i, BT_INTEGER, di, REQUIRED,
2246 j, BT_INTEGER, di, REQUIRED,
2247 msk, BT_INTEGER, di, REQUIRED);
2249 make_generic ("merge_bits", GFC_ISYM_MERGE_BITS, GFC_STD_F2008);
2251 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
2254 add_sym_1m ("min", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2255 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
2256 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2258 add_sym_1m ("min0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2259 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2260 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2262 add_sym_1m ("amin0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2263 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2264 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2266 add_sym_1m ("amin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2267 gfc_check_min_max_real, gfc_simplify_min, NULL,
2268 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2270 add_sym_1m ("min1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2271 gfc_check_min_max_real, gfc_simplify_min, NULL,
2272 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2274 add_sym_1m ("dmin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2275 gfc_check_min_max_double, gfc_simplify_min, NULL,
2276 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2278 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
2280 add_sym_1 ("minexponent", GFC_ISYM_MINEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2281 GFC_STD_F95, gfc_check_x, gfc_simplify_minexponent, NULL,
2282 x, BT_UNKNOWN, dr, REQUIRED);
2284 make_generic ("minexponent", GFC_ISYM_MINEXPONENT, GFC_STD_F95);
2286 add_sym_3ml ("minloc", GFC_ISYM_MINLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2287 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
2288 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2289 msk, BT_LOGICAL, dl, OPTIONAL);
2291 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
2293 add_sym_3red ("minval", GFC_ISYM_MINVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2294 gfc_check_minval_maxval, gfc_simplify_minval, gfc_resolve_minval,
2295 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2296 msk, BT_LOGICAL, dl, OPTIONAL);
2298 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
2300 add_sym_2 ("mod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2301 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
2302 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
2304 add_sym_2 ("amod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2305 NULL, gfc_simplify_mod, gfc_resolve_mod,
2306 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
2308 add_sym_2 ("dmod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2309 gfc_check_x_yd, gfc_simplify_mod, gfc_resolve_mod,
2310 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
2312 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
2314 add_sym_2 ("modulo", GFC_ISYM_MODULO, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, di, GFC_STD_F95,
2315 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
2316 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
2318 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
2320 add_sym_2 ("nearest", GFC_ISYM_NEAREST, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2321 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
2322 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
2324 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
2326 add_sym_1 ("new_line", GFC_ISYM_NEW_LINE, CLASS_INQUIRY, ACTUAL_NO, BT_CHARACTER, dc,
2327 GFC_STD_F2003, gfc_check_new_line, gfc_simplify_new_line, NULL,
2328 a, BT_CHARACTER, dc, REQUIRED);
2330 make_generic ("new_line", GFC_ISYM_NEW_LINE, GFC_STD_F2003);
2332 add_sym_2 ("nint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2333 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
2334 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2336 add_sym_1 ("idnint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2337 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
2338 a, BT_REAL, dd, REQUIRED);
2340 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
2342 add_sym_1 ("not", GFC_ISYM_NOT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2343 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
2344 i, BT_INTEGER, di, REQUIRED);
2346 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
2348 add_sym_2 ("norm2", GFC_ISYM_NORM2, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr,
2349 GFC_STD_F2008, gfc_check_norm2, gfc_simplify_norm2, gfc_resolve_norm2,
2350 x, BT_REAL, dr, REQUIRED,
2351 dm, BT_INTEGER, ii, OPTIONAL);
2353 make_generic ("norm2", GFC_ISYM_NORM2, GFC_STD_F2008);
2355 add_sym_1 ("null", GFC_ISYM_NULL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2356 gfc_check_null, gfc_simplify_null, NULL,
2357 mo, BT_INTEGER, di, OPTIONAL);
2359 make_generic ("null", GFC_ISYM_NULL, GFC_STD_F95);
2361 add_sym_0 ("num_images", GFC_ISYM_NUM_IMAGES, CLASS_INQUIRY, ACTUAL_NO,
2362 BT_INTEGER, di, GFC_STD_F2008,
2363 NULL, gfc_simplify_num_images, NULL);
2365 add_sym_3 ("pack", GFC_ISYM_PACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2366 gfc_check_pack, gfc_simplify_pack, gfc_resolve_pack,
2367 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2368 v, BT_REAL, dr, OPTIONAL);
2370 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
2373 add_sym_2 ("parity", GFC_ISYM_PARITY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl,
2374 GFC_STD_F2008, gfc_check_parity, gfc_simplify_parity, gfc_resolve_parity,
2375 msk, BT_LOGICAL, dl, REQUIRED,
2376 dm, BT_INTEGER, ii, OPTIONAL);
2378 make_generic ("parity", GFC_ISYM_PARITY, GFC_STD_F2008);
2380 add_sym_1 ("popcnt", GFC_ISYM_POPCNT, CLASS_ELEMENTAL, ACTUAL_NO,
2381 BT_INTEGER, di, GFC_STD_F2008,
2382 gfc_check_i, gfc_simplify_popcnt, NULL,
2383 i, BT_INTEGER, di, REQUIRED);
2385 make_generic ("popcnt", GFC_ISYM_POPCNT, GFC_STD_F2008);
2387 add_sym_1 ("poppar", GFC_ISYM_POPPAR, CLASS_ELEMENTAL, ACTUAL_NO,
2388 BT_INTEGER, di, GFC_STD_F2008,
2389 gfc_check_i, gfc_simplify_poppar, NULL,
2390 i, BT_INTEGER, di, REQUIRED);
2392 make_generic ("poppar", GFC_ISYM_POPPAR, GFC_STD_F2008);
2394 add_sym_1 ("precision", GFC_ISYM_PRECISION, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2395 gfc_check_precision, gfc_simplify_precision, NULL,
2396 x, BT_UNKNOWN, 0, REQUIRED);
2398 make_generic ("precision", GFC_ISYM_PRECISION, GFC_STD_F95);
2400 add_sym_1_intent ("present", GFC_ISYM_PRESENT, CLASS_INQUIRY, ACTUAL_NO,
2401 BT_LOGICAL, dl, GFC_STD_F95, gfc_check_present, NULL, NULL,
2402 a, BT_REAL, dr, REQUIRED, INTENT_UNKNOWN);
2404 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
2406 add_sym_3red ("product", GFC_ISYM_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2407 gfc_check_product_sum, gfc_simplify_product, gfc_resolve_product,
2408 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2409 msk, BT_LOGICAL, dl, OPTIONAL);
2411 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
2413 add_sym_1 ("radix", GFC_ISYM_RADIX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2414 gfc_check_radix, gfc_simplify_radix, NULL,
2415 x, BT_UNKNOWN, 0, REQUIRED);
2417 make_generic ("radix", GFC_ISYM_RADIX, GFC_STD_F95);
2419 /* The following function is for G77 compatibility. */
2420 add_sym_1 ("rand", GFC_ISYM_RAND, CLASS_IMPURE, ACTUAL_NO, BT_REAL,
2421 4, GFC_STD_GNU, gfc_check_rand, NULL, NULL,
2422 i, BT_INTEGER, 4, OPTIONAL);
2424 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
2425 use slightly different shoddy multiplicative congruential PRNG. */
2426 make_alias ("ran", GFC_STD_GNU);
2428 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
2430 add_sym_1 ("range", GFC_ISYM_RANGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2431 gfc_check_range, gfc_simplify_range, NULL,
2432 x, BT_REAL, dr, REQUIRED);
2434 make_generic ("range", GFC_ISYM_RANGE, GFC_STD_F95);
2436 add_sym_2 ("real", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2437 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
2438 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2440 /* This provides compatibility with g77. */
2441 add_sym_1 ("realpart", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2442 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
2443 a, BT_UNKNOWN, dr, REQUIRED);
2445 add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2446 gfc_check_float, gfc_simplify_float, NULL,
2447 a, BT_INTEGER, di, REQUIRED);
2449 add_sym_1 ("dfloat", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
2450 gfc_check_float, gfc_simplify_dble, gfc_resolve_dble,
2451 a, BT_REAL, dr, REQUIRED);
2453 add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2454 gfc_check_sngl, gfc_simplify_sngl, NULL,
2455 a, BT_REAL, dd, REQUIRED);
2457 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
2459 add_sym_2 ("rename", GFC_ISYM_RENAME, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2460 GFC_STD_GNU, gfc_check_rename, NULL, gfc_resolve_rename,
2461 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2463 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
2465 add_sym_2 ("repeat", GFC_ISYM_REPEAT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2466 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
2467 stg, BT_CHARACTER, dc, REQUIRED, ncopies, BT_INTEGER, di, REQUIRED);
2469 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
2471 add_sym_4 ("reshape", GFC_ISYM_RESHAPE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2472 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
2473 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
2474 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
2476 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
2478 add_sym_1 ("rrspacing", GFC_ISYM_RRSPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2479 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
2480 x, BT_REAL, dr, REQUIRED);
2482 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
2484 add_sym_2 ("same_type_as", GFC_ISYM_SAME_TYPE_AS, CLASS_INQUIRY, ACTUAL_NO,
2485 BT_LOGICAL, dl, GFC_STD_F2003,
2486 gfc_check_same_type_as, gfc_simplify_same_type_as, NULL,
2487 a, BT_UNKNOWN, 0, REQUIRED,
2488 b, BT_UNKNOWN, 0, REQUIRED);
2490 add_sym_2 ("scale", GFC_ISYM_SCALE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2491 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
2492 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2494 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
2496 add_sym_4 ("scan", GFC_ISYM_SCAN, CLASS_ELEMENTAL, ACTUAL_NO,
2497 BT_INTEGER, di, GFC_STD_F95,
2498 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
2499 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2500 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2502 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
2504 /* Added for G77 compatibility garbage. */
2505 add_sym_0 ("second", GFC_ISYM_SECOND, CLASS_IMPURE, ACTUAL_NO, BT_REAL,
2506 4, GFC_STD_GNU, NULL, NULL, NULL);
2508 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
2510 /* Added for G77 compatibility. */
2511 add_sym_1 ("secnds", GFC_ISYM_SECNDS, CLASS_IMPURE, ACTUAL_NO, BT_REAL,
2512 dr, GFC_STD_GNU, gfc_check_secnds, NULL, gfc_resolve_secnds,
2513 x, BT_REAL, dr, REQUIRED);
2515 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
2517 add_sym_1 ("selected_char_kind", GFC_ISYM_SC_KIND, CLASS_TRANSFORMATIONAL,
2518 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003,
2519 gfc_check_selected_char_kind, gfc_simplify_selected_char_kind,
2520 NULL, nm, BT_CHARACTER, dc, REQUIRED);
2522 make_generic ("selected_char_kind", GFC_ISYM_SC_KIND, GFC_STD_F2003);
2524 add_sym_1 ("selected_int_kind", GFC_ISYM_SI_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2525 GFC_STD_F95, gfc_check_selected_int_kind,
2526 gfc_simplify_selected_int_kind, NULL, r, BT_INTEGER, di, REQUIRED);
2528 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
2530 add_sym_3 ("selected_real_kind", GFC_ISYM_SR_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2531 GFC_STD_F95, gfc_check_selected_real_kind,
2532 gfc_simplify_selected_real_kind, NULL,
2533 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL,
2534 "radix", BT_INTEGER, di, OPTIONAL);
2536 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
2538 add_sym_2 ("set_exponent", GFC_ISYM_SET_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2539 gfc_check_set_exponent, gfc_simplify_set_exponent,
2540 gfc_resolve_set_exponent,
2541 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2543 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
2545 add_sym_2 ("shape", GFC_ISYM_SHAPE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2546 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
2547 src, BT_REAL, dr, REQUIRED,
2548 kind, BT_INTEGER, di, OPTIONAL);
2550 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
2552 add_sym_2 ("shifta", GFC_ISYM_SHIFTA, CLASS_ELEMENTAL, ACTUAL_NO,
2553 BT_INTEGER, di, GFC_STD_F2008,
2554 gfc_check_shift, gfc_simplify_shifta, gfc_resolve_shift,
2555 i, BT_INTEGER, di, REQUIRED,
2556 sh, BT_INTEGER, di, REQUIRED);
2558 make_generic ("shifta", GFC_ISYM_SHIFTA, GFC_STD_F2008);
2560 add_sym_2 ("shiftl", GFC_ISYM_SHIFTL, CLASS_ELEMENTAL, ACTUAL_NO,
2561 BT_INTEGER, di, GFC_STD_F2008,
2562 gfc_check_shift, gfc_simplify_shiftl, gfc_resolve_shift,
2563 i, BT_INTEGER, di, REQUIRED,
2564 sh, BT_INTEGER, di, REQUIRED);
2566 make_generic ("shiftl", GFC_ISYM_SHIFTL, GFC_STD_F2008);
2568 add_sym_2 ("shiftr", GFC_ISYM_SHIFTR, CLASS_ELEMENTAL, ACTUAL_NO,
2569 BT_INTEGER, di, GFC_STD_F2008,
2570 gfc_check_shift, gfc_simplify_shiftr, gfc_resolve_shift,
2571 i, BT_INTEGER, di, REQUIRED,
2572 sh, BT_INTEGER, di, REQUIRED);
2574 make_generic ("shiftr", GFC_ISYM_SHIFTR, GFC_STD_F2008);
2576 add_sym_2 ("sign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2577 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
2578 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
2580 add_sym_2 ("isign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2581 NULL, gfc_simplify_sign, gfc_resolve_sign,
2582 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2584 add_sym_2 ("dsign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2585 gfc_check_x_yd, gfc_simplify_sign, gfc_resolve_sign,
2586 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2588 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2590 add_sym_2 ("signal", GFC_ISYM_SIGNAL, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
2591 di, GFC_STD_GNU, gfc_check_signal, NULL, gfc_resolve_signal,
2592 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2594 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2596 add_sym_1 ("sin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2597 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2598 x, BT_REAL, dr, REQUIRED);
2600 add_sym_1 ("dsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2601 gfc_check_fn_d, gfc_simplify_sin, gfc_resolve_sin,
2602 x, BT_REAL, dd, REQUIRED);
2604 add_sym_1 ("csin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2605 NULL, gfc_simplify_sin, gfc_resolve_sin,
2606 x, BT_COMPLEX, dz, REQUIRED);
2608 add_sym_1 ("zsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2609 NULL, gfc_simplify_sin, gfc_resolve_sin,
2610 x, BT_COMPLEX, dd, REQUIRED);
2612 make_alias ("cdsin", GFC_STD_GNU);
2614 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2616 add_sym_1 ("sinh", GFC_ISYM_SINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2617 gfc_check_fn_rc2008, gfc_simplify_sinh, gfc_resolve_sinh,
2618 x, BT_REAL, dr, REQUIRED);
2620 add_sym_1 ("dsinh", GFC_ISYM_SINH,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2621 gfc_check_fn_d, gfc_simplify_sinh, gfc_resolve_sinh,
2622 x, BT_REAL, dd, REQUIRED);
2624 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2626 add_sym_3 ("size", GFC_ISYM_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2627 BT_INTEGER, di, GFC_STD_F95,
2628 gfc_check_size, gfc_simplify_size, gfc_resolve_size,
2629 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2630 kind, BT_INTEGER, di, OPTIONAL);
2632 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2634 add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, ii,
2635 GFC_STD_GNU, gfc_check_sizeof, NULL, NULL,
2636 x, BT_UNKNOWN, 0, REQUIRED);
2638 make_generic ("sizeof", GFC_ISYM_SIZEOF, GFC_STD_GNU);
2640 /* C_SIZEOF is part of ISO_C_BINDING. */
2641 add_sym_1 ("c_sizeof", GFC_ISYM_C_SIZEOF, CLASS_INQUIRY, ACTUAL_NO,
2642 BT_INTEGER, ii, GFC_STD_F2008, gfc_check_c_sizeof, NULL, NULL,
2643 x, BT_UNKNOWN, 0, REQUIRED);
2646 /* COMPILER_OPTIONS and COMPILER_VERSION are part of ISO_FORTRAN_ENV. */
2647 add_sym_0 ("compiler_options", GFC_ISYM_COMPILER_OPTIONS, CLASS_INQUIRY,
2648 ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F2008,
2649 NULL, gfc_simplify_compiler_options, NULL);
2652 add_sym_0 ("compiler_version", GFC_ISYM_COMPILER_VERSION, CLASS_INQUIRY,
2653 ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F2008,
2654 NULL, gfc_simplify_compiler_version, NULL);
2657 add_sym_1 ("spacing", GFC_ISYM_SPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2658 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2659 x, BT_REAL, dr, REQUIRED);
2661 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2663 add_sym_3 ("spread", GFC_ISYM_SPREAD, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2664 gfc_check_spread, gfc_simplify_spread, gfc_resolve_spread,
2665 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2666 ncopies, BT_INTEGER, di, REQUIRED);
2668 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2670 add_sym_1 ("sqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2671 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2672 x, BT_REAL, dr, REQUIRED);
2674 add_sym_1 ("dsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2675 gfc_check_fn_d, gfc_simplify_sqrt, gfc_resolve_sqrt,
2676 x, BT_REAL, dd, REQUIRED);
2678 add_sym_1 ("csqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2679 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2680 x, BT_COMPLEX, dz, REQUIRED);
2682 add_sym_1 ("zsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2683 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2684 x, BT_COMPLEX, dd, REQUIRED);
2686 make_alias ("cdsqrt", GFC_STD_GNU);
2688 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2690 add_sym_2_intent ("stat", GFC_ISYM_STAT, CLASS_IMPURE, ACTUAL_NO,
2691 BT_INTEGER, di, GFC_STD_GNU,
2692 gfc_check_stat, NULL, gfc_resolve_stat,
2693 nm, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2694 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT);
2696 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2698 add_sym_2 ("storage_size", GFC_ISYM_STORAGE_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2699 BT_INTEGER, di, GFC_STD_F2008,
2700 gfc_check_storage_size, NULL, gfc_resolve_storage_size,
2701 a, BT_UNKNOWN, 0, REQUIRED,
2702 kind, BT_INTEGER, di, OPTIONAL);
2704 add_sym_3red ("sum", GFC_ISYM_SUM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2705 gfc_check_product_sum, gfc_simplify_sum, gfc_resolve_sum,
2706 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2707 msk, BT_LOGICAL, dl, OPTIONAL);
2709 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2711 add_sym_2 ("symlnk", GFC_ISYM_SYMLNK, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2712 GFC_STD_GNU, gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2713 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2715 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2717 add_sym_1 ("system", GFC_ISYM_SYSTEM, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2718 GFC_STD_GNU, NULL, NULL, NULL,
2719 com, BT_CHARACTER, dc, REQUIRED);
2721 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2723 add_sym_1 ("tan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2724 gfc_check_fn_rc2008, gfc_simplify_tan, gfc_resolve_tan,
2725 x, BT_REAL, dr, REQUIRED);
2727 add_sym_1 ("dtan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2728 gfc_check_fn_d, gfc_simplify_tan, gfc_resolve_tan,
2729 x, BT_REAL, dd, REQUIRED);
2731 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2733 add_sym_1 ("tanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2734 gfc_check_fn_rc2008, gfc_simplify_tanh, gfc_resolve_tanh,
2735 x, BT_REAL, dr, REQUIRED);
2737 add_sym_1 ("dtanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2738 gfc_check_fn_d, gfc_simplify_tanh, gfc_resolve_tanh,
2739 x, BT_REAL, dd, REQUIRED);
2741 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2743 add_sym_2 ("this_image", GFC_ISYM_THIS_IMAGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2008,
2744 gfc_check_this_image, gfc_simplify_this_image, gfc_resolve_this_image,
2745 ca, BT_REAL, dr, OPTIONAL, dm, BT_INTEGER, ii, OPTIONAL);
2747 add_sym_0 ("time", GFC_ISYM_TIME, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
2748 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_time);
2750 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2752 add_sym_0 ("time8", GFC_ISYM_TIME8, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
2753 di, GFC_STD_GNU, NULL, NULL, gfc_resolve_time8);
2755 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2757 add_sym_1 ("tiny", GFC_ISYM_TINY, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2758 gfc_check_x, gfc_simplify_tiny, NULL,
2759 x, BT_REAL, dr, REQUIRED);
2761 make_generic ("tiny", GFC_ISYM_TINY, GFC_STD_F95);
2763 add_sym_1 ("trailz", GFC_ISYM_TRAILZ, CLASS_ELEMENTAL, ACTUAL_NO,
2764 BT_INTEGER, di, GFC_STD_F2008,
2765 gfc_check_i, gfc_simplify_trailz, NULL,
2766 i, BT_INTEGER, di, REQUIRED);
2768 make_generic ("trailz", GFC_ISYM_TRAILZ, GFC_STD_F2008);
2770 add_sym_3 ("transfer", GFC_ISYM_TRANSFER, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2771 gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2772 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2773 sz, BT_INTEGER, di, OPTIONAL);
2775 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2777 add_sym_1 ("transpose", GFC_ISYM_TRANSPOSE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2778 gfc_check_transpose, gfc_simplify_transpose, gfc_resolve_transpose,
2779 m, BT_REAL, dr, REQUIRED);
2781 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2783 add_sym_1 ("trim", GFC_ISYM_TRIM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2784 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2785 stg, BT_CHARACTER, dc, REQUIRED);
2787 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2789 add_sym_1 ("ttynam", GFC_ISYM_TTYNAM, CLASS_IMPURE, ACTUAL_NO, BT_CHARACTER,
2790 0, GFC_STD_GNU, gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2791 ut, BT_INTEGER, di, REQUIRED);
2793 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2795 add_sym_3 ("ubound", GFC_ISYM_UBOUND, CLASS_INQUIRY, ACTUAL_NO,
2796 BT_INTEGER, di, GFC_STD_F95,
2797 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2798 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2799 kind, BT_INTEGER, di, OPTIONAL);
2801 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2803 add_sym_3 ("ucobound", GFC_ISYM_UCOBOUND, CLASS_INQUIRY, ACTUAL_NO,
2804 BT_INTEGER, di, GFC_STD_F2008,
2805 gfc_check_ucobound, gfc_simplify_ucobound, gfc_resolve_ucobound,
2806 ca, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2807 kind, BT_INTEGER, di, OPTIONAL);
2809 make_generic ("ucobound", GFC_ISYM_UCOBOUND, GFC_STD_F2008);
2811 /* g77 compatibility for UMASK. */
2812 add_sym_1 ("umask", GFC_ISYM_UMASK, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, di,
2813 GFC_STD_GNU, gfc_check_umask, NULL, gfc_resolve_umask,
2814 msk, BT_INTEGER, di, REQUIRED);
2816 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2818 /* g77 compatibility for UNLINK. */
2819 add_sym_1 ("unlink", GFC_ISYM_UNLINK, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
2820 di, GFC_STD_GNU, gfc_check_unlink, NULL, gfc_resolve_unlink,
2821 "path", BT_CHARACTER, dc, REQUIRED);
2823 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2825 add_sym_3 ("unpack", GFC_ISYM_UNPACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2826 gfc_check_unpack, gfc_simplify_unpack, gfc_resolve_unpack,
2827 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2828 f, BT_REAL, dr, REQUIRED);
2830 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2832 add_sym_4 ("verify", GFC_ISYM_VERIFY, CLASS_ELEMENTAL, ACTUAL_NO,
2833 BT_INTEGER, di, GFC_STD_F95,
2834 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2835 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2836 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2838 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2840 add_sym_1 ("loc", GFC_ISYM_LOC, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, ii,
2841 GFC_STD_GNU, gfc_check_loc, NULL, gfc_resolve_loc,
2842 x, BT_UNKNOWN, 0, REQUIRED);
2844 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2848 /* Add intrinsic subroutines. */
2851 add_subroutines (void)
2853 /* Argument names as in the standard (to be used as argument keywords). */
2855 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2856 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2857 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2858 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2859 *com = "command", *length = "length", *st = "status",
2860 *val = "value", *num = "number", *name = "name",
2861 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2862 *sec = "seconds", *res = "result", *of = "offset", *md = "mode",
2863 *whence = "whence", *pos = "pos", *ptr = "ptr", *p1 = "path1",
2864 *p2 = "path2", *msk = "mask", *old = "old";
2866 int di, dr, dc, dl, ii;
2868 di = gfc_default_integer_kind;
2869 dr = gfc_default_real_kind;
2870 dc = gfc_default_character_kind;
2871 dl = gfc_default_logical_kind;
2872 ii = gfc_index_integer_kind;
2874 add_sym_0s ("abort", GFC_ISYM_ABORT, GFC_STD_GNU, NULL);
2878 add_sym_1s ("cpu_time", GFC_ISYM_CPU_TIME, CLASS_IMPURE, BT_UNKNOWN, 0,
2879 GFC_STD_F95, gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2880 tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
2882 /* More G77 compatibility garbage. */
2883 add_sym_2s ("ctime", GFC_ISYM_CTIME, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2884 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2885 tm, BT_INTEGER, di, REQUIRED, INTENT_IN,
2886 res, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2888 add_sym_1s ("idate", GFC_ISYM_IDATE, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2889 gfc_check_itime_idate, NULL, gfc_resolve_idate,
2890 vl, BT_INTEGER, 4, REQUIRED, INTENT_OUT);
2892 add_sym_1s ("itime", GFC_ISYM_ITIME, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2893 gfc_check_itime_idate, NULL, gfc_resolve_itime,
2894 vl, BT_INTEGER, 4, REQUIRED, INTENT_OUT);
2896 add_sym_2s ("ltime", GFC_ISYM_LTIME, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2897 gfc_check_ltime_gmtime, NULL, gfc_resolve_ltime,
2898 tm, BT_INTEGER, di, REQUIRED, INTENT_IN,
2899 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT);
2901 add_sym_2s ("gmtime", GFC_ISYM_GMTIME, CLASS_IMPURE, BT_UNKNOWN, 0,
2902 GFC_STD_GNU, gfc_check_ltime_gmtime, NULL, gfc_resolve_gmtime,
2903 tm, BT_INTEGER, di, REQUIRED, INTENT_IN,
2904 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT);
2906 add_sym_1s ("second", GFC_ISYM_SECOND, CLASS_IMPURE, BT_UNKNOWN, 0,
2907 GFC_STD_GNU, gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2908 tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
2910 add_sym_2s ("chdir", GFC_ISYM_CHDIR, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2911 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2912 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2913 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2915 add_sym_3s ("chmod", GFC_ISYM_CHMOD, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2916 gfc_check_chmod_sub, NULL, gfc_resolve_chmod_sub,
2917 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2918 md, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2919 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2921 add_sym_4s ("date_and_time", GFC_ISYM_DATE_AND_TIME, CLASS_IMPURE, BT_UNKNOWN,
2922 0, GFC_STD_F95, gfc_check_date_and_time, NULL, NULL,
2923 dt, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2924 tm, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2925 zn, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2926 vl, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2928 /* More G77 compatibility garbage. */
2929 add_sym_2s ("etime", GFC_ISYM_ETIME, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2930 gfc_check_dtime_etime_sub, NULL, gfc_resolve_etime_sub,
2931 vl, BT_REAL, 4, REQUIRED, INTENT_OUT,
2932 tm, BT_REAL, 4, REQUIRED, INTENT_OUT);
2934 add_sym_2s ("dtime", GFC_ISYM_DTIME, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2935 gfc_check_dtime_etime_sub, NULL, gfc_resolve_dtime_sub,
2936 vl, BT_REAL, 4, REQUIRED, INTENT_OUT,
2937 tm, BT_REAL, 4, REQUIRED, INTENT_OUT);
2939 add_sym_5s ("execute_command_line", GFC_ISYM_EXECUTE_COMMAND_LINE,
2940 CLASS_IMPURE , BT_UNKNOWN, 0, GFC_STD_F2008,
2941 NULL, NULL, gfc_resolve_execute_command_line,
2942 "command", BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2943 "wait", BT_LOGICAL, dl, OPTIONAL, INTENT_IN,
2944 "exitstat", BT_INTEGER, di, OPTIONAL, INTENT_INOUT,
2945 "cmdstat", BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2946 "cmdmsg", BT_CHARACTER, dc, OPTIONAL, INTENT_INOUT);
2948 add_sym_1s ("fdate", GFC_ISYM_FDATE, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
2949 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2950 dt, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2952 add_sym_1s ("gerror", GFC_ISYM_GERROR, CLASS_IMPURE, BT_UNKNOWN,
2953 0, GFC_STD_GNU, gfc_check_gerror, NULL, gfc_resolve_gerror,
2954 res, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2956 add_sym_2s ("getcwd", GFC_ISYM_GETCWD, CLASS_IMPURE, BT_UNKNOWN, 0,
2957 GFC_STD_GNU, gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2958 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT,
2959 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2961 add_sym_2s ("getenv", GFC_ISYM_GETENV, CLASS_IMPURE, BT_UNKNOWN,
2962 0, GFC_STD_GNU, NULL, NULL, NULL,
2963 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2964 val, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2966 add_sym_2s ("getarg", GFC_ISYM_GETARG, CLASS_IMPURE, BT_UNKNOWN,
2967 0, GFC_STD_GNU, gfc_check_getarg, NULL, gfc_resolve_getarg,
2968 pos, BT_INTEGER, di, REQUIRED, INTENT_IN,
2969 val, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2971 add_sym_1s ("getlog", GFC_ISYM_GETLOG, CLASS_IMPURE, BT_UNKNOWN,
2972 0, GFC_STD_GNU, gfc_check_getlog, NULL, gfc_resolve_getlog,
2973 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
2975 /* F2003 commandline routines. */
2977 add_sym_3s ("get_command", GFC_ISYM_GET_COMMAND, CLASS_IMPURE,
2978 BT_UNKNOWN, 0, GFC_STD_F2003,
2979 NULL, NULL, gfc_resolve_get_command,
2980 com, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2981 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2982 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2984 add_sym_4s ("get_command_argument", GFC_ISYM_GET_COMMAND_ARGUMENT,
2985 CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_F2003, NULL, NULL,
2986 gfc_resolve_get_command_argument,
2987 num, BT_INTEGER, di, REQUIRED, INTENT_IN,
2988 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2989 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2990 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2992 /* F2003 subroutine to get environment variables. */
2994 add_sym_5s ("get_environment_variable", GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
2995 CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_F2003,
2996 NULL, NULL, gfc_resolve_get_environment_variable,
2997 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2998 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2999 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
3000 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
3001 trim_name, BT_LOGICAL, dl, OPTIONAL, INTENT_IN);
3003 add_sym_2s ("move_alloc", GFC_ISYM_MOVE_ALLOC, CLASS_PURE, BT_UNKNOWN, 0,
3005 gfc_check_move_alloc, NULL, NULL,
3006 f, BT_UNKNOWN, 0, REQUIRED, INTENT_INOUT,
3007 t, BT_UNKNOWN, 0, REQUIRED, INTENT_OUT);
3009 add_sym_5s ("mvbits", GFC_ISYM_MVBITS, CLASS_ELEMENTAL, BT_UNKNOWN, 0,
3010 GFC_STD_F95, gfc_check_mvbits, gfc_simplify_mvbits,
3012 f, BT_INTEGER, di, REQUIRED, INTENT_IN,
3013 fp, BT_INTEGER, di, REQUIRED, INTENT_IN,
3014 ln, BT_INTEGER, di, REQUIRED, INTENT_IN,
3015 t, BT_INTEGER, di, REQUIRED, INTENT_INOUT,
3016 tp, BT_INTEGER, di, REQUIRED, INTENT_IN);
3018 add_sym_1s ("random_number", GFC_ISYM_RANDOM_NUMBER, CLASS_IMPURE,
3019 BT_UNKNOWN, 0, GFC_STD_F95,
3020 gfc_check_random_number, NULL, gfc_resolve_random_number,
3021 h, BT_REAL, dr, REQUIRED, INTENT_OUT);
3023 add_sym_3s ("random_seed", GFC_ISYM_RANDOM_SEED, CLASS_IMPURE,
3024 BT_UNKNOWN, 0, GFC_STD_F95,
3025 gfc_check_random_seed, NULL, gfc_resolve_random_seed,
3026 sz, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
3027 pt, BT_INTEGER, di, OPTIONAL, INTENT_IN,
3028 gt, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3030 /* More G77 compatibility garbage. */
3031 add_sym_3s ("alarm", GFC_ISYM_ALARM, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3032 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
3033 sec, BT_INTEGER, di, REQUIRED, INTENT_IN,
3034 han, BT_UNKNOWN, 0, REQUIRED, INTENT_IN,
3035 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3037 add_sym_1s ("srand", GFC_ISYM_SRAND, CLASS_IMPURE, BT_UNKNOWN,
3038 di, GFC_STD_GNU, gfc_check_srand, NULL, gfc_resolve_srand,
3039 "seed", BT_INTEGER, 4, REQUIRED, INTENT_IN);
3041 add_sym_1s ("exit", GFC_ISYM_EXIT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3042 gfc_check_exit, NULL, gfc_resolve_exit,
3043 st, BT_INTEGER, di, OPTIONAL, INTENT_IN);
3047 add_sym_3s ("fgetc", GFC_ISYM_FGETC, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3048 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
3049 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3050 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT,
3051 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3053 add_sym_2s ("fget", GFC_ISYM_FGET, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3054 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
3055 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT,
3056 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3058 add_sym_1s ("flush", GFC_ISYM_FLUSH, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3059 gfc_check_flush, NULL, gfc_resolve_flush,
3060 ut, BT_INTEGER, di, OPTIONAL, INTENT_IN);
3062 add_sym_3s ("fputc", GFC_ISYM_FPUTC, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3063 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
3064 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3065 c, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3066 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3068 add_sym_2s ("fput", GFC_ISYM_FPUT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3069 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
3070 c, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3071 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3073 add_sym_1s ("free", GFC_ISYM_FREE, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3074 gfc_check_free, NULL, gfc_resolve_free,
3075 ptr, BT_INTEGER, ii, REQUIRED, INTENT_INOUT);
3077 add_sym_4s ("fseek", GFC_ISYM_FSEEK, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3078 gfc_check_fseek_sub, NULL, gfc_resolve_fseek_sub,
3079 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3080 of, BT_INTEGER, di, REQUIRED, INTENT_IN,
3081 whence, BT_INTEGER, di, REQUIRED, INTENT_IN,
3082 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3084 add_sym_2s ("ftell", GFC_ISYM_FTELL, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3085 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
3086 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3087 of, BT_INTEGER, ii, REQUIRED, INTENT_OUT);
3089 add_sym_2s ("hostnm", GFC_ISYM_HOSTNM, CLASS_IMPURE, BT_UNKNOWN, 0,
3090 GFC_STD_GNU, gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
3091 c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT,
3092 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3094 add_sym_3s ("kill", GFC_ISYM_KILL, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3095 gfc_check_kill_sub, NULL, gfc_resolve_kill_sub,
3096 c, BT_INTEGER, di, REQUIRED, INTENT_IN,
3097 val, BT_INTEGER, di, REQUIRED, INTENT_IN,
3098 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3100 add_sym_3s ("link", GFC_ISYM_LINK, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3101 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
3102 p1, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3103 p2, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3104 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3106 add_sym_1s ("perror", GFC_ISYM_PERROR, CLASS_IMPURE, BT_UNKNOWN,
3107 0, GFC_STD_GNU, gfc_check_perror, NULL, gfc_resolve_perror,
3108 "string", BT_CHARACTER, dc, REQUIRED, INTENT_IN);
3110 add_sym_3s ("rename", GFC_ISYM_RENAME, CLASS_IMPURE, BT_UNKNOWN, 0,
3111 GFC_STD_GNU, gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
3112 p1, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3113 p2, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3114 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3116 add_sym_1s ("sleep", GFC_ISYM_SLEEP, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3117 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
3118 sec, BT_INTEGER, di, REQUIRED, INTENT_IN);
3120 add_sym_3s ("fstat", GFC_ISYM_FSTAT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3121 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
3122 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3123 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT,
3124 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3126 add_sym_3s ("lstat", GFC_ISYM_LSTAT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3127 gfc_check_stat_sub, NULL, gfc_resolve_lstat_sub,
3128 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3129 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT,
3130 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3132 add_sym_3s ("stat", GFC_ISYM_STAT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3133 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
3134 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3135 vl, BT_INTEGER, di, REQUIRED, INTENT_OUT,
3136 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3138 add_sym_3s ("signal", GFC_ISYM_SIGNAL, CLASS_IMPURE, BT_UNKNOWN, 0,
3139 GFC_STD_GNU, gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
3140 num, BT_INTEGER, di, REQUIRED, INTENT_IN,
3141 han, BT_UNKNOWN, 0, REQUIRED, INTENT_IN,
3142 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3144 add_sym_3s ("symlnk", GFC_ISYM_SYMLINK, CLASS_IMPURE, BT_UNKNOWN, 0,
3145 GFC_STD_GNU, gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
3146 p1, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3147 p2, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3148 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3150 add_sym_2s ("system", GFC_ISYM_SYSTEM, CLASS_IMPURE, BT_UNKNOWN,
3151 0, GFC_STD_GNU, NULL, NULL, gfc_resolve_system_sub,
3152 com, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3153 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3155 add_sym_3s ("system_clock", GFC_ISYM_SYSTEM_CLOCK, CLASS_IMPURE,
3156 BT_UNKNOWN, 0, GFC_STD_F95,
3157 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
3158 c, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
3159 cr, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
3160 cm, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3162 add_sym_2s ("ttynam", GFC_ISYM_TTYNAM, CLASS_IMPURE, BT_UNKNOWN, 0,
3163 GFC_STD_GNU, gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
3164 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
3165 name, BT_CHARACTER, dc, REQUIRED, INTENT_OUT);
3167 add_sym_2s ("umask", GFC_ISYM_UMASK, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU,
3168 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
3169 msk, BT_INTEGER, di, REQUIRED, INTENT_IN,
3170 old, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3172 add_sym_2s ("unlink", GFC_ISYM_UNLINK, CLASS_IMPURE, BT_UNKNOWN, 0,
3173 GFC_STD_GNU, gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
3174 "path", BT_CHARACTER, dc, REQUIRED, INTENT_IN,
3175 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
3179 /* Add a function to the list of conversion symbols. */
3182 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
3184 gfc_typespec from, to;
3185 gfc_intrinsic_sym *sym;
3187 if (sizing == SZ_CONVS)
3193 gfc_clear_ts (&from);
3194 from.type = from_type;
3195 from.kind = from_kind;
3201 sym = conversion + nconv;
3203 sym->name = conv_name (&from, &to);
3204 sym->lib_name = sym->name;
3205 sym->simplify.cc = gfc_convert_constant;
3206 sym->standard = standard;
3209 sym->conversion = 1;
3211 sym->id = GFC_ISYM_CONVERSION;
3217 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
3218 functions by looping over the kind tables. */
3221 add_conversions (void)
3225 /* Integer-Integer conversions. */
3226 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3227 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
3232 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3233 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
3236 /* Integer-Real/Complex conversions. */
3237 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3238 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
3240 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3241 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3243 add_conv (BT_REAL, gfc_real_kinds[j].kind,
3244 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
3246 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3247 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3249 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
3250 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
3253 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3255 /* Hollerith-Integer conversions. */
3256 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3257 add_conv (BT_HOLLERITH, gfc_default_character_kind,
3258 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3259 /* Hollerith-Real conversions. */
3260 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3261 add_conv (BT_HOLLERITH, gfc_default_character_kind,
3262 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
3263 /* Hollerith-Complex conversions. */
3264 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3265 add_conv (BT_HOLLERITH, gfc_default_character_kind,
3266 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
3268 /* Hollerith-Character conversions. */
3269 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
3270 gfc_default_character_kind, GFC_STD_LEGACY);
3272 /* Hollerith-Logical conversions. */
3273 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
3274 add_conv (BT_HOLLERITH, gfc_default_character_kind,
3275 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
3278 /* Real/Complex - Real/Complex conversions. */
3279 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3280 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
3284 add_conv (BT_REAL, gfc_real_kinds[i].kind,
3285 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3287 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3288 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3291 add_conv (BT_REAL, gfc_real_kinds[i].kind,
3292 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3294 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3295 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3298 /* Logical/Logical kind conversion. */
3299 for (i = 0; gfc_logical_kinds[i].kind; i++)
3300 for (j = 0; gfc_logical_kinds[j].kind; j++)
3305 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
3306 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
3309 /* Integer-Logical and Logical-Integer conversions. */
3310 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3311 for (i=0; gfc_integer_kinds[i].kind; i++)
3312 for (j=0; gfc_logical_kinds[j].kind; j++)
3314 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3315 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
3316 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
3317 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3323 add_char_conversions (void)
3327 /* Count possible conversions. */
3328 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3329 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3333 /* Allocate memory. */
3334 char_conversions = XCNEWVEC (gfc_intrinsic_sym, ncharconv);
3336 /* Add the conversions themselves. */
3338 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3339 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3341 gfc_typespec from, to;
3346 gfc_clear_ts (&from);
3347 from.type = BT_CHARACTER;
3348 from.kind = gfc_character_kinds[i].kind;
3351 to.type = BT_CHARACTER;
3352 to.kind = gfc_character_kinds[j].kind;
3354 char_conversions[n].name = conv_name (&from, &to);
3355 char_conversions[n].lib_name = char_conversions[n].name;
3356 char_conversions[n].simplify.cc = gfc_convert_char_constant;
3357 char_conversions[n].standard = GFC_STD_F2003;
3358 char_conversions[n].elemental = 1;
3359 char_conversions[n].pure = 1;
3360 char_conversions[n].conversion = 0;
3361 char_conversions[n].ts = to;
3362 char_conversions[n].id = GFC_ISYM_CONVERSION;
3369 /* Initialize the table of intrinsics. */
3371 gfc_intrinsic_init_1 (void)
3373 nargs = nfunc = nsub = nconv = 0;
3375 /* Create a namespace to hold the resolved intrinsic symbols. */
3376 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
3385 functions = XCNEWVAR (struct gfc_intrinsic_sym,
3386 sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
3387 + sizeof (gfc_intrinsic_arg) * nargs);
3389 next_sym = functions;
3390 subroutines = functions + nfunc;
3392 conversion = XCNEWVEC (gfc_intrinsic_sym, nconv);
3394 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
3396 sizing = SZ_NOTHING;
3403 /* Character conversion intrinsics need to be treated separately. */
3404 add_char_conversions ();
3409 gfc_intrinsic_done_1 (void)
3411 gfc_free (functions);
3412 gfc_free (conversion);
3413 gfc_free (char_conversions);
3414 gfc_free_namespace (gfc_intrinsic_namespace);
3418 /******** Subroutines to check intrinsic interfaces ***********/
3420 /* Given a formal argument list, remove any NULL arguments that may
3421 have been left behind by a sort against some formal argument list. */
3424 remove_nullargs (gfc_actual_arglist **ap)
3426 gfc_actual_arglist *head, *tail, *next;
3430 for (head = *ap; head; head = next)
3434 if (head->expr == NULL && !head->label)
3437 gfc_free_actual_arglist (head);
3456 /* Given an actual arglist and a formal arglist, sort the actual
3457 arglist so that its arguments are in a one-to-one correspondence
3458 with the format arglist. Arguments that are not present are given
3459 a blank gfc_actual_arglist structure. If something is obviously
3460 wrong (say, a missing required argument) we abort sorting and
3464 sort_actual (const char *name, gfc_actual_arglist **ap,
3465 gfc_intrinsic_arg *formal, locus *where)
3467 gfc_actual_arglist *actual, *a;
3468 gfc_intrinsic_arg *f;
3470 remove_nullargs (ap);
3473 for (f = formal; f; f = f->next)
3479 if (f == NULL && a == NULL) /* No arguments */
3483 { /* Put the nonkeyword arguments in a 1:1 correspondence */
3489 if (a->name != NULL)
3501 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
3505 /* Associate the remaining actual arguments, all of which have
3506 to be keyword arguments. */
3507 for (; a; a = a->next)
3509 for (f = formal; f; f = f->next)
3510 if (strcmp (a->name, f->name) == 0)
3515 if (a->name[0] == '%')
3516 gfc_error ("The argument list functions %%VAL, %%LOC or %%REF "
3517 "are not allowed in this context at %L", where);
3519 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
3520 a->name, name, where);
3524 if (f->actual != NULL)
3526 gfc_error ("Argument '%s' appears twice in call to '%s' at %L",
3527 f->name, name, where);
3535 /* At this point, all unmatched formal args must be optional. */
3536 for (f = formal; f; f = f->next)
3538 if (f->actual == NULL && f->optional == 0)
3540 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
3541 f->name, name, where);
3547 /* Using the formal argument list, string the actual argument list
3548 together in a way that corresponds with the formal list. */
3551 for (f = formal; f; f = f->next)
3553 if (f->actual && f->actual->label != NULL && f->ts.type)
3555 gfc_error ("ALTERNATE RETURN not permitted at %L", where);
3559 if (f->actual == NULL)
3561 a = gfc_get_actual_arglist ();
3562 a->missing_arg_type = f->ts.type;
3574 actual->next = NULL; /* End the sorted argument list. */
3580 /* Compare an actual argument list with an intrinsic's formal argument
3581 list. The lists are checked for agreement of type. We don't check
3582 for arrayness here. */
3585 check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym,
3588 gfc_actual_arglist *actual;
3589 gfc_intrinsic_arg *formal;
3592 formal = sym->formal;
3596 for (; formal; formal = formal->next, actual = actual->next, i++)
3600 if (actual->expr == NULL)
3605 /* A kind of 0 means we don't check for kind. */
3607 ts.kind = actual->expr->ts.kind;
3609 if (!gfc_compare_types (&ts, &actual->expr->ts))
3612 gfc_error ("Type of argument '%s' in call to '%s' at %L should "
3613 "be %s, not %s", gfc_current_intrinsic_arg[i]->name,
3614 gfc_current_intrinsic, &actual->expr->where,
3615 gfc_typename (&formal->ts),
3616 gfc_typename (&actual->expr->ts));
3620 /* If the formal argument is INTENT([IN]OUT), check for definability. */
3621 if (formal->intent == INTENT_INOUT || formal->intent == INTENT_OUT)
3623 const char* context = (error_flag
3624 ? _("actual argument to INTENT = OUT/INOUT")
3627 /* No pointer arguments for intrinsics. */
3628 if (gfc_check_vardef_context (actual->expr, false, context)
3638 /* Given a pointer to an intrinsic symbol and an expression node that
3639 represent the function call to that subroutine, figure out the type
3640 of the result. This may involve calling a resolution subroutine. */
3643 resolve_intrinsic (gfc_intrinsic_sym *specific, gfc_expr *e)
3645 gfc_expr *a1, *a2, *a3, *a4, *a5;
3646 gfc_actual_arglist *arg;
3648 if (specific->resolve.f1 == NULL)
3650 if (e->value.function.name == NULL)
3651 e->value.function.name = specific->lib_name;
3653 if (e->ts.type == BT_UNKNOWN)
3654 e->ts = specific->ts;
3658 arg = e->value.function.actual;
3660 /* Special case hacks for MIN and MAX. */
3661 if (specific->resolve.f1m == gfc_resolve_max
3662 || specific->resolve.f1m == gfc_resolve_min)
3664 (*specific->resolve.f1m) (e, arg);
3670 (*specific->resolve.f0) (e);
3679 (*specific->resolve.f1) (e, a1);
3688 (*specific->resolve.f2) (e, a1, a2);
3697 (*specific->resolve.f3) (e, a1, a2, a3);
3706 (*specific->resolve.f4) (e, a1, a2, a3, a4);
3715 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
3719 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
3723 /* Given an intrinsic symbol node and an expression node, call the
3724 simplification function (if there is one), perhaps replacing the
3725 expression with something simpler. We return FAILURE on an error
3726 of the simplification, SUCCESS if the simplification worked, even
3727 if nothing has changed in the expression itself. */
3730 do_simplify (gfc_intrinsic_sym *specific, gfc_expr *e)
3732 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
3733 gfc_actual_arglist *arg;
3735 /* Max and min require special handling due to the variable number
3737 if (specific->simplify.f1 == gfc_simplify_min)
3739 result = gfc_simplify_min (e);
3743 if (specific->simplify.f1 == gfc_simplify_max)
3745 result = gfc_simplify_max (e);
3749 if (specific->simplify.f1 == NULL)
3755 arg = e->value.function.actual;
3759 result = (*specific->simplify.f0) ();
3766 if (specific->simplify.cc == gfc_convert_constant
3767 || specific->simplify.cc == gfc_convert_char_constant)
3769 result = specific->simplify.cc (a1, specific->ts.type, specific->ts.kind);
3774 result = (*specific->simplify.f1) (a1);
3781 result = (*specific->simplify.f2) (a1, a2);
3788 result = (*specific->simplify.f3) (a1, a2, a3);
3795 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3802 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3805 ("do_simplify(): Too many args for intrinsic");
3812 if (result == &gfc_bad_expr)
3816 resolve_intrinsic (specific, e); /* Must call at run-time */
3819 result->where = e->where;
3820 gfc_replace_expr (e, result);
3827 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3828 error messages. This subroutine returns FAILURE if a subroutine
3829 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3830 list cannot match any intrinsic. */
3833 init_arglist (gfc_intrinsic_sym *isym)
3835 gfc_intrinsic_arg *formal;
3838 gfc_current_intrinsic = isym->name;
3841 for (formal = isym->formal; formal; formal = formal->next)
3843 if (i >= MAX_INTRINSIC_ARGS)
3844 gfc_internal_error ("init_arglist(): too many arguments");
3845 gfc_current_intrinsic_arg[i++] = formal;
3850 /* Given a pointer to an intrinsic symbol and an expression consisting
3851 of a function call, see if the function call is consistent with the
3852 intrinsic's formal argument list. Return SUCCESS if the expression
3853 and intrinsic match, FAILURE otherwise. */
3856 check_specific (gfc_intrinsic_sym *specific, gfc_expr *expr, int error_flag)
3858 gfc_actual_arglist *arg, **ap;
3861 ap = &expr->value.function.actual;
3863 init_arglist (specific);
3865 /* Don't attempt to sort the argument list for min or max. */
3866 if (specific->check.f1m == gfc_check_min_max
3867 || specific->check.f1m == gfc_check_min_max_integer
3868 || specific->check.f1m == gfc_check_min_max_real
3869 || specific->check.f1m == gfc_check_min_max_double)
3870 return (*specific->check.f1m) (*ap);
3872 if (sort_actual (specific->name, ap, specific->formal,
3873 &expr->where) == FAILURE)
3876 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3877 /* This is special because we might have to reorder the argument list. */
3878 t = gfc_check_minloc_maxloc (*ap);
3879 else if (specific->check.f3red == gfc_check_minval_maxval)
3880 /* This is also special because we also might have to reorder the
3882 t = gfc_check_minval_maxval (*ap);
3883 else if (specific->check.f3red == gfc_check_product_sum)
3884 /* Same here. The difference to the previous case is that we allow a
3885 general numeric type. */
3886 t = gfc_check_product_sum (*ap);
3887 else if (specific->check.f3red == gfc_check_transf_bit_intrins)
3888 /* Same as for PRODUCT and SUM, but different checks. */
3889 t = gfc_check_transf_bit_intrins (*ap);
3892 if (specific->check.f1 == NULL)
3894 t = check_arglist (ap, specific, error_flag);
3896 expr->ts = specific->ts;
3899 t = do_check (specific, *ap);
3902 /* Check conformance of elemental intrinsics. */
3903 if (t == SUCCESS && specific->elemental)
3906 gfc_expr *first_expr;
3907 arg = expr->value.function.actual;
3909 /* There is no elemental intrinsic without arguments. */
3910 gcc_assert(arg != NULL);
3911 first_expr = arg->expr;
3913 for ( ; arg && arg->expr; arg = arg->next, n++)
3914 if (gfc_check_conformance (first_expr, arg->expr,
3915 "arguments '%s' and '%s' for "
3917 gfc_current_intrinsic_arg[0]->name,
3918 gfc_current_intrinsic_arg[n]->name,
3919 gfc_current_intrinsic) == FAILURE)
3924 remove_nullargs (ap);
3930 /* Check whether an intrinsic belongs to whatever standard the user
3931 has chosen, taking also into account -fall-intrinsics. Here, no
3932 warning/error is emitted; but if symstd is not NULL, it is pointed to a
3933 textual representation of the symbols standard status (like
3934 "new in Fortran 2008", "a GNU extension" or "obsolescent in Fortran 95") that
3935 can be used to construct a detailed warning/error message in case of
3939 gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym,
3940 const char** symstd, bool silent, locus where)
3942 const char* symstd_msg;
3944 /* For -fall-intrinsics, just succeed. */
3945 if (gfc_option.flag_all_intrinsics)
3948 /* Find the symbol's standard message for later usage. */
3949 switch (isym->standard)
3952 symstd_msg = "available since Fortran 77";
3955 case GFC_STD_F95_OBS:
3956 symstd_msg = "obsolescent in Fortran 95";
3959 case GFC_STD_F95_DEL:
3960 symstd_msg = "deleted in Fortran 95";
3964 symstd_msg = "new in Fortran 95";
3968 symstd_msg = "new in Fortran 2003";
3972 symstd_msg = "new in Fortran 2008";
3976 symstd_msg = "a GNU Fortran extension";
3979 case GFC_STD_LEGACY:
3980 symstd_msg = "for backward compatibility";
3984 gfc_internal_error ("Invalid standard code on intrinsic '%s' (%d)",
3985 isym->name, isym->standard);
3988 /* If warning about the standard, warn and succeed. */
3989 if (gfc_option.warn_std & isym->standard)
3991 /* Do only print a warning if not a GNU extension. */
3992 if (!silent && isym->standard != GFC_STD_GNU)
3993 gfc_warning ("Intrinsic '%s' (is %s) is used at %L",
3994 isym->name, _(symstd_msg), &where);
3999 /* If allowing the symbol's standard, succeed, too. */
4000 if (gfc_option.allow_std & isym->standard)
4003 /* Otherwise, fail. */
4005 *symstd = _(symstd_msg);
4010 /* See if a function call corresponds to an intrinsic function call.
4013 MATCH_YES if the call corresponds to an intrinsic, simplification
4014 is done if possible.
4016 MATCH_NO if the call does not correspond to an intrinsic
4018 MATCH_ERROR if the call corresponds to an intrinsic but there was an
4019 error during the simplification process.
4021 The error_flag parameter enables an error reporting. */
4024 gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag)
4026 gfc_intrinsic_sym *isym, *specific;
4027 gfc_actual_arglist *actual;
4031 if (expr->value.function.isym != NULL)
4032 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
4033 ? MATCH_ERROR : MATCH_YES;
4036 gfc_push_suppress_errors ();
4039 for (actual = expr->value.function.actual; actual; actual = actual->next)
4040 if (actual->expr != NULL)
4041 flag |= (actual->expr->ts.type != BT_INTEGER
4042 && actual->expr->ts.type != BT_CHARACTER);
4044 name = expr->symtree->n.sym->name;
4046 if (expr->symtree->n.sym->intmod_sym_id)
4048 int id = expr->symtree->n.sym->intmod_sym_id;
4049 isym = specific = gfc_intrinsic_function_by_id ((gfc_isym_id) id);
4052 isym = specific = gfc_find_function (name);
4057 gfc_pop_suppress_errors ();
4061 if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
4062 || isym->id == GFC_ISYM_CMPLX)
4063 && gfc_init_expr_flag
4064 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
4065 "as initialization expression at %L", name,
4066 &expr->where) == FAILURE)
4069 gfc_pop_suppress_errors ();
4073 gfc_current_intrinsic_where = &expr->where;
4075 /* Bypass the generic list for min and max. */
4076 if (isym->check.f1m == gfc_check_min_max)
4078 init_arglist (isym);
4080 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
4084 gfc_pop_suppress_errors ();
4088 /* If the function is generic, check all of its specific
4089 incarnations. If the generic name is also a specific, we check
4090 that name last, so that any error message will correspond to the
4092 gfc_push_suppress_errors ();
4096 for (specific = isym->specific_head; specific;
4097 specific = specific->next)
4099 if (specific == isym)
4101 if (check_specific (specific, expr, 0) == SUCCESS)
4103 gfc_pop_suppress_errors ();
4109 gfc_pop_suppress_errors ();
4111 if (check_specific (isym, expr, error_flag) == FAILURE)
4114 gfc_pop_suppress_errors ();
4121 expr->value.function.isym = specific;
4122 gfc_intrinsic_symbol (expr->symtree->n.sym);
4125 gfc_pop_suppress_errors ();
4127 if (do_simplify (specific, expr) == FAILURE)
4130 /* F95, 7.1.6.1, Initialization expressions
4131 (4) An elemental intrinsic function reference of type integer or
4132 character where each argument is an initialization expression
4133 of type integer or character
4135 F2003, 7.1.7 Initialization expression
4136 (4) A reference to an elemental standard intrinsic function,
4137 where each argument is an initialization expression */
4139 if (gfc_init_expr_flag && isym->elemental && flag
4140 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Elemental function "
4141 "as initialization expression with non-integer/non-"
4142 "character arguments at %L", &expr->where) == FAILURE)
4149 /* See if a CALL statement corresponds to an intrinsic subroutine.
4150 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
4151 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
4155 gfc_intrinsic_sub_interface (gfc_code *c, int error_flag)
4157 gfc_intrinsic_sym *isym;
4160 name = c->symtree->n.sym->name;
4162 isym = gfc_find_subroutine (name);
4167 gfc_push_suppress_errors ();
4169 init_arglist (isym);
4171 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
4174 if (isym->check.f1 != NULL)
4176 if (do_check (isym, c->ext.actual) == FAILURE)
4181 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
4185 /* The subroutine corresponds to an intrinsic. Allow errors to be
4186 seen at this point. */
4188 gfc_pop_suppress_errors ();
4190 c->resolved_isym = isym;
4191 if (isym->resolve.s1 != NULL)
4192 isym->resolve.s1 (c);
4195 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
4196 c->resolved_sym->attr.elemental = isym->elemental;
4199 if (gfc_pure (NULL) && !isym->pure)
4201 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
4206 c->resolved_sym->attr.noreturn = isym->noreturn;
4212 gfc_pop_suppress_errors ();
4217 /* Call gfc_convert_type() with warning enabled. */
4220 gfc_convert_type (gfc_expr *expr, gfc_typespec *ts, int eflag)
4222 return gfc_convert_type_warn (expr, ts, eflag, 1);
4226 /* Try to convert an expression (in place) from one type to another.
4227 'eflag' controls the behavior on error.
4229 The possible values are:
4231 1 Generate a gfc_error()
4232 2 Generate a gfc_internal_error().
4234 'wflag' controls the warning related to conversion. */
4237 gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
4239 gfc_intrinsic_sym *sym;
4240 gfc_typespec from_ts;
4246 from_ts = expr->ts; /* expr->ts gets clobbered */
4248 if (ts->type == BT_UNKNOWN)
4251 /* NULL and zero size arrays get their type here. */
4252 if (expr->expr_type == EXPR_NULL
4253 || (expr->expr_type == EXPR_ARRAY && expr->value.constructor == NULL))
4255 /* Sometimes the RHS acquire the type. */
4260 if (expr->ts.type == BT_UNKNOWN)
4263 if (expr->ts.type == BT_DERIVED && ts->type == BT_DERIVED
4264 && gfc_compare_types (&expr->ts, ts))
4267 sym = find_conv (&expr->ts, ts);
4271 /* At this point, a conversion is necessary. A warning may be needed. */
4272 if ((gfc_option.warn_std & sym->standard) != 0)
4274 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
4275 gfc_typename (&from_ts), gfc_typename (ts),
4280 if (gfc_option.flag_range_check
4281 && expr->expr_type == EXPR_CONSTANT
4282 && from_ts.type == ts->type)
4284 /* Do nothing. Constants of the same type are range-checked
4285 elsewhere. If a value too large for the target type is
4286 assigned, an error is generated. Not checking here avoids
4287 duplications of warnings/errors.
4288 If range checking was disabled, but -Wconversion enabled,
4289 a non range checked warning is generated below. */
4291 else if (from_ts.type == BT_LOGICAL || ts->type == BT_LOGICAL)
4293 /* Do nothing. This block exists only to simplify the other
4294 else-if expressions.
4295 LOGICAL <> LOGICAL no warning, independent of kind values
4296 LOGICAL <> INTEGER extension, warned elsewhere
4297 LOGICAL <> REAL invalid, error generated elsewhere
4298 LOGICAL <> COMPLEX invalid, error generated elsewhere */
4300 else if (from_ts.type == ts->type
4301 || (from_ts.type == BT_INTEGER && ts->type == BT_REAL)
4302 || (from_ts.type == BT_INTEGER && ts->type == BT_COMPLEX)
4303 || (from_ts.type == BT_REAL && ts->type == BT_COMPLEX))
4305 /* Larger kinds can hold values of smaller kinds without problems.
4306 Hence, only warn if target kind is smaller than the source
4307 kind - or if -Wconversion-extra is specified. */
4308 if (gfc_option.warn_conversion_extra)
4309 gfc_warning_now ("Conversion from %s to %s at %L",
4310 gfc_typename (&from_ts), gfc_typename (ts),
4312 else if (gfc_option.gfc_warn_conversion
4313 && from_ts.kind > ts->kind)
4314 gfc_warning_now ("Possible change of value in conversion "
4315 "from %s to %s at %L", gfc_typename (&from_ts),
4316 gfc_typename (ts), &expr->where);
4318 else if ((from_ts.type == BT_REAL && ts->type == BT_INTEGER)
4319 || (from_ts.type == BT_COMPLEX && ts->type == BT_INTEGER)
4320 || (from_ts.type == BT_COMPLEX && ts->type == BT_REAL))
4322 /* Conversion from REAL/COMPLEX to INTEGER or COMPLEX to REAL
4323 usually comes with a loss of information, regardless of kinds. */
4324 if (gfc_option.warn_conversion_extra
4325 || gfc_option.gfc_warn_conversion)
4326 gfc_warning_now ("Possible change of value in conversion "
4327 "from %s to %s at %L", gfc_typename (&from_ts),
4328 gfc_typename (ts), &expr->where);
4330 else if (from_ts.type == BT_HOLLERITH || ts->type == BT_HOLLERITH)
4332 /* If HOLLERITH is involved, all bets are off. */
4333 if (gfc_option.warn_conversion_extra
4334 || gfc_option.gfc_warn_conversion)
4335 gfc_warning_now ("Conversion from %s to %s at %L",
4336 gfc_typename (&from_ts), gfc_typename (ts),
4343 /* Insert a pre-resolved function call to the right function. */
4344 old_where = expr->where;
4346 shape = expr->shape;
4348 new_expr = gfc_get_expr ();
4351 new_expr = gfc_build_conversion (new_expr);
4352 new_expr->value.function.name = sym->lib_name;
4353 new_expr->value.function.isym = sym;
4354 new_expr->where = old_where;
4355 new_expr->rank = rank;
4356 new_expr->shape = gfc_copy_shape (shape, rank);
4358 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4359 new_expr->symtree->n.sym->result = new_expr->symtree->n.sym;
4360 new_expr->symtree->n.sym->ts = *ts;
4361 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4362 new_expr->symtree->n.sym->attr.function = 1;
4363 new_expr->symtree->n.sym->attr.elemental = 1;
4364 new_expr->symtree->n.sym->attr.pure = 1;
4365 new_expr->symtree->n.sym->attr.referenced = 1;
4366 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4367 gfc_commit_symbol (new_expr->symtree->n.sym);
4371 gfc_free (new_expr);
4374 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4375 && do_simplify (sym, expr) == FAILURE)
4380 return FAILURE; /* Error already generated in do_simplify() */
4388 gfc_error ("Can't convert %s to %s at %L",
4389 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
4393 gfc_internal_error ("Can't convert %s to %s at %L",
4394 gfc_typename (&from_ts), gfc_typename (ts),
4401 gfc_convert_chartype (gfc_expr *expr, gfc_typespec *ts)
4403 gfc_intrinsic_sym *sym;
4409 gcc_assert (expr->ts.type == BT_CHARACTER && ts->type == BT_CHARACTER);
4411 sym = find_char_conv (&expr->ts, ts);
4414 /* Insert a pre-resolved function call to the right function. */
4415 old_where = expr->where;
4417 shape = expr->shape;
4419 new_expr = gfc_get_expr ();
4422 new_expr = gfc_build_conversion (new_expr);
4423 new_expr->value.function.name = sym->lib_name;
4424 new_expr->value.function.isym = sym;
4425 new_expr->where = old_where;
4426 new_expr->rank = rank;
4427 new_expr->shape = gfc_copy_shape (shape, rank);
4429 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4430 new_expr->symtree->n.sym->ts = *ts;
4431 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4432 new_expr->symtree->n.sym->attr.function = 1;
4433 new_expr->symtree->n.sym->attr.elemental = 1;
4434 new_expr->symtree->n.sym->attr.referenced = 1;
4435 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4436 gfc_commit_symbol (new_expr->symtree->n.sym);
4440 gfc_free (new_expr);
4443 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4444 && do_simplify (sym, expr) == FAILURE)
4446 /* Error already generated in do_simplify() */
4454 /* Check if the passed name is name of an intrinsic (taking into account the
4455 current -std=* and -fall-intrinsic settings). If it is, see if we should
4456 warn about this as a user-procedure having the same name as an intrinsic
4457 (-Wintrinsic-shadow enabled) and do so if we should. */
4460 gfc_warn_intrinsic_shadow (const gfc_symbol* sym, bool in_module, bool func)
4462 gfc_intrinsic_sym* isym;
4464 /* If the warning is disabled, do nothing at all. */
4465 if (!gfc_option.warn_intrinsic_shadow)
4468 /* Try to find an intrinsic of the same name. */
4470 isym = gfc_find_function (sym->name);
4472 isym = gfc_find_subroutine (sym->name);
4474 /* If no intrinsic was found with this name or it's not included in the
4475 selected standard, everything's fine. */
4476 if (!isym || gfc_check_intrinsic_standard (isym, NULL, true,
4477 sym->declared_at) == FAILURE)
4480 /* Emit the warning. */
4482 gfc_warning ("'%s' declared at %L may shadow the intrinsic of the same"
4483 " name. In order to call the intrinsic, explicit INTRINSIC"
4484 " declarations may be required.",
4485 sym->name, &sym->declared_at);
4487 gfc_warning ("'%s' declared at %L is also the name of an intrinsic. It can"
4488 " only be called via an explicit interface or if declared"
4489 " EXTERNAL.", sym->name, &sym->declared_at);