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