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";
155 case ARITH_INCOMMENSURATE:
156 p = "Array operands are incommensurate";
158 case ARITH_ASYMMETRIC:
159 p = "Integer outside symmetric range implied by Standard Fortran";
162 gfc_internal_error ("gfc_arith_error(): Bad error code");
169 /* Get things ready to do math. */
172 gfc_arith_init_1 (void)
174 gfc_integer_info *int_info;
175 gfc_real_info *real_info;
180 mpfr_set_default_prec (128);
184 /* Convert the minimum/maximum values for each kind into their
185 GNU MP representation. */
186 for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
189 mpz_set_ui (r, int_info->radix);
190 mpz_pow_ui (r, r, int_info->digits);
192 mpz_init (int_info->huge);
193 mpz_sub_ui (int_info->huge, r, 1);
195 /* These are the numbers that are actually representable by the
196 target. For bases other than two, this needs to be changed. */
197 if (int_info->radix != 2)
198 gfc_internal_error ("Fix min_int, max_int calculation");
200 /* See PRs 13490 and 17912, related to integer ranges.
201 The pedantic_min_int exists for range checking when a program
202 is compiled with -pedantic, and reflects the belief that
203 Standard Fortran requires integers to be symmetrical, i.e.
204 every negative integer must have a representable positive
205 absolute value, and vice versa. */
207 mpz_init (int_info->pedantic_min_int);
208 mpz_neg (int_info->pedantic_min_int, int_info->huge);
210 mpz_init (int_info->min_int);
211 mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
213 mpz_init (int_info->max_int);
214 mpz_add (int_info->max_int, int_info->huge, int_info->huge);
215 mpz_add_ui (int_info->max_int, int_info->max_int, 1);
218 mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
219 mpfr_log10 (a, a, GFC_RND_MODE);
221 gfc_mpfr_to_mpz (r, a);
222 int_info->range = mpz_get_si (r);
227 for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
229 gfc_set_model_kind (real_info->kind);
235 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
236 /* a = 1 - b**(-p) */
237 mpfr_set_ui (a, 1, GFC_RND_MODE);
238 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
239 mpfr_pow_si (b, b, -real_info->digits, GFC_RND_MODE);
240 mpfr_sub (a, a, b, GFC_RND_MODE);
242 /* c = b**(emax-1) */
243 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
244 mpfr_pow_ui (c, b, real_info->max_exponent - 1, GFC_RND_MODE);
246 /* a = a * c = (1 - b**(-p)) * b**(emax-1) */
247 mpfr_mul (a, a, c, GFC_RND_MODE);
249 /* a = (1 - b**(-p)) * b**(emax-1) * b */
250 mpfr_mul_ui (a, a, real_info->radix, GFC_RND_MODE);
252 mpfr_init (real_info->huge);
253 mpfr_set (real_info->huge, a, GFC_RND_MODE);
255 /* tiny(x) = b**(emin-1) */
256 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
257 mpfr_pow_si (b, b, real_info->min_exponent - 1, GFC_RND_MODE);
259 mpfr_init (real_info->tiny);
260 mpfr_set (real_info->tiny, b, GFC_RND_MODE);
262 /* epsilon(x) = b**(1-p) */
263 mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
264 mpfr_pow_si (b, b, 1 - real_info->digits, GFC_RND_MODE);
266 mpfr_init (real_info->epsilon);
267 mpfr_set (real_info->epsilon, b, GFC_RND_MODE);
269 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
270 mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
271 mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
272 mpfr_neg (b, b, GFC_RND_MODE);
274 if (mpfr_cmp (a, b) > 0)
275 mpfr_set (a, b, GFC_RND_MODE); /* a = min(a, b) */
278 gfc_mpfr_to_mpz (r, a);
279 real_info->range = mpz_get_si (r);
281 /* precision(x) = int((p - 1) * log10(b)) + k */
282 mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
283 mpfr_log10 (a, a, GFC_RND_MODE);
285 mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
287 gfc_mpfr_to_mpz (r, a);
288 real_info->precision = mpz_get_si (r);
290 /* If the radix is an integral power of 10, add one to the
292 for (i = 10; i <= real_info->radix; i *= 10)
293 if (i == real_info->radix)
294 real_info->precision++;
305 /* Clean up, get rid of numeric constants. */
308 gfc_arith_done_1 (void)
310 gfc_integer_info *ip;
313 for (ip = gfc_integer_kinds; ip->kind; ip++)
315 mpz_clear (ip->min_int);
316 mpz_clear (ip->max_int);
317 mpz_clear (ip->huge);
320 for (rp = gfc_real_kinds; rp->kind; rp++)
322 mpfr_clear (rp->epsilon);
323 mpfr_clear (rp->huge);
324 mpfr_clear (rp->tiny);
329 /* Given an integer and a kind, make sure that the integer lies within
330 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
334 gfc_check_integer_range (mpz_t p, int kind)
339 i = gfc_validate_kind (BT_INTEGER, kind, false);
344 if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
345 result = ARITH_ASYMMETRIC;
348 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
349 || mpz_cmp (p, gfc_integer_kinds[i].max_int) > 0)
350 result = ARITH_OVERFLOW;
356 /* Given a real and a kind, make sure that the real lies within the
357 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
361 gfc_check_real_range (mpfr_t p, int kind)
367 i = gfc_validate_kind (BT_REAL, kind, false);
371 mpfr_abs (q, p, GFC_RND_MODE);
373 if (mpfr_sgn (q) == 0)
375 else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
376 retval = ARITH_OVERFLOW;
377 else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
378 retval = ARITH_UNDERFLOW;
388 /* Function to return a constant expression node of a given type and
392 gfc_constant_result (bt type, int kind, locus * where)
398 ("gfc_constant_result(): locus 'where' cannot be NULL");
400 result = gfc_get_expr ();
402 result->expr_type = EXPR_CONSTANT;
403 result->ts.type = type;
404 result->ts.kind = kind;
405 result->where = *where;
410 mpz_init (result->value.integer);
414 gfc_set_model_kind (kind);
415 mpfr_init (result->value.real);
419 gfc_set_model_kind (kind);
420 mpfr_init (result->value.complex.r);
421 mpfr_init (result->value.complex.i);
432 /* Low-level arithmetic functions. All of these subroutines assume
433 that all operands are of the same type and return an operand of the
434 same type. The other thing about these subroutines is that they
435 can fail in various ways -- overflow, underflow, division by zero,
436 zero raised to the zero, etc. */
439 gfc_arith_not (gfc_expr * op1, gfc_expr ** resultp)
443 result = gfc_constant_result (BT_LOGICAL, op1->ts.kind, &op1->where);
444 result->value.logical = !op1->value.logical;
452 gfc_arith_and (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
456 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
458 result->value.logical = op1->value.logical && op2->value.logical;
466 gfc_arith_or (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
470 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
472 result->value.logical = op1->value.logical || op2->value.logical;
480 gfc_arith_eqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
484 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
486 result->value.logical = op1->value.logical == op2->value.logical;
494 gfc_arith_neqv (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
498 result = gfc_constant_result (BT_LOGICAL, gfc_kind_max (op1, op2),
500 result->value.logical = op1->value.logical != op2->value.logical;
507 /* Make sure a constant numeric expression is within the range for
508 its type and kind. Note that there's also a gfc_check_range(),
509 but that one deals with the intrinsic RANGE function. */
512 gfc_range_check (gfc_expr * e)
519 rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
523 rc = gfc_check_real_range (e->value.real, e->ts.kind);
524 if (rc == ARITH_UNDERFLOW)
525 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
529 rc = gfc_check_real_range (e->value.complex.r, e->ts.kind);
530 if (rc == ARITH_UNDERFLOW)
531 mpfr_set_ui (e->value.complex.r, 0, GFC_RND_MODE);
532 if (rc == ARITH_OK || rc == ARITH_UNDERFLOW)
534 rc = gfc_check_real_range (e->value.complex.i, e->ts.kind);
535 if (rc == ARITH_UNDERFLOW)
536 mpfr_set_ui (e->value.complex.i, 0, GFC_RND_MODE);
542 gfc_internal_error ("gfc_range_check(): Bad type");
549 /* Several of the following routines use the same set of statements to
550 check the validity of the result. Encapsulate the checking here. */
553 check_result (arith rc, gfc_expr * x, gfc_expr * r, gfc_expr ** rp)
557 if (val == ARITH_UNDERFLOW)
559 if (gfc_option.warn_underflow)
560 gfc_warning ("%s at %L", gfc_arith_error (val), &x->where);
564 if (val == ARITH_ASYMMETRIC)
566 gfc_warning ("%s at %L", gfc_arith_error (val), &x->where);
579 /* It may seem silly to have a subroutine that actually computes the
580 unary plus of a constant, but it prevents us from making exceptions
581 in the code elsewhere. */
584 gfc_arith_uplus (gfc_expr * op1, gfc_expr ** resultp)
586 *resultp = gfc_copy_expr (op1);
592 gfc_arith_uminus (gfc_expr * op1, gfc_expr ** resultp)
597 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
599 switch (op1->ts.type)
602 mpz_neg (result->value.integer, op1->value.integer);
606 mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
610 mpfr_neg (result->value.complex.r, op1->value.complex.r, GFC_RND_MODE);
611 mpfr_neg (result->value.complex.i, op1->value.complex.i, GFC_RND_MODE);
615 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
618 rc = gfc_range_check (result);
620 return check_result (rc, op1, result, resultp);
625 gfc_arith_plus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
630 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
632 switch (op1->ts.type)
635 mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
639 mpfr_add (result->value.real, op1->value.real, op2->value.real,
644 mpfr_add (result->value.complex.r, op1->value.complex.r,
645 op2->value.complex.r, GFC_RND_MODE);
647 mpfr_add (result->value.complex.i, op1->value.complex.i,
648 op2->value.complex.i, GFC_RND_MODE);
652 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
655 rc = gfc_range_check (result);
657 return check_result (rc, op1, result, resultp);
662 gfc_arith_minus (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
667 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
669 switch (op1->ts.type)
672 mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
676 mpfr_sub (result->value.real, op1->value.real, op2->value.real,
681 mpfr_sub (result->value.complex.r, op1->value.complex.r,
682 op2->value.complex.r, GFC_RND_MODE);
684 mpfr_sub (result->value.complex.i, op1->value.complex.i,
685 op2->value.complex.i, GFC_RND_MODE);
689 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
692 rc = gfc_range_check (result);
694 return check_result (rc, op1, result, resultp);
699 gfc_arith_times (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
705 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
707 switch (op1->ts.type)
710 mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
714 mpfr_mul (result->value.real, op1->value.real, op2->value.real,
720 /* FIXME: possible numericals problem. */
722 gfc_set_model (op1->value.complex.r);
726 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
727 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
728 mpfr_sub (result->value.complex.r, x, y, GFC_RND_MODE);
730 mpfr_mul (x, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
731 mpfr_mul (y, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
732 mpfr_add (result->value.complex.i, x, y, GFC_RND_MODE);
740 gfc_internal_error ("gfc_arith_times(): Bad basic type");
743 rc = gfc_range_check (result);
745 return check_result (rc, op1, result, resultp);
750 gfc_arith_divide (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
758 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
760 switch (op1->ts.type)
763 if (mpz_sgn (op2->value.integer) == 0)
769 mpz_tdiv_q (result->value.integer, op1->value.integer,
774 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
775 if (mpfr_sgn (op2->value.real) == 0)
781 mpfr_div (result->value.real, op1->value.real, op2->value.real,
786 /* FIXME: MPFR correctly generates NaN. This may not be needed. */
787 if (mpfr_sgn (op2->value.complex.r) == 0
788 && mpfr_sgn (op2->value.complex.i) == 0)
794 gfc_set_model (op1->value.complex.r);
799 /* FIXME: possible numerical problems. */
800 mpfr_mul (x, op2->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
801 mpfr_mul (y, op2->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
802 mpfr_add (div, x, y, GFC_RND_MODE);
804 mpfr_mul (x, op1->value.complex.r, op2->value.complex.r, GFC_RND_MODE);
805 mpfr_mul (y, op1->value.complex.i, op2->value.complex.i, GFC_RND_MODE);
806 mpfr_add (result->value.complex.r, x, y, GFC_RND_MODE);
807 mpfr_div (result->value.complex.r, result->value.complex.r, div,
810 mpfr_mul (x, op1->value.complex.i, op2->value.complex.r, GFC_RND_MODE);
811 mpfr_mul (y, op1->value.complex.r, op2->value.complex.i, GFC_RND_MODE);
812 mpfr_sub (result->value.complex.i, x, y, GFC_RND_MODE);
813 mpfr_div (result->value.complex.i, result->value.complex.i, div,
823 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
827 rc = gfc_range_check (result);
829 return check_result (rc, op1, result, resultp);
833 /* Compute the reciprocal of a complex number (guaranteed nonzero). */
836 complex_reciprocal (gfc_expr * op)
838 mpfr_t mod, a, re, im;
840 gfc_set_model (op->value.complex.r);
846 /* FIXME: another possible numerical problem. */
847 mpfr_mul (mod, op->value.complex.r, op->value.complex.r, GFC_RND_MODE);
848 mpfr_mul (a, op->value.complex.i, op->value.complex.i, GFC_RND_MODE);
849 mpfr_add (mod, mod, a, GFC_RND_MODE);
851 mpfr_div (re, op->value.complex.r, mod, GFC_RND_MODE);
853 mpfr_neg (im, op->value.complex.i, GFC_RND_MODE);
854 mpfr_div (im, im, mod, GFC_RND_MODE);
856 mpfr_set (op->value.complex.r, re, GFC_RND_MODE);
857 mpfr_set (op->value.complex.i, im, GFC_RND_MODE);
866 /* Raise a complex number to positive power. */
869 complex_pow_ui (gfc_expr * base, int power, gfc_expr * result)
873 gfc_set_model (base->value.complex.r);
878 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
879 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
881 for (; power > 0; power--)
883 mpfr_mul (re, base->value.complex.r, result->value.complex.r,
885 mpfr_mul (a, base->value.complex.i, result->value.complex.i,
887 mpfr_sub (re, re, a, GFC_RND_MODE);
889 mpfr_mul (im, base->value.complex.r, result->value.complex.i,
891 mpfr_mul (a, base->value.complex.i, result->value.complex.r,
893 mpfr_add (im, im, a, GFC_RND_MODE);
895 mpfr_set (result->value.complex.r, re, GFC_RND_MODE);
896 mpfr_set (result->value.complex.i, im, GFC_RND_MODE);
905 /* Raise a number to an integer power. */
908 gfc_arith_power (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
918 if (gfc_extract_int (op2, &power) != NULL)
919 gfc_internal_error ("gfc_arith_power(): Bad exponent");
921 result = gfc_constant_result (op1->ts.type, op1->ts.kind, &op1->where);
925 /* Handle something to the zeroth power. Since we're dealing
926 with integral exponents, there is no ambiguity in the
927 limiting procedure used to determine the value of 0**0. */
928 switch (op1->ts.type)
931 mpz_set_ui (result->value.integer, 1);
935 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
939 mpfr_set_ui (result->value.complex.r, 1, GFC_RND_MODE);
940 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
944 gfc_internal_error ("gfc_arith_power(): Bad base");
953 switch (op1->ts.type)
956 mpz_pow_ui (result->value.integer, op1->value.integer, apower);
960 mpz_init_set_ui (unity_z, 1);
961 mpz_tdiv_q (result->value.integer, unity_z,
962 result->value.integer);
969 mpfr_pow_ui (result->value.real, op1->value.real, apower,
974 gfc_set_model (op1->value.real);
976 mpfr_set_ui (unity_f, 1, GFC_RND_MODE);
977 mpfr_div (result->value.real, unity_f, result->value.real,
979 mpfr_clear (unity_f);
984 complex_pow_ui (op1, apower, result);
986 complex_reciprocal (result);
995 rc = gfc_range_check (result);
997 return check_result (rc, op1, result, resultp);
1001 /* Concatenate two string constants. */
1004 gfc_arith_concat (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1009 result = gfc_constant_result (BT_CHARACTER, gfc_default_character_kind,
1012 len = op1->value.character.length + op2->value.character.length;
1014 result->value.character.string = gfc_getmem (len + 1);
1015 result->value.character.length = len;
1017 memcpy (result->value.character.string, op1->value.character.string,
1018 op1->value.character.length);
1020 memcpy (result->value.character.string + op1->value.character.length,
1021 op2->value.character.string, op2->value.character.length);
1023 result->value.character.string[len] = '\0';
1031 /* Comparison operators. Assumes that the two expression nodes
1032 contain two constants of the same type. */
1035 gfc_compare_expr (gfc_expr * op1, gfc_expr * op2)
1039 switch (op1->ts.type)
1042 rc = mpz_cmp (op1->value.integer, op2->value.integer);
1046 rc = mpfr_cmp (op1->value.real, op2->value.real);
1050 rc = gfc_compare_string (op1, op2, NULL);
1054 rc = ((!op1->value.logical && op2->value.logical)
1055 || (op1->value.logical && !op2->value.logical));
1059 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1066 /* Compare a pair of complex numbers. Naturally, this is only for
1067 equality/nonequality. */
1070 compare_complex (gfc_expr * op1, gfc_expr * op2)
1072 return (mpfr_cmp (op1->value.complex.r, op2->value.complex.r) == 0
1073 && mpfr_cmp (op1->value.complex.i, op2->value.complex.i) == 0);
1077 /* Given two constant strings and the inverse collating sequence,
1078 compare the strings. We return -1 for a<b, 0 for a==b and 1 for
1079 a>b. If the xcoll_table is NULL, we use the processor's default
1080 collating sequence. */
1083 gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
1085 int len, alen, blen, i, ac, bc;
1087 alen = a->value.character.length;
1088 blen = b->value.character.length;
1090 len = (alen > blen) ? alen : blen;
1092 for (i = 0; i < len; i++)
1094 ac = (i < alen) ? a->value.character.string[i] : ' ';
1095 bc = (i < blen) ? b->value.character.string[i] : ' ';
1097 if (xcoll_table != NULL)
1099 ac = xcoll_table[ac];
1100 bc = xcoll_table[bc];
1109 /* Strings are equal */
1115 /* Specific comparison subroutines. */
1118 gfc_arith_eq (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1122 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1124 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1125 compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) == 0);
1133 gfc_arith_ne (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1137 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1139 result->value.logical = (op1->ts.type == BT_COMPLEX) ?
1140 !compare_complex (op1, op2) : (gfc_compare_expr (op1, op2) != 0);
1148 gfc_arith_gt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1152 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1154 result->value.logical = (gfc_compare_expr (op1, op2) > 0);
1162 gfc_arith_ge (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1166 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1168 result->value.logical = (gfc_compare_expr (op1, op2) >= 0);
1176 gfc_arith_lt (gfc_expr * op1, gfc_expr * op2, gfc_expr ** resultp)
1180 result = gfc_constant_result (BT_LOGICAL, gfc_default_logical_kind,
1182 result->value.logical = (gfc_compare_expr (op1, op2) < 0);
1190 gfc_arith_le (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 reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr * op,
1207 gfc_constructor *c, *head;
1211 if (op->expr_type == EXPR_CONSTANT)
1212 return eval (op, result);
1215 head = gfc_copy_constructor (op->value.constructor);
1217 for (c = head; c; c = c->next)
1219 rc = eval (c->expr, &r);
1223 gfc_replace_expr (c->expr, r);
1227 gfc_free_constructor (head);
1230 r = gfc_get_expr ();
1231 r->expr_type = EXPR_ARRAY;
1232 r->value.constructor = head;
1233 r->shape = gfc_copy_shape (op->shape, op->rank);
1235 r->ts = head->expr->ts;
1236 r->where = op->where;
1247 reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1248 gfc_expr * op1, gfc_expr * op2,
1251 gfc_constructor *c, *head;
1255 head = gfc_copy_constructor (op1->value.constructor);
1258 for (c = head; c; c = c->next)
1260 rc = eval (c->expr, op2, &r);
1264 gfc_replace_expr (c->expr, r);
1268 gfc_free_constructor (head);
1271 r = gfc_get_expr ();
1272 r->expr_type = EXPR_ARRAY;
1273 r->value.constructor = head;
1274 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1276 r->ts = head->expr->ts;
1277 r->where = op1->where;
1278 r->rank = op1->rank;
1288 reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1289 gfc_expr * op1, gfc_expr * op2,
1292 gfc_constructor *c, *head;
1296 head = gfc_copy_constructor (op2->value.constructor);
1299 for (c = head; c; c = c->next)
1301 rc = eval (op1, c->expr, &r);
1305 gfc_replace_expr (c->expr, r);
1309 gfc_free_constructor (head);
1312 r = gfc_get_expr ();
1313 r->expr_type = EXPR_ARRAY;
1314 r->value.constructor = head;
1315 r->shape = gfc_copy_shape (op2->shape, op2->rank);
1317 r->ts = head->expr->ts;
1318 r->where = op2->where;
1319 r->rank = op2->rank;
1329 reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1330 gfc_expr * op1, gfc_expr * op2,
1333 gfc_constructor *c, *d, *head;
1337 head = gfc_copy_constructor (op1->value.constructor);
1340 d = op2->value.constructor;
1342 if (gfc_check_conformance ("Elemental binary operation", op1, op2)
1344 rc = ARITH_INCOMMENSURATE;
1348 for (c = head; c; c = c->next, d = d->next)
1352 rc = ARITH_INCOMMENSURATE;
1356 rc = eval (c->expr, d->expr, &r);
1360 gfc_replace_expr (c->expr, r);
1364 rc = ARITH_INCOMMENSURATE;
1368 gfc_free_constructor (head);
1371 r = gfc_get_expr ();
1372 r->expr_type = EXPR_ARRAY;
1373 r->value.constructor = head;
1374 r->shape = gfc_copy_shape (op1->shape, op1->rank);
1376 r->ts = head->expr->ts;
1377 r->where = op1->where;
1378 r->rank = op1->rank;
1388 reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1389 gfc_expr * op1, gfc_expr * op2,
1392 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1393 return eval (op1, op2, result);
1395 if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1396 return reduce_binary_ca (eval, op1, op2, result);
1398 if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1399 return reduce_binary_ac (eval, op1, op2, result);
1401 return reduce_binary_aa (eval, op1, op2, result);
1407 arith (*f2)(gfc_expr *, gfc_expr **);
1408 arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1412 /* High level arithmetic subroutines. These subroutines go into
1413 eval_intrinsic(), which can do one of several things to its
1414 operands. If the operands are incompatible with the intrinsic
1415 operation, we return a node pointing to the operands and hope that
1416 an operator interface is found during resolution.
1418 If the operands are compatible and are constants, then we try doing
1419 the arithmetic. We also handle the cases where either or both
1420 operands are array constructors. */
1423 eval_intrinsic (gfc_intrinsic_op operator,
1424 eval_f eval, gfc_expr * op1, gfc_expr * op2)
1426 gfc_expr temp, *result;
1430 gfc_clear_ts (&temp.ts);
1434 case INTRINSIC_NOT: /* Logical unary */
1435 if (op1->ts.type != BT_LOGICAL)
1438 temp.ts.type = BT_LOGICAL;
1439 temp.ts.kind = gfc_default_logical_kind;
1444 /* Logical binary operators */
1447 case INTRINSIC_NEQV:
1449 if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1452 temp.ts.type = BT_LOGICAL;
1453 temp.ts.kind = gfc_default_logical_kind;
1458 case INTRINSIC_UPLUS:
1459 case INTRINSIC_UMINUS: /* Numeric unary */
1460 if (!gfc_numeric_ts (&op1->ts))
1469 case INTRINSIC_LT: /* Additional restrictions */
1470 case INTRINSIC_LE: /* for ordering relations. */
1472 if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1474 temp.ts.type = BT_LOGICAL;
1475 temp.ts.kind = gfc_default_logical_kind;
1479 /* else fall through */
1483 if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1486 temp.ts.type = BT_LOGICAL;
1487 temp.ts.kind = gfc_default_logical_kind;
1491 /* else fall through */
1493 case INTRINSIC_PLUS:
1494 case INTRINSIC_MINUS:
1495 case INTRINSIC_TIMES:
1496 case INTRINSIC_DIVIDE:
1497 case INTRINSIC_POWER: /* Numeric binary */
1498 if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1501 /* Insert any necessary type conversions to make the operands compatible. */
1503 temp.expr_type = EXPR_OP;
1504 gfc_clear_ts (&temp.ts);
1505 temp.value.op.operator = operator;
1507 temp.value.op.op1 = op1;
1508 temp.value.op.op2 = op2;
1510 gfc_type_convert_binary (&temp);
1512 if (operator == INTRINSIC_EQ || operator == INTRINSIC_NE
1513 || operator == INTRINSIC_GE || operator == INTRINSIC_GT
1514 || operator == INTRINSIC_LE || operator == INTRINSIC_LT)
1516 temp.ts.type = BT_LOGICAL;
1517 temp.ts.kind = gfc_default_logical_kind;
1523 case INTRINSIC_CONCAT: /* Character binary */
1524 if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER)
1527 temp.ts.type = BT_CHARACTER;
1528 temp.ts.kind = gfc_default_character_kind;
1533 case INTRINSIC_USER:
1537 gfc_internal_error ("eval_intrinsic(): Bad operator");
1540 /* Try to combine the operators. */
1541 if (operator == INTRINSIC_POWER && op2->ts.type != BT_INTEGER)
1544 if (op1->expr_type != EXPR_CONSTANT
1545 && (op1->expr_type != EXPR_ARRAY
1546 || !gfc_is_constant_expr (op1)
1547 || !gfc_expanded_ac (op1)))
1551 && op2->expr_type != EXPR_CONSTANT
1552 && (op2->expr_type != EXPR_ARRAY
1553 || !gfc_is_constant_expr (op2)
1554 || !gfc_expanded_ac (op2)))
1558 rc = reduce_unary (eval.f2, op1, &result);
1560 rc = reduce_binary (eval.f3, op1, op2, &result);
1563 { /* Something went wrong */
1564 gfc_error ("%s at %L", gfc_arith_error (rc), &op1->where);
1568 gfc_free_expr (op1);
1569 gfc_free_expr (op2);
1573 /* Create a run-time expression */
1574 result = gfc_get_expr ();
1575 result->ts = temp.ts;
1577 result->expr_type = EXPR_OP;
1578 result->value.op.operator = operator;
1580 result->value.op.op1 = op1;
1581 result->value.op.op2 = op2;
1583 result->where = op1->where;
1589 /* Modify type of expression for zero size array. */
1591 eval_type_intrinsic0 (gfc_intrinsic_op operator, gfc_expr *op)
1594 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1604 op->ts.type = BT_LOGICAL;
1605 op->ts.kind = gfc_default_logical_kind;
1616 /* Return nonzero if the expression is a zero size array. */
1619 gfc_zero_size_array (gfc_expr * e)
1621 if (e->expr_type != EXPR_ARRAY)
1624 return e->value.constructor == NULL;
1628 /* Reduce a binary expression where at least one of the operands
1629 involves a zero-length array. Returns NULL if neither of the
1630 operands is a zero-length array. */
1633 reduce_binary0 (gfc_expr * op1, gfc_expr * op2)
1635 if (gfc_zero_size_array (op1))
1637 gfc_free_expr (op2);
1641 if (gfc_zero_size_array (op2))
1643 gfc_free_expr (op1);
1652 eval_intrinsic_f2 (gfc_intrinsic_op operator,
1653 arith (*eval) (gfc_expr *, gfc_expr **),
1654 gfc_expr * op1, gfc_expr * op2)
1661 if (gfc_zero_size_array (op1))
1662 return eval_type_intrinsic0 (operator, op1);
1666 result = reduce_binary0 (op1, op2);
1668 return eval_type_intrinsic0 (operator, result);
1672 return eval_intrinsic (operator, f, op1, op2);
1677 eval_intrinsic_f3 (gfc_intrinsic_op operator,
1678 arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1679 gfc_expr * op1, gfc_expr * op2)
1684 result = reduce_binary0 (op1, op2);
1686 return eval_type_intrinsic0(operator, result);
1689 return eval_intrinsic (operator, f, op1, op2);
1695 gfc_uplus (gfc_expr * op)
1697 return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_uplus, op, NULL);
1701 gfc_uminus (gfc_expr * op)
1703 return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1707 gfc_add (gfc_expr * op1, gfc_expr * op2)
1709 return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1713 gfc_subtract (gfc_expr * op1, gfc_expr * op2)
1715 return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1719 gfc_multiply (gfc_expr * op1, gfc_expr * op2)
1721 return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1725 gfc_divide (gfc_expr * op1, gfc_expr * op2)
1727 return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1731 gfc_power (gfc_expr * op1, gfc_expr * op2)
1733 return eval_intrinsic_f3 (INTRINSIC_POWER, gfc_arith_power, op1, op2);
1737 gfc_concat (gfc_expr * op1, gfc_expr * op2)
1739 return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1743 gfc_and (gfc_expr * op1, gfc_expr * op2)
1745 return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1749 gfc_or (gfc_expr * op1, gfc_expr * op2)
1751 return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1755 gfc_not (gfc_expr * op1)
1757 return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1761 gfc_eqv (gfc_expr * op1, gfc_expr * op2)
1763 return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1767 gfc_neqv (gfc_expr * op1, gfc_expr * op2)
1769 return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1773 gfc_eq (gfc_expr * op1, gfc_expr * op2)
1775 return eval_intrinsic_f3 (INTRINSIC_EQ, gfc_arith_eq, op1, op2);
1779 gfc_ne (gfc_expr * op1, gfc_expr * op2)
1781 return eval_intrinsic_f3 (INTRINSIC_NE, gfc_arith_ne, op1, op2);
1785 gfc_gt (gfc_expr * op1, gfc_expr * op2)
1787 return eval_intrinsic_f3 (INTRINSIC_GT, gfc_arith_gt, op1, op2);
1791 gfc_ge (gfc_expr * op1, gfc_expr * op2)
1793 return eval_intrinsic_f3 (INTRINSIC_GE, gfc_arith_ge, op1, op2);
1797 gfc_lt (gfc_expr * op1, gfc_expr * op2)
1799 return eval_intrinsic_f3 (INTRINSIC_LT, gfc_arith_lt, op1, op2);
1803 gfc_le (gfc_expr * op1, gfc_expr * op2)
1805 return eval_intrinsic_f3 (INTRINSIC_LE, gfc_arith_le, op1, op2);
1809 /* Convert an integer string to an expression node. */
1812 gfc_convert_integer (const char *buffer, int kind, int radix, locus * where)
1817 e = gfc_constant_result (BT_INTEGER, kind, where);
1818 /* a leading plus is allowed, but not by mpz_set_str */
1819 if (buffer[0] == '+')
1823 mpz_set_str (e->value.integer, t, radix);
1829 /* Convert a real string to an expression node. */
1832 gfc_convert_real (const char *buffer, int kind, locus * where)
1836 e = gfc_constant_result (BT_REAL, kind, where);
1837 mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
1843 /* Convert a pair of real, constant expression nodes to a single
1844 complex expression node. */
1847 gfc_convert_complex (gfc_expr * real, gfc_expr * imag, int kind)
1851 e = gfc_constant_result (BT_COMPLEX, kind, &real->where);
1852 mpfr_set (e->value.complex.r, real->value.real, GFC_RND_MODE);
1853 mpfr_set (e->value.complex.i, imag->value.real, GFC_RND_MODE);
1859 /******* Simplification of intrinsic functions with constant arguments *****/
1862 /* Deal with an arithmetic error. */
1865 arith_error (arith rc, gfc_typespec * from, gfc_typespec * to, locus * where)
1867 gfc_error ("%s converting %s to %s at %L", gfc_arith_error (rc),
1868 gfc_typename (from), gfc_typename (to), where);
1870 /* TODO: Do something about the error, ie, throw exception, return
1874 /* Convert integers to integers. */
1877 gfc_int2int (gfc_expr * src, int kind)
1882 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1884 mpz_set (result->value.integer, src->value.integer);
1886 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1889 if (rc == ARITH_ASYMMETRIC)
1891 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
1895 arith_error (rc, &src->ts, &result->ts, &src->where);
1896 gfc_free_expr (result);
1905 /* Convert integers to reals. */
1908 gfc_int2real (gfc_expr * src, int kind)
1913 result = gfc_constant_result (BT_REAL, kind, &src->where);
1915 mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
1917 if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
1919 arith_error (rc, &src->ts, &result->ts, &src->where);
1920 gfc_free_expr (result);
1928 /* Convert default integer to default complex. */
1931 gfc_int2complex (gfc_expr * src, int kind)
1936 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
1938 mpfr_set_z (result->value.complex.r, src->value.integer, GFC_RND_MODE);
1939 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
1941 if ((rc = gfc_check_real_range (result->value.complex.r, kind)) != ARITH_OK)
1943 arith_error (rc, &src->ts, &result->ts, &src->where);
1944 gfc_free_expr (result);
1952 /* Convert default real to default integer. */
1955 gfc_real2int (gfc_expr * src, int kind)
1960 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
1962 gfc_mpfr_to_mpz (result->value.integer, src->value.real);
1964 if ((rc = gfc_check_integer_range (result->value.integer, kind))
1967 arith_error (rc, &src->ts, &result->ts, &src->where);
1968 gfc_free_expr (result);
1976 /* Convert real to real. */
1979 gfc_real2real (gfc_expr * src, int kind)
1984 result = gfc_constant_result (BT_REAL, kind, &src->where);
1986 mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
1988 rc = gfc_check_real_range (result->value.real, kind);
1990 if (rc == ARITH_UNDERFLOW)
1992 if (gfc_option.warn_underflow)
1993 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
1994 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1996 else if (rc != ARITH_OK)
1998 arith_error (rc, &src->ts, &result->ts, &src->where);
1999 gfc_free_expr (result);
2007 /* Convert real to complex. */
2010 gfc_real2complex (gfc_expr * src, int kind)
2015 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2017 mpfr_set (result->value.complex.r, src->value.real, GFC_RND_MODE);
2018 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2020 rc = gfc_check_real_range (result->value.complex.r, kind);
2022 if (rc == ARITH_UNDERFLOW)
2024 if (gfc_option.warn_underflow)
2025 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2026 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2028 else if (rc != ARITH_OK)
2030 arith_error (rc, &src->ts, &result->ts, &src->where);
2031 gfc_free_expr (result);
2039 /* Convert complex to integer. */
2042 gfc_complex2int (gfc_expr * src, int kind)
2047 result = gfc_constant_result (BT_INTEGER, kind, &src->where);
2049 gfc_mpfr_to_mpz (result->value.integer, src->value.complex.r);
2051 if ((rc = gfc_check_integer_range (result->value.integer, kind))
2054 arith_error (rc, &src->ts, &result->ts, &src->where);
2055 gfc_free_expr (result);
2063 /* Convert complex to real. */
2066 gfc_complex2real (gfc_expr * src, int kind)
2071 result = gfc_constant_result (BT_REAL, kind, &src->where);
2073 mpfr_set (result->value.real, src->value.complex.r, GFC_RND_MODE);
2075 rc = gfc_check_real_range (result->value.real, kind);
2077 if (rc == ARITH_UNDERFLOW)
2079 if (gfc_option.warn_underflow)
2080 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2081 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2085 arith_error (rc, &src->ts, &result->ts, &src->where);
2086 gfc_free_expr (result);
2094 /* Convert complex to complex. */
2097 gfc_complex2complex (gfc_expr * src, int kind)
2102 result = gfc_constant_result (BT_COMPLEX, kind, &src->where);
2104 mpfr_set (result->value.complex.r, src->value.complex.r, GFC_RND_MODE);
2105 mpfr_set (result->value.complex.i, src->value.complex.i, GFC_RND_MODE);
2107 rc = gfc_check_real_range (result->value.complex.r, kind);
2109 if (rc == ARITH_UNDERFLOW)
2111 if (gfc_option.warn_underflow)
2112 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2113 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
2115 else if (rc != ARITH_OK)
2117 arith_error (rc, &src->ts, &result->ts, &src->where);
2118 gfc_free_expr (result);
2122 rc = gfc_check_real_range (result->value.complex.i, kind);
2124 if (rc == ARITH_UNDERFLOW)
2126 if (gfc_option.warn_underflow)
2127 gfc_warning ("%s at %L", gfc_arith_error (rc), &src->where);
2128 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
2130 else if (rc != ARITH_OK)
2132 arith_error (rc, &src->ts, &result->ts, &src->where);
2133 gfc_free_expr (result);
2141 /* Logical kind conversion. */
2144 gfc_log2log (gfc_expr * src, int kind)
2148 result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
2149 result->value.logical = src->value.logical;