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