Add SB-1 specific multilib support. Patch by Fred Fish.
[official-gcc.git] / gcc / fortran / intrinsic.c
blob082c1b0188aba6b4634dee06b94ce04f54f1cef6
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 Free Software Foundation,
4 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 2, 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 COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
25 #include "config.h"
26 #include "system.h"
27 #include "flags.h"
28 #include "gfortran.h"
29 #include "intrinsic.h"
32 /* Namespace to hold the resolved symbols for intrinsic subroutines. */
33 static gfc_namespace *gfc_intrinsic_namespace;
35 int gfc_init_expr = 0;
37 /* Pointers to an intrinsic function and its argument names that are being
38 checked. */
40 const char *gfc_current_intrinsic;
41 const char *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
42 locus *gfc_current_intrinsic_where;
44 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
45 static gfc_intrinsic_arg *next_arg;
47 static int nfunc, nsub, nargs, nconv;
49 static enum
50 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
51 sizing;
53 #define REQUIRED 0
54 #define OPTIONAL 1
56 /* Return a letter based on the passed type. Used to construct the
57 name of a type-dependent subroutine. */
59 char
60 gfc_type_letter (bt type)
62 char c;
64 switch (type)
66 case BT_LOGICAL:
67 c = 'l';
68 break;
69 case BT_CHARACTER:
70 c = 's';
71 break;
72 case BT_INTEGER:
73 c = 'i';
74 break;
75 case BT_REAL:
76 c = 'r';
77 break;
78 case BT_COMPLEX:
79 c = 'c';
80 break;
82 case BT_HOLLERITH:
83 c = 'h';
84 break;
86 default:
87 c = 'u';
88 break;
91 return c;
95 /* Get a symbol for a resolved name. */
97 gfc_symbol *
98 gfc_get_intrinsic_sub_symbol (const char * name)
100 gfc_symbol *sym;
102 gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
103 sym->attr.always_explicit = 1;
104 sym->attr.subroutine = 1;
105 sym->attr.flavor = FL_PROCEDURE;
106 sym->attr.proc = PROC_INTRINSIC;
108 return sym;
112 /* Return a pointer to the name of a conversion function given two
113 typespecs. */
115 static const char *
116 conv_name (gfc_typespec * from, gfc_typespec * to)
118 static char name[30];
120 sprintf (name, "__convert_%c%d_%c%d", gfc_type_letter (from->type),
121 from->kind, gfc_type_letter (to->type), to->kind);
123 return gfc_get_string (name);
127 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
128 corresponds to the conversion. Returns NULL if the conversion
129 isn't found. */
131 static gfc_intrinsic_sym *
132 find_conv (gfc_typespec * from, gfc_typespec * to)
134 gfc_intrinsic_sym *sym;
135 const char *target;
136 int i;
138 target = conv_name (from, to);
139 sym = conversion;
141 for (i = 0; i < nconv; i++, sym++)
142 if (strcmp (target, sym->name) == 0)
143 return sym;
145 return NULL;
149 /* Interface to the check functions. We break apart an argument list
150 and call the proper check function rather than forcing each
151 function to manipulate the argument list. */
153 static try
154 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
156 gfc_expr *a1, *a2, *a3, *a4, *a5;
158 if (arg == NULL)
159 return (*specific->check.f0) ();
161 a1 = arg->expr;
162 arg = arg->next;
163 if (arg == NULL)
164 return (*specific->check.f1) (a1);
166 a2 = arg->expr;
167 arg = arg->next;
168 if (arg == NULL)
169 return (*specific->check.f2) (a1, a2);
171 a3 = arg->expr;
172 arg = arg->next;
173 if (arg == NULL)
174 return (*specific->check.f3) (a1, a2, a3);
176 a4 = arg->expr;
177 arg = arg->next;
178 if (arg == NULL)
179 return (*specific->check.f4) (a1, a2, a3, a4);
181 a5 = arg->expr;
182 arg = arg->next;
183 if (arg == NULL)
184 return (*specific->check.f5) (a1, a2, a3, a4, a5);
186 gfc_internal_error ("do_check(): too many args");
190 /*********** Subroutines to build the intrinsic list ****************/
192 /* Add a single intrinsic symbol to the current list.
194 Argument list:
195 char * name of function
196 int whether function is elemental
197 int If the function can be used as an actual argument
198 bt return type of function
199 int kind of return type of function
200 int Fortran standard version
201 check pointer to check function
202 simplify pointer to simplification function
203 resolve pointer to resolution function
205 Optional arguments come in multiples of four:
206 char * name of argument
207 bt type of argument
208 int kind of argument
209 int arg optional flag (1=optional, 0=required)
211 The sequence is terminated by a NULL name.
213 TODO: Are checks on actual_ok implemented elsewhere, or is that just
214 missing here? */
216 static void
217 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
218 bt type, int kind, int standard, gfc_check_f check,
219 gfc_simplify_f simplify, gfc_resolve_f resolve, ...)
221 char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0' */
222 int optional, first_flag;
223 va_list argp;
225 /* First check that the intrinsic belongs to the selected standard.
226 If not, don't add it to the symbol list. */
227 if (!(gfc_option.allow_std & standard)
228 && gfc_option.flag_all_intrinsics == 0)
229 return;
231 switch (sizing)
233 case SZ_SUBS:
234 nsub++;
235 break;
237 case SZ_FUNCS:
238 nfunc++;
239 break;
241 case SZ_NOTHING:
242 next_sym->name = gfc_get_string (name);
244 strcpy (buf, "_gfortran_");
245 strcat (buf, name);
246 next_sym->lib_name = gfc_get_string (buf);
248 next_sym->elemental = elemental;
249 next_sym->ts.type = type;
250 next_sym->ts.kind = kind;
251 next_sym->standard = standard;
252 next_sym->simplify = simplify;
253 next_sym->check = check;
254 next_sym->resolve = resolve;
255 next_sym->specific = 0;
256 next_sym->generic = 0;
257 break;
259 default:
260 gfc_internal_error ("add_sym(): Bad sizing mode");
263 va_start (argp, resolve);
265 first_flag = 1;
267 for (;;)
269 name = va_arg (argp, char *);
270 if (name == NULL)
271 break;
273 type = (bt) va_arg (argp, int);
274 kind = va_arg (argp, int);
275 optional = va_arg (argp, int);
277 if (sizing != SZ_NOTHING)
278 nargs++;
279 else
281 next_arg++;
283 if (first_flag)
284 next_sym->formal = next_arg;
285 else
286 (next_arg - 1)->next = next_arg;
288 first_flag = 0;
290 strcpy (next_arg->name, name);
291 next_arg->ts.type = type;
292 next_arg->ts.kind = kind;
293 next_arg->optional = optional;
297 va_end (argp);
299 next_sym++;
303 /* Add a symbol to the function list where the function takes
304 0 arguments. */
306 static void
307 add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
308 int kind, int standard,
309 try (*check)(void),
310 gfc_expr *(*simplify)(void),
311 void (*resolve)(gfc_expr *))
313 gfc_simplify_f sf;
314 gfc_check_f cf;
315 gfc_resolve_f rf;
317 cf.f0 = check;
318 sf.f0 = simplify;
319 rf.f0 = resolve;
321 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
322 (void*)0);
326 /* Add a symbol to the subroutine list where the subroutine takes
327 0 arguments. */
329 static void
330 add_sym_0s (const char * name, int actual_ok, int standard,
331 void (*resolve)(gfc_code *))
333 gfc_check_f cf;
334 gfc_simplify_f sf;
335 gfc_resolve_f rf;
337 cf.f1 = NULL;
338 sf.f1 = NULL;
339 rf.s1 = resolve;
341 add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, standard, cf, sf, rf,
342 (void*)0);
346 /* Add a symbol to the function list where the function takes
347 1 arguments. */
349 static void
350 add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
351 int kind, int standard,
352 try (*check)(gfc_expr *),
353 gfc_expr *(*simplify)(gfc_expr *),
354 void (*resolve)(gfc_expr *,gfc_expr *),
355 const char* a1, bt type1, int kind1, int optional1)
357 gfc_check_f cf;
358 gfc_simplify_f sf;
359 gfc_resolve_f rf;
361 cf.f1 = check;
362 sf.f1 = simplify;
363 rf.f1 = resolve;
365 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
366 a1, type1, kind1, optional1,
367 (void*)0);
371 /* Add a symbol to the subroutine list where the subroutine takes
372 1 arguments. */
374 static void
375 add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
376 int kind, int standard,
377 try (*check)(gfc_expr *),
378 gfc_expr *(*simplify)(gfc_expr *),
379 void (*resolve)(gfc_code *),
380 const char* a1, bt type1, int kind1, int optional1)
382 gfc_check_f cf;
383 gfc_simplify_f sf;
384 gfc_resolve_f rf;
386 cf.f1 = check;
387 sf.f1 = simplify;
388 rf.s1 = resolve;
390 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
391 a1, type1, kind1, optional1,
392 (void*)0);
396 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
397 function. MAX et al take 2 or more arguments. */
399 static void
400 add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
401 int kind, int standard,
402 try (*check)(gfc_actual_arglist *),
403 gfc_expr *(*simplify)(gfc_expr *),
404 void (*resolve)(gfc_expr *,gfc_actual_arglist *),
405 const char* a1, bt type1, int kind1, int optional1,
406 const char* a2, bt type2, int kind2, int optional2)
408 gfc_check_f cf;
409 gfc_simplify_f sf;
410 gfc_resolve_f rf;
412 cf.f1m = check;
413 sf.f1 = simplify;
414 rf.f1m = resolve;
416 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
417 a1, type1, kind1, optional1,
418 a2, type2, kind2, optional2,
419 (void*)0);
423 /* Add a symbol to the function list where the function takes
424 2 arguments. */
426 static void
427 add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
428 int kind, int standard,
429 try (*check)(gfc_expr *,gfc_expr *),
430 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
431 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
432 const char* a1, bt type1, int kind1, int optional1,
433 const char* a2, bt type2, int kind2, int optional2)
435 gfc_check_f cf;
436 gfc_simplify_f sf;
437 gfc_resolve_f rf;
439 cf.f2 = check;
440 sf.f2 = simplify;
441 rf.f2 = resolve;
443 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
444 a1, type1, kind1, optional1,
445 a2, type2, kind2, optional2,
446 (void*)0);
450 /* Add a symbol to the subroutine list where the subroutine takes
451 2 arguments. */
453 static void
454 add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
455 int kind, int standard,
456 try (*check)(gfc_expr *,gfc_expr *),
457 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
458 void (*resolve)(gfc_code *),
459 const char* a1, bt type1, int kind1, int optional1,
460 const char* a2, bt type2, int kind2, int optional2)
462 gfc_check_f cf;
463 gfc_simplify_f sf;
464 gfc_resolve_f rf;
466 cf.f2 = check;
467 sf.f2 = simplify;
468 rf.s1 = resolve;
470 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
471 a1, type1, kind1, optional1,
472 a2, type2, kind2, optional2,
473 (void*)0);
477 /* Add a symbol to the function list where the function takes
478 3 arguments. */
480 static void
481 add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
482 int kind, int standard,
483 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
484 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
485 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
486 const char* a1, bt type1, int kind1, int optional1,
487 const char* a2, bt type2, int kind2, int optional2,
488 const char* a3, bt type3, int kind3, int optional3)
490 gfc_check_f cf;
491 gfc_simplify_f sf;
492 gfc_resolve_f rf;
494 cf.f3 = check;
495 sf.f3 = simplify;
496 rf.f3 = resolve;
498 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
499 a1, type1, kind1, optional1,
500 a2, type2, kind2, optional2,
501 a3, type3, kind3, optional3,
502 (void*)0);
506 /* MINLOC and MAXLOC get special treatment because their argument
507 might have to be reordered. */
509 static void
510 add_sym_3ml (const char *name, int elemental,
511 int actual_ok, bt type, int kind, int standard,
512 try (*check)(gfc_actual_arglist *),
513 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
514 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
515 const char* a1, bt type1, int kind1, int optional1,
516 const char* a2, bt type2, int kind2, int optional2,
517 const char* a3, bt type3, int kind3, int optional3)
519 gfc_check_f cf;
520 gfc_simplify_f sf;
521 gfc_resolve_f rf;
523 cf.f3ml = check;
524 sf.f3 = simplify;
525 rf.f3 = resolve;
527 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
528 a1, type1, kind1, optional1,
529 a2, type2, kind2, optional2,
530 a3, type3, kind3, optional3,
531 (void*)0);
535 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
536 their argument also might have to be reordered. */
538 static void
539 add_sym_3red (const char *name, int elemental,
540 int actual_ok, bt type, int kind, int standard,
541 try (*check)(gfc_actual_arglist *),
542 gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
543 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
544 const char* a1, bt type1, int kind1, int optional1,
545 const char* a2, bt type2, int kind2, int optional2,
546 const char* a3, bt type3, int kind3, int optional3)
548 gfc_check_f cf;
549 gfc_simplify_f sf;
550 gfc_resolve_f rf;
552 cf.f3red = check;
553 sf.f3 = simplify;
554 rf.f3 = resolve;
556 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
557 a1, type1, kind1, optional1,
558 a2, type2, kind2, optional2,
559 a3, type3, kind3, optional3,
560 (void*)0);
564 /* Add a symbol to the subroutine list where the subroutine takes
565 3 arguments. */
567 static void
568 add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
569 int kind, int standard,
570 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
571 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
572 void (*resolve)(gfc_code *),
573 const char* a1, bt type1, int kind1, int optional1,
574 const char* a2, bt type2, int kind2, int optional2,
575 const char* a3, bt type3, int kind3, int optional3)
577 gfc_check_f cf;
578 gfc_simplify_f sf;
579 gfc_resolve_f rf;
581 cf.f3 = check;
582 sf.f3 = simplify;
583 rf.s1 = resolve;
585 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
586 a1, type1, kind1, optional1,
587 a2, type2, kind2, optional2,
588 a3, type3, kind3, optional3,
589 (void*)0);
593 /* Add a symbol to the function list where the function takes
594 4 arguments. */
596 static void
597 add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
598 int kind, int standard,
599 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
600 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
601 void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
602 const char* a1, bt type1, int kind1, int optional1,
603 const char* a2, bt type2, int kind2, int optional2,
604 const char* a3, bt type3, int kind3, int optional3,
605 const char* a4, bt type4, int kind4, int optional4 )
607 gfc_check_f cf;
608 gfc_simplify_f sf;
609 gfc_resolve_f rf;
611 cf.f4 = check;
612 sf.f4 = simplify;
613 rf.f4 = resolve;
615 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
616 a1, type1, kind1, optional1,
617 a2, type2, kind2, optional2,
618 a3, type3, kind3, optional3,
619 a4, type4, kind4, optional4,
620 (void*)0);
624 /* Add a symbol to the subroutine list where the subroutine takes
625 4 arguments. */
627 static void
628 add_sym_4s (const char *name, int elemental, int actual_ok,
629 bt type, int kind, int standard,
630 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
631 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
632 void (*resolve)(gfc_code *),
633 const char* a1, bt type1, int kind1, int optional1,
634 const char* a2, bt type2, int kind2, int optional2,
635 const char* a3, bt type3, int kind3, int optional3,
636 const char* a4, bt type4, int kind4, int optional4)
638 gfc_check_f cf;
639 gfc_simplify_f sf;
640 gfc_resolve_f rf;
642 cf.f4 = check;
643 sf.f4 = simplify;
644 rf.s1 = resolve;
646 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
647 a1, type1, kind1, optional1,
648 a2, type2, kind2, optional2,
649 a3, type3, kind3, optional3,
650 a4, type4, kind4, optional4,
651 (void*)0);
655 /* Add a symbol to the subroutine list where the subroutine takes
656 5 arguments. */
658 static void
659 add_sym_5s (const char *name, int elemental, int actual_ok,
660 bt type, int kind, int standard,
661 try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
662 gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
663 void (*resolve)(gfc_code *),
664 const char* a1, bt type1, int kind1, int optional1,
665 const char* a2, bt type2, int kind2, int optional2,
666 const char* a3, bt type3, int kind3, int optional3,
667 const char* a4, bt type4, int kind4, int optional4,
668 const char* a5, bt type5, int kind5, int optional5)
670 gfc_check_f cf;
671 gfc_simplify_f sf;
672 gfc_resolve_f rf;
674 cf.f5 = check;
675 sf.f5 = simplify;
676 rf.s1 = resolve;
678 add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
679 a1, type1, kind1, optional1,
680 a2, type2, kind2, optional2,
681 a3, type3, kind3, optional3,
682 a4, type4, kind4, optional4,
683 a5, type5, kind5, optional5,
684 (void*)0);
688 /* Locate an intrinsic symbol given a base pointer, number of elements
689 in the table and a pointer to a name. Returns the NULL pointer if
690 a name is not found. */
692 static gfc_intrinsic_sym *
693 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
696 while (n > 0)
698 if (strcmp (name, start->name) == 0)
699 return start;
701 start++;
702 n--;
705 return NULL;
709 /* Given a name, find a function in the intrinsic function table.
710 Returns NULL if not found. */
712 gfc_intrinsic_sym *
713 gfc_find_function (const char *name)
715 gfc_intrinsic_sym *sym;
717 sym = find_sym (functions, nfunc, name);
718 if (!sym)
719 sym = find_sym (conversion, nconv, name);
721 return sym;
725 /* Given a name, find a function in the intrinsic subroutine table.
726 Returns NULL if not found. */
728 static gfc_intrinsic_sym *
729 find_subroutine (const char *name)
732 return find_sym (subroutines, nsub, name);
736 /* Given a string, figure out if it is the name of a generic intrinsic
737 function or not. */
740 gfc_generic_intrinsic (const char *name)
742 gfc_intrinsic_sym *sym;
744 sym = gfc_find_function (name);
745 return (sym == NULL) ? 0 : sym->generic;
749 /* Given a string, figure out if it is the name of a specific
750 intrinsic function or not. */
753 gfc_specific_intrinsic (const char *name)
755 gfc_intrinsic_sym *sym;
757 sym = gfc_find_function (name);
758 return (sym == NULL) ? 0 : sym->specific;
762 /* Given a string, figure out if it is the name of an intrinsic
763 subroutine or function. There are no generic intrinsic
764 subroutines, they are all specific. */
767 gfc_intrinsic_name (const char *name, int subroutine_flag)
770 return subroutine_flag ?
771 find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
775 /* Collect a set of intrinsic functions into a generic collection.
776 The first argument is the name of the generic function, which is
777 also the name of a specific function. The rest of the specifics
778 currently in the table are placed into the list of specific
779 functions associated with that generic. */
781 static void
782 make_generic (const char *name, gfc_generic_isym_id generic_id, int standard)
784 gfc_intrinsic_sym *g;
786 if (!(gfc_option.allow_std & standard)
787 && gfc_option.flag_all_intrinsics == 0)
788 return;
790 if (sizing != SZ_NOTHING)
791 return;
793 g = gfc_find_function (name);
794 if (g == NULL)
795 gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
796 name);
798 g->generic = 1;
799 g->specific = 1;
800 g->generic_id = generic_id;
801 if ((g + 1)->name != NULL)
802 g->specific_head = g + 1;
803 g++;
805 while (g->name != NULL)
807 g->next = g + 1;
808 g->specific = 1;
809 g->generic_id = generic_id;
810 g++;
813 g--;
814 g->next = NULL;
818 /* Create a duplicate intrinsic function entry for the current
819 function, the only difference being the alternate name. Note that
820 we use argument lists more than once, but all argument lists are
821 freed as a single block. */
823 static void
824 make_alias (const char *name, int standard)
827 /* First check that the intrinsic belongs to the selected standard.
828 If not, don't add it to the symbol list. */
829 if (!(gfc_option.allow_std & standard)
830 && gfc_option.flag_all_intrinsics == 0)
831 return;
833 switch (sizing)
835 case SZ_FUNCS:
836 nfunc++;
837 break;
839 case SZ_SUBS:
840 nsub++;
841 break;
843 case SZ_NOTHING:
844 next_sym[0] = next_sym[-1];
845 next_sym->name = gfc_get_string (name);
846 next_sym++;
847 break;
849 default:
850 break;
854 /* Make the current subroutine noreturn. */
856 static void
857 make_noreturn(void)
859 if (sizing == SZ_NOTHING)
860 next_sym[-1].noreturn = 1;
863 /* Add intrinsic functions. */
865 static void
866 add_functions (void)
869 /* Argument names as in the standard (to be used as argument keywords). */
870 const char
871 *a = "a", *f = "field", *pt = "pointer", *tg = "target",
872 *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
873 *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
874 *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
875 *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
876 *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
877 *p = "p", *ar = "array", *shp = "shape", *src = "source",
878 *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
879 *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
880 *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
881 *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
882 *z = "z", *ln = "len", *ut = "unit", *han = "handler",
883 *num = "number", *tm = "time";
885 int di, dr, dd, dl, dc, dz, ii;
887 di = gfc_default_integer_kind;
888 dr = gfc_default_real_kind;
889 dd = gfc_default_double_kind;
890 dl = gfc_default_logical_kind;
891 dc = gfc_default_character_kind;
892 dz = gfc_default_complex_kind;
893 ii = gfc_index_integer_kind;
895 add_sym_1 ("abs", 1, 1, BT_REAL, dr, GFC_STD_F77,
896 gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
897 a, BT_REAL, dr, REQUIRED);
899 add_sym_1 ("iabs", 1, 1, BT_INTEGER, di, GFC_STD_F77,
900 NULL, gfc_simplify_abs, gfc_resolve_abs,
901 a, BT_INTEGER, di, REQUIRED);
903 add_sym_1 ("dabs", 1, 1, BT_REAL, dd, GFC_STD_F77,
904 NULL, gfc_simplify_abs, gfc_resolve_abs,
905 a, BT_REAL, dd, REQUIRED);
907 add_sym_1 ("cabs", 1, 1, BT_REAL, dr, GFC_STD_F77,
908 NULL, gfc_simplify_abs, gfc_resolve_abs,
909 a, BT_COMPLEX, dz, REQUIRED);
911 add_sym_1 ("zabs", 1, 1, BT_REAL, dd, GFC_STD_GNU,
912 NULL, gfc_simplify_abs, gfc_resolve_abs,
913 a, BT_COMPLEX, dd, REQUIRED);
915 make_alias ("cdabs", GFC_STD_GNU);
917 make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
919 add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
920 gfc_check_achar, gfc_simplify_achar, NULL,
921 i, BT_INTEGER, di, REQUIRED);
923 make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
925 add_sym_1 ("acos", 1, 1, BT_REAL, dr, GFC_STD_F77,
926 gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
927 x, BT_REAL, dr, REQUIRED);
929 add_sym_1 ("dacos", 1, 1, BT_REAL, dd, GFC_STD_F77,
930 NULL, gfc_simplify_acos, gfc_resolve_acos,
931 x, BT_REAL, dd, REQUIRED);
933 make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
935 add_sym_1 ("acosh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
936 gfc_check_fn_r, gfc_simplify_acosh, gfc_resolve_acosh,
937 x, BT_REAL, dr, REQUIRED);
939 add_sym_1 ("dacosh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
940 NULL, gfc_simplify_acosh, gfc_resolve_acosh,
941 x, BT_REAL, dd, REQUIRED);
943 make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_GNU);
945 add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
946 NULL, gfc_simplify_adjustl, NULL,
947 stg, BT_CHARACTER, dc, REQUIRED);
949 make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
951 add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
952 NULL, gfc_simplify_adjustr, NULL,
953 stg, BT_CHARACTER, dc, REQUIRED);
955 make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
957 add_sym_1 ("aimag", 1, 1, BT_REAL, dr, GFC_STD_F77,
958 gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
959 z, BT_COMPLEX, dz, REQUIRED);
961 make_alias ("imag", GFC_STD_GNU);
962 make_alias ("imagpart", GFC_STD_GNU);
964 add_sym_1 ("dimag", 1, 1, BT_REAL, dd, GFC_STD_GNU,
965 NULL, gfc_simplify_aimag, gfc_resolve_aimag,
966 z, BT_COMPLEX, dd, REQUIRED);
969 make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
971 add_sym_2 ("aint", 1, 1, BT_REAL, dr, GFC_STD_F77,
972 gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
973 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
975 add_sym_1 ("dint", 1, 1, BT_REAL, dd, GFC_STD_F77,
976 NULL, gfc_simplify_dint, gfc_resolve_dint,
977 a, BT_REAL, dd, REQUIRED);
979 make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
981 add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
982 gfc_check_all_any, NULL, gfc_resolve_all,
983 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
985 make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
987 add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
988 gfc_check_allocated, NULL, NULL,
989 ar, BT_UNKNOWN, 0, REQUIRED);
991 make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
993 add_sym_2 ("anint", 1, 1, BT_REAL, dr, GFC_STD_F77,
994 gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
995 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
997 add_sym_1 ("dnint", 1, 1, BT_REAL, dd, GFC_STD_F77,
998 NULL, gfc_simplify_dnint, gfc_resolve_dnint,
999 a, BT_REAL, dd, REQUIRED);
1001 make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1003 add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1004 gfc_check_all_any, NULL, gfc_resolve_any,
1005 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1007 make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1009 add_sym_1 ("asin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1010 gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
1011 x, BT_REAL, dr, REQUIRED);
1013 add_sym_1 ("dasin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1014 NULL, gfc_simplify_asin, gfc_resolve_asin,
1015 x, BT_REAL, dd, REQUIRED);
1017 make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1019 add_sym_1 ("asinh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1020 gfc_check_fn_r, gfc_simplify_asinh, gfc_resolve_asinh,
1021 x, BT_REAL, dr, REQUIRED);
1023 add_sym_1 ("dasinh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1024 NULL, gfc_simplify_asinh, gfc_resolve_asinh,
1025 x, BT_REAL, dd, REQUIRED);
1027 make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_GNU);
1029 add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1030 gfc_check_associated, NULL, NULL,
1031 pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1033 make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1035 add_sym_1 ("atan", 1, 1, BT_REAL, dr, GFC_STD_F77,
1036 gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
1037 x, BT_REAL, dr, REQUIRED);
1039 add_sym_1 ("datan", 1, 1, BT_REAL, dd, GFC_STD_F77,
1040 NULL, gfc_simplify_atan, gfc_resolve_atan,
1041 x, BT_REAL, dd, REQUIRED);
1043 make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1045 add_sym_1 ("atanh", 1, 1, BT_REAL, dr, GFC_STD_GNU,
1046 gfc_check_fn_r, gfc_simplify_atanh, gfc_resolve_atanh,
1047 x, BT_REAL, dr, REQUIRED);
1049 add_sym_1 ("datanh", 1, 1, BT_REAL, dd, GFC_STD_GNU,
1050 NULL, gfc_simplify_atanh, gfc_resolve_atanh,
1051 x, BT_REAL, dd, REQUIRED);
1053 make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_GNU);
1055 add_sym_2 ("atan2", 1, 1, BT_REAL, dr, GFC_STD_F77,
1056 gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1057 y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1059 add_sym_2 ("datan2", 1, 1, BT_REAL, dd, GFC_STD_F77,
1060 NULL, gfc_simplify_atan2, gfc_resolve_atan2,
1061 y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1063 make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1065 /* Bessel and Neumann functions for G77 compatibility. */
1066 add_sym_1 ("besj0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1067 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1068 x, BT_REAL, dr, REQUIRED);
1070 add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1071 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1072 x, BT_REAL, dd, REQUIRED);
1074 make_generic ("besj0", GFC_ISYM_J0, GFC_STD_GNU);
1076 add_sym_1 ("besj1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1077 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1078 x, BT_REAL, dr, REQUIRED);
1080 add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1081 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1082 x, BT_REAL, dd, REQUIRED);
1084 make_generic ("besj1", GFC_ISYM_J1, GFC_STD_GNU);
1086 add_sym_2 ("besjn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1087 gfc_check_besn, NULL, gfc_resolve_besn,
1088 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1090 add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1091 gfc_check_besn, NULL, gfc_resolve_besn,
1092 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1094 make_generic ("besjn", GFC_ISYM_JN, GFC_STD_GNU);
1096 add_sym_1 ("besy0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1097 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1098 x, BT_REAL, dr, REQUIRED);
1100 add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1101 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1102 x, BT_REAL, dd, REQUIRED);
1104 make_generic ("besy0", GFC_ISYM_Y0, GFC_STD_GNU);
1106 add_sym_1 ("besy1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1107 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1108 x, BT_REAL, dr, REQUIRED);
1110 add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1111 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1112 x, BT_REAL, dd, REQUIRED);
1114 make_generic ("besy1", GFC_ISYM_Y1, GFC_STD_GNU);
1116 add_sym_2 ("besyn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1117 gfc_check_besn, NULL, gfc_resolve_besn,
1118 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1120 add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1121 gfc_check_besn, NULL, gfc_resolve_besn,
1122 n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1124 make_generic ("besyn", GFC_ISYM_YN, GFC_STD_GNU);
1126 add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1127 gfc_check_i, gfc_simplify_bit_size, NULL,
1128 i, BT_INTEGER, di, REQUIRED);
1130 make_generic ("bit_size", GFC_ISYM_NONE, GFC_STD_F95);
1132 add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl, GFC_STD_F95,
1133 gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1134 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1136 make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1138 add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1139 gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1140 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1142 make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1144 add_sym_2 ("char", 1, 0, BT_CHARACTER, dc, GFC_STD_F77,
1145 gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1146 i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1148 make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1150 add_sym_1 ("chdir", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1151 gfc_check_chdir, NULL, gfc_resolve_chdir,
1152 a, BT_CHARACTER, dc, REQUIRED);
1154 make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1156 add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1157 gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1158 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1159 kind, BT_INTEGER, di, OPTIONAL);
1161 make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1163 add_sym_2 ("complex", 1, 1, BT_COMPLEX, dz, GFC_STD_GNU,
1164 gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1165 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1167 make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1169 /* Making dcmplx a specific of cmplx causes cmplx to return a double
1170 complex instead of the default complex. */
1172 add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1173 gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1174 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1176 make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1178 add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1179 gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1180 z, BT_COMPLEX, dz, REQUIRED);
1182 add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1183 NULL, gfc_simplify_conjg, gfc_resolve_conjg,
1184 z, BT_COMPLEX, dd, REQUIRED);
1186 make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1188 add_sym_1 ("cos", 1, 1, BT_REAL, dr, GFC_STD_F77,
1189 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1190 x, BT_REAL, dr, REQUIRED);
1192 add_sym_1 ("dcos", 1, 1, BT_REAL, dd, GFC_STD_F77,
1193 gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1194 x, BT_REAL, dd, REQUIRED);
1196 add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1197 NULL, gfc_simplify_cos, gfc_resolve_cos,
1198 x, BT_COMPLEX, dz, REQUIRED);
1200 add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1201 NULL, gfc_simplify_cos, gfc_resolve_cos,
1202 x, BT_COMPLEX, dd, REQUIRED);
1204 make_alias ("cdcos", GFC_STD_GNU);
1206 make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1208 add_sym_1 ("cosh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1209 gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1210 x, BT_REAL, dr, REQUIRED);
1212 add_sym_1 ("dcosh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1213 NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1214 x, BT_REAL, dd, REQUIRED);
1216 make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1218 add_sym_2 ("count", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1219 gfc_check_count, NULL, gfc_resolve_count,
1220 msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1222 make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1224 add_sym_3 ("cshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1225 gfc_check_cshift, NULL, gfc_resolve_cshift,
1226 ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1227 dm, BT_INTEGER, ii, OPTIONAL);
1229 make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1231 add_sym_1 ("ctime", 0, 1, BT_CHARACTER, 0, GFC_STD_GNU,
1232 gfc_check_ctime, NULL, gfc_resolve_ctime,
1233 tm, BT_INTEGER, di, REQUIRED);
1235 make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1237 add_sym_1 ("dble", 1, 1, BT_REAL, dd, GFC_STD_F77,
1238 gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1239 a, BT_REAL, dr, REQUIRED);
1241 make_alias ("dfloat", GFC_STD_GNU);
1243 make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1245 add_sym_1 ("digits", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1246 gfc_check_digits, gfc_simplify_digits, NULL,
1247 x, BT_UNKNOWN, dr, REQUIRED);
1249 make_generic ("digits", GFC_ISYM_NONE, GFC_STD_F95);
1251 add_sym_2 ("dim", 1, 1, BT_REAL, dr, GFC_STD_F77,
1252 gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1253 x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1255 add_sym_2 ("idim", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1256 NULL, gfc_simplify_dim, gfc_resolve_dim,
1257 x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1259 add_sym_2 ("ddim", 1, 1, BT_REAL, dd, GFC_STD_F77,
1260 NULL, gfc_simplify_dim, gfc_resolve_dim,
1261 x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1263 make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1265 add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1266 gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1267 va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1269 make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1271 add_sym_2 ("dprod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1272 NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1273 x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1275 make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1277 add_sym_1 ("dreal", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1278 NULL, NULL, NULL,
1279 a, BT_COMPLEX, dd, REQUIRED);
1281 make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1283 add_sym_4 ("eoshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1284 gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1285 ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1286 bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1288 make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1290 add_sym_1 ("epsilon", 0, 1, BT_REAL, dr, GFC_STD_F95,
1291 gfc_check_x, gfc_simplify_epsilon, NULL,
1292 x, BT_REAL, dr, REQUIRED);
1294 make_generic ("epsilon", GFC_ISYM_NONE, GFC_STD_F95);
1296 /* G77 compatibility for the ERF() and ERFC() functions. */
1297 add_sym_1 ("erf", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1298 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1299 x, BT_REAL, dr, REQUIRED);
1301 add_sym_1 ("derf", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1302 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1303 x, BT_REAL, dd, REQUIRED);
1305 make_generic ("erf", GFC_ISYM_ERF, GFC_STD_GNU);
1307 add_sym_1 ("erfc", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1308 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1309 x, BT_REAL, dr, REQUIRED);
1311 add_sym_1 ("derfc", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1312 gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1313 x, BT_REAL, dd, REQUIRED);
1315 make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_GNU);
1317 /* G77 compatibility */
1318 add_sym_1 ("etime", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1319 gfc_check_etime, NULL, NULL,
1320 x, BT_REAL, 4, REQUIRED);
1322 make_alias ("dtime", GFC_STD_GNU);
1324 make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1326 add_sym_1 ("exp", 1, 1, BT_REAL, dr, GFC_STD_F77,
1327 gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1328 x, BT_REAL, dr, REQUIRED);
1330 add_sym_1 ("dexp", 1, 1, BT_REAL, dd, GFC_STD_F77,
1331 NULL, gfc_simplify_exp, gfc_resolve_exp,
1332 x, BT_REAL, dd, REQUIRED);
1334 add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1335 NULL, gfc_simplify_exp, gfc_resolve_exp,
1336 x, BT_COMPLEX, dz, REQUIRED);
1338 add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1339 NULL, gfc_simplify_exp, gfc_resolve_exp,
1340 x, BT_COMPLEX, dd, REQUIRED);
1342 make_alias ("cdexp", GFC_STD_GNU);
1344 make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1346 add_sym_1 ("exponent", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1347 gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1348 x, BT_REAL, dr, REQUIRED);
1350 make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1352 add_sym_0 ("fdate", 1, 0, BT_CHARACTER, dc, GFC_STD_GNU,
1353 NULL, NULL, gfc_resolve_fdate);
1355 make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1357 add_sym_2 ("floor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1358 gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1359 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1361 make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1363 /* G77 compatible fnum */
1364 add_sym_1 ("fnum", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1365 gfc_check_fnum, NULL, gfc_resolve_fnum,
1366 ut, BT_INTEGER, di, REQUIRED);
1368 make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1370 add_sym_1 ("fraction", 1, 1, BT_REAL, dr, GFC_STD_F95,
1371 gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1372 x, BT_REAL, dr, REQUIRED);
1374 make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1376 add_sym_2 ("fstat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1377 gfc_check_fstat, NULL, gfc_resolve_fstat,
1378 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1380 make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1382 add_sym_1 ("ftell", 0, 1, BT_INTEGER, ii, GFC_STD_GNU,
1383 gfc_check_ftell, NULL, gfc_resolve_ftell,
1384 ut, BT_INTEGER, di, REQUIRED);
1386 make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1388 add_sym_2 ("fgetc", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1389 gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1390 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1392 make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1394 add_sym_1 ("fget", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1395 gfc_check_fgetput, NULL, gfc_resolve_fget,
1396 c, BT_CHARACTER, dc, REQUIRED);
1398 make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1400 add_sym_2 ("fputc", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1401 gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1402 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1404 make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1406 add_sym_1 ("fput", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1407 gfc_check_fgetput, NULL, gfc_resolve_fput,
1408 c, BT_CHARACTER, dc, REQUIRED);
1410 make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1412 /* Unix IDs (g77 compatibility) */
1413 add_sym_1 ("getcwd", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1414 NULL, NULL, gfc_resolve_getcwd,
1415 c, BT_CHARACTER, dc, REQUIRED);
1417 make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1419 add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1420 NULL, NULL, gfc_resolve_getgid);
1422 make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1424 add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1425 NULL, NULL, gfc_resolve_getpid);
1427 make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1429 add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1430 NULL, NULL, gfc_resolve_getuid);
1432 make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1434 add_sym_1 ("hostnm", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1435 gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1436 a, BT_CHARACTER, dc, REQUIRED);
1438 make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1440 add_sym_1 ("huge", 0, 1, BT_REAL, dr, GFC_STD_F95,
1441 gfc_check_huge, gfc_simplify_huge, NULL,
1442 x, BT_UNKNOWN, dr, REQUIRED);
1444 make_generic ("huge", GFC_ISYM_NONE, GFC_STD_F95);
1446 add_sym_1 ("iachar", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1447 gfc_check_ichar_iachar, gfc_simplify_iachar, NULL,
1448 c, BT_CHARACTER, dc, REQUIRED);
1450 make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1452 add_sym_2 ("iand", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1453 gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1454 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1456 make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1458 add_sym_2 ("and", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1459 gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1460 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1462 make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1464 add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1465 NULL, NULL, NULL);
1467 make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1469 add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, GFC_STD_F2003,
1470 NULL, NULL, NULL);
1472 make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1473 GFC_STD_F2003);
1475 add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1476 gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1477 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1479 make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1481 add_sym_3 ("ibits", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1482 gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1483 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1484 ln, BT_INTEGER, di, REQUIRED);
1486 make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1488 add_sym_2 ("ibset", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1489 gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1490 i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1492 make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1494 add_sym_1 ("ichar", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1495 gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1496 c, BT_CHARACTER, dc, REQUIRED);
1498 make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1500 add_sym_2 ("ieor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1501 gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1502 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1504 make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1506 add_sym_2 ("xor", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1507 gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1508 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1510 make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1512 add_sym_0 ("ierrno", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1513 NULL, NULL, gfc_resolve_ierrno);
1515 make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1517 add_sym_3 ("index", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1518 gfc_check_index, gfc_simplify_index, NULL,
1519 stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1520 bck, BT_LOGICAL, dl, OPTIONAL);
1522 make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1524 add_sym_2 ("int", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1525 gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1526 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1528 add_sym_1 ("ifix", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1529 NULL, gfc_simplify_ifix, NULL,
1530 a, BT_REAL, dr, REQUIRED);
1532 add_sym_1 ("idint", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1533 NULL, gfc_simplify_idint, NULL,
1534 a, BT_REAL, dd, REQUIRED);
1536 make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1538 add_sym_2 ("ior", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1539 gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1540 i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1542 make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1544 add_sym_2 ("or", 1, 0, BT_UNKNOWN, 0, GFC_STD_GNU,
1545 gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1546 i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1548 make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1550 /* The following function is for G77 compatibility. */
1551 add_sym_1 ("irand", 0, 1, BT_INTEGER, 4, GFC_STD_GNU,
1552 gfc_check_irand, NULL, NULL,
1553 i, BT_INTEGER, 4, OPTIONAL);
1555 make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1557 add_sym_1 ("isatty", 0, 0, BT_LOGICAL, dl, GFC_STD_GNU,
1558 gfc_check_isatty, NULL, gfc_resolve_isatty,
1559 ut, BT_INTEGER, di, REQUIRED);
1561 make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1563 add_sym_2 ("ishft", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1564 gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1565 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1567 make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1569 add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1570 gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1571 i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1572 sz, BT_INTEGER, di, OPTIONAL);
1574 make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1576 add_sym_2 ("kill", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1577 gfc_check_kill, NULL, gfc_resolve_kill,
1578 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1580 make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1582 add_sym_1 ("kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1583 gfc_check_kind, gfc_simplify_kind, NULL,
1584 x, BT_REAL, dr, REQUIRED);
1586 make_generic ("kind", GFC_ISYM_NONE, GFC_STD_F95);
1588 add_sym_2 ("lbound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1589 gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1590 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL);
1592 make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1594 add_sym_1 ("len", 0, 1, BT_INTEGER, di, GFC_STD_F77,
1595 NULL, gfc_simplify_len, gfc_resolve_len,
1596 stg, BT_CHARACTER, dc, REQUIRED);
1598 make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1600 add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1601 NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1602 stg, BT_CHARACTER, dc, REQUIRED);
1604 make_alias ("lnblnk", GFC_STD_GNU);
1606 make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1608 add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1609 NULL, gfc_simplify_lge, NULL,
1610 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1612 make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1614 add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1615 NULL, gfc_simplify_lgt, NULL,
1616 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1618 make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1620 add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1621 NULL, gfc_simplify_lle, NULL,
1622 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1624 make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1626 add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1627 NULL, gfc_simplify_llt, NULL,
1628 sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1630 make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1632 add_sym_2 ("link", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1633 gfc_check_link, NULL, gfc_resolve_link,
1634 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1636 make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
1638 add_sym_1 ("log", 1, 1, BT_REAL, dr, GFC_STD_F77,
1639 gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1640 x, BT_REAL, dr, REQUIRED);
1642 add_sym_1 ("alog", 1, 1, BT_REAL, dr, GFC_STD_F77,
1643 NULL, gfc_simplify_log, gfc_resolve_log,
1644 x, BT_REAL, dr, REQUIRED);
1646 add_sym_1 ("dlog", 1, 1, BT_REAL, dd, GFC_STD_F77,
1647 NULL, gfc_simplify_log, gfc_resolve_log,
1648 x, BT_REAL, dd, REQUIRED);
1650 add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1651 NULL, gfc_simplify_log, gfc_resolve_log,
1652 x, BT_COMPLEX, dz, REQUIRED);
1654 add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1655 NULL, gfc_simplify_log, gfc_resolve_log,
1656 x, BT_COMPLEX, dd, REQUIRED);
1658 make_alias ("cdlog", GFC_STD_GNU);
1660 make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
1662 add_sym_1 ("log10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1663 gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
1664 x, BT_REAL, dr, REQUIRED);
1666 add_sym_1 ("alog10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1667 NULL, gfc_simplify_log10, gfc_resolve_log10,
1668 x, BT_REAL, dr, REQUIRED);
1670 add_sym_1 ("dlog10", 1, 1, BT_REAL, dd, GFC_STD_F77,
1671 NULL, gfc_simplify_log10, gfc_resolve_log10,
1672 x, BT_REAL, dd, REQUIRED);
1674 make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
1676 add_sym_2 ("logical", 1, 1, BT_LOGICAL, dl, GFC_STD_F95,
1677 gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1678 l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1680 make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
1682 add_sym_1 ("malloc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU, gfc_check_malloc,
1683 NULL, gfc_resolve_malloc, a, BT_INTEGER, di, REQUIRED);
1685 make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
1687 add_sym_2 ("matmul", 0, 1, BT_REAL, dr, GFC_STD_F95,
1688 gfc_check_matmul, NULL, gfc_resolve_matmul,
1689 ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
1691 make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
1693 /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1694 int(max). The max function must take at least two arguments. */
1696 add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1697 gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1698 a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
1700 add_sym_1m ("max0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1701 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1702 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1704 add_sym_1m ("amax0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1705 gfc_check_min_max_integer, gfc_simplify_max, NULL,
1706 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1708 add_sym_1m ("amax1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1709 gfc_check_min_max_real, gfc_simplify_max, NULL,
1710 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1712 add_sym_1m ("max1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1713 gfc_check_min_max_real, gfc_simplify_max, NULL,
1714 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1716 add_sym_1m ("dmax1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1717 gfc_check_min_max_double, gfc_simplify_max, NULL,
1718 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1720 make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
1722 add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1723 gfc_check_x, gfc_simplify_maxexponent, NULL,
1724 x, BT_UNKNOWN, dr, REQUIRED);
1726 make_generic ("maxexponent", GFC_ISYM_NONE, GFC_STD_F95);
1728 add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1729 gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1730 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1731 msk, BT_LOGICAL, dl, OPTIONAL);
1733 make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
1735 add_sym_3red ("maxval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1736 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1737 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1738 msk, BT_LOGICAL, dl, OPTIONAL);
1740 make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
1742 add_sym_3 ("merge", 1, 1, BT_REAL, dr, GFC_STD_F95,
1743 gfc_check_merge, NULL, gfc_resolve_merge,
1744 ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
1745 msk, BT_LOGICAL, dl, REQUIRED);
1747 make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
1749 /* Note: amin0 is equivalent to real(min), min1 is equivalent to
1750 int(min). */
1752 add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1753 gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1754 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1756 add_sym_1m ("min0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1757 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1758 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1760 add_sym_1m ("amin0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1761 gfc_check_min_max_integer, gfc_simplify_min, NULL,
1762 a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1764 add_sym_1m ("amin1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1765 gfc_check_min_max_real, gfc_simplify_min, NULL,
1766 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1768 add_sym_1m ("min1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1769 gfc_check_min_max_real, gfc_simplify_min, NULL,
1770 a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1772 add_sym_1m ("dmin1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1773 gfc_check_min_max_double, gfc_simplify_min, NULL,
1774 a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1776 make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
1778 add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1779 gfc_check_x, gfc_simplify_minexponent, NULL,
1780 x, BT_UNKNOWN, dr, REQUIRED);
1782 make_generic ("minexponent", GFC_ISYM_NONE, GFC_STD_F95);
1784 add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1785 gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1786 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1787 msk, BT_LOGICAL, dl, OPTIONAL);
1789 make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
1791 add_sym_3red ("minval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1792 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1793 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1794 msk, BT_LOGICAL, dl, OPTIONAL);
1796 make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
1798 add_sym_2 ("mod", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1799 gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1800 a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
1802 add_sym_2 ("amod", 1, 1, BT_REAL, dr, GFC_STD_F77,
1803 NULL, gfc_simplify_mod, gfc_resolve_mod,
1804 a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
1806 add_sym_2 ("dmod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1807 NULL, gfc_simplify_mod, gfc_resolve_mod,
1808 a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
1810 make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
1812 add_sym_2 ("modulo", 1, 0, BT_REAL, di, GFC_STD_F95,
1813 gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1814 a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
1816 make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
1818 add_sym_2 ("nearest", 1, 1, BT_REAL, dr, GFC_STD_F95,
1819 gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1820 x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
1822 make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
1824 add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1825 gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1826 a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1828 add_sym_1 ("idnint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1829 gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1830 a, BT_REAL, dd, REQUIRED);
1832 make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
1834 add_sym_1 ("not", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1835 gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1836 i, BT_INTEGER, di, REQUIRED);
1838 make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
1840 add_sym_1 ("null", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1841 gfc_check_null, gfc_simplify_null, NULL,
1842 mo, BT_INTEGER, di, OPTIONAL);
1844 make_generic ("null", GFC_ISYM_NONE, GFC_STD_F95);
1846 add_sym_3 ("pack", 0, 1, BT_REAL, dr, GFC_STD_F95,
1847 gfc_check_pack, NULL, gfc_resolve_pack,
1848 ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1849 v, BT_REAL, dr, OPTIONAL);
1851 make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
1853 add_sym_1 ("precision", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1854 gfc_check_precision, gfc_simplify_precision, NULL,
1855 x, BT_UNKNOWN, 0, REQUIRED);
1857 make_generic ("precision", GFC_ISYM_NONE, GFC_STD_F95);
1859 add_sym_1 ("present", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1860 gfc_check_present, NULL, NULL,
1861 a, BT_REAL, dr, REQUIRED);
1863 make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
1865 add_sym_3red ("product", 0, 1, BT_REAL, dr, GFC_STD_F95,
1866 gfc_check_product_sum, NULL, gfc_resolve_product,
1867 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1868 msk, BT_LOGICAL, dl, OPTIONAL);
1870 make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
1872 add_sym_1 ("radix", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1873 gfc_check_radix, gfc_simplify_radix, NULL,
1874 x, BT_UNKNOWN, 0, REQUIRED);
1876 make_generic ("radix", GFC_ISYM_NONE, GFC_STD_F95);
1878 /* The following function is for G77 compatibility. */
1879 add_sym_1 ("rand", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1880 gfc_check_rand, NULL, NULL,
1881 i, BT_INTEGER, 4, OPTIONAL);
1883 /* Compatibility with HP FORTRAN 77/iX Reference. Note, rand() and ran()
1884 use slightly different shoddy multiplicative congruential PRNG. */
1885 make_alias ("ran", GFC_STD_GNU);
1887 make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
1889 add_sym_1 ("range", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1890 gfc_check_range, gfc_simplify_range, NULL,
1891 x, BT_REAL, dr, REQUIRED);
1893 make_generic ("range", GFC_ISYM_NONE, GFC_STD_F95);
1895 add_sym_2 ("real", 1, 0, BT_REAL, dr, GFC_STD_F77,
1896 gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1897 a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1899 /* This provides compatibility with g77. */
1900 add_sym_1 ("realpart", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1901 gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
1902 a, BT_UNKNOWN, dr, REQUIRED);
1904 add_sym_1 ("float", 1, 0, BT_REAL, dr, GFC_STD_F77,
1905 gfc_check_i, gfc_simplify_float, NULL,
1906 a, BT_INTEGER, di, REQUIRED);
1908 add_sym_1 ("sngl", 1, 0, BT_REAL, dr, GFC_STD_F77,
1909 NULL, gfc_simplify_sngl, NULL,
1910 a, BT_REAL, dd, REQUIRED);
1912 make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
1914 add_sym_2 ("rename", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1915 gfc_check_rename, NULL, gfc_resolve_rename,
1916 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
1918 make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
1920 add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
1921 gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1922 stg, BT_CHARACTER, dc, REQUIRED, n, BT_INTEGER, di, REQUIRED);
1924 make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
1926 add_sym_4 ("reshape", 0, 1, BT_REAL, dr, GFC_STD_F95,
1927 gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1928 src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
1929 pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
1931 make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
1933 add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1934 gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1935 x, BT_REAL, dr, REQUIRED);
1937 make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
1939 add_sym_2 ("scale", 1, 1, BT_REAL, dr, GFC_STD_F95,
1940 gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1941 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1943 make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
1945 add_sym_3 ("scan", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1946 gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1947 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
1948 bck, BT_LOGICAL, dl, OPTIONAL);
1950 make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
1952 /* Added for G77 compatibility garbage. */
1953 add_sym_0 ("second", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1954 NULL, NULL, NULL);
1956 make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
1958 /* Added for G77 compatibility. */
1959 add_sym_1 ("secnds", 0, 1, BT_REAL, dr, GFC_STD_GNU,
1960 gfc_check_secnds, NULL, gfc_resolve_secnds,
1961 x, BT_REAL, dr, REQUIRED);
1963 make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
1965 add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1966 gfc_check_selected_int_kind, gfc_simplify_selected_int_kind, NULL,
1967 r, BT_INTEGER, di, REQUIRED);
1969 make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
1971 add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1972 gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1973 NULL,
1974 p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
1976 make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
1978 add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr, GFC_STD_F95,
1979 gfc_check_set_exponent, gfc_simplify_set_exponent,
1980 gfc_resolve_set_exponent,
1981 x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1983 make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
1985 add_sym_1 ("shape", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1986 gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1987 src, BT_REAL, dr, REQUIRED);
1989 make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
1991 add_sym_2 ("sign", 1, 1, BT_REAL, dr, GFC_STD_F77,
1992 gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1993 a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
1995 add_sym_2 ("isign", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1996 NULL, gfc_simplify_sign, gfc_resolve_sign,
1997 a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1999 add_sym_2 ("dsign", 1, 1, BT_REAL, dd, GFC_STD_F77,
2000 NULL, gfc_simplify_sign, gfc_resolve_sign,
2001 a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2003 make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2005 add_sym_2 ("signal", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
2006 gfc_check_signal, NULL, gfc_resolve_signal,
2007 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2009 make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2011 add_sym_1 ("sin", 1, 1, BT_REAL, dr, GFC_STD_F77,
2012 gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2013 x, BT_REAL, dr, REQUIRED);
2015 add_sym_1 ("dsin", 1, 1, BT_REAL, dd, GFC_STD_F77,
2016 NULL, gfc_simplify_sin, gfc_resolve_sin,
2017 x, BT_REAL, dd, REQUIRED);
2019 add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2020 NULL, gfc_simplify_sin, gfc_resolve_sin,
2021 x, BT_COMPLEX, dz, REQUIRED);
2023 add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2024 NULL, gfc_simplify_sin, gfc_resolve_sin,
2025 x, BT_COMPLEX, dd, REQUIRED);
2027 make_alias ("cdsin", GFC_STD_GNU);
2029 make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2031 add_sym_1 ("sinh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2032 gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
2033 x, BT_REAL, dr, REQUIRED);
2035 add_sym_1 ("dsinh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2036 NULL, gfc_simplify_sinh, gfc_resolve_sinh,
2037 x, BT_REAL, dd, REQUIRED);
2039 make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2041 add_sym_2 ("size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
2042 gfc_check_size, gfc_simplify_size, NULL,
2043 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2045 make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2047 add_sym_1 ("spacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
2048 gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2049 x, BT_REAL, dr, REQUIRED);
2051 make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2053 add_sym_3 ("spread", 0, 1, BT_REAL, dr, GFC_STD_F95,
2054 gfc_check_spread, NULL, gfc_resolve_spread,
2055 src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2056 n, BT_INTEGER, di, REQUIRED);
2058 make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2060 add_sym_1 ("sqrt", 1, 1, BT_REAL, dr, GFC_STD_F77,
2061 gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2062 x, BT_REAL, dr, REQUIRED);
2064 add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd, GFC_STD_F77,
2065 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2066 x, BT_REAL, dd, REQUIRED);
2068 add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
2069 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2070 x, BT_COMPLEX, dz, REQUIRED);
2072 add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
2073 NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2074 x, BT_COMPLEX, dd, REQUIRED);
2076 make_alias ("cdsqrt", GFC_STD_GNU);
2078 make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2080 add_sym_2 ("stat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2081 gfc_check_stat, NULL, gfc_resolve_stat,
2082 a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2084 make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2086 add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2087 gfc_check_product_sum, NULL, gfc_resolve_sum,
2088 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2089 msk, BT_LOGICAL, dl, OPTIONAL);
2091 make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2093 add_sym_2 ("symlnk", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2094 gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2095 a, BT_CHARACTER, dc, REQUIRED, b, BT_CHARACTER, dc, REQUIRED);
2097 make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2099 add_sym_1 ("system", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
2100 NULL, NULL, NULL,
2101 c, BT_CHARACTER, dc, REQUIRED);
2103 make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2105 add_sym_1 ("tan", 1, 1, BT_REAL, dr, GFC_STD_F77,
2106 gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
2107 x, BT_REAL, dr, REQUIRED);
2109 add_sym_1 ("dtan", 1, 1, BT_REAL, dd, GFC_STD_F77,
2110 NULL, gfc_simplify_tan, gfc_resolve_tan,
2111 x, BT_REAL, dd, REQUIRED);
2113 make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2115 add_sym_1 ("tanh", 1, 1, BT_REAL, dr, GFC_STD_F77,
2116 gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
2117 x, BT_REAL, dr, REQUIRED);
2119 add_sym_1 ("dtanh", 1, 1, BT_REAL, dd, GFC_STD_F77,
2120 NULL, gfc_simplify_tanh, gfc_resolve_tanh,
2121 x, BT_REAL, dd, REQUIRED);
2123 make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2125 add_sym_0 ("time", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2126 NULL, NULL, gfc_resolve_time);
2128 make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2130 add_sym_0 ("time8", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
2131 NULL, NULL, gfc_resolve_time8);
2133 make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2135 add_sym_1 ("tiny", 0, 1, BT_REAL, dr, GFC_STD_F95,
2136 gfc_check_x, gfc_simplify_tiny, NULL,
2137 x, BT_REAL, dr, REQUIRED);
2139 make_generic ("tiny", GFC_ISYM_NONE, GFC_STD_F95);
2141 add_sym_3 ("transfer", 0, 1, BT_REAL, dr, GFC_STD_F95,
2142 gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2143 src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2144 sz, BT_INTEGER, di, OPTIONAL);
2146 make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2148 add_sym_1 ("transpose", 0, 1, BT_REAL, dr, GFC_STD_F95,
2149 gfc_check_transpose, NULL, gfc_resolve_transpose,
2150 m, BT_REAL, dr, REQUIRED);
2152 make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2154 add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
2155 gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2156 stg, BT_CHARACTER, dc, REQUIRED);
2158 make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2160 add_sym_1 ("ttynam", 0, 1, BT_CHARACTER, 0, GFC_STD_GNU,
2161 gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2162 ut, BT_INTEGER, di, REQUIRED);
2164 make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2166 add_sym_2 ("ubound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
2167 gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2168 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
2170 make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2172 /* g77 compatibility for UMASK. */
2173 add_sym_1 ("umask", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2174 gfc_check_umask, NULL, gfc_resolve_umask,
2175 a, BT_INTEGER, di, REQUIRED);
2177 make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2179 /* g77 compatibility for UNLINK. */
2180 add_sym_1 ("unlink", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
2181 gfc_check_unlink, NULL, gfc_resolve_unlink,
2182 a, BT_CHARACTER, dc, REQUIRED);
2184 make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2186 add_sym_3 ("unpack", 0, 1, BT_REAL, dr, GFC_STD_F95,
2187 gfc_check_unpack, NULL, gfc_resolve_unpack,
2188 v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2189 f, BT_REAL, dr, REQUIRED);
2191 make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2193 add_sym_3 ("verify", 1, 1, BT_INTEGER, di, GFC_STD_F95,
2194 gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2195 stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2196 bck, BT_LOGICAL, dl, OPTIONAL);
2198 make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2200 add_sym_1 ("loc", 0, 1, BT_INTEGER, ii, GFC_STD_GNU,
2201 gfc_check_loc, NULL, gfc_resolve_loc,
2202 ar, BT_UNKNOWN, 0, REQUIRED);
2204 make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2209 /* Add intrinsic subroutines. */
2211 static void
2212 add_subroutines (void)
2214 /* Argument names as in the standard (to be used as argument keywords). */
2215 const char
2216 *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2217 *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2218 *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2219 *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2220 *com = "command", *length = "length", *st = "status",
2221 *val = "value", *num = "number", *name = "name",
2222 *trim_name = "trim_name", *ut = "unit", *han = "handler",
2223 *sec = "seconds", *res = "result", *of = "offset";
2225 int di, dr, dc, dl, ii;
2227 di = gfc_default_integer_kind;
2228 dr = gfc_default_real_kind;
2229 dc = gfc_default_character_kind;
2230 dl = gfc_default_logical_kind;
2231 ii = gfc_index_integer_kind;
2233 add_sym_0s ("abort", 1, GFC_STD_GNU, NULL);
2235 if ((gfc_option.allow_std & GFC_STD_GNU) || gfc_option.flag_all_intrinsics)
2236 make_noreturn();
2238 add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2239 gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2240 tm, BT_REAL, dr, REQUIRED);
2242 /* More G77 compatibility garbage. */
2243 add_sym_2s ("ctime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2244 gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2245 tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2247 add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2248 gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2249 tm, BT_REAL, dr, REQUIRED);
2251 add_sym_2s ("chdir", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2252 gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2253 name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2255 add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2256 gfc_check_date_and_time, NULL, NULL,
2257 dt, BT_CHARACTER, dc, OPTIONAL, tm, BT_CHARACTER, dc, OPTIONAL,
2258 zn, BT_CHARACTER, dc, OPTIONAL, vl, BT_INTEGER, di, OPTIONAL);
2260 /* More G77 compatibility garbage. */
2261 add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2262 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2263 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2265 add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2266 gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2267 vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2269 add_sym_1s ("fdate", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2270 gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2271 dt, BT_CHARACTER, dc, REQUIRED);
2273 add_sym_1s ("gerror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2274 gfc_check_gerror, NULL, gfc_resolve_gerror, c, BT_CHARACTER,
2275 dc, REQUIRED);
2277 add_sym_2s ("getcwd", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2278 gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2279 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2281 add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2282 NULL, NULL, NULL,
2283 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2285 add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2286 NULL, NULL, gfc_resolve_getarg,
2287 c, BT_INTEGER, di, REQUIRED, vl, BT_CHARACTER, dc, REQUIRED);
2289 add_sym_1s ("getlog", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2290 gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2291 dc, REQUIRED);
2293 /* F2003 commandline routines. */
2295 add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2296 NULL, NULL, gfc_resolve_get_command,
2297 com, BT_CHARACTER, dc, OPTIONAL, length, BT_INTEGER, di, OPTIONAL,
2298 st, BT_INTEGER, di, OPTIONAL);
2300 add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2301 NULL, NULL, gfc_resolve_get_command_argument,
2302 num, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2303 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL);
2305 /* F2003 subroutine to get environment variables. */
2307 add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2308 NULL, NULL, gfc_resolve_get_environment_variable,
2309 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2310 length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL,
2311 trim_name, BT_LOGICAL, dl, OPTIONAL);
2313 add_sym_5s ("mvbits", 1, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2314 gfc_check_mvbits, gfc_simplify_mvbits, gfc_resolve_mvbits,
2315 f, BT_INTEGER, di, REQUIRED, fp, BT_INTEGER, di, REQUIRED,
2316 ln, BT_INTEGER, di, REQUIRED, t, BT_INTEGER, di, REQUIRED,
2317 tp, BT_INTEGER, di, REQUIRED);
2319 add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2320 gfc_check_random_number, NULL, gfc_resolve_random_number,
2321 h, BT_REAL, dr, REQUIRED);
2323 add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2324 gfc_check_random_seed, NULL, NULL,
2325 sz, BT_INTEGER, di, OPTIONAL, pt, BT_INTEGER, di, OPTIONAL,
2326 gt, BT_INTEGER, di, OPTIONAL);
2328 /* More G77 compatibility garbage. */
2329 add_sym_3s ("alarm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2330 gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2331 sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2332 st, BT_INTEGER, di, OPTIONAL);
2334 add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di, GFC_STD_GNU,
2335 gfc_check_srand, NULL, gfc_resolve_srand,
2336 c, BT_INTEGER, 4, REQUIRED);
2338 add_sym_1s ("exit", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2339 gfc_check_exit, NULL, gfc_resolve_exit,
2340 c, BT_INTEGER, di, OPTIONAL);
2342 if ((gfc_option.allow_std & GFC_STD_GNU) || gfc_option.flag_all_intrinsics)
2343 make_noreturn();
2345 add_sym_3s ("fgetc", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2346 gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2347 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2348 st, BT_INTEGER, di, OPTIONAL);
2350 add_sym_2s ("fget", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2351 gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2352 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2354 add_sym_1s ("flush", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2355 gfc_check_flush, NULL, gfc_resolve_flush,
2356 c, BT_INTEGER, di, OPTIONAL);
2358 add_sym_3s ("fputc", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2359 gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2360 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2361 st, BT_INTEGER, di, OPTIONAL);
2363 add_sym_2s ("fput", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2364 gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2365 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2367 add_sym_1s ("free", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_free,
2368 NULL, gfc_resolve_free, c, BT_INTEGER, ii, REQUIRED);
2370 add_sym_2s ("ftell", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2371 gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2372 ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2374 add_sym_2s ("hostnm", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2375 gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2376 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2378 add_sym_3s ("kill", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2379 NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2380 val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2382 add_sym_3s ("link", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2383 gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2384 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2385 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2387 add_sym_1s ("perror", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2388 gfc_check_perror, NULL, gfc_resolve_perror,
2389 c, BT_CHARACTER, dc, REQUIRED);
2391 add_sym_3s ("rename", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2392 gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2393 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2394 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2396 add_sym_1s ("sleep", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2397 gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2398 val, BT_CHARACTER, dc, REQUIRED);
2400 add_sym_3s ("fstat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2401 gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2402 ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2403 st, BT_INTEGER, di, OPTIONAL);
2405 add_sym_3s ("stat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2406 gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2407 name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2408 st, BT_INTEGER, di, OPTIONAL);
2410 add_sym_3s ("signal", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2411 gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2412 num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2413 st, BT_INTEGER, di, OPTIONAL);
2415 add_sym_3s ("symlnk", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2416 gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2417 name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER,
2418 dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2420 add_sym_2s ("system", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2421 NULL, NULL, gfc_resolve_system_sub,
2422 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2424 add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2425 gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2426 c, BT_INTEGER, di, OPTIONAL, cr, BT_INTEGER, di, OPTIONAL,
2427 cm, BT_INTEGER, di, OPTIONAL);
2429 add_sym_2s ("ttynam", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2430 gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2431 ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
2433 add_sym_2s ("umask", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2434 gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2435 val, BT_INTEGER, di, REQUIRED, num, BT_INTEGER, di, OPTIONAL);
2437 add_sym_2s ("unlink", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2438 gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2439 c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2444 /* Add a function to the list of conversion symbols. */
2446 static void
2447 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2450 gfc_typespec from, to;
2451 gfc_intrinsic_sym *sym;
2453 if (sizing == SZ_CONVS)
2455 nconv++;
2456 return;
2459 gfc_clear_ts (&from);
2460 from.type = from_type;
2461 from.kind = from_kind;
2463 gfc_clear_ts (&to);
2464 to.type = to_type;
2465 to.kind = to_kind;
2467 sym = conversion + nconv;
2469 sym->name = conv_name (&from, &to);
2470 sym->lib_name = sym->name;
2471 sym->simplify.cc = gfc_convert_constant;
2472 sym->standard = standard;
2473 sym->elemental = 1;
2474 sym->ts = to;
2475 sym->generic_id = GFC_ISYM_CONVERSION;
2477 nconv++;
2481 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2482 functions by looping over the kind tables. */
2484 static void
2485 add_conversions (void)
2487 int i, j;
2489 /* Integer-Integer conversions. */
2490 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2491 for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2493 if (i == j)
2494 continue;
2496 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2497 BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
2500 /* Integer-Real/Complex conversions. */
2501 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2502 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2504 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2505 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2507 add_conv (BT_REAL, gfc_real_kinds[j].kind,
2508 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2510 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2511 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2513 add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2514 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
2517 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2519 /* Hollerith-Integer conversions. */
2520 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2521 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2522 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2523 /* Hollerith-Real conversions. */
2524 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2525 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2526 BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2527 /* Hollerith-Complex conversions. */
2528 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2529 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2530 BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
2532 /* Hollerith-Character conversions. */
2533 add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
2534 gfc_default_character_kind, GFC_STD_LEGACY);
2536 /* Hollerith-Logical conversions. */
2537 for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
2538 add_conv (BT_HOLLERITH, gfc_default_character_kind,
2539 BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
2542 /* Real/Complex - Real/Complex conversions. */
2543 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2544 for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2546 if (i != j)
2548 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2549 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2551 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2552 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2555 add_conv (BT_REAL, gfc_real_kinds[i].kind,
2556 BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
2558 add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2559 BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
2562 /* Logical/Logical kind conversion. */
2563 for (i = 0; gfc_logical_kinds[i].kind; i++)
2564 for (j = 0; gfc_logical_kinds[j].kind; j++)
2566 if (i == j)
2567 continue;
2569 add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2570 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
2573 /* Integer-Logical and Logical-Integer conversions. */
2574 if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
2575 for (i=0; gfc_integer_kinds[i].kind; i++)
2576 for (j=0; gfc_logical_kinds[j].kind; j++)
2578 add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2579 BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
2580 add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
2581 BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
2586 /* Initialize the table of intrinsics. */
2587 void
2588 gfc_intrinsic_init_1 (void)
2590 int i;
2592 nargs = nfunc = nsub = nconv = 0;
2594 /* Create a namespace to hold the resolved intrinsic symbols. */
2595 gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
2597 sizing = SZ_FUNCS;
2598 add_functions ();
2599 sizing = SZ_SUBS;
2600 add_subroutines ();
2601 sizing = SZ_CONVS;
2602 add_conversions ();
2604 functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2605 + sizeof (gfc_intrinsic_arg) * nargs);
2607 next_sym = functions;
2608 subroutines = functions + nfunc;
2610 conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2612 next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2614 sizing = SZ_NOTHING;
2615 nconv = 0;
2617 add_functions ();
2618 add_subroutines ();
2619 add_conversions ();
2621 /* Set the pure flag. All intrinsic functions are pure, and
2622 intrinsic subroutines are pure if they are elemental. */
2624 for (i = 0; i < nfunc; i++)
2625 functions[i].pure = 1;
2627 for (i = 0; i < nsub; i++)
2628 subroutines[i].pure = subroutines[i].elemental;
2632 void
2633 gfc_intrinsic_done_1 (void)
2635 gfc_free (functions);
2636 gfc_free (conversion);
2637 gfc_free_namespace (gfc_intrinsic_namespace);
2641 /******** Subroutines to check intrinsic interfaces ***********/
2643 /* Given a formal argument list, remove any NULL arguments that may
2644 have been left behind by a sort against some formal argument list. */
2646 static void
2647 remove_nullargs (gfc_actual_arglist ** ap)
2649 gfc_actual_arglist *head, *tail, *next;
2651 tail = NULL;
2653 for (head = *ap; head; head = next)
2655 next = head->next;
2657 if (head->expr == NULL)
2659 head->next = NULL;
2660 gfc_free_actual_arglist (head);
2662 else
2664 if (tail == NULL)
2665 *ap = head;
2666 else
2667 tail->next = head;
2669 tail = head;
2670 tail->next = NULL;
2674 if (tail == NULL)
2675 *ap = NULL;
2679 /* Given an actual arglist and a formal arglist, sort the actual
2680 arglist so that its arguments are in a one-to-one correspondence
2681 with the format arglist. Arguments that are not present are given
2682 a blank gfc_actual_arglist structure. If something is obviously
2683 wrong (say, a missing required argument) we abort sorting and
2684 return FAILURE. */
2686 static try
2687 sort_actual (const char *name, gfc_actual_arglist ** ap,
2688 gfc_intrinsic_arg * formal, locus * where)
2691 gfc_actual_arglist *actual, *a;
2692 gfc_intrinsic_arg *f;
2694 remove_nullargs (ap);
2695 actual = *ap;
2697 for (f = formal; f; f = f->next)
2698 f->actual = NULL;
2700 f = formal;
2701 a = actual;
2703 if (f == NULL && a == NULL) /* No arguments */
2704 return SUCCESS;
2706 for (;;)
2707 { /* Put the nonkeyword arguments in a 1:1 correspondence */
2708 if (f == NULL)
2709 break;
2710 if (a == NULL)
2711 goto optional;
2713 if (a->name != NULL)
2714 goto keywords;
2716 f->actual = a;
2718 f = f->next;
2719 a = a->next;
2722 if (a == NULL)
2723 goto do_sort;
2725 gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2726 return FAILURE;
2728 keywords:
2729 /* Associate the remaining actual arguments, all of which have
2730 to be keyword arguments. */
2731 for (; a; a = a->next)
2733 for (f = formal; f; f = f->next)
2734 if (strcmp (a->name, f->name) == 0)
2735 break;
2737 if (f == NULL)
2739 gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2740 a->name, name, where);
2741 return FAILURE;
2744 if (f->actual != NULL)
2746 gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2747 f->name, name, where);
2748 return FAILURE;
2751 f->actual = a;
2754 optional:
2755 /* At this point, all unmatched formal args must be optional. */
2756 for (f = formal; f; f = f->next)
2758 if (f->actual == NULL && f->optional == 0)
2760 gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2761 f->name, name, where);
2762 return FAILURE;
2766 do_sort:
2767 /* Using the formal argument list, string the actual argument list
2768 together in a way that corresponds with the formal list. */
2769 actual = NULL;
2771 for (f = formal; f; f = f->next)
2773 if (f->actual == NULL)
2775 a = gfc_get_actual_arglist ();
2776 a->missing_arg_type = f->ts.type;
2778 else
2779 a = f->actual;
2781 if (actual == NULL)
2782 *ap = a;
2783 else
2784 actual->next = a;
2786 actual = a;
2788 actual->next = NULL; /* End the sorted argument list. */
2790 return SUCCESS;
2794 /* Compare an actual argument list with an intrinsic's formal argument
2795 list. The lists are checked for agreement of type. We don't check
2796 for arrayness here. */
2798 static try
2799 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2800 int error_flag)
2802 gfc_actual_arglist *actual;
2803 gfc_intrinsic_arg *formal;
2804 int i;
2806 formal = sym->formal;
2807 actual = *ap;
2809 i = 0;
2810 for (; formal; formal = formal->next, actual = actual->next, i++)
2812 if (actual->expr == NULL)
2813 continue;
2815 if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2817 if (error_flag)
2818 gfc_error
2819 ("Type of argument '%s' in call to '%s' at %L should be "
2820 "%s, not %s", gfc_current_intrinsic_arg[i],
2821 gfc_current_intrinsic, &actual->expr->where,
2822 gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2823 return FAILURE;
2827 return SUCCESS;
2831 /* Given a pointer to an intrinsic symbol and an expression node that
2832 represent the function call to that subroutine, figure out the type
2833 of the result. This may involve calling a resolution subroutine. */
2835 static void
2836 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2838 gfc_expr *a1, *a2, *a3, *a4, *a5;
2839 gfc_actual_arglist *arg;
2841 if (specific->resolve.f1 == NULL)
2843 if (e->value.function.name == NULL)
2844 e->value.function.name = specific->lib_name;
2846 if (e->ts.type == BT_UNKNOWN)
2847 e->ts = specific->ts;
2848 return;
2851 arg = e->value.function.actual;
2853 /* Special case hacks for MIN and MAX. */
2854 if (specific->resolve.f1m == gfc_resolve_max
2855 || specific->resolve.f1m == gfc_resolve_min)
2857 (*specific->resolve.f1m) (e, arg);
2858 return;
2861 if (arg == NULL)
2863 (*specific->resolve.f0) (e);
2864 return;
2867 a1 = arg->expr;
2868 arg = arg->next;
2870 if (arg == NULL)
2872 (*specific->resolve.f1) (e, a1);
2873 return;
2876 a2 = arg->expr;
2877 arg = arg->next;
2879 if (arg == NULL)
2881 (*specific->resolve.f2) (e, a1, a2);
2882 return;
2885 a3 = arg->expr;
2886 arg = arg->next;
2888 if (arg == NULL)
2890 (*specific->resolve.f3) (e, a1, a2, a3);
2891 return;
2894 a4 = arg->expr;
2895 arg = arg->next;
2897 if (arg == NULL)
2899 (*specific->resolve.f4) (e, a1, a2, a3, a4);
2900 return;
2903 a5 = arg->expr;
2904 arg = arg->next;
2906 if (arg == NULL)
2908 (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2909 return;
2912 gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2916 /* Given an intrinsic symbol node and an expression node, call the
2917 simplification function (if there is one), perhaps replacing the
2918 expression with something simpler. We return FAILURE on an error
2919 of the simplification, SUCCESS if the simplification worked, even
2920 if nothing has changed in the expression itself. */
2922 static try
2923 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2925 gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2926 gfc_actual_arglist *arg;
2928 /* Check the arguments if there are Hollerith constants. We deal with
2929 them at run-time. */
2930 for (arg = e->value.function.actual; arg != NULL; arg = arg->next)
2932 if (arg->expr && arg->expr->from_H)
2934 result = NULL;
2935 goto finish;
2938 /* Max and min require special handling due to the variable number
2939 of args. */
2940 if (specific->simplify.f1 == gfc_simplify_min)
2942 result = gfc_simplify_min (e);
2943 goto finish;
2946 if (specific->simplify.f1 == gfc_simplify_max)
2948 result = gfc_simplify_max (e);
2949 goto finish;
2952 if (specific->simplify.f1 == NULL)
2954 result = NULL;
2955 goto finish;
2958 arg = e->value.function.actual;
2960 if (arg == NULL)
2962 result = (*specific->simplify.f0) ();
2963 goto finish;
2966 a1 = arg->expr;
2967 arg = arg->next;
2969 if (specific->simplify.cc == gfc_convert_constant)
2971 result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2972 goto finish;
2975 /* TODO: Warn if -pedantic and initialization expression and arg
2976 types not integer or character */
2978 if (arg == NULL)
2979 result = (*specific->simplify.f1) (a1);
2980 else
2982 a2 = arg->expr;
2983 arg = arg->next;
2985 if (arg == NULL)
2986 result = (*specific->simplify.f2) (a1, a2);
2987 else
2989 a3 = arg->expr;
2990 arg = arg->next;
2992 if (arg == NULL)
2993 result = (*specific->simplify.f3) (a1, a2, a3);
2994 else
2996 a4 = arg->expr;
2997 arg = arg->next;
2999 if (arg == NULL)
3000 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3001 else
3003 a5 = arg->expr;
3004 arg = arg->next;
3006 if (arg == NULL)
3007 result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3008 else
3009 gfc_internal_error
3010 ("do_simplify(): Too many args for intrinsic");
3016 finish:
3017 if (result == &gfc_bad_expr)
3018 return FAILURE;
3020 if (result == NULL)
3021 resolve_intrinsic (specific, e); /* Must call at run-time */
3022 else
3024 result->where = e->where;
3025 gfc_replace_expr (e, result);
3028 return SUCCESS;
3032 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3033 error messages. This subroutine returns FAILURE if a subroutine
3034 has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3035 list cannot match any intrinsic. */
3037 static void
3038 init_arglist (gfc_intrinsic_sym * isym)
3040 gfc_intrinsic_arg *formal;
3041 int i;
3043 gfc_current_intrinsic = isym->name;
3045 i = 0;
3046 for (formal = isym->formal; formal; formal = formal->next)
3048 if (i >= MAX_INTRINSIC_ARGS)
3049 gfc_internal_error ("init_arglist(): too many arguments");
3050 gfc_current_intrinsic_arg[i++] = formal->name;
3055 /* Given a pointer to an intrinsic symbol and an expression consisting
3056 of a function call, see if the function call is consistent with the
3057 intrinsic's formal argument list. Return SUCCESS if the expression
3058 and intrinsic match, FAILURE otherwise. */
3060 static try
3061 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
3063 gfc_actual_arglist *arg, **ap;
3064 int r;
3065 try t;
3067 ap = &expr->value.function.actual;
3069 init_arglist (specific);
3071 /* Don't attempt to sort the argument list for min or max. */
3072 if (specific->check.f1m == gfc_check_min_max
3073 || specific->check.f1m == gfc_check_min_max_integer
3074 || specific->check.f1m == gfc_check_min_max_real
3075 || specific->check.f1m == gfc_check_min_max_double)
3076 return (*specific->check.f1m) (*ap);
3078 if (sort_actual (specific->name, ap, specific->formal,
3079 &expr->where) == FAILURE)
3080 return FAILURE;
3082 if (specific->check.f3ml == gfc_check_minloc_maxloc)
3083 /* This is special because we might have to reorder the argument
3084 list. */
3085 t = gfc_check_minloc_maxloc (*ap);
3086 else if (specific->check.f3red == gfc_check_minval_maxval)
3087 /* This is also special because we also might have to reorder the
3088 argument list. */
3089 t = gfc_check_minval_maxval (*ap);
3090 else if (specific->check.f3red == gfc_check_product_sum)
3091 /* Same here. The difference to the previous case is that we allow a
3092 general numeric type. */
3093 t = gfc_check_product_sum (*ap);
3094 else
3096 if (specific->check.f1 == NULL)
3098 t = check_arglist (ap, specific, error_flag);
3099 if (t == SUCCESS)
3100 expr->ts = specific->ts;
3102 else
3103 t = do_check (specific, *ap);
3106 /* Check ranks for elemental intrinsics. */
3107 if (t == SUCCESS && specific->elemental)
3109 r = 0;
3110 for (arg = expr->value.function.actual; arg; arg = arg->next)
3112 if (arg->expr == NULL || arg->expr->rank == 0)
3113 continue;
3114 if (r == 0)
3116 r = arg->expr->rank;
3117 continue;
3120 if (arg->expr->rank != r)
3122 gfc_error
3123 ("Ranks of arguments to elemental intrinsic '%s' differ "
3124 "at %L", specific->name, &arg->expr->where);
3125 return FAILURE;
3130 if (t == FAILURE)
3131 remove_nullargs (ap);
3133 return t;
3137 /* See if an intrinsic is one of the intrinsics we evaluate
3138 as an extension. */
3140 static int
3141 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
3143 /* FIXME: This should be moved into the intrinsic definitions. */
3144 static const char * const init_expr_extensions[] = {
3145 "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
3146 "precision", "present", "radix", "range", "selected_real_kind",
3147 "tiny", NULL
3150 int i;
3152 for (i = 0; init_expr_extensions[i]; i++)
3153 if (strcmp (init_expr_extensions[i], isym->name) == 0)
3154 return 0;
3156 return 1;
3160 /* Check whether an intrinsic belongs to whatever standard the user
3161 has chosen. */
3163 static void
3164 check_intrinsic_standard (const char *name, int standard, locus * where)
3166 if (!gfc_option.warn_nonstd_intrinsics)
3167 return;
3169 gfc_notify_std (standard, "Intrinsic '%s' at %L is not included "
3170 "in the selected standard", name, where);
3174 /* See if a function call corresponds to an intrinsic function call.
3175 We return:
3177 MATCH_YES if the call corresponds to an intrinsic, simplification
3178 is done if possible.
3180 MATCH_NO if the call does not correspond to an intrinsic
3182 MATCH_ERROR if the call corresponds to an intrinsic but there was an
3183 error during the simplification process.
3185 The error_flag parameter enables an error reporting. */
3187 match
3188 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
3190 gfc_intrinsic_sym *isym, *specific;
3191 gfc_actual_arglist *actual;
3192 const char *name;
3193 int flag;
3195 if (expr->value.function.isym != NULL)
3196 return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3197 ? MATCH_ERROR : MATCH_YES;
3199 gfc_suppress_error = !error_flag;
3200 flag = 0;
3202 for (actual = expr->value.function.actual; actual; actual = actual->next)
3203 if (actual->expr != NULL)
3204 flag |= (actual->expr->ts.type != BT_INTEGER
3205 && actual->expr->ts.type != BT_CHARACTER);
3207 name = expr->symtree->n.sym->name;
3209 isym = specific = gfc_find_function (name);
3210 if (isym == NULL)
3212 gfc_suppress_error = 0;
3213 return MATCH_NO;
3216 gfc_current_intrinsic_where = &expr->where;
3218 /* Bypass the generic list for min and max. */
3219 if (isym->check.f1m == gfc_check_min_max)
3221 init_arglist (isym);
3223 if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3224 goto got_specific;
3226 gfc_suppress_error = 0;
3227 return MATCH_NO;
3230 /* If the function is generic, check all of its specific
3231 incarnations. If the generic name is also a specific, we check
3232 that name last, so that any error message will correspond to the
3233 specific. */
3234 gfc_suppress_error = 1;
3236 if (isym->generic)
3238 for (specific = isym->specific_head; specific;
3239 specific = specific->next)
3241 if (specific == isym)
3242 continue;
3243 if (check_specific (specific, expr, 0) == SUCCESS)
3244 goto got_specific;
3248 gfc_suppress_error = !error_flag;
3250 if (check_specific (isym, expr, error_flag) == FAILURE)
3252 gfc_suppress_error = 0;
3253 return MATCH_NO;
3256 specific = isym;
3258 got_specific:
3259 expr->value.function.isym = specific;
3260 gfc_intrinsic_symbol (expr->symtree->n.sym);
3262 gfc_suppress_error = 0;
3263 if (do_simplify (specific, expr) == FAILURE)
3264 return MATCH_ERROR;
3266 /* TODO: We should probably only allow elemental functions here. */
3267 flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
3269 if (pedantic && gfc_init_expr
3270 && flag && gfc_init_expr_extensions (specific))
3272 if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
3273 "nonstandard initialization expression at %L", &expr->where)
3274 == FAILURE)
3276 return MATCH_ERROR;
3280 check_intrinsic_standard (name, isym->standard, &expr->where);
3282 return MATCH_YES;
3286 /* See if a CALL statement corresponds to an intrinsic subroutine.
3287 Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3288 MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3289 correspond). */
3291 match
3292 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
3294 gfc_intrinsic_sym *isym;
3295 const char *name;
3297 name = c->symtree->n.sym->name;
3299 isym = find_subroutine (name);
3300 if (isym == NULL)
3301 return MATCH_NO;
3303 gfc_suppress_error = !error_flag;
3305 init_arglist (isym);
3307 if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3308 goto fail;
3310 if (isym->check.f1 != NULL)
3312 if (do_check (isym, c->ext.actual) == FAILURE)
3313 goto fail;
3315 else
3317 if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3318 goto fail;
3321 /* The subroutine corresponds to an intrinsic. Allow errors to be
3322 seen at this point. */
3323 gfc_suppress_error = 0;
3325 if (isym->resolve.s1 != NULL)
3326 isym->resolve.s1 (c);
3327 else
3328 c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3330 if (gfc_pure (NULL) && !isym->elemental)
3332 gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3333 &c->loc);
3334 return MATCH_ERROR;
3337 c->resolved_sym->attr.noreturn = isym->noreturn;
3338 check_intrinsic_standard (name, isym->standard, &c->loc);
3340 return MATCH_YES;
3342 fail:
3343 gfc_suppress_error = 0;
3344 return MATCH_NO;
3348 /* Call gfc_convert_type() with warning enabled. */
3351 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
3353 return gfc_convert_type_warn (expr, ts, eflag, 1);
3357 /* Try to convert an expression (in place) from one type to another.
3358 'eflag' controls the behavior on error.
3360 The possible values are:
3362 1 Generate a gfc_error()
3363 2 Generate a gfc_internal_error().
3365 'wflag' controls the warning related to conversion. */
3368 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
3369 int wflag)
3371 gfc_intrinsic_sym *sym;
3372 gfc_typespec from_ts;
3373 locus old_where;
3374 gfc_expr *new;
3375 int rank;
3376 mpz_t *shape;
3378 from_ts = expr->ts; /* expr->ts gets clobbered */
3380 if (ts->type == BT_UNKNOWN)
3381 goto bad;
3383 /* NULL and zero size arrays get their type here. */
3384 if (expr->expr_type == EXPR_NULL
3385 || (expr->expr_type == EXPR_ARRAY
3386 && expr->value.constructor == NULL))
3388 /* Sometimes the RHS acquire the type. */
3389 expr->ts = *ts;
3390 return SUCCESS;
3393 if (expr->ts.type == BT_UNKNOWN)
3394 goto bad;
3396 if (expr->ts.type == BT_DERIVED
3397 && ts->type == BT_DERIVED
3398 && gfc_compare_types (&expr->ts, ts))
3399 return SUCCESS;
3401 sym = find_conv (&expr->ts, ts);
3402 if (sym == NULL)
3403 goto bad;
3405 /* At this point, a conversion is necessary. A warning may be needed. */
3406 if ((gfc_option.warn_std & sym->standard) != 0)
3407 gfc_warning_now ("Extension: Conversion from %s to %s at %L",
3408 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3409 else if (wflag && gfc_option.warn_conversion)
3410 gfc_warning_now ("Conversion from %s to %s at %L",
3411 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3413 /* Insert a pre-resolved function call to the right function. */
3414 old_where = expr->where;
3415 rank = expr->rank;
3416 shape = expr->shape;
3418 new = gfc_get_expr ();
3419 *new = *expr;
3421 new = gfc_build_conversion (new);
3422 new->value.function.name = sym->lib_name;
3423 new->value.function.isym = sym;
3424 new->where = old_where;
3425 new->rank = rank;
3426 new->shape = gfc_copy_shape (shape, rank);
3428 gfc_get_ha_sym_tree (sym->name, &new->symtree);
3429 new->symtree->n.sym->ts = *ts;
3430 new->symtree->n.sym->attr.flavor = FL_PROCEDURE;
3431 new->symtree->n.sym->attr.function = 1;
3432 new->symtree->n.sym->attr.intrinsic = 1;
3433 new->symtree->n.sym->attr.elemental = 1;
3434 new->symtree->n.sym->attr.pure = 1;
3435 new->symtree->n.sym->attr.referenced = 1;
3436 gfc_intrinsic_symbol(new->symtree->n.sym);
3437 gfc_commit_symbol (new->symtree->n.sym);
3439 *expr = *new;
3441 gfc_free (new);
3442 expr->ts = *ts;
3444 if (gfc_is_constant_expr (expr->value.function.actual->expr)
3445 && do_simplify (sym, expr) == FAILURE)
3448 if (eflag == 2)
3449 goto bad;
3450 return FAILURE; /* Error already generated in do_simplify() */
3453 return SUCCESS;
3455 bad:
3456 if (eflag == 1)
3458 gfc_error ("Can't convert %s to %s at %L",
3459 gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3460 return FAILURE;
3463 gfc_internal_error ("Can't convert %s to %s at %L",
3464 gfc_typename (&from_ts), gfc_typename (ts),
3465 &expr->where);
3466 /* Not reached */