OSDN Git Service

fortran/
[pf3gnuchains/gcc-fork.git] / gcc / fortran / intrinsic.c
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
6
7 This file is part of GCC.
8
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.
13
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.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 02111-1307, USA.  */
23
24
25 #include "config.h"
26 #include "system.h"
27 #include "flags.h"
28 #include "gfortran.h"
29 #include "intrinsic.h"
30
31
32 /* Namespace to hold the resolved symbols for intrinsic subroutines.  */
33 static gfc_namespace *gfc_intrinsic_namespace;
34
35 int gfc_init_expr = 0;
36
37 /* Pointers to an intrinsic function and its argument names that are being
38    checked.  */
39
40 char *gfc_current_intrinsic, *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
41 locus *gfc_current_intrinsic_where;
42
43 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
44 static gfc_intrinsic_arg *next_arg;
45
46 static int nfunc, nsub, nargs, nconv;
47
48 static enum
49 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
50 sizing;
51
52 #define REQUIRED        0
53 #define OPTIONAL        1
54
55 /* Return a letter based on the passed type.  Used to construct the
56    name of a type-dependent subroutine.  */
57
58 char
59 gfc_type_letter (bt type)
60 {
61   char c;
62
63   switch (type)
64     {
65     case BT_LOGICAL:
66       c = 'l';
67       break;
68     case BT_CHARACTER:
69       c = 's';
70       break;
71     case BT_INTEGER:
72       c = 'i';
73       break;
74     case BT_REAL:
75       c = 'r';
76       break;
77     case BT_COMPLEX:
78       c = 'c';
79       break;
80
81     default:
82       c = 'u';
83       break;
84     }
85
86   return c;
87 }
88
89
90 /* Get a symbol for a resolved name.  */
91
92 gfc_symbol *
93 gfc_get_intrinsic_sub_symbol (const char * name)
94 {
95   gfc_symbol *sym;
96
97   gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
98   sym->attr.always_explicit = 1;
99   sym->attr.subroutine = 1;
100   sym->attr.flavor = FL_PROCEDURE;
101   sym->attr.proc = PROC_INTRINSIC;
102
103   return sym;
104 }
105
106
107 /* Return a pointer to the name of a conversion function given two
108    typespecs.  */
109
110 static char *
111 conv_name (gfc_typespec * from, gfc_typespec * to)
112 {
113   static char name[30];
114
115   sprintf (name, "__convert_%c%d_%c%d", gfc_type_letter (from->type),
116            from->kind, gfc_type_letter (to->type), to->kind);
117
118   return name;
119 }
120
121
122 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
123    corresponds to the conversion.  Returns NULL if the conversion
124    isn't found.  */
125
126 static gfc_intrinsic_sym *
127 find_conv (gfc_typespec * from, gfc_typespec * to)
128 {
129   gfc_intrinsic_sym *sym;
130   char *target;
131   int i;
132
133   target = conv_name (from, to);
134   sym = conversion;
135
136   for (i = 0; i < nconv; i++, sym++)
137     if (strcmp (target, sym->name) == 0)
138       return sym;
139
140   return NULL;
141 }
142
143
144 /* Interface to the check functions.  We break apart an argument list
145    and call the proper check function rather than forcing each
146    function to manipulate the argument list.  */
147
148 static try
149 do_check (gfc_intrinsic_sym * specific, gfc_actual_arglist * arg)
150 {
151   gfc_expr *a1, *a2, *a3, *a4, *a5;
152
153   if (arg == NULL)
154     return (*specific->check.f0) ();
155
156   a1 = arg->expr;
157   arg = arg->next;
158   if (arg == NULL)
159     return (*specific->check.f1) (a1);
160
161   a2 = arg->expr;
162   arg = arg->next;
163   if (arg == NULL)
164     return (*specific->check.f2) (a1, a2);
165
166   a3 = arg->expr;
167   arg = arg->next;
168   if (arg == NULL)
169     return (*specific->check.f3) (a1, a2, a3);
170
171   a4 = arg->expr;
172   arg = arg->next;
173   if (arg == NULL)
174     return (*specific->check.f4) (a1, a2, a3, a4);
175
176   a5 = arg->expr;
177   arg = arg->next;
178   if (arg == NULL)
179     return (*specific->check.f5) (a1, a2, a3, a4, a5);
180
181   gfc_internal_error ("do_check(): too many args");
182 }
183
184
185 /*********** Subroutines to build the intrinsic list ****************/
186
187 /* Add a single intrinsic symbol to the current list.
188
189    Argument list:
190       char *     name of function
191       int        whether function is elemental
192       int        If the function can be used as an actual argument
193       bt         return type of function
194       int        kind of return type of function
195       int        Fortran standard version
196       check      pointer to check function
197       simplify   pointer to simplification function
198       resolve    pointer to resolution function
199
200    Optional arguments come in multiples of four:
201       char *    name of argument
202       bt        type of argument
203       int       kind of argument
204       int       arg optional flag (1=optional, 0=required)
205
206    The sequence is terminated by a NULL name.
207
208    TODO: Are checks on actual_ok implemented elsewhere, or is that just
209    missing here?  */
210
211 static void
212 add_sym (const char *name, int elemental, int actual_ok ATTRIBUTE_UNUSED,
213          bt type, int kind, int standard, gfc_check_f check,
214          gfc_simplify_f simplify, gfc_resolve_f resolve, ...)
215 {
216
217   int optional, first_flag;
218   va_list argp;
219
220   /* First check that the intrinsic belongs to the selected standard.
221      If not, don't add it to the symbol list.  */
222   if (!(gfc_option.allow_std & standard))
223     return;
224
225   switch (sizing)
226     {
227     case SZ_SUBS:
228       nsub++;
229       break;
230
231     case SZ_FUNCS:
232       nfunc++;
233       break;
234
235     case SZ_NOTHING:
236       strcpy (next_sym->name, name);
237
238       strcpy (next_sym->lib_name, "_gfortran_");
239       strcat (next_sym->lib_name, name);
240
241       next_sym->elemental = elemental;
242       next_sym->ts.type = type;
243       next_sym->ts.kind = kind;
244       next_sym->standard = standard;
245       next_sym->simplify = simplify;
246       next_sym->check = check;
247       next_sym->resolve = resolve;
248       next_sym->specific = 0;
249       next_sym->generic = 0;
250       break;
251
252     default:
253       gfc_internal_error ("add_sym(): Bad sizing mode");
254     }
255
256   va_start (argp, resolve);
257
258   first_flag = 1;
259
260   for (;;)
261     {
262       name = va_arg (argp, char *);
263       if (name == NULL)
264         break;
265
266       type = (bt) va_arg (argp, int);
267       kind = va_arg (argp, int);
268       optional = va_arg (argp, int);
269
270       if (sizing != SZ_NOTHING)
271         nargs++;
272       else
273         {
274           next_arg++;
275
276           if (first_flag)
277             next_sym->formal = next_arg;
278           else
279             (next_arg - 1)->next = next_arg;
280
281           first_flag = 0;
282
283           strcpy (next_arg->name, name);
284           next_arg->ts.type = type;
285           next_arg->ts.kind = kind;
286           next_arg->optional = optional;
287         }
288     }
289
290   va_end (argp);
291
292   next_sym++;
293 }
294
295
296 /* Add a symbol to the function list where the function takes
297    0 arguments.  */
298
299 static void
300 add_sym_0 (const char *name, int elemental, int actual_ok, bt type,
301                        int kind, int standard,
302                        try (*check)(void),
303                        gfc_expr *(*simplify)(void),
304            void (*resolve)(gfc_expr *))
305 {
306   gfc_simplify_f sf;
307   gfc_check_f cf;
308   gfc_resolve_f rf;
309
310   cf.f0 = check;
311   sf.f0 = simplify;
312   rf.f0 = resolve;
313
314   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
315            (void*)0);
316 }
317
318
319 /* Add a symbol to the subroutine list where the subroutine takes
320    0 arguments.  */
321
322 static void
323 add_sym_0s (const char * name, int actual_ok, int standard,
324             void (*resolve)(gfc_code *))
325 {
326   gfc_check_f cf;
327   gfc_simplify_f sf;
328   gfc_resolve_f rf;
329
330   cf.f1 = NULL;
331   sf.f1 = NULL;
332   rf.s1 = resolve;
333
334   add_sym (name, 1, actual_ok, BT_UNKNOWN, 0, standard, cf, sf, rf,
335            (void*)0);
336 }
337
338
339 /* Add a symbol to the function list where the function takes
340    1 arguments.  */
341
342 static void
343 add_sym_1 (const char *name, int elemental, int actual_ok, bt type,
344            int kind, int standard,
345            try (*check)(gfc_expr *),
346            gfc_expr *(*simplify)(gfc_expr *),
347            void (*resolve)(gfc_expr *,gfc_expr *),
348            const char* a1, bt type1, int kind1, int optional1)
349 {
350   gfc_check_f cf;
351   gfc_simplify_f sf;
352   gfc_resolve_f rf;
353
354   cf.f1 = check;
355   sf.f1 = simplify;
356   rf.f1 = resolve;
357
358   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
359            a1, type1, kind1, optional1,
360            (void*)0);
361 }
362
363
364 /* Add a symbol to the subroutine list where the subroutine takes
365    1 arguments.  */
366
367 static void
368 add_sym_1s (const char *name, int elemental, int actual_ok, bt type,
369                         int kind, int standard,
370                         try (*check)(gfc_expr *),
371                         gfc_expr *(*simplify)(gfc_expr *),
372                         void (*resolve)(gfc_code *),
373             const char* a1, bt type1, int kind1, int optional1)
374 {
375   gfc_check_f cf;
376   gfc_simplify_f sf;
377   gfc_resolve_f rf;
378
379   cf.f1 = check;
380   sf.f1 = simplify;
381   rf.s1 = resolve;
382
383   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
384            a1, type1, kind1, optional1,
385            (void*)0);
386 }
387
388
389 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
390    function.  MAX et al take 2 or more arguments.  */
391
392 static void
393 add_sym_1m (const char *name, int elemental, int actual_ok, bt type,
394                         int kind, int standard,
395                         try (*check)(gfc_actual_arglist *),
396                         gfc_expr *(*simplify)(gfc_expr *),
397                         void (*resolve)(gfc_expr *,gfc_actual_arglist *),
398                         const char* a1, bt type1, int kind1, int optional1,
399             const char* a2, bt type2, int kind2, int optional2)
400 {
401   gfc_check_f cf;
402   gfc_simplify_f sf;
403   gfc_resolve_f rf;
404
405   cf.f1m = check;
406   sf.f1 = simplify;
407   rf.f1m = resolve;
408
409   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
410            a1, type1, kind1, optional1,
411            a2, type2, kind2, optional2,
412            (void*)0);
413 }
414
415
416 /* Add a symbol to the function list where the function takes
417    2 arguments.  */
418
419 static void
420 add_sym_2 (const char *name, int elemental, int actual_ok, bt type,
421                        int kind, int standard,
422                        try (*check)(gfc_expr *,gfc_expr *),
423                        gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
424                        void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *),
425                        const char* a1, bt type1, int kind1, int optional1,
426            const char* a2, bt type2, int kind2, int optional2)
427 {
428   gfc_check_f cf;
429   gfc_simplify_f sf;
430   gfc_resolve_f rf;
431
432   cf.f2 = check;
433   sf.f2 = simplify;
434   rf.f2 = resolve;
435
436   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
437            a1, type1, kind1, optional1,
438            a2, type2, kind2, optional2,
439            (void*)0);
440 }
441
442
443 /* Add a symbol to the subroutine list where the subroutine takes
444    2 arguments.  */
445
446 static void
447 add_sym_2s (const char *name, int elemental, int actual_ok, bt type,
448                         int kind, int standard,
449                        try (*check)(gfc_expr *,gfc_expr *),
450                        gfc_expr *(*simplify)(gfc_expr *,gfc_expr *),
451                        void (*resolve)(gfc_code *),
452                        const char* a1, bt type1, int kind1, int optional1,
453             const char* a2, bt type2, int kind2, int optional2)
454 {
455   gfc_check_f cf;
456   gfc_simplify_f sf;
457   gfc_resolve_f rf;
458
459   cf.f2 = check;
460   sf.f2 = simplify;
461   rf.s1 = resolve;
462
463   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
464            a1, type1, kind1, optional1,
465            a2, type2, kind2, optional2,
466            (void*)0);
467 }
468
469
470 /* Add a symbol to the function list where the function takes
471    3 arguments.  */
472
473 static void
474 add_sym_3 (const char *name, int elemental, int actual_ok, bt type,
475                        int kind, int standard,
476                        try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
477                        gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
478                        void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
479                        const char* a1, bt type1, int kind1, int optional1,
480                        const char* a2, bt type2, int kind2, int optional2,
481            const char* a3, bt type3, int kind3, int optional3)
482 {
483   gfc_check_f cf;
484   gfc_simplify_f sf;
485   gfc_resolve_f rf;
486
487   cf.f3 = check;
488   sf.f3 = simplify;
489   rf.f3 = resolve;
490
491   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
492            a1, type1, kind1, optional1,
493            a2, type2, kind2, optional2,
494            a3, type3, kind3, optional3,
495            (void*)0);
496 }
497
498
499 /* MINLOC and MAXLOC get special treatment because their argument
500    might have to be reordered.  */
501
502 static void
503 add_sym_3ml (const char *name, int elemental, 
504                          int actual_ok, bt type, int kind, int standard,
505                          try (*check)(gfc_actual_arglist *),
506                          gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
507                          void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
508                          const char* a1, bt type1, int kind1, int optional1,
509                          const char* a2, bt type2, int kind2, int optional2,
510              const char* a3, bt type3, int kind3, int optional3)
511 {
512   gfc_check_f cf;
513   gfc_simplify_f sf;
514   gfc_resolve_f rf;
515
516   cf.f3ml = check;
517   sf.f3 = simplify;
518   rf.f3 = resolve;
519
520   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
521            a1, type1, kind1, optional1,
522            a2, type2, kind2, optional2,
523            a3, type3, kind3, optional3,
524            (void*)0);
525 }
526
527
528 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
529    their argument also might have to be reordered.  */
530
531 static void
532 add_sym_3red (const char *name, int elemental, 
533                           int actual_ok, bt type, int kind, int standard,
534                           try (*check)(gfc_actual_arglist *),
535                           gfc_expr*(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
536                           void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
537                           const char* a1, bt type1, int kind1, int optional1,
538                           const char* a2, bt type2, int kind2, int optional2,
539               const char* a3, bt type3, int kind3, int optional3)
540 {
541   gfc_check_f cf;
542   gfc_simplify_f sf;
543   gfc_resolve_f rf;
544
545   cf.f3red = check;
546   sf.f3 = simplify;
547   rf.f3 = resolve;
548
549   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
550            a1, type1, kind1, optional1,
551            a2, type2, kind2, optional2,
552            a3, type3, kind3, optional3,
553            (void*)0);
554 }
555
556
557 /* Add a symbol to the subroutine list where the subroutine takes
558    3 arguments.  */
559
560 static void
561 add_sym_3s (const char *name, int elemental, int actual_ok, bt type,
562                         int kind, int standard,
563                        try (*check)(gfc_expr *,gfc_expr *,gfc_expr *),
564                        gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *),
565                        void (*resolve)(gfc_code *),
566                        const char* a1, bt type1, int kind1, int optional1,
567                        const char* a2, bt type2, int kind2, int optional2,
568             const char* a3, bt type3, int kind3, int optional3)
569 {
570   gfc_check_f cf;
571   gfc_simplify_f sf;
572   gfc_resolve_f rf;
573
574   cf.f3 = check;
575   sf.f3 = simplify;
576   rf.s1 = resolve;
577
578   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
579            a1, type1, kind1, optional1,
580            a2, type2, kind2, optional2,
581            a3, type3, kind3, optional3,
582            (void*)0);
583 }
584
585
586 /* Add a symbol to the function list where the function takes
587    4 arguments.  */
588
589 static void
590 add_sym_4 (const char *name, int elemental, int actual_ok, bt type,
591                        int kind, int standard,
592                        try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
593                        gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
594                        void (*resolve)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
595                        const char* a1, bt type1, int kind1, int optional1,
596                        const char* a2, bt type2, int kind2, int optional2,
597                        const char* a3, bt type3, int kind3, int optional3,
598            const char* a4, bt type4, int kind4, int optional4 )
599 {
600   gfc_check_f cf;
601   gfc_simplify_f sf;
602   gfc_resolve_f rf;
603
604   cf.f4 = check;
605   sf.f4 = simplify;
606   rf.f4 = resolve;
607
608   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
609            a1, type1, kind1, optional1,
610            a2, type2, kind2, optional2,
611            a3, type3, kind3, optional3,
612            a4, type4, kind4, optional4,
613            (void*)0);
614 }
615
616
617 /* Add a symbol to the subroutine list where the subroutine takes
618    4 arguments.  */
619
620 static void
621 add_sym_4s (const char *name, int elemental, int actual_ok,
622                         bt type, int kind, int standard,
623     try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
624     gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
625     void (*resolve)(gfc_code *),
626     const char* a1, bt type1, int kind1, int optional1,
627     const char* a2, bt type2, int kind2, int optional2,
628     const char* a3, bt type3, int kind3, int optional3,
629     const char* a4, bt type4, int kind4, int optional4)
630 {
631   gfc_check_f cf;
632   gfc_simplify_f sf;
633   gfc_resolve_f rf;
634
635   cf.f4 = check;
636   sf.f4 = simplify;
637   rf.s1 = resolve;
638
639   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
640            a1, type1, kind1, optional1,
641            a2, type2, kind2, optional2,
642            a3, type3, kind3, optional3,
643            a4, type4, kind4, optional4,
644            (void*)0);
645 }
646
647
648 /* Add a symbol to the subroutine list where the subroutine takes
649    5 arguments.  */
650
651 static void
652 add_sym_5s (const char *name, int elemental, int actual_ok, 
653  bt type, int kind, int standard,
654  try (*check)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
655  gfc_expr *(*simplify)(gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *,gfc_expr *),
656  void (*resolve)(gfc_code *),
657  const char* a1, bt type1, int kind1, int optional1,
658  const char* a2, bt type2, int kind2, int optional2,
659  const char* a3, bt type3, int kind3, int optional3,
660  const char* a4, bt type4, int kind4, int optional4,
661  const char* a5, bt type5, int kind5, int optional5) 
662 {
663   gfc_check_f cf;
664   gfc_simplify_f sf;
665   gfc_resolve_f rf;
666
667   cf.f5 = check;
668   sf.f5 = simplify;
669   rf.s1 = resolve;
670
671   add_sym (name, elemental, actual_ok, type, kind, standard, cf, sf, rf,
672            a1, type1, kind1, optional1,
673            a2, type2, kind2, optional2,
674            a3, type3, kind3, optional3,
675            a4, type4, kind4, optional4,
676            a5, type5, kind5, optional5,
677            (void*)0);
678 }
679
680
681 /* Locate an intrinsic symbol given a base pointer, number of elements
682    in the table and a pointer to a name.  Returns the NULL pointer if
683    a name is not found.  */
684
685 static gfc_intrinsic_sym *
686 find_sym (gfc_intrinsic_sym * start, int n, const char *name)
687 {
688
689   while (n > 0)
690     {
691       if (strcmp (name, start->name) == 0)
692         return start;
693
694       start++;
695       n--;
696     }
697
698   return NULL;
699 }
700
701
702 /* Given a name, find a function in the intrinsic function table.
703    Returns NULL if not found.  */
704
705 gfc_intrinsic_sym *
706 gfc_find_function (const char *name)
707 {
708
709   return find_sym (functions, nfunc, name);
710 }
711
712
713 /* Given a name, find a function in the intrinsic subroutine table.
714    Returns NULL if not found.  */
715
716 static gfc_intrinsic_sym *
717 find_subroutine (const char *name)
718 {
719
720   return find_sym (subroutines, nsub, name);
721 }
722
723
724 /* Given a string, figure out if it is the name of a generic intrinsic
725    function or not.  */
726
727 int
728 gfc_generic_intrinsic (const char *name)
729 {
730   gfc_intrinsic_sym *sym;
731
732   sym = gfc_find_function (name);
733   return (sym == NULL) ? 0 : sym->generic;
734 }
735
736
737 /* Given a string, figure out if it is the name of a specific
738    intrinsic function or not.  */
739
740 int
741 gfc_specific_intrinsic (const char *name)
742 {
743   gfc_intrinsic_sym *sym;
744
745   sym = gfc_find_function (name);
746   return (sym == NULL) ? 0 : sym->specific;
747 }
748
749
750 /* Given a string, figure out if it is the name of an intrinsic
751    subroutine or function.  There are no generic intrinsic
752    subroutines, they are all specific.  */
753
754 int
755 gfc_intrinsic_name (const char *name, int subroutine_flag)
756 {
757
758   return subroutine_flag ?
759     find_subroutine (name) != NULL : gfc_find_function (name) != NULL;
760 }
761
762
763 /* Collect a set of intrinsic functions into a generic collection.
764    The first argument is the name of the generic function, which is
765    also the name of a specific function.  The rest of the specifics
766    currently in the table are placed into the list of specific
767    functions associated with that generic.  */
768
769 static void
770 make_generic (const char *name, gfc_generic_isym_id generic_id, int standard)
771 {
772   gfc_intrinsic_sym *g;
773
774   if (!(gfc_option.allow_std & standard))
775     return;
776
777   if (sizing != SZ_NOTHING)
778     return;
779
780   g = gfc_find_function (name);
781   if (g == NULL)
782     gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
783                         name);
784
785   g->generic = 1;
786   g->specific = 1;
787   g->generic_id = generic_id;
788   if ((g + 1)->name[0] != '\0')
789     g->specific_head = g + 1;
790   g++;
791
792   while (g->name[0] != '\0')
793     {
794       g->next = g + 1;
795       g->specific = 1;
796       g->generic_id = generic_id;
797       g++;
798     }
799
800   g--;
801   g->next = NULL;
802 }
803
804
805 /* Create a duplicate intrinsic function entry for the current
806    function, the only difference being the alternate name.  Note that
807    we use argument lists more than once, but all argument lists are
808    freed as a single block.  */
809
810 static void
811 make_alias (const char *name, int standard)
812 {
813
814   /* First check that the intrinsic belongs to the selected standard.
815      If not, don't add it to the symbol list.  */
816   if (!(gfc_option.allow_std & standard))
817     return;
818
819   switch (sizing)
820     {
821     case SZ_FUNCS:
822       nfunc++;
823       break;
824
825     case SZ_SUBS:
826       nsub++;
827       break;
828
829     case SZ_NOTHING:
830       next_sym[0] = next_sym[-1];
831       strcpy (next_sym->name, name);
832       next_sym++;
833       break;
834
835     default:
836       break;
837     }
838 }
839
840
841 /* Add intrinsic functions.  */
842
843 static void
844 add_functions (void)
845 {
846
847   /* Argument names as in the standard (to be used as argument keywords).  */
848   const char
849     *a = "a", *f = "field", *pt = "pointer", *tg = "target",
850     *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
851     *c = "c", *n = "ncopies", *pos = "pos", *bck = "back",
852     *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
853     *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
854     *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
855     *p = "p", *ar = "array", *shp = "shape", *src = "source",
856     *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
857     *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
858     *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
859     *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
860     *z = "z", *ln = "len", *ut = "unit";
861
862   int di, dr, dd, dl, dc, dz, ii;
863
864   di = gfc_default_integer_kind;
865   dr = gfc_default_real_kind;
866   dd = gfc_default_double_kind;
867   dl = gfc_default_logical_kind;
868   dc = gfc_default_character_kind;
869   dz = gfc_default_complex_kind;
870   ii = gfc_index_integer_kind;
871
872   add_sym_1 ("abs", 1, 1, BT_REAL, dr, GFC_STD_F77,
873              gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
874              a, BT_REAL, dr, REQUIRED);
875
876   add_sym_1 ("iabs", 1, 1, BT_INTEGER, di, GFC_STD_F77,
877              NULL, gfc_simplify_abs, gfc_resolve_abs,
878              a, BT_INTEGER, di, REQUIRED);
879
880   add_sym_1 ("dabs", 1, 1, BT_REAL, dd, GFC_STD_F77,
881              NULL, gfc_simplify_abs, gfc_resolve_abs,
882              a, BT_REAL, dd, REQUIRED);
883
884   add_sym_1 ("cabs", 1, 1, BT_REAL, dr, GFC_STD_F77,
885              NULL, gfc_simplify_abs, gfc_resolve_abs,
886              a, BT_COMPLEX, dz, REQUIRED);
887
888   add_sym_1 ("zabs", 1, 1, BT_REAL, dd, GFC_STD_GNU, 
889              NULL, gfc_simplify_abs, gfc_resolve_abs, 
890              a, BT_COMPLEX, dd, REQUIRED);
891
892   make_alias ("cdabs", GFC_STD_GNU);
893
894   make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
895
896   add_sym_1 ("achar", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
897              gfc_check_achar, gfc_simplify_achar, NULL,
898              i, BT_INTEGER, di, REQUIRED);
899
900   make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
901
902   add_sym_1 ("acos", 1, 1, BT_REAL, dr, GFC_STD_F77,
903              gfc_check_fn_r, gfc_simplify_acos, gfc_resolve_acos,
904              x, BT_REAL, dr, REQUIRED);
905
906   add_sym_1 ("dacos", 1, 1, BT_REAL, dd, GFC_STD_F77,
907              NULL, gfc_simplify_acos, gfc_resolve_acos,
908              x, BT_REAL, dd, REQUIRED);
909
910   make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
911
912   add_sym_1 ("adjustl", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
913              NULL, gfc_simplify_adjustl, NULL,
914              stg, BT_CHARACTER, dc, REQUIRED);
915
916   make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
917
918   add_sym_1 ("adjustr", 1, 1, BT_CHARACTER, dc, GFC_STD_F95,
919              NULL, gfc_simplify_adjustr, NULL,
920              stg, BT_CHARACTER, dc, REQUIRED);
921
922   make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
923
924   add_sym_1 ("aimag", 1, 1, BT_REAL, dr, GFC_STD_F77,
925              gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
926              z, BT_COMPLEX, dz, REQUIRED);
927
928   add_sym_1 ("dimag", 1, 1, BT_REAL, dd, GFC_STD_GNU, 
929              NULL, gfc_simplify_aimag, gfc_resolve_aimag, 
930              z, BT_COMPLEX, dd, REQUIRED);
931
932   make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
933
934   add_sym_2 ("aint", 1, 1, BT_REAL, dr, GFC_STD_F77,
935              gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
936              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
937
938   add_sym_1 ("dint", 1, 1, BT_REAL, dd, GFC_STD_F77,
939              NULL, gfc_simplify_dint, gfc_resolve_dint,
940              a, BT_REAL, dd, REQUIRED);
941
942   make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
943
944   add_sym_2 ("all", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
945              gfc_check_all_any, NULL, gfc_resolve_all,
946              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
947
948   make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
949
950   add_sym_1 ("allocated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
951              gfc_check_allocated, NULL, NULL,
952              ar, BT_UNKNOWN, 0, REQUIRED);
953
954   make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
955
956   add_sym_2 ("anint", 1, 1, BT_REAL, dr, GFC_STD_F77,
957              gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
958              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
959
960   add_sym_1 ("dnint", 1, 1, BT_REAL, dd, GFC_STD_F77,
961              NULL, gfc_simplify_dnint, gfc_resolve_dnint,
962              a, BT_REAL, dd, REQUIRED);
963
964   make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
965
966   add_sym_2 ("any", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
967              gfc_check_all_any, NULL, gfc_resolve_any,
968              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
969
970   make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
971
972   add_sym_1 ("asin", 1, 1, BT_REAL, dr, GFC_STD_F77,
973              gfc_check_fn_r, gfc_simplify_asin, gfc_resolve_asin,
974              x, BT_REAL, dr, REQUIRED);
975
976   add_sym_1 ("dasin", 1, 1, BT_REAL, dd, GFC_STD_F77,
977              NULL, gfc_simplify_asin, gfc_resolve_asin,
978              x, BT_REAL, dd, REQUIRED);
979
980   make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
981
982   add_sym_2 ("associated", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
983              gfc_check_associated, NULL, NULL,
984              pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
985
986   make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
987
988   add_sym_1 ("atan", 1, 1, BT_REAL, dr, GFC_STD_F77,
989              gfc_check_fn_r, gfc_simplify_atan, gfc_resolve_atan,
990              x, BT_REAL, dr, REQUIRED);
991
992   add_sym_1 ("datan", 1, 1, BT_REAL, dd, GFC_STD_F77,
993              NULL, gfc_simplify_atan, gfc_resolve_atan,
994              x, BT_REAL, dd, REQUIRED);
995
996   make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
997
998   add_sym_2 ("atan2", 1, 1, BT_REAL, dr, GFC_STD_F77,
999              gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1000              y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1001
1002   add_sym_2 ("datan2", 1, 1, BT_REAL, dd, GFC_STD_F77,
1003              NULL, gfc_simplify_atan2, gfc_resolve_atan2,
1004              y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1005
1006   make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1007
1008   /* Bessel and Neumann functions for G77 compatibility.  */
1009   add_sym_1 ("besj0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1010              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1011              x, BT_REAL, dr, REQUIRED);
1012
1013   add_sym_1 ("dbesj0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1014              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1015              x, BT_REAL, dd, REQUIRED);
1016
1017   make_generic ("besj0", GFC_ISYM_J0, GFC_STD_GNU);
1018
1019   add_sym_1 ("besj1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1020              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1021              x, BT_REAL, dr, REQUIRED);
1022
1023   add_sym_1 ("dbesj1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1024              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1025              x, BT_REAL, dd, REQUIRED);
1026
1027   make_generic ("besj1", GFC_ISYM_J1, GFC_STD_GNU);
1028
1029   add_sym_2 ("besjn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1030              gfc_check_besn, NULL, gfc_resolve_besn,
1031              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1032
1033   add_sym_2 ("dbesjn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1034              gfc_check_besn, NULL, gfc_resolve_besn,
1035              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1036
1037   make_generic ("besjn", GFC_ISYM_JN, GFC_STD_GNU);
1038
1039   add_sym_1 ("besy0", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1040              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1041              x, BT_REAL, dr, REQUIRED);
1042
1043   add_sym_1 ("dbesy0", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1044              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1045              x, BT_REAL, dd, REQUIRED);
1046
1047   make_generic ("besy0", GFC_ISYM_Y0, GFC_STD_GNU);
1048
1049   add_sym_1 ("besy1", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1050              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1051              x, BT_REAL, dr, REQUIRED);
1052
1053   add_sym_1 ("dbesy1", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1054              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1055              x, BT_REAL, dd, REQUIRED);
1056
1057   make_generic ("besy1", GFC_ISYM_Y1, GFC_STD_GNU);
1058
1059   add_sym_2 ("besyn", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1060              gfc_check_besn, NULL, gfc_resolve_besn,
1061              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1062
1063   add_sym_2 ("dbesyn", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1064              gfc_check_besn, NULL, gfc_resolve_besn,
1065              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1066
1067   make_generic ("besyn", GFC_ISYM_YN, GFC_STD_GNU);
1068
1069   add_sym_1 ("bit_size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1070              gfc_check_i, gfc_simplify_bit_size, NULL,
1071              i, BT_INTEGER, di, REQUIRED);
1072
1073   make_generic ("bit_size", GFC_ISYM_NONE, GFC_STD_F95);
1074
1075   add_sym_2 ("btest", 1, 1, BT_LOGICAL, dl, GFC_STD_F95,
1076              gfc_check_btest, gfc_simplify_btest, gfc_resolve_btest,
1077              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1078
1079   make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1080
1081   add_sym_2 ("ceiling", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1082              gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1083              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1084
1085   make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1086
1087   add_sym_2 ("char", 1, 0, BT_CHARACTER, dc, GFC_STD_F77,
1088              gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1089              i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1090
1091   make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1092
1093   add_sym_3 ("cmplx", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1094              gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1095              x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1096              kind, BT_INTEGER, di, OPTIONAL);
1097
1098   make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1099
1100   /* Making dcmplx a specific of cmplx causes cmplx to return a double
1101      complex instead of the default complex.  */
1102
1103   add_sym_2 ("dcmplx", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1104              gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1105              x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1106
1107   make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1108
1109   add_sym_1 ("conjg", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1110              gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1111              z, BT_COMPLEX, dz, REQUIRED);
1112
1113   add_sym_1 ("dconjg", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1114              NULL, gfc_simplify_conjg, gfc_resolve_conjg, 
1115              z, BT_COMPLEX, dd, REQUIRED);
1116
1117   make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1118
1119   add_sym_1 ("cos", 1, 1, BT_REAL, dr, GFC_STD_F77,
1120              gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1121              x, BT_REAL, dr, REQUIRED);
1122
1123   add_sym_1 ("dcos", 1, 1, BT_REAL, dd, GFC_STD_F77,
1124              gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1125              x, BT_REAL, dd, REQUIRED);
1126
1127   add_sym_1 ("ccos", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1128              NULL, gfc_simplify_cos, gfc_resolve_cos,
1129              x, BT_COMPLEX, dz, REQUIRED);
1130
1131   add_sym_1 ("zcos", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1132              NULL, gfc_simplify_cos, gfc_resolve_cos, 
1133              x, BT_COMPLEX, dd, REQUIRED);
1134
1135   make_alias ("cdcos", GFC_STD_GNU);
1136
1137   make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1138
1139   add_sym_1 ("cosh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1140              gfc_check_fn_r, gfc_simplify_cosh, gfc_resolve_cosh,
1141              x, BT_REAL, dr, REQUIRED);
1142
1143   add_sym_1 ("dcosh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1144              NULL, gfc_simplify_cosh, gfc_resolve_cosh,
1145              x, BT_REAL, dd, REQUIRED);
1146
1147   make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1148
1149   add_sym_2 ("count", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1150              gfc_check_count, NULL, gfc_resolve_count,
1151              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1152
1153   make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1154
1155   add_sym_3 ("cshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1156              gfc_check_cshift, NULL, gfc_resolve_cshift,
1157              ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1158              dm, BT_INTEGER, ii, OPTIONAL);
1159
1160   make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1161
1162   add_sym_1 ("dble", 1, 1, BT_REAL, dd, GFC_STD_F77,
1163              gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1164              a, BT_REAL, dr, REQUIRED);
1165
1166   make_alias ("dfloat", GFC_STD_GNU);
1167
1168   make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1169
1170   add_sym_1 ("digits", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1171              gfc_check_digits, gfc_simplify_digits, NULL,
1172              x, BT_UNKNOWN, dr, REQUIRED);
1173
1174   make_generic ("digits", GFC_ISYM_NONE, GFC_STD_F95);
1175
1176   add_sym_2 ("dim", 1, 1, BT_REAL, dr, GFC_STD_F77,
1177              gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1178              x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1179
1180   add_sym_2 ("idim", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1181              NULL, gfc_simplify_dim, gfc_resolve_dim,
1182              x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1183
1184   add_sym_2 ("ddim", 1, 1, BT_REAL, dd, GFC_STD_F77,
1185              NULL, gfc_simplify_dim, gfc_resolve_dim,
1186              x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1187
1188   make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1189
1190   add_sym_2 ("dot_product", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1191              gfc_check_dot_product, NULL, gfc_resolve_dot_product,
1192              va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1193
1194   make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1195
1196   add_sym_2 ("dprod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1197              NULL, gfc_simplify_dprod, gfc_resolve_dprod,
1198              x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1199
1200   make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1201
1202   add_sym_1 ("dreal", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1203              NULL, NULL, NULL,
1204              a, BT_COMPLEX, dd, REQUIRED);
1205
1206   make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1207
1208   add_sym_4 ("eoshift", 0, 1, BT_REAL, dr, GFC_STD_F95,
1209              gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1210              ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1211              bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1212
1213   make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1214
1215   add_sym_1 ("epsilon", 0, 1, BT_REAL, dr, GFC_STD_F95,
1216              gfc_check_x, gfc_simplify_epsilon, NULL,
1217              x, BT_REAL, dr, REQUIRED);
1218
1219   make_generic ("epsilon", GFC_ISYM_NONE, GFC_STD_F95);
1220
1221   /* G77 compatibility for the ERF() and ERFC() functions.  */
1222   add_sym_1 ("erf", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1223              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1224              x, BT_REAL, dr, REQUIRED);
1225
1226   add_sym_1 ("derf", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1227              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1228              x, BT_REAL, dd, REQUIRED);
1229
1230   make_generic ("erf", GFC_ISYM_ERF, GFC_STD_GNU);
1231
1232   add_sym_1 ("erfc", 1, 0, BT_REAL, dr, GFC_STD_GNU,
1233              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1234              x, BT_REAL, dr, REQUIRED);
1235
1236   add_sym_1 ("derfc", 1, 0, BT_REAL, dd, GFC_STD_GNU,
1237              gfc_check_g77_math1, NULL, gfc_resolve_g77_math1,
1238              x, BT_REAL, dd, REQUIRED);
1239
1240   make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_GNU);
1241
1242   /* G77 compatibility */
1243   add_sym_1 ("etime", 0, 1, BT_REAL, 4,  GFC_STD_GNU,
1244              gfc_check_etime, NULL, NULL,
1245              x, BT_REAL, 4, REQUIRED);
1246
1247   make_alias ("dtime", GFC_STD_GNU);
1248
1249   make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1250
1251   add_sym_1 ("exp", 1, 1, BT_REAL, dr,  GFC_STD_F77,
1252              gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1253              x, BT_REAL, dr, REQUIRED);
1254
1255   add_sym_1 ("dexp", 1, 1, BT_REAL, dd, GFC_STD_F77,
1256              NULL, gfc_simplify_exp, gfc_resolve_exp,
1257              x, BT_REAL, dd, REQUIRED);
1258
1259   add_sym_1 ("cexp", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1260              NULL, gfc_simplify_exp, gfc_resolve_exp,
1261              x, BT_COMPLEX, dz, REQUIRED);
1262
1263   add_sym_1 ("zexp", 1, 1, BT_COMPLEX, dd,  GFC_STD_GNU,
1264              NULL, gfc_simplify_exp, gfc_resolve_exp, 
1265              x, BT_COMPLEX, dd, REQUIRED);
1266
1267   make_alias ("cdexp", GFC_STD_GNU);
1268
1269   make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1270
1271   add_sym_1 ("exponent", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1272              gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1273              x, BT_REAL, dr, REQUIRED);
1274
1275   make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1276
1277   add_sym_2 ("floor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1278              gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1279              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1280
1281   make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1282
1283   /* G77 compatible fnum */
1284   add_sym_1 ("fnum", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1285              gfc_check_fnum, NULL, gfc_resolve_fnum,
1286              ut, BT_INTEGER, di, REQUIRED);
1287
1288   make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1289
1290   add_sym_1 ("fraction", 1, 1, BT_REAL, dr, GFC_STD_F95,
1291              gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1292              x, BT_REAL, dr, REQUIRED);
1293
1294   make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1295
1296   add_sym_2 ("fstat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1297              gfc_check_fstat, NULL, gfc_resolve_fstat,
1298              a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1299
1300   make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1301
1302   /* Unix IDs (g77 compatibility)  */
1303   add_sym_1 ("getcwd", 0, 1, BT_INTEGER, di,  GFC_STD_GNU,
1304              NULL, NULL, gfc_resolve_getcwd,
1305              c, BT_CHARACTER, dc, REQUIRED);
1306
1307   make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1308
1309   add_sym_0 ("getgid", 1, 0, BT_INTEGER, di, GFC_STD_GNU,
1310              NULL, NULL, gfc_resolve_getgid);
1311
1312   make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1313
1314   add_sym_0 ("getpid", 1, 0, BT_INTEGER, di, GFC_STD_GNU, 
1315              NULL, NULL, gfc_resolve_getpid);
1316
1317   make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1318
1319   add_sym_0 ("getuid", 1, 0, BT_INTEGER, di, GFC_STD_GNU, 
1320              NULL, NULL, gfc_resolve_getuid);
1321
1322   make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1323
1324   add_sym_1 ("huge", 0, 1, BT_REAL, dr, GFC_STD_F95,
1325              gfc_check_huge, gfc_simplify_huge, NULL,
1326              x, BT_UNKNOWN, dr, REQUIRED);
1327
1328   make_generic ("huge", GFC_ISYM_NONE, GFC_STD_F95);
1329
1330   add_sym_1 ("iachar", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1331              NULL, gfc_simplify_iachar, NULL,
1332              c, BT_CHARACTER, dc, REQUIRED);
1333
1334   make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1335
1336   add_sym_2 ("iand", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1337              gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1338              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1339
1340   make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1341
1342   add_sym_0 ("iargc", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1343              NULL, NULL, NULL);
1344
1345   make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1346
1347   add_sym_0 ("command_argument_count", 1, 1, BT_INTEGER, di, GFC_STD_F2003,
1348              NULL, NULL, NULL);
1349
1350   make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1351                 GFC_STD_F2003);
1352
1353   add_sym_2 ("ibclr", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1354              gfc_check_ibclr, gfc_simplify_ibclr, gfc_resolve_ibclr,
1355              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1356
1357   make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1358
1359   add_sym_3 ("ibits", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1360              gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1361              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1362              ln, BT_INTEGER, di, REQUIRED);
1363
1364   make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1365
1366   add_sym_2 ("ibset", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1367              gfc_check_ibset, gfc_simplify_ibset, gfc_resolve_ibset,
1368              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1369
1370   make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1371
1372   add_sym_1 ("ichar", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1373              NULL, gfc_simplify_ichar, gfc_resolve_ichar,
1374              c, BT_CHARACTER, dc, REQUIRED);
1375
1376   make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1377
1378   add_sym_2 ("ieor", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1379              gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1380              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1381
1382   make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1383
1384   add_sym_3 ("index", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1385              gfc_check_index, gfc_simplify_index, NULL,
1386              stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1387              bck, BT_LOGICAL, dl, OPTIONAL);
1388
1389   make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1390
1391   add_sym_2 ("int", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1392              gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1393              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1394
1395   add_sym_1 ("ifix", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1396              NULL, gfc_simplify_ifix, NULL,
1397              a, BT_REAL, dr, REQUIRED);
1398
1399   add_sym_1 ("idint", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1400              NULL, gfc_simplify_idint, NULL,
1401              a, BT_REAL, dd, REQUIRED);
1402
1403   make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1404
1405   add_sym_2 ("ior", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1406              gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1407              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1408
1409   make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1410
1411   /* The following function is for G77 compatibility.  */
1412   add_sym_1 ("irand", 0, 1, BT_INTEGER, 4, GFC_STD_GNU,
1413              gfc_check_irand, NULL, NULL,
1414              i, BT_INTEGER, 4, OPTIONAL);
1415
1416   make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1417
1418   add_sym_2 ("ishft", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1419              gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1420              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1421
1422   make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1423
1424   add_sym_3 ("ishftc", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1425              gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1426              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1427              sz, BT_INTEGER, di, OPTIONAL);
1428
1429   make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1430
1431   add_sym_1 ("kind", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1432              gfc_check_kind, gfc_simplify_kind, NULL,
1433              x, BT_REAL, dr, REQUIRED);
1434
1435   make_generic ("kind", GFC_ISYM_NONE, GFC_STD_F95);
1436
1437   add_sym_2 ("lbound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1438              gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1439              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL);
1440
1441   make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1442
1443   add_sym_1 ("len", 0, 1, BT_INTEGER, di, GFC_STD_F77,
1444              NULL, gfc_simplify_len, gfc_resolve_len,
1445              stg, BT_CHARACTER, dc, REQUIRED);
1446
1447   make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1448
1449   add_sym_1 ("len_trim", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1450              NULL, gfc_simplify_len_trim, gfc_resolve_len_trim,
1451              stg, BT_CHARACTER, dc, REQUIRED);
1452
1453   make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1454
1455   add_sym_2 ("lge", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1456              NULL, gfc_simplify_lge, NULL,
1457              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1458
1459   make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1460
1461   add_sym_2 ("lgt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1462              NULL, gfc_simplify_lgt, NULL,
1463              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1464
1465   make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1466
1467   add_sym_2 ("lle", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1468              NULL, gfc_simplify_lle, NULL,
1469              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1470
1471   make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1472
1473   add_sym_2 ("llt", 1, 0, BT_LOGICAL, dl, GFC_STD_F77,
1474              NULL, gfc_simplify_llt, NULL,
1475              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1476
1477   make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1478
1479   add_sym_1 ("log", 1, 1, BT_REAL, dr, GFC_STD_F77,
1480              gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
1481              x, BT_REAL, dr, REQUIRED);
1482
1483   add_sym_1 ("alog", 1, 1, BT_REAL, dr, GFC_STD_F77,
1484              NULL, gfc_simplify_log, gfc_resolve_log,
1485              x, BT_REAL, dr, REQUIRED);
1486
1487   add_sym_1 ("dlog", 1, 1, BT_REAL, dd, GFC_STD_F77,
1488              NULL, gfc_simplify_log, gfc_resolve_log,
1489              x, BT_REAL, dd, REQUIRED);
1490
1491   add_sym_1 ("clog", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1492              NULL, gfc_simplify_log, gfc_resolve_log,
1493              x, BT_COMPLEX, dz, REQUIRED);
1494
1495   add_sym_1 ("zlog", 1, 1, BT_COMPLEX, dd,  GFC_STD_GNU,
1496              NULL, gfc_simplify_log, gfc_resolve_log,
1497              x, BT_COMPLEX, dd, REQUIRED);
1498
1499   make_alias ("cdlog", GFC_STD_GNU);
1500
1501   make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
1502
1503   add_sym_1 ("log10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1504              gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
1505              x, BT_REAL, dr, REQUIRED);
1506
1507   add_sym_1 ("alog10", 1, 1, BT_REAL, dr, GFC_STD_F77,
1508              NULL, gfc_simplify_log10, gfc_resolve_log10,
1509              x, BT_REAL, dr, REQUIRED);
1510
1511   add_sym_1 ("dlog10", 1, 1, BT_REAL, dd, GFC_STD_F77,
1512              NULL, gfc_simplify_log10, gfc_resolve_log10,
1513              x, BT_REAL, dd, REQUIRED);
1514
1515   make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
1516
1517   add_sym_2 ("logical", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1518              gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
1519              l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1520
1521   make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
1522
1523   add_sym_2 ("matmul", 0, 1, BT_REAL, dr, GFC_STD_F95,
1524              gfc_check_matmul, NULL, gfc_resolve_matmul,
1525              ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
1526
1527   make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
1528
1529   /* Note: amax0 is equivalent to real(max), max1 is equivalent to
1530      int(max).  The max function must take at least two arguments.  */
1531
1532   add_sym_1m ("max", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1533              gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
1534              a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
1535
1536   add_sym_1m ("max0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1537              gfc_check_min_max_integer, gfc_simplify_max, NULL,
1538              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1539
1540   add_sym_1m ("amax0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1541              gfc_check_min_max_integer, gfc_simplify_max, NULL,
1542              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1543
1544   add_sym_1m ("amax1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1545              gfc_check_min_max_real, gfc_simplify_max, NULL,
1546              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1547
1548   add_sym_1m ("max1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1549              gfc_check_min_max_real, gfc_simplify_max, NULL,
1550              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1551
1552   add_sym_1m ("dmax1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1553              gfc_check_min_max_double, gfc_simplify_max, NULL,
1554              a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1555
1556   make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
1557
1558   add_sym_1 ("maxexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1559              gfc_check_x, gfc_simplify_maxexponent, NULL,
1560              x, BT_UNKNOWN, dr, REQUIRED);
1561
1562   make_generic ("maxexponent", GFC_ISYM_NONE, GFC_STD_F95);
1563
1564   add_sym_3ml ("maxloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1565                gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
1566                ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1567                msk, BT_LOGICAL, dl, OPTIONAL);
1568
1569   make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
1570
1571   add_sym_3red ("maxval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1572                 gfc_check_minval_maxval, NULL, gfc_resolve_maxval,
1573                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1574                 msk, BT_LOGICAL, dl, OPTIONAL);
1575
1576   make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
1577
1578   add_sym_3 ("merge", 1, 1, BT_REAL, dr, GFC_STD_F95,
1579              gfc_check_merge, NULL, gfc_resolve_merge,
1580              ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
1581              msk, BT_LOGICAL, dl, REQUIRED);
1582
1583   make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
1584
1585   /* Note: amin0 is equivalent to real(min), min1 is equivalent to
1586      int(min).  */
1587
1588   add_sym_1m ("min", 1, 0, BT_UNKNOWN, 0, GFC_STD_F77,
1589               gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
1590              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1591
1592   add_sym_1m ("min0", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1593               gfc_check_min_max_integer, gfc_simplify_min, NULL,
1594              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1595
1596   add_sym_1m ("amin0", 1, 0, BT_REAL, dr, GFC_STD_F77,
1597               gfc_check_min_max_integer, gfc_simplify_min, NULL,
1598              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
1599
1600   add_sym_1m ("amin1", 1, 0, BT_REAL, dr, GFC_STD_F77,
1601               gfc_check_min_max_real, gfc_simplify_min, NULL,
1602              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1603
1604   add_sym_1m ("min1", 1, 0, BT_INTEGER, di, GFC_STD_F77,
1605               gfc_check_min_max_real, gfc_simplify_min, NULL,
1606              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
1607
1608   add_sym_1m ("dmin1", 1, 0, BT_REAL, dd, GFC_STD_F77,
1609               gfc_check_min_max_double, gfc_simplify_min, NULL,
1610              a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
1611
1612   make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
1613
1614   add_sym_1 ("minexponent", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1615              gfc_check_x, gfc_simplify_minexponent, NULL,
1616              x, BT_UNKNOWN, dr, REQUIRED);
1617
1618   make_generic ("minexponent", GFC_ISYM_NONE, GFC_STD_F95);
1619
1620   add_sym_3ml ("minloc", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1621                gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
1622                ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1623                msk, BT_LOGICAL, dl, OPTIONAL);
1624
1625   make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
1626
1627   add_sym_3red ("minval", 0, 1, BT_REAL, dr, GFC_STD_F95,
1628                 gfc_check_minval_maxval, NULL, gfc_resolve_minval,
1629                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1630                 msk, BT_LOGICAL, dl, OPTIONAL);
1631
1632   make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
1633
1634   add_sym_2 ("mod", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1635              gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
1636              a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
1637
1638   add_sym_2 ("amod", 1, 1, BT_REAL, dr, GFC_STD_F77,
1639              NULL, gfc_simplify_mod, gfc_resolve_mod,
1640              a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
1641
1642   add_sym_2 ("dmod", 1, 1, BT_REAL, dd, GFC_STD_F77,
1643              NULL, gfc_simplify_mod, gfc_resolve_mod,
1644              a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
1645
1646   make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
1647
1648   add_sym_2 ("modulo", 1, 1, BT_REAL, di, GFC_STD_F95,
1649              gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
1650              a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
1651
1652   make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
1653
1654   add_sym_2 ("nearest", 1, 1, BT_REAL, dr, GFC_STD_F95,
1655              gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
1656              x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
1657
1658   make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
1659
1660   add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1661              gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
1662              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1663
1664   add_sym_1 ("idnint", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1665              gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
1666              a, BT_REAL, dd, REQUIRED);
1667
1668   make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
1669
1670   add_sym_1 ("not", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1671              gfc_check_i, gfc_simplify_not, gfc_resolve_not,
1672              i, BT_INTEGER, di, REQUIRED);
1673
1674   make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
1675
1676   add_sym_1 ("null", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1677              gfc_check_null, gfc_simplify_null, NULL,
1678              mo, BT_INTEGER, di, OPTIONAL);
1679
1680   make_generic ("null", GFC_ISYM_NONE, GFC_STD_F95);
1681
1682   add_sym_3 ("pack", 0, 1, BT_REAL, dr, GFC_STD_F95,
1683              gfc_check_pack, NULL, gfc_resolve_pack,
1684              ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1685              v, BT_REAL, dr, OPTIONAL);
1686
1687   make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
1688
1689   add_sym_1 ("precision", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1690              gfc_check_precision, gfc_simplify_precision, NULL,
1691              x, BT_UNKNOWN, 0, REQUIRED);
1692
1693   make_generic ("precision", GFC_ISYM_NONE, GFC_STD_F95);
1694
1695   add_sym_1 ("present", 0, 1, BT_LOGICAL, dl, GFC_STD_F95,
1696              gfc_check_present, NULL, NULL,
1697              a, BT_REAL, dr, REQUIRED);
1698
1699   make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
1700
1701   add_sym_3red ("product", 0, 1, BT_REAL, dr, GFC_STD_F95,
1702                 gfc_check_product_sum, NULL, gfc_resolve_product,
1703                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1704                 msk, BT_LOGICAL, dl, OPTIONAL);
1705
1706   make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
1707
1708   add_sym_1 ("radix", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1709              gfc_check_radix, gfc_simplify_radix, NULL,
1710              x, BT_UNKNOWN, 0, REQUIRED);
1711
1712   make_generic ("radix", GFC_ISYM_NONE, GFC_STD_F95);
1713
1714   /* The following function is for G77 compatibility.  */
1715   add_sym_1 ("rand", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1716              gfc_check_rand, NULL, NULL,
1717              i, BT_INTEGER, 4, OPTIONAL);
1718
1719   /* Compatibility with HP FORTRAN 77/iX Reference.  Note, rand() and ran()
1720      use slightly different shoddy multiplicative congruential PRNG.  */
1721   make_alias ("ran", GFC_STD_GNU);
1722
1723   make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
1724
1725   add_sym_1 ("range", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1726              gfc_check_range, gfc_simplify_range, NULL,
1727              x, BT_REAL, dr, REQUIRED);
1728
1729   make_generic ("range", GFC_ISYM_NONE, GFC_STD_F95);
1730
1731   add_sym_2 ("real", 1, 0, BT_REAL, dr, GFC_STD_F77,
1732              gfc_check_real, gfc_simplify_real, gfc_resolve_real,
1733              a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1734
1735   add_sym_1 ("float", 1, 0, BT_REAL, dr, GFC_STD_F77,
1736              NULL, gfc_simplify_float, NULL,
1737              a, BT_INTEGER, di, REQUIRED);
1738
1739   add_sym_1 ("sngl", 1, 0, BT_REAL, dr, GFC_STD_F77,
1740              NULL, gfc_simplify_sngl, NULL,
1741              a, BT_REAL, dd, REQUIRED);
1742
1743   make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
1744
1745   add_sym_2 ("repeat", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
1746              gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
1747              stg, BT_CHARACTER, dc, REQUIRED, n, BT_INTEGER, di, REQUIRED);
1748
1749   make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
1750
1751   add_sym_4 ("reshape", 0, 1, BT_REAL, dr, GFC_STD_F95,
1752              gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
1753              src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
1754              pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
1755
1756   make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
1757
1758   add_sym_1 ("rrspacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1759              gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
1760              x, BT_REAL, dr, REQUIRED);
1761
1762   make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
1763
1764   add_sym_2 ("scale", 1, 1, BT_REAL, dr, GFC_STD_F95,
1765              gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
1766              x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1767
1768   make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
1769
1770   add_sym_3 ("scan", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1771              gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
1772              stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
1773              bck, BT_LOGICAL, dl, OPTIONAL);
1774
1775   make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
1776
1777   /* Added for G77 compatibility garbage.  */
1778   add_sym_0 ("second", 0, 1, BT_REAL, 4, GFC_STD_GNU,
1779              NULL, NULL, NULL);
1780
1781   make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
1782
1783   add_sym_1 ("selected_int_kind", 0, 1, BT_INTEGER, di,  GFC_STD_F95,
1784              gfc_check_selected_int_kind, gfc_simplify_selected_int_kind, NULL,
1785              r, BT_INTEGER, di, REQUIRED);
1786
1787   make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
1788
1789   add_sym_2 ("selected_real_kind", 0, 1, BT_INTEGER, di,  GFC_STD_F95,
1790              gfc_check_selected_real_kind, gfc_simplify_selected_real_kind,
1791              NULL,
1792              p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL);
1793
1794   make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
1795
1796   add_sym_2 ("set_exponent", 1, 1, BT_REAL, dr, GFC_STD_F95,
1797              gfc_check_set_exponent, gfc_simplify_set_exponent,
1798              gfc_resolve_set_exponent,
1799              x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
1800
1801   make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
1802
1803   add_sym_1 ("shape", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1804              gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
1805              src, BT_REAL, dr, REQUIRED);
1806
1807   make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
1808
1809   add_sym_2 ("sign", 1, 1, BT_REAL, dr, GFC_STD_F77,
1810              gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
1811              a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
1812
1813   add_sym_2 ("isign", 1, 1, BT_INTEGER, di, GFC_STD_F77,
1814              NULL, gfc_simplify_sign, gfc_resolve_sign,
1815              a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1816
1817   add_sym_2 ("dsign", 1, 1, BT_REAL, dd, GFC_STD_F77,
1818              NULL, gfc_simplify_sign, gfc_resolve_sign,
1819              a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
1820
1821   make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
1822
1823   add_sym_1 ("sin", 1, 1, BT_REAL, dr, GFC_STD_F77,
1824              gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
1825              x, BT_REAL, dr, REQUIRED);
1826
1827   add_sym_1 ("dsin", 1, 1, BT_REAL, dd, GFC_STD_F77,
1828              NULL, gfc_simplify_sin, gfc_resolve_sin,
1829              x, BT_REAL, dd, REQUIRED);
1830
1831   add_sym_1 ("csin", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1832              NULL, gfc_simplify_sin, gfc_resolve_sin,
1833              x, BT_COMPLEX, dz, REQUIRED);
1834
1835   add_sym_1 ("zsin", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1836              NULL, gfc_simplify_sin, gfc_resolve_sin,
1837              x, BT_COMPLEX, dd, REQUIRED);
1838
1839   make_alias ("cdsin", GFC_STD_GNU);
1840
1841   make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
1842
1843   add_sym_1 ("sinh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1844              gfc_check_fn_r, gfc_simplify_sinh, gfc_resolve_sinh,
1845              x, BT_REAL, dr, REQUIRED);
1846
1847   add_sym_1 ("dsinh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1848              NULL, gfc_simplify_sinh, gfc_resolve_sinh,
1849              x, BT_REAL, dd, REQUIRED);
1850
1851   make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
1852
1853   add_sym_2 ("size", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1854              gfc_check_size, gfc_simplify_size, NULL,
1855              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1856
1857   make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
1858
1859   add_sym_1 ("spacing", 1, 1, BT_REAL, dr, GFC_STD_F95,
1860              gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
1861              x, BT_REAL, dr, REQUIRED);
1862
1863   make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
1864
1865   add_sym_3 ("spread", 0, 1, BT_REAL, dr, GFC_STD_F95,
1866              gfc_check_spread, NULL, gfc_resolve_spread,
1867              src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
1868              n, BT_INTEGER, di, REQUIRED);
1869
1870   make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
1871
1872   add_sym_1 ("sqrt", 1, 1, BT_REAL, dr, GFC_STD_F77,
1873              gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
1874              x, BT_REAL, dr, REQUIRED);
1875
1876   add_sym_1 ("dsqrt", 1, 1, BT_REAL, dd, GFC_STD_F77,
1877              NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1878              x, BT_REAL, dd, REQUIRED);
1879
1880   add_sym_1 ("csqrt", 1, 1, BT_COMPLEX, dz, GFC_STD_F77,
1881              NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1882              x, BT_COMPLEX, dz, REQUIRED);
1883
1884   add_sym_1 ("zsqrt", 1, 1, BT_COMPLEX, dd, GFC_STD_GNU,
1885              NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
1886              x, BT_COMPLEX, dd, REQUIRED);
1887
1888   make_alias ("cdsqrt", GFC_STD_GNU);
1889
1890   make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
1891
1892   add_sym_2 ("stat", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1893              gfc_check_stat, NULL, gfc_resolve_stat,
1894              a, BT_CHARACTER, dc, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1895
1896   make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
1897
1898   add_sym_3red ("sum", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
1899                 gfc_check_product_sum, NULL, gfc_resolve_sum,
1900                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1901                 msk, BT_LOGICAL, dl, OPTIONAL);
1902
1903   make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
1904
1905   add_sym_1 ("system", 1, 1, BT_INTEGER, di, GFC_STD_GNU,
1906              NULL, NULL, NULL,
1907              c, BT_CHARACTER, dc, REQUIRED);
1908
1909   make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
1910
1911   add_sym_1 ("tan", 1, 1, BT_REAL, dr, GFC_STD_F77,
1912              gfc_check_fn_r, gfc_simplify_tan, gfc_resolve_tan,
1913              x, BT_REAL, dr, REQUIRED);
1914
1915   add_sym_1 ("dtan", 1, 1, BT_REAL, dd, GFC_STD_F77,
1916              NULL, gfc_simplify_tan, gfc_resolve_tan,
1917              x, BT_REAL, dd, REQUIRED);
1918
1919   make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
1920
1921   add_sym_1 ("tanh", 1, 1, BT_REAL, dr, GFC_STD_F77,
1922              gfc_check_fn_r, gfc_simplify_tanh, gfc_resolve_tanh,
1923              x, BT_REAL, dr, REQUIRED);
1924
1925   add_sym_1 ("dtanh", 1, 1, BT_REAL, dd, GFC_STD_F77,
1926              NULL, gfc_simplify_tanh, gfc_resolve_tanh,
1927              x, BT_REAL, dd, REQUIRED);
1928
1929   make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
1930
1931   add_sym_1 ("tiny", 0, 1, BT_REAL, dr, GFC_STD_F95,
1932              gfc_check_x, gfc_simplify_tiny, NULL,
1933              x, BT_REAL, dr, REQUIRED);
1934
1935   make_generic ("tiny", GFC_ISYM_NONE, GFC_STD_F95);
1936
1937   add_sym_3 ("transfer", 0, 1, BT_REAL, dr, GFC_STD_F95,
1938              gfc_check_transfer, NULL, gfc_resolve_transfer,
1939              src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
1940              sz, BT_INTEGER, di, OPTIONAL);
1941
1942   make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
1943
1944   add_sym_1 ("transpose", 0, 1, BT_REAL, dr, GFC_STD_F95,
1945              gfc_check_transpose, NULL, gfc_resolve_transpose,
1946              m, BT_REAL, dr, REQUIRED);
1947
1948   make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
1949
1950   add_sym_1 ("trim", 0, 1, BT_CHARACTER, dc, GFC_STD_F95,
1951              gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
1952              stg, BT_CHARACTER, dc, REQUIRED);
1953
1954   make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
1955
1956   add_sym_2 ("ubound", 0, 1, BT_INTEGER, di, GFC_STD_F95,
1957              gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
1958              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1959
1960   make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
1961
1962   /* g77 compatibility for UMASK.  */
1963   add_sym_1 ("umask", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1964              gfc_check_umask, NULL, gfc_resolve_umask,
1965              a, BT_INTEGER, di, REQUIRED);
1966
1967   make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
1968
1969   /* g77 compatibility for UNLINK.  */
1970   add_sym_1 ("unlink", 0, 1, BT_INTEGER, di, GFC_STD_GNU,
1971              gfc_check_unlink, NULL, gfc_resolve_unlink,
1972              a, BT_CHARACTER, dc, REQUIRED);
1973
1974   make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
1975
1976   add_sym_3 ("unpack", 0, 1, BT_REAL, dr, GFC_STD_F95,
1977              gfc_check_unpack, NULL, gfc_resolve_unpack,
1978              v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
1979              f, BT_REAL, dr, REQUIRED);
1980
1981   make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
1982
1983   add_sym_3 ("verify", 1, 1, BT_INTEGER, di, GFC_STD_F95,
1984              gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
1985              stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
1986              bck, BT_LOGICAL, dl, OPTIONAL);
1987
1988   make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
1989 }
1990
1991
1992 /* Add intrinsic subroutines.  */
1993
1994 static void
1995 add_subroutines (void)
1996 {
1997   /* Argument names as in the standard (to be used as argument keywords).  */
1998   const char
1999     *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2000     *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2001     *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2002     *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2003     *com = "command", *length = "length", *st = "status",
2004     *val = "value", *num = "number", *name = "name",
2005     *trim_name = "trim_name", *ut = "unit";
2006
2007   int di, dr, dc, dl;
2008
2009   di = gfc_default_integer_kind;
2010   dr = gfc_default_real_kind;
2011   dc = gfc_default_character_kind;
2012   dl = gfc_default_logical_kind;
2013
2014   add_sym_0s ("abort", 1, GFC_STD_GNU, NULL);
2015
2016   add_sym_1s ("cpu_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2017               gfc_check_cpu_time, NULL, gfc_resolve_cpu_time,
2018               tm, BT_REAL, dr, REQUIRED);
2019
2020   /* More G77 compatibility garbage.  */
2021   add_sym_1s ("second", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2022               gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2023               tm, BT_REAL, dr, REQUIRED);
2024
2025   add_sym_4s ("date_and_time", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2026               gfc_check_date_and_time, NULL, NULL,
2027               dt, BT_CHARACTER, dc, OPTIONAL, tm, BT_CHARACTER, dc, OPTIONAL,
2028               zn, BT_CHARACTER, dc, OPTIONAL, vl, BT_INTEGER, di, OPTIONAL);
2029
2030   /* More G77 compatibility garbage.  */
2031   add_sym_2s ("etime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2032              gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2033               vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2034
2035   add_sym_2s ("dtime", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2036              gfc_check_etime_sub, NULL, gfc_resolve_etime_sub,
2037               vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2038
2039   add_sym_2s ("getcwd", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2040           gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2041               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2042
2043   add_sym_2s ("getenv", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2044               NULL, NULL, NULL,
2045               name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2046
2047   add_sym_2s ("getarg", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2048               NULL, NULL, gfc_resolve_getarg,
2049               c, BT_INTEGER, di, REQUIRED, vl, BT_CHARACTER, dc, REQUIRED);
2050
2051   /* F2003 commandline routines.  */
2052
2053   add_sym_3s ("get_command", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2054               NULL, NULL, gfc_resolve_get_command,
2055               com, BT_CHARACTER, dc, OPTIONAL, length, BT_INTEGER, di, OPTIONAL,
2056               st, BT_INTEGER, di, OPTIONAL);
2057
2058   add_sym_4s ("get_command_argument", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2059               NULL, NULL, gfc_resolve_get_command_argument,
2060               num, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2061               length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL);
2062
2063   /* F2003 subroutine to get environment variables.  */
2064
2065   add_sym_5s ("get_environment_variable", 0, 1, BT_UNKNOWN, 0, GFC_STD_F2003,
2066              NULL, NULL, gfc_resolve_get_environment_variable,
2067               name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc, OPTIONAL,
2068               length, BT_INTEGER, di, OPTIONAL, st, BT_INTEGER, di, OPTIONAL,
2069               trim_name, BT_LOGICAL, dl, OPTIONAL);
2070
2071   add_sym_5s ("mvbits", 1, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2072               gfc_check_mvbits, gfc_simplify_mvbits, gfc_resolve_mvbits,
2073               f, BT_INTEGER, di, REQUIRED, fp, BT_INTEGER, di, REQUIRED,
2074               ln, BT_INTEGER, di, REQUIRED, t, BT_INTEGER, di, REQUIRED,
2075               tp, BT_INTEGER, di, REQUIRED);
2076
2077   add_sym_1s ("random_number", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2078               gfc_check_random_number, NULL, gfc_resolve_random_number,
2079               h, BT_REAL, dr, REQUIRED);
2080
2081   add_sym_3s ("random_seed", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2082              gfc_check_random_seed, NULL, NULL,
2083               sz, BT_INTEGER, di, OPTIONAL, pt, BT_INTEGER, di, OPTIONAL,
2084               gt, BT_INTEGER, di, OPTIONAL);
2085
2086   /* More G77 compatibility garbage.  */
2087   add_sym_1s ("srand", 0, 1, BT_UNKNOWN, di, GFC_STD_GNU,
2088              gfc_check_srand, NULL, gfc_resolve_srand,
2089               c, BT_INTEGER, 4, REQUIRED);
2090
2091   add_sym_1s ("exit", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2092              gfc_check_exit, NULL, gfc_resolve_exit,
2093               c, BT_INTEGER, di, OPTIONAL);
2094
2095   add_sym_1s ("flush", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2096               gfc_check_flush, NULL, gfc_resolve_flush,
2097               c, BT_INTEGER, di, OPTIONAL);
2098
2099   add_sym_3s ("fstat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2100               gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2101               ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2102               st, BT_INTEGER, di, OPTIONAL);
2103
2104   add_sym_3s ("stat", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2105               gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2106               name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2107               st, BT_INTEGER, di, OPTIONAL);
2108
2109   add_sym_2s ("system", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2110               NULL, NULL, gfc_resolve_system_sub,
2111               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2112
2113   add_sym_3s ("system_clock", 0, 1, BT_UNKNOWN, 0, GFC_STD_F95,
2114              gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2115               c, BT_INTEGER, di, OPTIONAL, cr, BT_INTEGER, di, OPTIONAL,
2116               cm, BT_INTEGER, di, OPTIONAL);
2117
2118   add_sym_2s ("umask", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2119           gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2120               val, BT_INTEGER, di, REQUIRED, num, BT_INTEGER, di, OPTIONAL);
2121
2122   add_sym_2s ("unlink", 0, 1, BT_UNKNOWN, 0, GFC_STD_GNU,
2123           gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2124               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2125
2126 }
2127
2128
2129 /* Add a function to the list of conversion symbols.  */
2130
2131 static void
2132 add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
2133           gfc_expr * (*simplify) (gfc_expr *, bt, int))
2134 {
2135
2136   gfc_typespec from, to;
2137   gfc_intrinsic_sym *sym;
2138
2139   if (sizing == SZ_CONVS)
2140     {
2141       nconv++;
2142       return;
2143     }
2144
2145   gfc_clear_ts (&from);
2146   from.type = from_type;
2147   from.kind = from_kind;
2148
2149   gfc_clear_ts (&to);
2150   to.type = to_type;
2151   to.kind = to_kind;
2152
2153   sym = conversion + nconv;
2154
2155   strcpy (sym->name, conv_name (&from, &to));
2156   strcpy (sym->lib_name, sym->name);
2157   sym->simplify.cc = simplify;
2158   sym->elemental = 1;
2159   sym->ts = to;
2160   sym->generic_id = GFC_ISYM_CONVERSION;
2161
2162   nconv++;
2163 }
2164
2165
2166 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2167    functions by looping over the kind tables.  */
2168
2169 static void
2170 add_conversions (void)
2171 {
2172   int i, j;
2173
2174   /* Integer-Integer conversions.  */
2175   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2176     for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2177       {
2178         if (i == j)
2179           continue;
2180
2181         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2182                   BT_INTEGER, gfc_integer_kinds[j].kind, gfc_convert_constant);
2183       }
2184
2185   /* Integer-Real/Complex conversions.  */
2186   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2187     for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2188       {
2189         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2190                   BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2191
2192         add_conv (BT_REAL, gfc_real_kinds[j].kind,
2193                   BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
2194
2195         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
2196                   BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2197
2198         add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
2199                   BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
2200       }
2201
2202   /* Real/Complex - Real/Complex conversions.  */
2203   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
2204     for (j = 0; gfc_real_kinds[j].kind != 0; j++)
2205       {
2206         if (i != j)
2207           {
2208             add_conv (BT_REAL, gfc_real_kinds[i].kind,
2209                       BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2210
2211             add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2212                       BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2213           }
2214
2215         add_conv (BT_REAL, gfc_real_kinds[i].kind,
2216                   BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
2217
2218         add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
2219                   BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
2220       }
2221
2222   /* Logical/Logical kind conversion.  */
2223   for (i = 0; gfc_logical_kinds[i].kind; i++)
2224     for (j = 0; gfc_logical_kinds[j].kind; j++)
2225       {
2226         if (i == j)
2227           continue;
2228
2229         add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
2230                   BT_LOGICAL, gfc_logical_kinds[j].kind, gfc_convert_constant);
2231       }
2232 }
2233
2234
2235 /* Initialize the table of intrinsics.  */
2236 void
2237 gfc_intrinsic_init_1 (void)
2238 {
2239   int i;
2240
2241   nargs = nfunc = nsub = nconv = 0;
2242
2243   /* Create a namespace to hold the resolved intrinsic symbols.  */
2244   gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
2245
2246   sizing = SZ_FUNCS;
2247   add_functions ();
2248   sizing = SZ_SUBS;
2249   add_subroutines ();
2250   sizing = SZ_CONVS;
2251   add_conversions ();
2252
2253   functions = gfc_getmem (sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
2254                           + sizeof (gfc_intrinsic_arg) * nargs);
2255
2256   next_sym = functions;
2257   subroutines = functions + nfunc;
2258
2259   conversion = gfc_getmem (sizeof (gfc_intrinsic_sym) * nconv);
2260
2261   next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
2262
2263   sizing = SZ_NOTHING;
2264   nconv = 0;
2265
2266   add_functions ();
2267   add_subroutines ();
2268   add_conversions ();
2269
2270   /* Set the pure flag.  All intrinsic functions are pure, and
2271      intrinsic subroutines are pure if they are elemental.  */
2272
2273   for (i = 0; i < nfunc; i++)
2274     functions[i].pure = 1;
2275
2276   for (i = 0; i < nsub; i++)
2277     subroutines[i].pure = subroutines[i].elemental;
2278 }
2279
2280
2281 void
2282 gfc_intrinsic_done_1 (void)
2283 {
2284   gfc_free (functions);
2285   gfc_free (conversion);
2286   gfc_free_namespace (gfc_intrinsic_namespace);
2287 }
2288
2289
2290 /******** Subroutines to check intrinsic interfaces ***********/
2291
2292 /* Given a formal argument list, remove any NULL arguments that may
2293    have been left behind by a sort against some formal argument list.  */
2294
2295 static void
2296 remove_nullargs (gfc_actual_arglist ** ap)
2297 {
2298   gfc_actual_arglist *head, *tail, *next;
2299
2300   tail = NULL;
2301
2302   for (head = *ap; head; head = next)
2303     {
2304       next = head->next;
2305
2306       if (head->expr == NULL)
2307         {
2308           head->next = NULL;
2309           gfc_free_actual_arglist (head);
2310         }
2311       else
2312         {
2313           if (tail == NULL)
2314             *ap = head;
2315           else
2316             tail->next = head;
2317
2318           tail = head;
2319           tail->next = NULL;
2320         }
2321     }
2322
2323   if (tail == NULL)
2324     *ap = NULL;
2325 }
2326
2327
2328 /* Given an actual arglist and a formal arglist, sort the actual
2329    arglist so that its arguments are in a one-to-one correspondence
2330    with the format arglist.  Arguments that are not present are given
2331    a blank gfc_actual_arglist structure.  If something is obviously
2332    wrong (say, a missing required argument) we abort sorting and
2333    return FAILURE.  */
2334
2335 static try
2336 sort_actual (const char *name, gfc_actual_arglist ** ap,
2337              gfc_intrinsic_arg * formal, locus * where)
2338 {
2339
2340   gfc_actual_arglist *actual, *a;
2341   gfc_intrinsic_arg *f;
2342
2343   remove_nullargs (ap);
2344   actual = *ap;
2345
2346   for (f = formal; f; f = f->next)
2347     f->actual = NULL;
2348
2349   f = formal;
2350   a = actual;
2351
2352   if (f == NULL && a == NULL)   /* No arguments */
2353     return SUCCESS;
2354
2355   for (;;)
2356     {                           /* Put the nonkeyword arguments in a 1:1 correspondence */
2357       if (f == NULL)
2358         break;
2359       if (a == NULL)
2360         goto optional;
2361
2362       if (a->name[0] != '\0')
2363         goto keywords;
2364
2365       f->actual = a;
2366
2367       f = f->next;
2368       a = a->next;
2369     }
2370
2371   if (a == NULL)
2372     goto do_sort;
2373
2374   gfc_error ("Too many arguments in call to '%s' at %L", name, where);
2375   return FAILURE;
2376
2377 keywords:
2378   /* Associate the remaining actual arguments, all of which have
2379      to be keyword arguments.  */
2380   for (; a; a = a->next)
2381     {
2382       for (f = formal; f; f = f->next)
2383         if (strcmp (a->name, f->name) == 0)
2384           break;
2385
2386       if (f == NULL)
2387         {
2388           gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
2389                      a->name, name, where);
2390           return FAILURE;
2391         }
2392
2393       if (f->actual != NULL)
2394         {
2395           gfc_error ("Argument '%s' is appears twice in call to '%s' at %L",
2396                      f->name, name, where);
2397           return FAILURE;
2398         }
2399
2400       f->actual = a;
2401     }
2402
2403 optional:
2404   /* At this point, all unmatched formal args must be optional.  */
2405   for (f = formal; f; f = f->next)
2406     {
2407       if (f->actual == NULL && f->optional == 0)
2408         {
2409           gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
2410                      f->name, name, where);
2411           return FAILURE;
2412         }
2413     }
2414
2415 do_sort:
2416   /* Using the formal argument list, string the actual argument list
2417      together in a way that corresponds with the formal list.  */
2418   actual = NULL;
2419
2420   for (f = formal; f; f = f->next)
2421     {
2422       if (f->actual == NULL)
2423         {
2424           a = gfc_get_actual_arglist ();
2425           a->missing_arg_type = f->ts.type;
2426         }
2427       else
2428         a = f->actual;
2429
2430       if (actual == NULL)
2431         *ap = a;
2432       else
2433         actual->next = a;
2434
2435       actual = a;
2436     }
2437   actual->next = NULL;          /* End the sorted argument list.  */
2438
2439   return SUCCESS;
2440 }
2441
2442
2443 /* Compare an actual argument list with an intrinsic's formal argument
2444    list.  The lists are checked for agreement of type.  We don't check
2445    for arrayness here.  */
2446
2447 static try
2448 check_arglist (gfc_actual_arglist ** ap, gfc_intrinsic_sym * sym,
2449                int error_flag)
2450 {
2451   gfc_actual_arglist *actual;
2452   gfc_intrinsic_arg *formal;
2453   int i;
2454
2455   formal = sym->formal;
2456   actual = *ap;
2457
2458   i = 0;
2459   for (; formal; formal = formal->next, actual = actual->next, i++)
2460     {
2461       if (actual->expr == NULL)
2462         continue;
2463
2464       if (!gfc_compare_types (&formal->ts, &actual->expr->ts))
2465         {
2466           if (error_flag)
2467             gfc_error
2468               ("Type of argument '%s' in call to '%s' at %L should be "
2469                "%s, not %s", gfc_current_intrinsic_arg[i],
2470                gfc_current_intrinsic, &actual->expr->where,
2471                gfc_typename (&formal->ts), gfc_typename (&actual->expr->ts));
2472           return FAILURE;
2473         }
2474     }
2475
2476   return SUCCESS;
2477 }
2478
2479
2480 /* Given a pointer to an intrinsic symbol and an expression node that
2481    represent the function call to that subroutine, figure out the type
2482    of the result.  This may involve calling a resolution subroutine.  */
2483
2484 static void
2485 resolve_intrinsic (gfc_intrinsic_sym * specific, gfc_expr * e)
2486 {
2487   gfc_expr *a1, *a2, *a3, *a4, *a5;
2488   gfc_actual_arglist *arg;
2489
2490   if (specific->resolve.f1 == NULL)
2491     {
2492       if (e->value.function.name == NULL)
2493         e->value.function.name = specific->lib_name;
2494
2495       if (e->ts.type == BT_UNKNOWN)
2496         e->ts = specific->ts;
2497       return;
2498     }
2499
2500   arg = e->value.function.actual;
2501
2502   /* Special case hacks for MIN and MAX.  */
2503   if (specific->resolve.f1m == gfc_resolve_max
2504       || specific->resolve.f1m == gfc_resolve_min)
2505     {
2506       (*specific->resolve.f1m) (e, arg);
2507       return;
2508     }
2509
2510   if (arg == NULL)
2511     {
2512       (*specific->resolve.f0) (e);
2513       return;
2514     }
2515
2516   a1 = arg->expr;
2517   arg = arg->next;
2518
2519   if (arg == NULL)
2520     {
2521       (*specific->resolve.f1) (e, a1);
2522       return;
2523     }
2524
2525   a2 = arg->expr;
2526   arg = arg->next;
2527
2528   if (arg == NULL)
2529     {
2530       (*specific->resolve.f2) (e, a1, a2);
2531       return;
2532     }
2533
2534   a3 = arg->expr;
2535   arg = arg->next;
2536
2537   if (arg == NULL)
2538     {
2539       (*specific->resolve.f3) (e, a1, a2, a3);
2540       return;
2541     }
2542
2543   a4 = arg->expr;
2544   arg = arg->next;
2545
2546   if (arg == NULL)
2547     {
2548       (*specific->resolve.f4) (e, a1, a2, a3, a4);
2549       return;
2550     }
2551
2552   a5 = arg->expr;
2553   arg = arg->next;
2554
2555   if (arg == NULL)
2556     {
2557       (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
2558       return;
2559     }
2560
2561   gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
2562 }
2563
2564
2565 /* Given an intrinsic symbol node and an expression node, call the
2566    simplification function (if there is one), perhaps replacing the
2567    expression with something simpler.  We return FAILURE on an error
2568    of the simplification, SUCCESS if the simplification worked, even
2569    if nothing has changed in the expression itself.  */
2570
2571 static try
2572 do_simplify (gfc_intrinsic_sym * specific, gfc_expr * e)
2573 {
2574   gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
2575   gfc_actual_arglist *arg;
2576
2577   /* Max and min require special handling due to the variable number
2578      of args.  */
2579   if (specific->simplify.f1 == gfc_simplify_min)
2580     {
2581       result = gfc_simplify_min (e);
2582       goto finish;
2583     }
2584
2585   if (specific->simplify.f1 == gfc_simplify_max)
2586     {
2587       result = gfc_simplify_max (e);
2588       goto finish;
2589     }
2590
2591   if (specific->simplify.f1 == NULL)
2592     {
2593       result = NULL;
2594       goto finish;
2595     }
2596
2597   arg = e->value.function.actual;
2598
2599   if (arg == NULL)
2600     {
2601       result = (*specific->simplify.f0) ();
2602       goto finish;
2603     }
2604
2605   a1 = arg->expr;
2606   arg = arg->next;
2607
2608   if (specific->simplify.cc == gfc_convert_constant)
2609     {
2610       result = gfc_convert_constant (a1, specific->ts.type, specific->ts.kind);
2611       goto finish;
2612     }
2613
2614   /* TODO: Warn if -pedantic and initialization expression and arg
2615      types not integer or character */
2616
2617   if (arg == NULL)
2618     result = (*specific->simplify.f1) (a1);
2619   else
2620     {
2621       a2 = arg->expr;
2622       arg = arg->next;
2623
2624       if (arg == NULL)
2625         result = (*specific->simplify.f2) (a1, a2);
2626       else
2627         {
2628           a3 = arg->expr;
2629           arg = arg->next;
2630
2631           if (arg == NULL)
2632             result = (*specific->simplify.f3) (a1, a2, a3);
2633           else
2634             {
2635               a4 = arg->expr;
2636               arg = arg->next;
2637
2638               if (arg == NULL)
2639                 result = (*specific->simplify.f4) (a1, a2, a3, a4);
2640               else
2641                 {
2642                   a5 = arg->expr;
2643                   arg = arg->next;
2644
2645                   if (arg == NULL)
2646                     result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
2647                   else
2648                     gfc_internal_error
2649                       ("do_simplify(): Too many args for intrinsic");
2650                 }
2651             }
2652         }
2653     }
2654
2655 finish:
2656   if (result == &gfc_bad_expr)
2657     return FAILURE;
2658
2659   if (result == NULL)
2660     resolve_intrinsic (specific, e);    /* Must call at run-time */
2661   else
2662     {
2663       result->where = e->where;
2664       gfc_replace_expr (e, result);
2665     }
2666
2667   return SUCCESS;
2668 }
2669
2670
2671 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
2672    error messages.  This subroutine returns FAILURE if a subroutine
2673    has more than MAX_INTRINSIC_ARGS, in which case the actual argument
2674    list cannot match any intrinsic.  */
2675
2676 static void
2677 init_arglist (gfc_intrinsic_sym * isym)
2678 {
2679   gfc_intrinsic_arg *formal;
2680   int i;
2681
2682   gfc_current_intrinsic = isym->name;
2683
2684   i = 0;
2685   for (formal = isym->formal; formal; formal = formal->next)
2686     {
2687       if (i >= MAX_INTRINSIC_ARGS)
2688         gfc_internal_error ("init_arglist(): too many arguments");
2689       gfc_current_intrinsic_arg[i++] = formal->name;
2690     }
2691 }
2692
2693
2694 /* Given a pointer to an intrinsic symbol and an expression consisting
2695    of a function call, see if the function call is consistent with the
2696    intrinsic's formal argument list.  Return SUCCESS if the expression
2697    and intrinsic match, FAILURE otherwise.  */
2698
2699 static try
2700 check_specific (gfc_intrinsic_sym * specific, gfc_expr * expr, int error_flag)
2701 {
2702   gfc_actual_arglist *arg, **ap;
2703   int r;
2704   try t;
2705
2706   ap = &expr->value.function.actual;
2707
2708   init_arglist (specific);
2709
2710   /* Don't attempt to sort the argument list for min or max.  */
2711   if (specific->check.f1m == gfc_check_min_max
2712       || specific->check.f1m == gfc_check_min_max_integer
2713       || specific->check.f1m == gfc_check_min_max_real
2714       || specific->check.f1m == gfc_check_min_max_double)
2715     return (*specific->check.f1m) (*ap);
2716
2717   if (sort_actual (specific->name, ap, specific->formal,
2718                    &expr->where) == FAILURE)
2719     return FAILURE;
2720
2721   if (specific->check.f3ml == gfc_check_minloc_maxloc)
2722     /* This is special because we might have to reorder the argument
2723        list.  */
2724     t = gfc_check_minloc_maxloc (*ap);
2725   else if (specific->check.f3red == gfc_check_minval_maxval)
2726     /* This is also special because we also might have to reorder the
2727        argument list.  */
2728     t = gfc_check_minval_maxval (*ap);
2729   else if (specific->check.f3red == gfc_check_product_sum)
2730     /* Same here. The difference to the previous case is that we allow a
2731        general numeric type.  */
2732     t = gfc_check_product_sum (*ap);
2733   else
2734      {
2735        if (specific->check.f1 == NULL)
2736          {
2737            t = check_arglist (ap, specific, error_flag);
2738            if (t == SUCCESS)
2739              expr->ts = specific->ts;
2740          }
2741        else
2742          t = do_check (specific, *ap);
2743      }
2744
2745   /* Check ranks for elemental intrinsics.  */
2746   if (t == SUCCESS && specific->elemental)
2747     {
2748       r = 0;
2749       for (arg = expr->value.function.actual; arg; arg = arg->next)
2750         {
2751           if (arg->expr == NULL || arg->expr->rank == 0)
2752             continue;
2753           if (r == 0)
2754             {
2755               r = arg->expr->rank;
2756               continue;
2757             }
2758
2759           if (arg->expr->rank != r)
2760             {
2761               gfc_error
2762                 ("Ranks of arguments to elemental intrinsic '%s' differ "
2763                  "at %L", specific->name, &arg->expr->where);
2764               return FAILURE;
2765             }
2766         }
2767     }
2768
2769   if (t == FAILURE)
2770     remove_nullargs (ap);
2771
2772   return t;
2773 }
2774
2775
2776 /* See if an intrinsic is one of the intrinsics we evaluate
2777    as an extension.  */
2778
2779 static int
2780 gfc_init_expr_extensions (gfc_intrinsic_sym *isym)
2781 {
2782   /* FIXME: This should be moved into the intrinsic definitions.  */
2783   static const char * const init_expr_extensions[] = {
2784     "digits", "epsilon", "huge", "kind", "maxexponent", "minexponent",
2785     "precision", "present", "radix", "range", "selected_real_kind",
2786     "tiny", NULL
2787   };
2788
2789   int i;
2790
2791   for (i = 0; init_expr_extensions[i]; i++)
2792     if (strcmp (init_expr_extensions[i], isym->name) == 0)
2793       return 0;
2794
2795   return 1;
2796 }
2797
2798
2799 /* Check whether an intrinsic belongs to whatever standard the user
2800    has chosen.  */
2801
2802 static void
2803 check_intrinsic_standard (const char *name, int standard, locus * where)
2804 {
2805   if (!gfc_option.warn_nonstd_intrinsics)
2806     return;
2807
2808   gfc_notify_std (standard, "Intrinsic '%s' at %L is not included"
2809                   "in the selected standard", name, where);
2810 }
2811
2812
2813 /* See if a function call corresponds to an intrinsic function call.
2814    We return:
2815
2816     MATCH_YES    if the call corresponds to an intrinsic, simplification
2817                  is done if possible.
2818
2819     MATCH_NO     if the call does not correspond to an intrinsic
2820
2821     MATCH_ERROR  if the call corresponds to an intrinsic but there was an
2822                  error during the simplification process.
2823
2824    The error_flag parameter enables an error reporting.  */
2825
2826 match
2827 gfc_intrinsic_func_interface (gfc_expr * expr, int error_flag)
2828 {
2829   gfc_intrinsic_sym *isym, *specific;
2830   gfc_actual_arglist *actual;
2831   const char *name;
2832   int flag;
2833
2834   if (expr->value.function.isym != NULL)
2835     return (do_simplify (expr->value.function.isym, expr) == FAILURE)
2836       ? MATCH_ERROR : MATCH_YES;
2837
2838   gfc_suppress_error = !error_flag;
2839   flag = 0;
2840
2841   for (actual = expr->value.function.actual; actual; actual = actual->next)
2842     if (actual->expr != NULL)
2843       flag |= (actual->expr->ts.type != BT_INTEGER
2844                && actual->expr->ts.type != BT_CHARACTER);
2845
2846   name = expr->symtree->n.sym->name;
2847
2848   isym = specific = gfc_find_function (name);
2849   if (isym == NULL)
2850     {
2851       gfc_suppress_error = 0;
2852       return MATCH_NO;
2853     }
2854
2855   gfc_current_intrinsic_where = &expr->where;
2856
2857   /* Bypass the generic list for min and max.  */
2858   if (isym->check.f1m == gfc_check_min_max)
2859     {
2860       init_arglist (isym);
2861
2862       if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
2863         goto got_specific;
2864
2865       gfc_suppress_error = 0;
2866       return MATCH_NO;
2867     }
2868
2869   /* If the function is generic, check all of its specific
2870      incarnations.  If the generic name is also a specific, we check
2871      that name last, so that any error message will correspond to the
2872      specific.  */
2873   gfc_suppress_error = 1;
2874
2875   if (isym->generic)
2876     {
2877       for (specific = isym->specific_head; specific;
2878            specific = specific->next)
2879         {
2880           if (specific == isym)
2881             continue;
2882           if (check_specific (specific, expr, 0) == SUCCESS)
2883             goto got_specific;
2884         }
2885     }
2886
2887   gfc_suppress_error = !error_flag;
2888
2889   if (check_specific (isym, expr, error_flag) == FAILURE)
2890     {
2891       gfc_suppress_error = 0;
2892       return MATCH_NO;
2893     }
2894
2895   specific = isym;
2896
2897 got_specific:
2898   expr->value.function.isym = specific;
2899   gfc_intrinsic_symbol (expr->symtree->n.sym);
2900
2901   if (do_simplify (specific, expr) == FAILURE)
2902     {
2903       gfc_suppress_error = 0;
2904       return MATCH_ERROR;
2905     }
2906
2907   /* TODO: We should probably only allow elemental functions here.  */
2908   flag |= (expr->ts.type != BT_INTEGER && expr->ts.type != BT_CHARACTER);
2909
2910   gfc_suppress_error = 0;
2911   if (pedantic && gfc_init_expr
2912       && flag && gfc_init_expr_extensions (specific))
2913     {
2914       if (gfc_notify_std (GFC_STD_GNU, "Extension: Evaluation of "
2915             "nonstandard initialization expression at %L", &expr->where)
2916           == FAILURE)
2917         {
2918           return MATCH_ERROR;
2919         }
2920     }
2921
2922   check_intrinsic_standard (name, isym->standard, &expr->where);
2923
2924   return MATCH_YES;
2925 }
2926
2927
2928 /* See if a CALL statement corresponds to an intrinsic subroutine.
2929    Returns MATCH_YES if the subroutine corresponds to an intrinsic,
2930    MATCH_NO if not, and MATCH_ERROR if there was an error (but did
2931    correspond).  */
2932
2933 match
2934 gfc_intrinsic_sub_interface (gfc_code * c, int error_flag)
2935 {
2936   gfc_intrinsic_sym *isym;
2937   const char *name;
2938
2939   name = c->symtree->n.sym->name;
2940
2941   isym = find_subroutine (name);
2942   if (isym == NULL)
2943     return MATCH_NO;
2944
2945   gfc_suppress_error = !error_flag;
2946
2947   init_arglist (isym);
2948
2949   if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
2950     goto fail;
2951
2952   if (isym->check.f1 != NULL)
2953     {
2954       if (do_check (isym, c->ext.actual) == FAILURE)
2955         goto fail;
2956     }
2957   else
2958     {
2959       if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
2960         goto fail;
2961     }
2962
2963   /* The subroutine corresponds to an intrinsic.  Allow errors to be
2964      seen at this point.  */
2965   gfc_suppress_error = 0;
2966
2967   if (isym->resolve.s1 != NULL)
2968     isym->resolve.s1 (c);
2969   else
2970     c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
2971
2972   if (gfc_pure (NULL) && !isym->elemental)
2973     {
2974       gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
2975                  &c->loc);
2976       return MATCH_ERROR;
2977     }
2978
2979   check_intrinsic_standard (name, isym->standard, &c->loc);
2980
2981   return MATCH_YES;
2982
2983 fail:
2984   gfc_suppress_error = 0;
2985   return MATCH_NO;
2986 }
2987
2988
2989 /* Call gfc_convert_type() with warning enabled.  */
2990
2991 try
2992 gfc_convert_type (gfc_expr * expr, gfc_typespec * ts, int eflag)
2993 {
2994   return gfc_convert_type_warn (expr, ts, eflag, 1);
2995 }
2996
2997
2998 /* Try to convert an expression (in place) from one type to another.
2999    'eflag' controls the behavior on error.
3000
3001    The possible values are:
3002
3003      1 Generate a gfc_error()
3004      2 Generate a gfc_internal_error().
3005
3006    'wflag' controls the warning related to conversion.  */
3007
3008 try
3009 gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
3010                        int wflag)
3011 {
3012   gfc_intrinsic_sym *sym;
3013   gfc_typespec from_ts;
3014   locus old_where;
3015   gfc_expr *new;
3016   int rank;
3017   mpz_t *shape;
3018
3019   from_ts = expr->ts;           /* expr->ts gets clobbered */
3020
3021   if (ts->type == BT_UNKNOWN)
3022     goto bad;
3023
3024   /* NULL and zero size arrays get their type here.  */
3025   if (expr->expr_type == EXPR_NULL
3026       || (expr->expr_type == EXPR_ARRAY
3027           && expr->value.constructor == NULL))
3028     {
3029       /* Sometimes the RHS acquire the type.  */
3030       expr->ts = *ts;
3031       return SUCCESS;
3032     }
3033
3034   if (expr->ts.type == BT_UNKNOWN)
3035     goto bad;
3036
3037   if (expr->ts.type == BT_DERIVED
3038       && ts->type == BT_DERIVED
3039       && gfc_compare_types (&expr->ts, ts))
3040     return SUCCESS;
3041
3042   sym = find_conv (&expr->ts, ts);
3043   if (sym == NULL)
3044     goto bad;
3045
3046   /* At this point, a conversion is necessary. A warning may be needed.  */
3047   if (wflag && gfc_option.warn_conversion)
3048     gfc_warning_now ("Conversion from %s to %s at %L",
3049                      gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3050
3051   /* Insert a pre-resolved function call to the right function.  */
3052   old_where = expr->where;
3053   rank = expr->rank;
3054   shape = expr->shape;
3055
3056   new = gfc_get_expr ();
3057   *new = *expr;
3058
3059   new = gfc_build_conversion (new);
3060   new->value.function.name = sym->lib_name;
3061   new->value.function.isym = sym;
3062   new->where = old_where;
3063   new->rank = rank;
3064   new->shape = gfc_copy_shape (shape, rank);
3065
3066   *expr = *new;
3067
3068   gfc_free (new);
3069   expr->ts = *ts;
3070
3071   if (gfc_is_constant_expr (expr->value.function.actual->expr)
3072       && do_simplify (sym, expr) == FAILURE)
3073     {
3074
3075       if (eflag == 2)
3076         goto bad;
3077       return FAILURE;           /* Error already generated in do_simplify() */
3078     }
3079
3080   return SUCCESS;
3081
3082 bad:
3083   if (eflag == 1)
3084     {
3085       gfc_error ("Can't convert %s to %s at %L",
3086                  gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
3087       return FAILURE;
3088     }
3089
3090   gfc_internal_error ("Can't convert %s to %s at %L",
3091                       gfc_typename (&from_ts), gfc_typename (ts),
3092                       &expr->where);
3093   /* Not reached */
3094 }