2 Copyright (C) 2000, 2001, 2002, 2003, 2004 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. */
33 /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
34 It's easily implemented with a few calls though. */
37 gfc_mpfr_to_mpz (mpz_t z, mpfr_t x)
41 e = mpfr_get_z_exp (z, x);
42 /* MPFR 2.0.1 (included with GMP 4.1) has a bug whereby mpfr_get_z_exp
43 may set the sign of z incorrectly. Work around that here. */
44 if (mpfr_sgn (x) != mpz_sgn (z))
48 mpz_mul_2exp (z, z, e);
50 mpz_tdiv_q_2exp (z, z, -e);
54 /* Set the model number precision by the requested KIND. */
57 gfc_set_model_kind (int kind)
59 int index = gfc_validate_kind (BT_REAL, kind, false);
62 base2prec = gfc_real_kinds[index].digits;
63 if (gfc_real_kinds[index].radix != 2)
64 base2prec *= gfc_real_kinds[index].radix / 2;
65 mpfr_set_default_prec (base2prec);
69 /* Set the model number precision from mpfr_t x. */
72 gfc_set_model (mpfr_t x)
74 mpfr_set_default_prec (mpfr_get_prec (x));
77 /* Calculate atan2 (y, x)
79 atan2(y, x) = atan(y/x) if x > 0,
80 sign(y)*(pi - atan(|y/x|)) if x < 0,
82 sign(y)*pi/2 if x = 0 && y != 0.
86 arctangent2 (mpfr_t y, mpfr_t x, mpfr_t result)
98 mpfr_div (t, y, x, GFC_RND_MODE);
99 mpfr_atan (result, t, GFC_RND_MODE);
103 mpfr_const_pi (result, GFC_RND_MODE);
104 mpfr_div (t, y, x, GFC_RND_MODE);
105 mpfr_abs (t, t, GFC_RND_MODE);
106 mpfr_atan (t, t, GFC_RND_MODE);
107 mpfr_sub (result, result, t, GFC_RND_MODE);
108 if (mpfr_sgn (y) < 0)
109 mpfr_neg (result, result, GFC_RND_MODE);
113 if (mpfr_sgn (y) == 0)
114 mpfr_set_ui (result, 0, GFC_RND_MODE);
117 mpfr_const_pi (result, GFC_RND_MODE);
118 mpfr_div_ui (result, result, 2, GFC_RND_MODE);
119 if (mpfr_sgn (y) < 0)
120 mpfr_neg (result, result, GFC_RND_MODE);
129 /* Given an arithmetic error code, return a pointer to a string that
130 explains the error. */
133 gfc_arith_error (arith code)
143 p = "Arithmetic overflow";
145 case ARITH_UNDERFLOW:
146 p = "Arithmetic underflow";
149 p = "Arithmetic NaN";
152 p = "Division by zero";
155 p = "Indeterminate form 0 ** 0";
157 case ARITH_INCOMMENSURATE:
158 p = "Array operands are incommensurate";
161 gfc_internal_error ("gfc_arith_error(): Bad error code");
168 /* Get things ready to do math. */
171 gfc_arith_init_1 (void)
173 gfc_integer_info *int_info;
174 gfc_real_info *real_info;
179 mpfr_set_default_prec (128);
183 /* Convert the minimum/maximum values for each kind into their
184 GNU MP representation. */
185 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
188 mpz_set_ui (r, int_info->radix);
189 mpz_pow_ui (r, r, int_info->digits);
191 mpz_init (int_info->huge);
192 mpz_sub_ui (int_info->huge, r, 1);
194 /* These are the numbers that are actually representable by the
195 target. For bases other than two, this needs to be changed. */
196 if (int_info->radix != 2)
197 gfc_internal_error ("Fix min_int, max_int calculation");
199 mpz_init (int_info->min_int);
200 mpz_neg (int_info->min_int, int_info->huge);
201 /* No -1 here, because the representation is symmetric. */
203 mpz_init (int_info->max_int);
204 mpz_add (int_info->max_int, int_info->huge, int_info->huge);
205 mpz_add_ui (int_info->max_int, int_info->max_int, 1);
208 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
209 mpfr_log10 (a, a, GFC_RND_MODE);
211 gfc_mpfr_to_mpz (r, a);
212 int_info->range = mpz_get_si (r);
217 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
219 gfc_set_model_kind (real_info->kind);
225 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
226 /* a = 1 - b**(-p) */
227 mpfr_set_ui (a, 1, GFC_RND_MODE);
228 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
229 mpfr_pow_si (b, b, -real_info->digits, GFC_RND_MODE);
230 mpfr_sub (a, a, b, GFC_RND_MODE);
232 /* c = b**(emax-1) */
233 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
234 mpfr_pow_ui (c, b, real_info->max_exponent - 1, GFC_RND_MODE);
236 /* a = a * c = (1 - b**(-p)) * b**(emax-1) */
237 mpfr_mul (a, a, c, GFC_RND_MODE);
239 /* a = (1 - b**(-p)) * b**(emax-1) * b */
240 mpfr_mul_ui (a, a, real_info->radix, GFC_RND_MODE);
242 mpfr_init (real_info->huge);
243 mpfr_set (real_info->huge, a, GFC_RND_MODE);
245 /* tiny(x) = b**(emin-1) */
246 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
247 mpfr_pow_si (b, b, real_info->min_exponent - 1, GFC_RND_MODE);
249 mpfr_init (real_info->tiny);
250 mpfr_set (real_info->tiny, b, GFC_RND_MODE);
252 /* epsilon(x) = b**(1-p) */
253 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
254 mpfr_pow_si (b, b, 1 - real_info->digits, GFC_RND_MODE);
256 mpfr_init (real_info->epsilon);
257 mpfr_set (real_info->epsilon, b, GFC_RND_MODE);
259 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
260 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
261 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
262 mpfr_neg (b, b, GFC_RND_MODE);
264 if (mpfr_cmp (a, b) > 0)
265 mpfr_set (a, b, GFC_RND_MODE); /* a = min(a, b) */
268 gfc_mpfr_to_mpz (r, a);
269 real_info->range = mpz_get_si (r);
271 /* precision(x) = int((p - 1) * log10(b)) + k */
272 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
273 mpfr_log10 (a, a, GFC_RND_MODE);
275 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
277 gfc_mpfr_to_mpz (r, a);
278 real_info->precision = mpz_get_si (r);
280 /* If the radix is an integral power of 10, add one to the
282 for (i = 10; i <= real_info->radix; i *= 10)
283 if (i == real_info->radix)
284 real_info->precision++;
295 /* Clean up, get rid of numeric constants. */
298 gfc_arith_done_1 (void)
300 gfc_integer_info *ip;
303 for (ip = gfc_integer_kinds; ip->kind; ip++)
305 mpz_clear (ip->min_int);
306 mpz_clear (ip->max_int);
307 mpz_clear (ip->huge);
310 for (rp = gfc_real_kinds; rp->kind; rp++)
312 mpfr_clear (rp->epsilon);
313 mpfr_clear (rp->huge);
314 mpfr_clear (rp->tiny);
319 /* Given an integer and a kind, make sure that the integer lies within
320 the range of the kind. Returns ARITH_OK or ARITH_OVERFLOW. */
323 gfc_check_integer_range (mpz_t p, int kind)
328 i = gfc_validate_kind (BT_INTEGER, kind, false);
331 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
332 || mpz_cmp (p, gfc_integer_kinds[i].max_int) > 0)
333 result = ARITH_OVERFLOW;
339 /* Given a real and a kind, make sure that the real lies within the
340 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
344 gfc_check_real_range (mpfr_t p, int kind)
350 i = gfc_validate_kind (BT_REAL, kind, false);
354 mpfr_abs (q, p, GFC_RND_MODE);
357 if (mpfr_sgn (q) == 0)
360 if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
362 retval = ARITH_OVERFLOW;
366 if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
367 retval = ARITH_UNDERFLOW;
376 /* Function to return a constant expression node of a given type and
380 gfc_constant_result (bt type, int kind, locus * where)
386 ("gfc_constant_result(): locus 'where' cannot be NULL");
388 result = gfc_get_expr ();
390 result->expr_type = EXPR_CONSTANT;
391 result->ts.type = type;
392 result->ts.kind = kind;
393 result->where = *where;
398 mpz_init (result->value.integer);
402 gfc_set_model_kind (kind);
403 mpfr_init (result->value.real);
407 gfc_set_model_kind (kind);
408 mpfr_init (result->value.complex.r);
409 mpfr_init (result->value.complex.i);
420 /* Low-level arithmetic functions. All of these subroutines assume
421 that all operands are of the same type and return an operand of the
422 same type. The other thing about these subroutines is that they
423 can fail in various ways -- overflow, underflow, division by zero,
424 zero raised to the zero, etc. */
427 gfc_arith_not (gfc_expr * op1, gfc_expr ** resultp)
431 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
432 result->value.logical = !op1->value.logical;
440 gfc_arith_and (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
444 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
446 result->value.logical = op1->value.logical && op2->value.logical;
454 gfc_arith_or (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
458 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
460 result->value.logical = op1->value.logical || op2->value.logical;
468 gfc_arith_eqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
472 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
474 result->value.logical = op1->value.logical == op2->value.logical;
482 gfc_arith_neqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
486 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
488 result->value.logical = op1->value.logical != op2->value.logical;
495 /* Make sure a constant numeric expression is within the range for
496 its type and kind. Note that there's also a gfc_check_range(),
497 but that one deals with the intrinsic RANGE function. */
500 gfc_range_check (gfc_expr * e)
507 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
511 rc = gfc_check_real_range (e->value.real, e->ts.kind);
512 if (rc == ARITH_UNDERFLOW)
513 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
517 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
518 if (rc == ARITH_UNDERFLOW)
519 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
520 if (rc == ARITH_OK || rc == ARITH_UNDERFLOW)
522 rc = gfc_check_real_range (e->value.complex.i, e->ts.kind);
523 if (rc == ARITH_UNDERFLOW)
524 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
530 gfc_internal_error ("gfc_range_check(): Bad type");
537 /* It may seem silly to have a subroutine that actually computes the
538 unary plus of a constant, but it prevents us from making exceptions
539 in the code elsewhere. */
542 gfc_arith_uplus (gfc_expr * op1, gfc_expr ** resultp)
545 *resultp = gfc_copy_expr (op1);
551 gfc_arith_uminus (gfc_expr * op1, gfc_expr ** resultp)
556 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
558 switch (op1->ts.type)
561 mpz_neg (result->value.integer, op1->value.integer);
565 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
569 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
570 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
574 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
577 rc = gfc_range_check (result);
579 if (rc == ARITH_UNDERFLOW)
581 if (gfc_option.warn_underflow)
582 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
586 else if (rc != ARITH_OK)
587 gfc_free_expr (result);
596 gfc_arith_plus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
601 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
603 switch (op1->ts.type)
606 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
610 mpfr_add (result->value.real, op1->value.real, op2->value.real,
615 mpfr_add (result->value.complex.r, op1->value.complex.r,
616 op2->value.complex.r, GFC_RND_MODE);
618 mpfr_add (result->value.complex.i, op1->value.complex.i,
619 op2->value.complex.i, GFC_RND_MODE);
623 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
626 rc = gfc_range_check (result);
628 if (rc == ARITH_UNDERFLOW)
630 if (gfc_option.warn_underflow)
631 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
635 else if (rc != ARITH_OK)
636 gfc_free_expr (result);
645 gfc_arith_minus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
650 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
652 switch (op1->ts.type)
655 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
659 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
664 mpfr_sub (result->value.complex.r, op1->value.complex.r,
665 op2->value.complex.r, GFC_RND_MODE);
667 mpfr_sub (result->value.complex.i, op1->value.complex.i,
668 op2->value.complex.i, GFC_RND_MODE);
672 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
675 rc = gfc_range_check (result);
677 if (rc == ARITH_UNDERFLOW)
679 if (gfc_option.warn_underflow)
680 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
684 else if (rc != ARITH_OK)
685 gfc_free_expr (result);
694 gfc_arith_times (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
700 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
702 switch (op1->ts.type)
705 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
709 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
715 /* FIXME: possible numericals problem. */
717 gfc_set_model (op1->value.complex.r);
721 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
722 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
723 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
725 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
726 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
727 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
735 gfc_internal_error ("gfc_arith_times(): Bad basic type");
738 rc = gfc_range_check (result);
740 if (rc == ARITH_UNDERFLOW)
742 if (gfc_option.warn_underflow)
743 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
747 else if (rc != ARITH_OK)
748 gfc_free_expr (result);
757 gfc_arith_divide (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
765 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
767 switch (op1->ts.type)
770 if (mpz_sgn (op2->value.integer) == 0)
776 mpz_tdiv_q (result->value.integer, op1->value.integer,
781 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
782 if (mpfr_sgn (op2->value.real) == 0)
788 mpfr_div (result->value.real, op1->value.real, op2->value.real,
793 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
794 if (mpfr_sgn (op2->value.complex.r) == 0
795 && mpfr_sgn (op2->value.complex.i) == 0)
801 gfc_set_model (op1->value.complex.r);
806 /* FIXME: possible numerical problems. */
807 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
808 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
809 mpfr_add (div, x, y, GFC_RND_MODE);
811 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
812 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
813 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
814 mpfr_div (result->value.complex.r, result->value.complex.r, div,
817 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
818 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
819 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
820 mpfr_div (result->value.complex.i, result->value.complex.i, div,
830 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
834 rc = gfc_range_check (result);
836 if (rc == ARITH_UNDERFLOW)
838 if (gfc_option.warn_underflow)
839 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
843 else if (rc != ARITH_OK)
844 gfc_free_expr (result);
852 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
855 complex_reciprocal (gfc_expr * op)
857 mpfr_t mod, a, re, im;
859 gfc_set_model (op->value.complex.r);
865 /* FIXME: another possible numerical problem. */
866 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
867 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
868 mpfr_add (mod, mod, a, GFC_RND_MODE);
870 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
872 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
873 mpfr_div (im, im, mod, GFC_RND_MODE);
875 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
876 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
885 /* Raise a complex number to positive power. */
888 complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
892 gfc_set_model (base->value.complex.r);
897 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
898 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
900 for (; power > 0; power--)
902 mpfr_mul (re, base->value.complex.r, result->value.complex.r,
904 mpfr_mul (a, base->value.complex.i, result->value.complex.i,
906 mpfr_sub (re, re, a, GFC_RND_MODE);
908 mpfr_mul (im, base->value.complex.r, result->value.complex.i,
910 mpfr_mul (a, base->value.complex.i, result->value.complex.r,
912 mpfr_add (im, im, a, GFC_RND_MODE);
914 mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
915 mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
924 /* Raise a number to an integer power. */
927 gfc_arith_power (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
937 if (gfc_extract_int (op2, &power) != NULL)
938 gfc_internal_error ("gfc_arith_power(): Bad exponent");
940 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
943 { /* Handle something to the zeroth power */
944 switch (op1->ts.type)
947 if (mpz_sgn (op1->value.integer) == 0)
950 mpz_set_ui (result->value.integer, 1);
954 if (mpfr_sgn (op1->value.real) == 0)
957 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
961 if (mpfr_sgn (op1->value.complex.r) == 0
962 && mpfr_sgn (op1->value.complex.i) == 0)
966 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
967 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
973 gfc_internal_error ("gfc_arith_power(): Bad base");
982 switch (op1->ts.type)
985 mpz_pow_ui (result->value.integer, op1->value.integer, apower);
989 mpz_init_set_ui (unity_z, 1);
990 mpz_tdiv_q (result->value.integer, unity_z,
991 result->value.integer);
998 mpfr_pow_ui (result->value.real, op1->value.real, apower,
1003 gfc_set_model (op1->value.real);
1004 mpfr_init (unity_f);
1005 mpfr_set_ui (unity_f, 1, GFC_RND_MODE);
1006 mpfr_div (result->value.real, unity_f, result->value.real,
1008 mpfr_clear (unity_f);
1013 complex_pow_ui (op1, apower, result);
1015 complex_reciprocal (result);
1024 rc = gfc_range_check (result);
1026 if (rc == ARITH_UNDERFLOW)
1028 if (gfc_option.warn_underflow)
1029 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
1033 else if (rc != ARITH_OK)
1034 gfc_free_expr (result);
1042 /* Concatenate two string constants. */
1045 gfc_arith_concat (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1050 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind (),
1053 len = op1->value.character.length + op2->value.character.length;
1055 result->value.character.string = gfc_getmem (len + 1);
1056 result->value.character.length = len;
1058 memcpy (result->value.character.string, op1->value.character.string,
1059 op1->value.character.length);
1061 memcpy (result->value.character.string + op1->value.character.length,
1062 op2->value.character.string, op2->value.character.length);
1064 result->value.character.string[len] = '\0';
1072 /* Comparison operators. Assumes that the two expression nodes
1073 contain two constants of the same type. */
1076 gfc_compare_expr (gfc_expr * op1, gfc_expr * op2)
1080 switch (op1->ts.type)
1083 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1087 rc = mpfr_cmp (op1->value.real, op2->value.real);
1091 rc = gfc_compare_string (op1, op2, NULL);
1095 rc = ((!op1->value.logical && op2->value.logical)
1096 || (op1->value.logical && !op2->value.logical));
1100 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1107 /* Compare a pair of complex numbers. Naturally, this is only for
1108 equality/nonequality. */
1111 compare_complex (gfc_expr * op1, gfc_expr * op2)
1114 return (mpfr_cmp (op1->value.complex.r, op2->value.complex.r) == 0
1115 && mpfr_cmp (op1->value.complex.i, op2->value.complex.i) == 0);
1119 /* Given two constant strings and the inverse collating sequence,
1120 compare the strings. We return -1 for a<b, 0 for a==b and 1 for
1121 a>b. If the xcoll_table is NULL, we use the processor's default
1122 collating sequence. */
1125 gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
1127 int len, alen, blen, i, ac, bc;
1129 alen = a->value.character.length;
1130 blen = b->value.character.length;
1132 len = (alen > blen) ? alen : blen;
1134 for (i = 0; i < len; i++)
1136 ac = (i < alen) ? a->value.character.string[i] : ' ';
1137 bc = (i < blen) ? b->value.character.string[i] : ' ';
1139 if (xcoll_table != NULL)
1141 ac = xcoll_table[ac];
1142 bc = xcoll_table[bc];
1151 /* Strings are equal */
1157 /* Specific comparison subroutines. */
1160 gfc_arith_eq (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1164 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1166 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1167 compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) == 0);
1175 gfc_arith_ne (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1179 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1181 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1182 !compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) != 0);
1190 gfc_arith_gt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1194 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1196 result->value.logical = (gfc_compare_expr (op1, op2) > 0);
1204 gfc_arith_ge (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1208 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1210 result->value.logical = (gfc_compare_expr (op1, op2) >= 0);
1218 gfc_arith_lt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1222 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1224 result->value.logical = (gfc_compare_expr (op1, op2) < 0);
1232 gfc_arith_le (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1236 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind (),
1238 result->value.logical = (gfc_compare_expr (op1, op2) <= 0);
1246 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr * op,
1249 gfc_constructor *c, *head;
1253 if (op->expr_type == EXPR_CONSTANT)
1254 return eval (op, result);
1257 head = gfc_copy_constructor (op->value.constructor);
1259 for (c = head; c; c = c->next)
1261 rc = eval (c->expr, &r);
1265 gfc_replace_expr (c->expr, r);
1269 gfc_free_constructor (head);
1272 r = gfc_get_expr ();
1273 r->expr_type = EXPR_ARRAY;
1274 r->value.constructor = head;
1275 r->shape = gfc_copy_shape (op->shape, op->rank);
1277 r->ts = head->expr->ts;
1278 r->where = op->where;
1289 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1290 gfc_expr * op1, gfc_expr * op2,
1293 gfc_constructor *c, *head;
1297 head = gfc_copy_constructor (op1->value.constructor);
1300 for (c = head; c; c = c->next)
1302 rc = eval (c->expr, op2, &r);
1306 gfc_replace_expr (c->expr, r);
1310 gfc_free_constructor (head);
1313 r = gfc_get_expr ();
1314 r->expr_type = EXPR_ARRAY;
1315 r->value.constructor = head;
1316 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1318 r->ts = head->expr->ts;
1319 r->where = op1->where;
1320 r->rank = op1->rank;
1330 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1331 gfc_expr * op1, gfc_expr * op2,
1334 gfc_constructor *c, *head;
1338 head = gfc_copy_constructor (op2->value.constructor);
1341 for (c = head; c; c = c->next)
1343 rc = eval (op1, c->expr, &r);
1347 gfc_replace_expr (c->expr, r);
1351 gfc_free_constructor (head);
1354 r = gfc_get_expr ();
1355 r->expr_type = EXPR_ARRAY;
1356 r->value.constructor = head;
1357 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1359 r->ts = head->expr->ts;
1360 r->where = op2->where;
1361 r->rank = op2->rank;
1371 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1372 gfc_expr * op1, gfc_expr * op2,
1375 gfc_constructor *c, *d, *head;
1379 head = gfc_copy_constructor (op1->value.constructor);
1382 d = op2->value.constructor;
1384 if (gfc_check_conformance ("Elemental binary operation", op1, op2)
1386 rc = ARITH_INCOMMENSURATE;
1390 for (c = head; c; c = c->next, d = d->next)
1394 rc = ARITH_INCOMMENSURATE;
1398 rc = eval (c->expr, d->expr, &r);
1402 gfc_replace_expr (c->expr, r);
1406 rc = ARITH_INCOMMENSURATE;
1410 gfc_free_constructor (head);
1413 r = gfc_get_expr ();
1414 r->expr_type = EXPR_ARRAY;
1415 r->value.constructor = head;
1416 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1418 r->ts = head->expr->ts;
1419 r->where = op1->where;
1420 r->rank = op1->rank;
1430 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1431 gfc_expr * op1, gfc_expr * op2,
1435 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1436 return eval (op1, op2, result);
1438 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1439 return reduce_binary_ca (eval, op1, op2, result);
1441 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1442 return reduce_binary_ac (eval, op1, op2, result);
1444 return reduce_binary_aa (eval, op1, op2, result);
1450 arith (*f2)(gfc_expr *, gfc_expr **);
1451 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1455 /* High level arithmetic subroutines. These subroutines go into
1456 eval_intrinsic(), which can do one of several things to its
1457 operands. If the operands are incompatible with the intrinsic
1458 operation, we return a node pointing to the operands and hope that
1459 an operator interface is found during resolution.
1461 If the operands are compatible and are constants, then we try doing
1462 the arithmetic. We also handle the cases where either or both
1463 operands are array constructors. */
1466 eval_intrinsic (gfc_intrinsic_op operator,
1467 eval_f eval, gfc_expr * op1, gfc_expr * op2)
1469 gfc_expr temp, *result;
1473 gfc_clear_ts (&temp.ts);
1477 case INTRINSIC_NOT: /* Logical unary */
1478 if (op1->ts.type != BT_LOGICAL)
1481 temp.ts.type = BT_LOGICAL;
1482 temp.ts.kind = gfc_default_logical_kind ();
1487 /* Logical binary operators */
1490 case INTRINSIC_NEQV:
1492 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1495 temp.ts.type = BT_LOGICAL;
1496 temp.ts.kind = gfc_default_logical_kind ();
1501 case INTRINSIC_UPLUS:
1502 case INTRINSIC_UMINUS: /* Numeric unary */
1503 if (!gfc_numeric_ts (&op1->ts))
1512 case INTRINSIC_LT: /* Additional restrictions */
1513 case INTRINSIC_LE: /* for ordering relations. */
1515 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1517 temp.ts.type = BT_LOGICAL;
1518 temp.ts.kind = gfc_default_logical_kind();
1522 /* else fall through */
1526 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1529 temp.ts.type = BT_LOGICAL;
1530 temp.ts.kind = gfc_default_logical_kind();
1534 /* else fall through */
1536 case INTRINSIC_PLUS:
1537 case INTRINSIC_MINUS:
1538 case INTRINSIC_TIMES:
1539 case INTRINSIC_DIVIDE:
1540 case INTRINSIC_POWER: /* Numeric binary */
1541 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1544 /* Insert any necessary type conversions to make the operands compatible. */
1546 temp.expr_type = EXPR_OP;
1547 gfc_clear_ts (&temp.ts);
1548 temp.operator = operator;
1553 gfc_type_convert_binary (&temp);
1555 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1556 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1557 || operator == INTRINSIC_LE || operator == INTRINSIC_LT)
1559 temp.ts.type = BT_LOGICAL;
1560 temp.ts.kind = gfc_default_logical_kind ();
1566 case INTRINSIC_CONCAT: /* Character binary */
1567 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1570 temp.ts.type = BT_CHARACTER;
1571 temp.ts.kind = gfc_default_character_kind ();
1576 case INTRINSIC_USER:
1580 gfc_internal_error ("eval_intrinsic(): Bad operator");
1583 /* Try to combine the operators. */
1584 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1587 if (op1->expr_type != EXPR_CONSTANT
1588 && (op1->expr_type != EXPR_ARRAY
1589 || !gfc_is_constant_expr (op1)
1590 || !gfc_expanded_ac (op1)))
1594 && op2->expr_type != EXPR_CONSTANT
1595 && (op2->expr_type != EXPR_ARRAY
1596 || !gfc_is_constant_expr (op2)
1597 || !gfc_expanded_ac (op2)))
1601 rc = reduce_unary (eval.f2, op1, &result);
1603 rc = reduce_binary (eval.f3, op1, op2, &result);
1606 { /* Something went wrong */
1607 gfc_error ("%s at %L", gfc_arith_error (rc), &op1->where);
1611 gfc_free_expr (op1);
1612 gfc_free_expr (op2);
1616 /* Create a run-time expression */
1617 result = gfc_get_expr ();
1618 result->ts = temp.ts;
1620 result->expr_type = EXPR_OP;
1621 result->operator = operator;
1626 result->where = op1->where;
1632 /* Modify type of expression for zero size array. */
1634 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1637 gfc_internal_error("eval_type_intrinsic0(): op NULL");
1647 op->ts.type = BT_LOGICAL;
1648 op->ts.kind = gfc_default_logical_kind();
1659 /* Return nonzero if the expression is a zero size array. */
1662 gfc_zero_size_array (gfc_expr * e)
1665 if (e->expr_type != EXPR_ARRAY)
1668 return e->value.constructor == NULL;
1672 /* Reduce a binary expression where at least one of the operands
1673 involves a zero-length array. Returns NULL if neither of the
1674 operands is a zero-length array. */
1677 reduce_binary0 (gfc_expr * op1, gfc_expr * op2)
1680 if (gfc_zero_size_array (op1))
1682 gfc_free_expr (op2);
1686 if (gfc_zero_size_array (op2))
1688 gfc_free_expr (op1);
1697 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1698 arith (*eval) (gfc_expr *, gfc_expr **),
1699 gfc_expr * op1, gfc_expr * op2)
1706 if (gfc_zero_size_array (op1))
1707 return eval_type_intrinsic0(operator, op1);
1711 result = reduce_binary0 (op1, op2);
1713 return eval_type_intrinsic0(operator, result);
1717 return eval_intrinsic (operator, f, op1, op2);
1722 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1723 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1724 gfc_expr * op1, gfc_expr * op2)
1729 result = reduce_binary0 (op1, op2);
1731 return eval_type_intrinsic0(operator, result);
1734 return eval_intrinsic (operator, f, op1, op2);
1740 gfc_uplus (gfc_expr * op)
1742 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_uplus, op, NULL);
1746 gfc_uminus (gfc_expr * op)
1748 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1752 gfc_add (gfc_expr * op1, gfc_expr * op2)
1754 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1758 gfc_subtract (gfc_expr * op1, gfc_expr * op2)
1760 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1764 gfc_multiply (gfc_expr * op1, gfc_expr * op2)
1766 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1770 gfc_divide (gfc_expr * op1, gfc_expr * op2)
1772 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1776 gfc_power (gfc_expr * op1, gfc_expr * op2)
1778 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1782 gfc_concat (gfc_expr * op1, gfc_expr * op2)
1784 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1788 gfc_and (gfc_expr * op1, gfc_expr * op2)
1790 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1794 gfc_or (gfc_expr * op1, gfc_expr * op2)
1796 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1800 gfc_not (gfc_expr * op1)
1802 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1806 gfc_eqv (gfc_expr * op1, gfc_expr * op2)
1808 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1812 gfc_neqv (gfc_expr * op1, gfc_expr * op2)
1814 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1818 gfc_eq (gfc_expr * op1, gfc_expr * op2)
1820 return eval_intrinsic_f3 (INTRINSIC_EQ, gfc_arith_eq, op1, op2);
1824 gfc_ne (gfc_expr * op1, gfc_expr * op2)
1826 return eval_intrinsic_f3 (INTRINSIC_NE, gfc_arith_ne, op1, op2);
1830 gfc_gt (gfc_expr * op1, gfc_expr * op2)
1832 return eval_intrinsic_f3 (INTRINSIC_GT, gfc_arith_gt, op1, op2);
1836 gfc_ge (gfc_expr * op1, gfc_expr * op2)
1838 return eval_intrinsic_f3 (INTRINSIC_GE, gfc_arith_ge, op1, op2);
1842 gfc_lt (gfc_expr * op1, gfc_expr * op2)
1844 return eval_intrinsic_f3 (INTRINSIC_LT, gfc_arith_lt, op1, op2);
1848 gfc_le (gfc_expr * op1, gfc_expr * op2)
1850 return eval_intrinsic_f3 (INTRINSIC_LE, gfc_arith_le, op1, op2);
1854 /* Convert an integer string to an expression node. */
1857 gfc_convert_integer (const char *buffer, int kind, int radix, locus * where)
1862 e = gfc_constant_result (BT_INTEGER, kind, where);
1863 /* a leading plus is allowed, but not by mpz_set_str */
1864 if (buffer[0] == '+')
1868 mpz_set_str (e->value.integer, t, radix);
1874 /* Convert a real string to an expression node. */
1877 gfc_convert_real (const char *buffer, int kind, locus * where)
1882 e = gfc_constant_result (BT_REAL, kind, where);
1883 /* A leading plus is allowed in Fortran, but not by mpfr_set_str */
1884 if (buffer[0] == '+')
1888 mpfr_set_str (e->value.real, t, 10, GFC_RND_MODE);
1894 /* Convert a pair of real, constant expression nodes to a single
1895 complex expression node. */
1898 gfc_convert_complex (gfc_expr * real, gfc_expr * imag, int kind)
1902 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
1903 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
1904 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
1910 /******* Simplification of intrinsic functions with constant arguments *****/
1913 /* Deal with an arithmetic error. */
1916 arith_error (arith rc, gfc_typespec * from, gfc_typespec * to, locus * where)
1919 gfc_error ("%s converting %s to %s at %L", gfc_arith_error (rc),
1920 gfc_typename (from), gfc_typename (to), where);
1922 /* TODO: Do something about the error, ie, throw exception, return
1926 /* Convert integers to integers. */
1929 gfc_int2int (gfc_expr * src, int kind)
1934 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1936 mpz_set (result->value.integer, src->value.integer);
1938 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1941 arith_error (rc, &src->ts, &result->ts, &src->where);
1942 gfc_free_expr (result);
1950 /* Convert integers to reals. */
1953 gfc_int2real (gfc_expr * src, int kind)
1958 result = gfc_constant_result (BT_REAL, kind, &src->where);
1960 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
1962 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
1964 arith_error (rc, &src->ts, &result->ts, &src->where);
1965 gfc_free_expr (result);
1973 /* Convert default integer to default complex. */
1976 gfc_int2complex (gfc_expr * src, int kind)
1981 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
1983 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
1984 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1986 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
1988 arith_error (rc, &src->ts, &result->ts, &src->where);
1989 gfc_free_expr (result);
1997 /* Convert default real to default integer. */
2000 gfc_real2int (gfc_expr * src, int kind)
2005 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2007 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
2009 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2012 arith_error (rc, &src->ts, &result->ts, &src->where);
2013 gfc_free_expr (result);
2021 /* Convert real to real. */
2024 gfc_real2real (gfc_expr * src, int kind)
2029 result = gfc_constant_result (BT_REAL, kind, &src->where);
2031 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2033 rc = gfc_check_real_range (result->value.real, kind);
2035 if (rc == ARITH_UNDERFLOW)
2037 if (gfc_option.warn_underflow)
2038 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2039 mpfr_set_ui(result->value.real, 0, GFC_RND_MODE);
2041 else if (rc != ARITH_OK)
2043 arith_error (rc, &src->ts, &result->ts, &src->where);
2044 gfc_free_expr (result);
2052 /* Convert real to complex. */
2055 gfc_real2complex (gfc_expr * src, int kind)
2060 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2062 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2063 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2065 rc = gfc_check_real_range (result->value.complex.r, kind);
2067 if (rc == ARITH_UNDERFLOW)
2069 if (gfc_option.warn_underflow)
2070 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2071 mpfr_set_ui(result->value.complex.r, 0, GFC_RND_MODE);
2073 else if (rc != ARITH_OK)
2075 arith_error (rc, &src->ts, &result->ts, &src->where);
2076 gfc_free_expr (result);
2084 /* Convert complex to integer. */
2087 gfc_complex2int (gfc_expr * src, int kind)
2092 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2094 gfc_mpfr_to_mpz(result->value.integer, src->value.complex.r);
2096 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2099 arith_error (rc, &src->ts, &result->ts, &src->where);
2100 gfc_free_expr (result);
2108 /* Convert complex to real. */
2111 gfc_complex2real (gfc_expr * src, int kind)
2116 result = gfc_constant_result (BT_REAL, kind, &src->where);
2118 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2120 rc = gfc_check_real_range (result->value.real, kind);
2122 if (rc == ARITH_UNDERFLOW)
2124 if (gfc_option.warn_underflow)
2125 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2126 mpfr_set_ui(result->value.real, 0, GFC_RND_MODE);
2130 arith_error (rc, &src->ts, &result->ts, &src->where);
2131 gfc_free_expr (result);
2139 /* Convert complex to complex. */
2142 gfc_complex2complex (gfc_expr * src, int kind)
2147 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2149 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2150 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2152 rc = gfc_check_real_range (result->value.complex.r, kind);
2154 if (rc == ARITH_UNDERFLOW)
2156 if (gfc_option.warn_underflow)
2157 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2158 mpfr_set_ui(result->value.complex.r, 0, GFC_RND_MODE);
2160 else if (rc != ARITH_OK)
2162 arith_error (rc, &src->ts, &result->ts, &src->where);
2163 gfc_free_expr (result);
2167 rc = gfc_check_real_range (result->value.complex.i, kind);
2169 if (rc == ARITH_UNDERFLOW)
2171 if (gfc_option.warn_underflow)
2172 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2173 mpfr_set_ui(result->value.complex.i, 0, GFC_RND_MODE);
2175 else if (rc != ARITH_OK)
2177 arith_error (rc, &src->ts, &result->ts, &src->where);
2178 gfc_free_expr (result);
2186 /* Logical kind conversion. */
2189 gfc_log2log (gfc_expr * src, int kind)
2193 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2194 result->value.logical = src->value.logical;