Bug Summary

File:build/gcc/fortran/check.cc
Warning:line 3651, column 22
The left operand of '==' is a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-suse-linux -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name check.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -resource-dir /usr/lib64/clang/15.0.7 -D IN_GCC_FRONTEND -D IN_GCC -D HAVE_CONFIG_H -I . -I fortran -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/backward -internal-isystem /usr/lib64/clang/15.0.7/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2023-03-27-141847-20772-1/report-YX6QvD.plist -x c++ /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc
1/* Check functions
2 Copyright (C) 2002-2023 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21
22/* These functions check to see if an argument list is compatible with
23 a particular intrinsic function or subroutine. Presence of
24 required arguments has already been established, the argument list
25 has been sorted into the right order and has NULL arguments in the
26 correct places for missing optional arguments. */
27
28#include "config.h"
29#include "system.h"
30#include "coretypes.h"
31#include "options.h"
32#include "gfortran.h"
33#include "intrinsic.h"
34#include "constructor.h"
35#include "target-memory.h"
36
37
38/* Reset a BOZ to a zero value. This is used to prevent run-on errors
39 from resolve.cc(resolve_function). */
40
41static void
42reset_boz (gfc_expr *x)
43{
44 /* Clear boz info. */
45 x->boz.rdx = 0;
46 x->boz.len = 0;
47 free (x->boz.str);
48
49 x->ts.type = BT_INTEGER;
50 x->ts.kind = gfc_default_integer_kind;
51 mpz_init__gmpz_init (x->value.integer);
52 mpz_set_ui__gmpz_set_ui (x->value.integer, 0);
53}
54
55/* A BOZ literal constant can appear in a limited number of contexts.
56 gfc_invalid_boz() is a helper function to simplify error/warning
57 generation. gfortran accepts the nonstandard 'X' for 'Z', and gfortran
58 allows the BOZ indicator to appear as a suffix. If -fallow-invalid-boz
59 is used, then issue a warning; otherwise issue an error. */
60
61bool
62gfc_invalid_boz (const char *msg, locus *loc)
63{
64 if (flag_allow_invalid_bozglobal_options.x_flag_allow_invalid_boz)
65 {
66 gfc_warning (0, msg, loc);
67 return false;
68 }
69
70 const char *hint = _(" [see %<-fno-allow-invalid-boz%>]")gettext (" [see %<-fno-allow-invalid-boz%>]");
71 size_t len = strlen (msg) + strlen (hint) + 1;
72 char *msg2 = (char *) alloca (len)__builtin_alloca(len);
73 strcpy (msg2, msg);
74 strcat (msg2, hint);
75 gfc_error (msg2, loc);
76 return true;
77}
78
79
80/* Issue an error for an illegal BOZ argument. */
81
82static bool
83illegal_boz_arg (gfc_expr *x)
84{
85 if (x->ts.type == BT_BOZ)
86 {
87 gfc_error ("BOZ literal constant at %L cannot be an actual argument "
88 "to %qs", &x->where, gfc_current_intrinsic);
89 reset_boz (x);
90 return true;
91 }
92
93 return false;
94}
95
96/* Some precedures take two arguments such that both cannot be BOZ. */
97
98static bool
99boz_args_check(gfc_expr *i, gfc_expr *j)
100{
101 if (i->ts.type == BT_BOZ && j->ts.type == BT_BOZ)
102 {
103 gfc_error ("Arguments of %qs at %L and %L cannot both be BOZ "
104 "literal constants", gfc_current_intrinsic, &i->where,
105 &j->where);
106 reset_boz (i);
107 reset_boz (j);
108 return false;
109
110 }
111
112 return true;
113}
114
115
116/* Check that a BOZ is a constant. */
117
118static bool
119is_boz_constant (gfc_expr *a)
120{
121 if (a->expr_type != EXPR_CONSTANT)
122 {
123 gfc_error ("Invalid use of BOZ literal constant at %L", &a->where);
124 return false;
125 }
126
127 return true;
128}
129
130
131/* Convert a octal string into a binary string. This is used in the
132 fallback conversion of an octal string to a REAL. */
133
134static char *
135oct2bin(int nbits, char *oct)
136{
137 const char bits[8][5] = {
138 "000", "001", "010", "011", "100", "101", "110", "111"};
139
140 char *buf, *bufp;
141 int i, j, n;
142
143 j = nbits + 1;
144 if (nbits == 64) j++;
145
146 bufp = buf = XCNEWVEC (char, j + 1)((char *) xcalloc ((j + 1), sizeof (char)));
147 memset (bufp, 0, j + 1);
148
149 n = strlen (oct);
150 for (i = 0; i < n; i++, oct++)
151 {
152 j = *oct - 48;
153 strcpy (bufp, &bits[j][0]);
154 bufp += 3;
155 }
156
157 bufp = XCNEWVEC (char, nbits + 1)((char *) xcalloc ((nbits + 1), sizeof (char)));
158 if (nbits == 64)
159 strcpy (bufp, buf + 2);
160 else
161 strcpy (bufp, buf + 1);
162
163 free (buf);
164
165 return bufp;
166}
167
168
169/* Convert a hexidecimal string into a binary string. This is used in the
170 fallback conversion of a hexidecimal string to a REAL. */
171
172static char *
173hex2bin(int nbits, char *hex)
174{
175 const char bits[16][5] = {
176 "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
177 "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
178
179 char *buf, *bufp;
180 int i, j, n;
181
182 bufp = buf = XCNEWVEC (char, nbits + 1)((char *) xcalloc ((nbits + 1), sizeof (char)));
183 memset (bufp, 0, nbits + 1);
184
185 n = strlen (hex);
186 for (i = 0; i < n; i++, hex++)
187 {
188 j = *hex;
189 if (j > 47 && j < 58)
190 j -= 48;
191 else if (j > 64 && j < 71)
192 j -= 55;
193 else if (j > 96 && j < 103)
194 j -= 87;
195 else
196 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 196, __FUNCTION__))
;
197
198 strcpy (bufp, &bits[j][0]);
199 bufp += 4;
200 }
201
202 return buf;
203}
204
205
206/* Fallback conversion of a BOZ string to REAL. */
207
208static void
209bin2real (gfc_expr *x, int kind)
210{
211 char buf[114], *sp;
212 int b, i, ie, t, w;
213 bool sgn;
214 mpz_t em;
215
216 i = gfc_validate_kind (BT_REAL, kind, false);
217 t = gfc_real_kinds[i].digits - 1;
218
219 /* Number of bits in the exponent. */
220 if (gfc_real_kinds[i].max_exponent == 16384)
221 w = 15;
222 else if (gfc_real_kinds[i].max_exponent == 1024)
223 w = 11;
224 else
225 w = 8;
226
227 if (x->boz.rdx == 16)
228 sp = hex2bin (gfc_real_kinds[i].mode_precision, x->boz.str);
229 else if (x->boz.rdx == 8)
230 sp = oct2bin (gfc_real_kinds[i].mode_precision, x->boz.str);
231 else
232 sp = x->boz.str;
233
234 /* Extract sign bit. */
235 sgn = *sp != '0';
236
237 /* Extract biased exponent. */
238 memset (buf, 0, 114);
239 strncpy (buf, ++sp, w);
240 mpz_init__gmpz_init (em);
241 mpz_set_str__gmpz_set_str (em, buf, 2);
242 ie = mpz_get_si__gmpz_get_si (em);
243
244 mpfr_init2 (x->value.real, t + 1);
245 x->ts.type = BT_REAL;
246 x->ts.kind = kind;
247
248 sp += w; /* Set to first digit in significand. */
249 b = (1 << w) - 1;
250 if ((i == 0 && ie == b) || (i == 1 && ie == b)
251 || ((i == 2 || i == 3) && ie == b))
252 {
253 bool zeros = true;
254 if (i == 2) sp++;
255 for (; *sp; sp++)
256 {
257 if (*sp != '0')
258 {
259 zeros = false;
260 break;
261 }
262 }
263
264 if (zeros)
265 mpfr_set_inf (x->value.real, 1);
266 else
267 mpfr_set_nan (x->value.real);
268 }
269 else
270 {
271 if (i == 2)
272 strncpy (buf, sp, t + 1);
273 else
274 {
275 /* Significand with hidden bit. */
276 buf[0] = '1';
277 strncpy (&buf[1], sp, t);
278 }
279
280 /* Convert to significand to integer. */
281 mpz_set_str__gmpz_set_str (em, buf, 2);
282 ie -= ((1 << (w - 1)) - 1); /* Unbiased exponent. */
283 mpfr_set_z_2exp (x->value.real, em, ie - t, GFC_RND_MODEMPFR_RNDN);
284 }
285
286 if (sgn) mpfr_neg (x->value.real, x->value.real, GFC_RND_MODEMPFR_RNDN);
287
288 mpz_clear__gmpz_clear (em);
289}
290
291
292/* Fortran 2018 treats a BOZ as simply a string of bits. gfc_boz2real ()
293 converts the string into a REAL of the appropriate kind. The treatment
294 of the sign bit is processor dependent. */
295
296bool
297gfc_boz2real (gfc_expr *x, int kind)
298{
299 extern int gfc_max_integer_kind;
300 gfc_typespec ts;
301 int len;
302 char *buf, *str;
303
304 if (!is_boz_constant (x))
305 return false;
306
307 /* Determine the length of the required string. */
308 len = 8 * kind;
309 if (x->boz.rdx == 16) len /= 4;
310 if (x->boz.rdx == 8) len = len / 3 + 1;
311 buf = (char *) alloca (len + 1)__builtin_alloca(len + 1); /* +1 for NULL terminator. */
312
313 if (x->boz.len >= len) /* Truncate if necessary. */
314 {
315 str = x->boz.str + (x->boz.len - len);
316 strcpy(buf, str);
317 }
318 else /* Copy and pad. */
319 {
320 memset (buf, 48, len);
321 str = buf + (len - x->boz.len);
322 strcpy (str, x->boz.str);
323 }
324
325 /* Need to adjust leading bits in an octal string. */
326 if (x->boz.rdx == 8)
327 {
328 /* Clear first bit. */
329 if (kind == 4 || kind == 10 || kind == 16)
330 {
331 if (buf[0] == '4')
332 buf[0] = '0';
333 else if (buf[0] == '5')
334 buf[0] = '1';
335 else if (buf[0] == '6')
336 buf[0] = '2';
337 else if (buf[0] == '7')
338 buf[0] = '3';
339 }
340 /* Clear first two bits. */
341 else
342 {
343 if (buf[0] == '2' || buf[0] == '4' || buf[0] == '6')
344 buf[0] = '0';
345 else if (buf[0] == '3' || buf[0] == '5' || buf[0] == '7')
346 buf[0] = '1';
347 }
348 }
349
350 /* Reset BOZ string to the truncated or padded version. */
351 free (x->boz.str);
352 x->boz.len = len;
353 x->boz.str = XCNEWVEC (char, len + 1)((char *) xcalloc ((len + 1), sizeof (char)));
354 strncpy (x->boz.str, buf, len);
355
356 /* For some targets, the largest INTEGER in terms of bits is smaller than
357 the bits needed to hold the REAL. Fortunately, the kind type parameter
358 indicates the number of bytes required to an INTEGER and a REAL. */
359 if (gfc_max_integer_kind < kind)
360 {
361 bin2real (x, kind);
362 }
363 else
364 {
365 /* Convert to widest possible integer. */
366 gfc_boz2int (x, gfc_max_integer_kind);
367 ts.type = BT_REAL;
368 ts.kind = kind;
369 if (!gfc_convert_boz (x, &ts))
370 {
371 gfc_error ("Failure in conversion of BOZ to REAL at %L", &x->where);
372 return false;
373 }
374 }
375
376 return true;
377}
378
379
380/* Fortran 2018 treats a BOZ as simply a string of bits. gfc_boz2int ()
381 converts the string into an INTEGER of the appropriate kind. The
382 treatment of the sign bit is processor dependent. If the converted
383 value exceeds the range of the type, then wrap-around semantics are
384 applied. */
385
386bool
387gfc_boz2int (gfc_expr *x, int kind)
388{
389 int i, len;
390 char *buf, *str;
391 mpz_t tmp1;
392
393 if (!is_boz_constant (x))
394 return false;
395
396 i = gfc_validate_kind (BT_INTEGER, kind, false);
397 len = gfc_integer_kinds[i].bit_size;
398 if (x->boz.rdx == 16) len /= 4;
399 if (x->boz.rdx == 8) len = len / 3 + 1;
400 buf = (char *) alloca (len + 1)__builtin_alloca(len + 1); /* +1 for NULL terminator. */
401
402 if (x->boz.len >= len) /* Truncate if necessary. */
403 {
404 str = x->boz.str + (x->boz.len - len);
405 strcpy(buf, str);
406 }
407 else /* Copy and pad. */
408 {
409 memset (buf, 48, len);
410 str = buf + (len - x->boz.len);
411 strcpy (str, x->boz.str);
412 }
413
414 /* Need to adjust leading bits in an octal string. */
415 if (x->boz.rdx == 8)
416 {
417 /* Clear first bit. */
418 if (kind == 1 || kind == 4 || kind == 16)
419 {
420 if (buf[0] == '4')
421 buf[0] = '0';
422 else if (buf[0] == '5')
423 buf[0] = '1';
424 else if (buf[0] == '6')
425 buf[0] = '2';
426 else if (buf[0] == '7')
427 buf[0] = '3';
428 }
429 /* Clear first two bits. */
430 else
431 {
432 if (buf[0] == '2' || buf[0] == '4' || buf[0] == '6')
433 buf[0] = '0';
434 else if (buf[0] == '3' || buf[0] == '5' || buf[0] == '7')
435 buf[0] = '1';
436 }
437 }
438
439 /* Convert as-if unsigned integer. */
440 mpz_init__gmpz_init (tmp1);
441 mpz_set_str__gmpz_set_str (tmp1, buf, x->boz.rdx);
442
443 /* Check for wrap-around. */
444 if (mpz_cmp__gmpz_cmp (tmp1, gfc_integer_kinds[i].huge) > 0)
445 {
446 mpz_t tmp2;
447 mpz_init__gmpz_init (tmp2);
448 mpz_add_ui__gmpz_add_ui (tmp2, gfc_integer_kinds[i].huge, 1);
449 mpz_mod__gmpz_mod (tmp1, tmp1, tmp2);
450 mpz_sub__gmpz_sub (tmp1, tmp1, tmp2);
451 mpz_clear__gmpz_clear (tmp2);
452 }
453
454 /* Clear boz info. */
455 x->boz.rdx = 0;
456 x->boz.len = 0;
457 free (x->boz.str);
458
459 mpz_init__gmpz_init (x->value.integer);
460 mpz_set__gmpz_set (x->value.integer, tmp1);
461 x->ts.type = BT_INTEGER;
462 x->ts.kind = kind;
463 mpz_clear__gmpz_clear (tmp1);
464
465 return true;
466}
467
468
469/* Make sure an expression is a scalar. */
470
471static bool
472scalar_check (gfc_expr *e, int n)
473{
474 if (e->rank == 0)
475 return true;
476
477 gfc_error ("%qs argument of %qs intrinsic at %L must be a scalar",
478 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
479 &e->where);
480
481 return false;
482}
483
484
485/* Check the type of an expression. */
486
487static bool
488type_check (gfc_expr *e, int n, bt type)
489{
490 if (e->ts.type == type)
491 return true;
492
493 gfc_error ("%qs argument of %qs intrinsic at %L must be %s",
494 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
495 &e->where, gfc_basic_typename (type));
496
497 return false;
498}
499
500
501/* Check that the expression is a numeric type. */
502
503static bool
504numeric_check (gfc_expr *e, int n)
505{
506 /* Users sometime use a subroutine designator as an actual argument to
507 an intrinsic subprogram that expects an argument with a numeric type. */
508 if (e->symtree && e->symtree->n.sym->attr.subroutine)
509 goto error;
510
511 if (gfc_numeric_ts (&e->ts))
512 return true;
513
514 /* If the expression has not got a type, check if its namespace can
515 offer a default type. */
516 if ((e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_FUNCTION)
517 && e->symtree->n.sym->ts.type == BT_UNKNOWN
518 && gfc_set_default_type (e->symtree->n.sym, 0, e->symtree->n.sym->ns)
519 && gfc_numeric_ts (&e->symtree->n.sym->ts))
520 {
521 e->ts = e->symtree->n.sym->ts;
522 return true;
523 }
524
525error:
526
527 gfc_error ("%qs argument of %qs intrinsic at %L must have a numeric type",
528 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
529 &e->where);
530
531 return false;
532}
533
534
535/* Check that an expression is integer or real. */
536
537static bool
538int_or_real_check (gfc_expr *e, int n)
539{
540 if (e->ts.type != BT_INTEGER && e->ts.type != BT_REAL)
541 {
542 gfc_error ("%qs argument of %qs intrinsic at %L must be INTEGER "
543 "or REAL", gfc_current_intrinsic_arg[n]->name,
544 gfc_current_intrinsic, &e->where);
545 return false;
546 }
547
548 return true;
549}
550
551/* Check that an expression is integer or real; allow character for
552 F2003 or later. */
553
554static bool
555int_or_real_or_char_check_f2003 (gfc_expr *e, int n)
556{
557 if (e->ts.type != BT_INTEGER && e->ts.type != BT_REAL)
558 {
559 if (e->ts.type == BT_CHARACTER)
560 return gfc_notify_std (GFC_STD_F2003(1<<4), "Fortran 2003: Character for "
561 "%qs argument of %qs intrinsic at %L",
562 gfc_current_intrinsic_arg[n]->name,
563 gfc_current_intrinsic, &e->where);
564 else
565 {
566 if (gfc_option.allow_std & GFC_STD_F2003(1<<4))
567 gfc_error ("%qs argument of %qs intrinsic at %L must be INTEGER "
568 "or REAL or CHARACTER",
569 gfc_current_intrinsic_arg[n]->name,
570 gfc_current_intrinsic, &e->where);
571 else
572 gfc_error ("%qs argument of %qs intrinsic at %L must be INTEGER "
573 "or REAL", gfc_current_intrinsic_arg[n]->name,
574 gfc_current_intrinsic, &e->where);
575 }
576 return false;
577 }
578
579 return true;
580}
581
582/* Check that an expression is an intrinsic type. */
583static bool
584intrinsic_type_check (gfc_expr *e, int n)
585{
586 if (e->ts.type != BT_INTEGER && e->ts.type != BT_REAL
587 && e->ts.type != BT_COMPLEX && e->ts.type != BT_CHARACTER
588 && e->ts.type != BT_LOGICAL)
589 {
590 gfc_error ("%qs argument of %qs intrinsic at %L must be of intrinsic type",
591 gfc_current_intrinsic_arg[n]->name,
592 gfc_current_intrinsic, &e->where);
593 return false;
594 }
595 return true;
596}
597
598/* Check that an expression is real or complex. */
599
600static bool
601real_or_complex_check (gfc_expr *e, int n)
602{
603 if (e->ts.type != BT_REAL && e->ts.type != BT_COMPLEX)
604 {
605 gfc_error ("%qs argument of %qs intrinsic at %L must be REAL "
606 "or COMPLEX", gfc_current_intrinsic_arg[n]->name,
607 gfc_current_intrinsic, &e->where);
608 return false;
609 }
610
611 return true;
612}
613
614
615/* Check that an expression is INTEGER or PROCEDURE. */
616
617static bool
618int_or_proc_check (gfc_expr *e, int n)
619{
620 if (e->ts.type != BT_INTEGER && e->ts.type != BT_PROCEDURE)
621 {
622 gfc_error ("%qs argument of %qs intrinsic at %L must be INTEGER "
623 "or PROCEDURE", gfc_current_intrinsic_arg[n]->name,
624 gfc_current_intrinsic, &e->where);
625 return false;
626 }
627
628 return true;
629}
630
631
632/* Check that the expression is an optional constant integer
633 and that it specifies a valid kind for that type. */
634
635static bool
636kind_check (gfc_expr *k, int n, bt type)
637{
638 int kind;
639
640 if (k == NULL__null)
641 return true;
642
643 if (!type_check (k, n, BT_INTEGER))
644 return false;
645
646 if (!scalar_check (k, n))
647 return false;
648
649 if (!gfc_check_init_expr (k))
650 {
651 gfc_error ("%qs argument of %qs intrinsic at %L must be a constant",
652 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
653 &k->where);
654 return false;
655 }
656
657 if (gfc_extract_int (k, &kind)
658 || gfc_validate_kind (type, kind, true) < 0)
659 {
660 gfc_error ("Invalid kind for %s at %L", gfc_basic_typename (type),
661 &k->where);
662 return false;
663 }
664
665 return true;
666}
667
668
669/* Make sure the expression is a double precision real. */
670
671static bool
672double_check (gfc_expr *d, int n)
673{
674 if (!type_check (d, n, BT_REAL))
675 return false;
676
677 if (d->ts.kind != gfc_default_double_kind)
678 {
679 gfc_error ("%qs argument of %qs intrinsic at %L must be double "
680 "precision", gfc_current_intrinsic_arg[n]->name,
681 gfc_current_intrinsic, &d->where);
682 return false;
683 }
684
685 return true;
686}
687
688
689static bool
690coarray_check (gfc_expr *e, int n)
691{
692 if (e->ts.type == BT_CLASS && gfc_expr_attr (e).class_ok
693 && CLASS_DATA (e)e->ts.u.derived->components->attr.codimension
694 && CLASS_DATA (e)e->ts.u.derived->components->as->corank)
695 {
696 gfc_add_class_array_ref (e);
697 return true;
698 }
699
700 if (!gfc_is_coarray (e))
701 {
702 gfc_error ("Expected coarray variable as %qs argument to the %s "
703 "intrinsic at %L", gfc_current_intrinsic_arg[n]->name,
704 gfc_current_intrinsic, &e->where);
705 return false;
706 }
707
708 return true;
709}
710
711
712/* Make sure the expression is a logical array. */
713
714static bool
715logical_array_check (gfc_expr *array, int n)
716{
717 if (array->ts.type != BT_LOGICAL || array->rank == 0)
718 {
719 gfc_error ("%qs argument of %qs intrinsic at %L must be a logical "
720 "array", gfc_current_intrinsic_arg[n]->name,
721 gfc_current_intrinsic, &array->where);
722 return false;
723 }
724
725 return true;
726}
727
728
729/* Make sure an expression is an array. */
730
731static bool
732array_check (gfc_expr *e, int n)
733{
734 if (e->rank != 0 && e->ts.type == BT_CLASS && gfc_expr_attr (e).class_ok
735 && CLASS_DATA (e)e->ts.u.derived->components->attr.dimension
736 && CLASS_DATA (e)e->ts.u.derived->components->as->rank)
737 {
738 gfc_add_class_array_ref (e);
739 }
740
741 if (e->rank != 0 && e->ts.type != BT_PROCEDURE)
742 return true;
743
744 gfc_error ("%qs argument of %qs intrinsic at %L must be an array",
745 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
746 &e->where);
747
748 return false;
749}
750
751
752/* If expr is a constant, then check to ensure that it is greater than
753 of equal to zero. */
754
755static bool
756nonnegative_check (const char *arg, gfc_expr *expr)
757{
758 int i;
759
760 if (expr->expr_type == EXPR_CONSTANT)
761 {
762 gfc_extract_int (expr, &i);
763 if (i < 0)
764 {
765 gfc_error ("%qs at %L must be nonnegative", arg, &expr->where);
766 return false;
767 }
768 }
769
770 return true;
771}
772
773
774/* If expr is a constant, then check to ensure that it is greater than zero. */
775
776static bool
777positive_check (int n, gfc_expr *expr)
778{
779 int i;
780
781 if (expr->expr_type == EXPR_CONSTANT)
782 {
783 gfc_extract_int (expr, &i);
784 if (i <= 0)
785 {
786 gfc_error ("%qs argument of %qs intrinsic at %L must be positive",
787 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
788 &expr->where);
789 return false;
790 }
791 }
792
793 return true;
794}
795
796
797/* If expr2 is constant, then check that the value is less than
798 (less than or equal to, if 'or_equal' is true) bit_size(expr1). */
799
800static bool
801less_than_bitsize1 (const char *arg1, gfc_expr *expr1, const char *arg2,
802 gfc_expr *expr2, bool or_equal)
803{
804 int i2, i3;
805
806 if (expr2->expr_type == EXPR_CONSTANT)
807 {
808 gfc_extract_int (expr2, &i2);
809 i3 = gfc_validate_kind (BT_INTEGER, expr1->ts.kind, false);
810
811 /* For ISHFT[C], check that |shift| <= bit_size(i). */
812 if (arg2 == NULL__null)
813 {
814 if (i2 < 0)
815 i2 = -i2;
816
817 if (i2 > gfc_integer_kinds[i3].bit_size)
818 {
819 gfc_error ("The absolute value of SHIFT at %L must be less "
820 "than or equal to BIT_SIZE(%qs)",
821 &expr2->where, arg1);
822 return false;
823 }
824 }
825
826 if (or_equal)
827 {
828 if (i2 > gfc_integer_kinds[i3].bit_size)
829 {
830 gfc_error ("%qs at %L must be less than "
831 "or equal to BIT_SIZE(%qs)",
832 arg2, &expr2->where, arg1);
833 return false;
834 }
835 }
836 else
837 {
838 if (i2 >= gfc_integer_kinds[i3].bit_size)
839 {
840 gfc_error ("%qs at %L must be less than BIT_SIZE(%qs)",
841 arg2, &expr2->where, arg1);
842 return false;
843 }
844 }
845 }
846
847 return true;
848}
849
850
851/* If expr is constant, then check that the value is less than or equal
852 to the bit_size of the kind k. */
853
854static bool
855less_than_bitsizekind (const char *arg, gfc_expr *expr, int k)
856{
857 int i, val;
858
859 if (expr->expr_type != EXPR_CONSTANT)
860 return true;
861
862 i = gfc_validate_kind (BT_INTEGER, k, false);
863 gfc_extract_int (expr, &val);
864
865 if (val > gfc_integer_kinds[i].bit_size)
866 {
867 gfc_error ("%qs at %L must be less than or equal to the BIT_SIZE of "
868 "INTEGER(KIND=%d)", arg, &expr->where, k);
869 return false;
870 }
871
872 return true;
873}
874
875
876/* If expr2 and expr3 are constants, then check that the value is less than
877 or equal to bit_size(expr1). */
878
879static bool
880less_than_bitsize2 (const char *arg1, gfc_expr *expr1, const char *arg2,
881 gfc_expr *expr2, const char *arg3, gfc_expr *expr3)
882{
883 int i2, i3;
884
885 if (expr2->expr_type == EXPR_CONSTANT && expr3->expr_type == EXPR_CONSTANT)
886 {
887 gfc_extract_int (expr2, &i2);
888 gfc_extract_int (expr3, &i3);
889 i2 += i3;
890 i3 = gfc_validate_kind (BT_INTEGER, expr1->ts.kind, false);
891 if (i2 > gfc_integer_kinds[i3].bit_size)
892 {
893 gfc_error ("%<%s + %s%> at %L must be less than or equal "
894 "to BIT_SIZE(%qs)",
895 arg2, arg3, &expr2->where, arg1);
896 return false;
897 }
898 }
899
900 return true;
901}
902
903/* Make sure two expressions have the same type. */
904
905static bool
906same_type_check (gfc_expr *e, int n, gfc_expr *f, int m, bool assoc = false)
907{
908 gfc_typespec *ets = &e->ts;
909 gfc_typespec *fts = &f->ts;
910
911 if (assoc)
912 {
913 /* Procedure pointer component expressions have the type of the interface
914 procedure. If they are being tested for association with a procedure
915 pointer (ie. not a component), the type of the procedure must be
916 determined. */
917 if (e->ts.type == BT_PROCEDURE && e->symtree->n.sym)
918 ets = &e->symtree->n.sym->ts;
919 if (f->ts.type == BT_PROCEDURE && f->symtree->n.sym)
920 fts = &f->symtree->n.sym->ts;
921 }
922
923 if (gfc_compare_types (ets, fts))
924 return true;
925
926 gfc_error ("%qs argument of %qs intrinsic at %L must be the same type "
927 "and kind as %qs", gfc_current_intrinsic_arg[m]->name,
928 gfc_current_intrinsic, &f->where,
929 gfc_current_intrinsic_arg[n]->name);
930
931 return false;
932}
933
934
935/* Make sure that an expression has a certain (nonzero) rank. */
936
937static bool
938rank_check (gfc_expr *e, int n, int rank)
939{
940 if (e->rank == rank)
941 return true;
942
943 gfc_error ("%qs argument of %qs intrinsic at %L must be of rank %d",
944 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
945 &e->where, rank);
946
947 return false;
948}
949
950
951/* Make sure a variable expression is not an optional dummy argument. */
952
953static bool
954nonoptional_check (gfc_expr *e, int n)
955{
956 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.optional)
957 {
958 gfc_error ("%qs argument of %qs intrinsic at %L must not be OPTIONAL",
959 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
960 &e->where);
961 }
962
963 /* TODO: Recursive check on nonoptional variables? */
964
965 return true;
966}
967
968
969/* Check for ALLOCATABLE attribute. */
970
971static bool
972allocatable_check (gfc_expr *e, int n)
973{
974 symbol_attribute attr;
975
976 attr = gfc_variable_attr (e, NULL__null);
977 if (!attr.allocatable
978 || (attr.associate_var && !attr.select_rank_temporary))
979 {
980 gfc_error ("%qs argument of %qs intrinsic at %L must be ALLOCATABLE",
981 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
982 &e->where);
983 return false;
984 }
985
986 return true;
987}
988
989
990/* Check that an expression has a particular kind. */
991
992static bool
993kind_value_check (gfc_expr *e, int n, int k)
994{
995 if (e->ts.kind == k)
996 return true;
997
998 gfc_error ("%qs argument of %qs intrinsic at %L must be of kind %d",
999 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
1000 &e->where, k);
1001
1002 return false;
1003}
1004
1005
1006/* Make sure an expression is a variable. */
1007
1008static bool
1009variable_check (gfc_expr *e, int n, bool allow_proc)
1010{
1011 if (e->expr_type == EXPR_VARIABLE
1012 && e->symtree->n.sym->attr.intent == INTENT_IN
1013 && (gfc_current_intrinsic_arg[n]->intent == INTENT_OUT
1014 || gfc_current_intrinsic_arg[n]->intent == INTENT_INOUT)
1015 && !gfc_check_vardef_context (e, false, true, false, NULL__null))
1016 {
1017 gfc_error ("%qs argument of %qs intrinsic at %L cannot be INTENT(IN)",
1018 gfc_current_intrinsic_arg[n]->name,
1019 gfc_current_intrinsic, &e->where);
1020 return false;
1021 }
1022
1023 if (e->expr_type == EXPR_VARIABLE
1024 && e->symtree->n.sym->attr.flavor != FL_PARAMETER
1025 && (allow_proc || !e->symtree->n.sym->attr.function))
1026 return true;
1027
1028 if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.function
1029 && e->symtree->n.sym == e->symtree->n.sym->result)
1030 {
1031 gfc_namespace *ns;
1032 for (ns = gfc_current_ns; ns; ns = ns->parent)
1033 if (ns->proc_name == e->symtree->n.sym)
1034 return true;
1035 }
1036
1037 /* F2018:R902: function reference having a data pointer result. */
1038 if (e->expr_type == EXPR_FUNCTION
1039 && e->symtree->n.sym->attr.flavor == FL_PROCEDURE
1040 && e->symtree->n.sym->attr.function
1041 && e->symtree->n.sym->attr.pointer)
1042 return true;
1043
1044 gfc_error ("%qs argument of %qs intrinsic at %L must be a variable",
1045 gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic, &e->where);
1046
1047 return false;
1048}
1049
1050
1051/* Check the common DIM parameter for correctness. */
1052
1053static bool
1054dim_check (gfc_expr *dim, int n, bool optional)
1055{
1056 if (dim == NULL__null)
1057 return true;
1058
1059 if (!type_check (dim, n, BT_INTEGER))
1060 return false;
1061
1062 if (!scalar_check (dim, n))
1063 return false;
1064
1065 if (!optional && !nonoptional_check (dim, n))
1066 return false;
1067
1068 return true;
1069}
1070
1071
1072/* If a coarray DIM parameter is a constant, make sure that it is greater than
1073 zero and less than or equal to the corank of the given array. */
1074
1075static bool
1076dim_corank_check (gfc_expr *dim, gfc_expr *array)
1077{
1078 int corank;
1079
1080 gcc_assert (array->expr_type == EXPR_VARIABLE)((void)(!(array->expr_type == EXPR_VARIABLE) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 1080, __FUNCTION__), 0 : 0))
;
1081
1082 if (dim->expr_type != EXPR_CONSTANT)
1083 return true;
1084
1085 if (array->ts.type == BT_CLASS)
1086 return true;
1087
1088 corank = gfc_get_corank (array);
1089
1090 if (mpz_cmp_ui (dim->value.integer, 1)(__builtin_constant_p (1) && (1) == 0 ? ((dim->value
.integer)->_mp_size < 0 ? -1 : (dim->value.integer)->
_mp_size > 0) : __gmpz_cmp_ui (dim->value.integer,1))
< 0
1091 || mpz_cmp_ui (dim->value.integer, corank)(__builtin_constant_p (corank) && (corank) == 0 ? ((dim
->value.integer)->_mp_size < 0 ? -1 : (dim->value
.integer)->_mp_size > 0) : __gmpz_cmp_ui (dim->value
.integer,corank))
> 0)
1092 {
1093 gfc_error ("%<dim%> argument of %qs intrinsic at %L is not a valid "
1094 "codimension index", gfc_current_intrinsic, &dim->where);
1095
1096 return false;
1097 }
1098
1099 return true;
1100}
1101
1102
1103/* If a DIM parameter is a constant, make sure that it is greater than
1104 zero and less than or equal to the rank of the given array. If
1105 allow_assumed is zero then dim must be less than the rank of the array
1106 for assumed size arrays. */
1107
1108static bool
1109dim_rank_check (gfc_expr *dim, gfc_expr *array, int allow_assumed)
1110{
1111 gfc_array_ref *ar;
1112 int rank;
1113
1114 if (dim == NULL__null)
1115 return true;
1116
1117 if (dim->expr_type != EXPR_CONSTANT)
1118 return true;
1119
1120 if (array->expr_type == EXPR_FUNCTION && array->value.function.isym
1121 && array->value.function.isym->id == GFC_ISYM_SPREAD)
1122 rank = array->rank + 1;
1123 else
1124 rank = array->rank;
1125
1126 /* Assumed-rank array. */
1127 if (rank == -1)
1128 rank = GFC_MAX_DIMENSIONS15;
1129
1130 if (array->expr_type == EXPR_VARIABLE)
1131 {
1132 ar = gfc_find_array_ref (array, true);
1133 if (!ar)
1134 return false;
1135 if (ar->as->type == AS_ASSUMED_SIZE
1136 && !allow_assumed
1137 && ar->type != AR_ELEMENT
1138 && ar->type != AR_SECTION)
1139 rank--;
1140 }
1141
1142 if (mpz_cmp_ui (dim->value.integer, 1)(__builtin_constant_p (1) && (1) == 0 ? ((dim->value
.integer)->_mp_size < 0 ? -1 : (dim->value.integer)->
_mp_size > 0) : __gmpz_cmp_ui (dim->value.integer,1))
< 0
1143 || mpz_cmp_ui (dim->value.integer, rank)(__builtin_constant_p (rank) && (rank) == 0 ? ((dim->
value.integer)->_mp_size < 0 ? -1 : (dim->value.integer
)->_mp_size > 0) : __gmpz_cmp_ui (dim->value.integer
,rank))
> 0)
1144 {
1145 gfc_error ("%<dim%> argument of %qs intrinsic at %L is not a valid "
1146 "dimension index", gfc_current_intrinsic, &dim->where);
1147
1148 return false;
1149 }
1150
1151 return true;
1152}
1153
1154
1155/* Compare the size of a along dimension ai with the size of b along
1156 dimension bi, returning 0 if they are known not to be identical,
1157 and 1 if they are identical, or if this cannot be determined. */
1158
1159static int
1160identical_dimen_shape (gfc_expr *a, int ai, gfc_expr *b, int bi)
1161{
1162 mpz_t a_size, b_size;
1163 int ret;
1164
1165 gcc_assert (a->rank > ai)((void)(!(a->rank > ai) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 1165, __FUNCTION__), 0 : 0))
;
1166 gcc_assert (b->rank > bi)((void)(!(b->rank > bi) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 1166, __FUNCTION__), 0 : 0))
;
1167
1168 ret = 1;
1169
1170 if (gfc_array_dimen_size (a, ai, &a_size))
1171 {
1172 if (gfc_array_dimen_size (b, bi, &b_size))
1173 {
1174 if (mpz_cmp__gmpz_cmp (a_size, b_size) != 0)
1175 ret = 0;
1176
1177 mpz_clear__gmpz_clear (b_size);
1178 }
1179 mpz_clear__gmpz_clear (a_size);
1180 }
1181 return ret;
1182}
1183
1184/* Calculate the length of a character variable, including substrings.
1185 Strip away parentheses if necessary. Return -1 if no length could
1186 be determined. */
1187
1188static long
1189gfc_var_strlen (const gfc_expr *a)
1190{
1191 gfc_ref *ra;
1192
1193 while (a->expr_type == EXPR_OP && a->value.op.op == INTRINSIC_PARENTHESES)
1194 a = a->value.op.op1;
1195
1196 for (ra = a->ref; ra != NULL__null && ra->type != REF_SUBSTRING; ra = ra->next)
1197 ;
1198
1199 if (ra)
1200 {
1201 long start_a, end_a;
1202
1203 if (!ra->u.ss.end)
1204 return -1;
1205
1206 if ((!ra->u.ss.start || ra->u.ss.start->expr_type == EXPR_CONSTANT)
1207 && ra->u.ss.end->expr_type == EXPR_CONSTANT)
1208 {
1209 start_a = ra->u.ss.start ? mpz_get_si__gmpz_get_si (ra->u.ss.start->value.integer)
1210 : 1;
1211 end_a = mpz_get_si__gmpz_get_si (ra->u.ss.end->value.integer);
1212 return (end_a < start_a) ? 0 : end_a - start_a + 1;
1213 }
1214 else if (ra->u.ss.start
1215 && gfc_dep_compare_expr (ra->u.ss.start, ra->u.ss.end) == 0)
1216 return 1;
1217 else
1218 return -1;
1219 }
1220
1221 if (a->ts.u.cl && a->ts.u.cl->length
1222 && a->ts.u.cl->length->expr_type == EXPR_CONSTANT)
1223 return mpz_get_si__gmpz_get_si (a->ts.u.cl->length->value.integer);
1224 else if (a->expr_type == EXPR_CONSTANT
1225 && (a->ts.u.cl == NULL__null || a->ts.u.cl->length == NULL__null))
1226 return a->value.character.length;
1227 else
1228 return -1;
1229
1230}
1231
1232/* Check whether two character expressions have the same length;
1233 returns true if they have or if the length cannot be determined,
1234 otherwise return false and raise a gfc_error. */
1235
1236bool
1237gfc_check_same_strlen (const gfc_expr *a, const gfc_expr *b, const char *name)
1238{
1239 long len_a, len_b;
1240
1241 len_a = gfc_var_strlen(a);
1242 len_b = gfc_var_strlen(b);
1243
1244 if (len_a == -1 || len_b == -1 || len_a == len_b)
1245 return true;
1246 else
1247 {
1248 gfc_error ("Unequal character lengths (%ld/%ld) in %s at %L",
1249 len_a, len_b, name, &a->where);
1250 return false;
1251 }
1252}
1253
1254
1255/***** Check functions *****/
1256
1257/* Check subroutine suitable for intrinsics taking a real argument and
1258 a kind argument for the result. */
1259
1260static bool
1261check_a_kind (gfc_expr *a, gfc_expr *kind, bt type)
1262{
1263 if (!type_check (a, 0, BT_REAL))
1264 return false;
1265 if (!kind_check (kind, 1, type))
1266 return false;
1267
1268 return true;
1269}
1270
1271
1272/* Check subroutine suitable for ceiling, floor and nint. */
1273
1274bool
1275gfc_check_a_ikind (gfc_expr *a, gfc_expr *kind)
1276{
1277 return check_a_kind (a, kind, BT_INTEGER);
1278}
1279
1280
1281/* Check subroutine suitable for aint, anint. */
1282
1283bool
1284gfc_check_a_xkind (gfc_expr *a, gfc_expr *kind)
1285{
1286 return check_a_kind (a, kind, BT_REAL);
1287}
1288
1289
1290bool
1291gfc_check_abs (gfc_expr *a)
1292{
1293 if (!numeric_check (a, 0))
1294 return false;
1295
1296 return true;
1297}
1298
1299
1300bool
1301gfc_check_achar (gfc_expr *a, gfc_expr *kind)
1302{
1303 if (a->ts.type == BT_BOZ)
1304 {
1305 if (gfc_invalid_boz (G_("BOZ literal constant at %L cannot appear in ""BOZ literal constant at %L cannot appear in " "ACHAR intrinsic subprogram"
1306 "ACHAR intrinsic subprogram")"BOZ literal constant at %L cannot appear in " "ACHAR intrinsic subprogram", &a->where))
1307 return false;
1308
1309 if (!gfc_boz2int (a, gfc_default_integer_kind))
1310 return false;
1311 }
1312
1313 if (!type_check (a, 0, BT_INTEGER))
1314 return false;
1315
1316 if (!kind_check (kind, 1, BT_CHARACTER))
1317 return false;
1318
1319 return true;
1320}
1321
1322
1323bool
1324gfc_check_access_func (gfc_expr *name, gfc_expr *mode)
1325{
1326 if (!type_check (name, 0, BT_CHARACTER)
1327 || !scalar_check (name, 0))
1328 return false;
1329 if (!kind_value_check (name, 0, gfc_default_character_kind))
1330 return false;
1331
1332 if (!type_check (mode, 1, BT_CHARACTER)
1333 || !scalar_check (mode, 1))
1334 return false;
1335 if (!kind_value_check (mode, 1, gfc_default_character_kind))
1336 return false;
1337
1338 return true;
1339}
1340
1341
1342bool
1343gfc_check_all_any (gfc_expr *mask, gfc_expr *dim)
1344{
1345 if (!logical_array_check (mask, 0))
1346 return false;
1347
1348 if (!dim_check (dim, 1, false))
1349 return false;
1350
1351 if (!dim_rank_check (dim, mask, 0))
1352 return false;
1353
1354 return true;
1355}
1356
1357
1358/* Limited checking for ALLOCATED intrinsic. Additional checking
1359 is performed in intrinsic.cc(sort_actual), because ALLOCATED
1360 has two mutually exclusive non-optional arguments. */
1361
1362bool
1363gfc_check_allocated (gfc_expr *array)
1364{
1365 /* Tests on allocated components of coarrays need to detour the check to
1366 argument of the _caf_get. */
1367 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_LIB && array->expr_type == EXPR_FUNCTION
1368 && array->value.function.isym
1369 && array->value.function.isym->id == GFC_ISYM_CAF_GET)
1370 {
1371 array = array->value.function.actual->expr;
1372 if (!array->ref)
1373 return false;
1374 }
1375
1376 if (!variable_check (array, 0, false))
1377 return false;
1378 if (!allocatable_check (array, 0))
1379 return false;
1380
1381 return true;
1382}
1383
1384
1385/* Common check function where the first argument must be real or
1386 integer and the second argument must be the same as the first. */
1387
1388bool
1389gfc_check_a_p (gfc_expr *a, gfc_expr *p)
1390{
1391 if (!int_or_real_check (a, 0))
1392 return false;
1393
1394 if (a->ts.type != p->ts.type)
1395 {
1396 gfc_error ("%qs and %qs arguments of %qs intrinsic at %L must "
1397 "have the same type", gfc_current_intrinsic_arg[0]->name,
1398 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
1399 &p->where);
1400 return false;
1401 }
1402
1403 if (a->ts.kind != p->ts.kind)
1404 {
1405 if (!gfc_notify_std (GFC_STD_GNU(1<<5), "Different type kinds at %L",
1406 &p->where))
1407 return false;
1408 }
1409
1410 return true;
1411}
1412
1413
1414bool
1415gfc_check_x_yd (gfc_expr *x, gfc_expr *y)
1416{
1417 if (!double_check (x, 0) || !double_check (y, 1))
1418 return false;
1419
1420 return true;
1421}
1422
1423bool
1424gfc_invalid_null_arg (gfc_expr *x)
1425{
1426 if (x->expr_type == EXPR_NULL)
1427 {
1428 gfc_error ("NULL at %L is not permitted as actual argument "
1429 "to %qs intrinsic function", &x->where,
1430 gfc_current_intrinsic);
1431 return true;
1432 }
1433 return false;
1434}
1435
1436bool
1437gfc_check_associated (gfc_expr *pointer, gfc_expr *target)
1438{
1439 symbol_attribute attr1, attr2;
1440 int i;
1441 bool t;
1442
1443 if (gfc_invalid_null_arg (pointer))
1444 return false;
1445
1446 attr1 = gfc_expr_attr (pointer);
1447
1448 if (!attr1.pointer && !attr1.proc_pointer)
1449 {
1450 gfc_error ("%qs argument of %qs intrinsic at %L must be a POINTER",
1451 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
1452 &pointer->where);
1453 return false;
1454 }
1455
1456 /* F2008, C1242. */
1457 if (attr1.pointer && gfc_is_coindexed (pointer))
1458 {
1459 gfc_error ("%qs argument of %qs intrinsic at %L shall not be "
1460 "coindexed", gfc_current_intrinsic_arg[0]->name,
1461 gfc_current_intrinsic, &pointer->where);
1462 return false;
1463 }
1464
1465 /* Target argument is optional. */
1466 if (target == NULL__null)
1467 return true;
1468
1469 if (gfc_invalid_null_arg (target))
1470 return false;
1471
1472 if (target->expr_type == EXPR_VARIABLE || target->expr_type == EXPR_FUNCTION)
1473 attr2 = gfc_expr_attr (target);
1474 else
1475 {
1476 gfc_error ("%qs argument of %qs intrinsic at %L must be a pointer "
1477 "or target VARIABLE or FUNCTION",
1478 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
1479 &target->where);
1480 return false;
1481 }
1482
1483 if (attr1.pointer && !attr2.pointer && !attr2.target)
1484 {
1485 gfc_error ("%qs argument of %qs intrinsic at %L must be a POINTER "
1486 "or a TARGET", gfc_current_intrinsic_arg[1]->name,
1487 gfc_current_intrinsic, &target->where);
1488 return false;
1489 }
1490
1491 /* F2008, C1242. */
1492 if (attr1.pointer && gfc_is_coindexed (target))
1493 {
1494 gfc_error ("%qs argument of %qs intrinsic at %L shall not be "
1495 "coindexed", gfc_current_intrinsic_arg[1]->name,
1496 gfc_current_intrinsic, &target->where);
1497 return false;
1498 }
1499
1500 t = true;
1501 if (!same_type_check (pointer, 0, target, 1, true))
1502 t = false;
1503 /* F2018 C838 explicitly allows an assumed-rank variable as the first
1504 argument of intrinsic inquiry functions. */
1505 if (pointer->rank != -1 && !rank_check (target, 0, pointer->rank))
1506 t = false;
1507 if (target->rank > 0 && target->ref)
1508 {
1509 for (i = 0; i < target->rank; i++)
1510 if (target->ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
1511 {
1512 gfc_error ("Array section with a vector subscript at %L shall not "
1513 "be the target of a pointer",
1514 &target->where);
1515 t = false;
1516 break;
1517 }
1518 }
1519 return t;
1520}
1521
1522
1523bool
1524gfc_check_atan_2 (gfc_expr *y, gfc_expr *x)
1525{
1526 /* gfc_notify_std would be a waste of time as the return value
1527 is seemingly used only for the generic resolution. The error
1528 will be: Too many arguments. */
1529 if ((gfc_option.allow_std & GFC_STD_F2008(1<<7)) == 0)
1530 return false;
1531
1532 return gfc_check_atan2 (y, x);
1533}
1534
1535
1536bool
1537gfc_check_atan2 (gfc_expr *y, gfc_expr *x)
1538{
1539 if (!type_check (y, 0, BT_REAL))
1540 return false;
1541 if (!same_type_check (y, 0, x, 1))
1542 return false;
1543
1544 return true;
1545}
1546
1547
1548static bool
1549gfc_check_atomic (gfc_expr *atom, int atom_no, gfc_expr *value, int val_no,
1550 gfc_expr *stat, int stat_no)
1551{
1552 if (!scalar_check (atom, atom_no) || !scalar_check (value, val_no))
1553 return false;
1554
1555 if (!(atom->ts.type == BT_INTEGER && atom->ts.kind == gfc_atomic_int_kind)
1556 && !(atom->ts.type == BT_LOGICAL
1557 && atom->ts.kind == gfc_atomic_logical_kind))
1558 {
1559 gfc_error ("ATOM argument at %L to intrinsic function %s shall be an "
1560 "integer of ATOMIC_INT_KIND or a logical of "
1561 "ATOMIC_LOGICAL_KIND", &atom->where, gfc_current_intrinsic);
1562 return false;
1563 }
1564
1565 if (!gfc_is_coarray (atom) && !gfc_is_coindexed (atom))
1566 {
1567 gfc_error ("ATOM argument at %L of the %s intrinsic function shall be a "
1568 "coarray or coindexed", &atom->where, gfc_current_intrinsic);
1569 return false;
1570 }
1571
1572 if (atom->ts.type != value->ts.type)
1573 {
1574 gfc_error ("%qs argument of %qs intrinsic at %L shall have the same "
1575 "type as %qs at %L", gfc_current_intrinsic_arg[val_no]->name,
1576 gfc_current_intrinsic, &value->where,
1577 gfc_current_intrinsic_arg[atom_no]->name, &atom->where);
1578 return false;
1579 }
1580
1581 if (stat != NULL__null)
1582 {
1583 if (!type_check (stat, stat_no, BT_INTEGER))
1584 return false;
1585 if (!scalar_check (stat, stat_no))
1586 return false;
1587 if (!variable_check (stat, stat_no, false))
1588 return false;
1589 if (!kind_value_check (stat, stat_no, gfc_default_integer_kind))
1590 return false;
1591
1592 if (!gfc_notify_std (GFC_STD_F2018(1<<9), "STAT= argument to %s at %L",
1593 gfc_current_intrinsic, &stat->where))
1594 return false;
1595 }
1596
1597 return true;
1598}
1599
1600
1601bool
1602gfc_check_atomic_def (gfc_expr *atom, gfc_expr *value, gfc_expr *stat)
1603{
1604 if (atom->expr_type == EXPR_FUNCTION
1605 && atom->value.function.isym
1606 && atom->value.function.isym->id == GFC_ISYM_CAF_GET)
1607 atom = atom->value.function.actual->expr;
1608
1609 if (!gfc_check_vardef_context (atom, false, false, false, NULL__null))
1610 {
1611 gfc_error ("ATOM argument of the %s intrinsic function at %L shall be "
1612 "definable", gfc_current_intrinsic, &atom->where);
1613 return false;
1614 }
1615
1616 return gfc_check_atomic (atom, 0, value, 1, stat, 2);
1617}
1618
1619
1620bool
1621gfc_check_atomic_op (gfc_expr *atom, gfc_expr *value, gfc_expr *stat)
1622{
1623 if (atom->ts.type != BT_INTEGER || atom->ts.kind != gfc_atomic_int_kind)
1624 {
1625 gfc_error ("ATOM argument at %L to intrinsic function %s shall be an "
1626 "integer of ATOMIC_INT_KIND", &atom->where,
1627 gfc_current_intrinsic);
1628 return false;
1629 }
1630
1631 return gfc_check_atomic_def (atom, value, stat);
1632}
1633
1634
1635bool
1636gfc_check_atomic_ref (gfc_expr *value, gfc_expr *atom, gfc_expr *stat)
1637{
1638 if (atom->expr_type == EXPR_FUNCTION
1639 && atom->value.function.isym
1640 && atom->value.function.isym->id == GFC_ISYM_CAF_GET)
1641 atom = atom->value.function.actual->expr;
1642
1643 if (!gfc_check_vardef_context (value, false, false, false, NULL__null))
1644 {
1645 gfc_error ("VALUE argument of the %s intrinsic function at %L shall be "
1646 "definable", gfc_current_intrinsic, &value->where);
1647 return false;
1648 }
1649
1650 return gfc_check_atomic (atom, 1, value, 0, stat, 2);
1651}
1652
1653
1654bool
1655gfc_check_image_status (gfc_expr *image, gfc_expr *team)
1656{
1657 /* IMAGE has to be a positive, scalar integer. */
1658 if (!type_check (image, 0, BT_INTEGER) || !scalar_check (image, 0)
1659 || !positive_check (0, image))
1660 return false;
1661
1662 if (team)
1663 {
1664 gfc_error ("%qs argument of %qs intrinsic at %L not yet supported",
1665 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
1666 &team->where);
1667 return false;
1668 }
1669 return true;
1670}
1671
1672
1673bool
1674gfc_check_failed_or_stopped_images (gfc_expr *team, gfc_expr *kind)
1675{
1676 if (team)
1677 {
1678 gfc_error ("%qs argument of %qs intrinsic at %L not yet supported",
1679 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
1680 &team->where);
1681 return false;
1682 }
1683
1684 if (kind)
1685 {
1686 int k;
1687
1688 if (!type_check (kind, 1, BT_INTEGER) || !scalar_check (kind, 1)
1689 || !positive_check (1, kind))
1690 return false;
1691
1692 /* Get the kind, reporting error on non-constant or overflow. */
1693 gfc_current_locus = kind->where;
1694 if (gfc_extract_int (kind, &k, 1))
1695 return false;
1696 if (gfc_validate_kind (BT_INTEGER, k, true) == -1)
1697 {
1698 gfc_error ("%qs argument of %qs intrinsic at %L shall specify a "
1699 "valid integer kind", gfc_current_intrinsic_arg[1]->name,
1700 gfc_current_intrinsic, &kind->where);
1701 return false;
1702 }
1703 }
1704 return true;
1705}
1706
1707
1708bool
1709gfc_check_get_team (gfc_expr *level)
1710{
1711 if (level)
1712 {
1713 gfc_error ("%qs argument of %qs intrinsic at %L not yet supported",
1714 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
1715 &level->where);
1716 return false;
1717 }
1718 return true;
1719}
1720
1721
1722bool
1723gfc_check_atomic_cas (gfc_expr *atom, gfc_expr *old, gfc_expr *compare,
1724 gfc_expr *new_val, gfc_expr *stat)
1725{
1726 if (atom->expr_type == EXPR_FUNCTION
1727 && atom->value.function.isym
1728 && atom->value.function.isym->id == GFC_ISYM_CAF_GET)
1729 atom = atom->value.function.actual->expr;
1730
1731 if (!gfc_check_atomic (atom, 0, new_val, 3, stat, 4))
1732 return false;
1733
1734 if (!scalar_check (old, 1) || !scalar_check (compare, 2))
1735 return false;
1736
1737 if (!same_type_check (atom, 0, old, 1))
1738 return false;
1739
1740 if (!same_type_check (atom, 0, compare, 2))
1741 return false;
1742
1743 if (!gfc_check_vardef_context (atom, false, false, false, NULL__null))
1744 {
1745 gfc_error ("ATOM argument of the %s intrinsic function at %L shall be "
1746 "definable", gfc_current_intrinsic, &atom->where);
1747 return false;
1748 }
1749
1750 if (!gfc_check_vardef_context (old, false, false, false, NULL__null))
1751 {
1752 gfc_error ("OLD argument of the %s intrinsic function at %L shall be "
1753 "definable", gfc_current_intrinsic, &old->where);
1754 return false;
1755 }
1756
1757 return true;
1758}
1759
1760bool
1761gfc_check_event_query (gfc_expr *event, gfc_expr *count, gfc_expr *stat)
1762{
1763 if (event->ts.type != BT_DERIVED
1764 || event->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
1765 || event->ts.u.derived->intmod_sym_id != ISOFORTRAN_EVENT_TYPE)
1766 {
1767 gfc_error ("EVENT argument at %L to the intrinsic EVENT_QUERY "
1768 "shall be of type EVENT_TYPE", &event->where);
1769 return false;
1770 }
1771
1772 if (!scalar_check (event, 0))
1773 return false;
1774
1775 if (!gfc_check_vardef_context (count, false, false, false, NULL__null))
1776 {
1777 gfc_error ("COUNT argument of the EVENT_QUERY intrinsic function at %L "
1778 "shall be definable", &count->where);
1779 return false;
1780 }
1781
1782 if (!type_check (count, 1, BT_INTEGER))
1783 return false;
1784
1785 int i = gfc_validate_kind (BT_INTEGER, count->ts.kind, false);
1786 int j = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
1787
1788 if (gfc_integer_kinds[i].range < gfc_integer_kinds[j].range)
1789 {
1790 gfc_error ("COUNT argument of the EVENT_QUERY intrinsic function at %L "
1791 "shall have at least the range of the default integer",
1792 &count->where);
1793 return false;
1794 }
1795
1796 if (stat != NULL__null)
1797 {
1798 if (!type_check (stat, 2, BT_INTEGER))
1799 return false;
1800 if (!scalar_check (stat, 2))
1801 return false;
1802 if (!variable_check (stat, 2, false))
1803 return false;
1804
1805 if (!gfc_notify_std (GFC_STD_F2018(1<<9), "STAT= argument to %s at %L",
1806 gfc_current_intrinsic, &stat->where))
1807 return false;
1808 }
1809
1810 return true;
1811}
1812
1813
1814bool
1815gfc_check_atomic_fetch_op (gfc_expr *atom, gfc_expr *value, gfc_expr *old,
1816 gfc_expr *stat)
1817{
1818 if (atom->expr_type == EXPR_FUNCTION
1819 && atom->value.function.isym
1820 && atom->value.function.isym->id == GFC_ISYM_CAF_GET)
1821 atom = atom->value.function.actual->expr;
1822
1823 if (atom->ts.type != BT_INTEGER || atom->ts.kind != gfc_atomic_int_kind)
1824 {
1825 gfc_error ("ATOM argument at %L to intrinsic function %s shall be an "
1826 "integer of ATOMIC_INT_KIND", &atom->where,
1827 gfc_current_intrinsic);
1828 return false;
1829 }
1830
1831 if (!gfc_check_atomic (atom, 0, value, 1, stat, 3))
1832 return false;
1833
1834 if (!scalar_check (old, 2))
1835 return false;
1836
1837 if (!same_type_check (atom, 0, old, 2))
1838 return false;
1839
1840 if (!gfc_check_vardef_context (atom, false, false, false, NULL__null))
1841 {
1842 gfc_error ("ATOM argument of the %s intrinsic function at %L shall be "
1843 "definable", gfc_current_intrinsic, &atom->where);
1844 return false;
1845 }
1846
1847 if (!gfc_check_vardef_context (old, false, false, false, NULL__null))
1848 {
1849 gfc_error ("OLD argument of the %s intrinsic function at %L shall be "
1850 "definable", gfc_current_intrinsic, &old->where);
1851 return false;
1852 }
1853
1854 return true;
1855}
1856
1857
1858/* BESJN and BESYN functions. */
1859
1860bool
1861gfc_check_besn (gfc_expr *n, gfc_expr *x)
1862{
1863 if (!type_check (n, 0, BT_INTEGER))
1864 return false;
1865 if (n->expr_type == EXPR_CONSTANT)
1866 {
1867 int i;
1868 gfc_extract_int (n, &i);
1869 if (i < 0 && !gfc_notify_std (GFC_STD_GNU(1<<5), "Negative argument "
1870 "N at %L", &n->where))
1871 return false;
1872 }
1873
1874 if (!type_check (x, 1, BT_REAL))
1875 return false;
1876
1877 return true;
1878}
1879
1880
1881/* Transformational version of the Bessel JN and YN functions. */
1882
1883bool
1884gfc_check_bessel_n2 (gfc_expr *n1, gfc_expr *n2, gfc_expr *x)
1885{
1886 if (!type_check (n1, 0, BT_INTEGER))
1887 return false;
1888 if (!scalar_check (n1, 0))
1889 return false;
1890 if (!nonnegative_check ("N1", n1))
1891 return false;
1892
1893 if (!type_check (n2, 1, BT_INTEGER))
1894 return false;
1895 if (!scalar_check (n2, 1))
1896 return false;
1897 if (!nonnegative_check ("N2", n2))
1898 return false;
1899
1900 if (!type_check (x, 2, BT_REAL))
1901 return false;
1902 if (!scalar_check (x, 2))
1903 return false;
1904
1905 return true;
1906}
1907
1908
1909bool
1910gfc_check_bge_bgt_ble_blt (gfc_expr *i, gfc_expr *j)
1911{
1912 extern int gfc_max_integer_kind;
1913
1914 /* If i and j are both BOZ, convert to widest INTEGER. */
1915 if (i->ts.type == BT_BOZ && j->ts.type == BT_BOZ)
1916 {
1917 if (!gfc_boz2int (i, gfc_max_integer_kind))
1918 return false;
1919 if (!gfc_boz2int (j, gfc_max_integer_kind))
1920 return false;
1921 }
1922
1923 /* If i is BOZ and j is integer, convert i to type of j. */
1924 if (i->ts.type == BT_BOZ && j->ts.type == BT_INTEGER
1925 && !gfc_boz2int (i, j->ts.kind))
1926 return false;
1927
1928 /* If j is BOZ and i is integer, convert j to type of i. */
1929 if (j->ts.type == BT_BOZ && i->ts.type == BT_INTEGER
1930 && !gfc_boz2int (j, i->ts.kind))
1931 return false;
1932
1933 if (!type_check (i, 0, BT_INTEGER))
1934 return false;
1935
1936 if (!type_check (j, 1, BT_INTEGER))
1937 return false;
1938
1939 return true;
1940}
1941
1942
1943bool
1944gfc_check_bitfcn (gfc_expr *i, gfc_expr *pos)
1945{
1946 if (!type_check (i, 0, BT_INTEGER))
1947 return false;
1948
1949 if (!type_check (pos, 1, BT_INTEGER))
1950 return false;
1951
1952 if (!nonnegative_check ("pos", pos))
1953 return false;
1954
1955 if (!less_than_bitsize1 ("i", i, "pos", pos, false))
1956 return false;
1957
1958 return true;
1959}
1960
1961
1962bool
1963gfc_check_char (gfc_expr *i, gfc_expr *kind)
1964{
1965 if (i->ts.type == BT_BOZ)
1966 {
1967 if (gfc_invalid_boz (G_("BOZ literal constant at %L cannot appear in ""BOZ literal constant at %L cannot appear in " "CHAR intrinsic subprogram"
1968 "CHAR intrinsic subprogram")"BOZ literal constant at %L cannot appear in " "CHAR intrinsic subprogram", &i->where))
1969 return false;
1970
1971 if (!gfc_boz2int (i, gfc_default_integer_kind))
1972 return false;
1973 }
1974
1975 if (!type_check (i, 0, BT_INTEGER))
1976 return false;
1977
1978 if (!kind_check (kind, 1, BT_CHARACTER))
1979 return false;
1980
1981 return true;
1982}
1983
1984
1985bool
1986gfc_check_chdir (gfc_expr *dir)
1987{
1988 if (!type_check (dir, 0, BT_CHARACTER))
1989 return false;
1990 if (!kind_value_check (dir, 0, gfc_default_character_kind))
1991 return false;
1992
1993 return true;
1994}
1995
1996
1997bool
1998gfc_check_chdir_sub (gfc_expr *dir, gfc_expr *status)
1999{
2000 if (!type_check (dir, 0, BT_CHARACTER))
2001 return false;
2002 if (!kind_value_check (dir, 0, gfc_default_character_kind))
2003 return false;
2004
2005 if (status == NULL__null)
2006 return true;
2007
2008 if (!type_check (status, 1, BT_INTEGER))
2009 return false;
2010 if (!scalar_check (status, 1))
2011 return false;
2012
2013 return true;
2014}
2015
2016
2017bool
2018gfc_check_chmod (gfc_expr *name, gfc_expr *mode)
2019{
2020 if (!type_check (name, 0, BT_CHARACTER))
2021 return false;
2022 if (!kind_value_check (name, 0, gfc_default_character_kind))
2023 return false;
2024
2025 if (!type_check (mode, 1, BT_CHARACTER))
2026 return false;
2027 if (!kind_value_check (mode, 1, gfc_default_character_kind))
2028 return false;
2029
2030 return true;
2031}
2032
2033
2034bool
2035gfc_check_chmod_sub (gfc_expr *name, gfc_expr *mode, gfc_expr *status)
2036{
2037 if (!type_check (name, 0, BT_CHARACTER))
2038 return false;
2039 if (!kind_value_check (name, 0, gfc_default_character_kind))
2040 return false;
2041
2042 if (!type_check (mode, 1, BT_CHARACTER))
2043 return false;
2044 if (!kind_value_check (mode, 1, gfc_default_character_kind))
2045 return false;
2046
2047 if (status == NULL__null)
2048 return true;
2049
2050 if (!type_check (status, 2, BT_INTEGER))
2051 return false;
2052
2053 if (!scalar_check (status, 2))
2054 return false;
2055
2056 return true;
2057}
2058
2059
2060bool
2061gfc_check_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *kind)
2062{
2063 int k;
2064
2065 /* Check kind first, because it may be needed in conversion of a BOZ. */
2066 if (kind)
2067 {
2068 if (!kind_check (kind, 2, BT_COMPLEX))
2069 return false;
2070 gfc_extract_int (kind, &k);
2071 }
2072 else
2073 k = gfc_default_complex_kind;
2074
2075 if (x->ts.type == BT_BOZ && !gfc_boz2real (x, k))
2076 return false;
2077
2078 if (!numeric_check (x, 0))
2079 return false;
2080
2081 if (y != NULL__null)
2082 {
2083 if (y->ts.type == BT_BOZ && !gfc_boz2real (y, k))
2084 return false;
2085
2086 if (!numeric_check (y, 1))
2087 return false;
2088
2089 if (x->ts.type == BT_COMPLEX)
2090 {
2091 gfc_error ("%qs argument of %qs intrinsic at %L must not be "
2092 "present if %<x%> is COMPLEX",
2093 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
2094 &y->where);
2095 return false;
2096 }
2097
2098 if (y->ts.type == BT_COMPLEX)
2099 {
2100 gfc_error ("%qs argument of %qs intrinsic at %L must have a type "
2101 "of either REAL or INTEGER",
2102 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
2103 &y->where);
2104 return false;
2105 }
2106 }
2107
2108 if (!kind && warn_conversionglobal_options.x_warn_conversion
2109 && x->ts.type == BT_REAL && x->ts.kind > gfc_default_real_kind)
2110 gfc_warning_now (OPT_Wconversion, "Conversion from %s to default-kind "
2111 "COMPLEX(%d) at %L might lose precision, consider using "
2112 "the KIND argument", gfc_typename (&x->ts),
2113 gfc_default_real_kind, &x->where);
2114 else if (y && !kind && warn_conversionglobal_options.x_warn_conversion
2115 && y->ts.type == BT_REAL && y->ts.kind > gfc_default_real_kind)
2116 gfc_warning_now (OPT_Wconversion, "Conversion from %s to default-kind "
2117 "COMPLEX(%d) at %L might lose precision, consider using "
2118 "the KIND argument", gfc_typename (&y->ts),
2119 gfc_default_real_kind, &y->where);
2120 return true;
2121}
2122
2123
2124static bool
2125check_co_collective (gfc_expr *a, gfc_expr *image_idx, gfc_expr *stat,
2126 gfc_expr *errmsg, bool co_reduce)
2127{
2128 if (!variable_check (a, 0, false))
2129 return false;
2130
2131 if (!gfc_check_vardef_context (a, false, false, false, "argument 'A' with "
2132 "INTENT(INOUT)"))
2133 return false;
2134
2135 /* Fortran 2008, 12.5.2.4, paragraph 18. */
2136 if (gfc_has_vector_subscript (a))
2137 {
2138 gfc_error ("Argument %<A%> with INTENT(INOUT) at %L of the intrinsic "
2139 "subroutine %s shall not have a vector subscript",
2140 &a->where, gfc_current_intrinsic);
2141 return false;
2142 }
2143
2144 if (gfc_is_coindexed (a))
2145 {
2146 gfc_error ("The A argument at %L to the intrinsic %s shall not be "
2147 "coindexed", &a->where, gfc_current_intrinsic);
2148 return false;
2149 }
2150
2151 if (image_idx != NULL__null)
2152 {
2153 if (!type_check (image_idx, co_reduce ? 2 : 1, BT_INTEGER))
2154 return false;
2155 if (!scalar_check (image_idx, co_reduce ? 2 : 1))
2156 return false;
2157 }
2158
2159 if (stat != NULL__null)
2160 {
2161 if (!type_check (stat, co_reduce ? 3 : 2, BT_INTEGER))
2162 return false;
2163 if (!scalar_check (stat, co_reduce ? 3 : 2))
2164 return false;
2165 if (!variable_check (stat, co_reduce ? 3 : 2, false))
2166 return false;
2167 if (stat->ts.kind != 4)
2168 {
2169 gfc_error ("The stat= argument at %L must be a kind=4 integer "
2170 "variable", &stat->where);
2171 return false;
2172 }
2173 }
2174
2175 if (errmsg != NULL__null)
2176 {
2177 if (!type_check (errmsg, co_reduce ? 4 : 3, BT_CHARACTER))
2178 return false;
2179 if (!scalar_check (errmsg, co_reduce ? 4 : 3))
2180 return false;
2181 if (!variable_check (errmsg, co_reduce ? 4 : 3, false))
2182 return false;
2183 if (errmsg->ts.kind != 1)
2184 {
2185 gfc_error ("The errmsg= argument at %L must be a default-kind "
2186 "character variable", &errmsg->where);
2187 return false;
2188 }
2189 }
2190
2191 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
2192 {
2193 gfc_fatal_error ("Coarrays disabled at %L, use %<-fcoarray=%> to enable",
2194 &a->where);
2195 return false;
2196 }
2197
2198 return true;
2199}
2200
2201
2202bool
2203gfc_check_co_broadcast (gfc_expr *a, gfc_expr *source_image, gfc_expr *stat,
2204 gfc_expr *errmsg)
2205{
2206 if (a->ts.type == BT_CLASS || gfc_expr_attr (a).alloc_comp)
2207 {
2208 gfc_error ("Support for the A argument at %L which is polymorphic A "
2209 "argument or has allocatable components is not yet "
2210 "implemented", &a->where);
2211 return false;
2212 }
2213 return check_co_collective (a, source_image, stat, errmsg, false);
2214}
2215
2216
2217bool
2218gfc_check_co_reduce (gfc_expr *a, gfc_expr *op, gfc_expr *result_image,
2219 gfc_expr *stat, gfc_expr *errmsg)
2220{
2221 symbol_attribute attr;
2222 gfc_formal_arglist *formal;
2223 gfc_symbol *sym;
2224
2225 if (a->ts.type == BT_CLASS)
2226 {
2227 gfc_error ("The A argument at %L of CO_REDUCE shall not be polymorphic",
2228 &a->where);
2229 return false;
2230 }
2231
2232 if (gfc_expr_attr (a).alloc_comp)
2233 {
2234 gfc_error ("Support for the A argument at %L with allocatable components"
2235 " is not yet implemented", &a->where);
2236 return false;
2237 }
2238
2239 if (!check_co_collective (a, result_image, stat, errmsg, true))
2240 return false;
2241
2242 if (!gfc_resolve_expr (op))
2243 return false;
2244
2245 attr = gfc_expr_attr (op);
2246 if (!attr.pure || !attr.function)
2247 {
2248 gfc_error ("OPERATION argument at %L must be a PURE function",
2249 &op->where);
2250 return false;
2251 }
2252
2253 if (attr.intrinsic)
2254 {
2255 /* None of the intrinsics fulfills the criteria of taking two arguments,
2256 returning the same type and kind as the arguments and being permitted
2257 as actual argument. */
2258 gfc_error ("Intrinsic function %s at %L is not permitted for CO_REDUCE",
2259 op->symtree->n.sym->name, &op->where);
2260 return false;
2261 }
2262
2263 if (gfc_is_proc_ptr_comp (op))
2264 {
2265 gfc_component *comp = gfc_get_proc_ptr_comp (op);
2266 sym = comp->ts.interface;
2267 }
2268 else
2269 sym = op->symtree->n.sym;
2270
2271 formal = sym->formal;
2272
2273 if (!formal || !formal->next || formal->next->next)
2274 {
2275 gfc_error ("The function passed as OPERATION at %L shall have two "
2276 "arguments", &op->where);
2277 return false;
2278 }
2279
2280 if (sym->result->ts.type == BT_UNKNOWN)
2281 gfc_set_default_type (sym->result, 0, NULL__null);
2282
2283 if (!gfc_compare_types (&a->ts, &sym->result->ts))
2284 {
2285 gfc_error ("The A argument at %L has type %s but the function passed as "
2286 "OPERATION at %L returns %s",
2287 &a->where, gfc_typename (a), &op->where,
2288 gfc_typename (&sym->result->ts));
2289 return false;
2290 }
2291 if (!gfc_compare_types (&a->ts, &formal->sym->ts)
2292 || !gfc_compare_types (&a->ts, &formal->next->sym->ts))
2293 {
2294 gfc_error ("The function passed as OPERATION at %L has arguments of type "
2295 "%s and %s but shall have type %s", &op->where,
2296 gfc_typename (&formal->sym->ts),
2297 gfc_typename (&formal->next->sym->ts), gfc_typename (a));
2298 return false;
2299 }
2300 if (op->rank || attr.allocatable || attr.pointer || formal->sym->as
2301 || formal->next->sym->as || formal->sym->attr.allocatable
2302 || formal->next->sym->attr.allocatable || formal->sym->attr.pointer
2303 || formal->next->sym->attr.pointer)
2304 {
2305 gfc_error ("The function passed as OPERATION at %L shall have scalar "
2306 "nonallocatable nonpointer arguments and return a "
2307 "nonallocatable nonpointer scalar", &op->where);
2308 return false;
2309 }
2310
2311 if (formal->sym->attr.value != formal->next->sym->attr.value)
2312 {
2313 gfc_error ("The function passed as OPERATION at %L shall have the VALUE "
2314 "attribute either for none or both arguments", &op->where);
2315 return false;
2316 }
2317
2318 if (formal->sym->attr.target != formal->next->sym->attr.target)
2319 {
2320 gfc_error ("The function passed as OPERATION at %L shall have the TARGET "
2321 "attribute either for none or both arguments", &op->where);
2322 return false;
2323 }
2324
2325 if (formal->sym->attr.asynchronous != formal->next->sym->attr.asynchronous)
2326 {
2327 gfc_error ("The function passed as OPERATION at %L shall have the "
2328 "ASYNCHRONOUS attribute either for none or both arguments",
2329 &op->where);
2330 return false;
2331 }
2332
2333 if (formal->sym->attr.optional || formal->next->sym->attr.optional)
2334 {
2335 gfc_error ("The function passed as OPERATION at %L shall not have the "
2336 "OPTIONAL attribute for either of the arguments", &op->where);
2337 return false;
2338 }
2339
2340 if (a->ts.type == BT_CHARACTER)
2341 {
2342 gfc_charlen *cl;
2343 unsigned long actual_size, formal_size1, formal_size2, result_size;
2344
2345 cl = a->ts.u.cl;
2346 actual_size = cl && cl->length && cl->length->expr_type == EXPR_CONSTANT
2347 ? mpz_get_ui__gmpz_get_ui (cl->length->value.integer) : 0;
2348
2349 cl = formal->sym->ts.u.cl;
2350 formal_size1 = cl && cl->length && cl->length->expr_type == EXPR_CONSTANT
2351 ? mpz_get_ui__gmpz_get_ui (cl->length->value.integer) : 0;
2352
2353 cl = formal->next->sym->ts.u.cl;
2354 formal_size2 = cl && cl->length && cl->length->expr_type == EXPR_CONSTANT
2355 ? mpz_get_ui__gmpz_get_ui (cl->length->value.integer) : 0;
2356
2357 cl = sym->ts.u.cl;
2358 result_size = cl && cl->length && cl->length->expr_type == EXPR_CONSTANT
2359 ? mpz_get_ui__gmpz_get_ui (cl->length->value.integer) : 0;
2360
2361 if (actual_size
2362 && ((formal_size1 && actual_size != formal_size1)
2363 || (formal_size2 && actual_size != formal_size2)))
2364 {
2365 gfc_error ("The character length of the A argument at %L and of the "
2366 "arguments of the OPERATION at %L shall be the same",
2367 &a->where, &op->where);
2368 return false;
2369 }
2370 if (actual_size && result_size && actual_size != result_size)
2371 {
2372 gfc_error ("The character length of the A argument at %L and of the "
2373 "function result of the OPERATION at %L shall be the same",
2374 &a->where, &op->where);
2375 return false;
2376 }
2377 }
2378
2379 return true;
2380}
2381
2382
2383bool
2384gfc_check_co_minmax (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat,
2385 gfc_expr *errmsg)
2386{
2387 if (a->ts.type != BT_INTEGER && a->ts.type != BT_REAL
2388 && a->ts.type != BT_CHARACTER)
2389 {
2390 gfc_error ("%qs argument of %qs intrinsic at %L shall be of type "
2391 "integer, real or character",
2392 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
2393 &a->where);
2394 return false;
2395 }
2396 return check_co_collective (a, result_image, stat, errmsg, false);
2397}
2398
2399
2400bool
2401gfc_check_co_sum (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat,
2402 gfc_expr *errmsg)
2403{
2404 if (!numeric_check (a, 0))
2405 return false;
2406 return check_co_collective (a, result_image, stat, errmsg, false);
2407}
2408
2409
2410bool
2411gfc_check_complex (gfc_expr *x, gfc_expr *y)
2412{
2413 if (!boz_args_check (x, y))
2414 return false;
2415
2416 if (x->ts.type == BT_BOZ)
2417 {
2418 if (gfc_invalid_boz (G_("BOZ constant at %L cannot appear in the COMPLEX""BOZ constant at %L cannot appear in the COMPLEX" " intrinsic subprogram"
2419 " intrinsic subprogram")"BOZ constant at %L cannot appear in the COMPLEX" " intrinsic subprogram", &x->where))
2420 {
2421 reset_boz (x);
2422 return false;
2423 }
2424 if (y->ts.type == BT_INTEGER && !gfc_boz2int (x, y->ts.kind))
2425 return false;
2426 if (y->ts.type == BT_REAL && !gfc_boz2real (x, y->ts.kind))
2427 return false;
2428 }
2429
2430 if (y->ts.type == BT_BOZ)
2431 {
2432 if (gfc_invalid_boz (G_("BOZ constant at %L cannot appear in the COMPLEX""BOZ constant at %L cannot appear in the COMPLEX" " intrinsic subprogram"
2433 " intrinsic subprogram")"BOZ constant at %L cannot appear in the COMPLEX" " intrinsic subprogram", &y->where))
2434 {
2435 reset_boz (y);
2436 return false;
2437 }
2438 if (x->ts.type == BT_INTEGER && !gfc_boz2int (y, x->ts.kind))
2439 return false;
2440 if (x->ts.type == BT_REAL && !gfc_boz2real (y, x->ts.kind))
2441 return false;
2442 }
2443
2444 if (!int_or_real_check (x, 0))
2445 return false;
2446 if (!scalar_check (x, 0))
2447 return false;
2448
2449 if (!int_or_real_check (y, 1))
2450 return false;
2451 if (!scalar_check (y, 1))
2452 return false;
2453
2454 return true;
2455}
2456
2457
2458bool
2459gfc_check_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
2460{
2461 if (!logical_array_check (mask, 0))
2462 return false;
2463 if (!dim_check (dim, 1, false))
2464 return false;
2465 if (!dim_rank_check (dim, mask, 0))
2466 return false;
2467 if (!kind_check (kind, 2, BT_INTEGER))
2468 return false;
2469 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
2470 "with KIND argument at %L",
2471 gfc_current_intrinsic, &kind->where))
2472 return false;
2473
2474 return true;
2475}
2476
2477
2478bool
2479gfc_check_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
2480{
2481 if (!array_check (array, 0))
2482 return false;
2483
2484 if (!type_check (shift, 1, BT_INTEGER))
2485 return false;
2486
2487 if (!dim_check (dim, 2, true))
2488 return false;
2489
2490 if (!dim_rank_check (dim, array, false))
2491 return false;
2492
2493 if (array->rank == 1 || shift->rank == 0)
2494 {
2495 if (!scalar_check (shift, 1))
2496 return false;
2497 }
2498 else if (shift->rank == array->rank - 1)
2499 {
2500 int d;
2501 if (!dim)
2502 d = 1;
2503 else if (dim->expr_type == EXPR_CONSTANT)
2504 gfc_extract_int (dim, &d);
2505 else
2506 d = -1;
2507
2508 if (d > 0)
2509 {
2510 int i, j;
2511 for (i = 0, j = 0; i < array->rank; i++)
2512 if (i != d - 1)
2513 {
2514 if (!identical_dimen_shape (array, i, shift, j))
2515 {
2516 gfc_error ("%qs argument of %qs intrinsic at %L has "
2517 "invalid shape in dimension %d (%ld/%ld)",
2518 gfc_current_intrinsic_arg[1]->name,
2519 gfc_current_intrinsic, &shift->where, i + 1,
2520 mpz_get_si__gmpz_get_si (array->shape[i]),
2521 mpz_get_si__gmpz_get_si (shift->shape[j]));
2522 return false;
2523 }
2524
2525 j += 1;
2526 }
2527 }
2528 }
2529 else
2530 {
2531 gfc_error ("%qs argument of intrinsic %qs at %L of must have rank "
2532 "%d or be a scalar", gfc_current_intrinsic_arg[1]->name,
2533 gfc_current_intrinsic, &shift->where, array->rank - 1);
2534 return false;
2535 }
2536
2537 return true;
2538}
2539
2540
2541bool
2542gfc_check_ctime (gfc_expr *time)
2543{
2544 if (!scalar_check (time, 0))
2545 return false;
2546
2547 if (!type_check (time, 0, BT_INTEGER))
2548 return false;
2549
2550 return true;
2551}
2552
2553
2554bool gfc_check_datan2 (gfc_expr *y, gfc_expr *x)
2555{
2556 if (!double_check (y, 0) || !double_check (x, 1))
2557 return false;
2558
2559 return true;
2560}
2561
2562bool
2563gfc_check_dcmplx (gfc_expr *x, gfc_expr *y)
2564{
2565 if (x->ts.type == BT_BOZ && !gfc_boz2real (x, gfc_default_double_kind))
2566 return false;
2567
2568 if (!numeric_check (x, 0))
2569 return false;
2570
2571 if (y != NULL__null)
2572 {
2573 if (y->ts.type == BT_BOZ && !gfc_boz2real (y, gfc_default_double_kind))
2574 return false;
2575
2576 if (!numeric_check (y, 1))
2577 return false;
2578
2579 if (x->ts.type == BT_COMPLEX)
2580 {
2581 gfc_error ("%qs argument of %qs intrinsic at %L must not be "
2582 "present if %<x%> is COMPLEX",
2583 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
2584 &y->where);
2585 return false;
2586 }
2587
2588 if (y->ts.type == BT_COMPLEX)
2589 {
2590 gfc_error ("%qs argument of %qs intrinsic at %L must have a type "
2591 "of either REAL or INTEGER",
2592 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
2593 &y->where);
2594 return false;
2595 }
2596 }
2597
2598 return true;
2599}
2600
2601
2602bool
2603gfc_check_dble (gfc_expr *x)
2604{
2605 if (x->ts.type == BT_BOZ && !gfc_boz2real (x, gfc_default_double_kind))
2606 return false;
2607
2608 if (!numeric_check (x, 0))
2609 return false;
2610
2611 return true;
2612}
2613
2614
2615bool
2616gfc_check_digits (gfc_expr *x)
2617{
2618 if (!int_or_real_check (x, 0))
2619 return false;
2620
2621 return true;
2622}
2623
2624
2625bool
2626gfc_check_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
2627{
2628 switch (vector_a->ts.type)
2629 {
2630 case BT_LOGICAL:
2631 if (!type_check (vector_b, 1, BT_LOGICAL))
2632 return false;
2633 break;
2634
2635 case BT_INTEGER:
2636 case BT_REAL:
2637 case BT_COMPLEX:
2638 if (!numeric_check (vector_b, 1))
2639 return false;
2640 break;
2641
2642 default:
2643 gfc_error ("%qs argument of %qs intrinsic at %L must be numeric "
2644 "or LOGICAL", gfc_current_intrinsic_arg[0]->name,
2645 gfc_current_intrinsic, &vector_a->where);
2646 return false;
2647 }
2648
2649 if (!rank_check (vector_a, 0, 1))
2650 return false;
2651
2652 if (!rank_check (vector_b, 1, 1))
2653 return false;
2654
2655 if (! identical_dimen_shape (vector_a, 0, vector_b, 0))
2656 {
2657 gfc_error ("Different shape for arguments %qs and %qs at %L for "
2658 "intrinsic %<dot_product%>",
2659 gfc_current_intrinsic_arg[0]->name,
2660 gfc_current_intrinsic_arg[1]->name, &vector_a->where);
2661 return false;
2662 }
2663
2664 return true;
2665}
2666
2667
2668bool
2669gfc_check_dprod (gfc_expr *x, gfc_expr *y)
2670{
2671 if (!type_check (x, 0, BT_REAL)
2672 || !type_check (y, 1, BT_REAL))
2673 return false;
2674
2675 if (x->ts.kind != gfc_default_real_kind)
2676 {
2677 gfc_error ("%qs argument of %qs intrinsic at %L must be default "
2678 "real", gfc_current_intrinsic_arg[0]->name,
2679 gfc_current_intrinsic, &x->where);
2680 return false;
2681 }
2682
2683 if (y->ts.kind != gfc_default_real_kind)
2684 {
2685 gfc_error ("%qs argument of %qs intrinsic at %L must be default "
2686 "real", gfc_current_intrinsic_arg[1]->name,
2687 gfc_current_intrinsic, &y->where);
2688 return false;
2689 }
2690
2691 return true;
2692}
2693
2694bool
2695gfc_check_dshift (gfc_expr *i, gfc_expr *j, gfc_expr *shift)
2696{
2697 /* i and j cannot both be BOZ literal constants. */
2698 if (!boz_args_check (i, j))
2699 return false;
2700
2701 /* If i is BOZ and j is integer, convert i to type of j. If j is not
2702 an integer, clear the BOZ; otherwise, check that i is an integer. */
2703 if (i->ts.type == BT_BOZ)
2704 {
2705 if (j->ts.type != BT_INTEGER)
2706 reset_boz (i);
2707 else if (!gfc_boz2int (i, j->ts.kind))
2708 return false;
2709 }
2710 else if (!type_check (i, 0, BT_INTEGER))
2711 {
2712 if (j->ts.type == BT_BOZ)
2713 reset_boz (j);
2714 return false;
2715 }
2716
2717 /* If j is BOZ and i is integer, convert j to type of i. If i is not
2718 an integer, clear the BOZ; otherwise, check that i is an integer. */
2719 if (j->ts.type == BT_BOZ)
2720 {
2721 if (i->ts.type != BT_INTEGER)
2722 reset_boz (j);
2723 else if (!gfc_boz2int (j, i->ts.kind))
2724 return false;
2725 }
2726 else if (!type_check (j, 1, BT_INTEGER))
2727 return false;
2728
2729 if (!same_type_check (i, 0, j, 1))
2730 return false;
2731
2732 if (!type_check (shift, 2, BT_INTEGER))
2733 return false;
2734
2735 if (!nonnegative_check ("SHIFT", shift))
2736 return false;
2737
2738 if (!less_than_bitsize1 ("I", i, "SHIFT", shift, true))
2739 return false;
2740
2741 return true;
2742}
2743
2744
2745bool
2746gfc_check_eoshift (gfc_expr *array, gfc_expr *shift, gfc_expr *boundary,
2747 gfc_expr *dim)
2748{
2749 int d;
2750
2751 if (!array_check (array, 0))
2752 return false;
2753
2754 if (!type_check (shift, 1, BT_INTEGER))
2755 return false;
2756
2757 if (!dim_check (dim, 3, true))
2758 return false;
2759
2760 if (!dim_rank_check (dim, array, false))
2761 return false;
2762
2763 if (!dim)
2764 d = 1;
2765 else if (dim->expr_type == EXPR_CONSTANT)
2766 gfc_extract_int (dim, &d);
2767 else
2768 d = -1;
2769
2770 if (array->rank == 1 || shift->rank == 0)
2771 {
2772 if (!scalar_check (shift, 1))
2773 return false;
2774 }
2775 else if (shift->rank == array->rank - 1)
2776 {
2777 if (d > 0)
2778 {
2779 int i, j;
2780 for (i = 0, j = 0; i < array->rank; i++)
2781 if (i != d - 1)
2782 {
2783 if (!identical_dimen_shape (array, i, shift, j))
2784 {
2785 gfc_error ("%qs argument of %qs intrinsic at %L has "
2786 "invalid shape in dimension %d (%ld/%ld)",
2787 gfc_current_intrinsic_arg[1]->name,
2788 gfc_current_intrinsic, &shift->where, i + 1,
2789 mpz_get_si__gmpz_get_si (array->shape[i]),
2790 mpz_get_si__gmpz_get_si (shift->shape[j]));
2791 return false;
2792 }
2793
2794 j += 1;
2795 }
2796 }
2797 }
2798 else
2799 {
2800 gfc_error ("%qs argument of intrinsic %qs at %L of must have rank "
2801 "%d or be a scalar", gfc_current_intrinsic_arg[1]->name,
2802 gfc_current_intrinsic, &shift->where, array->rank - 1);
2803 return false;
2804 }
2805
2806 if (boundary != NULL__null)
2807 {
2808 if (!same_type_check (array, 0, boundary, 2))
2809 return false;
2810
2811 /* Reject unequal string lengths and emit a better error message than
2812 gfc_check_same_strlen would. */
2813 if (array->ts.type == BT_CHARACTER)
2814 {
2815 ssize_t len_a, len_b;
2816
2817 len_a = gfc_var_strlen (array);
2818 len_b = gfc_var_strlen (boundary);
2819 if (len_a != -1 && len_b != -1 && len_a != len_b)
2820 {
2821 gfc_error ("%qs must be of same type and kind as %qs at %L in %qs",
2822 gfc_current_intrinsic_arg[2]->name,
2823 gfc_current_intrinsic_arg[0]->name,
2824 &boundary->where, gfc_current_intrinsic);
2825 return false;
2826 }
2827 }
2828
2829 if (array->rank == 1 || boundary->rank == 0)
2830 {
2831 if (!scalar_check (boundary, 2))
2832 return false;
2833 }
2834 else if (boundary->rank == array->rank - 1)
2835 {
2836 if (d > 0)
2837 {
2838 int i,j;
2839 for (i = 0, j = 0; i < array->rank; i++)
2840 {
2841 if (i != d - 1)
2842 {
2843 if (!identical_dimen_shape (array, i, boundary, j))
2844 {
2845 gfc_error ("%qs argument of %qs intrinsic at %L has "
2846 "invalid shape in dimension %d (%ld/%ld)",
2847 gfc_current_intrinsic_arg[2]->name,
2848 gfc_current_intrinsic, &shift->where, i+1,
2849 mpz_get_si__gmpz_get_si (array->shape[i]),
2850 mpz_get_si__gmpz_get_si (boundary->shape[j]));
2851 return false;
2852 }
2853 j += 1;
2854 }
2855 }
2856 }
2857 }
2858 else
2859 {
2860 gfc_error ("%qs argument of intrinsic %qs at %L of must have "
2861 "rank %d or be a scalar",
2862 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
2863 &shift->where, array->rank - 1);
2864 return false;
2865 }
2866 }
2867 else
2868 {
2869 switch (array->ts.type)
2870 {
2871 case BT_INTEGER:
2872 case BT_LOGICAL:
2873 case BT_REAL:
2874 case BT_COMPLEX:
2875 case BT_CHARACTER:
2876 break;
2877
2878 default:
2879 gfc_error ("Missing %qs argument to %qs intrinsic at %L for %qs "
2880 "of type %qs", gfc_current_intrinsic_arg[2]->name,
2881 gfc_current_intrinsic, &array->where,
2882 gfc_current_intrinsic_arg[0]->name,
2883 gfc_typename (array));
2884 return false;
2885 }
2886 }
2887
2888 return true;
2889}
2890
2891
2892bool
2893gfc_check_float (gfc_expr *a)
2894{
2895 if (a->ts.type == BT_BOZ)
2896 {
2897 if (gfc_invalid_boz (G_("BOZ literal constant at %L cannot appear in the""BOZ literal constant at %L cannot appear in the" " FLOAT intrinsic subprogram"
2898 " FLOAT intrinsic subprogram")"BOZ literal constant at %L cannot appear in the" " FLOAT intrinsic subprogram", &a->where))
2899 {
2900 reset_boz (a);
2901 return false;
2902 }
2903 if (!gfc_boz2int (a, gfc_default_integer_kind))
2904 return false;
2905 }
2906
2907 if (!type_check (a, 0, BT_INTEGER))
2908 return false;
2909
2910 if ((a->ts.kind != gfc_default_integer_kind)
2911 && !gfc_notify_std (GFC_STD_GNU(1<<5), "non-default INTEGER "
2912 "kind argument to %s intrinsic at %L",
2913 gfc_current_intrinsic, &a->where))
2914 return false;
2915
2916 return true;
2917}
2918
2919/* A single complex argument. */
2920
2921bool
2922gfc_check_fn_c (gfc_expr *a)
2923{
2924 if (!type_check (a, 0, BT_COMPLEX))
2925 return false;
2926
2927 return true;
2928}
2929
2930
2931/* A single real argument. */
2932
2933bool
2934gfc_check_fn_r (gfc_expr *a)
2935{
2936 if (!type_check (a, 0, BT_REAL))
2937 return false;
2938
2939 return true;
2940}
2941
2942/* A single double argument. */
2943
2944bool
2945gfc_check_fn_d (gfc_expr *a)
2946{
2947 if (!double_check (a, 0))
2948 return false;
2949
2950 return true;
2951}
2952
2953/* A single real or complex argument. */
2954
2955bool
2956gfc_check_fn_rc (gfc_expr *a)
2957{
2958 if (!real_or_complex_check (a, 0))
2959 return false;
2960
2961 return true;
2962}
2963
2964
2965bool
2966gfc_check_fn_rc2008 (gfc_expr *a)
2967{
2968 if (!real_or_complex_check (a, 0))
2969 return false;
2970
2971 if (a->ts.type == BT_COMPLEX
2972 && !gfc_notify_std (GFC_STD_F2008(1<<7), "COMPLEX argument %qs "
2973 "of %qs intrinsic at %L",
2974 gfc_current_intrinsic_arg[0]->name,
2975 gfc_current_intrinsic, &a->where))
2976 return false;
2977
2978 return true;
2979}
2980
2981
2982bool
2983gfc_check_fnum (gfc_expr *unit)
2984{
2985 if (!type_check (unit, 0, BT_INTEGER))
2986 return false;
2987
2988 if (!scalar_check (unit, 0))
2989 return false;
2990
2991 return true;
2992}
2993
2994
2995bool
2996gfc_check_huge (gfc_expr *x)
2997{
2998 if (!int_or_real_check (x, 0))
2999 return false;
3000
3001 return true;
3002}
3003
3004
3005bool
3006gfc_check_hypot (gfc_expr *x, gfc_expr *y)
3007{
3008 if (!type_check (x, 0, BT_REAL))
3009 return false;
3010 if (!same_type_check (x, 0, y, 1))
3011 return false;
3012
3013 return true;
3014}
3015
3016
3017/* Check that the single argument is an integer. */
3018
3019bool
3020gfc_check_i (gfc_expr *i)
3021{
3022 if (!type_check (i, 0, BT_INTEGER))
3023 return false;
3024
3025 return true;
3026}
3027
3028
3029bool
3030gfc_check_iand_ieor_ior (gfc_expr *i, gfc_expr *j)
3031{
3032 /* i and j cannot both be BOZ literal constants. */
3033 if (!boz_args_check (i, j))
3034 return false;
3035
3036 /* If i is BOZ and j is integer, convert i to type of j. */
3037 if (i->ts.type == BT_BOZ && j->ts.type == BT_INTEGER
3038 && !gfc_boz2int (i, j->ts.kind))
3039 return false;
3040
3041 /* If j is BOZ and i is integer, convert j to type of i. */
3042 if (j->ts.type == BT_BOZ && i->ts.type == BT_INTEGER
3043 && !gfc_boz2int (j, i->ts.kind))
3044 return false;
3045
3046 if (!type_check (i, 0, BT_INTEGER))
3047 return false;
3048
3049 if (!type_check (j, 1, BT_INTEGER))
3050 return false;
3051
3052 if (i->ts.kind != j->ts.kind)
3053 {
3054 gfc_error ("Arguments of %qs have different kind type parameters "
3055 "at %L", gfc_current_intrinsic, &i->where);
3056 return false;
3057 }
3058
3059 return true;
3060}
3061
3062
3063bool
3064gfc_check_ibits (gfc_expr *i, gfc_expr *pos, gfc_expr *len)
3065{
3066 if (!type_check (i, 0, BT_INTEGER))
3067 return false;
3068
3069 if (!type_check (pos, 1, BT_INTEGER))
3070 return false;
3071
3072 if (!type_check (len, 2, BT_INTEGER))
3073 return false;
3074
3075 if (!nonnegative_check ("pos", pos))
3076 return false;
3077
3078 if (!nonnegative_check ("len", len))
3079 return false;
3080
3081 if (!less_than_bitsize2 ("i", i, "pos", pos, "len", len))
3082 return false;
3083
3084 return true;
3085}
3086
3087
3088bool
3089gfc_check_ichar_iachar (gfc_expr *c, gfc_expr *kind)
3090{
3091 int i;
3092
3093 if (!type_check (c, 0, BT_CHARACTER))
3094 return false;
3095
3096 if (!kind_check (kind, 1, BT_INTEGER))
3097 return false;
3098
3099 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
3100 "with KIND argument at %L",
3101 gfc_current_intrinsic, &kind->where))
3102 return false;
3103
3104 if (c->expr_type == EXPR_VARIABLE || c->expr_type == EXPR_SUBSTRING)
3105 {
3106 gfc_expr *start;
3107 gfc_expr *end;
3108 gfc_ref *ref;
3109
3110 /* Substring references don't have the charlength set. */
3111 ref = c->ref;
3112 while (ref && ref->type != REF_SUBSTRING)
3113 ref = ref->next;
3114
3115 gcc_assert (ref == NULL || ref->type == REF_SUBSTRING)((void)(!(ref == __null || ref->type == REF_SUBSTRING) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 3115, __FUNCTION__), 0 : 0))
;
3116
3117 if (!ref)
3118 {
3119 /* Check that the argument is length one. Non-constant lengths
3120 can't be checked here, so assume they are ok. */
3121 if (c->ts.u.cl && c->ts.u.cl->length)
3122 {
3123 /* If we already have a length for this expression then use it. */
3124 if (c->ts.u.cl->length->expr_type != EXPR_CONSTANT)
3125 return true;
3126 i = mpz_get_si__gmpz_get_si (c->ts.u.cl->length->value.integer);
3127 }
3128 else
3129 return true;
3130 }
3131 else
3132 {
3133 start = ref->u.ss.start;
3134 end = ref->u.ss.end;
3135
3136 gcc_assert (start)((void)(!(start) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/fortran/check.cc"
, 3136, __FUNCTION__), 0 : 0))
;
3137 if (end == NULL__null || end->expr_type != EXPR_CONSTANT
3138 || start->expr_type != EXPR_CONSTANT)
3139 return true;
3140
3141 i = mpz_get_si__gmpz_get_si (end->value.integer) + 1
3142 - mpz_get_si__gmpz_get_si (start->value.integer);
3143 }
3144 }
3145 else
3146 return true;
3147
3148 if (i != 1)
3149 {
3150 gfc_error ("Argument of %s at %L must be of length one",
3151 gfc_current_intrinsic, &c->where);
3152 return false;
3153 }
3154
3155 return true;
3156}
3157
3158
3159bool
3160gfc_check_idnint (gfc_expr *a)
3161{
3162 if (!double_check (a, 0))
3163 return false;
3164
3165 return true;
3166}
3167
3168
3169bool
3170gfc_check_index (gfc_expr *string, gfc_expr *substring, gfc_expr *back,
3171 gfc_expr *kind)
3172{
3173 if (!type_check (string, 0, BT_CHARACTER)
3174 || !type_check (substring, 1, BT_CHARACTER))
3175 return false;
3176
3177 if (back != NULL__null && !type_check (back, 2, BT_LOGICAL))
3178 return false;
3179
3180 if (!kind_check (kind, 3, BT_INTEGER))
3181 return false;
3182 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
3183 "with KIND argument at %L",
3184 gfc_current_intrinsic, &kind->where))
3185 return false;
3186
3187 if (string->ts.kind != substring->ts.kind)
3188 {
3189 gfc_error ("%qs argument of %qs intrinsic at %L must be the same "
3190 "kind as %qs", gfc_current_intrinsic_arg[1]->name,
3191 gfc_current_intrinsic, &substring->where,
3192 gfc_current_intrinsic_arg[0]->name);
3193 return false;
3194 }
3195
3196 return true;
3197}
3198
3199
3200bool
3201gfc_check_int (gfc_expr *x, gfc_expr *kind)
3202{
3203 /* BOZ is dealt within simplify_int*. */
3204 if (x->ts.type == BT_BOZ)
3205 return true;
3206
3207 if (!numeric_check (x, 0))
3208 return false;
3209
3210 if (!kind_check (kind, 1, BT_INTEGER))
3211 return false;
3212
3213 return true;
3214}
3215
3216
3217bool
3218gfc_check_intconv (gfc_expr *x)
3219{
3220 if (strcmp (gfc_current_intrinsic, "short") == 0
3221 || strcmp (gfc_current_intrinsic, "long") == 0)
3222 {
3223 gfc_error ("%qs intrinsic subprogram at %L has been removed. "
3224 "Use INT intrinsic subprogram.", gfc_current_intrinsic,
3225 &x->where);
3226 return false;
3227 }
3228
3229 /* BOZ is dealt within simplify_int*. */
3230 if (x->ts.type == BT_BOZ)
3231 return true;
3232
3233 if (!numeric_check (x, 0))
3234 return false;
3235
3236 return true;
3237}
3238
3239bool
3240gfc_check_ishft (gfc_expr *i, gfc_expr *shift)
3241{
3242 if (!type_check (i, 0, BT_INTEGER)
3243 || !type_check (shift, 1, BT_INTEGER))
3244 return false;
3245
3246 if (!less_than_bitsize1 ("I", i, NULL__null, shift, true))
3247 return false;
3248
3249 return true;
3250}
3251
3252
3253bool
3254gfc_check_ishftc (gfc_expr *i, gfc_expr *shift, gfc_expr *size)
3255{
3256 if (!type_check (i, 0, BT_INTEGER)
3257 || !type_check (shift, 1, BT_INTEGER))
3258 return false;
3259
3260 if (size != NULL__null)
3261 {
3262 int i2, i3;
3263
3264 if (!type_check (size, 2, BT_INTEGER))
3265 return false;
3266
3267 if (!less_than_bitsize1 ("I", i, "SIZE", size, true))
3268 return false;
3269
3270 if (size->expr_type == EXPR_CONSTANT)
3271 {
3272 gfc_extract_int (size, &i3);
3273 if (i3 <= 0)
3274 {
3275 gfc_error ("SIZE at %L must be positive", &size->where);
3276 return false;
3277 }
3278
3279 if (shift->expr_type == EXPR_CONSTANT)
3280 {
3281 gfc_extract_int (shift, &i2);
3282 if (i2 < 0)
3283 i2 = -i2;
3284
3285 if (i2 > i3)
3286 {
3287 gfc_error ("The absolute value of SHIFT at %L must be less "
3288 "than or equal to SIZE at %L", &shift->where,
3289 &size->where);
3290 return false;
3291 }
3292 }
3293 }
3294 }
3295 else if (!less_than_bitsize1 ("I", i, NULL__null, shift, true))
3296 return false;
3297
3298 return true;
3299}
3300
3301
3302bool
3303gfc_check_kill (gfc_expr *pid, gfc_expr *sig)
3304{
3305 if (!type_check (pid, 0, BT_INTEGER))
3306 return false;
3307
3308 if (!scalar_check (pid, 0))
3309 return false;
3310
3311 if (!type_check (sig, 1, BT_INTEGER))
3312 return false;
3313
3314 if (!scalar_check (sig, 1))
3315 return false;
3316
3317 return true;
3318}
3319
3320
3321bool
3322gfc_check_kill_sub (gfc_expr *pid, gfc_expr *sig, gfc_expr *status)
3323{
3324 if (!type_check (pid, 0, BT_INTEGER))
3325 return false;
3326
3327 if (!scalar_check (pid, 0))
3328 return false;
3329
3330 if (!type_check (sig, 1, BT_INTEGER))
3331 return false;
3332
3333 if (!scalar_check (sig, 1))
3334 return false;
3335
3336 if (status)
3337 {
3338 if (!type_check (status, 2, BT_INTEGER))
3339 return false;
3340
3341 if (!scalar_check (status, 2))
3342 return false;
3343
3344 if (status->expr_type != EXPR_VARIABLE)
3345 {
3346 gfc_error ("STATUS at %L shall be an INTENT(OUT) variable",
3347 &status->where);
3348 return false;
3349 }
3350
3351 if (status->expr_type == EXPR_VARIABLE
3352 && status->symtree && status->symtree->n.sym
3353 && status->symtree->n.sym->attr.intent == INTENT_IN)
3354 {
3355 gfc_error ("%qs at %L shall be an INTENT(OUT) variable",
3356 status->symtree->name, &status->where);
3357 return false;
3358 }
3359 }
3360
3361 return true;
3362}
3363
3364
3365bool
3366gfc_check_kind (gfc_expr *x)
3367{
3368 if (gfc_invalid_null_arg (x))
3369 return false;
3370
3371 if (gfc_bt_struct (x->ts.type)((x->ts.type) == BT_DERIVED || (x->ts.type) == BT_UNION
)
|| x->ts.type == BT_CLASS)
3372 {
3373 gfc_error ("%qs argument of %qs intrinsic at %L must be of "
3374 "intrinsic type", gfc_current_intrinsic_arg[0]->name,
3375 gfc_current_intrinsic, &x->where);
3376 return false;
3377 }
3378 if (x->ts.type == BT_PROCEDURE)
3379 {
3380 gfc_error ("%qs argument of %qs intrinsic at %L must be a data entity",
3381 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
3382 &x->where);
3383 return false;
3384 }
3385
3386 return true;
3387}
3388
3389
3390bool
3391gfc_check_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3392{
3393 if (!array_check (array, 0))
3394 return false;
3395
3396 if (!dim_check (dim, 1, false))
3397 return false;
3398
3399 if (!dim_rank_check (dim, array, 1))
3400 return false;
3401
3402 if (!kind_check (kind, 2, BT_INTEGER))
3403 return false;
3404 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
3405 "with KIND argument at %L",
3406 gfc_current_intrinsic, &kind->where))
3407 return false;
3408
3409 return true;
3410}
3411
3412
3413bool
3414gfc_check_lcobound (gfc_expr *coarray, gfc_expr *dim, gfc_expr *kind)
3415{
3416 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
3417 {
3418 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
3419 return false;
3420 }
3421
3422 if (!coarray_check (coarray, 0))
3423 return false;
3424
3425 if (dim != NULL__null)
3426 {
3427 if (!dim_check (dim, 1, false))
3428 return false;
3429
3430 if (!dim_corank_check (dim, coarray))
3431 return false;
3432 }
3433
3434 if (!kind_check (kind, 2, BT_INTEGER))
3435 return false;
3436
3437 return true;
3438}
3439
3440
3441bool
3442gfc_check_len_lentrim (gfc_expr *s, gfc_expr *kind)
3443{
3444 if (!type_check (s, 0, BT_CHARACTER))
3445 return false;
3446
3447 if (gfc_invalid_null_arg (s))
3448 return false;
3449
3450 if (!kind_check (kind, 1, BT_INTEGER))
3451 return false;
3452 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
3453 "with KIND argument at %L",
3454 gfc_current_intrinsic, &kind->where))
3455 return false;
3456
3457 return true;
3458}
3459
3460
3461bool
3462gfc_check_lge_lgt_lle_llt (gfc_expr *a, gfc_expr *b)
3463{
3464 if (!type_check (a, 0, BT_CHARACTER))
3465 return false;
3466 if (!kind_value_check (a, 0, gfc_default_character_kind))
3467 return false;
3468
3469 if (!type_check (b, 1, BT_CHARACTER))
3470 return false;
3471 if (!kind_value_check (b, 1, gfc_default_character_kind))
3472 return false;
3473
3474 return true;
3475}
3476
3477
3478bool
3479gfc_check_link (gfc_expr *path1, gfc_expr *path2)
3480{
3481 if (!type_check (path1, 0, BT_CHARACTER))
3482 return false;
3483 if (!kind_value_check (path1, 0, gfc_default_character_kind))
3484 return false;
3485
3486 if (!type_check (path2, 1, BT_CHARACTER))
3487 return false;
3488 if (!kind_value_check (path2, 1, gfc_default_character_kind))
3489 return false;
3490
3491 return true;
3492}
3493
3494
3495bool
3496gfc_check_link_sub (gfc_expr *path1, gfc_expr *path2, gfc_expr *status)
3497{
3498 if (!type_check (path1, 0, BT_CHARACTER))
3499 return false;
3500 if (!kind_value_check (path1, 0, gfc_default_character_kind))
3501 return false;
3502
3503 if (!type_check (path2, 1, BT_CHARACTER))
3504 return false;
3505 if (!kind_value_check (path2, 0, gfc_default_character_kind))
3506 return false;
3507
3508 if (status == NULL__null)
3509 return true;
3510
3511 if (!type_check (status, 2, BT_INTEGER))
3512 return false;
3513
3514 if (!scalar_check (status, 2))
3515 return false;
3516
3517 return true;
3518}
3519
3520
3521bool
3522gfc_check_loc (gfc_expr *expr)
3523{
3524 return variable_check (expr, 0, true);
3525}
3526
3527
3528bool
3529gfc_check_symlnk (gfc_expr *path1, gfc_expr *path2)
3530{
3531 if (!type_check (path1, 0, BT_CHARACTER))
3532 return false;
3533 if (!kind_value_check (path1, 0, gfc_default_character_kind))
3534 return false;
3535
3536 if (!type_check (path2, 1, BT_CHARACTER))
3537 return false;
3538 if (!kind_value_check (path2, 1, gfc_default_character_kind))
3539 return false;
3540
3541 return true;
3542}
3543
3544
3545bool
3546gfc_check_symlnk_sub (gfc_expr *path1, gfc_expr *path2, gfc_expr *status)
3547{
3548 if (!type_check (path1, 0, BT_CHARACTER))
3549 return false;
3550 if (!kind_value_check (path1, 0, gfc_default_character_kind))
3551 return false;
3552
3553 if (!type_check (path2, 1, BT_CHARACTER))
3554 return false;
3555 if (!kind_value_check (path2, 1, gfc_default_character_kind))
3556 return false;
3557
3558 if (status == NULL__null)
3559 return true;
3560
3561 if (!type_check (status, 2, BT_INTEGER))
3562 return false;
3563
3564 if (!scalar_check (status, 2))
3565 return false;
3566
3567 return true;
3568}
3569
3570
3571bool
3572gfc_check_logical (gfc_expr *a, gfc_expr *kind)
3573{
3574 if (!type_check (a, 0, BT_LOGICAL))
3575 return false;
3576 if (!kind_check (kind, 1, BT_LOGICAL))
3577 return false;
3578
3579 return true;
3580}
3581
3582
3583/* Min/max family. */
3584
3585static bool
3586min_max_args (gfc_actual_arglist *args)
3587{
3588 gfc_actual_arglist *arg;
3589 int i, j, nargs, *nlabels, nlabelless;
3590 bool a1 = false, a2 = false;
3591
3592 if (args == NULL__null || args->next == NULL__null)
3
Assuming 'args' is not equal to NULL
4
Assuming field 'next' is not equal to NULL
5
Taking false branch
3593 {
3594 gfc_error ("Intrinsic %qs at %L must have at least two arguments",
3595 gfc_current_intrinsic, gfc_current_intrinsic_where);
3596 return false;
3597 }
3598
3599 if (!args->name)
6
Assuming field 'name' is null
7
Taking true branch
3600 a1 = true;
3601
3602 if (!args->next->name)
8
Assuming field 'name' is non-null
9
Taking false branch
3603 a2 = true;
3604
3605 nargs = 0;
3606 for (arg = args; arg; arg = arg->next)
10
Loop condition is true. Entering loop body
12
Loop condition is true. Entering loop body
14
Loop condition is true. Entering loop body
17
Assuming pointer value is null
18
Loop condition is false. Execution continues on line 3610
3607 if (arg->name
10.1
Field 'name' is null
12.1
Field 'name' is non-null
)
11
Taking false branch
13
Taking true branch
15
Assuming field 'name' is non-null
16
Taking true branch
3608 nargs++;
3609
3610 if (nargs
18.1
'nargs' is not equal to 0
== 0)
19
Taking false branch
3611 return true;
3612
3613 /* Note: Having a keywordless argument after an "arg=" is checked before. */
3614 nlabelless = 0;
3615 nlabels = XALLOCAVEC (int, nargs)((int *) __builtin_alloca(sizeof (int) * (nargs)));
3616 for (arg = args, i = 0; arg; arg = arg->next, i++)
20
Loop condition is true. Entering loop body
22
Loop condition is true. Entering loop body
37
Loop condition is true. Entering loop body
3617 if (arg->name
20.1
Field 'name' is null
22.1
Field 'name' is non-null
37.1
Field 'name' is non-null
)
21
Taking false branch
23
Taking true branch
38
Taking true branch
3618 {
3619 int n;
3620 char *endp;
3621
3622 if (arg->name[0] != 'a' || arg->name[1] < '1' || arg->name[1] > '9')
24
Assuming the condition is false
25
Assuming the condition is false
26
Assuming the condition is false
27
Taking false branch
39
Assuming the condition is false
40
Assuming the condition is false
41
Assuming the condition is false
42
Taking false branch
3623 goto unknown;
3624 n = strtol (&arg->name[1], &endp, 10);
3625 if (endp[0] != '\0')
28
Assuming the condition is false
29
Taking false branch
43
Assuming the condition is false
44
Taking false branch
3626 goto unknown;
3627 if (n <= 0)
30
Assuming 'n' is > 0
31
Taking false branch
45
Assuming 'n' is > 0
46
Taking false branch
3628 goto unknown;
3629 if (n <= nlabelless)
32
Assuming 'n' is > 'nlabelless'
33
Taking false branch
47
Assuming 'n' is > 'nlabelless'
48
Taking false branch
3630 goto duplicate;
3631 nlabels[i] = n;
3632 if (n
33.1
'n' is not equal to 1
48.1
'n' is not equal to 1
== 1)
34
Taking false branch
49
Taking false branch
3633 a1 = true;
3634 if (n == 2)
35
Assuming 'n' is equal to 2
36
Taking true branch
50
Assuming 'n' is not equal to 2
51
Taking false branch
3635 a2 = true;
3636 }
3637 else
3638 nlabelless++;
3639
3640 if (!a1
51.1
'a1' is true
|| !a2
51.2
'a2' is true
)
52
Taking false branch
3641 {
3642 gfc_error ("Missing %qs argument to the %s intrinsic at %L",
3643 !a1 ? "a1" : "a2", gfc_current_intrinsic,
3644 gfc_current_intrinsic_where);
3645 return false;
3646 }
3647
3648 /* Check for duplicates. */
3649 for (i = 0; i < nargs; i++)
53
The value 0 is assigned to 'i'
54
Loop condition is true. Entering loop body
3650 for (j = i + 1; j < nargs; j++)
55
Loop condition is true. Entering loop body
3651 if (nlabels[i] == nlabels[j])
56
The left operand of '==' is a garbage value
3652 goto duplicate;
3653
3654 return true;
3655
3656duplicate:
3657 gfc_error ("Duplicate argument %qs at %L to intrinsic %s", arg->name,
3658 &arg->expr->where, gfc_current_intrinsic);
3659 return false;
3660
3661unknown:
3662 gfc_error ("Unknown argument %qs at %L to intrinsic %s", arg->name,
3663 &arg->expr->where, gfc_current_intrinsic);
3664 return false;
3665}
3666
3667
3668static bool
3669check_rest (bt type, int kind, gfc_actual_arglist *arglist)
3670{
3671 gfc_actual_arglist *arg, *tmp;
3672 gfc_expr *x;
3673 int m, n;
3674
3675 if (!min_max_args (arglist))
2
Calling 'min_max_args'
3676 return false;
3677
3678 for (arg = arglist, n=1; arg; arg = arg->next, n++)
3679 {
3680 x = arg->expr;
3681 if (x->ts.type != type || x->ts.kind != kind)
3682 {
3683 if (x->ts.type == type)
3684 {
3685 if (x->ts.type == BT_CHARACTER)
3686 {
3687 gfc_error ("Different character kinds at %L", &x->where);
3688 return false;
3689 }
3690 if (!gfc_notify_std (GFC_STD_GNU(1<<5), "Different type "
3691 "kinds at %L", &x->where))
3692 return false;
3693 }
3694 else
3695 {
3696 gfc_error ("%<a%d%> argument of %qs intrinsic at %L must be "
3697 "%s(%d)", n, gfc_current_intrinsic, &x->where,
3698 gfc_basic_typename (type), kind);
3699 return false;
3700 }
3701 }
3702
3703 for (tmp = arglist, m=1; tmp != arg; tmp = tmp->next, m++)
3704 if (!gfc_check_conformance (tmp->expr, x,
3705 _("arguments 'a%d' and 'a%d' for "gettext ("arguments 'a%d' and 'a%d' for " "intrinsic '%s'")
3706 "intrinsic '%s'")gettext ("arguments 'a%d' and 'a%d' for " "intrinsic '%s'"), m, n,
3707 gfc_current_intrinsic))
3708 return false;
3709 }
3710
3711 return true;
3712}
3713
3714
3715bool
3716gfc_check_min_max (gfc_actual_arglist *arg)
3717{
3718 gfc_expr *x;
3719
3720 if (!min_max_args (arg))
3721 return false;
3722
3723 x = arg->expr;
3724
3725 if (x->ts.type == BT_CHARACTER)
3726 {
3727 if (!gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
3728 "with CHARACTER argument at %L",
3729 gfc_current_intrinsic, &x->where))
3730 return false;
3731 }
3732 else if (x->ts.type != BT_INTEGER && x->ts.type != BT_REAL)
3733 {
3734 gfc_error ("%<a1%> argument of %qs intrinsic at %L must be INTEGER, "
3735 "REAL or CHARACTER", gfc_current_intrinsic, &x->where);
3736 return false;
3737 }
3738
3739 return check_rest (x->ts.type, x->ts.kind, arg);
3740}
3741
3742
3743bool
3744gfc_check_min_max_integer (gfc_actual_arglist *arg)
3745{
3746 return check_rest (BT_INTEGER, gfc_default_integer_kind, arg);
3747}
3748
3749
3750bool
3751gfc_check_min_max_real (gfc_actual_arglist *arg)
3752{
3753 return check_rest (BT_REAL, gfc_default_real_kind, arg);
3754}
3755
3756
3757bool
3758gfc_check_min_max_double (gfc_actual_arglist *arg)
3759{
3760 return check_rest (BT_REAL, gfc_default_double_kind, arg);
1
Calling 'check_rest'
3761}
3762
3763
3764/* End of min/max family. */
3765
3766bool
3767gfc_check_malloc (gfc_expr *size)
3768{
3769 if (!type_check (size, 0, BT_INTEGER))
3770 return false;
3771
3772 if (!scalar_check (size, 0))
3773 return false;
3774
3775 return true;
3776}
3777
3778
3779bool
3780gfc_check_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3781{
3782 if ((matrix_a->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_a->ts))
3783 {
3784 gfc_error ("%qs argument of %qs intrinsic at %L must be numeric "
3785 "or LOGICAL", gfc_current_intrinsic_arg[0]->name,
3786 gfc_current_intrinsic, &matrix_a->where);
3787 return false;
3788 }
3789
3790 if ((matrix_b->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_b->ts))
3791 {
3792 gfc_error ("%qs argument of %qs intrinsic at %L must be numeric "
3793 "or LOGICAL", gfc_current_intrinsic_arg[1]->name,
3794 gfc_current_intrinsic, &matrix_b->where);
3795 return false;
3796 }
3797
3798 if ((matrix_a->ts.type == BT_LOGICAL && gfc_numeric_ts (&matrix_b->ts))
3799 || (gfc_numeric_ts (&matrix_a->ts) && matrix_b->ts.type == BT_LOGICAL))
3800 {
3801 gfc_error ("Argument types of %qs intrinsic at %L must match (%s/%s)",
3802 gfc_current_intrinsic, &matrix_a->where,
3803 gfc_typename(&matrix_a->ts), gfc_typename(&matrix_b->ts));
3804 return false;
3805 }
3806
3807 switch (matrix_a->rank)
3808 {
3809 case 1:
3810 if (!rank_check (matrix_b, 1, 2))
3811 return false;
3812 /* Check for case matrix_a has shape(m), matrix_b has shape (m, k). */
3813 if (!identical_dimen_shape (matrix_a, 0, matrix_b, 0))
3814 {
3815 gfc_error ("Different shape on dimension 1 for arguments %qs "
3816 "and %qs at %L for intrinsic matmul",
3817 gfc_current_intrinsic_arg[0]->name,
3818 gfc_current_intrinsic_arg[1]->name, &matrix_a->where);
3819 return false;
3820 }
3821 break;
3822
3823 case 2:
3824 if (matrix_b->rank != 2)
3825 {
3826 if (!rank_check (matrix_b, 1, 1))
3827 return false;
3828 }
3829 /* matrix_b has rank 1 or 2 here. Common check for the cases
3830 - matrix_a has shape (n,m) and matrix_b has shape (m, k)
3831 - matrix_a has shape (n,m) and matrix_b has shape (m). */
3832 if (!identical_dimen_shape (matrix_a, 1, matrix_b, 0))
3833 {
3834 gfc_error ("Different shape on dimension 2 for argument %qs and "
3835 "dimension 1 for argument %qs at %L for intrinsic "
3836 "matmul", gfc_current_intrinsic_arg[0]->name,
3837 gfc_current_intrinsic_arg[1]->name, &matrix_a->where);
3838 return false;
3839 }
3840 break;
3841
3842 default:
3843 gfc_error ("%qs argument of %qs intrinsic at %L must be of rank "
3844 "1 or 2", gfc_current_intrinsic_arg[0]->name,
3845 gfc_current_intrinsic, &matrix_a->where);
3846 return false;
3847 }
3848
3849 return true;
3850}
3851
3852
3853/* Whoever came up with this interface was probably on something.
3854 The possibilities for the occupation of the second and third
3855 parameters are:
3856
3857 Arg #2 Arg #3
3858 NULL NULL
3859 DIM NULL
3860 MASK NULL
3861 NULL MASK minloc(array, mask=m)
3862 DIM MASK
3863
3864 I.e. in the case of minloc(array,mask), mask will be in the second
3865 position of the argument list and we'll have to fix that up. Also,
3866 add the BACK argument if that isn't present. */
3867
3868bool
3869gfc_check_minloc_maxloc (gfc_actual_arglist *ap)
3870{
3871 gfc_expr *a, *m, *d, *k, *b;
3872
3873 a = ap->expr;
3874 if (!int_or_real_or_char_check_f2003 (a, 0) || !array_check (a, 0))
3875 return false;
3876
3877 d = ap->next->expr;
3878 m = ap->next->next->expr;
3879 k = ap->next->next->next->expr;
3880 b = ap->next->next->next->next->expr;
3881
3882 if (b)
3883 {
3884 if (!type_check (b, 4, BT_LOGICAL) || !scalar_check (b,4))
3885 return false;
3886 }
3887 else
3888 {
3889 b = gfc_get_logical_expr (gfc_logical_4_kind4, NULL__null, 0);
3890 ap->next->next->next->next->expr = b;
3891 ap->next->next->next->next->name = gfc_get_string ("back");
3892 }
3893
3894 if (m == NULL__null && d != NULL__null && d->ts.type == BT_LOGICAL
3895 && ap->next->name == NULL__null)
3896 {
3897 m = d;
3898 d = NULL__null;
3899 ap->next->expr = NULL__null;
3900 ap->next->next->expr = m;
3901 }
3902
3903 if (!dim_check (d, 1, false))
3904 return false;
3905
3906 if (!dim_rank_check (d, a, 0))
3907 return false;
3908
3909 if (m != NULL__null && !type_check (m, 2, BT_LOGICAL))
3910 return false;
3911
3912 if (m != NULL__null
3913 && !gfc_check_conformance (a, m,
3914 _("arguments '%s' and '%s' for intrinsic %s")gettext ("arguments '%s' and '%s' for intrinsic %s"),
3915 gfc_current_intrinsic_arg[0]->name,
3916 gfc_current_intrinsic_arg[2]->name,
3917 gfc_current_intrinsic))
3918 return false;
3919
3920 if (!kind_check (k, 1, BT_INTEGER))
3921 return false;
3922
3923 return true;
3924}
3925
3926/* Check function for findloc. Mostly like gfc_check_minloc_maxloc
3927 above, with the additional "value" argument. */
3928
3929bool
3930gfc_check_findloc (gfc_actual_arglist *ap)
3931{
3932 gfc_expr *a, *v, *m, *d, *k, *b;
3933 bool a1, v1;
3934
3935 a = ap->expr;
3936 if (!intrinsic_type_check (a, 0) || !array_check (a, 0))
3937 return false;
3938
3939 v = ap->next->expr;
3940 if (!intrinsic_type_check (v, 1) || !scalar_check (v,1))
3941 return false;
3942
3943 /* Check if the type are both logical. */
3944 a1 = a->ts.type == BT_LOGICAL;
3945 v1 = v->ts.type == BT_LOGICAL;
3946 if ((a1 && !v1) || (!a1 && v1))
3947 goto incompat;
3948
3949 /* Check if the type are both character. */
3950 a1 = a->ts.type == BT_CHARACTER;
3951 v1 = v->ts.type == BT_CHARACTER;
3952 if ((a1 && !v1) || (!a1 && v1))
3953 goto incompat;
3954
3955 /* Check the kind of the characters argument match. */
3956 if (a1 && v1 && a->ts.kind != v->ts.kind)
3957 goto incompat;
3958
3959 d = ap->next->next->expr;
3960 m = ap->next->next->next->expr;
3961 k = ap->next->next->next->next->expr;
3962 b = ap->next->next->next->next->next->expr;
3963
3964 if (b)
3965 {
3966 if (!type_check (b, 5, BT_LOGICAL) || !scalar_check (b,4))
3967 return false;
3968 }
3969 else
3970 {
3971 b = gfc_get_logical_expr (gfc_logical_4_kind4, NULL__null, 0);
3972 ap->next->next->next->next->next->expr = b;
3973 ap->next->next->next->next->next->name = gfc_get_string ("back");
3974 }
3975
3976 if (m == NULL__null && d != NULL__null && d->ts.type == BT_LOGICAL
3977 && ap->next->name == NULL__null)
3978 {
3979 m = d;
3980 d = NULL__null;
3981 ap->next->next->expr = NULL__null;
3982 ap->next->next->next->expr = m;
3983 }
3984
3985 if (!dim_check (d, 2, false))
3986 return false;
3987
3988 if (!dim_rank_check (d, a, 0))
3989 return false;
3990
3991 if (m != NULL__null && !type_check (m, 3, BT_LOGICAL))
3992 return false;
3993
3994 if (m != NULL__null
3995 && !gfc_check_conformance (a, m,
3996 _("arguments '%s' and '%s' for intrinsic %s")gettext ("arguments '%s' and '%s' for intrinsic %s"),
3997 gfc_current_intrinsic_arg[0]->name,
3998 gfc_current_intrinsic_arg[3]->name,
3999 gfc_current_intrinsic))
4000 return false;
4001
4002 if (!kind_check (k, 1, BT_INTEGER))
4003 return false;
4004
4005 return true;
4006
4007incompat:
4008 gfc_error ("Argument %qs of %qs intrinsic at %L must be in type "
4009 "conformance to argument %qs at %L",
4010 gfc_current_intrinsic_arg[0]->name,
4011 gfc_current_intrinsic, &a->where,
4012 gfc_current_intrinsic_arg[1]->name, &v->where);
4013 return false;
4014}
4015
4016
4017/* Similar to minloc/maxloc, the argument list might need to be
4018 reordered for the MINVAL, MAXVAL, PRODUCT, and SUM intrinsics. The
4019 difference is that MINLOC/MAXLOC take an additional KIND argument.
4020 The possibilities are:
4021
4022 Arg #2 Arg #3
4023 NULL NULL
4024 DIM NULL
4025 MASK NULL
4026 NULL MASK minval(array, mask=m)
4027 DIM MASK
4028
4029 I.e. in the case of minval(array,mask), mask will be in the second
4030 position of the argument list and we'll have to fix that up. */
4031
4032static bool
4033check_reduction (gfc_actual_arglist *ap)
4034{
4035 gfc_expr *a, *m, *d;
4036
4037 a = ap->expr;
4038 d = ap->next->expr;
4039 m = ap->next->next->expr;
4040
4041 if (m == NULL__null && d != NULL__null && d->ts.type == BT_LOGICAL
4042 && ap->next->name == NULL__null)
4043 {
4044 m = d;
4045 d = NULL__null;
4046 ap->next->expr = NULL__null;
4047 ap->next->next->expr = m;
4048 }
4049
4050 if (!dim_check (d, 1, false))
4051 return false;
4052
4053 if (!dim_rank_check (d, a, 0))
4054 return false;
4055
4056 if (m != NULL__null && !type_check (m, 2, BT_LOGICAL))
4057 return false;
4058
4059 if (m != NULL__null
4060 && !gfc_check_conformance (a, m,
4061 _("arguments '%s' and '%s' for intrinsic %s")gettext ("arguments '%s' and '%s' for intrinsic %s"),
4062 gfc_current_intrinsic_arg[0]->name,
4063 gfc_current_intrinsic_arg[2]->name,
4064 gfc_current_intrinsic))
4065 return false;
4066
4067 return true;
4068}
4069
4070
4071bool
4072gfc_check_minval_maxval (gfc_actual_arglist *ap)
4073{
4074 if (!int_or_real_or_char_check_f2003 (ap->expr, 0)
4075 || !array_check (ap->expr, 0))
4076 return false;
4077
4078 return check_reduction (ap);
4079}
4080
4081
4082bool
4083gfc_check_product_sum (gfc_actual_arglist *ap)
4084{
4085 if (!numeric_check (ap->expr, 0)
4086 || !array_check (ap->expr, 0))
4087 return false;
4088
4089 return check_reduction (ap);
4090}
4091
4092
4093/* For IANY, IALL and IPARITY. */
4094
4095bool
4096gfc_check_mask (gfc_expr *i, gfc_expr *kind)
4097{
4098 int k;
4099
4100 if (!type_check (i, 0, BT_INTEGER))
4101 return false;
4102
4103 if (!nonnegative_check ("I", i))
4104 return false;
4105
4106 if (!kind_check (kind, 1, BT_INTEGER))
4107 return false;
4108
4109 if (kind)
4110 gfc_extract_int (kind, &k);
4111 else
4112 k = gfc_default_integer_kind;
4113
4114 if (!less_than_bitsizekind ("I", i, k))
4115 return false;
4116
4117 return true;
4118}
4119
4120
4121bool
4122gfc_check_transf_bit_intrins (gfc_actual_arglist *ap)
4123{
4124 if (ap->expr->ts.type != BT_INTEGER)
4125 {
4126 gfc_error ("%qs argument of %qs intrinsic at %L must be INTEGER",
4127 gfc_current_intrinsic_arg[0]->name,
4128 gfc_current_intrinsic, &ap->expr->where);
4129 return false;
4130 }
4131
4132 if (!array_check (ap->expr, 0))
4133 return false;
4134
4135 return check_reduction (ap);
4136}
4137
4138
4139bool
4140gfc_check_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4141{
4142 if (gfc_invalid_null_arg (tsource))
4143 return false;
4144
4145 if (gfc_invalid_null_arg (fsource))
4146 return false;
4147
4148 if (!same_type_check (tsource, 0, fsource, 1))
4149 return false;
4150
4151 if (!type_check (mask, 2, BT_LOGICAL))
4152 return false;
4153
4154 if (tsource->ts.type == BT_CHARACTER)
4155 return gfc_check_same_strlen (tsource, fsource, "MERGE intrinsic");
4156
4157 return true;
4158}
4159
4160
4161bool
4162gfc_check_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask)
4163{
4164 /* i and j cannot both be BOZ literal constants. */
4165 if (!boz_args_check (i, j))
4166 return false;
4167
4168 /* If i is BOZ and j is integer, convert i to type of j. */
4169 if (i->ts.type == BT_BOZ && j->ts.type == BT_INTEGER
4170 && !gfc_boz2int (i, j->ts.kind))
4171 return false;
4172
4173 /* If j is BOZ and i is integer, convert j to type of i. */
4174 if (j->ts.type == BT_BOZ && i->ts.type == BT_INTEGER
4175 && !gfc_boz2int (j, i->ts.kind))
4176 return false;
4177
4178 if (!type_check (i, 0, BT_INTEGER))
4179 return false;
4180
4181 if (!type_check (j, 1, BT_INTEGER))
4182 return false;
4183
4184 if (!same_type_check (i, 0, j, 1))
4185 return false;
4186
4187 if (mask->ts.type == BT_BOZ && !gfc_boz2int(mask, i->ts.kind))
4188 return false;
4189
4190 if (!type_check (mask, 2, BT_INTEGER))
4191 return false;
4192
4193 if (!same_type_check (i, 0, mask, 2))
4194 return false;
4195
4196 return true;
4197}
4198
4199
4200bool
4201gfc_check_move_alloc (gfc_expr *from, gfc_expr *to)
4202{
4203 if (!variable_check (from, 0, false))
4204 return false;
4205 if (!allocatable_check (from, 0))
4206 return false;
4207 if (gfc_is_coindexed (from))
4208 {
4209 gfc_error ("The FROM argument to MOVE_ALLOC at %L shall not be "
4210 "coindexed", &from->where);
4211 return false;
4212 }
4213
4214 if (!variable_check (to, 1, false))
4215 return false;
4216 if (!allocatable_check (to, 1))
4217 return false;
4218 if (gfc_is_coindexed (to))
4219 {
4220 gfc_error ("The TO argument to MOVE_ALLOC at %L shall not be "
4221 "coindexed", &to->where);
4222 return false;
4223 }
4224
4225 if (from->ts.type == BT_CLASS && to->ts.type == BT_DERIVED)
4226 {
4227 gfc_error ("The TO arguments in MOVE_ALLOC at %L must be "
4228 "polymorphic if FROM is polymorphic",
4229 &to->where);
4230 return false;
4231 }
4232
4233 if (!same_type_check (to, 1, from, 0))
4234 return false;
4235
4236 if (to->rank != from->rank)
4237 {
4238 gfc_error ("The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L "
4239 "must have the same rank %d/%d", &to->where, from->rank,
4240 to->rank);
4241 return false;
4242 }
4243
4244 /* IR F08/0040; cf. 12-006A. */
4245 if (gfc_get_corank (to) != gfc_get_corank (from))
4246 {
4247 gfc_error ("The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L "
4248 "must have the same corank %d/%d", &to->where,
4249 gfc_get_corank (from), gfc_get_corank (to));
4250 return false;
4251 }
4252
4253 /* This is based losely on F2003 12.4.1.7. It is intended to prevent
4254 the likes of to = sym->cmp1->cmp2 and from = sym->cmp1, where cmp1
4255 and cmp2 are allocatable. After the allocation is transferred,
4256 the 'to' chain is broken by the nullification of the 'from'. A bit
4257 of reflection reveals that this can only occur for derived types
4258 with recursive allocatable components. */
4259 if (to->expr_type == EXPR_VARIABLE && from->expr_type == EXPR_VARIABLE
4260 && !strcmp (to->symtree->n.sym->name, from->symtree->n.sym->name))
4261 {
4262 gfc_ref *to_ref, *from_ref;
4263 to_ref = to->ref;
4264 from_ref = from->ref;
4265 bool aliasing = true;
4266
4267 for (; from_ref && to_ref;
4268 from_ref = from_ref->next, to_ref = to_ref->next)
4269 {
4270 if (to_ref->type != from->ref->type)
4271 aliasing = false;
4272 else if (to_ref->type == REF_ARRAY
4273 && to_ref->u.ar.type != AR_FULL
4274 && from_ref->u.ar.type != AR_FULL)
4275 /* Play safe; assume sections and elements are different. */
4276 aliasing = false;
4277 else if (to_ref->type == REF_COMPONENT
4278 && to_ref->u.c.component != from_ref->u.c.component)
4279 aliasing = false;
4280
4281 if (!aliasing)
4282 break;
4283 }
4284
4285 if (aliasing)
4286 {
4287 gfc_error ("The FROM and TO arguments at %L violate aliasing "
4288 "restrictions (F2003 12.4.1.7)", &to->where);
4289 return false;
4290 }
4291 }
4292
4293 /* CLASS arguments: Make sure the vtab of from is present. */
4294 if (to->ts.type == BT_CLASS && !UNLIMITED_POLY (from)(from != __null && from->ts.type == BT_CLASS &&
from->ts.u.derived->components && from->ts.
u.derived->components->ts.u.derived && from->
ts.u.derived->components->ts.u.derived->attr.unlimited_polymorphic
)
)
4295 gfc_find_vtab (&from->ts);
4296
4297 return true;
4298}
4299
4300
4301bool
4302gfc_check_nearest (gfc_expr *x, gfc_expr *s)
4303{
4304 if (!type_check (x, 0, BT_REAL))
4305 return false;
4306
4307 if (!type_check (s, 1, BT_REAL))
4308 return false;
4309
4310 if (s->expr_type == EXPR_CONSTANT)
4311 {
4312 if (mpfr_sgn (s->value.real)((s->value.real)->_mpfr_exp < (2 - ((mpfr_exp_t) (((
mpfr_uexp_t) -1) >> 1))) ? ((((mpfr_srcptr) (0 ? (s->
value.real) : (mpfr_srcptr) (s->value.real)))->_mpfr_exp
== (1 - ((mpfr_exp_t) (((mpfr_uexp_t) -1) >> 1)))) ? mpfr_set_erangeflag
() : (mpfr_void) 0), 0 : ((s->value.real)->_mpfr_sign)
)
== 0)
4313 {
4314 gfc_error ("Argument %<S%> of NEAREST at %L shall not be zero",
4315 &s->where);
4316 return false;
4317 }
4318 }
4319
4320 return true;
4321}
4322
4323
4324bool
4325gfc_check_new_line (gfc_expr *a)
4326{
4327 if (!type_check (a, 0, BT_CHARACTER))
4328 return false;
4329
4330 return true;
4331}
4332
4333
4334bool
4335gfc_check_norm2 (gfc_expr *array, gfc_expr *dim)
4336{
4337 if (!type_check (array, 0, BT_REAL))
4338 return false;
4339
4340 if (!array_check (array, 0))
4341 return false;
4342
4343 if (!dim_check (dim, 1, false))
4344 return false;
4345
4346 if (!dim_rank_check (dim, array, false))
4347 return false;
4348
4349 return true;
4350}
4351
4352bool
4353gfc_check_null (gfc_expr *mold)
4354{
4355 symbol_attribute attr;
4356
4357 if (mold == NULL__null)
4358 return true;
4359
4360 if (!variable_check (mold, 0, true))
4361 return false;
4362
4363 attr = gfc_variable_attr (mold, NULL__null);
4364
4365 if (!attr.pointer && !attr.proc_pointer && !attr.allocatable)
4366 {
4367 gfc_error ("%qs argument of %qs intrinsic at %L must be a POINTER, "
4368 "ALLOCATABLE or procedure pointer",
4369 gfc_current_intrinsic_arg[0]->name,
4370 gfc_current_intrinsic, &mold->where);
4371 return false;
4372 }
4373
4374 if (attr.allocatable
4375 && !gfc_notify_std (GFC_STD_F2003(1<<4), "NULL intrinsic with "
4376 "allocatable MOLD at %L", &mold->where))
4377 return false;
4378
4379 /* F2008, C1242. */
4380 if (gfc_is_coindexed (mold))
4381 {
4382 gfc_error ("%qs argument of %qs intrinsic at %L shall not be "
4383 "coindexed", gfc_current_intrinsic_arg[0]->name,
4384 gfc_current_intrinsic, &mold->where);
4385 return false;
4386 }
4387
4388 return true;
4389}
4390
4391
4392bool
4393gfc_check_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4394{
4395 if (!array_check (array, 0))
4396 return false;
4397
4398 if (!type_check (mask, 1, BT_LOGICAL))
4399 return false;
4400
4401 if (!gfc_check_conformance (array, mask,
4402 _("arguments '%s' and '%s' for intrinsic '%s'")gettext ("arguments '%s' and '%s' for intrinsic '%s'"),
4403 gfc_current_intrinsic_arg[0]->name,
4404 gfc_current_intrinsic_arg[1]->name,
4405 gfc_current_intrinsic))
4406 return false;
4407
4408 if (vector != NULL__null)
4409 {
4410 mpz_t array_size, vector_size;
4411 bool have_array_size, have_vector_size;
4412
4413 if (!same_type_check (array, 0, vector, 2))
4414 return false;
4415
4416 if (!rank_check (vector, 2, 1))
4417 return false;
4418
4419 /* VECTOR requires at least as many elements as MASK
4420 has .TRUE. values. */
4421 have_array_size = gfc_array_size(array, &array_size);
4422 have_vector_size = gfc_array_size(vector, &vector_size);
4423
4424 if (have_vector_size
4425 && (mask->expr_type == EXPR_ARRAY
4426 || (mask->expr_type == EXPR_CONSTANT
4427 && have_array_size)))
4428 {
4429 int mask_true_values = 0;
4430
4431 if (mask->expr_type == EXPR_ARRAY)
4432 {
4433 gfc_constructor *mask_ctor;
4434 mask_ctor = gfc_constructor_first (mask->value.constructor);
4435 while (mask_ctor)
4436 {
4437 if (mask_ctor->expr->expr_type != EXPR_CONSTANT)
4438 {
4439 mask_true_values = 0;
4440 break;
4441 }
4442
4443 if (mask_ctor->expr->value.logical)
4444 mask_true_values++;
4445
4446 mask_ctor = gfc_constructor_next (mask_ctor);
4447 }
4448 }
4449 else if (mask->expr_type == EXPR_CONSTANT && mask->value.logical)
4450 mask_true_values = mpz_get_si__gmpz_get_si (array_size);
4451
4452 if (mpz_get_si__gmpz_get_si (vector_size) < mask_true_values)
4453 {
4454 gfc_error ("%qs argument of %qs intrinsic at %L must "
4455 "provide at least as many elements as there "
4456 "are .TRUE. values in %qs (%ld/%d)",
4457 gfc_current_intrinsic_arg[2]->name,
4458 gfc_current_intrinsic, &vector->where,
4459 gfc_current_intrinsic_arg[1]->name,
4460 mpz_get_si__gmpz_get_si (vector_size), mask_true_values);
4461 return false;
4462 }
4463 }
4464
4465 if (have_array_size)
4466 mpz_clear__gmpz_clear (array_size);
4467 if (have_vector_size)
4468 mpz_clear__gmpz_clear (vector_size);
4469 }
4470
4471 return true;
4472}
4473
4474
4475bool
4476gfc_check_parity (gfc_expr *mask, gfc_expr *dim)
4477{
4478 if (!type_check (mask, 0, BT_LOGICAL))
4479 return false;
4480
4481 if (!array_check (mask, 0))
4482 return false;
4483
4484 if (!dim_check (dim, 1, false))
4485 return false;
4486
4487 if (!dim_rank_check (dim, mask, false))
4488 return false;
4489
4490 return true;
4491}
4492
4493
4494bool
4495gfc_check_precision (gfc_expr *x)
4496{
4497 if (!real_or_complex_check (x, 0))
4498 return false;
4499
4500 return true;
4501}
4502
4503
4504bool
4505gfc_check_present (gfc_expr *a)
4506{
4507 gfc_symbol *sym;
4508
4509 if (!variable_check (a, 0, true))
4510 return false;
4511
4512 sym = a->symtree->n.sym;
4513 if (!sym->attr.dummy)
4514 {
4515 gfc_error ("%qs argument of %qs intrinsic at %L must be of a "
4516 "dummy variable", gfc_current_intrinsic_arg[0]->name,
4517 gfc_current_intrinsic, &a->where);
4518 return false;
4519 }
4520
4521 /* For CLASS, the optional attribute might be set at either location. */
4522 if ((sym->ts.type != BT_CLASS || !CLASS_DATA (sym)sym->ts.u.derived->components->attr.optional)
4523 && !sym->attr.optional)
4524 {
4525 gfc_error ("%qs argument of %qs intrinsic at %L must be of "
4526 "an OPTIONAL dummy variable",
4527 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
4528 &a->where);
4529 return false;
4530 }
4531
4532 /* 13.14.82 PRESENT(A)
4533 ......
4534 Argument. A shall be the name of an optional dummy argument that is
4535 accessible in the subprogram in which the PRESENT function reference
4536 appears... */
4537
4538 if (a->ref != NULL__null
4539 && !(a->ref->next == NULL__null && a->ref->type == REF_ARRAY
4540 && (a->ref->u.ar.type == AR_FULL
4541 || (a->ref->u.ar.type == AR_ELEMENT
4542 && a->ref->u.ar.as->rank == 0))))
4543 {
4544 gfc_error ("%qs argument of %qs intrinsic at %L must not be a "
4545 "subobject of %qs", gfc_current_intrinsic_arg[0]->name,
4546 gfc_current_intrinsic, &a->where, sym->name);
4547 return false;
4548 }
4549
4550 return true;
4551}
4552
4553
4554bool
4555gfc_check_radix (gfc_expr *x)
4556{
4557 if (!int_or_real_check (x, 0))
4558 return false;
4559
4560 return true;
4561}
4562
4563
4564bool
4565gfc_check_range (gfc_expr *x)
4566{
4567 if (!numeric_check (x, 0))
4568 return false;
4569
4570 return true;
4571}
4572
4573
4574bool
4575gfc_check_rank (gfc_expr *a)
4576{
4577 /* Any data object is allowed; a "data object" is a "constant (4.1.3),
4578 variable (6), or subobject of a constant (2.4.3.2.3)" (F2008, 1.3.45). */
4579
4580 bool is_variable = true;
4581
4582 /* Functions returning pointers are regarded as variable, cf. F2008, R602. */
4583 if (a->expr_type == EXPR_FUNCTION)
4584 is_variable = a->value.function.esym
4585 ? a->value.function.esym->result->attr.pointer
4586 : a->symtree->n.sym->result->attr.pointer;
4587
4588 if (a->expr_type == EXPR_OP
4589 || a->expr_type == EXPR_NULL
4590 || a->expr_type == EXPR_COMPCALL
4591 || a->expr_type == EXPR_PPC
4592 || a->ts.type == BT_PROCEDURE
4593 || !is_variable)
4594 {
4595 gfc_error ("The argument of the RANK intrinsic at %L must be a data "
4596 "object", &a->where);
4597 return false;
4598 }
4599
4600 return true;
4601}
4602
4603
4604bool
4605gfc_check_real (gfc_expr *a, gfc_expr *kind)
4606{
4607 if (!kind_check (kind, 1, BT_REAL))
4608 return false;
4609
4610 /* BOZ is dealt with in gfc_simplify_real. */
4611 if (a->ts.type == BT_BOZ)
4612 return true;
4613
4614 if (!numeric_check (a, 0))
4615 return false;
4616
4617 return true;
4618}
4619
4620
4621bool
4622gfc_check_rename (gfc_expr *path1, gfc_expr *path2)
4623{
4624 if (!type_check (path1, 0, BT_CHARACTER))
4625 return false;
4626 if (!kind_value_check (path1, 0, gfc_default_character_kind))
4627 return false;
4628
4629 if (!type_check (path2, 1, BT_CHARACTER))
4630 return false;
4631 if (!kind_value_check (path2, 1, gfc_default_character_kind))
4632 return false;
4633
4634 return true;
4635}
4636
4637
4638bool
4639gfc_check_rename_sub (gfc_expr *path1, gfc_expr *path2, gfc_expr *status)
4640{
4641 if (!type_check (path1, 0, BT_CHARACTER))
4642 return false;
4643 if (!kind_value_check (path1, 0, gfc_default_character_kind))
4644 return false;
4645
4646 if (!type_check (path2, 1, BT_CHARACTER))
4647 return false;
4648 if (!kind_value_check (path2, 1, gfc_default_character_kind))
4649 return false;
4650
4651 if (status == NULL__null)
4652 return true;
4653
4654 if (!type_check (status, 2, BT_INTEGER))
4655 return false;
4656
4657 if (!scalar_check (status, 2))
4658 return false;
4659
4660 return true;
4661}
4662
4663
4664bool
4665gfc_check_repeat (gfc_expr *x, gfc_expr *y)
4666{
4667 if (!type_check (x, 0, BT_CHARACTER))
4668 return false;
4669
4670 if (!scalar_check (x, 0))
4671 return false;
4672
4673 if (!type_check (y, 0, BT_INTEGER))
4674 return false;
4675
4676 if (!scalar_check (y, 1))
4677 return false;
4678
4679 return true;
4680}
4681
4682
4683bool
4684gfc_check_reshape (gfc_expr *source, gfc_expr *shape,
4685 gfc_expr *pad, gfc_expr *order)
4686{
4687 mpz_t size;
4688 mpz_t nelems;
4689 int shape_size;
4690 bool shape_is_const;
4691
4692 if (!array_check (source, 0))
4693 return false;
4694
4695 if (!rank_check (shape, 1, 1))
4696 return false;
4697
4698 if (!type_check (shape, 1, BT_INTEGER))
4699 return false;
4700
4701 if (!gfc_array_size (shape, &size))
4702 {
4703 gfc_error ("%<shape%> argument of %<reshape%> intrinsic at %L must be an "
4704 "array of constant size", &shape->where);
4705 return false;
4706 }
4707
4708 shape_size = mpz_get_ui__gmpz_get_ui (size);
4709 mpz_clear__gmpz_clear (size);
4710
4711 if (shape_size <= 0)
4712 {
4713 gfc_error ("%qs argument of %qs intrinsic at %L is empty",
4714 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
4715 &shape->where);
4716 return false;
4717 }
4718 else if (shape_size > GFC_MAX_DIMENSIONS15)
4719 {
4720 gfc_error ("%<shape%> argument of %<reshape%> intrinsic at %L has more "
4721 "than %d elements", &shape->where, GFC_MAX_DIMENSIONS15);
4722 return false;
4723 }
4724
4725 gfc_simplify_expr (shape, 0);
4726 shape_is_const = gfc_is_constant_expr (shape);
4727
4728 if (shape->expr_type == EXPR_ARRAY && shape_is_const)
4729 {
4730 gfc_expr *e;
4731 int i, extent;
4732 for (i = 0; i < shape_size; ++i)
4733 {
4734 e = gfc_constructor_lookup_expr (shape->value.constructor, i);
4735 if (e->expr_type != EXPR_CONSTANT)
4736 continue;
4737
4738 gfc_extract_int (e, &extent);
4739 if (extent < 0)
4740 {
4741 gfc_error ("%qs argument of %qs intrinsic at %L has "
4742 "negative element (%d)",
4743 gfc_current_intrinsic_arg[1]->name,
4744 gfc_current_intrinsic, &shape->where, extent);
4745 return false;
4746 }
4747 }
4748 }
4749
4750 if (pad != NULL__null)
4751 {
4752 if (!same_type_check (source, 0, pad, 2))
4753 return false;
4754
4755 if (!array_check (pad, 2))
4756 return false;
4757 }
4758
4759 if (order != NULL__null)
4760 {
4761 if (!array_check (order, 3))
4762 return false;
4763
4764 if (!type_check (order, 3, BT_INTEGER))
4765 return false;
4766
4767 if (order->expr_type == EXPR_ARRAY && gfc_is_constant_expr (order))
4768 {
4769 int i, order_size, dim, perm[GFC_MAX_DIMENSIONS15];
4770 gfc_expr *e;
4771
4772 for (i = 0; i < GFC_MAX_DIMENSIONS15; ++i)
4773 perm[i] = 0;
4774
4775 gfc_array_size (order, &size);
4776 order_size = mpz_get_ui__gmpz_get_ui (size);
4777 mpz_clear__gmpz_clear (size);
4778
4779 if (order_size != shape_size)
4780 {
4781 gfc_error ("%qs argument of %qs intrinsic at %L "
4782 "has wrong number of elements (%d/%d)",
4783 gfc_current_intrinsic_arg[3]->name,
4784 gfc_current_intrinsic, &order->where,
4785 order_size, shape_size);
4786 return false;
4787 }
4788
4789 for (i = 1; i <= order_size; ++i)
4790 {
4791 e = gfc_constructor_lookup_expr (order->value.constructor, i-1);
4792 if (e->expr_type != EXPR_CONSTANT)
4793 continue;
4794
4795 gfc_extract_int (e, &dim);
4796
4797 if (dim < 1 || dim > order_size)
4798 {
4799 gfc_error ("%qs argument of %qs intrinsic at %L "
4800 "has out-of-range dimension (%d)",
4801 gfc_current_intrinsic_arg[3]->name,
4802 gfc_current_intrinsic, &e->where, dim);
4803 return false;
4804 }
4805
4806 if (perm[dim-1] != 0)
4807 {
4808 gfc_error ("%qs argument of %qs intrinsic at %L has "
4809 "invalid permutation of dimensions (dimension "
4810 "%qd duplicated)",
4811 gfc_current_intrinsic_arg[3]->name,
4812 gfc_current_intrinsic, &e->where, dim);
4813 return false;
4814 }
4815
4816 perm[dim-1] = 1;
4817 }
4818 }
4819 }
4820
4821 if (pad == NULL__null && shape->expr_type == EXPR_ARRAY && shape_is_const
4822 && !(source->expr_type == EXPR_VARIABLE && source->symtree->n.sym->as
4823 && source->symtree->n.sym->as->type == AS_ASSUMED_SIZE))
4824 {
4825 /* Check the match in size between source and destination. */
4826 if (gfc_array_size (source, &nelems))
4827 {
4828 gfc_constructor *c;
4829 bool test;
4830
4831
4832 mpz_init_set_ui__gmpz_init_set_ui (size, 1);
4833 for (c = gfc_constructor_first (shape->value.constructor);
4834 c; c = gfc_constructor_next (c))
4835 mpz_mul__gmpz_mul (size, size, c->expr->value.integer);
4836
4837 test = mpz_cmp__gmpz_cmp (nelems, size) < 0 && mpz_cmp_ui (size, 0)(__builtin_constant_p (0) && (0) == 0 ? ((size)->_mp_size
< 0 ? -1 : (size)->_mp_size > 0) : __gmpz_cmp_ui (size
,0))
> 0;
4838 mpz_clear__gmpz_clear (nelems);
4839 mpz_clear__gmpz_clear (size);
4840
4841 if (test)
4842 {
4843 gfc_error ("Without padding, there are not enough elements "
4844 "in the intrinsic RESHAPE source at %L to match "
4845 "the shape", &source->where);
4846 return false;
4847 }
4848 }
4849 }
4850
4851 return true;
4852}
4853
4854
4855bool
4856gfc_check_same_type_as (gfc_expr *a, gfc_expr *b)
4857{
4858 if (a->ts.type != BT_DERIVED && a->ts.type != BT_CLASS)
4859 {
4860 gfc_error ("%qs argument of %qs intrinsic at %L "
4861 "cannot be of type %s",
4862 gfc_current_intrinsic_arg[0]->name,
4863 gfc_current_intrinsic,
4864 &a->where, gfc_typename (a));
4865 return false;
4866 }
4867
4868 if (!(gfc_type_is_extensible (a->ts.u.derived) || UNLIMITED_POLY (a)(a != __null && a->ts.type == BT_CLASS && a
->ts.u.derived->components && a->ts.u.derived
->components->ts.u.derived && a->ts.u.derived
->components->ts.u.derived->attr.unlimited_polymorphic
)
))
4869 {
4870 gfc_error ("%qs argument of %qs intrinsic at %L "
4871 "must be of an extensible type",
4872 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
4873 &a->where);
4874 return false;
4875 }
4876
4877 if (b->ts.type != BT_DERIVED && b->ts.type != BT_CLASS)
4878 {
4879 gfc_error ("%qs argument of %qs intrinsic at %L "
4880 "cannot be of type %s",
4881 gfc_current_intrinsic_arg[0]->name,
4882 gfc_current_intrinsic,
4883 &b->where, gfc_typename (b));
4884 return false;
4885 }
4886
4887 if (!(gfc_type_is_extensible (b->ts.u.derived) || UNLIMITED_POLY (b)(b != __null && b->ts.type == BT_CLASS && b
->ts.u.derived->components && b->ts.u.derived
->components->ts.u.derived && b->ts.u.derived
->components->ts.u.derived->attr.unlimited_polymorphic
)
))
4888 {
4889 gfc_error ("%qs argument of %qs intrinsic at %L "
4890 "must be of an extensible type",
4891 gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
4892 &b->where);
4893 return false;
4894 }
4895
4896 return true;
4897}
4898
4899
4900bool
4901gfc_check_scale (gfc_expr *x, gfc_expr *i)
4902{
4903 if (!type_check (x, 0, BT_REAL))
4904 return false;
4905
4906 if (!type_check (i, 1, BT_INTEGER))
4907 return false;
4908
4909 return true;
4910}
4911
4912
4913bool
4914gfc_check_scan (gfc_expr *x, gfc_expr *y, gfc_expr *z, gfc_expr *kind)
4915{
4916 if (!type_check (x, 0, BT_CHARACTER))
4917 return false;
4918
4919 if (!type_check (y, 1, BT_CHARACTER))
4920 return false;
4921
4922 if (z != NULL__null && !type_check (z, 2, BT_LOGICAL))
4923 return false;
4924
4925 if (!kind_check (kind, 3, BT_INTEGER))
4926 return false;
4927 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
4928 "with KIND argument at %L",
4929 gfc_current_intrinsic, &kind->where))
4930 return false;
4931
4932 if (!same_type_check (x, 0, y, 1))
4933 return false;
4934
4935 return true;
4936}
4937
4938
4939bool
4940gfc_check_secnds (gfc_expr *r)
4941{
4942 if (!type_check (r, 0, BT_REAL))
4943 return false;
4944
4945 if (!kind_value_check (r, 0, 4))
4946 return false;
4947
4948 if (!scalar_check (r, 0))
4949 return false;
4950
4951 return true;
4952}
4953
4954
4955bool
4956gfc_check_selected_char_kind (gfc_expr *name)
4957{
4958 if (!type_check (name, 0, BT_CHARACTER))
4959 return false;
4960
4961 if (!kind_value_check (name, 0, gfc_default_character_kind))
4962 return false;
4963
4964 if (!scalar_check (name, 0))
4965 return false;
4966
4967 return true;
4968}
4969
4970
4971bool
4972gfc_check_selected_int_kind (gfc_expr *r)
4973{
4974 if (!type_check (r, 0, BT_INTEGER))
4975 return false;
4976
4977 if (!scalar_check (r, 0))
4978 return false;
4979
4980 return true;
4981}
4982
4983
4984bool
4985gfc_check_selected_real_kind (gfc_expr *p, gfc_expr *r, gfc_expr *radix)
4986{
4987 if (p == NULL__null && r == NULL__null
4988 && !gfc_notify_std (GFC_STD_F2008(1<<7), "SELECTED_REAL_KIND with"
4989 " neither %<P%> nor %<R%> argument at %L",
4990 gfc_current_intrinsic_where))
4991 return false;
4992
4993 if (p)
4994 {
4995 if (!type_check (p, 0, BT_INTEGER))
4996 return false;
4997
4998 if (!scalar_check (p, 0))
4999 return false;
5000 }
5001
5002 if (r)
5003 {
5004 if (!type_check (r, 1, BT_INTEGER))
5005 return false;
5006
5007 if (!scalar_check (r, 1))
5008 return false;
5009 }
5010
5011 if (radix)
5012 {
5013 if (!type_check (radix, 1, BT_INTEGER))
5014 return false;
5015
5016 if (!scalar_check (radix, 1))
5017 return false;
5018
5019 if (!gfc_notify_std (GFC_STD_F2008(1<<7), "%qs intrinsic with "
5020 "RADIX argument at %L", gfc_current_intrinsic,
5021 &radix->where))
5022 return false;
5023 }
5024
5025 return true;
5026}
5027
5028
5029bool
5030gfc_check_set_exponent (gfc_expr *x, gfc_expr *i)
5031{
5032 if (!type_check (x, 0, BT_REAL))
5033 return false;
5034
5035 if (!type_check (i, 1, BT_INTEGER))
5036 return false;
5037
5038 return true;
5039}
5040
5041
5042bool
5043gfc_check_shape (gfc_expr *source, gfc_expr *kind)
5044{
5045 gfc_array_ref *ar;
5046
5047 if (gfc_invalid_null_arg (source))
5048 return false;
5049
5050 if (!kind_check (kind, 1, BT_INTEGER))
5051 return false;
5052 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
5053 "with KIND argument at %L",
5054 gfc_current_intrinsic, &kind->where))
5055 return false;
5056
5057 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
5058 return true;
5059
5060 if (source->ref == NULL__null)
5061 return false;
5062
5063 ar = gfc_find_array_ref (source);
5064
5065 if (ar->as && ar->as->type == AS_ASSUMED_SIZE && ar->type == AR_FULL)
5066 {
5067 gfc_error ("%<source%> argument of %<shape%> intrinsic at %L must not be "
5068 "an assumed size array", &source->where);
5069 return false;
5070 }
5071
5072 return true;
5073}
5074
5075
5076bool
5077gfc_check_shift (gfc_expr *i, gfc_expr *shift)
5078{
5079 if (!type_check (i, 0, BT_INTEGER))
5080 return false;
5081
5082 if (!type_check (shift, 0, BT_INTEGER))
5083 return false;
5084
5085 if (!nonnegative_check ("SHIFT", shift))
5086 return false;
5087
5088 if (!less_than_bitsize1 ("I", i, "SHIFT", shift, true))
5089 return false;
5090
5091 return true;
5092}
5093
5094
5095bool
5096gfc_check_sign (gfc_expr *a, gfc_expr *b)
5097{
5098 if (!int_or_real_check (a, 0))
5099 return false;
5100
5101 if (!same_type_check (a, 0, b, 1))
5102 return false;
5103
5104 return true;
5105}
5106
5107
5108bool
5109gfc_check_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5110{
5111 if (!array_check (array, 0))
5112 return false;
5113
5114 if (!dim_check (dim, 1, true))
5115 return false;
5116
5117 if (!dim_rank_check (dim, array, 0))
5118 return false;
5119
5120 if (!kind_check (kind, 2, BT_INTEGER))
5121 return false;
5122 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
5123 "with KIND argument at %L",
5124 gfc_current_intrinsic, &kind->where))
5125 return false;
5126
5127
5128 return true;
5129}
5130
5131
5132bool
5133gfc_check_sizeof (gfc_expr *arg)
5134{
5135 if (gfc_invalid_null_arg (arg))
5136 return false;
5137
5138 if (arg->ts.type == BT_PROCEDURE)
5139 {
5140 gfc_error ("%qs argument of %qs intrinsic at %L shall not be a procedure",
5141 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
5142 &arg->where);
5143 return false;
5144 }
5145
5146 if (illegal_boz_arg (arg))
5147 return false;
5148
5149 /* TYPE(*) is acceptable if and only if it uses an array descriptor. */
5150 if (arg->ts.type == BT_ASSUMED
5151 && (arg->symtree->n.sym->as == NULL__null
5152 || (arg->symtree->n.sym->as->type != AS_ASSUMED_SHAPE
5153 && arg->symtree->n.sym->as->type != AS_DEFERRED
5154 && arg->symtree->n.sym->as->type != AS_ASSUMED_RANK)))
5155 {
5156 gfc_error ("%qs argument of %qs intrinsic at %L shall not be TYPE(*)",
5157 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
5158 &arg->where);
5159 return false;
5160 }
5161
5162 if (arg->rank && arg->expr_type == EXPR_VARIABLE
5163 && arg->symtree->n.sym->as != NULL__null
5164 && arg->symtree->n.sym->as->type == AS_ASSUMED_SIZE && arg->ref
5165 && arg->ref->type == REF_ARRAY && arg->ref->u.ar.type == AR_FULL)
5166 {
5167 gfc_error ("%qs argument of %qs intrinsic at %L shall not be an "
5168 "assumed-size array", gfc_current_intrinsic_arg[0]->name,
5169 gfc_current_intrinsic, &arg->where);
5170 return false;
5171 }
5172
5173 return true;
5174}
5175
5176
5177/* Check whether an expression is interoperable. When returning false,
5178 msg is set to a string telling why the expression is not interoperable,
5179 otherwise, it is set to NULL. The msg string can be used in diagnostics.
5180 If c_loc is true, character with len > 1 are allowed (cf. Fortran
5181 2003corr5); additionally, assumed-shape/assumed-rank/deferred-shape
5182 arrays are permitted. And if c_f_ptr is true, deferred-shape arrays
5183 are permitted. */
5184
5185static bool
5186is_c_interoperable (gfc_expr *expr, const char **msg, bool c_loc, bool c_f_ptr)
5187{
5188 *msg = NULL__null;
5189
5190 if (expr->expr_type == EXPR_NULL)
5191 {
5192 *msg = "NULL() is not interoperable";
5193 return false;
5194 }
5195
5196 if (expr->ts.type == BT_BOZ)
5197 {
5198 *msg = "BOZ literal constant";
5199 return false;
5200 }
5201
5202 if (expr->ts.type == BT_CLASS)
5203 {
5204 *msg = "Expression is polymorphic";
5205 return false;
5206 }
5207
5208 if (expr->ts.type == BT_DERIVED && !expr->ts.u.derived->attr.is_bind_c
5209 && !expr->ts.u.derived->ts.is_iso_c)
5210 {
5211 *msg = "Expression is a noninteroperable derived type";
5212 return false;
5213 }
5214
5215 if (expr->ts.type == BT_PROCEDURE)
5216 {
5217 *msg = "Procedure unexpected as argument";
5218 return false;
5219 }
5220
5221 if (gfc_notification_std (GFC_STD_GNU(1<<5)) && expr->ts.type == BT_LOGICAL)
5222 {
5223 int i;
5224 for (i = 0; gfc_logical_kinds[i].kind; i++)
5225 if (gfc_logical_kinds[i].kind == expr->ts.kind)
5226 return true;
5227 *msg = "Extension to use a non-C_Bool-kind LOGICAL";
5228 return false;
5229 }
5230
5231 if (gfc_notification_std (GFC_STD_GNU(1<<5)) && expr->ts.type == BT_CHARACTER
5232 && expr->ts.kind != 1)
5233 {
5234 *msg = "Extension to use a non-C_CHAR-kind CHARACTER";
5235 return false;
5236 }
5237
5238 if (expr->ts.type == BT_CHARACTER) {
5239 if (expr->ts.deferred)
5240 {
5241 /* TS 29113 allows deferred-length strings as dummy arguments,
5242 but it is not an interoperable type. */
5243 *msg = "Expression shall not be a deferred-length string";
5244 return false;
5245 }
5246
5247 if (expr->ts.u.cl && expr->ts.u.cl->length
5248 && !gfc_simplify_expr (expr->ts.u.cl->length, 0))
5249 gfc_internal_error ("is_c_interoperable(): gfc_simplify_expr failed");
5250
5251 if (!c_loc && expr->ts.u.cl
5252 && (!expr->ts.u.cl->length
5253 || expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
5254 || mpz_cmp_si (expr->ts.u.cl->length->value.integer, 1)(__builtin_constant_p ((1) >= 0) && (1) >= 0 ? (
__builtin_constant_p ((static_cast<unsigned long> (1)))
&& ((static_cast<unsigned long> (1))) == 0 ? (
(expr->ts.u.cl->length->value.integer)->_mp_size <
0 ? -1 : (expr->ts.u.cl->length->value.integer)->
_mp_size > 0) : __gmpz_cmp_ui (expr->ts.u.cl->length
->value.integer,(static_cast<unsigned long> (1)))) :
__gmpz_cmp_si (expr->ts.u.cl->length->value.integer
,1))
!= 0))
5255 {
5256 *msg = "Type shall have a character length of 1";
5257 return false;
5258 }
5259 }
5260
5261 /* Note: The following checks are about interoperatable variables, Fortran
5262 15.3.5/15.3.6. In intrinsics like C_LOC or in procedure interface, more
5263 is allowed, e.g. assumed-shape arrays with TS 29113. */
5264
5265 if (gfc_is_coarray (expr))
5266 {
5267 *msg = "Coarrays are not interoperable";
5268 return false;
5269 }
5270
5271 if (!c_loc && expr->rank > 0 && expr->expr_type != EXPR_ARRAY)
5272 {
5273 gfc_array_ref *ar = gfc_find_array_ref (expr);
5274 if (ar->type != AR_FULL)
5275 {
5276 *msg = "Only whole-arrays are interoperable";
5277 return false;
5278 }
5279 if (!c_f_ptr && ar->as->type != AS_EXPLICIT
5280 && ar->as->type != AS_ASSUMED_SIZE)
5281 {
5282 *msg = "Only explicit-size and assumed-size arrays are interoperable";
5283 return false;
5284 }
5285 }
5286
5287 return true;
5288}
5289
5290
5291bool
5292gfc_check_c_sizeof (gfc_expr *arg)
5293{
5294 const char *msg;
5295
5296 if (!is_c_interoperable (arg, &msg, false, false))
5297 {
5298 gfc_error ("%qs argument of %qs intrinsic at %L must be an "
5299 "interoperable data entity: %s",
5300 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
5301 &arg->where, msg);
5302 return false;
5303 }
5304
5305 if (arg->ts.type == BT_ASSUMED)
5306 {
5307 gfc_error ("%qs argument of %qs intrinsic at %L shall not be "
5308 "TYPE(*)",
5309 gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
5310 &arg->where);
5311 return false;
5312 }
5313
5314 if (arg->rank && arg->expr_type == EXPR_VARIABLE
5315 && arg->symtree->n.sym->as != NULL__null
5316 && arg->symtree->n.sym->as->type == AS_ASSUMED_SIZE && arg->ref
5317 && arg->ref->type == REF_ARRAY && arg->ref->u.ar.type == AR_FULL)
5318 {
5319 gfc_error ("%qs argument of %qs intrinsic at %L shall not be an "
5320 "assumed-size array", gfc_current_intrinsic_arg[0]->name,
5321 gfc_current_intrinsic, &arg->where);
5322 return false;
5323 }
5324
5325 return true;
5326}
5327
5328
5329bool
5330gfc_check_c_associated (gfc_expr *c_ptr_1, gfc_expr *c_ptr_2)
5331{
5332 if (c_ptr_1->ts.type != BT_DERIVED
5333 || c_ptr_1->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
5334 || (c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR
5335 && c_ptr_1->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR))
5336 {
5337 gfc_error ("Argument C_PTR_1 at %L to C_ASSOCIATED shall have the "
5338 "type TYPE(C_PTR) or TYPE(C_FUNPTR)", &c_ptr_1->where);
5339 return false;
5340 }
5341
5342 if (!scalar_check (c_ptr_1, 0))
5343 return false;
5344
5345 if (c_ptr_2
5346 && (c_ptr_2->ts.type != BT_DERIVED
5347 || c_ptr_2->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
5348 || (c_ptr_1->ts.u.derived->intmod_sym_id
5349 != c_ptr_2->ts.u.derived->intmod_sym_id)))
5350 {
5351 gfc_error ("Argument C_PTR_2 at %L to C_ASSOCIATED shall have the "
5352 "same type as C_PTR_1: %s instead of %s", &c_ptr_1->where,
5353 gfc_typename (&c_ptr_1->ts),
5354 gfc_typename (&c_ptr_2->ts));
5355 return false;
5356 }
5357
5358 if (c_ptr_2 && !scalar_check (c_ptr_2, 1))
5359 return false;
5360
5361 return true;
5362}
5363
5364
5365bool
5366gfc_check_c_f_pointer (gfc_expr *cptr, gfc_expr *fptr, gfc_expr *shape)
5367{
5368 symbol_attribute attr;
5369 const char *msg;
5370
5371 if (cptr->ts.type != BT_DERIVED
5372 || cptr->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
5373 || cptr->ts.u.derived->intmod_sym_id != ISOCBINDING_PTR)
5374 {
5375 gfc_error ("Argument CPTR at %L to C_F_POINTER shall have the "
5376 "type TYPE(C_PTR)", &cptr->where);
5377 return false;
5378 }
5379
5380 if (!scalar_check (cptr, 0))
5381 return false;
5382
5383 attr = gfc_expr_attr (fptr);
5384
5385 if (!attr.pointer)
5386 {
5387 gfc_error ("Argument FPTR at %L to C_F_POINTER must be a pointer",
5388 &fptr->where);
5389 return false;
5390 }
5391
5392 if (fptr->ts.type == BT_CLASS)
5393 {
5394 gfc_error ("FPTR argument at %L to C_F_POINTER shall not be polymorphic",
5395 &fptr->where);
5396 return false;
5397 }
5398
5399 if (gfc_is_coindexed (fptr))
5400 {
5401 gfc_error ("Argument FPTR at %L to C_F_POINTER shall not be "
5402 "coindexed", &fptr->where);
5403 return false;
5404 }
5405
5406 if (fptr->rank == 0 && shape)
5407 {
5408 gfc_error ("Unexpected SHAPE argument at %L to C_F_POINTER with scalar "
5409 "FPTR", &fptr->where);
5410 return false;
5411 }
5412 else if (fptr->rank && !shape)
5413 {
5414 gfc_error ("Expected SHAPE argument to C_F_POINTER with array "
5415 "FPTR at %L", &fptr->where);
5416 return false;
5417 }
5418
5419 if (shape && !rank_check (shape, 2, 1))
5420 return false;
5421
5422 if (shape && !type_check (shape, 2, BT_INTEGER))
5423 return false;
5424
5425 if (shape)
5426 {
5427 mpz_t size;
5428 if (gfc_array_size (shape, &size))
5429 {
5430 if (mpz_cmp_ui (size, fptr->rank)(__builtin_constant_p (fptr->rank) && (fptr->rank
) == 0 ? ((size)->_mp_size < 0 ? -1 : (size)->_mp_size
> 0) : __gmpz_cmp_ui (size,fptr->rank))
!= 0)
5431 {
5432 mpz_clear__gmpz_clear (size);
5433 gfc_error ("SHAPE argument at %L to C_F_POINTER must have the same "
5434 "size as the RANK of FPTR", &shape->where);
5435 return false;
5436 }
5437 mpz_clear__gmpz_clear (size);
5438 }
5439 }
5440
5441 if (fptr->ts.type == BT_CLASS)
5442 {
5443 gfc_error ("Polymorphic FPTR at %L to C_F_POINTER", &fptr->where);
5444 return false;
5445 }
5446
5447 if (fptr->rank > 0 && !is_c_interoperable (fptr, &msg, false, true))
5448 return gfc_notify_std (GFC_STD_F2018(1<<9), "Noninteroperable array FPTR "
5449 "at %L to C_F_POINTER: %s", &fptr->where, msg);
5450
5451 return true;
5452}
5453
5454
5455bool
5456gfc_check_c_f_procpointer (gfc_expr *cptr, gfc_expr *fptr)
5457{
5458 symbol_attribute attr;
5459
5460 if (cptr->ts.type != BT_DERIVED
5461 || cptr->ts.u.derived->from_intmod != INTMOD_ISO_C_BINDING
5462 || cptr->ts.u.derived->intmod_sym_id != ISOCBINDING_FUNPTR)
5463 {
5464 gfc_error ("Argument CPTR at %L to C_F_PROCPOINTER shall have the "
5465 "type TYPE(C_FUNPTR)", &cptr->where);
5466 return false;
5467 }
5468
5469 if (!scalar_check (cptr, 0))
5470 return false;
5471
5472 attr = gfc_expr_attr (fptr);
5473
5474 if (!attr.proc_pointer)
5475 {
5476 gfc_error ("Argument FPTR at %L to C_F_PROCPOINTER shall be a procedure "
5477 "pointer", &fptr->where);
5478 return false;
5479 }
5480
5481 if (gfc_is_coindexed (fptr))
5482 {
5483 gfc_error ("Argument FPTR at %L to C_F_PROCPOINTER shall not be "
5484 "coindexed", &fptr->where);
5485 return false;
5486 }
5487
5488 if (!attr.is_bind_c)
5489 return gfc_notify_std (GFC_STD_F2018(1<<9), "Noninteroperable procedure "
5490 "pointer at %L to C_F_PROCPOINTER", &fptr->where);
5491
5492 return true;
5493}
5494
5495
5496bool
5497gfc_check_c_funloc (gfc_expr *x)
5498{
5499 symbol_attribute attr;
5500
5501 if (gfc_is_coindexed (x))
5502 {
5503 gfc_error ("Argument X at %L to C_FUNLOC shall not be "
5504 "coindexed", &x->where);
5505 return false;
5506 }
5507
5508 attr = gfc_expr_attr (x);
5509
5510 if (attr.function && !attr.proc_pointer && x->expr_type == EXPR_VARIABLE
5511 && x->symtree->n.sym == x->symtree->n.sym->result)
5512 for (gfc_namespace *ns = gfc_current_ns; ns; ns = ns->parent)
5513 if (x->symtree->n.sym == ns->proc_name)
5514 {
5515 gfc_error ("Function result %qs at %L is invalid as X argument "
5516 "to C_FUNLOC", x->symtree->n.sym->name, &x->where);
5517 return false;
5518 }
5519
5520 if (attr.flavor != FL_PROCEDURE)
5521 {
5522 gfc_error ("Argument X at %L to C_FUNLOC shall be a procedure "
5523 "or a procedure pointer", &x->where);
5524 return false;
5525 }
5526
5527 if (!attr.is_bind_c)
5528 return gfc_notify_std (GFC_STD_F2018(1<<9), "Noninteroperable procedure "
5529 "at %L to C_FUNLOC", &x->where);
5530 return true;
5531}
5532
5533
5534bool
5535gfc_check_c_loc (gfc_expr *x)
5536{
5537 symbol_attribute attr;
5538 const char *msg;
5539
5540 if (gfc_is_coindexed (x))
5541 {
5542 gfc_error ("Argument X at %L to C_LOC shall not be coindexed", &x->where);
5543 return false;
5544 }
5545
5546 if (x->ts.type == BT_CLASS)
5547 {
5548 gfc_error ("X argument at %L to C_LOC shall not be polymorphic",
5549 &x->where);
5550 return false;
5551 }
5552
5553 attr = gfc_expr_attr (x);
5554
5555 if (!attr.pointer
5556 && (x->expr_type != EXPR_VARIABLE || !attr.target
5557 || attr.flavor == FL_PARAMETER))
5558 {
5559 gfc_error ("Argument X at %L to C_LOC shall have either "
5560 "the POINTER or the TARGET attribute", &x->where);
5561 return false;
5562 }
5563
5564 if (x->ts.type == BT_CHARACTER
5565 && gfc_var_strlen (x) == 0)
5566 {
5567 gfc_error ("Argument X at %L to C_LOC shall be not be a zero-sized "
5568 "string", &x->where);
5569 return false;
5570 }
5571
5572 if (!is_c_interoperable (x, &msg, true, false))
5573 {
5574 if (x->ts.type == BT_CLASS)
5575 {
5576 gfc_error ("Argument at %L to C_LOC shall not be polymorphic",
5577 &x->where);
5578 return false;
5579 }
5580
5581 if (x->rank
5582 && !gfc_notify_std (GFC_STD_F2018(1<<9),
5583 "Noninteroperable array at %L as"
5584 " argument to C_LOC: %s", &x->where, msg))
5585 return false;
5586 }
5587 else if (x->rank > 0 && gfc_notification_std (GFC_STD_F2008(1<<7)))
5588 {
5589 gfc_array_ref *ar = gfc_find_array_ref (x);
5590
5591 if (ar->as->type != AS_EXPLICIT && ar->as->type != AS_ASSUMED_SIZE
5592 && !attr.allocatable
5593 && !gfc_notify_std (GFC_STD_F2008(1<<7),
5594 "Array of interoperable type at %L "
5595 "to C_LOC which is nonallocatable and neither "
5596 "assumed size nor explicit size", &x->where))
5597 return false;
5598 else if (ar->type != AR_FULL
5599 && !gfc_notify_std (GFC_STD_F2008(1<<7), "Array section at %L "
5600 "to C_LOC", &x->where))
5601 return false;
5602 }
5603
5604 return true;
5605}
5606
5607
5608bool
5609gfc_check_sleep_sub (gfc_expr *seconds)
5610{
5611 if (!type_check (seconds, 0, BT_INTEGER))
5612 return false;
5613
5614 if (!scalar_check (seconds, 0))
5615 return false;
5616
5617 return true;
5618}
5619
5620bool
5621gfc_check_sngl (gfc_expr *a)
5622{
5623 if (!type_check (a, 0, BT_REAL))
5624 return false;
5625
5626 if ((a->ts.kind != gfc_default_double_kind)
5627 && !gfc_notify_std (GFC_STD_GNU(1<<5), "non double precision "
5628 "REAL argument to %s intrinsic at %L",
5629 gfc_current_intrinsic, &a->where))
5630 return false;
5631
5632 return true;
5633}
5634
5635bool
5636gfc_check_spread (gfc_expr *source, gfc_expr *dim, gfc_expr *ncopies)
5637{
5638 if (gfc_invalid_null_arg (source))
5639 return false;
5640
5641 if (source->rank >= GFC_MAX_DIMENSIONS15)
5642 {
5643 gfc_error ("%qs argument of %qs intrinsic at %L must be less "
5644 "than rank %d", gfc_current_intrinsic_arg[0]->name,
5645 gfc_current_intrinsic, &source->where, GFC_MAX_DIMENSIONS15);
5646
5647 return false;
5648 }
5649
5650 if (dim == NULL__null)
5651 return false;
5652
5653 if (!dim_check (dim, 1, false))
5654 return false;
5655
5656 /* dim_rank_check() does not apply here. */
5657 if (dim
5658 && dim->expr_type == EXPR_CONSTANT
5659 && (mpz_cmp_ui (dim->value.integer, 1)(__builtin_constant_p (1) && (1) == 0 ? ((dim->value
.integer)->_mp_size < 0 ? -1 : (dim->value.integer)->
_mp_size > 0) : __gmpz_cmp_ui (dim->value.integer,1))
< 0
5660 || mpz_cmp_ui (dim->value.integer, source->rank + 1)(__builtin_constant_p (source->rank + 1) && (source
->rank + 1) == 0 ? ((dim->value.integer)->_mp_size <
0 ? -1 : (dim->value.integer)->_mp_size > 0) : __gmpz_cmp_ui
(dim->value.integer,source->rank + 1))
> 0))
5661 {
5662 gfc_error ("%qs argument of %qs intrinsic at %L is not a valid "
5663 "dimension index", gfc_current_intrinsic_arg[1]->name,
5664 gfc_current_intrinsic, &dim->where);
5665 return false;
5666 }
5667
5668 if (!type_check (ncopies, 2, BT_INTEGER))
5669 return false;
5670
5671 if (!scalar_check (ncopies, 2))
5672 return false;
5673
5674 return true;
5675}
5676
5677
5678/* Functions for checking FGETC, FPUTC, FGET and FPUT (subroutines and
5679 functions). */
5680
5681bool
5682arg_strlen_is_zero (gfc_expr *c, int n)
5683{
5684 if (gfc_var_strlen (c) == 0)
5685 {
5686 gfc_error ("%qs argument of %qs intrinsic at %L must have "
5687 "length at least 1", gfc_current_intrinsic_arg[n]->name,
5688 gfc_current_intrinsic, &c->where);
5689 return true;
5690 }
5691 return false;
5692}
5693
5694bool
5695gfc_check_fgetputc_sub (gfc_expr *unit, gfc_expr *c, gfc_expr *status)
5696{
5697 if (!type_check (unit, 0, BT_INTEGER))
5698 return false;
5699
5700 if (!scalar_check (unit, 0))
5701 return false;
5702
5703 if (!type_check (c, 1, BT_CHARACTER))
5704 return false;
5705 if (!kind_value_check (c, 1, gfc_default_character_kind))
5706 return false;
5707 if (strcmp (gfc_current_intrinsic, "fgetc") == 0
5708 && !variable_check (c, 1, false))
5709 return false;
5710 if (arg_strlen_is_zero (c, 1))
5711 return false;
5712
5713 if (status == NULL__null)
5714 return true;
5715
5716 if (!type_check (status, 2, BT_INTEGER)
5717 || !kind_value_check (status, 2, gfc_default_integer_kind)
5718 || !scalar_check (status, 2)
5719 || !variable_check (status, 2, false))
5720 return false;
5721
5722 return true;
5723}
5724
5725
5726bool
5727gfc_check_fgetputc (gfc_expr *unit, gfc_expr *c)
5728{
5729 return gfc_check_fgetputc_sub (unit, c, NULL__null);
5730}
5731
5732
5733bool
5734gfc_check_fgetput_sub (gfc_expr *c, gfc_expr *status)
5735{
5736 if (!type_check (c, 0, BT_CHARACTER))
5737 return false;
5738 if (!kind_value_check (c, 0, gfc_default_character_kind))
5739 return false;
5740 if (strcmp (gfc_current_intrinsic, "fget") == 0
5741 && !variable_check (c, 0, false))
5742 return false;
5743 if (arg_strlen_is_zero (c, 0))
5744 return false;
5745
5746 if (status == NULL__null)
5747 return true;
5748
5749 if (!type_check (status, 1, BT_INTEGER)
5750 || !kind_value_check (status, 1, gfc_default_integer_kind)
5751 || !scalar_check (status, 1)
5752 || !variable_check (status, 1, false))
5753 return false;
5754
5755 return true;
5756}
5757
5758
5759bool
5760gfc_check_fgetput (gfc_expr *c)
5761{
5762 return gfc_check_fgetput_sub (c, NULL__null);
5763}
5764
5765
5766bool
5767gfc_check_fseek_sub (gfc_expr *unit, gfc_expr *offset, gfc_expr *whence, gfc_expr *status)
5768{
5769 if (!type_check (unit, 0, BT_INTEGER))
5770 return false;
5771
5772 if (!scalar_check (unit, 0))
5773 return false;
5774
5775 if (!type_check (offset, 1, BT_INTEGER))
5776 return false;
5777
5778 if (!scalar_check (offset, 1))
5779 return false;
5780
5781 if (!type_check (whence, 2, BT_INTEGER))
5782 return false;
5783
5784 if (!scalar_check (whence, 2))
5785 return false;
5786
5787 if (status == NULL__null)
5788 return true;
5789
5790 if (!type_check (status, 3, BT_INTEGER))
5791 return false;
5792
5793 if (!kind_value_check (status, 3, 4))
5794 return false;
5795
5796 if (!scalar_check (status, 3))
5797 return false;
5798
5799 return true;
5800}
5801
5802
5803
5804bool
5805gfc_check_fstat (gfc_expr *unit, gfc_expr *array)
5806{
5807 if (!type_check (unit, 0, BT_INTEGER))
5808 return false;
5809
5810 if (!scalar_check (unit, 0))
5811 return false;
5812
5813 if (!type_check (array, 1, BT_INTEGER)
5814 || !kind_value_check (unit, 0, gfc_default_integer_kind))
5815 return false;
5816
5817 if (!array_check (array, 1))
5818 return false;
5819
5820 return true;
5821}
5822
5823
5824bool
5825gfc_check_fstat_sub (gfc_expr *unit, gfc_expr *array, gfc_expr *status)
5826{
5827 if (!type_check (unit, 0, BT_INTEGER))
5828 return false;
5829
5830 if (!scalar_check (unit, 0))
5831 return false;
5832
5833 if (!type_check (array, 1, BT_INTEGER)
5834 || !kind_value_check (array, 1, gfc_default_integer_kind))
5835 return false;
5836
5837 if (!array_check (array, 1))
5838 return false;
5839
5840 if (status == NULL__null)
5841 return true;
5842
5843 if (!type_check (status, 2, BT_INTEGER)
5844 || !kind_value_check (status, 2, gfc_default_integer_kind))
5845 return false;
5846
5847 if (!scalar_check (status, 2))
5848 return false;
5849
5850 return true;
5851}
5852
5853
5854bool
5855gfc_check_ftell (gfc_expr *unit)
5856{
5857 if (!type_check (unit, 0, BT_INTEGER))
5858 return false;
5859
5860 if (!scalar_check (unit, 0))
5861 return false;
5862
5863 return true;
5864}
5865
5866
5867bool
5868gfc_check_ftell_sub (gfc_expr *unit, gfc_expr *offset)
5869{
5870 if (!type_check (unit, 0, BT_INTEGER))
5871 return false;
5872
5873 if (!scalar_check (unit, 0))
5874 return false;
5875
5876 if (!type_check (offset, 1, BT_INTEGER))
5877 return false;
5878
5879 if (!scalar_check (offset, 1))
5880 return false;
5881
5882 return true;
5883}
5884
5885
5886bool
5887gfc_check_stat (gfc_expr *name, gfc_expr *array)
5888{
5889 if (!type_check (name, 0, BT_CHARACTER))
5890 return false;
5891 if (!kind_value_check (name, 0, gfc_default_character_kind))
5892 return false;
5893
5894 if (!type_check (array, 1, BT_INTEGER)
5895 || !kind_value_check (array, 1, gfc_default_integer_kind))
5896 return false;
5897
5898 if (!array_check (array, 1))
5899 return false;
5900
5901 return true;
5902}
5903
5904
5905bool
5906gfc_check_stat_sub (gfc_expr *name, gfc_expr *array, gfc_expr *status)
5907{
5908 if (!type_check (name, 0, BT_CHARACTER))
5909 return false;
5910 if (!kind_value_check (name, 0, gfc_default_character_kind))
5911 return false;
5912
5913 if (!type_check (array, 1, BT_INTEGER)
5914 || !kind_value_check (array, 1, gfc_default_integer_kind))
5915 return false;
5916
5917 if (!array_check (array, 1))
5918 return false;
5919
5920 if (status == NULL__null)
5921 return true;
5922
5923 if (!type_check (status, 2, BT_INTEGER)
5924 || !kind_value_check (array, 1, gfc_default_integer_kind))
5925 return false;
5926
5927 if (!scalar_check (status, 2))
5928 return false;
5929
5930 return true;
5931}
5932
5933
5934bool
5935gfc_check_image_index (gfc_expr *coarray, gfc_expr *sub)
5936{
5937 mpz_t nelems;
5938
5939 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
5940 {
5941 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5942 return false;
5943 }
5944
5945 if (!coarray_check (coarray, 0))
5946 return false;
5947
5948 if (sub->rank != 1)
5949 {
5950 gfc_error ("%s argument to IMAGE_INDEX must be a rank one array at %L",
5951 gfc_current_intrinsic_arg[1]->name, &sub->where);
5952 return false;
5953 }
5954
5955 if (sub->ts.type != BT_INTEGER)
5956 {
5957 gfc_error ("Type of %s argument of IMAGE_INDEX at %L shall be INTEGER",
5958 gfc_current_intrinsic_arg[1]->name, &sub->where);
5959 return false;
5960 }
5961
5962 if (gfc_array_size (sub, &nelems))
5963 {
5964 int corank = gfc_get_corank (coarray);
5965
5966 if (mpz_cmp_ui (nelems, corank)(__builtin_constant_p (corank) && (corank) == 0 ? ((nelems
)->_mp_size < 0 ? -1 : (nelems)->_mp_size > 0) : __gmpz_cmp_ui
(nelems,corank))
!= 0)
5967 {
5968 gfc_error ("The number of array elements of the SUB argument to "
5969 "IMAGE_INDEX at %L shall be %d (corank) not %d",
5970 &sub->where, corank, (int) mpz_get_si__gmpz_get_si (nelems));
5971 mpz_clear__gmpz_clear (nelems);
5972 return false;
5973 }
5974 mpz_clear__gmpz_clear (nelems);
5975 }
5976
5977 return true;
5978}
5979
5980
5981bool
5982gfc_check_num_images (gfc_expr *distance, gfc_expr *failed)
5983{
5984 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
5985 {
5986 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5987 return false;
5988 }
5989
5990 if (distance)
5991 {
5992 if (!type_check (distance, 0, BT_INTEGER))
5993 return false;
5994
5995 if (!nonnegative_check ("DISTANCE", distance))
5996 return false;
5997
5998 if (!scalar_check (distance, 0))
5999 return false;
6000
6001 if (!gfc_notify_std (GFC_STD_F2018(1<<9), "DISTANCE= argument to "
6002 "NUM_IMAGES at %L", &distance->where))
6003 return false;
6004 }
6005
6006 if (failed)
6007 {
6008 if (!type_check (failed, 1, BT_LOGICAL))
6009 return false;
6010
6011 if (!scalar_check (failed, 1))
6012 return false;
6013
6014 if (!gfc_notify_std (GFC_STD_F2018(1<<9), "FAILED= argument to "
6015 "NUM_IMAGES at %L", &failed->where))
6016 return false;
6017 }
6018
6019 return true;
6020}
6021
6022
6023bool
6024gfc_check_team_number (gfc_expr *team)
6025{
6026 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
6027 {
6028 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
6029 return false;
6030 }
6031
6032 if (team)
6033 {
6034 if (team->ts.type != BT_DERIVED
6035 || team->ts.u.derived->from_intmod != INTMOD_ISO_FORTRAN_ENV
6036 || team->ts.u.derived->intmod_sym_id != ISOFORTRAN_TEAM_TYPE)
6037 {
6038 gfc_error ("TEAM argument at %L to the intrinsic TEAM_NUMBER "
6039 "shall be of type TEAM_TYPE", &team->where);
6040 return false;
6041 }
6042 }
6043 else
6044 return true;
6045
6046 return true;
6047}
6048
6049
6050bool
6051gfc_check_this_image (gfc_expr *coarray, gfc_expr *dim, gfc_expr *distance)
6052{
6053 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
6054 {
6055 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
6056 return false;
6057 }
6058
6059 if (coarray == NULL__null && dim == NULL__null && distance == NULL__null)
6060 return true;
6061
6062 if (dim != NULL__null && coarray == NULL__null)
6063 {
6064 gfc_error ("DIM argument without COARRAY argument not allowed for "
6065 "THIS_IMAGE intrinsic at %L", &dim->where);
6066 return false;
6067 }
6068
6069 if (distance && (coarray || dim))
6070 {
6071 gfc_error ("The DISTANCE argument may not be specified together with the "
6072 "COARRAY or DIM argument in intrinsic at %L",
6073 &distance->where);
6074 return false;
6075 }
6076
6077 /* Assume that we have "this_image (distance)". */
6078 if (coarray && !gfc_is_coarray (coarray) && coarray->ts.type == BT_INTEGER)
6079 {
6080 if (dim)
6081 {
6082 gfc_error ("Unexpected DIM argument with noncoarray argument at %L",
6083 &coarray->where);
6084 return false;
6085 }
6086 distance = coarray;
6087 }
6088
6089 if (distance)
6090 {
6091 if (!type_check (distance, 2, BT_INTEGER))
6092 return false;
6093
6094 if (!nonnegative_check ("DISTANCE", distance))
6095 return false;
6096
6097 if (!scalar_check (distance, 2))
6098 return false;
6099
6100 if (!gfc_notify_std (GFC_STD_F2018(1<<9), "DISTANCE= argument to "
6101 "THIS_IMAGE at %L", &distance->where))
6102 return false;
6103
6104 return true;
6105 }
6106
6107 if (!coarray_check (coarray, 0))
6108 return false;
6109
6110 if (dim != NULL__null)
6111 {
6112 if (!dim_check (dim, 1, false))
6113 return false;
6114
6115 if (!dim_corank_check (dim, coarray))
6116 return false;
6117 }
6118
6119 return true;
6120}
6121
6122/* Calculate the sizes for transfer, used by gfc_check_transfer and also
6123 by gfc_simplify_transfer. Return false if we cannot do so. */
6124
6125bool
6126gfc_calculate_transfer_sizes (gfc_expr *source, gfc_expr *mold, gfc_expr *size,
6127 size_t *source_size, size_t *result_size,
6128 size_t *result_length_p)
6129{
6130 size_t result_elt_size;
6131
6132 if (source->expr_type == EXPR_FUNCTION)
6133 return false;
6134
6135 if (size && size->expr_type != EXPR_CONSTANT)
6136 return false;
6137
6138 /* Calculate the size of the source. */
6139 if (!gfc_target_expr_size (source, source_size))
6140 return false;
6141
6142 /* Determine the size of the element. */
6143 if (!gfc_element_size (mold, &result_elt_size))
6144 return false;
6145
6146 /* If the storage size of SOURCE is greater than zero and MOLD is an array,
6147 * a scalar with the type and type parameters of MOLD shall not have a
6148 * storage size equal to zero.
6149 * If MOLD is a scalar and SIZE is absent, the result is a scalar.
6150 * If MOLD is an array and SIZE is absent, the result is an array and of
6151 * rank one. Its size is as small as possible such that its physical
6152 * representation is not shorter than that of SOURCE.
6153 * If SIZE is present, the result is an array of rank one and size SIZE.
6154 */
6155 if (result_elt_size == 0 && *source_size > 0
6156 && (mold->expr_type == EXPR_ARRAY || mold->rank))
6157 {
6158 gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L is an "
6159 "array and shall not have storage size 0 when %<SOURCE%> "
6160 "argument has size greater than 0", &mold->where);
6161 return false;
6162 }
6163
6164 if (result_elt_size == 0 && *source_size == 0 && !size)
6165 {
6166 *result_size = 0;
6167 if (result_length_p)
6168 *result_length_p = 0;
6169 return true;
6170 }
6171
6172 if ((result_elt_size > 0 && (mold->expr_type == EXPR_ARRAY || mold->rank))
6173 || size)
6174 {
6175 int result_length;
6176
6177 if (size)
6178 result_length = (size_t)mpz_get_ui__gmpz_get_ui (size->value.integer);
6179 else
6180 {
6181 result_length = *source_size / result_elt_size;
6182 if (result_length * result_elt_size < *source_size)
6183 result_length += 1;
6184 }
6185
6186 *result_size = result_length * result_elt_size;
6187 if (result_length_p)
6188 *result_length_p = result_length;
6189 }
6190 else
6191 *result_size = result_elt_size;
6192
6193 return true;
6194}
6195
6196
6197bool
6198gfc_check_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6199{
6200 size_t source_size;
6201 size_t result_size;
6202
6203 if (gfc_invalid_null_arg (source))
6204 return false;
6205
6206 /* SOURCE shall be a scalar or array of any type. */
6207 if (source->ts.type == BT_PROCEDURE
6208 && source->symtree->n.sym->attr.subroutine == 1)
6209 {
6210 gfc_error ("%<SOURCE%> argument of %<TRANSFER%> intrinsic at %L "
6211 "must not be a %s", &source->where,
6212 gfc_basic_typename (source->ts.type));
6213 return false;
6214 }
6215
6216 if (source->ts.type == BT_BOZ && illegal_boz_arg (source))
6217 return false;
6218
6219 if (mold->ts.type == BT_BOZ && illegal_boz_arg (mold))
6220 return false;
6221
6222 if (gfc_invalid_null_arg (mold))
6223 return false;
6224
6225 /* MOLD shall be a scalar or array of any type. */
6226 if (mold->ts.type == BT_PROCEDURE
6227 && mold->symtree->n.sym->attr.subroutine == 1)
6228 {
6229 gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L "
6230 "must not be a %s", &mold->where,
6231 gfc_basic_typename (mold->ts.type));
6232 return false;
6233 }
6234
6235 if (mold->ts.type == BT_HOLLERITH)
6236 {
6237 gfc_error ("%<MOLD%> argument of %<TRANSFER%> intrinsic at %L must not be"
6238 " %s", &mold->where, gfc_basic_typename (BT_HOLLERITH));
6239 return false;
6240 }
6241
6242 /* SIZE (optional) shall be an integer scalar. The corresponding actual
6243 argument shall not be an optional dummy argument. */
6244 if (size != NULL__null)
6245 {
6246 if (!type_check (size, 2, BT_INTEGER))
6247 {
6248 if (size->ts.type == BT_BOZ)
6249 reset_boz (size);
6250 return false;
6251 }
6252
6253 if (!scalar_check (size, 2))
6254 return false;
6255
6256 if (!nonoptional_check (size, 2))
6257 return false;
6258 }
6259
6260 if (!warn_surprisingglobal_options.x_warn_surprising)
6261 return true;
6262
6263 /* If we can't calculate the sizes, we cannot check any more.
6264 Return true for that case. */
6265
6266 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6267 &result_size, NULL__null))
6268 return true;
6269
6270 if (source_size < result_size)
6271 gfc_warning (OPT_Wsurprising,
6272 "Intrinsic TRANSFER at %L has partly undefined result: "
6273 "source size %ld < result size %ld", &source->where,
6274 (long) source_size, (long) result_size);
6275
6276 return true;
6277}
6278
6279
6280bool
6281gfc_check_transpose (gfc_expr *matrix)
6282{
6283 if (!rank_check (matrix, 0, 2))
6284 return false;
6285
6286 return true;
6287}
6288
6289
6290bool
6291gfc_check_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6292{
6293 if (!array_check (array, 0))
6294 return false;
6295
6296 if (!dim_check (dim, 1, false))
6297 return false;
6298
6299 if (!dim_rank_check (dim, array, 0))
6300 return false;
6301
6302 if (!kind_check (kind, 2, BT_INTEGER))
6303 return false;
6304 if (kind && !gfc_notify_std (GFC_STD_F2003(1<<4), "%qs intrinsic "
6305 "with KIND argument at %L",
6306 gfc_current_intrinsic, &kind->where))
6307 return false;
6308
6309 return true;
6310}
6311
6312
6313bool
6314gfc_check_ucobound (gfc_expr *coarray, gfc_expr *dim, gfc_expr *kind)
6315{
6316 if (flag_coarrayglobal_options.x_flag_coarray == GFC_FCOARRAY_NONE)
6317 {
6318 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
6319 return false;
6320 }
6321
6322 if (!coarray_check (coarray, 0))
6323 return false;
6324
6325 if (dim != NULL__null)
6326 {
6327 if (!dim_check (dim, 1, false))
6328 return false;
6329
6330 if (!dim_corank_check (dim, coarray))
6331 return false;
6332 }
6333
6334 if (!kind_check (kind, 2, BT_INTEGER))
6335 return false;
6336
6337 return true;
6338}
6339
6340
6341