* de.po: Update.
[official-gcc.git] / gcc / fortran / arith.c
blob8fa305c6aee2a915ed00cbb35ed17411abce1f04
1 /* Compiler arithmetic
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* Since target arithmetic must be done on the host, there has to
22 be some way of evaluating arithmetic expressions as the host
23 would evaluate them. We use the GNU MP library and the MPFR
24 library to do arithmetic, and this file provides the interface. */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "options.h"
30 #include "gfortran.h"
31 #include "arith.h"
32 #include "target-memory.h"
33 #include "constructor.h"
35 /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
36 It's easily implemented with a few calls though. */
38 void
39 gfc_mpfr_to_mpz (mpz_t z, mpfr_t x, locus *where)
41 mp_exp_t e;
43 if (mpfr_inf_p (x) || mpfr_nan_p (x))
45 gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
46 "to INTEGER", where);
47 mpz_set_ui (z, 0);
48 return;
51 e = mpfr_get_z_exp (z, x);
53 if (e > 0)
54 mpz_mul_2exp (z, z, e);
55 else
56 mpz_tdiv_q_2exp (z, z, -e);
60 /* Set the model number precision by the requested KIND. */
62 void
63 gfc_set_model_kind (int kind)
65 int index = gfc_validate_kind (BT_REAL, kind, false);
66 int base2prec;
68 base2prec = gfc_real_kinds[index].digits;
69 if (gfc_real_kinds[index].radix != 2)
70 base2prec *= gfc_real_kinds[index].radix / 2;
71 mpfr_set_default_prec (base2prec);
75 /* Set the model number precision from mpfr_t x. */
77 void
78 gfc_set_model (mpfr_t x)
80 mpfr_set_default_prec (mpfr_get_prec (x));
84 /* Given an arithmetic error code, return a pointer to a string that
85 explains the error. */
87 static const char *
88 gfc_arith_error (arith code)
90 const char *p;
92 switch (code)
94 case ARITH_OK:
95 p = _("Arithmetic OK at %L");
96 break;
97 case ARITH_OVERFLOW:
98 p = _("Arithmetic overflow at %L");
99 break;
100 case ARITH_UNDERFLOW:
101 p = _("Arithmetic underflow at %L");
102 break;
103 case ARITH_NAN:
104 p = _("Arithmetic NaN at %L");
105 break;
106 case ARITH_DIV0:
107 p = _("Division by zero at %L");
108 break;
109 case ARITH_INCOMMENSURATE:
110 p = _("Array operands are incommensurate at %L");
111 break;
112 case ARITH_ASYMMETRIC:
114 _("Integer outside symmetric range implied by Standard Fortran at %L");
115 break;
116 default:
117 gfc_internal_error ("gfc_arith_error(): Bad error code");
120 return p;
124 /* Get things ready to do math. */
126 void
127 gfc_arith_init_1 (void)
129 gfc_integer_info *int_info;
130 gfc_real_info *real_info;
131 mpfr_t a, b;
132 int i;
134 mpfr_set_default_prec (128);
135 mpfr_init (a);
137 /* Convert the minimum and maximum values for each kind into their
138 GNU MP representation. */
139 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
141 /* Huge */
142 mpz_init (int_info->huge);
143 mpz_set_ui (int_info->huge, int_info->radix);
144 mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
145 mpz_sub_ui (int_info->huge, int_info->huge, 1);
147 /* These are the numbers that are actually representable by the
148 target. For bases other than two, this needs to be changed. */
149 if (int_info->radix != 2)
150 gfc_internal_error ("Fix min_int calculation");
152 /* See PRs 13490 and 17912, related to integer ranges.
153 The pedantic_min_int exists for range checking when a program
154 is compiled with -pedantic, and reflects the belief that
155 Standard Fortran requires integers to be symmetrical, i.e.
156 every negative integer must have a representable positive
157 absolute value, and vice versa. */
159 mpz_init (int_info->pedantic_min_int);
160 mpz_neg (int_info->pedantic_min_int, int_info->huge);
162 mpz_init (int_info->min_int);
163 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
165 /* Range */
166 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
167 mpfr_log10 (a, a, GFC_RND_MODE);
168 mpfr_trunc (a, a);
169 int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
172 mpfr_clear (a);
174 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
176 gfc_set_model_kind (real_info->kind);
178 mpfr_init (a);
179 mpfr_init (b);
181 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
182 /* 1 - b**(-p) */
183 mpfr_init (real_info->huge);
184 mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
185 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
186 mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
187 mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
189 /* b**(emax-1) */
190 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
191 mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
193 /* (1 - b**(-p)) * b**(emax-1) */
194 mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
196 /* (1 - b**(-p)) * b**(emax-1) * b */
197 mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
198 GFC_RND_MODE);
200 /* tiny(x) = b**(emin-1) */
201 mpfr_init (real_info->tiny);
202 mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
203 mpfr_pow_si (real_info->tiny, real_info->tiny,
204 real_info->min_exponent - 1, GFC_RND_MODE);
206 /* subnormal (x) = b**(emin - digit) */
207 mpfr_init (real_info->subnormal);
208 mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
209 mpfr_pow_si (real_info->subnormal, real_info->subnormal,
210 real_info->min_exponent - real_info->digits, GFC_RND_MODE);
212 /* epsilon(x) = b**(1-p) */
213 mpfr_init (real_info->epsilon);
214 mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
215 mpfr_pow_si (real_info->epsilon, real_info->epsilon,
216 1 - real_info->digits, GFC_RND_MODE);
218 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
219 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
220 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
221 mpfr_neg (b, b, GFC_RND_MODE);
223 /* a = min(a, b) */
224 mpfr_min (a, a, b, GFC_RND_MODE);
225 mpfr_trunc (a, a);
226 real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
228 /* precision(x) = int((p - 1) * log10(b)) + k */
229 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
230 mpfr_log10 (a, a, GFC_RND_MODE);
231 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
232 mpfr_trunc (a, a);
233 real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
235 /* If the radix is an integral power of 10, add one to the precision. */
236 for (i = 10; i <= real_info->radix; i *= 10)
237 if (i == real_info->radix)
238 real_info->precision++;
240 mpfr_clears (a, b, NULL);
245 /* Clean up, get rid of numeric constants. */
247 void
248 gfc_arith_done_1 (void)
250 gfc_integer_info *ip;
251 gfc_real_info *rp;
253 for (ip = gfc_integer_kinds; ip->kind; ip++)
255 mpz_clear (ip->min_int);
256 mpz_clear (ip->pedantic_min_int);
257 mpz_clear (ip->huge);
260 for (rp = gfc_real_kinds; rp->kind; rp++)
261 mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
263 mpfr_free_cache ();
267 /* Given a wide character value and a character kind, determine whether
268 the character is representable for that kind. */
269 bool
270 gfc_check_character_range (gfc_char_t c, int kind)
272 /* As wide characters are stored as 32-bit values, they're all
273 representable in UCS=4. */
274 if (kind == 4)
275 return true;
277 if (kind == 1)
278 return c <= 255 ? true : false;
280 gcc_unreachable ();
284 /* Given an integer and a kind, make sure that the integer lies within
285 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
286 ARITH_OVERFLOW. */
288 arith
289 gfc_check_integer_range (mpz_t p, int kind)
291 arith result;
292 int i;
294 i = gfc_validate_kind (BT_INTEGER, kind, false);
295 result = ARITH_OK;
297 if (pedantic)
299 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
300 result = ARITH_ASYMMETRIC;
304 if (flag_range_check == 0)
305 return result;
307 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
308 || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
309 result = ARITH_OVERFLOW;
311 return result;
315 /* Given a real and a kind, make sure that the real lies within the
316 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
317 ARITH_UNDERFLOW. */
319 static arith
320 gfc_check_real_range (mpfr_t p, int kind)
322 arith retval;
323 mpfr_t q;
324 int i;
326 i = gfc_validate_kind (BT_REAL, kind, false);
328 gfc_set_model (p);
329 mpfr_init (q);
330 mpfr_abs (q, p, GFC_RND_MODE);
332 retval = ARITH_OK;
334 if (mpfr_inf_p (p))
336 if (flag_range_check != 0)
337 retval = ARITH_OVERFLOW;
339 else if (mpfr_nan_p (p))
341 if (flag_range_check != 0)
342 retval = ARITH_NAN;
344 else if (mpfr_sgn (q) == 0)
346 mpfr_clear (q);
347 return retval;
349 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
351 if (flag_range_check == 0)
352 mpfr_set_inf (p, mpfr_sgn (p));
353 else
354 retval = ARITH_OVERFLOW;
356 else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
358 if (flag_range_check == 0)
360 if (mpfr_sgn (p) < 0)
362 mpfr_set_ui (p, 0, GFC_RND_MODE);
363 mpfr_set_si (q, -1, GFC_RND_MODE);
364 mpfr_copysign (p, p, q, GFC_RND_MODE);
366 else
367 mpfr_set_ui (p, 0, GFC_RND_MODE);
369 else
370 retval = ARITH_UNDERFLOW;
372 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
374 mp_exp_t emin, emax;
375 int en;
377 /* Save current values of emin and emax. */
378 emin = mpfr_get_emin ();
379 emax = mpfr_get_emax ();
381 /* Set emin and emax for the current model number. */
382 en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
383 mpfr_set_emin ((mp_exp_t) en);
384 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[i].max_exponent);
385 mpfr_check_range (q, 0, GFC_RND_MODE);
386 mpfr_subnormalize (q, 0, GFC_RND_MODE);
388 /* Reset emin and emax. */
389 mpfr_set_emin (emin);
390 mpfr_set_emax (emax);
392 /* Copy sign if needed. */
393 if (mpfr_sgn (p) < 0)
394 mpfr_neg (p, q, GMP_RNDN);
395 else
396 mpfr_set (p, q, GMP_RNDN);
399 mpfr_clear (q);
401 return retval;
405 /* Low-level arithmetic functions. All of these subroutines assume
406 that all operands are of the same type and return an operand of the
407 same type. The other thing about these subroutines is that they
408 can fail in various ways -- overflow, underflow, division by zero,
409 zero raised to the zero, etc. */
411 static arith
412 gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
414 gfc_expr *result;
416 result = gfc_get_constant_expr (BT_LOGICAL, op1->ts.kind, &op1->where);
417 result->value.logical = !op1->value.logical;
418 *resultp = result;
420 return ARITH_OK;
424 static arith
425 gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
427 gfc_expr *result;
429 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
430 &op1->where);
431 result->value.logical = op1->value.logical && op2->value.logical;
432 *resultp = result;
434 return ARITH_OK;
438 static arith
439 gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
441 gfc_expr *result;
443 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
444 &op1->where);
445 result->value.logical = op1->value.logical || op2->value.logical;
446 *resultp = result;
448 return ARITH_OK;
452 static arith
453 gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
455 gfc_expr *result;
457 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
458 &op1->where);
459 result->value.logical = op1->value.logical == op2->value.logical;
460 *resultp = result;
462 return ARITH_OK;
466 static arith
467 gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
469 gfc_expr *result;
471 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
472 &op1->where);
473 result->value.logical = op1->value.logical != op2->value.logical;
474 *resultp = result;
476 return ARITH_OK;
480 /* Make sure a constant numeric expression is within the range for
481 its type and kind. Note that there's also a gfc_check_range(),
482 but that one deals with the intrinsic RANGE function. */
484 arith
485 gfc_range_check (gfc_expr *e)
487 arith rc;
488 arith rc2;
490 switch (e->ts.type)
492 case BT_INTEGER:
493 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
494 break;
496 case BT_REAL:
497 rc = gfc_check_real_range (e->value.real, e->ts.kind);
498 if (rc == ARITH_UNDERFLOW)
499 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
500 if (rc == ARITH_OVERFLOW)
501 mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
502 if (rc == ARITH_NAN)
503 mpfr_set_nan (e->value.real);
504 break;
506 case BT_COMPLEX:
507 rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
508 if (rc == ARITH_UNDERFLOW)
509 mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
510 if (rc == ARITH_OVERFLOW)
511 mpfr_set_inf (mpc_realref (e->value.complex),
512 mpfr_sgn (mpc_realref (e->value.complex)));
513 if (rc == ARITH_NAN)
514 mpfr_set_nan (mpc_realref (e->value.complex));
516 rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
517 if (rc == ARITH_UNDERFLOW)
518 mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
519 if (rc == ARITH_OVERFLOW)
520 mpfr_set_inf (mpc_imagref (e->value.complex),
521 mpfr_sgn (mpc_imagref (e->value.complex)));
522 if (rc == ARITH_NAN)
523 mpfr_set_nan (mpc_imagref (e->value.complex));
525 if (rc == ARITH_OK)
526 rc = rc2;
527 break;
529 default:
530 gfc_internal_error ("gfc_range_check(): Bad type");
533 return rc;
537 /* Several of the following routines use the same set of statements to
538 check the validity of the result. Encapsulate the checking here. */
540 static arith
541 check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
543 arith val = rc;
545 if (val == ARITH_UNDERFLOW)
547 if (warn_underflow)
548 gfc_warning (OPT_Wunderflow, gfc_arith_error (val), &x->where);
549 val = ARITH_OK;
552 if (val == ARITH_ASYMMETRIC)
554 gfc_warning (0, gfc_arith_error (val), &x->where);
555 val = ARITH_OK;
558 if (val != ARITH_OK)
559 gfc_free_expr (r);
560 else
561 *rp = r;
563 return val;
567 /* It may seem silly to have a subroutine that actually computes the
568 unary plus of a constant, but it prevents us from making exceptions
569 in the code elsewhere. Used for unary plus and parenthesized
570 expressions. */
572 static arith
573 gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
575 *resultp = gfc_copy_expr (op1);
576 return ARITH_OK;
580 static arith
581 gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
583 gfc_expr *result;
584 arith rc;
586 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
588 switch (op1->ts.type)
590 case BT_INTEGER:
591 mpz_neg (result->value.integer, op1->value.integer);
592 break;
594 case BT_REAL:
595 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
596 break;
598 case BT_COMPLEX:
599 mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
600 break;
602 default:
603 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
606 rc = gfc_range_check (result);
608 return check_result (rc, op1, result, resultp);
612 static arith
613 gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
615 gfc_expr *result;
616 arith rc;
618 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
620 switch (op1->ts.type)
622 case BT_INTEGER:
623 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
624 break;
626 case BT_REAL:
627 mpfr_add (result->value.real, op1->value.real, op2->value.real,
628 GFC_RND_MODE);
629 break;
631 case BT_COMPLEX:
632 mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
633 GFC_MPC_RND_MODE);
634 break;
636 default:
637 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
640 rc = gfc_range_check (result);
642 return check_result (rc, op1, result, resultp);
646 static arith
647 gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
649 gfc_expr *result;
650 arith rc;
652 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
654 switch (op1->ts.type)
656 case BT_INTEGER:
657 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
658 break;
660 case BT_REAL:
661 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
662 GFC_RND_MODE);
663 break;
665 case BT_COMPLEX:
666 mpc_sub (result->value.complex, op1->value.complex,
667 op2->value.complex, GFC_MPC_RND_MODE);
668 break;
670 default:
671 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
674 rc = gfc_range_check (result);
676 return check_result (rc, op1, result, resultp);
680 static arith
681 gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
683 gfc_expr *result;
684 arith rc;
686 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
688 switch (op1->ts.type)
690 case BT_INTEGER:
691 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
692 break;
694 case BT_REAL:
695 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
696 GFC_RND_MODE);
697 break;
699 case BT_COMPLEX:
700 gfc_set_model (mpc_realref (op1->value.complex));
701 mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
702 GFC_MPC_RND_MODE);
703 break;
705 default:
706 gfc_internal_error ("gfc_arith_times(): Bad basic type");
709 rc = gfc_range_check (result);
711 return check_result (rc, op1, result, resultp);
715 static arith
716 gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
718 gfc_expr *result;
719 arith rc;
721 rc = ARITH_OK;
723 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
725 switch (op1->ts.type)
727 case BT_INTEGER:
728 if (mpz_sgn (op2->value.integer) == 0)
730 rc = ARITH_DIV0;
731 break;
734 if (warn_integer_division)
736 mpz_t r;
737 mpz_init (r);
738 mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
739 op2->value.integer);
741 if (mpz_cmp_si (r, 0) != 0)
743 char *p;
744 p = mpz_get_str (NULL, 10, result->value.integer);
745 gfc_warning_now (OPT_Winteger_division, "Integer division "
746 "truncated to constant %qs at %L", p,
747 &op1->where);
748 free (p);
750 mpz_clear (r);
752 else
753 mpz_tdiv_q (result->value.integer, op1->value.integer,
754 op2->value.integer);
756 break;
758 case BT_REAL:
759 if (mpfr_sgn (op2->value.real) == 0 && flag_range_check == 1)
761 rc = ARITH_DIV0;
762 break;
765 mpfr_div (result->value.real, op1->value.real, op2->value.real,
766 GFC_RND_MODE);
767 break;
769 case BT_COMPLEX:
770 if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
771 && flag_range_check == 1)
773 rc = ARITH_DIV0;
774 break;
777 gfc_set_model (mpc_realref (op1->value.complex));
778 if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
780 /* In Fortran, return (NaN + NaN I) for any zero divisor. See
781 PR 40318. */
782 mpfr_set_nan (mpc_realref (result->value.complex));
783 mpfr_set_nan (mpc_imagref (result->value.complex));
785 else
786 mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
787 GFC_MPC_RND_MODE);
788 break;
790 default:
791 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
794 if (rc == ARITH_OK)
795 rc = gfc_range_check (result);
797 return check_result (rc, op1, result, resultp);
800 /* Raise a number to a power. */
802 static arith
803 arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
805 int power_sign;
806 gfc_expr *result;
807 arith rc;
809 rc = ARITH_OK;
810 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
812 switch (op2->ts.type)
814 case BT_INTEGER:
815 power_sign = mpz_sgn (op2->value.integer);
817 if (power_sign == 0)
819 /* Handle something to the zeroth power. Since we're dealing
820 with integral exponents, there is no ambiguity in the
821 limiting procedure used to determine the value of 0**0. */
822 switch (op1->ts.type)
824 case BT_INTEGER:
825 mpz_set_ui (result->value.integer, 1);
826 break;
828 case BT_REAL:
829 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
830 break;
832 case BT_COMPLEX:
833 mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
834 break;
836 default:
837 gfc_internal_error ("arith_power(): Bad base");
840 else
842 switch (op1->ts.type)
844 case BT_INTEGER:
846 int power;
848 /* First, we simplify the cases of op1 == 1, 0 or -1. */
849 if (mpz_cmp_si (op1->value.integer, 1) == 0)
851 /* 1**op2 == 1 */
852 mpz_set_si (result->value.integer, 1);
854 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
856 /* 0**op2 == 0, if op2 > 0
857 0**op2 overflow, if op2 < 0 ; in that case, we
858 set the result to 0 and return ARITH_DIV0. */
859 mpz_set_si (result->value.integer, 0);
860 if (mpz_cmp_si (op2->value.integer, 0) < 0)
861 rc = ARITH_DIV0;
863 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
865 /* (-1)**op2 == (-1)**(mod(op2,2)) */
866 unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
867 if (odd)
868 mpz_set_si (result->value.integer, -1);
869 else
870 mpz_set_si (result->value.integer, 1);
872 /* Then, we take care of op2 < 0. */
873 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
875 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
876 mpz_set_si (result->value.integer, 0);
877 if (warn_integer_division)
878 gfc_warning_now (OPT_Winteger_division, "Negative "
879 "exponent of integer has zero "
880 "result at %L", &result->where);
882 else if (gfc_extract_int (op2, &power))
884 /* If op2 doesn't fit in an int, the exponentiation will
885 overflow, because op2 > 0 and abs(op1) > 1. */
886 mpz_t max;
887 int i;
888 i = gfc_validate_kind (BT_INTEGER, result->ts.kind, false);
890 if (flag_range_check)
891 rc = ARITH_OVERFLOW;
893 /* Still, we want to give the same value as the
894 processor. */
895 mpz_init (max);
896 mpz_add_ui (max, gfc_integer_kinds[i].huge, 1);
897 mpz_mul_ui (max, max, 2);
898 mpz_powm (result->value.integer, op1->value.integer,
899 op2->value.integer, max);
900 mpz_clear (max);
902 else
903 mpz_pow_ui (result->value.integer, op1->value.integer,
904 power);
906 break;
908 case BT_REAL:
909 mpfr_pow_z (result->value.real, op1->value.real,
910 op2->value.integer, GFC_RND_MODE);
911 break;
913 case BT_COMPLEX:
914 mpc_pow_z (result->value.complex, op1->value.complex,
915 op2->value.integer, GFC_MPC_RND_MODE);
916 break;
918 default:
919 break;
922 break;
924 case BT_REAL:
926 if (gfc_init_expr_flag)
928 if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
929 "exponent in an initialization "
930 "expression at %L", &op2->where))
932 gfc_free_expr (result);
933 return ARITH_PROHIBIT;
937 if (mpfr_cmp_si (op1->value.real, 0) < 0)
939 gfc_error ("Raising a negative REAL at %L to "
940 "a REAL power is prohibited", &op1->where);
941 gfc_free_expr (result);
942 return ARITH_PROHIBIT;
945 mpfr_pow (result->value.real, op1->value.real, op2->value.real,
946 GFC_RND_MODE);
947 break;
949 case BT_COMPLEX:
951 if (gfc_init_expr_flag)
953 if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
954 "exponent in an initialization "
955 "expression at %L", &op2->where))
957 gfc_free_expr (result);
958 return ARITH_PROHIBIT;
962 mpc_pow (result->value.complex, op1->value.complex,
963 op2->value.complex, GFC_MPC_RND_MODE);
965 break;
966 default:
967 gfc_internal_error ("arith_power(): unknown type");
970 if (rc == ARITH_OK)
971 rc = gfc_range_check (result);
973 return check_result (rc, op1, result, resultp);
977 /* Concatenate two string constants. */
979 static arith
980 gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
982 gfc_expr *result;
983 int len;
985 gcc_assert (op1->ts.kind == op2->ts.kind);
986 result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
987 &op1->where);
989 len = op1->value.character.length + op2->value.character.length;
991 result->value.character.string = gfc_get_wide_string (len + 1);
992 result->value.character.length = len;
994 memcpy (result->value.character.string, op1->value.character.string,
995 op1->value.character.length * sizeof (gfc_char_t));
997 memcpy (&result->value.character.string[op1->value.character.length],
998 op2->value.character.string,
999 op2->value.character.length * sizeof (gfc_char_t));
1001 result->value.character.string[len] = '\0';
1003 *resultp = result;
1005 return ARITH_OK;
1008 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1009 This function mimics mpfr_cmp but takes NaN into account. */
1011 static int
1012 compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1014 int rc;
1015 switch (op)
1017 case INTRINSIC_EQ:
1018 rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1019 break;
1020 case INTRINSIC_GT:
1021 rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1022 break;
1023 case INTRINSIC_GE:
1024 rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1025 break;
1026 case INTRINSIC_LT:
1027 rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1028 break;
1029 case INTRINSIC_LE:
1030 rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1031 break;
1032 default:
1033 gfc_internal_error ("compare_real(): Bad operator");
1036 return rc;
1039 /* Comparison operators. Assumes that the two expression nodes
1040 contain two constants of the same type. The op argument is
1041 needed to handle NaN correctly. */
1044 gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1046 int rc;
1048 switch (op1->ts.type)
1050 case BT_INTEGER:
1051 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1052 break;
1054 case BT_REAL:
1055 rc = compare_real (op1, op2, op);
1056 break;
1058 case BT_CHARACTER:
1059 rc = gfc_compare_string (op1, op2);
1060 break;
1062 case BT_LOGICAL:
1063 rc = ((!op1->value.logical && op2->value.logical)
1064 || (op1->value.logical && !op2->value.logical));
1065 break;
1067 default:
1068 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1071 return rc;
1075 /* Compare a pair of complex numbers. Naturally, this is only for
1076 equality and inequality. */
1078 static int
1079 compare_complex (gfc_expr *op1, gfc_expr *op2)
1081 return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
1085 /* Given two constant strings and the inverse collating sequence, compare the
1086 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1087 We use the processor's default collating sequence. */
1090 gfc_compare_string (gfc_expr *a, gfc_expr *b)
1092 int len, alen, blen, i;
1093 gfc_char_t ac, bc;
1095 alen = a->value.character.length;
1096 blen = b->value.character.length;
1098 len = MAX(alen, blen);
1100 for (i = 0; i < len; i++)
1102 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1103 bc = ((i < blen) ? b->value.character.string[i] : ' ');
1105 if (ac < bc)
1106 return -1;
1107 if (ac > bc)
1108 return 1;
1111 /* Strings are equal */
1112 return 0;
1117 gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
1119 int len, alen, blen, i;
1120 gfc_char_t ac, bc;
1122 alen = a->value.character.length;
1123 blen = strlen (b);
1125 len = MAX(alen, blen);
1127 for (i = 0; i < len; i++)
1129 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1130 bc = ((i < blen) ? b[i] : ' ');
1132 if (!case_sensitive)
1134 ac = TOLOWER (ac);
1135 bc = TOLOWER (bc);
1138 if (ac < bc)
1139 return -1;
1140 if (ac > bc)
1141 return 1;
1144 /* Strings are equal */
1145 return 0;
1149 /* Specific comparison subroutines. */
1151 static arith
1152 gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1154 gfc_expr *result;
1156 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1157 &op1->where);
1158 result->value.logical = (op1->ts.type == BT_COMPLEX)
1159 ? compare_complex (op1, op2)
1160 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1162 *resultp = result;
1163 return ARITH_OK;
1167 static arith
1168 gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1170 gfc_expr *result;
1172 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1173 &op1->where);
1174 result->value.logical = (op1->ts.type == BT_COMPLEX)
1175 ? !compare_complex (op1, op2)
1176 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1178 *resultp = result;
1179 return ARITH_OK;
1183 static arith
1184 gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1186 gfc_expr *result;
1188 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1189 &op1->where);
1190 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1191 *resultp = result;
1193 return ARITH_OK;
1197 static arith
1198 gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1200 gfc_expr *result;
1202 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1203 &op1->where);
1204 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1205 *resultp = result;
1207 return ARITH_OK;
1211 static arith
1212 gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1214 gfc_expr *result;
1216 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1217 &op1->where);
1218 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1219 *resultp = result;
1221 return ARITH_OK;
1225 static arith
1226 gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1228 gfc_expr *result;
1230 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1231 &op1->where);
1232 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1233 *resultp = result;
1235 return ARITH_OK;
1239 static arith
1240 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1241 gfc_expr **result)
1243 gfc_constructor_base head;
1244 gfc_constructor *c;
1245 gfc_expr *r;
1246 arith rc;
1248 if (op->expr_type == EXPR_CONSTANT)
1249 return eval (op, result);
1251 rc = ARITH_OK;
1252 head = gfc_constructor_copy (op->value.constructor);
1253 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1255 rc = reduce_unary (eval, c->expr, &r);
1257 if (rc != ARITH_OK)
1258 break;
1260 gfc_replace_expr (c->expr, r);
1263 if (rc != ARITH_OK)
1264 gfc_constructor_free (head);
1265 else
1267 gfc_constructor *c = gfc_constructor_first (head);
1268 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1269 &op->where);
1270 r->shape = gfc_copy_shape (op->shape, op->rank);
1271 r->rank = op->rank;
1272 r->value.constructor = head;
1273 *result = r;
1276 return rc;
1280 static arith
1281 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1282 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1284 gfc_constructor_base head;
1285 gfc_constructor *c;
1286 gfc_expr *r;
1287 arith rc = ARITH_OK;
1289 head = gfc_constructor_copy (op1->value.constructor);
1290 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1292 if (c->expr->expr_type == EXPR_CONSTANT)
1293 rc = eval (c->expr, op2, &r);
1294 else
1295 rc = reduce_binary_ac (eval, c->expr, op2, &r);
1297 if (rc != ARITH_OK)
1298 break;
1300 gfc_replace_expr (c->expr, r);
1303 if (rc != ARITH_OK)
1304 gfc_constructor_free (head);
1305 else
1307 gfc_constructor *c = gfc_constructor_first (head);
1308 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1309 &op1->where);
1310 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1311 r->rank = op1->rank;
1312 r->value.constructor = head;
1313 *result = r;
1316 return rc;
1320 static arith
1321 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1322 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1324 gfc_constructor_base head;
1325 gfc_constructor *c;
1326 gfc_expr *r;
1327 arith rc = ARITH_OK;
1329 head = gfc_constructor_copy (op2->value.constructor);
1330 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1332 if (c->expr->expr_type == EXPR_CONSTANT)
1333 rc = eval (op1, c->expr, &r);
1334 else
1335 rc = reduce_binary_ca (eval, op1, c->expr, &r);
1337 if (rc != ARITH_OK)
1338 break;
1340 gfc_replace_expr (c->expr, r);
1343 if (rc != ARITH_OK)
1344 gfc_constructor_free (head);
1345 else
1347 gfc_constructor *c = gfc_constructor_first (head);
1348 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1349 &op2->where);
1350 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1351 r->rank = op2->rank;
1352 r->value.constructor = head;
1353 *result = r;
1356 return rc;
1360 /* We need a forward declaration of reduce_binary. */
1361 static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1362 gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1365 static arith
1366 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1367 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1369 gfc_constructor_base head;
1370 gfc_constructor *c, *d;
1371 gfc_expr *r;
1372 arith rc = ARITH_OK;
1374 if (!gfc_check_conformance (op1, op2, "elemental binary operation"))
1375 return ARITH_INCOMMENSURATE;
1377 head = gfc_constructor_copy (op1->value.constructor);
1378 for (c = gfc_constructor_first (head),
1379 d = gfc_constructor_first (op2->value.constructor);
1380 c && d;
1381 c = gfc_constructor_next (c), d = gfc_constructor_next (d))
1383 rc = reduce_binary (eval, c->expr, d->expr, &r);
1384 if (rc != ARITH_OK)
1385 break;
1387 gfc_replace_expr (c->expr, r);
1390 if (c || d)
1391 rc = ARITH_INCOMMENSURATE;
1393 if (rc != ARITH_OK)
1394 gfc_constructor_free (head);
1395 else
1397 gfc_constructor *c = gfc_constructor_first (head);
1398 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1399 &op1->where);
1400 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1401 r->rank = op1->rank;
1402 r->value.constructor = head;
1403 *result = r;
1406 return rc;
1410 static arith
1411 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1412 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1414 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1415 return eval (op1, op2, result);
1417 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1418 return reduce_binary_ca (eval, op1, op2, result);
1420 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1421 return reduce_binary_ac (eval, op1, op2, result);
1423 return reduce_binary_aa (eval, op1, op2, result);
1427 typedef union
1429 arith (*f2)(gfc_expr *, gfc_expr **);
1430 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1432 eval_f;
1434 /* High level arithmetic subroutines. These subroutines go into
1435 eval_intrinsic(), which can do one of several things to its
1436 operands. If the operands are incompatible with the intrinsic
1437 operation, we return a node pointing to the operands and hope that
1438 an operator interface is found during resolution.
1440 If the operands are compatible and are constants, then we try doing
1441 the arithmetic. We also handle the cases where either or both
1442 operands are array constructors. */
1444 static gfc_expr *
1445 eval_intrinsic (gfc_intrinsic_op op,
1446 eval_f eval, gfc_expr *op1, gfc_expr *op2)
1448 gfc_expr temp, *result;
1449 int unary;
1450 arith rc;
1452 gfc_clear_ts (&temp.ts);
1454 switch (op)
1456 /* Logical unary */
1457 case INTRINSIC_NOT:
1458 if (op1->ts.type != BT_LOGICAL)
1459 goto runtime;
1461 temp.ts.type = BT_LOGICAL;
1462 temp.ts.kind = gfc_default_logical_kind;
1463 unary = 1;
1464 break;
1466 /* Logical binary operators */
1467 case INTRINSIC_OR:
1468 case INTRINSIC_AND:
1469 case INTRINSIC_NEQV:
1470 case INTRINSIC_EQV:
1471 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1472 goto runtime;
1474 temp.ts.type = BT_LOGICAL;
1475 temp.ts.kind = gfc_default_logical_kind;
1476 unary = 0;
1477 break;
1479 /* Numeric unary */
1480 case INTRINSIC_UPLUS:
1481 case INTRINSIC_UMINUS:
1482 if (!gfc_numeric_ts (&op1->ts))
1483 goto runtime;
1485 temp.ts = op1->ts;
1486 unary = 1;
1487 break;
1489 case INTRINSIC_PARENTHESES:
1490 temp.ts = op1->ts;
1491 unary = 1;
1492 break;
1494 /* Additional restrictions for ordering relations. */
1495 case INTRINSIC_GE:
1496 case INTRINSIC_GE_OS:
1497 case INTRINSIC_LT:
1498 case INTRINSIC_LT_OS:
1499 case INTRINSIC_LE:
1500 case INTRINSIC_LE_OS:
1501 case INTRINSIC_GT:
1502 case INTRINSIC_GT_OS:
1503 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1505 temp.ts.type = BT_LOGICAL;
1506 temp.ts.kind = gfc_default_logical_kind;
1507 goto runtime;
1510 /* Fall through */
1511 case INTRINSIC_EQ:
1512 case INTRINSIC_EQ_OS:
1513 case INTRINSIC_NE:
1514 case INTRINSIC_NE_OS:
1515 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1517 unary = 0;
1518 temp.ts.type = BT_LOGICAL;
1519 temp.ts.kind = gfc_default_logical_kind;
1521 /* If kind mismatch, exit and we'll error out later. */
1522 if (op1->ts.kind != op2->ts.kind)
1523 goto runtime;
1525 break;
1528 gcc_fallthrough ();
1529 /* Numeric binary */
1530 case INTRINSIC_PLUS:
1531 case INTRINSIC_MINUS:
1532 case INTRINSIC_TIMES:
1533 case INTRINSIC_DIVIDE:
1534 case INTRINSIC_POWER:
1535 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1536 goto runtime;
1538 /* Insert any necessary type conversions to make the operands
1539 compatible. */
1541 temp.expr_type = EXPR_OP;
1542 gfc_clear_ts (&temp.ts);
1543 temp.value.op.op = op;
1545 temp.value.op.op1 = op1;
1546 temp.value.op.op2 = op2;
1548 gfc_type_convert_binary (&temp, warn_conversion || warn_conversion_extra);
1550 if (op == INTRINSIC_EQ || op == INTRINSIC_NE
1551 || op == INTRINSIC_GE || op == INTRINSIC_GT
1552 || op == INTRINSIC_LE || op == INTRINSIC_LT
1553 || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
1554 || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
1555 || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
1557 temp.ts.type = BT_LOGICAL;
1558 temp.ts.kind = gfc_default_logical_kind;
1561 unary = 0;
1562 break;
1564 /* Character binary */
1565 case INTRINSIC_CONCAT:
1566 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
1567 || op1->ts.kind != op2->ts.kind)
1568 goto runtime;
1570 temp.ts.type = BT_CHARACTER;
1571 temp.ts.kind = op1->ts.kind;
1572 unary = 0;
1573 break;
1575 case INTRINSIC_USER:
1576 goto runtime;
1578 default:
1579 gfc_internal_error ("eval_intrinsic(): Bad operator");
1582 if (op1->expr_type != EXPR_CONSTANT
1583 && (op1->expr_type != EXPR_ARRAY
1584 || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1585 goto runtime;
1587 if (op2 != NULL
1588 && op2->expr_type != EXPR_CONSTANT
1589 && (op2->expr_type != EXPR_ARRAY
1590 || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1591 goto runtime;
1593 if (unary)
1594 rc = reduce_unary (eval.f2, op1, &result);
1595 else
1596 rc = reduce_binary (eval.f3, op1, op2, &result);
1599 /* Something went wrong. */
1600 if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
1601 return NULL;
1603 if (rc != ARITH_OK)
1605 gfc_error (gfc_arith_error (rc), &op1->where);
1606 return NULL;
1609 gfc_free_expr (op1);
1610 gfc_free_expr (op2);
1611 return result;
1613 runtime:
1614 /* Create a run-time expression. */
1615 result = gfc_get_operator_expr (&op1->where, op, op1, op2);
1616 result->ts = temp.ts;
1618 return result;
1622 /* Modify type of expression for zero size array. */
1624 static gfc_expr *
1625 eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
1627 if (op == NULL)
1628 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1630 switch (iop)
1632 case INTRINSIC_GE:
1633 case INTRINSIC_GE_OS:
1634 case INTRINSIC_LT:
1635 case INTRINSIC_LT_OS:
1636 case INTRINSIC_LE:
1637 case INTRINSIC_LE_OS:
1638 case INTRINSIC_GT:
1639 case INTRINSIC_GT_OS:
1640 case INTRINSIC_EQ:
1641 case INTRINSIC_EQ_OS:
1642 case INTRINSIC_NE:
1643 case INTRINSIC_NE_OS:
1644 op->ts.type = BT_LOGICAL;
1645 op->ts.kind = gfc_default_logical_kind;
1646 break;
1648 default:
1649 break;
1652 return op;
1656 /* Return nonzero if the expression is a zero size array. */
1658 static int
1659 gfc_zero_size_array (gfc_expr *e)
1661 if (e->expr_type != EXPR_ARRAY)
1662 return 0;
1664 return e->value.constructor == NULL;
1668 /* Reduce a binary expression where at least one of the operands
1669 involves a zero-length array. Returns NULL if neither of the
1670 operands is a zero-length array. */
1672 static gfc_expr *
1673 reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1675 if (gfc_zero_size_array (op1))
1677 gfc_free_expr (op2);
1678 return op1;
1681 if (gfc_zero_size_array (op2))
1683 gfc_free_expr (op1);
1684 return op2;
1687 return NULL;
1691 static gfc_expr *
1692 eval_intrinsic_f2 (gfc_intrinsic_op op,
1693 arith (*eval) (gfc_expr *, gfc_expr **),
1694 gfc_expr *op1, gfc_expr *op2)
1696 gfc_expr *result;
1697 eval_f f;
1699 if (op2 == NULL)
1701 if (gfc_zero_size_array (op1))
1702 return eval_type_intrinsic0 (op, op1);
1704 else
1706 result = reduce_binary0 (op1, op2);
1707 if (result != NULL)
1708 return eval_type_intrinsic0 (op, result);
1711 f.f2 = eval;
1712 return eval_intrinsic (op, f, op1, op2);
1716 static gfc_expr *
1717 eval_intrinsic_f3 (gfc_intrinsic_op op,
1718 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1719 gfc_expr *op1, gfc_expr *op2)
1721 gfc_expr *result;
1722 eval_f f;
1724 result = reduce_binary0 (op1, op2);
1725 if (result != NULL)
1726 return eval_type_intrinsic0(op, result);
1728 f.f3 = eval;
1729 return eval_intrinsic (op, f, op1, op2);
1733 gfc_expr *
1734 gfc_parentheses (gfc_expr *op)
1736 if (gfc_is_constant_expr (op))
1737 return op;
1739 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
1740 op, NULL);
1743 gfc_expr *
1744 gfc_uplus (gfc_expr *op)
1746 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
1750 gfc_expr *
1751 gfc_uminus (gfc_expr *op)
1753 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1757 gfc_expr *
1758 gfc_add (gfc_expr *op1, gfc_expr *op2)
1760 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1764 gfc_expr *
1765 gfc_subtract (gfc_expr *op1, gfc_expr *op2)
1767 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1771 gfc_expr *
1772 gfc_multiply (gfc_expr *op1, gfc_expr *op2)
1774 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1778 gfc_expr *
1779 gfc_divide (gfc_expr *op1, gfc_expr *op2)
1781 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1785 gfc_expr *
1786 gfc_power (gfc_expr *op1, gfc_expr *op2)
1788 return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
1792 gfc_expr *
1793 gfc_concat (gfc_expr *op1, gfc_expr *op2)
1795 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1799 gfc_expr *
1800 gfc_and (gfc_expr *op1, gfc_expr *op2)
1802 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1806 gfc_expr *
1807 gfc_or (gfc_expr *op1, gfc_expr *op2)
1809 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1813 gfc_expr *
1814 gfc_not (gfc_expr *op1)
1816 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1820 gfc_expr *
1821 gfc_eqv (gfc_expr *op1, gfc_expr *op2)
1823 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1827 gfc_expr *
1828 gfc_neqv (gfc_expr *op1, gfc_expr *op2)
1830 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1834 gfc_expr *
1835 gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1837 return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
1841 gfc_expr *
1842 gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1844 return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
1848 gfc_expr *
1849 gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1851 return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
1855 gfc_expr *
1856 gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1858 return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
1862 gfc_expr *
1863 gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1865 return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
1869 gfc_expr *
1870 gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1872 return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
1876 /* Convert an integer string to an expression node. */
1878 gfc_expr *
1879 gfc_convert_integer (const char *buffer, int kind, int radix, locus *where)
1881 gfc_expr *e;
1882 const char *t;
1884 e = gfc_get_constant_expr (BT_INTEGER, kind, where);
1885 /* A leading plus is allowed, but not by mpz_set_str. */
1886 if (buffer[0] == '+')
1887 t = buffer + 1;
1888 else
1889 t = buffer;
1890 mpz_set_str (e->value.integer, t, radix);
1892 return e;
1896 /* Convert a real string to an expression node. */
1898 gfc_expr *
1899 gfc_convert_real (const char *buffer, int kind, locus *where)
1901 gfc_expr *e;
1903 e = gfc_get_constant_expr (BT_REAL, kind, where);
1904 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
1906 return e;
1910 /* Convert a pair of real, constant expression nodes to a single
1911 complex expression node. */
1913 gfc_expr *
1914 gfc_convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
1916 gfc_expr *e;
1918 e = gfc_get_constant_expr (BT_COMPLEX, kind, &real->where);
1919 mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
1920 GFC_MPC_RND_MODE);
1922 return e;
1926 /******* Simplification of intrinsic functions with constant arguments *****/
1929 /* Deal with an arithmetic error. */
1931 static void
1932 arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
1934 switch (rc)
1936 case ARITH_OK:
1937 gfc_error ("Arithmetic OK converting %s to %s at %L",
1938 gfc_typename (from), gfc_typename (to), where);
1939 break;
1940 case ARITH_OVERFLOW:
1941 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
1942 "can be disabled with the option %<-fno-range-check%>",
1943 gfc_typename (from), gfc_typename (to), where);
1944 break;
1945 case ARITH_UNDERFLOW:
1946 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
1947 "can be disabled with the option %<-fno-range-check%>",
1948 gfc_typename (from), gfc_typename (to), where);
1949 break;
1950 case ARITH_NAN:
1951 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
1952 "can be disabled with the option %<-fno-range-check%>",
1953 gfc_typename (from), gfc_typename (to), where);
1954 break;
1955 case ARITH_DIV0:
1956 gfc_error ("Division by zero converting %s to %s at %L",
1957 gfc_typename (from), gfc_typename (to), where);
1958 break;
1959 case ARITH_INCOMMENSURATE:
1960 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
1961 gfc_typename (from), gfc_typename (to), where);
1962 break;
1963 case ARITH_ASYMMETRIC:
1964 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
1965 " converting %s to %s at %L",
1966 gfc_typename (from), gfc_typename (to), where);
1967 break;
1968 default:
1969 gfc_internal_error ("gfc_arith_error(): Bad error code");
1972 /* TODO: Do something about the error, i.e., throw exception, return
1973 NaN, etc. */
1976 /* Returns true if significant bits were lost when converting real
1977 constant r from from_kind to to_kind. */
1979 static bool
1980 wprecision_real_real (mpfr_t r, int from_kind, int to_kind)
1982 mpfr_t rv, diff;
1983 bool ret;
1985 gfc_set_model_kind (to_kind);
1986 mpfr_init (rv);
1987 gfc_set_model_kind (from_kind);
1988 mpfr_init (diff);
1990 mpfr_set (rv, r, GFC_RND_MODE);
1991 mpfr_sub (diff, rv, r, GFC_RND_MODE);
1993 ret = ! mpfr_zero_p (diff);
1994 mpfr_clear (rv);
1995 mpfr_clear (diff);
1996 return ret;
1999 /* Return true if conversion from an integer to a real loses precision. */
2001 static bool
2002 wprecision_int_real (mpz_t n, mpfr_t r)
2004 mpz_t i;
2005 mpz_init (i);
2006 mpfr_get_z (i, r, GFC_RND_MODE);
2007 mpz_sub (i, i, n);
2008 return mpz_cmp_si (i, 0) != 0;
2009 mpz_clear (i);
2013 /* Convert integers to integers. */
2015 gfc_expr *
2016 gfc_int2int (gfc_expr *src, int kind)
2018 gfc_expr *result;
2019 arith rc;
2021 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2023 mpz_set (result->value.integer, src->value.integer);
2025 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2027 if (rc == ARITH_ASYMMETRIC)
2029 gfc_warning (0, gfc_arith_error (rc), &src->where);
2031 else
2033 arith_error (rc, &src->ts, &result->ts, &src->where);
2034 gfc_free_expr (result);
2035 return NULL;
2039 /* If we do not trap numeric overflow, we need to convert the number to
2040 signed, throwing away high-order bits if necessary. */
2041 if (flag_range_check == 0)
2043 int k;
2045 k = gfc_validate_kind (BT_INTEGER, kind, false);
2046 gfc_convert_mpz_to_signed (result->value.integer,
2047 gfc_integer_kinds[k].bit_size);
2049 if (warn_conversion && kind < src->ts.kind)
2050 gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2051 gfc_typename (&src->ts), gfc_typename (&result->ts),
2052 &src->where);
2054 return result;
2058 /* Convert integers to reals. */
2060 gfc_expr *
2061 gfc_int2real (gfc_expr *src, int kind)
2063 gfc_expr *result;
2064 arith rc;
2066 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2068 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2070 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2072 arith_error (rc, &src->ts, &result->ts, &src->where);
2073 gfc_free_expr (result);
2074 return NULL;
2077 if (warn_conversion
2078 && wprecision_int_real (src->value.integer, result->value.real))
2079 gfc_warning (OPT_Wconversion, "Change of value in conversion "
2080 "from %qs to %qs at %L",
2081 gfc_typename (&src->ts),
2082 gfc_typename (&result->ts),
2083 &src->where);
2085 return result;
2089 /* Convert default integer to default complex. */
2091 gfc_expr *
2092 gfc_int2complex (gfc_expr *src, int kind)
2094 gfc_expr *result;
2095 arith rc;
2097 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2099 mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
2101 if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
2102 != ARITH_OK)
2104 arith_error (rc, &src->ts, &result->ts, &src->where);
2105 gfc_free_expr (result);
2106 return NULL;
2109 if (warn_conversion
2110 && wprecision_int_real (src->value.integer,
2111 mpc_realref (result->value.complex)))
2112 gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2113 "from %qs to %qs at %L",
2114 gfc_typename (&src->ts),
2115 gfc_typename (&result->ts),
2116 &src->where);
2118 return result;
2122 /* Convert default real to default integer. */
2124 gfc_expr *
2125 gfc_real2int (gfc_expr *src, int kind)
2127 gfc_expr *result;
2128 arith rc;
2129 bool did_warn = false;
2131 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2133 gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
2135 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2137 arith_error (rc, &src->ts, &result->ts, &src->where);
2138 gfc_free_expr (result);
2139 return NULL;
2142 /* If there was a fractional part, warn about this. */
2144 if (warn_conversion)
2146 mpfr_t f;
2147 mpfr_init (f);
2148 mpfr_frac (f, src->value.real, GFC_RND_MODE);
2149 if (mpfr_cmp_si (f, 0) != 0)
2151 gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2152 "from %qs to %qs at %L", gfc_typename (&src->ts),
2153 gfc_typename (&result->ts), &src->where);
2154 did_warn = true;
2157 if (!did_warn && warn_conversion_extra)
2159 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2160 "at %L", gfc_typename (&src->ts),
2161 gfc_typename (&result->ts), &src->where);
2164 return result;
2168 /* Convert real to real. */
2170 gfc_expr *
2171 gfc_real2real (gfc_expr *src, int kind)
2173 gfc_expr *result;
2174 arith rc;
2175 bool did_warn = false;
2177 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2179 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2181 rc = gfc_check_real_range (result->value.real, kind);
2183 if (rc == ARITH_UNDERFLOW)
2185 if (warn_underflow)
2186 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2187 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2189 else if (rc != ARITH_OK)
2191 arith_error (rc, &src->ts, &result->ts, &src->where);
2192 gfc_free_expr (result);
2193 return NULL;
2196 /* As a special bonus, don't warn about REAL values which are not changed by
2197 the conversion if -Wconversion is specified and -Wconversion-extra is
2198 not. */
2200 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2202 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2204 /* Calculate the difference between the constant and the rounded
2205 value and check it against zero. */
2207 if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2209 gfc_warning_now (w, "Change of value in conversion from "
2210 "%qs to %qs at %L",
2211 gfc_typename (&src->ts), gfc_typename (&result->ts),
2212 &src->where);
2213 /* Make sure the conversion warning is not emitted again. */
2214 did_warn = true;
2218 if (!did_warn && warn_conversion_extra)
2219 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2220 "at %L", gfc_typename(&src->ts),
2221 gfc_typename(&result->ts), &src->where);
2223 return result;
2227 /* Convert real to complex. */
2229 gfc_expr *
2230 gfc_real2complex (gfc_expr *src, int kind)
2232 gfc_expr *result;
2233 arith rc;
2234 bool did_warn = false;
2236 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2238 mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
2240 rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2242 if (rc == ARITH_UNDERFLOW)
2244 if (warn_underflow)
2245 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2246 mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2248 else if (rc != ARITH_OK)
2250 arith_error (rc, &src->ts, &result->ts, &src->where);
2251 gfc_free_expr (result);
2252 return NULL;
2255 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2257 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2259 if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2261 gfc_warning_now (w, "Change of value in conversion from "
2262 "%qs to %qs at %L",
2263 gfc_typename (&src->ts), gfc_typename (&result->ts),
2264 &src->where);
2265 /* Make sure the conversion warning is not emitted again. */
2266 did_warn = true;
2270 if (!did_warn && warn_conversion_extra)
2271 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2272 "at %L", gfc_typename(&src->ts),
2273 gfc_typename(&result->ts), &src->where);
2275 return result;
2279 /* Convert complex to integer. */
2281 gfc_expr *
2282 gfc_complex2int (gfc_expr *src, int kind)
2284 gfc_expr *result;
2285 arith rc;
2286 bool did_warn = false;
2288 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2290 gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
2291 &src->where);
2293 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2295 arith_error (rc, &src->ts, &result->ts, &src->where);
2296 gfc_free_expr (result);
2297 return NULL;
2300 if (warn_conversion || warn_conversion_extra)
2302 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2304 /* See if we discarded an imaginary part. */
2305 if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2307 gfc_warning_now (w, "Non-zero imaginary part discarded "
2308 "in conversion from %qs to %qs at %L",
2309 gfc_typename(&src->ts), gfc_typename (&result->ts),
2310 &src->where);
2311 did_warn = true;
2314 else {
2315 mpfr_t f;
2317 mpfr_init (f);
2318 mpfr_frac (f, src->value.real, GFC_RND_MODE);
2319 if (mpfr_cmp_si (f, 0) != 0)
2321 gfc_warning_now (w, "Change of value in conversion from "
2322 "%qs to %qs at %L", gfc_typename (&src->ts),
2323 gfc_typename (&result->ts), &src->where);
2324 did_warn = true;
2326 mpfr_clear (f);
2329 if (!did_warn && warn_conversion_extra)
2331 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2332 "at %L", gfc_typename (&src->ts),
2333 gfc_typename (&result->ts), &src->where);
2337 return result;
2341 /* Convert complex to real. */
2343 gfc_expr *
2344 gfc_complex2real (gfc_expr *src, int kind)
2346 gfc_expr *result;
2347 arith rc;
2348 bool did_warn = false;
2350 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2352 mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
2354 rc = gfc_check_real_range (result->value.real, kind);
2356 if (rc == ARITH_UNDERFLOW)
2358 if (warn_underflow)
2359 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2360 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2362 if (rc != ARITH_OK)
2364 arith_error (rc, &src->ts, &result->ts, &src->where);
2365 gfc_free_expr (result);
2366 return NULL;
2369 if (warn_conversion || warn_conversion_extra)
2371 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2373 /* See if we discarded an imaginary part. */
2374 if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2376 gfc_warning (w, "Non-zero imaginary part discarded "
2377 "in conversion from %qs to %qs at %L",
2378 gfc_typename(&src->ts), gfc_typename (&result->ts),
2379 &src->where);
2380 did_warn = true;
2383 /* Calculate the difference between the real constant and the rounded
2384 value and check it against zero. */
2386 if (kind > src->ts.kind
2387 && wprecision_real_real (mpc_realref (src->value.complex),
2388 src->ts.kind, kind))
2390 gfc_warning_now (w, "Change of value in conversion from "
2391 "%qs to %qs at %L",
2392 gfc_typename (&src->ts), gfc_typename (&result->ts),
2393 &src->where);
2394 /* Make sure the conversion warning is not emitted again. */
2395 did_warn = true;
2399 if (!did_warn && warn_conversion_extra)
2400 gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2401 gfc_typename(&src->ts), gfc_typename (&result->ts),
2402 &src->where);
2404 return result;
2408 /* Convert complex to complex. */
2410 gfc_expr *
2411 gfc_complex2complex (gfc_expr *src, int kind)
2413 gfc_expr *result;
2414 arith rc;
2415 bool did_warn = false;
2417 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2419 mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
2421 rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2423 if (rc == ARITH_UNDERFLOW)
2425 if (warn_underflow)
2426 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2427 mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2429 else if (rc != ARITH_OK)
2431 arith_error (rc, &src->ts, &result->ts, &src->where);
2432 gfc_free_expr (result);
2433 return NULL;
2436 rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
2438 if (rc == ARITH_UNDERFLOW)
2440 if (warn_underflow)
2441 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2442 mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
2444 else if (rc != ARITH_OK)
2446 arith_error (rc, &src->ts, &result->ts, &src->where);
2447 gfc_free_expr (result);
2448 return NULL;
2451 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind
2452 && (wprecision_real_real (mpc_realref (src->value.complex),
2453 src->ts.kind, kind)
2454 || wprecision_real_real (mpc_imagref (src->value.complex),
2455 src->ts.kind, kind)))
2457 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2459 gfc_warning_now (w, "Change of value in conversion from "
2460 " %qs to %qs at %L",
2461 gfc_typename (&src->ts), gfc_typename (&result->ts),
2462 &src->where);
2463 did_warn = true;
2466 if (!did_warn && warn_conversion_extra && src->ts.kind != kind)
2467 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2468 "at %L", gfc_typename(&src->ts),
2469 gfc_typename (&result->ts), &src->where);
2471 return result;
2475 /* Logical kind conversion. */
2477 gfc_expr *
2478 gfc_log2log (gfc_expr *src, int kind)
2480 gfc_expr *result;
2482 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2483 result->value.logical = src->value.logical;
2485 return result;
2489 /* Convert logical to integer. */
2491 gfc_expr *
2492 gfc_log2int (gfc_expr *src, int kind)
2494 gfc_expr *result;
2496 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2497 mpz_set_si (result->value.integer, src->value.logical);
2499 return result;
2503 /* Convert integer to logical. */
2505 gfc_expr *
2506 gfc_int2log (gfc_expr *src, int kind)
2508 gfc_expr *result;
2510 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2511 result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2513 return result;
2517 /* Helper function to set the representation in a Hollerith conversion.
2518 This assumes that the ts.type and ts.kind of the result have already
2519 been set. */
2521 static void
2522 hollerith2representation (gfc_expr *result, gfc_expr *src)
2524 int src_len, result_len;
2526 src_len = src->representation.length - src->ts.u.pad;
2527 result_len = gfc_target_expr_size (result);
2529 if (src_len > result_len)
2531 gfc_warning (0,
2532 "The Hollerith constant at %L is too long to convert to %qs",
2533 &src->where, gfc_typename(&result->ts));
2536 result->representation.string = XCNEWVEC (char, result_len + 1);
2537 memcpy (result->representation.string, src->representation.string,
2538 MIN (result_len, src_len));
2540 if (src_len < result_len)
2541 memset (&result->representation.string[src_len], ' ', result_len - src_len);
2543 result->representation.string[result_len] = '\0'; /* For debugger */
2544 result->representation.length = result_len;
2548 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2550 gfc_expr *
2551 gfc_hollerith2int (gfc_expr *src, int kind)
2553 gfc_expr *result;
2554 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2556 hollerith2representation (result, src);
2557 gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2558 result->representation.length, result->value.integer);
2560 return result;
2564 /* Convert Hollerith to real. The constant will be padded or truncated. */
2566 gfc_expr *
2567 gfc_hollerith2real (gfc_expr *src, int kind)
2569 gfc_expr *result;
2570 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2572 hollerith2representation (result, src);
2573 gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2574 result->representation.length, result->value.real);
2576 return result;
2580 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2582 gfc_expr *
2583 gfc_hollerith2complex (gfc_expr *src, int kind)
2585 gfc_expr *result;
2586 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2588 hollerith2representation (result, src);
2589 gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2590 result->representation.length, result->value.complex);
2592 return result;
2596 /* Convert Hollerith to character. */
2598 gfc_expr *
2599 gfc_hollerith2character (gfc_expr *src, int kind)
2601 gfc_expr *result;
2603 result = gfc_copy_expr (src);
2604 result->ts.type = BT_CHARACTER;
2605 result->ts.kind = kind;
2607 result->value.character.length = result->representation.length;
2608 result->value.character.string
2609 = gfc_char_to_widechar (result->representation.string);
2611 return result;
2615 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2617 gfc_expr *
2618 gfc_hollerith2logical (gfc_expr *src, int kind)
2620 gfc_expr *result;
2621 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2623 hollerith2representation (result, src);
2624 gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2625 result->representation.length, &result->value.logical);
2627 return result;