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)
544 *resultp = gfc_copy_expr (op1);
550 gfc_arith_uminus (gfc_expr * op1, gfc_expr ** resultp)
555 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
557 switch (op1->ts.type)
560 mpz_neg (result->value.integer, op1->value.integer);
564 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
568 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
569 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
573 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
576 rc = gfc_range_check (result);
578 if (rc == ARITH_UNDERFLOW)
580 if (gfc_option.warn_underflow)
581 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
585 else if (rc != ARITH_OK)
586 gfc_free_expr (result);
595 gfc_arith_plus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
600 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
602 switch (op1->ts.type)
605 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
609 mpfr_add (result->value.real, op1->value.real, op2->value.real,
614 mpfr_add (result->value.complex.r, op1->value.complex.r,
615 op2->value.complex.r, GFC_RND_MODE);
617 mpfr_add (result->value.complex.i, op1->value.complex.i,
618 op2->value.complex.i, GFC_RND_MODE);
622 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
625 rc = gfc_range_check (result);
627 if (rc == ARITH_UNDERFLOW)
629 if (gfc_option.warn_underflow)
630 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
634 else if (rc != ARITH_OK)
635 gfc_free_expr (result);
644 gfc_arith_minus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
649 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
651 switch (op1->ts.type)
654 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
658 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
663 mpfr_sub (result->value.complex.r, op1->value.complex.r,
664 op2->value.complex.r, GFC_RND_MODE);
666 mpfr_sub (result->value.complex.i, op1->value.complex.i,
667 op2->value.complex.i, GFC_RND_MODE);
671 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
674 rc = gfc_range_check (result);
676 if (rc == ARITH_UNDERFLOW)
678 if (gfc_option.warn_underflow)
679 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
683 else if (rc != ARITH_OK)
684 gfc_free_expr (result);
693 gfc_arith_times (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
699 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
701 switch (op1->ts.type)
704 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
708 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
714 /* FIXME: possible numericals problem. */
716 gfc_set_model (op1->value.complex.r);
720 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
721 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
722 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
724 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
725 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
726 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
734 gfc_internal_error ("gfc_arith_times(): Bad basic type");
737 rc = gfc_range_check (result);
739 if (rc == ARITH_UNDERFLOW)
741 if (gfc_option.warn_underflow)
742 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
746 else if (rc != ARITH_OK)
747 gfc_free_expr (result);
756 gfc_arith_divide (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
764 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
766 switch (op1->ts.type)
769 if (mpz_sgn (op2->value.integer) == 0)
775 mpz_tdiv_q (result->value.integer, op1->value.integer,
780 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
781 if (mpfr_sgn (op2->value.real) == 0)
787 mpfr_div (result->value.real, op1->value.real, op2->value.real,
792 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
793 if (mpfr_sgn (op2->value.complex.r) == 0
794 && mpfr_sgn (op2->value.complex.i) == 0)
800 gfc_set_model (op1->value.complex.r);
805 /* FIXME: possible numerical problems. */
806 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
807 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
808 mpfr_add (div, x, y, GFC_RND_MODE);
810 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
811 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
812 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
813 mpfr_div (result->value.complex.r, result->value.complex.r, div,
816 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
817 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
818 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
819 mpfr_div (result->value.complex.i, result->value.complex.i, div,
829 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
833 rc = gfc_range_check (result);
835 if (rc == ARITH_UNDERFLOW)
837 if (gfc_option.warn_underflow)
838 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
842 else if (rc != ARITH_OK)
843 gfc_free_expr (result);
851 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
854 complex_reciprocal (gfc_expr * op)
856 mpfr_t mod, a, re, im;
858 gfc_set_model (op->value.complex.r);
864 /* FIXME: another possible numerical problem. */
865 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
866 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
867 mpfr_add (mod, mod, a, GFC_RND_MODE);
869 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
871 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
872 mpfr_div (im, im, mod, GFC_RND_MODE);
874 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
875 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
884 /* Raise a complex number to positive power. */
887 complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
891 gfc_set_model (base->value.complex.r);
896 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
897 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
899 for (; power > 0; power--)
901 mpfr_mul (re, base->value.complex.r, result->value.complex.r,
903 mpfr_mul (a, base->value.complex.i, result->value.complex.i,
905 mpfr_sub (re, re, a, GFC_RND_MODE);
907 mpfr_mul (im, base->value.complex.r, result->value.complex.i,
909 mpfr_mul (a, base->value.complex.i, result->value.complex.r,
911 mpfr_add (im, im, a, GFC_RND_MODE);
913 mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
914 mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
923 /* Raise a number to an integer power. */
926 gfc_arith_power (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
936 if (gfc_extract_int (op2, &power) != NULL)
937 gfc_internal_error ("gfc_arith_power(): Bad exponent");
939 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
942 { /* Handle something to the zeroth power */
943 switch (op1->ts.type)
946 if (mpz_sgn (op1->value.integer) == 0)
949 mpz_set_ui (result->value.integer, 1);
953 if (mpfr_sgn (op1->value.real) == 0)
956 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
960 if (mpfr_sgn (op1->value.complex.r) == 0
961 && mpfr_sgn (op1->value.complex.i) == 0)
965 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
966 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
972 gfc_internal_error ("gfc_arith_power(): Bad base");
981 switch (op1->ts.type)
984 mpz_pow_ui (result->value.integer, op1->value.integer, apower);
988 mpz_init_set_ui (unity_z, 1);
989 mpz_tdiv_q (result->value.integer, unity_z,
990 result->value.integer);
997 mpfr_pow_ui (result->value.real, op1->value.real, apower,
1002 gfc_set_model (op1->value.real);
1003 mpfr_init (unity_f);
1004 mpfr_set_ui (unity_f, 1, GFC_RND_MODE);
1005 mpfr_div (result->value.real, unity_f, result->value.real,
1007 mpfr_clear (unity_f);
1012 complex_pow_ui (op1, apower, result);
1014 complex_reciprocal (result);
1023 rc = gfc_range_check (result);
1025 if (rc == ARITH_UNDERFLOW)
1027 if (gfc_option.warn_underflow)
1028 gfc_warning ("%s at %L", gfc_arith_error (rc), &op1->where);
1032 else if (rc != ARITH_OK)
1033 gfc_free_expr (result);
1041 /* Concatenate two string constants. */
1044 gfc_arith_concat (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1049 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
1052 len = op1->value.character.length + op2->value.character.length;
1054 result->value.character.string = gfc_getmem (len + 1);
1055 result->value.character.length = len;
1057 memcpy (result->value.character.string, op1->value.character.string,
1058 op1->value.character.length);
1060 memcpy (result->value.character.string + op1->value.character.length,
1061 op2->value.character.string, op2->value.character.length);
1063 result->value.character.string[len] = '\0';
1071 /* Comparison operators. Assumes that the two expression nodes
1072 contain two constants of the same type. */
1075 gfc_compare_expr (gfc_expr * op1, gfc_expr * op2)
1079 switch (op1->ts.type)
1082 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1086 rc = mpfr_cmp (op1->value.real, op2->value.real);
1090 rc = gfc_compare_string (op1, op2, NULL);
1094 rc = ((!op1->value.logical && op2->value.logical)
1095 || (op1->value.logical && !op2->value.logical));
1099 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1106 /* Compare a pair of complex numbers. Naturally, this is only for
1107 equality/nonequality. */
1110 compare_complex (gfc_expr * op1, gfc_expr * op2)
1112 return (mpfr_cmp (op1->value.complex.r, op2->value.complex.r) == 0
1113 && mpfr_cmp (op1->value.complex.i, op2->value.complex.i) == 0);
1117 /* Given two constant strings and the inverse collating sequence,
1118 compare the strings. We return -1 for a<b, 0 for a==b and 1 for
1119 a>b. If the xcoll_table is NULL, we use the processor's default
1120 collating sequence. */
1123 gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
1125 int len, alen, blen, i, ac, bc;
1127 alen = a->value.character.length;
1128 blen = b->value.character.length;
1130 len = (alen > blen) ? alen : blen;
1132 for (i = 0; i < len; i++)
1134 ac = (i < alen) ? a->value.character.string[i] : ' ';
1135 bc = (i < blen) ? b->value.character.string[i] : ' ';
1137 if (xcoll_table != NULL)
1139 ac = xcoll_table[ac];
1140 bc = xcoll_table[bc];
1149 /* Strings are equal */
1155 /* Specific comparison subroutines. */
1158 gfc_arith_eq (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1162 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1164 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1165 compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) == 0);
1173 gfc_arith_ne (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1177 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1179 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1180 !compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) != 0);
1188 gfc_arith_gt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1192 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1194 result->value.logical = (gfc_compare_expr (op1, op2) > 0);
1202 gfc_arith_ge (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1206 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1208 result->value.logical = (gfc_compare_expr (op1, op2) >= 0);
1216 gfc_arith_lt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1220 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1222 result->value.logical = (gfc_compare_expr (op1, op2) < 0);
1230 gfc_arith_le (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1234 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1236 result->value.logical = (gfc_compare_expr (op1, op2) <= 0);
1244 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr * op,
1247 gfc_constructor *c, *head;
1251 if (op->expr_type == EXPR_CONSTANT)
1252 return eval (op, result);
1255 head = gfc_copy_constructor (op->value.constructor);
1257 for (c = head; c; c = c->next)
1259 rc = eval (c->expr, &r);
1263 gfc_replace_expr (c->expr, r);
1267 gfc_free_constructor (head);
1270 r = gfc_get_expr ();
1271 r->expr_type = EXPR_ARRAY;
1272 r->value.constructor = head;
1273 r->shape = gfc_copy_shape (op->shape, op->rank);
1275 r->ts = head->expr->ts;
1276 r->where = op->where;
1287 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1288 gfc_expr * op1, gfc_expr * op2,
1291 gfc_constructor *c, *head;
1295 head = gfc_copy_constructor (op1->value.constructor);
1298 for (c = head; c; c = c->next)
1300 rc = eval (c->expr, op2, &r);
1304 gfc_replace_expr (c->expr, r);
1308 gfc_free_constructor (head);
1311 r = gfc_get_expr ();
1312 r->expr_type = EXPR_ARRAY;
1313 r->value.constructor = head;
1314 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1316 r->ts = head->expr->ts;
1317 r->where = op1->where;
1318 r->rank = op1->rank;
1328 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1329 gfc_expr * op1, gfc_expr * op2,
1332 gfc_constructor *c, *head;
1336 head = gfc_copy_constructor (op2->value.constructor);
1339 for (c = head; c; c = c->next)
1341 rc = eval (op1, c->expr, &r);
1345 gfc_replace_expr (c->expr, r);
1349 gfc_free_constructor (head);
1352 r = gfc_get_expr ();
1353 r->expr_type = EXPR_ARRAY;
1354 r->value.constructor = head;
1355 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1357 r->ts = head->expr->ts;
1358 r->where = op2->where;
1359 r->rank = op2->rank;
1369 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1370 gfc_expr * op1, gfc_expr * op2,
1373 gfc_constructor *c, *d, *head;
1377 head = gfc_copy_constructor (op1->value.constructor);
1380 d = op2->value.constructor;
1382 if (gfc_check_conformance ("Elemental binary operation", op1, op2)
1384 rc = ARITH_INCOMMENSURATE;
1388 for (c = head; c; c = c->next, d = d->next)
1392 rc = ARITH_INCOMMENSURATE;
1396 rc = eval (c->expr, d->expr, &r);
1400 gfc_replace_expr (c->expr, r);
1404 rc = ARITH_INCOMMENSURATE;
1408 gfc_free_constructor (head);
1411 r = gfc_get_expr ();
1412 r->expr_type = EXPR_ARRAY;
1413 r->value.constructor = head;
1414 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1416 r->ts = head->expr->ts;
1417 r->where = op1->where;
1418 r->rank = op1->rank;
1428 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1429 gfc_expr * op1, gfc_expr * op2,
1432 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1433 return eval (op1, op2, result);
1435 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1436 return reduce_binary_ca (eval, op1, op2, result);
1438 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1439 return reduce_binary_ac (eval, op1, op2, result);
1441 return reduce_binary_aa (eval, op1, op2, result);
1447 arith (*f2)(gfc_expr *, gfc_expr **);
1448 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1452 /* High level arithmetic subroutines. These subroutines go into
1453 eval_intrinsic(), which can do one of several things to its
1454 operands. If the operands are incompatible with the intrinsic
1455 operation, we return a node pointing to the operands and hope that
1456 an operator interface is found during resolution.
1458 If the operands are compatible and are constants, then we try doing
1459 the arithmetic. We also handle the cases where either or both
1460 operands are array constructors. */
1463 eval_intrinsic (gfc_intrinsic_op operator,
1464 eval_f eval, gfc_expr * op1, gfc_expr * op2)
1466 gfc_expr temp, *result;
1470 gfc_clear_ts (&temp.ts);
1474 case INTRINSIC_NOT: /* Logical unary */
1475 if (op1->ts.type != BT_LOGICAL)
1478 temp.ts.type = BT_LOGICAL;
1479 temp.ts.kind = gfc_default_logical_kind;
1484 /* Logical binary operators */
1487 case INTRINSIC_NEQV:
1489 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1492 temp.ts.type = BT_LOGICAL;
1493 temp.ts.kind = gfc_default_logical_kind;
1498 case INTRINSIC_UPLUS:
1499 case INTRINSIC_UMINUS: /* Numeric unary */
1500 if (!gfc_numeric_ts (&op1->ts))
1509 case INTRINSIC_LT: /* Additional restrictions */
1510 case INTRINSIC_LE: /* for ordering relations. */
1512 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1514 temp.ts.type = BT_LOGICAL;
1515 temp.ts.kind = gfc_default_logical_kind;
1519 /* else fall through */
1523 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1526 temp.ts.type = BT_LOGICAL;
1527 temp.ts.kind = gfc_default_logical_kind;
1531 /* else fall through */
1533 case INTRINSIC_PLUS:
1534 case INTRINSIC_MINUS:
1535 case INTRINSIC_TIMES:
1536 case INTRINSIC_DIVIDE:
1537 case INTRINSIC_POWER: /* Numeric binary */
1538 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1541 /* Insert any necessary type conversions to make the operands compatible. */
1543 temp.expr_type = EXPR_OP;
1544 gfc_clear_ts (&temp.ts);
1545 temp.operator = operator;
1550 gfc_type_convert_binary (&temp);
1552 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1553 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1554 || operator == INTRINSIC_LE || operator == INTRINSIC_LT)
1556 temp.ts.type = BT_LOGICAL;
1557 temp.ts.kind = gfc_default_logical_kind;
1563 case INTRINSIC_CONCAT: /* Character binary */
1564 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1567 temp.ts.type = BT_CHARACTER;
1568 temp.ts.kind = gfc_default_character_kind;
1573 case INTRINSIC_USER:
1577 gfc_internal_error ("eval_intrinsic(): Bad operator");
1580 /* Try to combine the operators. */
1581 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1584 if (op1->expr_type != EXPR_CONSTANT
1585 && (op1->expr_type != EXPR_ARRAY
1586 || !gfc_is_constant_expr (op1)
1587 || !gfc_expanded_ac (op1)))
1591 && op2->expr_type != EXPR_CONSTANT
1592 && (op2->expr_type != EXPR_ARRAY
1593 || !gfc_is_constant_expr (op2)
1594 || !gfc_expanded_ac (op2)))
1598 rc = reduce_unary (eval.f2, op1, &result);
1600 rc = reduce_binary (eval.f3, op1, op2, &result);
1603 { /* Something went wrong */
1604 gfc_error ("%s at %L", gfc_arith_error (rc), &op1->where);
1608 gfc_free_expr (op1);
1609 gfc_free_expr (op2);
1613 /* Create a run-time expression */
1614 result = gfc_get_expr ();
1615 result->ts = temp.ts;
1617 result->expr_type = EXPR_OP;
1618 result->operator = operator;
1623 result->where = op1->where;
1629 /* Modify type of expression for zero size array. */
1631 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1634 gfc_internal_error("eval_type_intrinsic0(): op NULL");
1644 op->ts.type = BT_LOGICAL;
1645 op->ts.kind = gfc_default_logical_kind;
1656 /* Return nonzero if the expression is a zero size array. */
1659 gfc_zero_size_array (gfc_expr * e)
1661 if (e->expr_type != EXPR_ARRAY)
1664 return e->value.constructor == NULL;
1668 /* Reduce a binary expression where at least one of the operands
1669 involves a zero-length array. Returns NULL if neither of the
1670 operands is a zero-length array. */
1673 reduce_binary0 (gfc_expr * op1, gfc_expr * op2)
1675 if (gfc_zero_size_array (op1))
1677 gfc_free_expr (op2);
1681 if (gfc_zero_size_array (op2))
1683 gfc_free_expr (op1);
1692 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1693 arith (*eval) (gfc_expr *, gfc_expr **),
1694 gfc_expr * op1, gfc_expr * op2)
1701 if (gfc_zero_size_array (op1))
1702 return eval_type_intrinsic0(operator, op1);
1706 result = reduce_binary0 (op1, op2);
1708 return eval_type_intrinsic0(operator, result);
1712 return eval_intrinsic (operator, f, op1, op2);
1717 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1718 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1719 gfc_expr * op1, gfc_expr * op2)
1724 result = reduce_binary0 (op1, op2);
1726 return eval_type_intrinsic0(operator, result);
1729 return eval_intrinsic (operator, f, op1, op2);
1735 gfc_uplus (gfc_expr * op)
1737 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_uplus, op, NULL);
1741 gfc_uminus (gfc_expr * op)
1743 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1747 gfc_add (gfc_expr * op1, gfc_expr * op2)
1749 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1753 gfc_subtract (gfc_expr * op1, gfc_expr * op2)
1755 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1759 gfc_multiply (gfc_expr * op1, gfc_expr * op2)
1761 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1765 gfc_divide (gfc_expr * op1, gfc_expr * op2)
1767 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1771 gfc_power (gfc_expr * op1, gfc_expr * op2)
1773 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1777 gfc_concat (gfc_expr * op1, gfc_expr * op2)
1779 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1783 gfc_and (gfc_expr * op1, gfc_expr * op2)
1785 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1789 gfc_or (gfc_expr * op1, gfc_expr * op2)
1791 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1795 gfc_not (gfc_expr * op1)
1797 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1801 gfc_eqv (gfc_expr * op1, gfc_expr * op2)
1803 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1807 gfc_neqv (gfc_expr * op1, gfc_expr * op2)
1809 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1813 gfc_eq (gfc_expr * op1, gfc_expr * op2)
1815 return eval_intrinsic_f3 (INTRINSIC_EQ, gfc_arith_eq, op1, op2);
1819 gfc_ne (gfc_expr * op1, gfc_expr * op2)
1821 return eval_intrinsic_f3 (INTRINSIC_NE, gfc_arith_ne, op1, op2);
1825 gfc_gt (gfc_expr * op1, gfc_expr * op2)
1827 return eval_intrinsic_f3 (INTRINSIC_GT, gfc_arith_gt, op1, op2);
1831 gfc_ge (gfc_expr * op1, gfc_expr * op2)
1833 return eval_intrinsic_f3 (INTRINSIC_GE, gfc_arith_ge, op1, op2);
1837 gfc_lt (gfc_expr * op1, gfc_expr * op2)
1839 return eval_intrinsic_f3 (INTRINSIC_LT, gfc_arith_lt, op1, op2);
1843 gfc_le (gfc_expr * op1, gfc_expr * op2)
1845 return eval_intrinsic_f3 (INTRINSIC_LE, gfc_arith_le, op1, op2);
1849 /* Convert an integer string to an expression node. */
1852 gfc_convert_integer (const char *buffer, int kind, int radix, locus * where)
1857 e = gfc_constant_result (BT_INTEGER, kind, where);
1858 /* a leading plus is allowed, but not by mpz_set_str */
1859 if (buffer[0] == '+')
1863 mpz_set_str (e->value.integer, t, radix);
1869 /* Convert a real string to an expression node. */
1872 gfc_convert_real (const char *buffer, int kind, locus * where)
1877 e = gfc_constant_result (BT_REAL, kind, where);
1878 /* A leading plus is allowed in Fortran, but not by mpfr_set_str */
1879 if (buffer[0] == '+')
1883 mpfr_set_str (e->value.real, t, 10, GFC_RND_MODE);
1889 /* Convert a pair of real, constant expression nodes to a single
1890 complex expression node. */
1893 gfc_convert_complex (gfc_expr * real, gfc_expr * imag, int kind)
1897 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
1898 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
1899 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
1905 /******* Simplification of intrinsic functions with constant arguments *****/
1908 /* Deal with an arithmetic error. */
1911 arith_error (arith rc, gfc_typespec * from, gfc_typespec * to, locus * where)
1913 gfc_error ("%s converting %s to %s at %L", gfc_arith_error (rc),
1914 gfc_typename (from), gfc_typename (to), where);
1916 /* TODO: Do something about the error, ie, throw exception, return
1920 /* Convert integers to integers. */
1923 gfc_int2int (gfc_expr * src, int kind)
1928 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1930 mpz_set (result->value.integer, src->value.integer);
1932 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1935 arith_error (rc, &src->ts, &result->ts, &src->where);
1936 gfc_free_expr (result);
1944 /* Convert integers to reals. */
1947 gfc_int2real (gfc_expr * src, int kind)
1952 result = gfc_constant_result (BT_REAL, kind, &src->where);
1954 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
1956 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
1958 arith_error (rc, &src->ts, &result->ts, &src->where);
1959 gfc_free_expr (result);
1967 /* Convert default integer to default complex. */
1970 gfc_int2complex (gfc_expr * src, int kind)
1975 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
1977 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
1978 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1980 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
1982 arith_error (rc, &src->ts, &result->ts, &src->where);
1983 gfc_free_expr (result);
1991 /* Convert default real to default integer. */
1994 gfc_real2int (gfc_expr * src, int kind)
1999 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2001 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
2003 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2006 arith_error (rc, &src->ts, &result->ts, &src->where);
2007 gfc_free_expr (result);
2015 /* Convert real to real. */
2018 gfc_real2real (gfc_expr * src, int kind)
2023 result = gfc_constant_result (BT_REAL, kind, &src->where);
2025 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2027 rc = gfc_check_real_range (result->value.real, 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.real, 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 real to complex. */
2049 gfc_real2complex (gfc_expr * src, int kind)
2054 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2056 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2057 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2059 rc = gfc_check_real_range (result->value.complex.r, kind);
2061 if (rc == ARITH_UNDERFLOW)
2063 if (gfc_option.warn_underflow)
2064 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2065 mpfr_set_ui(result->value.complex.r, 0, GFC_RND_MODE);
2067 else if (rc != ARITH_OK)
2069 arith_error (rc, &src->ts, &result->ts, &src->where);
2070 gfc_free_expr (result);
2078 /* Convert complex to integer. */
2081 gfc_complex2int (gfc_expr * src, int kind)
2086 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2088 gfc_mpfr_to_mpz(result->value.integer, src->value.complex.r);
2090 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2093 arith_error (rc, &src->ts, &result->ts, &src->where);
2094 gfc_free_expr (result);
2102 /* Convert complex to real. */
2105 gfc_complex2real (gfc_expr * src, int kind)
2110 result = gfc_constant_result (BT_REAL, kind, &src->where);
2112 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2114 rc = gfc_check_real_range (result->value.real, 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.real, 0, GFC_RND_MODE);
2124 arith_error (rc, &src->ts, &result->ts, &src->where);
2125 gfc_free_expr (result);
2133 /* Convert complex to complex. */
2136 gfc_complex2complex (gfc_expr * src, int kind)
2141 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2143 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2144 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2146 rc = gfc_check_real_range (result->value.complex.r, kind);
2148 if (rc == ARITH_UNDERFLOW)
2150 if (gfc_option.warn_underflow)
2151 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2152 mpfr_set_ui(result->value.complex.r, 0, GFC_RND_MODE);
2154 else if (rc != ARITH_OK)
2156 arith_error (rc, &src->ts, &result->ts, &src->where);
2157 gfc_free_expr (result);
2161 rc = gfc_check_real_range (result->value.complex.i, kind);
2163 if (rc == ARITH_UNDERFLOW)
2165 if (gfc_option.warn_underflow)
2166 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2167 mpfr_set_ui(result->value.complex.i, 0, GFC_RND_MODE);
2169 else if (rc != ARITH_OK)
2171 arith_error (rc, &src->ts, &result->ts, &src->where);
2172 gfc_free_expr (result);
2180 /* Logical kind conversion. */
2183 gfc_log2log (gfc_expr * src, int kind)
2187 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2188 result->value.logical = src->value.logical;