Home | History | Annotate | Line # | Download | only in fortran
arith.cc revision 1.1.1.1
      1  1.1  mrg /* Compiler arithmetic
      2  1.1  mrg    Copyright (C) 2000-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andy Vaught
      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 /* Since target arithmetic must be done on the host, there has to
     22  1.1  mrg    be some way of evaluating arithmetic expressions as the host
     23  1.1  mrg    would evaluate them.  We use the GNU MP library and the MPFR
     24  1.1  mrg    library to do arithmetic, and this file provides the interface.  */
     25  1.1  mrg 
     26  1.1  mrg #include "config.h"
     27  1.1  mrg #include "system.h"
     28  1.1  mrg #include "coretypes.h"
     29  1.1  mrg #include "options.h"
     30  1.1  mrg #include "gfortran.h"
     31  1.1  mrg #include "arith.h"
     32  1.1  mrg #include "target-memory.h"
     33  1.1  mrg #include "constructor.h"
     34  1.1  mrg 
     35  1.1  mrg bool gfc_seen_div0;
     36  1.1  mrg 
     37  1.1  mrg /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
     38  1.1  mrg    It's easily implemented with a few calls though.  */
     39  1.1  mrg 
     40  1.1  mrg void
     41  1.1  mrg gfc_mpfr_to_mpz (mpz_t z, mpfr_t x, locus *where)
     42  1.1  mrg {
     43  1.1  mrg   mpfr_exp_t e;
     44  1.1  mrg 
     45  1.1  mrg   if (mpfr_inf_p (x) || mpfr_nan_p (x))
     46  1.1  mrg     {
     47  1.1  mrg       gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
     48  1.1  mrg 		 "to INTEGER", where);
     49  1.1  mrg       mpz_set_ui (z, 0);
     50  1.1  mrg       return;
     51  1.1  mrg     }
     52  1.1  mrg 
     53  1.1  mrg   e = mpfr_get_z_exp (z, x);
     54  1.1  mrg 
     55  1.1  mrg   if (e > 0)
     56  1.1  mrg     mpz_mul_2exp (z, z, e);
     57  1.1  mrg   else
     58  1.1  mrg     mpz_tdiv_q_2exp (z, z, -e);
     59  1.1  mrg }
     60  1.1  mrg 
     61  1.1  mrg 
     62  1.1  mrg /* Set the model number precision by the requested KIND.  */
     63  1.1  mrg 
     64  1.1  mrg void
     65  1.1  mrg gfc_set_model_kind (int kind)
     66  1.1  mrg {
     67  1.1  mrg   int index = gfc_validate_kind (BT_REAL, kind, false);
     68  1.1  mrg   int base2prec;
     69  1.1  mrg 
     70  1.1  mrg   base2prec = gfc_real_kinds[index].digits;
     71  1.1  mrg   if (gfc_real_kinds[index].radix != 2)
     72  1.1  mrg     base2prec *= gfc_real_kinds[index].radix / 2;
     73  1.1  mrg   mpfr_set_default_prec (base2prec);
     74  1.1  mrg }
     75  1.1  mrg 
     76  1.1  mrg 
     77  1.1  mrg /* Set the model number precision from mpfr_t x.  */
     78  1.1  mrg 
     79  1.1  mrg void
     80  1.1  mrg gfc_set_model (mpfr_t x)
     81  1.1  mrg {
     82  1.1  mrg   mpfr_set_default_prec (mpfr_get_prec (x));
     83  1.1  mrg }
     84  1.1  mrg 
     85  1.1  mrg 
     86  1.1  mrg /* Given an arithmetic error code, return a pointer to a string that
     87  1.1  mrg    explains the error.  */
     88  1.1  mrg 
     89  1.1  mrg static const char *
     90  1.1  mrg gfc_arith_error (arith code)
     91  1.1  mrg {
     92  1.1  mrg   const char *p;
     93  1.1  mrg 
     94  1.1  mrg   switch (code)
     95  1.1  mrg     {
     96  1.1  mrg     case ARITH_OK:
     97  1.1  mrg       p = G_("Arithmetic OK at %L");
     98  1.1  mrg       break;
     99  1.1  mrg     case ARITH_OVERFLOW:
    100  1.1  mrg       p = G_("Arithmetic overflow at %L");
    101  1.1  mrg       break;
    102  1.1  mrg     case ARITH_UNDERFLOW:
    103  1.1  mrg       p = G_("Arithmetic underflow at %L");
    104  1.1  mrg       break;
    105  1.1  mrg     case ARITH_NAN:
    106  1.1  mrg       p = G_("Arithmetic NaN at %L");
    107  1.1  mrg       break;
    108  1.1  mrg     case ARITH_DIV0:
    109  1.1  mrg       p = G_("Division by zero at %L");
    110  1.1  mrg       break;
    111  1.1  mrg     case ARITH_INCOMMENSURATE:
    112  1.1  mrg       p = G_("Array operands are incommensurate at %L");
    113  1.1  mrg       break;
    114  1.1  mrg     case ARITH_ASYMMETRIC:
    115  1.1  mrg       p = G_("Integer outside symmetric range implied by Standard Fortran"
    116  1.1  mrg 	     " at %L");
    117  1.1  mrg       break;
    118  1.1  mrg     case ARITH_WRONGCONCAT:
    119  1.1  mrg       p = G_("Illegal type in character concatenation at %L");
    120  1.1  mrg       break;
    121  1.1  mrg 
    122  1.1  mrg     default:
    123  1.1  mrg       gfc_internal_error ("gfc_arith_error(): Bad error code");
    124  1.1  mrg     }
    125  1.1  mrg 
    126  1.1  mrg   return p;
    127  1.1  mrg }
    128  1.1  mrg 
    129  1.1  mrg 
    130  1.1  mrg /* Get things ready to do math.  */
    131  1.1  mrg 
    132  1.1  mrg void
    133  1.1  mrg gfc_arith_init_1 (void)
    134  1.1  mrg {
    135  1.1  mrg   gfc_integer_info *int_info;
    136  1.1  mrg   gfc_real_info *real_info;
    137  1.1  mrg   mpfr_t a, b;
    138  1.1  mrg   int i;
    139  1.1  mrg 
    140  1.1  mrg   mpfr_set_default_prec (128);
    141  1.1  mrg   mpfr_init (a);
    142  1.1  mrg 
    143  1.1  mrg   /* Convert the minimum and maximum values for each kind into their
    144  1.1  mrg      GNU MP representation.  */
    145  1.1  mrg   for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
    146  1.1  mrg     {
    147  1.1  mrg       /* Huge  */
    148  1.1  mrg       mpz_init (int_info->huge);
    149  1.1  mrg       mpz_set_ui (int_info->huge, int_info->radix);
    150  1.1  mrg       mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
    151  1.1  mrg       mpz_sub_ui (int_info->huge, int_info->huge, 1);
    152  1.1  mrg 
    153  1.1  mrg       /* These are the numbers that are actually representable by the
    154  1.1  mrg 	 target.  For bases other than two, this needs to be changed.  */
    155  1.1  mrg       if (int_info->radix != 2)
    156  1.1  mrg 	gfc_internal_error ("Fix min_int calculation");
    157  1.1  mrg 
    158  1.1  mrg       /* See PRs 13490 and 17912, related to integer ranges.
    159  1.1  mrg 	 The pedantic_min_int exists for range checking when a program
    160  1.1  mrg 	 is compiled with -pedantic, and reflects the belief that
    161  1.1  mrg 	 Standard Fortran requires integers to be symmetrical, i.e.
    162  1.1  mrg 	 every negative integer must have a representable positive
    163  1.1  mrg 	 absolute value, and vice versa.  */
    164  1.1  mrg 
    165  1.1  mrg       mpz_init (int_info->pedantic_min_int);
    166  1.1  mrg       mpz_neg (int_info->pedantic_min_int, int_info->huge);
    167  1.1  mrg 
    168  1.1  mrg       mpz_init (int_info->min_int);
    169  1.1  mrg       mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
    170  1.1  mrg 
    171  1.1  mrg       /* Range  */
    172  1.1  mrg       mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
    173  1.1  mrg       mpfr_log10 (a, a, GFC_RND_MODE);
    174  1.1  mrg       mpfr_trunc (a, a);
    175  1.1  mrg       int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
    176  1.1  mrg     }
    177  1.1  mrg 
    178  1.1  mrg   mpfr_clear (a);
    179  1.1  mrg 
    180  1.1  mrg   for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
    181  1.1  mrg     {
    182  1.1  mrg       gfc_set_model_kind (real_info->kind);
    183  1.1  mrg 
    184  1.1  mrg       mpfr_init (a);
    185  1.1  mrg       mpfr_init (b);
    186  1.1  mrg 
    187  1.1  mrg       /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b  */
    188  1.1  mrg       /* 1 - b**(-p)  */
    189  1.1  mrg       mpfr_init (real_info->huge);
    190  1.1  mrg       mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
    191  1.1  mrg       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
    192  1.1  mrg       mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
    193  1.1  mrg       mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
    194  1.1  mrg 
    195  1.1  mrg       /* b**(emax-1)  */
    196  1.1  mrg       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
    197  1.1  mrg       mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
    198  1.1  mrg 
    199  1.1  mrg       /* (1 - b**(-p)) * b**(emax-1)  */
    200  1.1  mrg       mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
    201  1.1  mrg 
    202  1.1  mrg       /* (1 - b**(-p)) * b**(emax-1) * b  */
    203  1.1  mrg       mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
    204  1.1  mrg 		   GFC_RND_MODE);
    205  1.1  mrg 
    206  1.1  mrg       /* tiny(x) = b**(emin-1)  */
    207  1.1  mrg       mpfr_init (real_info->tiny);
    208  1.1  mrg       mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
    209  1.1  mrg       mpfr_pow_si (real_info->tiny, real_info->tiny,
    210  1.1  mrg 		   real_info->min_exponent - 1, GFC_RND_MODE);
    211  1.1  mrg 
    212  1.1  mrg       /* subnormal (x) = b**(emin - digit)  */
    213  1.1  mrg       mpfr_init (real_info->subnormal);
    214  1.1  mrg       mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
    215  1.1  mrg       mpfr_pow_si (real_info->subnormal, real_info->subnormal,
    216  1.1  mrg 		   real_info->min_exponent - real_info->digits, GFC_RND_MODE);
    217  1.1  mrg 
    218  1.1  mrg       /* epsilon(x) = b**(1-p)  */
    219  1.1  mrg       mpfr_init (real_info->epsilon);
    220  1.1  mrg       mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
    221  1.1  mrg       mpfr_pow_si (real_info->epsilon, real_info->epsilon,
    222  1.1  mrg 		   1 - real_info->digits, GFC_RND_MODE);
    223  1.1  mrg 
    224  1.1  mrg       /* range(x) = int(min(log10(huge(x)), -log10(tiny))  */
    225  1.1  mrg       mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
    226  1.1  mrg       mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
    227  1.1  mrg       mpfr_neg (b, b, GFC_RND_MODE);
    228  1.1  mrg 
    229  1.1  mrg       /* a = min(a, b)  */
    230  1.1  mrg       mpfr_min (a, a, b, GFC_RND_MODE);
    231  1.1  mrg       mpfr_trunc (a, a);
    232  1.1  mrg       real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
    233  1.1  mrg 
    234  1.1  mrg       /* precision(x) = int((p - 1) * log10(b)) + k  */
    235  1.1  mrg       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
    236  1.1  mrg       mpfr_log10 (a, a, GFC_RND_MODE);
    237  1.1  mrg       mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
    238  1.1  mrg       mpfr_trunc (a, a);
    239  1.1  mrg       real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
    240  1.1  mrg 
    241  1.1  mrg       /* If the radix is an integral power of 10, add one to the precision.  */
    242  1.1  mrg       for (i = 10; i <= real_info->radix; i *= 10)
    243  1.1  mrg 	if (i == real_info->radix)
    244  1.1  mrg 	  real_info->precision++;
    245  1.1  mrg 
    246  1.1  mrg       mpfr_clears (a, b, NULL);
    247  1.1  mrg     }
    248  1.1  mrg }
    249  1.1  mrg 
    250  1.1  mrg 
    251  1.1  mrg /* Clean up, get rid of numeric constants.  */
    252  1.1  mrg 
    253  1.1  mrg void
    254  1.1  mrg gfc_arith_done_1 (void)
    255  1.1  mrg {
    256  1.1  mrg   gfc_integer_info *ip;
    257  1.1  mrg   gfc_real_info *rp;
    258  1.1  mrg 
    259  1.1  mrg   for (ip = gfc_integer_kinds; ip->kind; ip++)
    260  1.1  mrg     {
    261  1.1  mrg       mpz_clear (ip->min_int);
    262  1.1  mrg       mpz_clear (ip->pedantic_min_int);
    263  1.1  mrg       mpz_clear (ip->huge);
    264  1.1  mrg     }
    265  1.1  mrg 
    266  1.1  mrg   for (rp = gfc_real_kinds; rp->kind; rp++)
    267  1.1  mrg     mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
    268  1.1  mrg 
    269  1.1  mrg   mpfr_free_cache ();
    270  1.1  mrg }
    271  1.1  mrg 
    272  1.1  mrg 
    273  1.1  mrg /* Given a wide character value and a character kind, determine whether
    274  1.1  mrg    the character is representable for that kind.  */
    275  1.1  mrg bool
    276  1.1  mrg gfc_check_character_range (gfc_char_t c, int kind)
    277  1.1  mrg {
    278  1.1  mrg   /* As wide characters are stored as 32-bit values, they're all
    279  1.1  mrg      representable in UCS=4.  */
    280  1.1  mrg   if (kind == 4)
    281  1.1  mrg     return true;
    282  1.1  mrg 
    283  1.1  mrg   if (kind == 1)
    284  1.1  mrg     return c <= 255 ? true : false;
    285  1.1  mrg 
    286  1.1  mrg   gcc_unreachable ();
    287  1.1  mrg }
    288  1.1  mrg 
    289  1.1  mrg 
    290  1.1  mrg /* Given an integer and a kind, make sure that the integer lies within
    291  1.1  mrg    the range of the kind.  Returns ARITH_OK, ARITH_ASYMMETRIC or
    292  1.1  mrg    ARITH_OVERFLOW.  */
    293  1.1  mrg 
    294  1.1  mrg arith
    295  1.1  mrg gfc_check_integer_range (mpz_t p, int kind)
    296  1.1  mrg {
    297  1.1  mrg   arith result;
    298  1.1  mrg   int i;
    299  1.1  mrg 
    300  1.1  mrg   i = gfc_validate_kind (BT_INTEGER, kind, false);
    301  1.1  mrg   result = ARITH_OK;
    302  1.1  mrg 
    303  1.1  mrg   if (pedantic)
    304  1.1  mrg     {
    305  1.1  mrg       if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
    306  1.1  mrg 	result = ARITH_ASYMMETRIC;
    307  1.1  mrg     }
    308  1.1  mrg 
    309  1.1  mrg 
    310  1.1  mrg   if (flag_range_check == 0)
    311  1.1  mrg     return result;
    312  1.1  mrg 
    313  1.1  mrg   if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
    314  1.1  mrg       || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
    315  1.1  mrg     result = ARITH_OVERFLOW;
    316  1.1  mrg 
    317  1.1  mrg   return result;
    318  1.1  mrg }
    319  1.1  mrg 
    320  1.1  mrg 
    321  1.1  mrg /* Given a real and a kind, make sure that the real lies within the
    322  1.1  mrg    range of the kind.  Returns ARITH_OK, ARITH_OVERFLOW or
    323  1.1  mrg    ARITH_UNDERFLOW.  */
    324  1.1  mrg 
    325  1.1  mrg static arith
    326  1.1  mrg gfc_check_real_range (mpfr_t p, int kind)
    327  1.1  mrg {
    328  1.1  mrg   arith retval;
    329  1.1  mrg   mpfr_t q;
    330  1.1  mrg   int i;
    331  1.1  mrg 
    332  1.1  mrg   i = gfc_validate_kind (BT_REAL, kind, false);
    333  1.1  mrg 
    334  1.1  mrg   gfc_set_model (p);
    335  1.1  mrg   mpfr_init (q);
    336  1.1  mrg   mpfr_abs (q, p, GFC_RND_MODE);
    337  1.1  mrg 
    338  1.1  mrg   retval = ARITH_OK;
    339  1.1  mrg 
    340  1.1  mrg   if (mpfr_inf_p (p))
    341  1.1  mrg     {
    342  1.1  mrg       if (flag_range_check != 0)
    343  1.1  mrg 	retval = ARITH_OVERFLOW;
    344  1.1  mrg     }
    345  1.1  mrg   else if (mpfr_nan_p (p))
    346  1.1  mrg     {
    347  1.1  mrg       if (flag_range_check != 0)
    348  1.1  mrg 	retval = ARITH_NAN;
    349  1.1  mrg     }
    350  1.1  mrg   else if (mpfr_sgn (q) == 0)
    351  1.1  mrg     {
    352  1.1  mrg       mpfr_clear (q);
    353  1.1  mrg       return retval;
    354  1.1  mrg     }
    355  1.1  mrg   else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
    356  1.1  mrg     {
    357  1.1  mrg       if (flag_range_check == 0)
    358  1.1  mrg 	mpfr_set_inf (p, mpfr_sgn (p));
    359  1.1  mrg       else
    360  1.1  mrg 	retval = ARITH_OVERFLOW;
    361  1.1  mrg     }
    362  1.1  mrg   else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
    363  1.1  mrg     {
    364  1.1  mrg       if (flag_range_check == 0)
    365  1.1  mrg 	{
    366  1.1  mrg 	  if (mpfr_sgn (p) < 0)
    367  1.1  mrg 	    {
    368  1.1  mrg 	      mpfr_set_ui (p, 0, GFC_RND_MODE);
    369  1.1  mrg 	      mpfr_set_si (q, -1, GFC_RND_MODE);
    370  1.1  mrg 	      mpfr_copysign (p, p, q, GFC_RND_MODE);
    371  1.1  mrg 	    }
    372  1.1  mrg 	  else
    373  1.1  mrg 	    mpfr_set_ui (p, 0, GFC_RND_MODE);
    374  1.1  mrg 	}
    375  1.1  mrg       else
    376  1.1  mrg 	retval = ARITH_UNDERFLOW;
    377  1.1  mrg     }
    378  1.1  mrg   else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
    379  1.1  mrg     {
    380  1.1  mrg       mpfr_exp_t emin, emax;
    381  1.1  mrg       int en;
    382  1.1  mrg 
    383  1.1  mrg       /* Save current values of emin and emax.  */
    384  1.1  mrg       emin = mpfr_get_emin ();
    385  1.1  mrg       emax = mpfr_get_emax ();
    386  1.1  mrg 
    387  1.1  mrg       /* Set emin and emax for the current model number.  */
    388  1.1  mrg       en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
    389  1.1  mrg       mpfr_set_emin ((mpfr_exp_t) en);
    390  1.1  mrg       mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[i].max_exponent);
    391  1.1  mrg       mpfr_check_range (q, 0, GFC_RND_MODE);
    392  1.1  mrg       mpfr_subnormalize (q, 0, GFC_RND_MODE);
    393  1.1  mrg 
    394  1.1  mrg       /* Reset emin and emax.  */
    395  1.1  mrg       mpfr_set_emin (emin);
    396  1.1  mrg       mpfr_set_emax (emax);
    397  1.1  mrg 
    398  1.1  mrg       /* Copy sign if needed.  */
    399  1.1  mrg       if (mpfr_sgn (p) < 0)
    400  1.1  mrg 	mpfr_neg (p, q, MPFR_RNDN);
    401  1.1  mrg       else
    402  1.1  mrg 	mpfr_set (p, q, MPFR_RNDN);
    403  1.1  mrg     }
    404  1.1  mrg 
    405  1.1  mrg   mpfr_clear (q);
    406  1.1  mrg 
    407  1.1  mrg   return retval;
    408  1.1  mrg }
    409  1.1  mrg 
    410  1.1  mrg 
    411  1.1  mrg /* Low-level arithmetic functions.  All of these subroutines assume
    412  1.1  mrg    that all operands are of the same type and return an operand of the
    413  1.1  mrg    same type.  The other thing about these subroutines is that they
    414  1.1  mrg    can fail in various ways -- overflow, underflow, division by zero,
    415  1.1  mrg    zero raised to the zero, etc.  */
    416  1.1  mrg 
    417  1.1  mrg static arith
    418  1.1  mrg gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
    419  1.1  mrg {
    420  1.1  mrg   gfc_expr *result;
    421  1.1  mrg 
    422  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, op1->ts.kind, &op1->where);
    423  1.1  mrg   result->value.logical = !op1->value.logical;
    424  1.1  mrg   *resultp = result;
    425  1.1  mrg 
    426  1.1  mrg   return ARITH_OK;
    427  1.1  mrg }
    428  1.1  mrg 
    429  1.1  mrg 
    430  1.1  mrg static arith
    431  1.1  mrg gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    432  1.1  mrg {
    433  1.1  mrg   gfc_expr *result;
    434  1.1  mrg 
    435  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
    436  1.1  mrg 				  &op1->where);
    437  1.1  mrg   result->value.logical = op1->value.logical && op2->value.logical;
    438  1.1  mrg   *resultp = result;
    439  1.1  mrg 
    440  1.1  mrg   return ARITH_OK;
    441  1.1  mrg }
    442  1.1  mrg 
    443  1.1  mrg 
    444  1.1  mrg static arith
    445  1.1  mrg gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    446  1.1  mrg {
    447  1.1  mrg   gfc_expr *result;
    448  1.1  mrg 
    449  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
    450  1.1  mrg 				  &op1->where);
    451  1.1  mrg   result->value.logical = op1->value.logical || op2->value.logical;
    452  1.1  mrg   *resultp = result;
    453  1.1  mrg 
    454  1.1  mrg   return ARITH_OK;
    455  1.1  mrg }
    456  1.1  mrg 
    457  1.1  mrg 
    458  1.1  mrg static arith
    459  1.1  mrg gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    460  1.1  mrg {
    461  1.1  mrg   gfc_expr *result;
    462  1.1  mrg 
    463  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
    464  1.1  mrg 				  &op1->where);
    465  1.1  mrg   result->value.logical = op1->value.logical == op2->value.logical;
    466  1.1  mrg   *resultp = result;
    467  1.1  mrg 
    468  1.1  mrg   return ARITH_OK;
    469  1.1  mrg }
    470  1.1  mrg 
    471  1.1  mrg 
    472  1.1  mrg static arith
    473  1.1  mrg gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    474  1.1  mrg {
    475  1.1  mrg   gfc_expr *result;
    476  1.1  mrg 
    477  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
    478  1.1  mrg 				  &op1->where);
    479  1.1  mrg   result->value.logical = op1->value.logical != op2->value.logical;
    480  1.1  mrg   *resultp = result;
    481  1.1  mrg 
    482  1.1  mrg   return ARITH_OK;
    483  1.1  mrg }
    484  1.1  mrg 
    485  1.1  mrg 
    486  1.1  mrg /* Make sure a constant numeric expression is within the range for
    487  1.1  mrg    its type and kind.  Note that there's also a gfc_check_range(),
    488  1.1  mrg    but that one deals with the intrinsic RANGE function.  */
    489  1.1  mrg 
    490  1.1  mrg arith
    491  1.1  mrg gfc_range_check (gfc_expr *e)
    492  1.1  mrg {
    493  1.1  mrg   arith rc;
    494  1.1  mrg   arith rc2;
    495  1.1  mrg 
    496  1.1  mrg   switch (e->ts.type)
    497  1.1  mrg     {
    498  1.1  mrg     case BT_INTEGER:
    499  1.1  mrg       rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
    500  1.1  mrg       break;
    501  1.1  mrg 
    502  1.1  mrg     case BT_REAL:
    503  1.1  mrg       rc = gfc_check_real_range (e->value.real, e->ts.kind);
    504  1.1  mrg       if (rc == ARITH_UNDERFLOW)
    505  1.1  mrg 	mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
    506  1.1  mrg       if (rc == ARITH_OVERFLOW)
    507  1.1  mrg 	mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
    508  1.1  mrg       if (rc == ARITH_NAN)
    509  1.1  mrg 	mpfr_set_nan (e->value.real);
    510  1.1  mrg       break;
    511  1.1  mrg 
    512  1.1  mrg     case BT_COMPLEX:
    513  1.1  mrg       rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
    514  1.1  mrg       if (rc == ARITH_UNDERFLOW)
    515  1.1  mrg 	mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
    516  1.1  mrg       if (rc == ARITH_OVERFLOW)
    517  1.1  mrg 	mpfr_set_inf (mpc_realref (e->value.complex),
    518  1.1  mrg 		      mpfr_sgn (mpc_realref (e->value.complex)));
    519  1.1  mrg       if (rc == ARITH_NAN)
    520  1.1  mrg 	mpfr_set_nan (mpc_realref (e->value.complex));
    521  1.1  mrg 
    522  1.1  mrg       rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
    523  1.1  mrg       if (rc == ARITH_UNDERFLOW)
    524  1.1  mrg 	mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
    525  1.1  mrg       if (rc == ARITH_OVERFLOW)
    526  1.1  mrg 	mpfr_set_inf (mpc_imagref (e->value.complex),
    527  1.1  mrg 		      mpfr_sgn (mpc_imagref (e->value.complex)));
    528  1.1  mrg       if (rc == ARITH_NAN)
    529  1.1  mrg 	mpfr_set_nan (mpc_imagref (e->value.complex));
    530  1.1  mrg 
    531  1.1  mrg       if (rc == ARITH_OK)
    532  1.1  mrg 	rc = rc2;
    533  1.1  mrg       break;
    534  1.1  mrg 
    535  1.1  mrg     default:
    536  1.1  mrg       gfc_internal_error ("gfc_range_check(): Bad type");
    537  1.1  mrg     }
    538  1.1  mrg 
    539  1.1  mrg   return rc;
    540  1.1  mrg }
    541  1.1  mrg 
    542  1.1  mrg 
    543  1.1  mrg /* Several of the following routines use the same set of statements to
    544  1.1  mrg    check the validity of the result.  Encapsulate the checking here.  */
    545  1.1  mrg 
    546  1.1  mrg static arith
    547  1.1  mrg check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
    548  1.1  mrg {
    549  1.1  mrg   arith val = rc;
    550  1.1  mrg 
    551  1.1  mrg   if (val == ARITH_UNDERFLOW)
    552  1.1  mrg     {
    553  1.1  mrg       if (warn_underflow)
    554  1.1  mrg 	gfc_warning (OPT_Wunderflow, gfc_arith_error (val), &x->where);
    555  1.1  mrg       val = ARITH_OK;
    556  1.1  mrg     }
    557  1.1  mrg 
    558  1.1  mrg   if (val == ARITH_ASYMMETRIC)
    559  1.1  mrg     {
    560  1.1  mrg       gfc_warning (0, gfc_arith_error (val), &x->where);
    561  1.1  mrg       val = ARITH_OK;
    562  1.1  mrg     }
    563  1.1  mrg 
    564  1.1  mrg   if (val == ARITH_OK || val == ARITH_OVERFLOW)
    565  1.1  mrg     *rp = r;
    566  1.1  mrg   else
    567  1.1  mrg     gfc_free_expr (r);
    568  1.1  mrg 
    569  1.1  mrg   return val;
    570  1.1  mrg }
    571  1.1  mrg 
    572  1.1  mrg 
    573  1.1  mrg /* It may seem silly to have a subroutine that actually computes the
    574  1.1  mrg    unary plus of a constant, but it prevents us from making exceptions
    575  1.1  mrg    in the code elsewhere.  Used for unary plus and parenthesized
    576  1.1  mrg    expressions.  */
    577  1.1  mrg 
    578  1.1  mrg static arith
    579  1.1  mrg gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
    580  1.1  mrg {
    581  1.1  mrg   *resultp = gfc_copy_expr (op1);
    582  1.1  mrg   return ARITH_OK;
    583  1.1  mrg }
    584  1.1  mrg 
    585  1.1  mrg 
    586  1.1  mrg static arith
    587  1.1  mrg gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
    588  1.1  mrg {
    589  1.1  mrg   gfc_expr *result;
    590  1.1  mrg   arith rc;
    591  1.1  mrg 
    592  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    593  1.1  mrg 
    594  1.1  mrg   switch (op1->ts.type)
    595  1.1  mrg     {
    596  1.1  mrg     case BT_INTEGER:
    597  1.1  mrg       mpz_neg (result->value.integer, op1->value.integer);
    598  1.1  mrg       break;
    599  1.1  mrg 
    600  1.1  mrg     case BT_REAL:
    601  1.1  mrg       mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
    602  1.1  mrg       break;
    603  1.1  mrg 
    604  1.1  mrg     case BT_COMPLEX:
    605  1.1  mrg       mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
    606  1.1  mrg       break;
    607  1.1  mrg 
    608  1.1  mrg     default:
    609  1.1  mrg       gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
    610  1.1  mrg     }
    611  1.1  mrg 
    612  1.1  mrg   rc = gfc_range_check (result);
    613  1.1  mrg 
    614  1.1  mrg   return check_result (rc, op1, result, resultp);
    615  1.1  mrg }
    616  1.1  mrg 
    617  1.1  mrg 
    618  1.1  mrg static arith
    619  1.1  mrg gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    620  1.1  mrg {
    621  1.1  mrg   gfc_expr *result;
    622  1.1  mrg   arith rc;
    623  1.1  mrg 
    624  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    625  1.1  mrg 
    626  1.1  mrg   switch (op1->ts.type)
    627  1.1  mrg     {
    628  1.1  mrg     case BT_INTEGER:
    629  1.1  mrg       mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
    630  1.1  mrg       break;
    631  1.1  mrg 
    632  1.1  mrg     case BT_REAL:
    633  1.1  mrg       mpfr_add (result->value.real, op1->value.real, op2->value.real,
    634  1.1  mrg 	       GFC_RND_MODE);
    635  1.1  mrg       break;
    636  1.1  mrg 
    637  1.1  mrg     case BT_COMPLEX:
    638  1.1  mrg       mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
    639  1.1  mrg 	       GFC_MPC_RND_MODE);
    640  1.1  mrg       break;
    641  1.1  mrg 
    642  1.1  mrg     default:
    643  1.1  mrg       gfc_internal_error ("gfc_arith_plus(): Bad basic type");
    644  1.1  mrg     }
    645  1.1  mrg 
    646  1.1  mrg   rc = gfc_range_check (result);
    647  1.1  mrg 
    648  1.1  mrg   return check_result (rc, op1, result, resultp);
    649  1.1  mrg }
    650  1.1  mrg 
    651  1.1  mrg 
    652  1.1  mrg static arith
    653  1.1  mrg gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    654  1.1  mrg {
    655  1.1  mrg   gfc_expr *result;
    656  1.1  mrg   arith rc;
    657  1.1  mrg 
    658  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    659  1.1  mrg 
    660  1.1  mrg   switch (op1->ts.type)
    661  1.1  mrg     {
    662  1.1  mrg     case BT_INTEGER:
    663  1.1  mrg       mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
    664  1.1  mrg       break;
    665  1.1  mrg 
    666  1.1  mrg     case BT_REAL:
    667  1.1  mrg       mpfr_sub (result->value.real, op1->value.real, op2->value.real,
    668  1.1  mrg 		GFC_RND_MODE);
    669  1.1  mrg       break;
    670  1.1  mrg 
    671  1.1  mrg     case BT_COMPLEX:
    672  1.1  mrg       mpc_sub (result->value.complex, op1->value.complex,
    673  1.1  mrg 	       op2->value.complex, GFC_MPC_RND_MODE);
    674  1.1  mrg       break;
    675  1.1  mrg 
    676  1.1  mrg     default:
    677  1.1  mrg       gfc_internal_error ("gfc_arith_minus(): Bad basic type");
    678  1.1  mrg     }
    679  1.1  mrg 
    680  1.1  mrg   rc = gfc_range_check (result);
    681  1.1  mrg 
    682  1.1  mrg   return check_result (rc, op1, result, resultp);
    683  1.1  mrg }
    684  1.1  mrg 
    685  1.1  mrg 
    686  1.1  mrg static arith
    687  1.1  mrg gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    688  1.1  mrg {
    689  1.1  mrg   gfc_expr *result;
    690  1.1  mrg   arith rc;
    691  1.1  mrg 
    692  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    693  1.1  mrg 
    694  1.1  mrg   switch (op1->ts.type)
    695  1.1  mrg     {
    696  1.1  mrg     case BT_INTEGER:
    697  1.1  mrg       mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
    698  1.1  mrg       break;
    699  1.1  mrg 
    700  1.1  mrg     case BT_REAL:
    701  1.1  mrg       mpfr_mul (result->value.real, op1->value.real, op2->value.real,
    702  1.1  mrg 	       GFC_RND_MODE);
    703  1.1  mrg       break;
    704  1.1  mrg 
    705  1.1  mrg     case BT_COMPLEX:
    706  1.1  mrg       gfc_set_model (mpc_realref (op1->value.complex));
    707  1.1  mrg       mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
    708  1.1  mrg 	       GFC_MPC_RND_MODE);
    709  1.1  mrg       break;
    710  1.1  mrg 
    711  1.1  mrg     default:
    712  1.1  mrg       gfc_internal_error ("gfc_arith_times(): Bad basic type");
    713  1.1  mrg     }
    714  1.1  mrg 
    715  1.1  mrg   rc = gfc_range_check (result);
    716  1.1  mrg 
    717  1.1  mrg   return check_result (rc, op1, result, resultp);
    718  1.1  mrg }
    719  1.1  mrg 
    720  1.1  mrg 
    721  1.1  mrg static arith
    722  1.1  mrg gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    723  1.1  mrg {
    724  1.1  mrg   gfc_expr *result;
    725  1.1  mrg   arith rc;
    726  1.1  mrg 
    727  1.1  mrg   rc = ARITH_OK;
    728  1.1  mrg 
    729  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    730  1.1  mrg 
    731  1.1  mrg   switch (op1->ts.type)
    732  1.1  mrg     {
    733  1.1  mrg     case BT_INTEGER:
    734  1.1  mrg       if (mpz_sgn (op2->value.integer) == 0)
    735  1.1  mrg 	{
    736  1.1  mrg 	  rc = ARITH_DIV0;
    737  1.1  mrg 	  break;
    738  1.1  mrg 	}
    739  1.1  mrg 
    740  1.1  mrg       if (warn_integer_division)
    741  1.1  mrg 	{
    742  1.1  mrg 	  mpz_t r;
    743  1.1  mrg 	  mpz_init (r);
    744  1.1  mrg 	  mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
    745  1.1  mrg 		       op2->value.integer);
    746  1.1  mrg 
    747  1.1  mrg 	  if (mpz_cmp_si (r, 0) != 0)
    748  1.1  mrg 	    {
    749  1.1  mrg 	      char *p;
    750  1.1  mrg 	      p = mpz_get_str (NULL, 10, result->value.integer);
    751  1.1  mrg 	      gfc_warning_now (OPT_Winteger_division, "Integer division "
    752  1.1  mrg 			       "truncated to constant %qs at %L", p,
    753  1.1  mrg 			       &op1->where);
    754  1.1  mrg 	      free (p);
    755  1.1  mrg 	    }
    756  1.1  mrg 	  mpz_clear (r);
    757  1.1  mrg 	}
    758  1.1  mrg       else
    759  1.1  mrg 	mpz_tdiv_q (result->value.integer, op1->value.integer,
    760  1.1  mrg 		    op2->value.integer);
    761  1.1  mrg 
    762  1.1  mrg       break;
    763  1.1  mrg 
    764  1.1  mrg     case BT_REAL:
    765  1.1  mrg       if (mpfr_sgn (op2->value.real) == 0 && flag_range_check == 1)
    766  1.1  mrg 	{
    767  1.1  mrg 	  rc = ARITH_DIV0;
    768  1.1  mrg 	  break;
    769  1.1  mrg 	}
    770  1.1  mrg 
    771  1.1  mrg       mpfr_div (result->value.real, op1->value.real, op2->value.real,
    772  1.1  mrg 	       GFC_RND_MODE);
    773  1.1  mrg       break;
    774  1.1  mrg 
    775  1.1  mrg     case BT_COMPLEX:
    776  1.1  mrg       if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
    777  1.1  mrg 	  && flag_range_check == 1)
    778  1.1  mrg 	{
    779  1.1  mrg 	  rc = ARITH_DIV0;
    780  1.1  mrg 	  break;
    781  1.1  mrg 	}
    782  1.1  mrg 
    783  1.1  mrg       gfc_set_model (mpc_realref (op1->value.complex));
    784  1.1  mrg       if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
    785  1.1  mrg       {
    786  1.1  mrg 	/* In Fortran, return (NaN + NaN I) for any zero divisor.  See
    787  1.1  mrg 	   PR 40318.  */
    788  1.1  mrg 	mpfr_set_nan (mpc_realref (result->value.complex));
    789  1.1  mrg 	mpfr_set_nan (mpc_imagref (result->value.complex));
    790  1.1  mrg       }
    791  1.1  mrg       else
    792  1.1  mrg 	mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
    793  1.1  mrg 		 GFC_MPC_RND_MODE);
    794  1.1  mrg       break;
    795  1.1  mrg 
    796  1.1  mrg     default:
    797  1.1  mrg       gfc_internal_error ("gfc_arith_divide(): Bad basic type");
    798  1.1  mrg     }
    799  1.1  mrg 
    800  1.1  mrg   if (rc == ARITH_OK)
    801  1.1  mrg     rc = gfc_range_check (result);
    802  1.1  mrg 
    803  1.1  mrg   return check_result (rc, op1, result, resultp);
    804  1.1  mrg }
    805  1.1  mrg 
    806  1.1  mrg /* Raise a number to a power.  */
    807  1.1  mrg 
    808  1.1  mrg static arith
    809  1.1  mrg arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    810  1.1  mrg {
    811  1.1  mrg   int power_sign;
    812  1.1  mrg   gfc_expr *result;
    813  1.1  mrg   arith rc;
    814  1.1  mrg 
    815  1.1  mrg   rc = ARITH_OK;
    816  1.1  mrg   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
    817  1.1  mrg 
    818  1.1  mrg   switch (op2->ts.type)
    819  1.1  mrg     {
    820  1.1  mrg     case BT_INTEGER:
    821  1.1  mrg       power_sign = mpz_sgn (op2->value.integer);
    822  1.1  mrg 
    823  1.1  mrg       if (power_sign == 0)
    824  1.1  mrg 	{
    825  1.1  mrg 	  /* Handle something to the zeroth power.  Since we're dealing
    826  1.1  mrg 	     with integral exponents, there is no ambiguity in the
    827  1.1  mrg 	     limiting procedure used to determine the value of 0**0.  */
    828  1.1  mrg 	  switch (op1->ts.type)
    829  1.1  mrg 	    {
    830  1.1  mrg 	    case BT_INTEGER:
    831  1.1  mrg 	      mpz_set_ui (result->value.integer, 1);
    832  1.1  mrg 	      break;
    833  1.1  mrg 
    834  1.1  mrg 	    case BT_REAL:
    835  1.1  mrg 	      mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
    836  1.1  mrg 	      break;
    837  1.1  mrg 
    838  1.1  mrg 	    case BT_COMPLEX:
    839  1.1  mrg 	      mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
    840  1.1  mrg 	      break;
    841  1.1  mrg 
    842  1.1  mrg 	    default:
    843  1.1  mrg 	      gfc_internal_error ("arith_power(): Bad base");
    844  1.1  mrg 	    }
    845  1.1  mrg 	}
    846  1.1  mrg       else
    847  1.1  mrg 	{
    848  1.1  mrg 	  switch (op1->ts.type)
    849  1.1  mrg 	    {
    850  1.1  mrg 	    case BT_INTEGER:
    851  1.1  mrg 	      {
    852  1.1  mrg 		/* First, we simplify the cases of op1 == 1, 0 or -1.  */
    853  1.1  mrg 		if (mpz_cmp_si (op1->value.integer, 1) == 0)
    854  1.1  mrg 		  {
    855  1.1  mrg 		    /* 1**op2 == 1 */
    856  1.1  mrg 		    mpz_set_si (result->value.integer, 1);
    857  1.1  mrg 		  }
    858  1.1  mrg 		else if (mpz_cmp_si (op1->value.integer, 0) == 0)
    859  1.1  mrg 		  {
    860  1.1  mrg 		    /* 0**op2 == 0, if op2 > 0
    861  1.1  mrg 	               0**op2 overflow, if op2 < 0 ; in that case, we
    862  1.1  mrg 		       set the result to 0 and return ARITH_DIV0.  */
    863  1.1  mrg 		    mpz_set_si (result->value.integer, 0);
    864  1.1  mrg 		    if (mpz_cmp_si (op2->value.integer, 0) < 0)
    865  1.1  mrg 		      rc = ARITH_DIV0;
    866  1.1  mrg 		  }
    867  1.1  mrg 		else if (mpz_cmp_si (op1->value.integer, -1) == 0)
    868  1.1  mrg 		  {
    869  1.1  mrg 		    /* (-1)**op2 == (-1)**(mod(op2,2)) */
    870  1.1  mrg 		    unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
    871  1.1  mrg 		    if (odd)
    872  1.1  mrg 		      mpz_set_si (result->value.integer, -1);
    873  1.1  mrg 		    else
    874  1.1  mrg 		      mpz_set_si (result->value.integer, 1);
    875  1.1  mrg 		  }
    876  1.1  mrg 		/* Then, we take care of op2 < 0.  */
    877  1.1  mrg 		else if (mpz_cmp_si (op2->value.integer, 0) < 0)
    878  1.1  mrg 		  {
    879  1.1  mrg 		    /* if op2 < 0, op1**op2 == 0  because abs(op1) > 1.  */
    880  1.1  mrg 		    mpz_set_si (result->value.integer, 0);
    881  1.1  mrg 		    if (warn_integer_division)
    882  1.1  mrg 		      gfc_warning_now (OPT_Winteger_division, "Negative "
    883  1.1  mrg 				       "exponent of integer has zero "
    884  1.1  mrg 				       "result at %L", &result->where);
    885  1.1  mrg 		  }
    886  1.1  mrg 		else
    887  1.1  mrg 		  {
    888  1.1  mrg 		    /* We have abs(op1) > 1 and op2 > 1.
    889  1.1  mrg 		       If op2 > bit_size(op1), we'll have an out-of-range
    890  1.1  mrg 		       result.  */
    891  1.1  mrg 		    int k, power;
    892  1.1  mrg 
    893  1.1  mrg 		    k = gfc_validate_kind (BT_INTEGER, op1->ts.kind, false);
    894  1.1  mrg 		    power = gfc_integer_kinds[k].bit_size;
    895  1.1  mrg 		    if (mpz_cmp_si (op2->value.integer, power) < 0)
    896  1.1  mrg 		      {
    897  1.1  mrg 			gfc_extract_int (op2, &power);
    898  1.1  mrg 			mpz_pow_ui (result->value.integer, op1->value.integer,
    899  1.1  mrg 				    power);
    900  1.1  mrg 			rc = gfc_range_check (result);
    901  1.1  mrg 			if (rc == ARITH_OVERFLOW)
    902  1.1  mrg 			  gfc_error_now ("Result of exponentiation at %L "
    903  1.1  mrg 					 "exceeds the range of %s", &op1->where,
    904  1.1  mrg 					 gfc_typename (&(op1->ts)));
    905  1.1  mrg 		      }
    906  1.1  mrg 		    else
    907  1.1  mrg 		      {
    908  1.1  mrg 			/* Provide a nonsense value to propagate up. */
    909  1.1  mrg 			mpz_set (result->value.integer,
    910  1.1  mrg 				 gfc_integer_kinds[k].huge);
    911  1.1  mrg 			mpz_add_ui (result->value.integer,
    912  1.1  mrg 				    result->value.integer, 1);
    913  1.1  mrg 			rc = ARITH_OVERFLOW;
    914  1.1  mrg 		      }
    915  1.1  mrg 		  }
    916  1.1  mrg 	      }
    917  1.1  mrg 	      break;
    918  1.1  mrg 
    919  1.1  mrg 	    case BT_REAL:
    920  1.1  mrg 	      mpfr_pow_z (result->value.real, op1->value.real,
    921  1.1  mrg 			  op2->value.integer, GFC_RND_MODE);
    922  1.1  mrg 	      break;
    923  1.1  mrg 
    924  1.1  mrg 	    case BT_COMPLEX:
    925  1.1  mrg 	      mpc_pow_z (result->value.complex, op1->value.complex,
    926  1.1  mrg 			 op2->value.integer, GFC_MPC_RND_MODE);
    927  1.1  mrg 	      break;
    928  1.1  mrg 
    929  1.1  mrg 	    default:
    930  1.1  mrg 	      break;
    931  1.1  mrg 	    }
    932  1.1  mrg 	}
    933  1.1  mrg       break;
    934  1.1  mrg 
    935  1.1  mrg     case BT_REAL:
    936  1.1  mrg 
    937  1.1  mrg       if (gfc_init_expr_flag)
    938  1.1  mrg 	{
    939  1.1  mrg 	  if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
    940  1.1  mrg 			       "exponent in an initialization "
    941  1.1  mrg 			       "expression at %L", &op2->where))
    942  1.1  mrg 	    {
    943  1.1  mrg 	      gfc_free_expr (result);
    944  1.1  mrg 	      return ARITH_PROHIBIT;
    945  1.1  mrg 	    }
    946  1.1  mrg 	}
    947  1.1  mrg 
    948  1.1  mrg       if (mpfr_cmp_si (op1->value.real, 0) < 0)
    949  1.1  mrg 	{
    950  1.1  mrg 	  gfc_error ("Raising a negative REAL at %L to "
    951  1.1  mrg 		     "a REAL power is prohibited", &op1->where);
    952  1.1  mrg 	  gfc_free_expr (result);
    953  1.1  mrg 	  return ARITH_PROHIBIT;
    954  1.1  mrg 	}
    955  1.1  mrg 
    956  1.1  mrg 	mpfr_pow (result->value.real, op1->value.real, op2->value.real,
    957  1.1  mrg 		  GFC_RND_MODE);
    958  1.1  mrg       break;
    959  1.1  mrg 
    960  1.1  mrg     case BT_COMPLEX:
    961  1.1  mrg       {
    962  1.1  mrg 	if (gfc_init_expr_flag)
    963  1.1  mrg 	  {
    964  1.1  mrg 	    if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
    965  1.1  mrg 				 "exponent in an initialization "
    966  1.1  mrg 				 "expression at %L", &op2->where))
    967  1.1  mrg 	      {
    968  1.1  mrg 		gfc_free_expr (result);
    969  1.1  mrg 		return ARITH_PROHIBIT;
    970  1.1  mrg 	      }
    971  1.1  mrg 	  }
    972  1.1  mrg 
    973  1.1  mrg 	mpc_pow (result->value.complex, op1->value.complex,
    974  1.1  mrg 		 op2->value.complex, GFC_MPC_RND_MODE);
    975  1.1  mrg       }
    976  1.1  mrg       break;
    977  1.1  mrg     default:
    978  1.1  mrg       gfc_internal_error ("arith_power(): unknown type");
    979  1.1  mrg     }
    980  1.1  mrg 
    981  1.1  mrg   if (rc == ARITH_OK)
    982  1.1  mrg     rc = gfc_range_check (result);
    983  1.1  mrg 
    984  1.1  mrg   return check_result (rc, op1, result, resultp);
    985  1.1  mrg }
    986  1.1  mrg 
    987  1.1  mrg 
    988  1.1  mrg /* Concatenate two string constants.  */
    989  1.1  mrg 
    990  1.1  mrg static arith
    991  1.1  mrg gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    992  1.1  mrg {
    993  1.1  mrg   gfc_expr *result;
    994  1.1  mrg   size_t len;
    995  1.1  mrg 
    996  1.1  mrg   /* By cleverly playing around with constructors, it is possible
    997  1.1  mrg      to get mismaching types here.  */
    998  1.1  mrg   if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
    999  1.1  mrg       || op1->ts.kind != op2->ts.kind)
   1000  1.1  mrg     return ARITH_WRONGCONCAT;
   1001  1.1  mrg 
   1002  1.1  mrg   result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
   1003  1.1  mrg 				  &op1->where);
   1004  1.1  mrg 
   1005  1.1  mrg   len = op1->value.character.length + op2->value.character.length;
   1006  1.1  mrg 
   1007  1.1  mrg   result->value.character.string = gfc_get_wide_string (len + 1);
   1008  1.1  mrg   result->value.character.length = len;
   1009  1.1  mrg 
   1010  1.1  mrg   memcpy (result->value.character.string, op1->value.character.string,
   1011  1.1  mrg 	  op1->value.character.length * sizeof (gfc_char_t));
   1012  1.1  mrg 
   1013  1.1  mrg   memcpy (&result->value.character.string[op1->value.character.length],
   1014  1.1  mrg 	  op2->value.character.string,
   1015  1.1  mrg 	  op2->value.character.length * sizeof (gfc_char_t));
   1016  1.1  mrg 
   1017  1.1  mrg   result->value.character.string[len] = '\0';
   1018  1.1  mrg 
   1019  1.1  mrg   *resultp = result;
   1020  1.1  mrg 
   1021  1.1  mrg   return ARITH_OK;
   1022  1.1  mrg }
   1023  1.1  mrg 
   1024  1.1  mrg /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
   1025  1.1  mrg    This function mimics mpfr_cmp but takes NaN into account.  */
   1026  1.1  mrg 
   1027  1.1  mrg static int
   1028  1.1  mrg compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1029  1.1  mrg {
   1030  1.1  mrg   int rc;
   1031  1.1  mrg   switch (op)
   1032  1.1  mrg     {
   1033  1.1  mrg       case INTRINSIC_EQ:
   1034  1.1  mrg 	rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
   1035  1.1  mrg 	break;
   1036  1.1  mrg       case INTRINSIC_GT:
   1037  1.1  mrg 	rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
   1038  1.1  mrg 	break;
   1039  1.1  mrg       case INTRINSIC_GE:
   1040  1.1  mrg 	rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
   1041  1.1  mrg 	break;
   1042  1.1  mrg       case INTRINSIC_LT:
   1043  1.1  mrg 	rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
   1044  1.1  mrg 	break;
   1045  1.1  mrg       case INTRINSIC_LE:
   1046  1.1  mrg 	rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
   1047  1.1  mrg 	break;
   1048  1.1  mrg       default:
   1049  1.1  mrg 	gfc_internal_error ("compare_real(): Bad operator");
   1050  1.1  mrg     }
   1051  1.1  mrg 
   1052  1.1  mrg   return rc;
   1053  1.1  mrg }
   1054  1.1  mrg 
   1055  1.1  mrg /* Comparison operators.  Assumes that the two expression nodes
   1056  1.1  mrg    contain two constants of the same type. The op argument is
   1057  1.1  mrg    needed to handle NaN correctly.  */
   1058  1.1  mrg 
   1059  1.1  mrg int
   1060  1.1  mrg gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1061  1.1  mrg {
   1062  1.1  mrg   int rc;
   1063  1.1  mrg 
   1064  1.1  mrg   switch (op1->ts.type)
   1065  1.1  mrg     {
   1066  1.1  mrg     case BT_INTEGER:
   1067  1.1  mrg       rc = mpz_cmp (op1->value.integer, op2->value.integer);
   1068  1.1  mrg       break;
   1069  1.1  mrg 
   1070  1.1  mrg     case BT_REAL:
   1071  1.1  mrg       rc = compare_real (op1, op2, op);
   1072  1.1  mrg       break;
   1073  1.1  mrg 
   1074  1.1  mrg     case BT_CHARACTER:
   1075  1.1  mrg       rc = gfc_compare_string (op1, op2);
   1076  1.1  mrg       break;
   1077  1.1  mrg 
   1078  1.1  mrg     case BT_LOGICAL:
   1079  1.1  mrg       rc = ((!op1->value.logical && op2->value.logical)
   1080  1.1  mrg 	    || (op1->value.logical && !op2->value.logical));
   1081  1.1  mrg       break;
   1082  1.1  mrg 
   1083  1.1  mrg     case BT_COMPLEX:
   1084  1.1  mrg       gcc_assert (op == INTRINSIC_EQ);
   1085  1.1  mrg       rc = mpc_cmp (op1->value.complex, op2->value.complex);
   1086  1.1  mrg       break;
   1087  1.1  mrg 
   1088  1.1  mrg     default:
   1089  1.1  mrg       gfc_internal_error ("gfc_compare_expr(): Bad basic type");
   1090  1.1  mrg     }
   1091  1.1  mrg 
   1092  1.1  mrg   return rc;
   1093  1.1  mrg }
   1094  1.1  mrg 
   1095  1.1  mrg 
   1096  1.1  mrg /* Compare a pair of complex numbers.  Naturally, this is only for
   1097  1.1  mrg    equality and inequality.  */
   1098  1.1  mrg 
   1099  1.1  mrg static int
   1100  1.1  mrg compare_complex (gfc_expr *op1, gfc_expr *op2)
   1101  1.1  mrg {
   1102  1.1  mrg   return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
   1103  1.1  mrg }
   1104  1.1  mrg 
   1105  1.1  mrg 
   1106  1.1  mrg /* Given two constant strings and the inverse collating sequence, compare the
   1107  1.1  mrg    strings.  We return -1 for a < b, 0 for a == b and 1 for a > b.
   1108  1.1  mrg    We use the processor's default collating sequence.  */
   1109  1.1  mrg 
   1110  1.1  mrg int
   1111  1.1  mrg gfc_compare_string (gfc_expr *a, gfc_expr *b)
   1112  1.1  mrg {
   1113  1.1  mrg   size_t len, alen, blen, i;
   1114  1.1  mrg   gfc_char_t ac, bc;
   1115  1.1  mrg 
   1116  1.1  mrg   alen = a->value.character.length;
   1117  1.1  mrg   blen = b->value.character.length;
   1118  1.1  mrg 
   1119  1.1  mrg   len = MAX(alen, blen);
   1120  1.1  mrg 
   1121  1.1  mrg   for (i = 0; i < len; i++)
   1122  1.1  mrg     {
   1123  1.1  mrg       ac = ((i < alen) ? a->value.character.string[i] : ' ');
   1124  1.1  mrg       bc = ((i < blen) ? b->value.character.string[i] : ' ');
   1125  1.1  mrg 
   1126  1.1  mrg       if (ac < bc)
   1127  1.1  mrg 	return -1;
   1128  1.1  mrg       if (ac > bc)
   1129  1.1  mrg 	return 1;
   1130  1.1  mrg     }
   1131  1.1  mrg 
   1132  1.1  mrg   /* Strings are equal */
   1133  1.1  mrg   return 0;
   1134  1.1  mrg }
   1135  1.1  mrg 
   1136  1.1  mrg 
   1137  1.1  mrg int
   1138  1.1  mrg gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
   1139  1.1  mrg {
   1140  1.1  mrg   size_t len, alen, blen, i;
   1141  1.1  mrg   gfc_char_t ac, bc;
   1142  1.1  mrg 
   1143  1.1  mrg   alen = a->value.character.length;
   1144  1.1  mrg   blen = strlen (b);
   1145  1.1  mrg 
   1146  1.1  mrg   len = MAX(alen, blen);
   1147  1.1  mrg 
   1148  1.1  mrg   for (i = 0; i < len; i++)
   1149  1.1  mrg     {
   1150  1.1  mrg       ac = ((i < alen) ? a->value.character.string[i] : ' ');
   1151  1.1  mrg       bc = ((i < blen) ? b[i] : ' ');
   1152  1.1  mrg 
   1153  1.1  mrg       if (!case_sensitive)
   1154  1.1  mrg 	{
   1155  1.1  mrg 	  ac = TOLOWER (ac);
   1156  1.1  mrg 	  bc = TOLOWER (bc);
   1157  1.1  mrg 	}
   1158  1.1  mrg 
   1159  1.1  mrg       if (ac < bc)
   1160  1.1  mrg 	return -1;
   1161  1.1  mrg       if (ac > bc)
   1162  1.1  mrg 	return 1;
   1163  1.1  mrg     }
   1164  1.1  mrg 
   1165  1.1  mrg   /* Strings are equal */
   1166  1.1  mrg   return 0;
   1167  1.1  mrg }
   1168  1.1  mrg 
   1169  1.1  mrg 
   1170  1.1  mrg /* Specific comparison subroutines.  */
   1171  1.1  mrg 
   1172  1.1  mrg static arith
   1173  1.1  mrg gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1174  1.1  mrg {
   1175  1.1  mrg   gfc_expr *result;
   1176  1.1  mrg 
   1177  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1178  1.1  mrg 				  &op1->where);
   1179  1.1  mrg   result->value.logical = (op1->ts.type == BT_COMPLEX)
   1180  1.1  mrg 			? compare_complex (op1, op2)
   1181  1.1  mrg 			: (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
   1182  1.1  mrg 
   1183  1.1  mrg   *resultp = result;
   1184  1.1  mrg   return ARITH_OK;
   1185  1.1  mrg }
   1186  1.1  mrg 
   1187  1.1  mrg 
   1188  1.1  mrg static arith
   1189  1.1  mrg gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1190  1.1  mrg {
   1191  1.1  mrg   gfc_expr *result;
   1192  1.1  mrg 
   1193  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1194  1.1  mrg 				  &op1->where);
   1195  1.1  mrg   result->value.logical = (op1->ts.type == BT_COMPLEX)
   1196  1.1  mrg 			? !compare_complex (op1, op2)
   1197  1.1  mrg 			: (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
   1198  1.1  mrg 
   1199  1.1  mrg   *resultp = result;
   1200  1.1  mrg   return ARITH_OK;
   1201  1.1  mrg }
   1202  1.1  mrg 
   1203  1.1  mrg 
   1204  1.1  mrg static arith
   1205  1.1  mrg gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1206  1.1  mrg {
   1207  1.1  mrg   gfc_expr *result;
   1208  1.1  mrg 
   1209  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1210  1.1  mrg 				  &op1->where);
   1211  1.1  mrg   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
   1212  1.1  mrg   *resultp = result;
   1213  1.1  mrg 
   1214  1.1  mrg   return ARITH_OK;
   1215  1.1  mrg }
   1216  1.1  mrg 
   1217  1.1  mrg 
   1218  1.1  mrg static arith
   1219  1.1  mrg gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1220  1.1  mrg {
   1221  1.1  mrg   gfc_expr *result;
   1222  1.1  mrg 
   1223  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1224  1.1  mrg 				  &op1->where);
   1225  1.1  mrg   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
   1226  1.1  mrg   *resultp = result;
   1227  1.1  mrg 
   1228  1.1  mrg   return ARITH_OK;
   1229  1.1  mrg }
   1230  1.1  mrg 
   1231  1.1  mrg 
   1232  1.1  mrg static arith
   1233  1.1  mrg gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1234  1.1  mrg {
   1235  1.1  mrg   gfc_expr *result;
   1236  1.1  mrg 
   1237  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1238  1.1  mrg 				  &op1->where);
   1239  1.1  mrg   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
   1240  1.1  mrg   *resultp = result;
   1241  1.1  mrg 
   1242  1.1  mrg   return ARITH_OK;
   1243  1.1  mrg }
   1244  1.1  mrg 
   1245  1.1  mrg 
   1246  1.1  mrg static arith
   1247  1.1  mrg gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   1248  1.1  mrg {
   1249  1.1  mrg   gfc_expr *result;
   1250  1.1  mrg 
   1251  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
   1252  1.1  mrg 				  &op1->where);
   1253  1.1  mrg   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
   1254  1.1  mrg   *resultp = result;
   1255  1.1  mrg 
   1256  1.1  mrg   return ARITH_OK;
   1257  1.1  mrg }
   1258  1.1  mrg 
   1259  1.1  mrg 
   1260  1.1  mrg static arith
   1261  1.1  mrg reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
   1262  1.1  mrg 	      gfc_expr **result)
   1263  1.1  mrg {
   1264  1.1  mrg   gfc_constructor_base head;
   1265  1.1  mrg   gfc_constructor *c;
   1266  1.1  mrg   gfc_expr *r;
   1267  1.1  mrg   arith rc;
   1268  1.1  mrg 
   1269  1.1  mrg   if (op->expr_type == EXPR_CONSTANT)
   1270  1.1  mrg     return eval (op, result);
   1271  1.1  mrg 
   1272  1.1  mrg   rc = ARITH_OK;
   1273  1.1  mrg   head = gfc_constructor_copy (op->value.constructor);
   1274  1.1  mrg   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
   1275  1.1  mrg     {
   1276  1.1  mrg       rc = reduce_unary (eval, c->expr, &r);
   1277  1.1  mrg 
   1278  1.1  mrg       if (rc != ARITH_OK)
   1279  1.1  mrg 	break;
   1280  1.1  mrg 
   1281  1.1  mrg       gfc_replace_expr (c->expr, r);
   1282  1.1  mrg     }
   1283  1.1  mrg 
   1284  1.1  mrg   if (rc != ARITH_OK)
   1285  1.1  mrg     gfc_constructor_free (head);
   1286  1.1  mrg   else
   1287  1.1  mrg     {
   1288  1.1  mrg       gfc_constructor *c = gfc_constructor_first (head);
   1289  1.1  mrg       if (c == NULL)
   1290  1.1  mrg 	{
   1291  1.1  mrg 	  /* Handle zero-sized arrays.  */
   1292  1.1  mrg 	  r = gfc_get_array_expr (op->ts.type, op->ts.kind, &op->where);
   1293  1.1  mrg 	}
   1294  1.1  mrg       else
   1295  1.1  mrg 	{
   1296  1.1  mrg 	  r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
   1297  1.1  mrg 				  &op->where);
   1298  1.1  mrg 	}
   1299  1.1  mrg       r->shape = gfc_copy_shape (op->shape, op->rank);
   1300  1.1  mrg       r->rank = op->rank;
   1301  1.1  mrg       r->value.constructor = head;
   1302  1.1  mrg       *result = r;
   1303  1.1  mrg     }
   1304  1.1  mrg 
   1305  1.1  mrg   return rc;
   1306  1.1  mrg }
   1307  1.1  mrg 
   1308  1.1  mrg 
   1309  1.1  mrg static arith
   1310  1.1  mrg reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1311  1.1  mrg 		  gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
   1312  1.1  mrg {
   1313  1.1  mrg   gfc_constructor_base head;
   1314  1.1  mrg   gfc_constructor *c;
   1315  1.1  mrg   gfc_expr *r;
   1316  1.1  mrg   arith rc = ARITH_OK;
   1317  1.1  mrg 
   1318  1.1  mrg   head = gfc_constructor_copy (op1->value.constructor);
   1319  1.1  mrg   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
   1320  1.1  mrg     {
   1321  1.1  mrg       gfc_simplify_expr (c->expr, 0);
   1322  1.1  mrg 
   1323  1.1  mrg       if (c->expr->expr_type == EXPR_CONSTANT)
   1324  1.1  mrg         rc = eval (c->expr, op2, &r);
   1325  1.1  mrg       else
   1326  1.1  mrg 	rc = reduce_binary_ac (eval, c->expr, op2, &r);
   1327  1.1  mrg 
   1328  1.1  mrg       if (rc != ARITH_OK)
   1329  1.1  mrg 	break;
   1330  1.1  mrg 
   1331  1.1  mrg       gfc_replace_expr (c->expr, r);
   1332  1.1  mrg     }
   1333  1.1  mrg 
   1334  1.1  mrg   if (rc != ARITH_OK)
   1335  1.1  mrg     gfc_constructor_free (head);
   1336  1.1  mrg   else
   1337  1.1  mrg     {
   1338  1.1  mrg       gfc_constructor *c = gfc_constructor_first (head);
   1339  1.1  mrg       if (c)
   1340  1.1  mrg 	{
   1341  1.1  mrg 	  r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
   1342  1.1  mrg 				  &op1->where);
   1343  1.1  mrg 	  r->shape = gfc_copy_shape (op1->shape, op1->rank);
   1344  1.1  mrg 	}
   1345  1.1  mrg       else
   1346  1.1  mrg 	{
   1347  1.1  mrg 	  gcc_assert (op1->ts.type != BT_UNKNOWN);
   1348  1.1  mrg 	  r = gfc_get_array_expr (op1->ts.type, op1->ts.kind,
   1349  1.1  mrg 				  &op1->where);
   1350  1.1  mrg 	  r->shape = gfc_get_shape (op1->rank);
   1351  1.1  mrg 	}
   1352  1.1  mrg       r->rank = op1->rank;
   1353  1.1  mrg       r->value.constructor = head;
   1354  1.1  mrg       *result = r;
   1355  1.1  mrg     }
   1356  1.1  mrg 
   1357  1.1  mrg   return rc;
   1358  1.1  mrg }
   1359  1.1  mrg 
   1360  1.1  mrg 
   1361  1.1  mrg static arith
   1362  1.1  mrg reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1363  1.1  mrg 		  gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
   1364  1.1  mrg {
   1365  1.1  mrg   gfc_constructor_base head;
   1366  1.1  mrg   gfc_constructor *c;
   1367  1.1  mrg   gfc_expr *r;
   1368  1.1  mrg   arith rc = ARITH_OK;
   1369  1.1  mrg 
   1370  1.1  mrg   head = gfc_constructor_copy (op2->value.constructor);
   1371  1.1  mrg   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
   1372  1.1  mrg     {
   1373  1.1  mrg       gfc_simplify_expr (c->expr, 0);
   1374  1.1  mrg 
   1375  1.1  mrg       if (c->expr->expr_type == EXPR_CONSTANT)
   1376  1.1  mrg 	rc = eval (op1, c->expr, &r);
   1377  1.1  mrg       else
   1378  1.1  mrg 	rc = reduce_binary_ca (eval, op1, c->expr, &r);
   1379  1.1  mrg 
   1380  1.1  mrg       if (rc != ARITH_OK)
   1381  1.1  mrg 	break;
   1382  1.1  mrg 
   1383  1.1  mrg       gfc_replace_expr (c->expr, r);
   1384  1.1  mrg     }
   1385  1.1  mrg 
   1386  1.1  mrg   if (rc != ARITH_OK)
   1387  1.1  mrg     gfc_constructor_free (head);
   1388  1.1  mrg   else
   1389  1.1  mrg     {
   1390  1.1  mrg       gfc_constructor *c = gfc_constructor_first (head);
   1391  1.1  mrg       if (c)
   1392  1.1  mrg 	{
   1393  1.1  mrg 	  r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
   1394  1.1  mrg 				  &op2->where);
   1395  1.1  mrg 	  r->shape = gfc_copy_shape (op2->shape, op2->rank);
   1396  1.1  mrg 	}
   1397  1.1  mrg       else
   1398  1.1  mrg 	{
   1399  1.1  mrg 	  gcc_assert (op2->ts.type != BT_UNKNOWN);
   1400  1.1  mrg 	  r = gfc_get_array_expr (op2->ts.type, op2->ts.kind,
   1401  1.1  mrg 				  &op2->where);
   1402  1.1  mrg 	  r->shape = gfc_get_shape (op2->rank);
   1403  1.1  mrg 	}
   1404  1.1  mrg       r->rank = op2->rank;
   1405  1.1  mrg       r->value.constructor = head;
   1406  1.1  mrg       *result = r;
   1407  1.1  mrg     }
   1408  1.1  mrg 
   1409  1.1  mrg   return rc;
   1410  1.1  mrg }
   1411  1.1  mrg 
   1412  1.1  mrg 
   1413  1.1  mrg /* We need a forward declaration of reduce_binary.  */
   1414  1.1  mrg static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1415  1.1  mrg 			    gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
   1416  1.1  mrg 
   1417  1.1  mrg 
   1418  1.1  mrg static arith
   1419  1.1  mrg reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1420  1.1  mrg 		  gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
   1421  1.1  mrg {
   1422  1.1  mrg   gfc_constructor_base head;
   1423  1.1  mrg   gfc_constructor *c, *d;
   1424  1.1  mrg   gfc_expr *r;
   1425  1.1  mrg   arith rc = ARITH_OK;
   1426  1.1  mrg 
   1427  1.1  mrg   if (!gfc_check_conformance (op1, op2, _("elemental binary operation")))
   1428  1.1  mrg     return ARITH_INCOMMENSURATE;
   1429  1.1  mrg 
   1430  1.1  mrg   head = gfc_constructor_copy (op1->value.constructor);
   1431  1.1  mrg   for (c = gfc_constructor_first (head),
   1432  1.1  mrg        d = gfc_constructor_first (op2->value.constructor);
   1433  1.1  mrg        c && d;
   1434  1.1  mrg        c = gfc_constructor_next (c), d = gfc_constructor_next (d))
   1435  1.1  mrg     {
   1436  1.1  mrg 	rc = reduce_binary (eval, c->expr, d->expr, &r);
   1437  1.1  mrg 	if (rc != ARITH_OK)
   1438  1.1  mrg 	  break;
   1439  1.1  mrg 
   1440  1.1  mrg 	gfc_replace_expr (c->expr, r);
   1441  1.1  mrg     }
   1442  1.1  mrg 
   1443  1.1  mrg   if (c || d)
   1444  1.1  mrg     rc = ARITH_INCOMMENSURATE;
   1445  1.1  mrg 
   1446  1.1  mrg   if (rc != ARITH_OK)
   1447  1.1  mrg     gfc_constructor_free (head);
   1448  1.1  mrg   else
   1449  1.1  mrg     {
   1450  1.1  mrg       gfc_constructor *c = gfc_constructor_first (head);
   1451  1.1  mrg       if (c == NULL)
   1452  1.1  mrg 	{
   1453  1.1  mrg 	  /* Handle zero-sized arrays.  */
   1454  1.1  mrg 	  r = gfc_get_array_expr (op1->ts.type, op1->ts.kind, &op1->where);
   1455  1.1  mrg 	}
   1456  1.1  mrg       else
   1457  1.1  mrg 	{
   1458  1.1  mrg 	  r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
   1459  1.1  mrg 				  &op1->where);
   1460  1.1  mrg 	}
   1461  1.1  mrg       r->shape = gfc_copy_shape (op1->shape, op1->rank);
   1462  1.1  mrg       r->rank = op1->rank;
   1463  1.1  mrg       r->value.constructor = head;
   1464  1.1  mrg       *result = r;
   1465  1.1  mrg     }
   1466  1.1  mrg 
   1467  1.1  mrg   return rc;
   1468  1.1  mrg }
   1469  1.1  mrg 
   1470  1.1  mrg 
   1471  1.1  mrg static arith
   1472  1.1  mrg reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1473  1.1  mrg 	       gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
   1474  1.1  mrg {
   1475  1.1  mrg   if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
   1476  1.1  mrg     return eval (op1, op2, result);
   1477  1.1  mrg 
   1478  1.1  mrg   if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
   1479  1.1  mrg     return reduce_binary_ca (eval, op1, op2, result);
   1480  1.1  mrg 
   1481  1.1  mrg   if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
   1482  1.1  mrg     return reduce_binary_ac (eval, op1, op2, result);
   1483  1.1  mrg 
   1484  1.1  mrg   return reduce_binary_aa (eval, op1, op2, result);
   1485  1.1  mrg }
   1486  1.1  mrg 
   1487  1.1  mrg 
   1488  1.1  mrg typedef union
   1489  1.1  mrg {
   1490  1.1  mrg   arith (*f2)(gfc_expr *, gfc_expr **);
   1491  1.1  mrg   arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
   1492  1.1  mrg }
   1493  1.1  mrg eval_f;
   1494  1.1  mrg 
   1495  1.1  mrg /* High level arithmetic subroutines.  These subroutines go into
   1496  1.1  mrg    eval_intrinsic(), which can do one of several things to its
   1497  1.1  mrg    operands.  If the operands are incompatible with the intrinsic
   1498  1.1  mrg    operation, we return a node pointing to the operands and hope that
   1499  1.1  mrg    an operator interface is found during resolution.
   1500  1.1  mrg 
   1501  1.1  mrg    If the operands are compatible and are constants, then we try doing
   1502  1.1  mrg    the arithmetic.  We also handle the cases where either or both
   1503  1.1  mrg    operands are array constructors.  */
   1504  1.1  mrg 
   1505  1.1  mrg static gfc_expr *
   1506  1.1  mrg eval_intrinsic (gfc_intrinsic_op op,
   1507  1.1  mrg 		eval_f eval, gfc_expr *op1, gfc_expr *op2)
   1508  1.1  mrg {
   1509  1.1  mrg   gfc_expr temp, *result;
   1510  1.1  mrg   int unary;
   1511  1.1  mrg   arith rc;
   1512  1.1  mrg 
   1513  1.1  mrg   if (!op1)
   1514  1.1  mrg     return NULL;
   1515  1.1  mrg 
   1516  1.1  mrg   gfc_clear_ts (&temp.ts);
   1517  1.1  mrg 
   1518  1.1  mrg   switch (op)
   1519  1.1  mrg     {
   1520  1.1  mrg     /* Logical unary  */
   1521  1.1  mrg     case INTRINSIC_NOT:
   1522  1.1  mrg       if (op1->ts.type != BT_LOGICAL)
   1523  1.1  mrg 	goto runtime;
   1524  1.1  mrg 
   1525  1.1  mrg       temp.ts.type = BT_LOGICAL;
   1526  1.1  mrg       temp.ts.kind = gfc_default_logical_kind;
   1527  1.1  mrg       unary = 1;
   1528  1.1  mrg       break;
   1529  1.1  mrg 
   1530  1.1  mrg     /* Logical binary operators  */
   1531  1.1  mrg     case INTRINSIC_OR:
   1532  1.1  mrg     case INTRINSIC_AND:
   1533  1.1  mrg     case INTRINSIC_NEQV:
   1534  1.1  mrg     case INTRINSIC_EQV:
   1535  1.1  mrg       if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
   1536  1.1  mrg 	goto runtime;
   1537  1.1  mrg 
   1538  1.1  mrg       temp.ts.type = BT_LOGICAL;
   1539  1.1  mrg       temp.ts.kind = gfc_default_logical_kind;
   1540  1.1  mrg       unary = 0;
   1541  1.1  mrg       break;
   1542  1.1  mrg 
   1543  1.1  mrg     /* Numeric unary  */
   1544  1.1  mrg     case INTRINSIC_UPLUS:
   1545  1.1  mrg     case INTRINSIC_UMINUS:
   1546  1.1  mrg       if (!gfc_numeric_ts (&op1->ts))
   1547  1.1  mrg 	goto runtime;
   1548  1.1  mrg 
   1549  1.1  mrg       temp.ts = op1->ts;
   1550  1.1  mrg       unary = 1;
   1551  1.1  mrg       break;
   1552  1.1  mrg 
   1553  1.1  mrg     case INTRINSIC_PARENTHESES:
   1554  1.1  mrg       temp.ts = op1->ts;
   1555  1.1  mrg       unary = 1;
   1556  1.1  mrg       break;
   1557  1.1  mrg 
   1558  1.1  mrg     /* Additional restrictions for ordering relations.  */
   1559  1.1  mrg     case INTRINSIC_GE:
   1560  1.1  mrg     case INTRINSIC_GE_OS:
   1561  1.1  mrg     case INTRINSIC_LT:
   1562  1.1  mrg     case INTRINSIC_LT_OS:
   1563  1.1  mrg     case INTRINSIC_LE:
   1564  1.1  mrg     case INTRINSIC_LE_OS:
   1565  1.1  mrg     case INTRINSIC_GT:
   1566  1.1  mrg     case INTRINSIC_GT_OS:
   1567  1.1  mrg       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
   1568  1.1  mrg 	{
   1569  1.1  mrg 	  temp.ts.type = BT_LOGICAL;
   1570  1.1  mrg 	  temp.ts.kind = gfc_default_logical_kind;
   1571  1.1  mrg 	  goto runtime;
   1572  1.1  mrg 	}
   1573  1.1  mrg 
   1574  1.1  mrg     /* Fall through  */
   1575  1.1  mrg     case INTRINSIC_EQ:
   1576  1.1  mrg     case INTRINSIC_EQ_OS:
   1577  1.1  mrg     case INTRINSIC_NE:
   1578  1.1  mrg     case INTRINSIC_NE_OS:
   1579  1.1  mrg       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
   1580  1.1  mrg 	{
   1581  1.1  mrg 	  unary = 0;
   1582  1.1  mrg 	  temp.ts.type = BT_LOGICAL;
   1583  1.1  mrg 	  temp.ts.kind = gfc_default_logical_kind;
   1584  1.1  mrg 
   1585  1.1  mrg 	  /* If kind mismatch, exit and we'll error out later.  */
   1586  1.1  mrg 	  if (op1->ts.kind != op2->ts.kind)
   1587  1.1  mrg 	    goto runtime;
   1588  1.1  mrg 
   1589  1.1  mrg 	  break;
   1590  1.1  mrg 	}
   1591  1.1  mrg 
   1592  1.1  mrg     gcc_fallthrough ();
   1593  1.1  mrg     /* Numeric binary  */
   1594  1.1  mrg     case INTRINSIC_PLUS:
   1595  1.1  mrg     case INTRINSIC_MINUS:
   1596  1.1  mrg     case INTRINSIC_TIMES:
   1597  1.1  mrg     case INTRINSIC_DIVIDE:
   1598  1.1  mrg     case INTRINSIC_POWER:
   1599  1.1  mrg       if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
   1600  1.1  mrg 	goto runtime;
   1601  1.1  mrg 
   1602  1.1  mrg       /* Insert any necessary type conversions to make the operands
   1603  1.1  mrg 	 compatible.  */
   1604  1.1  mrg 
   1605  1.1  mrg       temp.expr_type = EXPR_OP;
   1606  1.1  mrg       gfc_clear_ts (&temp.ts);
   1607  1.1  mrg       temp.value.op.op = op;
   1608  1.1  mrg 
   1609  1.1  mrg       temp.value.op.op1 = op1;
   1610  1.1  mrg       temp.value.op.op2 = op2;
   1611  1.1  mrg 
   1612  1.1  mrg       gfc_type_convert_binary (&temp, warn_conversion || warn_conversion_extra);
   1613  1.1  mrg 
   1614  1.1  mrg       if (op == INTRINSIC_EQ || op == INTRINSIC_NE
   1615  1.1  mrg 	  || op == INTRINSIC_GE || op == INTRINSIC_GT
   1616  1.1  mrg 	  || op == INTRINSIC_LE || op == INTRINSIC_LT
   1617  1.1  mrg 	  || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
   1618  1.1  mrg 	  || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
   1619  1.1  mrg 	  || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
   1620  1.1  mrg 	{
   1621  1.1  mrg 	  temp.ts.type = BT_LOGICAL;
   1622  1.1  mrg 	  temp.ts.kind = gfc_default_logical_kind;
   1623  1.1  mrg 	}
   1624  1.1  mrg 
   1625  1.1  mrg       unary = 0;
   1626  1.1  mrg       break;
   1627  1.1  mrg 
   1628  1.1  mrg     /* Character binary  */
   1629  1.1  mrg     case INTRINSIC_CONCAT:
   1630  1.1  mrg       if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
   1631  1.1  mrg 	  || op1->ts.kind != op2->ts.kind)
   1632  1.1  mrg 	goto runtime;
   1633  1.1  mrg 
   1634  1.1  mrg       temp.ts.type = BT_CHARACTER;
   1635  1.1  mrg       temp.ts.kind = op1->ts.kind;
   1636  1.1  mrg       unary = 0;
   1637  1.1  mrg       break;
   1638  1.1  mrg 
   1639  1.1  mrg     case INTRINSIC_USER:
   1640  1.1  mrg       goto runtime;
   1641  1.1  mrg 
   1642  1.1  mrg     default:
   1643  1.1  mrg       gfc_internal_error ("eval_intrinsic(): Bad operator");
   1644  1.1  mrg     }
   1645  1.1  mrg 
   1646  1.1  mrg   if (op1->expr_type != EXPR_CONSTANT
   1647  1.1  mrg       && (op1->expr_type != EXPR_ARRAY
   1648  1.1  mrg 	  || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
   1649  1.1  mrg     goto runtime;
   1650  1.1  mrg 
   1651  1.1  mrg   if (op2 != NULL
   1652  1.1  mrg       && op2->expr_type != EXPR_CONSTANT
   1653  1.1  mrg 	 && (op2->expr_type != EXPR_ARRAY
   1654  1.1  mrg 	     || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
   1655  1.1  mrg     goto runtime;
   1656  1.1  mrg 
   1657  1.1  mrg   if (unary)
   1658  1.1  mrg     rc = reduce_unary (eval.f2, op1, &result);
   1659  1.1  mrg   else
   1660  1.1  mrg     rc = reduce_binary (eval.f3, op1, op2, &result);
   1661  1.1  mrg 
   1662  1.1  mrg 
   1663  1.1  mrg   /* Something went wrong.  */
   1664  1.1  mrg   if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
   1665  1.1  mrg     return NULL;
   1666  1.1  mrg 
   1667  1.1  mrg   if (rc != ARITH_OK)
   1668  1.1  mrg     {
   1669  1.1  mrg       gfc_error (gfc_arith_error (rc), &op1->where);
   1670  1.1  mrg       if (rc == ARITH_OVERFLOW)
   1671  1.1  mrg 	goto done;
   1672  1.1  mrg 
   1673  1.1  mrg       if (rc == ARITH_DIV0 && op2->ts.type == BT_INTEGER)
   1674  1.1  mrg 	gfc_seen_div0 = true;
   1675  1.1  mrg 
   1676  1.1  mrg       return NULL;
   1677  1.1  mrg     }
   1678  1.1  mrg 
   1679  1.1  mrg done:
   1680  1.1  mrg 
   1681  1.1  mrg   gfc_free_expr (op1);
   1682  1.1  mrg   gfc_free_expr (op2);
   1683  1.1  mrg   return result;
   1684  1.1  mrg 
   1685  1.1  mrg runtime:
   1686  1.1  mrg   /* Create a run-time expression.  */
   1687  1.1  mrg   result = gfc_get_operator_expr (&op1->where, op, op1, op2);
   1688  1.1  mrg   result->ts = temp.ts;
   1689  1.1  mrg 
   1690  1.1  mrg   return result;
   1691  1.1  mrg }
   1692  1.1  mrg 
   1693  1.1  mrg 
   1694  1.1  mrg /* Modify type of expression for zero size array.  */
   1695  1.1  mrg 
   1696  1.1  mrg static gfc_expr *
   1697  1.1  mrg eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
   1698  1.1  mrg {
   1699  1.1  mrg   if (op == NULL)
   1700  1.1  mrg     gfc_internal_error ("eval_type_intrinsic0(): op NULL");
   1701  1.1  mrg 
   1702  1.1  mrg   switch (iop)
   1703  1.1  mrg     {
   1704  1.1  mrg     case INTRINSIC_GE:
   1705  1.1  mrg     case INTRINSIC_GE_OS:
   1706  1.1  mrg     case INTRINSIC_LT:
   1707  1.1  mrg     case INTRINSIC_LT_OS:
   1708  1.1  mrg     case INTRINSIC_LE:
   1709  1.1  mrg     case INTRINSIC_LE_OS:
   1710  1.1  mrg     case INTRINSIC_GT:
   1711  1.1  mrg     case INTRINSIC_GT_OS:
   1712  1.1  mrg     case INTRINSIC_EQ:
   1713  1.1  mrg     case INTRINSIC_EQ_OS:
   1714  1.1  mrg     case INTRINSIC_NE:
   1715  1.1  mrg     case INTRINSIC_NE_OS:
   1716  1.1  mrg       op->ts.type = BT_LOGICAL;
   1717  1.1  mrg       op->ts.kind = gfc_default_logical_kind;
   1718  1.1  mrg       break;
   1719  1.1  mrg 
   1720  1.1  mrg     default:
   1721  1.1  mrg       break;
   1722  1.1  mrg     }
   1723  1.1  mrg 
   1724  1.1  mrg   return op;
   1725  1.1  mrg }
   1726  1.1  mrg 
   1727  1.1  mrg 
   1728  1.1  mrg /* Return nonzero if the expression is a zero size array.  */
   1729  1.1  mrg 
   1730  1.1  mrg static bool
   1731  1.1  mrg gfc_zero_size_array (gfc_expr *e)
   1732  1.1  mrg {
   1733  1.1  mrg   if (e == NULL || e->expr_type != EXPR_ARRAY)
   1734  1.1  mrg     return false;
   1735  1.1  mrg 
   1736  1.1  mrg   return e->value.constructor == NULL;
   1737  1.1  mrg }
   1738  1.1  mrg 
   1739  1.1  mrg 
   1740  1.1  mrg /* Reduce a binary expression where at least one of the operands
   1741  1.1  mrg    involves a zero-length array.  Returns NULL if neither of the
   1742  1.1  mrg    operands is a zero-length array.  */
   1743  1.1  mrg 
   1744  1.1  mrg static gfc_expr *
   1745  1.1  mrg reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
   1746  1.1  mrg {
   1747  1.1  mrg   if (gfc_zero_size_array (op1))
   1748  1.1  mrg     {
   1749  1.1  mrg       gfc_free_expr (op2);
   1750  1.1  mrg       return op1;
   1751  1.1  mrg     }
   1752  1.1  mrg 
   1753  1.1  mrg   if (gfc_zero_size_array (op2))
   1754  1.1  mrg     {
   1755  1.1  mrg       gfc_free_expr (op1);
   1756  1.1  mrg       return op2;
   1757  1.1  mrg     }
   1758  1.1  mrg 
   1759  1.1  mrg   return NULL;
   1760  1.1  mrg }
   1761  1.1  mrg 
   1762  1.1  mrg 
   1763  1.1  mrg static gfc_expr *
   1764  1.1  mrg eval_intrinsic_f2 (gfc_intrinsic_op op,
   1765  1.1  mrg 		   arith (*eval) (gfc_expr *, gfc_expr **),
   1766  1.1  mrg 		   gfc_expr *op1, gfc_expr *op2)
   1767  1.1  mrg {
   1768  1.1  mrg   gfc_expr *result;
   1769  1.1  mrg   eval_f f;
   1770  1.1  mrg 
   1771  1.1  mrg   if (op2 == NULL)
   1772  1.1  mrg     {
   1773  1.1  mrg       if (gfc_zero_size_array (op1))
   1774  1.1  mrg 	return eval_type_intrinsic0 (op, op1);
   1775  1.1  mrg     }
   1776  1.1  mrg   else
   1777  1.1  mrg     {
   1778  1.1  mrg       result = reduce_binary0 (op1, op2);
   1779  1.1  mrg       if (result != NULL)
   1780  1.1  mrg 	return eval_type_intrinsic0 (op, result);
   1781  1.1  mrg     }
   1782  1.1  mrg 
   1783  1.1  mrg   f.f2 = eval;
   1784  1.1  mrg   return eval_intrinsic (op, f, op1, op2);
   1785  1.1  mrg }
   1786  1.1  mrg 
   1787  1.1  mrg 
   1788  1.1  mrg static gfc_expr *
   1789  1.1  mrg eval_intrinsic_f3 (gfc_intrinsic_op op,
   1790  1.1  mrg 		   arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
   1791  1.1  mrg 		   gfc_expr *op1, gfc_expr *op2)
   1792  1.1  mrg {
   1793  1.1  mrg   gfc_expr *result;
   1794  1.1  mrg   eval_f f;
   1795  1.1  mrg 
   1796  1.1  mrg   if (!op1 && !op2)
   1797  1.1  mrg     return NULL;
   1798  1.1  mrg 
   1799  1.1  mrg   result = reduce_binary0 (op1, op2);
   1800  1.1  mrg   if (result != NULL)
   1801  1.1  mrg     return eval_type_intrinsic0(op, result);
   1802  1.1  mrg 
   1803  1.1  mrg   f.f3 = eval;
   1804  1.1  mrg   return eval_intrinsic (op, f, op1, op2);
   1805  1.1  mrg }
   1806  1.1  mrg 
   1807  1.1  mrg 
   1808  1.1  mrg gfc_expr *
   1809  1.1  mrg gfc_parentheses (gfc_expr *op)
   1810  1.1  mrg {
   1811  1.1  mrg   if (gfc_is_constant_expr (op))
   1812  1.1  mrg     return op;
   1813  1.1  mrg 
   1814  1.1  mrg   return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
   1815  1.1  mrg 			    op, NULL);
   1816  1.1  mrg }
   1817  1.1  mrg 
   1818  1.1  mrg gfc_expr *
   1819  1.1  mrg gfc_uplus (gfc_expr *op)
   1820  1.1  mrg {
   1821  1.1  mrg   return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
   1822  1.1  mrg }
   1823  1.1  mrg 
   1824  1.1  mrg 
   1825  1.1  mrg gfc_expr *
   1826  1.1  mrg gfc_uminus (gfc_expr *op)
   1827  1.1  mrg {
   1828  1.1  mrg   return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
   1829  1.1  mrg }
   1830  1.1  mrg 
   1831  1.1  mrg 
   1832  1.1  mrg gfc_expr *
   1833  1.1  mrg gfc_add (gfc_expr *op1, gfc_expr *op2)
   1834  1.1  mrg {
   1835  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
   1836  1.1  mrg }
   1837  1.1  mrg 
   1838  1.1  mrg 
   1839  1.1  mrg gfc_expr *
   1840  1.1  mrg gfc_subtract (gfc_expr *op1, gfc_expr *op2)
   1841  1.1  mrg {
   1842  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
   1843  1.1  mrg }
   1844  1.1  mrg 
   1845  1.1  mrg 
   1846  1.1  mrg gfc_expr *
   1847  1.1  mrg gfc_multiply (gfc_expr *op1, gfc_expr *op2)
   1848  1.1  mrg {
   1849  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
   1850  1.1  mrg }
   1851  1.1  mrg 
   1852  1.1  mrg 
   1853  1.1  mrg gfc_expr *
   1854  1.1  mrg gfc_divide (gfc_expr *op1, gfc_expr *op2)
   1855  1.1  mrg {
   1856  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
   1857  1.1  mrg }
   1858  1.1  mrg 
   1859  1.1  mrg 
   1860  1.1  mrg gfc_expr *
   1861  1.1  mrg gfc_power (gfc_expr *op1, gfc_expr *op2)
   1862  1.1  mrg {
   1863  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
   1864  1.1  mrg }
   1865  1.1  mrg 
   1866  1.1  mrg 
   1867  1.1  mrg gfc_expr *
   1868  1.1  mrg gfc_concat (gfc_expr *op1, gfc_expr *op2)
   1869  1.1  mrg {
   1870  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
   1871  1.1  mrg }
   1872  1.1  mrg 
   1873  1.1  mrg 
   1874  1.1  mrg gfc_expr *
   1875  1.1  mrg gfc_and (gfc_expr *op1, gfc_expr *op2)
   1876  1.1  mrg {
   1877  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
   1878  1.1  mrg }
   1879  1.1  mrg 
   1880  1.1  mrg 
   1881  1.1  mrg gfc_expr *
   1882  1.1  mrg gfc_or (gfc_expr *op1, gfc_expr *op2)
   1883  1.1  mrg {
   1884  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
   1885  1.1  mrg }
   1886  1.1  mrg 
   1887  1.1  mrg 
   1888  1.1  mrg gfc_expr *
   1889  1.1  mrg gfc_not (gfc_expr *op1)
   1890  1.1  mrg {
   1891  1.1  mrg   return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
   1892  1.1  mrg }
   1893  1.1  mrg 
   1894  1.1  mrg 
   1895  1.1  mrg gfc_expr *
   1896  1.1  mrg gfc_eqv (gfc_expr *op1, gfc_expr *op2)
   1897  1.1  mrg {
   1898  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
   1899  1.1  mrg }
   1900  1.1  mrg 
   1901  1.1  mrg 
   1902  1.1  mrg gfc_expr *
   1903  1.1  mrg gfc_neqv (gfc_expr *op1, gfc_expr *op2)
   1904  1.1  mrg {
   1905  1.1  mrg   return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
   1906  1.1  mrg }
   1907  1.1  mrg 
   1908  1.1  mrg 
   1909  1.1  mrg gfc_expr *
   1910  1.1  mrg gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1911  1.1  mrg {
   1912  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
   1913  1.1  mrg }
   1914  1.1  mrg 
   1915  1.1  mrg 
   1916  1.1  mrg gfc_expr *
   1917  1.1  mrg gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1918  1.1  mrg {
   1919  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
   1920  1.1  mrg }
   1921  1.1  mrg 
   1922  1.1  mrg 
   1923  1.1  mrg gfc_expr *
   1924  1.1  mrg gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1925  1.1  mrg {
   1926  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
   1927  1.1  mrg }
   1928  1.1  mrg 
   1929  1.1  mrg 
   1930  1.1  mrg gfc_expr *
   1931  1.1  mrg gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1932  1.1  mrg {
   1933  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
   1934  1.1  mrg }
   1935  1.1  mrg 
   1936  1.1  mrg 
   1937  1.1  mrg gfc_expr *
   1938  1.1  mrg gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1939  1.1  mrg {
   1940  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
   1941  1.1  mrg }
   1942  1.1  mrg 
   1943  1.1  mrg 
   1944  1.1  mrg gfc_expr *
   1945  1.1  mrg gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
   1946  1.1  mrg {
   1947  1.1  mrg   return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
   1948  1.1  mrg }
   1949  1.1  mrg 
   1950  1.1  mrg 
   1951  1.1  mrg /******* Simplification of intrinsic functions with constant arguments *****/
   1952  1.1  mrg 
   1953  1.1  mrg 
   1954  1.1  mrg /* Deal with an arithmetic error.  */
   1955  1.1  mrg 
   1956  1.1  mrg static void
   1957  1.1  mrg arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
   1958  1.1  mrg {
   1959  1.1  mrg   switch (rc)
   1960  1.1  mrg     {
   1961  1.1  mrg     case ARITH_OK:
   1962  1.1  mrg       gfc_error ("Arithmetic OK converting %s to %s at %L",
   1963  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1964  1.1  mrg       break;
   1965  1.1  mrg     case ARITH_OVERFLOW:
   1966  1.1  mrg       gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
   1967  1.1  mrg 		 "can be disabled with the option %<-fno-range-check%>",
   1968  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1969  1.1  mrg       break;
   1970  1.1  mrg     case ARITH_UNDERFLOW:
   1971  1.1  mrg       gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
   1972  1.1  mrg 		 "can be disabled with the option %<-fno-range-check%>",
   1973  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1974  1.1  mrg       break;
   1975  1.1  mrg     case ARITH_NAN:
   1976  1.1  mrg       gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
   1977  1.1  mrg 		 "can be disabled with the option %<-fno-range-check%>",
   1978  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1979  1.1  mrg       break;
   1980  1.1  mrg     case ARITH_DIV0:
   1981  1.1  mrg       gfc_error ("Division by zero converting %s to %s at %L",
   1982  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1983  1.1  mrg       break;
   1984  1.1  mrg     case ARITH_INCOMMENSURATE:
   1985  1.1  mrg       gfc_error ("Array operands are incommensurate converting %s to %s at %L",
   1986  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1987  1.1  mrg       break;
   1988  1.1  mrg     case ARITH_ASYMMETRIC:
   1989  1.1  mrg       gfc_error ("Integer outside symmetric range implied by Standard Fortran"
   1990  1.1  mrg 	 	 " converting %s to %s at %L",
   1991  1.1  mrg 		 gfc_typename (from), gfc_typename (to), where);
   1992  1.1  mrg       break;
   1993  1.1  mrg     default:
   1994  1.1  mrg       gfc_internal_error ("gfc_arith_error(): Bad error code");
   1995  1.1  mrg     }
   1996  1.1  mrg 
   1997  1.1  mrg   /* TODO: Do something about the error, i.e., throw exception, return
   1998  1.1  mrg      NaN, etc.  */
   1999  1.1  mrg }
   2000  1.1  mrg 
   2001  1.1  mrg /* Returns true if significant bits were lost when converting real
   2002  1.1  mrg    constant r from from_kind to to_kind.  */
   2003  1.1  mrg 
   2004  1.1  mrg static bool
   2005  1.1  mrg wprecision_real_real (mpfr_t r, int from_kind, int to_kind)
   2006  1.1  mrg {
   2007  1.1  mrg   mpfr_t rv, diff;
   2008  1.1  mrg   bool ret;
   2009  1.1  mrg 
   2010  1.1  mrg   gfc_set_model_kind (to_kind);
   2011  1.1  mrg   mpfr_init (rv);
   2012  1.1  mrg   gfc_set_model_kind (from_kind);
   2013  1.1  mrg   mpfr_init (diff);
   2014  1.1  mrg 
   2015  1.1  mrg   mpfr_set (rv, r, GFC_RND_MODE);
   2016  1.1  mrg   mpfr_sub (diff, rv, r, GFC_RND_MODE);
   2017  1.1  mrg 
   2018  1.1  mrg   ret = ! mpfr_zero_p (diff);
   2019  1.1  mrg   mpfr_clear (rv);
   2020  1.1  mrg   mpfr_clear (diff);
   2021  1.1  mrg   return ret;
   2022  1.1  mrg }
   2023  1.1  mrg 
   2024  1.1  mrg /* Return true if conversion from an integer to a real loses precision.  */
   2025  1.1  mrg 
   2026  1.1  mrg static bool
   2027  1.1  mrg wprecision_int_real (mpz_t n, mpfr_t r)
   2028  1.1  mrg {
   2029  1.1  mrg   bool ret;
   2030  1.1  mrg   mpz_t i;
   2031  1.1  mrg   mpz_init (i);
   2032  1.1  mrg   mpfr_get_z (i, r, GFC_RND_MODE);
   2033  1.1  mrg   mpz_sub (i, i, n);
   2034  1.1  mrg   ret = mpz_cmp_si (i, 0) != 0;
   2035  1.1  mrg   mpz_clear (i);
   2036  1.1  mrg   return ret;
   2037  1.1  mrg }
   2038  1.1  mrg 
   2039  1.1  mrg /* Convert integers to integers.  */
   2040  1.1  mrg 
   2041  1.1  mrg gfc_expr *
   2042  1.1  mrg gfc_int2int (gfc_expr *src, int kind)
   2043  1.1  mrg {
   2044  1.1  mrg   gfc_expr *result;
   2045  1.1  mrg   arith rc;
   2046  1.1  mrg 
   2047  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2048  1.1  mrg 
   2049  1.1  mrg   mpz_set (result->value.integer, src->value.integer);
   2050  1.1  mrg 
   2051  1.1  mrg   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
   2052  1.1  mrg     {
   2053  1.1  mrg       if (rc == ARITH_ASYMMETRIC)
   2054  1.1  mrg 	{
   2055  1.1  mrg 	  gfc_warning (0, gfc_arith_error (rc), &src->where);
   2056  1.1  mrg 	}
   2057  1.1  mrg       else
   2058  1.1  mrg 	{
   2059  1.1  mrg 	  arith_error (rc, &src->ts, &result->ts, &src->where);
   2060  1.1  mrg 	  gfc_free_expr (result);
   2061  1.1  mrg 	  return NULL;
   2062  1.1  mrg 	}
   2063  1.1  mrg     }
   2064  1.1  mrg 
   2065  1.1  mrg   /*  If we do not trap numeric overflow, we need to convert the number to
   2066  1.1  mrg       signed, throwing away high-order bits if necessary.  */
   2067  1.1  mrg   if (flag_range_check == 0)
   2068  1.1  mrg     {
   2069  1.1  mrg       int k;
   2070  1.1  mrg 
   2071  1.1  mrg       k = gfc_validate_kind (BT_INTEGER, kind, false);
   2072  1.1  mrg       gfc_convert_mpz_to_signed (result->value.integer,
   2073  1.1  mrg 				 gfc_integer_kinds[k].bit_size);
   2074  1.1  mrg 
   2075  1.1  mrg       if (warn_conversion && !src->do_not_warn && kind < src->ts.kind)
   2076  1.1  mrg 	gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
   2077  1.1  mrg 			 gfc_typename (&src->ts), gfc_typename (&result->ts),
   2078  1.1  mrg 			 &src->where);
   2079  1.1  mrg     }
   2080  1.1  mrg   return result;
   2081  1.1  mrg }
   2082  1.1  mrg 
   2083  1.1  mrg 
   2084  1.1  mrg /* Convert integers to reals.  */
   2085  1.1  mrg 
   2086  1.1  mrg gfc_expr *
   2087  1.1  mrg gfc_int2real (gfc_expr *src, int kind)
   2088  1.1  mrg {
   2089  1.1  mrg   gfc_expr *result;
   2090  1.1  mrg   arith rc;
   2091  1.1  mrg 
   2092  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
   2093  1.1  mrg 
   2094  1.1  mrg   mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
   2095  1.1  mrg 
   2096  1.1  mrg   if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
   2097  1.1  mrg     {
   2098  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2099  1.1  mrg       gfc_free_expr (result);
   2100  1.1  mrg       return NULL;
   2101  1.1  mrg     }
   2102  1.1  mrg 
   2103  1.1  mrg   if (warn_conversion
   2104  1.1  mrg       && wprecision_int_real (src->value.integer, result->value.real))
   2105  1.1  mrg     gfc_warning (OPT_Wconversion, "Change of value in conversion "
   2106  1.1  mrg 		 "from %qs to %qs at %L",
   2107  1.1  mrg 		 gfc_typename (&src->ts),
   2108  1.1  mrg 		 gfc_typename (&result->ts),
   2109  1.1  mrg 		 &src->where);
   2110  1.1  mrg 
   2111  1.1  mrg   return result;
   2112  1.1  mrg }
   2113  1.1  mrg 
   2114  1.1  mrg 
   2115  1.1  mrg /* Convert default integer to default complex.  */
   2116  1.1  mrg 
   2117  1.1  mrg gfc_expr *
   2118  1.1  mrg gfc_int2complex (gfc_expr *src, int kind)
   2119  1.1  mrg {
   2120  1.1  mrg   gfc_expr *result;
   2121  1.1  mrg   arith rc;
   2122  1.1  mrg 
   2123  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
   2124  1.1  mrg 
   2125  1.1  mrg   mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
   2126  1.1  mrg 
   2127  1.1  mrg   if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
   2128  1.1  mrg       != ARITH_OK)
   2129  1.1  mrg     {
   2130  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2131  1.1  mrg       gfc_free_expr (result);
   2132  1.1  mrg       return NULL;
   2133  1.1  mrg     }
   2134  1.1  mrg 
   2135  1.1  mrg   if (warn_conversion
   2136  1.1  mrg       && wprecision_int_real (src->value.integer,
   2137  1.1  mrg 			      mpc_realref (result->value.complex)))
   2138  1.1  mrg       gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
   2139  1.1  mrg 		       "from %qs to %qs at %L",
   2140  1.1  mrg 		       gfc_typename (&src->ts),
   2141  1.1  mrg 		       gfc_typename (&result->ts),
   2142  1.1  mrg 		       &src->where);
   2143  1.1  mrg 
   2144  1.1  mrg   return result;
   2145  1.1  mrg }
   2146  1.1  mrg 
   2147  1.1  mrg 
   2148  1.1  mrg /* Convert default real to default integer.  */
   2149  1.1  mrg 
   2150  1.1  mrg gfc_expr *
   2151  1.1  mrg gfc_real2int (gfc_expr *src, int kind)
   2152  1.1  mrg {
   2153  1.1  mrg   gfc_expr *result;
   2154  1.1  mrg   arith rc;
   2155  1.1  mrg   bool did_warn = false;
   2156  1.1  mrg 
   2157  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2158  1.1  mrg 
   2159  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
   2160  1.1  mrg 
   2161  1.1  mrg   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
   2162  1.1  mrg     {
   2163  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2164  1.1  mrg       gfc_free_expr (result);
   2165  1.1  mrg       return NULL;
   2166  1.1  mrg     }
   2167  1.1  mrg 
   2168  1.1  mrg   /* If there was a fractional part, warn about this.  */
   2169  1.1  mrg 
   2170  1.1  mrg   if (warn_conversion)
   2171  1.1  mrg     {
   2172  1.1  mrg       mpfr_t f;
   2173  1.1  mrg       mpfr_init (f);
   2174  1.1  mrg       mpfr_frac (f, src->value.real, GFC_RND_MODE);
   2175  1.1  mrg       if (mpfr_cmp_si (f, 0) != 0)
   2176  1.1  mrg 	{
   2177  1.1  mrg 	  gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
   2178  1.1  mrg 			   "from %qs to %qs at %L", gfc_typename (&src->ts),
   2179  1.1  mrg 			   gfc_typename (&result->ts), &src->where);
   2180  1.1  mrg 	  did_warn = true;
   2181  1.1  mrg 	}
   2182  1.1  mrg     }
   2183  1.1  mrg   if (!did_warn && warn_conversion_extra)
   2184  1.1  mrg     {
   2185  1.1  mrg       gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
   2186  1.1  mrg 		       "at %L", gfc_typename (&src->ts),
   2187  1.1  mrg 		       gfc_typename (&result->ts), &src->where);
   2188  1.1  mrg     }
   2189  1.1  mrg 
   2190  1.1  mrg   return result;
   2191  1.1  mrg }
   2192  1.1  mrg 
   2193  1.1  mrg 
   2194  1.1  mrg /* Convert real to real.  */
   2195  1.1  mrg 
   2196  1.1  mrg gfc_expr *
   2197  1.1  mrg gfc_real2real (gfc_expr *src, int kind)
   2198  1.1  mrg {
   2199  1.1  mrg   gfc_expr *result;
   2200  1.1  mrg   arith rc;
   2201  1.1  mrg   bool did_warn = false;
   2202  1.1  mrg 
   2203  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
   2204  1.1  mrg 
   2205  1.1  mrg   mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
   2206  1.1  mrg 
   2207  1.1  mrg   rc = gfc_check_real_range (result->value.real, kind);
   2208  1.1  mrg 
   2209  1.1  mrg   if (rc == ARITH_UNDERFLOW)
   2210  1.1  mrg     {
   2211  1.1  mrg       if (warn_underflow)
   2212  1.1  mrg 	gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
   2213  1.1  mrg       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
   2214  1.1  mrg     }
   2215  1.1  mrg   else if (rc != ARITH_OK)
   2216  1.1  mrg     {
   2217  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2218  1.1  mrg       gfc_free_expr (result);
   2219  1.1  mrg       return NULL;
   2220  1.1  mrg     }
   2221  1.1  mrg 
   2222  1.1  mrg   /* As a special bonus, don't warn about REAL values which are not changed by
   2223  1.1  mrg      the conversion if -Wconversion is specified and -Wconversion-extra is
   2224  1.1  mrg      not.  */
   2225  1.1  mrg 
   2226  1.1  mrg   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
   2227  1.1  mrg     {
   2228  1.1  mrg       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
   2229  1.1  mrg 
   2230  1.1  mrg       /* Calculate the difference between the constant and the rounded
   2231  1.1  mrg 	 value and check it against zero.  */
   2232  1.1  mrg 
   2233  1.1  mrg       if (wprecision_real_real (src->value.real, src->ts.kind, kind))
   2234  1.1  mrg 	{
   2235  1.1  mrg 	  gfc_warning_now (w, "Change of value in conversion from "
   2236  1.1  mrg 			   "%qs to %qs at %L",
   2237  1.1  mrg 			   gfc_typename (&src->ts), gfc_typename (&result->ts),
   2238  1.1  mrg 			   &src->where);
   2239  1.1  mrg 	  /* Make sure the conversion warning is not emitted again.  */
   2240  1.1  mrg 	  did_warn = true;
   2241  1.1  mrg 	}
   2242  1.1  mrg     }
   2243  1.1  mrg 
   2244  1.1  mrg     if (!did_warn && warn_conversion_extra)
   2245  1.1  mrg       gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
   2246  1.1  mrg 		       "at %L", gfc_typename(&src->ts),
   2247  1.1  mrg 		       gfc_typename(&result->ts), &src->where);
   2248  1.1  mrg 
   2249  1.1  mrg   return result;
   2250  1.1  mrg }
   2251  1.1  mrg 
   2252  1.1  mrg 
   2253  1.1  mrg /* Convert real to complex.  */
   2254  1.1  mrg 
   2255  1.1  mrg gfc_expr *
   2256  1.1  mrg gfc_real2complex (gfc_expr *src, int kind)
   2257  1.1  mrg {
   2258  1.1  mrg   gfc_expr *result;
   2259  1.1  mrg   arith rc;
   2260  1.1  mrg   bool did_warn = false;
   2261  1.1  mrg 
   2262  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
   2263  1.1  mrg 
   2264  1.1  mrg   mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
   2265  1.1  mrg 
   2266  1.1  mrg   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
   2267  1.1  mrg 
   2268  1.1  mrg   if (rc == ARITH_UNDERFLOW)
   2269  1.1  mrg     {
   2270  1.1  mrg       if (warn_underflow)
   2271  1.1  mrg 	gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
   2272  1.1  mrg       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
   2273  1.1  mrg     }
   2274  1.1  mrg   else if (rc != ARITH_OK)
   2275  1.1  mrg     {
   2276  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2277  1.1  mrg       gfc_free_expr (result);
   2278  1.1  mrg       return NULL;
   2279  1.1  mrg     }
   2280  1.1  mrg 
   2281  1.1  mrg   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
   2282  1.1  mrg     {
   2283  1.1  mrg       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
   2284  1.1  mrg 
   2285  1.1  mrg       if (wprecision_real_real (src->value.real, src->ts.kind, kind))
   2286  1.1  mrg 	{
   2287  1.1  mrg 	  gfc_warning_now (w, "Change of value in conversion from "
   2288  1.1  mrg 			   "%qs to %qs at %L",
   2289  1.1  mrg 			   gfc_typename (&src->ts), gfc_typename (&result->ts),
   2290  1.1  mrg 			   &src->where);
   2291  1.1  mrg 	  /* Make sure the conversion warning is not emitted again.  */
   2292  1.1  mrg 	  did_warn = true;
   2293  1.1  mrg 	}
   2294  1.1  mrg     }
   2295  1.1  mrg 
   2296  1.1  mrg   if (!did_warn && warn_conversion_extra)
   2297  1.1  mrg     gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
   2298  1.1  mrg 		     "at %L", gfc_typename(&src->ts),
   2299  1.1  mrg 		     gfc_typename(&result->ts), &src->where);
   2300  1.1  mrg 
   2301  1.1  mrg   return result;
   2302  1.1  mrg }
   2303  1.1  mrg 
   2304  1.1  mrg 
   2305  1.1  mrg /* Convert complex to integer.  */
   2306  1.1  mrg 
   2307  1.1  mrg gfc_expr *
   2308  1.1  mrg gfc_complex2int (gfc_expr *src, int kind)
   2309  1.1  mrg {
   2310  1.1  mrg   gfc_expr *result;
   2311  1.1  mrg   arith rc;
   2312  1.1  mrg   bool did_warn = false;
   2313  1.1  mrg 
   2314  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2315  1.1  mrg 
   2316  1.1  mrg   gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
   2317  1.1  mrg 		   &src->where);
   2318  1.1  mrg 
   2319  1.1  mrg   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
   2320  1.1  mrg     {
   2321  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2322  1.1  mrg       gfc_free_expr (result);
   2323  1.1  mrg       return NULL;
   2324  1.1  mrg     }
   2325  1.1  mrg 
   2326  1.1  mrg   if (warn_conversion || warn_conversion_extra)
   2327  1.1  mrg     {
   2328  1.1  mrg       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
   2329  1.1  mrg 
   2330  1.1  mrg       /* See if we discarded an imaginary part.  */
   2331  1.1  mrg       if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
   2332  1.1  mrg 	{
   2333  1.1  mrg 	  gfc_warning_now (w, "Non-zero imaginary part discarded "
   2334  1.1  mrg 			   "in conversion from %qs to %qs at %L",
   2335  1.1  mrg 			   gfc_typename(&src->ts), gfc_typename (&result->ts),
   2336  1.1  mrg 			   &src->where);
   2337  1.1  mrg 	  did_warn = true;
   2338  1.1  mrg 	}
   2339  1.1  mrg 
   2340  1.1  mrg       else {
   2341  1.1  mrg 	mpfr_t f;
   2342  1.1  mrg 
   2343  1.1  mrg 	mpfr_init (f);
   2344  1.1  mrg 	mpfr_frac (f, src->value.real, GFC_RND_MODE);
   2345  1.1  mrg 	if (mpfr_cmp_si (f, 0) != 0)
   2346  1.1  mrg 	  {
   2347  1.1  mrg 	    gfc_warning_now (w, "Change of value in conversion from "
   2348  1.1  mrg 			     "%qs to %qs at %L", gfc_typename (&src->ts),
   2349  1.1  mrg 			     gfc_typename (&result->ts), &src->where);
   2350  1.1  mrg 	    did_warn = true;
   2351  1.1  mrg 	  }
   2352  1.1  mrg 	mpfr_clear (f);
   2353  1.1  mrg       }
   2354  1.1  mrg 
   2355  1.1  mrg       if (!did_warn && warn_conversion_extra)
   2356  1.1  mrg 	{
   2357  1.1  mrg 	  gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
   2358  1.1  mrg 			   "at %L", gfc_typename (&src->ts),
   2359  1.1  mrg 			   gfc_typename (&result->ts), &src->where);
   2360  1.1  mrg 	}
   2361  1.1  mrg     }
   2362  1.1  mrg 
   2363  1.1  mrg   return result;
   2364  1.1  mrg }
   2365  1.1  mrg 
   2366  1.1  mrg 
   2367  1.1  mrg /* Convert complex to real.  */
   2368  1.1  mrg 
   2369  1.1  mrg gfc_expr *
   2370  1.1  mrg gfc_complex2real (gfc_expr *src, int kind)
   2371  1.1  mrg {
   2372  1.1  mrg   gfc_expr *result;
   2373  1.1  mrg   arith rc;
   2374  1.1  mrg   bool did_warn = false;
   2375  1.1  mrg 
   2376  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
   2377  1.1  mrg 
   2378  1.1  mrg   mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
   2379  1.1  mrg 
   2380  1.1  mrg   rc = gfc_check_real_range (result->value.real, kind);
   2381  1.1  mrg 
   2382  1.1  mrg   if (rc == ARITH_UNDERFLOW)
   2383  1.1  mrg     {
   2384  1.1  mrg       if (warn_underflow)
   2385  1.1  mrg 	gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
   2386  1.1  mrg       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
   2387  1.1  mrg     }
   2388  1.1  mrg   if (rc != ARITH_OK)
   2389  1.1  mrg     {
   2390  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2391  1.1  mrg       gfc_free_expr (result);
   2392  1.1  mrg       return NULL;
   2393  1.1  mrg     }
   2394  1.1  mrg 
   2395  1.1  mrg   if (warn_conversion || warn_conversion_extra)
   2396  1.1  mrg     {
   2397  1.1  mrg       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
   2398  1.1  mrg 
   2399  1.1  mrg       /* See if we discarded an imaginary part.  */
   2400  1.1  mrg       if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
   2401  1.1  mrg 	{
   2402  1.1  mrg 	  gfc_warning (w, "Non-zero imaginary part discarded "
   2403  1.1  mrg 		       "in conversion from %qs to %qs at %L",
   2404  1.1  mrg 		       gfc_typename(&src->ts), gfc_typename (&result->ts),
   2405  1.1  mrg 		       &src->where);
   2406  1.1  mrg 	  did_warn = true;
   2407  1.1  mrg 	}
   2408  1.1  mrg 
   2409  1.1  mrg       /* Calculate the difference between the real constant and the rounded
   2410  1.1  mrg 	 value and check it against zero.  */
   2411  1.1  mrg 
   2412  1.1  mrg       if (kind > src->ts.kind
   2413  1.1  mrg 	  && wprecision_real_real (mpc_realref (src->value.complex),
   2414  1.1  mrg 				   src->ts.kind, kind))
   2415  1.1  mrg 	{
   2416  1.1  mrg 	  gfc_warning_now (w, "Change of value in conversion from "
   2417  1.1  mrg 			   "%qs to %qs at %L",
   2418  1.1  mrg 			   gfc_typename (&src->ts), gfc_typename (&result->ts),
   2419  1.1  mrg 			   &src->where);
   2420  1.1  mrg 	  /* Make sure the conversion warning is not emitted again.  */
   2421  1.1  mrg 	  did_warn = true;
   2422  1.1  mrg 	}
   2423  1.1  mrg     }
   2424  1.1  mrg 
   2425  1.1  mrg   if (!did_warn && warn_conversion_extra)
   2426  1.1  mrg     gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
   2427  1.1  mrg 		     gfc_typename(&src->ts), gfc_typename (&result->ts),
   2428  1.1  mrg 		     &src->where);
   2429  1.1  mrg 
   2430  1.1  mrg   return result;
   2431  1.1  mrg }
   2432  1.1  mrg 
   2433  1.1  mrg 
   2434  1.1  mrg /* Convert complex to complex.  */
   2435  1.1  mrg 
   2436  1.1  mrg gfc_expr *
   2437  1.1  mrg gfc_complex2complex (gfc_expr *src, int kind)
   2438  1.1  mrg {
   2439  1.1  mrg   gfc_expr *result;
   2440  1.1  mrg   arith rc;
   2441  1.1  mrg   bool did_warn = false;
   2442  1.1  mrg 
   2443  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
   2444  1.1  mrg 
   2445  1.1  mrg   mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
   2446  1.1  mrg 
   2447  1.1  mrg   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
   2448  1.1  mrg 
   2449  1.1  mrg   if (rc == ARITH_UNDERFLOW)
   2450  1.1  mrg     {
   2451  1.1  mrg       if (warn_underflow)
   2452  1.1  mrg 	gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
   2453  1.1  mrg       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
   2454  1.1  mrg     }
   2455  1.1  mrg   else if (rc != ARITH_OK)
   2456  1.1  mrg     {
   2457  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2458  1.1  mrg       gfc_free_expr (result);
   2459  1.1  mrg       return NULL;
   2460  1.1  mrg     }
   2461  1.1  mrg 
   2462  1.1  mrg   rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
   2463  1.1  mrg 
   2464  1.1  mrg   if (rc == ARITH_UNDERFLOW)
   2465  1.1  mrg     {
   2466  1.1  mrg       if (warn_underflow)
   2467  1.1  mrg 	gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
   2468  1.1  mrg       mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
   2469  1.1  mrg     }
   2470  1.1  mrg   else if (rc != ARITH_OK)
   2471  1.1  mrg     {
   2472  1.1  mrg       arith_error (rc, &src->ts, &result->ts, &src->where);
   2473  1.1  mrg       gfc_free_expr (result);
   2474  1.1  mrg       return NULL;
   2475  1.1  mrg     }
   2476  1.1  mrg 
   2477  1.1  mrg   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind
   2478  1.1  mrg       && (wprecision_real_real (mpc_realref (src->value.complex),
   2479  1.1  mrg 				src->ts.kind, kind)
   2480  1.1  mrg 	  || wprecision_real_real (mpc_imagref (src->value.complex),
   2481  1.1  mrg 				   src->ts.kind, kind)))
   2482  1.1  mrg     {
   2483  1.1  mrg       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
   2484  1.1  mrg 
   2485  1.1  mrg       gfc_warning_now (w, "Change of value in conversion from "
   2486  1.1  mrg 		       "%qs to %qs at %L",
   2487  1.1  mrg 		       gfc_typename (&src->ts), gfc_typename (&result->ts),
   2488  1.1  mrg 		       &src->where);
   2489  1.1  mrg       did_warn = true;
   2490  1.1  mrg     }
   2491  1.1  mrg 
   2492  1.1  mrg   if (!did_warn && warn_conversion_extra && src->ts.kind != kind)
   2493  1.1  mrg     gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
   2494  1.1  mrg 		     "at %L", gfc_typename(&src->ts),
   2495  1.1  mrg 		     gfc_typename (&result->ts), &src->where);
   2496  1.1  mrg 
   2497  1.1  mrg   return result;
   2498  1.1  mrg }
   2499  1.1  mrg 
   2500  1.1  mrg 
   2501  1.1  mrg /* Logical kind conversion.  */
   2502  1.1  mrg 
   2503  1.1  mrg gfc_expr *
   2504  1.1  mrg gfc_log2log (gfc_expr *src, int kind)
   2505  1.1  mrg {
   2506  1.1  mrg   gfc_expr *result;
   2507  1.1  mrg 
   2508  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
   2509  1.1  mrg   result->value.logical = src->value.logical;
   2510  1.1  mrg 
   2511  1.1  mrg   return result;
   2512  1.1  mrg }
   2513  1.1  mrg 
   2514  1.1  mrg 
   2515  1.1  mrg /* Convert logical to integer.  */
   2516  1.1  mrg 
   2517  1.1  mrg gfc_expr *
   2518  1.1  mrg gfc_log2int (gfc_expr *src, int kind)
   2519  1.1  mrg {
   2520  1.1  mrg   gfc_expr *result;
   2521  1.1  mrg 
   2522  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2523  1.1  mrg   mpz_set_si (result->value.integer, src->value.logical);
   2524  1.1  mrg 
   2525  1.1  mrg   return result;
   2526  1.1  mrg }
   2527  1.1  mrg 
   2528  1.1  mrg 
   2529  1.1  mrg /* Convert integer to logical.  */
   2530  1.1  mrg 
   2531  1.1  mrg gfc_expr *
   2532  1.1  mrg gfc_int2log (gfc_expr *src, int kind)
   2533  1.1  mrg {
   2534  1.1  mrg   gfc_expr *result;
   2535  1.1  mrg 
   2536  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
   2537  1.1  mrg   result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
   2538  1.1  mrg 
   2539  1.1  mrg   return result;
   2540  1.1  mrg }
   2541  1.1  mrg 
   2542  1.1  mrg /* Convert character to character. We only use wide strings internally,
   2543  1.1  mrg    so we only set the kind.  */
   2544  1.1  mrg 
   2545  1.1  mrg gfc_expr *
   2546  1.1  mrg gfc_character2character (gfc_expr *src, int kind)
   2547  1.1  mrg {
   2548  1.1  mrg   gfc_expr *result;
   2549  1.1  mrg   result = gfc_copy_expr (src);
   2550  1.1  mrg   result->ts.kind = kind;
   2551  1.1  mrg 
   2552  1.1  mrg   return result;
   2553  1.1  mrg }
   2554  1.1  mrg 
   2555  1.1  mrg /* Helper function to set the representation in a Hollerith conversion.
   2556  1.1  mrg    This assumes that the ts.type and ts.kind of the result have already
   2557  1.1  mrg    been set.  */
   2558  1.1  mrg 
   2559  1.1  mrg static void
   2560  1.1  mrg hollerith2representation (gfc_expr *result, gfc_expr *src)
   2561  1.1  mrg {
   2562  1.1  mrg   size_t src_len, result_len;
   2563  1.1  mrg 
   2564  1.1  mrg   src_len = src->representation.length - src->ts.u.pad;
   2565  1.1  mrg   gfc_target_expr_size (result, &result_len);
   2566  1.1  mrg 
   2567  1.1  mrg   if (src_len > result_len)
   2568  1.1  mrg     {
   2569  1.1  mrg       gfc_warning (OPT_Wcharacter_truncation, "The Hollerith constant at %L "
   2570  1.1  mrg 		   "is truncated in conversion to %qs", &src->where,
   2571  1.1  mrg 		   gfc_typename(&result->ts));
   2572  1.1  mrg     }
   2573  1.1  mrg 
   2574  1.1  mrg   result->representation.string = XCNEWVEC (char, result_len + 1);
   2575  1.1  mrg   memcpy (result->representation.string, src->representation.string,
   2576  1.1  mrg 	  MIN (result_len, src_len));
   2577  1.1  mrg 
   2578  1.1  mrg   if (src_len < result_len)
   2579  1.1  mrg     memset (&result->representation.string[src_len], ' ', result_len - src_len);
   2580  1.1  mrg 
   2581  1.1  mrg   result->representation.string[result_len] = '\0'; /* For debugger  */
   2582  1.1  mrg   result->representation.length = result_len;
   2583  1.1  mrg }
   2584  1.1  mrg 
   2585  1.1  mrg 
   2586  1.1  mrg /* Helper function to set the representation in a character conversion.
   2587  1.1  mrg    This assumes that the ts.type and ts.kind of the result have already
   2588  1.1  mrg    been set.  */
   2589  1.1  mrg 
   2590  1.1  mrg static void
   2591  1.1  mrg character2representation (gfc_expr *result, gfc_expr *src)
   2592  1.1  mrg {
   2593  1.1  mrg   size_t src_len, result_len, i;
   2594  1.1  mrg   src_len = src->value.character.length;
   2595  1.1  mrg   gfc_target_expr_size (result, &result_len);
   2596  1.1  mrg 
   2597  1.1  mrg   if (src_len > result_len)
   2598  1.1  mrg     gfc_warning (OPT_Wcharacter_truncation, "The character constant at %L is "
   2599  1.1  mrg 		 "truncated in conversion to %s", &src->where,
   2600  1.1  mrg 		 gfc_typename(&result->ts));
   2601  1.1  mrg 
   2602  1.1  mrg   result->representation.string = XCNEWVEC (char, result_len + 1);
   2603  1.1  mrg 
   2604  1.1  mrg   for (i = 0; i < MIN (result_len, src_len); i++)
   2605  1.1  mrg     result->representation.string[i] = (char) src->value.character.string[i];
   2606  1.1  mrg 
   2607  1.1  mrg   if (src_len < result_len)
   2608  1.1  mrg     memset (&result->representation.string[src_len], ' ',
   2609  1.1  mrg 	    result_len - src_len);
   2610  1.1  mrg 
   2611  1.1  mrg   result->representation.string[result_len] = '\0'; /* For debugger.  */
   2612  1.1  mrg   result->representation.length = result_len;
   2613  1.1  mrg }
   2614  1.1  mrg 
   2615  1.1  mrg /* Convert Hollerith to integer. The constant will be padded or truncated.  */
   2616  1.1  mrg 
   2617  1.1  mrg gfc_expr *
   2618  1.1  mrg gfc_hollerith2int (gfc_expr *src, int kind)
   2619  1.1  mrg {
   2620  1.1  mrg   gfc_expr *result;
   2621  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2622  1.1  mrg 
   2623  1.1  mrg   hollerith2representation (result, src);
   2624  1.1  mrg   gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
   2625  1.1  mrg 			 result->representation.length, result->value.integer);
   2626  1.1  mrg 
   2627  1.1  mrg   return result;
   2628  1.1  mrg }
   2629  1.1  mrg 
   2630  1.1  mrg /* Convert character to integer.  The constant will be padded or truncated.  */
   2631  1.1  mrg 
   2632  1.1  mrg gfc_expr *
   2633  1.1  mrg gfc_character2int (gfc_expr *src, int kind)
   2634  1.1  mrg {
   2635  1.1  mrg   gfc_expr *result;
   2636  1.1  mrg   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
   2637  1.1  mrg 
   2638  1.1  mrg   character2representation (result, src);
   2639  1.1  mrg   gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
   2640  1.1  mrg 			 result->representation.length, result->value.integer);
   2641  1.1  mrg   return result;
   2642  1.1  mrg }
   2643  1.1  mrg 
   2644  1.1  mrg /* Convert Hollerith to real.  The constant will be padded or truncated.  */
   2645  1.1  mrg 
   2646  1.1  mrg gfc_expr *
   2647  1.1  mrg gfc_hollerith2real (gfc_expr *src, int kind)
   2648  1.1  mrg {
   2649  1.1  mrg   gfc_expr *result;
   2650  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
   2651  1.1  mrg 
   2652  1.1  mrg   hollerith2representation (result, src);
   2653  1.1  mrg   gfc_interpret_float (kind, (unsigned char *) result->representation.string,
   2654  1.1  mrg 		       result->representation.length, result->value.real);
   2655  1.1  mrg 
   2656  1.1  mrg   return result;
   2657  1.1  mrg }
   2658  1.1  mrg 
   2659  1.1  mrg /* Convert character to real.  The constant will be padded or truncated.  */
   2660  1.1  mrg 
   2661  1.1  mrg gfc_expr *
   2662  1.1  mrg gfc_character2real (gfc_expr *src, int kind)
   2663  1.1  mrg {
   2664  1.1  mrg   gfc_expr *result;
   2665  1.1  mrg   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
   2666  1.1  mrg 
   2667  1.1  mrg   character2representation (result, src);
   2668  1.1  mrg   gfc_interpret_float (kind, (unsigned char *) result->representation.string,
   2669  1.1  mrg 		       result->representation.length, result->value.real);
   2670  1.1  mrg 
   2671  1.1  mrg   return result;
   2672  1.1  mrg }
   2673  1.1  mrg 
   2674  1.1  mrg 
   2675  1.1  mrg /* Convert Hollerith to complex. The constant will be padded or truncated.  */
   2676  1.1  mrg 
   2677  1.1  mrg gfc_expr *
   2678  1.1  mrg gfc_hollerith2complex (gfc_expr *src, int kind)
   2679  1.1  mrg {
   2680  1.1  mrg   gfc_expr *result;
   2681  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
   2682  1.1  mrg 
   2683  1.1  mrg   hollerith2representation (result, src);
   2684  1.1  mrg   gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
   2685  1.1  mrg 			 result->representation.length, result->value.complex);
   2686  1.1  mrg 
   2687  1.1  mrg   return result;
   2688  1.1  mrg }
   2689  1.1  mrg 
   2690  1.1  mrg /* Convert character to complex. The constant will be padded or truncated.  */
   2691  1.1  mrg 
   2692  1.1  mrg gfc_expr *
   2693  1.1  mrg gfc_character2complex (gfc_expr *src, int kind)
   2694  1.1  mrg {
   2695  1.1  mrg   gfc_expr *result;
   2696  1.1  mrg   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
   2697  1.1  mrg 
   2698  1.1  mrg   character2representation (result, src);
   2699  1.1  mrg   gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
   2700  1.1  mrg 			 result->representation.length, result->value.complex);
   2701  1.1  mrg 
   2702  1.1  mrg   return result;
   2703  1.1  mrg }
   2704  1.1  mrg 
   2705  1.1  mrg 
   2706  1.1  mrg /* Convert Hollerith to character.  */
   2707  1.1  mrg 
   2708  1.1  mrg gfc_expr *
   2709  1.1  mrg gfc_hollerith2character (gfc_expr *src, int kind)
   2710  1.1  mrg {
   2711  1.1  mrg   gfc_expr *result;
   2712  1.1  mrg 
   2713  1.1  mrg   result = gfc_copy_expr (src);
   2714  1.1  mrg   result->ts.type = BT_CHARACTER;
   2715  1.1  mrg   result->ts.kind = kind;
   2716  1.1  mrg   result->ts.u.pad = 0;
   2717  1.1  mrg 
   2718  1.1  mrg   result->value.character.length = result->representation.length;
   2719  1.1  mrg   result->value.character.string
   2720  1.1  mrg     = gfc_char_to_widechar (result->representation.string);
   2721  1.1  mrg 
   2722  1.1  mrg   return result;
   2723  1.1  mrg }
   2724  1.1  mrg 
   2725  1.1  mrg 
   2726  1.1  mrg /* Convert Hollerith to logical. The constant will be padded or truncated.  */
   2727  1.1  mrg 
   2728  1.1  mrg gfc_expr *
   2729  1.1  mrg gfc_hollerith2logical (gfc_expr *src, int kind)
   2730  1.1  mrg {
   2731  1.1  mrg   gfc_expr *result;
   2732  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
   2733  1.1  mrg 
   2734  1.1  mrg   hollerith2representation (result, src);
   2735  1.1  mrg   gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
   2736  1.1  mrg 			 result->representation.length, &result->value.logical);
   2737  1.1  mrg 
   2738  1.1  mrg   return result;
   2739  1.1  mrg }
   2740  1.1  mrg 
   2741  1.1  mrg /* Convert character to logical. The constant will be padded or truncated.  */
   2742  1.1  mrg 
   2743  1.1  mrg gfc_expr *
   2744  1.1  mrg gfc_character2logical (gfc_expr *src, int kind)
   2745  1.1  mrg {
   2746  1.1  mrg   gfc_expr *result;
   2747  1.1  mrg   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
   2748  1.1  mrg 
   2749  1.1  mrg   character2representation (result, src);
   2750  1.1  mrg   gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
   2751  1.1  mrg 			 result->representation.length, &result->value.logical);
   2752  1.1  mrg 
   2753  1.1  mrg   return result;
   2754  1.1  mrg }
   2755