OSDN Git Service

2010-08-02 Mikael Morin <mikael@gcc.gnu.org>
[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, 2006, 2007, 2008,
4    2009, 2010
5    Free Software Foundation, Inc.
6    Contributed by Andy Vaught & Katherine Holcomb
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "flags.h"
27 #include "gfortran.h"
28 #include "intrinsic.h"
29
30 /* Namespace to hold the resolved symbols for intrinsic subroutines.  */
31 static gfc_namespace *gfc_intrinsic_namespace;
32
33 bool gfc_init_expr_flag = false;
34
35 /* Pointers to an intrinsic function and its argument names that are being
36    checked.  */
37
38 const char *gfc_current_intrinsic;
39 const char *gfc_current_intrinsic_arg[MAX_INTRINSIC_ARGS];
40 locus *gfc_current_intrinsic_where;
41
42 static gfc_intrinsic_sym *functions, *subroutines, *conversion, *next_sym;
43 static gfc_intrinsic_sym *char_conversions;
44 static gfc_intrinsic_arg *next_arg;
45
46 static int nfunc, nsub, nargs, nconv, ncharconv;
47
48 static enum
49 { SZ_NOTHING = 0, SZ_SUBS, SZ_FUNCS, SZ_CONVS }
50 sizing;
51
52 enum klass
53 { NO_CLASS = 0, CLASS_ELEMENTAL, CLASS_INQUIRY, CLASS_TRANSFORMATIONAL };
54
55 #define ACTUAL_NO       0
56 #define ACTUAL_YES      1
57
58 #define REQUIRED        0
59 #define OPTIONAL        1
60
61
62 /* Return a letter based on the passed type.  Used to construct the
63    name of a type-dependent subroutine.  */
64
65 char
66 gfc_type_letter (bt type)
67 {
68   char c;
69
70   switch (type)
71     {
72     case BT_LOGICAL:
73       c = 'l';
74       break;
75     case BT_CHARACTER:
76       c = 's';
77       break;
78     case BT_INTEGER:
79       c = 'i';
80       break;
81     case BT_REAL:
82       c = 'r';
83       break;
84     case BT_COMPLEX:
85       c = 'c';
86       break;
87
88     case BT_HOLLERITH:
89       c = 'h';
90       break;
91
92     default:
93       c = 'u';
94       break;
95     }
96
97   return c;
98 }
99
100
101 /* Get a symbol for a resolved name. Note, if needed be, the elemental
102    attribute has be added afterwards.  */
103
104 gfc_symbol *
105 gfc_get_intrinsic_sub_symbol (const char *name)
106 {
107   gfc_symbol *sym;
108
109   gfc_get_symbol (name, gfc_intrinsic_namespace, &sym);
110   sym->attr.always_explicit = 1;
111   sym->attr.subroutine = 1;
112   sym->attr.flavor = FL_PROCEDURE;
113   sym->attr.proc = PROC_INTRINSIC;
114
115   gfc_commit_symbol (sym);
116
117   return sym;
118 }
119
120
121 /* Return a pointer to the name of a conversion function given two
122    typespecs.  */
123
124 static const char *
125 conv_name (gfc_typespec *from, gfc_typespec *to)
126 {
127   return gfc_get_string ("__convert_%c%d_%c%d",
128                          gfc_type_letter (from->type), from->kind,
129                          gfc_type_letter (to->type), to->kind);
130 }
131
132
133 /* Given a pair of typespecs, find the gfc_intrinsic_sym node that
134    corresponds to the conversion.  Returns NULL if the conversion
135    isn't found.  */
136
137 static gfc_intrinsic_sym *
138 find_conv (gfc_typespec *from, gfc_typespec *to)
139 {
140   gfc_intrinsic_sym *sym;
141   const char *target;
142   int i;
143
144   target = conv_name (from, to);
145   sym = conversion;
146
147   for (i = 0; i < nconv; i++, sym++)
148     if (target == sym->name)
149       return sym;
150
151   return NULL;
152 }
153
154
155 /* Given a pair of CHARACTER typespecs, find the gfc_intrinsic_sym node
156    that corresponds to the conversion.  Returns NULL if the conversion
157    isn't found.  */
158
159 static gfc_intrinsic_sym *
160 find_char_conv (gfc_typespec *from, gfc_typespec *to)
161 {
162   gfc_intrinsic_sym *sym;
163   const char *target;
164   int i;
165
166   target = conv_name (from, to);
167   sym = char_conversions;
168
169   for (i = 0; i < ncharconv; i++, sym++)
170     if (target == sym->name)
171       return sym;
172
173   return NULL;
174 }
175
176
177 /* Interface to the check functions.  We break apart an argument list
178    and call the proper check function rather than forcing each
179    function to manipulate the argument list.  */
180
181 static gfc_try
182 do_check (gfc_intrinsic_sym *specific, gfc_actual_arglist *arg)
183 {
184   gfc_expr *a1, *a2, *a3, *a4, *a5;
185
186   if (arg == NULL)
187     return (*specific->check.f0) ();
188
189   a1 = arg->expr;
190   arg = arg->next;
191   if (arg == NULL)
192     return (*specific->check.f1) (a1);
193
194   a2 = arg->expr;
195   arg = arg->next;
196   if (arg == NULL)
197     return (*specific->check.f2) (a1, a2);
198
199   a3 = arg->expr;
200   arg = arg->next;
201   if (arg == NULL)
202     return (*specific->check.f3) (a1, a2, a3);
203
204   a4 = arg->expr;
205   arg = arg->next;
206   if (arg == NULL)
207     return (*specific->check.f4) (a1, a2, a3, a4);
208
209   a5 = arg->expr;
210   arg = arg->next;
211   if (arg == NULL)
212     return (*specific->check.f5) (a1, a2, a3, a4, a5);
213
214   gfc_internal_error ("do_check(): too many args");
215 }
216
217
218 /*********** Subroutines to build the intrinsic list ****************/
219
220 /* Add a single intrinsic symbol to the current list.
221
222    Argument list:
223       char *     name of function
224       int       whether function is elemental
225       int       If the function can be used as an actual argument [1]
226       bt         return type of function
227       int       kind of return type of function
228       int       Fortran standard version
229       check      pointer to check function
230       simplify   pointer to simplification function
231       resolve    pointer to resolution function
232
233    Optional arguments come in multiples of five:
234       char *      name of argument
235       bt          type of argument
236       int         kind of argument
237       int         arg optional flag (1=optional, 0=required)
238       sym_intent  intent of argument
239
240    The sequence is terminated by a NULL name.
241
242
243  [1] Whether a function can or cannot be used as an actual argument is
244      determined by its presence on the 13.6 list in Fortran 2003.  The
245      following intrinsics, which are GNU extensions, are considered allowed
246      as actual arguments: ACOSH ATANH DACOSH DASINH DATANH DCONJG DIMAG
247      ZABS ZCOS ZEXP ZLOG ZSIN ZSQRT.  */
248
249 static void
250 add_sym (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type, int kind,
251          int standard, gfc_check_f check, gfc_simplify_f simplify,
252          gfc_resolve_f resolve, ...)
253 {
254   char buf[GFC_MAX_SYMBOL_LEN + 11]; /* 10 for '_gfortran_', 1 for '\0'  */
255   int optional, first_flag;
256   sym_intent intent;
257   va_list argp;
258
259   switch (sizing)
260     {
261     case SZ_SUBS:
262       nsub++;
263       break;
264
265     case SZ_FUNCS:
266       nfunc++;
267       break;
268
269     case SZ_NOTHING:
270       next_sym->name = gfc_get_string (name);
271
272       strcpy (buf, "_gfortran_");
273       strcat (buf, name);
274       next_sym->lib_name = gfc_get_string (buf);
275
276       next_sym->elemental = (cl == CLASS_ELEMENTAL);
277       next_sym->inquiry = (cl == CLASS_INQUIRY);
278       next_sym->transformational = (cl == CLASS_TRANSFORMATIONAL);
279       next_sym->actual_ok = actual_ok;
280       next_sym->ts.type = type;
281       next_sym->ts.kind = kind;
282       next_sym->standard = standard;
283       next_sym->simplify = simplify;
284       next_sym->check = check;
285       next_sym->resolve = resolve;
286       next_sym->specific = 0;
287       next_sym->generic = 0;
288       next_sym->conversion = 0;
289       next_sym->id = id;
290       break;
291
292     default:
293       gfc_internal_error ("add_sym(): Bad sizing mode");
294     }
295
296   va_start (argp, resolve);
297
298   first_flag = 1;
299
300   for (;;)
301     {
302       name = va_arg (argp, char *);
303       if (name == NULL)
304         break;
305
306       type = (bt) va_arg (argp, int);
307       kind = va_arg (argp, int);
308       optional = va_arg (argp, int);
309       intent = (sym_intent) va_arg (argp, int);
310
311       if (sizing != SZ_NOTHING)
312         nargs++;
313       else
314         {
315           next_arg++;
316
317           if (first_flag)
318             next_sym->formal = next_arg;
319           else
320             (next_arg - 1)->next = next_arg;
321
322           first_flag = 0;
323
324           strcpy (next_arg->name, name);
325           next_arg->ts.type = type;
326           next_arg->ts.kind = kind;
327           next_arg->optional = optional;
328           next_arg->intent = intent;
329         }
330     }
331
332   va_end (argp);
333
334   next_sym++;
335 }
336
337
338 /* Add a symbol to the function list where the function takes
339    0 arguments.  */
340
341 static void
342 add_sym_0 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
343            int kind, int standard,
344            gfc_try (*check) (void),
345            gfc_expr *(*simplify) (void),
346            void (*resolve) (gfc_expr *))
347 {
348   gfc_simplify_f sf;
349   gfc_check_f cf;
350   gfc_resolve_f rf;
351
352   cf.f0 = check;
353   sf.f0 = simplify;
354   rf.f0 = resolve;
355
356   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
357            (void *) 0);
358 }
359
360
361 /* Add a symbol to the subroutine list where the subroutine takes
362    0 arguments.  */
363
364 static void
365 add_sym_0s (const char *name, gfc_isym_id id, int standard, void (*resolve) (gfc_code *))
366 {
367   gfc_check_f cf;
368   gfc_simplify_f sf;
369   gfc_resolve_f rf;
370
371   cf.f1 = NULL;
372   sf.f1 = NULL;
373   rf.s1 = resolve;
374
375   add_sym (name, id, NO_CLASS, ACTUAL_NO, BT_UNKNOWN, 0, standard, cf, sf, rf,
376            (void *) 0);
377 }
378
379
380 /* Add a symbol to the function list where the function takes
381    1 arguments.  */
382
383 static void
384 add_sym_1 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
385            int kind, int standard,
386            gfc_try (*check) (gfc_expr *),
387            gfc_expr *(*simplify) (gfc_expr *),
388            void (*resolve) (gfc_expr *, gfc_expr *),
389            const char *a1, bt type1, int kind1, int optional1)
390 {
391   gfc_check_f cf;
392   gfc_simplify_f sf;
393   gfc_resolve_f rf;
394
395   cf.f1 = check;
396   sf.f1 = simplify;
397   rf.f1 = resolve;
398
399   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
400            a1, type1, kind1, optional1, INTENT_IN,
401            (void *) 0);
402 }
403
404
405 /* Add a symbol to the subroutine list where the subroutine takes
406    1 arguments.  */
407
408 static void
409 add_sym_1s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
410             gfc_try (*check) (gfc_expr *),
411             gfc_expr *(*simplify) (gfc_expr *),
412             void (*resolve) (gfc_code *),
413             const char *a1, bt type1, int kind1, int optional1)
414 {
415   gfc_check_f cf;
416   gfc_simplify_f sf;
417   gfc_resolve_f rf;
418
419   cf.f1 = check;
420   sf.f1 = simplify;
421   rf.s1 = resolve;
422
423   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
424            a1, type1, kind1, optional1, INTENT_IN,
425            (void *) 0);
426 }
427
428
429 /* Add a symbol to the function list where the function takes
430    1 arguments, specifying the intent of the argument.  */
431
432 static void
433 add_sym_1_intent (const char *name, gfc_isym_id id, enum klass cl,
434                   int actual_ok, bt type, int kind, int standard,
435                   gfc_try (*check) (gfc_expr *),
436                   gfc_expr *(*simplify) (gfc_expr *),
437                   void (*resolve) (gfc_expr *, gfc_expr *),
438                   const char *a1, bt type1, int kind1, int optional1,
439                   sym_intent intent1)
440 {
441   gfc_check_f cf;
442   gfc_simplify_f sf;
443   gfc_resolve_f rf;
444
445   cf.f1 = check;
446   sf.f1 = simplify;
447   rf.f1 = resolve;
448
449   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
450            a1, type1, kind1, optional1, intent1,
451            (void *) 0);
452 }
453
454
455 /* Add a symbol to the subroutine list where the subroutine takes
456    1 arguments, specifying the intent of the argument.  */
457
458 static void
459 add_sym_1s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
460                    int kind, int standard,
461                    gfc_try (*check) (gfc_expr *),
462                    gfc_expr *(*simplify) (gfc_expr *),
463                    void (*resolve) (gfc_code *),
464                    const char *a1, bt type1, int kind1, int optional1,
465                    sym_intent intent1)
466 {
467   gfc_check_f cf;
468   gfc_simplify_f sf;
469   gfc_resolve_f rf;
470
471   cf.f1 = check;
472   sf.f1 = simplify;
473   rf.s1 = resolve;
474
475   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
476            a1, type1, kind1, optional1, intent1,
477            (void *) 0);
478 }
479
480
481 /* Add a symbol from the MAX/MIN family of intrinsic functions to the
482    function.  MAX et al take 2 or more arguments.  */
483
484 static void
485 add_sym_1m (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
486             int kind, int standard,
487             gfc_try (*check) (gfc_actual_arglist *),
488             gfc_expr *(*simplify) (gfc_expr *),
489             void (*resolve) (gfc_expr *, gfc_actual_arglist *),
490             const char *a1, bt type1, int kind1, int optional1,
491             const char *a2, bt type2, int kind2, int optional2)
492 {
493   gfc_check_f cf;
494   gfc_simplify_f sf;
495   gfc_resolve_f rf;
496
497   cf.f1m = check;
498   sf.f1 = simplify;
499   rf.f1m = resolve;
500
501   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
502            a1, type1, kind1, optional1, INTENT_IN,
503            a2, type2, kind2, optional2, INTENT_IN,
504            (void *) 0);
505 }
506
507
508 /* Add a symbol to the function list where the function takes
509    2 arguments.  */
510
511 static void
512 add_sym_2 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
513            int kind, int standard,
514            gfc_try (*check) (gfc_expr *, gfc_expr *),
515            gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
516            void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *),
517            const char *a1, bt type1, int kind1, int optional1,
518            const char *a2, bt type2, int kind2, int optional2)
519 {
520   gfc_check_f cf;
521   gfc_simplify_f sf;
522   gfc_resolve_f rf;
523
524   cf.f2 = check;
525   sf.f2 = simplify;
526   rf.f2 = resolve;
527
528   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
529            a1, type1, kind1, optional1, INTENT_IN,
530            a2, type2, kind2, optional2, INTENT_IN,
531            (void *) 0);
532 }
533
534
535 /* Add a symbol to the subroutine list where the subroutine takes
536    2 arguments.  */
537
538 static void
539 add_sym_2s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
540             gfc_try (*check) (gfc_expr *, gfc_expr *),
541             gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
542             void (*resolve) (gfc_code *),
543             const char *a1, bt type1, int kind1, int optional1,
544             const char *a2, bt type2, int kind2, int optional2)
545 {
546   gfc_check_f cf;
547   gfc_simplify_f sf;
548   gfc_resolve_f rf;
549
550   cf.f2 = check;
551   sf.f2 = simplify;
552   rf.s1 = resolve;
553
554   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
555            a1, type1, kind1, optional1, INTENT_IN,
556            a2, type2, kind2, optional2, INTENT_IN,
557            (void *) 0);
558 }
559
560
561 /* Add a symbol to the subroutine list where the subroutine takes
562    2 arguments, specifying the intent of the arguments.  */
563
564 static void
565 add_sym_2s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
566                    int kind, int standard,
567                    gfc_try (*check) (gfc_expr *, gfc_expr *),
568                    gfc_expr *(*simplify) (gfc_expr *, gfc_expr *),
569                    void (*resolve) (gfc_code *),
570                    const char *a1, bt type1, int kind1, int optional1,
571                    sym_intent intent1, const char *a2, bt type2, int kind2,
572                    int optional2, sym_intent intent2)
573 {
574   gfc_check_f cf;
575   gfc_simplify_f sf;
576   gfc_resolve_f rf;
577
578   cf.f2 = check;
579   sf.f2 = simplify;
580   rf.s1 = resolve;
581
582   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
583            a1, type1, kind1, optional1, intent1,
584            a2, type2, kind2, optional2, intent2,
585            (void *) 0);
586 }
587
588
589 /* Add a symbol to the function list where the function takes
590    3 arguments.  */
591
592 static void
593 add_sym_3 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
594            int kind, int standard,
595            gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
596            gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
597            void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
598            const char *a1, bt type1, int kind1, int optional1,
599            const char *a2, bt type2, int kind2, int optional2,
600            const char *a3, bt type3, int kind3, int optional3)
601 {
602   gfc_check_f cf;
603   gfc_simplify_f sf;
604   gfc_resolve_f rf;
605
606   cf.f3 = check;
607   sf.f3 = simplify;
608   rf.f3 = resolve;
609
610   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
611            a1, type1, kind1, optional1, INTENT_IN,
612            a2, type2, kind2, optional2, INTENT_IN,
613            a3, type3, kind3, optional3, INTENT_IN,
614            (void *) 0);
615 }
616
617
618 /* MINLOC and MAXLOC get special treatment because their argument
619    might have to be reordered.  */
620
621 static void
622 add_sym_3ml (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
623              int kind, int standard,
624              gfc_try (*check) (gfc_actual_arglist *),
625              gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
626              void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
627              const char *a1, bt type1, int kind1, int optional1,
628              const char *a2, bt type2, int kind2, int optional2,
629              const char *a3, bt type3, int kind3, int optional3)
630 {
631   gfc_check_f cf;
632   gfc_simplify_f sf;
633   gfc_resolve_f rf;
634
635   cf.f3ml = check;
636   sf.f3 = simplify;
637   rf.f3 = resolve;
638
639   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
640            a1, type1, kind1, optional1, INTENT_IN,
641            a2, type2, kind2, optional2, INTENT_IN,
642            a3, type3, kind3, optional3, INTENT_IN,
643            (void *) 0);
644 }
645
646
647 /* MINVAL, MAXVAL, PRODUCT, and SUM also get special treatment because
648    their argument also might have to be reordered.  */
649
650 static void
651 add_sym_3red (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
652               int kind, int standard,
653               gfc_try (*check) (gfc_actual_arglist *),
654               gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
655               void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
656               const char *a1, bt type1, int kind1, int optional1,
657               const char *a2, bt type2, int kind2, int optional2,
658               const char *a3, bt type3, int kind3, int optional3)
659 {
660   gfc_check_f cf;
661   gfc_simplify_f sf;
662   gfc_resolve_f rf;
663
664   cf.f3red = check;
665   sf.f3 = simplify;
666   rf.f3 = resolve;
667
668   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
669            a1, type1, kind1, optional1, INTENT_IN,
670            a2, type2, kind2, optional2, INTENT_IN,
671            a3, type3, kind3, optional3, INTENT_IN,
672            (void *) 0);
673 }
674
675
676 /* Add a symbol to the subroutine list where the subroutine takes
677    3 arguments.  */
678
679 static void
680 add_sym_3s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind, int standard,
681             gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
682             gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
683             void (*resolve) (gfc_code *),
684             const char *a1, bt type1, int kind1, int optional1,
685             const char *a2, bt type2, int kind2, int optional2,
686             const char *a3, bt type3, int kind3, int optional3)
687 {
688   gfc_check_f cf;
689   gfc_simplify_f sf;
690   gfc_resolve_f rf;
691
692   cf.f3 = check;
693   sf.f3 = simplify;
694   rf.s1 = resolve;
695
696   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
697            a1, type1, kind1, optional1, INTENT_IN,
698            a2, type2, kind2, optional2, INTENT_IN,
699            a3, type3, kind3, optional3, INTENT_IN,
700            (void *) 0);
701 }
702
703
704 /* Add a symbol to the subroutine list where the subroutine takes
705    3 arguments, specifying the intent of the arguments.  */
706
707 static void
708 add_sym_3s_intent (const char *name, gfc_isym_id id, enum klass cl, bt type,
709                    int kind, int standard,
710                    gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *),
711                    gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *),
712                    void (*resolve) (gfc_code *),
713                    const char *a1, bt type1, int kind1, int optional1,
714                    sym_intent intent1, const char *a2, bt type2, int kind2,
715                    int optional2, sym_intent intent2, const char *a3, bt type3,
716                    int kind3, int optional3, sym_intent intent3)
717 {
718   gfc_check_f cf;
719   gfc_simplify_f sf;
720   gfc_resolve_f rf;
721
722   cf.f3 = check;
723   sf.f3 = simplify;
724   rf.s1 = resolve;
725
726   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
727            a1, type1, kind1, optional1, intent1,
728            a2, type2, kind2, optional2, intent2,
729            a3, type3, kind3, optional3, intent3,
730            (void *) 0);
731 }
732
733
734 /* Add a symbol to the function list where the function takes
735    4 arguments.  */
736
737 static void
738 add_sym_4 (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type,
739            int kind, int standard,
740            gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
741            gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
742                                   gfc_expr *),
743            void (*resolve) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
744                             gfc_expr *),
745            const char *a1, bt type1, int kind1, int optional1,
746            const char *a2, bt type2, int kind2, int optional2,
747            const char *a3, bt type3, int kind3, int optional3,
748            const char *a4, bt type4, int kind4, int optional4 )
749 {
750   gfc_check_f cf;
751   gfc_simplify_f sf;
752   gfc_resolve_f rf;
753
754   cf.f4 = check;
755   sf.f4 = simplify;
756   rf.f4 = resolve;
757
758   add_sym (name, id, cl, actual_ok, type, kind, standard, cf, sf, rf,
759            a1, type1, kind1, optional1, INTENT_IN,
760            a2, type2, kind2, optional2, INTENT_IN,
761            a3, type3, kind3, optional3, INTENT_IN,
762            a4, type4, kind4, optional4, INTENT_IN,
763            (void *) 0);
764 }
765
766
767 /* Add a symbol to the subroutine list where the subroutine takes
768    4 arguments.  */
769
770 static void
771 add_sym_4s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
772             int standard,
773             gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *),
774             gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
775                                    gfc_expr *),
776             void (*resolve) (gfc_code *),
777             const char *a1, bt type1, int kind1, int optional1,
778             sym_intent intent1, const char *a2, bt type2, int kind2,
779             int optional2, sym_intent intent2, const char *a3, bt type3,
780             int kind3, int optional3, sym_intent intent3, const char *a4,
781             bt type4, int kind4, int optional4, sym_intent intent4)
782 {
783   gfc_check_f cf;
784   gfc_simplify_f sf;
785   gfc_resolve_f rf;
786
787   cf.f4 = check;
788   sf.f4 = simplify;
789   rf.s1 = resolve;
790
791   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
792            a1, type1, kind1, optional1, intent1,
793            a2, type2, kind2, optional2, intent2,
794            a3, type3, kind3, optional3, intent3,
795            a4, type4, kind4, optional4, intent4,
796            (void *) 0);
797 }
798
799
800 /* Add a symbol to the subroutine list where the subroutine takes
801    5 arguments.  */
802
803 static void
804 add_sym_5s (const char *name, gfc_isym_id id, enum klass cl, bt type, int kind,
805             int standard,
806             gfc_try (*check) (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *,
807                           gfc_expr *),
808             gfc_expr *(*simplify) (gfc_expr *, gfc_expr *, gfc_expr *,
809                                    gfc_expr *, gfc_expr *),
810             void (*resolve) (gfc_code *),
811             const char *a1, bt type1, int kind1, int optional1,
812             sym_intent intent1, const char *a2, bt type2, int kind2,
813             int optional2, sym_intent intent2, const char *a3, bt type3,
814             int kind3, int optional3, sym_intent intent3, const char *a4,
815             bt type4, int kind4, int optional4, sym_intent intent4,
816             const char *a5, bt type5, int kind5, int optional5,
817             sym_intent intent5) 
818 {
819   gfc_check_f cf;
820   gfc_simplify_f sf;
821   gfc_resolve_f rf;
822
823   cf.f5 = check;
824   sf.f5 = simplify;
825   rf.s1 = resolve;
826
827   add_sym (name, id, cl, ACTUAL_NO, type, kind, standard, cf, sf, rf,
828            a1, type1, kind1, optional1, intent1,
829            a2, type2, kind2, optional2, intent2,
830            a3, type3, kind3, optional3, intent3,
831            a4, type4, kind4, optional4, intent4,
832            a5, type5, kind5, optional5, intent5,
833            (void *) 0);
834 }
835
836
837 /* Locate an intrinsic symbol given a base pointer, number of elements
838    in the table and a pointer to a name.  Returns the NULL pointer if
839    a name is not found.  */
840
841 static gfc_intrinsic_sym *
842 find_sym (gfc_intrinsic_sym *start, int n, const char *name)
843 {
844   /* name may be a user-supplied string, so we must first make sure
845      that we're comparing against a pointer into the global string
846      table.  */
847   const char *p = gfc_get_string (name);
848
849   while (n > 0)
850     {
851       if (p == start->name)
852         return start;
853
854       start++;
855       n--;
856     }
857
858   return NULL;
859 }
860
861
862 /* Given a name, find a function in the intrinsic function table.
863    Returns NULL if not found.  */
864
865 gfc_intrinsic_sym *
866 gfc_find_function (const char *name)
867 {
868   gfc_intrinsic_sym *sym;
869
870   sym = find_sym (functions, nfunc, name);
871   if (!sym)
872     sym = find_sym (conversion, nconv, name);
873
874   return sym;
875 }
876
877
878 /* Given a name, find a function in the intrinsic subroutine table.
879    Returns NULL if not found.  */
880
881 gfc_intrinsic_sym *
882 gfc_find_subroutine (const char *name)
883 {
884   return find_sym (subroutines, nsub, name);
885 }
886
887
888 /* Given a string, figure out if it is the name of a generic intrinsic
889    function or not.  */
890
891 int
892 gfc_generic_intrinsic (const char *name)
893 {
894   gfc_intrinsic_sym *sym;
895
896   sym = gfc_find_function (name);
897   return (sym == NULL) ? 0 : sym->generic;
898 }
899
900
901 /* Given a string, figure out if it is the name of a specific
902    intrinsic function or not.  */
903
904 int
905 gfc_specific_intrinsic (const char *name)
906 {
907   gfc_intrinsic_sym *sym;
908
909   sym = gfc_find_function (name);
910   return (sym == NULL) ? 0 : sym->specific;
911 }
912
913
914 /* Given a string, figure out if it is the name of an intrinsic function
915    or subroutine allowed as an actual argument or not.  */
916 int
917 gfc_intrinsic_actual_ok (const char *name, const bool subroutine_flag)
918 {
919   gfc_intrinsic_sym *sym;
920
921   /* Intrinsic subroutines are not allowed as actual arguments.  */
922   if (subroutine_flag)
923     return 0;
924   else
925     {
926       sym = gfc_find_function (name);
927       return (sym == NULL) ? 0 : sym->actual_ok;
928     }
929 }
930
931
932 /* Given a symbol, find out if it is (and is to be treated) an intrinsic.  If
933    it's name refers to an intrinsic but this intrinsic is not included in the
934    selected standard, this returns FALSE and sets the symbol's external
935    attribute.  */
936
937 bool
938 gfc_is_intrinsic (gfc_symbol* sym, int subroutine_flag, locus loc)
939 {
940   gfc_intrinsic_sym* isym;
941   const char* symstd;
942
943   /* If INTRINSIC/EXTERNAL state is already known, return.  */
944   if (sym->attr.intrinsic)
945     return true;
946   if (sym->attr.external)
947     return false;
948
949   if (subroutine_flag)
950     isym = gfc_find_subroutine (sym->name);
951   else
952     isym = gfc_find_function (sym->name);
953
954   /* No such intrinsic available at all?  */
955   if (!isym)
956     return false;
957
958   /* See if this intrinsic is allowed in the current standard.  */
959   if (gfc_check_intrinsic_standard (isym, &symstd, false, loc) == FAILURE)
960     {
961       if (sym->attr.proc == PROC_UNKNOWN
962           && gfc_option.warn_intrinsics_std)
963         gfc_warning_now ("The intrinsic '%s' at %L is not included in the"
964                          " selected standard but %s and '%s' will be"
965                          " treated as if declared EXTERNAL.  Use an"
966                          " appropriate -std=* option or define"
967                          " -fall-intrinsics to allow this intrinsic.",
968                          sym->name, &loc, symstd, sym->name);
969
970       return false;
971     }
972
973   return true;
974 }
975
976
977 /* Collect a set of intrinsic functions into a generic collection.
978    The first argument is the name of the generic function, which is
979    also the name of a specific function.  The rest of the specifics
980    currently in the table are placed into the list of specific
981    functions associated with that generic.
982
983    PR fortran/32778
984    FIXME: Remove the argument STANDARD if no regressions are
985           encountered. Change all callers (approx. 360).
986 */
987
988 static void
989 make_generic (const char *name, gfc_isym_id id, int standard ATTRIBUTE_UNUSED)
990 {
991   gfc_intrinsic_sym *g;
992
993   if (sizing != SZ_NOTHING)
994     return;
995
996   g = gfc_find_function (name);
997   if (g == NULL)
998     gfc_internal_error ("make_generic(): Can't find generic symbol '%s'",
999                         name);
1000
1001   gcc_assert (g->id == id);
1002
1003   g->generic = 1;
1004   g->specific = 1;
1005   if ((g + 1)->name != NULL)
1006     g->specific_head = g + 1;
1007   g++;
1008
1009   while (g->name != NULL)
1010     {
1011       g->next = g + 1;
1012       g->specific = 1;
1013       g++;
1014     }
1015
1016   g--;
1017   g->next = NULL;
1018 }
1019
1020
1021 /* Create a duplicate intrinsic function entry for the current
1022    function, the only differences being the alternate name and
1023    a different standard if necessary. Note that we use argument
1024    lists more than once, but all argument lists are freed as a
1025    single block.  */
1026
1027 static void
1028 make_alias (const char *name, int standard)
1029 {
1030   switch (sizing)
1031     {
1032     case SZ_FUNCS:
1033       nfunc++;
1034       break;
1035
1036     case SZ_SUBS:
1037       nsub++;
1038       break;
1039
1040     case SZ_NOTHING:
1041       next_sym[0] = next_sym[-1];
1042       next_sym->name = gfc_get_string (name);
1043       next_sym->standard = standard;
1044       next_sym++;
1045       break;
1046
1047     default:
1048       break;
1049     }
1050 }
1051
1052
1053 /* Make the current subroutine noreturn.  */
1054
1055 static void
1056 make_noreturn (void)
1057 {
1058   if (sizing == SZ_NOTHING)
1059     next_sym[-1].noreturn = 1;
1060 }
1061
1062
1063 /* Add intrinsic functions.  */
1064
1065 static void
1066 add_functions (void)
1067 {
1068   /* Argument names as in the standard (to be used as argument keywords).  */
1069   const char
1070     *a = "a", *f = "field", *pt = "pointer", *tg = "target",
1071     *b = "b", *m = "matrix", *ma = "matrix_a", *mb = "matrix_b",
1072     *c = "c", *n = "n", *ncopies= "ncopies", *pos = "pos", *bck = "back",
1073     *i = "i", *v = "vector", *va = "vector_a", *vb = "vector_b",
1074     *j = "j", *a1 = "a1", *fs = "fsource", *ts = "tsource",
1075     *l = "l", *a2 = "a2", *mo = "mold", *ord = "order",
1076     *p = "p", *ar = "array", *shp = "shape", *src = "source",
1077     *r = "r", *bd = "boundary", *pad = "pad", *set = "set",
1078     *s = "s", *dm = "dim", *kind = "kind", *msk = "mask",
1079     *x = "x", *sh = "shift", *stg = "string", *ssg = "substring",
1080     *y = "y", *sz = "size", *sta = "string_a", *stb = "string_b",
1081     *z = "z", *ln = "len", *ut = "unit", *han = "handler",
1082     *num = "number", *tm = "time", *nm = "name", *md = "mode",
1083     *vl = "values", *p1 = "path1", *p2 = "path2", *com = "command",
1084     *ca = "coarray", *sub = "sub";
1085
1086   int di, dr, dd, dl, dc, dz, ii;
1087
1088   di = gfc_default_integer_kind;
1089   dr = gfc_default_real_kind;
1090   dd = gfc_default_double_kind;
1091   dl = gfc_default_logical_kind;
1092   dc = gfc_default_character_kind;
1093   dz = gfc_default_complex_kind;
1094   ii = gfc_index_integer_kind;
1095
1096   add_sym_1 ("abs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1097              gfc_check_abs, gfc_simplify_abs, gfc_resolve_abs,
1098              a, BT_REAL, dr, REQUIRED);
1099
1100   add_sym_1 ("iabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1101              NULL, gfc_simplify_abs, gfc_resolve_abs,
1102              a, BT_INTEGER, di, REQUIRED);
1103
1104   add_sym_1 ("dabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1105              gfc_check_fn_d, gfc_simplify_abs, gfc_resolve_abs,
1106              a, BT_REAL, dd, REQUIRED);
1107
1108   add_sym_1 ("cabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1109              NULL, gfc_simplify_abs, gfc_resolve_abs,
1110              a, BT_COMPLEX, dz, REQUIRED);
1111
1112   add_sym_1 ("zabs", GFC_ISYM_ABS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, 
1113              NULL, gfc_simplify_abs, gfc_resolve_abs, 
1114              a, BT_COMPLEX, dd, REQUIRED);
1115
1116   make_alias ("cdabs", GFC_STD_GNU);
1117
1118   make_generic ("abs", GFC_ISYM_ABS, GFC_STD_F77);
1119
1120   /* The checking function for ACCESS is called gfc_check_access_func
1121      because the name gfc_check_access is already used in module.c.  */
1122   add_sym_2 ("access", GFC_ISYM_ACCESS, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1123              gfc_check_access_func, NULL, gfc_resolve_access,
1124              nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1125
1126   make_generic ("access", GFC_ISYM_ACCESS, GFC_STD_GNU);
1127
1128   add_sym_2 ("achar", GFC_ISYM_ACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1129              BT_CHARACTER, dc, GFC_STD_F95,
1130              gfc_check_achar, gfc_simplify_achar, gfc_resolve_achar,
1131              i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1132
1133   make_generic ("achar", GFC_ISYM_ACHAR, GFC_STD_F95);
1134
1135   add_sym_1 ("acos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1136              gfc_check_fn_rc2008, gfc_simplify_acos, gfc_resolve_acos,
1137              x, BT_REAL, dr, REQUIRED);
1138
1139   add_sym_1 ("dacos", GFC_ISYM_ACOS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1140              gfc_check_fn_d, gfc_simplify_acos, gfc_resolve_acos,
1141              x, BT_REAL, dd, REQUIRED);
1142
1143   make_generic ("acos", GFC_ISYM_ACOS, GFC_STD_F77);
1144
1145   add_sym_1 ("acosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1146              GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_acosh,
1147              gfc_resolve_acosh, x, BT_REAL, dr, REQUIRED);
1148
1149   add_sym_1 ("dacosh", GFC_ISYM_ACOSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1150              gfc_check_fn_d, gfc_simplify_acosh, gfc_resolve_acosh,
1151              x, BT_REAL, dd, REQUIRED);
1152
1153   make_generic ("acosh", GFC_ISYM_ACOSH, GFC_STD_F2008);
1154
1155   add_sym_1 ("adjustl", GFC_ISYM_ADJUSTL, CLASS_ELEMENTAL, ACTUAL_NO,
1156              BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustl,
1157              gfc_resolve_adjustl, stg, BT_CHARACTER, 0, REQUIRED);
1158
1159   make_generic ("adjustl", GFC_ISYM_ADJUSTL, GFC_STD_F95);
1160
1161   add_sym_1 ("adjustr", GFC_ISYM_ADJUSTR, CLASS_ELEMENTAL, ACTUAL_NO,
1162              BT_CHARACTER, dc, GFC_STD_F95, NULL, gfc_simplify_adjustr,
1163              gfc_resolve_adjustr, stg, BT_CHARACTER, 0, REQUIRED);
1164
1165   make_generic ("adjustr", GFC_ISYM_ADJUSTR, GFC_STD_F95);
1166
1167   add_sym_1 ("aimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1168              gfc_check_fn_c, gfc_simplify_aimag, gfc_resolve_aimag,
1169              z, BT_COMPLEX, dz, REQUIRED);
1170
1171   make_alias ("imag", GFC_STD_GNU);
1172   make_alias ("imagpart", GFC_STD_GNU);
1173
1174   add_sym_1 ("dimag", GFC_ISYM_AIMAG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, 
1175              NULL, gfc_simplify_aimag, gfc_resolve_aimag, 
1176              z, BT_COMPLEX, dd, REQUIRED);
1177
1178   make_generic ("aimag", GFC_ISYM_AIMAG, GFC_STD_F77);
1179
1180   add_sym_2 ("aint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1181              gfc_check_a_xkind, gfc_simplify_aint, gfc_resolve_aint,
1182              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1183
1184   add_sym_1 ("dint", GFC_ISYM_AINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1185              NULL, gfc_simplify_dint, gfc_resolve_dint,
1186              a, BT_REAL, dd, REQUIRED);
1187
1188   make_generic ("aint", GFC_ISYM_AINT, GFC_STD_F77);
1189
1190   add_sym_2 ("all", GFC_ISYM_ALL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1191              gfc_check_all_any, gfc_simplify_all, gfc_resolve_all,
1192              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1193
1194   make_generic ("all", GFC_ISYM_ALL, GFC_STD_F95);
1195
1196   add_sym_1 ("allocated", GFC_ISYM_ALLOCATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1197              gfc_check_allocated, NULL, NULL,
1198              ar, BT_UNKNOWN, 0, REQUIRED);
1199
1200   make_generic ("allocated", GFC_ISYM_ALLOCATED, GFC_STD_F95);
1201
1202   add_sym_2 ("anint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1203              gfc_check_a_xkind, gfc_simplify_anint, gfc_resolve_anint,
1204              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1205
1206   add_sym_1 ("dnint", GFC_ISYM_ANINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1207              NULL, gfc_simplify_dnint, gfc_resolve_dnint,
1208              a, BT_REAL, dd, REQUIRED);
1209
1210   make_generic ("anint", GFC_ISYM_ANINT, GFC_STD_F77);
1211
1212   add_sym_2 ("any", GFC_ISYM_ANY, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1213              gfc_check_all_any, gfc_simplify_any, gfc_resolve_any,
1214              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
1215
1216   make_generic ("any", GFC_ISYM_ANY, GFC_STD_F95);
1217
1218   add_sym_1 ("asin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1219              gfc_check_fn_rc2008, gfc_simplify_asin, gfc_resolve_asin,
1220              x, BT_REAL, dr, REQUIRED);
1221
1222   add_sym_1 ("dasin", GFC_ISYM_ASIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1223              gfc_check_fn_d, gfc_simplify_asin, gfc_resolve_asin,
1224              x, BT_REAL, dd, REQUIRED);
1225
1226   make_generic ("asin", GFC_ISYM_ASIN, GFC_STD_F77);
1227   
1228   add_sym_1 ("asinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1229              GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_asinh,
1230              gfc_resolve_asinh, x, BT_REAL, dr, REQUIRED);
1231
1232   add_sym_1 ("dasinh", GFC_ISYM_ASINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1233              gfc_check_fn_d, gfc_simplify_asinh, gfc_resolve_asinh,
1234              x, BT_REAL, dd, REQUIRED);
1235
1236   make_generic ("asinh", GFC_ISYM_ASINH, GFC_STD_F2008);
1237
1238   add_sym_2 ("associated", GFC_ISYM_ASSOCIATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl,
1239              GFC_STD_F95, gfc_check_associated, NULL, NULL,
1240              pt, BT_UNKNOWN, 0, REQUIRED, tg, BT_UNKNOWN, 0, OPTIONAL);
1241
1242   make_generic ("associated", GFC_ISYM_ASSOCIATED, GFC_STD_F95);
1243
1244   add_sym_1 ("atan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1245              gfc_check_fn_rc2008, gfc_simplify_atan, gfc_resolve_atan,
1246              x, BT_REAL, dr, REQUIRED);
1247
1248   add_sym_1 ("datan", GFC_ISYM_ATAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1249              gfc_check_fn_d, gfc_simplify_atan, gfc_resolve_atan,
1250              x, BT_REAL, dd, REQUIRED);
1251
1252   /* Two-argument version of atan, equivalent to atan2.  */
1253   add_sym_2 ("atan", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F2008,
1254              gfc_check_atan_2, gfc_simplify_atan2, gfc_resolve_atan2,
1255              y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1256
1257   make_generic ("atan", GFC_ISYM_ATAN, GFC_STD_F77);
1258   
1259   add_sym_1 ("atanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,
1260              GFC_STD_F2008, gfc_check_fn_rc2008, gfc_simplify_atanh,
1261              gfc_resolve_atanh, x, BT_REAL, dr, REQUIRED);
1262
1263   add_sym_1 ("datanh", GFC_ISYM_ATANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU,
1264              gfc_check_fn_d, gfc_simplify_atanh, gfc_resolve_atanh,
1265              x, BT_REAL, dd, REQUIRED);
1266
1267   make_generic ("atanh", GFC_ISYM_ATANH, GFC_STD_F2008);
1268
1269   add_sym_2 ("atan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1270              gfc_check_atan2, gfc_simplify_atan2, gfc_resolve_atan2,
1271              y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED);
1272
1273   add_sym_2 ("datan2", GFC_ISYM_ATAN2, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1274              gfc_check_datan2, gfc_simplify_atan2, gfc_resolve_atan2,
1275              y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED);
1276
1277   make_generic ("atan2", GFC_ISYM_ATAN2, GFC_STD_F77);
1278   
1279   /* Bessel and Neumann functions for G77 compatibility.  */
1280   add_sym_1 ("besj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1281              gfc_check_fn_r, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1282              x, BT_REAL, dr, REQUIRED);
1283
1284   make_alias ("bessel_j0", GFC_STD_F2008);
1285
1286   add_sym_1 ("dbesj0", GFC_ISYM_J0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1287              gfc_check_fn_d, gfc_simplify_bessel_j0, gfc_resolve_g77_math1,
1288              x, BT_REAL, dd, REQUIRED);
1289
1290   make_generic ("bessel_j0", GFC_ISYM_J0, GFC_STD_F2008);
1291
1292   add_sym_1 ("besj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1293              gfc_check_fn_r, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1294              x, BT_REAL, dr, REQUIRED);
1295
1296   make_alias ("bessel_j1", GFC_STD_F2008);
1297
1298   add_sym_1 ("dbesj1", GFC_ISYM_J1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1299              gfc_check_fn_d, gfc_simplify_bessel_j1, gfc_resolve_g77_math1,
1300              x, BT_REAL, dd, REQUIRED);
1301
1302   make_generic ("bessel_j1", GFC_ISYM_J1, GFC_STD_F2008);
1303
1304   add_sym_2 ("besjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1305              gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1306              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1307
1308   make_alias ("bessel_jn", GFC_STD_F2008);
1309
1310   add_sym_2 ("dbesjn", GFC_ISYM_JN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1311              gfc_check_besn, gfc_simplify_bessel_jn, gfc_resolve_besn,
1312              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1313
1314   make_generic ("bessel_jn", GFC_ISYM_JN, GFC_STD_F2008);
1315
1316   add_sym_1 ("besy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1317              gfc_check_fn_r, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1318              x, BT_REAL, dr, REQUIRED);
1319
1320   make_alias ("bessel_y0", GFC_STD_F2008);
1321
1322   add_sym_1 ("dbesy0", GFC_ISYM_Y0, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1323              gfc_check_fn_d, gfc_simplify_bessel_y0, gfc_resolve_g77_math1,
1324              x, BT_REAL, dd, REQUIRED);
1325
1326   make_generic ("bessel_y0", GFC_ISYM_Y0, GFC_STD_F2008);
1327
1328   add_sym_1 ("besy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1329              gfc_check_fn_r, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1330              x, BT_REAL, dr, REQUIRED);
1331
1332   make_alias ("bessel_y1", GFC_STD_F2008);
1333
1334   add_sym_1 ("dbesy1", GFC_ISYM_Y1, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1335              gfc_check_fn_d, gfc_simplify_bessel_y1, gfc_resolve_g77_math1,
1336              x, BT_REAL, dd, REQUIRED);
1337
1338   make_generic ("bessel_y1", GFC_ISYM_Y1, GFC_STD_F2008);
1339
1340   add_sym_2 ("besyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1341              gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1342              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED);
1343
1344   make_alias ("bessel_yn", GFC_STD_F2008);
1345
1346   add_sym_2 ("dbesyn", GFC_ISYM_YN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1347              gfc_check_besn, gfc_simplify_bessel_yn, gfc_resolve_besn,
1348              n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED);
1349
1350   make_generic ("bessel_yn", GFC_ISYM_YN, GFC_STD_F2008);
1351
1352   add_sym_1 ("bit_size", GFC_ISYM_BIT_SIZE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1353              gfc_check_i, gfc_simplify_bit_size, NULL,
1354              i, BT_INTEGER, di, REQUIRED);
1355
1356   make_generic ("bit_size", GFC_ISYM_BIT_SIZE, GFC_STD_F95);
1357
1358   add_sym_2 ("btest", GFC_ISYM_BTEST, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
1359              gfc_check_bitfcn, gfc_simplify_btest, gfc_resolve_btest,
1360              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1361
1362   make_generic ("btest", GFC_ISYM_BTEST, GFC_STD_F95);
1363
1364   add_sym_2 ("ceiling", GFC_ISYM_CEILING, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1365              gfc_check_a_ikind, gfc_simplify_ceiling, gfc_resolve_ceiling,
1366              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1367
1368   make_generic ("ceiling", GFC_ISYM_CEILING, GFC_STD_F95);
1369
1370   add_sym_2 ("char", GFC_ISYM_CHAR, CLASS_ELEMENTAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F77,
1371              gfc_check_char, gfc_simplify_char, gfc_resolve_char,
1372              i, BT_INTEGER, di, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1373
1374   make_generic ("char", GFC_ISYM_CHAR, GFC_STD_F77);
1375
1376   add_sym_1 ("chdir", GFC_ISYM_CHDIR, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1377              GFC_STD_GNU, gfc_check_chdir, NULL, gfc_resolve_chdir,
1378              nm, BT_CHARACTER, dc, REQUIRED);
1379
1380   make_generic ("chdir", GFC_ISYM_CHDIR, GFC_STD_GNU);
1381
1382   add_sym_2 ("chmod", GFC_ISYM_CHMOD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1383              gfc_check_chmod, NULL, gfc_resolve_chmod,
1384              nm, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED);
1385
1386   make_generic ("chmod", GFC_ISYM_CHMOD, GFC_STD_GNU);
1387
1388   add_sym_3 ("cmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_F77,
1389              gfc_check_cmplx, gfc_simplify_cmplx, gfc_resolve_cmplx,
1390              x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, OPTIONAL,
1391              kind, BT_INTEGER, di, OPTIONAL);
1392
1393   make_generic ("cmplx", GFC_ISYM_CMPLX, GFC_STD_F77);
1394
1395   add_sym_0 ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT, CLASS_INQUIRY, 
1396              ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003, NULL, NULL, NULL);
1397
1398   make_generic ("command_argument_count", GFC_ISYM_COMMAND_ARGUMENT_COUNT,
1399                 GFC_STD_F2003);
1400
1401   add_sym_2 ("complex", GFC_ISYM_COMPLEX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dz, GFC_STD_GNU,
1402              gfc_check_complex, gfc_simplify_complex, gfc_resolve_complex,
1403              x, BT_UNKNOWN, dr, REQUIRED, y, BT_UNKNOWN, dr, REQUIRED);
1404
1405   make_generic ("complex", GFC_ISYM_COMPLEX, GFC_STD_GNU);
1406
1407   /* Making dcmplx a specific of cmplx causes cmplx to return a double
1408      complex instead of the default complex.  */
1409
1410   add_sym_2 ("dcmplx", GFC_ISYM_CMPLX, CLASS_ELEMENTAL, ACTUAL_NO, BT_COMPLEX, dd, GFC_STD_GNU,
1411              gfc_check_dcmplx, gfc_simplify_dcmplx, gfc_resolve_dcmplx,
1412              x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, OPTIONAL);
1413
1414   make_generic ("dcmplx", GFC_ISYM_CMPLX, GFC_STD_GNU);
1415
1416   add_sym_1 ("conjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1417              gfc_check_fn_c, gfc_simplify_conjg, gfc_resolve_conjg,
1418              z, BT_COMPLEX, dz, REQUIRED);
1419
1420   add_sym_1 ("dconjg", GFC_ISYM_CONJG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1421              NULL, gfc_simplify_conjg, gfc_resolve_conjg, 
1422              z, BT_COMPLEX, dd, REQUIRED);
1423
1424   make_generic ("conjg", GFC_ISYM_CONJG, GFC_STD_F77);
1425
1426   add_sym_1 ("cos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1427              gfc_check_fn_rc, gfc_simplify_cos, gfc_resolve_cos,
1428              x, BT_REAL, dr, REQUIRED);
1429
1430   add_sym_1 ("dcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1431              gfc_check_fn_d, gfc_simplify_cos, gfc_resolve_cos,
1432              x, BT_REAL, dd, REQUIRED);
1433
1434   add_sym_1 ("ccos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1435              NULL, gfc_simplify_cos, gfc_resolve_cos,
1436              x, BT_COMPLEX, dz, REQUIRED);
1437
1438   add_sym_1 ("zcos", GFC_ISYM_COS, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
1439              NULL, gfc_simplify_cos, gfc_resolve_cos, 
1440              x, BT_COMPLEX, dd, REQUIRED);
1441
1442   make_alias ("cdcos", GFC_STD_GNU);
1443
1444   make_generic ("cos", GFC_ISYM_COS, GFC_STD_F77);
1445
1446   add_sym_1 ("cosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1447              gfc_check_fn_rc2008, gfc_simplify_cosh, gfc_resolve_cosh,
1448              x, BT_REAL, dr, REQUIRED);
1449
1450   add_sym_1 ("dcosh", GFC_ISYM_COSH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1451              gfc_check_fn_d, gfc_simplify_cosh, gfc_resolve_cosh,
1452              x, BT_REAL, dd, REQUIRED);
1453
1454   make_generic ("cosh", GFC_ISYM_COSH, GFC_STD_F77);
1455
1456   add_sym_3 ("count", GFC_ISYM_COUNT, CLASS_TRANSFORMATIONAL, ACTUAL_NO,
1457              BT_INTEGER, di, GFC_STD_F95,
1458              gfc_check_count, gfc_simplify_count, gfc_resolve_count,
1459              msk, BT_LOGICAL, dl, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1460              kind, BT_INTEGER, di, OPTIONAL);
1461
1462   make_generic ("count", GFC_ISYM_COUNT, GFC_STD_F95);
1463
1464   add_sym_3 ("cshift", GFC_ISYM_CSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1465              gfc_check_cshift, NULL, gfc_resolve_cshift,
1466              ar, BT_REAL, dr, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1467              dm, BT_INTEGER, ii, OPTIONAL);
1468
1469   make_generic ("cshift", GFC_ISYM_CSHIFT, GFC_STD_F95);
1470
1471   add_sym_1 ("ctime", GFC_ISYM_CTIME, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
1472               gfc_check_ctime, NULL, gfc_resolve_ctime,
1473               tm, BT_INTEGER, di, REQUIRED);
1474
1475   make_generic ("ctime", GFC_ISYM_CTIME, GFC_STD_GNU);
1476
1477   add_sym_1 ("dble", GFC_ISYM_DBLE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
1478              gfc_check_dble, gfc_simplify_dble, gfc_resolve_dble,
1479              a, BT_REAL, dr, REQUIRED);
1480
1481   make_generic ("dble", GFC_ISYM_DBLE, GFC_STD_F77);
1482
1483   add_sym_1 ("digits", GFC_ISYM_DIGITS, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1484              gfc_check_digits, gfc_simplify_digits, NULL,
1485              x, BT_UNKNOWN, dr, REQUIRED);
1486
1487   make_generic ("digits", GFC_ISYM_DIGITS, GFC_STD_F95);
1488
1489   add_sym_2 ("dim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
1490              gfc_check_a_p, gfc_simplify_dim, gfc_resolve_dim,
1491              x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1492
1493   add_sym_2 ("idim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
1494              NULL, gfc_simplify_dim, gfc_resolve_dim,
1495              x, BT_INTEGER, di, REQUIRED, y, BT_INTEGER, di, REQUIRED);
1496
1497   add_sym_2 ("ddim", GFC_ISYM_DIM, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1498              gfc_check_x_yd, gfc_simplify_dim, gfc_resolve_dim,
1499              x, BT_REAL, dd, REQUIRED, y, BT_REAL, dd, REQUIRED);
1500
1501   make_generic ("dim", GFC_ISYM_DIM, GFC_STD_F77);
1502
1503   add_sym_2 ("dot_product", GFC_ISYM_DOT_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr,
1504              GFC_STD_F95, gfc_check_dot_product, gfc_simplify_dot_product, gfc_resolve_dot_product,
1505              va, BT_REAL, dr, REQUIRED, vb, BT_REAL, dr, REQUIRED);
1506
1507   make_generic ("dot_product", GFC_ISYM_DOT_PRODUCT, GFC_STD_F95);
1508
1509   add_sym_2 ("dprod", GFC_ISYM_DPROD,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1510              gfc_check_dprod, gfc_simplify_dprod, gfc_resolve_dprod,
1511              x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1512
1513   make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
1514
1515   add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
1516              NULL, NULL, NULL,
1517              a, BT_COMPLEX, dd, REQUIRED);
1518
1519   make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
1520
1521   add_sym_4 ("eoshift", GFC_ISYM_EOSHIFT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1522              gfc_check_eoshift, NULL, gfc_resolve_eoshift,
1523              ar, BT_REAL, dr, 0, sh, BT_INTEGER, ii, REQUIRED,
1524              bd, BT_REAL, dr, 1, dm, BT_INTEGER, ii, OPTIONAL);
1525
1526   make_generic ("eoshift", GFC_ISYM_EOSHIFT, GFC_STD_F95);
1527
1528   add_sym_1 ("epsilon", GFC_ISYM_EPSILON, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1529              gfc_check_x, gfc_simplify_epsilon, NULL,
1530              x, BT_REAL, dr, REQUIRED);
1531
1532   make_generic ("epsilon", GFC_ISYM_EPSILON, GFC_STD_F95);
1533
1534   /* G77 compatibility for the ERF() and ERFC() functions.  */
1535   add_sym_1 ("erf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1536              GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erf,
1537              gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1538
1539   add_sym_1 ("derf", GFC_ISYM_ERF, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1540              GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erf,
1541              gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1542
1543   make_generic ("erf", GFC_ISYM_ERF, GFC_STD_F2008);
1544
1545   add_sym_1 ("erfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1546              GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_erfc,
1547              gfc_resolve_g77_math1, x, BT_REAL, dr, REQUIRED);
1548
1549   add_sym_1 ("derfc", GFC_ISYM_ERFC, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd,
1550              GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_erfc,
1551              gfc_resolve_g77_math1, x, BT_REAL, dd, REQUIRED);
1552
1553   make_generic ("erfc", GFC_ISYM_ERFC, GFC_STD_F2008);
1554
1555   add_sym_1 ("erfc_scaled", GFC_ISYM_ERFC_SCALED, CLASS_ELEMENTAL, ACTUAL_NO,
1556              BT_REAL, dr, GFC_STD_F2008, gfc_check_fn_r,
1557              gfc_simplify_erfc_scaled, gfc_resolve_g77_math1, x, BT_REAL,
1558              dr, REQUIRED);
1559
1560   make_generic ("erfc_scaled", GFC_ISYM_ERFC_SCALED, GFC_STD_F2008);
1561
1562   /* G77 compatibility */
1563   add_sym_1 ("dtime", GFC_ISYM_DTIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4,  GFC_STD_GNU,
1564              gfc_check_dtime_etime, NULL, NULL,
1565              x, BT_REAL, 4, REQUIRED);
1566
1567   make_generic ("dtime", GFC_ISYM_DTIME, GFC_STD_GNU);
1568
1569   add_sym_1 ("etime", GFC_ISYM_ETIME, NO_CLASS, ACTUAL_NO, BT_REAL, 4,  GFC_STD_GNU,
1570              gfc_check_dtime_etime, NULL, NULL,
1571              x, BT_REAL, 4, REQUIRED);
1572
1573   make_generic ("etime", GFC_ISYM_ETIME, GFC_STD_GNU);
1574
1575   add_sym_1 ("exp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr,  GFC_STD_F77,
1576              gfc_check_fn_rc, gfc_simplify_exp, gfc_resolve_exp,
1577              x, BT_REAL, dr, REQUIRED);
1578
1579   add_sym_1 ("dexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
1580              gfc_check_fn_d, gfc_simplify_exp, gfc_resolve_exp,
1581              x, BT_REAL, dd, REQUIRED);
1582
1583   add_sym_1 ("cexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
1584              NULL, gfc_simplify_exp, gfc_resolve_exp,
1585              x, BT_COMPLEX, dz, REQUIRED);
1586
1587   add_sym_1 ("zexp", GFC_ISYM_EXP, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd,  GFC_STD_GNU,
1588              NULL, gfc_simplify_exp, gfc_resolve_exp, 
1589              x, BT_COMPLEX, dd, REQUIRED);
1590
1591   make_alias ("cdexp", GFC_STD_GNU);
1592
1593   make_generic ("exp", GFC_ISYM_EXP, GFC_STD_F77);
1594
1595   add_sym_1 ("exponent", GFC_ISYM_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1596              gfc_check_x, gfc_simplify_exponent, gfc_resolve_exponent,
1597              x, BT_REAL, dr, REQUIRED);
1598
1599   make_generic ("exponent", GFC_ISYM_EXPONENT, GFC_STD_F95);
1600
1601   add_sym_2 ("extends_type_of", GFC_ISYM_EXTENDS_TYPE_OF, CLASS_INQUIRY,
1602              ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1603              gfc_check_same_type_as, NULL, gfc_resolve_extends_type_of,
1604              a, BT_UNKNOWN, 0, REQUIRED,
1605              mo, BT_UNKNOWN, 0, REQUIRED);
1606
1607   add_sym_0 ("fdate",  GFC_ISYM_FDATE, NO_CLASS, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_GNU,
1608              NULL, NULL, gfc_resolve_fdate);
1609
1610   make_generic ("fdate", GFC_ISYM_FDATE, GFC_STD_GNU);
1611
1612   add_sym_2 ("floor", GFC_ISYM_FLOOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1613              gfc_check_a_ikind, gfc_simplify_floor, gfc_resolve_floor,
1614              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1615
1616   make_generic ("floor", GFC_ISYM_FLOOR, GFC_STD_F95);
1617
1618   /* G77 compatible fnum */
1619   add_sym_1 ("fnum", GFC_ISYM_FNUM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1620              gfc_check_fnum, NULL, gfc_resolve_fnum,
1621              ut, BT_INTEGER, di, REQUIRED);
1622
1623   make_generic ("fnum", GFC_ISYM_FNUM, GFC_STD_GNU);
1624
1625   add_sym_1 ("fraction", GFC_ISYM_FRACTION, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1626              gfc_check_x, gfc_simplify_fraction, gfc_resolve_fraction,
1627              x, BT_REAL, dr, REQUIRED);
1628
1629   make_generic ("fraction", GFC_ISYM_FRACTION, GFC_STD_F95);
1630
1631   add_sym_2 ("fstat", GFC_ISYM_FSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1632              GFC_STD_GNU, gfc_check_fstat, NULL, gfc_resolve_fstat,
1633              ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
1634
1635   make_generic ("fstat", GFC_ISYM_FSTAT, GFC_STD_GNU);
1636
1637   add_sym_1 ("ftell", GFC_ISYM_FTELL, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii, GFC_STD_GNU,
1638              gfc_check_ftell, NULL, gfc_resolve_ftell,
1639              ut, BT_INTEGER, di, REQUIRED);
1640
1641   make_generic ("ftell", GFC_ISYM_FTELL, GFC_STD_GNU);
1642
1643   add_sym_2 ("fgetc", GFC_ISYM_FGETC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1644              gfc_check_fgetputc, NULL, gfc_resolve_fgetc,
1645              ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1646
1647   make_generic ("fgetc", GFC_ISYM_FGETC, GFC_STD_GNU);
1648
1649   add_sym_1 ("fget", GFC_ISYM_FGET, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1650              gfc_check_fgetput, NULL, gfc_resolve_fget,
1651              c, BT_CHARACTER, dc, REQUIRED);
1652
1653   make_generic ("fget", GFC_ISYM_FGET, GFC_STD_GNU);
1654
1655   add_sym_2 ("fputc", GFC_ISYM_FPUTC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1656              gfc_check_fgetputc, NULL, gfc_resolve_fputc,
1657              ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED);
1658
1659   make_generic ("fputc", GFC_ISYM_FPUTC, GFC_STD_GNU);
1660
1661   add_sym_1 ("fput", GFC_ISYM_FPUT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1662              gfc_check_fgetput, NULL, gfc_resolve_fput,
1663              c, BT_CHARACTER, dc, REQUIRED);
1664
1665   make_generic ("fput", GFC_ISYM_FPUT, GFC_STD_GNU);
1666
1667   add_sym_1 ("gamma", GFC_ISYM_TGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr,
1668              GFC_STD_F2008, gfc_check_fn_r, gfc_simplify_gamma,
1669              gfc_resolve_gamma, x, BT_REAL, dr, REQUIRED);
1670
1671   add_sym_1 ("dgamma", GFC_ISYM_TGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1672              gfc_check_fn_d, gfc_simplify_gamma, gfc_resolve_gamma,
1673              x, BT_REAL, dr, REQUIRED);
1674
1675   make_generic ("gamma", GFC_ISYM_TGAMMA, GFC_STD_F2008);
1676
1677   /* Unix IDs (g77 compatibility)  */
1678   add_sym_1 ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,  GFC_STD_GNU,
1679              NULL, NULL, gfc_resolve_getcwd,
1680              c, BT_CHARACTER, dc, REQUIRED);
1681
1682   make_generic ("getcwd", GFC_ISYM_GETCWD, GFC_STD_GNU);
1683
1684   add_sym_0 ("getgid", GFC_ISYM_GETGID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1685              NULL, NULL, gfc_resolve_getgid);
1686
1687   make_generic ("getgid", GFC_ISYM_GETGID, GFC_STD_GNU);
1688
1689   add_sym_0 ("getpid", GFC_ISYM_GETPID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU, 
1690              NULL, NULL, gfc_resolve_getpid);
1691
1692   make_generic ("getpid", GFC_ISYM_GETPID, GFC_STD_GNU);
1693
1694   add_sym_0 ("getuid", GFC_ISYM_GETUID, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU, 
1695              NULL, NULL, gfc_resolve_getuid);
1696
1697   make_generic ("getuid", GFC_ISYM_GETUID, GFC_STD_GNU);
1698
1699   add_sym_1 ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1700              gfc_check_hostnm, NULL, gfc_resolve_hostnm,
1701              a, BT_CHARACTER, dc, REQUIRED);
1702
1703   make_generic ("hostnm", GFC_ISYM_HOSTNM, GFC_STD_GNU);
1704
1705   add_sym_1 ("huge", GFC_ISYM_HUGE, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
1706              gfc_check_huge, gfc_simplify_huge, NULL,
1707              x, BT_UNKNOWN, dr, REQUIRED);
1708
1709   make_generic ("huge", GFC_ISYM_HUGE, GFC_STD_F95);
1710
1711   add_sym_2 ("hypot", GFC_ISYM_HYPOT, CLASS_ELEMENTAL, ACTUAL_NO,
1712              BT_REAL, dr, GFC_STD_F2008,
1713              gfc_check_hypot, gfc_simplify_hypot, gfc_resolve_hypot,
1714              x, BT_REAL, dr, REQUIRED, y, BT_REAL, dr, REQUIRED);
1715
1716   make_generic ("hypot", GFC_ISYM_HYPOT, GFC_STD_F2008);
1717
1718   add_sym_2 ("iachar", GFC_ISYM_IACHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1719              BT_INTEGER, di, GFC_STD_F95,
1720              gfc_check_ichar_iachar, gfc_simplify_iachar, gfc_resolve_iachar,
1721              c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1722
1723   make_generic ("iachar", GFC_ISYM_IACHAR, GFC_STD_F95);
1724
1725   add_sym_2 ("iand", GFC_ISYM_IAND, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1726              gfc_check_iand, gfc_simplify_iand, gfc_resolve_iand,
1727              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1728
1729   make_generic ("iand", GFC_ISYM_IAND, GFC_STD_F95);
1730
1731   add_sym_2 ("and", GFC_ISYM_AND, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1732              gfc_check_and, gfc_simplify_and, gfc_resolve_and,
1733              i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1734
1735   make_generic ("and", GFC_ISYM_AND, GFC_STD_GNU);
1736
1737   add_sym_0 ("iargc", GFC_ISYM_IARGC, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1738              NULL, NULL, NULL);
1739
1740   make_generic ("iargc", GFC_ISYM_IARGC, GFC_STD_GNU);
1741
1742   add_sym_2 ("ibclr", GFC_ISYM_IBCLR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1743              gfc_check_bitfcn, gfc_simplify_ibclr, gfc_resolve_ibclr,
1744              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1745
1746   make_generic ("ibclr", GFC_ISYM_IBCLR, GFC_STD_F95);
1747
1748   add_sym_3 ("ibits", GFC_ISYM_IBITS, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1749              gfc_check_ibits, gfc_simplify_ibits, gfc_resolve_ibits,
1750              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED,
1751              ln, BT_INTEGER, di, REQUIRED);
1752
1753   make_generic ("ibits", GFC_ISYM_IBITS, GFC_STD_F95);
1754
1755   add_sym_2 ("ibset", GFC_ISYM_IBSET, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1756              gfc_check_bitfcn, gfc_simplify_ibset, gfc_resolve_ibset,
1757              i, BT_INTEGER, di, REQUIRED, pos, BT_INTEGER, di, REQUIRED);
1758
1759   make_generic ("ibset", GFC_ISYM_IBSET, GFC_STD_F95);
1760
1761   add_sym_2 ("ichar", GFC_ISYM_ICHAR, CLASS_ELEMENTAL, ACTUAL_NO,
1762              BT_INTEGER, di, GFC_STD_F77,
1763              gfc_check_ichar_iachar, gfc_simplify_ichar, gfc_resolve_ichar,
1764              c, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1765
1766   make_generic ("ichar", GFC_ISYM_ICHAR, GFC_STD_F77);
1767
1768   add_sym_2 ("ieor", GFC_ISYM_IEOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1769              gfc_check_ieor, gfc_simplify_ieor, gfc_resolve_ieor,
1770              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1771
1772   make_generic ("ieor", GFC_ISYM_IEOR, GFC_STD_F95);
1773
1774   add_sym_2 ("xor", GFC_ISYM_XOR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1775              gfc_check_and, gfc_simplify_xor, gfc_resolve_xor,
1776              i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1777
1778   make_generic ("xor", GFC_ISYM_XOR, GFC_STD_GNU);
1779
1780   add_sym_0 ("ierrno", GFC_ISYM_IERRNO, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1781              NULL, NULL, gfc_resolve_ierrno);
1782
1783   make_generic ("ierrno", GFC_ISYM_IERRNO, GFC_STD_GNU);
1784
1785   add_sym_2 ("image_index", GFC_ISYM_IMAGE_INDEX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2008,
1786              gfc_check_image_index, gfc_simplify_image_index, gfc_resolve_image_index,
1787              ca, BT_REAL, dr, REQUIRED, sub, BT_INTEGER, ii, REQUIRED);
1788
1789   /* The resolution function for INDEX is called gfc_resolve_index_func
1790      because the name gfc_resolve_index is already used in resolve.c.  */
1791   add_sym_4 ("index", GFC_ISYM_INDEX, CLASS_ELEMENTAL, ACTUAL_YES,
1792              BT_INTEGER, di, GFC_STD_F77,
1793              gfc_check_index, gfc_simplify_index, gfc_resolve_index_func,
1794              stg, BT_CHARACTER, dc, REQUIRED, ssg, BT_CHARACTER, dc, REQUIRED,
1795              bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
1796
1797   make_generic ("index", GFC_ISYM_INDEX, GFC_STD_F77);
1798
1799   add_sym_2 ("int", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1800              gfc_check_int, gfc_simplify_int, gfc_resolve_int,
1801              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1802
1803   add_sym_1 ("ifix", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1804              NULL, gfc_simplify_ifix, NULL,
1805              a, BT_REAL, dr, REQUIRED);
1806
1807   add_sym_1 ("idint", GFC_ISYM_INT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
1808              NULL, gfc_simplify_idint, NULL,
1809              a, BT_REAL, dd, REQUIRED);
1810
1811   make_generic ("int", GFC_ISYM_INT, GFC_STD_F77);
1812
1813   add_sym_1 ("int2", GFC_ISYM_INT2, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1814              gfc_check_intconv, gfc_simplify_int2, gfc_resolve_int2,
1815              a, BT_REAL, dr, REQUIRED);
1816
1817   make_alias ("short", GFC_STD_GNU);
1818
1819   make_generic ("int2", GFC_ISYM_INT2, GFC_STD_GNU);
1820
1821   add_sym_1 ("int8", GFC_ISYM_INT8, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1822              gfc_check_intconv, gfc_simplify_int8, gfc_resolve_int8,
1823              a, BT_REAL, dr, REQUIRED);
1824
1825   make_generic ("int8", GFC_ISYM_INT8, GFC_STD_GNU);
1826
1827   add_sym_1 ("long", GFC_ISYM_LONG, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1828              gfc_check_intconv, gfc_simplify_long, gfc_resolve_long,
1829              a, BT_REAL, dr, REQUIRED);
1830
1831   make_generic ("long", GFC_ISYM_LONG, GFC_STD_GNU);
1832
1833   add_sym_2 ("ior", GFC_ISYM_IOR, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1834              gfc_check_ior, gfc_simplify_ior, gfc_resolve_ior,
1835              i, BT_INTEGER, di, REQUIRED, j, BT_INTEGER, di, REQUIRED);
1836
1837   make_generic ("ior", GFC_ISYM_IOR, GFC_STD_F95);
1838
1839   add_sym_2 ("or", GFC_ISYM_OR, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1840              gfc_check_and, gfc_simplify_or, gfc_resolve_or,
1841              i, BT_UNKNOWN, 0, REQUIRED, j, BT_UNKNOWN, 0, REQUIRED);
1842
1843   make_generic ("or", GFC_ISYM_OR, GFC_STD_GNU);
1844
1845   /* The following function is for G77 compatibility.  */
1846   add_sym_1 ("irand", GFC_ISYM_IRAND, NO_CLASS, ACTUAL_NO, BT_INTEGER, 4, GFC_STD_GNU,
1847              gfc_check_irand, NULL, NULL,
1848              i, BT_INTEGER, 4, OPTIONAL);
1849
1850   make_generic ("irand", GFC_ISYM_IRAND, GFC_STD_GNU);
1851
1852   add_sym_1 ("isatty", GFC_ISYM_ISATTY, NO_CLASS, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_GNU,
1853              gfc_check_isatty, NULL, gfc_resolve_isatty,
1854              ut, BT_INTEGER, di, REQUIRED);
1855
1856   make_generic ("isatty", GFC_ISYM_ISATTY, GFC_STD_GNU);
1857
1858   add_sym_1 ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END,
1859              CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1860              gfc_check_i, gfc_simplify_is_iostat_end, NULL,
1861              i, BT_INTEGER, 0, REQUIRED);
1862
1863   make_generic ("is_iostat_end", GFC_ISYM_IS_IOSTAT_END, GFC_STD_F2003);
1864
1865   add_sym_1 ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR,
1866              CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003,
1867              gfc_check_i, gfc_simplify_is_iostat_eor, NULL,
1868              i, BT_INTEGER, 0, REQUIRED);
1869
1870   make_generic ("is_iostat_eor", GFC_ISYM_IS_IOSTAT_EOR, GFC_STD_F2003);
1871
1872   add_sym_1 ("isnan", GFC_ISYM_ISNAN, CLASS_ELEMENTAL, ACTUAL_NO,
1873              BT_LOGICAL, dl, GFC_STD_GNU,
1874              gfc_check_isnan, gfc_simplify_isnan, NULL,
1875              x, BT_REAL, 0, REQUIRED);
1876
1877   make_generic ("isnan", GFC_ISYM_ISNAN, GFC_STD_GNU);
1878
1879   add_sym_2 ("rshift", GFC_ISYM_RSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1880              gfc_check_ishft, NULL, gfc_resolve_rshift,
1881              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1882
1883   make_generic ("rshift", GFC_ISYM_RSHIFT, GFC_STD_GNU);
1884
1885   add_sym_2 ("lshift", GFC_ISYM_LSHIFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1886              gfc_check_ishft, NULL, gfc_resolve_lshift,
1887              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1888
1889   make_generic ("lshift", GFC_ISYM_LSHIFT, GFC_STD_GNU);
1890
1891   add_sym_2 ("ishft", GFC_ISYM_ISHFT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1892              gfc_check_ishft, gfc_simplify_ishft, gfc_resolve_ishft,
1893              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED);
1894
1895   make_generic ("ishft", GFC_ISYM_ISHFT, GFC_STD_F95);
1896
1897   add_sym_3 ("ishftc", GFC_ISYM_ISHFTC, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1898              gfc_check_ishftc, gfc_simplify_ishftc, gfc_resolve_ishftc,
1899              i, BT_INTEGER, di, REQUIRED, sh, BT_INTEGER, di, REQUIRED,
1900              sz, BT_INTEGER, di, OPTIONAL);
1901
1902   make_generic ("ishftc", GFC_ISYM_ISHFTC, GFC_STD_F95);
1903
1904   add_sym_2 ("kill", GFC_ISYM_KILL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
1905              gfc_check_kill, NULL, gfc_resolve_kill,
1906              a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
1907
1908   make_generic ("kill", GFC_ISYM_KILL, GFC_STD_GNU);
1909
1910   add_sym_1 ("kind", GFC_ISYM_KIND, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
1911              gfc_check_kind, gfc_simplify_kind, NULL,
1912              x, BT_REAL, dr, REQUIRED);
1913
1914   make_generic ("kind", GFC_ISYM_KIND, GFC_STD_F95);
1915
1916   add_sym_3 ("lbound", GFC_ISYM_LBOUND, CLASS_INQUIRY, ACTUAL_NO,
1917              BT_INTEGER, di, GFC_STD_F95,
1918              gfc_check_lbound, gfc_simplify_lbound, gfc_resolve_lbound,
1919              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, di, OPTIONAL,
1920              kind, BT_INTEGER, di, OPTIONAL);
1921
1922   make_generic ("lbound", GFC_ISYM_LBOUND, GFC_STD_F95);
1923
1924   add_sym_3 ("lcobound", GFC_ISYM_LCOBOUND, CLASS_INQUIRY, ACTUAL_NO,
1925              BT_INTEGER, di, GFC_STD_F2008,
1926              gfc_check_lcobound, gfc_simplify_lcobound, gfc_resolve_lcobound,
1927              ca, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
1928              kind, BT_INTEGER, di, OPTIONAL);
1929
1930   make_generic ("lcobound", GFC_ISYM_LCOBOUND, GFC_STD_F2008);
1931
1932   add_sym_1 ("leadz", GFC_ISYM_LEADZ, CLASS_ELEMENTAL, ACTUAL_NO,
1933              BT_INTEGER, di, GFC_STD_F2008,
1934              gfc_check_i, gfc_simplify_leadz, NULL,
1935              i, BT_INTEGER, di, REQUIRED);
1936
1937   make_generic ("leadz", GFC_ISYM_LEADZ, GFC_STD_F2008);
1938
1939   add_sym_2 ("len", GFC_ISYM_LEN, CLASS_INQUIRY, ACTUAL_YES,
1940              BT_INTEGER, di, GFC_STD_F77,
1941              gfc_check_len_lentrim, gfc_simplify_len, gfc_resolve_len,
1942              stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1943
1944   make_generic ("len", GFC_ISYM_LEN, GFC_STD_F77);
1945
1946   add_sym_2 ("len_trim", GFC_ISYM_LEN_TRIM, CLASS_ELEMENTAL, ACTUAL_NO,
1947              BT_INTEGER, di, GFC_STD_F95,
1948              gfc_check_len_lentrim, gfc_simplify_len_trim, gfc_resolve_len_trim,
1949              stg, BT_CHARACTER, dc, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
1950
1951   make_alias ("lnblnk", GFC_STD_GNU);
1952
1953   make_generic ("len_trim", GFC_ISYM_LEN_TRIM, GFC_STD_F95);
1954
1955   add_sym_1 ("lgamma", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL,
1956              dr, GFC_STD_GNU,
1957              gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1958              x, BT_REAL, dr, REQUIRED);
1959
1960   make_alias ("log_gamma", GFC_STD_F2008);
1961
1962   add_sym_1 ("algama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1963              gfc_check_fn_r, gfc_simplify_lgamma, gfc_resolve_lgamma,
1964              x, BT_REAL, dr, REQUIRED);
1965
1966   add_sym_1 ("dlgama", GFC_ISYM_LGAMMA, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
1967              gfc_check_fn_d, gfc_simplify_lgamma, gfc_resolve_lgamma,
1968              x, BT_REAL, dr, REQUIRED);
1969
1970   make_generic ("log_gamma", GFC_ISYM_LGAMMA, GFC_STD_F2008);
1971
1972
1973   add_sym_2 ("lge", GFC_ISYM_LGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1974              GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lge, NULL,
1975              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1976
1977   make_generic ("lge", GFC_ISYM_LGE, GFC_STD_F77);
1978
1979   add_sym_2 ("lgt", GFC_ISYM_LGT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1980              GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lgt, NULL,
1981              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1982
1983   make_generic ("lgt", GFC_ISYM_LGT, GFC_STD_F77);
1984
1985   add_sym_2 ("lle",GFC_ISYM_LLE,  CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1986              GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_lle, NULL,
1987              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1988
1989   make_generic ("lle", GFC_ISYM_LLE, GFC_STD_F77);
1990
1991   add_sym_2 ("llt", GFC_ISYM_LLT, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl,
1992              GFC_STD_F77, gfc_check_lge_lgt_lle_llt, gfc_simplify_llt, NULL,
1993              sta, BT_CHARACTER, dc, REQUIRED, stb, BT_CHARACTER, dc, REQUIRED);
1994
1995   make_generic ("llt", GFC_ISYM_LLT, GFC_STD_F77);
1996
1997   add_sym_2 ("link", GFC_ISYM_LINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
1998              GFC_STD_GNU, gfc_check_link, NULL, gfc_resolve_link,
1999              p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2000
2001   make_generic ("link", GFC_ISYM_LINK, GFC_STD_GNU);
2002   
2003   add_sym_1 ("log", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2004              gfc_check_fn_rc, gfc_simplify_log, gfc_resolve_log,
2005              x, BT_REAL, dr, REQUIRED);
2006
2007   add_sym_1 ("alog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2008              NULL, gfc_simplify_log, gfc_resolve_log,
2009              x, BT_REAL, dr, REQUIRED);
2010
2011   add_sym_1 ("dlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2012              gfc_check_fn_d, gfc_simplify_log, gfc_resolve_log,
2013              x, BT_REAL, dd, REQUIRED);
2014
2015   add_sym_1 ("clog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2016              NULL, gfc_simplify_log, gfc_resolve_log,
2017              x, BT_COMPLEX, dz, REQUIRED);
2018
2019   add_sym_1 ("zlog", GFC_ISYM_LOG, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd,  GFC_STD_GNU,
2020              NULL, gfc_simplify_log, gfc_resolve_log,
2021              x, BT_COMPLEX, dd, REQUIRED);
2022
2023   make_alias ("cdlog", GFC_STD_GNU);
2024
2025   make_generic ("log", GFC_ISYM_LOG, GFC_STD_F77);
2026
2027   add_sym_1 ("log10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2028              gfc_check_fn_r, gfc_simplify_log10, gfc_resolve_log10,
2029              x, BT_REAL, dr, REQUIRED);
2030
2031   add_sym_1 ("alog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2032              NULL, gfc_simplify_log10, gfc_resolve_log10,
2033              x, BT_REAL, dr, REQUIRED);
2034
2035   add_sym_1 ("dlog10", GFC_ISYM_LOG10, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2036              gfc_check_fn_d, gfc_simplify_log10, gfc_resolve_log10,
2037              x, BT_REAL, dd, REQUIRED);
2038
2039   make_generic ("log10", GFC_ISYM_LOG10, GFC_STD_F77);
2040
2041   add_sym_2 ("logical", GFC_ISYM_LOGICAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F95,
2042              gfc_check_logical, gfc_simplify_logical, gfc_resolve_logical,
2043              l, BT_LOGICAL, dl, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2044
2045   make_generic ("logical", GFC_ISYM_LOGICAL, GFC_STD_F95);
2046
2047   add_sym_2 ("lstat", GFC_ISYM_LSTAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2048              GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_lstat,
2049              nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2050
2051   make_generic ("lstat", GFC_ISYM_LSTAT, GFC_STD_GNU);
2052
2053   add_sym_1 ("malloc", GFC_ISYM_MALLOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2054              GFC_STD_GNU, gfc_check_malloc, NULL, gfc_resolve_malloc,
2055              sz, BT_INTEGER, di, REQUIRED);
2056
2057   make_generic ("malloc", GFC_ISYM_MALLOC, GFC_STD_GNU);
2058
2059   add_sym_2 ("matmul", GFC_ISYM_MATMUL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2060              gfc_check_matmul, gfc_simplify_matmul, gfc_resolve_matmul,
2061              ma, BT_REAL, dr, REQUIRED, mb, BT_REAL, dr, REQUIRED);
2062
2063   make_generic ("matmul", GFC_ISYM_MATMUL, GFC_STD_F95);
2064
2065   /* Note: amax0 is equivalent to real(max), max1 is equivalent to
2066      int(max).  The max function must take at least two arguments.  */
2067
2068   add_sym_1m ("max", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2069              gfc_check_min_max, gfc_simplify_max, gfc_resolve_max,
2070              a1, BT_UNKNOWN, dr, REQUIRED, a2, BT_UNKNOWN, dr, REQUIRED);
2071
2072   add_sym_1m ("max0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2073              gfc_check_min_max_integer, gfc_simplify_max, NULL,
2074              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2075
2076   add_sym_1m ("amax0", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2077              gfc_check_min_max_integer, gfc_simplify_max, NULL,
2078              a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2079
2080   add_sym_1m ("amax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2081              gfc_check_min_max_real, gfc_simplify_max, NULL,
2082              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2083
2084   add_sym_1m ("max1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2085              gfc_check_min_max_real, gfc_simplify_max, NULL,
2086              a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2087
2088   add_sym_1m ("dmax1", GFC_ISYM_MAX, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2089              gfc_check_min_max_double, gfc_simplify_max, NULL,
2090              a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2091
2092   make_generic ("max", GFC_ISYM_MAX, GFC_STD_F77);
2093
2094   add_sym_1 ("maxexponent", GFC_ISYM_MAXEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2095              GFC_STD_F95, gfc_check_x, gfc_simplify_maxexponent, NULL,
2096              x, BT_UNKNOWN, dr, REQUIRED);
2097
2098   make_generic ("maxexponent", GFC_ISYM_MAXEXPONENT, GFC_STD_F95);
2099
2100   add_sym_3ml ("maxloc", GFC_ISYM_MAXLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2101                gfc_check_minloc_maxloc, NULL, gfc_resolve_maxloc,
2102                ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2103                msk, BT_LOGICAL, dl, OPTIONAL);
2104
2105   make_generic ("maxloc", GFC_ISYM_MAXLOC, GFC_STD_F95);
2106
2107   add_sym_3red ("maxval", GFC_ISYM_MAXVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2108                 gfc_check_minval_maxval, gfc_simplify_maxval, gfc_resolve_maxval,
2109                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2110                 msk, BT_LOGICAL, dl, OPTIONAL);
2111
2112   make_generic ("maxval", GFC_ISYM_MAXVAL, GFC_STD_F95);
2113
2114   add_sym_0 ("mclock", GFC_ISYM_MCLOCK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2115              GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock);
2116
2117   make_generic ("mclock", GFC_ISYM_MCLOCK, GFC_STD_GNU);
2118
2119   add_sym_0 ("mclock8", GFC_ISYM_MCLOCK8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2120              GFC_STD_GNU, NULL, NULL, gfc_resolve_mclock8);
2121
2122   make_generic ("mclock8", GFC_ISYM_MCLOCK8, GFC_STD_GNU);
2123
2124   add_sym_3 ("merge", GFC_ISYM_MERGE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2125              gfc_check_merge, gfc_simplify_merge, gfc_resolve_merge,
2126              ts, BT_REAL, dr, REQUIRED, fs, BT_REAL, dr, REQUIRED,
2127              msk, BT_LOGICAL, dl, REQUIRED);
2128
2129   make_generic ("merge", GFC_ISYM_MERGE, GFC_STD_F95);
2130
2131   /* Note: amin0 is equivalent to real(min), min1 is equivalent to
2132      int(min).  */
2133
2134   add_sym_1m ("min", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_UNKNOWN, 0, GFC_STD_F77,
2135               gfc_check_min_max, gfc_simplify_min, gfc_resolve_min,
2136               a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2137
2138   add_sym_1m ("min0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2139               gfc_check_min_max_integer, gfc_simplify_min, NULL,
2140               a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2141
2142   add_sym_1m ("amin0", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2143               gfc_check_min_max_integer, gfc_simplify_min, NULL,
2144               a1, BT_INTEGER, di, REQUIRED, a2, BT_INTEGER, di, REQUIRED);
2145
2146   add_sym_1m ("amin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2147               gfc_check_min_max_real, gfc_simplify_min, NULL,
2148               a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2149
2150   add_sym_1m ("min1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F77,
2151               gfc_check_min_max_real, gfc_simplify_min, NULL,
2152               a1, BT_REAL, dr, REQUIRED, a2, BT_REAL, dr, REQUIRED);
2153
2154   add_sym_1m ("dmin1", GFC_ISYM_MIN, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_F77,
2155               gfc_check_min_max_double, gfc_simplify_min, NULL,
2156               a1, BT_REAL, dd, REQUIRED, a2, BT_REAL, dd, REQUIRED);
2157
2158   make_generic ("min", GFC_ISYM_MIN, GFC_STD_F77);
2159
2160   add_sym_1 ("minexponent", GFC_ISYM_MINEXPONENT, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
2161              GFC_STD_F95, gfc_check_x, gfc_simplify_minexponent, NULL,
2162              x, BT_UNKNOWN, dr, REQUIRED);
2163
2164   make_generic ("minexponent", GFC_ISYM_MINEXPONENT, GFC_STD_F95);
2165
2166   add_sym_3ml ("minloc", GFC_ISYM_MINLOC, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2167                gfc_check_minloc_maxloc, NULL, gfc_resolve_minloc,
2168                ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2169                msk, BT_LOGICAL, dl, OPTIONAL);
2170
2171   make_generic ("minloc", GFC_ISYM_MINLOC, GFC_STD_F95);
2172
2173   add_sym_3red ("minval", GFC_ISYM_MINVAL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2174                 gfc_check_minval_maxval, gfc_simplify_minval, gfc_resolve_minval,
2175                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2176                 msk, BT_LOGICAL, dl, OPTIONAL);
2177
2178   make_generic ("minval", GFC_ISYM_MINVAL, GFC_STD_F95);
2179
2180   add_sym_2 ("mod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2181              gfc_check_a_p, gfc_simplify_mod, gfc_resolve_mod,
2182              a, BT_INTEGER, di, REQUIRED, p, BT_INTEGER, di, REQUIRED);
2183
2184   add_sym_2 ("amod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2185              NULL, gfc_simplify_mod, gfc_resolve_mod,
2186              a, BT_REAL, dr, REQUIRED, p, BT_REAL, dr, REQUIRED);
2187
2188   add_sym_2 ("dmod", GFC_ISYM_MOD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2189              gfc_check_x_yd, gfc_simplify_mod, gfc_resolve_mod,
2190              a, BT_REAL, dd, REQUIRED, p, BT_REAL, dd, REQUIRED);
2191
2192   make_generic ("mod", GFC_ISYM_MOD, GFC_STD_F77);
2193
2194   add_sym_2 ("modulo", GFC_ISYM_MODULO, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, di, GFC_STD_F95,
2195              gfc_check_a_p, gfc_simplify_modulo, gfc_resolve_modulo,
2196              a, BT_REAL, di, REQUIRED, p, BT_REAL, di, REQUIRED);
2197
2198   make_generic ("modulo", GFC_ISYM_MODULO, GFC_STD_F95);
2199
2200   add_sym_2 ("nearest", GFC_ISYM_NEAREST, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2201              gfc_check_nearest, gfc_simplify_nearest, gfc_resolve_nearest,
2202              x, BT_REAL, dr, REQUIRED, s, BT_REAL, dr, REQUIRED);
2203
2204   make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95);
2205
2206   add_sym_1 ("new_line", GFC_ISYM_NEW_LINE, CLASS_INQUIRY, ACTUAL_NO, BT_CHARACTER, dc,
2207              GFC_STD_F2003, gfc_check_new_line, gfc_simplify_new_line, NULL,
2208              a, BT_CHARACTER, dc, REQUIRED);
2209
2210   make_generic ("new_line", GFC_ISYM_NEW_LINE, GFC_STD_F2003);
2211
2212   add_sym_2 ("nint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2213              gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint,
2214              a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2215
2216   add_sym_1 ("idnint", GFC_ISYM_NINT, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2217              gfc_check_idnint, gfc_simplify_idnint, gfc_resolve_idnint,
2218              a, BT_REAL, dd, REQUIRED);
2219
2220   make_generic ("nint", GFC_ISYM_NINT, GFC_STD_F77);
2221
2222   add_sym_1 ("not", GFC_ISYM_NOT, CLASS_ELEMENTAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2223              gfc_check_i, gfc_simplify_not, gfc_resolve_not,
2224              i, BT_INTEGER, di, REQUIRED);
2225
2226   make_generic ("not", GFC_ISYM_NOT, GFC_STD_F95);
2227
2228   add_sym_1 ("null", GFC_ISYM_NULL, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2229              gfc_check_null, gfc_simplify_null, NULL,
2230              mo, BT_INTEGER, di, OPTIONAL);
2231
2232   make_generic ("null", GFC_ISYM_NULL, GFC_STD_F95);
2233
2234   add_sym_0 ("num_images", GFC_ISYM_NUMIMAGES, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2008,
2235              NULL, gfc_simplify_num_images, NULL);
2236
2237   add_sym_3 ("pack", GFC_ISYM_PACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2238              gfc_check_pack, gfc_simplify_pack, gfc_resolve_pack,
2239              ar, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2240              v, BT_REAL, dr, OPTIONAL);
2241
2242   make_generic ("pack", GFC_ISYM_PACK, GFC_STD_F95);
2243
2244   add_sym_1 ("precision", GFC_ISYM_PRECISION, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2245              gfc_check_precision, gfc_simplify_precision, NULL,
2246              x, BT_UNKNOWN, 0, REQUIRED);
2247
2248   make_generic ("precision", GFC_ISYM_PRECISION, GFC_STD_F95);
2249
2250   add_sym_1_intent ("present", GFC_ISYM_PRESENT, CLASS_INQUIRY, ACTUAL_NO,
2251                     BT_LOGICAL, dl, GFC_STD_F95, gfc_check_present, NULL, NULL,
2252                     a, BT_REAL, dr, REQUIRED, INTENT_UNKNOWN);
2253
2254   make_generic ("present", GFC_ISYM_PRESENT, GFC_STD_F95);
2255
2256   add_sym_3red ("product", GFC_ISYM_PRODUCT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2257                 gfc_check_product_sum, gfc_simplify_product, gfc_resolve_product,
2258                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2259                 msk, BT_LOGICAL, dl, OPTIONAL);
2260
2261   make_generic ("product", GFC_ISYM_PRODUCT, GFC_STD_F95);
2262
2263   add_sym_1 ("radix", GFC_ISYM_RADIX, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2264              gfc_check_radix, gfc_simplify_radix, NULL,
2265              x, BT_UNKNOWN, 0, REQUIRED);
2266
2267   make_generic ("radix", GFC_ISYM_RADIX, GFC_STD_F95);
2268
2269   /* The following function is for G77 compatibility.  */
2270   add_sym_1 ("rand", GFC_ISYM_RAND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2271              gfc_check_rand, NULL, NULL,
2272              i, BT_INTEGER, 4, OPTIONAL);
2273
2274   /* Compatibility with HP FORTRAN 77/iX Reference.  Note, rand() and ran()
2275      use slightly different shoddy multiplicative congruential PRNG.  */
2276   make_alias ("ran", GFC_STD_GNU);
2277
2278   make_generic ("rand", GFC_ISYM_RAND, GFC_STD_GNU);
2279
2280   add_sym_1 ("range", GFC_ISYM_RANGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2281              gfc_check_range, gfc_simplify_range, NULL,
2282              x, BT_REAL, dr, REQUIRED);
2283
2284   make_generic ("range", GFC_ISYM_RANGE, GFC_STD_F95);
2285
2286   add_sym_2 ("real", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2287              gfc_check_real, gfc_simplify_real, gfc_resolve_real,
2288              a, BT_UNKNOWN, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL);
2289
2290   /* This provides compatibility with g77.  */
2291   add_sym_1 ("realpart", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2292              gfc_check_fn_c, gfc_simplify_realpart, gfc_resolve_realpart,
2293              a, BT_UNKNOWN, dr, REQUIRED);
2294
2295   add_sym_1 ("float", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2296              gfc_check_float, gfc_simplify_float, NULL,
2297              a, BT_INTEGER, di, REQUIRED);
2298
2299   add_sym_1 ("dfloat", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
2300              gfc_check_float, gfc_simplify_dble, gfc_resolve_dble,
2301              a, BT_REAL, dr, REQUIRED);
2302
2303   add_sym_1 ("sngl", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F77,
2304              gfc_check_sngl, gfc_simplify_sngl, NULL,
2305              a, BT_REAL, dd, REQUIRED);
2306
2307   make_generic ("real", GFC_ISYM_REAL, GFC_STD_F77);
2308
2309   add_sym_2 ("rename", GFC_ISYM_RENAME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2310              GFC_STD_GNU, gfc_check_rename, NULL, gfc_resolve_rename,
2311              p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2312
2313   make_generic ("rename", GFC_ISYM_RENAME, GFC_STD_GNU);
2314   
2315   add_sym_2 ("repeat", GFC_ISYM_REPEAT, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2316              gfc_check_repeat, gfc_simplify_repeat, gfc_resolve_repeat,
2317              stg, BT_CHARACTER, dc, REQUIRED, ncopies, BT_INTEGER, di, REQUIRED);
2318
2319   make_generic ("repeat", GFC_ISYM_REPEAT, GFC_STD_F95);
2320
2321   add_sym_4 ("reshape", GFC_ISYM_RESHAPE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2322              gfc_check_reshape, gfc_simplify_reshape, gfc_resolve_reshape,
2323              src, BT_REAL, dr, REQUIRED, shp, BT_INTEGER, ii, REQUIRED,
2324              pad, BT_REAL, dr, OPTIONAL, ord, BT_INTEGER, ii, OPTIONAL);
2325
2326   make_generic ("reshape", GFC_ISYM_RESHAPE, GFC_STD_F95);
2327
2328   add_sym_1 ("rrspacing", GFC_ISYM_RRSPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2329              gfc_check_x, gfc_simplify_rrspacing, gfc_resolve_rrspacing,
2330              x, BT_REAL, dr, REQUIRED);
2331
2332   make_generic ("rrspacing", GFC_ISYM_RRSPACING, GFC_STD_F95);
2333
2334   add_sym_2 ("same_type_as", GFC_ISYM_SAME_TYPE_AS, CLASS_INQUIRY, ACTUAL_NO,
2335              BT_LOGICAL, dl, GFC_STD_F2003,
2336              gfc_check_same_type_as, NULL, NULL,
2337              a, BT_UNKNOWN, 0, REQUIRED,
2338              b, BT_UNKNOWN, 0, REQUIRED);
2339
2340   add_sym_2 ("scale", GFC_ISYM_SCALE, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2341              gfc_check_scale, gfc_simplify_scale, gfc_resolve_scale,
2342              x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2343
2344   make_generic ("scale", GFC_ISYM_SCALE, GFC_STD_F95);
2345
2346   add_sym_4 ("scan", GFC_ISYM_SCAN, CLASS_ELEMENTAL, ACTUAL_NO,
2347              BT_INTEGER, di, GFC_STD_F95,
2348              gfc_check_scan, gfc_simplify_scan, gfc_resolve_scan,
2349              stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2350              bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2351
2352   make_generic ("scan", GFC_ISYM_SCAN, GFC_STD_F95);
2353
2354   /* Added for G77 compatibility garbage.  */
2355   add_sym_0 ("second", GFC_ISYM_SECOND, NO_CLASS, ACTUAL_NO, BT_REAL, 4, GFC_STD_GNU,
2356              NULL, NULL, NULL);
2357
2358   make_generic ("second", GFC_ISYM_SECOND, GFC_STD_GNU);
2359
2360   /* Added for G77 compatibility.  */
2361   add_sym_1 ("secnds", GFC_ISYM_SECNDS, NO_CLASS, ACTUAL_NO, BT_REAL, dr, GFC_STD_GNU,
2362              gfc_check_secnds, NULL, gfc_resolve_secnds,
2363              x, BT_REAL, dr, REQUIRED);
2364
2365   make_generic ("secnds", GFC_ISYM_SECNDS, GFC_STD_GNU);
2366
2367   add_sym_1 ("selected_char_kind", GFC_ISYM_SC_KIND, CLASS_TRANSFORMATIONAL,
2368              ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2003,
2369              gfc_check_selected_char_kind, gfc_simplify_selected_char_kind,
2370              NULL, nm, BT_CHARACTER, dc, REQUIRED);
2371
2372   make_generic ("selected_char_kind", GFC_ISYM_SC_KIND, GFC_STD_F2003);
2373
2374   add_sym_1 ("selected_int_kind", GFC_ISYM_SI_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2375              GFC_STD_F95, gfc_check_selected_int_kind,
2376              gfc_simplify_selected_int_kind, NULL, r, BT_INTEGER, di, REQUIRED);
2377
2378   make_generic ("selected_int_kind", GFC_ISYM_SI_KIND, GFC_STD_F95);
2379
2380   add_sym_3 ("selected_real_kind", GFC_ISYM_SR_KIND, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_INTEGER, di,
2381              GFC_STD_F95, gfc_check_selected_real_kind,
2382              gfc_simplify_selected_real_kind, NULL,
2383              p, BT_INTEGER, di, OPTIONAL, r, BT_INTEGER, di, OPTIONAL,
2384              "radix", BT_INTEGER, di, OPTIONAL);
2385
2386   make_generic ("selected_real_kind", GFC_ISYM_SR_KIND, GFC_STD_F95);
2387
2388   add_sym_2 ("set_exponent", GFC_ISYM_SET_EXPONENT, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2389              gfc_check_set_exponent, gfc_simplify_set_exponent,
2390              gfc_resolve_set_exponent,
2391              x, BT_REAL, dr, REQUIRED, i, BT_INTEGER, di, REQUIRED);
2392
2393   make_generic ("set_exponent", GFC_ISYM_SET_EXPONENT, GFC_STD_F95);
2394
2395   add_sym_1 ("shape", GFC_ISYM_SHAPE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F95,
2396              gfc_check_shape, gfc_simplify_shape, gfc_resolve_shape,
2397              src, BT_REAL, dr, REQUIRED);
2398
2399   make_generic ("shape", GFC_ISYM_SHAPE, GFC_STD_F95);
2400
2401   add_sym_2 ("sign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2402              gfc_check_sign, gfc_simplify_sign, gfc_resolve_sign,
2403              a, BT_REAL, dr, REQUIRED, b, BT_REAL, dr, REQUIRED);
2404
2405   add_sym_2 ("isign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_INTEGER, di, GFC_STD_F77,
2406              NULL, gfc_simplify_sign, gfc_resolve_sign,
2407              a, BT_INTEGER, di, REQUIRED, b, BT_INTEGER, di, REQUIRED);
2408
2409   add_sym_2 ("dsign", GFC_ISYM_SIGN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2410              gfc_check_x_yd, gfc_simplify_sign, gfc_resolve_sign,
2411              a, BT_REAL, dd, REQUIRED, b, BT_REAL, dd, REQUIRED);
2412
2413   make_generic ("sign", GFC_ISYM_SIGN, GFC_STD_F77);
2414
2415   add_sym_2 ("signal", GFC_ISYM_SIGNAL, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2416              gfc_check_signal, NULL, gfc_resolve_signal,
2417              num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
2418
2419   make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
2420
2421   add_sym_1 ("sin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2422              gfc_check_fn_rc, gfc_simplify_sin, gfc_resolve_sin,
2423              x, BT_REAL, dr, REQUIRED);
2424
2425   add_sym_1 ("dsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2426              gfc_check_fn_d, gfc_simplify_sin, gfc_resolve_sin,
2427              x, BT_REAL, dd, REQUIRED);
2428
2429   add_sym_1 ("csin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2430              NULL, gfc_simplify_sin, gfc_resolve_sin,
2431              x, BT_COMPLEX, dz, REQUIRED);
2432
2433   add_sym_1 ("zsin", GFC_ISYM_SIN, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2434              NULL, gfc_simplify_sin, gfc_resolve_sin,
2435              x, BT_COMPLEX, dd, REQUIRED);
2436
2437   make_alias ("cdsin", GFC_STD_GNU);
2438
2439   make_generic ("sin", GFC_ISYM_SIN, GFC_STD_F77);
2440
2441   add_sym_1 ("sinh", GFC_ISYM_SINH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2442              gfc_check_fn_rc2008, gfc_simplify_sinh, gfc_resolve_sinh,
2443              x, BT_REAL, dr, REQUIRED);
2444
2445   add_sym_1 ("dsinh", GFC_ISYM_SINH,CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2446              gfc_check_fn_d, gfc_simplify_sinh, gfc_resolve_sinh,
2447              x, BT_REAL, dd, REQUIRED);
2448
2449   make_generic ("sinh", GFC_ISYM_SINH, GFC_STD_F77);
2450
2451   add_sym_3 ("size", GFC_ISYM_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2452              BT_INTEGER, di, GFC_STD_F95,
2453              gfc_check_size, gfc_simplify_size, gfc_resolve_size,
2454              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2455              kind, BT_INTEGER, di, OPTIONAL);
2456
2457   make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
2458
2459   add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2460              GFC_STD_GNU, gfc_check_sizeof, NULL, NULL,
2461              x, BT_UNKNOWN, 0, REQUIRED);
2462
2463   make_generic ("sizeof", GFC_ISYM_SIZEOF, GFC_STD_GNU);
2464   
2465   add_sym_1 ("c_sizeof", GFC_ISYM_C_SIZEOF, CLASS_INQUIRY, ACTUAL_NO,
2466              BT_INTEGER, ii, GFC_STD_F2008, gfc_check_c_sizeof, NULL, NULL,
2467              x, BT_UNKNOWN, 0, REQUIRED);
2468
2469   add_sym_1 ("spacing", GFC_ISYM_SPACING, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2470              gfc_check_x, gfc_simplify_spacing, gfc_resolve_spacing,
2471              x, BT_REAL, dr, REQUIRED);
2472
2473   make_generic ("spacing", GFC_ISYM_SPACING, GFC_STD_F95);
2474
2475   add_sym_3 ("spread", GFC_ISYM_SPREAD, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2476              gfc_check_spread, gfc_simplify_spread, gfc_resolve_spread,
2477              src, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, REQUIRED,
2478              ncopies, BT_INTEGER, di, REQUIRED);
2479
2480   make_generic ("spread", GFC_ISYM_SPREAD, GFC_STD_F95);
2481
2482   add_sym_1 ("sqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2483              gfc_check_fn_rc, gfc_simplify_sqrt, gfc_resolve_sqrt,
2484              x, BT_REAL, dr, REQUIRED);
2485
2486   add_sym_1 ("dsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2487              gfc_check_fn_d, gfc_simplify_sqrt, gfc_resolve_sqrt,
2488              x, BT_REAL, dd, REQUIRED);
2489
2490   add_sym_1 ("csqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dz, GFC_STD_F77,
2491              NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2492              x, BT_COMPLEX, dz, REQUIRED);
2493
2494   add_sym_1 ("zsqrt", GFC_ISYM_SQRT, CLASS_ELEMENTAL, ACTUAL_YES, BT_COMPLEX, dd, GFC_STD_GNU,
2495              NULL, gfc_simplify_sqrt, gfc_resolve_sqrt,
2496              x, BT_COMPLEX, dd, REQUIRED);
2497
2498   make_alias ("cdsqrt", GFC_STD_GNU);
2499
2500   make_generic ("sqrt", GFC_ISYM_SQRT, GFC_STD_F77);
2501
2502   add_sym_2 ("stat", GFC_ISYM_STAT, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2503              GFC_STD_GNU, gfc_check_stat, NULL, gfc_resolve_stat,
2504              nm, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2505
2506   make_generic ("stat", GFC_ISYM_STAT, GFC_STD_GNU);
2507
2508   add_sym_2 ("storage_size", GFC_ISYM_STORAGE_SIZE, CLASS_INQUIRY, ACTUAL_NO,
2509              BT_INTEGER, di, GFC_STD_F2008,
2510              gfc_check_storage_size, NULL, gfc_resolve_storage_size,
2511              a, BT_UNKNOWN, 0, REQUIRED,
2512              kind, BT_INTEGER, di, OPTIONAL);
2513   
2514   add_sym_3red ("sum", GFC_ISYM_SUM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2515                 gfc_check_product_sum, gfc_simplify_sum, gfc_resolve_sum,
2516                 ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2517                 msk, BT_LOGICAL, dl, OPTIONAL);
2518
2519   make_generic ("sum", GFC_ISYM_SUM, GFC_STD_F95);
2520
2521   add_sym_2 ("symlnk", GFC_ISYM_SYMLNK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2522              GFC_STD_GNU, gfc_check_symlnk, NULL, gfc_resolve_symlnk,
2523              p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER, dc, REQUIRED);
2524
2525   make_generic ("symlnk", GFC_ISYM_SYMLNK, GFC_STD_GNU);
2526
2527   add_sym_1 ("system", GFC_ISYM_SYSTEM, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2528              GFC_STD_GNU, NULL, NULL, NULL,
2529              com, BT_CHARACTER, dc, REQUIRED);
2530
2531   make_generic ("system", GFC_ISYM_SYSTEM, GFC_STD_GNU);
2532
2533   add_sym_1 ("tan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2534              gfc_check_fn_rc2008, gfc_simplify_tan, gfc_resolve_tan,
2535              x, BT_REAL, dr, REQUIRED);
2536
2537   add_sym_1 ("dtan", GFC_ISYM_TAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2538              gfc_check_fn_d, gfc_simplify_tan, gfc_resolve_tan,
2539              x, BT_REAL, dd, REQUIRED);
2540
2541   make_generic ("tan", GFC_ISYM_TAN, GFC_STD_F77);
2542
2543   add_sym_1 ("tanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_F77,
2544              gfc_check_fn_rc2008, gfc_simplify_tanh, gfc_resolve_tanh,
2545              x, BT_REAL, dr, REQUIRED);
2546
2547   add_sym_1 ("dtanh", GFC_ISYM_TANH, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_F77,
2548              gfc_check_fn_d, gfc_simplify_tanh, gfc_resolve_tanh,
2549              x, BT_REAL, dd, REQUIRED);
2550
2551   make_generic ("tanh", GFC_ISYM_TANH, GFC_STD_F77);
2552
2553   add_sym_2 ("this_image", GFC_ISYM_THIS_IMAGE, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di, GFC_STD_F2008,
2554              gfc_check_this_image, gfc_simplify_this_image, gfc_resolve_this_image,
2555              ca, BT_REAL, dr, OPTIONAL, dm, BT_INTEGER, ii, OPTIONAL);
2556
2557   add_sym_0 ("time", GFC_ISYM_TIME, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU, 
2558              NULL, NULL, gfc_resolve_time);
2559
2560   make_generic ("time", GFC_ISYM_TIME, GFC_STD_GNU);
2561
2562   add_sym_0 ("time8", GFC_ISYM_TIME8, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU, 
2563              NULL, NULL, gfc_resolve_time8);
2564
2565   make_generic ("time8", GFC_ISYM_TIME8, GFC_STD_GNU);
2566
2567   add_sym_1 ("tiny", GFC_ISYM_TINY, CLASS_INQUIRY, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2568              gfc_check_x, gfc_simplify_tiny, NULL,
2569              x, BT_REAL, dr, REQUIRED);
2570
2571   make_generic ("tiny", GFC_ISYM_TINY, GFC_STD_F95);
2572
2573   add_sym_1 ("trailz", GFC_ISYM_TRAILZ, CLASS_ELEMENTAL, ACTUAL_NO,
2574              BT_INTEGER, di, GFC_STD_F2008,
2575              gfc_check_i, gfc_simplify_trailz, NULL,
2576              i, BT_INTEGER, di, REQUIRED);
2577
2578   make_generic ("trailz", GFC_ISYM_TRAILZ, GFC_STD_F2008);
2579
2580   add_sym_3 ("transfer", GFC_ISYM_TRANSFER, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2581              gfc_check_transfer, gfc_simplify_transfer, gfc_resolve_transfer,
2582              src, BT_REAL, dr, REQUIRED, mo, BT_REAL, dr, REQUIRED,
2583              sz, BT_INTEGER, di, OPTIONAL);
2584
2585   make_generic ("transfer", GFC_ISYM_TRANSFER, GFC_STD_F95);
2586
2587   add_sym_1 ("transpose", GFC_ISYM_TRANSPOSE, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2588              gfc_check_transpose, gfc_simplify_transpose, gfc_resolve_transpose,
2589              m, BT_REAL, dr, REQUIRED);
2590
2591   make_generic ("transpose", GFC_ISYM_TRANSPOSE, GFC_STD_F95);
2592
2593   add_sym_1 ("trim", GFC_ISYM_TRIM, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_CHARACTER, dc, GFC_STD_F95,
2594              gfc_check_trim, gfc_simplify_trim, gfc_resolve_trim,
2595              stg, BT_CHARACTER, dc, REQUIRED);
2596
2597   make_generic ("trim", GFC_ISYM_TRIM, GFC_STD_F95);
2598
2599   add_sym_1 ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, ACTUAL_NO, BT_CHARACTER, 0, GFC_STD_GNU,
2600              gfc_check_ttynam, NULL, gfc_resolve_ttynam,
2601              ut, BT_INTEGER, di, REQUIRED);
2602
2603   make_generic ("ttynam", GFC_ISYM_TTYNAM, GFC_STD_GNU);
2604
2605   add_sym_3 ("ubound", GFC_ISYM_UBOUND, CLASS_INQUIRY, ACTUAL_NO,
2606              BT_INTEGER, di, GFC_STD_F95,
2607              gfc_check_ubound, gfc_simplify_ubound, gfc_resolve_ubound,
2608              ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2609              kind, BT_INTEGER, di, OPTIONAL);
2610
2611   make_generic ("ubound", GFC_ISYM_UBOUND, GFC_STD_F95);
2612
2613   add_sym_3 ("ucobound", GFC_ISYM_UCOBOUND, CLASS_INQUIRY, ACTUAL_NO,
2614             BT_INTEGER, di, GFC_STD_F2008,
2615             gfc_check_ucobound, gfc_simplify_ucobound, gfc_resolve_ucobound,
2616             ca, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL,
2617             kind, BT_INTEGER, di, OPTIONAL);
2618
2619   make_generic ("ucobound", GFC_ISYM_UCOBOUND, GFC_STD_F2008);
2620
2621   /* g77 compatibility for UMASK.  */
2622   add_sym_1 ("umask", GFC_ISYM_UMASK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di,
2623              GFC_STD_GNU, gfc_check_umask, NULL, gfc_resolve_umask,
2624              msk, BT_INTEGER, di, REQUIRED);
2625
2626   make_generic ("umask", GFC_ISYM_UMASK, GFC_STD_GNU);
2627
2628   /* g77 compatibility for UNLINK.  */
2629   add_sym_1 ("unlink", GFC_ISYM_UNLINK, NO_CLASS, ACTUAL_NO, BT_INTEGER, di, GFC_STD_GNU,
2630              gfc_check_unlink, NULL, gfc_resolve_unlink,
2631              "path", BT_CHARACTER, dc, REQUIRED);
2632
2633   make_generic ("unlink", GFC_ISYM_UNLINK, GFC_STD_GNU);
2634
2635   add_sym_3 ("unpack", GFC_ISYM_UNPACK, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F95,
2636              gfc_check_unpack, gfc_simplify_unpack, gfc_resolve_unpack,
2637              v, BT_REAL, dr, REQUIRED, msk, BT_LOGICAL, dl, REQUIRED,
2638              f, BT_REAL, dr, REQUIRED);
2639
2640   make_generic ("unpack", GFC_ISYM_UNPACK, GFC_STD_F95);
2641
2642   add_sym_4 ("verify", GFC_ISYM_VERIFY, CLASS_ELEMENTAL, ACTUAL_NO,
2643              BT_INTEGER, di, GFC_STD_F95,
2644              gfc_check_verify, gfc_simplify_verify, gfc_resolve_verify,
2645              stg, BT_CHARACTER, dc, REQUIRED, set, BT_CHARACTER, dc, REQUIRED,
2646              bck, BT_LOGICAL, dl, OPTIONAL, kind, BT_INTEGER, di, OPTIONAL);
2647
2648   make_generic ("verify", GFC_ISYM_VERIFY, GFC_STD_F95);
2649     
2650   add_sym_1 ("loc", GFC_ISYM_LOC, NO_CLASS, ACTUAL_NO, BT_INTEGER, ii,
2651              GFC_STD_GNU, gfc_check_loc, NULL, gfc_resolve_loc,
2652              x, BT_UNKNOWN, 0, REQUIRED);
2653                 
2654   make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU);
2655 }
2656
2657
2658 /* Add intrinsic subroutines.  */
2659
2660 static void
2661 add_subroutines (void)
2662 {
2663   /* Argument names as in the standard (to be used as argument keywords).  */
2664   const char
2665     *h = "harvest", *dt = "date", *vl = "values", *pt = "put",
2666     *c = "count", *tm = "time", *tp = "topos", *gt = "get",
2667     *t = "to", *zn = "zone", *fp = "frompos", *cm = "count_max",
2668     *f = "from", *sz = "size", *ln = "len", *cr = "count_rate",
2669     *com = "command", *length = "length", *st = "status",
2670     *val = "value", *num = "number", *name = "name",
2671     *trim_name = "trim_name", *ut = "unit", *han = "handler",
2672     *sec = "seconds", *res = "result", *of = "offset", *md = "mode",
2673     *whence = "whence", *pos = "pos", *ptr = "ptr", *p1 = "path1",
2674     *p2 = "path2", *msk = "mask", *old = "old";
2675
2676   int di, dr, dc, dl, ii;
2677
2678   di = gfc_default_integer_kind;
2679   dr = gfc_default_real_kind;
2680   dc = gfc_default_character_kind;
2681   dl = gfc_default_logical_kind;
2682   ii = gfc_index_integer_kind;
2683
2684   add_sym_0s ("abort", GFC_ISYM_ABORT, GFC_STD_GNU, NULL);
2685
2686   make_noreturn();
2687
2688   add_sym_1s_intent ("cpu_time", GFC_ISYM_CPU_TIME, NO_CLASS, BT_UNKNOWN, 0,
2689                      GFC_STD_F95, gfc_check_cpu_time, NULL,
2690                      gfc_resolve_cpu_time,
2691                      tm, BT_REAL, dr, REQUIRED, INTENT_OUT);
2692
2693   /* More G77 compatibility garbage.  */
2694   add_sym_2s ("ctime", GFC_ISYM_CTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2695               gfc_check_ctime_sub, NULL, gfc_resolve_ctime_sub,
2696               tm, BT_INTEGER, di, REQUIRED, res, BT_CHARACTER, dc, REQUIRED);
2697
2698   add_sym_1s ("idate", GFC_ISYM_IDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2699               gfc_check_itime_idate, NULL, gfc_resolve_idate,
2700               vl, BT_INTEGER, 4, REQUIRED);
2701
2702   add_sym_1s ("itime", GFC_ISYM_ITIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2703               gfc_check_itime_idate, NULL, gfc_resolve_itime,
2704               vl, BT_INTEGER, 4, REQUIRED);
2705
2706   add_sym_2s ("ltime", GFC_ISYM_LTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2707               gfc_check_ltime_gmtime, NULL, gfc_resolve_ltime,
2708               tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2709
2710   add_sym_2s ("gmtime", GFC_ISYM_GMTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2711               gfc_check_ltime_gmtime, NULL, gfc_resolve_gmtime,
2712               tm, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED);
2713
2714   add_sym_1s ("second", GFC_ISYM_SECOND, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2715               gfc_check_second_sub, NULL, gfc_resolve_second_sub,
2716               tm, BT_REAL, dr, REQUIRED);
2717
2718   add_sym_2s ("chdir", GFC_ISYM_CHDIR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2719               gfc_check_chdir_sub, NULL, gfc_resolve_chdir_sub,
2720               name, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2721
2722   add_sym_3s ("chmod", GFC_ISYM_CHMOD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2723               gfc_check_chmod_sub, NULL, gfc_resolve_chmod_sub,
2724               name, BT_CHARACTER, dc, REQUIRED, md, BT_CHARACTER, dc, REQUIRED,
2725               st, BT_INTEGER, di, OPTIONAL);
2726
2727   add_sym_4s ("date_and_time", GFC_ISYM_DATE_AND_TIME, NO_CLASS, BT_UNKNOWN, 0,
2728               GFC_STD_F95, gfc_check_date_and_time, NULL, NULL,
2729               dt, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2730               tm, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2731               zn, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2732               vl, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2733
2734   /* More G77 compatibility garbage.  */
2735   add_sym_2s ("etime", GFC_ISYM_ETIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2736               gfc_check_dtime_etime_sub, NULL, gfc_resolve_etime_sub,
2737               vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2738
2739   add_sym_2s ("dtime", GFC_ISYM_DTIME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2740               gfc_check_dtime_etime_sub, NULL, gfc_resolve_dtime_sub,
2741               vl, BT_REAL, 4, REQUIRED, tm, BT_REAL, 4, REQUIRED);
2742
2743   add_sym_1s ("fdate", GFC_ISYM_FDATE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2744               gfc_check_fdate_sub, NULL, gfc_resolve_fdate_sub,
2745               dt, BT_CHARACTER, dc, REQUIRED);
2746
2747   add_sym_1s ("gerror", GFC_ISYM_GERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2748               gfc_check_gerror, NULL, gfc_resolve_gerror, res, BT_CHARACTER,
2749               dc, REQUIRED);
2750
2751   add_sym_2s ("getcwd", GFC_ISYM_GETCWD, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2752               gfc_check_getcwd_sub, NULL, gfc_resolve_getcwd_sub,
2753               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2754
2755   add_sym_2s ("getenv", GFC_ISYM_GETENV, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2756               NULL, NULL, NULL,
2757               name, BT_CHARACTER, dc, REQUIRED, val, BT_CHARACTER, dc,
2758               REQUIRED);
2759
2760   add_sym_2s ("getarg", GFC_ISYM_GETARG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2761               gfc_check_getarg, NULL, gfc_resolve_getarg,
2762               pos, BT_INTEGER, di, REQUIRED, val, BT_CHARACTER, dc, REQUIRED);
2763
2764   add_sym_1s ("getlog", GFC_ISYM_GETLOG, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2765               gfc_check_getlog, NULL, gfc_resolve_getlog, c, BT_CHARACTER,
2766               dc, REQUIRED);
2767
2768   /* F2003 commandline routines.  */
2769
2770   add_sym_3s_intent ("get_command", GFC_ISYM_GET_COMMAND, NO_CLASS, BT_UNKNOWN,
2771                      0, GFC_STD_F2003, NULL, NULL, gfc_resolve_get_command,
2772                      com, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2773                      length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2774                      st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2775
2776   add_sym_4s ("get_command_argument", GFC_ISYM_GET_COMMAND_ARGUMENT, NO_CLASS,
2777               BT_UNKNOWN, 0, GFC_STD_F2003, NULL, NULL,
2778               gfc_resolve_get_command_argument,
2779               num, BT_INTEGER, di, REQUIRED, INTENT_IN,
2780               val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2781               length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2782               st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2783
2784   /* F2003 subroutine to get environment variables.  */
2785
2786   add_sym_5s ("get_environment_variable", GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
2787               NO_CLASS, BT_UNKNOWN, 0, GFC_STD_F2003,
2788               NULL, NULL, gfc_resolve_get_environment_variable,
2789               name, BT_CHARACTER, dc, REQUIRED, INTENT_IN,
2790               val, BT_CHARACTER, dc, OPTIONAL, INTENT_OUT,
2791               length, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2792               st, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2793               trim_name, BT_LOGICAL, dl, OPTIONAL, INTENT_IN);
2794
2795   add_sym_2s_intent ("move_alloc", GFC_ISYM_MOVE_ALLOC, NO_CLASS, BT_UNKNOWN, 0,
2796                      GFC_STD_F2003, gfc_check_move_alloc, NULL, NULL,
2797                      f, BT_UNKNOWN, 0, REQUIRED, INTENT_INOUT,
2798                      t, BT_UNKNOWN, 0, REQUIRED, INTENT_OUT);
2799
2800   add_sym_5s ("mvbits", GFC_ISYM_MVBITS, CLASS_ELEMENTAL, BT_UNKNOWN, 0,
2801               GFC_STD_F95, gfc_check_mvbits, gfc_simplify_mvbits,
2802               gfc_resolve_mvbits,
2803               f, BT_INTEGER, di, REQUIRED, INTENT_IN,
2804               fp, BT_INTEGER, di, REQUIRED, INTENT_IN,
2805               ln, BT_INTEGER, di, REQUIRED, INTENT_IN,
2806               t, BT_INTEGER, di, REQUIRED, INTENT_INOUT,
2807               tp, BT_INTEGER, di, REQUIRED, INTENT_IN);
2808
2809   add_sym_1s_intent ("random_number", GFC_ISYM_RANDOM_NUMBER, NO_CLASS,
2810                      BT_UNKNOWN, 0, GFC_STD_F95, gfc_check_random_number, NULL,
2811                      gfc_resolve_random_number,
2812                      h, BT_REAL, dr, REQUIRED, INTENT_OUT);
2813
2814   add_sym_3s_intent ("random_seed", GFC_ISYM_RANDOM_SEED, NO_CLASS,
2815                      BT_UNKNOWN, 0, GFC_STD_F95,
2816                      gfc_check_random_seed, NULL, gfc_resolve_random_seed,
2817                      sz, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2818                      pt, BT_INTEGER, di, OPTIONAL, INTENT_IN,
2819                      gt, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2820
2821   /* More G77 compatibility garbage.  */
2822   add_sym_3s ("alarm", GFC_ISYM_ALARM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2823               gfc_check_alarm_sub, NULL, gfc_resolve_alarm_sub,
2824               sec, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2825               st, BT_INTEGER, di, OPTIONAL);
2826
2827   add_sym_1s ("srand", GFC_ISYM_SRAND, NO_CLASS, BT_UNKNOWN, di, GFC_STD_GNU,
2828               gfc_check_srand, NULL, gfc_resolve_srand,
2829               "seed", BT_INTEGER, 4, REQUIRED);
2830
2831   add_sym_1s ("exit", GFC_ISYM_EXIT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2832               gfc_check_exit, NULL, gfc_resolve_exit,
2833               st, BT_INTEGER, di, OPTIONAL);
2834
2835   make_noreturn();
2836
2837   add_sym_3s ("fgetc", GFC_ISYM_FGETC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2838               gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub,
2839               ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2840               st, BT_INTEGER, di, OPTIONAL);
2841
2842   add_sym_2s ("fget", GFC_ISYM_FGET, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2843               gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub,
2844               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2845
2846   add_sym_1s ("flush", GFC_ISYM_FLUSH, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2847               gfc_check_flush, NULL, gfc_resolve_flush,
2848               ut, BT_INTEGER, di, OPTIONAL);
2849
2850   add_sym_3s ("fputc", GFC_ISYM_FPUTC, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2851               gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub,
2852               ut, BT_INTEGER, di, REQUIRED, c, BT_CHARACTER, dc, REQUIRED,
2853               st, BT_INTEGER, di, OPTIONAL);
2854
2855   add_sym_2s ("fput", GFC_ISYM_FPUT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2856               gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub,
2857               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2858
2859   add_sym_1s ("free", GFC_ISYM_FREE, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2860               gfc_check_free, NULL, gfc_resolve_free,
2861               ptr, BT_INTEGER, ii, REQUIRED);
2862
2863   add_sym_4s ("fseek", GFC_ISYM_FSEEK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2864               gfc_check_fseek_sub, NULL, gfc_resolve_fseek_sub,
2865               ut, BT_INTEGER, di, REQUIRED, INTENT_IN,
2866               of, BT_INTEGER, di, REQUIRED, INTENT_IN,
2867               whence, BT_INTEGER, di, REQUIRED, INTENT_IN,
2868               st, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2869
2870   add_sym_2s ("ftell", GFC_ISYM_FTELL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2871               gfc_check_ftell_sub, NULL, gfc_resolve_ftell_sub,
2872               ut, BT_INTEGER, di, REQUIRED, of, BT_INTEGER, ii, REQUIRED);
2873
2874   add_sym_2s ("hostnm", GFC_ISYM_HOSTNM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2875               gfc_check_hostnm_sub, NULL, gfc_resolve_hostnm_sub,
2876               c, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2877
2878   add_sym_3s ("kill", GFC_ISYM_KILL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_kill_sub,
2879               NULL, gfc_resolve_kill_sub, c, BT_INTEGER, di, REQUIRED,
2880               val, BT_INTEGER, di, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2881
2882   add_sym_3s ("link", GFC_ISYM_LINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2883               gfc_check_link_sub, NULL, gfc_resolve_link_sub,
2884               p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2885               dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2886
2887   add_sym_1s ("perror", GFC_ISYM_PERROR, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2888               gfc_check_perror, NULL, gfc_resolve_perror,
2889               "string", BT_CHARACTER, dc, REQUIRED);
2890
2891   add_sym_3s ("rename", GFC_ISYM_RENAME, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2892               gfc_check_rename_sub, NULL, gfc_resolve_rename_sub,
2893               p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2894               dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2895
2896   add_sym_1s ("sleep", GFC_ISYM_SLEEP, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2897               gfc_check_sleep_sub, NULL, gfc_resolve_sleep_sub,
2898               sec, BT_INTEGER, di, REQUIRED);
2899
2900   add_sym_3s ("fstat", GFC_ISYM_FSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2901               gfc_check_fstat_sub, NULL, gfc_resolve_fstat_sub,
2902               ut, BT_INTEGER, di, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2903               st, BT_INTEGER, di, OPTIONAL);
2904
2905   add_sym_3s ("lstat", GFC_ISYM_LSTAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2906               gfc_check_stat_sub, NULL, gfc_resolve_lstat_sub,
2907               name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2908               st, BT_INTEGER, di, OPTIONAL);
2909
2910   add_sym_3s ("stat", GFC_ISYM_STAT, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2911               gfc_check_stat_sub, NULL, gfc_resolve_stat_sub,
2912               name, BT_CHARACTER, dc, REQUIRED, vl, BT_INTEGER, di, REQUIRED,
2913               st, BT_INTEGER, di, OPTIONAL);
2914
2915   add_sym_3s ("signal", GFC_ISYM_SIGNAL, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2916               gfc_check_signal_sub, NULL, gfc_resolve_signal_sub,
2917               num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED,
2918               st, BT_INTEGER, di, OPTIONAL);
2919
2920   add_sym_3s ("symlnk", GFC_ISYM_SYMLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2921               gfc_check_symlnk_sub, NULL, gfc_resolve_symlnk_sub,
2922               p1, BT_CHARACTER, dc, REQUIRED, p2, BT_CHARACTER,
2923               dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2924
2925   add_sym_2s ("system", GFC_ISYM_SYSTEM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2926               NULL, NULL, gfc_resolve_system_sub,
2927               com, BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2928
2929   add_sym_3s_intent ("system_clock", GFC_ISYM_SYSTEM_CLOCK, NO_CLASS,
2930                      BT_UNKNOWN, 0, GFC_STD_F95,
2931                      gfc_check_system_clock, NULL, gfc_resolve_system_clock,
2932                      c, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2933                      cr, BT_INTEGER, di, OPTIONAL, INTENT_OUT,
2934                      cm, BT_INTEGER, di, OPTIONAL, INTENT_OUT);
2935
2936   add_sym_2s ("ttynam", GFC_ISYM_TTYNAM, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2937               gfc_check_ttynam_sub, NULL, gfc_resolve_ttynam_sub,
2938               ut, BT_INTEGER, di, REQUIRED, name, BT_CHARACTER, dc, REQUIRED);
2939
2940   add_sym_2s ("umask", GFC_ISYM_UMASK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2941               gfc_check_umask_sub, NULL, gfc_resolve_umask_sub,
2942               msk, BT_INTEGER, di, REQUIRED, old, BT_INTEGER, di, OPTIONAL);
2943
2944   add_sym_2s ("unlink", GFC_ISYM_UNLINK, NO_CLASS, BT_UNKNOWN, 0, GFC_STD_GNU,
2945               gfc_check_unlink_sub, NULL, gfc_resolve_unlink_sub,
2946               "path", BT_CHARACTER, dc, REQUIRED, st, BT_INTEGER, di, OPTIONAL);
2947 }
2948
2949
2950 /* Add a function to the list of conversion symbols.  */
2951
2952 static void
2953 add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
2954 {
2955   gfc_typespec from, to;
2956   gfc_intrinsic_sym *sym;
2957
2958   if (sizing == SZ_CONVS)
2959     {
2960       nconv++;
2961       return;
2962     }
2963
2964   gfc_clear_ts (&from);
2965   from.type = from_type;
2966   from.kind = from_kind;
2967
2968   gfc_clear_ts (&to);
2969   to.type = to_type;
2970   to.kind = to_kind;
2971
2972   sym = conversion + nconv;
2973
2974   sym->name = conv_name (&from, &to);
2975   sym->lib_name = sym->name;
2976   sym->simplify.cc = gfc_convert_constant;
2977   sym->standard = standard;
2978   sym->elemental = 1;
2979   sym->conversion = 1;
2980   sym->ts = to;
2981   sym->id = GFC_ISYM_CONVERSION;
2982
2983   nconv++;
2984 }
2985
2986
2987 /* Create gfc_intrinsic_sym nodes for all intrinsic conversion
2988    functions by looping over the kind tables.  */
2989
2990 static void
2991 add_conversions (void)
2992 {
2993   int i, j;
2994
2995   /* Integer-Integer conversions.  */
2996   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
2997     for (j = 0; gfc_integer_kinds[j].kind != 0; j++)
2998       {
2999         if (i == j)
3000           continue;
3001
3002         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3003                   BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
3004       }
3005
3006   /* Integer-Real/Complex conversions.  */
3007   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3008     for (j = 0; gfc_real_kinds[j].kind != 0; j++)
3009       {
3010         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3011                   BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3012
3013         add_conv (BT_REAL, gfc_real_kinds[j].kind,
3014                   BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
3015
3016         add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3017                   BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3018
3019         add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
3020                   BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
3021       }
3022
3023   if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3024     {
3025       /* Hollerith-Integer conversions.  */
3026       for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3027         add_conv (BT_HOLLERITH, gfc_default_character_kind,
3028                   BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3029       /* Hollerith-Real conversions.  */
3030       for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3031         add_conv (BT_HOLLERITH, gfc_default_character_kind,
3032                   BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
3033       /* Hollerith-Complex conversions.  */
3034       for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3035         add_conv (BT_HOLLERITH, gfc_default_character_kind,
3036                   BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
3037
3038       /* Hollerith-Character conversions.  */
3039       add_conv (BT_HOLLERITH, gfc_default_character_kind, BT_CHARACTER,
3040                   gfc_default_character_kind, GFC_STD_LEGACY);
3041
3042       /* Hollerith-Logical conversions.  */
3043       for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
3044         add_conv (BT_HOLLERITH, gfc_default_character_kind,
3045                   BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
3046     }
3047
3048   /* Real/Complex - Real/Complex conversions.  */
3049   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3050     for (j = 0; gfc_real_kinds[j].kind != 0; j++)
3051       {
3052         if (i != j)
3053           {
3054             add_conv (BT_REAL, gfc_real_kinds[i].kind,
3055                       BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3056
3057             add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3058                       BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3059           }
3060
3061         add_conv (BT_REAL, gfc_real_kinds[i].kind,
3062                   BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
3063
3064         add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
3065                   BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
3066       }
3067
3068   /* Logical/Logical kind conversion.  */
3069   for (i = 0; gfc_logical_kinds[i].kind; i++)
3070     for (j = 0; gfc_logical_kinds[j].kind; j++)
3071       {
3072         if (i == j)
3073           continue;
3074
3075         add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
3076                   BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
3077       }
3078
3079   /* Integer-Logical and Logical-Integer conversions.  */
3080   if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
3081     for (i=0; gfc_integer_kinds[i].kind; i++)
3082       for (j=0; gfc_logical_kinds[j].kind; j++)
3083         {
3084           add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
3085                     BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
3086           add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
3087                     BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
3088         }
3089 }
3090
3091
3092 static void
3093 add_char_conversions (void)
3094 {
3095   int n, i, j;
3096
3097   /* Count possible conversions.  */
3098   for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3099     for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3100       if (i != j)
3101         ncharconv++;
3102
3103   /* Allocate memory.  */
3104   char_conversions = XCNEWVEC (gfc_intrinsic_sym, ncharconv);
3105
3106   /* Add the conversions themselves.  */
3107   n = 0;
3108   for (i = 0; gfc_character_kinds[i].kind != 0; i++)
3109     for (j = 0; gfc_character_kinds[j].kind != 0; j++)
3110       {
3111         gfc_typespec from, to;
3112
3113         if (i == j)
3114           continue;
3115
3116         gfc_clear_ts (&from);
3117         from.type = BT_CHARACTER;
3118         from.kind = gfc_character_kinds[i].kind;
3119
3120         gfc_clear_ts (&to);
3121         to.type = BT_CHARACTER;
3122         to.kind = gfc_character_kinds[j].kind;
3123
3124         char_conversions[n].name = conv_name (&from, &to);
3125         char_conversions[n].lib_name = char_conversions[n].name;
3126         char_conversions[n].simplify.cc = gfc_convert_char_constant;
3127         char_conversions[n].standard = GFC_STD_F2003;
3128         char_conversions[n].elemental = 1;
3129         char_conversions[n].conversion = 0;
3130         char_conversions[n].ts = to;
3131         char_conversions[n].id = GFC_ISYM_CONVERSION;
3132
3133         n++;
3134       }
3135 }
3136
3137
3138 /* Initialize the table of intrinsics.  */
3139 void
3140 gfc_intrinsic_init_1 (void)
3141 {
3142   int i;
3143
3144   nargs = nfunc = nsub = nconv = 0;
3145
3146   /* Create a namespace to hold the resolved intrinsic symbols.  */
3147   gfc_intrinsic_namespace = gfc_get_namespace (NULL, 0);
3148
3149   sizing = SZ_FUNCS;
3150   add_functions ();
3151   sizing = SZ_SUBS;
3152   add_subroutines ();
3153   sizing = SZ_CONVS;
3154   add_conversions ();
3155
3156   functions = XCNEWVAR (struct gfc_intrinsic_sym,
3157                         sizeof (gfc_intrinsic_sym) * (nfunc + nsub)
3158                         + sizeof (gfc_intrinsic_arg) * nargs);
3159
3160   next_sym = functions;
3161   subroutines = functions + nfunc;
3162
3163   conversion = XCNEWVEC (gfc_intrinsic_sym, nconv);
3164
3165   next_arg = ((gfc_intrinsic_arg *) (subroutines + nsub)) - 1;
3166
3167   sizing = SZ_NOTHING;
3168   nconv = 0;
3169
3170   add_functions ();
3171   add_subroutines ();
3172   add_conversions ();
3173
3174   /* Character conversion intrinsics need to be treated separately.  */
3175   add_char_conversions ();
3176
3177   /* Set the pure flag.  All intrinsic functions are pure, and
3178      intrinsic subroutines are pure if they are elemental.  */
3179
3180   for (i = 0; i < nfunc; i++)
3181     functions[i].pure = 1;
3182
3183   for (i = 0; i < nsub; i++)
3184     subroutines[i].pure = subroutines[i].elemental;
3185 }
3186
3187
3188 void
3189 gfc_intrinsic_done_1 (void)
3190 {
3191   gfc_free (functions);
3192   gfc_free (conversion);
3193   gfc_free (char_conversions);
3194   gfc_free_namespace (gfc_intrinsic_namespace);
3195 }
3196
3197
3198 /******** Subroutines to check intrinsic interfaces ***********/
3199
3200 /* Given a formal argument list, remove any NULL arguments that may
3201    have been left behind by a sort against some formal argument list.  */
3202
3203 static void
3204 remove_nullargs (gfc_actual_arglist **ap)
3205 {
3206   gfc_actual_arglist *head, *tail, *next;
3207
3208   tail = NULL;
3209
3210   for (head = *ap; head; head = next)
3211     {
3212       next = head->next;
3213
3214       if (head->expr == NULL && !head->label)
3215         {
3216           head->next = NULL;
3217           gfc_free_actual_arglist (head);
3218         }
3219       else
3220         {
3221           if (tail == NULL)
3222             *ap = head;
3223           else
3224             tail->next = head;
3225
3226           tail = head;
3227           tail->next = NULL;
3228         }
3229     }
3230
3231   if (tail == NULL)
3232     *ap = NULL;
3233 }
3234
3235
3236 /* Given an actual arglist and a formal arglist, sort the actual
3237    arglist so that its arguments are in a one-to-one correspondence
3238    with the format arglist.  Arguments that are not present are given
3239    a blank gfc_actual_arglist structure.  If something is obviously
3240    wrong (say, a missing required argument) we abort sorting and
3241    return FAILURE.  */
3242
3243 static gfc_try
3244 sort_actual (const char *name, gfc_actual_arglist **ap,
3245              gfc_intrinsic_arg *formal, locus *where)
3246 {
3247   gfc_actual_arglist *actual, *a;
3248   gfc_intrinsic_arg *f;
3249
3250   remove_nullargs (ap);
3251   actual = *ap;
3252
3253   for (f = formal; f; f = f->next)
3254     f->actual = NULL;
3255
3256   f = formal;
3257   a = actual;
3258
3259   if (f == NULL && a == NULL)   /* No arguments */
3260     return SUCCESS;
3261
3262   for (;;)
3263     {           /* Put the nonkeyword arguments in a 1:1 correspondence */
3264       if (f == NULL)
3265         break;
3266       if (a == NULL)
3267         goto optional;
3268
3269       if (a->name != NULL)
3270         goto keywords;
3271
3272       f->actual = a;
3273
3274       f = f->next;
3275       a = a->next;
3276     }
3277
3278   if (a == NULL)
3279     goto do_sort;
3280
3281   gfc_error ("Too many arguments in call to '%s' at %L", name, where);
3282   return FAILURE;
3283
3284 keywords:
3285   /* Associate the remaining actual arguments, all of which have
3286      to be keyword arguments.  */
3287   for (; a; a = a->next)
3288     {
3289       for (f = formal; f; f = f->next)
3290         if (strcmp (a->name, f->name) == 0)
3291           break;
3292
3293       if (f == NULL)
3294         {
3295           if (a->name[0] == '%')
3296             gfc_error ("The argument list functions %%VAL, %%LOC or %%REF "
3297                        "are not allowed in this context at %L", where);
3298           else
3299             gfc_error ("Can't find keyword named '%s' in call to '%s' at %L",
3300                        a->name, name, where);
3301           return FAILURE;
3302         }
3303
3304       if (f->actual != NULL)
3305         {
3306           gfc_error ("Argument '%s' appears twice in call to '%s' at %L",
3307                      f->name, name, where);
3308           return FAILURE;
3309         }
3310
3311       f->actual = a;
3312     }
3313
3314 optional:
3315   /* At this point, all unmatched formal args must be optional.  */
3316   for (f = formal; f; f = f->next)
3317     {
3318       if (f->actual == NULL && f->optional == 0)
3319         {
3320           gfc_error ("Missing actual argument '%s' in call to '%s' at %L",
3321                      f->name, name, where);
3322           return FAILURE;
3323         }
3324     }
3325
3326 do_sort:
3327   /* Using the formal argument list, string the actual argument list
3328      together in a way that corresponds with the formal list.  */
3329   actual = NULL;
3330
3331   for (f = formal; f; f = f->next)
3332     {
3333       if (f->actual && f->actual->label != NULL && f->ts.type)
3334         {
3335           gfc_error ("ALTERNATE RETURN not permitted at %L", where);
3336           return FAILURE;
3337         }
3338
3339       if (f->actual == NULL)
3340         {
3341           a = gfc_get_actual_arglist ();
3342           a->missing_arg_type = f->ts.type;
3343         }
3344       else
3345         a = f->actual;
3346
3347       if (actual == NULL)
3348         *ap = a;
3349       else
3350         actual->next = a;
3351
3352       actual = a;
3353     }
3354   actual->next = NULL;          /* End the sorted argument list.  */
3355
3356   return SUCCESS;
3357 }
3358
3359
3360 /* Compare an actual argument list with an intrinsic's formal argument
3361    list.  The lists are checked for agreement of type.  We don't check
3362    for arrayness here.  */
3363
3364 static gfc_try
3365 check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym,
3366                int error_flag)
3367 {
3368   gfc_actual_arglist *actual;
3369   gfc_intrinsic_arg *formal;
3370   int i;
3371
3372   formal = sym->formal;
3373   actual = *ap;
3374
3375   i = 0;
3376   for (; formal; formal = formal->next, actual = actual->next, i++)
3377     {
3378       gfc_typespec ts;
3379
3380       if (actual->expr == NULL)
3381         continue;
3382
3383       ts = formal->ts;
3384
3385       /* A kind of 0 means we don't check for kind.  */
3386       if (ts.kind == 0)
3387         ts.kind = actual->expr->ts.kind;
3388
3389       if (!gfc_compare_types (&ts, &actual->expr->ts))
3390         {
3391           if (error_flag)
3392             gfc_error ("Type of argument '%s' in call to '%s' at %L should "
3393                        "be %s, not %s", gfc_current_intrinsic_arg[i],
3394                        gfc_current_intrinsic, &actual->expr->where,
3395                        gfc_typename (&formal->ts),
3396                        gfc_typename (&actual->expr->ts));
3397           return FAILURE;
3398         }
3399     }
3400
3401   return SUCCESS;
3402 }
3403
3404
3405 /* Given a pointer to an intrinsic symbol and an expression node that
3406    represent the function call to that subroutine, figure out the type
3407    of the result.  This may involve calling a resolution subroutine.  */
3408
3409 static void
3410 resolve_intrinsic (gfc_intrinsic_sym *specific, gfc_expr *e)
3411 {
3412   gfc_expr *a1, *a2, *a3, *a4, *a5;
3413   gfc_actual_arglist *arg;
3414
3415   if (specific->resolve.f1 == NULL)
3416     {
3417       if (e->value.function.name == NULL)
3418         e->value.function.name = specific->lib_name;
3419
3420       if (e->ts.type == BT_UNKNOWN)
3421         e->ts = specific->ts;
3422       return;
3423     }
3424
3425   arg = e->value.function.actual;
3426
3427   /* Special case hacks for MIN and MAX.  */
3428   if (specific->resolve.f1m == gfc_resolve_max
3429       || specific->resolve.f1m == gfc_resolve_min)
3430     {
3431       (*specific->resolve.f1m) (e, arg);
3432       return;
3433     }
3434
3435   if (arg == NULL)
3436     {
3437       (*specific->resolve.f0) (e);
3438       return;
3439     }
3440
3441   a1 = arg->expr;
3442   arg = arg->next;
3443
3444   if (arg == NULL)
3445     {
3446       (*specific->resolve.f1) (e, a1);
3447       return;
3448     }
3449
3450   a2 = arg->expr;
3451   arg = arg->next;
3452
3453   if (arg == NULL)
3454     {
3455       (*specific->resolve.f2) (e, a1, a2);
3456       return;
3457     }
3458
3459   a3 = arg->expr;
3460   arg = arg->next;
3461
3462   if (arg == NULL)
3463     {
3464       (*specific->resolve.f3) (e, a1, a2, a3);
3465       return;
3466     }
3467
3468   a4 = arg->expr;
3469   arg = arg->next;
3470
3471   if (arg == NULL)
3472     {
3473       (*specific->resolve.f4) (e, a1, a2, a3, a4);
3474       return;
3475     }
3476
3477   a5 = arg->expr;
3478   arg = arg->next;
3479
3480   if (arg == NULL)
3481     {
3482       (*specific->resolve.f5) (e, a1, a2, a3, a4, a5);
3483       return;
3484     }
3485
3486   gfc_internal_error ("resolve_intrinsic(): Too many args for intrinsic");
3487 }
3488
3489
3490 /* Given an intrinsic symbol node and an expression node, call the
3491    simplification function (if there is one), perhaps replacing the
3492    expression with something simpler.  We return FAILURE on an error
3493    of the simplification, SUCCESS if the simplification worked, even
3494    if nothing has changed in the expression itself.  */
3495
3496 static gfc_try
3497 do_simplify (gfc_intrinsic_sym *specific, gfc_expr *e)
3498 {
3499   gfc_expr *result, *a1, *a2, *a3, *a4, *a5;
3500   gfc_actual_arglist *arg;
3501
3502   /* Max and min require special handling due to the variable number
3503      of args.  */
3504   if (specific->simplify.f1 == gfc_simplify_min)
3505     {
3506       result = gfc_simplify_min (e);
3507       goto finish;
3508     }
3509
3510   if (specific->simplify.f1 == gfc_simplify_max)
3511     {
3512       result = gfc_simplify_max (e);
3513       goto finish;
3514     }
3515
3516   if (specific->simplify.f1 == NULL)
3517     {
3518       result = NULL;
3519       goto finish;
3520     }
3521
3522   arg = e->value.function.actual;
3523
3524   if (arg == NULL)
3525     {
3526       result = (*specific->simplify.f0) ();
3527       goto finish;
3528     }
3529
3530   a1 = arg->expr;
3531   arg = arg->next;
3532
3533   if (specific->simplify.cc == gfc_convert_constant
3534       || specific->simplify.cc == gfc_convert_char_constant)
3535     {
3536       result = specific->simplify.cc (a1, specific->ts.type, specific->ts.kind);
3537       goto finish;
3538     }
3539
3540   if (arg == NULL)
3541     result = (*specific->simplify.f1) (a1);
3542   else
3543     {
3544       a2 = arg->expr;
3545       arg = arg->next;
3546
3547       if (arg == NULL)
3548         result = (*specific->simplify.f2) (a1, a2);
3549       else
3550         {
3551           a3 = arg->expr;
3552           arg = arg->next;
3553
3554           if (arg == NULL)
3555             result = (*specific->simplify.f3) (a1, a2, a3);
3556           else
3557             {
3558               a4 = arg->expr;
3559               arg = arg->next;
3560
3561               if (arg == NULL)
3562                 result = (*specific->simplify.f4) (a1, a2, a3, a4);
3563               else
3564                 {
3565                   a5 = arg->expr;
3566                   arg = arg->next;
3567
3568                   if (arg == NULL)
3569                     result = (*specific->simplify.f5) (a1, a2, a3, a4, a5);
3570                   else
3571                     gfc_internal_error
3572                       ("do_simplify(): Too many args for intrinsic");
3573                 }
3574             }
3575         }
3576     }
3577
3578 finish:
3579   if (result == &gfc_bad_expr)
3580     return FAILURE;
3581
3582   if (result == NULL)
3583     resolve_intrinsic (specific, e);    /* Must call at run-time */
3584   else
3585     {
3586       result->where = e->where;
3587       gfc_replace_expr (e, result);
3588     }
3589
3590   return SUCCESS;
3591 }
3592
3593
3594 /* Initialize the gfc_current_intrinsic_arg[] array for the benefit of
3595    error messages.  This subroutine returns FAILURE if a subroutine
3596    has more than MAX_INTRINSIC_ARGS, in which case the actual argument
3597    list cannot match any intrinsic.  */
3598
3599 static void
3600 init_arglist (gfc_intrinsic_sym *isym)
3601 {
3602   gfc_intrinsic_arg *formal;
3603   int i;
3604
3605   gfc_current_intrinsic = isym->name;
3606
3607   i = 0;
3608   for (formal = isym->formal; formal; formal = formal->next)
3609     {
3610       if (i >= MAX_INTRINSIC_ARGS)
3611         gfc_internal_error ("init_arglist(): too many arguments");
3612       gfc_current_intrinsic_arg[i++] = formal->name;
3613     }
3614 }
3615
3616
3617 /* Given a pointer to an intrinsic symbol and an expression consisting
3618    of a function call, see if the function call is consistent with the
3619    intrinsic's formal argument list.  Return SUCCESS if the expression
3620    and intrinsic match, FAILURE otherwise.  */
3621
3622 static gfc_try
3623 check_specific (gfc_intrinsic_sym *specific, gfc_expr *expr, int error_flag)
3624 {
3625   gfc_actual_arglist *arg, **ap;
3626   gfc_try t;
3627
3628   ap = &expr->value.function.actual;
3629
3630   init_arglist (specific);
3631
3632   /* Don't attempt to sort the argument list for min or max.  */
3633   if (specific->check.f1m == gfc_check_min_max
3634       || specific->check.f1m == gfc_check_min_max_integer
3635       || specific->check.f1m == gfc_check_min_max_real
3636       || specific->check.f1m == gfc_check_min_max_double)
3637     return (*specific->check.f1m) (*ap);
3638
3639   if (sort_actual (specific->name, ap, specific->formal,
3640                    &expr->where) == FAILURE)
3641     return FAILURE;
3642
3643   if (specific->check.f3ml == gfc_check_minloc_maxloc)
3644     /* This is special because we might have to reorder the argument list.  */
3645     t = gfc_check_minloc_maxloc (*ap);
3646   else if (specific->check.f3red == gfc_check_minval_maxval)
3647     /* This is also special because we also might have to reorder the
3648        argument list.  */
3649     t = gfc_check_minval_maxval (*ap);
3650   else if (specific->check.f3red == gfc_check_product_sum)
3651     /* Same here. The difference to the previous case is that we allow a
3652        general numeric type.  */
3653     t = gfc_check_product_sum (*ap);
3654   else
3655      {
3656        if (specific->check.f1 == NULL)
3657          {
3658            t = check_arglist (ap, specific, error_flag);
3659            if (t == SUCCESS)
3660              expr->ts = specific->ts;
3661          }
3662        else
3663          t = do_check (specific, *ap);
3664      }
3665
3666   /* Check conformance of elemental intrinsics.  */
3667   if (t == SUCCESS && specific->elemental)
3668     {
3669       int n = 0;
3670       gfc_expr *first_expr;
3671       arg = expr->value.function.actual;
3672
3673       /* There is no elemental intrinsic without arguments.  */
3674       gcc_assert(arg != NULL);
3675       first_expr = arg->expr;
3676
3677       for ( ; arg && arg->expr; arg = arg->next, n++)
3678         if (gfc_check_conformance (first_expr, arg->expr,
3679                                    "arguments '%s' and '%s' for "
3680                                    "intrinsic '%s'",
3681                                    gfc_current_intrinsic_arg[0],
3682                                    gfc_current_intrinsic_arg[n],
3683                                    gfc_current_intrinsic) == FAILURE)
3684           return FAILURE;
3685     }
3686
3687   if (t == FAILURE)
3688     remove_nullargs (ap);
3689
3690   return t;
3691 }
3692
3693
3694 /* Check whether an intrinsic belongs to whatever standard the user
3695    has chosen, taking also into account -fall-intrinsics.  Here, no
3696    warning/error is emitted; but if symstd is not NULL, it is pointed to a
3697    textual representation of the symbols standard status (like
3698    "new in Fortran 2008", "a GNU extension" or "obsolescent in Fortran 95") that
3699    can be used to construct a detailed warning/error message in case of
3700    a FAILURE.  */
3701
3702 gfc_try
3703 gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym,
3704                               const char** symstd, bool silent, locus where)
3705 {
3706   const char* symstd_msg;
3707
3708   /* For -fall-intrinsics, just succeed.  */
3709   if (gfc_option.flag_all_intrinsics)
3710     return SUCCESS;
3711
3712   /* Find the symbol's standard message for later usage.  */
3713   switch (isym->standard)
3714     {
3715     case GFC_STD_F77:
3716       symstd_msg = "available since Fortran 77";
3717       break;
3718
3719     case GFC_STD_F95_OBS:
3720       symstd_msg = "obsolescent in Fortran 95";
3721       break;
3722
3723     case GFC_STD_F95_DEL:
3724       symstd_msg = "deleted in Fortran 95";
3725       break;
3726
3727     case GFC_STD_F95:
3728       symstd_msg = "new in Fortran 95";
3729       break;
3730
3731     case GFC_STD_F2003:
3732       symstd_msg = "new in Fortran 2003";
3733       break;
3734
3735     case GFC_STD_F2008:
3736       symstd_msg = "new in Fortran 2008";
3737       break;
3738
3739     case GFC_STD_GNU:
3740       symstd_msg = "a GNU Fortran extension";
3741       break;
3742
3743     case GFC_STD_LEGACY:
3744       symstd_msg = "for backward compatibility";
3745       break;
3746
3747     default:
3748       gfc_internal_error ("Invalid standard code on intrinsic '%s' (%d)",
3749                           isym->name, isym->standard);
3750     }
3751
3752   /* If warning about the standard, warn and succeed.  */
3753   if (gfc_option.warn_std & isym->standard)
3754     {
3755       /* Do only print a warning if not a GNU extension.  */
3756       if (!silent && isym->standard != GFC_STD_GNU)
3757         gfc_warning ("Intrinsic '%s' (is %s) is used at %L",
3758                      isym->name, _(symstd_msg), &where);
3759
3760       return SUCCESS;
3761     }
3762
3763   /* If allowing the symbol's standard, succeed, too.  */
3764   if (gfc_option.allow_std & isym->standard)
3765     return SUCCESS;
3766
3767   /* Otherwise, fail.  */
3768   if (symstd)
3769     *symstd = _(symstd_msg);
3770   return FAILURE;
3771 }
3772
3773
3774 /* See if a function call corresponds to an intrinsic function call.
3775    We return:
3776
3777     MATCH_YES    if the call corresponds to an intrinsic, simplification
3778                  is done if possible.
3779
3780     MATCH_NO     if the call does not correspond to an intrinsic
3781
3782     MATCH_ERROR  if the call corresponds to an intrinsic but there was an
3783                  error during the simplification process.
3784
3785    The error_flag parameter enables an error reporting.  */
3786
3787 match
3788 gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag)
3789 {
3790   gfc_intrinsic_sym *isym, *specific;
3791   gfc_actual_arglist *actual;
3792   const char *name;
3793   int flag;
3794
3795   if (expr->value.function.isym != NULL)
3796     return (do_simplify (expr->value.function.isym, expr) == FAILURE)
3797            ? MATCH_ERROR : MATCH_YES;
3798
3799   if (!error_flag)
3800     gfc_push_suppress_errors ();
3801   flag = 0;
3802
3803   for (actual = expr->value.function.actual; actual; actual = actual->next)
3804     if (actual->expr != NULL)
3805       flag |= (actual->expr->ts.type != BT_INTEGER
3806                && actual->expr->ts.type != BT_CHARACTER);
3807
3808   name = expr->symtree->n.sym->name;
3809
3810   isym = specific = gfc_find_function (name);
3811   if (isym == NULL)
3812     {
3813       if (!error_flag)
3814         gfc_pop_suppress_errors ();
3815       return MATCH_NO;
3816     }
3817
3818   if ((isym->id == GFC_ISYM_REAL || isym->id == GFC_ISYM_DBLE
3819        || isym->id == GFC_ISYM_CMPLX)
3820       && gfc_init_expr_flag
3821       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Function '%s' "
3822                          "as initialization expression at %L", name,
3823                          &expr->where) == FAILURE)
3824     {
3825       if (!error_flag)
3826         gfc_pop_suppress_errors ();
3827       return MATCH_ERROR;
3828     }
3829
3830   gfc_current_intrinsic_where = &expr->where;
3831
3832   /* Bypass the generic list for min and max.  */
3833   if (isym->check.f1m == gfc_check_min_max)
3834     {
3835       init_arglist (isym);
3836
3837       if (gfc_check_min_max (expr->value.function.actual) == SUCCESS)
3838         goto got_specific;
3839
3840       if (!error_flag)
3841         gfc_pop_suppress_errors ();
3842       return MATCH_NO;
3843     }
3844
3845   /* If the function is generic, check all of its specific
3846      incarnations.  If the generic name is also a specific, we check
3847      that name last, so that any error message will correspond to the
3848      specific.  */
3849   gfc_push_suppress_errors ();
3850
3851   if (isym->generic)
3852     {
3853       for (specific = isym->specific_head; specific;
3854            specific = specific->next)
3855         {
3856           if (specific == isym)
3857             continue;
3858           if (check_specific (specific, expr, 0) == SUCCESS)
3859             {
3860               gfc_pop_suppress_errors ();
3861               goto got_specific;
3862             }
3863         }
3864     }
3865
3866   gfc_pop_suppress_errors ();
3867
3868   if (check_specific (isym, expr, error_flag) == FAILURE)
3869     {
3870       if (!error_flag)
3871         gfc_pop_suppress_errors ();
3872       return MATCH_NO;
3873     }
3874
3875   specific = isym;
3876
3877 got_specific:
3878   expr->value.function.isym = specific;
3879   gfc_intrinsic_symbol (expr->symtree->n.sym);
3880
3881   if (!error_flag)
3882     gfc_pop_suppress_errors ();
3883
3884   if (do_simplify (specific, expr) == FAILURE)
3885     return MATCH_ERROR;
3886
3887   /* F95, 7.1.6.1, Initialization expressions
3888      (4) An elemental intrinsic function reference of type integer or
3889          character where each argument is an initialization expression
3890          of type integer or character
3891
3892      F2003, 7.1.7 Initialization expression
3893      (4)   A reference to an elemental standard intrinsic function,
3894            where each argument is an initialization expression  */
3895
3896   if (gfc_init_expr_flag && isym->elemental && flag
3897       && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Elemental function "
3898                         "as initialization expression with non-integer/non-"
3899                         "character arguments at %L", &expr->where) == FAILURE)
3900     return MATCH_ERROR;
3901
3902   return MATCH_YES;
3903 }
3904
3905
3906 /* See if a CALL statement corresponds to an intrinsic subroutine.
3907    Returns MATCH_YES if the subroutine corresponds to an intrinsic,
3908    MATCH_NO if not, and MATCH_ERROR if there was an error (but did
3909    correspond).  */
3910
3911 match
3912 gfc_intrinsic_sub_interface (gfc_code *c, int error_flag)
3913 {
3914   gfc_intrinsic_sym *isym;
3915   const char *name;
3916
3917   name = c->symtree->n.sym->name;
3918
3919   isym = gfc_find_subroutine (name);
3920   if (isym == NULL)
3921     return MATCH_NO;
3922
3923   if (!error_flag)
3924     gfc_push_suppress_errors ();
3925
3926   init_arglist (isym);
3927
3928   if (sort_actual (name, &c->ext.actual, isym->formal, &c->loc) == FAILURE)
3929     goto fail;
3930
3931   if (isym->check.f1 != NULL)
3932     {
3933       if (do_check (isym, c->ext.actual) == FAILURE)
3934         goto fail;
3935     }
3936   else
3937     {
3938       if (check_arglist (&c->ext.actual, isym, 1) == FAILURE)
3939         goto fail;
3940     }
3941
3942   /* The subroutine corresponds to an intrinsic.  Allow errors to be
3943      seen at this point.  */
3944   if (!error_flag)
3945     gfc_pop_suppress_errors ();
3946
3947   c->resolved_isym = isym;
3948   if (isym->resolve.s1 != NULL)
3949     isym->resolve.s1 (c);
3950   else
3951     {
3952       c->resolved_sym = gfc_get_intrinsic_sub_symbol (isym->lib_name);
3953       c->resolved_sym->attr.elemental = isym->elemental;
3954     }
3955
3956   if (gfc_pure (NULL) && !isym->elemental)
3957     {
3958       gfc_error ("Subroutine call to intrinsic '%s' at %L is not PURE", name,
3959                  &c->loc);
3960       return MATCH_ERROR;
3961     }
3962
3963   c->resolved_sym->attr.noreturn = isym->noreturn;
3964
3965   return MATCH_YES;
3966
3967 fail:
3968   if (!error_flag)
3969     gfc_pop_suppress_errors ();
3970   return MATCH_NO;
3971 }
3972
3973
3974 /* Call gfc_convert_type() with warning enabled.  */
3975
3976 gfc_try
3977 gfc_convert_type (gfc_expr *expr, gfc_typespec *ts, int eflag)
3978 {
3979   return gfc_convert_type_warn (expr, ts, eflag, 1);
3980 }
3981
3982
3983 /* Try to convert an expression (in place) from one type to another.
3984    'eflag' controls the behavior on error.
3985
3986    The possible values are:
3987
3988      1 Generate a gfc_error()
3989      2 Generate a gfc_internal_error().
3990
3991    'wflag' controls the warning related to conversion.  */
3992
3993 gfc_try
3994 gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
3995 {
3996   gfc_intrinsic_sym *sym;
3997   gfc_typespec from_ts;
3998   locus old_where;
3999   gfc_expr *new_expr;
4000   int rank;
4001   mpz_t *shape;
4002
4003   from_ts = expr->ts;           /* expr->ts gets clobbered */
4004
4005   if (ts->type == BT_UNKNOWN)
4006     goto bad;
4007
4008   /* NULL and zero size arrays get their type here.  */
4009   if (expr->expr_type == EXPR_NULL
4010       || (expr->expr_type == EXPR_ARRAY && expr->value.constructor == NULL))
4011     {
4012       /* Sometimes the RHS acquire the type.  */
4013       expr->ts = *ts;
4014       return SUCCESS;
4015     }
4016
4017   if (expr->ts.type == BT_UNKNOWN)
4018     goto bad;
4019
4020   if (expr->ts.type == BT_DERIVED && ts->type == BT_DERIVED
4021       && gfc_compare_types (&expr->ts, ts))
4022     return SUCCESS;
4023
4024   sym = find_conv (&expr->ts, ts);
4025   if (sym == NULL)
4026     goto bad;
4027
4028   /* At this point, a conversion is necessary. A warning may be needed.  */
4029   if ((gfc_option.warn_std & sym->standard) != 0)
4030     {
4031       gfc_warning_now ("Extension: Conversion from %s to %s at %L",
4032                        gfc_typename (&from_ts), gfc_typename (ts),
4033                        &expr->where);
4034     }
4035   else if (wflag)
4036     {
4037       if (gfc_option.flag_range_check
4038           && expr->expr_type == EXPR_CONSTANT
4039           && from_ts.type == ts->type)
4040         {
4041           /* Do nothing. Constants of the same type are range-checked
4042              elsewhere. If a value too large for the target type is
4043              assigned, an error is generated. Not checking here avoids
4044              duplications of warnings/errors.
4045              If range checking was disabled, but -Wconversion enabled,
4046              a non range checked warning is generated below.  */
4047         }
4048       else if (from_ts.type == BT_LOGICAL || ts->type == BT_LOGICAL)
4049         {
4050           /* Do nothing. This block exists only to simplify the other
4051              else-if expressions.
4052                LOGICAL <> LOGICAL    no warning, independent of kind values
4053                LOGICAL <> INTEGER    extension, warned elsewhere
4054                LOGICAL <> REAL       invalid, error generated elsewhere
4055                LOGICAL <> COMPLEX    invalid, error generated elsewhere  */
4056         }
4057       else if (from_ts.type == ts->type
4058                || (from_ts.type == BT_INTEGER && ts->type == BT_REAL)
4059                || (from_ts.type == BT_INTEGER && ts->type == BT_COMPLEX)
4060                || (from_ts.type == BT_REAL && ts->type == BT_COMPLEX))
4061         {
4062           /* Larger kinds can hold values of smaller kinds without problems.
4063              Hence, only warn if target kind is smaller than the source
4064              kind - or if -Wconversion-extra is specified.  */
4065           if (gfc_option.warn_conversion_extra)
4066             gfc_warning_now ("Conversion from %s to %s at %L",
4067                              gfc_typename (&from_ts), gfc_typename (ts),
4068                              &expr->where);
4069           else if (gfc_option.warn_conversion
4070                    && from_ts.kind > ts->kind)
4071             gfc_warning_now ("Possible change of value in conversion "
4072                              "from %s to %s at %L", gfc_typename (&from_ts),
4073                              gfc_typename (ts), &expr->where);
4074         }
4075       else if ((from_ts.type == BT_REAL && ts->type == BT_INTEGER)
4076                || (from_ts.type == BT_COMPLEX && ts->type == BT_INTEGER)
4077                || (from_ts.type == BT_COMPLEX && ts->type == BT_REAL))
4078         {
4079           /* Conversion from REAL/COMPLEX to INTEGER or COMPLEX to REAL
4080              usually comes with a loss of information, regardless of kinds.  */
4081           if (gfc_option.warn_conversion_extra
4082               || gfc_option.warn_conversion)
4083             gfc_warning_now ("Possible change of value in conversion "
4084                              "from %s to %s at %L", gfc_typename (&from_ts),
4085                              gfc_typename (ts), &expr->where);
4086         }
4087       else if (from_ts.type == BT_HOLLERITH || ts->type == BT_HOLLERITH)
4088         {
4089           /* If HOLLERITH is involved, all bets are off.  */
4090           if (gfc_option.warn_conversion_extra
4091               || gfc_option.warn_conversion)
4092             gfc_warning_now ("Conversion from %s to %s at %L",
4093                              gfc_typename (&from_ts), gfc_typename (ts),
4094                              &expr->where);
4095         }
4096       else
4097         gcc_unreachable ();
4098     }
4099
4100   /* Insert a pre-resolved function call to the right function.  */
4101   old_where = expr->where;
4102   rank = expr->rank;
4103   shape = expr->shape;
4104
4105   new_expr = gfc_get_expr ();
4106   *new_expr = *expr;
4107
4108   new_expr = gfc_build_conversion (new_expr);
4109   new_expr->value.function.name = sym->lib_name;
4110   new_expr->value.function.isym = sym;
4111   new_expr->where = old_where;
4112   new_expr->rank = rank;
4113   new_expr->shape = gfc_copy_shape (shape, rank);
4114
4115   gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4116   new_expr->symtree->n.sym->result = new_expr->symtree->n.sym;
4117   new_expr->symtree->n.sym->ts = *ts;
4118   new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4119   new_expr->symtree->n.sym->attr.function = 1;
4120   new_expr->symtree->n.sym->attr.elemental = 1;
4121   new_expr->symtree->n.sym->attr.pure = 1;
4122   new_expr->symtree->n.sym->attr.referenced = 1;
4123   gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4124   gfc_commit_symbol (new_expr->symtree->n.sym);
4125
4126   *expr = *new_expr;
4127
4128   gfc_free (new_expr);
4129   expr->ts = *ts;
4130
4131   if (gfc_is_constant_expr (expr->value.function.actual->expr)
4132       && do_simplify (sym, expr) == FAILURE)
4133     {
4134
4135       if (eflag == 2)
4136         goto bad;
4137       return FAILURE;           /* Error already generated in do_simplify() */
4138     }
4139
4140   return SUCCESS;
4141
4142 bad:
4143   if (eflag == 1)
4144     {
4145       gfc_error ("Can't convert %s to %s at %L",
4146                  gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
4147       return FAILURE;
4148     }
4149
4150   gfc_internal_error ("Can't convert %s to %s at %L",
4151                       gfc_typename (&from_ts), gfc_typename (ts),
4152                       &expr->where);
4153   /* Not reached */
4154 }
4155
4156
4157 gfc_try
4158 gfc_convert_chartype (gfc_expr *expr, gfc_typespec *ts)
4159 {
4160   gfc_intrinsic_sym *sym;
4161   locus old_where;
4162   gfc_expr *new_expr;
4163   int rank;
4164   mpz_t *shape;
4165
4166   gcc_assert (expr->ts.type == BT_CHARACTER && ts->type == BT_CHARACTER);
4167
4168   sym = find_char_conv (&expr->ts, ts);
4169   gcc_assert (sym);
4170
4171   /* Insert a pre-resolved function call to the right function.  */
4172   old_where = expr->where;
4173   rank = expr->rank;
4174   shape = expr->shape;
4175
4176   new_expr = gfc_get_expr ();
4177   *new_expr = *expr;
4178
4179   new_expr = gfc_build_conversion (new_expr);
4180   new_expr->value.function.name = sym->lib_name;
4181   new_expr->value.function.isym = sym;
4182   new_expr->where = old_where;
4183   new_expr->rank = rank;
4184   new_expr->shape = gfc_copy_shape (shape, rank);
4185
4186   gfc_get_ha_sym_tree (sym->name, &new_expr->symtree);
4187   new_expr->symtree->n.sym->ts = *ts;
4188   new_expr->symtree->n.sym->attr.flavor = FL_PROCEDURE;
4189   new_expr->symtree->n.sym->attr.function = 1;
4190   new_expr->symtree->n.sym->attr.elemental = 1;
4191   new_expr->symtree->n.sym->attr.referenced = 1;
4192   gfc_intrinsic_symbol(new_expr->symtree->n.sym);
4193   gfc_commit_symbol (new_expr->symtree->n.sym);
4194
4195   *expr = *new_expr;
4196
4197   gfc_free (new_expr);
4198   expr->ts = *ts;
4199
4200   if (gfc_is_constant_expr (expr->value.function.actual->expr)
4201       && do_simplify (sym, expr) == FAILURE)
4202     {
4203       /* Error already generated in do_simplify() */
4204       return FAILURE;
4205     }
4206
4207   return SUCCESS;
4208 }
4209
4210
4211 /* Check if the passed name is name of an intrinsic (taking into account the
4212    current -std=* and -fall-intrinsic settings).  If it is, see if we should
4213    warn about this as a user-procedure having the same name as an intrinsic
4214    (-Wintrinsic-shadow enabled) and do so if we should.  */
4215
4216 void
4217 gfc_warn_intrinsic_shadow (const gfc_symbol* sym, bool in_module, bool func)
4218 {
4219   gfc_intrinsic_sym* isym;
4220
4221   /* If the warning is disabled, do nothing at all.  */
4222   if (!gfc_option.warn_intrinsic_shadow)
4223     return;
4224
4225   /* Try to find an intrinsic of the same name.  */
4226   if (func)
4227     isym = gfc_find_function (sym->name);
4228   else  
4229     isym = gfc_find_subroutine (sym->name);
4230
4231   /* If no intrinsic was found with this name or it's not included in the
4232      selected standard, everything's fine.  */
4233   if (!isym || gfc_check_intrinsic_standard (isym, NULL, true,
4234                                              sym->declared_at) == FAILURE)
4235     return;
4236
4237   /* Emit the warning.  */
4238   if (in_module)
4239     gfc_warning ("'%s' declared at %L may shadow the intrinsic of the same"
4240                  " name.  In order to call the intrinsic, explicit INTRINSIC"
4241                  " declarations may be required.",
4242                  sym->name, &sym->declared_at);
4243   else
4244     gfc_warning ("'%s' declared at %L is also the name of an intrinsic.  It can"
4245                  " only be called via an explicit interface or if declared"
4246                  " EXTERNAL.", sym->name, &sym->declared_at);
4247 }