arith.cc revision 1.1.1.1 1 1.1 mrg /* Compiler arithmetic
2 1.1 mrg Copyright (C) 2000-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Andy Vaught
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg /* Since target arithmetic must be done on the host, there has to
22 1.1 mrg be some way of evaluating arithmetic expressions as the host
23 1.1 mrg would evaluate them. We use the GNU MP library and the MPFR
24 1.1 mrg library to do arithmetic, and this file provides the interface. */
25 1.1 mrg
26 1.1 mrg #include "config.h"
27 1.1 mrg #include "system.h"
28 1.1 mrg #include "coretypes.h"
29 1.1 mrg #include "options.h"
30 1.1 mrg #include "gfortran.h"
31 1.1 mrg #include "arith.h"
32 1.1 mrg #include "target-memory.h"
33 1.1 mrg #include "constructor.h"
34 1.1 mrg
35 1.1 mrg bool gfc_seen_div0;
36 1.1 mrg
37 1.1 mrg /* MPFR does not have a direct replacement for mpz_set_f() from GMP.
38 1.1 mrg It's easily implemented with a few calls though. */
39 1.1 mrg
40 1.1 mrg void
41 1.1 mrg gfc_mpfr_to_mpz (mpz_t z, mpfr_t x, locus *where)
42 1.1 mrg {
43 1.1 mrg mpfr_exp_t e;
44 1.1 mrg
45 1.1 mrg if (mpfr_inf_p (x) || mpfr_nan_p (x))
46 1.1 mrg {
47 1.1 mrg gfc_error ("Conversion of an Infinity or Not-a-Number at %L "
48 1.1 mrg "to INTEGER", where);
49 1.1 mrg mpz_set_ui (z, 0);
50 1.1 mrg return;
51 1.1 mrg }
52 1.1 mrg
53 1.1 mrg e = mpfr_get_z_exp (z, x);
54 1.1 mrg
55 1.1 mrg if (e > 0)
56 1.1 mrg mpz_mul_2exp (z, z, e);
57 1.1 mrg else
58 1.1 mrg mpz_tdiv_q_2exp (z, z, -e);
59 1.1 mrg }
60 1.1 mrg
61 1.1 mrg
62 1.1 mrg /* Set the model number precision by the requested KIND. */
63 1.1 mrg
64 1.1 mrg void
65 1.1 mrg gfc_set_model_kind (int kind)
66 1.1 mrg {
67 1.1 mrg int index = gfc_validate_kind (BT_REAL, kind, false);
68 1.1 mrg int base2prec;
69 1.1 mrg
70 1.1 mrg base2prec = gfc_real_kinds[index].digits;
71 1.1 mrg if (gfc_real_kinds[index].radix != 2)
72 1.1 mrg base2prec *= gfc_real_kinds[index].radix / 2;
73 1.1 mrg mpfr_set_default_prec (base2prec);
74 1.1 mrg }
75 1.1 mrg
76 1.1 mrg
77 1.1 mrg /* Set the model number precision from mpfr_t x. */
78 1.1 mrg
79 1.1 mrg void
80 1.1 mrg gfc_set_model (mpfr_t x)
81 1.1 mrg {
82 1.1 mrg mpfr_set_default_prec (mpfr_get_prec (x));
83 1.1 mrg }
84 1.1 mrg
85 1.1 mrg
86 1.1 mrg /* Given an arithmetic error code, return a pointer to a string that
87 1.1 mrg explains the error. */
88 1.1 mrg
89 1.1 mrg static const char *
90 1.1 mrg gfc_arith_error (arith code)
91 1.1 mrg {
92 1.1 mrg const char *p;
93 1.1 mrg
94 1.1 mrg switch (code)
95 1.1 mrg {
96 1.1 mrg case ARITH_OK:
97 1.1 mrg p = G_("Arithmetic OK at %L");
98 1.1 mrg break;
99 1.1 mrg case ARITH_OVERFLOW:
100 1.1 mrg p = G_("Arithmetic overflow at %L");
101 1.1 mrg break;
102 1.1 mrg case ARITH_UNDERFLOW:
103 1.1 mrg p = G_("Arithmetic underflow at %L");
104 1.1 mrg break;
105 1.1 mrg case ARITH_NAN:
106 1.1 mrg p = G_("Arithmetic NaN at %L");
107 1.1 mrg break;
108 1.1 mrg case ARITH_DIV0:
109 1.1 mrg p = G_("Division by zero at %L");
110 1.1 mrg break;
111 1.1 mrg case ARITH_INCOMMENSURATE:
112 1.1 mrg p = G_("Array operands are incommensurate at %L");
113 1.1 mrg break;
114 1.1 mrg case ARITH_ASYMMETRIC:
115 1.1 mrg p = G_("Integer outside symmetric range implied by Standard Fortran"
116 1.1 mrg " at %L");
117 1.1 mrg break;
118 1.1 mrg case ARITH_WRONGCONCAT:
119 1.1 mrg p = G_("Illegal type in character concatenation at %L");
120 1.1 mrg break;
121 1.1 mrg
122 1.1 mrg default:
123 1.1 mrg gfc_internal_error ("gfc_arith_error(): Bad error code");
124 1.1 mrg }
125 1.1 mrg
126 1.1 mrg return p;
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg
130 1.1 mrg /* Get things ready to do math. */
131 1.1 mrg
132 1.1 mrg void
133 1.1 mrg gfc_arith_init_1 (void)
134 1.1 mrg {
135 1.1 mrg gfc_integer_info *int_info;
136 1.1 mrg gfc_real_info *real_info;
137 1.1 mrg mpfr_t a, b;
138 1.1 mrg int i;
139 1.1 mrg
140 1.1 mrg mpfr_set_default_prec (128);
141 1.1 mrg mpfr_init (a);
142 1.1 mrg
143 1.1 mrg /* Convert the minimum and maximum values for each kind into their
144 1.1 mrg GNU MP representation. */
145 1.1 mrg for (int_info = gfc_integer_kinds; int_info->kind != 0; int_info++)
146 1.1 mrg {
147 1.1 mrg /* Huge */
148 1.1 mrg mpz_init (int_info->huge);
149 1.1 mrg mpz_set_ui (int_info->huge, int_info->radix);
150 1.1 mrg mpz_pow_ui (int_info->huge, int_info->huge, int_info->digits);
151 1.1 mrg mpz_sub_ui (int_info->huge, int_info->huge, 1);
152 1.1 mrg
153 1.1 mrg /* These are the numbers that are actually representable by the
154 1.1 mrg target. For bases other than two, this needs to be changed. */
155 1.1 mrg if (int_info->radix != 2)
156 1.1 mrg gfc_internal_error ("Fix min_int calculation");
157 1.1 mrg
158 1.1 mrg /* See PRs 13490 and 17912, related to integer ranges.
159 1.1 mrg The pedantic_min_int exists for range checking when a program
160 1.1 mrg is compiled with -pedantic, and reflects the belief that
161 1.1 mrg Standard Fortran requires integers to be symmetrical, i.e.
162 1.1 mrg every negative integer must have a representable positive
163 1.1 mrg absolute value, and vice versa. */
164 1.1 mrg
165 1.1 mrg mpz_init (int_info->pedantic_min_int);
166 1.1 mrg mpz_neg (int_info->pedantic_min_int, int_info->huge);
167 1.1 mrg
168 1.1 mrg mpz_init (int_info->min_int);
169 1.1 mrg mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
170 1.1 mrg
171 1.1 mrg /* Range */
172 1.1 mrg mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
173 1.1 mrg mpfr_log10 (a, a, GFC_RND_MODE);
174 1.1 mrg mpfr_trunc (a, a);
175 1.1 mrg int_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
176 1.1 mrg }
177 1.1 mrg
178 1.1 mrg mpfr_clear (a);
179 1.1 mrg
180 1.1 mrg for (real_info = gfc_real_kinds; real_info->kind != 0; real_info++)
181 1.1 mrg {
182 1.1 mrg gfc_set_model_kind (real_info->kind);
183 1.1 mrg
184 1.1 mrg mpfr_init (a);
185 1.1 mrg mpfr_init (b);
186 1.1 mrg
187 1.1 mrg /* huge(x) = (1 - b**(-p)) * b**(emax-1) * b */
188 1.1 mrg /* 1 - b**(-p) */
189 1.1 mrg mpfr_init (real_info->huge);
190 1.1 mrg mpfr_set_ui (real_info->huge, 1, GFC_RND_MODE);
191 1.1 mrg mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
192 1.1 mrg mpfr_pow_si (a, a, -real_info->digits, GFC_RND_MODE);
193 1.1 mrg mpfr_sub (real_info->huge, real_info->huge, a, GFC_RND_MODE);
194 1.1 mrg
195 1.1 mrg /* b**(emax-1) */
196 1.1 mrg mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
197 1.1 mrg mpfr_pow_ui (a, a, real_info->max_exponent - 1, GFC_RND_MODE);
198 1.1 mrg
199 1.1 mrg /* (1 - b**(-p)) * b**(emax-1) */
200 1.1 mrg mpfr_mul (real_info->huge, real_info->huge, a, GFC_RND_MODE);
201 1.1 mrg
202 1.1 mrg /* (1 - b**(-p)) * b**(emax-1) * b */
203 1.1 mrg mpfr_mul_ui (real_info->huge, real_info->huge, real_info->radix,
204 1.1 mrg GFC_RND_MODE);
205 1.1 mrg
206 1.1 mrg /* tiny(x) = b**(emin-1) */
207 1.1 mrg mpfr_init (real_info->tiny);
208 1.1 mrg mpfr_set_ui (real_info->tiny, real_info->radix, GFC_RND_MODE);
209 1.1 mrg mpfr_pow_si (real_info->tiny, real_info->tiny,
210 1.1 mrg real_info->min_exponent - 1, GFC_RND_MODE);
211 1.1 mrg
212 1.1 mrg /* subnormal (x) = b**(emin - digit) */
213 1.1 mrg mpfr_init (real_info->subnormal);
214 1.1 mrg mpfr_set_ui (real_info->subnormal, real_info->radix, GFC_RND_MODE);
215 1.1 mrg mpfr_pow_si (real_info->subnormal, real_info->subnormal,
216 1.1 mrg real_info->min_exponent - real_info->digits, GFC_RND_MODE);
217 1.1 mrg
218 1.1 mrg /* epsilon(x) = b**(1-p) */
219 1.1 mrg mpfr_init (real_info->epsilon);
220 1.1 mrg mpfr_set_ui (real_info->epsilon, real_info->radix, GFC_RND_MODE);
221 1.1 mrg mpfr_pow_si (real_info->epsilon, real_info->epsilon,
222 1.1 mrg 1 - real_info->digits, GFC_RND_MODE);
223 1.1 mrg
224 1.1 mrg /* range(x) = int(min(log10(huge(x)), -log10(tiny)) */
225 1.1 mrg mpfr_log10 (a, real_info->huge, GFC_RND_MODE);
226 1.1 mrg mpfr_log10 (b, real_info->tiny, GFC_RND_MODE);
227 1.1 mrg mpfr_neg (b, b, GFC_RND_MODE);
228 1.1 mrg
229 1.1 mrg /* a = min(a, b) */
230 1.1 mrg mpfr_min (a, a, b, GFC_RND_MODE);
231 1.1 mrg mpfr_trunc (a, a);
232 1.1 mrg real_info->range = (int) mpfr_get_si (a, GFC_RND_MODE);
233 1.1 mrg
234 1.1 mrg /* precision(x) = int((p - 1) * log10(b)) + k */
235 1.1 mrg mpfr_set_ui (a, real_info->radix, GFC_RND_MODE);
236 1.1 mrg mpfr_log10 (a, a, GFC_RND_MODE);
237 1.1 mrg mpfr_mul_ui (a, a, real_info->digits - 1, GFC_RND_MODE);
238 1.1 mrg mpfr_trunc (a, a);
239 1.1 mrg real_info->precision = (int) mpfr_get_si (a, GFC_RND_MODE);
240 1.1 mrg
241 1.1 mrg /* If the radix is an integral power of 10, add one to the precision. */
242 1.1 mrg for (i = 10; i <= real_info->radix; i *= 10)
243 1.1 mrg if (i == real_info->radix)
244 1.1 mrg real_info->precision++;
245 1.1 mrg
246 1.1 mrg mpfr_clears (a, b, NULL);
247 1.1 mrg }
248 1.1 mrg }
249 1.1 mrg
250 1.1 mrg
251 1.1 mrg /* Clean up, get rid of numeric constants. */
252 1.1 mrg
253 1.1 mrg void
254 1.1 mrg gfc_arith_done_1 (void)
255 1.1 mrg {
256 1.1 mrg gfc_integer_info *ip;
257 1.1 mrg gfc_real_info *rp;
258 1.1 mrg
259 1.1 mrg for (ip = gfc_integer_kinds; ip->kind; ip++)
260 1.1 mrg {
261 1.1 mrg mpz_clear (ip->min_int);
262 1.1 mrg mpz_clear (ip->pedantic_min_int);
263 1.1 mrg mpz_clear (ip->huge);
264 1.1 mrg }
265 1.1 mrg
266 1.1 mrg for (rp = gfc_real_kinds; rp->kind; rp++)
267 1.1 mrg mpfr_clears (rp->epsilon, rp->huge, rp->tiny, rp->subnormal, NULL);
268 1.1 mrg
269 1.1 mrg mpfr_free_cache ();
270 1.1 mrg }
271 1.1 mrg
272 1.1 mrg
273 1.1 mrg /* Given a wide character value and a character kind, determine whether
274 1.1 mrg the character is representable for that kind. */
275 1.1 mrg bool
276 1.1 mrg gfc_check_character_range (gfc_char_t c, int kind)
277 1.1 mrg {
278 1.1 mrg /* As wide characters are stored as 32-bit values, they're all
279 1.1 mrg representable in UCS=4. */
280 1.1 mrg if (kind == 4)
281 1.1 mrg return true;
282 1.1 mrg
283 1.1 mrg if (kind == 1)
284 1.1 mrg return c <= 255 ? true : false;
285 1.1 mrg
286 1.1 mrg gcc_unreachable ();
287 1.1 mrg }
288 1.1 mrg
289 1.1 mrg
290 1.1 mrg /* Given an integer and a kind, make sure that the integer lies within
291 1.1 mrg the range of the kind. Returns ARITH_OK, ARITH_ASYMMETRIC or
292 1.1 mrg ARITH_OVERFLOW. */
293 1.1 mrg
294 1.1 mrg arith
295 1.1 mrg gfc_check_integer_range (mpz_t p, int kind)
296 1.1 mrg {
297 1.1 mrg arith result;
298 1.1 mrg int i;
299 1.1 mrg
300 1.1 mrg i = gfc_validate_kind (BT_INTEGER, kind, false);
301 1.1 mrg result = ARITH_OK;
302 1.1 mrg
303 1.1 mrg if (pedantic)
304 1.1 mrg {
305 1.1 mrg if (mpz_cmp (p, gfc_integer_kinds[i].pedantic_min_int) < 0)
306 1.1 mrg result = ARITH_ASYMMETRIC;
307 1.1 mrg }
308 1.1 mrg
309 1.1 mrg
310 1.1 mrg if (flag_range_check == 0)
311 1.1 mrg return result;
312 1.1 mrg
313 1.1 mrg if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
314 1.1 mrg || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
315 1.1 mrg result = ARITH_OVERFLOW;
316 1.1 mrg
317 1.1 mrg return result;
318 1.1 mrg }
319 1.1 mrg
320 1.1 mrg
321 1.1 mrg /* Given a real and a kind, make sure that the real lies within the
322 1.1 mrg range of the kind. Returns ARITH_OK, ARITH_OVERFLOW or
323 1.1 mrg ARITH_UNDERFLOW. */
324 1.1 mrg
325 1.1 mrg static arith
326 1.1 mrg gfc_check_real_range (mpfr_t p, int kind)
327 1.1 mrg {
328 1.1 mrg arith retval;
329 1.1 mrg mpfr_t q;
330 1.1 mrg int i;
331 1.1 mrg
332 1.1 mrg i = gfc_validate_kind (BT_REAL, kind, false);
333 1.1 mrg
334 1.1 mrg gfc_set_model (p);
335 1.1 mrg mpfr_init (q);
336 1.1 mrg mpfr_abs (q, p, GFC_RND_MODE);
337 1.1 mrg
338 1.1 mrg retval = ARITH_OK;
339 1.1 mrg
340 1.1 mrg if (mpfr_inf_p (p))
341 1.1 mrg {
342 1.1 mrg if (flag_range_check != 0)
343 1.1 mrg retval = ARITH_OVERFLOW;
344 1.1 mrg }
345 1.1 mrg else if (mpfr_nan_p (p))
346 1.1 mrg {
347 1.1 mrg if (flag_range_check != 0)
348 1.1 mrg retval = ARITH_NAN;
349 1.1 mrg }
350 1.1 mrg else if (mpfr_sgn (q) == 0)
351 1.1 mrg {
352 1.1 mrg mpfr_clear (q);
353 1.1 mrg return retval;
354 1.1 mrg }
355 1.1 mrg else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
356 1.1 mrg {
357 1.1 mrg if (flag_range_check == 0)
358 1.1 mrg mpfr_set_inf (p, mpfr_sgn (p));
359 1.1 mrg else
360 1.1 mrg retval = ARITH_OVERFLOW;
361 1.1 mrg }
362 1.1 mrg else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
363 1.1 mrg {
364 1.1 mrg if (flag_range_check == 0)
365 1.1 mrg {
366 1.1 mrg if (mpfr_sgn (p) < 0)
367 1.1 mrg {
368 1.1 mrg mpfr_set_ui (p, 0, GFC_RND_MODE);
369 1.1 mrg mpfr_set_si (q, -1, GFC_RND_MODE);
370 1.1 mrg mpfr_copysign (p, p, q, GFC_RND_MODE);
371 1.1 mrg }
372 1.1 mrg else
373 1.1 mrg mpfr_set_ui (p, 0, GFC_RND_MODE);
374 1.1 mrg }
375 1.1 mrg else
376 1.1 mrg retval = ARITH_UNDERFLOW;
377 1.1 mrg }
378 1.1 mrg else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
379 1.1 mrg {
380 1.1 mrg mpfr_exp_t emin, emax;
381 1.1 mrg int en;
382 1.1 mrg
383 1.1 mrg /* Save current values of emin and emax. */
384 1.1 mrg emin = mpfr_get_emin ();
385 1.1 mrg emax = mpfr_get_emax ();
386 1.1 mrg
387 1.1 mrg /* Set emin and emax for the current model number. */
388 1.1 mrg en = gfc_real_kinds[i].min_exponent - gfc_real_kinds[i].digits + 1;
389 1.1 mrg mpfr_set_emin ((mpfr_exp_t) en);
390 1.1 mrg mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[i].max_exponent);
391 1.1 mrg mpfr_check_range (q, 0, GFC_RND_MODE);
392 1.1 mrg mpfr_subnormalize (q, 0, GFC_RND_MODE);
393 1.1 mrg
394 1.1 mrg /* Reset emin and emax. */
395 1.1 mrg mpfr_set_emin (emin);
396 1.1 mrg mpfr_set_emax (emax);
397 1.1 mrg
398 1.1 mrg /* Copy sign if needed. */
399 1.1 mrg if (mpfr_sgn (p) < 0)
400 1.1 mrg mpfr_neg (p, q, MPFR_RNDN);
401 1.1 mrg else
402 1.1 mrg mpfr_set (p, q, MPFR_RNDN);
403 1.1 mrg }
404 1.1 mrg
405 1.1 mrg mpfr_clear (q);
406 1.1 mrg
407 1.1 mrg return retval;
408 1.1 mrg }
409 1.1 mrg
410 1.1 mrg
411 1.1 mrg /* Low-level arithmetic functions. All of these subroutines assume
412 1.1 mrg that all operands are of the same type and return an operand of the
413 1.1 mrg same type. The other thing about these subroutines is that they
414 1.1 mrg can fail in various ways -- overflow, underflow, division by zero,
415 1.1 mrg zero raised to the zero, etc. */
416 1.1 mrg
417 1.1 mrg static arith
418 1.1 mrg gfc_arith_not (gfc_expr *op1, gfc_expr **resultp)
419 1.1 mrg {
420 1.1 mrg gfc_expr *result;
421 1.1 mrg
422 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, op1->ts.kind, &op1->where);
423 1.1 mrg result->value.logical = !op1->value.logical;
424 1.1 mrg *resultp = result;
425 1.1 mrg
426 1.1 mrg return ARITH_OK;
427 1.1 mrg }
428 1.1 mrg
429 1.1 mrg
430 1.1 mrg static arith
431 1.1 mrg gfc_arith_and (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
432 1.1 mrg {
433 1.1 mrg gfc_expr *result;
434 1.1 mrg
435 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
436 1.1 mrg &op1->where);
437 1.1 mrg result->value.logical = op1->value.logical && op2->value.logical;
438 1.1 mrg *resultp = result;
439 1.1 mrg
440 1.1 mrg return ARITH_OK;
441 1.1 mrg }
442 1.1 mrg
443 1.1 mrg
444 1.1 mrg static arith
445 1.1 mrg gfc_arith_or (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
446 1.1 mrg {
447 1.1 mrg gfc_expr *result;
448 1.1 mrg
449 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
450 1.1 mrg &op1->where);
451 1.1 mrg result->value.logical = op1->value.logical || op2->value.logical;
452 1.1 mrg *resultp = result;
453 1.1 mrg
454 1.1 mrg return ARITH_OK;
455 1.1 mrg }
456 1.1 mrg
457 1.1 mrg
458 1.1 mrg static arith
459 1.1 mrg gfc_arith_eqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
460 1.1 mrg {
461 1.1 mrg gfc_expr *result;
462 1.1 mrg
463 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
464 1.1 mrg &op1->where);
465 1.1 mrg result->value.logical = op1->value.logical == op2->value.logical;
466 1.1 mrg *resultp = result;
467 1.1 mrg
468 1.1 mrg return ARITH_OK;
469 1.1 mrg }
470 1.1 mrg
471 1.1 mrg
472 1.1 mrg static arith
473 1.1 mrg gfc_arith_neqv (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
474 1.1 mrg {
475 1.1 mrg gfc_expr *result;
476 1.1 mrg
477 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_kind_max (op1, op2),
478 1.1 mrg &op1->where);
479 1.1 mrg result->value.logical = op1->value.logical != op2->value.logical;
480 1.1 mrg *resultp = result;
481 1.1 mrg
482 1.1 mrg return ARITH_OK;
483 1.1 mrg }
484 1.1 mrg
485 1.1 mrg
486 1.1 mrg /* Make sure a constant numeric expression is within the range for
487 1.1 mrg its type and kind. Note that there's also a gfc_check_range(),
488 1.1 mrg but that one deals with the intrinsic RANGE function. */
489 1.1 mrg
490 1.1 mrg arith
491 1.1 mrg gfc_range_check (gfc_expr *e)
492 1.1 mrg {
493 1.1 mrg arith rc;
494 1.1 mrg arith rc2;
495 1.1 mrg
496 1.1 mrg switch (e->ts.type)
497 1.1 mrg {
498 1.1 mrg case BT_INTEGER:
499 1.1 mrg rc = gfc_check_integer_range (e->value.integer, e->ts.kind);
500 1.1 mrg break;
501 1.1 mrg
502 1.1 mrg case BT_REAL:
503 1.1 mrg rc = gfc_check_real_range (e->value.real, e->ts.kind);
504 1.1 mrg if (rc == ARITH_UNDERFLOW)
505 1.1 mrg mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
506 1.1 mrg if (rc == ARITH_OVERFLOW)
507 1.1 mrg mpfr_set_inf (e->value.real, mpfr_sgn (e->value.real));
508 1.1 mrg if (rc == ARITH_NAN)
509 1.1 mrg mpfr_set_nan (e->value.real);
510 1.1 mrg break;
511 1.1 mrg
512 1.1 mrg case BT_COMPLEX:
513 1.1 mrg rc = gfc_check_real_range (mpc_realref (e->value.complex), e->ts.kind);
514 1.1 mrg if (rc == ARITH_UNDERFLOW)
515 1.1 mrg mpfr_set_ui (mpc_realref (e->value.complex), 0, GFC_RND_MODE);
516 1.1 mrg if (rc == ARITH_OVERFLOW)
517 1.1 mrg mpfr_set_inf (mpc_realref (e->value.complex),
518 1.1 mrg mpfr_sgn (mpc_realref (e->value.complex)));
519 1.1 mrg if (rc == ARITH_NAN)
520 1.1 mrg mpfr_set_nan (mpc_realref (e->value.complex));
521 1.1 mrg
522 1.1 mrg rc2 = gfc_check_real_range (mpc_imagref (e->value.complex), e->ts.kind);
523 1.1 mrg if (rc == ARITH_UNDERFLOW)
524 1.1 mrg mpfr_set_ui (mpc_imagref (e->value.complex), 0, GFC_RND_MODE);
525 1.1 mrg if (rc == ARITH_OVERFLOW)
526 1.1 mrg mpfr_set_inf (mpc_imagref (e->value.complex),
527 1.1 mrg mpfr_sgn (mpc_imagref (e->value.complex)));
528 1.1 mrg if (rc == ARITH_NAN)
529 1.1 mrg mpfr_set_nan (mpc_imagref (e->value.complex));
530 1.1 mrg
531 1.1 mrg if (rc == ARITH_OK)
532 1.1 mrg rc = rc2;
533 1.1 mrg break;
534 1.1 mrg
535 1.1 mrg default:
536 1.1 mrg gfc_internal_error ("gfc_range_check(): Bad type");
537 1.1 mrg }
538 1.1 mrg
539 1.1 mrg return rc;
540 1.1 mrg }
541 1.1 mrg
542 1.1 mrg
543 1.1 mrg /* Several of the following routines use the same set of statements to
544 1.1 mrg check the validity of the result. Encapsulate the checking here. */
545 1.1 mrg
546 1.1 mrg static arith
547 1.1 mrg check_result (arith rc, gfc_expr *x, gfc_expr *r, gfc_expr **rp)
548 1.1 mrg {
549 1.1 mrg arith val = rc;
550 1.1 mrg
551 1.1 mrg if (val == ARITH_UNDERFLOW)
552 1.1 mrg {
553 1.1 mrg if (warn_underflow)
554 1.1 mrg gfc_warning (OPT_Wunderflow, gfc_arith_error (val), &x->where);
555 1.1 mrg val = ARITH_OK;
556 1.1 mrg }
557 1.1 mrg
558 1.1 mrg if (val == ARITH_ASYMMETRIC)
559 1.1 mrg {
560 1.1 mrg gfc_warning (0, gfc_arith_error (val), &x->where);
561 1.1 mrg val = ARITH_OK;
562 1.1 mrg }
563 1.1 mrg
564 1.1 mrg if (val == ARITH_OK || val == ARITH_OVERFLOW)
565 1.1 mrg *rp = r;
566 1.1 mrg else
567 1.1 mrg gfc_free_expr (r);
568 1.1 mrg
569 1.1 mrg return val;
570 1.1 mrg }
571 1.1 mrg
572 1.1 mrg
573 1.1 mrg /* It may seem silly to have a subroutine that actually computes the
574 1.1 mrg unary plus of a constant, but it prevents us from making exceptions
575 1.1 mrg in the code elsewhere. Used for unary plus and parenthesized
576 1.1 mrg expressions. */
577 1.1 mrg
578 1.1 mrg static arith
579 1.1 mrg gfc_arith_identity (gfc_expr *op1, gfc_expr **resultp)
580 1.1 mrg {
581 1.1 mrg *resultp = gfc_copy_expr (op1);
582 1.1 mrg return ARITH_OK;
583 1.1 mrg }
584 1.1 mrg
585 1.1 mrg
586 1.1 mrg static arith
587 1.1 mrg gfc_arith_uminus (gfc_expr *op1, gfc_expr **resultp)
588 1.1 mrg {
589 1.1 mrg gfc_expr *result;
590 1.1 mrg arith rc;
591 1.1 mrg
592 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
593 1.1 mrg
594 1.1 mrg switch (op1->ts.type)
595 1.1 mrg {
596 1.1 mrg case BT_INTEGER:
597 1.1 mrg mpz_neg (result->value.integer, op1->value.integer);
598 1.1 mrg break;
599 1.1 mrg
600 1.1 mrg case BT_REAL:
601 1.1 mrg mpfr_neg (result->value.real, op1->value.real, GFC_RND_MODE);
602 1.1 mrg break;
603 1.1 mrg
604 1.1 mrg case BT_COMPLEX:
605 1.1 mrg mpc_neg (result->value.complex, op1->value.complex, GFC_MPC_RND_MODE);
606 1.1 mrg break;
607 1.1 mrg
608 1.1 mrg default:
609 1.1 mrg gfc_internal_error ("gfc_arith_uminus(): Bad basic type");
610 1.1 mrg }
611 1.1 mrg
612 1.1 mrg rc = gfc_range_check (result);
613 1.1 mrg
614 1.1 mrg return check_result (rc, op1, result, resultp);
615 1.1 mrg }
616 1.1 mrg
617 1.1 mrg
618 1.1 mrg static arith
619 1.1 mrg gfc_arith_plus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
620 1.1 mrg {
621 1.1 mrg gfc_expr *result;
622 1.1 mrg arith rc;
623 1.1 mrg
624 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
625 1.1 mrg
626 1.1 mrg switch (op1->ts.type)
627 1.1 mrg {
628 1.1 mrg case BT_INTEGER:
629 1.1 mrg mpz_add (result->value.integer, op1->value.integer, op2->value.integer);
630 1.1 mrg break;
631 1.1 mrg
632 1.1 mrg case BT_REAL:
633 1.1 mrg mpfr_add (result->value.real, op1->value.real, op2->value.real,
634 1.1 mrg GFC_RND_MODE);
635 1.1 mrg break;
636 1.1 mrg
637 1.1 mrg case BT_COMPLEX:
638 1.1 mrg mpc_add (result->value.complex, op1->value.complex, op2->value.complex,
639 1.1 mrg GFC_MPC_RND_MODE);
640 1.1 mrg break;
641 1.1 mrg
642 1.1 mrg default:
643 1.1 mrg gfc_internal_error ("gfc_arith_plus(): Bad basic type");
644 1.1 mrg }
645 1.1 mrg
646 1.1 mrg rc = gfc_range_check (result);
647 1.1 mrg
648 1.1 mrg return check_result (rc, op1, result, resultp);
649 1.1 mrg }
650 1.1 mrg
651 1.1 mrg
652 1.1 mrg static arith
653 1.1 mrg gfc_arith_minus (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
654 1.1 mrg {
655 1.1 mrg gfc_expr *result;
656 1.1 mrg arith rc;
657 1.1 mrg
658 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
659 1.1 mrg
660 1.1 mrg switch (op1->ts.type)
661 1.1 mrg {
662 1.1 mrg case BT_INTEGER:
663 1.1 mrg mpz_sub (result->value.integer, op1->value.integer, op2->value.integer);
664 1.1 mrg break;
665 1.1 mrg
666 1.1 mrg case BT_REAL:
667 1.1 mrg mpfr_sub (result->value.real, op1->value.real, op2->value.real,
668 1.1 mrg GFC_RND_MODE);
669 1.1 mrg break;
670 1.1 mrg
671 1.1 mrg case BT_COMPLEX:
672 1.1 mrg mpc_sub (result->value.complex, op1->value.complex,
673 1.1 mrg op2->value.complex, GFC_MPC_RND_MODE);
674 1.1 mrg break;
675 1.1 mrg
676 1.1 mrg default:
677 1.1 mrg gfc_internal_error ("gfc_arith_minus(): Bad basic type");
678 1.1 mrg }
679 1.1 mrg
680 1.1 mrg rc = gfc_range_check (result);
681 1.1 mrg
682 1.1 mrg return check_result (rc, op1, result, resultp);
683 1.1 mrg }
684 1.1 mrg
685 1.1 mrg
686 1.1 mrg static arith
687 1.1 mrg gfc_arith_times (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
688 1.1 mrg {
689 1.1 mrg gfc_expr *result;
690 1.1 mrg arith rc;
691 1.1 mrg
692 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
693 1.1 mrg
694 1.1 mrg switch (op1->ts.type)
695 1.1 mrg {
696 1.1 mrg case BT_INTEGER:
697 1.1 mrg mpz_mul (result->value.integer, op1->value.integer, op2->value.integer);
698 1.1 mrg break;
699 1.1 mrg
700 1.1 mrg case BT_REAL:
701 1.1 mrg mpfr_mul (result->value.real, op1->value.real, op2->value.real,
702 1.1 mrg GFC_RND_MODE);
703 1.1 mrg break;
704 1.1 mrg
705 1.1 mrg case BT_COMPLEX:
706 1.1 mrg gfc_set_model (mpc_realref (op1->value.complex));
707 1.1 mrg mpc_mul (result->value.complex, op1->value.complex, op2->value.complex,
708 1.1 mrg GFC_MPC_RND_MODE);
709 1.1 mrg break;
710 1.1 mrg
711 1.1 mrg default:
712 1.1 mrg gfc_internal_error ("gfc_arith_times(): Bad basic type");
713 1.1 mrg }
714 1.1 mrg
715 1.1 mrg rc = gfc_range_check (result);
716 1.1 mrg
717 1.1 mrg return check_result (rc, op1, result, resultp);
718 1.1 mrg }
719 1.1 mrg
720 1.1 mrg
721 1.1 mrg static arith
722 1.1 mrg gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
723 1.1 mrg {
724 1.1 mrg gfc_expr *result;
725 1.1 mrg arith rc;
726 1.1 mrg
727 1.1 mrg rc = ARITH_OK;
728 1.1 mrg
729 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
730 1.1 mrg
731 1.1 mrg switch (op1->ts.type)
732 1.1 mrg {
733 1.1 mrg case BT_INTEGER:
734 1.1 mrg if (mpz_sgn (op2->value.integer) == 0)
735 1.1 mrg {
736 1.1 mrg rc = ARITH_DIV0;
737 1.1 mrg break;
738 1.1 mrg }
739 1.1 mrg
740 1.1 mrg if (warn_integer_division)
741 1.1 mrg {
742 1.1 mrg mpz_t r;
743 1.1 mrg mpz_init (r);
744 1.1 mrg mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
745 1.1 mrg op2->value.integer);
746 1.1 mrg
747 1.1 mrg if (mpz_cmp_si (r, 0) != 0)
748 1.1 mrg {
749 1.1 mrg char *p;
750 1.1 mrg p = mpz_get_str (NULL, 10, result->value.integer);
751 1.1 mrg gfc_warning_now (OPT_Winteger_division, "Integer division "
752 1.1 mrg "truncated to constant %qs at %L", p,
753 1.1 mrg &op1->where);
754 1.1 mrg free (p);
755 1.1 mrg }
756 1.1 mrg mpz_clear (r);
757 1.1 mrg }
758 1.1 mrg else
759 1.1 mrg mpz_tdiv_q (result->value.integer, op1->value.integer,
760 1.1 mrg op2->value.integer);
761 1.1 mrg
762 1.1 mrg break;
763 1.1 mrg
764 1.1 mrg case BT_REAL:
765 1.1 mrg if (mpfr_sgn (op2->value.real) == 0 && flag_range_check == 1)
766 1.1 mrg {
767 1.1 mrg rc = ARITH_DIV0;
768 1.1 mrg break;
769 1.1 mrg }
770 1.1 mrg
771 1.1 mrg mpfr_div (result->value.real, op1->value.real, op2->value.real,
772 1.1 mrg GFC_RND_MODE);
773 1.1 mrg break;
774 1.1 mrg
775 1.1 mrg case BT_COMPLEX:
776 1.1 mrg if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
777 1.1 mrg && flag_range_check == 1)
778 1.1 mrg {
779 1.1 mrg rc = ARITH_DIV0;
780 1.1 mrg break;
781 1.1 mrg }
782 1.1 mrg
783 1.1 mrg gfc_set_model (mpc_realref (op1->value.complex));
784 1.1 mrg if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0)
785 1.1 mrg {
786 1.1 mrg /* In Fortran, return (NaN + NaN I) for any zero divisor. See
787 1.1 mrg PR 40318. */
788 1.1 mrg mpfr_set_nan (mpc_realref (result->value.complex));
789 1.1 mrg mpfr_set_nan (mpc_imagref (result->value.complex));
790 1.1 mrg }
791 1.1 mrg else
792 1.1 mrg mpc_div (result->value.complex, op1->value.complex, op2->value.complex,
793 1.1 mrg GFC_MPC_RND_MODE);
794 1.1 mrg break;
795 1.1 mrg
796 1.1 mrg default:
797 1.1 mrg gfc_internal_error ("gfc_arith_divide(): Bad basic type");
798 1.1 mrg }
799 1.1 mrg
800 1.1 mrg if (rc == ARITH_OK)
801 1.1 mrg rc = gfc_range_check (result);
802 1.1 mrg
803 1.1 mrg return check_result (rc, op1, result, resultp);
804 1.1 mrg }
805 1.1 mrg
806 1.1 mrg /* Raise a number to a power. */
807 1.1 mrg
808 1.1 mrg static arith
809 1.1 mrg arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
810 1.1 mrg {
811 1.1 mrg int power_sign;
812 1.1 mrg gfc_expr *result;
813 1.1 mrg arith rc;
814 1.1 mrg
815 1.1 mrg rc = ARITH_OK;
816 1.1 mrg result = gfc_get_constant_expr (op1->ts.type, op1->ts.kind, &op1->where);
817 1.1 mrg
818 1.1 mrg switch (op2->ts.type)
819 1.1 mrg {
820 1.1 mrg case BT_INTEGER:
821 1.1 mrg power_sign = mpz_sgn (op2->value.integer);
822 1.1 mrg
823 1.1 mrg if (power_sign == 0)
824 1.1 mrg {
825 1.1 mrg /* Handle something to the zeroth power. Since we're dealing
826 1.1 mrg with integral exponents, there is no ambiguity in the
827 1.1 mrg limiting procedure used to determine the value of 0**0. */
828 1.1 mrg switch (op1->ts.type)
829 1.1 mrg {
830 1.1 mrg case BT_INTEGER:
831 1.1 mrg mpz_set_ui (result->value.integer, 1);
832 1.1 mrg break;
833 1.1 mrg
834 1.1 mrg case BT_REAL:
835 1.1 mrg mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
836 1.1 mrg break;
837 1.1 mrg
838 1.1 mrg case BT_COMPLEX:
839 1.1 mrg mpc_set_ui (result->value.complex, 1, GFC_MPC_RND_MODE);
840 1.1 mrg break;
841 1.1 mrg
842 1.1 mrg default:
843 1.1 mrg gfc_internal_error ("arith_power(): Bad base");
844 1.1 mrg }
845 1.1 mrg }
846 1.1 mrg else
847 1.1 mrg {
848 1.1 mrg switch (op1->ts.type)
849 1.1 mrg {
850 1.1 mrg case BT_INTEGER:
851 1.1 mrg {
852 1.1 mrg /* First, we simplify the cases of op1 == 1, 0 or -1. */
853 1.1 mrg if (mpz_cmp_si (op1->value.integer, 1) == 0)
854 1.1 mrg {
855 1.1 mrg /* 1**op2 == 1 */
856 1.1 mrg mpz_set_si (result->value.integer, 1);
857 1.1 mrg }
858 1.1 mrg else if (mpz_cmp_si (op1->value.integer, 0) == 0)
859 1.1 mrg {
860 1.1 mrg /* 0**op2 == 0, if op2 > 0
861 1.1 mrg 0**op2 overflow, if op2 < 0 ; in that case, we
862 1.1 mrg set the result to 0 and return ARITH_DIV0. */
863 1.1 mrg mpz_set_si (result->value.integer, 0);
864 1.1 mrg if (mpz_cmp_si (op2->value.integer, 0) < 0)
865 1.1 mrg rc = ARITH_DIV0;
866 1.1 mrg }
867 1.1 mrg else if (mpz_cmp_si (op1->value.integer, -1) == 0)
868 1.1 mrg {
869 1.1 mrg /* (-1)**op2 == (-1)**(mod(op2,2)) */
870 1.1 mrg unsigned int odd = mpz_fdiv_ui (op2->value.integer, 2);
871 1.1 mrg if (odd)
872 1.1 mrg mpz_set_si (result->value.integer, -1);
873 1.1 mrg else
874 1.1 mrg mpz_set_si (result->value.integer, 1);
875 1.1 mrg }
876 1.1 mrg /* Then, we take care of op2 < 0. */
877 1.1 mrg else if (mpz_cmp_si (op2->value.integer, 0) < 0)
878 1.1 mrg {
879 1.1 mrg /* if op2 < 0, op1**op2 == 0 because abs(op1) > 1. */
880 1.1 mrg mpz_set_si (result->value.integer, 0);
881 1.1 mrg if (warn_integer_division)
882 1.1 mrg gfc_warning_now (OPT_Winteger_division, "Negative "
883 1.1 mrg "exponent of integer has zero "
884 1.1 mrg "result at %L", &result->where);
885 1.1 mrg }
886 1.1 mrg else
887 1.1 mrg {
888 1.1 mrg /* We have abs(op1) > 1 and op2 > 1.
889 1.1 mrg If op2 > bit_size(op1), we'll have an out-of-range
890 1.1 mrg result. */
891 1.1 mrg int k, power;
892 1.1 mrg
893 1.1 mrg k = gfc_validate_kind (BT_INTEGER, op1->ts.kind, false);
894 1.1 mrg power = gfc_integer_kinds[k].bit_size;
895 1.1 mrg if (mpz_cmp_si (op2->value.integer, power) < 0)
896 1.1 mrg {
897 1.1 mrg gfc_extract_int (op2, &power);
898 1.1 mrg mpz_pow_ui (result->value.integer, op1->value.integer,
899 1.1 mrg power);
900 1.1 mrg rc = gfc_range_check (result);
901 1.1 mrg if (rc == ARITH_OVERFLOW)
902 1.1 mrg gfc_error_now ("Result of exponentiation at %L "
903 1.1 mrg "exceeds the range of %s", &op1->where,
904 1.1 mrg gfc_typename (&(op1->ts)));
905 1.1 mrg }
906 1.1 mrg else
907 1.1 mrg {
908 1.1 mrg /* Provide a nonsense value to propagate up. */
909 1.1 mrg mpz_set (result->value.integer,
910 1.1 mrg gfc_integer_kinds[k].huge);
911 1.1 mrg mpz_add_ui (result->value.integer,
912 1.1 mrg result->value.integer, 1);
913 1.1 mrg rc = ARITH_OVERFLOW;
914 1.1 mrg }
915 1.1 mrg }
916 1.1 mrg }
917 1.1 mrg break;
918 1.1 mrg
919 1.1 mrg case BT_REAL:
920 1.1 mrg mpfr_pow_z (result->value.real, op1->value.real,
921 1.1 mrg op2->value.integer, GFC_RND_MODE);
922 1.1 mrg break;
923 1.1 mrg
924 1.1 mrg case BT_COMPLEX:
925 1.1 mrg mpc_pow_z (result->value.complex, op1->value.complex,
926 1.1 mrg op2->value.integer, GFC_MPC_RND_MODE);
927 1.1 mrg break;
928 1.1 mrg
929 1.1 mrg default:
930 1.1 mrg break;
931 1.1 mrg }
932 1.1 mrg }
933 1.1 mrg break;
934 1.1 mrg
935 1.1 mrg case BT_REAL:
936 1.1 mrg
937 1.1 mrg if (gfc_init_expr_flag)
938 1.1 mrg {
939 1.1 mrg if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
940 1.1 mrg "exponent in an initialization "
941 1.1 mrg "expression at %L", &op2->where))
942 1.1 mrg {
943 1.1 mrg gfc_free_expr (result);
944 1.1 mrg return ARITH_PROHIBIT;
945 1.1 mrg }
946 1.1 mrg }
947 1.1 mrg
948 1.1 mrg if (mpfr_cmp_si (op1->value.real, 0) < 0)
949 1.1 mrg {
950 1.1 mrg gfc_error ("Raising a negative REAL at %L to "
951 1.1 mrg "a REAL power is prohibited", &op1->where);
952 1.1 mrg gfc_free_expr (result);
953 1.1 mrg return ARITH_PROHIBIT;
954 1.1 mrg }
955 1.1 mrg
956 1.1 mrg mpfr_pow (result->value.real, op1->value.real, op2->value.real,
957 1.1 mrg GFC_RND_MODE);
958 1.1 mrg break;
959 1.1 mrg
960 1.1 mrg case BT_COMPLEX:
961 1.1 mrg {
962 1.1 mrg if (gfc_init_expr_flag)
963 1.1 mrg {
964 1.1 mrg if (!gfc_notify_std (GFC_STD_F2003, "Noninteger "
965 1.1 mrg "exponent in an initialization "
966 1.1 mrg "expression at %L", &op2->where))
967 1.1 mrg {
968 1.1 mrg gfc_free_expr (result);
969 1.1 mrg return ARITH_PROHIBIT;
970 1.1 mrg }
971 1.1 mrg }
972 1.1 mrg
973 1.1 mrg mpc_pow (result->value.complex, op1->value.complex,
974 1.1 mrg op2->value.complex, GFC_MPC_RND_MODE);
975 1.1 mrg }
976 1.1 mrg break;
977 1.1 mrg default:
978 1.1 mrg gfc_internal_error ("arith_power(): unknown type");
979 1.1 mrg }
980 1.1 mrg
981 1.1 mrg if (rc == ARITH_OK)
982 1.1 mrg rc = gfc_range_check (result);
983 1.1 mrg
984 1.1 mrg return check_result (rc, op1, result, resultp);
985 1.1 mrg }
986 1.1 mrg
987 1.1 mrg
988 1.1 mrg /* Concatenate two string constants. */
989 1.1 mrg
990 1.1 mrg static arith
991 1.1 mrg gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
992 1.1 mrg {
993 1.1 mrg gfc_expr *result;
994 1.1 mrg size_t len;
995 1.1 mrg
996 1.1 mrg /* By cleverly playing around with constructors, it is possible
997 1.1 mrg to get mismaching types here. */
998 1.1 mrg if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
999 1.1 mrg || op1->ts.kind != op2->ts.kind)
1000 1.1 mrg return ARITH_WRONGCONCAT;
1001 1.1 mrg
1002 1.1 mrg result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
1003 1.1 mrg &op1->where);
1004 1.1 mrg
1005 1.1 mrg len = op1->value.character.length + op2->value.character.length;
1006 1.1 mrg
1007 1.1 mrg result->value.character.string = gfc_get_wide_string (len + 1);
1008 1.1 mrg result->value.character.length = len;
1009 1.1 mrg
1010 1.1 mrg memcpy (result->value.character.string, op1->value.character.string,
1011 1.1 mrg op1->value.character.length * sizeof (gfc_char_t));
1012 1.1 mrg
1013 1.1 mrg memcpy (&result->value.character.string[op1->value.character.length],
1014 1.1 mrg op2->value.character.string,
1015 1.1 mrg op2->value.character.length * sizeof (gfc_char_t));
1016 1.1 mrg
1017 1.1 mrg result->value.character.string[len] = '\0';
1018 1.1 mrg
1019 1.1 mrg *resultp = result;
1020 1.1 mrg
1021 1.1 mrg return ARITH_OK;
1022 1.1 mrg }
1023 1.1 mrg
1024 1.1 mrg /* Comparison between real values; returns 0 if (op1 .op. op2) is true.
1025 1.1 mrg This function mimics mpfr_cmp but takes NaN into account. */
1026 1.1 mrg
1027 1.1 mrg static int
1028 1.1 mrg compare_real (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1029 1.1 mrg {
1030 1.1 mrg int rc;
1031 1.1 mrg switch (op)
1032 1.1 mrg {
1033 1.1 mrg case INTRINSIC_EQ:
1034 1.1 mrg rc = mpfr_equal_p (op1->value.real, op2->value.real) ? 0 : 1;
1035 1.1 mrg break;
1036 1.1 mrg case INTRINSIC_GT:
1037 1.1 mrg rc = mpfr_greater_p (op1->value.real, op2->value.real) ? 1 : -1;
1038 1.1 mrg break;
1039 1.1 mrg case INTRINSIC_GE:
1040 1.1 mrg rc = mpfr_greaterequal_p (op1->value.real, op2->value.real) ? 1 : -1;
1041 1.1 mrg break;
1042 1.1 mrg case INTRINSIC_LT:
1043 1.1 mrg rc = mpfr_less_p (op1->value.real, op2->value.real) ? -1 : 1;
1044 1.1 mrg break;
1045 1.1 mrg case INTRINSIC_LE:
1046 1.1 mrg rc = mpfr_lessequal_p (op1->value.real, op2->value.real) ? -1 : 1;
1047 1.1 mrg break;
1048 1.1 mrg default:
1049 1.1 mrg gfc_internal_error ("compare_real(): Bad operator");
1050 1.1 mrg }
1051 1.1 mrg
1052 1.1 mrg return rc;
1053 1.1 mrg }
1054 1.1 mrg
1055 1.1 mrg /* Comparison operators. Assumes that the two expression nodes
1056 1.1 mrg contain two constants of the same type. The op argument is
1057 1.1 mrg needed to handle NaN correctly. */
1058 1.1 mrg
1059 1.1 mrg int
1060 1.1 mrg gfc_compare_expr (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1061 1.1 mrg {
1062 1.1 mrg int rc;
1063 1.1 mrg
1064 1.1 mrg switch (op1->ts.type)
1065 1.1 mrg {
1066 1.1 mrg case BT_INTEGER:
1067 1.1 mrg rc = mpz_cmp (op1->value.integer, op2->value.integer);
1068 1.1 mrg break;
1069 1.1 mrg
1070 1.1 mrg case BT_REAL:
1071 1.1 mrg rc = compare_real (op1, op2, op);
1072 1.1 mrg break;
1073 1.1 mrg
1074 1.1 mrg case BT_CHARACTER:
1075 1.1 mrg rc = gfc_compare_string (op1, op2);
1076 1.1 mrg break;
1077 1.1 mrg
1078 1.1 mrg case BT_LOGICAL:
1079 1.1 mrg rc = ((!op1->value.logical && op2->value.logical)
1080 1.1 mrg || (op1->value.logical && !op2->value.logical));
1081 1.1 mrg break;
1082 1.1 mrg
1083 1.1 mrg case BT_COMPLEX:
1084 1.1 mrg gcc_assert (op == INTRINSIC_EQ);
1085 1.1 mrg rc = mpc_cmp (op1->value.complex, op2->value.complex);
1086 1.1 mrg break;
1087 1.1 mrg
1088 1.1 mrg default:
1089 1.1 mrg gfc_internal_error ("gfc_compare_expr(): Bad basic type");
1090 1.1 mrg }
1091 1.1 mrg
1092 1.1 mrg return rc;
1093 1.1 mrg }
1094 1.1 mrg
1095 1.1 mrg
1096 1.1 mrg /* Compare a pair of complex numbers. Naturally, this is only for
1097 1.1 mrg equality and inequality. */
1098 1.1 mrg
1099 1.1 mrg static int
1100 1.1 mrg compare_complex (gfc_expr *op1, gfc_expr *op2)
1101 1.1 mrg {
1102 1.1 mrg return mpc_cmp (op1->value.complex, op2->value.complex) == 0;
1103 1.1 mrg }
1104 1.1 mrg
1105 1.1 mrg
1106 1.1 mrg /* Given two constant strings and the inverse collating sequence, compare the
1107 1.1 mrg strings. We return -1 for a < b, 0 for a == b and 1 for a > b.
1108 1.1 mrg We use the processor's default collating sequence. */
1109 1.1 mrg
1110 1.1 mrg int
1111 1.1 mrg gfc_compare_string (gfc_expr *a, gfc_expr *b)
1112 1.1 mrg {
1113 1.1 mrg size_t len, alen, blen, i;
1114 1.1 mrg gfc_char_t ac, bc;
1115 1.1 mrg
1116 1.1 mrg alen = a->value.character.length;
1117 1.1 mrg blen = b->value.character.length;
1118 1.1 mrg
1119 1.1 mrg len = MAX(alen, blen);
1120 1.1 mrg
1121 1.1 mrg for (i = 0; i < len; i++)
1122 1.1 mrg {
1123 1.1 mrg ac = ((i < alen) ? a->value.character.string[i] : ' ');
1124 1.1 mrg bc = ((i < blen) ? b->value.character.string[i] : ' ');
1125 1.1 mrg
1126 1.1 mrg if (ac < bc)
1127 1.1 mrg return -1;
1128 1.1 mrg if (ac > bc)
1129 1.1 mrg return 1;
1130 1.1 mrg }
1131 1.1 mrg
1132 1.1 mrg /* Strings are equal */
1133 1.1 mrg return 0;
1134 1.1 mrg }
1135 1.1 mrg
1136 1.1 mrg
1137 1.1 mrg int
1138 1.1 mrg gfc_compare_with_Cstring (gfc_expr *a, const char *b, bool case_sensitive)
1139 1.1 mrg {
1140 1.1 mrg size_t len, alen, blen, i;
1141 1.1 mrg gfc_char_t ac, bc;
1142 1.1 mrg
1143 1.1 mrg alen = a->value.character.length;
1144 1.1 mrg blen = strlen (b);
1145 1.1 mrg
1146 1.1 mrg len = MAX(alen, blen);
1147 1.1 mrg
1148 1.1 mrg for (i = 0; i < len; i++)
1149 1.1 mrg {
1150 1.1 mrg ac = ((i < alen) ? a->value.character.string[i] : ' ');
1151 1.1 mrg bc = ((i < blen) ? b[i] : ' ');
1152 1.1 mrg
1153 1.1 mrg if (!case_sensitive)
1154 1.1 mrg {
1155 1.1 mrg ac = TOLOWER (ac);
1156 1.1 mrg bc = TOLOWER (bc);
1157 1.1 mrg }
1158 1.1 mrg
1159 1.1 mrg if (ac < bc)
1160 1.1 mrg return -1;
1161 1.1 mrg if (ac > bc)
1162 1.1 mrg return 1;
1163 1.1 mrg }
1164 1.1 mrg
1165 1.1 mrg /* Strings are equal */
1166 1.1 mrg return 0;
1167 1.1 mrg }
1168 1.1 mrg
1169 1.1 mrg
1170 1.1 mrg /* Specific comparison subroutines. */
1171 1.1 mrg
1172 1.1 mrg static arith
1173 1.1 mrg gfc_arith_eq (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1174 1.1 mrg {
1175 1.1 mrg gfc_expr *result;
1176 1.1 mrg
1177 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1178 1.1 mrg &op1->where);
1179 1.1 mrg result->value.logical = (op1->ts.type == BT_COMPLEX)
1180 1.1 mrg ? compare_complex (op1, op2)
1181 1.1 mrg : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) == 0);
1182 1.1 mrg
1183 1.1 mrg *resultp = result;
1184 1.1 mrg return ARITH_OK;
1185 1.1 mrg }
1186 1.1 mrg
1187 1.1 mrg
1188 1.1 mrg static arith
1189 1.1 mrg gfc_arith_ne (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1190 1.1 mrg {
1191 1.1 mrg gfc_expr *result;
1192 1.1 mrg
1193 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1194 1.1 mrg &op1->where);
1195 1.1 mrg result->value.logical = (op1->ts.type == BT_COMPLEX)
1196 1.1 mrg ? !compare_complex (op1, op2)
1197 1.1 mrg : (gfc_compare_expr (op1, op2, INTRINSIC_EQ) != 0);
1198 1.1 mrg
1199 1.1 mrg *resultp = result;
1200 1.1 mrg return ARITH_OK;
1201 1.1 mrg }
1202 1.1 mrg
1203 1.1 mrg
1204 1.1 mrg static arith
1205 1.1 mrg gfc_arith_gt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1206 1.1 mrg {
1207 1.1 mrg gfc_expr *result;
1208 1.1 mrg
1209 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1210 1.1 mrg &op1->where);
1211 1.1 mrg result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GT) > 0);
1212 1.1 mrg *resultp = result;
1213 1.1 mrg
1214 1.1 mrg return ARITH_OK;
1215 1.1 mrg }
1216 1.1 mrg
1217 1.1 mrg
1218 1.1 mrg static arith
1219 1.1 mrg gfc_arith_ge (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1220 1.1 mrg {
1221 1.1 mrg gfc_expr *result;
1222 1.1 mrg
1223 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1224 1.1 mrg &op1->where);
1225 1.1 mrg result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_GE) >= 0);
1226 1.1 mrg *resultp = result;
1227 1.1 mrg
1228 1.1 mrg return ARITH_OK;
1229 1.1 mrg }
1230 1.1 mrg
1231 1.1 mrg
1232 1.1 mrg static arith
1233 1.1 mrg gfc_arith_lt (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1234 1.1 mrg {
1235 1.1 mrg gfc_expr *result;
1236 1.1 mrg
1237 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1238 1.1 mrg &op1->where);
1239 1.1 mrg result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LT) < 0);
1240 1.1 mrg *resultp = result;
1241 1.1 mrg
1242 1.1 mrg return ARITH_OK;
1243 1.1 mrg }
1244 1.1 mrg
1245 1.1 mrg
1246 1.1 mrg static arith
1247 1.1 mrg gfc_arith_le (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
1248 1.1 mrg {
1249 1.1 mrg gfc_expr *result;
1250 1.1 mrg
1251 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, gfc_default_logical_kind,
1252 1.1 mrg &op1->where);
1253 1.1 mrg result->value.logical = (gfc_compare_expr (op1, op2, INTRINSIC_LE) <= 0);
1254 1.1 mrg *resultp = result;
1255 1.1 mrg
1256 1.1 mrg return ARITH_OK;
1257 1.1 mrg }
1258 1.1 mrg
1259 1.1 mrg
1260 1.1 mrg static arith
1261 1.1 mrg reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
1262 1.1 mrg gfc_expr **result)
1263 1.1 mrg {
1264 1.1 mrg gfc_constructor_base head;
1265 1.1 mrg gfc_constructor *c;
1266 1.1 mrg gfc_expr *r;
1267 1.1 mrg arith rc;
1268 1.1 mrg
1269 1.1 mrg if (op->expr_type == EXPR_CONSTANT)
1270 1.1 mrg return eval (op, result);
1271 1.1 mrg
1272 1.1 mrg rc = ARITH_OK;
1273 1.1 mrg head = gfc_constructor_copy (op->value.constructor);
1274 1.1 mrg for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1275 1.1 mrg {
1276 1.1 mrg rc = reduce_unary (eval, c->expr, &r);
1277 1.1 mrg
1278 1.1 mrg if (rc != ARITH_OK)
1279 1.1 mrg break;
1280 1.1 mrg
1281 1.1 mrg gfc_replace_expr (c->expr, r);
1282 1.1 mrg }
1283 1.1 mrg
1284 1.1 mrg if (rc != ARITH_OK)
1285 1.1 mrg gfc_constructor_free (head);
1286 1.1 mrg else
1287 1.1 mrg {
1288 1.1 mrg gfc_constructor *c = gfc_constructor_first (head);
1289 1.1 mrg if (c == NULL)
1290 1.1 mrg {
1291 1.1 mrg /* Handle zero-sized arrays. */
1292 1.1 mrg r = gfc_get_array_expr (op->ts.type, op->ts.kind, &op->where);
1293 1.1 mrg }
1294 1.1 mrg else
1295 1.1 mrg {
1296 1.1 mrg r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1297 1.1 mrg &op->where);
1298 1.1 mrg }
1299 1.1 mrg r->shape = gfc_copy_shape (op->shape, op->rank);
1300 1.1 mrg r->rank = op->rank;
1301 1.1 mrg r->value.constructor = head;
1302 1.1 mrg *result = r;
1303 1.1 mrg }
1304 1.1 mrg
1305 1.1 mrg return rc;
1306 1.1 mrg }
1307 1.1 mrg
1308 1.1 mrg
1309 1.1 mrg static arith
1310 1.1 mrg reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1311 1.1 mrg gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1312 1.1 mrg {
1313 1.1 mrg gfc_constructor_base head;
1314 1.1 mrg gfc_constructor *c;
1315 1.1 mrg gfc_expr *r;
1316 1.1 mrg arith rc = ARITH_OK;
1317 1.1 mrg
1318 1.1 mrg head = gfc_constructor_copy (op1->value.constructor);
1319 1.1 mrg for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1320 1.1 mrg {
1321 1.1 mrg gfc_simplify_expr (c->expr, 0);
1322 1.1 mrg
1323 1.1 mrg if (c->expr->expr_type == EXPR_CONSTANT)
1324 1.1 mrg rc = eval (c->expr, op2, &r);
1325 1.1 mrg else
1326 1.1 mrg rc = reduce_binary_ac (eval, c->expr, op2, &r);
1327 1.1 mrg
1328 1.1 mrg if (rc != ARITH_OK)
1329 1.1 mrg break;
1330 1.1 mrg
1331 1.1 mrg gfc_replace_expr (c->expr, r);
1332 1.1 mrg }
1333 1.1 mrg
1334 1.1 mrg if (rc != ARITH_OK)
1335 1.1 mrg gfc_constructor_free (head);
1336 1.1 mrg else
1337 1.1 mrg {
1338 1.1 mrg gfc_constructor *c = gfc_constructor_first (head);
1339 1.1 mrg if (c)
1340 1.1 mrg {
1341 1.1 mrg r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1342 1.1 mrg &op1->where);
1343 1.1 mrg r->shape = gfc_copy_shape (op1->shape, op1->rank);
1344 1.1 mrg }
1345 1.1 mrg else
1346 1.1 mrg {
1347 1.1 mrg gcc_assert (op1->ts.type != BT_UNKNOWN);
1348 1.1 mrg r = gfc_get_array_expr (op1->ts.type, op1->ts.kind,
1349 1.1 mrg &op1->where);
1350 1.1 mrg r->shape = gfc_get_shape (op1->rank);
1351 1.1 mrg }
1352 1.1 mrg r->rank = op1->rank;
1353 1.1 mrg r->value.constructor = head;
1354 1.1 mrg *result = r;
1355 1.1 mrg }
1356 1.1 mrg
1357 1.1 mrg return rc;
1358 1.1 mrg }
1359 1.1 mrg
1360 1.1 mrg
1361 1.1 mrg static arith
1362 1.1 mrg reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1363 1.1 mrg gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1364 1.1 mrg {
1365 1.1 mrg gfc_constructor_base head;
1366 1.1 mrg gfc_constructor *c;
1367 1.1 mrg gfc_expr *r;
1368 1.1 mrg arith rc = ARITH_OK;
1369 1.1 mrg
1370 1.1 mrg head = gfc_constructor_copy (op2->value.constructor);
1371 1.1 mrg for (c = gfc_constructor_first (head); c; c = gfc_constructor_next (c))
1372 1.1 mrg {
1373 1.1 mrg gfc_simplify_expr (c->expr, 0);
1374 1.1 mrg
1375 1.1 mrg if (c->expr->expr_type == EXPR_CONSTANT)
1376 1.1 mrg rc = eval (op1, c->expr, &r);
1377 1.1 mrg else
1378 1.1 mrg rc = reduce_binary_ca (eval, op1, c->expr, &r);
1379 1.1 mrg
1380 1.1 mrg if (rc != ARITH_OK)
1381 1.1 mrg break;
1382 1.1 mrg
1383 1.1 mrg gfc_replace_expr (c->expr, r);
1384 1.1 mrg }
1385 1.1 mrg
1386 1.1 mrg if (rc != ARITH_OK)
1387 1.1 mrg gfc_constructor_free (head);
1388 1.1 mrg else
1389 1.1 mrg {
1390 1.1 mrg gfc_constructor *c = gfc_constructor_first (head);
1391 1.1 mrg if (c)
1392 1.1 mrg {
1393 1.1 mrg r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1394 1.1 mrg &op2->where);
1395 1.1 mrg r->shape = gfc_copy_shape (op2->shape, op2->rank);
1396 1.1 mrg }
1397 1.1 mrg else
1398 1.1 mrg {
1399 1.1 mrg gcc_assert (op2->ts.type != BT_UNKNOWN);
1400 1.1 mrg r = gfc_get_array_expr (op2->ts.type, op2->ts.kind,
1401 1.1 mrg &op2->where);
1402 1.1 mrg r->shape = gfc_get_shape (op2->rank);
1403 1.1 mrg }
1404 1.1 mrg r->rank = op2->rank;
1405 1.1 mrg r->value.constructor = head;
1406 1.1 mrg *result = r;
1407 1.1 mrg }
1408 1.1 mrg
1409 1.1 mrg return rc;
1410 1.1 mrg }
1411 1.1 mrg
1412 1.1 mrg
1413 1.1 mrg /* We need a forward declaration of reduce_binary. */
1414 1.1 mrg static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1415 1.1 mrg gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
1416 1.1 mrg
1417 1.1 mrg
1418 1.1 mrg static arith
1419 1.1 mrg reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1420 1.1 mrg gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1421 1.1 mrg {
1422 1.1 mrg gfc_constructor_base head;
1423 1.1 mrg gfc_constructor *c, *d;
1424 1.1 mrg gfc_expr *r;
1425 1.1 mrg arith rc = ARITH_OK;
1426 1.1 mrg
1427 1.1 mrg if (!gfc_check_conformance (op1, op2, _("elemental binary operation")))
1428 1.1 mrg return ARITH_INCOMMENSURATE;
1429 1.1 mrg
1430 1.1 mrg head = gfc_constructor_copy (op1->value.constructor);
1431 1.1 mrg for (c = gfc_constructor_first (head),
1432 1.1 mrg d = gfc_constructor_first (op2->value.constructor);
1433 1.1 mrg c && d;
1434 1.1 mrg c = gfc_constructor_next (c), d = gfc_constructor_next (d))
1435 1.1 mrg {
1436 1.1 mrg rc = reduce_binary (eval, c->expr, d->expr, &r);
1437 1.1 mrg if (rc != ARITH_OK)
1438 1.1 mrg break;
1439 1.1 mrg
1440 1.1 mrg gfc_replace_expr (c->expr, r);
1441 1.1 mrg }
1442 1.1 mrg
1443 1.1 mrg if (c || d)
1444 1.1 mrg rc = ARITH_INCOMMENSURATE;
1445 1.1 mrg
1446 1.1 mrg if (rc != ARITH_OK)
1447 1.1 mrg gfc_constructor_free (head);
1448 1.1 mrg else
1449 1.1 mrg {
1450 1.1 mrg gfc_constructor *c = gfc_constructor_first (head);
1451 1.1 mrg if (c == NULL)
1452 1.1 mrg {
1453 1.1 mrg /* Handle zero-sized arrays. */
1454 1.1 mrg r = gfc_get_array_expr (op1->ts.type, op1->ts.kind, &op1->where);
1455 1.1 mrg }
1456 1.1 mrg else
1457 1.1 mrg {
1458 1.1 mrg r = gfc_get_array_expr (c->expr->ts.type, c->expr->ts.kind,
1459 1.1 mrg &op1->where);
1460 1.1 mrg }
1461 1.1 mrg r->shape = gfc_copy_shape (op1->shape, op1->rank);
1462 1.1 mrg r->rank = op1->rank;
1463 1.1 mrg r->value.constructor = head;
1464 1.1 mrg *result = r;
1465 1.1 mrg }
1466 1.1 mrg
1467 1.1 mrg return rc;
1468 1.1 mrg }
1469 1.1 mrg
1470 1.1 mrg
1471 1.1 mrg static arith
1472 1.1 mrg reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1473 1.1 mrg gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
1474 1.1 mrg {
1475 1.1 mrg if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT)
1476 1.1 mrg return eval (op1, op2, result);
1477 1.1 mrg
1478 1.1 mrg if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_ARRAY)
1479 1.1 mrg return reduce_binary_ca (eval, op1, op2, result);
1480 1.1 mrg
1481 1.1 mrg if (op1->expr_type == EXPR_ARRAY && op2->expr_type == EXPR_CONSTANT)
1482 1.1 mrg return reduce_binary_ac (eval, op1, op2, result);
1483 1.1 mrg
1484 1.1 mrg return reduce_binary_aa (eval, op1, op2, result);
1485 1.1 mrg }
1486 1.1 mrg
1487 1.1 mrg
1488 1.1 mrg typedef union
1489 1.1 mrg {
1490 1.1 mrg arith (*f2)(gfc_expr *, gfc_expr **);
1491 1.1 mrg arith (*f3)(gfc_expr *, gfc_expr *, gfc_expr **);
1492 1.1 mrg }
1493 1.1 mrg eval_f;
1494 1.1 mrg
1495 1.1 mrg /* High level arithmetic subroutines. These subroutines go into
1496 1.1 mrg eval_intrinsic(), which can do one of several things to its
1497 1.1 mrg operands. If the operands are incompatible with the intrinsic
1498 1.1 mrg operation, we return a node pointing to the operands and hope that
1499 1.1 mrg an operator interface is found during resolution.
1500 1.1 mrg
1501 1.1 mrg If the operands are compatible and are constants, then we try doing
1502 1.1 mrg the arithmetic. We also handle the cases where either or both
1503 1.1 mrg operands are array constructors. */
1504 1.1 mrg
1505 1.1 mrg static gfc_expr *
1506 1.1 mrg eval_intrinsic (gfc_intrinsic_op op,
1507 1.1 mrg eval_f eval, gfc_expr *op1, gfc_expr *op2)
1508 1.1 mrg {
1509 1.1 mrg gfc_expr temp, *result;
1510 1.1 mrg int unary;
1511 1.1 mrg arith rc;
1512 1.1 mrg
1513 1.1 mrg if (!op1)
1514 1.1 mrg return NULL;
1515 1.1 mrg
1516 1.1 mrg gfc_clear_ts (&temp.ts);
1517 1.1 mrg
1518 1.1 mrg switch (op)
1519 1.1 mrg {
1520 1.1 mrg /* Logical unary */
1521 1.1 mrg case INTRINSIC_NOT:
1522 1.1 mrg if (op1->ts.type != BT_LOGICAL)
1523 1.1 mrg goto runtime;
1524 1.1 mrg
1525 1.1 mrg temp.ts.type = BT_LOGICAL;
1526 1.1 mrg temp.ts.kind = gfc_default_logical_kind;
1527 1.1 mrg unary = 1;
1528 1.1 mrg break;
1529 1.1 mrg
1530 1.1 mrg /* Logical binary operators */
1531 1.1 mrg case INTRINSIC_OR:
1532 1.1 mrg case INTRINSIC_AND:
1533 1.1 mrg case INTRINSIC_NEQV:
1534 1.1 mrg case INTRINSIC_EQV:
1535 1.1 mrg if (op1->ts.type != BT_LOGICAL || op2->ts.type != BT_LOGICAL)
1536 1.1 mrg goto runtime;
1537 1.1 mrg
1538 1.1 mrg temp.ts.type = BT_LOGICAL;
1539 1.1 mrg temp.ts.kind = gfc_default_logical_kind;
1540 1.1 mrg unary = 0;
1541 1.1 mrg break;
1542 1.1 mrg
1543 1.1 mrg /* Numeric unary */
1544 1.1 mrg case INTRINSIC_UPLUS:
1545 1.1 mrg case INTRINSIC_UMINUS:
1546 1.1 mrg if (!gfc_numeric_ts (&op1->ts))
1547 1.1 mrg goto runtime;
1548 1.1 mrg
1549 1.1 mrg temp.ts = op1->ts;
1550 1.1 mrg unary = 1;
1551 1.1 mrg break;
1552 1.1 mrg
1553 1.1 mrg case INTRINSIC_PARENTHESES:
1554 1.1 mrg temp.ts = op1->ts;
1555 1.1 mrg unary = 1;
1556 1.1 mrg break;
1557 1.1 mrg
1558 1.1 mrg /* Additional restrictions for ordering relations. */
1559 1.1 mrg case INTRINSIC_GE:
1560 1.1 mrg case INTRINSIC_GE_OS:
1561 1.1 mrg case INTRINSIC_LT:
1562 1.1 mrg case INTRINSIC_LT_OS:
1563 1.1 mrg case INTRINSIC_LE:
1564 1.1 mrg case INTRINSIC_LE_OS:
1565 1.1 mrg case INTRINSIC_GT:
1566 1.1 mrg case INTRINSIC_GT_OS:
1567 1.1 mrg if (op1->ts.type == BT_COMPLEX || op2->ts.type == BT_COMPLEX)
1568 1.1 mrg {
1569 1.1 mrg temp.ts.type = BT_LOGICAL;
1570 1.1 mrg temp.ts.kind = gfc_default_logical_kind;
1571 1.1 mrg goto runtime;
1572 1.1 mrg }
1573 1.1 mrg
1574 1.1 mrg /* Fall through */
1575 1.1 mrg case INTRINSIC_EQ:
1576 1.1 mrg case INTRINSIC_EQ_OS:
1577 1.1 mrg case INTRINSIC_NE:
1578 1.1 mrg case INTRINSIC_NE_OS:
1579 1.1 mrg if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER)
1580 1.1 mrg {
1581 1.1 mrg unary = 0;
1582 1.1 mrg temp.ts.type = BT_LOGICAL;
1583 1.1 mrg temp.ts.kind = gfc_default_logical_kind;
1584 1.1 mrg
1585 1.1 mrg /* If kind mismatch, exit and we'll error out later. */
1586 1.1 mrg if (op1->ts.kind != op2->ts.kind)
1587 1.1 mrg goto runtime;
1588 1.1 mrg
1589 1.1 mrg break;
1590 1.1 mrg }
1591 1.1 mrg
1592 1.1 mrg gcc_fallthrough ();
1593 1.1 mrg /* Numeric binary */
1594 1.1 mrg case INTRINSIC_PLUS:
1595 1.1 mrg case INTRINSIC_MINUS:
1596 1.1 mrg case INTRINSIC_TIMES:
1597 1.1 mrg case INTRINSIC_DIVIDE:
1598 1.1 mrg case INTRINSIC_POWER:
1599 1.1 mrg if (!gfc_numeric_ts (&op1->ts) || !gfc_numeric_ts (&op2->ts))
1600 1.1 mrg goto runtime;
1601 1.1 mrg
1602 1.1 mrg /* Insert any necessary type conversions to make the operands
1603 1.1 mrg compatible. */
1604 1.1 mrg
1605 1.1 mrg temp.expr_type = EXPR_OP;
1606 1.1 mrg gfc_clear_ts (&temp.ts);
1607 1.1 mrg temp.value.op.op = op;
1608 1.1 mrg
1609 1.1 mrg temp.value.op.op1 = op1;
1610 1.1 mrg temp.value.op.op2 = op2;
1611 1.1 mrg
1612 1.1 mrg gfc_type_convert_binary (&temp, warn_conversion || warn_conversion_extra);
1613 1.1 mrg
1614 1.1 mrg if (op == INTRINSIC_EQ || op == INTRINSIC_NE
1615 1.1 mrg || op == INTRINSIC_GE || op == INTRINSIC_GT
1616 1.1 mrg || op == INTRINSIC_LE || op == INTRINSIC_LT
1617 1.1 mrg || op == INTRINSIC_EQ_OS || op == INTRINSIC_NE_OS
1618 1.1 mrg || op == INTRINSIC_GE_OS || op == INTRINSIC_GT_OS
1619 1.1 mrg || op == INTRINSIC_LE_OS || op == INTRINSIC_LT_OS)
1620 1.1 mrg {
1621 1.1 mrg temp.ts.type = BT_LOGICAL;
1622 1.1 mrg temp.ts.kind = gfc_default_logical_kind;
1623 1.1 mrg }
1624 1.1 mrg
1625 1.1 mrg unary = 0;
1626 1.1 mrg break;
1627 1.1 mrg
1628 1.1 mrg /* Character binary */
1629 1.1 mrg case INTRINSIC_CONCAT:
1630 1.1 mrg if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
1631 1.1 mrg || op1->ts.kind != op2->ts.kind)
1632 1.1 mrg goto runtime;
1633 1.1 mrg
1634 1.1 mrg temp.ts.type = BT_CHARACTER;
1635 1.1 mrg temp.ts.kind = op1->ts.kind;
1636 1.1 mrg unary = 0;
1637 1.1 mrg break;
1638 1.1 mrg
1639 1.1 mrg case INTRINSIC_USER:
1640 1.1 mrg goto runtime;
1641 1.1 mrg
1642 1.1 mrg default:
1643 1.1 mrg gfc_internal_error ("eval_intrinsic(): Bad operator");
1644 1.1 mrg }
1645 1.1 mrg
1646 1.1 mrg if (op1->expr_type != EXPR_CONSTANT
1647 1.1 mrg && (op1->expr_type != EXPR_ARRAY
1648 1.1 mrg || !gfc_is_constant_expr (op1) || !gfc_expanded_ac (op1)))
1649 1.1 mrg goto runtime;
1650 1.1 mrg
1651 1.1 mrg if (op2 != NULL
1652 1.1 mrg && op2->expr_type != EXPR_CONSTANT
1653 1.1 mrg && (op2->expr_type != EXPR_ARRAY
1654 1.1 mrg || !gfc_is_constant_expr (op2) || !gfc_expanded_ac (op2)))
1655 1.1 mrg goto runtime;
1656 1.1 mrg
1657 1.1 mrg if (unary)
1658 1.1 mrg rc = reduce_unary (eval.f2, op1, &result);
1659 1.1 mrg else
1660 1.1 mrg rc = reduce_binary (eval.f3, op1, op2, &result);
1661 1.1 mrg
1662 1.1 mrg
1663 1.1 mrg /* Something went wrong. */
1664 1.1 mrg if (op == INTRINSIC_POWER && rc == ARITH_PROHIBIT)
1665 1.1 mrg return NULL;
1666 1.1 mrg
1667 1.1 mrg if (rc != ARITH_OK)
1668 1.1 mrg {
1669 1.1 mrg gfc_error (gfc_arith_error (rc), &op1->where);
1670 1.1 mrg if (rc == ARITH_OVERFLOW)
1671 1.1 mrg goto done;
1672 1.1 mrg
1673 1.1 mrg if (rc == ARITH_DIV0 && op2->ts.type == BT_INTEGER)
1674 1.1 mrg gfc_seen_div0 = true;
1675 1.1 mrg
1676 1.1 mrg return NULL;
1677 1.1 mrg }
1678 1.1 mrg
1679 1.1 mrg done:
1680 1.1 mrg
1681 1.1 mrg gfc_free_expr (op1);
1682 1.1 mrg gfc_free_expr (op2);
1683 1.1 mrg return result;
1684 1.1 mrg
1685 1.1 mrg runtime:
1686 1.1 mrg /* Create a run-time expression. */
1687 1.1 mrg result = gfc_get_operator_expr (&op1->where, op, op1, op2);
1688 1.1 mrg result->ts = temp.ts;
1689 1.1 mrg
1690 1.1 mrg return result;
1691 1.1 mrg }
1692 1.1 mrg
1693 1.1 mrg
1694 1.1 mrg /* Modify type of expression for zero size array. */
1695 1.1 mrg
1696 1.1 mrg static gfc_expr *
1697 1.1 mrg eval_type_intrinsic0 (gfc_intrinsic_op iop, gfc_expr *op)
1698 1.1 mrg {
1699 1.1 mrg if (op == NULL)
1700 1.1 mrg gfc_internal_error ("eval_type_intrinsic0(): op NULL");
1701 1.1 mrg
1702 1.1 mrg switch (iop)
1703 1.1 mrg {
1704 1.1 mrg case INTRINSIC_GE:
1705 1.1 mrg case INTRINSIC_GE_OS:
1706 1.1 mrg case INTRINSIC_LT:
1707 1.1 mrg case INTRINSIC_LT_OS:
1708 1.1 mrg case INTRINSIC_LE:
1709 1.1 mrg case INTRINSIC_LE_OS:
1710 1.1 mrg case INTRINSIC_GT:
1711 1.1 mrg case INTRINSIC_GT_OS:
1712 1.1 mrg case INTRINSIC_EQ:
1713 1.1 mrg case INTRINSIC_EQ_OS:
1714 1.1 mrg case INTRINSIC_NE:
1715 1.1 mrg case INTRINSIC_NE_OS:
1716 1.1 mrg op->ts.type = BT_LOGICAL;
1717 1.1 mrg op->ts.kind = gfc_default_logical_kind;
1718 1.1 mrg break;
1719 1.1 mrg
1720 1.1 mrg default:
1721 1.1 mrg break;
1722 1.1 mrg }
1723 1.1 mrg
1724 1.1 mrg return op;
1725 1.1 mrg }
1726 1.1 mrg
1727 1.1 mrg
1728 1.1 mrg /* Return nonzero if the expression is a zero size array. */
1729 1.1 mrg
1730 1.1 mrg static bool
1731 1.1 mrg gfc_zero_size_array (gfc_expr *e)
1732 1.1 mrg {
1733 1.1 mrg if (e == NULL || e->expr_type != EXPR_ARRAY)
1734 1.1 mrg return false;
1735 1.1 mrg
1736 1.1 mrg return e->value.constructor == NULL;
1737 1.1 mrg }
1738 1.1 mrg
1739 1.1 mrg
1740 1.1 mrg /* Reduce a binary expression where at least one of the operands
1741 1.1 mrg involves a zero-length array. Returns NULL if neither of the
1742 1.1 mrg operands is a zero-length array. */
1743 1.1 mrg
1744 1.1 mrg static gfc_expr *
1745 1.1 mrg reduce_binary0 (gfc_expr *op1, gfc_expr *op2)
1746 1.1 mrg {
1747 1.1 mrg if (gfc_zero_size_array (op1))
1748 1.1 mrg {
1749 1.1 mrg gfc_free_expr (op2);
1750 1.1 mrg return op1;
1751 1.1 mrg }
1752 1.1 mrg
1753 1.1 mrg if (gfc_zero_size_array (op2))
1754 1.1 mrg {
1755 1.1 mrg gfc_free_expr (op1);
1756 1.1 mrg return op2;
1757 1.1 mrg }
1758 1.1 mrg
1759 1.1 mrg return NULL;
1760 1.1 mrg }
1761 1.1 mrg
1762 1.1 mrg
1763 1.1 mrg static gfc_expr *
1764 1.1 mrg eval_intrinsic_f2 (gfc_intrinsic_op op,
1765 1.1 mrg arith (*eval) (gfc_expr *, gfc_expr **),
1766 1.1 mrg gfc_expr *op1, gfc_expr *op2)
1767 1.1 mrg {
1768 1.1 mrg gfc_expr *result;
1769 1.1 mrg eval_f f;
1770 1.1 mrg
1771 1.1 mrg if (op2 == NULL)
1772 1.1 mrg {
1773 1.1 mrg if (gfc_zero_size_array (op1))
1774 1.1 mrg return eval_type_intrinsic0 (op, op1);
1775 1.1 mrg }
1776 1.1 mrg else
1777 1.1 mrg {
1778 1.1 mrg result = reduce_binary0 (op1, op2);
1779 1.1 mrg if (result != NULL)
1780 1.1 mrg return eval_type_intrinsic0 (op, result);
1781 1.1 mrg }
1782 1.1 mrg
1783 1.1 mrg f.f2 = eval;
1784 1.1 mrg return eval_intrinsic (op, f, op1, op2);
1785 1.1 mrg }
1786 1.1 mrg
1787 1.1 mrg
1788 1.1 mrg static gfc_expr *
1789 1.1 mrg eval_intrinsic_f3 (gfc_intrinsic_op op,
1790 1.1 mrg arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
1791 1.1 mrg gfc_expr *op1, gfc_expr *op2)
1792 1.1 mrg {
1793 1.1 mrg gfc_expr *result;
1794 1.1 mrg eval_f f;
1795 1.1 mrg
1796 1.1 mrg if (!op1 && !op2)
1797 1.1 mrg return NULL;
1798 1.1 mrg
1799 1.1 mrg result = reduce_binary0 (op1, op2);
1800 1.1 mrg if (result != NULL)
1801 1.1 mrg return eval_type_intrinsic0(op, result);
1802 1.1 mrg
1803 1.1 mrg f.f3 = eval;
1804 1.1 mrg return eval_intrinsic (op, f, op1, op2);
1805 1.1 mrg }
1806 1.1 mrg
1807 1.1 mrg
1808 1.1 mrg gfc_expr *
1809 1.1 mrg gfc_parentheses (gfc_expr *op)
1810 1.1 mrg {
1811 1.1 mrg if (gfc_is_constant_expr (op))
1812 1.1 mrg return op;
1813 1.1 mrg
1814 1.1 mrg return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
1815 1.1 mrg op, NULL);
1816 1.1 mrg }
1817 1.1 mrg
1818 1.1 mrg gfc_expr *
1819 1.1 mrg gfc_uplus (gfc_expr *op)
1820 1.1 mrg {
1821 1.1 mrg return eval_intrinsic_f2 (INTRINSIC_UPLUS, gfc_arith_identity, op, NULL);
1822 1.1 mrg }
1823 1.1 mrg
1824 1.1 mrg
1825 1.1 mrg gfc_expr *
1826 1.1 mrg gfc_uminus (gfc_expr *op)
1827 1.1 mrg {
1828 1.1 mrg return eval_intrinsic_f2 (INTRINSIC_UMINUS, gfc_arith_uminus, op, NULL);
1829 1.1 mrg }
1830 1.1 mrg
1831 1.1 mrg
1832 1.1 mrg gfc_expr *
1833 1.1 mrg gfc_add (gfc_expr *op1, gfc_expr *op2)
1834 1.1 mrg {
1835 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_PLUS, gfc_arith_plus, op1, op2);
1836 1.1 mrg }
1837 1.1 mrg
1838 1.1 mrg
1839 1.1 mrg gfc_expr *
1840 1.1 mrg gfc_subtract (gfc_expr *op1, gfc_expr *op2)
1841 1.1 mrg {
1842 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_MINUS, gfc_arith_minus, op1, op2);
1843 1.1 mrg }
1844 1.1 mrg
1845 1.1 mrg
1846 1.1 mrg gfc_expr *
1847 1.1 mrg gfc_multiply (gfc_expr *op1, gfc_expr *op2)
1848 1.1 mrg {
1849 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_TIMES, gfc_arith_times, op1, op2);
1850 1.1 mrg }
1851 1.1 mrg
1852 1.1 mrg
1853 1.1 mrg gfc_expr *
1854 1.1 mrg gfc_divide (gfc_expr *op1, gfc_expr *op2)
1855 1.1 mrg {
1856 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
1857 1.1 mrg }
1858 1.1 mrg
1859 1.1 mrg
1860 1.1 mrg gfc_expr *
1861 1.1 mrg gfc_power (gfc_expr *op1, gfc_expr *op2)
1862 1.1 mrg {
1863 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_POWER, arith_power, op1, op2);
1864 1.1 mrg }
1865 1.1 mrg
1866 1.1 mrg
1867 1.1 mrg gfc_expr *
1868 1.1 mrg gfc_concat (gfc_expr *op1, gfc_expr *op2)
1869 1.1 mrg {
1870 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_CONCAT, gfc_arith_concat, op1, op2);
1871 1.1 mrg }
1872 1.1 mrg
1873 1.1 mrg
1874 1.1 mrg gfc_expr *
1875 1.1 mrg gfc_and (gfc_expr *op1, gfc_expr *op2)
1876 1.1 mrg {
1877 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_AND, gfc_arith_and, op1, op2);
1878 1.1 mrg }
1879 1.1 mrg
1880 1.1 mrg
1881 1.1 mrg gfc_expr *
1882 1.1 mrg gfc_or (gfc_expr *op1, gfc_expr *op2)
1883 1.1 mrg {
1884 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_OR, gfc_arith_or, op1, op2);
1885 1.1 mrg }
1886 1.1 mrg
1887 1.1 mrg
1888 1.1 mrg gfc_expr *
1889 1.1 mrg gfc_not (gfc_expr *op1)
1890 1.1 mrg {
1891 1.1 mrg return eval_intrinsic_f2 (INTRINSIC_NOT, gfc_arith_not, op1, NULL);
1892 1.1 mrg }
1893 1.1 mrg
1894 1.1 mrg
1895 1.1 mrg gfc_expr *
1896 1.1 mrg gfc_eqv (gfc_expr *op1, gfc_expr *op2)
1897 1.1 mrg {
1898 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_EQV, gfc_arith_eqv, op1, op2);
1899 1.1 mrg }
1900 1.1 mrg
1901 1.1 mrg
1902 1.1 mrg gfc_expr *
1903 1.1 mrg gfc_neqv (gfc_expr *op1, gfc_expr *op2)
1904 1.1 mrg {
1905 1.1 mrg return eval_intrinsic_f3 (INTRINSIC_NEQV, gfc_arith_neqv, op1, op2);
1906 1.1 mrg }
1907 1.1 mrg
1908 1.1 mrg
1909 1.1 mrg gfc_expr *
1910 1.1 mrg gfc_eq (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1911 1.1 mrg {
1912 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_eq, op1, op2);
1913 1.1 mrg }
1914 1.1 mrg
1915 1.1 mrg
1916 1.1 mrg gfc_expr *
1917 1.1 mrg gfc_ne (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1918 1.1 mrg {
1919 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_ne, op1, op2);
1920 1.1 mrg }
1921 1.1 mrg
1922 1.1 mrg
1923 1.1 mrg gfc_expr *
1924 1.1 mrg gfc_gt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1925 1.1 mrg {
1926 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_gt, op1, op2);
1927 1.1 mrg }
1928 1.1 mrg
1929 1.1 mrg
1930 1.1 mrg gfc_expr *
1931 1.1 mrg gfc_ge (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1932 1.1 mrg {
1933 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_ge, op1, op2);
1934 1.1 mrg }
1935 1.1 mrg
1936 1.1 mrg
1937 1.1 mrg gfc_expr *
1938 1.1 mrg gfc_lt (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1939 1.1 mrg {
1940 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_lt, op1, op2);
1941 1.1 mrg }
1942 1.1 mrg
1943 1.1 mrg
1944 1.1 mrg gfc_expr *
1945 1.1 mrg gfc_le (gfc_expr *op1, gfc_expr *op2, gfc_intrinsic_op op)
1946 1.1 mrg {
1947 1.1 mrg return eval_intrinsic_f3 (op, gfc_arith_le, op1, op2);
1948 1.1 mrg }
1949 1.1 mrg
1950 1.1 mrg
1951 1.1 mrg /******* Simplification of intrinsic functions with constant arguments *****/
1952 1.1 mrg
1953 1.1 mrg
1954 1.1 mrg /* Deal with an arithmetic error. */
1955 1.1 mrg
1956 1.1 mrg static void
1957 1.1 mrg arith_error (arith rc, gfc_typespec *from, gfc_typespec *to, locus *where)
1958 1.1 mrg {
1959 1.1 mrg switch (rc)
1960 1.1 mrg {
1961 1.1 mrg case ARITH_OK:
1962 1.1 mrg gfc_error ("Arithmetic OK converting %s to %s at %L",
1963 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1964 1.1 mrg break;
1965 1.1 mrg case ARITH_OVERFLOW:
1966 1.1 mrg gfc_error ("Arithmetic overflow converting %s to %s at %L. This check "
1967 1.1 mrg "can be disabled with the option %<-fno-range-check%>",
1968 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1969 1.1 mrg break;
1970 1.1 mrg case ARITH_UNDERFLOW:
1971 1.1 mrg gfc_error ("Arithmetic underflow converting %s to %s at %L. This check "
1972 1.1 mrg "can be disabled with the option %<-fno-range-check%>",
1973 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1974 1.1 mrg break;
1975 1.1 mrg case ARITH_NAN:
1976 1.1 mrg gfc_error ("Arithmetic NaN converting %s to %s at %L. This check "
1977 1.1 mrg "can be disabled with the option %<-fno-range-check%>",
1978 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1979 1.1 mrg break;
1980 1.1 mrg case ARITH_DIV0:
1981 1.1 mrg gfc_error ("Division by zero converting %s to %s at %L",
1982 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1983 1.1 mrg break;
1984 1.1 mrg case ARITH_INCOMMENSURATE:
1985 1.1 mrg gfc_error ("Array operands are incommensurate converting %s to %s at %L",
1986 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1987 1.1 mrg break;
1988 1.1 mrg case ARITH_ASYMMETRIC:
1989 1.1 mrg gfc_error ("Integer outside symmetric range implied by Standard Fortran"
1990 1.1 mrg " converting %s to %s at %L",
1991 1.1 mrg gfc_typename (from), gfc_typename (to), where);
1992 1.1 mrg break;
1993 1.1 mrg default:
1994 1.1 mrg gfc_internal_error ("gfc_arith_error(): Bad error code");
1995 1.1 mrg }
1996 1.1 mrg
1997 1.1 mrg /* TODO: Do something about the error, i.e., throw exception, return
1998 1.1 mrg NaN, etc. */
1999 1.1 mrg }
2000 1.1 mrg
2001 1.1 mrg /* Returns true if significant bits were lost when converting real
2002 1.1 mrg constant r from from_kind to to_kind. */
2003 1.1 mrg
2004 1.1 mrg static bool
2005 1.1 mrg wprecision_real_real (mpfr_t r, int from_kind, int to_kind)
2006 1.1 mrg {
2007 1.1 mrg mpfr_t rv, diff;
2008 1.1 mrg bool ret;
2009 1.1 mrg
2010 1.1 mrg gfc_set_model_kind (to_kind);
2011 1.1 mrg mpfr_init (rv);
2012 1.1 mrg gfc_set_model_kind (from_kind);
2013 1.1 mrg mpfr_init (diff);
2014 1.1 mrg
2015 1.1 mrg mpfr_set (rv, r, GFC_RND_MODE);
2016 1.1 mrg mpfr_sub (diff, rv, r, GFC_RND_MODE);
2017 1.1 mrg
2018 1.1 mrg ret = ! mpfr_zero_p (diff);
2019 1.1 mrg mpfr_clear (rv);
2020 1.1 mrg mpfr_clear (diff);
2021 1.1 mrg return ret;
2022 1.1 mrg }
2023 1.1 mrg
2024 1.1 mrg /* Return true if conversion from an integer to a real loses precision. */
2025 1.1 mrg
2026 1.1 mrg static bool
2027 1.1 mrg wprecision_int_real (mpz_t n, mpfr_t r)
2028 1.1 mrg {
2029 1.1 mrg bool ret;
2030 1.1 mrg mpz_t i;
2031 1.1 mrg mpz_init (i);
2032 1.1 mrg mpfr_get_z (i, r, GFC_RND_MODE);
2033 1.1 mrg mpz_sub (i, i, n);
2034 1.1 mrg ret = mpz_cmp_si (i, 0) != 0;
2035 1.1 mrg mpz_clear (i);
2036 1.1 mrg return ret;
2037 1.1 mrg }
2038 1.1 mrg
2039 1.1 mrg /* Convert integers to integers. */
2040 1.1 mrg
2041 1.1 mrg gfc_expr *
2042 1.1 mrg gfc_int2int (gfc_expr *src, int kind)
2043 1.1 mrg {
2044 1.1 mrg gfc_expr *result;
2045 1.1 mrg arith rc;
2046 1.1 mrg
2047 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2048 1.1 mrg
2049 1.1 mrg mpz_set (result->value.integer, src->value.integer);
2050 1.1 mrg
2051 1.1 mrg if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2052 1.1 mrg {
2053 1.1 mrg if (rc == ARITH_ASYMMETRIC)
2054 1.1 mrg {
2055 1.1 mrg gfc_warning (0, gfc_arith_error (rc), &src->where);
2056 1.1 mrg }
2057 1.1 mrg else
2058 1.1 mrg {
2059 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2060 1.1 mrg gfc_free_expr (result);
2061 1.1 mrg return NULL;
2062 1.1 mrg }
2063 1.1 mrg }
2064 1.1 mrg
2065 1.1 mrg /* If we do not trap numeric overflow, we need to convert the number to
2066 1.1 mrg signed, throwing away high-order bits if necessary. */
2067 1.1 mrg if (flag_range_check == 0)
2068 1.1 mrg {
2069 1.1 mrg int k;
2070 1.1 mrg
2071 1.1 mrg k = gfc_validate_kind (BT_INTEGER, kind, false);
2072 1.1 mrg gfc_convert_mpz_to_signed (result->value.integer,
2073 1.1 mrg gfc_integer_kinds[k].bit_size);
2074 1.1 mrg
2075 1.1 mrg if (warn_conversion && !src->do_not_warn && kind < src->ts.kind)
2076 1.1 mrg gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2077 1.1 mrg gfc_typename (&src->ts), gfc_typename (&result->ts),
2078 1.1 mrg &src->where);
2079 1.1 mrg }
2080 1.1 mrg return result;
2081 1.1 mrg }
2082 1.1 mrg
2083 1.1 mrg
2084 1.1 mrg /* Convert integers to reals. */
2085 1.1 mrg
2086 1.1 mrg gfc_expr *
2087 1.1 mrg gfc_int2real (gfc_expr *src, int kind)
2088 1.1 mrg {
2089 1.1 mrg gfc_expr *result;
2090 1.1 mrg arith rc;
2091 1.1 mrg
2092 1.1 mrg result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2093 1.1 mrg
2094 1.1 mrg mpfr_set_z (result->value.real, src->value.integer, GFC_RND_MODE);
2095 1.1 mrg
2096 1.1 mrg if ((rc = gfc_check_real_range (result->value.real, kind)) != ARITH_OK)
2097 1.1 mrg {
2098 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2099 1.1 mrg gfc_free_expr (result);
2100 1.1 mrg return NULL;
2101 1.1 mrg }
2102 1.1 mrg
2103 1.1 mrg if (warn_conversion
2104 1.1 mrg && wprecision_int_real (src->value.integer, result->value.real))
2105 1.1 mrg gfc_warning (OPT_Wconversion, "Change of value in conversion "
2106 1.1 mrg "from %qs to %qs at %L",
2107 1.1 mrg gfc_typename (&src->ts),
2108 1.1 mrg gfc_typename (&result->ts),
2109 1.1 mrg &src->where);
2110 1.1 mrg
2111 1.1 mrg return result;
2112 1.1 mrg }
2113 1.1 mrg
2114 1.1 mrg
2115 1.1 mrg /* Convert default integer to default complex. */
2116 1.1 mrg
2117 1.1 mrg gfc_expr *
2118 1.1 mrg gfc_int2complex (gfc_expr *src, int kind)
2119 1.1 mrg {
2120 1.1 mrg gfc_expr *result;
2121 1.1 mrg arith rc;
2122 1.1 mrg
2123 1.1 mrg result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2124 1.1 mrg
2125 1.1 mrg mpc_set_z (result->value.complex, src->value.integer, GFC_MPC_RND_MODE);
2126 1.1 mrg
2127 1.1 mrg if ((rc = gfc_check_real_range (mpc_realref (result->value.complex), kind))
2128 1.1 mrg != ARITH_OK)
2129 1.1 mrg {
2130 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2131 1.1 mrg gfc_free_expr (result);
2132 1.1 mrg return NULL;
2133 1.1 mrg }
2134 1.1 mrg
2135 1.1 mrg if (warn_conversion
2136 1.1 mrg && wprecision_int_real (src->value.integer,
2137 1.1 mrg mpc_realref (result->value.complex)))
2138 1.1 mrg gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2139 1.1 mrg "from %qs to %qs at %L",
2140 1.1 mrg gfc_typename (&src->ts),
2141 1.1 mrg gfc_typename (&result->ts),
2142 1.1 mrg &src->where);
2143 1.1 mrg
2144 1.1 mrg return result;
2145 1.1 mrg }
2146 1.1 mrg
2147 1.1 mrg
2148 1.1 mrg /* Convert default real to default integer. */
2149 1.1 mrg
2150 1.1 mrg gfc_expr *
2151 1.1 mrg gfc_real2int (gfc_expr *src, int kind)
2152 1.1 mrg {
2153 1.1 mrg gfc_expr *result;
2154 1.1 mrg arith rc;
2155 1.1 mrg bool did_warn = false;
2156 1.1 mrg
2157 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2158 1.1 mrg
2159 1.1 mrg gfc_mpfr_to_mpz (result->value.integer, src->value.real, &src->where);
2160 1.1 mrg
2161 1.1 mrg if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2162 1.1 mrg {
2163 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2164 1.1 mrg gfc_free_expr (result);
2165 1.1 mrg return NULL;
2166 1.1 mrg }
2167 1.1 mrg
2168 1.1 mrg /* If there was a fractional part, warn about this. */
2169 1.1 mrg
2170 1.1 mrg if (warn_conversion)
2171 1.1 mrg {
2172 1.1 mrg mpfr_t f;
2173 1.1 mrg mpfr_init (f);
2174 1.1 mrg mpfr_frac (f, src->value.real, GFC_RND_MODE);
2175 1.1 mrg if (mpfr_cmp_si (f, 0) != 0)
2176 1.1 mrg {
2177 1.1 mrg gfc_warning_now (OPT_Wconversion, "Change of value in conversion "
2178 1.1 mrg "from %qs to %qs at %L", gfc_typename (&src->ts),
2179 1.1 mrg gfc_typename (&result->ts), &src->where);
2180 1.1 mrg did_warn = true;
2181 1.1 mrg }
2182 1.1 mrg }
2183 1.1 mrg if (!did_warn && warn_conversion_extra)
2184 1.1 mrg {
2185 1.1 mrg gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2186 1.1 mrg "at %L", gfc_typename (&src->ts),
2187 1.1 mrg gfc_typename (&result->ts), &src->where);
2188 1.1 mrg }
2189 1.1 mrg
2190 1.1 mrg return result;
2191 1.1 mrg }
2192 1.1 mrg
2193 1.1 mrg
2194 1.1 mrg /* Convert real to real. */
2195 1.1 mrg
2196 1.1 mrg gfc_expr *
2197 1.1 mrg gfc_real2real (gfc_expr *src, int kind)
2198 1.1 mrg {
2199 1.1 mrg gfc_expr *result;
2200 1.1 mrg arith rc;
2201 1.1 mrg bool did_warn = false;
2202 1.1 mrg
2203 1.1 mrg result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2204 1.1 mrg
2205 1.1 mrg mpfr_set (result->value.real, src->value.real, GFC_RND_MODE);
2206 1.1 mrg
2207 1.1 mrg rc = gfc_check_real_range (result->value.real, kind);
2208 1.1 mrg
2209 1.1 mrg if (rc == ARITH_UNDERFLOW)
2210 1.1 mrg {
2211 1.1 mrg if (warn_underflow)
2212 1.1 mrg gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2213 1.1 mrg mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2214 1.1 mrg }
2215 1.1 mrg else if (rc != ARITH_OK)
2216 1.1 mrg {
2217 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2218 1.1 mrg gfc_free_expr (result);
2219 1.1 mrg return NULL;
2220 1.1 mrg }
2221 1.1 mrg
2222 1.1 mrg /* As a special bonus, don't warn about REAL values which are not changed by
2223 1.1 mrg the conversion if -Wconversion is specified and -Wconversion-extra is
2224 1.1 mrg not. */
2225 1.1 mrg
2226 1.1 mrg if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2227 1.1 mrg {
2228 1.1 mrg int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2229 1.1 mrg
2230 1.1 mrg /* Calculate the difference between the constant and the rounded
2231 1.1 mrg value and check it against zero. */
2232 1.1 mrg
2233 1.1 mrg if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2234 1.1 mrg {
2235 1.1 mrg gfc_warning_now (w, "Change of value in conversion from "
2236 1.1 mrg "%qs to %qs at %L",
2237 1.1 mrg gfc_typename (&src->ts), gfc_typename (&result->ts),
2238 1.1 mrg &src->where);
2239 1.1 mrg /* Make sure the conversion warning is not emitted again. */
2240 1.1 mrg did_warn = true;
2241 1.1 mrg }
2242 1.1 mrg }
2243 1.1 mrg
2244 1.1 mrg if (!did_warn && warn_conversion_extra)
2245 1.1 mrg gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2246 1.1 mrg "at %L", gfc_typename(&src->ts),
2247 1.1 mrg gfc_typename(&result->ts), &src->where);
2248 1.1 mrg
2249 1.1 mrg return result;
2250 1.1 mrg }
2251 1.1 mrg
2252 1.1 mrg
2253 1.1 mrg /* Convert real to complex. */
2254 1.1 mrg
2255 1.1 mrg gfc_expr *
2256 1.1 mrg gfc_real2complex (gfc_expr *src, int kind)
2257 1.1 mrg {
2258 1.1 mrg gfc_expr *result;
2259 1.1 mrg arith rc;
2260 1.1 mrg bool did_warn = false;
2261 1.1 mrg
2262 1.1 mrg result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2263 1.1 mrg
2264 1.1 mrg mpc_set_fr (result->value.complex, src->value.real, GFC_MPC_RND_MODE);
2265 1.1 mrg
2266 1.1 mrg rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2267 1.1 mrg
2268 1.1 mrg if (rc == ARITH_UNDERFLOW)
2269 1.1 mrg {
2270 1.1 mrg if (warn_underflow)
2271 1.1 mrg gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2272 1.1 mrg mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2273 1.1 mrg }
2274 1.1 mrg else if (rc != ARITH_OK)
2275 1.1 mrg {
2276 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2277 1.1 mrg gfc_free_expr (result);
2278 1.1 mrg return NULL;
2279 1.1 mrg }
2280 1.1 mrg
2281 1.1 mrg if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind)
2282 1.1 mrg {
2283 1.1 mrg int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2284 1.1 mrg
2285 1.1 mrg if (wprecision_real_real (src->value.real, src->ts.kind, kind))
2286 1.1 mrg {
2287 1.1 mrg gfc_warning_now (w, "Change of value in conversion from "
2288 1.1 mrg "%qs to %qs at %L",
2289 1.1 mrg gfc_typename (&src->ts), gfc_typename (&result->ts),
2290 1.1 mrg &src->where);
2291 1.1 mrg /* Make sure the conversion warning is not emitted again. */
2292 1.1 mrg did_warn = true;
2293 1.1 mrg }
2294 1.1 mrg }
2295 1.1 mrg
2296 1.1 mrg if (!did_warn && warn_conversion_extra)
2297 1.1 mrg gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2298 1.1 mrg "at %L", gfc_typename(&src->ts),
2299 1.1 mrg gfc_typename(&result->ts), &src->where);
2300 1.1 mrg
2301 1.1 mrg return result;
2302 1.1 mrg }
2303 1.1 mrg
2304 1.1 mrg
2305 1.1 mrg /* Convert complex to integer. */
2306 1.1 mrg
2307 1.1 mrg gfc_expr *
2308 1.1 mrg gfc_complex2int (gfc_expr *src, int kind)
2309 1.1 mrg {
2310 1.1 mrg gfc_expr *result;
2311 1.1 mrg arith rc;
2312 1.1 mrg bool did_warn = false;
2313 1.1 mrg
2314 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2315 1.1 mrg
2316 1.1 mrg gfc_mpfr_to_mpz (result->value.integer, mpc_realref (src->value.complex),
2317 1.1 mrg &src->where);
2318 1.1 mrg
2319 1.1 mrg if ((rc = gfc_check_integer_range (result->value.integer, kind)) != ARITH_OK)
2320 1.1 mrg {
2321 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2322 1.1 mrg gfc_free_expr (result);
2323 1.1 mrg return NULL;
2324 1.1 mrg }
2325 1.1 mrg
2326 1.1 mrg if (warn_conversion || warn_conversion_extra)
2327 1.1 mrg {
2328 1.1 mrg int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2329 1.1 mrg
2330 1.1 mrg /* See if we discarded an imaginary part. */
2331 1.1 mrg if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2332 1.1 mrg {
2333 1.1 mrg gfc_warning_now (w, "Non-zero imaginary part discarded "
2334 1.1 mrg "in conversion from %qs to %qs at %L",
2335 1.1 mrg gfc_typename(&src->ts), gfc_typename (&result->ts),
2336 1.1 mrg &src->where);
2337 1.1 mrg did_warn = true;
2338 1.1 mrg }
2339 1.1 mrg
2340 1.1 mrg else {
2341 1.1 mrg mpfr_t f;
2342 1.1 mrg
2343 1.1 mrg mpfr_init (f);
2344 1.1 mrg mpfr_frac (f, src->value.real, GFC_RND_MODE);
2345 1.1 mrg if (mpfr_cmp_si (f, 0) != 0)
2346 1.1 mrg {
2347 1.1 mrg gfc_warning_now (w, "Change of value in conversion from "
2348 1.1 mrg "%qs to %qs at %L", gfc_typename (&src->ts),
2349 1.1 mrg gfc_typename (&result->ts), &src->where);
2350 1.1 mrg did_warn = true;
2351 1.1 mrg }
2352 1.1 mrg mpfr_clear (f);
2353 1.1 mrg }
2354 1.1 mrg
2355 1.1 mrg if (!did_warn && warn_conversion_extra)
2356 1.1 mrg {
2357 1.1 mrg gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2358 1.1 mrg "at %L", gfc_typename (&src->ts),
2359 1.1 mrg gfc_typename (&result->ts), &src->where);
2360 1.1 mrg }
2361 1.1 mrg }
2362 1.1 mrg
2363 1.1 mrg return result;
2364 1.1 mrg }
2365 1.1 mrg
2366 1.1 mrg
2367 1.1 mrg /* Convert complex to real. */
2368 1.1 mrg
2369 1.1 mrg gfc_expr *
2370 1.1 mrg gfc_complex2real (gfc_expr *src, int kind)
2371 1.1 mrg {
2372 1.1 mrg gfc_expr *result;
2373 1.1 mrg arith rc;
2374 1.1 mrg bool did_warn = false;
2375 1.1 mrg
2376 1.1 mrg result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2377 1.1 mrg
2378 1.1 mrg mpc_real (result->value.real, src->value.complex, GFC_RND_MODE);
2379 1.1 mrg
2380 1.1 mrg rc = gfc_check_real_range (result->value.real, kind);
2381 1.1 mrg
2382 1.1 mrg if (rc == ARITH_UNDERFLOW)
2383 1.1 mrg {
2384 1.1 mrg if (warn_underflow)
2385 1.1 mrg gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2386 1.1 mrg mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2387 1.1 mrg }
2388 1.1 mrg if (rc != ARITH_OK)
2389 1.1 mrg {
2390 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2391 1.1 mrg gfc_free_expr (result);
2392 1.1 mrg return NULL;
2393 1.1 mrg }
2394 1.1 mrg
2395 1.1 mrg if (warn_conversion || warn_conversion_extra)
2396 1.1 mrg {
2397 1.1 mrg int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2398 1.1 mrg
2399 1.1 mrg /* See if we discarded an imaginary part. */
2400 1.1 mrg if (mpfr_cmp_si (mpc_imagref (src->value.complex), 0) != 0)
2401 1.1 mrg {
2402 1.1 mrg gfc_warning (w, "Non-zero imaginary part discarded "
2403 1.1 mrg "in conversion from %qs to %qs at %L",
2404 1.1 mrg gfc_typename(&src->ts), gfc_typename (&result->ts),
2405 1.1 mrg &src->where);
2406 1.1 mrg did_warn = true;
2407 1.1 mrg }
2408 1.1 mrg
2409 1.1 mrg /* Calculate the difference between the real constant and the rounded
2410 1.1 mrg value and check it against zero. */
2411 1.1 mrg
2412 1.1 mrg if (kind > src->ts.kind
2413 1.1 mrg && wprecision_real_real (mpc_realref (src->value.complex),
2414 1.1 mrg src->ts.kind, kind))
2415 1.1 mrg {
2416 1.1 mrg gfc_warning_now (w, "Change of value in conversion from "
2417 1.1 mrg "%qs to %qs at %L",
2418 1.1 mrg gfc_typename (&src->ts), gfc_typename (&result->ts),
2419 1.1 mrg &src->where);
2420 1.1 mrg /* Make sure the conversion warning is not emitted again. */
2421 1.1 mrg did_warn = true;
2422 1.1 mrg }
2423 1.1 mrg }
2424 1.1 mrg
2425 1.1 mrg if (!did_warn && warn_conversion_extra)
2426 1.1 mrg gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L",
2427 1.1 mrg gfc_typename(&src->ts), gfc_typename (&result->ts),
2428 1.1 mrg &src->where);
2429 1.1 mrg
2430 1.1 mrg return result;
2431 1.1 mrg }
2432 1.1 mrg
2433 1.1 mrg
2434 1.1 mrg /* Convert complex to complex. */
2435 1.1 mrg
2436 1.1 mrg gfc_expr *
2437 1.1 mrg gfc_complex2complex (gfc_expr *src, int kind)
2438 1.1 mrg {
2439 1.1 mrg gfc_expr *result;
2440 1.1 mrg arith rc;
2441 1.1 mrg bool did_warn = false;
2442 1.1 mrg
2443 1.1 mrg result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2444 1.1 mrg
2445 1.1 mrg mpc_set (result->value.complex, src->value.complex, GFC_MPC_RND_MODE);
2446 1.1 mrg
2447 1.1 mrg rc = gfc_check_real_range (mpc_realref (result->value.complex), kind);
2448 1.1 mrg
2449 1.1 mrg if (rc == ARITH_UNDERFLOW)
2450 1.1 mrg {
2451 1.1 mrg if (warn_underflow)
2452 1.1 mrg gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2453 1.1 mrg mpfr_set_ui (mpc_realref (result->value.complex), 0, GFC_RND_MODE);
2454 1.1 mrg }
2455 1.1 mrg else if (rc != ARITH_OK)
2456 1.1 mrg {
2457 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2458 1.1 mrg gfc_free_expr (result);
2459 1.1 mrg return NULL;
2460 1.1 mrg }
2461 1.1 mrg
2462 1.1 mrg rc = gfc_check_real_range (mpc_imagref (result->value.complex), kind);
2463 1.1 mrg
2464 1.1 mrg if (rc == ARITH_UNDERFLOW)
2465 1.1 mrg {
2466 1.1 mrg if (warn_underflow)
2467 1.1 mrg gfc_warning (OPT_Woverflow, gfc_arith_error (rc), &src->where);
2468 1.1 mrg mpfr_set_ui (mpc_imagref (result->value.complex), 0, GFC_RND_MODE);
2469 1.1 mrg }
2470 1.1 mrg else if (rc != ARITH_OK)
2471 1.1 mrg {
2472 1.1 mrg arith_error (rc, &src->ts, &result->ts, &src->where);
2473 1.1 mrg gfc_free_expr (result);
2474 1.1 mrg return NULL;
2475 1.1 mrg }
2476 1.1 mrg
2477 1.1 mrg if ((warn_conversion || warn_conversion_extra) && src->ts.kind > kind
2478 1.1 mrg && (wprecision_real_real (mpc_realref (src->value.complex),
2479 1.1 mrg src->ts.kind, kind)
2480 1.1 mrg || wprecision_real_real (mpc_imagref (src->value.complex),
2481 1.1 mrg src->ts.kind, kind)))
2482 1.1 mrg {
2483 1.1 mrg int w = warn_conversion ? OPT_Wconversion : OPT_Wconversion_extra;
2484 1.1 mrg
2485 1.1 mrg gfc_warning_now (w, "Change of value in conversion from "
2486 1.1 mrg "%qs to %qs at %L",
2487 1.1 mrg gfc_typename (&src->ts), gfc_typename (&result->ts),
2488 1.1 mrg &src->where);
2489 1.1 mrg did_warn = true;
2490 1.1 mrg }
2491 1.1 mrg
2492 1.1 mrg if (!did_warn && warn_conversion_extra && src->ts.kind != kind)
2493 1.1 mrg gfc_warning_now (OPT_Wconversion_extra, "Conversion from %qs to %qs "
2494 1.1 mrg "at %L", gfc_typename(&src->ts),
2495 1.1 mrg gfc_typename (&result->ts), &src->where);
2496 1.1 mrg
2497 1.1 mrg return result;
2498 1.1 mrg }
2499 1.1 mrg
2500 1.1 mrg
2501 1.1 mrg /* Logical kind conversion. */
2502 1.1 mrg
2503 1.1 mrg gfc_expr *
2504 1.1 mrg gfc_log2log (gfc_expr *src, int kind)
2505 1.1 mrg {
2506 1.1 mrg gfc_expr *result;
2507 1.1 mrg
2508 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2509 1.1 mrg result->value.logical = src->value.logical;
2510 1.1 mrg
2511 1.1 mrg return result;
2512 1.1 mrg }
2513 1.1 mrg
2514 1.1 mrg
2515 1.1 mrg /* Convert logical to integer. */
2516 1.1 mrg
2517 1.1 mrg gfc_expr *
2518 1.1 mrg gfc_log2int (gfc_expr *src, int kind)
2519 1.1 mrg {
2520 1.1 mrg gfc_expr *result;
2521 1.1 mrg
2522 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2523 1.1 mrg mpz_set_si (result->value.integer, src->value.logical);
2524 1.1 mrg
2525 1.1 mrg return result;
2526 1.1 mrg }
2527 1.1 mrg
2528 1.1 mrg
2529 1.1 mrg /* Convert integer to logical. */
2530 1.1 mrg
2531 1.1 mrg gfc_expr *
2532 1.1 mrg gfc_int2log (gfc_expr *src, int kind)
2533 1.1 mrg {
2534 1.1 mrg gfc_expr *result;
2535 1.1 mrg
2536 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2537 1.1 mrg result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
2538 1.1 mrg
2539 1.1 mrg return result;
2540 1.1 mrg }
2541 1.1 mrg
2542 1.1 mrg /* Convert character to character. We only use wide strings internally,
2543 1.1 mrg so we only set the kind. */
2544 1.1 mrg
2545 1.1 mrg gfc_expr *
2546 1.1 mrg gfc_character2character (gfc_expr *src, int kind)
2547 1.1 mrg {
2548 1.1 mrg gfc_expr *result;
2549 1.1 mrg result = gfc_copy_expr (src);
2550 1.1 mrg result->ts.kind = kind;
2551 1.1 mrg
2552 1.1 mrg return result;
2553 1.1 mrg }
2554 1.1 mrg
2555 1.1 mrg /* Helper function to set the representation in a Hollerith conversion.
2556 1.1 mrg This assumes that the ts.type and ts.kind of the result have already
2557 1.1 mrg been set. */
2558 1.1 mrg
2559 1.1 mrg static void
2560 1.1 mrg hollerith2representation (gfc_expr *result, gfc_expr *src)
2561 1.1 mrg {
2562 1.1 mrg size_t src_len, result_len;
2563 1.1 mrg
2564 1.1 mrg src_len = src->representation.length - src->ts.u.pad;
2565 1.1 mrg gfc_target_expr_size (result, &result_len);
2566 1.1 mrg
2567 1.1 mrg if (src_len > result_len)
2568 1.1 mrg {
2569 1.1 mrg gfc_warning (OPT_Wcharacter_truncation, "The Hollerith constant at %L "
2570 1.1 mrg "is truncated in conversion to %qs", &src->where,
2571 1.1 mrg gfc_typename(&result->ts));
2572 1.1 mrg }
2573 1.1 mrg
2574 1.1 mrg result->representation.string = XCNEWVEC (char, result_len + 1);
2575 1.1 mrg memcpy (result->representation.string, src->representation.string,
2576 1.1 mrg MIN (result_len, src_len));
2577 1.1 mrg
2578 1.1 mrg if (src_len < result_len)
2579 1.1 mrg memset (&result->representation.string[src_len], ' ', result_len - src_len);
2580 1.1 mrg
2581 1.1 mrg result->representation.string[result_len] = '\0'; /* For debugger */
2582 1.1 mrg result->representation.length = result_len;
2583 1.1 mrg }
2584 1.1 mrg
2585 1.1 mrg
2586 1.1 mrg /* Helper function to set the representation in a character conversion.
2587 1.1 mrg This assumes that the ts.type and ts.kind of the result have already
2588 1.1 mrg been set. */
2589 1.1 mrg
2590 1.1 mrg static void
2591 1.1 mrg character2representation (gfc_expr *result, gfc_expr *src)
2592 1.1 mrg {
2593 1.1 mrg size_t src_len, result_len, i;
2594 1.1 mrg src_len = src->value.character.length;
2595 1.1 mrg gfc_target_expr_size (result, &result_len);
2596 1.1 mrg
2597 1.1 mrg if (src_len > result_len)
2598 1.1 mrg gfc_warning (OPT_Wcharacter_truncation, "The character constant at %L is "
2599 1.1 mrg "truncated in conversion to %s", &src->where,
2600 1.1 mrg gfc_typename(&result->ts));
2601 1.1 mrg
2602 1.1 mrg result->representation.string = XCNEWVEC (char, result_len + 1);
2603 1.1 mrg
2604 1.1 mrg for (i = 0; i < MIN (result_len, src_len); i++)
2605 1.1 mrg result->representation.string[i] = (char) src->value.character.string[i];
2606 1.1 mrg
2607 1.1 mrg if (src_len < result_len)
2608 1.1 mrg memset (&result->representation.string[src_len], ' ',
2609 1.1 mrg result_len - src_len);
2610 1.1 mrg
2611 1.1 mrg result->representation.string[result_len] = '\0'; /* For debugger. */
2612 1.1 mrg result->representation.length = result_len;
2613 1.1 mrg }
2614 1.1 mrg
2615 1.1 mrg /* Convert Hollerith to integer. The constant will be padded or truncated. */
2616 1.1 mrg
2617 1.1 mrg gfc_expr *
2618 1.1 mrg gfc_hollerith2int (gfc_expr *src, int kind)
2619 1.1 mrg {
2620 1.1 mrg gfc_expr *result;
2621 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2622 1.1 mrg
2623 1.1 mrg hollerith2representation (result, src);
2624 1.1 mrg gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2625 1.1 mrg result->representation.length, result->value.integer);
2626 1.1 mrg
2627 1.1 mrg return result;
2628 1.1 mrg }
2629 1.1 mrg
2630 1.1 mrg /* Convert character to integer. The constant will be padded or truncated. */
2631 1.1 mrg
2632 1.1 mrg gfc_expr *
2633 1.1 mrg gfc_character2int (gfc_expr *src, int kind)
2634 1.1 mrg {
2635 1.1 mrg gfc_expr *result;
2636 1.1 mrg result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
2637 1.1 mrg
2638 1.1 mrg character2representation (result, src);
2639 1.1 mrg gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
2640 1.1 mrg result->representation.length, result->value.integer);
2641 1.1 mrg return result;
2642 1.1 mrg }
2643 1.1 mrg
2644 1.1 mrg /* Convert Hollerith to real. The constant will be padded or truncated. */
2645 1.1 mrg
2646 1.1 mrg gfc_expr *
2647 1.1 mrg gfc_hollerith2real (gfc_expr *src, int kind)
2648 1.1 mrg {
2649 1.1 mrg gfc_expr *result;
2650 1.1 mrg result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2651 1.1 mrg
2652 1.1 mrg hollerith2representation (result, src);
2653 1.1 mrg gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2654 1.1 mrg result->representation.length, result->value.real);
2655 1.1 mrg
2656 1.1 mrg return result;
2657 1.1 mrg }
2658 1.1 mrg
2659 1.1 mrg /* Convert character to real. The constant will be padded or truncated. */
2660 1.1 mrg
2661 1.1 mrg gfc_expr *
2662 1.1 mrg gfc_character2real (gfc_expr *src, int kind)
2663 1.1 mrg {
2664 1.1 mrg gfc_expr *result;
2665 1.1 mrg result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
2666 1.1 mrg
2667 1.1 mrg character2representation (result, src);
2668 1.1 mrg gfc_interpret_float (kind, (unsigned char *) result->representation.string,
2669 1.1 mrg result->representation.length, result->value.real);
2670 1.1 mrg
2671 1.1 mrg return result;
2672 1.1 mrg }
2673 1.1 mrg
2674 1.1 mrg
2675 1.1 mrg /* Convert Hollerith to complex. The constant will be padded or truncated. */
2676 1.1 mrg
2677 1.1 mrg gfc_expr *
2678 1.1 mrg gfc_hollerith2complex (gfc_expr *src, int kind)
2679 1.1 mrg {
2680 1.1 mrg gfc_expr *result;
2681 1.1 mrg result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2682 1.1 mrg
2683 1.1 mrg hollerith2representation (result, src);
2684 1.1 mrg gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2685 1.1 mrg result->representation.length, result->value.complex);
2686 1.1 mrg
2687 1.1 mrg return result;
2688 1.1 mrg }
2689 1.1 mrg
2690 1.1 mrg /* Convert character to complex. The constant will be padded or truncated. */
2691 1.1 mrg
2692 1.1 mrg gfc_expr *
2693 1.1 mrg gfc_character2complex (gfc_expr *src, int kind)
2694 1.1 mrg {
2695 1.1 mrg gfc_expr *result;
2696 1.1 mrg result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
2697 1.1 mrg
2698 1.1 mrg character2representation (result, src);
2699 1.1 mrg gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
2700 1.1 mrg result->representation.length, result->value.complex);
2701 1.1 mrg
2702 1.1 mrg return result;
2703 1.1 mrg }
2704 1.1 mrg
2705 1.1 mrg
2706 1.1 mrg /* Convert Hollerith to character. */
2707 1.1 mrg
2708 1.1 mrg gfc_expr *
2709 1.1 mrg gfc_hollerith2character (gfc_expr *src, int kind)
2710 1.1 mrg {
2711 1.1 mrg gfc_expr *result;
2712 1.1 mrg
2713 1.1 mrg result = gfc_copy_expr (src);
2714 1.1 mrg result->ts.type = BT_CHARACTER;
2715 1.1 mrg result->ts.kind = kind;
2716 1.1 mrg result->ts.u.pad = 0;
2717 1.1 mrg
2718 1.1 mrg result->value.character.length = result->representation.length;
2719 1.1 mrg result->value.character.string
2720 1.1 mrg = gfc_char_to_widechar (result->representation.string);
2721 1.1 mrg
2722 1.1 mrg return result;
2723 1.1 mrg }
2724 1.1 mrg
2725 1.1 mrg
2726 1.1 mrg /* Convert Hollerith to logical. The constant will be padded or truncated. */
2727 1.1 mrg
2728 1.1 mrg gfc_expr *
2729 1.1 mrg gfc_hollerith2logical (gfc_expr *src, int kind)
2730 1.1 mrg {
2731 1.1 mrg gfc_expr *result;
2732 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2733 1.1 mrg
2734 1.1 mrg hollerith2representation (result, src);
2735 1.1 mrg gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2736 1.1 mrg result->representation.length, &result->value.logical);
2737 1.1 mrg
2738 1.1 mrg return result;
2739 1.1 mrg }
2740 1.1 mrg
2741 1.1 mrg /* Convert character to logical. The constant will be padded or truncated. */
2742 1.1 mrg
2743 1.1 mrg gfc_expr *
2744 1.1 mrg gfc_character2logical (gfc_expr *src, int kind)
2745 1.1 mrg {
2746 1.1 mrg gfc_expr *result;
2747 1.1 mrg result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
2748 1.1 mrg
2749 1.1 mrg character2representation (result, src);
2750 1.1 mrg gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
2751 1.1 mrg result->representation.length, &result->value.logical);
2752 1.1 mrg
2753 1.1 mrg return result;
2754 1.1 mrg }
2755