2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 /* Since target arithmetic must be done on the host, there has to
24 be some way of evaluating arithmetic expressions as the host
25 would evaluate them. We use the GNU MP library to do arithmetic,
26 and this file provides the interface. */
34 /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
35 It's easily implemented with a few calls though. */
38 gfc_mpfr_to_mpz (mpz_t z, mpfr_t x)
42 e = mpfr_get_z_exp (z, x);
43 /* MPFR 2.0.1 (included with GMP 4.1) has a bug whereby mpfr_get_z_exp
44 may set the sign of z incorrectly. Work around that here. */
45 if (mpfr_sgn (x) != mpz_sgn (z))
49 mpz_mul_2exp (z, z, e);
51 mpz_tdiv_q_2exp (z, z, -e);
55 /* Set the model number precision by the requested KIND. */
58 gfc_set_model_kind (int kind)
60 int index = gfc_validate_kind (BT_REAL, kind, false);
63 base2prec = gfc_real_kinds[index].digits;
64 if (gfc_real_kinds[index].radix != 2)
65 base2prec *= gfc_real_kinds[index].radix / 2;
66 mpfr_set_default_prec (base2prec);
70 /* Set the model number precision from mpfr_t x. */
73 gfc_set_model (mpfr_t x)
75 mpfr_set_default_prec (mpfr_get_prec (x));
78 /* Calculate atan2 (y, x)
80 atan2(y, x) = atan(y/x) if x > 0,
81 sign(y)*(pi - atan(|y/x|)) if x < 0,
83 sign(y)*pi/2 if x = 0 && y != 0.
87 arctangent2 (mpfr_t y, mpfr_t x, mpfr_t result)
99 mpfr_div (t, y, x, GFC_RND_MODE);
100 mpfr_atan (result, t, GFC_RND_MODE);
104 mpfr_const_pi (result, GFC_RND_MODE);
105 mpfr_div (t, y, x, GFC_RND_MODE);
106 mpfr_abs (t, t, GFC_RND_MODE);
107 mpfr_atan (t, t, GFC_RND_MODE);
108 mpfr_sub (result, result, t, GFC_RND_MODE);
109 if (mpfr_sgn (y) < 0)
110 mpfr_neg (result, result, GFC_RND_MODE);
114 if (mpfr_sgn (y) == 0)
115 mpfr_set_ui (result, 0, GFC_RND_MODE);
118 mpfr_const_pi (result, GFC_RND_MODE);
119 mpfr_div_ui (result, result, 2, GFC_RND_MODE);
120 if (mpfr_sgn (y) < 0)
121 mpfr_neg (result, result, GFC_RND_MODE);
130 /* Given an arithmetic error code, return a pointer to a string that
131 explains the error. */
134 gfc_arith_error (arith code)
144 p = "Arithmetic overflow";
146 case ARITH_UNDERFLOW:
147 p = "Arithmetic underflow";
150 p = "Arithmetic NaN";
153 p = "Division by zero";
156 p = "Indeterminate form 0 ** 0";
158 case ARITH_INCOMMENSURATE:
159 p = "Array operands are incommensurate";
161 case ARITH_ASYMMETRIC:
162 p = "Integer outside symmetric range implied by Standard Fortran";
165 gfc_internal_error ("gfc_arith_error(): Bad error code");
172 /* Get things ready to do math. */
175 gfc_arith_init_1 (void)
177 gfc_integer_info *int_info;
178 gfc_real_info *real_info;
183 mpfr_set_default_prec (128);
187 /* Convert the minimum/maximum values for each kind into their
188 GNU MP representation. */
189 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
192 mpz_set_ui (r, int_info->radix);
193 mpz_pow_ui (r, r, int_info->digits);
195 mpz_init (int_info->huge);
196 mpz_sub_ui (int_info->huge, r, 1);
198 /* These are the numbers that are actually representable by the
199 target. For bases other than two, this needs to be changed. */
200 if (int_info->radix != 2)
201 gfc_internal_error ("Fix min_int, max_int calculation");
203 /* See PRs 13490 and 17912, related to integer ranges.
204 The pedantic_min_int exists for range checking when a program
205 is compiled with -pedantic, and reflects the belief that
206 Standard Fortran requires integers to be symmetrical, i.e.
207 every negative integer must have a representable positive
208 absolute value, and vice versa. */
210 mpz_init (int_info->pedantic_min_int);
211 mpz_neg (int_info->pedantic_min_int, int_info->huge);
213 mpz_init (int_info->min_int);
214 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
216 mpz_init (int_info->max_int);
217 mpz_add (int_info->max_int, int_info->huge, int_info->huge);
218 mpz_add_ui (int_info->max_int, int_info->max_int, 1);
221 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
222 mpfr_log10 (a, a, GFC_RND_MODE);
224 gfc_mpfr_to_mpz (r, a);
225 int_info->range = mpz_get_si (r);
230 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
232 gfc_set_model_kind (real_info->kind);
238 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
239 /* a = 1 - b**(-p) */
240 mpfr_set_ui (a, 1, GFC_RND_MODE);
241 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
242 mpfr_pow_si (b, b, -real_info->digits, GFC_RND_MODE);
243 mpfr_sub (a, a, b, GFC_RND_MODE);
245 /* c = b**(emax-1) */
246 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
247 mpfr_pow_ui (c, b, real_info->max_exponent - 1, GFC_RND_MODE);
249 /* a = a * c = (1 - b**(-p)) * b**(emax-1) */
250 mpfr_mul (a, a, c, GFC_RND_MODE);
252 /* a = (1 - b**(-p)) * b**(emax-1) * b */
253 mpfr_mul_ui (a, a, real_info->radix, GFC_RND_MODE);
255 mpfr_init (real_info->huge);
256 mpfr_set (real_info->huge, a, GFC_RND_MODE);
258 /* tiny(x) = b**(emin-1) */
259 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
260 mpfr_pow_si (b, b, real_info->min_exponent - 1, GFC_RND_MODE);
262 mpfr_init (real_info->tiny);
263 mpfr_set (real_info->tiny, b, GFC_RND_MODE);
265 /* epsilon(x) = b**(1-p) */
266 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
267 mpfr_pow_si (b, b, 1 - real_info->digits, GFC_RND_MODE);
269 mpfr_init (real_info->epsilon);
270 mpfr_set (real_info->epsilon, b, GFC_RND_MODE);
272 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
273 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
274 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
275 mpfr_neg (b, b, GFC_RND_MODE);
277 if (mpfr_cmp (a, b) > 0)
278 mpfr_set (a, b, GFC_RND_MODE); /* a = min(a, b) */
281 gfc_mpfr_to_mpz (r, a);
282 real_info->range = mpz_get_si (r);
284 /* precision(x) = int((p - 1) * log10(b)) + k */
285 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
286 mpfr_log10 (a, a, GFC_RND_MODE);
288 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
290 gfc_mpfr_to_mpz (r, a);
291 real_info->precision = mpz_get_si (r);
293 /* If the radix is an integral power of 10, add one to the
295 for (i = 10; i <= real_info->radix; i *= 10)
296 if (i == real_info->radix)
297 real_info->precision++;
308 /* Clean up, get rid of numeric constants. */
311 gfc_arith_done_1 (void)
313 gfc_integer_info *ip;
316 for (ip = gfc_integer_kinds; ip->kind; ip++)
318 mpz_clear (ip->min_int);
319 mpz_clear (ip->max_int);
320 mpz_clear (ip->huge);
323 for (rp = gfc_real_kinds; rp->kind; rp++)
325 mpfr_clear (rp->epsilon);
326 mpfr_clear (rp->huge);
327 mpfr_clear (rp->tiny);
332 /* Given an integer and a kind, make sure that the integer lies within
333 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
337 gfc_check_integer_range (mpz_t p, int kind)
342 i = gfc_validate_kind (BT_INTEGER, kind, false);
347 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
348 result = ARITH_ASYMMETRIC;
351 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
352 || mpz_cmp (p, gfc_integer_kinds[i].max_int) > 0)
353 result = ARITH_OVERFLOW;
359 /* Given a real and a kind, make sure that the real lies within the
360 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
364 gfc_check_real_range (mpfr_t p, int kind)
370 i = gfc_validate_kind (BT_REAL, kind, false);
374 mpfr_abs (q, p, GFC_RND_MODE);
376 if (mpfr_sgn (q) == 0)
378 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
379 retval = ARITH_OVERFLOW;
380 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
381 retval = ARITH_UNDERFLOW;
391 /* Function to return a constant expression node of a given type and
395 gfc_constant_result (bt type, int kind, locus * where)
401 ("gfc_constant_result(): locus 'where' cannot be NULL");
403 result = gfc_get_expr ();
405 result->expr_type = EXPR_CONSTANT;
406 result->ts.type = type;
407 result->ts.kind = kind;
408 result->where = *where;
413 mpz_init (result->value.integer);
417 gfc_set_model_kind (kind);
418 mpfr_init (result->value.real);
422 gfc_set_model_kind (kind);
423 mpfr_init (result->value.complex.r);
424 mpfr_init (result->value.complex.i);
435 /* Low-level arithmetic functions. All of these subroutines assume
436 that all operands are of the same type and return an operand of the
437 same type. The other thing about these subroutines is that they
438 can fail in various ways -- overflow, underflow, division by zero,
439 zero raised to the zero, etc. */
442 gfc_arith_not (gfc_expr * op1, gfc_expr ** resultp)
446 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
447 result->value.logical = !op1->value.logical;
455 gfc_arith_and (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
459 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
461 result->value.logical = op1->value.logical && op2->value.logical;
469 gfc_arith_or (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
473 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
475 result->value.logical = op1->value.logical || op2->value.logical;
483 gfc_arith_eqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
487 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
489 result->value.logical = op1->value.logical == op2->value.logical;
497 gfc_arith_neqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
501 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
503 result->value.logical = op1->value.logical != op2->value.logical;
510 /* Make sure a constant numeric expression is within the range for
511 its type and kind. Note that there's also a gfc_check_range(),
512 but that one deals with the intrinsic RANGE function. */
515 gfc_range_check (gfc_expr * e)
522 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
526 rc = gfc_check_real_range (e->value.real, e->ts.kind);
527 if (rc == ARITH_UNDERFLOW)
528 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
532 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
533 if (rc == ARITH_UNDERFLOW)
534 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
535 if (rc == ARITH_OK || rc == ARITH_UNDERFLOW)
537 rc = gfc_check_real_range (e->value.complex.i, e->ts.kind);
538 if (rc == ARITH_UNDERFLOW)
539 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
545 gfc_internal_error ("gfc_range_check(): Bad type");
552 /* Several of the following routines use the same set of statements to
553 check the validity of the result. Encapsulate the checking here. */
556 check_result (arith rc, gfc_expr * x, gfc_expr * r, gfc_expr ** rp)
562 if (rc == ARITH_UNDERFLOW && gfc_option.warn_underflow)
563 gfc_warning ("%s at %L", gfc_arith_error (rc), &x->where);
565 if (rc == ARITH_ASYMMETRIC)
566 gfc_warning ("%s at %L", gfc_arith_error (rc), &x->where);
576 /* It may seem silly to have a subroutine that actually computes the
577 unary plus of a constant, but it prevents us from making exceptions
578 in the code elsewhere. */
581 gfc_arith_uplus (gfc_expr * op1, gfc_expr ** resultp)
583 *resultp = gfc_copy_expr (op1);
589 gfc_arith_uminus (gfc_expr * op1, gfc_expr ** resultp)
594 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
596 switch (op1->ts.type)
599 mpz_neg (result->value.integer, op1->value.integer);
603 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
607 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
608 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
612 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
615 rc = gfc_range_check (result);
617 return check_result (rc, op1, result, resultp);
622 gfc_arith_plus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
627 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
629 switch (op1->ts.type)
632 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
636 mpfr_add (result->value.real, op1->value.real, op2->value.real,
641 mpfr_add (result->value.complex.r, op1->value.complex.r,
642 op2->value.complex.r, GFC_RND_MODE);
644 mpfr_add (result->value.complex.i, op1->value.complex.i,
645 op2->value.complex.i, GFC_RND_MODE);
649 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
652 rc = gfc_range_check (result);
654 return check_result (rc, op1, result, resultp);
659 gfc_arith_minus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
664 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
666 switch (op1->ts.type)
669 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
673 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
678 mpfr_sub (result->value.complex.r, op1->value.complex.r,
679 op2->value.complex.r, GFC_RND_MODE);
681 mpfr_sub (result->value.complex.i, op1->value.complex.i,
682 op2->value.complex.i, GFC_RND_MODE);
686 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
689 rc = gfc_range_check (result);
691 return check_result (rc, op1, result, resultp);
696 gfc_arith_times (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
702 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
704 switch (op1->ts.type)
707 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
711 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
717 /* FIXME: possible numericals problem. */
719 gfc_set_model (op1->value.complex.r);
723 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
724 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
725 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
727 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
728 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
729 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
737 gfc_internal_error ("gfc_arith_times(): Bad basic type");
740 rc = gfc_range_check (result);
742 return check_result (rc, op1, result, resultp);
747 gfc_arith_divide (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
755 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
757 switch (op1->ts.type)
760 if (mpz_sgn (op2->value.integer) == 0)
766 mpz_tdiv_q (result->value.integer, op1->value.integer,
771 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
772 if (mpfr_sgn (op2->value.real) == 0)
778 mpfr_div (result->value.real, op1->value.real, op2->value.real,
783 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
784 if (mpfr_sgn (op2->value.complex.r) == 0
785 && mpfr_sgn (op2->value.complex.i) == 0)
791 gfc_set_model (op1->value.complex.r);
796 /* FIXME: possible numerical problems. */
797 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
798 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
799 mpfr_add (div, x, y, GFC_RND_MODE);
801 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
802 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
803 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
804 mpfr_div (result->value.complex.r, result->value.complex.r, div,
807 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
808 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
809 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
810 mpfr_div (result->value.complex.i, result->value.complex.i, div,
820 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
824 rc = gfc_range_check (result);
826 return check_result (rc, op1, result, resultp);
830 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
833 complex_reciprocal (gfc_expr * op)
835 mpfr_t mod, a, re, im;
837 gfc_set_model (op->value.complex.r);
843 /* FIXME: another possible numerical problem. */
844 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
845 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
846 mpfr_add (mod, mod, a, GFC_RND_MODE);
848 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
850 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
851 mpfr_div (im, im, mod, GFC_RND_MODE);
853 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
854 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
863 /* Raise a complex number to positive power. */
866 complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
870 gfc_set_model (base->value.complex.r);
875 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
876 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
878 for (; power > 0; power--)
880 mpfr_mul (re, base->value.complex.r, result->value.complex.r,
882 mpfr_mul (a, base->value.complex.i, result->value.complex.i,
884 mpfr_sub (re, re, a, GFC_RND_MODE);
886 mpfr_mul (im, base->value.complex.r, result->value.complex.i,
888 mpfr_mul (a, base->value.complex.i, result->value.complex.r,
890 mpfr_add (im, im, a, GFC_RND_MODE);
892 mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
893 mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
902 /* Raise a number to an integer power. */
905 gfc_arith_power (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
915 if (gfc_extract_int (op2, &power) != NULL)
916 gfc_internal_error ("gfc_arith_power(): Bad exponent");
918 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
921 { /* Handle something to the zeroth power */
922 switch (op1->ts.type)
925 if (mpz_sgn (op1->value.integer) == 0)
928 mpz_set_ui (result->value.integer, 1);
932 if (mpfr_sgn (op1->value.real) == 0)
935 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
939 if (mpfr_sgn (op1->value.complex.r) == 0
940 && mpfr_sgn (op1->value.complex.i) == 0)
944 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
945 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
951 gfc_internal_error ("gfc_arith_power(): Bad base");
960 switch (op1->ts.type)
963 mpz_pow_ui (result->value.integer, op1->value.integer, apower);
967 mpz_init_set_ui (unity_z, 1);
968 mpz_tdiv_q (result->value.integer, unity_z,
969 result->value.integer);
976 mpfr_pow_ui (result->value.real, op1->value.real, apower,
981 gfc_set_model (op1->value.real);
983 mpfr_set_ui (unity_f, 1, GFC_RND_MODE);
984 mpfr_div (result->value.real, unity_f, result->value.real,
986 mpfr_clear (unity_f);
991 complex_pow_ui (op1, apower, result);
993 complex_reciprocal (result);
1002 rc = gfc_range_check (result);
1004 return check_result (rc, op1, result, resultp);
1008 /* Concatenate two string constants. */
1011 gfc_arith_concat (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1016 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
1019 len = op1->value.character.length + op2->value.character.length;
1021 result->value.character.string = gfc_getmem (len + 1);
1022 result->value.character.length = len;
1024 memcpy (result->value.character.string, op1->value.character.string,
1025 op1->value.character.length);
1027 memcpy (result->value.character.string + op1->value.character.length,
1028 op2->value.character.string, op2->value.character.length);
1030 result->value.character.string[len] = '\0';
1038 /* Comparison operators. Assumes that the two expression nodes
1039 contain two constants of the same type. */
1042 gfc_compare_expr (gfc_expr * op1, gfc_expr * op2)
1046 switch (op1->ts.type)
1049 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1053 rc = mpfr_cmp (op1->value.real, op2->value.real);
1057 rc = gfc_compare_string (op1, op2, NULL);
1061 rc = ((!op1->value.logical && op2->value.logical)
1062 || (op1->value.logical && !op2->value.logical));
1066 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1073 /* Compare a pair of complex numbers. Naturally, this is only for
1074 equality/nonequality. */
1077 compare_complex (gfc_expr * op1, gfc_expr * op2)
1079 return (mpfr_cmp (op1->value.complex.r, op2->value.complex.r) == 0
1080 && mpfr_cmp (op1->value.complex.i, op2->value.complex.i) == 0);
1084 /* Given two constant strings and the inverse collating sequence,
1085 compare the strings. We return -1 for a<b, 0 for a==b and 1 for
1086 a>b. If the xcoll_table is NULL, we use the processor's default
1087 collating sequence. */
1090 gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
1092 int len, alen, blen, i, ac, bc;
1094 alen = a->value.character.length;
1095 blen = b->value.character.length;
1097 len = (alen > blen) ? alen : blen;
1099 for (i = 0; i < len; i++)
1101 ac = (i < alen) ? a->value.character.string[i] : ' ';
1102 bc = (i < blen) ? b->value.character.string[i] : ' ';
1104 if (xcoll_table != NULL)
1106 ac = xcoll_table[ac];
1107 bc = xcoll_table[bc];
1116 /* Strings are equal */
1122 /* Specific comparison subroutines. */
1125 gfc_arith_eq (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1129 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1131 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1132 compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) == 0);
1140 gfc_arith_ne (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1144 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1146 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1147 !compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) != 0);
1155 gfc_arith_gt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1159 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1161 result->value.logical = (gfc_compare_expr (op1, op2) > 0);
1169 gfc_arith_ge (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1173 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1175 result->value.logical = (gfc_compare_expr (op1, op2) >= 0);
1183 gfc_arith_lt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1187 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1189 result->value.logical = (gfc_compare_expr (op1, op2) < 0);
1197 gfc_arith_le (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1201 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1203 result->value.logical = (gfc_compare_expr (op1, op2) <= 0);
1211 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr * op,
1214 gfc_constructor *c, *head;
1218 if (op->expr_type == EXPR_CONSTANT)
1219 return eval (op, result);
1222 head = gfc_copy_constructor (op->value.constructor);
1224 for (c = head; c; c = c->next)
1226 rc = eval (c->expr, &r);
1230 gfc_replace_expr (c->expr, r);
1234 gfc_free_constructor (head);
1237 r = gfc_get_expr ();
1238 r->expr_type = EXPR_ARRAY;
1239 r->value.constructor = head;
1240 r->shape = gfc_copy_shape (op->shape, op->rank);
1242 r->ts = head->expr->ts;
1243 r->where = op->where;
1254 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1255 gfc_expr * op1, gfc_expr * op2,
1258 gfc_constructor *c, *head;
1262 head = gfc_copy_constructor (op1->value.constructor);
1265 for (c = head; c; c = c->next)
1267 rc = eval (c->expr, op2, &r);
1271 gfc_replace_expr (c->expr, r);
1275 gfc_free_constructor (head);
1278 r = gfc_get_expr ();
1279 r->expr_type = EXPR_ARRAY;
1280 r->value.constructor = head;
1281 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1283 r->ts = head->expr->ts;
1284 r->where = op1->where;
1285 r->rank = op1->rank;
1295 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1296 gfc_expr * op1, gfc_expr * op2,
1299 gfc_constructor *c, *head;
1303 head = gfc_copy_constructor (op2->value.constructor);
1306 for (c = head; c; c = c->next)
1308 rc = eval (op1, c->expr, &r);
1312 gfc_replace_expr (c->expr, r);
1316 gfc_free_constructor (head);
1319 r = gfc_get_expr ();
1320 r->expr_type = EXPR_ARRAY;
1321 r->value.constructor = head;
1322 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1324 r->ts = head->expr->ts;
1325 r->where = op2->where;
1326 r->rank = op2->rank;
1336 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1337 gfc_expr * op1, gfc_expr * op2,
1340 gfc_constructor *c, *d, *head;
1344 head = gfc_copy_constructor (op1->value.constructor);
1347 d = op2->value.constructor;
1349 if (gfc_check_conformance ("Elemental binary operation", op1, op2)
1351 rc = ARITH_INCOMMENSURATE;
1355 for (c = head; c; c = c->next, d = d->next)
1359 rc = ARITH_INCOMMENSURATE;
1363 rc = eval (c->expr, d->expr, &r);
1367 gfc_replace_expr (c->expr, r);
1371 rc = ARITH_INCOMMENSURATE;
1375 gfc_free_constructor (head);
1378 r = gfc_get_expr ();
1379 r->expr_type = EXPR_ARRAY;
1380 r->value.constructor = head;
1381 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1383 r->ts = head->expr->ts;
1384 r->where = op1->where;
1385 r->rank = op1->rank;
1395 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1396 gfc_expr * op1, gfc_expr * op2,
1399 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1400 return eval (op1, op2, result);
1402 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1403 return reduce_binary_ca (eval, op1, op2, result);
1405 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1406 return reduce_binary_ac (eval, op1, op2, result);
1408 return reduce_binary_aa (eval, op1, op2, result);
1414 arith (*f2)(gfc_expr *, gfc_expr **);
1415 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1419 /* High level arithmetic subroutines. These subroutines go into
1420 eval_intrinsic(), which can do one of several things to its
1421 operands. If the operands are incompatible with the intrinsic
1422 operation, we return a node pointing to the operands and hope that
1423 an operator interface is found during resolution.
1425 If the operands are compatible and are constants, then we try doing
1426 the arithmetic. We also handle the cases where either or both
1427 operands are array constructors. */
1430 eval_intrinsic (gfc_intrinsic_op operator,
1431 eval_f eval, gfc_expr * op1, gfc_expr * op2)
1433 gfc_expr temp, *result;
1437 gfc_clear_ts (&temp.ts);
1441 case INTRINSIC_NOT: /* Logical unary */
1442 if (op1->ts.type != BT_LOGICAL)
1445 temp.ts.type = BT_LOGICAL;
1446 temp.ts.kind = gfc_default_logical_kind;
1451 /* Logical binary operators */
1454 case INTRINSIC_NEQV:
1456 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1459 temp.ts.type = BT_LOGICAL;
1460 temp.ts.kind = gfc_default_logical_kind;
1465 case INTRINSIC_UPLUS:
1466 case INTRINSIC_UMINUS: /* Numeric unary */
1467 if (!gfc_numeric_ts (&op1->ts))
1476 case INTRINSIC_LT: /* Additional restrictions */
1477 case INTRINSIC_LE: /* for ordering relations. */
1479 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1481 temp.ts.type = BT_LOGICAL;
1482 temp.ts.kind = gfc_default_logical_kind;
1486 /* else fall through */
1490 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1493 temp.ts.type = BT_LOGICAL;
1494 temp.ts.kind = gfc_default_logical_kind;
1498 /* else fall through */
1500 case INTRINSIC_PLUS:
1501 case INTRINSIC_MINUS:
1502 case INTRINSIC_TIMES:
1503 case INTRINSIC_DIVIDE:
1504 case INTRINSIC_POWER: /* Numeric binary */
1505 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1508 /* Insert any necessary type conversions to make the operands compatible. */
1510 temp.expr_type = EXPR_OP;
1511 gfc_clear_ts (&temp.ts);
1512 temp.value.op.operator = operator;
1514 temp.value.op.op1 = op1;
1515 temp.value.op.op2 = op2;
1517 gfc_type_convert_binary (&temp);
1519 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1520 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1521 || operator == INTRINSIC_LE || operator == INTRINSIC_LT)
1523 temp.ts.type = BT_LOGICAL;
1524 temp.ts.kind = gfc_default_logical_kind;
1530 case INTRINSIC_CONCAT: /* Character binary */
1531 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1534 temp.ts.type = BT_CHARACTER;
1535 temp.ts.kind = gfc_default_character_kind;
1540 case INTRINSIC_USER:
1544 gfc_internal_error ("eval_intrinsic(): Bad operator");
1547 /* Try to combine the operators. */
1548 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1551 if (op1->expr_type != EXPR_CONSTANT
1552 && (op1->expr_type != EXPR_ARRAY
1553 || !gfc_is_constant_expr (op1)
1554 || !gfc_expanded_ac (op1)))
1558 && op2->expr_type != EXPR_CONSTANT
1559 && (op2->expr_type != EXPR_ARRAY
1560 || !gfc_is_constant_expr (op2)
1561 || !gfc_expanded_ac (op2)))
1565 rc = reduce_unary (eval.f2, op1, &result);
1567 rc = reduce_binary (eval.f3, op1, op2, &result);
1570 { /* Something went wrong */
1571 gfc_error ("%s at %L", gfc_arith_error (rc), &op1->where);
1575 gfc_free_expr (op1);
1576 gfc_free_expr (op2);
1580 /* Create a run-time expression */
1581 result = gfc_get_expr ();
1582 result->ts = temp.ts;
1584 result->expr_type = EXPR_OP;
1585 result->value.op.operator = operator;
1587 result->value.op.op1 = op1;
1588 result->value.op.op2 = op2;
1590 result->where = op1->where;
1596 /* Modify type of expression for zero size array. */
1598 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1601 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1611 op->ts.type = BT_LOGICAL;
1612 op->ts.kind = gfc_default_logical_kind;
1623 /* Return nonzero if the expression is a zero size array. */
1626 gfc_zero_size_array (gfc_expr * e)
1628 if (e->expr_type != EXPR_ARRAY)
1631 return e->value.constructor == NULL;
1635 /* Reduce a binary expression where at least one of the operands
1636 involves a zero-length array. Returns NULL if neither of the
1637 operands is a zero-length array. */
1640 reduce_binary0 (gfc_expr * op1, gfc_expr * op2)
1642 if (gfc_zero_size_array (op1))
1644 gfc_free_expr (op2);
1648 if (gfc_zero_size_array (op2))
1650 gfc_free_expr (op1);
1659 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1660 arith (*eval) (gfc_expr *, gfc_expr **),
1661 gfc_expr * op1, gfc_expr * op2)
1668 if (gfc_zero_size_array (op1))
1669 return eval_type_intrinsic0 (operator, op1);
1673 result = reduce_binary0 (op1, op2);
1675 return eval_type_intrinsic0 (operator, result);
1679 return eval_intrinsic (operator, f, op1, op2);
1684 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1685 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1686 gfc_expr * op1, gfc_expr * op2)
1691 result = reduce_binary0 (op1, op2);
1693 return eval_type_intrinsic0(operator, result);
1696 return eval_intrinsic (operator, f, op1, op2);
1702 gfc_uplus (gfc_expr * op)
1704 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_uplus, op, NULL);
1708 gfc_uminus (gfc_expr * op)
1710 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1714 gfc_add (gfc_expr * op1, gfc_expr * op2)
1716 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1720 gfc_subtract (gfc_expr * op1, gfc_expr * op2)
1722 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1726 gfc_multiply (gfc_expr * op1, gfc_expr * op2)
1728 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1732 gfc_divide (gfc_expr * op1, gfc_expr * op2)
1734 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1738 gfc_power (gfc_expr * op1, gfc_expr * op2)
1740 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1744 gfc_concat (gfc_expr * op1, gfc_expr * op2)
1746 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1750 gfc_and (gfc_expr * op1, gfc_expr * op2)
1752 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1756 gfc_or (gfc_expr * op1, gfc_expr * op2)
1758 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1762 gfc_not (gfc_expr * op1)
1764 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1768 gfc_eqv (gfc_expr * op1, gfc_expr * op2)
1770 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1774 gfc_neqv (gfc_expr * op1, gfc_expr * op2)
1776 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1780 gfc_eq (gfc_expr * op1, gfc_expr * op2)
1782 return eval_intrinsic_f3 (INTRINSIC_EQ, gfc_arith_eq, op1, op2);
1786 gfc_ne (gfc_expr * op1, gfc_expr * op2)
1788 return eval_intrinsic_f3 (INTRINSIC_NE, gfc_arith_ne, op1, op2);
1792 gfc_gt (gfc_expr * op1, gfc_expr * op2)
1794 return eval_intrinsic_f3 (INTRINSIC_GT, gfc_arith_gt, op1, op2);
1798 gfc_ge (gfc_expr * op1, gfc_expr * op2)
1800 return eval_intrinsic_f3 (INTRINSIC_GE, gfc_arith_ge, op1, op2);
1804 gfc_lt (gfc_expr * op1, gfc_expr * op2)
1806 return eval_intrinsic_f3 (INTRINSIC_LT, gfc_arith_lt, op1, op2);
1810 gfc_le (gfc_expr * op1, gfc_expr * op2)
1812 return eval_intrinsic_f3 (INTRINSIC_LE, gfc_arith_le, op1, op2);
1816 /* Convert an integer string to an expression node. */
1819 gfc_convert_integer (const char *buffer, int kind, int radix, locus * where)
1824 e = gfc_constant_result (BT_INTEGER, kind, where);
1825 /* a leading plus is allowed, but not by mpz_set_str */
1826 if (buffer[0] == '+')
1830 mpz_set_str (e->value.integer, t, radix);
1836 /* Convert a real string to an expression node. */
1839 gfc_convert_real (const char *buffer, int kind, locus * where)
1843 e = gfc_constant_result (BT_REAL, kind, where);
1844 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
1850 /* Convert a pair of real, constant expression nodes to a single
1851 complex expression node. */
1854 gfc_convert_complex (gfc_expr * real, gfc_expr * imag, int kind)
1858 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
1859 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
1860 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
1866 /******* Simplification of intrinsic functions with constant arguments *****/
1869 /* Deal with an arithmetic error. */
1872 arith_error (arith rc, gfc_typespec * from, gfc_typespec * to, locus * where)
1874 gfc_error ("%s converting %s to %s at %L", gfc_arith_error (rc),
1875 gfc_typename (from), gfc_typename (to), where);
1877 /* TODO: Do something about the error, ie, throw exception, return
1881 /* Convert integers to integers. */
1884 gfc_int2int (gfc_expr * src, int kind)
1889 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1891 mpz_set (result->value.integer, src->value.integer);
1893 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1896 if (rc == ARITH_ASYMMETRIC)
1898 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
1902 arith_error (rc, &src->ts, &result->ts, &src->where);
1903 gfc_free_expr (result);
1912 /* Convert integers to reals. */
1915 gfc_int2real (gfc_expr * src, int kind)
1920 result = gfc_constant_result (BT_REAL, kind, &src->where);
1922 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
1924 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
1926 arith_error (rc, &src->ts, &result->ts, &src->where);
1927 gfc_free_expr (result);
1935 /* Convert default integer to default complex. */
1938 gfc_int2complex (gfc_expr * src, int kind)
1943 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
1945 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
1946 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1948 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
1950 arith_error (rc, &src->ts, &result->ts, &src->where);
1951 gfc_free_expr (result);
1959 /* Convert default real to default integer. */
1962 gfc_real2int (gfc_expr * src, int kind)
1967 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1969 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
1971 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1974 arith_error (rc, &src->ts, &result->ts, &src->where);
1975 gfc_free_expr (result);
1983 /* Convert real to real. */
1986 gfc_real2real (gfc_expr * src, int kind)
1991 result = gfc_constant_result (BT_REAL, kind, &src->where);
1993 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
1995 rc = gfc_check_real_range (result->value.real, kind);
1997 if (rc == ARITH_UNDERFLOW)
1999 if (gfc_option.warn_underflow)
2000 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2001 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2003 else if (rc != ARITH_OK)
2005 arith_error (rc, &src->ts, &result->ts, &src->where);
2006 gfc_free_expr (result);
2014 /* Convert real to complex. */
2017 gfc_real2complex (gfc_expr * src, int kind)
2022 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2024 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2025 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2027 rc = gfc_check_real_range (result->value.complex.r, kind);
2029 if (rc == ARITH_UNDERFLOW)
2031 if (gfc_option.warn_underflow)
2032 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2033 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2035 else if (rc != ARITH_OK)
2037 arith_error (rc, &src->ts, &result->ts, &src->where);
2038 gfc_free_expr (result);
2046 /* Convert complex to integer. */
2049 gfc_complex2int (gfc_expr * src, int kind)
2054 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2056 gfc_mpfr_to_mpz (result->value.integer, src->value.complex.r);
2058 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2061 arith_error (rc, &src->ts, &result->ts, &src->where);
2062 gfc_free_expr (result);
2070 /* Convert complex to real. */
2073 gfc_complex2real (gfc_expr * src, int kind)
2078 result = gfc_constant_result (BT_REAL, kind, &src->where);
2080 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2082 rc = gfc_check_real_range (result->value.real, kind);
2084 if (rc == ARITH_UNDERFLOW)
2086 if (gfc_option.warn_underflow)
2087 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2088 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2092 arith_error (rc, &src->ts, &result->ts, &src->where);
2093 gfc_free_expr (result);
2101 /* Convert complex to complex. */
2104 gfc_complex2complex (gfc_expr * src, int kind)
2109 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2111 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2112 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2114 rc = gfc_check_real_range (result->value.complex.r, kind);
2116 if (rc == ARITH_UNDERFLOW)
2118 if (gfc_option.warn_underflow)
2119 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2120 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2122 else if (rc != ARITH_OK)
2124 arith_error (rc, &src->ts, &result->ts, &src->where);
2125 gfc_free_expr (result);
2129 rc = gfc_check_real_range (result->value.complex.i, kind);
2131 if (rc == ARITH_UNDERFLOW)
2133 if (gfc_option.warn_underflow)
2134 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2135 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2137 else if (rc != ARITH_OK)
2139 arith_error (rc, &src->ts, &result->ts, &src->where);
2140 gfc_free_expr (result);
2148 /* Logical kind conversion. */
2151 gfc_log2log (gfc_expr * src, int kind)
2155 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2156 result->value.logical = src->value.logical;