2009-06-07 Daniel Franke <franke.daniel@gmail.com>
[official-gcc/alias-decl.git] / gcc / fortran / intrinsic.c
blob014ea11d3e83160c0410b9f0a1415b8c8d1b9025
1 /* Build up a list of intrinsic subroutines and functions for the
2 name-resolution stage.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Contributed by Andy Vaught & Katherine Holcomb
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "intrinsic.h"
29 /* Namespace to hold the resolved symbols for intrinsic subroutines. */
30 static gfc_namespace *gfc_intrinsic_namespace;
32 int gfc_init_expr = 0;
34 /* Pointers to an intrinsic function and its argument names that are being
35 checked. */
37 const char *gfc_current_intrinsic;
38 const char *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
39 locus *gfc_current_intrinsic_where;
41 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
42 static gfc_intrinsic_sym *char_conversions;
43 static gfc_intrinsic_arg *next_arg;
45 static int nfunc, nsub, nargs, nconv, ncharconv;
47 static enum
48 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
49 sizing;
51 enum klass
52 { NO_CLASS = 0, CLASS_ELEMENTAL, CLASS_INQUIRY, CLASS_TRANSFORMATIONAL };
54 #define ACTUAL_NO 0
55 #define ACTUAL_YES 1
57 #define REQUIRED 0
58 #define OPTIONAL 1
61 /* Return a letter based on the passed type. Used to construct the
62 name of a type-dependent subroutine. */
64 char
65 gfc_type_letter (bt type)
67 char c;
69 switch (type)
71 case BT_LOGICAL:
72 c = 'l';
73 break;
74 case BT_CHARACTER:
75 c = 's';
76 break;
77 case BT_INTEGER:
78 c = 'i';
79 break;
80 case BT_REAL:
81 c = 'r';
82 break;
83 case BT_COMPLEX:
84 c = 'c';
85 break;
87 case BT_HOLLERITH:
88 c = 'h';
89 break;
91 default:
92 c = 'u';
93 break;
96 return c;
100 /* Get a symbol for a resolved name. Note, if needed be, the elemental
101 attribute has be added afterwards. */
103 gfc_symbol *
104 gfc_get_intrinsic_sub_symbol (const char *name)
106 gfc_symbol *sym;
108 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
109 sym->attr.always_explicit = 1;
110 sym->attr.subroutine = 1;
111 sym->attr.flavor = FL_PROCEDURE;
112 sym->attr.proc = PROC_INTRINSIC;
114 return sym;
118 /* Return a pointer to the name of a conversion function given two
119 typespecs. */
121 static const char *
122 conv_name (gfc_typespec *from, gfc_typespec *to)
124 return gfc_get_string ("__convert_%c%d_%c%d",
125 gfc_type_letter (from->type), from->kind,
126 gfc_type_letter (to->type), to->kind);
130 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
131 corresponds to the conversion. Returns NULL if the conversion
132 isn't found. */
134 static gfc_intrinsic_sym *
135 find_conv (gfc_typespec *from, gfc_typespec *to)
137 gfc_intrinsic_sym *sym;
138 const char *target;
139 int i;
141 target = conv_name (from, to);
142 sym = conversion;
144 for (i = 0; i < nconv; i++, sym++)
145 if (target == sym->name)
146 return sym;
148 return NULL;
152 /* Given a pair of CHARACTER typespecs, find the gfc_intrinsic_sym node
153 that corresponds to the conversion. Returns NULL if the conversion
154 isn't found. */
156 static gfc_intrinsic_sym *
157 find_char_conv (gfc_typespec *from, gfc_typespec *to)
159 gfc_intrinsic_sym *sym;
160 const char *target;
161 int i;
163 target = conv_name (from, to);
164 sym = char_conversions;
166 for (i = 0; i < ncharconv; i++, sym++)
167 if (target == sym->name)
168 return sym;
170 return NULL;
174 /* Interface to the check functions. We break apart an argument list
175 and call the proper check function rather than forcing each
176 function to manipulate the argument list. */
178 static gfc_try
179 do_check (gfc_intrinsic_sym *specific, gfc_actual_arglist *arg)
181 gfc_expr *a1, *a2, *a3, *a4, *a5;
183 if (arg == NULL)
184 return (*specific->check.f0) ();
186 a1 = arg->expr;
187 arg = arg->next;
188 if (arg == NULL)
189 return (*specific->check.f1) (a1);
191 a2 = arg->expr;
192 arg = arg->next;
193 if (arg == NULL)
194 return (*specific->check.f2) (a1, a2);
196 a3 = arg->expr;
197 arg = arg->next;
198 if (arg == NULL)
199 return (*specific->check.f3) (a1, a2, a3);
201 a4 = arg->expr;
202 arg = arg->next;
203 if (arg == NULL)
204 return (*specific->check.f4) (a1, a2, a3, a4);
206 a5 = arg->expr;
207 arg = arg->next;
208 if (arg == NULL)
209 return (*specific->check.f5) (a1, a2, a3, a4, a5);
211 gfc_internal_error ("do_check(): too many args");
215 /*********** Subroutines to build the intrinsic list ****************/
217 /* Add a single intrinsic symbol to the current list.
219 Argument list:
220 char * name of function
221 int whether function is elemental
222 int If the function can be used as an actual argument [1]
223 bt return type of function
224 int kind of return type of function
225 int Fortran standard version
226 check pointer to check function
227 simplify pointer to simplification function
228 resolve pointer to resolution function
230 Optional arguments come in multiples of five:
231 char * name of argument
232 bt type of argument
233 int kind of argument
234 int arg optional flag (1=optional, 0=required)
235 sym_intent intent of argument
237 The sequence is terminated by a NULL name.
240 [1] Whether a function can or cannot be used as an actual argument is
241 determined by its presence on the 13.6 list in Fortran 2003. The
242 following intrinsics, which are GNU extensions, are considered allowed
243 as actual arguments: ACOSH ATANH DACOSH DASINH DATANH DCONJG DIMAG
244 ZABS ZCOS ZEXP ZLOG ZSIN ZSQRT. */
246 static void
247 add_sym (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type, int kind,
248 int standard, gfc_check_f check, gfc_simplify_f simplify,
249 gfc_resolve_f resolve, ...)
251 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
252 int optional, first_flag;
253 sym_intent intent;
254 va_list argp;
256 switch (sizing)
258 case SZ_SUBS:
259 nsub++;
260 break;
262 case SZ_FUNCS:
263 nfunc++;
264 break;
266 case SZ_NOTHING:
267 next_sym->name = gfc_get_string (name);
269 strcpy (buf, "_gfortran_");
270 strcat (buf, name);
271 next_sym->lib_name = gfc_get_string (buf);
273 next_sym->elemental = (cl == CLASS_ELEMENTAL);
274 next_sym->inquiry = (cl == CLASS_INQUIRY);
275 next_sym->transformational = (cl == CLASS_TRANSFORMATIONAL);
276 next_sym->actual_ok = actual_ok;
277 next_sym->ts.type = type;
278 next_sym->ts.kind = kind;
279 next_sym->standard = standard;
280 next_sym->simplify = simplify;
281 next_sym->check = check;
282 next_sym->resolve = resolve;
283 next_sym->specific = 0;
284 next_sym->generic = 0;
285 next_sym->conversion = 0;
286 next_sym->id = id;
287 break;
289 default:
290 gfc_internal_error ("add_sym(): Bad sizing mode");
293 va_start (argp, resolve);
295 first_flag = 1;
297 for (;;)
299 name = va_arg (argp, char *);
300 if (name == NULL)
301 break;
303 type = (bt) va_arg (argp, int);
304 kind = va_arg (argp, int);
305 optional = va_arg (argp, int);
306 intent = (sym_intent) va_arg (argp, int);
308 if (sizing != SZ_NOTHING)
309 nargs++;
310 else
312 next_arg++;
314 if (first_flag)
315 next_sym->formal = next_arg;
316 else
317 (next_arg - 1)->next = next_arg;
319 first_flag = 0;
321 strcpy (next_arg->name, name);
322 next_arg->ts.type = type;
323 next_arg->ts.kind = kind;
324 next_arg->optional = optional;
325 next_arg->intent = intent;
329 va_end (argp);
331 next_sym++;
335 /* Add a symbol to the function list where the function takes
336 0 arguments. */
338 static void
339 add_sym_0 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
340 int kind, int standard,
341 gfc_try (*check) (void),
342 gfc_expr *(*simplify) (void),
343 void (*resolve) (gfc_expr *))
345 gfc_simplify_f sf;
346 gfc_check_f cf;
347 gfc_resolve_f rf;
349 cf.f0 = check;
350 sf.f0 = simplify;
351 rf.f0 = resolve;
353 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
354 (void *) 0);
358 /* Add a symbol to the subroutine list where the subroutine takes
359 0 arguments. */
361 static void
362 add_sym_0s (const char *name, gfc_isym_id id, int standard, void (*resolve) (gfc_code *))
364 gfc_check_f cf;
365 gfc_simplify_f sf;
366 gfc_resolve_f rf;
368 cf.f1 = NULL;
369 sf.f1 = NULL;
370 rf.s1 = resolve;
372 add_sym (name, id, NO_CLASS, ACTUAL_NO, BT_UNKNOWN, 0, standard, cf, sf, rf,
373 (void *) 0);
377 /* Add a symbol to the function list where the function takes
378 1 arguments. */
380 static void
381 add_sym_1 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
382 int kind, int standard,
383 gfc_try (*check) (gfc_expr *),
384 gfc_expr *(*simplify) (gfc_expr *),
385 void (*resolve) (gfc_expr *, gfc_expr *),
386 const char *a1, bt type1, int kind1, int optional1)
388 gfc_check_f cf;
389 gfc_simplify_f sf;
390 gfc_resolve_f rf;
392 cf.f1 = check;
393 sf.f1 = simplify;
394 rf.f1 = resolve;
396 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
397 a1, type1, kind1, optional1, INTENT_IN,
398 (void *) 0);
402 /* Add a symbol to the subroutine list where the subroutine takes
403 1 arguments. */
405 static void
406 add_sym_1s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
407 gfc_try (*check) (gfc_expr *),
408 gfc_expr *(*simplify) (gfc_expr *),
409 void (*resolve) (gfc_code *),
410 const char *a1, bt type1, int kind1, int optional1)
412 gfc_check_f cf;
413 gfc_simplify_f sf;
414 gfc_resolve_f rf;
416 cf.f1 = check;
417 sf.f1 = simplify;
418 rf.s1 = resolve;
420 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
421 a1, type1, kind1, optional1, INTENT_IN,
422 (void *) 0);
426 /* Add a symbol to the function list where the function takes
427 1 arguments, specifying the intent of the argument. */
429 static void
430 add_sym_1_intent (const char *name, gfc_isym_id id, enum klass cl,
431 int actual_ok, bt type, int kind, int standard,
432 gfc_try (*check) (gfc_expr *),
433 gfc_expr *(*simplify) (gfc_expr *),
434 void (*resolve) (gfc_expr *, gfc_expr *),
435 const char *a1, bt type1, int kind1, int optional1,
436 sym_intent intent1)
438 gfc_check_f cf;
439 gfc_simplify_f sf;
440 gfc_resolve_f rf;
442 cf.f1 = check;
443 sf.f1 = simplify;
444 rf.f1 = resolve;
446 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
447 a1, type1, kind1, optional1, intent1,
448 (void *) 0);
452 /* Add a symbol to the subroutine list where the subroutine takes
453 1 arguments, specifying the intent of the argument. */
455 static void
456 add_sym_1s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
457 int kind, int standard,
458 gfc_try (*check) (gfc_expr *),
459 gfc_expr *(*simplify) (gfc_expr *),
460 void (*resolve) (gfc_code *),
461 const char *a1, bt type1, int kind1, int optional1,
462 sym_intent intent1)
464 gfc_check_f cf;
465 gfc_simplify_f sf;
466 gfc_resolve_f rf;
468 cf.f1 = check;
469 sf.f1 = simplify;
470 rf.s1 = resolve;
472 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
473 a1, type1, kind1, optional1, intent1,
474 (void *) 0);
478 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
479 function. MAX et al take 2 or more arguments. */
481 static void
482 add_sym_1m (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
483 int kind, int standard,
484 gfc_try (*check) (gfc_actual_arglist *),
485 gfc_expr *(*simplify) (gfc_expr *),
486 void (*resolve) (gfc_expr *, gfc_actual_arglist *),
487 const char *a1, bt type1, int kind1, int optional1,
488 const char *a2, bt type2, int kind2, int optional2)
490 gfc_check_f cf;
491 gfc_simplify_f sf;
492 gfc_resolve_f rf;
494 cf.f1m = check;
495 sf.f1 = simplify;
496 rf.f1m = resolve;
498 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
499 a1, type1, kind1, optional1, INTENT_IN,
500 a2, type2, kind2, optional2, INTENT_IN,
501 (void *) 0);
505 /* Add a symbol to the function list where the function takes
506 2 arguments. */
508 static void
509 add_sym_2 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
510 int kind, int standard,
511 gfc_try (*check) (gfc_expr *, gfc_expr *),
512 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
513 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *),
514 const char *a1, bt type1, int kind1, int optional1,
515 const char *a2, bt type2, int kind2, int optional2)
517 gfc_check_f cf;
518 gfc_simplify_f sf;
519 gfc_resolve_f rf;
521 cf.f2 = check;
522 sf.f2 = simplify;
523 rf.f2 = resolve;
525 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
526 a1, type1, kind1, optional1, INTENT_IN,
527 a2, type2, kind2, optional2, INTENT_IN,
528 (void *) 0);
532 /* Add a symbol to the subroutine list where the subroutine takes
533 2 arguments. */
535 static void
536 add_sym_2s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
537 gfc_try (*check) (gfc_expr *, gfc_expr *),
538 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
539 void (*resolve) (gfc_code *),
540 const char *a1, bt type1, int kind1, int optional1,
541 const char *a2, bt type2, int kind2, int optional2)
543 gfc_check_f cf;
544 gfc_simplify_f sf;
545 gfc_resolve_f rf;
547 cf.f2 = check;
548 sf.f2 = simplify;
549 rf.s1 = resolve;
551 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
552 a1, type1, kind1, optional1, INTENT_IN,
553 a2, type2, kind2, optional2, INTENT_IN,
554 (void *) 0);
558 /* Add a symbol to the subroutine list where the subroutine takes
559 2 arguments, specifying the intent of the arguments. */
561 static void
562 add_sym_2s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
563 int kind, int standard,
564 gfc_try (*check) (gfc_expr *, gfc_expr *),
565 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
566 void (*resolve) (gfc_code *),
567 const char *a1, bt type1, int kind1, int optional1,
568 sym_intent intent1, const char *a2, bt type2, int kind2,
569 int optional2, sym_intent intent2)
571 gfc_check_f cf;
572 gfc_simplify_f sf;
573 gfc_resolve_f rf;
575 cf.f2 = check;
576 sf.f2 = simplify;
577 rf.s1 = resolve;
579 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
580 a1, type1, kind1, optional1, intent1,
581 a2, type2, kind2, optional2, intent2,
582 (void *) 0);
586 /* Add a symbol to the function list where the function takes
587 3 arguments. */
589 static void
590 add_sym_3 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
591 int kind, int standard,
592 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
593 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
594 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
595 const char *a1, bt type1, int kind1, int optional1,
596 const char *a2, bt type2, int kind2, int optional2,
597 const char *a3, bt type3, int kind3, int optional3)
599 gfc_check_f cf;
600 gfc_simplify_f sf;
601 gfc_resolve_f rf;
603 cf.f3 = check;
604 sf.f3 = simplify;
605 rf.f3 = resolve;
607 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
608 a1, type1, kind1, optional1, INTENT_IN,
609 a2, type2, kind2, optional2, INTENT_IN,
610 a3, type3, kind3, optional3, INTENT_IN,
611 (void *) 0);
615 /* MINLOC and MAXLOC get special treatment because their argument
616 might have to be reordered. */
618 static void
619 add_sym_3ml (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
620 int kind, int standard,
621 gfc_try (*check) (gfc_actual_arglist *),
622 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
623 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
624 const char *a1, bt type1, int kind1, int optional1,
625 const char *a2, bt type2, int kind2, int optional2,
626 const char *a3, bt type3, int kind3, int optional3)
628 gfc_check_f cf;
629 gfc_simplify_f sf;
630 gfc_resolve_f rf;
632 cf.f3ml = check;
633 sf.f3 = simplify;
634 rf.f3 = resolve;
636 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
637 a1, type1, kind1, optional1, INTENT_IN,
638 a2, type2, kind2, optional2, INTENT_IN,
639 a3, type3, kind3, optional3, INTENT_IN,
640 (void *) 0);
644 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
645 their argument also might have to be reordered. */
647 static void
648 add_sym_3red (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
649 int kind, int standard,
650 gfc_try (*check) (gfc_actual_arglist *),
651 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
652 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
653 const char *a1, bt type1, int kind1, int optional1,
654 const char *a2, bt type2, int kind2, int optional2,
655 const char *a3, bt type3, int kind3, int optional3)
657 gfc_check_f cf;
658 gfc_simplify_f sf;
659 gfc_resolve_f rf;
661 cf.f3red = check;
662 sf.f3 = simplify;
663 rf.f3 = resolve;
665 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
666 a1, type1, kind1, optional1, INTENT_IN,
667 a2, type2, kind2, optional2, INTENT_IN,
668 a3, type3, kind3, optional3, INTENT_IN,
669 (void *) 0);
673 /* Add a symbol to the subroutine list where the subroutine takes
674 3 arguments. */
676 static void
677 add_sym_3s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
678 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
679 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
680 void (*resolve) (gfc_code *),
681 const char *a1, bt type1, int kind1, int optional1,
682 const char *a2, bt type2, int kind2, int optional2,
683 const char *a3, bt type3, int kind3, int optional3)
685 gfc_check_f cf;
686 gfc_simplify_f sf;
687 gfc_resolve_f rf;
689 cf.f3 = check;
690 sf.f3 = simplify;
691 rf.s1 = resolve;
693 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
694 a1, type1, kind1, optional1, INTENT_IN,
695 a2, type2, kind2, optional2, INTENT_IN,
696 a3, type3, kind3, optional3, INTENT_IN,
697 (void *) 0);
701 /* Add a symbol to the subroutine list where the subroutine takes
702 3 arguments, specifying the intent of the arguments. */
704 static void
705 add_sym_3s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
706 int kind, int standard,
707 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
708 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
709 void (*resolve) (gfc_code *),
710 const char *a1, bt type1, int kind1, int optional1,
711 sym_intent intent1, const char *a2, bt type2, int kind2,
712 int optional2, sym_intent intent2, const char *a3, bt type3,
713 int kind3, int optional3, sym_intent intent3)
715 gfc_check_f cf;
716 gfc_simplify_f sf;
717 gfc_resolve_f rf;
719 cf.f3 = check;
720 sf.f3 = simplify;
721 rf.s1 = resolve;
723 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
724 a1, type1, kind1, optional1, intent1,
725 a2, type2, kind2, optional2, intent2,
726 a3, type3, kind3, optional3, intent3,
727 (void *) 0);
731 /* Add a symbol to the function list where the function takes
732 4 arguments. */
734 static void
735 add_sym_4 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
736 int kind, int standard,
737 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
738 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
739 gfc_expr *),
740 void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
741 gfc_expr *),
742 const char *a1, bt type1, int kind1, int optional1,
743 const char *a2, bt type2, int kind2, int optional2,
744 const char *a3, bt type3, int kind3, int optional3,
745 const char *a4, bt type4, int kind4, int optional4 )
747 gfc_check_f cf;
748 gfc_simplify_f sf;
749 gfc_resolve_f rf;
751 cf.f4 = check;
752 sf.f4 = simplify;
753 rf.f4 = resolve;
755 add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
756 a1, type1, kind1, optional1, INTENT_IN,
757 a2, type2, kind2, optional2, INTENT_IN,
758 a3, type3, kind3, optional3, INTENT_IN,
759 a4, type4, kind4, optional4, INTENT_IN,
760 (void *) 0);
764 /* Add a symbol to the subroutine list where the subroutine takes
765 4 arguments. */
767 static void
768 add_sym_4s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
769 int standard,
770 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
771 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
772 gfc_expr *),
773 void (*resolve) (gfc_code *),
774 const char *a1, bt type1, int kind1, int optional1,
775 sym_intent intent1, const char *a2, bt type2, int kind2,
776 int optional2, sym_intent intent2, const char *a3, bt type3,
777 int kind3, int optional3, sym_intent intent3, const char *a4,
778 bt type4, int kind4, int optional4, sym_intent intent4)
780 gfc_check_f cf;
781 gfc_simplify_f sf;
782 gfc_resolve_f rf;
784 cf.f4 = check;
785 sf.f4 = simplify;
786 rf.s1 = resolve;
788 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
789 a1, type1, kind1, optional1, intent1,
790 a2, type2, kind2, optional2, intent2,
791 a3, type3, kind3, optional3, intent3,
792 a4, type4, kind4, optional4, intent4,
793 (void *) 0);
797 /* Add a symbol to the subroutine list where the subroutine takes
798 5 arguments. */
800 static void
801 add_sym_5s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
802 int standard,
803 gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
804 gfc_expr *),
805 gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
806 gfc_expr *, gfc_expr *),
807 void (*resolve) (gfc_code *),
808 const char *a1, bt type1, int kind1, int optional1,
809 sym_intent intent1, const char *a2, bt type2, int kind2,
810 int optional2, sym_intent intent2, const char *a3, bt type3,
811 int kind3, int optional3, sym_intent intent3, const char *a4,
812 bt type4, int kind4, int optional4, sym_intent intent4,
813 const char *a5, bt type5, int kind5, int optional5,
814 sym_intent intent5)
816 gfc_check_f cf;
817 gfc_simplify_f sf;
818 gfc_resolve_f rf;
820 cf.f5 = check;
821 sf.f5 = simplify;
822 rf.s1 = resolve;
824 add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
825 a1, type1, kind1, optional1, intent1,
826 a2, type2, kind2, optional2, intent2,
827 a3, type3, kind3, optional3, intent3,
828 a4, type4, kind4, optional4, intent4,
829 a5, type5, kind5, optional5, intent5,
830 (void *) 0);
834 /* Locate an intrinsic symbol given a base pointer, number of elements
835 in the table and a pointer to a name. Returns the NULL pointer if
836 a name is not found. */
838 static gfc_intrinsic_sym *
839 find_sym (gfc_intrinsic_sym *start, int n, const char *name)
841 /* name may be a user-supplied string, so we must first make sure
842 that we're comparing against a pointer into the global string
843 table. */
844 const char *p = gfc_get_string (name);
846 while (n > 0)
848 if (p == start->name)
849 return start;
851 start++;
852 n--;
855 return NULL;
859 /* Given a name, find a function in the intrinsic function table.
860 Returns NULL if not found. */
862 gfc_intrinsic_sym *
863 gfc_find_function (const char *name)
865 gfc_intrinsic_sym *sym;
867 sym = find_sym (functions, nfunc, name);
868 if (!sym)
869 sym = find_sym (conversion, nconv, name);
871 return sym;
875 /* Given a name, find a function in the intrinsic subroutine table.
876 Returns NULL if not found. */
878 gfc_intrinsic_sym *
879 gfc_find_subroutine (const char *name)
881 return find_sym (subroutines, nsub, name);
885 /* Given a string, figure out if it is the name of a generic intrinsic
886 function or not. */
889 gfc_generic_intrinsic (const char *name)
891 gfc_intrinsic_sym *sym;
893 sym = gfc_find_function (name);
894 return (sym == NULL) ? 0 : sym->generic;
898 /* Given a string, figure out if it is the name of a specific
899 intrinsic function or not. */
902 gfc_specific_intrinsic (const char *name)
904 gfc_intrinsic_sym *sym;
906 sym = gfc_find_function (name);
907 return (sym == NULL) ? 0 : sym->specific;
911 /* Given a string, figure out if it is the name of an intrinsic function
912 or subroutine allowed as an actual argument or not. */
914 gfc_intrinsic_actual_ok (const char *name, const bool subroutine_flag)
916 gfc_intrinsic_sym *sym;
918 /* Intrinsic subroutines are not allowed as actual arguments. */
919 if (subroutine_flag)
920 return 0;
921 else
923 sym = gfc_find_function (name);
924 return (sym == NULL) ? 0 : sym->actual_ok;
929 /* Given a symbol, find out if it is (and is to be treated) an intrinsic. If
930 it's name refers to an intrinsic but this intrinsic is not included in the
931 selected standard, this returns FALSE and sets the symbol's external
932 attribute. */
934 bool
935 gfc_is_intrinsic (gfc_symbol* sym, int subroutine_flag, locus loc)
937 gfc_intrinsic_sym* isym;
938 const char* symstd;
940 /* If INTRINSIC/EXTERNAL state is already known, return. */
941 if (sym->attr.intrinsic)
942 return true;
943 if (sym->attr.external)
944 return false;
946 if (subroutine_flag)
947 isym = gfc_find_subroutine (sym->name);
948 else
949 isym = gfc_find_function (sym->name);
951 /* No such intrinsic available at all? */
952 if (!isym)
953 return false;
955 /* See if this intrinsic is allowed in the current standard. */
956 if (gfc_check_intrinsic_standard (isym, &symstd, false, loc) == FAILURE)
958 if (sym->attr.proc == PROC_UNKNOWN)
960 if (gfc_option.warn_intrinsics_std)
961 gfc_warning_now ("The intrinsic '%s' at %L is not included in the"
962 " selected standard but %s and '%s' will be"
963 " treated as if declared EXTERNAL. Use an"
964 " appropriate -std=* option or define"
965 " -fall-intrinsics to allow this intrinsic.",
966 sym->name, &loc, symstd, sym->name);
967 gfc_add_external (&sym->attr, &loc);
970 return false;
973 return true;
977 /* Collect a set of intrinsic functions into a generic collection.
978 The first argument is the name of the generic function, which is
979 also the name of a specific function. The rest of the specifics
980 currently in the table are placed into the list of specific
981 functions associated with that generic.
983 PR fortran/32778
984 FIXME: Remove the argument STANDARD if no regressions are
985 encountered. Change all callers (approx. 360).
988 static void
989 make_generic (const char *name, gfc_isym_id id, int standard ATTRIBUTE_UNUSED)
991 gfc_intrinsic_sym *g;
993 if (sizing != SZ_NOTHING)
994 return;
996 g = gfc_find_function (name);
997 if (g == NULL)
998 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
999 name);
1001 gcc_assert (g->id == id);
1003 g->generic = 1;
1004 g->specific = 1;
1005 if ((g + 1)->name != NULL)
1006 g->specific_head = g + 1;
1007 g++;
1009 while (g->name != NULL)
1011 gcc_assert (g->id == id);
1013 g->next = g + 1;
1014 g->specific = 1;
1015 g++;
1018 g--;
1019 g->next = NULL;
1023 /* Create a duplicate intrinsic function entry for the current
1024 function, the only differences being the alternate name and
1025 a different standard if necessary. Note that we use argument
1026 lists more than once, but all argument lists are freed as a
1027 single block. */
1029 static void
1030 make_alias (const char *name, int standard)
1032 switch (sizing)
1034 case SZ_FUNCS:
1035 nfunc++;
1036 break;
1038 case SZ_SUBS:
1039 nsub++;
1040 break;
1042 case SZ_NOTHING:
1043 next_sym[0] = next_sym[-1];
1044 next_sym->name = gfc_get_string (name);
1045 next_sym->standard = standard;
1046 next_sym++;
1047 break;
1049 default:
1050 break;
1055 /* Make the current subroutine noreturn. */
1057 static void
1058 make_noreturn (void)
1060 if (sizing == SZ_NOTHING)
1061 next_sym[-1].noreturn = 1;
1065 /* Add intrinsic functions. */
1067 static void
1068 add_functions (void)
1070 /* Argument names as in the standard (to be used as argument keywords). */
1071 const char
1072 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
1073 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
1074 *c = "c", *n = "n", *ncopies= "ncopies", *pos = "pos", *bck = "back",
1075 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
1076 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
1077 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
1078 *p = "p", *ar = "array", *shp = "shape", *src = "source",
1079 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
1080 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
1081 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
1082 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
1083 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
1084 *num = "number", *tm = "time", *nm = "name", *md = "mode",
1085 *vl = "values", *p1 = "path1", *p2 = "path2", *com = "command";
1087 int di, dr, dd, dl, dc, dz, ii;
1089 di = gfc_default_integer_kind;
1090 dr = gfc_default_real_kind;
1091 dd = gfc_default_double_kind;
1092 dl = gfc_default_logical_kind;
1093 dc = gfc_default_character_kind;
1094 dz = gfc_default_complex_kind;
1095 ii = gfc_index_integer_kind;
1097 add_sym_1 ("abs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1098 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
1099 a, BT_REAL, dr, REQUIRED);
1101 add_sym_1 ("iabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1102 NULL, gfc_simplify_abs, gfc_resolve_abs,
1103 a, BT_INTEGER, di, REQUIRED);
1105 add_sym_1 ("dabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1106 gfc_check_fn_d, gfc_simplify_abs, gfc_resolve_abs,
1107 a, BT_REAL, dd, REQUIRED);
1109 add_sym_1 ("cabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1110 NULL, gfc_simplify_abs, gfc_resolve_abs,
1111 a, BT_COMPLEX, dz, REQUIRED);
1113 add_sym_1 ("zabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1114 NULL, gfc_simplify_abs, gfc_resolve_abs,
1115 a, BT_COMPLEX, dd, REQUIRED);
1117 make_alias ("cdabs", GFC_STD_GNU);
1119 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
1121 /* The checking function for ACCESS is called gfc_check_access_func
1122 because the name gfc_check_access is already used in module.c. */
1123 add_sym_2 ("access", GFC_ISYM_ACCESS, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1124 gfc_check_access_func, NULL, gfc_resolve_access,
1125 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1127 make_generic ("access", GFC_ISYM_ACCESS, GFC_STD_GNU);
1129 add_sym_2 ("achar", GFC_ISYM_ACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1130 BT_CHARACTER, dc, GFC_STD_F95,
1131 gfc_check_achar, gfc_simplify_achar, gfc_resolve_achar,
1132 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1134 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
1136 add_sym_1 ("acos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1137 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
1138 x, BT_REAL, dr, REQUIRED);
1140 add_sym_1 ("dacos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1141 gfc_check_fn_d, gfc_simplify_acos, gfc_resolve_acos,
1142 x, BT_REAL, dd, REQUIRED);
1144 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
1146 add_sym_1 ("acosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1147 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_acosh,
1148 gfc_resolve_acosh, x, BT_REAL, dr, REQUIRED);
1150 add_sym_1 ("dacosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1151 gfc_check_fn_d, gfc_simplify_acosh, gfc_resolve_acosh,
1152 x, BT_REAL, dd, REQUIRED);
1154 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_F2008);
1156 add_sym_1 ("adjustl", GFC_ISYM_ADJUSTL, CLASS_ELEMENTAL, ACTUAL_NO,
1157 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustl,
1158 gfc_resolve_adjustl, stg, BT_CHARACTER, 0, REQUIRED);
1160 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
1162 add_sym_1 ("adjustr", GFC_ISYM_ADJUSTR, CLASS_ELEMENTAL, ACTUAL_NO,
1163 BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustr,
1164 gfc_resolve_adjustr, stg, BT_CHARACTER, 0, REQUIRED);
1166 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
1168 add_sym_1 ("aimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1169 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
1170 z, BT_COMPLEX, dz, REQUIRED);
1172 make_alias ("imag", GFC_STD_GNU);
1173 make_alias ("imagpart", GFC_STD_GNU);
1175 add_sym_1 ("dimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1176 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
1177 z, BT_COMPLEX, dd, REQUIRED);
1179 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
1181 add_sym_2 ("aint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1182 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
1183 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1185 add_sym_1 ("dint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1186 NULL, gfc_simplify_dint, gfc_resolve_dint,
1187 a, BT_REAL, dd, REQUIRED);
1189 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
1191 add_sym_2 ("all", GFC_ISYM_ALL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1192 gfc_check_all_any, gfc_simplify_all, gfc_resolve_all,
1193 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1195 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
1197 add_sym_1 ("allocated", GFC_ISYM_ALLOCATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1198 gfc_check_allocated, NULL, NULL,
1199 ar, BT_UNKNOWN, 0, REQUIRED);
1201 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
1203 add_sym_2 ("anint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1204 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
1205 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1207 add_sym_1 ("dnint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1208 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
1209 a, BT_REAL, dd, REQUIRED);
1211 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1213 add_sym_2 ("any", GFC_ISYM_ANY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1214 gfc_check_all_any, gfc_simplify_any, gfc_resolve_any,
1215 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1217 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1219 add_sym_1 ("asin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1220 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1221 x, BT_REAL, dr, REQUIRED);
1223 add_sym_1 ("dasin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1224 gfc_check_fn_d, gfc_simplify_asin, gfc_resolve_asin,
1225 x, BT_REAL, dd, REQUIRED);
1227 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1229 add_sym_1 ("asinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1230 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_asinh,
1231 gfc_resolve_asinh, x, BT_REAL, dr, REQUIRED);
1233 add_sym_1 ("dasinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1234 gfc_check_fn_d, gfc_simplify_asinh, gfc_resolve_asinh,
1235 x, BT_REAL, dd, REQUIRED);
1237 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_F2008);
1239 add_sym_2 ("associated", GFC_ISYM_ASSOCIATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl,
1240 GFC_STD_F95, gfc_check_associated, NULL, NULL,
1241 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1243 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1245 add_sym_1 ("atan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1246 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1247 x, BT_REAL, dr, REQUIRED);
1249 add_sym_1 ("datan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1250 gfc_check_fn_d, gfc_simplify_atan, gfc_resolve_atan,
1251 x, BT_REAL, dd, REQUIRED);
1253 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1255 add_sym_1 ("atanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1256 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_atanh,
1257 gfc_resolve_atanh, x, BT_REAL, dr, REQUIRED);
1259 add_sym_1 ("datanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1260 gfc_check_fn_d, gfc_simplify_atanh, gfc_resolve_atanh,
1261 x, BT_REAL, dd, REQUIRED);
1263 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_F2008);
1265 add_sym_2 ("atan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1266 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1267 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1269 add_sym_2 ("datan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1270 gfc_check_datan2, gfc_simplify_atan2, gfc_resolve_atan2,
1271 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1273 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1275 /* Bessel and Neumann functions for G77 compatibility. */
1276 add_sym_1 ("besj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1277 gfc_check_fn_r, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1278 x, BT_REAL, dr, REQUIRED);
1280 make_alias ("bessel_j0", GFC_STD_F2008);
1282 add_sym_1 ("dbesj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1283 gfc_check_fn_d, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1284 x, BT_REAL, dd, REQUIRED);
1286 make_generic ("bessel_j0", GFC_ISYM_J0, GFC_STD_F2008);
1288 add_sym_1 ("besj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1289 gfc_check_fn_r, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1290 x, BT_REAL, dr, REQUIRED);
1292 make_alias ("bessel_j1", GFC_STD_F2008);
1294 add_sym_1 ("dbesj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1295 gfc_check_fn_d, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1296 x, BT_REAL, dd, REQUIRED);
1298 make_generic ("bessel_j1", GFC_ISYM_J1, GFC_STD_F2008);
1300 add_sym_2 ("besjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1301 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1302 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1304 make_alias ("bessel_jn", GFC_STD_F2008);
1306 add_sym_2 ("dbesjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1307 gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1308 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1310 make_generic ("bessel_jn", GFC_ISYM_JN, GFC_STD_F2008);
1312 add_sym_1 ("besy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1313 gfc_check_fn_r, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1314 x, BT_REAL, dr, REQUIRED);
1316 make_alias ("bessel_y0", GFC_STD_F2008);
1318 add_sym_1 ("dbesy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1319 gfc_check_fn_d, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1320 x, BT_REAL, dd, REQUIRED);
1322 make_generic ("bessel_y0", GFC_ISYM_Y0, GFC_STD_F2008);
1324 add_sym_1 ("besy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1325 gfc_check_fn_r, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1326 x, BT_REAL, dr, REQUIRED);
1328 make_alias ("bessel_y1", GFC_STD_F2008);
1330 add_sym_1 ("dbesy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1331 gfc_check_fn_d, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1332 x, BT_REAL, dd, REQUIRED);
1334 make_generic ("bessel_y1", GFC_ISYM_Y1, GFC_STD_F2008);
1336 add_sym_2 ("besyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1337 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1338 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1340 make_alias ("bessel_yn", GFC_STD_F2008);
1342 add_sym_2 ("dbesyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1343 gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1344 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1346 make_generic ("bessel_yn", GFC_ISYM_YN, GFC_STD_F2008);
1348 add_sym_1 ("bit_size", GFC_ISYM_BIT_SIZE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1349 gfc_check_i, gfc_simplify_bit_size, NULL,
1350 i, BT_INTEGER, di, REQUIRED);
1352 make_generic ("bit_size", GFC_ISYM_BIT_SIZE, GFC_STD_F95);
1354 add_sym_2 ("btest", GFC_ISYM_BTEST, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1355 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1356 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1358 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1360 add_sym_2 ("ceiling", GFC_ISYM_CEILING, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1361 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1362 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1364 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1366 add_sym_2 ("char", GFC_ISYM_CHAR, CLASS_ELEMENTAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F77,
1367 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1368 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1370 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1372 add_sym_1 ("chdir", GFC_ISYM_CHDIR, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1373 GFC_STD_GNU, gfc_check_chdir, NULL, gfc_resolve_chdir,
1374 nm, BT_CHARACTER, dc, REQUIRED);
1376 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1378 add_sym_2 ("chmod", GFC_ISYM_CHMOD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1379 gfc_check_chmod, NULL, gfc_resolve_chmod,
1380 nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1382 make_generic ("chmod", GFC_ISYM_CHMOD, GFC_STD_GNU);
1384 add_sym_3 ("cmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_F77,
1385 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1386 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1387 kind, BT_INTEGER, di, OPTIONAL);
1389 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1391 add_sym_0 ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT, CLASS_INQUIRY,
1392 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003, NULL, NULL, NULL);
1394 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1395 GFC_STD_F2003);
1397 add_sym_2 ("complex", GFC_ISYM_COMPLEX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_GNU,
1398 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1399 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1401 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1403 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1404 complex instead of the default complex. */
1406 add_sym_2 ("dcmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dd, GFC_STD_GNU,
1407 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1408 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1410 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1412 add_sym_1 ("conjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1413 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1414 z, BT_COMPLEX, dz, REQUIRED);
1416 add_sym_1 ("dconjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1417 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1418 z, BT_COMPLEX, dd, REQUIRED);
1420 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1422 add_sym_1 ("cos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1423 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1424 x, BT_REAL, dr, REQUIRED);
1426 add_sym_1 ("dcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1427 gfc_check_fn_d, gfc_simplify_cos, gfc_resolve_cos,
1428 x, BT_REAL, dd, REQUIRED);
1430 add_sym_1 ("ccos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1431 NULL, gfc_simplify_cos, gfc_resolve_cos,
1432 x, BT_COMPLEX, dz, REQUIRED);
1434 add_sym_1 ("zcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1435 NULL, gfc_simplify_cos, gfc_resolve_cos,
1436 x, BT_COMPLEX, dd, REQUIRED);
1438 make_alias ("cdcos", GFC_STD_GNU);
1440 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1442 add_sym_1 ("cosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1443 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1444 x, BT_REAL, dr, REQUIRED);
1446 add_sym_1 ("dcosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1447 gfc_check_fn_d, gfc_simplify_cosh, gfc_resolve_cosh,
1448 x, BT_REAL, dd, REQUIRED);
1450 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1452 add_sym_3 ("count", GFC_ISYM_COUNT, CLASS_TRANSFORMATIONAL, ACTUAL_NO,
1453 BT_INTEGER, di, GFC_STD_F95,
1454 gfc_check_count, gfc_simplify_count, gfc_resolve_count,
1455 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1456 kind, BT_INTEGER, di, OPTIONAL);
1458 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1460 add_sym_3 ("cshift", GFC_ISYM_CSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1461 gfc_check_cshift, NULL, gfc_resolve_cshift,
1462 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1463 dm, BT_INTEGER, ii, OPTIONAL);
1465 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1467 add_sym_1 ("ctime", GFC_ISYM_CTIME, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
1468 gfc_check_ctime, NULL, gfc_resolve_ctime,
1469 tm, BT_INTEGER, di, REQUIRED);
1471 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1473 add_sym_1 ("dble", GFC_ISYM_DBLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
1474 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1475 a, BT_REAL, dr, REQUIRED);
1477 make_alias ("dfloat", GFC_STD_GNU);
1479 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1481 add_sym_1 ("digits", GFC_ISYM_DIGITS, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1482 gfc_check_digits, gfc_simplify_digits, NULL,
1483 x, BT_UNKNOWN, dr, REQUIRED);
1485 make_generic ("digits", GFC_ISYM_DIGITS, GFC_STD_F95);
1487 add_sym_2 ("dim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1488 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1489 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1491 add_sym_2 ("idim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1492 NULL, gfc_simplify_dim, gfc_resolve_dim,
1493 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1495 add_sym_2 ("ddim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1496 gfc_check_x_yd, gfc_simplify_dim, gfc_resolve_dim,
1497 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1499 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1501 add_sym_2 ("dot_product", GFC_ISYM_DOT_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr,
1502 GFC_STD_F95, gfc_check_dot_product, gfc_simplify_dot_product, gfc_resolve_dot_product,
1503 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1505 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1507 add_sym_2 ("dprod", GFC_ISYM_DPROD,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1508 gfc_check_dprod, gfc_simplify_dprod, gfc_resolve_dprod,
1509 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1511 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1513 add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1514 NULL, NULL, NULL,
1515 a, BT_COMPLEX, dd, REQUIRED);
1517 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1519 add_sym_4 ("eoshift", GFC_ISYM_EOSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1520 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1521 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1522 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1524 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1526 add_sym_1 ("epsilon", GFC_ISYM_EPSILON, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1527 gfc_check_x, gfc_simplify_epsilon, NULL,
1528 x, BT_REAL, dr, REQUIRED);
1530 make_generic ("epsilon", GFC_ISYM_EPSILON, GFC_STD_F95);
1532 /* G77 compatibility for the ERF() and ERFC() functions. */
1533 add_sym_1 ("erf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1534 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erf,
1535 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1537 add_sym_1 ("derf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1538 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erf,
1539 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1541 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_F2008);
1543 add_sym_1 ("erfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1544 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erfc,
1545 gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1547 add_sym_1 ("derfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1548 GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erfc,
1549 gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1551 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_F2008);
1553 add_sym_1 ("erfc_scaled", GFC_ISYM_ERFC_SCALED, CLASS_ELEMENTAL, ACTUAL_NO,
1554 BT_REAL, dr, GFC_STD_F2008, gfc_check_fn_r,
1555 gfc_simplify_erfc_scaled, gfc_resolve_g77_math1, x, BT_REAL,
1556 dr, REQUIRED);
1558 make_generic ("erfc_scaled", GFC_ISYM_ERFC_SCALED, GFC_STD_F2008);
1560 /* G77 compatibility */
1561 add_sym_1 ("dtime", GFC_ISYM_DTIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
1562 gfc_check_dtime_etime, NULL, NULL,
1563 x, BT_REAL, 4, REQUIRED);
1565 make_generic ("dtime", GFC_ISYM_DTIME, GFC_STD_GNU);
1567 add_sym_1 ("etime", GFC_ISYM_ETIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
1568 gfc_check_dtime_etime, NULL, NULL,
1569 x, BT_REAL, 4, REQUIRED);
1571 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1573 add_sym_1 ("exp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1574 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1575 x, BT_REAL, dr, REQUIRED);
1577 add_sym_1 ("dexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1578 gfc_check_fn_d, gfc_simplify_exp, gfc_resolve_exp,
1579 x, BT_REAL, dd, REQUIRED);
1581 add_sym_1 ("cexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1582 NULL, gfc_simplify_exp, gfc_resolve_exp,
1583 x, BT_COMPLEX, dz, REQUIRED);
1585 add_sym_1 ("zexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1586 NULL, gfc_simplify_exp, gfc_resolve_exp,
1587 x, BT_COMPLEX, dd, REQUIRED);
1589 make_alias ("cdexp", GFC_STD_GNU);
1591 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1593 add_sym_1 ("exponent", GFC_ISYM_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1594 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1595 x, BT_REAL, dr, REQUIRED);
1597 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1599 add_sym_0 ("fdate", GFC_ISYM_FDATE, NO_CLASS, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_GNU,
1600 NULL, NULL, gfc_resolve_fdate);
1602 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1604 add_sym_2 ("floor", GFC_ISYM_FLOOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1605 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1606 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1608 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1610 /* G77 compatible fnum */
1611 add_sym_1 ("fnum", GFC_ISYM_FNUM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1612 gfc_check_fnum, NULL, gfc_resolve_fnum,
1613 ut, BT_INTEGER, di, REQUIRED);
1615 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1617 add_sym_1 ("fraction", GFC_ISYM_FRACTION, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1618 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1619 x, BT_REAL, dr, REQUIRED);
1621 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1623 add_sym_2 ("fstat", GFC_ISYM_FSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1624 GFC_STD_GNU, gfc_check_fstat, NULL, gfc_resolve_fstat,
1625 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
1627 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1629 add_sym_1 ("ftell", GFC_ISYM_FTELL, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii, GFC_STD_GNU,
1630 gfc_check_ftell, NULL, gfc_resolve_ftell,
1631 ut, BT_INTEGER, di, REQUIRED);
1633 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1635 add_sym_2 ("fgetc", GFC_ISYM_FGETC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1636 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1637 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1639 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1641 add_sym_1 ("fget", GFC_ISYM_FGET, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1642 gfc_check_fgetput, NULL, gfc_resolve_fget,
1643 c, BT_CHARACTER, dc, REQUIRED);
1645 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1647 add_sym_2 ("fputc", GFC_ISYM_FPUTC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1648 gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1649 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1651 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1653 add_sym_1 ("fput", GFC_ISYM_FPUT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1654 gfc_check_fgetput, NULL, gfc_resolve_fput,
1655 c, BT_CHARACTER, dc, REQUIRED);
1657 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1659 add_sym_1 ("gamma", GFC_ISYM_GAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1660 GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_gamma,
1661 gfc_resolve_gamma, x, BT_REAL, dr, REQUIRED);
1663 add_sym_1 ("dgamma", GFC_ISYM_GAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1664 gfc_check_fn_d, gfc_simplify_gamma, gfc_resolve_gamma,
1665 x, BT_REAL, dr, REQUIRED);
1667 make_generic ("gamma", GFC_ISYM_GAMMA, GFC_STD_F2008);
1669 /* Unix IDs (g77 compatibility) */
1670 add_sym_1 ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1671 NULL, NULL, gfc_resolve_getcwd,
1672 c, BT_CHARACTER, dc, REQUIRED);
1674 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1676 add_sym_0 ("getgid", GFC_ISYM_GETGID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1677 NULL, NULL, gfc_resolve_getgid);
1679 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1681 add_sym_0 ("getpid", GFC_ISYM_GETPID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1682 NULL, NULL, gfc_resolve_getpid);
1684 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1686 add_sym_0 ("getuid", GFC_ISYM_GETUID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1687 NULL, NULL, gfc_resolve_getuid);
1689 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1691 add_sym_1 ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1692 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1693 a, BT_CHARACTER, dc, REQUIRED);
1695 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1697 add_sym_1 ("huge", GFC_ISYM_HUGE, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1698 gfc_check_huge, gfc_simplify_huge, NULL,
1699 x, BT_UNKNOWN, dr, REQUIRED);
1701 make_generic ("huge", GFC_ISYM_HUGE, GFC_STD_F95);
1703 add_sym_2 ("hypot", GFC_ISYM_HYPOT, CLASS_ELEMENTAL, ACTUAL_NO,
1704 BT_REAL, dr, GFC_STD_F2008,
1705 gfc_check_hypot, gfc_simplify_hypot, gfc_resolve_hypot,
1706 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1708 make_generic ("hypot", GFC_ISYM_HYPOT, GFC_STD_F2008);
1710 add_sym_2 ("iachar", GFC_ISYM_IACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1711 BT_INTEGER, di, GFC_STD_F95,
1712 gfc_check_ichar_iachar, gfc_simplify_iachar, gfc_resolve_iachar,
1713 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1715 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1717 add_sym_2 ("iand", GFC_ISYM_IAND, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1718 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1719 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1721 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1723 add_sym_2 ("and", GFC_ISYM_AND, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1724 gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1725 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1727 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1729 add_sym_0 ("iargc", GFC_ISYM_IARGC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1730 NULL, NULL, NULL);
1732 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1734 add_sym_2 ("ibclr", GFC_ISYM_IBCLR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1735 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1736 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1738 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1740 add_sym_3 ("ibits", GFC_ISYM_IBITS, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1741 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1742 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1743 ln, BT_INTEGER, di, REQUIRED);
1745 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1747 add_sym_2 ("ibset", GFC_ISYM_IBSET, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1748 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1749 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1751 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1753 add_sym_2 ("ichar", GFC_ISYM_ICHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1754 BT_INTEGER, di, GFC_STD_F77,
1755 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1756 c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1758 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1760 add_sym_2 ("ieor", GFC_ISYM_IEOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1761 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1762 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1764 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1766 add_sym_2 ("xor", GFC_ISYM_XOR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1767 gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1768 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1770 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1772 add_sym_0 ("ierrno", GFC_ISYM_IERRNO, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1773 NULL, NULL, gfc_resolve_ierrno);
1775 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1777 /* The resolution function for INDEX is called gfc_resolve_index_func
1778 because the name gfc_resolve_index is already used in resolve.c. */
1779 add_sym_4 ("index", GFC_ISYM_INDEX, CLASS_ELEMENTAL, ACTUAL_YES,
1780 BT_INTEGER, di, GFC_STD_F77,
1781 gfc_check_index, gfc_simplify_index, gfc_resolve_index_func,
1782 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1783 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
1785 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1787 add_sym_2 ("int", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1788 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1789 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1791 add_sym_1 ("ifix", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1792 NULL, gfc_simplify_ifix, NULL,
1793 a, BT_REAL, dr, REQUIRED);
1795 add_sym_1 ("idint", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1796 NULL, gfc_simplify_idint, NULL,
1797 a, BT_REAL, dd, REQUIRED);
1799 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1801 add_sym_1 ("int2", GFC_ISYM_INT2, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1802 gfc_check_intconv, gfc_simplify_int2, gfc_resolve_int2,
1803 a, BT_REAL, dr, REQUIRED);
1805 make_alias ("short", GFC_STD_GNU);
1807 make_generic ("int2", GFC_ISYM_INT2, GFC_STD_GNU);
1809 add_sym_1 ("int8", GFC_ISYM_INT8, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1810 gfc_check_intconv, gfc_simplify_int8, gfc_resolve_int8,
1811 a, BT_REAL, dr, REQUIRED);
1813 make_generic ("int8", GFC_ISYM_INT8, GFC_STD_GNU);
1815 add_sym_1 ("long", GFC_ISYM_LONG, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1816 gfc_check_intconv, gfc_simplify_long, gfc_resolve_long,
1817 a, BT_REAL, dr, REQUIRED);
1819 make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
1821 add_sym_2 ("ior", GFC_ISYM_IOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1822 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1823 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1825 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1827 add_sym_2 ("or", GFC_ISYM_OR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1828 gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1829 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1831 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1833 /* The following function is for G77 compatibility. */
1834 add_sym_1 ("irand", GFC_ISYM_IRAND, NO_CLASS, ACTUAL_NO, BT_INTEGER, 4, GFC_STD_GNU,
1835 gfc_check_irand, NULL, NULL,
1836 i, BT_INTEGER, 4, OPTIONAL);
1838 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1840 add_sym_1 ("isatty", GFC_ISYM_ISATTY, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1841 gfc_check_isatty, NULL, gfc_resolve_isatty,
1842 ut, BT_INTEGER, di, REQUIRED);
1844 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1846 add_sym_1 ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END,
1847 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1848 gfc_check_i, NULL, NULL, i, BT_INTEGER, 0, REQUIRED);
1850 make_generic ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END, GFC_STD_F2003);
1852 add_sym_1 ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR,
1853 CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1854 gfc_check_i, NULL, NULL, i, BT_INTEGER, 0, REQUIRED);
1856 make_generic ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR, GFC_STD_F2003);
1858 add_sym_1 ("isnan", GFC_ISYM_ISNAN, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL,
1859 dl, GFC_STD_GNU, gfc_check_isnan, NULL, NULL,
1860 x, BT_REAL, 0, REQUIRED);
1862 make_generic ("isnan", GFC_ISYM_ISNAN, GFC_STD_GNU);
1864 add_sym_2 ("rshift", GFC_ISYM_RSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1865 gfc_check_ishft, NULL, gfc_resolve_rshift,
1866 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1868 make_generic ("rshift", GFC_ISYM_RSHIFT, GFC_STD_GNU);
1870 add_sym_2 ("lshift", GFC_ISYM_LSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1871 gfc_check_ishft, NULL, gfc_resolve_lshift,
1872 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1874 make_generic ("lshift", GFC_ISYM_LSHIFT, GFC_STD_GNU);
1876 add_sym_2 ("ishft", GFC_ISYM_ISHFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1877 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1878 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1880 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1882 add_sym_3 ("ishftc", GFC_ISYM_ISHFTC, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1883 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1884 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1885 sz, BT_INTEGER, di, OPTIONAL);
1887 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1889 add_sym_2 ("kill", GFC_ISYM_KILL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1890 gfc_check_kill, NULL, gfc_resolve_kill,
1891 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1893 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1895 add_sym_1 ("kind", GFC_ISYM_KIND, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1896 gfc_check_kind, gfc_simplify_kind, NULL,
1897 x, BT_REAL, dr, REQUIRED);
1899 make_generic ("kind", GFC_ISYM_KIND, GFC_STD_F95);
1901 add_sym_3 ("lbound", GFC_ISYM_LBOUND, CLASS_INQUIRY, ACTUAL_NO,
1902 BT_INTEGER, di, GFC_STD_F95,
1903 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1904 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL,
1905 kind, BT_INTEGER, di, OPTIONAL);
1907 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1909 add_sym_1 ("leadz", GFC_ISYM_LEADZ, CLASS_ELEMENTAL, ACTUAL_NO,
1910 BT_INTEGER, di, GFC_STD_F2008,
1911 gfc_check_i, gfc_simplify_leadz, NULL,
1912 i, BT_INTEGER, di, REQUIRED);
1914 make_generic ("leadz", GFC_ISYM_LEADZ, GFC_STD_F2008);
1916 add_sym_2 ("len", GFC_ISYM_LEN, CLASS_INQUIRY, ACTUAL_YES,
1917 BT_INTEGER, di, GFC_STD_F77,
1918 gfc_check_len_lentrim, gfc_simplify_len, gfc_resolve_len,
1919 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1921 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1923 add_sym_2 ("len_trim", GFC_ISYM_LEN_TRIM, CLASS_ELEMENTAL, ACTUAL_NO,
1924 BT_INTEGER, di, GFC_STD_F95,
1925 gfc_check_len_lentrim, gfc_simplify_len_trim, gfc_resolve_len_trim,
1926 stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1928 make_alias ("lnblnk", GFC_STD_GNU);
1930 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1932 add_sym_1 ("lgamma", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL,
1933 dr, GFC_STD_GNU,
1934 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1935 x, BT_REAL, dr, REQUIRED);
1937 make_alias ("log_gamma", GFC_STD_F2008);
1939 add_sym_1 ("algama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1940 gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1941 x, BT_REAL, dr, REQUIRED);
1943 add_sym_1 ("dlgama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1944 gfc_check_fn_d, gfc_simplify_lgamma, gfc_resolve_lgamma,
1945 x, BT_REAL, dr, REQUIRED);
1947 make_generic ("log_gamma", GFC_ISYM_LGAMMA, GFC_STD_F2008);
1950 add_sym_2 ("lge", GFC_ISYM_LGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1951 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lge, NULL,
1952 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1954 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1956 add_sym_2 ("lgt", GFC_ISYM_LGT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1957 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lgt, NULL,
1958 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1960 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1962 add_sym_2 ("lle",GFC_ISYM_LLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1963 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lle, NULL,
1964 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1966 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1968 add_sym_2 ("llt", GFC_ISYM_LLT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1969 GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_llt, NULL,
1970 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1972 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1974 add_sym_2 ("link", GFC_ISYM_LINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1975 GFC_STD_GNU, gfc_check_link, NULL, gfc_resolve_link,
1976 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
1978 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1980 add_sym_1 ("log", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
1981 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1982 x, BT_REAL, dr, REQUIRED);
1984 add_sym_1 ("alog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1985 NULL, gfc_simplify_log, gfc_resolve_log,
1986 x, BT_REAL, dr, REQUIRED);
1988 add_sym_1 ("dlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1989 gfc_check_fn_d, gfc_simplify_log, gfc_resolve_log,
1990 x, BT_REAL, dd, REQUIRED);
1992 add_sym_1 ("clog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1993 NULL, gfc_simplify_log, gfc_resolve_log,
1994 x, BT_COMPLEX, dz, REQUIRED);
1996 add_sym_1 ("zlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1997 NULL, gfc_simplify_log, gfc_resolve_log,
1998 x, BT_COMPLEX, dd, REQUIRED);
2000 make_alias ("cdlog", GFC_STD_GNU);
2002 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
2004 add_sym_1 ("log10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2005 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
2006 x, BT_REAL, dr, REQUIRED);
2008 add_sym_1 ("alog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2009 NULL, gfc_simplify_log10, gfc_resolve_log10,
2010 x, BT_REAL, dr, REQUIRED);
2012 add_sym_1 ("dlog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2013 gfc_check_fn_d, gfc_simplify_log10, gfc_resolve_log10,
2014 x, BT_REAL, dd, REQUIRED);
2016 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
2018 add_sym_2 ("logical", GFC_ISYM_LOGICAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
2019 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
2020 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2022 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
2024 add_sym_2 ("lstat", GFC_ISYM_LSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2025 GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_lstat,
2026 nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2028 make_generic ("lstat", GFC_ISYM_LSTAT, GFC_STD_GNU);
2030 add_sym_1 ("malloc", GFC_ISYM_MALLOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2031 GFC_STD_GNU, gfc_check_malloc, NULL, gfc_resolve_malloc,
2032 sz, BT_INTEGER, di, REQUIRED);
2034 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
2036 add_sym_2 ("matmul", GFC_ISYM_MATMUL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2037 gfc_check_matmul, gfc_simplify_matmul, gfc_resolve_matmul,
2038 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
2040 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
2042 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
2043 int(max). The max function must take at least two arguments. */
2045 add_sym_1m ("max", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2046 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
2047 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
2049 add_sym_1m ("max0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2050 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2051 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2053 add_sym_1m ("amax0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2054 gfc_check_min_max_integer, gfc_simplify_max, NULL,
2055 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2057 add_sym_1m ("amax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2058 gfc_check_min_max_real, gfc_simplify_max, NULL,
2059 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2061 add_sym_1m ("max1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2062 gfc_check_min_max_real, gfc_simplify_max, NULL,
2063 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2065 add_sym_1m ("dmax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2066 gfc_check_min_max_double, gfc_simplify_max, NULL,
2067 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2069 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
2071 add_sym_1 ("maxexponent", GFC_ISYM_MAXEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2072 GFC_STD_F95, gfc_check_x, gfc_simplify_maxexponent, NULL,
2073 x, BT_UNKNOWN, dr, REQUIRED);
2075 make_generic ("maxexponent", GFC_ISYM_MAXEXPONENT, GFC_STD_F95);
2077 add_sym_3ml ("maxloc", GFC_ISYM_MAXLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2078 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
2079 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2080 msk, BT_LOGICAL, dl, OPTIONAL);
2082 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
2084 add_sym_3red ("maxval", GFC_ISYM_MAXVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2085 gfc_check_minval_maxval, gfc_simplify_maxval, gfc_resolve_maxval,
2086 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2087 msk, BT_LOGICAL, dl, OPTIONAL);
2089 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
2091 add_sym_0 ("mclock", GFC_ISYM_MCLOCK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2092 GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock);
2094 make_generic ("mclock", GFC_ISYM_MCLOCK, GFC_STD_GNU);
2096 add_sym_0 ("mclock8", GFC_ISYM_MCLOCK8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2097 GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock8);
2099 make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU);
2101 add_sym_3 ("merge", GFC_ISYM_MERGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2102 gfc_check_merge, gfc_simplify_merge, gfc_resolve_merge,
2103 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
2104 msk, BT_LOGICAL, dl, REQUIRED);
2106 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
2108 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
2109 int(min). */
2111 add_sym_1m ("min", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2112 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
2113 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2115 add_sym_1m ("min0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2116 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2117 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2119 add_sym_1m ("amin0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2120 gfc_check_min_max_integer, gfc_simplify_min, NULL,
2121 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2123 add_sym_1m ("amin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2124 gfc_check_min_max_real, gfc_simplify_min, NULL,
2125 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2127 add_sym_1m ("min1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2128 gfc_check_min_max_real, gfc_simplify_min, NULL,
2129 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2131 add_sym_1m ("dmin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2132 gfc_check_min_max_double, gfc_simplify_min, NULL,
2133 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2135 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
2137 add_sym_1 ("minexponent", GFC_ISYM_MINEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2138 GFC_STD_F95, gfc_check_x, gfc_simplify_minexponent, NULL,
2139 x, BT_UNKNOWN, dr, REQUIRED);
2141 make_generic ("minexponent", GFC_ISYM_MINEXPONENT, GFC_STD_F95);
2143 add_sym_3ml ("minloc", GFC_ISYM_MINLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2144 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
2145 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2146 msk, BT_LOGICAL, dl, OPTIONAL);
2148 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
2150 add_sym_3red ("minval", GFC_ISYM_MINVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2151 gfc_check_minval_maxval, gfc_simplify_minval, gfc_resolve_minval,
2152 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2153 msk, BT_LOGICAL, dl, OPTIONAL);
2155 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
2157 add_sym_2 ("mod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2158 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
2159 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
2161 add_sym_2 ("amod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2162 NULL, gfc_simplify_mod, gfc_resolve_mod,
2163 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
2165 add_sym_2 ("dmod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2166 gfc_check_x_yd, gfc_simplify_mod, gfc_resolve_mod,
2167 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
2169 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
2171 add_sym_2 ("modulo", GFC_ISYM_MODULO, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, di, GFC_STD_F95,
2172 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
2173 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
2175 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
2177 add_sym_2 ("nearest", GFC_ISYM_NEAREST, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2178 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
2179 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
2181 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
2183 add_sym_1 ("new_line", GFC_ISYM_NEW_LINE, CLASS_INQUIRY, ACTUAL_NO, BT_CHARACTER, dc,
2184 GFC_STD_F2003, gfc_check_new_line, gfc_simplify_new_line, NULL,
2185 a, BT_CHARACTER, dc, REQUIRED);
2187 make_generic ("new_line", GFC_ISYM_NEW_LINE, GFC_STD_F2003);
2189 add_sym_2 ("nint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2190 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
2191 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2193 add_sym_1 ("idnint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2194 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
2195 a, BT_REAL, dd, REQUIRED);
2197 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
2199 add_sym_1 ("not", GFC_ISYM_NOT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2200 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
2201 i, BT_INTEGER, di, REQUIRED);
2203 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
2205 add_sym_1 ("null", GFC_ISYM_NULL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2206 gfc_check_null, gfc_simplify_null, NULL,
2207 mo, BT_INTEGER, di, OPTIONAL);
2209 make_generic ("null", GFC_ISYM_NULL, GFC_STD_F95);
2211 add_sym_3 ("pack", GFC_ISYM_PACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2212 gfc_check_pack, gfc_simplify_pack, gfc_resolve_pack,
2213 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2214 v, BT_REAL, dr, OPTIONAL);
2216 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
2218 add_sym_1 ("precision", GFC_ISYM_PRECISION, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2219 gfc_check_precision, gfc_simplify_precision, NULL,
2220 x, BT_UNKNOWN, 0, REQUIRED);
2222 make_generic ("precision", GFC_ISYM_PRECISION, GFC_STD_F95);
2224 add_sym_1_intent ("present", GFC_ISYM_PRESENT, CLASS_INQUIRY, ACTUAL_NO,
2225 BT_LOGICAL, dl, GFC_STD_F95, gfc_check_present, NULL, NULL,
2226 a, BT_REAL, dr, REQUIRED, INTENT_UNKNOWN);
2228 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
2230 add_sym_3red ("product", GFC_ISYM_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2231 gfc_check_product_sum, gfc_simplify_product, gfc_resolve_product,
2232 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2233 msk, BT_LOGICAL, dl, OPTIONAL);
2235 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
2237 add_sym_1 ("radix", GFC_ISYM_RADIX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2238 gfc_check_radix, gfc_simplify_radix, NULL,
2239 x, BT_UNKNOWN, 0, REQUIRED);
2241 make_generic ("radix", GFC_ISYM_RADIX, GFC_STD_F95);
2243 /* The following function is for G77 compatibility. */
2244 add_sym_1 ("rand", GFC_ISYM_RAND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2245 gfc_check_rand, NULL, NULL,
2246 i, BT_INTEGER, 4, OPTIONAL);
2248 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
2249 use slightly different shoddy multiplicative congruential PRNG. */
2250 make_alias ("ran", GFC_STD_GNU);
2252 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
2254 add_sym_1 ("range", GFC_ISYM_RANGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2255 gfc_check_range, gfc_simplify_range, NULL,
2256 x, BT_REAL, dr, REQUIRED);
2258 make_generic ("range", GFC_ISYM_RANGE, GFC_STD_F95);
2260 add_sym_2 ("real", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2261 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
2262 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2264 /* This provides compatibility with g77. */
2265 add_sym_1 ("realpart", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2266 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
2267 a, BT_UNKNOWN, dr, REQUIRED);
2269 add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2270 gfc_check_i, gfc_simplify_float, NULL,
2271 a, BT_INTEGER, di, REQUIRED);
2273 add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2274 NULL, gfc_simplify_sngl, NULL,
2275 a, BT_REAL, dd, REQUIRED);
2277 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
2279 add_sym_2 ("rename", GFC_ISYM_RENAME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2280 GFC_STD_GNU, gfc_check_rename, NULL, gfc_resolve_rename,
2281 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2283 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
2285 add_sym_2 ("repeat", GFC_ISYM_REPEAT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2286 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
2287 stg, BT_CHARACTER, dc, REQUIRED, ncopies, BT_INTEGER, di, REQUIRED);
2289 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
2291 add_sym_4 ("reshape", GFC_ISYM_RESHAPE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2292 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
2293 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
2294 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
2296 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
2298 add_sym_1 ("rrspacing", GFC_ISYM_RRSPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2299 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
2300 x, BT_REAL, dr, REQUIRED);
2302 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
2304 add_sym_2 ("scale", GFC_ISYM_SCALE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2305 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
2306 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2308 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
2310 add_sym_4 ("scan", GFC_ISYM_SCAN, CLASS_ELEMENTAL, ACTUAL_NO,
2311 BT_INTEGER, di, GFC_STD_F95,
2312 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
2313 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2314 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2316 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
2318 /* Added for G77 compatibility garbage. */
2319 add_sym_0 ("second", GFC_ISYM_SECOND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2320 NULL, NULL, NULL);
2322 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
2324 /* Added for G77 compatibility. */
2325 add_sym_1 ("secnds", GFC_ISYM_SECNDS, NO_CLASS, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2326 gfc_check_secnds, NULL, gfc_resolve_secnds,
2327 x, BT_REAL, dr, REQUIRED);
2329 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
2331 add_sym_1 ("selected_char_kind", GFC_ISYM_SC_KIND, CLASS_TRANSFORMATIONAL,
2332 ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003,
2333 gfc_check_selected_char_kind, gfc_simplify_selected_char_kind,
2334 NULL, nm, BT_CHARACTER, dc, REQUIRED);
2336 make_generic ("selected_char_kind", GFC_ISYM_SC_KIND, GFC_STD_F2003);
2338 add_sym_1 ("selected_int_kind", GFC_ISYM_SI_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2339 GFC_STD_F95, gfc_check_selected_int_kind,
2340 gfc_simplify_selected_int_kind, NULL, r, BT_INTEGER, di, REQUIRED);
2342 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
2344 add_sym_2 ("selected_real_kind", GFC_ISYM_SR_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2345 GFC_STD_F95, gfc_check_selected_real_kind,
2346 gfc_simplify_selected_real_kind, NULL,
2347 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
2349 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
2351 add_sym_2 ("set_exponent", GFC_ISYM_SET_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2352 gfc_check_set_exponent, gfc_simplify_set_exponent,
2353 gfc_resolve_set_exponent,
2354 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2356 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
2358 add_sym_1 ("shape", GFC_ISYM_SHAPE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2359 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
2360 src, BT_REAL, dr, REQUIRED);
2362 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
2364 add_sym_2 ("sign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2365 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
2366 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
2368 add_sym_2 ("isign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2369 NULL, gfc_simplify_sign, gfc_resolve_sign,
2370 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2372 add_sym_2 ("dsign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2373 gfc_check_x_yd, gfc_simplify_sign, gfc_resolve_sign,
2374 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2376 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2378 add_sym_2 ("signal", GFC_ISYM_SIGNAL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2379 gfc_check_signal, NULL, gfc_resolve_signal,
2380 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2382 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2384 add_sym_1 ("sin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2385 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2386 x, BT_REAL, dr, REQUIRED);
2388 add_sym_1 ("dsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2389 gfc_check_fn_d, gfc_simplify_sin, gfc_resolve_sin,
2390 x, BT_REAL, dd, REQUIRED);
2392 add_sym_1 ("csin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2393 NULL, gfc_simplify_sin, gfc_resolve_sin,
2394 x, BT_COMPLEX, dz, REQUIRED);
2396 add_sym_1 ("zsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2397 NULL, gfc_simplify_sin, gfc_resolve_sin,
2398 x, BT_COMPLEX, dd, REQUIRED);
2400 make_alias ("cdsin", GFC_STD_GNU);
2402 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2404 add_sym_1 ("sinh", GFC_ISYM_SINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2405 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
2406 x, BT_REAL, dr, REQUIRED);
2408 add_sym_1 ("dsinh", GFC_ISYM_SINH,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2409 gfc_check_fn_d, gfc_simplify_sinh, gfc_resolve_sinh,
2410 x, BT_REAL, dd, REQUIRED);
2412 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2414 add_sym_3 ("size", GFC_ISYM_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2415 BT_INTEGER, di, GFC_STD_F95,
2416 gfc_check_size, gfc_simplify_size, gfc_resolve_size,
2417 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2418 kind, BT_INTEGER, di, OPTIONAL);
2420 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2422 add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2423 GFC_STD_GNU, gfc_check_sizeof, NULL, NULL,
2424 x, BT_UNKNOWN, 0, REQUIRED);
2426 make_generic ("sizeof", GFC_ISYM_SIZEOF, GFC_STD_GNU);
2427 make_alias ("c_sizeof", GFC_STD_F2008);
2429 add_sym_1 ("spacing", GFC_ISYM_SPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2430 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2431 x, BT_REAL, dr, REQUIRED);
2433 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2435 add_sym_3 ("spread", GFC_ISYM_SPREAD, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2436 gfc_check_spread, gfc_simplify_spread, gfc_resolve_spread,
2437 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2438 ncopies, BT_INTEGER, di, REQUIRED);
2440 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2442 add_sym_1 ("sqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2443 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2444 x, BT_REAL, dr, REQUIRED);
2446 add_sym_1 ("dsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2447 gfc_check_fn_d, gfc_simplify_sqrt, gfc_resolve_sqrt,
2448 x, BT_REAL, dd, REQUIRED);
2450 add_sym_1 ("csqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2451 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2452 x, BT_COMPLEX, dz, REQUIRED);
2454 add_sym_1 ("zsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2455 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2456 x, BT_COMPLEX, dd, REQUIRED);
2458 make_alias ("cdsqrt", GFC_STD_GNU);
2460 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2462 add_sym_2 ("stat", GFC_ISYM_STAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2463 GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_stat,
2464 nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2466 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2468 add_sym_3red ("sum", GFC_ISYM_SUM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2469 gfc_check_product_sum, gfc_simplify_sum, gfc_resolve_sum,
2470 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2471 msk, BT_LOGICAL, dl, OPTIONAL);
2473 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2475 add_sym_2 ("symlnk", GFC_ISYM_SYMLNK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2476 GFC_STD_GNU, gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2477 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2479 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2481 add_sym_1 ("system", GFC_ISYM_SYSTEM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2482 GFC_STD_GNU, NULL, NULL, NULL,
2483 com, BT_CHARACTER, dc, REQUIRED);
2485 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2487 add_sym_1 ("tan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2488 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2489 x, BT_REAL, dr, REQUIRED);
2491 add_sym_1 ("dtan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2492 gfc_check_fn_d, gfc_simplify_tan, gfc_resolve_tan,
2493 x, BT_REAL, dd, REQUIRED);
2495 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2497 add_sym_1 ("tanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2498 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2499 x, BT_REAL, dr, REQUIRED);
2501 add_sym_1 ("dtanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2502 gfc_check_fn_d, gfc_simplify_tanh, gfc_resolve_tanh,
2503 x, BT_REAL, dd, REQUIRED);
2505 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2507 add_sym_0 ("time", GFC_ISYM_TIME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2508 NULL, NULL, gfc_resolve_time);
2510 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2512 add_sym_0 ("time8", GFC_ISYM_TIME8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2513 NULL, NULL, gfc_resolve_time8);
2515 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2517 add_sym_1 ("tiny", GFC_ISYM_TINY, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2518 gfc_check_x, gfc_simplify_tiny, NULL,
2519 x, BT_REAL, dr, REQUIRED);
2521 make_generic ("tiny", GFC_ISYM_TINY, GFC_STD_F95);
2523 add_sym_1 ("trailz", GFC_ISYM_TRAILZ, CLASS_ELEMENTAL, ACTUAL_NO,
2524 BT_INTEGER, di, GFC_STD_F2008,
2525 gfc_check_i, gfc_simplify_trailz, NULL,
2526 i, BT_INTEGER, di, REQUIRED);
2528 make_generic ("trailz", GFC_ISYM_TRAILZ, GFC_STD_F2008);
2530 add_sym_3 ("transfer", GFC_ISYM_TRANSFER, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2531 gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2532 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2533 sz, BT_INTEGER, di, OPTIONAL);
2535 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2537 add_sym_1 ("transpose", GFC_ISYM_TRANSPOSE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2538 gfc_check_transpose, gfc_simplify_transpose, gfc_resolve_transpose,
2539 m, BT_REAL, dr, REQUIRED);
2541 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2543 add_sym_1 ("trim", GFC_ISYM_TRIM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2544 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2545 stg, BT_CHARACTER, dc, REQUIRED);
2547 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2549 add_sym_1 ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
2550 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2551 ut, BT_INTEGER, di, REQUIRED);
2553 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2555 add_sym_3 ("ubound", GFC_ISYM_UBOUND, CLASS_INQUIRY, ACTUAL_NO,
2556 BT_INTEGER, di, GFC_STD_F95,
2557 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2558 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2559 kind, BT_INTEGER, di, OPTIONAL);
2561 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2563 /* g77 compatibility for UMASK. */
2564 add_sym_1 ("umask", GFC_ISYM_UMASK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2565 GFC_STD_GNU, gfc_check_umask, NULL, gfc_resolve_umask,
2566 msk, BT_INTEGER, di, REQUIRED);
2568 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2570 /* g77 compatibility for UNLINK. */
2571 add_sym_1 ("unlink", GFC_ISYM_UNLINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2572 gfc_check_unlink, NULL, gfc_resolve_unlink,
2573 "path", BT_CHARACTER, dc, REQUIRED);
2575 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2577 add_sym_3 ("unpack", GFC_ISYM_UNPACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2578 gfc_check_unpack, gfc_simplify_unpack, gfc_resolve_unpack,
2579 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2580 f, BT_REAL, dr, REQUIRED);
2582 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2584 add_sym_4 ("verify", GFC_ISYM_VERIFY, CLASS_ELEMENTAL, ACTUAL_NO,
2585 BT_INTEGER, di, GFC_STD_F95,
2586 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2587 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2588 bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2590 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2592 add_sym_1 ("loc", GFC_ISYM_LOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2593 GFC_STD_GNU, gfc_check_loc, NULL, gfc_resolve_loc,
2594 x, BT_UNKNOWN, 0, REQUIRED);
2596 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2600 /* Add intrinsic subroutines. */
2602 static void
2603 add_subroutines (void)
2605 /* Argument names as in the standard (to be used as argument keywords). */
2606 const char
2607 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2608 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2609 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2610 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2611 *com = "command", *length = "length", *st = "status",
2612 *val = "value", *num = "number", *name = "name",
2613 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2614 *sec = "seconds", *res = "result", *of = "offset", *md = "mode",
2615 *whence = "whence", *pos = "pos", *ptr = "ptr", *p1 = "path1",
2616 *p2 = "path2", *msk = "mask", *old = "old";
2618 int di, dr, dc, dl, ii;
2620 di = gfc_default_integer_kind;
2621 dr = gfc_default_real_kind;
2622 dc = gfc_default_character_kind;
2623 dl = gfc_default_logical_kind;
2624 ii = gfc_index_integer_kind;
2626 add_sym_0s ("abort", GFC_ISYM_ABORT, GFC_STD_GNU, NULL);
2628 make_noreturn();
2630 add_sym_1s_intent ("cpu_time", GFC_ISYM_CPU_TIME, NO_CLASS, BT_UNKNOWN, 0,
2631 GFC_STD_F95, gfc_check_cpu_time, NULL,
2632 gfc_resolve_cpu_time,
2633 tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
2635 /* More G77 compatibility garbage. */
2636 add_sym_2s ("ctime", GFC_ISYM_CTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2637 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2638 tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2640 add_sym_1s ("idate", GFC_ISYM_IDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2641 gfc_check_itime_idate, NULL, gfc_resolve_idate,
2642 vl, BT_INTEGER, 4, REQUIRED);
2644 add_sym_1s ("itime", GFC_ISYM_ITIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2645 gfc_check_itime_idate, NULL, gfc_resolve_itime,
2646 vl, BT_INTEGER, 4, REQUIRED);
2648 add_sym_2s ("ltime", GFC_ISYM_LTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2649 gfc_check_ltime_gmtime, NULL, gfc_resolve_ltime,
2650 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2652 add_sym_2s ("gmtime", GFC_ISYM_GMTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2653 gfc_check_ltime_gmtime, NULL, gfc_resolve_gmtime,
2654 tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2656 add_sym_1s ("second", GFC_ISYM_SECOND, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2657 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2658 tm, BT_REAL, dr, REQUIRED);
2660 add_sym_2s ("chdir", GFC_ISYM_CHDIR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2661 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2662 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2664 add_sym_3s ("chmod", GFC_ISYM_CHMOD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2665 gfc_check_chmod_sub, NULL, gfc_resolve_chmod_sub,
2666 name, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED,
2667 st, BT_INTEGER, di, OPTIONAL);
2669 add_sym_4s ("date_and_time", GFC_ISYM_DATE_AND_TIME, NO_CLASS, BT_UNKNOWN, 0,
2670 GFC_STD_F95, gfc_check_date_and_time, NULL, NULL,
2671 dt, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2672 tm, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2673 zn, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2674 vl, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2676 /* More G77 compatibility garbage. */
2677 add_sym_2s ("etime", GFC_ISYM_ETIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2678 gfc_check_dtime_etime_sub, NULL, gfc_resolve_etime_sub,
2679 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2681 add_sym_2s ("dtime", GFC_ISYM_DTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2682 gfc_check_dtime_etime_sub, NULL, gfc_resolve_dtime_sub,
2683 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2685 add_sym_1s ("fdate", GFC_ISYM_FDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2686 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2687 dt, BT_CHARACTER, dc, REQUIRED);
2689 add_sym_1s ("gerror", GFC_ISYM_GERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2690 gfc_check_gerror, NULL, gfc_resolve_gerror, res, BT_CHARACTER,
2691 dc, REQUIRED);
2693 add_sym_2s ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2694 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2695 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2697 add_sym_2s ("getenv", GFC_ISYM_GETENV, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2698 NULL, NULL, NULL,
2699 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc,
2700 REQUIRED);
2702 add_sym_2s ("getarg", GFC_ISYM_GETARG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2703 gfc_check_getarg, NULL, gfc_resolve_getarg,
2704 pos, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2706 add_sym_1s ("getlog", GFC_ISYM_GETLOG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2707 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2708 dc, REQUIRED);
2710 /* F2003 commandline routines. */
2712 add_sym_3s_intent ("get_command", GFC_ISYM_GET_COMMAND, NO_CLASS, BT_UNKNOWN,
2713 0, GFC_STD_F2003, NULL, NULL, gfc_resolve_get_command,
2714 com, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2715 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2716 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2718 add_sym_4s ("get_command_argument", GFC_ISYM_GET_COMMAND_ARGUMENT, NO_CLASS,
2719 BT_UNKNOWN, 0, GFC_STD_F2003, NULL, NULL,
2720 gfc_resolve_get_command_argument,
2721 num, BT_INTEGER, di, REQUIRED, INTENT_IN,
2722 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2723 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2724 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2726 /* F2003 subroutine to get environment variables. */
2728 add_sym_5s ("get_environment_variable", GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
2729 NO_CLASS, BT_UNKNOWN, 0, GFC_STD_F2003,
2730 NULL, NULL, gfc_resolve_get_environment_variable,
2731 name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2732 val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2733 length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2734 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2735 trim_name, BT_LOGICAL, dl, OPTIONAL, INTENT_IN);
2737 add_sym_2s_intent ("move_alloc", GFC_ISYM_MOVE_ALLOC, NO_CLASS, BT_UNKNOWN, 0,
2738 GFC_STD_F2003, gfc_check_move_alloc, NULL, NULL,
2739 f, BT_UNKNOWN, 0, REQUIRED, INTENT_INOUT,
2740 t, BT_UNKNOWN, 0, REQUIRED, INTENT_OUT);
2742 add_sym_5s ("mvbits", GFC_ISYM_MVBITS, CLASS_ELEMENTAL, BT_UNKNOWN, 0,
2743 GFC_STD_F95, gfc_check_mvbits, gfc_simplify_mvbits,
2744 gfc_resolve_mvbits,
2745 f, BT_INTEGER, di, REQUIRED, INTENT_IN,
2746 fp, BT_INTEGER, di, REQUIRED, INTENT_IN,
2747 ln, BT_INTEGER, di, REQUIRED, INTENT_IN,
2748 t, BT_INTEGER, di, REQUIRED, INTENT_INOUT,
2749 tp, BT_INTEGER, di, REQUIRED, INTENT_IN);
2751 add_sym_1s_intent ("random_number", GFC_ISYM_RANDOM_NUMBER, NO_CLASS,
2752 BT_UNKNOWN, 0, GFC_STD_F95, gfc_check_random_number, NULL,
2753 gfc_resolve_random_number,
2754 h, BT_REAL, dr, REQUIRED, INTENT_OUT);
2756 add_sym_3s_intent ("random_seed", GFC_ISYM_RANDOM_SEED, NO_CLASS,
2757 BT_UNKNOWN, 0, GFC_STD_F95,
2758 gfc_check_random_seed, NULL, gfc_resolve_random_seed,
2759 sz, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2760 pt, BT_INTEGER, di, OPTIONAL, INTENT_IN,
2761 gt, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2763 /* More G77 compatibility garbage. */
2764 add_sym_3s ("alarm", GFC_ISYM_ALARM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2765 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2766 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2767 st, BT_INTEGER, di, OPTIONAL);
2769 add_sym_1s ("srand", GFC_ISYM_SRAND, NO_CLASS, BT_UNKNOWN, di, GFC_STD_GNU,
2770 gfc_check_srand, NULL, gfc_resolve_srand,
2771 "seed", BT_INTEGER, 4, REQUIRED);
2773 add_sym_1s ("exit", GFC_ISYM_EXIT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2774 gfc_check_exit, NULL, gfc_resolve_exit,
2775 st, BT_INTEGER, di, OPTIONAL);
2777 make_noreturn();
2779 add_sym_3s ("fgetc", GFC_ISYM_FGETC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2780 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2781 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2782 st, BT_INTEGER, di, OPTIONAL);
2784 add_sym_2s ("fget", GFC_ISYM_FGET, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2785 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2786 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2788 add_sym_1s ("flush", GFC_ISYM_FLUSH, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2789 gfc_check_flush, NULL, gfc_resolve_flush,
2790 ut, BT_INTEGER, di, OPTIONAL);
2792 add_sym_3s ("fputc", GFC_ISYM_FPUTC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2793 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2794 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2795 st, BT_INTEGER, di, OPTIONAL);
2797 add_sym_2s ("fput", GFC_ISYM_FPUT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2798 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2799 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2801 add_sym_1s ("free", GFC_ISYM_FREE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2802 gfc_check_free, NULL, gfc_resolve_free,
2803 ptr, BT_INTEGER, ii, REQUIRED);
2805 add_sym_4s ("fseek", GFC_ISYM_FSEEK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2806 gfc_check_fseek_sub, NULL, gfc_resolve_fseek_sub,
2807 ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
2808 of, BT_INTEGER, di, REQUIRED, INTENT_IN,
2809 whence, BT_INTEGER, di, REQUIRED, INTENT_IN,
2810 st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2812 add_sym_2s ("ftell", GFC_ISYM_FTELL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2813 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2814 ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2816 add_sym_2s ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2817 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2818 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2820 add_sym_3s ("kill", GFC_ISYM_KILL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2821 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2822 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2824 add_sym_3s ("link", GFC_ISYM_LINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2825 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2826 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2827 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2829 add_sym_1s ("perror", GFC_ISYM_PERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2830 gfc_check_perror, NULL, gfc_resolve_perror,
2831 "string", BT_CHARACTER, dc, REQUIRED);
2833 add_sym_3s ("rename", GFC_ISYM_RENAME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2834 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2835 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2836 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2838 add_sym_1s ("sleep", GFC_ISYM_SLEEP, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2839 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2840 sec, BT_INTEGER, di, REQUIRED);
2842 add_sym_3s ("fstat", GFC_ISYM_FSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2843 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2844 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2845 st, BT_INTEGER, di, OPTIONAL);
2847 add_sym_3s ("lstat", GFC_ISYM_LSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2848 gfc_check_stat_sub, NULL, gfc_resolve_lstat_sub,
2849 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2850 st, BT_INTEGER, di, OPTIONAL);
2852 add_sym_3s ("stat", GFC_ISYM_STAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2853 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2854 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2855 st, BT_INTEGER, di, OPTIONAL);
2857 add_sym_3s ("signal", GFC_ISYM_SIGNAL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2858 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2859 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2860 st, BT_INTEGER, di, OPTIONAL);
2862 add_sym_3s ("symlnk", GFC_ISYM_SYMLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2863 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2864 p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2865 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2867 add_sym_2s ("system", GFC_ISYM_SYSTEM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2868 NULL, NULL, gfc_resolve_system_sub,
2869 com, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2871 add_sym_3s_intent ("system_clock", GFC_ISYM_SYSTEM_CLOCK, NO_CLASS,
2872 BT_UNKNOWN, 0, GFC_STD_F95,
2873 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2874 c, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2875 cr, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2876 cm, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2878 add_sym_2s ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2879 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2880 ut, BT_INTEGER, di, REQUIRED, name, BT_CHARACTER, dc, REQUIRED);
2882 add_sym_2s ("umask", GFC_ISYM_UMASK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2883 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2884 msk, BT_INTEGER, di, REQUIRED, old, BT_INTEGER, di, OPTIONAL);
2886 add_sym_2s ("unlink", GFC_ISYM_UNLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2887 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2888 "path", BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2892 /* Add a function to the list of conversion symbols. */
2894 static void
2895 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2897 gfc_typespec from, to;
2898 gfc_intrinsic_sym *sym;
2900 if (sizing == SZ_CONVS)
2902 nconv++;
2903 return;
2906 gfc_clear_ts (&from);
2907 from.type = from_type;
2908 from.kind = from_kind;
2910 gfc_clear_ts (&to);
2911 to.type = to_type;
2912 to.kind = to_kind;
2914 sym = conversion + nconv;
2916 sym->name = conv_name (&from, &to);
2917 sym->lib_name = sym->name;
2918 sym->simplify.cc = gfc_convert_constant;
2919 sym->standard = standard;
2920 sym->elemental = 1;
2921 sym->conversion = 1;
2922 sym->ts = to;
2923 sym->id = GFC_ISYM_CONVERSION;
2925 nconv++;
2929 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2930 functions by looping over the kind tables. */
2932 static void
2933 add_conversions (void)
2935 int i, j;
2937 /* Integer-Integer conversions. */
2938 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2939 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2941 if (i == j)
2942 continue;
2944 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2945 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2948 /* Integer-Real/Complex conversions. */
2949 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2950 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2952 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2953 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2955 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2956 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2958 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2959 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2961 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2962 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2965 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2967 /* Hollerith-Integer conversions. */
2968 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2969 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2970 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2971 /* Hollerith-Real conversions. */
2972 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2973 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2974 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2975 /* Hollerith-Complex conversions. */
2976 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2977 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2978 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2980 /* Hollerith-Character conversions. */
2981 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2982 gfc_default_character_kind, GFC_STD_LEGACY);
2984 /* Hollerith-Logical conversions. */
2985 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2986 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2987 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2990 /* Real/Complex - Real/Complex conversions. */
2991 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2992 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2994 if (i != j)
2996 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2997 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2999 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3000 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3003 add_conv (BT_REAL, gfc_real_kinds[i].kind,
3004 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3006 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3007 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3010 /* Logical/Logical kind conversion. */
3011 for (i = 0; gfc_logical_kinds[i].kind; i++)
3012 for (j = 0; gfc_logical_kinds[j].kind; j++)
3014 if (i == j)
3015 continue;
3017 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
3018 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
3021 /* Integer-Logical and Logical-Integer conversions. */
3022 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3023 for (i=0; gfc_integer_kinds[i].kind; i++)
3024 for (j=0; gfc_logical_kinds[j].kind; j++)
3026 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3027 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
3028 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
3029 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3034 static void
3035 add_char_conversions (void)
3037 int n, i, j;
3039 /* Count possible conversions. */
3040 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3041 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3042 if (i != j)
3043 ncharconv++;
3045 /* Allocate memory. */
3046 char_conversions = XCNEWVEC (gfc_intrinsic_sym, ncharconv);
3048 /* Add the conversions themselves. */
3049 n = 0;
3050 for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3051 for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3053 gfc_typespec from, to;
3055 if (i == j)
3056 continue;
3058 gfc_clear_ts (&from);
3059 from.type = BT_CHARACTER;
3060 from.kind = gfc_character_kinds[i].kind;
3062 gfc_clear_ts (&to);
3063 to.type = BT_CHARACTER;
3064 to.kind = gfc_character_kinds[j].kind;
3066 char_conversions[n].name = conv_name (&from, &to);
3067 char_conversions[n].lib_name = char_conversions[n].name;
3068 char_conversions[n].simplify.cc = gfc_convert_char_constant;
3069 char_conversions[n].standard = GFC_STD_F2003;
3070 char_conversions[n].elemental = 1;
3071 char_conversions[n].conversion = 0;
3072 char_conversions[n].ts = to;
3073 char_conversions[n].id = GFC_ISYM_CONVERSION;
3075 n++;
3080 /* Initialize the table of intrinsics. */
3081 void
3082 gfc_intrinsic_init_1 (void)
3084 int i;
3086 nargs = nfunc = nsub = nconv = 0;
3088 /* Create a namespace to hold the resolved intrinsic symbols. */
3089 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
3091 sizing = SZ_FUNCS;
3092 add_functions ();
3093 sizing = SZ_SUBS;
3094 add_subroutines ();
3095 sizing = SZ_CONVS;
3096 add_conversions ();
3098 functions = XCNEWVAR (struct gfc_intrinsic_sym,
3099 sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
3100 + sizeof (gfc_intrinsic_arg) * nargs);
3102 next_sym = functions;
3103 subroutines = functions + nfunc;
3105 conversion = XCNEWVEC (gfc_intrinsic_sym, nconv);
3107 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
3109 sizing = SZ_NOTHING;
3110 nconv = 0;
3112 add_functions ();
3113 add_subroutines ();
3114 add_conversions ();
3116 /* Character conversion intrinsics need to be treated separately. */
3117 add_char_conversions ();
3119 /* Set the pure flag. All intrinsic functions are pure, and
3120 intrinsic subroutines are pure if they are elemental. */
3122 for (i = 0; i < nfunc; i++)
3123 functions[i].pure = 1;
3125 for (i = 0; i < nsub; i++)
3126 subroutines[i].pure = subroutines[i].elemental;
3130 void
3131 gfc_intrinsic_done_1 (void)
3133 gfc_free (functions);
3134 gfc_free (conversion);
3135 gfc_free (char_conversions);
3136 gfc_free_namespace (gfc_intrinsic_namespace);
3140 /******** Subroutines to check intrinsic interfaces ***********/
3142 /* Given a formal argument list, remove any NULL arguments that may
3143 have been left behind by a sort against some formal argument list. */
3145 static void
3146 remove_nullargs (gfc_actual_arglist **ap)
3148 gfc_actual_arglist *head, *tail, *next;
3150 tail = NULL;
3152 for (head = *ap; head; head = next)
3154 next = head->next;
3156 if (head->expr == NULL && !head->label)
3158 head->next = NULL;
3159 gfc_free_actual_arglist (head);
3161 else
3163 if (tail == NULL)
3164 *ap = head;
3165 else
3166 tail->next = head;
3168 tail = head;
3169 tail->next = NULL;
3173 if (tail == NULL)
3174 *ap = NULL;
3178 /* Given an actual arglist and a formal arglist, sort the actual
3179 arglist so that its arguments are in a one-to-one correspondence
3180 with the format arglist. Arguments that are not present are given
3181 a blank gfc_actual_arglist structure. If something is obviously
3182 wrong (say, a missing required argument) we abort sorting and
3183 return FAILURE. */
3185 static gfc_try
3186 sort_actual (const char *name, gfc_actual_arglist **ap,
3187 gfc_intrinsic_arg *formal, locus *where)
3189 gfc_actual_arglist *actual, *a;
3190 gfc_intrinsic_arg *f;
3192 remove_nullargs (ap);
3193 actual = *ap;
3195 for (f = formal; f; f = f->next)
3196 f->actual = NULL;
3198 f = formal;
3199 a = actual;
3201 if (f == NULL && a == NULL) /* No arguments */
3202 return SUCCESS;
3204 for (;;)
3205 { /* Put the nonkeyword arguments in a 1:1 correspondence */
3206 if (f == NULL)
3207 break;
3208 if (a == NULL)
3209 goto optional;
3211 if (a->name != NULL)
3212 goto keywords;
3214 f->actual = a;
3216 f = f->next;
3217 a = a->next;
3220 if (a == NULL)
3221 goto do_sort;
3223 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
3224 return FAILURE;
3226 keywords:
3227 /* Associate the remaining actual arguments, all of which have
3228 to be keyword arguments. */
3229 for (; a; a = a->next)
3231 for (f = formal; f; f = f->next)
3232 if (strcmp (a->name, f->name) == 0)
3233 break;
3235 if (f == NULL)
3237 if (a->name[0] == '%')
3238 gfc_error ("The argument list functions %%VAL, %%LOC or %%REF "
3239 "are not allowed in this context at %L", where);
3240 else
3241 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
3242 a->name, name, where);
3243 return FAILURE;
3246 if (f->actual != NULL)
3248 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
3249 f->name, name, where);
3250 return FAILURE;
3253 f->actual = a;
3256 optional:
3257 /* At this point, all unmatched formal args must be optional. */
3258 for (f = formal; f; f = f->next)
3260 if (f->actual == NULL && f->optional == 0)
3262 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
3263 f->name, name, where);
3264 return FAILURE;
3268 do_sort:
3269 /* Using the formal argument list, string the actual argument list
3270 together in a way that corresponds with the formal list. */
3271 actual = NULL;
3273 for (f = formal; f; f = f->next)
3275 if (f->actual && f->actual->label != NULL && f->ts.type)
3277 gfc_error ("ALTERNATE RETURN not permitted at %L", where);
3278 return FAILURE;
3281 if (f->actual == NULL)
3283 a = gfc_get_actual_arglist ();
3284 a->missing_arg_type = f->ts.type;
3286 else
3287 a = f->actual;
3289 if (actual == NULL)
3290 *ap = a;
3291 else
3292 actual->next = a;
3294 actual = a;
3296 actual->next = NULL; /* End the sorted argument list. */
3298 return SUCCESS;
3302 /* Compare an actual argument list with an intrinsic's formal argument
3303 list. The lists are checked for agreement of type. We don't check
3304 for arrayness here. */
3306 static gfc_try
3307 check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym,
3308 int error_flag)
3310 gfc_actual_arglist *actual;
3311 gfc_intrinsic_arg *formal;
3312 int i;
3314 formal = sym->formal;
3315 actual = *ap;
3317 i = 0;
3318 for (; formal; formal = formal->next, actual = actual->next, i++)
3320 gfc_typespec ts;
3322 if (actual->expr == NULL)
3323 continue;
3325 ts = formal->ts;
3327 /* A kind of 0 means we don't check for kind. */
3328 if (ts.kind == 0)
3329 ts.kind = actual->expr->ts.kind;
3331 if (!gfc_compare_types (&ts, &actual->expr->ts))
3333 if (error_flag)
3334 gfc_error ("Type of argument '%s' in call to '%s' at %L should "
3335 "be %s, not %s", gfc_current_intrinsic_arg[i],
3336 gfc_current_intrinsic, &actual->expr->where,
3337 gfc_typename (&formal->ts),
3338 gfc_typename (&actual->expr->ts));
3339 return FAILURE;
3343 return SUCCESS;
3347 /* Given a pointer to an intrinsic symbol and an expression node that
3348 represent the function call to that subroutine, figure out the type
3349 of the result. This may involve calling a resolution subroutine. */
3351 static void
3352 resolve_intrinsic (gfc_intrinsic_sym *specific, gfc_expr *e)
3354 gfc_expr *a1, *a2, *a3, *a4, *a5;
3355 gfc_actual_arglist *arg;
3357 if (specific->resolve.f1 == NULL)
3359 if (e->value.function.name == NULL)
3360 e->value.function.name = specific->lib_name;
3362 if (e->ts.type == BT_UNKNOWN)
3363 e->ts = specific->ts;
3364 return;
3367 arg = e->value.function.actual;
3369 /* Special case hacks for MIN and MAX. */
3370 if (specific->resolve.f1m == gfc_resolve_max
3371 || specific->resolve.f1m == gfc_resolve_min)
3373 (*specific->resolve.f1m) (e, arg);
3374 return;
3377 if (arg == NULL)
3379 (*specific->resolve.f0) (e);
3380 return;
3383 a1 = arg->expr;
3384 arg = arg->next;
3386 if (arg == NULL)
3388 (*specific->resolve.f1) (e, a1);
3389 return;
3392 a2 = arg->expr;
3393 arg = arg->next;
3395 if (arg == NULL)
3397 (*specific->resolve.f2) (e, a1, a2);
3398 return;
3401 a3 = arg->expr;
3402 arg = arg->next;
3404 if (arg == NULL)
3406 (*specific->resolve.f3) (e, a1, a2, a3);
3407 return;
3410 a4 = arg->expr;
3411 arg = arg->next;
3413 if (arg == NULL)
3415 (*specific->resolve.f4) (e, a1, a2, a3, a4);
3416 return;
3419 a5 = arg->expr;
3420 arg = arg->next;
3422 if (arg == NULL)
3424 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
3425 return;
3428 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
3432 /* Given an intrinsic symbol node and an expression node, call the
3433 simplification function (if there is one), perhaps replacing the
3434 expression with something simpler. We return FAILURE on an error
3435 of the simplification, SUCCESS if the simplification worked, even
3436 if nothing has changed in the expression itself. */
3438 static gfc_try
3439 do_simplify (gfc_intrinsic_sym *specific, gfc_expr *e)
3441 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
3442 gfc_actual_arglist *arg;
3444 /* Max and min require special handling due to the variable number
3445 of args. */
3446 if (specific->simplify.f1 == gfc_simplify_min)
3448 result = gfc_simplify_min (e);
3449 goto finish;
3452 if (specific->simplify.f1 == gfc_simplify_max)
3454 result = gfc_simplify_max (e);
3455 goto finish;
3458 if (specific->simplify.f1 == NULL)
3460 result = NULL;
3461 goto finish;
3464 arg = e->value.function.actual;
3466 if (arg == NULL)
3468 result = (*specific->simplify.f0) ();
3469 goto finish;
3472 a1 = arg->expr;
3473 arg = arg->next;
3475 if (specific->simplify.cc == gfc_convert_constant
3476 || specific->simplify.cc == gfc_convert_char_constant)
3478 result = specific->simplify.cc (a1, specific->ts.type, specific->ts.kind);
3479 goto finish;
3482 if (arg == NULL)
3483 result = (*specific->simplify.f1) (a1);
3484 else
3486 a2 = arg->expr;
3487 arg = arg->next;
3489 if (arg == NULL)
3490 result = (*specific->simplify.f2) (a1, a2);
3491 else
3493 a3 = arg->expr;
3494 arg = arg->next;
3496 if (arg == NULL)
3497 result = (*specific->simplify.f3) (a1, a2, a3);
3498 else
3500 a4 = arg->expr;
3501 arg = arg->next;
3503 if (arg == NULL)
3504 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3505 else
3507 a5 = arg->expr;
3508 arg = arg->next;
3510 if (arg == NULL)
3511 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3512 else
3513 gfc_internal_error
3514 ("do_simplify(): Too many args for intrinsic");
3520 finish:
3521 if (result == &gfc_bad_expr)
3522 return FAILURE;
3524 if (result == NULL)
3525 resolve_intrinsic (specific, e); /* Must call at run-time */
3526 else
3528 result->where = e->where;
3529 gfc_replace_expr (e, result);
3532 return SUCCESS;
3536 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3537 error messages. This subroutine returns FAILURE if a subroutine
3538 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3539 list cannot match any intrinsic. */
3541 static void
3542 init_arglist (gfc_intrinsic_sym *isym)
3544 gfc_intrinsic_arg *formal;
3545 int i;
3547 gfc_current_intrinsic = isym->name;
3549 i = 0;
3550 for (formal = isym->formal; formal; formal = formal->next)
3552 if (i >= MAX_INTRINSIC_ARGS)
3553 gfc_internal_error ("init_arglist(): too many arguments");
3554 gfc_current_intrinsic_arg[i++] = formal->name;
3559 /* Given a pointer to an intrinsic symbol and an expression consisting
3560 of a function call, see if the function call is consistent with the
3561 intrinsic's formal argument list. Return SUCCESS if the expression
3562 and intrinsic match, FAILURE otherwise. */
3564 static gfc_try
3565 check_specific (gfc_intrinsic_sym *specific, gfc_expr *expr, int error_flag)
3567 gfc_actual_arglist *arg, **ap;
3568 gfc_try t;
3570 ap = &expr->value.function.actual;
3572 init_arglist (specific);
3574 /* Don't attempt to sort the argument list for min or max. */
3575 if (specific->check.f1m == gfc_check_min_max
3576 || specific->check.f1m == gfc_check_min_max_integer
3577 || specific->check.f1m == gfc_check_min_max_real
3578 || specific->check.f1m == gfc_check_min_max_double)
3579 return (*specific->check.f1m) (*ap);
3581 if (sort_actual (specific->name, ap, specific->formal,
3582 &expr->where) == FAILURE)
3583 return FAILURE;
3585 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3586 /* This is special because we might have to reorder the argument list. */
3587 t = gfc_check_minloc_maxloc (*ap);
3588 else if (specific->check.f3red == gfc_check_minval_maxval)
3589 /* This is also special because we also might have to reorder the
3590 argument list. */
3591 t = gfc_check_minval_maxval (*ap);
3592 else if (specific->check.f3red == gfc_check_product_sum)
3593 /* Same here. The difference to the previous case is that we allow a
3594 general numeric type. */
3595 t = gfc_check_product_sum (*ap);
3596 else
3598 if (specific->check.f1 == NULL)
3600 t = check_arglist (ap, specific, error_flag);
3601 if (t == SUCCESS)
3602 expr->ts = specific->ts;
3604 else
3605 t = do_check (specific, *ap);
3608 /* Check conformance of elemental intrinsics. */
3609 if (t == SUCCESS && specific->elemental)
3611 int n = 0;
3612 gfc_expr *first_expr;
3613 arg = expr->value.function.actual;
3615 /* There is no elemental intrinsic without arguments. */
3616 gcc_assert(arg != NULL);
3617 first_expr = arg->expr;
3619 for ( ; arg && arg->expr; arg = arg->next, n++)
3620 if (gfc_check_conformance (first_expr, arg->expr,
3621 "arguments '%s' and '%s' for "
3622 "intrinsic '%s'",
3623 gfc_current_intrinsic_arg[0],
3624 gfc_current_intrinsic_arg[n],
3625 gfc_current_intrinsic) == FAILURE)
3626 return FAILURE;
3629 if (t == FAILURE)
3630 remove_nullargs (ap);
3632 return t;
3636 /* Check whether an intrinsic belongs to whatever standard the user
3637 has chosen, taking also into account -fall-intrinsics. Here, no
3638 warning/error is emitted; but if symstd is not NULL, it is pointed to a
3639 textual representation of the symbols standard status (like
3640 "new in Fortran 2008", "a GNU extension" or "obsolescent in Fortran 95") that
3641 can be used to construct a detailed warning/error message in case of
3642 a FAILURE. */
3644 gfc_try
3645 gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym,
3646 const char** symstd, bool silent, locus where)
3648 const char* symstd_msg;
3650 /* For -fall-intrinsics, just succeed. */
3651 if (gfc_option.flag_all_intrinsics)
3652 return SUCCESS;
3654 /* Find the symbol's standard message for later usage. */
3655 switch (isym->standard)
3657 case GFC_STD_F77:
3658 symstd_msg = "available since Fortran 77";
3659 break;
3661 case GFC_STD_F95_OBS:
3662 symstd_msg = "obsolescent in Fortran 95";
3663 break;
3665 case GFC_STD_F95_DEL:
3666 symstd_msg = "deleted in Fortran 95";
3667 break;
3669 case GFC_STD_F95:
3670 symstd_msg = "new in Fortran 95";
3671 break;
3673 case GFC_STD_F2003:
3674 symstd_msg = "new in Fortran 2003";
3675 break;
3677 case GFC_STD_F2008:
3678 symstd_msg = "new in Fortran 2008";
3679 break;
3681 case GFC_STD_GNU:
3682 symstd_msg = "a GNU Fortran extension";
3683 break;
3685 case GFC_STD_LEGACY:
3686 symstd_msg = "for backward compatibility";
3687 break;
3689 default:
3690 gfc_internal_error ("Invalid standard code on intrinsic '%s' (%d)",
3691 isym->name, isym->standard);
3694 /* If warning about the standard, warn and succeed. */
3695 if (gfc_option.warn_std & isym->standard)
3697 /* Do only print a warning if not a GNU extension. */
3698 if (!silent && isym->standard != GFC_STD_GNU)
3699 gfc_warning ("Intrinsic '%s' (is %s) is used at %L",
3700 isym->name, _(symstd_msg), &where);
3702 return SUCCESS;
3705 /* If allowing the symbol's standard, succeed, too. */
3706 if (gfc_option.allow_std & isym->standard)
3707 return SUCCESS;
3709 /* Otherwise, fail. */
3710 if (symstd)
3711 *symstd = _(symstd_msg);
3712 return FAILURE;
3716 /* See if a function call corresponds to an intrinsic function call.
3717 We return:
3719 MATCH_YES if the call corresponds to an intrinsic, simplification
3720 is done if possible.
3722 MATCH_NO if the call does not correspond to an intrinsic
3724 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3725 error during the simplification process.
3727 The error_flag parameter enables an error reporting. */
3729 match
3730 gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag)
3732 gfc_intrinsic_sym *isym, *specific;
3733 gfc_actual_arglist *actual;
3734 const char *name;
3735 int flag;
3737 if (expr->value.function.isym != NULL)
3738 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3739 ? MATCH_ERROR : MATCH_YES;
3741 if (!error_flag)
3742 gfc_push_suppress_errors ();
3743 flag = 0;
3745 for (actual = expr->value.function.actual; actual; actual = actual->next)
3746 if (actual->expr != NULL)
3747 flag |= (actual->expr->ts.type != BT_INTEGER
3748 && actual->expr->ts.type != BT_CHARACTER);
3750 name = expr->symtree->n.sym->name;
3752 isym = specific = gfc_find_function (name);
3753 if (isym == NULL)
3755 if (!error_flag)
3756 gfc_pop_suppress_errors ();
3757 return MATCH_NO;
3760 if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
3761 || isym->id == GFC_ISYM_CMPLX)
3762 && gfc_init_expr
3763 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
3764 "as initialization expression at %L", name,
3765 &expr->where) == FAILURE)
3767 if (!error_flag)
3768 gfc_pop_suppress_errors ();
3769 return MATCH_ERROR;
3772 gfc_current_intrinsic_where = &expr->where;
3774 /* Bypass the generic list for min and max. */
3775 if (isym->check.f1m == gfc_check_min_max)
3777 init_arglist (isym);
3779 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3780 goto got_specific;
3782 if (!error_flag)
3783 gfc_pop_suppress_errors ();
3784 return MATCH_NO;
3787 /* If the function is generic, check all of its specific
3788 incarnations. If the generic name is also a specific, we check
3789 that name last, so that any error message will correspond to the
3790 specific. */
3791 gfc_push_suppress_errors ();
3793 if (isym->generic)
3795 for (specific = isym->specific_head; specific;
3796 specific = specific->next)
3798 if (specific == isym)
3799 continue;
3800 if (check_specific (specific, expr, 0) == SUCCESS)
3802 gfc_pop_suppress_errors ();
3803 goto got_specific;
3808 gfc_pop_suppress_errors ();
3810 if (check_specific (isym, expr, error_flag) == FAILURE)
3812 if (!error_flag)
3813 gfc_pop_suppress_errors ();
3814 return MATCH_NO;
3817 specific = isym;
3819 got_specific:
3820 expr->value.function.isym = specific;
3821 gfc_intrinsic_symbol (expr->symtree->n.sym);
3823 if (!error_flag)
3824 gfc_pop_suppress_errors ();
3826 if (do_simplify (specific, expr) == FAILURE)
3827 return MATCH_ERROR;
3829 /* F95, 7.1.6.1, Initialization expressions
3830 (4) An elemental intrinsic function reference of type integer or
3831 character where each argument is an initialization expression
3832 of type integer or character
3834 F2003, 7.1.7 Initialization expression
3835 (4) A reference to an elemental standard intrinsic function,
3836 where each argument is an initialization expression */
3838 if (gfc_init_expr && isym->elemental && flag
3839 && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Elemental function "
3840 "as initialization expression with non-integer/non-"
3841 "character arguments at %L", &expr->where) == FAILURE)
3842 return MATCH_ERROR;
3844 return MATCH_YES;
3848 /* See if a CALL statement corresponds to an intrinsic subroutine.
3849 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3850 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3851 correspond). */
3853 match
3854 gfc_intrinsic_sub_interface (gfc_code *c, int error_flag)
3856 gfc_intrinsic_sym *isym;
3857 const char *name;
3859 name = c->symtree->n.sym->name;
3861 isym = gfc_find_subroutine (name);
3862 if (isym == NULL)
3863 return MATCH_NO;
3865 if (!error_flag)
3866 gfc_push_suppress_errors ();
3868 init_arglist (isym);
3870 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3871 goto fail;
3873 if (isym->check.f1 != NULL)
3875 if (do_check (isym, c->ext.actual) == FAILURE)
3876 goto fail;
3878 else
3880 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3881 goto fail;
3884 /* The subroutine corresponds to an intrinsic. Allow errors to be
3885 seen at this point. */
3886 if (!error_flag)
3887 gfc_pop_suppress_errors ();
3889 c->resolved_isym = isym;
3890 if (isym->resolve.s1 != NULL)
3891 isym->resolve.s1 (c);
3892 else
3894 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3895 c->resolved_sym->attr.elemental = isym->elemental;
3898 if (gfc_pure (NULL) && !isym->elemental)
3900 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3901 &c->loc);
3902 return MATCH_ERROR;
3905 c->resolved_sym->attr.noreturn = isym->noreturn;
3907 return MATCH_YES;
3909 fail:
3910 if (!error_flag)
3911 gfc_pop_suppress_errors ();
3912 return MATCH_NO;
3916 /* Call gfc_convert_type() with warning enabled. */
3918 gfc_try
3919 gfc_convert_type (gfc_expr *expr, gfc_typespec *ts, int eflag)
3921 return gfc_convert_type_warn (expr, ts, eflag, 1);
3925 /* Try to convert an expression (in place) from one type to another.
3926 'eflag' controls the behavior on error.
3928 The possible values are:
3930 1 Generate a gfc_error()
3931 2 Generate a gfc_internal_error().
3933 'wflag' controls the warning related to conversion. */
3935 gfc_try
3936 gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
3938 gfc_intrinsic_sym *sym;
3939 gfc_typespec from_ts;
3940 locus old_where;
3941 gfc_expr *new_expr;
3942 int rank;
3943 mpz_t *shape;
3945 from_ts = expr->ts; /* expr->ts gets clobbered */
3947 if (ts->type == BT_UNKNOWN)
3948 goto bad;
3950 /* NULL and zero size arrays get their type here. */
3951 if (expr->expr_type == EXPR_NULL
3952 || (expr->expr_type == EXPR_ARRAY && expr->value.constructor == NULL))
3954 /* Sometimes the RHS acquire the type. */
3955 expr->ts = *ts;
3956 return SUCCESS;
3959 if (expr->ts.type == BT_UNKNOWN)
3960 goto bad;
3962 if (expr->ts.type == BT_DERIVED && ts->type == BT_DERIVED
3963 && gfc_compare_types (&expr->ts, ts))
3964 return SUCCESS;
3966 sym = find_conv (&expr->ts, ts);
3967 if (sym == NULL)
3968 goto bad;
3970 /* At this point, a conversion is necessary. A warning may be needed. */
3971 if ((gfc_option.warn_std & sym->standard) != 0)
3972 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3973 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3974 else if (wflag && gfc_option.warn_conversion)
3975 gfc_warning_now ("Conversion from %s to %s at %L",
3976 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3978 /* Insert a pre-resolved function call to the right function. */
3979 old_where = expr->where;
3980 rank = expr->rank;
3981 shape = expr->shape;
3983 new_expr = gfc_get_expr ();
3984 *new_expr = *expr;
3986 new_expr = gfc_build_conversion (new_expr);
3987 new_expr->value.function.name = sym->lib_name;
3988 new_expr->value.function.isym = sym;
3989 new_expr->where = old_where;
3990 new_expr->rank = rank;
3991 new_expr->shape = gfc_copy_shape (shape, rank);
3993 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
3994 new_expr->symtree->n.sym->ts = *ts;
3995 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
3996 new_expr->symtree->n.sym->attr.function = 1;
3997 new_expr->symtree->n.sym->attr.elemental = 1;
3998 new_expr->symtree->n.sym->attr.pure = 1;
3999 new_expr->symtree->n.sym->attr.referenced = 1;
4000 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4001 gfc_commit_symbol (new_expr->symtree->n.sym);
4003 *expr = *new_expr;
4005 gfc_free (new_expr);
4006 expr->ts = *ts;
4008 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4009 && do_simplify (sym, expr) == FAILURE)
4012 if (eflag == 2)
4013 goto bad;
4014 return FAILURE; /* Error already generated in do_simplify() */
4017 return SUCCESS;
4019 bad:
4020 if (eflag == 1)
4022 gfc_error ("Can't convert %s to %s at %L",
4023 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
4024 return FAILURE;
4027 gfc_internal_error ("Can't convert %s to %s at %L",
4028 gfc_typename (&from_ts), gfc_typename (ts),
4029 &expr->where);
4030 /* Not reached */
4034 gfc_try
4035 gfc_convert_chartype (gfc_expr *expr, gfc_typespec *ts)
4037 gfc_intrinsic_sym *sym;
4038 gfc_typespec from_ts;
4039 locus old_where;
4040 gfc_expr *new_expr;
4041 int rank;
4042 mpz_t *shape;
4044 gcc_assert (expr->ts.type == BT_CHARACTER && ts->type == BT_CHARACTER);
4045 from_ts = expr->ts; /* expr->ts gets clobbered */
4047 sym = find_char_conv (&expr->ts, ts);
4048 gcc_assert (sym);
4050 /* Insert a pre-resolved function call to the right function. */
4051 old_where = expr->where;
4052 rank = expr->rank;
4053 shape = expr->shape;
4055 new_expr = gfc_get_expr ();
4056 *new_expr = *expr;
4058 new_expr = gfc_build_conversion (new_expr);
4059 new_expr->value.function.name = sym->lib_name;
4060 new_expr->value.function.isym = sym;
4061 new_expr->where = old_where;
4062 new_expr->rank = rank;
4063 new_expr->shape = gfc_copy_shape (shape, rank);
4065 gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4066 new_expr->symtree->n.sym->ts = *ts;
4067 new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4068 new_expr->symtree->n.sym->attr.function = 1;
4069 new_expr->symtree->n.sym->attr.elemental = 1;
4070 new_expr->symtree->n.sym->attr.referenced = 1;
4071 gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4072 gfc_commit_symbol (new_expr->symtree->n.sym);
4074 *expr = *new_expr;
4076 gfc_free (new_expr);
4077 expr->ts = *ts;
4079 if (gfc_is_constant_expr (expr->value.function.actual->expr)
4080 && do_simplify (sym, expr) == FAILURE)
4082 /* Error already generated in do_simplify() */
4083 return FAILURE;
4086 return SUCCESS;
4090 /* Check if the passed name is name of an intrinsic (taking into account the
4091 current -std=* and -fall-intrinsic settings). If it is, see if we should
4092 warn about this as a user-procedure having the same name as an intrinsic
4093 (-Wintrinsic-shadow enabled) and do so if we should. */
4095 void
4096 gfc_warn_intrinsic_shadow (const gfc_symbol* sym, bool in_module, bool func)
4098 gfc_intrinsic_sym* isym;
4100 /* If the warning is disabled, do nothing at all. */
4101 if (!gfc_option.warn_intrinsic_shadow)
4102 return;
4104 /* Try to find an intrinsic of the same name. */
4105 if (func)
4106 isym = gfc_find_function (sym->name);
4107 else
4108 isym = gfc_find_subroutine (sym->name);
4110 /* If no intrinsic was found with this name or it's not included in the
4111 selected standard, everything's fine. */
4112 if (!isym || gfc_check_intrinsic_standard (isym, NULL, true,
4113 sym->declared_at) == FAILURE)
4114 return;
4116 /* Emit the warning. */
4117 if (in_module)
4118 gfc_warning ("'%s' declared at %L may shadow the intrinsic of the same"
4119 " name. In order to call the intrinsic, explicit INTRINSIC"
4120 " declarations may be required.",
4121 sym->name, &sym->declared_at);
4122 else
4123 gfc_warning ("'%s' declared at %L is also the name of an intrinsic. It can"
4124 " only be called via an explicit interface or if declared"
4125 " EXTERNAL.", sym->name, &sym->declared_at);