LCOV - code coverage report
Current view: top level - gcc/fortran - arith.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.0 % 1528 1330
Test Date: 2026-02-28 14:20:25 Functions: 95.2 % 105 100
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Compiler arithmetic
       2              :    Copyright (C) 2000-2026 Free Software Foundation, Inc.
       3              :    Contributed by Andy Vaught
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : the terms of the GNU General Public License as published by the Free
       9              : Software Foundation; either version 3, or (at your option) any later
      10              : version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : /* Since target arithmetic must be done on the host, there has to
      22              :    be some way of evaluating arithmetic expressions as the host
      23              :    would evaluate them.  We use the GNU MP library and the MPFR
      24              :    library to do arithmetic, and this file provides the interface.  */
      25              : 
      26              : #include "config.h"
      27              : #include "system.h"
      28              : #include "coretypes.h"
      29              : #include "options.h"
      30              : #include "gfortran.h"
      31              : #include "arith.h"
      32              : #include "target-memory.h"
      33              : #include "constructor.h"
      34              : 
      35              : bool gfc_seen_div0;
      36              : 
      37              : /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
      38              :    It's easily implemented with a few calls though.  */
      39              : 
      40              : void
      41          865 : gfc_mpfr_to_mpz (mpz_t z, mpfr_t x, locus *where)
      42              : {
      43          865 :   mpfr_exp_t e;
      44              : 
      45          865 :   if (mpfr_inf_p (x) || mpfr_nan_p (x))
      46              :     {
      47            1 :       gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
      48              :                  "to INTEGER", where);
      49            1 :       mpz_set_ui (z, 0);
      50            1 :       return;
      51              :     }
      52              : 
      53          864 :   e = mpfr_get_z_exp (z, x);
      54              : 
      55          864 :   if (e > 0)
      56           24 :     mpz_mul_2exp (z, z, e);
      57              :   else
      58          840 :     mpz_tdiv_q_2exp (z, z, -e);
      59              : }
      60              : 
      61              : /* Reduce an unsigned number to within its range.  */
      62              : 
      63              : void
      64         1101 : gfc_reduce_unsigned (gfc_expr *e)
      65              : {
      66         1101 :   int k;
      67         1101 :   gcc_checking_assert (e->expr_type == EXPR_CONSTANT
      68              :                        && e->ts.type == BT_UNSIGNED);
      69         1101 :   k = gfc_validate_kind (BT_UNSIGNED, e->ts.kind, false);
      70         1101 :   mpz_and (e->value.integer, e->value.integer, gfc_unsigned_kinds[k].huge);
      71         1101 : }
      72              : /* Set the model number precision by the requested KIND.  */
      73              : 
      74              : void
      75       929858 : gfc_set_model_kind (int kind)
      76              : {
      77       929858 :   int index = gfc_validate_kind (BT_REAL, kind, false);
      78       929858 :   int base2prec;
      79              : 
      80       929858 :   base2prec = gfc_real_kinds[index].digits;
      81       929858 :   if (gfc_real_kinds[index].radix != 2)
      82            0 :     base2prec *= gfc_real_kinds[index].radix / 2;
      83       929858 :   mpfr_set_default_prec (base2prec);
      84       929858 : }
      85              : 
      86              : 
      87              : /* Set the model number precision from mpfr_t x.  */
      88              : 
      89              : void
      90       431163 : gfc_set_model (mpfr_t x)
      91              : {
      92       431163 :   mpfr_set_default_prec (mpfr_get_prec (x));
      93       431163 : }
      94              : 
      95              : 
      96              : /* Given an arithmetic error code, return a pointer to a string that
      97              :    explains the error.  */
      98              : 
      99              : const char *
     100          282 : gfc_arith_error (arith code)
     101              : {
     102          282 :   const char *p;
     103              : 
     104          282 :   switch (code)
     105              :     {
     106              :     case ARITH_OK:
     107              :       p = G_("Arithmetic OK at %L");
     108              :       break;
     109          113 :     case ARITH_OVERFLOW:
     110          113 :       p = G_("Arithmetic overflow at %L");
     111          113 :       break;
     112           13 :     case ARITH_UNDERFLOW:
     113           13 :       p = G_("Arithmetic underflow at %L");
     114           13 :       break;
     115           20 :     case ARITH_NAN:
     116           20 :       p = G_("Arithmetic NaN at %L");
     117           20 :       break;
     118           33 :     case ARITH_DIV0:
     119           33 :       p = G_("Division by zero at %L");
     120           33 :       break;
     121            0 :     case ARITH_INCOMMENSURATE:
     122            0 :       p = G_("Array operands are incommensurate at %L");
     123            0 :       break;
     124           86 :     case ARITH_ASYMMETRIC:
     125           86 :       p = G_("Integer outside symmetric range implied by Standard Fortran"
     126              :              " at %L");
     127           86 :       break;
     128            1 :     case ARITH_WRONGCONCAT:
     129            1 :       p = G_("Illegal type in character concatenation at %L");
     130            1 :       break;
     131            0 :     case ARITH_INVALID_TYPE:
     132            0 :       p = G_("Invalid type in arithmetic operation at %L");
     133            0 :       break;
     134           15 :     case ARITH_UNSIGNED_TRUNCATED:
     135           15 :       p = G_("Unsigned constant truncated at %L");
     136           15 :       break;
     137            1 :     case ARITH_UNSIGNED_NEGATIVE:
     138            1 :       p = G_("Negation of unsigned constant at %L not permitted");
     139            1 :       break;
     140            0 :     default:
     141            0 :       gfc_internal_error ("gfc_arith_error(): Bad error code");
     142              :     }
     143              : 
     144          282 :   return p;
     145              : }
     146              : 
     147              : 
     148              : /* Check if a certain arithmetic error code is severe enough to prevent
     149              :    further simplification, as opposed to errors thrown by the range check
     150              :    (e.g. overflow) or arithmetic exceptions that are tolerated with
     151              :    -fno-range-check.  */
     152              : 
     153              : static bool
     154     11365163 : is_hard_arith_error (arith code)
     155              : {
     156            0 :   switch (code)
     157              :     {
     158              :     case ARITH_OK:
     159              :     case ARITH_OVERFLOW:
     160              :     case ARITH_UNDERFLOW:
     161              :     case ARITH_NAN:
     162              :     case ARITH_DIV0:
     163              :     case ARITH_ASYMMETRIC:
     164              :       return false;
     165              : 
     166           89 :     default:
     167            0 :       return true;
     168              :     }
     169              : }
     170              : 
     171              : 
     172              : /* Get things ready to do math.  */
     173              : 
     174              : void
     175        31306 : gfc_arith_init_1 (void)
     176              : {
     177        31306 :   gfc_integer_info *int_info;
     178        31306 :   gfc_unsigned_info *uint_info;
     179        31306 :   gfc_real_info *real_info;
     180        31306 :   mpfr_t a, b;
     181        31306 :   int i;
     182              : 
     183        31306 :   mpfr_set_default_prec (128);
     184        31306 :   mpfr_init (a);
     185              : 
     186              :   /* Convert the minimum and maximum values for each kind into their
     187              :      GNU MP representation.  */
     188       218735 :   for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
     189              :     {
     190              :       /* Huge  */
     191       156123 :       mpz_init (int_info->huge);
     192       156123 :       mpz_set_ui (int_info->huge, int_info->radix);
     193       156123 :       mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
     194       156123 :       mpz_sub_ui (int_info->huge, int_info->huge, 1);
     195              : 
     196              :       /* These are the numbers that are actually representable by the
     197              :          target.  For bases other than two, this needs to be changed.  */
     198       156123 :       if (int_info->radix != 2)
     199            0 :         gfc_internal_error ("Fix min_int calculation");
     200              : 
     201              :       /* See PRs 13490 and 17912, related to integer ranges.
     202              :          The pedantic_min_int exists for range checking when a program
     203              :          is compiled with -pedantic, and reflects the belief that
     204              :          Standard Fortran requires integers to be symmetrical, i.e.
     205              :          every negative integer must have a representable positive
     206              :          absolute value, and vice versa.  */
     207              : 
     208       156123 :       mpz_init (int_info->pedantic_min_int);
     209       156123 :       mpz_neg (int_info->pedantic_min_int, int_info->huge);
     210              : 
     211       156123 :       mpz_init (int_info->min_int);
     212       156123 :       mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
     213              : 
     214              :       /* Range  */
     215       156123 :       mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
     216       156123 :       mpfr_log10 (a, a, GFC_RND_MODE);
     217       156123 :       mpfr_trunc (a, a);
     218       156123 :       int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
     219              :     }
     220              : 
     221              :   /* Similar, for UNSIGNED.  */
     222        31306 :   if (flag_unsigned)
     223              :     {
     224         1470 :       for (uint_info = gfc_unsigned_kinds; uint_info->kind != 0; uint_info++)
     225              :         {
     226              :           /* UNSIGNED is radix 2.  */
     227         1225 :           gcc_assert (uint_info->radix == 2);
     228              :           /* Huge.  */
     229         1225 :           mpz_init (uint_info->huge);
     230         1225 :           mpz_set_ui (uint_info->huge, 2);
     231         1225 :           mpz_pow_ui (uint_info->huge, uint_info->huge, uint_info->digits);
     232         1225 :           mpz_sub_ui (uint_info->huge, uint_info->huge, 1);
     233              : 
     234              :           /* int_min - the smallest number we can reasonably convert from.  */
     235              : 
     236         1225 :           mpz_init (uint_info->int_min);
     237         1225 :           mpz_set_ui (uint_info->int_min, 2);
     238         1225 :           mpz_pow_ui (uint_info->int_min, uint_info->int_min,
     239         1225 :                       uint_info->digits - 1);
     240         1225 :           mpz_neg (uint_info->int_min, uint_info->int_min);
     241              : 
     242              :           /* Range.  */
     243         1225 :           mpfr_set_z (a, uint_info->huge, GFC_RND_MODE);
     244         1225 :           mpfr_log10 (a, a, GFC_RND_MODE);
     245         1225 :           mpfr_trunc (a,a);
     246         1225 :           uint_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
     247              :         }
     248              : 
     249              :     }
     250              : 
     251        31306 :   mpfr_clear (a);
     252              : 
     253       187836 :   for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
     254              :     {
     255       125224 :       gfc_set_model_kind (real_info->kind);
     256              : 
     257       125224 :       mpfr_init (a);
     258       125224 :       mpfr_init (b);
     259              : 
     260              :       /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b  */
     261              :       /* 1 - b**(-p)  */
     262       125224 :       mpfr_init (real_info->huge);
     263       125224 :       mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
     264       125224 :       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
     265       125224 :       mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
     266       125224 :       mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
     267              : 
     268              :       /* b**(emax-1)  */
     269       125224 :       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
     270       125224 :       mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
     271              : 
     272              :       /* (1 - b**(-p)) * b**(emax-1)  */
     273       125224 :       mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
     274              : 
     275              :       /* (1 - b**(-p)) * b**(emax-1) * b  */
     276       125224 :       mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
     277              :                    GFC_RND_MODE);
     278              : 
     279              :       /* tiny(x) = b**(emin-1)  */
     280       125224 :       mpfr_init (real_info->tiny);
     281       125224 :       mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
     282       125224 :       mpfr_pow_si (real_info->tiny, real_info->tiny,
     283       125224 :                    real_info->min_exponent - 1, GFC_RND_MODE);
     284              : 
     285              :       /* subnormal (x) = b**(emin - digit)  */
     286       125224 :       mpfr_init (real_info->subnormal);
     287       125224 :       mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
     288       125224 :       mpfr_pow_si (real_info->subnormal, real_info->subnormal,
     289       125224 :                    real_info->min_exponent - real_info->digits, GFC_RND_MODE);
     290              : 
     291              :       /* epsilon(x) = b**(1-p)  */
     292       125224 :       mpfr_init (real_info->epsilon);
     293       125224 :       mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
     294       125224 :       mpfr_pow_si (real_info->epsilon, real_info->epsilon,
     295       125224 :                    1 - real_info->digits, GFC_RND_MODE);
     296              : 
     297              :       /* range(x) = int(min(log10(huge(x)), -log10(tiny))  */
     298       125224 :       mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
     299       125224 :       mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
     300       125224 :       mpfr_neg (b, b, GFC_RND_MODE);
     301              : 
     302              :       /* a = min(a, b)  */
     303       125224 :       mpfr_min (a, a, b, GFC_RND_MODE);
     304       125224 :       mpfr_trunc (a, a);
     305       125224 :       real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
     306              : 
     307              :       /* precision(x) = int((p - 1) * log10(b)) + k  */
     308       125224 :       mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
     309       125224 :       mpfr_log10 (a, a, GFC_RND_MODE);
     310       125224 :       mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
     311       125224 :       mpfr_trunc (a, a);
     312       125224 :       real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
     313              : 
     314              :       /* If the radix is an integral power of 10, add one to the precision.  */
     315       125224 :       for (i = 10; i <= real_info->radix; i *= 10)
     316            0 :         if (i == real_info->radix)
     317            0 :           real_info->precision++;
     318              : 
     319       125224 :       mpfr_clears (a, b, NULL);
     320              :     }
     321        31306 : }
     322              : 
     323              : 
     324              : /* Clean up, get rid of numeric constants.  */
     325              : 
     326              : void
     327        31287 : gfc_arith_done_1 (void)
     328              : {
     329        31287 :   gfc_integer_info *ip;
     330        31287 :   gfc_real_info *rp;
     331              : 
     332       187315 :   for (ip = gfc_integer_kinds; ip->kind; ip++)
     333              :     {
     334       156028 :       mpz_clear (ip->min_int);
     335       156028 :       mpz_clear (ip->pedantic_min_int);
     336       156028 :       mpz_clear (ip->huge);
     337              :     }
     338              : 
     339       156435 :   for (rp = gfc_real_kinds; rp->kind; rp++)
     340       125148 :     mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
     341              : 
     342        31287 :   mpfr_free_cache ();
     343        31287 : }
     344              : 
     345              : 
     346              : /* Given a wide character value and a character kind, determine whether
     347              :    the character is representable for that kind.  */
     348              : bool
     349      1782089 : gfc_check_character_range (gfc_char_t c, int kind)
     350              : {
     351              :   /* As wide characters are stored as 32-bit values, they're all
     352              :      representable in UCS=4.  */
     353      1782089 :   if (kind == 4)
     354              :     return true;
     355              : 
     356      1600885 :   if (kind == 1)
     357      1600885 :     return c <= 255 ? true : false;
     358              : 
     359            0 :   gcc_unreachable ();
     360              : }
     361              : 
     362              : 
     363              : /* Given an integer and a kind, make sure that the integer lies within
     364              :    the range of the kind.  Returns ARITH_OK, ARITH_ASYMMETRIC or
     365              :    ARITH_OVERFLOW.  */
     366              : 
     367              : arith
     368     15826724 : gfc_check_integer_range (mpz_t p, int kind)
     369              : {
     370     15826724 :   arith result;
     371     15826724 :   int i;
     372              : 
     373     15826724 :   i = gfc_validate_kind (BT_INTEGER, kind, false);
     374     15826724 :   result = ARITH_OK;
     375              : 
     376     15826724 :   if (pedantic)
     377              :     {
     378     13534364 :       if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
     379     15826724 :         result = ARITH_ASYMMETRIC;
     380              :     }
     381              : 
     382              : 
     383     15826724 :   if (flag_range_check == 0)
     384              :     return result;
     385              : 
     386     15796888 :   if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
     387     15796888 :       || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
     388     15826724 :     result = ARITH_OVERFLOW;
     389              : 
     390              :   return result;
     391              : }
     392              : 
     393              : /* Same as above.  */
     394              : arith
     395       117730 : gfc_check_unsigned_range (mpz_t p, int kind)
     396              : {
     397       117730 :   int i;
     398              : 
     399       117730 :   i = gfc_validate_kind (BT_UNSIGNED, kind, false);
     400              : 
     401       117730 :   if (pedantic && mpz_cmp_si (p, 0) < 0)
     402              :     return ARITH_UNSIGNED_NEGATIVE;
     403              : 
     404       117730 :   if (mpz_cmp (p, gfc_unsigned_kinds[i].int_min) < 0)
     405              :     return ARITH_UNSIGNED_TRUNCATED;
     406              : 
     407       117729 :   if (mpz_cmp (p, gfc_unsigned_kinds[i].huge) > 0)
     408           14 :     return ARITH_UNSIGNED_TRUNCATED;
     409              : 
     410              :   return ARITH_OK;
     411              : }
     412              : 
     413              : /* Given a real and a kind, make sure that the real lies within the
     414              :    range of the kind.  Returns ARITH_OK, ARITH_OVERFLOW or
     415              :    ARITH_UNDERFLOW.  */
     416              : 
     417              : static arith
     418       429685 : gfc_check_real_range (mpfr_t p, int kind)
     419              : {
     420       429685 :   arith retval;
     421       429685 :   mpfr_t q;
     422       429685 :   int i;
     423              : 
     424       429685 :   i = gfc_validate_kind (BT_REAL, kind, false);
     425              : 
     426       429685 :   gfc_set_model (p);
     427       429685 :   mpfr_init (q);
     428       429685 :   mpfr_abs (q, p, GFC_RND_MODE);
     429              : 
     430       429685 :   retval = ARITH_OK;
     431              : 
     432       429685 :   if (mpfr_inf_p (p))
     433              :     {
     434         1157 :       if (flag_range_check != 0)
     435           21 :         retval = ARITH_OVERFLOW;
     436              :     }
     437       428528 :   else if (mpfr_nan_p (p))
     438              :     {
     439          238 :       if (flag_range_check != 0)
     440       363621 :         retval = ARITH_NAN;
     441              :     }
     442       428290 :   else if (mpfr_sgn (q) == 0)
     443              :     {
     444        66064 :       mpfr_clear (q);
     445        66064 :       return retval;
     446              :     }
     447       362226 :   else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
     448              :     {
     449           48 :       if (flag_range_check == 0)
     450           44 :         mpfr_set_inf (p, mpfr_sgn (p));
     451              :       else
     452              :         retval = ARITH_OVERFLOW;
     453              :     }
     454       362178 :   else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
     455              :     {
     456           32 :       if (flag_range_check == 0)
     457              :         {
     458           13 :           if (mpfr_sgn (p) < 0)
     459              :             {
     460            6 :               mpfr_set_ui (p, 0, GFC_RND_MODE);
     461            6 :               mpfr_set_si (q, -1, GFC_RND_MODE);
     462            6 :               mpfr_copysign (p, p, q, GFC_RND_MODE);
     463              :             }
     464              :           else
     465            7 :             mpfr_set_ui (p, 0, GFC_RND_MODE);
     466              :         }
     467              :       else
     468              :         retval = ARITH_UNDERFLOW;
     469              :     }
     470       362146 :   else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
     471              :     {
     472          151 :       mpfr_exp_t emin, emax;
     473          151 :       int en;
     474              : 
     475              :       /* Save current values of emin and emax.  */
     476          151 :       emin = mpfr_get_emin ();
     477          151 :       emax = mpfr_get_emax ();
     478              : 
     479              :       /* Set emin and emax for the current model number.  */
     480          151 :       en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
     481          151 :       mpfr_set_emin ((mpfr_exp_t) en);
     482          151 :       mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[i].max_exponent);
     483          151 :       mpfr_check_range (q, 0, GFC_RND_MODE);
     484          151 :       mpfr_subnormalize (q, 0, GFC_RND_MODE);
     485              : 
     486              :       /* Reset emin and emax.  */
     487          151 :       mpfr_set_emin (emin);
     488          151 :       mpfr_set_emax (emax);
     489              : 
     490              :       /* Copy sign if needed.  */
     491          151 :       if (mpfr_sgn (p) < 0)
     492           24 :         mpfr_neg (p, q, MPFR_RNDN);
     493              :       else
     494          127 :         mpfr_set (p, q, MPFR_RNDN);
     495              :     }
     496              : 
     497       363621 :   mpfr_clear (q);
     498              : 
     499       363621 :   return retval;
     500              : }
     501              : 
     502              : 
     503              : /* Low-level arithmetic functions.  All of these subroutines assume
     504              :    that all operands are of the same type and return an operand of the
     505              :    same type.  The other thing about these subroutines is that they
     506              :    can fail in various ways -- overflow, underflow, division by zero,
     507              :    zero raised to the zero, etc.  */
     508              : 
     509              : static arith
     510          540 : gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
     511              : {
     512          540 :   gfc_expr *result;
     513              : 
     514          540 :   if (op1->ts.type != BT_LOGICAL)
     515              :     return ARITH_INVALID_TYPE;
     516              : 
     517          540 :   result = gfc_get_constant_expr (BT_LOGICAL, op1->ts.kind, &op1->where);
     518          540 :   result->value.logical = !op1->value.logical;
     519          540 :   *resultp = result;
     520              : 
     521          540 :   return ARITH_OK;
     522              : }
     523              : 
     524              : 
     525              : static arith
     526         1542 : gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     527              : {
     528         1542 :   gfc_expr *result;
     529              : 
     530         1542 :   if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
     531              :     return ARITH_INVALID_TYPE;
     532              : 
     533         1541 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
     534              :                                   &op1->where);
     535         1541 :   result->value.logical = op1->value.logical && op2->value.logical;
     536         1541 :   *resultp = result;
     537              : 
     538         1541 :   return ARITH_OK;
     539              : }
     540              : 
     541              : 
     542              : static arith
     543         7452 : gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     544              : {
     545         7452 :   gfc_expr *result;
     546              : 
     547         7452 :   if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
     548              :     return ARITH_INVALID_TYPE;
     549              : 
     550         7451 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
     551              :                                   &op1->where);
     552         7451 :   result->value.logical = op1->value.logical || op2->value.logical;
     553         7451 :   *resultp = result;
     554              : 
     555         7451 :   return ARITH_OK;
     556              : }
     557              : 
     558              : 
     559              : static arith
     560           13 : gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     561              : {
     562           13 :   gfc_expr *result;
     563              : 
     564           13 :   if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
     565              :     return ARITH_INVALID_TYPE;
     566              : 
     567           12 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
     568              :                                   &op1->where);
     569           12 :   result->value.logical = op1->value.logical == op2->value.logical;
     570           12 :   *resultp = result;
     571              : 
     572           12 :   return ARITH_OK;
     573              : }
     574              : 
     575              : 
     576              : static arith
     577         1443 : gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     578              : {
     579         1443 :   gfc_expr *result;
     580              : 
     581         1443 :   if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
     582              :     return ARITH_INVALID_TYPE;
     583              : 
     584         1442 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
     585              :                                   &op1->where);
     586         1442 :   result->value.logical = op1->value.logical != op2->value.logical;
     587         1442 :   *resultp = result;
     588              : 
     589         1442 :   return ARITH_OK;
     590              : }
     591              : 
     592              : 
     593              : /* Make sure a constant numeric expression is within the range for
     594              :    its type and kind.  Note that there's also a gfc_check_range(),
     595              :    but that one deals with the intrinsic RANGE function.  */
     596              : 
     597              : arith
     598     16183608 : gfc_range_check (gfc_expr *e)
     599              : {
     600     16183608 :   arith rc;
     601     16183608 :   arith rc2;
     602              : 
     603     16183608 :   switch (e->ts.type)
     604              :     {
     605     15754824 :     case BT_INTEGER:
     606     15754824 :       rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
     607     15754824 :       break;
     608              : 
     609       117718 :     case BT_UNSIGNED:
     610       117718 :       rc = gfc_check_unsigned_range (e->value.integer, e->ts.kind);
     611       117718 :       break;
     612              : 
     613       303816 :     case BT_REAL:
     614       303816 :       rc = gfc_check_real_range (e->value.real, e->ts.kind);
     615       303816 :       if (rc == ARITH_UNDERFLOW)
     616           19 :         mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
     617       303816 :       if (rc == ARITH_OVERFLOW)
     618           16 :         mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
     619       303816 :       if (rc == ARITH_NAN)
     620           19 :         mpfr_set_nan (e->value.real);
     621              :       break;
     622              : 
     623         7250 :     case BT_COMPLEX:
     624         7250 :       rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
     625         7250 :       if (rc == ARITH_UNDERFLOW)
     626            0 :         mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
     627         7250 :       if (rc == ARITH_OVERFLOW)
     628            2 :         mpfr_set_inf (mpc_realref (e->value.complex),
     629            2 :                       mpfr_sgn (mpc_realref (e->value.complex)));
     630         7250 :       if (rc == ARITH_NAN)
     631            4 :         mpfr_set_nan (mpc_realref (e->value.complex));
     632              : 
     633         7250 :       rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
     634         7250 :       if (rc == ARITH_UNDERFLOW)
     635            0 :         mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
     636         7250 :       if (rc == ARITH_OVERFLOW)
     637            2 :         mpfr_set_inf (mpc_imagref (e->value.complex),
     638            2 :                       mpfr_sgn (mpc_imagref (e->value.complex)));
     639         7250 :       if (rc == ARITH_NAN)
     640            4 :         mpfr_set_nan (mpc_imagref (e->value.complex));
     641              : 
     642         7250 :       if (rc == ARITH_OK)
     643         7244 :         rc = rc2;
     644              :       break;
     645              : 
     646            0 :     default:
     647            0 :       gfc_internal_error ("gfc_range_check(): Bad type");
     648              :     }
     649              : 
     650     16183608 :   return rc;
     651              : }
     652              : 
     653              : 
     654              : /* Several of the following routines use the same set of statements to
     655              :    check the validity of the result.  Encapsulate the checking here.  */
     656              : 
     657              : static arith
     658     11343710 : check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
     659              : {
     660     11343710 :   arith val = rc;
     661              : 
     662     11343710 :   if (val == ARITH_UNDERFLOW)
     663              :     {
     664           19 :       if (warn_underflow)
     665           13 :         gfc_warning (OPT_Wunderflow, gfc_arith_error (val), &x->where);
     666              :       val = ARITH_OK;
     667              :     }
     668              : 
     669     11343691 :   if (val == ARITH_ASYMMETRIC)
     670              :     {
     671           86 :       gfc_warning (0, gfc_arith_error (val), &x->where);
     672           86 :       val = ARITH_OK;
     673              :     }
     674              : 
     675     11343710 :   if (is_hard_arith_error (val))
     676            1 :     gfc_free_expr (r);
     677              :   else
     678     11343709 :     *rp = r;
     679              : 
     680     11343710 :   return val;
     681              : }
     682              : 
     683              : 
     684              : /* It may seem silly to have a subroutine that actually computes the
     685              :    unary plus of a constant, but it prevents us from making exceptions
     686              :    in the code elsewhere.  Used for unary plus and parenthesized
     687              :    expressions.  */
     688              : 
     689              : static arith
     690          351 : gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
     691              : {
     692          351 :   *resultp = gfc_copy_expr (op1);
     693          351 :   return ARITH_OK;
     694              : }
     695              : 
     696              : 
     697              : static arith
     698       132055 : gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
     699              : {
     700       132055 :   gfc_expr *result;
     701       132055 :   arith rc;
     702              : 
     703       132055 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     704              : 
     705       132055 :   switch (op1->ts.type)
     706              :     {
     707       100809 :     case BT_INTEGER:
     708       100809 :       mpz_neg (result->value.integer, op1->value.integer);
     709       100809 :       break;
     710              : 
     711           33 :     case BT_UNSIGNED:
     712           33 :       {
     713           33 :         if (pedantic)
     714            1 :           return check_result (ARITH_UNSIGNED_NEGATIVE, op1, result, resultp);
     715              : 
     716           32 :         mpz_neg (result->value.integer, op1->value.integer);
     717              :       }
     718           32 :       break;
     719              : 
     720        31213 :     case BT_REAL:
     721        31213 :       mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
     722        31213 :       break;
     723              : 
     724            0 :     case BT_COMPLEX:
     725            0 :       mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
     726            0 :       break;
     727              : 
     728            0 :     default:
     729            0 :       gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
     730              :     }
     731              : 
     732       132054 :   rc = gfc_range_check (result);
     733       132054 :   if (op1->ts.type == BT_UNSIGNED)
     734              :     {
     735           32 :       if (rc != ARITH_OK)
     736              :         {
     737            1 :           gfc_warning (0, gfc_arith_error (rc), &op1->where);
     738            1 :           rc = ARITH_OK;
     739              :         }
     740           32 :       gfc_reduce_unsigned (result);
     741              :     }
     742       132054 :   return check_result (rc, op1, result, resultp);
     743              : }
     744              : 
     745              : 
     746              : static arith
     747     10356984 : gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     748              : {
     749     10356984 :   gfc_expr *result;
     750     10356984 :   arith rc;
     751              : 
     752     10356984 :   if (op1->ts.type != op2->ts.type)
     753              :     return ARITH_INVALID_TYPE;
     754              : 
     755     10356983 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     756              : 
     757     10356983 :   switch (op1->ts.type)
     758              :     {
     759     10353841 :     case BT_INTEGER:
     760     10353841 :       mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
     761     10353841 :       break;
     762              : 
     763          224 :     case BT_UNSIGNED:
     764          224 :       mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
     765          224 :       gfc_reduce_unsigned (result);
     766          224 :       break;
     767              : 
     768         2902 :     case BT_REAL:
     769         2902 :       mpfr_add (result->value.real, op1->value.real, op2->value.real,
     770              :                GFC_RND_MODE);
     771         2902 :       break;
     772              : 
     773           16 :     case BT_COMPLEX:
     774           16 :       mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
     775              :                GFC_MPC_RND_MODE);
     776           16 :       break;
     777              : 
     778            0 :     default:
     779            0 :       gfc_internal_error ("gfc_arith_plus(): Bad basic type");
     780              :     }
     781              : 
     782     10356983 :   rc = gfc_range_check (result);
     783              : 
     784     10356983 :   return check_result (rc, op1, result, resultp);
     785              : }
     786              : 
     787              : 
     788              : static arith
     789       512528 : gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     790              : {
     791       512528 :   gfc_expr *result;
     792       512528 :   arith rc;
     793              : 
     794       512528 :   if (op1->ts.type != op2->ts.type)
     795              :     return ARITH_INVALID_TYPE;
     796              : 
     797       512527 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     798              : 
     799       512527 :   switch (op1->ts.type)
     800              :     {
     801       511439 :     case BT_INTEGER:
     802       511439 :       mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
     803       511439 :       break;
     804              : 
     805           69 :     case BT_UNSIGNED:
     806           69 :       mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
     807           69 :       gfc_reduce_unsigned (result);
     808           69 :       break;
     809              : 
     810          919 :     case BT_REAL:
     811          919 :       mpfr_sub (result->value.real, op1->value.real, op2->value.real,
     812              :                 GFC_RND_MODE);
     813          919 :       break;
     814              : 
     815          100 :     case BT_COMPLEX:
     816          100 :       mpc_sub (result->value.complex, op1->value.complex,
     817          100 :                op2->value.complex, GFC_MPC_RND_MODE);
     818          100 :       break;
     819              : 
     820            0 :     default:
     821            0 :       gfc_internal_error ("gfc_arith_minus(): Bad basic type");
     822              :     }
     823              : 
     824       512527 :   rc = gfc_range_check (result);
     825              : 
     826       512527 :   return check_result (rc, op1, result, resultp);
     827              : }
     828              : 
     829              : 
     830              : static arith
     831       312531 : gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     832              : {
     833       312531 :   gfc_expr *result;
     834       312531 :   arith rc;
     835              : 
     836       312531 :   if (op1->ts.type != op2->ts.type)
     837              :     return ARITH_INVALID_TYPE;
     838              : 
     839       312529 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     840              : 
     841       312529 :   switch (op1->ts.type)
     842              :     {
     843       300095 :     case BT_INTEGER:
     844       300095 :       mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
     845       300095 :       break;
     846              : 
     847          209 :     case BT_UNSIGNED:
     848          209 :       mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
     849          209 :       gfc_reduce_unsigned (result);
     850          209 :       break;
     851              : 
     852        11022 :     case BT_REAL:
     853        11022 :       mpfr_mul (result->value.real, op1->value.real, op2->value.real,
     854              :                GFC_RND_MODE);
     855        11022 :       break;
     856              : 
     857         1203 :     case BT_COMPLEX:
     858         1203 :       gfc_set_model (mpc_realref (op1->value.complex));
     859         1203 :       mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
     860              :                GFC_MPC_RND_MODE);
     861         1203 :       break;
     862              : 
     863            0 :     default:
     864            0 :       gfc_internal_error ("gfc_arith_times(): Bad basic type");
     865              :     }
     866              : 
     867       312529 :   rc = gfc_range_check (result);
     868              : 
     869       312529 :   return check_result (rc, op1, result, resultp);
     870              : }
     871              : 
     872              : 
     873              : static arith
     874         7832 : gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     875              : {
     876         7832 :   gfc_expr *result;
     877         7832 :   arith rc;
     878              : 
     879         7832 :   if (op1->ts.type != op2->ts.type)
     880              :     return ARITH_INVALID_TYPE;
     881              : 
     882         7830 :   rc = ARITH_OK;
     883              : 
     884         7830 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     885              : 
     886         7830 :   switch (op1->ts.type)
     887              :     {
     888         3638 :     case BT_INTEGER:
     889         3638 :     case BT_UNSIGNED:
     890         3638 :       if (mpz_sgn (op2->value.integer) == 0)
     891              :         {
     892              :           rc = ARITH_DIV0;
     893              :           break;
     894              :         }
     895              : 
     896         3617 :       if (warn_integer_division)
     897              :         {
     898           49 :           mpz_t r;
     899           49 :           mpz_init (r);
     900           49 :           mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
     901           49 :                        op2->value.integer);
     902              : 
     903           49 :           if (mpz_cmp_si (r, 0) != 0)
     904              :             {
     905            6 :               char *p;
     906            6 :               p = mpz_get_str (NULL, 10, result->value.integer);
     907            6 :               gfc_warning (OPT_Winteger_division, "Integer division "
     908              :                                "truncated to constant %qs at %L", p,
     909              :                                &op1->where);
     910            6 :               free (p);
     911              :             }
     912           49 :           mpz_clear (r);
     913              :         }
     914              :       else
     915         3568 :         mpz_tdiv_q (result->value.integer, op1->value.integer,
     916         3568 :                     op2->value.integer);
     917              : 
     918              :       break;
     919              : 
     920         4151 :     case BT_REAL:
     921              :       /* Set "Division by zero" only for regular numerator.  */
     922         4151 :       if (flag_range_check == 1
     923         3583 :           && mpfr_zero_p (op2->value.real)
     924           22 :           && mpfr_regular_p (op1->value.real))
     925         4151 :         rc = ARITH_DIV0;
     926              : 
     927         4151 :       mpfr_div (result->value.real, op1->value.real, op2->value.real,
     928              :                GFC_RND_MODE);
     929         4151 :       break;
     930              : 
     931           41 :     case BT_COMPLEX:
     932              :       /* Set "Division by zero" only for regular numerator.  */
     933           41 :       if (flag_range_check == 1
     934           15 :           && mpfr_zero_p (mpc_realref (op2->value.complex))
     935            6 :           && mpfr_zero_p (mpc_imagref (op2->value.complex))
     936           46 :           && ((mpfr_regular_p (mpc_realref (op1->value.complex))
     937            3 :                && mpfr_number_p (mpc_imagref (op1->value.complex)))
     938            2 :               || (mpfr_regular_p (mpc_imagref (op1->value.complex))
     939            0 :                   && mpfr_number_p (mpc_realref (op1->value.complex)))))
     940              :         rc = ARITH_DIV0;
     941              : 
     942           41 :       gfc_set_model (mpc_realref (op1->value.complex));
     943           41 :       if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
     944              :       {
     945              :         /* In Fortran, return (NaN + NaN I) for any zero divisor.  See
     946              :            PR 40318.  */
     947           20 :         mpfr_set_nan (mpc_realref (result->value.complex));
     948           20 :         mpfr_set_nan (mpc_imagref (result->value.complex));
     949              :       }
     950              :       else
     951           21 :         mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
     952              :                  GFC_MPC_RND_MODE);
     953              :       break;
     954              : 
     955            0 :     default:
     956            0 :       gfc_internal_error ("gfc_arith_divide(): Bad basic type");
     957              :     }
     958              : 
     959         7809 :   if (rc == ARITH_OK)
     960         7800 :     rc = gfc_range_check (result);
     961              : 
     962         7830 :   return check_result (rc, op1, result, resultp);
     963              : }
     964              : 
     965              : /* Raise a number to a power.  */
     966              : 
     967              : static arith
     968        21791 : arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
     969              : {
     970        21791 :   int power_sign;
     971        21791 :   gfc_expr *result;
     972        21791 :   arith rc;
     973              : 
     974        21791 :   if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
     975            4 :     return ARITH_INVALID_TYPE;
     976              : 
     977              :   /* The result type is derived from op1 and must be compatible with the
     978              :      result of the simplification.  Otherwise postpone simplification until
     979              :      after operand conversions usually done by gfc_type_convert_binary.  */
     980        21787 :   if ((op1->ts.type == BT_INTEGER && op2->ts.type != BT_INTEGER)
     981        21787 :       || (op1->ts.type == BT_REAL && op2->ts.type == BT_COMPLEX))
     982              :     return ARITH_NOT_REDUCED;
     983              : 
     984        21787 :   rc = ARITH_OK;
     985        21787 :   result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
     986              : 
     987        21787 :   switch (op2->ts.type)
     988              :     {
     989         6345 :     case BT_INTEGER:
     990         6345 :       power_sign = mpz_sgn (op2->value.integer);
     991              : 
     992         6069 :       if (power_sign == 0)
     993              :         {
     994              :           /* Handle something to the zeroth power.  Since we're dealing
     995              :              with integral exponents, there is no ambiguity in the
     996              :              limiting procedure used to determine the value of 0**0.  */
     997          199 :           switch (op1->ts.type)
     998              :             {
     999           85 :             case BT_INTEGER:
    1000           85 :               mpz_set_ui (result->value.integer, 1);
    1001           85 :               break;
    1002              : 
    1003           60 :             case BT_REAL:
    1004           60 :               mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
    1005           60 :               break;
    1006              : 
    1007           54 :             case BT_COMPLEX:
    1008           54 :               mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
    1009           54 :               break;
    1010              : 
    1011            0 :             default:
    1012            0 :               gfc_internal_error ("arith_power(): Bad base");
    1013              :             }
    1014              :         }
    1015              :       else
    1016              :         {
    1017         6146 :           switch (op1->ts.type)
    1018              :             {
    1019         5544 :             case BT_INTEGER:
    1020         5544 :               {
    1021              :                 /* First, we simplify the cases of op1 == 1, 0 or -1.  */
    1022         5544 :                 if (mpz_cmp_si (op1->value.integer, 1) == 0)
    1023              :                   {
    1024              :                     /* 1**op2 == 1 */
    1025          870 :                     mpz_set_si (result->value.integer, 1);
    1026              :                   }
    1027         4674 :                 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
    1028              :                   {
    1029              :                     /* 0**op2 == 0, if op2 > 0
    1030              :                        0**op2 overflow, if op2 < 0 ; in that case, we
    1031              :                        set the result to 0 and return ARITH_DIV0.  */
    1032            6 :                     mpz_set_si (result->value.integer, 0);
    1033            6 :                     if (mpz_cmp_si (op2->value.integer, 0) < 0)
    1034              :                       rc = ARITH_DIV0;
    1035              :                   }
    1036         4668 :                 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
    1037              :                   {
    1038              :                     /* (-1)**op2 == (-1)**(mod(op2,2)) */
    1039           84 :                     unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
    1040           84 :                     if (odd)
    1041           42 :                       mpz_set_si (result->value.integer, -1);
    1042              :                     else
    1043           42 :                       mpz_set_si (result->value.integer, 1);
    1044              :                   }
    1045              :                 /* Then, we take care of op2 < 0.  */
    1046         4584 :                 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
    1047              :                   {
    1048              :                     /* if op2 < 0, op1**op2 == 0  because abs(op1) > 1.  */
    1049           29 :                     mpz_set_si (result->value.integer, 0);
    1050           29 :                     if (warn_integer_division)
    1051            1 :                       gfc_warning_now (OPT_Winteger_division, "Negative "
    1052              :                                        "exponent of integer has zero "
    1053              :                                        "result at %L", &result->where);
    1054              :                   }
    1055              :                 else
    1056              :                   {
    1057              :                     /* We have abs(op1) > 1 and op2 > 1.
    1058              :                        If op2 > bit_size(op1), we'll have an out-of-range
    1059              :                        result.  */
    1060         4555 :                     int k, power;
    1061              : 
    1062         4555 :                     k = gfc_validate_kind (BT_INTEGER, op1->ts.kind, false);
    1063         4555 :                     power = gfc_integer_kinds[k].bit_size;
    1064         4555 :                     if (mpz_cmp_si (op2->value.integer, power) < 0)
    1065              :                       {
    1066         4536 :                         gfc_extract_int (op2, &power);
    1067         4536 :                         mpz_pow_ui (result->value.integer, op1->value.integer,
    1068              :                                     power);
    1069         4536 :                         rc = gfc_range_check (result);
    1070         4536 :                         if (rc == ARITH_OVERFLOW)
    1071            2 :                           gfc_error_now ("Result of exponentiation at %L "
    1072              :                                          "exceeds the range of %s", &op1->where,
    1073              :                                          gfc_typename (&(op1->ts)));
    1074              :                       }
    1075              :                     else
    1076              :                       {
    1077              :                         /* Provide a nonsense value to propagate up. */
    1078           19 :                         mpz_set (result->value.integer,
    1079           19 :                                  gfc_integer_kinds[k].huge);
    1080           19 :                         mpz_add_ui (result->value.integer,
    1081              :                                     result->value.integer, 1);
    1082           19 :                         rc = ARITH_OVERFLOW;
    1083              :                       }
    1084              :                   }
    1085              :               }
    1086              :               break;
    1087              : 
    1088          465 :             case BT_REAL:
    1089          465 :               mpfr_pow_z (result->value.real, op1->value.real,
    1090          465 :                           op2->value.integer, GFC_RND_MODE);
    1091          465 :               break;
    1092              : 
    1093          137 :             case BT_COMPLEX:
    1094          137 :               mpc_pow_z (result->value.complex, op1->value.complex,
    1095          137 :                          op2->value.integer, GFC_MPC_RND_MODE);
    1096          137 :               break;
    1097              : 
    1098              :             default:
    1099              :               break;
    1100              :             }
    1101              :         }
    1102              :       break;
    1103              : 
    1104          273 :     case BT_REAL:
    1105              : 
    1106          273 :       if (gfc_init_expr_flag)
    1107              :         {
    1108           92 :           if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
    1109              :                                "exponent in an initialization "
    1110              :                                "expression at %L", &op2->where))
    1111              :             {
    1112            1 :               gfc_free_expr (result);
    1113            1 :               return ARITH_PROHIBIT;
    1114              :             }
    1115              :         }
    1116              : 
    1117          272 :       if (mpfr_cmp_si (op1->value.real, 0) < 0)
    1118              :         {
    1119            0 :           gfc_error ("Raising a negative REAL at %L to "
    1120              :                      "a REAL power is prohibited", &op1->where);
    1121            0 :           gfc_free_expr (result);
    1122            0 :           return ARITH_PROHIBIT;
    1123              :         }
    1124              : 
    1125          272 :         mpfr_pow (result->value.real, op1->value.real, op2->value.real,
    1126              :                   GFC_RND_MODE);
    1127          272 :       break;
    1128              : 
    1129           48 :     case BT_COMPLEX:
    1130           48 :       {
    1131           48 :         if (gfc_init_expr_flag)
    1132              :           {
    1133           41 :             if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
    1134              :                                  "exponent in an initialization "
    1135              :                                  "expression at %L", &op2->where))
    1136              :               {
    1137            0 :                 gfc_free_expr (result);
    1138            0 :                 return ARITH_PROHIBIT;
    1139              :               }
    1140              :           }
    1141              : 
    1142           48 :         mpc_pow (result->value.complex, op1->value.complex,
    1143           48 :                  op2->value.complex, GFC_MPC_RND_MODE);
    1144              :       }
    1145           48 :       break;
    1146        15121 :     case BT_UNSIGNED:
    1147        15121 :       {
    1148        15121 :         int k;
    1149        15121 :         mpz_t x;
    1150        15121 :         gcc_assert (op1->ts.type == BT_UNSIGNED);
    1151        15121 :         k = gfc_validate_kind (BT_UNSIGNED, op1->ts.kind, false);
    1152              :         /* Exponentiation is performed modulo x = 2**n.  */
    1153        15121 :         mpz_init (x);
    1154        15121 :         mpz_add_ui (x, gfc_unsigned_kinds[k].huge, 1);
    1155        15121 :         mpz_powm (result->value.integer, op1->value.integer,
    1156        15121 :                   op2->value.integer, x);
    1157        15121 :         mpz_clear (x);
    1158              :       }
    1159        15121 :       break;
    1160            0 :     default:
    1161            0 :       gfc_internal_error ("arith_power(): unknown type");
    1162              :     }
    1163              : 
    1164        21752 :   if (rc == ARITH_OK)
    1165        21762 :     rc = gfc_range_check (result);
    1166              : 
    1167        21786 :   return check_result (rc, op1, result, resultp);
    1168              : }
    1169              : 
    1170              : 
    1171              : /* Concatenate two string constants.  */
    1172              : 
    1173              : static arith
    1174         4909 : gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1175              : {
    1176         4909 :   gfc_expr *result;
    1177         4909 :   size_t len;
    1178              : 
    1179              :   /* By cleverly playing around with constructors, it is possible
    1180              :      to get mismatching types here.  */
    1181         4909 :   if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
    1182         4908 :       || op1->ts.kind != op2->ts.kind)
    1183              :     return ARITH_WRONGCONCAT;
    1184              : 
    1185         4908 :   result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
    1186              :                                   &op1->where);
    1187              : 
    1188         4908 :   len = op1->value.character.length + op2->value.character.length;
    1189              : 
    1190         4908 :   result->value.character.string = gfc_get_wide_string (len + 1);
    1191         4908 :   result->value.character.length = len;
    1192              : 
    1193         4908 :   memcpy (result->value.character.string, op1->value.character.string,
    1194         4908 :           op1->value.character.length * sizeof (gfc_char_t));
    1195              : 
    1196         4908 :   memcpy (&result->value.character.string[op1->value.character.length],
    1197         4908 :           op2->value.character.string,
    1198         4908 :           op2->value.character.length * sizeof (gfc_char_t));
    1199              : 
    1200         4908 :   result->value.character.string[len] = '\0';
    1201              : 
    1202         4908 :   *resultp = result;
    1203              : 
    1204         4908 :   return ARITH_OK;
    1205              : }
    1206              : 
    1207              : /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
    1208              :    This function mimics mpfr_cmp but takes NaN into account.  */
    1209              : 
    1210              : static int
    1211         3299 : compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    1212              : {
    1213         3299 :   int rc;
    1214         3299 :   switch (op)
    1215              :     {
    1216         1859 :       case INTRINSIC_EQ:
    1217         1859 :         rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
    1218         1859 :         break;
    1219          872 :       case INTRINSIC_GT:
    1220          872 :         rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
    1221              :         break;
    1222           72 :       case INTRINSIC_GE:
    1223         1236 :         rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
    1224              :         break;
    1225           60 :       case INTRINSIC_LT:
    1226           60 :         rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
    1227              :         break;
    1228          436 :       case INTRINSIC_LE:
    1229          495 :         rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
    1230              :         break;
    1231            0 :       default:
    1232            0 :         gfc_internal_error ("compare_real(): Bad operator");
    1233              :     }
    1234              : 
    1235         3299 :   return rc;
    1236              : }
    1237              : 
    1238              : /* Comparison operators.  Assumes that the two expression nodes
    1239              :    contain two constants of the same type. The op argument is
    1240              :    needed to handle NaN correctly.  */
    1241              : 
    1242              : int
    1243        42680 : gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    1244              : {
    1245        42680 :   int rc;
    1246              : 
    1247        42680 :   switch (op1->ts.type)
    1248              :     {
    1249        32706 :     case BT_INTEGER:
    1250        32706 :     case BT_UNSIGNED:
    1251        32706 :       rc = mpz_cmp (op1->value.integer, op2->value.integer);
    1252        32706 :       break;
    1253              : 
    1254         3299 :     case BT_REAL:
    1255         3299 :       rc = compare_real (op1, op2, op);
    1256         3299 :       break;
    1257              : 
    1258         6627 :     case BT_CHARACTER:
    1259         6627 :       rc = gfc_compare_string (op1, op2);
    1260         6627 :       break;
    1261              : 
    1262           38 :     case BT_LOGICAL:
    1263            0 :       rc = ((!op1->value.logical && op2->value.logical)
    1264           38 :             || (op1->value.logical && !op2->value.logical));
    1265           38 :       break;
    1266              : 
    1267           10 :     case BT_COMPLEX:
    1268           10 :       gcc_assert (op == INTRINSIC_EQ);
    1269           10 :       rc = mpc_cmp (op1->value.complex, op2->value.complex);
    1270           10 :       break;
    1271              : 
    1272            0 :     default:
    1273            0 :       gfc_internal_error ("gfc_compare_expr(): Bad basic type");
    1274              :     }
    1275              : 
    1276        42680 :   return rc;
    1277              : }
    1278              : 
    1279              : 
    1280              : /* Compare a pair of complex numbers.  Naturally, this is only for
    1281              :    equality and inequality.  */
    1282              : 
    1283              : static int
    1284          196 : compare_complex (gfc_expr *op1, gfc_expr *op2)
    1285              : {
    1286          196 :   return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
    1287              : }
    1288              : 
    1289              : 
    1290              : /* Given two constant strings and the inverse collating sequence, compare the
    1291              :    strings.  We return -1 for a < b, 0 for a == b and 1 for a > b.
    1292              :    We use the processor's default collating sequence.  */
    1293              : 
    1294              : int
    1295         7155 : gfc_compare_string (gfc_expr *a, gfc_expr *b)
    1296              : {
    1297         7155 :   size_t len, alen, blen, i;
    1298         7155 :   gfc_char_t ac, bc;
    1299              : 
    1300         7155 :   alen = a->value.character.length;
    1301         7155 :   blen = b->value.character.length;
    1302              : 
    1303         7155 :   len = MAX(alen, blen);
    1304              : 
    1305        17006 :   for (i = 0; i < len; i++)
    1306              :     {
    1307        12424 :       ac = ((i < alen) ? a->value.character.string[i] : ' ');
    1308        12424 :       bc = ((i < blen) ? b->value.character.string[i] : ' ');
    1309              : 
    1310        12424 :       if (ac < bc)
    1311              :         return -1;
    1312        11494 :       if (ac > bc)
    1313              :         return 1;
    1314              :     }
    1315              : 
    1316              :   /* Strings are equal */
    1317              :   return 0;
    1318              : }
    1319              : 
    1320              : 
    1321              : int
    1322          420 : gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
    1323              : {
    1324          420 :   size_t len, alen, blen, i;
    1325          420 :   gfc_char_t ac, bc;
    1326              : 
    1327          420 :   alen = a->value.character.length;
    1328          420 :   blen = strlen (b);
    1329              : 
    1330          420 :   len = MAX(alen, blen);
    1331              : 
    1332         1539 :   for (i = 0; i < len; i++)
    1333              :     {
    1334         1398 :       ac = ((i < alen) ? a->value.character.string[i] : ' ');
    1335         1398 :       bc = ((i < blen) ? b[i] : ' ');
    1336              : 
    1337         1398 :       if (!case_sensitive)
    1338              :         {
    1339         1398 :           ac = TOLOWER (ac);
    1340         1398 :           bc = TOLOWER (bc);
    1341              :         }
    1342              : 
    1343         1398 :       if (ac < bc)
    1344              :         return -1;
    1345         1319 :       if (ac > bc)
    1346              :         return 1;
    1347              :     }
    1348              : 
    1349              :   /* Strings are equal */
    1350              :   return 0;
    1351              : }
    1352              : 
    1353              : 
    1354              : /* Specific comparison subroutines.  */
    1355              : 
    1356              : static arith
    1357         3438 : gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1358              : {
    1359         3438 :   gfc_expr *result;
    1360              : 
    1361         3438 :   if (op1->ts.type != op2->ts.type)
    1362              :     return ARITH_INVALID_TYPE;
    1363              : 
    1364         3436 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1365              :                                   &op1->where);
    1366         6872 :   result->value.logical = (op1->ts.type == BT_COMPLEX)
    1367         3436 :                         ? compare_complex (op1, op2)
    1368         3436 :                         : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
    1369              : 
    1370         3436 :   *resultp = result;
    1371         3436 :   return ARITH_OK;
    1372              : }
    1373              : 
    1374              : 
    1375              : static arith
    1376        32518 : gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1377              : {
    1378        32518 :   gfc_expr *result;
    1379              : 
    1380        32518 :   if (op1->ts.type != op2->ts.type)
    1381              :     return ARITH_INVALID_TYPE;
    1382              : 
    1383        32516 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1384              :                                   &op1->where);
    1385        65032 :   result->value.logical = (op1->ts.type == BT_COMPLEX)
    1386        32712 :                         ? !compare_complex (op1, op2)
    1387        32320 :                         : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
    1388              : 
    1389        32516 :   *resultp = result;
    1390        32516 :   return ARITH_OK;
    1391              : }
    1392              : 
    1393              : 
    1394              : static arith
    1395         3048 : gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1396              : {
    1397         3048 :   gfc_expr *result;
    1398              : 
    1399         3048 :   if (op1->ts.type != op2->ts.type)
    1400              :     return ARITH_INVALID_TYPE;
    1401              : 
    1402         3046 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1403              :                                   &op1->where);
    1404         3046 :   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
    1405         3046 :   *resultp = result;
    1406              : 
    1407         3046 :   return ARITH_OK;
    1408              : }
    1409              : 
    1410              : 
    1411              : static arith
    1412          267 : gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1413              : {
    1414          267 :   gfc_expr *result;
    1415              : 
    1416          267 :   if (op1->ts.type != op2->ts.type)
    1417              :     return ARITH_INVALID_TYPE;
    1418              : 
    1419          265 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1420              :                                   &op1->where);
    1421          265 :   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
    1422          265 :   *resultp = result;
    1423              : 
    1424          265 :   return ARITH_OK;
    1425              : }
    1426              : 
    1427              : 
    1428              : static arith
    1429          454 : gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1430              : {
    1431          454 :   gfc_expr *result;
    1432              : 
    1433          454 :   if (op1->ts.type != op2->ts.type)
    1434              :     return ARITH_INVALID_TYPE;
    1435              : 
    1436          452 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1437              :                                   &op1->where);
    1438          452 :   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
    1439          452 :   *resultp = result;
    1440              : 
    1441          452 :   return ARITH_OK;
    1442              : }
    1443              : 
    1444              : 
    1445              : static arith
    1446          616 : gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
    1447              : {
    1448          616 :   gfc_expr *result;
    1449              : 
    1450          616 :   if (op1->ts.type != op2->ts.type)
    1451              :     return ARITH_INVALID_TYPE;
    1452              : 
    1453          614 :   result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
    1454              :                                   &op1->where);
    1455          614 :   result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
    1456          614 :   *resultp = result;
    1457              : 
    1458          614 :   return ARITH_OK;
    1459              : }
    1460              : 
    1461              : 
    1462              : static arith
    1463       133198 : reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
    1464              :               gfc_expr **result)
    1465              : {
    1466       133198 :   gfc_constructor_base head;
    1467       133198 :   gfc_constructor *c;
    1468       133198 :   gfc_expr *r;
    1469       133198 :   arith rc;
    1470              : 
    1471       133198 :   if (op->expr_type == EXPR_CONSTANT)
    1472       132946 :     return eval (op, result);
    1473              : 
    1474          252 :   if (op->expr_type != EXPR_ARRAY)
    1475              :     return ARITH_NOT_REDUCED;
    1476              : 
    1477          245 :   rc = ARITH_OK;
    1478          245 :   head = gfc_constructor_copy (op->value.constructor);
    1479          897 :   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
    1480              :     {
    1481          661 :       arith rc_tmp = reduce_unary (eval, c->expr, &r);
    1482              : 
    1483              :       /* Remember first recoverable ("soft") error encountered during
    1484              :          reduction and continue, but terminate on serious errors.  */
    1485          661 :       if (is_hard_arith_error (rc_tmp))
    1486              :         {
    1487              :           rc = rc_tmp;
    1488              :           break;
    1489              :         }
    1490          652 :       else if (rc_tmp != ARITH_OK && rc == ARITH_OK)
    1491            4 :         rc = rc_tmp;
    1492              : 
    1493          652 :       gfc_replace_expr (c->expr, r);
    1494              :     }
    1495              : 
    1496          245 :   if (is_hard_arith_error (rc))
    1497            9 :     gfc_constructor_free (head);
    1498              :   else
    1499              :     {
    1500          236 :       gfc_constructor *c = gfc_constructor_first (head);
    1501          236 :       if (c == NULL)
    1502              :         {
    1503              :           /* Handle zero-sized arrays.  */
    1504           30 :           r = gfc_get_array_expr (op->ts.type, op->ts.kind, &op->where);
    1505              :         }
    1506              :       else
    1507              :         {
    1508          206 :           r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
    1509              :                                   &op->where);
    1510              :         }
    1511          236 :       r->shape = gfc_copy_shape (op->shape, op->rank);
    1512          236 :       r->rank = op->rank;
    1513          236 :       r->corank = op->corank;
    1514          236 :       r->value.constructor = head;
    1515          236 :       *result = r;
    1516              :     }
    1517              : 
    1518              :   return rc;
    1519              : }
    1520              : 
    1521              : 
    1522              : static arith
    1523         1516 : reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    1524              :                   gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
    1525              : {
    1526         1516 :   gfc_constructor_base head;
    1527         1516 :   gfc_constructor *c;
    1528         1516 :   gfc_expr *r;
    1529         1516 :   arith rc = ARITH_OK;
    1530              : 
    1531         1516 :   head = gfc_constructor_copy (op1->value.constructor);
    1532         9901 :   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
    1533              :     {
    1534         8427 :       arith rc_tmp;
    1535              : 
    1536         8427 :       gfc_simplify_expr (c->expr, 0);
    1537              : 
    1538         8427 :       if (c->expr->expr_type == EXPR_CONSTANT)
    1539         8336 :         rc_tmp = eval (c->expr, op2, &r);
    1540           91 :       else if (c->expr->expr_type != EXPR_ARRAY)
    1541              :         rc_tmp = ARITH_NOT_REDUCED;
    1542              :       else
    1543           81 :         rc_tmp = reduce_binary_ac (eval, c->expr, op2, &r);
    1544              : 
    1545              :       /* Remember first recoverable ("soft") error encountered during
    1546              :          reduction and continue, but terminate on serious errors.  */
    1547         8417 :       if (is_hard_arith_error (rc_tmp))
    1548              :         {
    1549              :           rc = rc_tmp;
    1550              :           break;
    1551              :         }
    1552         8385 :       else if (rc_tmp != ARITH_OK && rc == ARITH_OK)
    1553            5 :         rc = rc_tmp;
    1554              : 
    1555         8385 :       gfc_replace_expr (c->expr, r);
    1556              :     }
    1557              : 
    1558         1516 :   if (is_hard_arith_error (rc))
    1559           42 :     gfc_constructor_free (head);
    1560              :   else
    1561              :     {
    1562         1474 :       gfc_constructor *c = gfc_constructor_first (head);
    1563         1474 :       if (c)
    1564              :         {
    1565         1474 :           r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
    1566              :                                   &op1->where);
    1567         1474 :           r->shape = gfc_copy_shape (op1->shape, op1->rank);
    1568         1474 :           if (c->expr->ts.type == BT_CHARACTER)
    1569          116 :             r->ts.u.cl = c->expr->ts.u.cl;
    1570              :         }
    1571              :       else
    1572              :         {
    1573            0 :           gcc_assert (op1->ts.type != BT_UNKNOWN);
    1574            0 :           r = gfc_get_array_expr (op1->ts.type, op1->ts.kind,
    1575              :                                   &op1->where);
    1576            0 :           r->shape = gfc_get_shape (op1->rank);
    1577            0 :           if (op1->ts.type == BT_CHARACTER)
    1578            0 :             r->ts.u.cl = op1->ts.u.cl;
    1579              :         }
    1580         1474 :       r->rank = op1->rank;
    1581         1474 :       r->corank = op1->corank;
    1582         1474 :       r->value.constructor = head;
    1583         1474 :       *result = r;
    1584              :     }
    1585              : 
    1586         1516 :   return rc;
    1587              : }
    1588              : 
    1589              : 
    1590              : static arith
    1591          881 : reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    1592              :                   gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
    1593              : {
    1594          881 :   gfc_constructor_base head;
    1595          881 :   gfc_constructor *c;
    1596          881 :   gfc_expr *r;
    1597          881 :   arith rc = ARITH_OK;
    1598              : 
    1599          881 :   head = gfc_constructor_copy (op2->value.constructor);
    1600         4428 :   for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
    1601              :     {
    1602         3579 :       arith rc_tmp;
    1603              : 
    1604         3579 :       gfc_simplify_expr (c->expr, 0);
    1605              : 
    1606         3579 :       if (c->expr->expr_type == EXPR_CONSTANT)
    1607         3425 :         rc_tmp = eval (op1, c->expr, &r);
    1608          154 :       else if (c->expr->expr_type != EXPR_ARRAY)
    1609              :         rc_tmp = ARITH_NOT_REDUCED;
    1610              :       else
    1611          144 :         rc_tmp = reduce_binary_ca (eval, op1, c->expr, &r);
    1612              : 
    1613              :       /* Remember first recoverable ("soft") error encountered during
    1614              :          reduction and continue, but terminate on serious errors.  */
    1615         3569 :       if (is_hard_arith_error (rc_tmp))
    1616              :         {
    1617              :           rc = rc_tmp;
    1618              :           break;
    1619              :         }
    1620         3547 :       else if (rc_tmp != ARITH_OK && rc == ARITH_OK)
    1621            3 :         rc = rc_tmp;
    1622              : 
    1623         3547 :       gfc_replace_expr (c->expr, r);
    1624              :     }
    1625              : 
    1626          881 :   if (is_hard_arith_error (rc))
    1627           32 :     gfc_constructor_free (head);
    1628              :   else
    1629              :     {
    1630          849 :       gfc_constructor *c = gfc_constructor_first (head);
    1631          849 :       if (c)
    1632              :         {
    1633          759 :           r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
    1634              :                                   &op2->where);
    1635          759 :           r->shape = gfc_copy_shape (op2->shape, op2->rank);
    1636          759 :           if (c->expr->ts.type == BT_CHARACTER)
    1637           70 :             r->ts.u.cl = c->expr->ts.u.cl;
    1638              :         }
    1639              :       else
    1640              :         {
    1641           90 :           gcc_assert (op2->ts.type != BT_UNKNOWN);
    1642           90 :           r = gfc_get_array_expr (op2->ts.type, op2->ts.kind,
    1643              :                                   &op2->where);
    1644           90 :           r->shape = gfc_get_shape (op2->rank);
    1645           90 :           if (op2->ts.type == BT_CHARACTER)
    1646            0 :             r->ts.u.cl = op2->ts.u.cl;
    1647              :         }
    1648          849 :       r->rank = op2->rank;
    1649          849 :       r->corank = op2->corank;
    1650          849 :       r->value.constructor = head;
    1651          849 :       *result = r;
    1652              :     }
    1653              : 
    1654          881 :   return rc;
    1655              : }
    1656              : 
    1657              : 
    1658              : /* We need a forward declaration of reduce_binary.  */
    1659              : static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    1660              :                             gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
    1661              : 
    1662              : 
    1663              : static arith
    1664         1596 : reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    1665              :                   gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
    1666              : {
    1667         1596 :   gfc_constructor_base head;
    1668         1596 :   gfc_constructor *c, *d;
    1669         1596 :   gfc_expr *r;
    1670         1596 :   arith rc = ARITH_OK;
    1671              : 
    1672         1596 :   if (!gfc_check_conformance (op1, op2, _("elemental binary operation")))
    1673              :     return ARITH_INCOMMENSURATE;
    1674              : 
    1675         1596 :   head = gfc_constructor_copy (op1->value.constructor);
    1676         3192 :   for (c = gfc_constructor_first (head),
    1677         1596 :        d = gfc_constructor_first (op2->value.constructor);
    1678         6159 :        c && d;
    1679         4563 :        c = gfc_constructor_next (c), d = gfc_constructor_next (d))
    1680              :     {
    1681         4568 :       arith rc_tmp = reduce_binary (eval, c->expr, d->expr, &r);
    1682              : 
    1683              :       /* Remember first recoverable ("soft") error encountered during
    1684              :          reduction and continue, but terminate on serious errors.  */
    1685         4568 :       if (is_hard_arith_error (rc_tmp))
    1686              :         {
    1687              :           rc = rc_tmp;
    1688              :           break;
    1689              :         }
    1690         4563 :       else if (rc_tmp != ARITH_OK && rc == ARITH_OK)
    1691            8 :         rc = rc_tmp;
    1692              : 
    1693         4563 :       gfc_replace_expr (c->expr, r);
    1694              :     }
    1695              : 
    1696         1596 :   if (rc == ARITH_OK && (c || d))
    1697              :     rc = ARITH_INCOMMENSURATE;
    1698              : 
    1699         1596 :   if (is_hard_arith_error (rc))
    1700            5 :     gfc_constructor_free (head);
    1701              :   else
    1702              :     {
    1703         1591 :       gfc_constructor *c = gfc_constructor_first (head);
    1704         1591 :       if (c == NULL)
    1705              :         {
    1706              :           /* Handle zero-sized arrays.  */
    1707          132 :           r = gfc_get_array_expr (op1->ts.type, op1->ts.kind, &op1->where);
    1708          132 :           if (op1->ts.type == BT_CHARACTER)
    1709            0 :             r->ts.u.cl = op1->ts.u.cl;
    1710              :         }
    1711              :       else
    1712              :         {
    1713         1459 :           r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
    1714              :                                   &op1->where);
    1715         1459 :           if (c->expr->ts.type == BT_CHARACTER)
    1716            6 :             r->ts.u.cl = c->expr->ts.u.cl;
    1717              :         }
    1718         1591 :       r->shape = gfc_copy_shape (op1->shape, op1->rank);
    1719         1591 :       r->rank = op1->rank;
    1720         1591 :       r->corank = op1->corank;
    1721         1591 :       r->value.constructor = head;
    1722         1591 :       *result = r;
    1723              :     }
    1724              : 
    1725              :   return rc;
    1726              : }
    1727              : 
    1728              : 
    1729              : static arith
    1730     11259377 : reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    1731              :                gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
    1732              : {
    1733     11259377 :   if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
    1734     11255605 :     return eval (op1, op2, result);
    1735              : 
    1736         3772 :   if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
    1737          737 :     return reduce_binary_ca (eval, op1, op2, result);
    1738              : 
    1739         3035 :   if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
    1740         1435 :     return reduce_binary_ac (eval, op1, op2, result);
    1741              : 
    1742         1600 :   if (op1->expr_type != EXPR_ARRAY || op2->expr_type != EXPR_ARRAY)
    1743              :     return ARITH_NOT_REDUCED;
    1744              : 
    1745         1596 :   return reduce_binary_aa (eval, op1, op2, result);
    1746              : }
    1747              : 
    1748              : 
    1749              : typedef union
    1750              : {
    1751              :   arith (*f2)(gfc_expr *, gfc_expr **);
    1752              :   arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
    1753              : }
    1754              : eval_f;
    1755              : 
    1756              : /* High level arithmetic subroutines.  These subroutines go into
    1757              :    eval_intrinsic(), which can do one of several things to its
    1758              :    operands.  If the operands are incompatible with the intrinsic
    1759              :    operation, we return a node pointing to the operands and hope that
    1760              :    an operator interface is found during resolution.
    1761              : 
    1762              :    If the operands are compatible and are constants, then we try doing
    1763              :    the arithmetic.  We also handle the cases where either or both
    1764              :    operands are array constructors.  */
    1765              : 
    1766              : static gfc_expr *
    1767     12910089 : eval_intrinsic (gfc_intrinsic_op op,
    1768              :                 eval_f eval, gfc_expr *op1, gfc_expr *op2)
    1769              : {
    1770     12910089 :   gfc_expr temp, *result;
    1771     12910089 :   int unary;
    1772     12910089 :   arith rc;
    1773              : 
    1774     12910089 :   if (!op1)
    1775              :     return NULL;
    1776              : 
    1777     12910085 :   gfc_clear_ts (&temp.ts);
    1778              : 
    1779     12910085 :   switch (op)
    1780              :     {
    1781              :     /* Logical unary  */
    1782        78037 :     case INTRINSIC_NOT:
    1783        78037 :       if (op1->ts.type != BT_LOGICAL)
    1784        70148 :         goto runtime;
    1785              : 
    1786         7889 :       temp.ts.type = BT_LOGICAL;
    1787         7889 :       temp.ts.kind = gfc_default_logical_kind;
    1788         7889 :       unary = 1;
    1789         7889 :       break;
    1790              : 
    1791              :     /* Logical binary operators  */
    1792       251400 :     case INTRINSIC_OR:
    1793       251400 :     case INTRINSIC_AND:
    1794       251400 :     case INTRINSIC_NEQV:
    1795       251400 :     case INTRINSIC_EQV:
    1796       251400 :       if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
    1797        62781 :         goto runtime;
    1798              : 
    1799       188619 :       temp.ts.type = BT_LOGICAL;
    1800       188619 :       temp.ts.kind = gfc_default_logical_kind;
    1801       188619 :       unary = 0;
    1802       188619 :       break;
    1803              : 
    1804              :     /* Numeric unary  */
    1805       152947 :     case INTRINSIC_UPLUS:
    1806       152947 :     case INTRINSIC_UMINUS:
    1807       152947 :       if (!gfc_numeric_ts (&op1->ts))
    1808         6828 :         goto runtime;
    1809              : 
    1810       146119 :       temp.ts = op1->ts;
    1811       146119 :       unary = 1;
    1812       146119 :       break;
    1813              : 
    1814            0 :     case INTRINSIC_PARENTHESES:
    1815            0 :       temp.ts = op1->ts;
    1816            0 :       unary = 1;
    1817            0 :       break;
    1818              : 
    1819              :     /* Additional restrictions for ordering relations.  */
    1820        65840 :     case INTRINSIC_GE:
    1821        65840 :     case INTRINSIC_GE_OS:
    1822        65840 :     case INTRINSIC_LT:
    1823        65840 :     case INTRINSIC_LT_OS:
    1824        65840 :     case INTRINSIC_LE:
    1825        65840 :     case INTRINSIC_LE_OS:
    1826        65840 :     case INTRINSIC_GT:
    1827        65840 :     case INTRINSIC_GT_OS:
    1828        65840 :       if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
    1829              :         {
    1830           36 :           temp.ts.type = BT_LOGICAL;
    1831           36 :           temp.ts.kind = gfc_default_logical_kind;
    1832           36 :           goto runtime;
    1833              :         }
    1834              : 
    1835              :     /* Fall through  */
    1836       968931 :     case INTRINSIC_EQ:
    1837       968931 :     case INTRINSIC_EQ_OS:
    1838       968931 :     case INTRINSIC_NE:
    1839       968931 :     case INTRINSIC_NE_OS:
    1840       968931 :       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
    1841              :         {
    1842       102776 :           unary = 0;
    1843       102776 :           temp.ts.type = BT_LOGICAL;
    1844       102776 :           temp.ts.kind = gfc_default_logical_kind;
    1845              : 
    1846              :           /* If kind mismatch, exit and we'll error out later.  */
    1847       102776 :           if (op1->ts.kind != op2->ts.kind)
    1848           40 :             goto runtime;
    1849              : 
    1850              :           break;
    1851              :         }
    1852              : 
    1853       940811 :     gcc_fallthrough ();
    1854              :     /* Numeric binary  */
    1855       940811 :     case INTRINSIC_POWER:
    1856       940811 :       if (pedantic && (op1->ts.type == BT_UNSIGNED || op2->ts.type == BT_UNSIGNED))
    1857              :         {
    1858           48 :           gfc_error ("Unsigned exponentiation not permitted with -pedantic "
    1859              :                      "at %L", &op1->where);
    1860           48 :           goto runtime;
    1861              :         }
    1862              : 
    1863     12316895 :       gcc_fallthrough ();
    1864              : 
    1865     12316895 :     case INTRINSIC_PLUS:
    1866     12316895 :     case INTRINSIC_MINUS:
    1867     12316895 :     case INTRINSIC_TIMES:
    1868     12316895 :     case INTRINSIC_DIVIDE:
    1869     12316895 :       if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
    1870       488083 :         goto runtime;
    1871              : 
    1872     11828812 :       if (flag_unsigned && gfc_invalid_unsigned_ops (op1, op2))
    1873            4 :         goto runtime;
    1874              : 
    1875              :       /* Do not perform conversions if operands are not conformable as
    1876              :          required for the binary intrinsic operators (F2018:10.1.5).
    1877              :          Defer to a possibly overloading user-defined operator.  */
    1878     11828808 :       if (!gfc_op_rank_conformable (op1, op2))
    1879          220 :             goto runtime;
    1880              : 
    1881              :       /* Insert any necessary type conversions to make the operands
    1882              :          compatible.  */
    1883              : 
    1884     11828588 :       temp.expr_type = EXPR_OP;
    1885     11828588 :       gfc_clear_ts (&temp.ts);
    1886     11828588 :       temp.value.op.op = op;
    1887              : 
    1888     11828588 :       temp.value.op.op1 = op1;
    1889     11828588 :       temp.value.op.op2 = op2;
    1890              : 
    1891     11830748 :       gfc_type_convert_binary (&temp, warn_conversion || warn_conversion_extra);
    1892              : 
    1893     11828588 :       if (op == INTRINSIC_EQ || op == INTRINSIC_NE
    1894     11828588 :           || op == INTRINSIC_GE || op == INTRINSIC_GT
    1895     11502408 :           || op == INTRINSIC_LE || op == INTRINSIC_LT
    1896     11491821 :           || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
    1897     11480392 :           || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
    1898     11394186 :           || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
    1899              :         {
    1900       444178 :           temp.ts.type = BT_LOGICAL;
    1901       444178 :           temp.ts.kind = gfc_default_logical_kind;
    1902              :         }
    1903              : 
    1904              :       unary = 0;
    1905              :       break;
    1906              : 
    1907              :     /* Character binary  */
    1908         7946 :     case INTRINSIC_CONCAT:
    1909         7946 :       if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
    1910         6370 :           || op1->ts.kind != op2->ts.kind)
    1911         1585 :         goto runtime;
    1912              : 
    1913         6361 :       temp.ts.type = BT_CHARACTER;
    1914         6361 :       temp.ts.kind = op1->ts.kind;
    1915         6361 :       unary = 0;
    1916         6361 :       break;
    1917              : 
    1918            0 :     case INTRINSIC_USER:
    1919            0 :       goto runtime;
    1920              : 
    1921            0 :     default:
    1922            0 :       gfc_internal_error ("eval_intrinsic(): Bad operator");
    1923              :     }
    1924              : 
    1925     12280312 :   if (op1->expr_type != EXPR_CONSTANT
    1926     12280312 :       && (op1->expr_type != EXPR_ARRAY
    1927         3133 :           || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
    1928       849448 :     goto runtime;
    1929              : 
    1930     11430864 :   if (op2 != NULL
    1931     11298327 :       && op2->expr_type != EXPR_CONSTANT
    1932     11476581 :          && (op2->expr_type != EXPR_ARRAY
    1933         2199 :              || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
    1934        43518 :     goto runtime;
    1935              : 
    1936              :   /* For array constructors with explicit type-spec, ensure elements are
    1937              :      converted to the specified type before any operations.  This handles
    1938              :      cases like [integer :: ([1.0])] ** 2 where parentheses would otherwise
    1939              :      cause the type-spec to be lost during constant folding.  */
    1940     11387346 :   if (op1->expr_type == EXPR_ARRAY && op1->ts.type != BT_UNKNOWN)
    1941         3106 :     gfc_check_constructor_type (op1);
    1942     11387346 :   if (op2 != NULL && op2->expr_type == EXPR_ARRAY && op2->ts.type != BT_UNKNOWN)
    1943         2199 :     gfc_check_constructor_type (op2);
    1944              : 
    1945              :   /* For CONCAT operations, also resolve character array constructors to
    1946              :      ensure elements are padded to the specified length before concatenation.
    1947              :      This ensures [character(16):: 'a','b'] // '|' pads to 16 chars first.  */
    1948     11387346 :   if (op == INTRINSIC_CONCAT)
    1949              :     {
    1950         4779 :       if (op1->expr_type == EXPR_ARRAY && op1->ts.type == BT_CHARACTER
    1951           92 :           && op1->ts.u.cl && op1->ts.u.cl->length_from_typespec)
    1952           54 :         gfc_resolve_character_array_constructor (op1);
    1953         4779 :       if (op2 != NULL && op2->expr_type == EXPR_ARRAY
    1954           53 :           && op2->ts.type == BT_CHARACTER
    1955           53 :           && op2->ts.u.cl && op2->ts.u.cl->length_from_typespec)
    1956           43 :         gfc_resolve_character_array_constructor (op2);
    1957              :     }
    1958              : 
    1959     11387346 :   if (unary)
    1960       132537 :     rc = reduce_unary (eval.f2, op1, &result);
    1961              :   else
    1962     11254809 :     rc = reduce_binary (eval.f3, op1, op2, &result);
    1963              : 
    1964     11387346 :   if (rc == ARITH_INVALID_TYPE || rc == ARITH_NOT_REDUCED)
    1965           57 :     goto runtime;
    1966              : 
    1967              :   /* Something went wrong.  */
    1968     11387289 :   if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
    1969              :     return NULL;
    1970              : 
    1971     11387288 :   if (rc != ARITH_OK)
    1972              :     {
    1973          168 :       gfc_error (gfc_arith_error (rc), &op1->where);
    1974          168 :       if (rc == ARITH_OVERFLOW)
    1975          113 :         goto done;
    1976              : 
    1977           55 :       if (rc == ARITH_DIV0 && op2->ts.type == BT_INTEGER)
    1978           24 :         gfc_seen_div0 = true;
    1979              : 
    1980           55 :       return NULL;
    1981              :     }
    1982              : 
    1983     11387120 : done:
    1984              : 
    1985     11387233 :   gfc_free_expr (op1);
    1986     11387233 :   gfc_free_expr (op2);
    1987     11387233 :   return result;
    1988              : 
    1989      1522796 : runtime:
    1990              :   /* Create a run-time expression.  */
    1991      1522796 :   result = gfc_get_operator_expr (&op1->where, op, op1, op2);
    1992      1522796 :   result->ts = temp.ts;
    1993      1522796 :   return result;
    1994              : }
    1995              : 
    1996              : 
    1997              : /* Modify type of expression for zero size array.  */
    1998              : 
    1999              : static gfc_expr *
    2000           69 : eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
    2001              : {
    2002           69 :   if (op == NULL)
    2003            0 :     gfc_internal_error ("eval_type_intrinsic0(): op NULL");
    2004              : 
    2005           69 :   switch (iop)
    2006              :     {
    2007           68 :     case INTRINSIC_GE:
    2008           68 :     case INTRINSIC_GE_OS:
    2009           68 :     case INTRINSIC_LT:
    2010           68 :     case INTRINSIC_LT_OS:
    2011           68 :     case INTRINSIC_LE:
    2012           68 :     case INTRINSIC_LE_OS:
    2013           68 :     case INTRINSIC_GT:
    2014           68 :     case INTRINSIC_GT_OS:
    2015           68 :     case INTRINSIC_EQ:
    2016           68 :     case INTRINSIC_EQ_OS:
    2017           68 :     case INTRINSIC_NE:
    2018           68 :     case INTRINSIC_NE_OS:
    2019           68 :       op->ts.type = BT_LOGICAL;
    2020           68 :       op->ts.kind = gfc_default_logical_kind;
    2021           68 :       break;
    2022              : 
    2023              :     default:
    2024              :       break;
    2025              :     }
    2026              : 
    2027           69 :   return op;
    2028              : }
    2029              : 
    2030              : 
    2031              : /* Return nonzero if the expression is a zero size array.  */
    2032              : 
    2033              : static bool
    2034     25589264 : gfc_zero_size_array (gfc_expr *e)
    2035              : {
    2036     25589260 :   if (e == NULL || e->expr_type != EXPR_ARRAY)
    2037              :     return false;
    2038              : 
    2039            0 :   return e->value.constructor == NULL;
    2040              : }
    2041              : 
    2042              : 
    2043              : /* Reduce a binary expression where at least one of the operands
    2044              :    involves a zero-length array.  Returns NULL if neither of the
    2045              :    operands is a zero-length array.  */
    2046              : 
    2047              : static gfc_expr *
    2048     12679174 : reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
    2049              : {
    2050     12684100 :   if (gfc_zero_size_array (op1))
    2051              :     {
    2052           68 :       gfc_free_expr (op2);
    2053           68 :       return op1;
    2054              :     }
    2055              : 
    2056     12753500 :   if (gfc_zero_size_array (op2))
    2057              :     {
    2058            1 :       gfc_free_expr (op1);
    2059            1 :       return op2;
    2060              :     }
    2061              : 
    2062              :   return NULL;
    2063              : }
    2064              : 
    2065              : 
    2066              : static gfc_expr *
    2067       230984 : eval_intrinsic_f2 (gfc_intrinsic_op op,
    2068              :                    arith (*eval) (gfc_expr *, gfc_expr **),
    2069              :                    gfc_expr *op1, gfc_expr *op2)
    2070              : {
    2071       230984 :   gfc_expr *result;
    2072       230984 :   eval_f f;
    2073              : 
    2074       230984 :   if (op2 == NULL)
    2075              :     {
    2076       231232 :       if (gfc_zero_size_array (op1))
    2077            0 :         return eval_type_intrinsic0 (op, op1);
    2078              :     }
    2079              :   else
    2080              :     {
    2081            0 :       result = reduce_binary0 (op1, op2);
    2082            0 :       if (result != NULL)
    2083            0 :         return eval_type_intrinsic0 (op, result);
    2084              :     }
    2085              : 
    2086       230984 :   f.f2 = eval;
    2087       230984 :   return eval_intrinsic (op, f, op1, op2);
    2088              : }
    2089              : 
    2090              : 
    2091              : static gfc_expr *
    2092     12679183 : eval_intrinsic_f3 (gfc_intrinsic_op op,
    2093              :                    arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
    2094              :                    gfc_expr *op1, gfc_expr *op2)
    2095              : {
    2096     12679183 :   gfc_expr *result;
    2097     12679183 :   eval_f f;
    2098              : 
    2099     12679183 :   if (!op1 && !op2)
    2100              :     return NULL;
    2101              : 
    2102     12679174 :   result = reduce_binary0 (op1, op2);
    2103     12679174 :   if (result != NULL)
    2104           69 :     return eval_type_intrinsic0(op, result);
    2105              : 
    2106     12679105 :   f.f3 = eval;
    2107     12679105 :   return eval_intrinsic (op, f, op1, op2);
    2108              : }
    2109              : 
    2110              : 
    2111              : gfc_expr *
    2112      5258498 : gfc_parentheses (gfc_expr *op)
    2113              : {
    2114      5258498 :   if (gfc_is_constant_expr (op))
    2115              :     return op;
    2116              : 
    2117            0 :   return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
    2118            0 :                             op, NULL);
    2119              : }
    2120              : 
    2121              : gfc_expr *
    2122          407 : gfc_uplus (gfc_expr *op)
    2123              : {
    2124          407 :   return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
    2125              : }
    2126              : 
    2127              : 
    2128              : gfc_expr *
    2129       152540 : gfc_uminus (gfc_expr *op)
    2130              : {
    2131       152540 :   return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
    2132              : }
    2133              : 
    2134              : 
    2135              : gfc_expr *
    2136     10412091 : gfc_add (gfc_expr *op1, gfc_expr *op2)
    2137              : {
    2138     10412091 :   return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
    2139              : }
    2140              : 
    2141              : 
    2142              : gfc_expr *
    2143       576675 : gfc_subtract (gfc_expr *op1, gfc_expr *op2)
    2144              : {
    2145       576675 :   return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
    2146              : }
    2147              : 
    2148              : 
    2149              : gfc_expr *
    2150       368385 : gfc_multiply (gfc_expr *op1, gfc_expr *op2)
    2151              : {
    2152       368385 :   return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
    2153              : }
    2154              : 
    2155              : 
    2156              : gfc_expr *
    2157        18995 : gfc_divide (gfc_expr *op1, gfc_expr *op2)
    2158              : {
    2159        18995 :   return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
    2160              : }
    2161              : 
    2162              : 
    2163              : gfc_expr *
    2164        74656 : gfc_power (gfc_expr *op1, gfc_expr *op2)
    2165              : {
    2166        74656 :   return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
    2167              : }
    2168              : 
    2169              : 
    2170              : gfc_expr *
    2171         7946 : gfc_concat (gfc_expr *op1, gfc_expr *op2)
    2172              : {
    2173         7946 :   return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
    2174              : }
    2175              : 
    2176              : 
    2177              : gfc_expr *
    2178        18583 : gfc_and (gfc_expr *op1, gfc_expr *op2)
    2179              : {
    2180        18583 :   return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
    2181              : }
    2182              : 
    2183              : 
    2184              : gfc_expr *
    2185       207209 : gfc_or (gfc_expr *op1, gfc_expr *op2)
    2186              : {
    2187       207209 :   return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
    2188              : }
    2189              : 
    2190              : 
    2191              : gfc_expr *
    2192        78037 : gfc_not (gfc_expr *op1)
    2193              : {
    2194        78037 :   return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
    2195              : }
    2196              : 
    2197              : 
    2198              : gfc_expr *
    2199         1998 : gfc_eqv (gfc_expr *op1, gfc_expr *op2)
    2200              : {
    2201         1998 :   return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
    2202              : }
    2203              : 
    2204              : 
    2205              : gfc_expr *
    2206        23610 : gfc_neqv (gfc_expr *op1, gfc_expr *op2)
    2207              : {
    2208        23610 :   return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
    2209              : }
    2210              : 
    2211              : 
    2212              : gfc_expr *
    2213        34778 : gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2214              : {
    2215        34778 :   return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
    2216              : }
    2217              : 
    2218              : 
    2219              : gfc_expr *
    2220       868365 : gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2221              : {
    2222       868365 :   return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
    2223              : }
    2224              : 
    2225              : 
    2226              : gfc_expr *
    2227        42041 : gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2228              : {
    2229        42041 :   return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
    2230              : }
    2231              : 
    2232              : 
    2233              : gfc_expr *
    2234         4765 : gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2235              : {
    2236         4765 :   return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
    2237              : }
    2238              : 
    2239              : 
    2240              : gfc_expr *
    2241        11279 : gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2242              : {
    2243        11279 :   return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
    2244              : }
    2245              : 
    2246              : 
    2247              : gfc_expr *
    2248         7807 : gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
    2249              : {
    2250         7807 :   return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
    2251              : }
    2252              : 
    2253              : 
    2254              : /******* Simplification of intrinsic functions with constant arguments *****/
    2255              : 
    2256              : 
    2257              : /* Deal with an arithmetic error.  */
    2258              : 
    2259              : static void
    2260            6 : arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
    2261              : {
    2262            6 :   switch (rc)
    2263              :     {
    2264            0 :     case ARITH_OK:
    2265            0 :       gfc_error ("Arithmetic OK converting %s to %s at %L",
    2266              :                  gfc_typename (from), gfc_typename (to), where);
    2267            0 :       break;
    2268            6 :     case ARITH_OVERFLOW:
    2269            6 :       gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
    2270              :                  "can be disabled with the option %<-fno-range-check%>",
    2271              :                  gfc_typename (from), gfc_typename (to), where);
    2272            6 :       break;
    2273            0 :     case ARITH_UNDERFLOW:
    2274            0 :       gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
    2275              :                  "can be disabled with the option %<-fno-range-check%>",
    2276              :                  gfc_typename (from), gfc_typename (to), where);
    2277            0 :       break;
    2278            0 :     case ARITH_NAN:
    2279            0 :       gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
    2280              :                  "can be disabled with the option %<-fno-range-check%>",
    2281              :                  gfc_typename (from), gfc_typename (to), where);
    2282            0 :       break;
    2283            0 :     case ARITH_DIV0:
    2284            0 :       gfc_error ("Division by zero converting %s to %s at %L",
    2285              :                  gfc_typename (from), gfc_typename (to), where);
    2286            0 :       break;
    2287            0 :     case ARITH_INCOMMENSURATE:
    2288            0 :       gfc_error ("Array operands are incommensurate converting %s to %s at %L",
    2289              :                  gfc_typename (from), gfc_typename (to), where);
    2290            0 :       break;
    2291            0 :     case ARITH_ASYMMETRIC:
    2292            0 :       gfc_error ("Integer outside symmetric range implied by Standard Fortran"
    2293              :                  " converting %s to %s at %L",
    2294              :                  gfc_typename (from), gfc_typename (to), where);
    2295            0 :       break;
    2296            0 :     default:
    2297            0 :       gfc_internal_error ("gfc_arith_error(): Bad error code");
    2298              :     }
    2299              : 
    2300              :   /* TODO: Do something about the error, i.e., throw exception, return
    2301              :      NaN, etc.  */
    2302            6 : }
    2303              : 
    2304              : /* Returns true if significant bits were lost when converting real
    2305              :    constant r from from_kind to to_kind.  */
    2306              : 
    2307              : static bool
    2308           19 : wprecision_real_real (mpfr_t r, int from_kind, int to_kind)
    2309              : {
    2310           19 :   mpfr_t rv, diff;
    2311           19 :   bool ret;
    2312              : 
    2313           19 :   gfc_set_model_kind (to_kind);
    2314           19 :   mpfr_init (rv);
    2315           19 :   gfc_set_model_kind (from_kind);
    2316           19 :   mpfr_init (diff);
    2317              : 
    2318           19 :   mpfr_set (rv, r, GFC_RND_MODE);
    2319           19 :   mpfr_sub (diff, rv, r, GFC_RND_MODE);
    2320              : 
    2321           19 :   ret = ! mpfr_zero_p (diff);
    2322           19 :   mpfr_clear (rv);
    2323           19 :   mpfr_clear (diff);
    2324           19 :   return ret;
    2325              : }
    2326              : 
    2327              : /* Return true if conversion from an integer to a real loses precision.  */
    2328              : 
    2329              : static bool
    2330           82 : wprecision_int_real (mpz_t n, mpfr_t r)
    2331              : {
    2332           82 :   bool ret;
    2333           82 :   mpz_t i;
    2334           82 :   mpz_init (i);
    2335           82 :   mpfr_get_z (i, r, GFC_RND_MODE);
    2336           82 :   mpz_sub (i, i, n);
    2337           82 :   ret = mpz_cmp_si (i, 0) != 0;
    2338           82 :   mpz_clear (i);
    2339           82 :   return ret;
    2340              : }
    2341              : 
    2342              : /* Convert integers to integers; we can reuse this for also converting
    2343              :    unsigneds.  */
    2344              : 
    2345              : gfc_expr *
    2346        69824 : gfc_int2int (gfc_expr *src, int kind)
    2347              : {
    2348        69824 :   gfc_expr *result;
    2349        69824 :   arith rc;
    2350              : 
    2351        69824 :   if (src->ts.type != BT_INTEGER && src->ts.type != BT_UNSIGNED)
    2352              :     return NULL;
    2353              : 
    2354        69824 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    2355              : 
    2356        69824 :   mpz_set (result->value.integer, src->value.integer);
    2357              : 
    2358        69824 :   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
    2359              :     {
    2360            5 :       if (rc == ARITH_ASYMMETRIC)
    2361              :         {
    2362            0 :           gfc_warning (0, gfc_arith_error (rc), &src->where);
    2363              :         }
    2364              :       else
    2365              :         {
    2366            5 :           arith_error (rc, &src->ts, &result->ts, &src->where);
    2367            5 :           gfc_free_expr (result);
    2368            5 :           return NULL;
    2369              :         }
    2370              :     }
    2371              : 
    2372              :   /*  If we do not trap numeric overflow, we need to convert the number to
    2373              :       signed, throwing away high-order bits if necessary.  */
    2374        69819 :   if (flag_range_check == 0)
    2375              :     {
    2376          132 :       int k;
    2377              : 
    2378          132 :       k = gfc_validate_kind (BT_INTEGER, kind, false);
    2379          132 :       gfc_convert_mpz_to_signed (result->value.integer,
    2380              :                                  gfc_integer_kinds[k].bit_size);
    2381              : 
    2382          132 :       if (warn_conversion && !src->do_not_warn && kind < src->ts.kind)
    2383            1 :         gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
    2384              :                          gfc_typename (&src->ts), gfc_typename (&result->ts),
    2385              :                          &src->where);
    2386              :     }
    2387              :   return result;
    2388              : }
    2389              : 
    2390              : 
    2391              : /* Convert integers to reals.  */
    2392              : 
    2393              : gfc_expr *
    2394        99474 : gfc_int2real (gfc_expr *src, int kind)
    2395              : {
    2396        99474 :   gfc_expr *result;
    2397        99474 :   arith rc;
    2398              : 
    2399        99474 :   if (src->ts.type != BT_INTEGER)
    2400              :     return NULL;
    2401              : 
    2402        99473 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    2403              : 
    2404        99473 :   mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
    2405              : 
    2406        99473 :   if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
    2407              :     {
    2408            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2409            0 :       gfc_free_expr (result);
    2410            0 :       return NULL;
    2411              :     }
    2412              : 
    2413        99473 :   if (warn_conversion
    2414        99473 :       && wprecision_int_real (src->value.integer, result->value.real))
    2415            4 :     gfc_warning (OPT_Wconversion, "Change of value in conversion "
    2416              :                  "from %qs to %qs at %L",
    2417              :                  gfc_typename (&src->ts),
    2418              :                  gfc_typename (&result->ts),
    2419              :                  &src->where);
    2420              : 
    2421              :   return result;
    2422              : }
    2423              : 
    2424              : 
    2425              : /* Convert default integer to default complex.  */
    2426              : 
    2427              : gfc_expr *
    2428          883 : gfc_int2complex (gfc_expr *src, int kind)
    2429              : {
    2430          883 :   gfc_expr *result;
    2431          883 :   arith rc;
    2432              : 
    2433          883 :   if (src->ts.type != BT_INTEGER)
    2434              :     return NULL;
    2435              : 
    2436          880 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    2437              : 
    2438          880 :   mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
    2439              : 
    2440          880 :   if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
    2441              :       != ARITH_OK)
    2442              :     {
    2443            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2444            0 :       gfc_free_expr (result);
    2445            0 :       return NULL;
    2446              :     }
    2447              : 
    2448          880 :   if (warn_conversion
    2449          880 :       && wprecision_int_real (src->value.integer,
    2450              :                               mpc_realref (result->value.complex)))
    2451            1 :       gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
    2452              :                        "from %qs to %qs at %L",
    2453              :                        gfc_typename (&src->ts),
    2454              :                        gfc_typename (&result->ts),
    2455              :                        &src->where);
    2456              : 
    2457              :   return result;
    2458              : }
    2459              : 
    2460              : /* Convert unsigned to unsigned, or integer to unsigned.  */
    2461              : 
    2462              : gfc_expr *
    2463          441 : gfc_uint2uint (gfc_expr *src, int kind)
    2464              : {
    2465          441 :   gfc_expr *result;
    2466          441 :   arith rc;
    2467              : 
    2468          441 :   if (src->ts.type != BT_UNSIGNED && src->ts.type != BT_INTEGER)
    2469              :     return NULL;
    2470              : 
    2471          441 :   result = gfc_get_constant_expr (BT_UNSIGNED, kind, &src->where);
    2472          441 :   mpz_set (result->value.integer, src->value.integer);
    2473              : 
    2474          441 :   rc = gfc_range_check (result);
    2475          441 :   if (rc != ARITH_OK)
    2476           12 :     gfc_warning (OPT_Wconversion, gfc_arith_error (rc), &result->where);
    2477              : 
    2478          441 :   gfc_reduce_unsigned (result);
    2479          441 :   return result;
    2480              : }
    2481              : 
    2482              : gfc_expr *
    2483          152 : gfc_int2uint (gfc_expr *src, int kind)
    2484              : {
    2485          152 :   return gfc_uint2uint (src, kind);
    2486              : }
    2487              : 
    2488              : gfc_expr *
    2489          325 : gfc_uint2int (gfc_expr *src, int kind)
    2490              : {
    2491          325 :   return gfc_int2int (src, kind);
    2492              : }
    2493              : 
    2494              : /* Convert UNSIGNED to reals.  */
    2495              : 
    2496              : gfc_expr *
    2497           48 : gfc_uint2real (gfc_expr *src, int kind)
    2498              : {
    2499           48 :   gfc_expr *result;
    2500           48 :   arith rc;
    2501              : 
    2502           48 :   if (src->ts.type != BT_UNSIGNED)
    2503              :     return NULL;
    2504              : 
    2505           48 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    2506              : 
    2507           48 :   mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
    2508              : 
    2509           48 :   if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
    2510              :     {
    2511              :       /* This should be rare, just in case.  */
    2512            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2513            0 :       gfc_free_expr (result);
    2514            0 :       return NULL;
    2515              :     }
    2516              : 
    2517           48 :   if (warn_conversion
    2518           48 :       && wprecision_int_real (src->value.integer, result->value.real))
    2519            0 :     gfc_warning (OPT_Wconversion, "Change of value in conversion "
    2520              :                  "from %qs to %qs at %L",
    2521              :                  gfc_typename (&src->ts),
    2522              :                  gfc_typename (&result->ts),
    2523              :                  &src->where);
    2524              : 
    2525              :   return result;
    2526              : }
    2527              : 
    2528              : /* Convert default integer to default complex.  */
    2529              : 
    2530              : gfc_expr *
    2531            0 : gfc_uint2complex (gfc_expr *src, int kind)
    2532              : {
    2533            0 :   gfc_expr *result;
    2534            0 :   arith rc;
    2535              : 
    2536            0 :   if (src->ts.type != BT_UNSIGNED)
    2537              :     return NULL;
    2538              : 
    2539            0 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    2540              : 
    2541            0 :   mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
    2542              : 
    2543            0 :   if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
    2544              :       != ARITH_OK)
    2545              :     {
    2546              :       /* This should be rare, just in case.  */
    2547            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2548            0 :       gfc_free_expr (result);
    2549            0 :       return NULL;
    2550              :     }
    2551              : 
    2552            0 :   if (warn_conversion
    2553            0 :       && wprecision_int_real (src->value.integer,
    2554              :                               mpc_realref (result->value.complex)))
    2555            0 :       gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
    2556              :                        "from %qs to %qs at %L",
    2557              :                        gfc_typename (&src->ts),
    2558              :                        gfc_typename (&result->ts),
    2559              :                        &src->where);
    2560              : 
    2561              :   return result;
    2562              : }
    2563              : 
    2564              : /* Convert default real to default integer.  */
    2565              : 
    2566              : gfc_expr *
    2567          399 : gfc_real2int (gfc_expr *src, int kind)
    2568              : {
    2569          399 :   gfc_expr *result;
    2570          399 :   arith rc;
    2571          399 :   bool did_warn = false;
    2572              : 
    2573          399 :   if (src->ts.type != BT_REAL)
    2574              :     return NULL;
    2575              : 
    2576          399 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    2577              : 
    2578          399 :   gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
    2579              : 
    2580          399 :   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
    2581              :     {
    2582            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2583            0 :       gfc_free_expr (result);
    2584            0 :       return NULL;
    2585              :     }
    2586              : 
    2587              :   /* If there was a fractional part, warn about this.  */
    2588              : 
    2589          399 :   if (warn_conversion)
    2590              :     {
    2591            4 :       mpfr_t f;
    2592            4 :       mpfr_init (f);
    2593            4 :       mpfr_frac (f, src->value.real, GFC_RND_MODE);
    2594            4 :       if (mpfr_cmp_si (f, 0) != 0)
    2595              :         {
    2596            2 :           gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
    2597              :                            "from %qs to %qs at %L", gfc_typename (&src->ts),
    2598              :                            gfc_typename (&result->ts), &src->where);
    2599            2 :           did_warn = true;
    2600              :         }
    2601            4 :       mpfr_clear (f);
    2602              :     }
    2603          399 :   if (!did_warn && warn_conversion_extra)
    2604              :     {
    2605            1 :       gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2606              :                        "at %L", gfc_typename (&src->ts),
    2607              :                        gfc_typename (&result->ts), &src->where);
    2608              :     }
    2609              : 
    2610              :   return result;
    2611              : }
    2612              : 
    2613              : /* Convert real to unsigned.  */
    2614              : 
    2615              : gfc_expr *
    2616            6 : gfc_real2uint (gfc_expr *src, int kind)
    2617              : {
    2618            6 :   gfc_expr *result;
    2619            6 :   arith rc;
    2620            6 :   bool did_warn = false;
    2621              : 
    2622            6 :   if (src->ts.type != BT_REAL)
    2623              :     return NULL;
    2624              : 
    2625            6 :   result = gfc_get_constant_expr (BT_UNSIGNED, kind, &src->where);
    2626              : 
    2627            6 :   gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
    2628            6 :   if ((rc = gfc_check_unsigned_range (result->value.integer, kind)) != ARITH_OK)
    2629            0 :     gfc_warning (OPT_Wconversion, gfc_arith_error (rc), &result->where);
    2630              : 
    2631            6 :   gfc_reduce_unsigned (result);
    2632              : 
    2633              :   /* If there was a fractional part, warn about this.  */
    2634              : 
    2635            6 :   if (warn_conversion)
    2636              :     {
    2637            0 :       mpfr_t f;
    2638            0 :       mpfr_init (f);
    2639            0 :       mpfr_frac (f, src->value.real, GFC_RND_MODE);
    2640            0 :       if (mpfr_cmp_si (f, 0) != 0)
    2641              :         {
    2642            0 :           gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
    2643              :                            "from %qs to %qs at %L", gfc_typename (&src->ts),
    2644              :                            gfc_typename (&result->ts), &src->where);
    2645            0 :           did_warn = true;
    2646              :         }
    2647            0 :       mpfr_clear (f);
    2648              :     }
    2649            6 :   if (!did_warn && warn_conversion_extra)
    2650              :     {
    2651            0 :       gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2652              :                        "at %L", gfc_typename (&src->ts),
    2653              :                        gfc_typename (&result->ts), &src->where);
    2654              :     }
    2655              : 
    2656              :   return result;
    2657              : }
    2658              : 
    2659              : /* Convert real to real.  */
    2660              : 
    2661              : gfc_expr *
    2662         8052 : gfc_real2real (gfc_expr *src, int kind)
    2663              : {
    2664         8052 :   gfc_expr *result;
    2665         8052 :   arith rc;
    2666         8052 :   bool did_warn = false;
    2667              : 
    2668         8052 :   if (src->ts.type != BT_REAL)
    2669              :     return NULL;
    2670              : 
    2671         8048 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    2672              : 
    2673         8048 :   mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
    2674              : 
    2675         8048 :   rc = gfc_check_real_range (result->value.real, kind);
    2676              : 
    2677         8048 :   if (rc == ARITH_UNDERFLOW)
    2678              :     {
    2679            0 :       if (warn_underflow)
    2680            0 :         gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
    2681            0 :       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
    2682              :     }
    2683         8048 :   else if (rc != ARITH_OK)
    2684              :     {
    2685            1 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2686            1 :       gfc_free_expr (result);
    2687            1 :       return NULL;
    2688              :     }
    2689              : 
    2690              :   /* As a special bonus, don't warn about REAL values which are not changed by
    2691              :      the conversion if -Wconversion is specified and -Wconversion-extra is
    2692              :      not.  */
    2693              : 
    2694         8047 :   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
    2695              :     {
    2696           11 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    2697              : 
    2698              :       /* Calculate the difference between the constant and the rounded
    2699              :          value and check it against zero.  */
    2700              : 
    2701           11 :       if (wprecision_real_real (src->value.real, src->ts.kind, kind))
    2702              :         {
    2703            2 :           gfc_warning_now (w, "Change of value in conversion from "
    2704              :                            "%qs to %qs at %L",
    2705              :                            gfc_typename (&src->ts), gfc_typename (&result->ts),
    2706              :                            &src->where);
    2707              :           /* Make sure the conversion warning is not emitted again.  */
    2708            2 :           did_warn = true;
    2709              :         }
    2710              :     }
    2711              : 
    2712         8047 :     if (!did_warn && warn_conversion_extra)
    2713            8 :       gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2714              :                        "at %L", gfc_typename(&src->ts),
    2715              :                        gfc_typename(&result->ts), &src->where);
    2716              : 
    2717              :   return result;
    2718              : }
    2719              : 
    2720              : 
    2721              : /* Convert real to complex.  */
    2722              : 
    2723              : gfc_expr *
    2724         1360 : gfc_real2complex (gfc_expr *src, int kind)
    2725              : {
    2726         1360 :   gfc_expr *result;
    2727         1360 :   arith rc;
    2728         1360 :   bool did_warn = false;
    2729              : 
    2730         1360 :   if (src->ts.type != BT_REAL)
    2731              :     return NULL;
    2732              : 
    2733         1355 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    2734              : 
    2735         1355 :   mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
    2736              : 
    2737         1355 :   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
    2738              : 
    2739         1355 :   if (rc == ARITH_UNDERFLOW)
    2740              :     {
    2741            0 :       if (warn_underflow)
    2742            0 :         gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
    2743            0 :       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
    2744              :     }
    2745         1355 :   else if (rc != ARITH_OK)
    2746              :     {
    2747            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2748            0 :       gfc_free_expr (result);
    2749            0 :       return NULL;
    2750              :     }
    2751              : 
    2752         1355 :   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
    2753              :     {
    2754            2 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    2755              : 
    2756            2 :       if (wprecision_real_real (src->value.real, src->ts.kind, kind))
    2757              :         {
    2758            1 :           gfc_warning_now (w, "Change of value in conversion from "
    2759              :                            "%qs to %qs at %L",
    2760              :                            gfc_typename (&src->ts), gfc_typename (&result->ts),
    2761              :                            &src->where);
    2762              :           /* Make sure the conversion warning is not emitted again.  */
    2763            1 :           did_warn = true;
    2764              :         }
    2765              :     }
    2766              : 
    2767         1355 :   if (!did_warn && warn_conversion_extra)
    2768            2 :     gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2769              :                      "at %L", gfc_typename(&src->ts),
    2770              :                      gfc_typename(&result->ts), &src->where);
    2771              : 
    2772              :   return result;
    2773              : }
    2774              : 
    2775              : 
    2776              : /* Convert complex to integer.  */
    2777              : 
    2778              : gfc_expr *
    2779           80 : gfc_complex2int (gfc_expr *src, int kind)
    2780              : {
    2781           80 :   gfc_expr *result;
    2782           80 :   arith rc;
    2783           80 :   bool did_warn = false;
    2784              : 
    2785           80 :   if (src->ts.type != BT_COMPLEX)
    2786              :     return NULL;
    2787              : 
    2788           80 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    2789              : 
    2790           80 :   gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
    2791              :                    &src->where);
    2792              : 
    2793           80 :   if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
    2794              :     {
    2795            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2796            0 :       gfc_free_expr (result);
    2797            0 :       return NULL;
    2798              :     }
    2799              : 
    2800           80 :   if (warn_conversion || warn_conversion_extra)
    2801              :     {
    2802            4 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    2803              : 
    2804              :       /* See if we discarded an imaginary part.  */
    2805            4 :       if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
    2806              :         {
    2807            2 :           gfc_warning_now (w, "Non-zero imaginary part discarded "
    2808              :                            "in conversion from %qs to %qs at %L",
    2809              :                            gfc_typename(&src->ts), gfc_typename (&result->ts),
    2810              :                            &src->where);
    2811            2 :           did_warn = true;
    2812              :         }
    2813              : 
    2814              :       else {
    2815            2 :         mpfr_t f;
    2816              : 
    2817            2 :         mpfr_init (f);
    2818            2 :         mpfr_frac (f, src->value.real, GFC_RND_MODE);
    2819            2 :         if (mpfr_cmp_si (f, 0) != 0)
    2820              :           {
    2821            1 :             gfc_warning_now (w, "Change of value in conversion from "
    2822              :                              "%qs to %qs at %L", gfc_typename (&src->ts),
    2823              :                              gfc_typename (&result->ts), &src->where);
    2824            1 :             did_warn = true;
    2825              :           }
    2826            2 :         mpfr_clear (f);
    2827              :       }
    2828              : 
    2829            4 :       if (!did_warn && warn_conversion_extra)
    2830              :         {
    2831            0 :           gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2832              :                            "at %L", gfc_typename (&src->ts),
    2833              :                            gfc_typename (&result->ts), &src->where);
    2834              :         }
    2835              :     }
    2836              : 
    2837              :   return result;
    2838              : }
    2839              : 
    2840              : /* Convert complex to integer.  */
    2841              : 
    2842              : gfc_expr *
    2843            6 : gfc_complex2uint (gfc_expr *src, int kind)
    2844              : {
    2845            6 :   gfc_expr *result;
    2846            6 :   arith rc;
    2847            6 :   bool did_warn = false;
    2848              : 
    2849            6 :   if (src->ts.type != BT_COMPLEX)
    2850              :     return NULL;
    2851              : 
    2852            6 :   result = gfc_get_constant_expr (BT_UNSIGNED, kind, &src->where);
    2853              : 
    2854            6 :   gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
    2855              :                    &src->where);
    2856              : 
    2857            6 :   if ((rc = gfc_check_unsigned_range (result->value.integer, kind)) != ARITH_OK)
    2858            0 :     gfc_warning (OPT_Wconversion, gfc_arith_error (rc), &result->where);
    2859              : 
    2860            6 :   gfc_reduce_unsigned (result);
    2861              : 
    2862            6 :   if (warn_conversion || warn_conversion_extra)
    2863              :     {
    2864            0 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    2865              : 
    2866              :       /* See if we discarded an imaginary part.  */
    2867            0 :       if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
    2868              :         {
    2869            0 :           gfc_warning_now (w, "Non-zero imaginary part discarded "
    2870              :                            "in conversion from %qs to %qs at %L",
    2871              :                            gfc_typename(&src->ts), gfc_typename (&result->ts),
    2872              :                            &src->where);
    2873            0 :           did_warn = true;
    2874              :         }
    2875              : 
    2876              :       else
    2877              :         {
    2878            0 :           mpfr_t f;
    2879              : 
    2880            0 :           mpfr_init (f);
    2881            0 :           mpfr_frac (f, src->value.real, GFC_RND_MODE);
    2882            0 :           if (mpfr_cmp_si (f, 0) != 0)
    2883              :             {
    2884            0 :               gfc_warning_now (w, "Change of value in conversion from "
    2885              :                                "%qs to %qs at %L", gfc_typename (&src->ts),
    2886              :                                gfc_typename (&result->ts), &src->where);
    2887            0 :               did_warn = true;
    2888              :             }
    2889            0 :           mpfr_clear (f);
    2890              :         }
    2891              : 
    2892            0 :       if (!did_warn && warn_conversion_extra)
    2893              :         {
    2894            0 :           gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    2895              :                            "at %L", gfc_typename (&src->ts),
    2896              :                            gfc_typename (&result->ts), &src->where);
    2897              :         }
    2898              :     }
    2899              : 
    2900              :   return result;
    2901              : }
    2902              : 
    2903              : 
    2904              : /* Convert complex to real.  */
    2905              : 
    2906              : gfc_expr *
    2907          229 : gfc_complex2real (gfc_expr *src, int kind)
    2908              : {
    2909          229 :   gfc_expr *result;
    2910          229 :   arith rc;
    2911          229 :   bool did_warn = false;
    2912              : 
    2913          229 :   if (src->ts.type != BT_COMPLEX)
    2914              :     return NULL;
    2915              : 
    2916          229 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    2917              : 
    2918          229 :   mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
    2919              : 
    2920          229 :   rc = gfc_check_real_range (result->value.real, kind);
    2921              : 
    2922          229 :   if (rc == ARITH_UNDERFLOW)
    2923              :     {
    2924            0 :       if (warn_underflow)
    2925            0 :         gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
    2926            0 :       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
    2927              :     }
    2928          229 :   if (rc != ARITH_OK)
    2929              :     {
    2930            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    2931            0 :       gfc_free_expr (result);
    2932            0 :       return NULL;
    2933              :     }
    2934              : 
    2935          229 :   if (warn_conversion || warn_conversion_extra)
    2936              :     {
    2937            4 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    2938              : 
    2939              :       /* See if we discarded an imaginary part.  */
    2940            4 :       if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
    2941              :         {
    2942            4 :           gfc_warning (w, "Non-zero imaginary part discarded "
    2943              :                        "in conversion from %qs to %qs at %L",
    2944              :                        gfc_typename(&src->ts), gfc_typename (&result->ts),
    2945              :                        &src->where);
    2946            4 :           did_warn = true;
    2947              :         }
    2948              : 
    2949              :       /* Calculate the difference between the real constant and the rounded
    2950              :          value and check it against zero.  */
    2951              : 
    2952            4 :       if (kind > src->ts.kind
    2953            4 :           && wprecision_real_real (mpc_realref (src->value.complex),
    2954              :                                    src->ts.kind, kind))
    2955              :         {
    2956            0 :           gfc_warning_now (w, "Change of value in conversion from "
    2957              :                            "%qs to %qs at %L",
    2958              :                            gfc_typename (&src->ts), gfc_typename (&result->ts),
    2959              :                            &src->where);
    2960              :           /* Make sure the conversion warning is not emitted again.  */
    2961            0 :           did_warn = true;
    2962              :         }
    2963              :     }
    2964              : 
    2965          229 :   if (!did_warn && warn_conversion_extra)
    2966            0 :     gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
    2967              :                      gfc_typename(&src->ts), gfc_typename (&result->ts),
    2968              :                      &src->where);
    2969              : 
    2970              :   return result;
    2971              : }
    2972              : 
    2973              : 
    2974              : /* Convert complex to complex.  */
    2975              : 
    2976              : gfc_expr *
    2977          672 : gfc_complex2complex (gfc_expr *src, int kind)
    2978              : {
    2979          672 :   gfc_expr *result;
    2980          672 :   arith rc;
    2981          672 :   bool did_warn = false;
    2982              : 
    2983          672 :   if (src->ts.type != BT_COMPLEX)
    2984              :     return NULL;
    2985              : 
    2986          668 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    2987              : 
    2988          668 :   mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
    2989              : 
    2990          668 :   rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
    2991              : 
    2992          668 :   if (rc == ARITH_UNDERFLOW)
    2993              :     {
    2994            0 :       if (warn_underflow)
    2995            0 :         gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
    2996            0 :       mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
    2997              :     }
    2998          668 :   else if (rc != ARITH_OK)
    2999              :     {
    3000            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    3001            0 :       gfc_free_expr (result);
    3002            0 :       return NULL;
    3003              :     }
    3004              : 
    3005          668 :   rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
    3006              : 
    3007          668 :   if (rc == ARITH_UNDERFLOW)
    3008              :     {
    3009            0 :       if (warn_underflow)
    3010            0 :         gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
    3011            0 :       mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
    3012              :     }
    3013          668 :   else if (rc != ARITH_OK)
    3014              :     {
    3015            0 :       arith_error (rc, &src->ts, &result->ts, &src->where);
    3016            0 :       gfc_free_expr (result);
    3017            0 :       return NULL;
    3018              :     }
    3019              : 
    3020          668 :   if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind
    3021          671 :       && (wprecision_real_real (mpc_realref (src->value.complex),
    3022              :                                 src->ts.kind, kind)
    3023            3 :           || wprecision_real_real (mpc_imagref (src->value.complex),
    3024              :                                    src->ts.kind, kind)))
    3025              :     {
    3026            3 :       int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
    3027              : 
    3028            3 :       gfc_warning_now (w, "Change of value in conversion from "
    3029              :                        "%qs to %qs at %L",
    3030              :                        gfc_typename (&src->ts), gfc_typename (&result->ts),
    3031              :                        &src->where);
    3032            3 :       did_warn = true;
    3033              :     }
    3034              : 
    3035          668 :   if (!did_warn && warn_conversion_extra && src->ts.kind != kind)
    3036            1 :     gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
    3037              :                      "at %L", gfc_typename(&src->ts),
    3038              :                      gfc_typename (&result->ts), &src->where);
    3039              : 
    3040              :   return result;
    3041              : }
    3042              : 
    3043              : 
    3044              : /* Logical kind conversion.  */
    3045              : 
    3046              : gfc_expr *
    3047          788 : gfc_log2log (gfc_expr *src, int kind)
    3048              : {
    3049          788 :   gfc_expr *result;
    3050              : 
    3051          788 :   if (src->ts.type != BT_LOGICAL)
    3052              :     return NULL;
    3053              : 
    3054          788 :   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
    3055          788 :   result->value.logical = src->value.logical;
    3056              : 
    3057          788 :   return result;
    3058              : }
    3059              : 
    3060              : 
    3061              : /* Convert logical to integer.  */
    3062              : 
    3063              : gfc_expr *
    3064           14 : gfc_log2int (gfc_expr *src, int kind)
    3065              : {
    3066           14 :   gfc_expr *result;
    3067              : 
    3068           14 :   if (src->ts.type != BT_LOGICAL)
    3069              :     return NULL;
    3070              : 
    3071           14 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    3072           14 :   mpz_set_si (result->value.integer, src->value.logical);
    3073              : 
    3074           14 :   return result;
    3075              : }
    3076              : 
    3077              : /* Convert logical to unsigned.  */
    3078              : 
    3079              : gfc_expr *
    3080            0 : gfc_log2uint (gfc_expr *src, int kind)
    3081              : {
    3082            0 :   gfc_expr *result;
    3083              : 
    3084            0 :   if (src->ts.type != BT_LOGICAL)
    3085              :     return NULL;
    3086              : 
    3087            0 :   result = gfc_get_constant_expr (BT_UNSIGNED, kind, &src->where);
    3088            0 :   mpz_set_si (result->value.integer, src->value.logical);
    3089              : 
    3090            0 :   return result;
    3091              : }
    3092              : 
    3093              : 
    3094              : /* Convert integer to logical.  */
    3095              : 
    3096              : gfc_expr *
    3097            0 : gfc_int2log (gfc_expr *src, int kind)
    3098              : {
    3099            0 :   gfc_expr *result;
    3100              : 
    3101            0 :   if (src->ts.type != BT_INTEGER)
    3102              :     return NULL;
    3103              : 
    3104            0 :   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
    3105            0 :   result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
    3106              : 
    3107            0 :   return result;
    3108              : }
    3109              : 
    3110              : /* Convert unsigned to logical.  */
    3111              : 
    3112              : gfc_expr *
    3113            0 : gfc_uint2log (gfc_expr *src, int kind)
    3114              : {
    3115            0 :   gfc_expr *result;
    3116              : 
    3117            0 :   if (src->ts.type != BT_UNSIGNED)
    3118              :     return NULL;
    3119              : 
    3120            0 :   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
    3121            0 :   result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
    3122              : 
    3123            0 :   return result;
    3124              : }
    3125              : 
    3126              : /* Convert character to character. We only use wide strings internally,
    3127              :    so we only set the kind.  */
    3128              : 
    3129              : gfc_expr *
    3130            0 : gfc_character2character (gfc_expr *src, int kind)
    3131              : {
    3132            0 :   gfc_expr *result;
    3133            0 :   result = gfc_copy_expr (src);
    3134            0 :   result->ts.kind = kind;
    3135              : 
    3136            0 :   return result;
    3137              : }
    3138              : 
    3139              : /* Helper function to set the representation in a Hollerith conversion.
    3140              :    This assumes that the ts.type and ts.kind of the result have already
    3141              :    been set.  */
    3142              : 
    3143              : static void
    3144         1187 : hollerith2representation (gfc_expr *result, gfc_expr *src)
    3145              : {
    3146         1187 :   size_t src_len, result_len;
    3147              : 
    3148         1187 :   src_len = src->representation.length - src->ts.u.pad;
    3149         1187 :   gfc_target_expr_size (result, &result_len);
    3150              : 
    3151         1187 :   if (src_len > result_len)
    3152              :     {
    3153          248 :       gfc_warning (OPT_Wcharacter_truncation, "The Hollerith constant at %L "
    3154              :                    "is truncated in conversion to %qs", &src->where,
    3155              :                    gfc_typename(&result->ts));
    3156              :     }
    3157              : 
    3158         1187 :   result->representation.string = XCNEWVEC (char, result_len + 1);
    3159         1187 :   memcpy (result->representation.string, src->representation.string,
    3160         1187 :           MIN (result_len, src_len));
    3161              : 
    3162         1187 :   if (src_len < result_len)
    3163          294 :     memset (&result->representation.string[src_len], ' ', result_len - src_len);
    3164              : 
    3165         1187 :   result->representation.string[result_len] = '\0'; /* For debugger  */
    3166         1187 :   result->representation.length = result_len;
    3167         1187 : }
    3168              : 
    3169              : 
    3170              : /* Helper function to set the representation in a character conversion.
    3171              :    This assumes that the ts.type and ts.kind of the result have already
    3172              :    been set.  */
    3173              : 
    3174              : static void
    3175          747 : character2representation (gfc_expr *result, gfc_expr *src)
    3176              : {
    3177          747 :   size_t src_len, result_len, i;
    3178          747 :   src_len = src->value.character.length;
    3179          747 :   gfc_target_expr_size (result, &result_len);
    3180              : 
    3181          747 :   if (src_len > result_len)
    3182          240 :     gfc_warning (OPT_Wcharacter_truncation, "The character constant at %L is "
    3183              :                  "truncated in conversion to %s", &src->where,
    3184              :                  gfc_typename(&result->ts));
    3185              : 
    3186          747 :   result->representation.string = XCNEWVEC (char, result_len + 1);
    3187              : 
    3188         3991 :   for (i = 0; i < MIN (result_len, src_len); i++)
    3189         3244 :     result->representation.string[i] = (char) src->value.character.string[i];
    3190              : 
    3191          747 :   if (src_len < result_len)
    3192          246 :     memset (&result->representation.string[src_len], ' ',
    3193              :             result_len - src_len);
    3194              : 
    3195          747 :   result->representation.string[result_len] = '\0'; /* For debugger.  */
    3196          747 :   result->representation.length = result_len;
    3197          747 : }
    3198              : 
    3199              : /* Convert Hollerith to integer. The constant will be padded or truncated.  */
    3200              : 
    3201              : gfc_expr *
    3202          377 : gfc_hollerith2int (gfc_expr *src, int kind)
    3203              : {
    3204          377 :   gfc_expr *result;
    3205          377 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    3206              : 
    3207          377 :   hollerith2representation (result, src);
    3208          377 :   gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
    3209          377 :                          result->representation.length, result->value.integer);
    3210              : 
    3211          377 :   return result;
    3212              : }
    3213              : 
    3214              : /* Convert character to integer.  The constant will be padded or truncated.  */
    3215              : 
    3216              : gfc_expr *
    3217          187 : gfc_character2int (gfc_expr *src, int kind)
    3218              : {
    3219          187 :   gfc_expr *result;
    3220          187 :   result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
    3221              : 
    3222          187 :   character2representation (result, src);
    3223          187 :   gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
    3224          187 :                          result->representation.length, result->value.integer);
    3225          187 :   return result;
    3226              : }
    3227              : 
    3228              : /* Convert Hollerith to real.  The constant will be padded or truncated.  */
    3229              : 
    3230              : gfc_expr *
    3231          327 : gfc_hollerith2real (gfc_expr *src, int kind)
    3232              : {
    3233          327 :   gfc_expr *result;
    3234          327 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    3235              : 
    3236          327 :   hollerith2representation (result, src);
    3237          327 :   if (gfc_interpret_float (kind,
    3238          327 :                            (unsigned char *) result->representation.string,
    3239          327 :                            result->representation.length, result->value.real))
    3240              :     return result;
    3241              :   else
    3242            0 :     return NULL;
    3243              : }
    3244              : 
    3245              : /* Convert character to real.  The constant will be padded or truncated.  */
    3246              : 
    3247              : gfc_expr *
    3248          187 : gfc_character2real (gfc_expr *src, int kind)
    3249              : {
    3250          187 :   gfc_expr *result;
    3251          187 :   result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
    3252              : 
    3253          187 :   character2representation (result, src);
    3254          187 :   gfc_interpret_float (kind, (unsigned char *) result->representation.string,
    3255          187 :                        result->representation.length, result->value.real);
    3256              : 
    3257          187 :   return result;
    3258              : }
    3259              : 
    3260              : 
    3261              : /* Convert Hollerith to complex. The constant will be padded or truncated.  */
    3262              : 
    3263              : gfc_expr *
    3264          288 : gfc_hollerith2complex (gfc_expr *src, int kind)
    3265              : {
    3266          288 :   gfc_expr *result;
    3267          288 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    3268              : 
    3269          288 :   hollerith2representation (result, src);
    3270          288 :   gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
    3271          288 :                          result->representation.length, result->value.complex);
    3272              : 
    3273          288 :   return result;
    3274              : }
    3275              : 
    3276              : /* Convert character to complex. The constant will be padded or truncated.  */
    3277              : 
    3278              : gfc_expr *
    3279          187 : gfc_character2complex (gfc_expr *src, int kind)
    3280              : {
    3281          187 :   gfc_expr *result;
    3282          187 :   result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
    3283              : 
    3284          187 :   character2representation (result, src);
    3285          187 :   gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
    3286          187 :                          result->representation.length, result->value.complex);
    3287              : 
    3288          187 :   return result;
    3289              : }
    3290              : 
    3291              : 
    3292              : /* Convert Hollerith to character.  */
    3293              : 
    3294              : gfc_expr *
    3295          164 : gfc_hollerith2character (gfc_expr *src, int kind)
    3296              : {
    3297          164 :   gfc_expr *result;
    3298              : 
    3299          164 :   result = gfc_copy_expr (src);
    3300          164 :   result->ts.type = BT_CHARACTER;
    3301          164 :   result->ts.kind = kind;
    3302          164 :   result->ts.u.pad = 0;
    3303              : 
    3304          164 :   result->value.character.length = result->representation.length;
    3305          164 :   result->value.character.string
    3306          164 :     = gfc_char_to_widechar (result->representation.string);
    3307              : 
    3308          164 :   return result;
    3309              : }
    3310              : 
    3311              : 
    3312              : /* Convert Hollerith to logical. The constant will be padded or truncated.  */
    3313              : 
    3314              : gfc_expr *
    3315          195 : gfc_hollerith2logical (gfc_expr *src, int kind)
    3316              : {
    3317          195 :   gfc_expr *result;
    3318          195 :   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
    3319              : 
    3320          195 :   hollerith2representation (result, src);
    3321          195 :   gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
    3322          195 :                          result->representation.length, &result->value.logical);
    3323              : 
    3324          195 :   return result;
    3325              : }
    3326              : 
    3327              : /* Convert character to logical. The constant will be padded or truncated.  */
    3328              : 
    3329              : gfc_expr *
    3330          186 : gfc_character2logical (gfc_expr *src, int kind)
    3331              : {
    3332          186 :   gfc_expr *result;
    3333          186 :   result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
    3334              : 
    3335          186 :   character2representation (result, src);
    3336          186 :   gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
    3337          186 :                          result->representation.length, &result->value.logical);
    3338              : 
    3339          186 :   return result;
    3340              : }
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.