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