2 Copyright (C) 2000-2018 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");
116 case ARITH_WRONGCONCAT
:
118 _("Illegal type in character concatenation at %L");
122 gfc_internal_error ("gfc_arith_error(): Bad error code");
129 /* Get things ready to do math. */
132 gfc_arith_init_1 (void)
134 gfc_integer_info
*int_info
;
135 gfc_real_info
*real_info
;
139 mpfr_set_default_prec (128);
142 /* Convert the minimum and maximum values for each kind into their
143 GNU MP representation. */
144 for (int_info
= gfc_integer_kinds
; int_info
->kind
!= 0; int_info
++)
147 mpz_init (int_info
->huge
);
148 mpz_set_ui (int_info
->huge
, int_info
->radix
);
149 mpz_pow_ui (int_info
->huge
, int_info
->huge
, int_info
->digits
);
150 mpz_sub_ui (int_info
->huge
, int_info
->huge
, 1);
152 /* These are the numbers that are actually representable by the
153 target. For bases other than two, this needs to be changed. */
154 if (int_info
->radix
!= 2)
155 gfc_internal_error ("Fix min_int calculation");
157 /* See PRs 13490 and 17912, related to integer ranges.
158 The pedantic_min_int exists for range checking when a program
159 is compiled with -pedantic, and reflects the belief that
160 Standard Fortran requires integers to be symmetrical, i.e.
161 every negative integer must have a representable positive
162 absolute value, and vice versa. */
164 mpz_init (int_info
->pedantic_min_int
);
165 mpz_neg (int_info
->pedantic_min_int
, int_info
->huge
);
167 mpz_init (int_info
->min_int
);
168 mpz_sub_ui (int_info
->min_int
, int_info
->pedantic_min_int
, 1);
171 mpfr_set_z (a
, int_info
->huge
, GFC_RND_MODE
);
172 mpfr_log10 (a
, a
, GFC_RND_MODE
);
174 int_info
->range
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
179 for (real_info
= gfc_real_kinds
; real_info
->kind
!= 0; real_info
++)
181 gfc_set_model_kind (real_info
->kind
);
186 /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
188 mpfr_init (real_info
->huge
);
189 mpfr_set_ui (real_info
->huge
, 1, GFC_RND_MODE
);
190 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
191 mpfr_pow_si (a
, a
, -real_info
->digits
, GFC_RND_MODE
);
192 mpfr_sub (real_info
->huge
, real_info
->huge
, a
, GFC_RND_MODE
);
195 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
196 mpfr_pow_ui (a
, a
, real_info
->max_exponent
- 1, GFC_RND_MODE
);
198 /* (1 - b**(-p)) * b**(emax-1) */
199 mpfr_mul (real_info
->huge
, real_info
->huge
, a
, GFC_RND_MODE
);
201 /* (1 - b**(-p)) * b**(emax-1) * b */
202 mpfr_mul_ui (real_info
->huge
, real_info
->huge
, real_info
->radix
,
205 /* tiny(x) = b**(emin-1) */
206 mpfr_init (real_info
->tiny
);
207 mpfr_set_ui (real_info
->tiny
, real_info
->radix
, GFC_RND_MODE
);
208 mpfr_pow_si (real_info
->tiny
, real_info
->tiny
,
209 real_info
->min_exponent
- 1, GFC_RND_MODE
);
211 /* subnormal (x) = b**(emin - digit) */
212 mpfr_init (real_info
->subnormal
);
213 mpfr_set_ui (real_info
->subnormal
, real_info
->radix
, GFC_RND_MODE
);
214 mpfr_pow_si (real_info
->subnormal
, real_info
->subnormal
,
215 real_info
->min_exponent
- real_info
->digits
, GFC_RND_MODE
);
217 /* epsilon(x) = b**(1-p) */
218 mpfr_init (real_info
->epsilon
);
219 mpfr_set_ui (real_info
->epsilon
, real_info
->radix
, GFC_RND_MODE
);
220 mpfr_pow_si (real_info
->epsilon
, real_info
->epsilon
,
221 1 - real_info
->digits
, GFC_RND_MODE
);
223 /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
224 mpfr_log10 (a
, real_info
->huge
, GFC_RND_MODE
);
225 mpfr_log10 (b
, real_info
->tiny
, GFC_RND_MODE
);
226 mpfr_neg (b
, b
, GFC_RND_MODE
);
229 mpfr_min (a
, a
, b
, GFC_RND_MODE
);
231 real_info
->range
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
233 /* precision(x) = int((p - 1) * log10(b)) + k */
234 mpfr_set_ui (a
, real_info
->radix
, GFC_RND_MODE
);
235 mpfr_log10 (a
, a
, GFC_RND_MODE
);
236 mpfr_mul_ui (a
, a
, real_info
->digits
- 1, GFC_RND_MODE
);
238 real_info
->precision
= (int) mpfr_get_si (a
, GFC_RND_MODE
);
240 /* If the radix is an integral power of 10, add one to the precision. */
241 for (i
= 10; i
<= real_info
->radix
; i
*= 10)
242 if (i
== real_info
->radix
)
243 real_info
->precision
++;
245 mpfr_clears (a
, b
, NULL
);
250 /* Clean up, get rid of numeric constants. */
253 gfc_arith_done_1 (void)
255 gfc_integer_info
*ip
;
258 for (ip
= gfc_integer_kinds
; ip
->kind
; ip
++)
260 mpz_clear (ip
->min_int
);
261 mpz_clear (ip
->pedantic_min_int
);
262 mpz_clear (ip
->huge
);
265 for (rp
= gfc_real_kinds
; rp
->kind
; rp
++)
266 mpfr_clears (rp
->epsilon
, rp
->huge
, rp
->tiny
, rp
->subnormal
, NULL
);
272 /* Given a wide character value and a character kind, determine whether
273 the character is representable for that kind. */
275 gfc_check_character_range (gfc_char_t c
, int kind
)
277 /* As wide characters are stored as 32-bit values, they're all
278 representable in UCS=4. */
283 return c
<= 255 ? true : false;
289 /* Given an integer and a kind, make sure that the integer lies within
290 the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
294 gfc_check_integer_range (mpz_t p
, int kind
)
299 i
= gfc_validate_kind (BT_INTEGER
, kind
, false);
304 if (mpz_cmp (p
, gfc_integer_kinds
[i
].pedantic_min_int
) < 0)
305 result
= ARITH_ASYMMETRIC
;
309 if (flag_range_check
== 0)
312 if (mpz_cmp (p
, gfc_integer_kinds
[i
].min_int
) < 0
313 || mpz_cmp (p
, gfc_integer_kinds
[i
].huge
) > 0)
314 result
= ARITH_OVERFLOW
;
320 /* Given a real and a kind, make sure that the real lies within the
321 range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
325 gfc_check_real_range (mpfr_t p
, int kind
)
331 i
= gfc_validate_kind (BT_REAL
, kind
, false);
335 mpfr_abs (q
, p
, GFC_RND_MODE
);
341 if (flag_range_check
!= 0)
342 retval
= ARITH_OVERFLOW
;
344 else if (mpfr_nan_p (p
))
346 if (flag_range_check
!= 0)
349 else if (mpfr_sgn (q
) == 0)
354 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].huge
) > 0)
356 if (flag_range_check
== 0)
357 mpfr_set_inf (p
, mpfr_sgn (p
));
359 retval
= ARITH_OVERFLOW
;
361 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].subnormal
) < 0)
363 if (flag_range_check
== 0)
365 if (mpfr_sgn (p
) < 0)
367 mpfr_set_ui (p
, 0, GFC_RND_MODE
);
368 mpfr_set_si (q
, -1, GFC_RND_MODE
);
369 mpfr_copysign (p
, p
, q
, GFC_RND_MODE
);
372 mpfr_set_ui (p
, 0, GFC_RND_MODE
);
375 retval
= ARITH_UNDERFLOW
;
377 else if (mpfr_cmp (q
, gfc_real_kinds
[i
].tiny
) < 0)
382 /* Save current values of emin and emax. */
383 emin
= mpfr_get_emin ();
384 emax
= mpfr_get_emax ();
386 /* Set emin and emax for the current model number. */
387 en
= gfc_real_kinds
[i
].min_exponent
- gfc_real_kinds
[i
].digits
+ 1;
388 mpfr_set_emin ((mp_exp_t
) en
);
389 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[i
].max_exponent
);
390 mpfr_check_range (q
, 0, GFC_RND_MODE
);
391 mpfr_subnormalize (q
, 0, GFC_RND_MODE
);
393 /* Reset emin and emax. */
394 mpfr_set_emin (emin
);
395 mpfr_set_emax (emax
);
397 /* Copy sign if needed. */
398 if (mpfr_sgn (p
) < 0)
399 mpfr_neg (p
, q
, GMP_RNDN
);
401 mpfr_set (p
, q
, GMP_RNDN
);
410 /* Low-level arithmetic functions. All of these subroutines assume
411 that all operands are of the same type and return an operand of the
412 same type. The other thing about these subroutines is that they
413 can fail in various ways -- overflow, underflow, division by zero,
414 zero raised to the zero, etc. */
417 gfc_arith_not (gfc_expr
*op1
, gfc_expr
**resultp
)
421 result
= gfc_get_constant_expr (BT_LOGICAL
, op1
->ts
.kind
, &op1
->where
);
422 result
->value
.logical
= !op1
->value
.logical
;
430 gfc_arith_and (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
434 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
436 result
->value
.logical
= op1
->value
.logical
&& op2
->value
.logical
;
444 gfc_arith_or (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
448 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
450 result
->value
.logical
= op1
->value
.logical
|| op2
->value
.logical
;
458 gfc_arith_eqv (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
462 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
464 result
->value
.logical
= op1
->value
.logical
== op2
->value
.logical
;
472 gfc_arith_neqv (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
476 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_kind_max (op1
, op2
),
478 result
->value
.logical
= op1
->value
.logical
!= op2
->value
.logical
;
485 /* Make sure a constant numeric expression is within the range for
486 its type and kind. Note that there's also a gfc_check_range(),
487 but that one deals with the intrinsic RANGE function. */
490 gfc_range_check (gfc_expr
*e
)
498 rc
= gfc_check_integer_range (e
->value
.integer
, e
->ts
.kind
);
502 rc
= gfc_check_real_range (e
->value
.real
, e
->ts
.kind
);
503 if (rc
== ARITH_UNDERFLOW
)
504 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
505 if (rc
== ARITH_OVERFLOW
)
506 mpfr_set_inf (e
->value
.real
, mpfr_sgn (e
->value
.real
));
508 mpfr_set_nan (e
->value
.real
);
512 rc
= gfc_check_real_range (mpc_realref (e
->value
.complex), e
->ts
.kind
);
513 if (rc
== ARITH_UNDERFLOW
)
514 mpfr_set_ui (mpc_realref (e
->value
.complex), 0, GFC_RND_MODE
);
515 if (rc
== ARITH_OVERFLOW
)
516 mpfr_set_inf (mpc_realref (e
->value
.complex),
517 mpfr_sgn (mpc_realref (e
->value
.complex)));
519 mpfr_set_nan (mpc_realref (e
->value
.complex));
521 rc2
= gfc_check_real_range (mpc_imagref (e
->value
.complex), e
->ts
.kind
);
522 if (rc
== ARITH_UNDERFLOW
)
523 mpfr_set_ui (mpc_imagref (e
->value
.complex), 0, GFC_RND_MODE
);
524 if (rc
== ARITH_OVERFLOW
)
525 mpfr_set_inf (mpc_imagref (e
->value
.complex),
526 mpfr_sgn (mpc_imagref (e
->value
.complex)));
528 mpfr_set_nan (mpc_imagref (e
->value
.complex));
535 gfc_internal_error ("gfc_range_check(): Bad type");
542 /* Several of the following routines use the same set of statements to
543 check the validity of the result. Encapsulate the checking here. */
546 check_result (arith rc
, gfc_expr
*x
, gfc_expr
*r
, gfc_expr
**rp
)
550 if (val
== ARITH_UNDERFLOW
)
553 gfc_warning (OPT_Wunderflow
, gfc_arith_error (val
), &x
->where
);
557 if (val
== ARITH_ASYMMETRIC
)
559 gfc_warning (0, gfc_arith_error (val
), &x
->where
);
563 if (val
== ARITH_OK
|| val
== ARITH_OVERFLOW
)
572 /* It may seem silly to have a subroutine that actually computes the
573 unary plus of a constant, but it prevents us from making exceptions
574 in the code elsewhere. Used for unary plus and parenthesized
578 gfc_arith_identity (gfc_expr
*op1
, gfc_expr
**resultp
)
580 *resultp
= gfc_copy_expr (op1
);
586 gfc_arith_uminus (gfc_expr
*op1
, gfc_expr
**resultp
)
591 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
593 switch (op1
->ts
.type
)
596 mpz_neg (result
->value
.integer
, op1
->value
.integer
);
600 mpfr_neg (result
->value
.real
, op1
->value
.real
, GFC_RND_MODE
);
604 mpc_neg (result
->value
.complex, op1
->value
.complex, GFC_MPC_RND_MODE
);
608 gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
611 rc
= gfc_range_check (result
);
613 return check_result (rc
, op1
, result
, resultp
);
618 gfc_arith_plus (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
623 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
625 switch (op1
->ts
.type
)
628 mpz_add (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
632 mpfr_add (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
637 mpc_add (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
642 gfc_internal_error ("gfc_arith_plus(): Bad basic type");
645 rc
= gfc_range_check (result
);
647 return check_result (rc
, op1
, result
, resultp
);
652 gfc_arith_minus (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
657 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
659 switch (op1
->ts
.type
)
662 mpz_sub (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
666 mpfr_sub (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
671 mpc_sub (result
->value
.complex, op1
->value
.complex,
672 op2
->value
.complex, GFC_MPC_RND_MODE
);
676 gfc_internal_error ("gfc_arith_minus(): Bad basic type");
679 rc
= gfc_range_check (result
);
681 return check_result (rc
, op1
, result
, resultp
);
686 gfc_arith_times (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
691 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
693 switch (op1
->ts
.type
)
696 mpz_mul (result
->value
.integer
, op1
->value
.integer
, op2
->value
.integer
);
700 mpfr_mul (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
705 gfc_set_model (mpc_realref (op1
->value
.complex));
706 mpc_mul (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
711 gfc_internal_error ("gfc_arith_times(): Bad basic type");
714 rc
= gfc_range_check (result
);
716 return check_result (rc
, op1
, result
, resultp
);
721 gfc_arith_divide (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
728 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
730 switch (op1
->ts
.type
)
733 if (mpz_sgn (op2
->value
.integer
) == 0)
739 if (warn_integer_division
)
743 mpz_tdiv_qr (result
->value
.integer
, r
, op1
->value
.integer
,
746 if (mpz_cmp_si (r
, 0) != 0)
749 p
= mpz_get_str (NULL
, 10, result
->value
.integer
);
750 gfc_warning_now (OPT_Winteger_division
, "Integer division "
751 "truncated to constant %qs at %L", p
,
758 mpz_tdiv_q (result
->value
.integer
, op1
->value
.integer
,
764 if (mpfr_sgn (op2
->value
.real
) == 0 && flag_range_check
== 1)
770 mpfr_div (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
775 if (mpc_cmp_si_si (op2
->value
.complex, 0, 0) == 0
776 && flag_range_check
== 1)
782 gfc_set_model (mpc_realref (op1
->value
.complex));
783 if (mpc_cmp_si_si (op2
->value
.complex, 0, 0) == 0)
785 /* In Fortran, return (NaN + NaN I) for any zero divisor. See
787 mpfr_set_nan (mpc_realref (result
->value
.complex));
788 mpfr_set_nan (mpc_imagref (result
->value
.complex));
791 mpc_div (result
->value
.complex, op1
->value
.complex, op2
->value
.complex,
796 gfc_internal_error ("gfc_arith_divide(): Bad basic type");
800 rc
= gfc_range_check (result
);
802 return check_result (rc
, op1
, result
, resultp
);
805 /* Raise a number to a power. */
808 arith_power (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
815 result
= gfc_get_constant_expr (op1
->ts
.type
, op1
->ts
.kind
, &op1
->where
);
817 switch (op2
->ts
.type
)
820 power_sign
= mpz_sgn (op2
->value
.integer
);
824 /* Handle something to the zeroth power. Since we're dealing
825 with integral exponents, there is no ambiguity in the
826 limiting procedure used to determine the value of 0**0. */
827 switch (op1
->ts
.type
)
830 mpz_set_ui (result
->value
.integer
, 1);
834 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
838 mpc_set_ui (result
->value
.complex, 1, GFC_MPC_RND_MODE
);
842 gfc_internal_error ("arith_power(): Bad base");
847 switch (op1
->ts
.type
)
853 /* First, we simplify the cases of op1 == 1, 0 or -1. */
854 if (mpz_cmp_si (op1
->value
.integer
, 1) == 0)
857 mpz_set_si (result
->value
.integer
, 1);
859 else if (mpz_cmp_si (op1
->value
.integer
, 0) == 0)
861 /* 0**op2 == 0, if op2 > 0
862 0**op2 overflow, if op2 < 0 ; in that case, we
863 set the result to 0 and return ARITH_DIV0. */
864 mpz_set_si (result
->value
.integer
, 0);
865 if (mpz_cmp_si (op2
->value
.integer
, 0) < 0)
868 else if (mpz_cmp_si (op1
->value
.integer
, -1) == 0)
870 /* (-1)**op2 == (-1)**(mod(op2,2)) */
871 unsigned int odd
= mpz_fdiv_ui (op2
->value
.integer
, 2);
873 mpz_set_si (result
->value
.integer
, -1);
875 mpz_set_si (result
->value
.integer
, 1);
877 /* Then, we take care of op2 < 0. */
878 else if (mpz_cmp_si (op2
->value
.integer
, 0) < 0)
880 /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
881 mpz_set_si (result
->value
.integer
, 0);
882 if (warn_integer_division
)
883 gfc_warning_now (OPT_Winteger_division
, "Negative "
884 "exponent of integer has zero "
885 "result at %L", &result
->where
);
887 else if (gfc_extract_int (op2
, &power
))
889 /* If op2 doesn't fit in an int, the exponentiation will
890 overflow, because op2 > 0 and abs(op1) > 1. */
893 i
= gfc_validate_kind (BT_INTEGER
, result
->ts
.kind
, false);
895 if (flag_range_check
)
898 /* Still, we want to give the same value as the
901 mpz_add_ui (max
, gfc_integer_kinds
[i
].huge
, 1);
902 mpz_mul_ui (max
, max
, 2);
903 mpz_powm (result
->value
.integer
, op1
->value
.integer
,
904 op2
->value
.integer
, max
);
908 mpz_pow_ui (result
->value
.integer
, op1
->value
.integer
,
914 mpfr_pow_z (result
->value
.real
, op1
->value
.real
,
915 op2
->value
.integer
, GFC_RND_MODE
);
919 mpc_pow_z (result
->value
.complex, op1
->value
.complex,
920 op2
->value
.integer
, GFC_MPC_RND_MODE
);
931 if (gfc_init_expr_flag
)
933 if (!gfc_notify_std (GFC_STD_F2003
, "Noninteger "
934 "exponent in an initialization "
935 "expression at %L", &op2
->where
))
937 gfc_free_expr (result
);
938 return ARITH_PROHIBIT
;
942 if (mpfr_cmp_si (op1
->value
.real
, 0) < 0)
944 gfc_error ("Raising a negative REAL at %L to "
945 "a REAL power is prohibited", &op1
->where
);
946 gfc_free_expr (result
);
947 return ARITH_PROHIBIT
;
950 mpfr_pow (result
->value
.real
, op1
->value
.real
, op2
->value
.real
,
956 if (gfc_init_expr_flag
)
958 if (!gfc_notify_std (GFC_STD_F2003
, "Noninteger "
959 "exponent in an initialization "
960 "expression at %L", &op2
->where
))
962 gfc_free_expr (result
);
963 return ARITH_PROHIBIT
;
967 mpc_pow (result
->value
.complex, op1
->value
.complex,
968 op2
->value
.complex, GFC_MPC_RND_MODE
);
972 gfc_internal_error ("arith_power(): unknown type");
976 rc
= gfc_range_check (result
);
978 return check_result (rc
, op1
, result
, resultp
);
982 /* Concatenate two string constants. */
985 gfc_arith_concat (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
990 /* By cleverly playing around with constructors, is is possible
991 to get mismaching types here. */
992 if (op1
->ts
.type
!= BT_CHARACTER
|| op2
->ts
.type
!= BT_CHARACTER
993 || op1
->ts
.kind
!= op2
->ts
.kind
)
994 return ARITH_WRONGCONCAT
;
996 result
= gfc_get_constant_expr (BT_CHARACTER
, op1
->ts
.kind
,
999 len
= op1
->value
.character
.length
+ op2
->value
.character
.length
;
1001 result
->value
.character
.string
= gfc_get_wide_string (len
+ 1);
1002 result
->value
.character
.length
= len
;
1004 memcpy (result
->value
.character
.string
, op1
->value
.character
.string
,
1005 op1
->value
.character
.length
* sizeof (gfc_char_t
));
1007 memcpy (&result
->value
.character
.string
[op1
->value
.character
.length
],
1008 op2
->value
.character
.string
,
1009 op2
->value
.character
.length
* sizeof (gfc_char_t
));
1011 result
->value
.character
.string
[len
] = '\0';
1018 /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1019 This function mimics mpfr_cmp but takes NaN into account. */
1022 compare_real (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1028 rc
= mpfr_equal_p (op1
->value
.real
, op2
->value
.real
) ? 0 : 1;
1031 rc
= mpfr_greater_p (op1
->value
.real
, op2
->value
.real
) ? 1 : -1;
1034 rc
= mpfr_greaterequal_p (op1
->value
.real
, op2
->value
.real
) ? 1 : -1;
1037 rc
= mpfr_less_p (op1
->value
.real
, op2
->value
.real
) ? -1 : 1;
1040 rc
= mpfr_lessequal_p (op1
->value
.real
, op2
->value
.real
) ? -1 : 1;
1043 gfc_internal_error ("compare_real(): Bad operator");
1049 /* Comparison operators. Assumes that the two expression nodes
1050 contain two constants of the same type. The op argument is
1051 needed to handle NaN correctly. */
1054 gfc_compare_expr (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1058 switch (op1
->ts
.type
)
1061 rc
= mpz_cmp (op1
->value
.integer
, op2
->value
.integer
);
1065 rc
= compare_real (op1
, op2
, op
);
1069 rc
= gfc_compare_string (op1
, op2
);
1073 rc
= ((!op1
->value
.logical
&& op2
->value
.logical
)
1074 || (op1
->value
.logical
&& !op2
->value
.logical
));
1078 gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1085 /* Compare a pair of complex numbers. Naturally, this is only for
1086 equality and inequality. */
1089 compare_complex (gfc_expr
*op1
, gfc_expr
*op2
)
1091 return mpc_cmp (op1
->value
.complex, op2
->value
.complex) == 0;
1095 /* Given two constant strings and the inverse collating sequence, compare the
1096 strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1097 We use the processor's default collating sequence. */
1100 gfc_compare_string (gfc_expr
*a
, gfc_expr
*b
)
1102 size_t len
, alen
, blen
, i
;
1105 alen
= a
->value
.character
.length
;
1106 blen
= b
->value
.character
.length
;
1108 len
= MAX(alen
, blen
);
1110 for (i
= 0; i
< len
; i
++)
1112 ac
= ((i
< alen
) ? a
->value
.character
.string
[i
] : ' ');
1113 bc
= ((i
< blen
) ? b
->value
.character
.string
[i
] : ' ');
1121 /* Strings are equal */
1127 gfc_compare_with_Cstring (gfc_expr
*a
, const char *b
, bool case_sensitive
)
1129 size_t len
, alen
, blen
, i
;
1132 alen
= a
->value
.character
.length
;
1135 len
= MAX(alen
, blen
);
1137 for (i
= 0; i
< len
; i
++)
1139 ac
= ((i
< alen
) ? a
->value
.character
.string
[i
] : ' ');
1140 bc
= ((i
< blen
) ? b
[i
] : ' ');
1142 if (!case_sensitive
)
1154 /* Strings are equal */
1159 /* Specific comparison subroutines. */
1162 gfc_arith_eq (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1166 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1168 result
->value
.logical
= (op1
->ts
.type
== BT_COMPLEX
)
1169 ? compare_complex (op1
, op2
)
1170 : (gfc_compare_expr (op1
, op2
, INTRINSIC_EQ
) == 0);
1178 gfc_arith_ne (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1182 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1184 result
->value
.logical
= (op1
->ts
.type
== BT_COMPLEX
)
1185 ? !compare_complex (op1
, op2
)
1186 : (gfc_compare_expr (op1
, op2
, INTRINSIC_EQ
) != 0);
1194 gfc_arith_gt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1198 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1200 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_GT
) > 0);
1208 gfc_arith_ge (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1212 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1214 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_GE
) >= 0);
1222 gfc_arith_lt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1226 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1228 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_LT
) < 0);
1236 gfc_arith_le (gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**resultp
)
1240 result
= gfc_get_constant_expr (BT_LOGICAL
, gfc_default_logical_kind
,
1242 result
->value
.logical
= (gfc_compare_expr (op1
, op2
, INTRINSIC_LE
) <= 0);
1250 reduce_unary (arith (*eval
) (gfc_expr
*, gfc_expr
**), gfc_expr
*op
,
1253 gfc_constructor_base head
;
1258 if (op
->expr_type
== EXPR_CONSTANT
)
1259 return eval (op
, result
);
1262 head
= gfc_constructor_copy (op
->value
.constructor
);
1263 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1265 rc
= reduce_unary (eval
, c
->expr
, &r
);
1270 gfc_replace_expr (c
->expr
, r
);
1274 gfc_constructor_free (head
);
1277 gfc_constructor
*c
= gfc_constructor_first (head
);
1278 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1280 r
->shape
= gfc_copy_shape (op
->shape
, op
->rank
);
1282 r
->value
.constructor
= head
;
1291 reduce_binary_ac (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1292 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1294 gfc_constructor_base head
;
1297 arith rc
= ARITH_OK
;
1299 head
= gfc_constructor_copy (op1
->value
.constructor
);
1300 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1302 if (c
->expr
->expr_type
== EXPR_CONSTANT
)
1303 rc
= eval (c
->expr
, op2
, &r
);
1305 rc
= reduce_binary_ac (eval
, c
->expr
, op2
, &r
);
1310 gfc_replace_expr (c
->expr
, r
);
1314 gfc_constructor_free (head
);
1317 gfc_constructor
*c
= gfc_constructor_first (head
);
1318 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1320 r
->shape
= gfc_copy_shape (op1
->shape
, op1
->rank
);
1321 r
->rank
= op1
->rank
;
1322 r
->value
.constructor
= head
;
1331 reduce_binary_ca (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1332 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1334 gfc_constructor_base head
;
1337 arith rc
= ARITH_OK
;
1339 head
= gfc_constructor_copy (op2
->value
.constructor
);
1340 for (c
= gfc_constructor_first (head
); c
; c
= gfc_constructor_next (c
))
1342 if (c
->expr
->expr_type
== EXPR_CONSTANT
)
1343 rc
= eval (op1
, c
->expr
, &r
);
1345 rc
= reduce_binary_ca (eval
, op1
, c
->expr
, &r
);
1350 gfc_replace_expr (c
->expr
, r
);
1354 gfc_constructor_free (head
);
1357 gfc_constructor
*c
= gfc_constructor_first (head
);
1358 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1360 r
->shape
= gfc_copy_shape (op2
->shape
, op2
->rank
);
1361 r
->rank
= op2
->rank
;
1362 r
->value
.constructor
= head
;
1370 /* We need a forward declaration of reduce_binary. */
1371 static arith
reduce_binary (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1372 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
);
1376 reduce_binary_aa (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1377 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1379 gfc_constructor_base head
;
1380 gfc_constructor
*c
, *d
;
1382 arith rc
= ARITH_OK
;
1384 if (!gfc_check_conformance (op1
, op2
, "elemental binary operation"))
1385 return ARITH_INCOMMENSURATE
;
1387 head
= gfc_constructor_copy (op1
->value
.constructor
);
1388 for (c
= gfc_constructor_first (head
),
1389 d
= gfc_constructor_first (op2
->value
.constructor
);
1391 c
= gfc_constructor_next (c
), d
= gfc_constructor_next (d
))
1393 rc
= reduce_binary (eval
, c
->expr
, d
->expr
, &r
);
1397 gfc_replace_expr (c
->expr
, r
);
1401 rc
= ARITH_INCOMMENSURATE
;
1404 gfc_constructor_free (head
);
1407 gfc_constructor
*c
= gfc_constructor_first (head
);
1408 r
= gfc_get_array_expr (c
->expr
->ts
.type
, c
->expr
->ts
.kind
,
1410 r
->shape
= gfc_copy_shape (op1
->shape
, op1
->rank
);
1411 r
->rank
= op1
->rank
;
1412 r
->value
.constructor
= head
;
1421 reduce_binary (arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1422 gfc_expr
*op1
, gfc_expr
*op2
, gfc_expr
**result
)
1424 if (op1
->expr_type
== EXPR_CONSTANT
&& op2
->expr_type
== EXPR_CONSTANT
)
1425 return eval (op1
, op2
, result
);
1427 if (op1
->expr_type
== EXPR_CONSTANT
&& op2
->expr_type
== EXPR_ARRAY
)
1428 return reduce_binary_ca (eval
, op1
, op2
, result
);
1430 if (op1
->expr_type
== EXPR_ARRAY
&& op2
->expr_type
== EXPR_CONSTANT
)
1431 return reduce_binary_ac (eval
, op1
, op2
, result
);
1433 return reduce_binary_aa (eval
, op1
, op2
, result
);
1439 arith (*f2
)(gfc_expr
*, gfc_expr
**);
1440 arith (*f3
)(gfc_expr
*, gfc_expr
*, gfc_expr
**);
1444 /* High level arithmetic subroutines. These subroutines go into
1445 eval_intrinsic(), which can do one of several things to its
1446 operands. If the operands are incompatible with the intrinsic
1447 operation, we return a node pointing to the operands and hope that
1448 an operator interface is found during resolution.
1450 If the operands are compatible and are constants, then we try doing
1451 the arithmetic. We also handle the cases where either or both
1452 operands are array constructors. */
1455 eval_intrinsic (gfc_intrinsic_op op
,
1456 eval_f eval
, gfc_expr
*op1
, gfc_expr
*op2
)
1458 gfc_expr temp
, *result
;
1462 gfc_clear_ts (&temp
.ts
);
1468 if (op1
->ts
.type
!= BT_LOGICAL
)
1471 temp
.ts
.type
= BT_LOGICAL
;
1472 temp
.ts
.kind
= gfc_default_logical_kind
;
1476 /* Logical binary operators */
1479 case INTRINSIC_NEQV
:
1481 if (op1
->ts
.type
!= BT_LOGICAL
|| op2
->ts
.type
!= BT_LOGICAL
)
1484 temp
.ts
.type
= BT_LOGICAL
;
1485 temp
.ts
.kind
= gfc_default_logical_kind
;
1490 case INTRINSIC_UPLUS
:
1491 case INTRINSIC_UMINUS
:
1492 if (!gfc_numeric_ts (&op1
->ts
))
1499 case INTRINSIC_PARENTHESES
:
1504 /* Additional restrictions for ordering relations. */
1506 case INTRINSIC_GE_OS
:
1508 case INTRINSIC_LT_OS
:
1510 case INTRINSIC_LE_OS
:
1512 case INTRINSIC_GT_OS
:
1513 if (op1
->ts
.type
== BT_COMPLEX
|| op2
->ts
.type
== BT_COMPLEX
)
1515 temp
.ts
.type
= BT_LOGICAL
;
1516 temp
.ts
.kind
= gfc_default_logical_kind
;
1522 case INTRINSIC_EQ_OS
:
1524 case INTRINSIC_NE_OS
:
1525 if (op1
->ts
.type
== BT_CHARACTER
&& op2
->ts
.type
== BT_CHARACTER
)
1528 temp
.ts
.type
= BT_LOGICAL
;
1529 temp
.ts
.kind
= gfc_default_logical_kind
;
1531 /* If kind mismatch, exit and we'll error out later. */
1532 if (op1
->ts
.kind
!= op2
->ts
.kind
)
1539 /* Numeric binary */
1540 case INTRINSIC_PLUS
:
1541 case INTRINSIC_MINUS
:
1542 case INTRINSIC_TIMES
:
1543 case INTRINSIC_DIVIDE
:
1544 case INTRINSIC_POWER
:
1545 if (!gfc_numeric_ts (&op1
->ts
) || !gfc_numeric_ts (&op2
->ts
))
1548 /* Insert any necessary type conversions to make the operands
1551 temp
.expr_type
= EXPR_OP
;
1552 gfc_clear_ts (&temp
.ts
);
1553 temp
.value
.op
.op
= op
;
1555 temp
.value
.op
.op1
= op1
;
1556 temp
.value
.op
.op2
= op2
;
1558 gfc_type_convert_binary (&temp
, warn_conversion
|| warn_conversion_extra
);
1560 if (op
== INTRINSIC_EQ
|| op
== INTRINSIC_NE
1561 || op
== INTRINSIC_GE
|| op
== INTRINSIC_GT
1562 || op
== INTRINSIC_LE
|| op
== INTRINSIC_LT
1563 || op
== INTRINSIC_EQ_OS
|| op
== INTRINSIC_NE_OS
1564 || op
== INTRINSIC_GE_OS
|| op
== INTRINSIC_GT_OS
1565 || op
== INTRINSIC_LE_OS
|| op
== INTRINSIC_LT_OS
)
1567 temp
.ts
.type
= BT_LOGICAL
;
1568 temp
.ts
.kind
= gfc_default_logical_kind
;
1574 /* Character binary */
1575 case INTRINSIC_CONCAT
:
1576 if (op1
->ts
.type
!= BT_CHARACTER
|| op2
->ts
.type
!= BT_CHARACTER
1577 || op1
->ts
.kind
!= op2
->ts
.kind
)
1580 temp
.ts
.type
= BT_CHARACTER
;
1581 temp
.ts
.kind
= op1
->ts
.kind
;
1585 case INTRINSIC_USER
:
1589 gfc_internal_error ("eval_intrinsic(): Bad operator");
1592 if (op1
->expr_type
!= EXPR_CONSTANT
1593 && (op1
->expr_type
!= EXPR_ARRAY
1594 || !gfc_is_constant_expr (op1
) || !gfc_expanded_ac (op1
)))
1598 && op2
->expr_type
!= EXPR_CONSTANT
1599 && (op2
->expr_type
!= EXPR_ARRAY
1600 || !gfc_is_constant_expr (op2
) || !gfc_expanded_ac (op2
)))
1604 rc
= reduce_unary (eval
.f2
, op1
, &result
);
1606 rc
= reduce_binary (eval
.f3
, op1
, op2
, &result
);
1609 /* Something went wrong. */
1610 if (op
== INTRINSIC_POWER
&& rc
== ARITH_PROHIBIT
)
1615 gfc_error (gfc_arith_error (rc
), &op1
->where
);
1616 if (rc
== ARITH_OVERFLOW
)
1623 gfc_free_expr (op1
);
1624 gfc_free_expr (op2
);
1628 /* Create a run-time expression. */
1629 result
= gfc_get_operator_expr (&op1
->where
, op
, op1
, op2
);
1630 result
->ts
= temp
.ts
;
1636 /* Modify type of expression for zero size array. */
1639 eval_type_intrinsic0 (gfc_intrinsic_op iop
, gfc_expr
*op
)
1642 gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1647 case INTRINSIC_GE_OS
:
1649 case INTRINSIC_LT_OS
:
1651 case INTRINSIC_LE_OS
:
1653 case INTRINSIC_GT_OS
:
1655 case INTRINSIC_EQ_OS
:
1657 case INTRINSIC_NE_OS
:
1658 op
->ts
.type
= BT_LOGICAL
;
1659 op
->ts
.kind
= gfc_default_logical_kind
;
1670 /* Return nonzero if the expression is a zero size array. */
1673 gfc_zero_size_array (gfc_expr
*e
)
1675 if (e
->expr_type
!= EXPR_ARRAY
)
1678 return e
->value
.constructor
== NULL
;
1682 /* Reduce a binary expression where at least one of the operands
1683 involves a zero-length array. Returns NULL if neither of the
1684 operands is a zero-length array. */
1687 reduce_binary0 (gfc_expr
*op1
, gfc_expr
*op2
)
1689 if (gfc_zero_size_array (op1
))
1691 gfc_free_expr (op2
);
1695 if (gfc_zero_size_array (op2
))
1697 gfc_free_expr (op1
);
1706 eval_intrinsic_f2 (gfc_intrinsic_op op
,
1707 arith (*eval
) (gfc_expr
*, gfc_expr
**),
1708 gfc_expr
*op1
, gfc_expr
*op2
)
1715 if (gfc_zero_size_array (op1
))
1716 return eval_type_intrinsic0 (op
, op1
);
1720 result
= reduce_binary0 (op1
, op2
);
1722 return eval_type_intrinsic0 (op
, result
);
1726 return eval_intrinsic (op
, f
, op1
, op2
);
1731 eval_intrinsic_f3 (gfc_intrinsic_op op
,
1732 arith (*eval
) (gfc_expr
*, gfc_expr
*, gfc_expr
**),
1733 gfc_expr
*op1
, gfc_expr
*op2
)
1738 result
= reduce_binary0 (op1
, op2
);
1740 return eval_type_intrinsic0(op
, result
);
1743 return eval_intrinsic (op
, f
, op1
, op2
);
1748 gfc_parentheses (gfc_expr
*op
)
1750 if (gfc_is_constant_expr (op
))
1753 return eval_intrinsic_f2 (INTRINSIC_PARENTHESES
, gfc_arith_identity
,
1758 gfc_uplus (gfc_expr
*op
)
1760 return eval_intrinsic_f2 (INTRINSIC_UPLUS
, gfc_arith_identity
, op
, NULL
);
1765 gfc_uminus (gfc_expr
*op
)
1767 return eval_intrinsic_f2 (INTRINSIC_UMINUS
, gfc_arith_uminus
, op
, NULL
);
1772 gfc_add (gfc_expr
*op1
, gfc_expr
*op2
)
1774 return eval_intrinsic_f3 (INTRINSIC_PLUS
, gfc_arith_plus
, op1
, op2
);
1779 gfc_subtract (gfc_expr
*op1
, gfc_expr
*op2
)
1781 return eval_intrinsic_f3 (INTRINSIC_MINUS
, gfc_arith_minus
, op1
, op2
);
1786 gfc_multiply (gfc_expr
*op1
, gfc_expr
*op2
)
1788 return eval_intrinsic_f3 (INTRINSIC_TIMES
, gfc_arith_times
, op1
, op2
);
1793 gfc_divide (gfc_expr
*op1
, gfc_expr
*op2
)
1795 return eval_intrinsic_f3 (INTRINSIC_DIVIDE
, gfc_arith_divide
, op1
, op2
);
1800 gfc_power (gfc_expr
*op1
, gfc_expr
*op2
)
1802 return eval_intrinsic_f3 (INTRINSIC_POWER
, arith_power
, op1
, op2
);
1807 gfc_concat (gfc_expr
*op1
, gfc_expr
*op2
)
1809 return eval_intrinsic_f3 (INTRINSIC_CONCAT
, gfc_arith_concat
, op1
, op2
);
1814 gfc_and (gfc_expr
*op1
, gfc_expr
*op2
)
1816 return eval_intrinsic_f3 (INTRINSIC_AND
, gfc_arith_and
, op1
, op2
);
1821 gfc_or (gfc_expr
*op1
, gfc_expr
*op2
)
1823 return eval_intrinsic_f3 (INTRINSIC_OR
, gfc_arith_or
, op1
, op2
);
1828 gfc_not (gfc_expr
*op1
)
1830 return eval_intrinsic_f2 (INTRINSIC_NOT
, gfc_arith_not
, op1
, NULL
);
1835 gfc_eqv (gfc_expr
*op1
, gfc_expr
*op2
)
1837 return eval_intrinsic_f3 (INTRINSIC_EQV
, gfc_arith_eqv
, op1
, op2
);
1842 gfc_neqv (gfc_expr
*op1
, gfc_expr
*op2
)
1844 return eval_intrinsic_f3 (INTRINSIC_NEQV
, gfc_arith_neqv
, op1
, op2
);
1849 gfc_eq (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1851 return eval_intrinsic_f3 (op
, gfc_arith_eq
, op1
, op2
);
1856 gfc_ne (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1858 return eval_intrinsic_f3 (op
, gfc_arith_ne
, op1
, op2
);
1863 gfc_gt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1865 return eval_intrinsic_f3 (op
, gfc_arith_gt
, op1
, op2
);
1870 gfc_ge (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1872 return eval_intrinsic_f3 (op
, gfc_arith_ge
, op1
, op2
);
1877 gfc_lt (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1879 return eval_intrinsic_f3 (op
, gfc_arith_lt
, op1
, op2
);
1884 gfc_le (gfc_expr
*op1
, gfc_expr
*op2
, gfc_intrinsic_op op
)
1886 return eval_intrinsic_f3 (op
, gfc_arith_le
, op1
, op2
);
1890 /* Convert an integer string to an expression node. */
1893 gfc_convert_integer (const char *buffer
, int kind
, int radix
, locus
*where
)
1898 e
= gfc_get_constant_expr (BT_INTEGER
, kind
, where
);
1899 /* A leading plus is allowed, but not by mpz_set_str. */
1900 if (buffer
[0] == '+')
1904 mpz_set_str (e
->value
.integer
, t
, radix
);
1910 /* Convert a real string to an expression node. */
1913 gfc_convert_real (const char *buffer
, int kind
, locus
*where
)
1917 e
= gfc_get_constant_expr (BT_REAL
, kind
, where
);
1918 mpfr_set_str (e
->value
.real
, buffer
, 10, GFC_RND_MODE
);
1924 /* Convert a pair of real, constant expression nodes to a single
1925 complex expression node. */
1928 gfc_convert_complex (gfc_expr
*real
, gfc_expr
*imag
, int kind
)
1932 e
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &real
->where
);
1933 mpc_set_fr_fr (e
->value
.complex, real
->value
.real
, imag
->value
.real
,
1940 /******* Simplification of intrinsic functions with constant arguments *****/
1943 /* Deal with an arithmetic error. */
1946 arith_error (arith rc
, gfc_typespec
*from
, gfc_typespec
*to
, locus
*where
)
1951 gfc_error ("Arithmetic OK converting %s to %s at %L",
1952 gfc_typename (from
), gfc_typename (to
), where
);
1954 case ARITH_OVERFLOW
:
1955 gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
1956 "can be disabled with the option %<-fno-range-check%>",
1957 gfc_typename (from
), gfc_typename (to
), where
);
1959 case ARITH_UNDERFLOW
:
1960 gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
1961 "can be disabled with the option %<-fno-range-check%>",
1962 gfc_typename (from
), gfc_typename (to
), where
);
1965 gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
1966 "can be disabled with the option %<-fno-range-check%>",
1967 gfc_typename (from
), gfc_typename (to
), where
);
1970 gfc_error ("Division by zero converting %s to %s at %L",
1971 gfc_typename (from
), gfc_typename (to
), where
);
1973 case ARITH_INCOMMENSURATE
:
1974 gfc_error ("Array operands are incommensurate converting %s to %s at %L",
1975 gfc_typename (from
), gfc_typename (to
), where
);
1977 case ARITH_ASYMMETRIC
:
1978 gfc_error ("Integer outside symmetric range implied by Standard Fortran"
1979 " converting %s to %s at %L",
1980 gfc_typename (from
), gfc_typename (to
), where
);
1983 gfc_internal_error ("gfc_arith_error(): Bad error code");
1986 /* TODO: Do something about the error, i.e., throw exception, return
1990 /* Returns true if significant bits were lost when converting real
1991 constant r from from_kind to to_kind. */
1994 wprecision_real_real (mpfr_t r
, int from_kind
, int to_kind
)
1999 gfc_set_model_kind (to_kind
);
2001 gfc_set_model_kind (from_kind
);
2004 mpfr_set (rv
, r
, GFC_RND_MODE
);
2005 mpfr_sub (diff
, rv
, r
, GFC_RND_MODE
);
2007 ret
= ! mpfr_zero_p (diff
);
2013 /* Return true if conversion from an integer to a real loses precision. */
2016 wprecision_int_real (mpz_t n
, mpfr_t r
)
2021 mpfr_get_z (i
, r
, GFC_RND_MODE
);
2023 ret
= mpz_cmp_si (i
, 0) != 0;
2028 /* Convert integers to integers. */
2031 gfc_int2int (gfc_expr
*src
, int kind
)
2036 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2038 mpz_set (result
->value
.integer
, src
->value
.integer
);
2040 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
2042 if (rc
== ARITH_ASYMMETRIC
)
2044 gfc_warning (0, gfc_arith_error (rc
), &src
->where
);
2048 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2049 gfc_free_expr (result
);
2054 /* If we do not trap numeric overflow, we need to convert the number to
2055 signed, throwing away high-order bits if necessary. */
2056 if (flag_range_check
== 0)
2060 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
2061 gfc_convert_mpz_to_signed (result
->value
.integer
,
2062 gfc_integer_kinds
[k
].bit_size
);
2064 if (warn_conversion
&& kind
< src
->ts
.kind
)
2065 gfc_warning_now (OPT_Wconversion
, "Conversion from %qs to %qs at %L",
2066 gfc_typename (&src
->ts
), gfc_typename (&result
->ts
),
2073 /* Convert integers to reals. */
2076 gfc_int2real (gfc_expr
*src
, int kind
)
2081 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2083 mpfr_set_z (result
->value
.real
, src
->value
.integer
, GFC_RND_MODE
);
2085 if ((rc
= gfc_check_real_range (result
->value
.real
, kind
)) != ARITH_OK
)
2087 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2088 gfc_free_expr (result
);
2093 && wprecision_int_real (src
->value
.integer
, result
->value
.real
))
2094 gfc_warning (OPT_Wconversion
, "Change of value in conversion "
2095 "from %qs to %qs at %L",
2096 gfc_typename (&src
->ts
),
2097 gfc_typename (&result
->ts
),
2104 /* Convert default integer to default complex. */
2107 gfc_int2complex (gfc_expr
*src
, int kind
)
2112 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2114 mpc_set_z (result
->value
.complex, src
->value
.integer
, GFC_MPC_RND_MODE
);
2116 if ((rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
))
2119 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2120 gfc_free_expr (result
);
2125 && wprecision_int_real (src
->value
.integer
,
2126 mpc_realref (result
->value
.complex)))
2127 gfc_warning_now (OPT_Wconversion
, "Change of value in conversion "
2128 "from %qs to %qs at %L",
2129 gfc_typename (&src
->ts
),
2130 gfc_typename (&result
->ts
),
2137 /* Convert default real to default integer. */
2140 gfc_real2int (gfc_expr
*src
, int kind
)
2144 bool did_warn
= false;
2146 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2148 gfc_mpfr_to_mpz (result
->value
.integer
, src
->value
.real
, &src
->where
);
2150 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
2152 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2153 gfc_free_expr (result
);
2157 /* If there was a fractional part, warn about this. */
2159 if (warn_conversion
)
2163 mpfr_frac (f
, src
->value
.real
, GFC_RND_MODE
);
2164 if (mpfr_cmp_si (f
, 0) != 0)
2166 gfc_warning_now (OPT_Wconversion
, "Change of value in conversion "
2167 "from %qs to %qs at %L", gfc_typename (&src
->ts
),
2168 gfc_typename (&result
->ts
), &src
->where
);
2172 if (!did_warn
&& warn_conversion_extra
)
2174 gfc_warning_now (OPT_Wconversion_extra
, "Conversion from %qs to %qs "
2175 "at %L", gfc_typename (&src
->ts
),
2176 gfc_typename (&result
->ts
), &src
->where
);
2183 /* Convert real to real. */
2186 gfc_real2real (gfc_expr
*src
, int kind
)
2190 bool did_warn
= false;
2192 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2194 mpfr_set (result
->value
.real
, src
->value
.real
, GFC_RND_MODE
);
2196 rc
= gfc_check_real_range (result
->value
.real
, kind
);
2198 if (rc
== ARITH_UNDERFLOW
)
2201 gfc_warning (OPT_Woverflow
, gfc_arith_error (rc
), &src
->where
);
2202 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2204 else if (rc
!= ARITH_OK
)
2206 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2207 gfc_free_expr (result
);
2211 /* As a special bonus, don't warn about REAL values which are not changed by
2212 the conversion if -Wconversion is specified and -Wconversion-extra is
2215 if ((warn_conversion
|| warn_conversion_extra
) && src
->ts
.kind
> kind
)
2217 int w
= warn_conversion
? OPT_Wconversion
: OPT_Wconversion_extra
;
2219 /* Calculate the difference between the constant and the rounded
2220 value and check it against zero. */
2222 if (wprecision_real_real (src
->value
.real
, src
->ts
.kind
, kind
))
2224 gfc_warning_now (w
, "Change of value in conversion from "
2226 gfc_typename (&src
->ts
), gfc_typename (&result
->ts
),
2228 /* Make sure the conversion warning is not emitted again. */
2233 if (!did_warn
&& warn_conversion_extra
)
2234 gfc_warning_now (OPT_Wconversion_extra
, "Conversion from %qs to %qs "
2235 "at %L", gfc_typename(&src
->ts
),
2236 gfc_typename(&result
->ts
), &src
->where
);
2242 /* Convert real to complex. */
2245 gfc_real2complex (gfc_expr
*src
, int kind
)
2249 bool did_warn
= false;
2251 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2253 mpc_set_fr (result
->value
.complex, src
->value
.real
, GFC_MPC_RND_MODE
);
2255 rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
);
2257 if (rc
== ARITH_UNDERFLOW
)
2260 gfc_warning (OPT_Woverflow
, gfc_arith_error (rc
), &src
->where
);
2261 mpfr_set_ui (mpc_realref (result
->value
.complex), 0, GFC_RND_MODE
);
2263 else if (rc
!= ARITH_OK
)
2265 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2266 gfc_free_expr (result
);
2270 if ((warn_conversion
|| warn_conversion_extra
) && src
->ts
.kind
> kind
)
2272 int w
= warn_conversion
? OPT_Wconversion
: OPT_Wconversion_extra
;
2274 if (wprecision_real_real (src
->value
.real
, src
->ts
.kind
, kind
))
2276 gfc_warning_now (w
, "Change of value in conversion from "
2278 gfc_typename (&src
->ts
), gfc_typename (&result
->ts
),
2280 /* Make sure the conversion warning is not emitted again. */
2285 if (!did_warn
&& warn_conversion_extra
)
2286 gfc_warning_now (OPT_Wconversion_extra
, "Conversion from %qs to %qs "
2287 "at %L", gfc_typename(&src
->ts
),
2288 gfc_typename(&result
->ts
), &src
->where
);
2294 /* Convert complex to integer. */
2297 gfc_complex2int (gfc_expr
*src
, int kind
)
2301 bool did_warn
= false;
2303 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2305 gfc_mpfr_to_mpz (result
->value
.integer
, mpc_realref (src
->value
.complex),
2308 if ((rc
= gfc_check_integer_range (result
->value
.integer
, kind
)) != ARITH_OK
)
2310 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2311 gfc_free_expr (result
);
2315 if (warn_conversion
|| warn_conversion_extra
)
2317 int w
= warn_conversion
? OPT_Wconversion
: OPT_Wconversion_extra
;
2319 /* See if we discarded an imaginary part. */
2320 if (mpfr_cmp_si (mpc_imagref (src
->value
.complex), 0) != 0)
2322 gfc_warning_now (w
, "Non-zero imaginary part discarded "
2323 "in conversion from %qs to %qs at %L",
2324 gfc_typename(&src
->ts
), gfc_typename (&result
->ts
),
2333 mpfr_frac (f
, src
->value
.real
, GFC_RND_MODE
);
2334 if (mpfr_cmp_si (f
, 0) != 0)
2336 gfc_warning_now (w
, "Change of value in conversion from "
2337 "%qs to %qs at %L", gfc_typename (&src
->ts
),
2338 gfc_typename (&result
->ts
), &src
->where
);
2344 if (!did_warn
&& warn_conversion_extra
)
2346 gfc_warning_now (OPT_Wconversion_extra
, "Conversion from %qs to %qs "
2347 "at %L", gfc_typename (&src
->ts
),
2348 gfc_typename (&result
->ts
), &src
->where
);
2356 /* Convert complex to real. */
2359 gfc_complex2real (gfc_expr
*src
, int kind
)
2363 bool did_warn
= false;
2365 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2367 mpc_real (result
->value
.real
, src
->value
.complex, GFC_RND_MODE
);
2369 rc
= gfc_check_real_range (result
->value
.real
, kind
);
2371 if (rc
== ARITH_UNDERFLOW
)
2374 gfc_warning (OPT_Woverflow
, gfc_arith_error (rc
), &src
->where
);
2375 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2379 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2380 gfc_free_expr (result
);
2384 if (warn_conversion
|| warn_conversion_extra
)
2386 int w
= warn_conversion
? OPT_Wconversion
: OPT_Wconversion_extra
;
2388 /* See if we discarded an imaginary part. */
2389 if (mpfr_cmp_si (mpc_imagref (src
->value
.complex), 0) != 0)
2391 gfc_warning (w
, "Non-zero imaginary part discarded "
2392 "in conversion from %qs to %qs at %L",
2393 gfc_typename(&src
->ts
), gfc_typename (&result
->ts
),
2398 /* Calculate the difference between the real constant and the rounded
2399 value and check it against zero. */
2401 if (kind
> src
->ts
.kind
2402 && wprecision_real_real (mpc_realref (src
->value
.complex),
2403 src
->ts
.kind
, kind
))
2405 gfc_warning_now (w
, "Change of value in conversion from "
2407 gfc_typename (&src
->ts
), gfc_typename (&result
->ts
),
2409 /* Make sure the conversion warning is not emitted again. */
2414 if (!did_warn
&& warn_conversion_extra
)
2415 gfc_warning_now (OPT_Wconversion
, "Conversion from %qs to %qs at %L",
2416 gfc_typename(&src
->ts
), gfc_typename (&result
->ts
),
2423 /* Convert complex to complex. */
2426 gfc_complex2complex (gfc_expr
*src
, int kind
)
2430 bool did_warn
= false;
2432 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2434 mpc_set (result
->value
.complex, src
->value
.complex, GFC_MPC_RND_MODE
);
2436 rc
= gfc_check_real_range (mpc_realref (result
->value
.complex), kind
);
2438 if (rc
== ARITH_UNDERFLOW
)
2441 gfc_warning (OPT_Woverflow
, gfc_arith_error (rc
), &src
->where
);
2442 mpfr_set_ui (mpc_realref (result
->value
.complex), 0, GFC_RND_MODE
);
2444 else if (rc
!= ARITH_OK
)
2446 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2447 gfc_free_expr (result
);
2451 rc
= gfc_check_real_range (mpc_imagref (result
->value
.complex), kind
);
2453 if (rc
== ARITH_UNDERFLOW
)
2456 gfc_warning (OPT_Woverflow
, gfc_arith_error (rc
), &src
->where
);
2457 mpfr_set_ui (mpc_imagref (result
->value
.complex), 0, GFC_RND_MODE
);
2459 else if (rc
!= ARITH_OK
)
2461 arith_error (rc
, &src
->ts
, &result
->ts
, &src
->where
);
2462 gfc_free_expr (result
);
2466 if ((warn_conversion
|| warn_conversion_extra
) && src
->ts
.kind
> kind
2467 && (wprecision_real_real (mpc_realref (src
->value
.complex),
2469 || wprecision_real_real (mpc_imagref (src
->value
.complex),
2470 src
->ts
.kind
, kind
)))
2472 int w
= warn_conversion
? OPT_Wconversion
: OPT_Wconversion_extra
;
2474 gfc_warning_now (w
, "Change of value in conversion from "
2475 " %qs to %qs at %L",
2476 gfc_typename (&src
->ts
), gfc_typename (&result
->ts
),
2481 if (!did_warn
&& warn_conversion_extra
&& src
->ts
.kind
!= kind
)
2482 gfc_warning_now (OPT_Wconversion_extra
, "Conversion from %qs to %qs "
2483 "at %L", gfc_typename(&src
->ts
),
2484 gfc_typename (&result
->ts
), &src
->where
);
2490 /* Logical kind conversion. */
2493 gfc_log2log (gfc_expr
*src
, int kind
)
2497 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2498 result
->value
.logical
= src
->value
.logical
;
2504 /* Convert logical to integer. */
2507 gfc_log2int (gfc_expr
*src
, int kind
)
2511 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2512 mpz_set_si (result
->value
.integer
, src
->value
.logical
);
2518 /* Convert integer to logical. */
2521 gfc_int2log (gfc_expr
*src
, int kind
)
2525 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2526 result
->value
.logical
= (mpz_cmp_si (src
->value
.integer
, 0) != 0);
2531 /* Convert character to character. We only use wide strings internally,
2532 so we only set the kind. */
2535 gfc_character2character (gfc_expr
*src
, int kind
)
2538 result
= gfc_copy_expr (src
);
2539 result
->ts
.kind
= kind
;
2544 /* Helper function to set the representation in a Hollerith conversion.
2545 This assumes that the ts.type and ts.kind of the result have already
2549 hollerith2representation (gfc_expr
*result
, gfc_expr
*src
)
2551 int src_len
, result_len
;
2553 src_len
= src
->representation
.length
- src
->ts
.u
.pad
;
2554 result_len
= gfc_target_expr_size (result
);
2556 if (src_len
> result_len
)
2559 "The Hollerith constant at %L is too long to convert to %qs",
2560 &src
->where
, gfc_typename(&result
->ts
));
2563 result
->representation
.string
= XCNEWVEC (char, result_len
+ 1);
2564 memcpy (result
->representation
.string
, src
->representation
.string
,
2565 MIN (result_len
, src_len
));
2567 if (src_len
< result_len
)
2568 memset (&result
->representation
.string
[src_len
], ' ', result_len
- src_len
);
2570 result
->representation
.string
[result_len
] = '\0'; /* For debugger */
2571 result
->representation
.length
= result_len
;
2575 /* Convert Hollerith to integer. The constant will be padded or truncated. */
2578 gfc_hollerith2int (gfc_expr
*src
, int kind
)
2581 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &src
->where
);
2583 hollerith2representation (result
, src
);
2584 gfc_interpret_integer (kind
, (unsigned char *) result
->representation
.string
,
2585 result
->representation
.length
, result
->value
.integer
);
2591 /* Convert Hollerith to real. The constant will be padded or truncated. */
2594 gfc_hollerith2real (gfc_expr
*src
, int kind
)
2597 result
= gfc_get_constant_expr (BT_REAL
, kind
, &src
->where
);
2599 hollerith2representation (result
, src
);
2600 gfc_interpret_float (kind
, (unsigned char *) result
->representation
.string
,
2601 result
->representation
.length
, result
->value
.real
);
2607 /* Convert Hollerith to complex. The constant will be padded or truncated. */
2610 gfc_hollerith2complex (gfc_expr
*src
, int kind
)
2613 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &src
->where
);
2615 hollerith2representation (result
, src
);
2616 gfc_interpret_complex (kind
, (unsigned char *) result
->representation
.string
,
2617 result
->representation
.length
, result
->value
.complex);
2623 /* Convert Hollerith to character. */
2626 gfc_hollerith2character (gfc_expr
*src
, int kind
)
2630 result
= gfc_copy_expr (src
);
2631 result
->ts
.type
= BT_CHARACTER
;
2632 result
->ts
.kind
= kind
;
2633 result
->ts
.u
.pad
= 0;
2635 result
->value
.character
.length
= result
->representation
.length
;
2636 result
->value
.character
.string
2637 = gfc_char_to_widechar (result
->representation
.string
);
2643 /* Convert Hollerith to logical. The constant will be padded or truncated. */
2646 gfc_hollerith2logical (gfc_expr
*src
, int kind
)
2649 result
= gfc_get_constant_expr (BT_LOGICAL
, kind
, &src
->where
);
2651 hollerith2representation (result
, src
);
2652 gfc_interpret_logical (kind
, (unsigned char *) result
->representation
.string
,
2653 result
->representation
.length
, &result
->value
.logical
);