PR rtl-optimization/87817
[official-gcc.git] / gcc / fortran / arith.c
blob98af27efcfef98b84add8ab4266dc745424a622d
1 /* Compiler arithmetic
2 Copyright (C) 2000-2018 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 case ARITH_WRONGCONCAT:
118 _("Illegal type in character concatenation at %L");
119 break;
121 default:
122 gfc_internal_error ("gfc_arith_error(): Bad error code");
125 return p;
129 /* Get things ready to do math. */
131 void
132 gfc_arith_init_1 (void)
134 gfc_integer_info *int_info;
135 gfc_real_info *real_info;
136 mpfr_t a, b;
137 int i;
139 mpfr_set_default_prec (128);
140 mpfr_init (a);
142 /* Convert the minimum and maximum values for each kind into their
143 GNU MP representation. */
144 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
146 /* Huge */
147 mpz_init (int_info->huge);
148 mpz_set_ui (int_info->huge, int_info->radix);
149 mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
150 mpz_sub_ui (int_info->huge, int_info->huge, 1);
152 /* These are the numbers that are actually representable by the
153 target. For bases other than two, this needs to be changed. */
154 if (int_info->radix != 2)
155 gfc_internal_error ("Fix min_int calculation");
157 /* See PRs 13490 and 17912, related to integer ranges.
158 The pedantic_min_int exists for range checking when a program
159 is compiled with -pedantic, and reflects the belief that
160 Standard Fortran requires integers to be symmetrical, i.e.
161 every negative integer must have a representable positive
162 absolute value, and vice versa. */
164 mpz_init (int_info->pedantic_min_int);
165 mpz_neg (int_info->pedantic_min_int, int_info->huge);
167 mpz_init (int_info->min_int);
168 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
170 /* Range */
171 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
172 mpfr_log10 (a, a, GFC_RND_MODE);
173 mpfr_trunc (a, a);
174 int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
177 mpfr_clear (a);
179 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
181 gfc_set_model_kind (real_info->kind);
183 mpfr_init (a);
184 mpfr_init (b);
186 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
187 /* 1 - b**(-p) */
188 mpfr_init (real_info->huge);
189 mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
190 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
191 mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
192 mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
194 /* b**(emax-1) */
195 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
196 mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
198 /* (1 - b**(-p)) * b**(emax-1) */
199 mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
201 /* (1 - b**(-p)) * b**(emax-1) * b */
202 mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
203 GFC_RND_MODE);
205 /* tiny(x) = b**(emin-1) */
206 mpfr_init (real_info->tiny);
207 mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
208 mpfr_pow_si (real_info->tiny, real_info->tiny,
209 real_info->min_exponent - 1, GFC_RND_MODE);
211 /* subnormal (x) = b**(emin - digit) */
212 mpfr_init (real_info->subnormal);
213 mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
214 mpfr_pow_si (real_info->subnormal, real_info->subnormal,
215 real_info->min_exponent - real_info->digits, GFC_RND_MODE);
217 /* epsilon(x) = b**(1-p) */
218 mpfr_init (real_info->epsilon);
219 mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
220 mpfr_pow_si (real_info->epsilon, real_info->epsilon,
221 1 - real_info->digits, GFC_RND_MODE);
223 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
224 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
225 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
226 mpfr_neg (b, b, GFC_RND_MODE);
228 /* a = min(a, b) */
229 mpfr_min (a, a, b, GFC_RND_MODE);
230 mpfr_trunc (a, a);
231 real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
233 /* precision(x) = int((p - 1) * log10(b)) + k */
234 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
235 mpfr_log10 (a, a, GFC_RND_MODE);
236 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
237 mpfr_trunc (a, a);
238 real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
240 /* If the radix is an integral power of 10, add one to the precision. */
241 for (i = 10; i <= real_info->radix; i *= 10)
242 if (i == real_info->radix)
243 real_info->precision++;
245 mpfr_clears (a, b, NULL);
250 /* Clean up, get rid of numeric constants. */
252 void
253 gfc_arith_done_1 (void)
255 gfc_integer_info *ip;
256 gfc_real_info *rp;
258 for (ip = gfc_integer_kinds; ip->kind; ip++)
260 mpz_clear (ip->min_int);
261 mpz_clear (ip->pedantic_min_int);
262 mpz_clear (ip->huge);
265 for (rp = gfc_real_kinds; rp->kind; rp++)
266 mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
268 mpfr_free_cache ();
272 /* Given a wide character value and a character kind, determine whether
273 the character is representable for that kind. */
274 bool
275 gfc_check_character_range (gfc_char_t c, int kind)
277 /* As wide characters are stored as 32-bit values, they're all
278 representable in UCS=4. */
279 if (kind == 4)
280 return true;
282 if (kind == 1)
283 return c <= 255 ? true : false;
285 gcc_unreachable ();
289 /* Given an integer and a kind, make sure that the integer lies within
290 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
291 ARITH_OVERFLOW. */
293 arith
294 gfc_check_integer_range (mpz_t p, int kind)
296 arith result;
297 int i;
299 i = gfc_validate_kind (BT_INTEGER, kind, false);
300 result = ARITH_OK;
302 if (pedantic)
304 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
305 result = ARITH_ASYMMETRIC;
309 if (flag_range_check == 0)
310 return result;
312 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
313 || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
314 result = ARITH_OVERFLOW;
316 return result;
320 /* Given a real and a kind, make sure that the real lies within the
321 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
322 ARITH_UNDERFLOW. */
324 static arith
325 gfc_check_real_range (mpfr_t p, int kind)
327 arith retval;
328 mpfr_t q;
329 int i;
331 i = gfc_validate_kind (BT_REAL, kind, false);
333 gfc_set_model (p);
334 mpfr_init (q);
335 mpfr_abs (q, p, GFC_RND_MODE);
337 retval = ARITH_OK;
339 if (mpfr_inf_p (p))
341 if (flag_range_check != 0)
342 retval = ARITH_OVERFLOW;
344 else if (mpfr_nan_p (p))
346 if (flag_range_check != 0)
347 retval = ARITH_NAN;
349 else if (mpfr_sgn (q) == 0)
351 mpfr_clear (q);
352 return retval;
354 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
356 if (flag_range_check == 0)
357 mpfr_set_inf (p, mpfr_sgn (p));
358 else
359 retval = ARITH_OVERFLOW;
361 else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
363 if (flag_range_check == 0)
365 if (mpfr_sgn (p) < 0)
367 mpfr_set_ui (p, 0, GFC_RND_MODE);
368 mpfr_set_si (q, -1, GFC_RND_MODE);
369 mpfr_copysign (p, p, q, GFC_RND_MODE);
371 else
372 mpfr_set_ui (p, 0, GFC_RND_MODE);
374 else
375 retval = ARITH_UNDERFLOW;
377 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
379 mp_exp_t emin, emax;
380 int en;
382 /* Save current values of emin and emax. */
383 emin = mpfr_get_emin ();
384 emax = mpfr_get_emax ();
386 /* Set emin and emax for the current model number. */
387 en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
388 mpfr_set_emin ((mp_exp_t) en);
389 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[i].max_exponent);
390 mpfr_check_range (q, 0, GFC_RND_MODE);
391 mpfr_subnormalize (q, 0, GFC_RND_MODE);
393 /* Reset emin and emax. */
394 mpfr_set_emin (emin);
395 mpfr_set_emax (emax);
397 /* Copy sign if needed. */
398 if (mpfr_sgn (p) < 0)
399 mpfr_neg (p, q, GMP_RNDN);
400 else
401 mpfr_set (p, q, GMP_RNDN);
404 mpfr_clear (q);
406 return retval;
410 /* Low-level arithmetic functions. All of these subroutines assume
411 that all operands are of the same type and return an operand of the
412 same type. The other thing about these subroutines is that they
413 can fail in various ways -- overflow, underflow, division by zero,
414 zero raised to the zero, etc. */
416 static arith
417 gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
419 gfc_expr *result;
421 result = gfc_get_constant_expr (BT_LOGICAL, op1->ts.kind, &op1->where);
422 result->value.logical = !op1->value.logical;
423 *resultp = result;
425 return ARITH_OK;
429 static arith
430 gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
432 gfc_expr *result;
434 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
435 &op1->where);
436 result->value.logical = op1->value.logical && op2->value.logical;
437 *resultp = result;
439 return ARITH_OK;
443 static arith
444 gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
446 gfc_expr *result;
448 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
449 &op1->where);
450 result->value.logical = op1->value.logical || op2->value.logical;
451 *resultp = result;
453 return ARITH_OK;
457 static arith
458 gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
460 gfc_expr *result;
462 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
463 &op1->where);
464 result->value.logical = op1->value.logical == op2->value.logical;
465 *resultp = result;
467 return ARITH_OK;
471 static arith
472 gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
474 gfc_expr *result;
476 result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
477 &op1->where);
478 result->value.logical = op1->value.logical != op2->value.logical;
479 *resultp = result;
481 return ARITH_OK;
485 /* Make sure a constant numeric expression is within the range for
486 its type and kind. Note that there's also a gfc_check_range(),
487 but that one deals with the intrinsic RANGE function. */
489 arith
490 gfc_range_check (gfc_expr *e)
492 arith rc;
493 arith rc2;
495 switch (e->ts.type)
497 case BT_INTEGER:
498 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
499 break;
501 case BT_REAL:
502 rc = gfc_check_real_range (e->value.real, e->ts.kind);
503 if (rc == ARITH_UNDERFLOW)
504 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
505 if (rc == ARITH_OVERFLOW)
506 mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
507 if (rc == ARITH_NAN)
508 mpfr_set_nan (e->value.real);
509 break;
511 case BT_COMPLEX:
512 rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
513 if (rc == ARITH_UNDERFLOW)
514 mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
515 if (rc == ARITH_OVERFLOW)
516 mpfr_set_inf (mpc_realref (e->value.complex),
517 mpfr_sgn (mpc_realref (e->value.complex)));
518 if (rc == ARITH_NAN)
519 mpfr_set_nan (mpc_realref (e->value.complex));
521 rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
522 if (rc == ARITH_UNDERFLOW)
523 mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
524 if (rc == ARITH_OVERFLOW)
525 mpfr_set_inf (mpc_imagref (e->value.complex),
526 mpfr_sgn (mpc_imagref (e->value.complex)));
527 if (rc == ARITH_NAN)
528 mpfr_set_nan (mpc_imagref (e->value.complex));
530 if (rc == ARITH_OK)
531 rc = rc2;
532 break;
534 default:
535 gfc_internal_error ("gfc_range_check(): Bad type");
538 return rc;
542 /* Several of the following routines use the same set of statements to
543 check the validity of the result. Encapsulate the checking here. */
545 static arith
546 check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
548 arith val = rc;
550 if (val == ARITH_UNDERFLOW)
552 if (warn_underflow)
553 gfc_warning (OPT_Wunderflow, gfc_arith_error (val), &x->where);
554 val = ARITH_OK;
557 if (val == ARITH_ASYMMETRIC)
559 gfc_warning (0, gfc_arith_error (val), &x->where);
560 val = ARITH_OK;
563 if (val == ARITH_OK || val == ARITH_OVERFLOW)
564 *rp = r;
565 else
566 gfc_free_expr (r);
568 return val;
572 /* It may seem silly to have a subroutine that actually computes the
573 unary plus of a constant, but it prevents us from making exceptions
574 in the code elsewhere. Used for unary plus and parenthesized
575 expressions. */
577 static arith
578 gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
580 *resultp = gfc_copy_expr (op1);
581 return ARITH_OK;
585 static arith
586 gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
588 gfc_expr *result;
589 arith rc;
591 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
593 switch (op1->ts.type)
595 case BT_INTEGER:
596 mpz_neg (result->value.integer, op1->value.integer);
597 break;
599 case BT_REAL:
600 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
601 break;
603 case BT_COMPLEX:
604 mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
605 break;
607 default:
608 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
611 rc = gfc_range_check (result);
613 return check_result (rc, op1, result, resultp);
617 static arith
618 gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
620 gfc_expr *result;
621 arith rc;
623 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
625 switch (op1->ts.type)
627 case BT_INTEGER:
628 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
629 break;
631 case BT_REAL:
632 mpfr_add (result->value.real, op1->value.real, op2->value.real,
633 GFC_RND_MODE);
634 break;
636 case BT_COMPLEX:
637 mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
638 GFC_MPC_RND_MODE);
639 break;
641 default:
642 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
645 rc = gfc_range_check (result);
647 return check_result (rc, op1, result, resultp);
651 static arith
652 gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
654 gfc_expr *result;
655 arith rc;
657 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
659 switch (op1->ts.type)
661 case BT_INTEGER:
662 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
663 break;
665 case BT_REAL:
666 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
667 GFC_RND_MODE);
668 break;
670 case BT_COMPLEX:
671 mpc_sub (result->value.complex, op1->value.complex,
672 op2->value.complex, GFC_MPC_RND_MODE);
673 break;
675 default:
676 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
679 rc = gfc_range_check (result);
681 return check_result (rc, op1, result, resultp);
685 static arith
686 gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
688 gfc_expr *result;
689 arith rc;
691 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
693 switch (op1->ts.type)
695 case BT_INTEGER:
696 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
697 break;
699 case BT_REAL:
700 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
701 GFC_RND_MODE);
702 break;
704 case BT_COMPLEX:
705 gfc_set_model (mpc_realref (op1->value.complex));
706 mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
707 GFC_MPC_RND_MODE);
708 break;
710 default:
711 gfc_internal_error ("gfc_arith_times(): Bad basic type");
714 rc = gfc_range_check (result);
716 return check_result (rc, op1, result, resultp);
720 static arith
721 gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
723 gfc_expr *result;
724 arith rc;
726 rc = ARITH_OK;
728 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
730 switch (op1->ts.type)
732 case BT_INTEGER:
733 if (mpz_sgn (op2->value.integer) == 0)
735 rc = ARITH_DIV0;
736 break;
739 if (warn_integer_division)
741 mpz_t r;
742 mpz_init (r);
743 mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
744 op2->value.integer);
746 if (mpz_cmp_si (r, 0) != 0)
748 char *p;
749 p = mpz_get_str (NULL, 10, result->value.integer);
750 gfc_warning_now (OPT_Winteger_division, "Integer division "
751 "truncated to constant %qs at %L", p,
752 &op1->where);
753 free (p);
755 mpz_clear (r);
757 else
758 mpz_tdiv_q (result->value.integer, op1->value.integer,
759 op2->value.integer);
761 break;
763 case BT_REAL:
764 if (mpfr_sgn (op2->value.real) == 0 && flag_range_check == 1)
766 rc = ARITH_DIV0;
767 break;
770 mpfr_div (result->value.real, op1->value.real, op2->value.real,
771 GFC_RND_MODE);
772 break;
774 case BT_COMPLEX:
775 if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
776 && flag_range_check == 1)
778 rc = ARITH_DIV0;
779 break;
782 gfc_set_model (mpc_realref (op1->value.complex));
783 if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
785 /* In Fortran, return (NaN + NaN I) for any zero divisor. See
786 PR 40318. */
787 mpfr_set_nan (mpc_realref (result->value.complex));
788 mpfr_set_nan (mpc_imagref (result->value.complex));
790 else
791 mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
792 GFC_MPC_RND_MODE);
793 break;
795 default:
796 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
799 if (rc == ARITH_OK)
800 rc = gfc_range_check (result);
802 return check_result (rc, op1, result, resultp);
805 /* Raise a number to a power. */
807 static arith
808 arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
810 int power_sign;
811 gfc_expr *result;
812 arith rc;
814 rc = ARITH_OK;
815 result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
817 switch (op2->ts.type)
819 case BT_INTEGER:
820 power_sign = mpz_sgn (op2->value.integer);
822 if (power_sign == 0)
824 /* Handle something to the zeroth power. Since we're dealing
825 with integral exponents, there is no ambiguity in the
826 limiting procedure used to determine the value of 0**0. */
827 switch (op1->ts.type)
829 case BT_INTEGER:
830 mpz_set_ui (result->value.integer, 1);
831 break;
833 case BT_REAL:
834 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
835 break;
837 case BT_COMPLEX:
838 mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
839 break;
841 default:
842 gfc_internal_error ("arith_power(): Bad base");
845 else
847 switch (op1->ts.type)
849 case BT_INTEGER:
851 int power;
853 /* First, we simplify the cases of op1 == 1, 0 or -1. */
854 if (mpz_cmp_si (op1->value.integer, 1) == 0)
856 /* 1**op2 == 1 */
857 mpz_set_si (result->value.integer, 1);
859 else if (mpz_cmp_si (op1->value.integer, 0) == 0)
861 /* 0**op2 == 0, if op2 > 0
862 0**op2 overflow, if op2 < 0 ; in that case, we
863 set the result to 0 and return ARITH_DIV0. */
864 mpz_set_si (result->value.integer, 0);
865 if (mpz_cmp_si (op2->value.integer, 0) < 0)
866 rc = ARITH_DIV0;
868 else if (mpz_cmp_si (op1->value.integer, -1) == 0)
870 /* (-1)**op2 == (-1)**(mod(op2,2)) */
871 unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
872 if (odd)
873 mpz_set_si (result->value.integer, -1);
874 else
875 mpz_set_si (result->value.integer, 1);
877 /* Then, we take care of op2 < 0. */
878 else if (mpz_cmp_si (op2->value.integer, 0) < 0)
880 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
881 mpz_set_si (result->value.integer, 0);
882 if (warn_integer_division)
883 gfc_warning_now (OPT_Winteger_division, "Negative "
884 "exponent of integer has zero "
885 "result at %L", &result->where);
887 else if (gfc_extract_int (op2, &power))
889 /* If op2 doesn't fit in an int, the exponentiation will
890 overflow, because op2 > 0 and abs(op1) > 1. */
891 mpz_t max;
892 int i;
893 i = gfc_validate_kind (BT_INTEGER, result->ts.kind, false);
895 if (flag_range_check)
896 rc = ARITH_OVERFLOW;
898 /* Still, we want to give the same value as the
899 processor. */
900 mpz_init (max);
901 mpz_add_ui (max, gfc_integer_kinds[i].huge, 1);
902 mpz_mul_ui (max, max, 2);
903 mpz_powm (result->value.integer, op1->value.integer,
904 op2->value.integer, max);
905 mpz_clear (max);
907 else
908 mpz_pow_ui (result->value.integer, op1->value.integer,
909 power);
911 break;
913 case BT_REAL:
914 mpfr_pow_z (result->value.real, op1->value.real,
915 op2->value.integer, GFC_RND_MODE);
916 break;
918 case BT_COMPLEX:
919 mpc_pow_z (result->value.complex, op1->value.complex,
920 op2->value.integer, GFC_MPC_RND_MODE);
921 break;
923 default:
924 break;
927 break;
929 case BT_REAL:
931 if (gfc_init_expr_flag)
933 if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
934 "exponent in an initialization "
935 "expression at %L", &op2->where))
937 gfc_free_expr (result);
938 return ARITH_PROHIBIT;
942 if (mpfr_cmp_si (op1->value.real, 0) < 0)
944 gfc_error ("Raising a negative REAL at %L to "
945 "a REAL power is prohibited", &op1->where);
946 gfc_free_expr (result);
947 return ARITH_PROHIBIT;
950 mpfr_pow (result->value.real, op1->value.real, op2->value.real,
951 GFC_RND_MODE);
952 break;
954 case BT_COMPLEX:
956 if (gfc_init_expr_flag)
958 if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
959 "exponent in an initialization "
960 "expression at %L", &op2->where))
962 gfc_free_expr (result);
963 return ARITH_PROHIBIT;
967 mpc_pow (result->value.complex, op1->value.complex,
968 op2->value.complex, GFC_MPC_RND_MODE);
970 break;
971 default:
972 gfc_internal_error ("arith_power(): unknown type");
975 if (rc == ARITH_OK)
976 rc = gfc_range_check (result);
978 return check_result (rc, op1, result, resultp);
982 /* Concatenate two string constants. */
984 static arith
985 gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
987 gfc_expr *result;
988 size_t len;
990 /* By cleverly playing around with constructors, is is possible
991 to get mismaching types here. */
992 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
993 || op1->ts.kind != op2->ts.kind)
994 return ARITH_WRONGCONCAT;
996 result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
997 &op1->where);
999 len = op1->value.character.length + op2->value.character.length;
1001 result->value.character.string = gfc_get_wide_string (len + 1);
1002 result->value.character.length = len;
1004 memcpy (result->value.character.string, op1->value.character.string,
1005 op1->value.character.length * sizeof (gfc_char_t));
1007 memcpy (&result->value.character.string[op1->value.character.length],
1008 op2->value.character.string,
1009 op2->value.character.length * sizeof (gfc_char_t));
1011 result->value.character.string[len] = '\0';
1013 *resultp = result;
1015 return ARITH_OK;
1018 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1019 This function mimics mpfr_cmp but takes NaN into account. */
1021 static int
1022 compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1024 int rc;
1025 switch (op)
1027 case INTRINSIC_EQ:
1028 rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1029 break;
1030 case INTRINSIC_GT:
1031 rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1032 break;
1033 case INTRINSIC_GE:
1034 rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1035 break;
1036 case INTRINSIC_LT:
1037 rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1038 break;
1039 case INTRINSIC_LE:
1040 rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1041 break;
1042 default:
1043 gfc_internal_error ("compare_real(): Bad operator");
1046 return rc;
1049 /* Comparison operators. Assumes that the two expression nodes
1050 contain two constants of the same type. The op argument is
1051 needed to handle NaN correctly. */
1054 gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1056 int rc;
1058 switch (op1->ts.type)
1060 case BT_INTEGER:
1061 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1062 break;
1064 case BT_REAL:
1065 rc = compare_real (op1, op2, op);
1066 break;
1068 case BT_CHARACTER:
1069 rc = gfc_compare_string (op1, op2);
1070 break;
1072 case BT_LOGICAL:
1073 rc = ((!op1->value.logical && op2->value.logical)
1074 || (op1->value.logical && !op2->value.logical));
1075 break;
1077 default:
1078 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1081 return rc;
1085 /* Compare a pair of complex numbers. Naturally, this is only for
1086 equality and inequality. */
1088 static int
1089 compare_complex (gfc_expr *op1, gfc_expr *op2)
1091 return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
1095 /* Given two constant strings and the inverse collating sequence, compare the
1096 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1097 We use the processor's default collating sequence. */
1100 gfc_compare_string (gfc_expr *a, gfc_expr *b)
1102 size_t len, alen, blen, i;
1103 gfc_char_t ac, bc;
1105 alen = a->value.character.length;
1106 blen = b->value.character.length;
1108 len = MAX(alen, blen);
1110 for (i = 0; i < len; i++)
1112 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1113 bc = ((i < blen) ? b->value.character.string[i] : ' ');
1115 if (ac < bc)
1116 return -1;
1117 if (ac > bc)
1118 return 1;
1121 /* Strings are equal */
1122 return 0;
1127 gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
1129 size_t len, alen, blen, i;
1130 gfc_char_t ac, bc;
1132 alen = a->value.character.length;
1133 blen = strlen (b);
1135 len = MAX(alen, blen);
1137 for (i = 0; i < len; i++)
1139 ac = ((i < alen) ? a->value.character.string[i] : ' ');
1140 bc = ((i < blen) ? b[i] : ' ');
1142 if (!case_sensitive)
1144 ac = TOLOWER (ac);
1145 bc = TOLOWER (bc);
1148 if (ac < bc)
1149 return -1;
1150 if (ac > bc)
1151 return 1;
1154 /* Strings are equal */
1155 return 0;
1159 /* Specific comparison subroutines. */
1161 static arith
1162 gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1164 gfc_expr *result;
1166 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1167 &op1->where);
1168 result->value.logical = (op1->ts.type == BT_COMPLEX)
1169 ? compare_complex (op1, op2)
1170 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1172 *resultp = result;
1173 return ARITH_OK;
1177 static arith
1178 gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1180 gfc_expr *result;
1182 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1183 &op1->where);
1184 result->value.logical = (op1->ts.type == BT_COMPLEX)
1185 ? !compare_complex (op1, op2)
1186 : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1188 *resultp = result;
1189 return ARITH_OK;
1193 static arith
1194 gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1196 gfc_expr *result;
1198 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1199 &op1->where);
1200 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1201 *resultp = result;
1203 return ARITH_OK;
1207 static arith
1208 gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1210 gfc_expr *result;
1212 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1213 &op1->where);
1214 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1215 *resultp = result;
1217 return ARITH_OK;
1221 static arith
1222 gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1224 gfc_expr *result;
1226 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1227 &op1->where);
1228 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1229 *resultp = result;
1231 return ARITH_OK;
1235 static arith
1236 gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1238 gfc_expr *result;
1240 result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1241 &op1->where);
1242 result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1243 *resultp = result;
1245 return ARITH_OK;
1249 static arith
1250 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1251 gfc_expr **result)
1253 gfc_constructor_base head;
1254 gfc_constructor *c;
1255 gfc_expr *r;
1256 arith rc;
1258 if (op->expr_type == EXPR_CONSTANT)
1259 return eval (op, result);
1261 rc = ARITH_OK;
1262 head = gfc_constructor_copy (op->value.constructor);
1263 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1265 rc = reduce_unary (eval, c->expr, &r);
1267 if (rc != ARITH_OK)
1268 break;
1270 gfc_replace_expr (c->expr, r);
1273 if (rc != ARITH_OK)
1274 gfc_constructor_free (head);
1275 else
1277 gfc_constructor *c = gfc_constructor_first (head);
1278 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1279 &op->where);
1280 r->shape = gfc_copy_shape (op->shape, op->rank);
1281 r->rank = op->rank;
1282 r->value.constructor = head;
1283 *result = r;
1286 return rc;
1290 static arith
1291 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1292 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1294 gfc_constructor_base head;
1295 gfc_constructor *c;
1296 gfc_expr *r;
1297 arith rc = ARITH_OK;
1299 head = gfc_constructor_copy (op1->value.constructor);
1300 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1302 if (c->expr->expr_type == EXPR_CONSTANT)
1303 rc = eval (c->expr, op2, &r);
1304 else
1305 rc = reduce_binary_ac (eval, c->expr, op2, &r);
1307 if (rc != ARITH_OK)
1308 break;
1310 gfc_replace_expr (c->expr, r);
1313 if (rc != ARITH_OK)
1314 gfc_constructor_free (head);
1315 else
1317 gfc_constructor *c = gfc_constructor_first (head);
1318 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1319 &op1->where);
1320 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1321 r->rank = op1->rank;
1322 r->value.constructor = head;
1323 *result = r;
1326 return rc;
1330 static arith
1331 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1332 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1334 gfc_constructor_base head;
1335 gfc_constructor *c;
1336 gfc_expr *r;
1337 arith rc = ARITH_OK;
1339 head = gfc_constructor_copy (op2->value.constructor);
1340 for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1342 if (c->expr->expr_type == EXPR_CONSTANT)
1343 rc = eval (op1, c->expr, &r);
1344 else
1345 rc = reduce_binary_ca (eval, op1, c->expr, &r);
1347 if (rc != ARITH_OK)
1348 break;
1350 gfc_replace_expr (c->expr, r);
1353 if (rc != ARITH_OK)
1354 gfc_constructor_free (head);
1355 else
1357 gfc_constructor *c = gfc_constructor_first (head);
1358 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1359 &op2->where);
1360 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1361 r->rank = op2->rank;
1362 r->value.constructor = head;
1363 *result = r;
1366 return rc;
1370 /* We need a forward declaration of reduce_binary. */
1371 static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1372 gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1375 static arith
1376 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1377 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1379 gfc_constructor_base head;
1380 gfc_constructor *c, *d;
1381 gfc_expr *r;
1382 arith rc = ARITH_OK;
1384 if (!gfc_check_conformance (op1, op2, "elemental binary operation"))
1385 return ARITH_INCOMMENSURATE;
1387 head = gfc_constructor_copy (op1->value.constructor);
1388 for (c = gfc_constructor_first (head),
1389 d = gfc_constructor_first (op2->value.constructor);
1390 c && d;
1391 c = gfc_constructor_next (c), d = gfc_constructor_next (d))
1393 rc = reduce_binary (eval, c->expr, d->expr, &r);
1394 if (rc != ARITH_OK)
1395 break;
1397 gfc_replace_expr (c->expr, r);
1400 if (c || d)
1401 rc = ARITH_INCOMMENSURATE;
1403 if (rc != ARITH_OK)
1404 gfc_constructor_free (head);
1405 else
1407 gfc_constructor *c = gfc_constructor_first (head);
1408 r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1409 &op1->where);
1410 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1411 r->rank = op1->rank;
1412 r->value.constructor = head;
1413 *result = r;
1416 return rc;
1420 static arith
1421 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1422 gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1424 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1425 return eval (op1, op2, result);
1427 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1428 return reduce_binary_ca (eval, op1, op2, result);
1430 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1431 return reduce_binary_ac (eval, op1, op2, result);
1433 return reduce_binary_aa (eval, op1, op2, result);
1437 typedef union
1439 arith (*f2)(gfc_expr *, gfc_expr **);
1440 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1442 eval_f;
1444 /* High level arithmetic subroutines. These subroutines go into
1445 eval_intrinsic(), which can do one of several things to its
1446 operands. If the operands are incompatible with the intrinsic
1447 operation, we return a node pointing to the operands and hope that
1448 an operator interface is found during resolution.
1450 If the operands are compatible and are constants, then we try doing
1451 the arithmetic. We also handle the cases where either or both
1452 operands are array constructors. */
1454 static gfc_expr *
1455 eval_intrinsic (gfc_intrinsic_op op,
1456 eval_f eval, gfc_expr *op1, gfc_expr *op2)
1458 gfc_expr temp, *result;
1459 int unary;
1460 arith rc;
1462 gfc_clear_ts (&temp.ts);
1464 switch (op)
1466 /* Logical unary */
1467 case INTRINSIC_NOT:
1468 if (op1->ts.type != BT_LOGICAL)
1469 goto runtime;
1471 temp.ts.type = BT_LOGICAL;
1472 temp.ts.kind = gfc_default_logical_kind;
1473 unary = 1;
1474 break;
1476 /* Logical binary operators */
1477 case INTRINSIC_OR:
1478 case INTRINSIC_AND:
1479 case INTRINSIC_NEQV:
1480 case INTRINSIC_EQV:
1481 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1482 goto runtime;
1484 temp.ts.type = BT_LOGICAL;
1485 temp.ts.kind = gfc_default_logical_kind;
1486 unary = 0;
1487 break;
1489 /* Numeric unary */
1490 case INTRINSIC_UPLUS:
1491 case INTRINSIC_UMINUS:
1492 if (!gfc_numeric_ts (&op1->ts))
1493 goto runtime;
1495 temp.ts = op1->ts;
1496 unary = 1;
1497 break;
1499 case INTRINSIC_PARENTHESES:
1500 temp.ts = op1->ts;
1501 unary = 1;
1502 break;
1504 /* Additional restrictions for ordering relations. */
1505 case INTRINSIC_GE:
1506 case INTRINSIC_GE_OS:
1507 case INTRINSIC_LT:
1508 case INTRINSIC_LT_OS:
1509 case INTRINSIC_LE:
1510 case INTRINSIC_LE_OS:
1511 case INTRINSIC_GT:
1512 case INTRINSIC_GT_OS:
1513 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1515 temp.ts.type = BT_LOGICAL;
1516 temp.ts.kind = gfc_default_logical_kind;
1517 goto runtime;
1520 /* Fall through */
1521 case INTRINSIC_EQ:
1522 case INTRINSIC_EQ_OS:
1523 case INTRINSIC_NE:
1524 case INTRINSIC_NE_OS:
1525 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1527 unary = 0;
1528 temp.ts.type = BT_LOGICAL;
1529 temp.ts.kind = gfc_default_logical_kind;
1531 /* If kind mismatch, exit and we'll error out later. */
1532 if (op1->ts.kind != op2->ts.kind)
1533 goto runtime;
1535 break;
1538 gcc_fallthrough ();
1539 /* Numeric binary */
1540 case INTRINSIC_PLUS:
1541 case INTRINSIC_MINUS:
1542 case INTRINSIC_TIMES:
1543 case INTRINSIC_DIVIDE:
1544 case INTRINSIC_POWER:
1545 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1546 goto runtime;
1548 /* Insert any necessary type conversions to make the operands
1549 compatible. */
1551 temp.expr_type = EXPR_OP;
1552 gfc_clear_ts (&temp.ts);
1553 temp.value.op.op = op;
1555 temp.value.op.op1 = op1;
1556 temp.value.op.op2 = op2;
1558 gfc_type_convert_binary (&temp, warn_conversion || warn_conversion_extra);
1560 if (op == INTRINSIC_EQ || op == INTRINSIC_NE
1561 || op == INTRINSIC_GE || op == INTRINSIC_GT
1562 || op == INTRINSIC_LE || op == INTRINSIC_LT
1563 || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
1564 || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
1565 || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
1567 temp.ts.type = BT_LOGICAL;
1568 temp.ts.kind = gfc_default_logical_kind;
1571 unary = 0;
1572 break;
1574 /* Character binary */
1575 case INTRINSIC_CONCAT:
1576 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
1577 || op1->ts.kind != op2->ts.kind)
1578 goto runtime;
1580 temp.ts.type = BT_CHARACTER;
1581 temp.ts.kind = op1->ts.kind;
1582 unary = 0;
1583 break;
1585 case INTRINSIC_USER:
1586 goto runtime;
1588 default:
1589 gfc_internal_error ("eval_intrinsic(): Bad operator");
1592 if (op1->expr_type != EXPR_CONSTANT
1593 && (op1->expr_type != EXPR_ARRAY
1594 || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1595 goto runtime;
1597 if (op2 != NULL
1598 && op2->expr_type != EXPR_CONSTANT
1599 && (op2->expr_type != EXPR_ARRAY
1600 || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1601 goto runtime;
1603 if (unary)
1604 rc = reduce_unary (eval.f2, op1, &result);
1605 else
1606 rc = reduce_binary (eval.f3, op1, op2, &result);
1609 /* Something went wrong. */
1610 if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
1611 return NULL;
1613 if (rc != ARITH_OK)
1615 gfc_error (gfc_arith_error (rc), &op1->where);
1616 if (rc == ARITH_OVERFLOW)
1617 goto done;
1618 return NULL;
1621 done:
1623 gfc_free_expr (op1);
1624 gfc_free_expr (op2);
1625 return result;
1627 runtime:
1628 /* Create a run-time expression. */
1629 result = gfc_get_operator_expr (&op1->where, op, op1, op2);
1630 result->ts = temp.ts;
1632 return result;
1636 /* Modify type of expression for zero size array. */
1638 static gfc_expr *
1639 eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
1641 if (op == NULL)
1642 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1644 switch (iop)
1646 case INTRINSIC_GE:
1647 case INTRINSIC_GE_OS:
1648 case INTRINSIC_LT:
1649 case INTRINSIC_LT_OS:
1650 case INTRINSIC_LE:
1651 case INTRINSIC_LE_OS:
1652 case INTRINSIC_GT:
1653 case INTRINSIC_GT_OS:
1654 case INTRINSIC_EQ:
1655 case INTRINSIC_EQ_OS:
1656 case INTRINSIC_NE:
1657 case INTRINSIC_NE_OS:
1658 op->ts.type = BT_LOGICAL;
1659 op->ts.kind = gfc_default_logical_kind;
1660 break;
1662 default:
1663 break;
1666 return op;
1670 /* Return nonzero if the expression is a zero size array. */
1672 static int
1673 gfc_zero_size_array (gfc_expr *e)
1675 if (e->expr_type != EXPR_ARRAY)
1676 return 0;
1678 return e->value.constructor == NULL;
1682 /* Reduce a binary expression where at least one of the operands
1683 involves a zero-length array. Returns NULL if neither of the
1684 operands is a zero-length array. */
1686 static gfc_expr *
1687 reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1689 if (gfc_zero_size_array (op1))
1691 gfc_free_expr (op2);
1692 return op1;
1695 if (gfc_zero_size_array (op2))
1697 gfc_free_expr (op1);
1698 return op2;
1701 return NULL;
1705 static gfc_expr *
1706 eval_intrinsic_f2 (gfc_intrinsic_op op,
1707 arith (*eval) (gfc_expr *, gfc_expr **),
1708 gfc_expr *op1, gfc_expr *op2)
1710 gfc_expr *result;
1711 eval_f f;
1713 if (op2 == NULL)
1715 if (gfc_zero_size_array (op1))
1716 return eval_type_intrinsic0 (op, op1);
1718 else
1720 result = reduce_binary0 (op1, op2);
1721 if (result != NULL)
1722 return eval_type_intrinsic0 (op, result);
1725 f.f2 = eval;
1726 return eval_intrinsic (op, f, op1, op2);
1730 static gfc_expr *
1731 eval_intrinsic_f3 (gfc_intrinsic_op op,
1732 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1733 gfc_expr *op1, gfc_expr *op2)
1735 gfc_expr *result;
1736 eval_f f;
1738 result = reduce_binary0 (op1, op2);
1739 if (result != NULL)
1740 return eval_type_intrinsic0(op, result);
1742 f.f3 = eval;
1743 return eval_intrinsic (op, f, op1, op2);
1747 gfc_expr *
1748 gfc_parentheses (gfc_expr *op)
1750 if (gfc_is_constant_expr (op))
1751 return op;
1753 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
1754 op, NULL);
1757 gfc_expr *
1758 gfc_uplus (gfc_expr *op)
1760 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
1764 gfc_expr *
1765 gfc_uminus (gfc_expr *op)
1767 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1771 gfc_expr *
1772 gfc_add (gfc_expr *op1, gfc_expr *op2)
1774 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1778 gfc_expr *
1779 gfc_subtract (gfc_expr *op1, gfc_expr *op2)
1781 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1785 gfc_expr *
1786 gfc_multiply (gfc_expr *op1, gfc_expr *op2)
1788 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1792 gfc_expr *
1793 gfc_divide (gfc_expr *op1, gfc_expr *op2)
1795 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1799 gfc_expr *
1800 gfc_power (gfc_expr *op1, gfc_expr *op2)
1802 return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
1806 gfc_expr *
1807 gfc_concat (gfc_expr *op1, gfc_expr *op2)
1809 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1813 gfc_expr *
1814 gfc_and (gfc_expr *op1, gfc_expr *op2)
1816 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1820 gfc_expr *
1821 gfc_or (gfc_expr *op1, gfc_expr *op2)
1823 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1827 gfc_expr *
1828 gfc_not (gfc_expr *op1)
1830 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1834 gfc_expr *
1835 gfc_eqv (gfc_expr *op1, gfc_expr *op2)
1837 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1841 gfc_expr *
1842 gfc_neqv (gfc_expr *op1, gfc_expr *op2)
1844 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1848 gfc_expr *
1849 gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1851 return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
1855 gfc_expr *
1856 gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1858 return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
1862 gfc_expr *
1863 gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1865 return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
1869 gfc_expr *
1870 gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1872 return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
1876 gfc_expr *
1877 gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1879 return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
1883 gfc_expr *
1884 gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1886 return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
1890 /* Convert an integer string to an expression node. */
1892 gfc_expr *
1893 gfc_convert_integer (const char *buffer, int kind, int radix, locus *where)
1895 gfc_expr *e;
1896 const char *t;
1898 e = gfc_get_constant_expr (BT_INTEGER, kind, where);
1899 /* A leading plus is allowed, but not by mpz_set_str. */
1900 if (buffer[0] == '+')
1901 t = buffer + 1;
1902 else
1903 t = buffer;
1904 mpz_set_str (e->value.integer, t, radix);
1906 return e;
1910 /* Convert a real string to an expression node. */
1912 gfc_expr *
1913 gfc_convert_real (const char *buffer, int kind, locus *where)
1915 gfc_expr *e;
1917 e = gfc_get_constant_expr (BT_REAL, kind, where);
1918 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
1920 return e;
1924 /* Convert a pair of real, constant expression nodes to a single
1925 complex expression node. */
1927 gfc_expr *
1928 gfc_convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
1930 gfc_expr *e;
1932 e = gfc_get_constant_expr (BT_COMPLEX, kind, &real->where);
1933 mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
1934 GFC_MPC_RND_MODE);
1936 return e;
1940 /******* Simplification of intrinsic functions with constant arguments *****/
1943 /* Deal with an arithmetic error. */
1945 static void
1946 arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
1948 switch (rc)
1950 case ARITH_OK:
1951 gfc_error ("Arithmetic OK converting %s to %s at %L",
1952 gfc_typename (from), gfc_typename (to), where);
1953 break;
1954 case ARITH_OVERFLOW:
1955 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
1956 "can be disabled with the option %<-fno-range-check%>",
1957 gfc_typename (from), gfc_typename (to), where);
1958 break;
1959 case ARITH_UNDERFLOW:
1960 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
1961 "can be disabled with the option %<-fno-range-check%>",
1962 gfc_typename (from), gfc_typename (to), where);
1963 break;
1964 case ARITH_NAN:
1965 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
1966 "can be disabled with the option %<-fno-range-check%>",
1967 gfc_typename (from), gfc_typename (to), where);
1968 break;
1969 case ARITH_DIV0:
1970 gfc_error ("Division by zero converting %s to %s at %L",
1971 gfc_typename (from), gfc_typename (to), where);
1972 break;
1973 case ARITH_INCOMMENSURATE:
1974 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
1975 gfc_typename (from), gfc_typename (to), where);
1976 break;
1977 case ARITH_ASYMMETRIC:
1978 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
1979 " converting %s to %s at %L",
1980 gfc_typename (from), gfc_typename (to), where);
1981 break;
1982 default:
1983 gfc_internal_error ("gfc_arith_error(): Bad error code");
1986 /* TODO: Do something about the error, i.e., throw exception, return
1987 NaN, etc. */
1990 /* Returns true if significant bits were lost when converting real
1991 constant r from from_kind to to_kind. */
1993 static bool
1994 wprecision_real_real (mpfr_t r, int from_kind, int to_kind)
1996 mpfr_t rv, diff;
1997 bool ret;
1999 gfc_set_model_kind (to_kind);
2000 mpfr_init (rv);
2001 gfc_set_model_kind (from_kind);
2002 mpfr_init (diff);
2004 mpfr_set (rv, r, GFC_RND_MODE);
2005 mpfr_sub (diff, rv, r, GFC_RND_MODE);
2007 ret = ! mpfr_zero_p (diff);
2008 mpfr_clear (rv);
2009 mpfr_clear (diff);
2010 return ret;
2013 /* Return true if conversion from an integer to a real loses precision. */
2015 static bool
2016 wprecision_int_real (mpz_t n, mpfr_t r)
2018 bool ret;
2019 mpz_t i;
2020 mpz_init (i);
2021 mpfr_get_z (i, r, GFC_RND_MODE);
2022 mpz_sub (i, i, n);
2023 ret = mpz_cmp_si (i, 0) != 0;
2024 mpz_clear (i);
2025 return ret;
2028 /* Convert integers to integers. */
2030 gfc_expr *
2031 gfc_int2int (gfc_expr *src, int kind)
2033 gfc_expr *result;
2034 arith rc;
2036 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2038 mpz_set (result->value.integer, src->value.integer);
2040 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2042 if (rc == ARITH_ASYMMETRIC)
2044 gfc_warning (0, gfc_arith_error (rc), &src->where);
2046 else
2048 arith_error (rc, &src->ts, &result->ts, &src->where);
2049 gfc_free_expr (result);
2050 return NULL;
2054 /* If we do not trap numeric overflow, we need to convert the number to
2055 signed, throwing away high-order bits if necessary. */
2056 if (flag_range_check == 0)
2058 int k;
2060 k = gfc_validate_kind (BT_INTEGER, kind, false);
2061 gfc_convert_mpz_to_signed (result->value.integer,
2062 gfc_integer_kinds[k].bit_size);
2064 if (warn_conversion && kind < src->ts.kind)
2065 gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2066 gfc_typename (&src->ts), gfc_typename (&result->ts),
2067 &src->where);
2069 return result;
2073 /* Convert integers to reals. */
2075 gfc_expr *
2076 gfc_int2real (gfc_expr *src, int kind)
2078 gfc_expr *result;
2079 arith rc;
2081 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2083 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2085 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2087 arith_error (rc, &src->ts, &result->ts, &src->where);
2088 gfc_free_expr (result);
2089 return NULL;
2092 if (warn_conversion
2093 && wprecision_int_real (src->value.integer, result->value.real))
2094 gfc_warning (OPT_Wconversion, "Change of value in conversion "
2095 "from %qs to %qs at %L",
2096 gfc_typename (&src->ts),
2097 gfc_typename (&result->ts),
2098 &src->where);
2100 return result;
2104 /* Convert default integer to default complex. */
2106 gfc_expr *
2107 gfc_int2complex (gfc_expr *src, int kind)
2109 gfc_expr *result;
2110 arith rc;
2112 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2114 mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
2116 if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
2117 != ARITH_OK)
2119 arith_error (rc, &src->ts, &result->ts, &src->where);
2120 gfc_free_expr (result);
2121 return NULL;
2124 if (warn_conversion
2125 && wprecision_int_real (src->value.integer,
2126 mpc_realref (result->value.complex)))
2127 gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2128 "from %qs to %qs at %L",
2129 gfc_typename (&src->ts),
2130 gfc_typename (&result->ts),
2131 &src->where);
2133 return result;
2137 /* Convert default real to default integer. */
2139 gfc_expr *
2140 gfc_real2int (gfc_expr *src, int kind)
2142 gfc_expr *result;
2143 arith rc;
2144 bool did_warn = false;
2146 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2148 gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
2150 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2152 arith_error (rc, &src->ts, &result->ts, &src->where);
2153 gfc_free_expr (result);
2154 return NULL;
2157 /* If there was a fractional part, warn about this. */
2159 if (warn_conversion)
2161 mpfr_t f;
2162 mpfr_init (f);
2163 mpfr_frac (f, src->value.real, GFC_RND_MODE);
2164 if (mpfr_cmp_si (f, 0) != 0)
2166 gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2167 "from %qs to %qs at %L", gfc_typename (&src->ts),
2168 gfc_typename (&result->ts), &src->where);
2169 did_warn = true;
2172 if (!did_warn && warn_conversion_extra)
2174 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2175 "at %L", gfc_typename (&src->ts),
2176 gfc_typename (&result->ts), &src->where);
2179 return result;
2183 /* Convert real to real. */
2185 gfc_expr *
2186 gfc_real2real (gfc_expr *src, int kind)
2188 gfc_expr *result;
2189 arith rc;
2190 bool did_warn = false;
2192 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2194 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2196 rc = gfc_check_real_range (result->value.real, kind);
2198 if (rc == ARITH_UNDERFLOW)
2200 if (warn_underflow)
2201 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2202 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2204 else if (rc != ARITH_OK)
2206 arith_error (rc, &src->ts, &result->ts, &src->where);
2207 gfc_free_expr (result);
2208 return NULL;
2211 /* As a special bonus, don't warn about REAL values which are not changed by
2212 the conversion if -Wconversion is specified and -Wconversion-extra is
2213 not. */
2215 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2217 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2219 /* Calculate the difference between the constant and the rounded
2220 value and check it against zero. */
2222 if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2224 gfc_warning_now (w, "Change of value in conversion from "
2225 "%qs to %qs at %L",
2226 gfc_typename (&src->ts), gfc_typename (&result->ts),
2227 &src->where);
2228 /* Make sure the conversion warning is not emitted again. */
2229 did_warn = true;
2233 if (!did_warn && warn_conversion_extra)
2234 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2235 "at %L", gfc_typename(&src->ts),
2236 gfc_typename(&result->ts), &src->where);
2238 return result;
2242 /* Convert real to complex. */
2244 gfc_expr *
2245 gfc_real2complex (gfc_expr *src, int kind)
2247 gfc_expr *result;
2248 arith rc;
2249 bool did_warn = false;
2251 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2253 mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
2255 rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2257 if (rc == ARITH_UNDERFLOW)
2259 if (warn_underflow)
2260 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2261 mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2263 else if (rc != ARITH_OK)
2265 arith_error (rc, &src->ts, &result->ts, &src->where);
2266 gfc_free_expr (result);
2267 return NULL;
2270 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2272 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2274 if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2276 gfc_warning_now (w, "Change of value in conversion from "
2277 "%qs to %qs at %L",
2278 gfc_typename (&src->ts), gfc_typename (&result->ts),
2279 &src->where);
2280 /* Make sure the conversion warning is not emitted again. */
2281 did_warn = true;
2285 if (!did_warn && warn_conversion_extra)
2286 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2287 "at %L", gfc_typename(&src->ts),
2288 gfc_typename(&result->ts), &src->where);
2290 return result;
2294 /* Convert complex to integer. */
2296 gfc_expr *
2297 gfc_complex2int (gfc_expr *src, int kind)
2299 gfc_expr *result;
2300 arith rc;
2301 bool did_warn = false;
2303 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2305 gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
2306 &src->where);
2308 if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2310 arith_error (rc, &src->ts, &result->ts, &src->where);
2311 gfc_free_expr (result);
2312 return NULL;
2315 if (warn_conversion || warn_conversion_extra)
2317 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2319 /* See if we discarded an imaginary part. */
2320 if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2322 gfc_warning_now (w, "Non-zero imaginary part discarded "
2323 "in conversion from %qs to %qs at %L",
2324 gfc_typename(&src->ts), gfc_typename (&result->ts),
2325 &src->where);
2326 did_warn = true;
2329 else {
2330 mpfr_t f;
2332 mpfr_init (f);
2333 mpfr_frac (f, src->value.real, GFC_RND_MODE);
2334 if (mpfr_cmp_si (f, 0) != 0)
2336 gfc_warning_now (w, "Change of value in conversion from "
2337 "%qs to %qs at %L", gfc_typename (&src->ts),
2338 gfc_typename (&result->ts), &src->where);
2339 did_warn = true;
2341 mpfr_clear (f);
2344 if (!did_warn && warn_conversion_extra)
2346 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2347 "at %L", gfc_typename (&src->ts),
2348 gfc_typename (&result->ts), &src->where);
2352 return result;
2356 /* Convert complex to real. */
2358 gfc_expr *
2359 gfc_complex2real (gfc_expr *src, int kind)
2361 gfc_expr *result;
2362 arith rc;
2363 bool did_warn = false;
2365 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2367 mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
2369 rc = gfc_check_real_range (result->value.real, kind);
2371 if (rc == ARITH_UNDERFLOW)
2373 if (warn_underflow)
2374 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2375 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2377 if (rc != ARITH_OK)
2379 arith_error (rc, &src->ts, &result->ts, &src->where);
2380 gfc_free_expr (result);
2381 return NULL;
2384 if (warn_conversion || warn_conversion_extra)
2386 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2388 /* See if we discarded an imaginary part. */
2389 if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2391 gfc_warning (w, "Non-zero imaginary part discarded "
2392 "in conversion from %qs to %qs at %L",
2393 gfc_typename(&src->ts), gfc_typename (&result->ts),
2394 &src->where);
2395 did_warn = true;
2398 /* Calculate the difference between the real constant and the rounded
2399 value and check it against zero. */
2401 if (kind > src->ts.kind
2402 && wprecision_real_real (mpc_realref (src->value.complex),
2403 src->ts.kind, kind))
2405 gfc_warning_now (w, "Change of value in conversion from "
2406 "%qs to %qs at %L",
2407 gfc_typename (&src->ts), gfc_typename (&result->ts),
2408 &src->where);
2409 /* Make sure the conversion warning is not emitted again. */
2410 did_warn = true;
2414 if (!did_warn && warn_conversion_extra)
2415 gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2416 gfc_typename(&src->ts), gfc_typename (&result->ts),
2417 &src->where);
2419 return result;
2423 /* Convert complex to complex. */
2425 gfc_expr *
2426 gfc_complex2complex (gfc_expr *src, int kind)
2428 gfc_expr *result;
2429 arith rc;
2430 bool did_warn = false;
2432 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2434 mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
2436 rc = gfc_check_real_range (mpc_realref (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_realref (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 rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
2453 if (rc == ARITH_UNDERFLOW)
2455 if (warn_underflow)
2456 gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2457 mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
2459 else if (rc != ARITH_OK)
2461 arith_error (rc, &src->ts, &result->ts, &src->where);
2462 gfc_free_expr (result);
2463 return NULL;
2466 if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind
2467 && (wprecision_real_real (mpc_realref (src->value.complex),
2468 src->ts.kind, kind)
2469 || wprecision_real_real (mpc_imagref (src->value.complex),
2470 src->ts.kind, kind)))
2472 int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2474 gfc_warning_now (w, "Change of value in conversion from "
2475 " %qs to %qs at %L",
2476 gfc_typename (&src->ts), gfc_typename (&result->ts),
2477 &src->where);
2478 did_warn = true;
2481 if (!did_warn && warn_conversion_extra && src->ts.kind != kind)
2482 gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2483 "at %L", gfc_typename(&src->ts),
2484 gfc_typename (&result->ts), &src->where);
2486 return result;
2490 /* Logical kind conversion. */
2492 gfc_expr *
2493 gfc_log2log (gfc_expr *src, int kind)
2495 gfc_expr *result;
2497 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2498 result->value.logical = src->value.logical;
2500 return result;
2504 /* Convert logical to integer. */
2506 gfc_expr *
2507 gfc_log2int (gfc_expr *src, int kind)
2509 gfc_expr *result;
2511 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2512 mpz_set_si (result->value.integer, src->value.logical);
2514 return result;
2518 /* Convert integer to logical. */
2520 gfc_expr *
2521 gfc_int2log (gfc_expr *src, int kind)
2523 gfc_expr *result;
2525 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2526 result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2528 return result;
2531 /* Convert character to character. We only use wide strings internally,
2532 so we only set the kind. */
2534 gfc_expr *
2535 gfc_character2character (gfc_expr *src, int kind)
2537 gfc_expr *result;
2538 result = gfc_copy_expr (src);
2539 result->ts.kind = kind;
2541 return result;
2544 /* Helper function to set the representation in a Hollerith conversion.
2545 This assumes that the ts.type and ts.kind of the result have already
2546 been set. */
2548 static void
2549 hollerith2representation (gfc_expr *result, gfc_expr *src)
2551 int src_len, result_len;
2553 src_len = src->representation.length - src->ts.u.pad;
2554 result_len = gfc_target_expr_size (result);
2556 if (src_len > result_len)
2558 gfc_warning (0,
2559 "The Hollerith constant at %L is too long to convert to %qs",
2560 &src->where, gfc_typename(&result->ts));
2563 result->representation.string = XCNEWVEC (char, result_len + 1);
2564 memcpy (result->representation.string, src->representation.string,
2565 MIN (result_len, src_len));
2567 if (src_len < result_len)
2568 memset (&result->representation.string[src_len], ' ', result_len - src_len);
2570 result->representation.string[result_len] = '\0'; /* For debugger */
2571 result->representation.length = result_len;
2575 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2577 gfc_expr *
2578 gfc_hollerith2int (gfc_expr *src, int kind)
2580 gfc_expr *result;
2581 result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2583 hollerith2representation (result, src);
2584 gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2585 result->representation.length, result->value.integer);
2587 return result;
2591 /* Convert Hollerith to real. The constant will be padded or truncated. */
2593 gfc_expr *
2594 gfc_hollerith2real (gfc_expr *src, int kind)
2596 gfc_expr *result;
2597 result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2599 hollerith2representation (result, src);
2600 gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2601 result->representation.length, result->value.real);
2603 return result;
2607 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2609 gfc_expr *
2610 gfc_hollerith2complex (gfc_expr *src, int kind)
2612 gfc_expr *result;
2613 result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2615 hollerith2representation (result, src);
2616 gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2617 result->representation.length, result->value.complex);
2619 return result;
2623 /* Convert Hollerith to character. */
2625 gfc_expr *
2626 gfc_hollerith2character (gfc_expr *src, int kind)
2628 gfc_expr *result;
2630 result = gfc_copy_expr (src);
2631 result->ts.type = BT_CHARACTER;
2632 result->ts.kind = kind;
2633 result->ts.u.pad = 0;
2635 result->value.character.length = result->representation.length;
2636 result->value.character.string
2637 = gfc_char_to_widechar (result->representation.string);
2639 return result;
2643 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2645 gfc_expr *
2646 gfc_hollerith2logical (gfc_expr *src, int kind)
2648 gfc_expr *result;
2649 result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2651 hollerith2representation (result, src);
2652 gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2653 result->representation.length, &result->value.logical);
2655 return result;