OSDN Git Service

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