2 Copyright (C) 2000-2013 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* Since target arithmetic must be done on the host, there has to
22 be some way of evaluating arithmetic expressions as the host
23 would evaluate them. We use the GNU MP library and the MPFR
24 library to do arithmetic, and this file provides the interface. */
28 #include "coretypes.h"
32 #include "target-memory.h"
33 #include "constructor.h"
35 /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
36 It's easily implemented with a few calls though. */
39 gfc_mpfr_to_mpz (mpz_t z
, mpfr_t x
, locus
*where
)
43 if (mpfr_inf_p (x
) || mpfr_nan_p (x
))
45 gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
51 e
= mpfr_get_z_exp (z
, x
);
54 mpz_mul_2exp (z
, z
, e
);
56 mpz_tdiv_q_2exp (z
, z
, -e
);
60 /* Set the model number precision by the requested KIND. */
63 gfc_set_model_kind (int kind
)
65 int index
= gfc_validate_kind (BT_REAL
, kind
, false);
68 base2prec
= gfc_real_kinds
[index
].digits
;
69 if (gfc_real_kinds
[index
].radix
!= 2)
70 base2prec
*= gfc_real_kinds
[index
].radix
/ 2;
71 mpfr_set_default_prec (base2prec
);
75 /* Set the model number precision from mpfr_t x. */
78 gfc_set_model (mpfr_t x
)
80 mpfr_set_default_prec (mpfr_get_prec (x
));
84 /* Given an arithmetic error code, return a pointer to a string that
85 explains the error. */
88 gfc_arith_error (arith code
)
95 p
= _("Arithmetic OK at %L");
98 p
= _("Arithmetic overflow at %L");
100 case ARITH_UNDERFLOW
:
101 p
= _("Arithmetic underflow at %L");
104 p
= _("Arithmetic NaN at %L");
107 p
= _("Division by zero at %L");
109 case ARITH_INCOMMENSURATE
:
110 p
= _("Array operands are incommensurate at %L");
112 case ARITH_ASYMMETRIC
:
114 _("Integer outside symmetric range implied by Standard Fortran at %L");
117 gfc_internal_error ("gfc_arith_error(): Bad error code");
124 /* Get things ready to do math. */
127 gfc_arith_init_1 (void)
129 gfc_integer_info
*int_info
;
130 gfc_real_info
*real_info
;
134 mpfr_set_default_prec (128);
137 /* Convert the minimum and maximum values for each kind into their
138 GNU MP representation. */
139 for (int_info
= gfc_integer_kinds
; int_info
->kind
!= 0; int_info
++)
142 mpz_init (int_info
->huge
);
143 mpz_set_ui (int_info
->huge
, int_info
->radix
);
144 mpz_pow_ui (int_info
->huge
, int_info
->huge
, int_info
->digits
);
145 mpz_sub_ui (int_info
->huge
, int_info
->huge
, 1);
147 /* These are the numbers that are actually representable by the
148 target. For bases other than two, this needs to be changed. */
149 if (int_info
->radix
!= 2)
150 gfc_internal_error ("Fix min_int calculation");
152 /* See PRs 13490 and 17912, related to integer ranges.
153 The pedantic_min_int exists for range checking when a program
154 is compiled with -pedantic, and reflects the belief that
155 Standard Fortran requires integers to be symmetrical, i.e.
156 every negative integer must have a representable positive
157 absolute value, and vice versa. */
159 mpz_init (int_info
->pedantic_min_int
);
160 mpz_neg (int_info
->pedantic_min_int
, int_info
->huge
);
162 mpz_init (int_info
->min_int
);
163 mpz_sub_ui (int_info
->min_int
, int_info
->pedantic_min_int
, 1);
166 mpfr_set_z (a
, int_info
->huge
, GFC_RND_MODE
);
167 mpfr_log10 (a
, a
, GFC_RND_MODE
);
169 int_info
->range
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
174 for (real_info
= gfc_real_kinds
; real_info
->kind
!= 0; real_info
++)
176 gfc_set_model_kind (real_info
->kind
);
181 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
183 mpfr_init (real_info
->huge
);
184 mpfr_set_ui (real_info
->huge
, 1, GFC_RND_MODE
);
185 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
186 mpfr_pow_si (a
, a
, -real_info
->digits
, GFC_RND_MODE
);
187 mpfr_sub (real_info
->huge
, real_info
->huge
, a
, GFC_RND_MODE
);
190 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
191 mpfr_pow_ui (a
, a
, real_info
->max_exponent
- 1, GFC_RND_MODE
);
193 /* (1 - b**(-p)) * b**(emax-1) */
194 mpfr_mul (real_info
->huge
, real_info
->huge
, a
, GFC_RND_MODE
);
196 /* (1 - b**(-p)) * b**(emax-1) * b */
197 mpfr_mul_ui (real_info
->huge
, real_info
->huge
, real_info
->radix
,
200 /* tiny(x) = b**(emin-1) */
201 mpfr_init (real_info
->tiny
);
202 mpfr_set_ui (real_info
->tiny
, real_info
->radix
, GFC_RND_MODE
);
203 mpfr_pow_si (real_info
->tiny
, real_info
->tiny
,
204 real_info
->min_exponent
- 1, GFC_RND_MODE
);
206 /* subnormal (x) = b**(emin - digit) */
207 mpfr_init (real_info
->subnormal
);
208 mpfr_set_ui (real_info
->subnormal
, real_info
->radix
, GFC_RND_MODE
);
209 mpfr_pow_si (real_info
->subnormal
, real_info
->subnormal
,
210 real_info
->min_exponent
- real_info
->digits
, GFC_RND_MODE
);
212 /* epsilon(x) = b**(1-p) */
213 mpfr_init (real_info
->epsilon
);
214 mpfr_set_ui (real_info
->epsilon
, real_info
->radix
, GFC_RND_MODE
);
215 mpfr_pow_si (real_info
->epsilon
, real_info
->epsilon
,
216 1 - real_info
->digits
, GFC_RND_MODE
);
218 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
219 mpfr_log10 (a
, real_info
->huge
, GFC_RND_MODE
);
220 mpfr_log10 (b
, real_info
->tiny
, GFC_RND_MODE
);
221 mpfr_neg (b
, b
, GFC_RND_MODE
);
224 mpfr_min (a
, a
, b
, GFC_RND_MODE
);
226 real_info
->range
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
228 /* precision(x) = int((p - 1) * log10(b)) + k */
229 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
230 mpfr_log10 (a
, a
, GFC_RND_MODE
);
231 mpfr_mul_ui (a
, a
, real_info
->digits
- 1, GFC_RND_MODE
);
233 real_info
->precision
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
235 /* If the radix is an integral power of 10, add one to the precision. */
236 for (i
= 10; i
<= real_info
->radix
; i
*= 10)
237 if (i
== real_info
->radix
)
238 real_info
->precision
++;
240 mpfr_clears (a
, b
, NULL
);
245 /* Clean up, get rid of numeric constants. */
248 gfc_arith_done_1 (void)
250 gfc_integer_info
*ip
;
253 for (ip
= gfc_integer_kinds
; ip
->kind
; ip
++)
255 mpz_clear (ip
->min_int
);
256 mpz_clear (ip
->pedantic_min_int
);
257 mpz_clear (ip
->huge
);
260 for (rp
= gfc_real_kinds
; rp
->kind
; rp
++)
261 mpfr_clears (rp
->epsilon
, rp
->huge
, rp
->tiny
, rp
->subnormal
, NULL
);
267 /* Given a wide character value and a character kind, determine whether
268 the character is representable for that kind. */
270 gfc_check_character_range (gfc_char_t c
, int kind
)
272 /* As wide characters are stored as 32-bit values, they're all
273 representable in UCS=4. */
278 return c
<= 255 ? true : false;
284 /* Given an integer and a kind, make sure that the integer lies within
285 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
289 gfc_check_integer_range (mpz_t p
, int kind
)
294 i
= gfc_validate_kind (BT_INTEGER
, kind
, false);
299 if (mpz_cmp (p
, gfc_integer_kinds
[i
].pedantic_min_int
) < 0)
300 result
= ARITH_ASYMMETRIC
;
304 if (gfc_option
.flag_range_check
== 0)
307 if (mpz_cmp (p
, gfc_integer_kinds
[i
].min_int
) < 0
308 || mpz_cmp (p
, gfc_integer_kinds
[i
].huge
) > 0)
309 result
= ARITH_OVERFLOW
;
315 /* Given a real and a kind, make sure that the real lies within the
316 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
320 gfc_check_real_range (mpfr_t p
, int kind
)
326 i
= gfc_validate_kind (BT_REAL
, kind
, false);
330 mpfr_abs (q
, p
, GFC_RND_MODE
);
336 if (gfc_option
.flag_range_check
!= 0)
337 retval
= ARITH_OVERFLOW
;
339 else if (mpfr_nan_p (p
))
341 if (gfc_option
.flag_range_check
!= 0)
344 else if (mpfr_sgn (q
) == 0)
349 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].huge
) > 0)
351 if (gfc_option
.flag_range_check
== 0)
352 mpfr_set_inf (p
, mpfr_sgn (p
));
354 retval
= ARITH_OVERFLOW
;
356 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].subnormal
) < 0)
358 if (gfc_option
.flag_range_check
== 0)
360 if (mpfr_sgn (p
) < 0)
362 mpfr_set_ui (p
, 0, GFC_RND_MODE
);
363 mpfr_set_si (q
, -1, GFC_RND_MODE
);
364 mpfr_copysign (p
, p
, q
, GFC_RND_MODE
);
367 mpfr_set_ui (p
, 0, GFC_RND_MODE
);
370 retval
= ARITH_UNDERFLOW
;
372 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].tiny
) < 0)
377 /* Save current values of emin and emax. */
378 emin
= mpfr_get_emin ();
379 emax
= mpfr_get_emax ();
381 /* Set emin and emax for the current model number. */
382 en
= gfc_real_kinds
[i
].min_exponent
- gfc_real_kinds
[i
].digits
+ 1;
383 mpfr_set_emin ((mp_exp_t
) en
);
384 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[i
].max_exponent
);
385 mpfr_check_range (q
, 0, GFC_RND_MODE
);
386 mpfr_subnormalize (q
, 0, GFC_RND_MODE
);
388 /* Reset emin and emax. */
389 mpfr_set_emin (emin
);
390 mpfr_set_emax (emax
);
392 /* Copy sign if needed. */
393 if (mpfr_sgn (p
) < 0)
394 mpfr_neg (p
, q
, GMP_RNDN
);
396 mpfr_set (p
, q
, GMP_RNDN
);
405 /* Low-level arithmetic functions. All of these subroutines assume
406 that all operands are of the same type and return an operand of the
407 same type. The other thing about these subroutines is that they
408 can fail in various ways -- overflow, underflow, division by zero,
409 zero raised to the zero, etc. */
412 gfc_arith_not (gfc_expr
*op1
, gfc_expr
**resultp
)
416 result
= gfc_get_constant_expr (BT_LOGICAL
, op1
->ts
.kind
, &op1
->where
);
417 result
->value
.logical
= !op1
->value
.logical
;
425 gfc_arith_and (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
429 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
431 result
->value
.logical
= op1
->value
.logical
&& op2
->value
.logical
;
439 gfc_arith_or (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
443 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
445 result
->value
.logical
= op1
->value
.logical
|| op2
->value
.logical
;
453 gfc_arith_eqv (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
457 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
459 result
->value
.logical
= op1
->value
.logical
== op2
->value
.logical
;
467 gfc_arith_neqv (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
471 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
473 result
->value
.logical
= op1
->value
.logical
!= op2
->value
.logical
;
480 /* Make sure a constant numeric expression is within the range for
481 its type and kind. Note that there's also a gfc_check_range(),
482 but that one deals with the intrinsic RANGE function. */
485 gfc_range_check (gfc_expr
*e
)
493 rc
= gfc_check_integer_range (e
->value
.integer
, e
->ts
.kind
);
497 rc
= gfc_check_real_range (e
->value
.real
, e
->ts
.kind
);
498 if (rc
== ARITH_UNDERFLOW
)
499 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
500 if (rc
== ARITH_OVERFLOW
)
501 mpfr_set_inf (e
->value
.real
, mpfr_sgn (e
->value
.real
));
503 mpfr_set_nan (e
->value
.real
);
507 rc
= gfc_check_real_range (mpc_realref (e
->value
.complex), e
->ts
.kind
);
508 if (rc
== ARITH_UNDERFLOW
)
509 mpfr_set_ui (mpc_realref (e
->value
.complex), 0, GFC_RND_MODE
);
510 if (rc
== ARITH_OVERFLOW
)
511 mpfr_set_inf (mpc_realref (e
->value
.complex),
512 mpfr_sgn (mpc_realref (e
->value
.complex)));
514 mpfr_set_nan (mpc_realref (e
->value
.complex));
516 rc2
= gfc_check_real_range (mpc_imagref (e
->value
.complex), e
->ts
.kind
);
517 if (rc
== ARITH_UNDERFLOW
)
518 mpfr_set_ui (mpc_imagref (e
->value
.complex), 0, GFC_RND_MODE
);
519 if (rc
== ARITH_OVERFLOW
)
520 mpfr_set_inf (mpc_imagref (e
->value
.complex),
521 mpfr_sgn (mpc_imagref (e
->value
.complex)));
523 mpfr_set_nan (mpc_imagref (e
->value
.complex));
530 gfc_internal_error ("gfc_range_check(): Bad type");
537 /* Several of the following routines use the same set of statements to
538 check the validity of the result. Encapsulate the checking here. */
541 check_result (arith rc
, gfc_expr
*x
, gfc_expr
*r
, gfc_expr
**rp
)
545 if (val
== ARITH_UNDERFLOW
)
547 if (gfc_option
.warn_underflow
)
548 gfc_warning (gfc_arith_error (val
), &x
->where
);
552 if (val
== ARITH_ASYMMETRIC
)
554 gfc_warning (gfc_arith_error (val
), &x
->where
);
567 /* It may seem silly to have a subroutine that actually computes the
568 unary plus of a constant, but it prevents us from making exceptions
569 in the code elsewhere. Used for unary plus and parenthesized
573 gfc_arith_identity (gfc_expr
*op1
, gfc_expr
**resultp
)
575 *resultp
= gfc_copy_expr (op1
);
581 gfc_arith_uminus (gfc_expr
*op1
, gfc_expr
**resultp
)
586 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
588 switch (op1
->ts
.type
)
591 mpz_neg (result
->value
.integer
, op1
->value
.integer
);
595 mpfr_neg (result
->value
.real
, op1
->value
.real
, GFC_RND_MODE
);
599 mpc_neg (result
->value
.complex, op1
->value
.complex, GFC_MPC_RND_MODE
);
603 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
606 rc
= gfc_range_check (result
);
608 return check_result (rc
, op1
, result
, resultp
);
613 gfc_arith_plus (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
618 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
620 switch (op1
->ts
.type
)
623 mpz_add (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
627 mpfr_add (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
632 mpc_add (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
637 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
640 rc
= gfc_range_check (result
);
642 return check_result (rc
, op1
, result
, resultp
);
647 gfc_arith_minus (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
652 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
654 switch (op1
->ts
.type
)
657 mpz_sub (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
661 mpfr_sub (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
666 mpc_sub (result
->value
.complex, op1
->value
.complex,
667 op2
->value
.complex, GFC_MPC_RND_MODE
);
671 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
674 rc
= gfc_range_check (result
);
676 return check_result (rc
, op1
, result
, resultp
);
681 gfc_arith_times (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
686 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
688 switch (op1
->ts
.type
)
691 mpz_mul (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
695 mpfr_mul (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
700 gfc_set_model (mpc_realref (op1
->value
.complex));
701 mpc_mul (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
706 gfc_internal_error ("gfc_arith_times(): Bad basic type");
709 rc
= gfc_range_check (result
);
711 return check_result (rc
, op1
, result
, resultp
);
716 gfc_arith_divide (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
723 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
725 switch (op1
->ts
.type
)
728 if (mpz_sgn (op2
->value
.integer
) == 0)
734 mpz_tdiv_q (result
->value
.integer
, op1
->value
.integer
,
739 if (mpfr_sgn (op2
->value
.real
) == 0 && gfc_option
.flag_range_check
== 1)
745 mpfr_div (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
750 if (mpc_cmp_si_si (op2
->value
.complex, 0, 0) == 0
751 && gfc_option
.flag_range_check
== 1)
757 gfc_set_model (mpc_realref (op1
->value
.complex));
758 if (mpc_cmp_si_si (op2
->value
.complex, 0, 0) == 0)
760 /* In Fortran, return (NaN + NaN I) for any zero divisor. See
762 mpfr_set_nan (mpc_realref (result
->value
.complex));
763 mpfr_set_nan (mpc_imagref (result
->value
.complex));
766 mpc_div (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
771 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
775 rc
= gfc_range_check (result
);
777 return check_result (rc
, op1
, result
, resultp
);
780 /* Raise a number to a power. */
783 arith_power (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
790 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
792 switch (op2
->ts
.type
)
795 power_sign
= mpz_sgn (op2
->value
.integer
);
799 /* Handle something to the zeroth power. Since we're dealing
800 with integral exponents, there is no ambiguity in the
801 limiting procedure used to determine the value of 0**0. */
802 switch (op1
->ts
.type
)
805 mpz_set_ui (result
->value
.integer
, 1);
809 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
813 mpc_set_ui (result
->value
.complex, 1, GFC_MPC_RND_MODE
);
817 gfc_internal_error ("arith_power(): Bad base");
822 switch (op1
->ts
.type
)
828 /* First, we simplify the cases of op1 == 1, 0 or -1. */
829 if (mpz_cmp_si (op1
->value
.integer
, 1) == 0)
832 mpz_set_si (result
->value
.integer
, 1);
834 else if (mpz_cmp_si (op1
->value
.integer
, 0) == 0)
836 /* 0**op2 == 0, if op2 > 0
837 0**op2 overflow, if op2 < 0 ; in that case, we
838 set the result to 0 and return ARITH_DIV0. */
839 mpz_set_si (result
->value
.integer
, 0);
840 if (mpz_cmp_si (op2
->value
.integer
, 0) < 0)
843 else if (mpz_cmp_si (op1
->value
.integer
, -1) == 0)
845 /* (-1)**op2 == (-1)**(mod(op2,2)) */
846 unsigned int odd
= mpz_fdiv_ui (op2
->value
.integer
, 2);
848 mpz_set_si (result
->value
.integer
, -1);
850 mpz_set_si (result
->value
.integer
, 1);
852 /* Then, we take care of op2 < 0. */
853 else if (mpz_cmp_si (op2
->value
.integer
, 0) < 0)
855 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
856 mpz_set_si (result
->value
.integer
, 0);
858 else if (gfc_extract_int (op2
, &power
) != NULL
)
860 /* If op2 doesn't fit in an int, the exponentiation will
861 overflow, because op2 > 0 and abs(op1) > 1. */
864 i
= gfc_validate_kind (BT_INTEGER
, result
->ts
.kind
, false);
866 if (gfc_option
.flag_range_check
)
869 /* Still, we want to give the same value as the
872 mpz_add_ui (max
, gfc_integer_kinds
[i
].huge
, 1);
873 mpz_mul_ui (max
, max
, 2);
874 mpz_powm (result
->value
.integer
, op1
->value
.integer
,
875 op2
->value
.integer
, max
);
879 mpz_pow_ui (result
->value
.integer
, op1
->value
.integer
,
885 mpfr_pow_z (result
->value
.real
, op1
->value
.real
,
886 op2
->value
.integer
, GFC_RND_MODE
);
890 mpc_pow_z (result
->value
.complex, op1
->value
.complex,
891 op2
->value
.integer
, GFC_MPC_RND_MODE
);
902 if (gfc_init_expr_flag
)
904 if (!gfc_notify_std (GFC_STD_F2003
, "Noninteger "
905 "exponent in an initialization "
906 "expression at %L", &op2
->where
))
908 gfc_free_expr (result
);
909 return ARITH_PROHIBIT
;
913 if (mpfr_cmp_si (op1
->value
.real
, 0) < 0)
915 gfc_error ("Raising a negative REAL at %L to "
916 "a REAL power is prohibited", &op1
->where
);
917 gfc_free_expr (result
);
918 return ARITH_PROHIBIT
;
921 mpfr_pow (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
927 if (gfc_init_expr_flag
)
929 if (!gfc_notify_std (GFC_STD_F2003
, "Noninteger "
930 "exponent in an initialization "
931 "expression at %L", &op2
->where
))
933 gfc_free_expr (result
);
934 return ARITH_PROHIBIT
;
938 mpc_pow (result
->value
.complex, op1
->value
.complex,
939 op2
->value
.complex, GFC_MPC_RND_MODE
);
943 gfc_internal_error ("arith_power(): unknown type");
947 rc
= gfc_range_check (result
);
949 return check_result (rc
, op1
, result
, resultp
);
953 /* Concatenate two string constants. */
956 gfc_arith_concat (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
961 gcc_assert (op1
->ts
.kind
== op2
->ts
.kind
);
962 result
= gfc_get_constant_expr (BT_CHARACTER
, op1
->ts
.kind
,
965 len
= op1
->value
.character
.length
+ op2
->value
.character
.length
;
967 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
968 result
->value
.character
.length
= len
;
970 memcpy (result
->value
.character
.string
, op1
->value
.character
.string
,
971 op1
->value
.character
.length
* sizeof (gfc_char_t
));
973 memcpy (&result
->value
.character
.string
[op1
->value
.character
.length
],
974 op2
->value
.character
.string
,
975 op2
->value
.character
.length
* sizeof (gfc_char_t
));
977 result
->value
.character
.string
[len
] = '\0';
984 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
985 This function mimics mpfr_cmp but takes NaN into account. */
988 compare_real (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
994 rc
= mpfr_equal_p (op1
->value
.real
, op2
->value
.real
) ? 0 : 1;
997 rc
= mpfr_greater_p (op1
->value
.real
, op2
->value
.real
) ? 1 : -1;
1000 rc
= mpfr_greaterequal_p (op1
->value
.real
, op2
->value
.real
) ? 1 : -1;
1003 rc
= mpfr_less_p (op1
->value
.real
, op2
->value
.real
) ? -1 : 1;
1006 rc
= mpfr_lessequal_p (op1
->value
.real
, op2
->value
.real
) ? -1 : 1;
1009 gfc_internal_error ("compare_real(): Bad operator");
1015 /* Comparison operators. Assumes that the two expression nodes
1016 contain two constants of the same type. The op argument is
1017 needed to handle NaN correctly. */
1020 gfc_compare_expr (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1024 switch (op1
->ts
.type
)
1027 rc
= mpz_cmp (op1
->value
.integer
, op2
->value
.integer
);
1031 rc
= compare_real (op1
, op2
, op
);
1035 rc
= gfc_compare_string (op1
, op2
);
1039 rc
= ((!op1
->value
.logical
&& op2
->value
.logical
)
1040 || (op1
->value
.logical
&& !op2
->value
.logical
));
1044 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1051 /* Compare a pair of complex numbers. Naturally, this is only for
1052 equality and inequality. */
1055 compare_complex (gfc_expr
*op1
, gfc_expr
*op2
)
1057 return mpc_cmp (op1
->value
.complex, op2
->value
.complex) == 0;
1061 /* Given two constant strings and the inverse collating sequence, compare the
1062 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1063 We use the processor's default collating sequence. */
1066 gfc_compare_string (gfc_expr
*a
, gfc_expr
*b
)
1068 int len
, alen
, blen
, i
;
1071 alen
= a
->value
.character
.length
;
1072 blen
= b
->value
.character
.length
;
1074 len
= MAX(alen
, blen
);
1076 for (i
= 0; i
< len
; i
++)
1078 ac
= ((i
< alen
) ? a
->value
.character
.string
[i
] : ' ');
1079 bc
= ((i
< blen
) ? b
->value
.character
.string
[i
] : ' ');
1087 /* Strings are equal */
1093 gfc_compare_with_Cstring (gfc_expr
*a
, const char *b
, bool case_sensitive
)
1095 int len
, alen
, blen
, i
;
1098 alen
= a
->value
.character
.length
;
1101 len
= MAX(alen
, blen
);
1103 for (i
= 0; i
< len
; i
++)
1105 ac
= ((i
< alen
) ? a
->value
.character
.string
[i
] : ' ');
1106 bc
= ((i
< blen
) ? b
[i
] : ' ');
1108 if (!case_sensitive
)
1120 /* Strings are equal */
1125 /* Specific comparison subroutines. */
1128 gfc_arith_eq (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1132 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1134 result
->value
.logical
= (op1
->ts
.type
== BT_COMPLEX
)
1135 ? compare_complex (op1
, op2
)
1136 : (gfc_compare_expr (op1
, op2
, INTRINSIC_EQ
) == 0);
1144 gfc_arith_ne (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1148 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1150 result
->value
.logical
= (op1
->ts
.type
== BT_COMPLEX
)
1151 ? !compare_complex (op1
, op2
)
1152 : (gfc_compare_expr (op1
, op2
, INTRINSIC_EQ
) != 0);
1160 gfc_arith_gt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1164 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1166 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_GT
) > 0);
1174 gfc_arith_ge (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1178 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1180 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_GE
) >= 0);
1188 gfc_arith_lt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1192 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1194 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_LT
) < 0);
1202 gfc_arith_le (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1206 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1208 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_LE
) <= 0);
1216 reduce_unary (arith (*eval
) (gfc_expr
*, gfc_expr
**), gfc_expr
*op
,
1219 gfc_constructor_base head
;
1224 if (op
->expr_type
== EXPR_CONSTANT
)
1225 return eval (op
, result
);
1228 head
= gfc_constructor_copy (op
->value
.constructor
);
1229 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1231 rc
= reduce_unary (eval
, c
->expr
, &r
);
1236 gfc_replace_expr (c
->expr
, r
);
1240 gfc_constructor_free (head
);
1243 gfc_constructor
*c
= gfc_constructor_first (head
);
1244 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1246 r
->shape
= gfc_copy_shape (op
->shape
, op
->rank
);
1248 r
->value
.constructor
= head
;
1257 reduce_binary_ac (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1258 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1260 gfc_constructor_base head
;
1263 arith rc
= ARITH_OK
;
1265 head
= gfc_constructor_copy (op1
->value
.constructor
);
1266 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1268 if (c
->expr
->expr_type
== EXPR_CONSTANT
)
1269 rc
= eval (c
->expr
, op2
, &r
);
1271 rc
= reduce_binary_ac (eval
, c
->expr
, op2
, &r
);
1276 gfc_replace_expr (c
->expr
, r
);
1280 gfc_constructor_free (head
);
1283 gfc_constructor
*c
= gfc_constructor_first (head
);
1284 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1286 r
->shape
= gfc_copy_shape (op1
->shape
, op1
->rank
);
1287 r
->rank
= op1
->rank
;
1288 r
->value
.constructor
= head
;
1297 reduce_binary_ca (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1298 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1300 gfc_constructor_base head
;
1303 arith rc
= ARITH_OK
;
1305 head
= gfc_constructor_copy (op2
->value
.constructor
);
1306 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1308 if (c
->expr
->expr_type
== EXPR_CONSTANT
)
1309 rc
= eval (op1
, c
->expr
, &r
);
1311 rc
= reduce_binary_ca (eval
, op1
, c
->expr
, &r
);
1316 gfc_replace_expr (c
->expr
, r
);
1320 gfc_constructor_free (head
);
1323 gfc_constructor
*c
= gfc_constructor_first (head
);
1324 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1326 r
->shape
= gfc_copy_shape (op2
->shape
, op2
->rank
);
1327 r
->rank
= op2
->rank
;
1328 r
->value
.constructor
= head
;
1336 /* We need a forward declaration of reduce_binary. */
1337 static arith
reduce_binary (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1338 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
);
1342 reduce_binary_aa (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1343 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1345 gfc_constructor_base head
;
1346 gfc_constructor
*c
, *d
;
1348 arith rc
= ARITH_OK
;
1350 if (!gfc_check_conformance (op1
, op2
, "elemental binary operation"))
1351 return ARITH_INCOMMENSURATE
;
1353 head
= gfc_constructor_copy (op1
->value
.constructor
);
1354 for (c
= gfc_constructor_first (head
),
1355 d
= gfc_constructor_first (op2
->value
.constructor
);
1357 c
= gfc_constructor_next (c
), d
= gfc_constructor_next (d
))
1359 rc
= reduce_binary (eval
, c
->expr
, d
->expr
, &r
);
1363 gfc_replace_expr (c
->expr
, r
);
1367 rc
= ARITH_INCOMMENSURATE
;
1370 gfc_constructor_free (head
);
1373 gfc_constructor
*c
= gfc_constructor_first (head
);
1374 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1376 r
->shape
= gfc_copy_shape (op1
->shape
, op1
->rank
);
1377 r
->rank
= op1
->rank
;
1378 r
->value
.constructor
= head
;
1387 reduce_binary (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1388 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1390 if (op1
->expr_type
== EXPR_CONSTANT
&& op2
->expr_type
== EXPR_CONSTANT
)
1391 return eval (op1
, op2
, result
);
1393 if (op1
->expr_type
== EXPR_CONSTANT
&& op2
->expr_type
== EXPR_ARRAY
)
1394 return reduce_binary_ca (eval
, op1
, op2
, result
);
1396 if (op1
->expr_type
== EXPR_ARRAY
&& op2
->expr_type
== EXPR_CONSTANT
)
1397 return reduce_binary_ac (eval
, op1
, op2
, result
);
1399 return reduce_binary_aa (eval
, op1
, op2
, result
);
1405 arith (*f2
)(gfc_expr
*, gfc_expr
**);
1406 arith (*f3
)(gfc_expr
*, gfc_expr
*, gfc_expr
**);
1410 /* High level arithmetic subroutines. These subroutines go into
1411 eval_intrinsic(), which can do one of several things to its
1412 operands. If the operands are incompatible with the intrinsic
1413 operation, we return a node pointing to the operands and hope that
1414 an operator interface is found during resolution.
1416 If the operands are compatible and are constants, then we try doing
1417 the arithmetic. We also handle the cases where either or both
1418 operands are array constructors. */
1421 eval_intrinsic (gfc_intrinsic_op op
,
1422 eval_f eval
, gfc_expr
*op1
, gfc_expr
*op2
)
1424 gfc_expr temp
, *result
;
1428 gfc_clear_ts (&temp
.ts
);
1434 if (op1
->ts
.type
!= BT_LOGICAL
)
1437 temp
.ts
.type
= BT_LOGICAL
;
1438 temp
.ts
.kind
= gfc_default_logical_kind
;
1442 /* Logical binary operators */
1445 case INTRINSIC_NEQV
:
1447 if (op1
->ts
.type
!= BT_LOGICAL
|| op2
->ts
.type
!= BT_LOGICAL
)
1450 temp
.ts
.type
= BT_LOGICAL
;
1451 temp
.ts
.kind
= gfc_default_logical_kind
;
1456 case INTRINSIC_UPLUS
:
1457 case INTRINSIC_UMINUS
:
1458 if (!gfc_numeric_ts (&op1
->ts
))
1465 case INTRINSIC_PARENTHESES
:
1470 /* Additional restrictions for ordering relations. */
1472 case INTRINSIC_GE_OS
:
1474 case INTRINSIC_LT_OS
:
1476 case INTRINSIC_LE_OS
:
1478 case INTRINSIC_GT_OS
:
1479 if (op1
->ts
.type
== BT_COMPLEX
|| op2
->ts
.type
== BT_COMPLEX
)
1481 temp
.ts
.type
= BT_LOGICAL
;
1482 temp
.ts
.kind
= gfc_default_logical_kind
;
1488 case INTRINSIC_EQ_OS
:
1490 case INTRINSIC_NE_OS
:
1491 if (op1
->ts
.type
== BT_CHARACTER
&& op2
->ts
.type
== BT_CHARACTER
)
1494 temp
.ts
.type
= BT_LOGICAL
;
1495 temp
.ts
.kind
= gfc_default_logical_kind
;
1497 /* If kind mismatch, exit and we'll error out later. */
1498 if (op1
->ts
.kind
!= op2
->ts
.kind
)
1505 /* Numeric binary */
1506 case INTRINSIC_PLUS
:
1507 case INTRINSIC_MINUS
:
1508 case INTRINSIC_TIMES
:
1509 case INTRINSIC_DIVIDE
:
1510 case INTRINSIC_POWER
:
1511 if (!gfc_numeric_ts (&op1
->ts
) || !gfc_numeric_ts (&op2
->ts
))
1514 /* Insert any necessary type conversions to make the operands
1517 temp
.expr_type
= EXPR_OP
;
1518 gfc_clear_ts (&temp
.ts
);
1519 temp
.value
.op
.op
= op
;
1521 temp
.value
.op
.op1
= op1
;
1522 temp
.value
.op
.op2
= op2
;
1524 gfc_type_convert_binary (&temp
, 0);
1526 if (op
== INTRINSIC_EQ
|| op
== INTRINSIC_NE
1527 || op
== INTRINSIC_GE
|| op
== INTRINSIC_GT
1528 || op
== INTRINSIC_LE
|| op
== INTRINSIC_LT
1529 || op
== INTRINSIC_EQ_OS
|| op
== INTRINSIC_NE_OS
1530 || op
== INTRINSIC_GE_OS
|| op
== INTRINSIC_GT_OS
1531 || op
== INTRINSIC_LE_OS
|| op
== INTRINSIC_LT_OS
)
1533 temp
.ts
.type
= BT_LOGICAL
;
1534 temp
.ts
.kind
= gfc_default_logical_kind
;
1540 /* Character binary */
1541 case INTRINSIC_CONCAT
:
1542 if (op1
->ts
.type
!= BT_CHARACTER
|| op2
->ts
.type
!= BT_CHARACTER
1543 || op1
->ts
.kind
!= op2
->ts
.kind
)
1546 temp
.ts
.type
= BT_CHARACTER
;
1547 temp
.ts
.kind
= op1
->ts
.kind
;
1551 case INTRINSIC_USER
:
1555 gfc_internal_error ("eval_intrinsic(): Bad operator");
1558 if (op1
->expr_type
!= EXPR_CONSTANT
1559 && (op1
->expr_type
!= EXPR_ARRAY
1560 || !gfc_is_constant_expr (op1
) || !gfc_expanded_ac (op1
)))
1564 && op2
->expr_type
!= EXPR_CONSTANT
1565 && (op2
->expr_type
!= EXPR_ARRAY
1566 || !gfc_is_constant_expr (op2
) || !gfc_expanded_ac (op2
)))
1570 rc
= reduce_unary (eval
.f2
, op1
, &result
);
1572 rc
= reduce_binary (eval
.f3
, op1
, op2
, &result
);
1575 /* Something went wrong. */
1576 if (op
== INTRINSIC_POWER
&& rc
== ARITH_PROHIBIT
)
1581 gfc_error (gfc_arith_error (rc
), &op1
->where
);
1585 gfc_free_expr (op1
);
1586 gfc_free_expr (op2
);
1590 /* Create a run-time expression. */
1591 result
= gfc_get_operator_expr (&op1
->where
, op
, op1
, op2
);
1592 result
->ts
= temp
.ts
;
1598 /* Modify type of expression for zero size array. */
1601 eval_type_intrinsic0 (gfc_intrinsic_op iop
, gfc_expr
*op
)
1604 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1609 case INTRINSIC_GE_OS
:
1611 case INTRINSIC_LT_OS
:
1613 case INTRINSIC_LE_OS
:
1615 case INTRINSIC_GT_OS
:
1617 case INTRINSIC_EQ_OS
:
1619 case INTRINSIC_NE_OS
:
1620 op
->ts
.type
= BT_LOGICAL
;
1621 op
->ts
.kind
= gfc_default_logical_kind
;
1632 /* Return nonzero if the expression is a zero size array. */
1635 gfc_zero_size_array (gfc_expr
*e
)
1637 if (e
->expr_type
!= EXPR_ARRAY
)
1640 return e
->value
.constructor
== NULL
;
1644 /* Reduce a binary expression where at least one of the operands
1645 involves a zero-length array. Returns NULL if neither of the
1646 operands is a zero-length array. */
1649 reduce_binary0 (gfc_expr
*op1
, gfc_expr
*op2
)
1651 if (gfc_zero_size_array (op1
))
1653 gfc_free_expr (op2
);
1657 if (gfc_zero_size_array (op2
))
1659 gfc_free_expr (op1
);
1668 eval_intrinsic_f2 (gfc_intrinsic_op op
,
1669 arith (*eval
) (gfc_expr
*, gfc_expr
**),
1670 gfc_expr
*op1
, gfc_expr
*op2
)
1677 if (gfc_zero_size_array (op1
))
1678 return eval_type_intrinsic0 (op
, op1
);
1682 result
= reduce_binary0 (op1
, op2
);
1684 return eval_type_intrinsic0 (op
, result
);
1688 return eval_intrinsic (op
, f
, op1
, op2
);
1693 eval_intrinsic_f3 (gfc_intrinsic_op op
,
1694 arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1695 gfc_expr
*op1
, gfc_expr
*op2
)
1700 result
= reduce_binary0 (op1
, op2
);
1702 return eval_type_intrinsic0(op
, result
);
1705 return eval_intrinsic (op
, f
, op1
, op2
);
1710 gfc_parentheses (gfc_expr
*op
)
1712 if (gfc_is_constant_expr (op
))
1715 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES
, gfc_arith_identity
,
1720 gfc_uplus (gfc_expr
*op
)
1722 return eval_intrinsic_f2 (INTRINSIC_UPLUS
, gfc_arith_identity
, op
, NULL
);
1727 gfc_uminus (gfc_expr
*op
)
1729 return eval_intrinsic_f2 (INTRINSIC_UMINUS
, gfc_arith_uminus
, op
, NULL
);
1734 gfc_add (gfc_expr
*op1
, gfc_expr
*op2
)
1736 return eval_intrinsic_f3 (INTRINSIC_PLUS
, gfc_arith_plus
, op1
, op2
);
1741 gfc_subtract (gfc_expr
*op1
, gfc_expr
*op2
)
1743 return eval_intrinsic_f3 (INTRINSIC_MINUS
, gfc_arith_minus
, op1
, op2
);
1748 gfc_multiply (gfc_expr
*op1
, gfc_expr
*op2
)
1750 return eval_intrinsic_f3 (INTRINSIC_TIMES
, gfc_arith_times
, op1
, op2
);
1755 gfc_divide (gfc_expr
*op1
, gfc_expr
*op2
)
1757 return eval_intrinsic_f3 (INTRINSIC_DIVIDE
, gfc_arith_divide
, op1
, op2
);
1762 gfc_power (gfc_expr
*op1
, gfc_expr
*op2
)
1764 return eval_intrinsic_f3 (INTRINSIC_POWER
, arith_power
, op1
, op2
);
1769 gfc_concat (gfc_expr
*op1
, gfc_expr
*op2
)
1771 return eval_intrinsic_f3 (INTRINSIC_CONCAT
, gfc_arith_concat
, op1
, op2
);
1776 gfc_and (gfc_expr
*op1
, gfc_expr
*op2
)
1778 return eval_intrinsic_f3 (INTRINSIC_AND
, gfc_arith_and
, op1
, op2
);
1783 gfc_or (gfc_expr
*op1
, gfc_expr
*op2
)
1785 return eval_intrinsic_f3 (INTRINSIC_OR
, gfc_arith_or
, op1
, op2
);
1790 gfc_not (gfc_expr
*op1
)
1792 return eval_intrinsic_f2 (INTRINSIC_NOT
, gfc_arith_not
, op1
, NULL
);
1797 gfc_eqv (gfc_expr
*op1
, gfc_expr
*op2
)
1799 return eval_intrinsic_f3 (INTRINSIC_EQV
, gfc_arith_eqv
, op1
, op2
);
1804 gfc_neqv (gfc_expr
*op1
, gfc_expr
*op2
)
1806 return eval_intrinsic_f3 (INTRINSIC_NEQV
, gfc_arith_neqv
, op1
, op2
);
1811 gfc_eq (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1813 return eval_intrinsic_f3 (op
, gfc_arith_eq
, op1
, op2
);
1818 gfc_ne (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1820 return eval_intrinsic_f3 (op
, gfc_arith_ne
, op1
, op2
);
1825 gfc_gt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1827 return eval_intrinsic_f3 (op
, gfc_arith_gt
, op1
, op2
);
1832 gfc_ge (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1834 return eval_intrinsic_f3 (op
, gfc_arith_ge
, op1
, op2
);
1839 gfc_lt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1841 return eval_intrinsic_f3 (op
, gfc_arith_lt
, op1
, op2
);
1846 gfc_le (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1848 return eval_intrinsic_f3 (op
, gfc_arith_le
, op1
, op2
);
1852 /* Convert an integer string to an expression node. */
1855 gfc_convert_integer (const char *buffer
, int kind
, int radix
, locus
*where
)
1860 e
= gfc_get_constant_expr (BT_INTEGER
, kind
, where
);
1861 /* A leading plus is allowed, but not by mpz_set_str. */
1862 if (buffer
[0] == '+')
1866 mpz_set_str (e
->value
.integer
, t
, radix
);
1872 /* Convert a real string to an expression node. */
1875 gfc_convert_real (const char *buffer
, int kind
, locus
*where
)
1879 e
= gfc_get_constant_expr (BT_REAL
, kind
, where
);
1880 mpfr_set_str (e
->value
.real
, buffer
, 10, GFC_RND_MODE
);
1886 /* Convert a pair of real, constant expression nodes to a single
1887 complex expression node. */
1890 gfc_convert_complex (gfc_expr
*real
, gfc_expr
*imag
, int kind
)
1894 e
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &real
->where
);
1895 mpc_set_fr_fr (e
->value
.complex, real
->value
.real
, imag
->value
.real
,
1902 /******* Simplification of intrinsic functions with constant arguments *****/
1905 /* Deal with an arithmetic error. */
1908 arith_error (arith rc
, gfc_typespec
*from
, gfc_typespec
*to
, locus
*where
)
1913 gfc_error ("Arithmetic OK converting %s to %s at %L",
1914 gfc_typename (from
), gfc_typename (to
), where
);
1916 case ARITH_OVERFLOW
:
1917 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
1918 "can be disabled with the option -fno-range-check",
1919 gfc_typename (from
), gfc_typename (to
), where
);
1921 case ARITH_UNDERFLOW
:
1922 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
1923 "can be disabled with the option -fno-range-check",
1924 gfc_typename (from
), gfc_typename (to
), where
);
1927 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
1928 "can be disabled with the option -fno-range-check",
1929 gfc_typename (from
), gfc_typename (to
), where
);
1932 gfc_error ("Division by zero converting %s to %s at %L",
1933 gfc_typename (from
), gfc_typename (to
), where
);
1935 case ARITH_INCOMMENSURATE
:
1936 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
1937 gfc_typename (from
), gfc_typename (to
), where
);
1939 case ARITH_ASYMMETRIC
:
1940 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
1941 " converting %s to %s at %L",
1942 gfc_typename (from
), gfc_typename (to
), where
);
1945 gfc_internal_error ("gfc_arith_error(): Bad error code");
1948 /* TODO: Do something about the error, i.e., throw exception, return
1953 /* Convert integers to integers. */
1956 gfc_int2int (gfc_expr
*src
, int kind
)
1961 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
1963 mpz_set (result
->value
.integer
, src
->value
.integer
);
1965 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
1967 if (rc
== ARITH_ASYMMETRIC
)
1969 gfc_warning (gfc_arith_error (rc
), &src
->where
);
1973 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
1974 gfc_free_expr (result
);
1983 /* Convert integers to reals. */
1986 gfc_int2real (gfc_expr
*src
, int kind
)
1991 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
1993 mpfr_set_z (result
->value
.real
, src
->value
.integer
, GFC_RND_MODE
);
1995 if ((rc
= gfc_check_real_range (result
->value
.real
, kind
)) != ARITH_OK
)
1997 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
1998 gfc_free_expr (result
);
2006 /* Convert default integer to default complex. */
2009 gfc_int2complex (gfc_expr
*src
, int kind
)
2014 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2016 mpc_set_z (result
->value
.complex, src
->value
.integer
, GFC_MPC_RND_MODE
);
2018 if ((rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
))
2021 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2022 gfc_free_expr (result
);
2030 /* Convert default real to default integer. */
2033 gfc_real2int (gfc_expr
*src
, int kind
)
2038 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2040 gfc_mpfr_to_mpz (result
->value
.integer
, src
->value
.real
, &src
->where
);
2042 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
2044 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2045 gfc_free_expr (result
);
2053 /* Convert real to real. */
2056 gfc_real2real (gfc_expr
*src
, int kind
)
2061 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2063 mpfr_set (result
->value
.real
, src
->value
.real
, GFC_RND_MODE
);
2065 rc
= gfc_check_real_range (result
->value
.real
, kind
);
2067 if (rc
== ARITH_UNDERFLOW
)
2069 if (gfc_option
.warn_underflow
)
2070 gfc_warning (gfc_arith_error (rc
), &src
->where
);
2071 mpfr_set_ui (result
->value
.real
, 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 real to complex. */
2087 gfc_real2complex (gfc_expr
*src
, int kind
)
2092 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2094 mpc_set_fr (result
->value
.complex, src
->value
.real
, GFC_MPC_RND_MODE
);
2096 rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
);
2098 if (rc
== ARITH_UNDERFLOW
)
2100 if (gfc_option
.warn_underflow
)
2101 gfc_warning (gfc_arith_error (rc
), &src
->where
);
2102 mpfr_set_ui (mpc_realref (result
->value
.complex), 0, GFC_RND_MODE
);
2104 else if (rc
!= ARITH_OK
)
2106 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2107 gfc_free_expr (result
);
2115 /* Convert complex to integer. */
2118 gfc_complex2int (gfc_expr
*src
, int kind
)
2123 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2125 gfc_mpfr_to_mpz (result
->value
.integer
, mpc_realref (src
->value
.complex),
2128 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
2130 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2131 gfc_free_expr (result
);
2139 /* Convert complex to real. */
2142 gfc_complex2real (gfc_expr
*src
, int kind
)
2147 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2149 mpc_real (result
->value
.real
, src
->value
.complex, GFC_RND_MODE
);
2151 rc
= gfc_check_real_range (result
->value
.real
, kind
);
2153 if (rc
== ARITH_UNDERFLOW
)
2155 if (gfc_option
.warn_underflow
)
2156 gfc_warning (gfc_arith_error (rc
), &src
->where
);
2157 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2161 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2162 gfc_free_expr (result
);
2170 /* Convert complex to complex. */
2173 gfc_complex2complex (gfc_expr
*src
, int kind
)
2178 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2180 mpc_set (result
->value
.complex, src
->value
.complex, GFC_MPC_RND_MODE
);
2182 rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
);
2184 if (rc
== ARITH_UNDERFLOW
)
2186 if (gfc_option
.warn_underflow
)
2187 gfc_warning (gfc_arith_error (rc
), &src
->where
);
2188 mpfr_set_ui (mpc_realref (result
->value
.complex), 0, GFC_RND_MODE
);
2190 else if (rc
!= ARITH_OK
)
2192 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2193 gfc_free_expr (result
);
2197 rc
= gfc_check_real_range (mpc_imagref (result
->value
.complex), kind
);
2199 if (rc
== ARITH_UNDERFLOW
)
2201 if (gfc_option
.warn_underflow
)
2202 gfc_warning (gfc_arith_error (rc
), &src
->where
);
2203 mpfr_set_ui (mpc_imagref (result
->value
.complex), 0, GFC_RND_MODE
);
2205 else if (rc
!= ARITH_OK
)
2207 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2208 gfc_free_expr (result
);
2216 /* Logical kind conversion. */
2219 gfc_log2log (gfc_expr
*src
, int kind
)
2223 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2224 result
->value
.logical
= src
->value
.logical
;
2230 /* Convert logical to integer. */
2233 gfc_log2int (gfc_expr
*src
, int kind
)
2237 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2238 mpz_set_si (result
->value
.integer
, src
->value
.logical
);
2244 /* Convert integer to logical. */
2247 gfc_int2log (gfc_expr
*src
, int kind
)
2251 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2252 result
->value
.logical
= (mpz_cmp_si (src
->value
.integer
, 0) != 0);
2258 /* Helper function to set the representation in a Hollerith conversion.
2259 This assumes that the ts.type and ts.kind of the result have already
2263 hollerith2representation (gfc_expr
*result
, gfc_expr
*src
)
2265 int src_len
, result_len
;
2267 src_len
= src
->representation
.length
- src
->ts
.u
.pad
;
2268 result_len
= gfc_target_expr_size (result
);
2270 if (src_len
> result_len
)
2272 gfc_warning ("The Hollerith constant at %L is too long to convert to %s",
2273 &src
->where
, gfc_typename(&result
->ts
));
2276 result
->representation
.string
= XCNEWVEC (char, result_len
+ 1);
2277 memcpy (result
->representation
.string
, src
->representation
.string
,
2278 MIN (result_len
, src_len
));
2280 if (src_len
< result_len
)
2281 memset (&result
->representation
.string
[src_len
], ' ', result_len
- src_len
);
2283 result
->representation
.string
[result_len
] = '\0'; /* For debugger */
2284 result
->representation
.length
= result_len
;
2288 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2291 gfc_hollerith2int (gfc_expr
*src
, int kind
)
2294 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2296 hollerith2representation (result
, src
);
2297 gfc_interpret_integer (kind
, (unsigned char *) result
->representation
.string
,
2298 result
->representation
.length
, result
->value
.integer
);
2304 /* Convert Hollerith to real. The constant will be padded or truncated. */
2307 gfc_hollerith2real (gfc_expr
*src
, int kind
)
2310 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2312 hollerith2representation (result
, src
);
2313 gfc_interpret_float (kind
, (unsigned char *) result
->representation
.string
,
2314 result
->representation
.length
, result
->value
.real
);
2320 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2323 gfc_hollerith2complex (gfc_expr
*src
, int kind
)
2326 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2328 hollerith2representation (result
, src
);
2329 gfc_interpret_complex (kind
, (unsigned char *) result
->representation
.string
,
2330 result
->representation
.length
, result
->value
.complex);
2336 /* Convert Hollerith to character. */
2339 gfc_hollerith2character (gfc_expr
*src
, int kind
)
2343 result
= gfc_copy_expr (src
);
2344 result
->ts
.type
= BT_CHARACTER
;
2345 result
->ts
.kind
= kind
;
2347 result
->value
.character
.length
= result
->representation
.length
;
2348 result
->value
.character
.string
2349 = gfc_char_to_widechar (result
->representation
.string
);
2355 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2358 gfc_hollerith2logical (gfc_expr
*src
, int kind
)
2361 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2363 hollerith2representation (result
, src
);
2364 gfc_interpret_logical (kind
, (unsigned char *) result
->representation
.string
,
2365 result
->representation
.length
, &result
->value
.logical
);