1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
30 gfc_expr gfc_bad_expr;
33 /* Note that 'simplification' is not just transforming expressions.
34 For functions that are not simplified at compile time, range
35 checking is done if possible.
37 The return convention is that each simplification function returns:
39 A new expression node corresponding to the simplified arguments.
40 The original arguments are destroyed by the caller, and must not
41 be a part of the new expression.
43 NULL pointer indicating that no simplification was possible and
44 the original expression should remain intact. If the
45 simplification function sets the type and/or the function name
46 via the pointer gfc_simple_expression, then this type is
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. For
51 example, sqrt(-1.0). The error is generated within the function
52 and should be propagated upwards
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are never passed to these subroutines.
63 The functions in this file don't have much comment with them, but
64 everything is reasonably straight-forward. The Standard, chapter 13
65 is the best comment you'll find for this file anyway. */
67 /* Range checks an expression node. If all goes well, returns the
68 node, otherwise returns &gfc_bad_expr and frees the node. */
71 range_check (gfc_expr *result, const char *name)
76 switch (gfc_range_check (result))
82 gfc_error ("Result of %s overflows its kind at %L", name,
87 gfc_error ("Result of %s underflows its kind at %L", name,
92 gfc_error ("Result of %s is NaN at %L", name, &result->where);
96 gfc_error ("Result of %s gives range error for its kind at %L", name,
101 gfc_free_expr (result);
102 return &gfc_bad_expr;
106 /* A helper function that gets an optional and possibly missing
107 kind parameter. Returns the kind, -1 if something went wrong. */
110 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
117 if (k->expr_type != EXPR_CONSTANT)
119 gfc_error ("KIND parameter of %s at %L must be an initialization "
120 "expression", name, &k->where);
124 if (gfc_extract_int (k, &kind) != NULL
125 || gfc_validate_kind (type, kind, true) < 0)
127 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
135 /* Helper function to get an integer constant with a kind number given
136 by an integer constant expression. */
138 int_expr_with_kind (int i, gfc_expr *kind, const char *name)
140 gfc_expr *res = gfc_int_expr (i);
141 res->ts.kind = get_kind (BT_INTEGER, kind, name, gfc_default_integer_kind);
142 if (res->ts.kind == -1)
149 /* Converts an mpz_t signed variable into an unsigned one, assuming
150 two's complement representations and a binary width of bitsize.
151 The conversion is a no-op unless x is negative; otherwise, it can
152 be accomplished by masking out the high bits. */
155 convert_mpz_to_unsigned (mpz_t x, int bitsize)
161 /* Confirm that no bits above the signed range are unset. */
162 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
164 mpz_init_set_ui (mask, 1);
165 mpz_mul_2exp (mask, mask, bitsize);
166 mpz_sub_ui (mask, mask, 1);
168 mpz_and (x, x, mask);
174 /* Confirm that no bits above the signed range are set. */
175 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
180 /* Converts an mpz_t unsigned variable into a signed one, assuming
181 two's complement representations and a binary width of bitsize.
182 If the bitsize-1 bit is set, this is taken as a sign bit and
183 the number is converted to the corresponding negative number. */
186 convert_mpz_to_signed (mpz_t x, int bitsize)
190 /* Confirm that no bits above the unsigned range are set. */
191 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
193 if (mpz_tstbit (x, bitsize - 1) == 1)
195 mpz_init_set_ui (mask, 1);
196 mpz_mul_2exp (mask, mask, bitsize);
197 mpz_sub_ui (mask, mask, 1);
199 /* We negate the number by hand, zeroing the high bits, that is
200 make it the corresponding positive number, and then have it
201 negated by GMP, giving the correct representation of the
204 mpz_add_ui (x, x, 1);
205 mpz_and (x, x, mask);
214 /********************** Simplification functions *****************************/
217 gfc_simplify_abs (gfc_expr *e)
221 if (e->expr_type != EXPR_CONSTANT)
227 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
229 mpz_abs (result->value.integer, e->value.integer);
231 result = range_check (result, "IABS");
235 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
237 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
239 result = range_check (result, "ABS");
243 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
245 gfc_set_model_kind (e->ts.kind);
247 mpfr_hypot (result->value.real, e->value.complex.r,
248 e->value.complex.i, GFC_RND_MODE);
249 result = range_check (result, "CABS");
253 gfc_internal_error ("gfc_simplify_abs(): Bad type");
259 /* We use the processor's collating sequence, because all
260 systems that gfortran currently works on are ASCII. */
263 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
269 if (e->expr_type != EXPR_CONSTANT)
272 kind = get_kind (BT_CHARACTER, k, "ACHAR", gfc_default_character_kind);
274 return &gfc_bad_expr;
276 ch = gfc_extract_int (e, &c);
279 gfc_internal_error ("gfc_simplify_achar: %s", ch);
281 if (gfc_option.warn_surprising && (c < 0 || c > 127))
282 gfc_warning ("Argument of ACHAR function at %L outside of range [0,127]",
285 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
287 result->value.character.string = gfc_getmem (2);
289 result->value.character.length = 1;
290 result->value.character.string[0] = c;
291 result->value.character.string[1] = '\0'; /* For debugger */
297 gfc_simplify_acos (gfc_expr *x)
301 if (x->expr_type != EXPR_CONSTANT)
304 if (mpfr_cmp_si (x->value.real, 1) > 0
305 || mpfr_cmp_si (x->value.real, -1) < 0)
307 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
309 return &gfc_bad_expr;
312 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
314 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
316 return range_check (result, "ACOS");
320 gfc_simplify_acosh (gfc_expr *x)
324 if (x->expr_type != EXPR_CONSTANT)
327 if (mpfr_cmp_si (x->value.real, 1) < 0)
329 gfc_error ("Argument of ACOSH at %L must not be less than 1",
331 return &gfc_bad_expr;
334 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
336 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
338 return range_check (result, "ACOSH");
342 gfc_simplify_adjustl (gfc_expr *e)
348 if (e->expr_type != EXPR_CONSTANT)
351 len = e->value.character.length;
353 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
355 result->value.character.length = len;
356 result->value.character.string = gfc_getmem (len + 1);
358 for (count = 0, i = 0; i < len; ++i)
360 ch = e->value.character.string[i];
366 for (i = 0; i < len - count; ++i)
367 result->value.character.string[i] = e->value.character.string[count + i];
369 for (i = len - count; i < len; ++i)
370 result->value.character.string[i] = ' ';
372 result->value.character.string[len] = '\0'; /* For debugger */
379 gfc_simplify_adjustr (gfc_expr *e)
385 if (e->expr_type != EXPR_CONSTANT)
388 len = e->value.character.length;
390 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
392 result->value.character.length = len;
393 result->value.character.string = gfc_getmem (len + 1);
395 for (count = 0, i = len - 1; i >= 0; --i)
397 ch = e->value.character.string[i];
403 for (i = 0; i < count; ++i)
404 result->value.character.string[i] = ' ';
406 for (i = count; i < len; ++i)
407 result->value.character.string[i] = e->value.character.string[i - count];
409 result->value.character.string[len] = '\0'; /* For debugger */
416 gfc_simplify_aimag (gfc_expr *e)
420 if (e->expr_type != EXPR_CONSTANT)
423 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
424 mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
426 return range_check (result, "AIMAG");
431 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
433 gfc_expr *rtrunc, *result;
436 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
438 return &gfc_bad_expr;
440 if (e->expr_type != EXPR_CONSTANT)
443 rtrunc = gfc_copy_expr (e);
445 mpfr_trunc (rtrunc->value.real, e->value.real);
447 result = gfc_real2real (rtrunc, kind);
448 gfc_free_expr (rtrunc);
450 return range_check (result, "AINT");
455 gfc_simplify_dint (gfc_expr *e)
457 gfc_expr *rtrunc, *result;
459 if (e->expr_type != EXPR_CONSTANT)
462 rtrunc = gfc_copy_expr (e);
464 mpfr_trunc (rtrunc->value.real, e->value.real);
466 result = gfc_real2real (rtrunc, gfc_default_double_kind);
467 gfc_free_expr (rtrunc);
469 return range_check (result, "DINT");
474 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
479 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
481 return &gfc_bad_expr;
483 if (e->expr_type != EXPR_CONSTANT)
486 result = gfc_constant_result (e->ts.type, kind, &e->where);
488 mpfr_round (result->value.real, e->value.real);
490 return range_check (result, "ANINT");
495 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
500 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
503 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
504 if (x->ts.type == BT_INTEGER)
506 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
507 mpz_and (result->value.integer, x->value.integer, y->value.integer);
509 else /* BT_LOGICAL */
511 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
512 result->value.logical = x->value.logical && y->value.logical;
515 return range_check (result, "AND");
520 gfc_simplify_dnint (gfc_expr *e)
524 if (e->expr_type != EXPR_CONSTANT)
527 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
529 mpfr_round (result->value.real, e->value.real);
531 return range_check (result, "DNINT");
536 gfc_simplify_asin (gfc_expr *x)
540 if (x->expr_type != EXPR_CONSTANT)
543 if (mpfr_cmp_si (x->value.real, 1) > 0
544 || mpfr_cmp_si (x->value.real, -1) < 0)
546 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
548 return &gfc_bad_expr;
551 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
553 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
555 return range_check (result, "ASIN");
560 gfc_simplify_asinh (gfc_expr *x)
564 if (x->expr_type != EXPR_CONSTANT)
567 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
569 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
571 return range_check (result, "ASINH");
576 gfc_simplify_atan (gfc_expr *x)
580 if (x->expr_type != EXPR_CONSTANT)
583 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
585 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
587 return range_check (result, "ATAN");
592 gfc_simplify_atanh (gfc_expr *x)
596 if (x->expr_type != EXPR_CONSTANT)
599 if (mpfr_cmp_si (x->value.real, 1) >= 0
600 || mpfr_cmp_si (x->value.real, -1) <= 0)
602 gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
604 return &gfc_bad_expr;
607 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
609 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
611 return range_check (result, "ATANH");
616 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
620 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
623 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
625 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
627 gfc_error ("If first argument of ATAN2 %L is zero, then the "
628 "second argument must not be zero", &x->where);
629 gfc_free_expr (result);
630 return &gfc_bad_expr;
633 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
635 return range_check (result, "ATAN2");
640 gfc_simplify_bit_size (gfc_expr *e)
645 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
646 result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
647 mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
654 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
658 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
661 if (gfc_extract_int (bit, &b) != NULL || b < 0)
662 return gfc_logical_expr (0, &e->where);
664 return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
669 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
671 gfc_expr *ceil, *result;
674 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
676 return &gfc_bad_expr;
678 if (e->expr_type != EXPR_CONSTANT)
681 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
683 ceil = gfc_copy_expr (e);
685 mpfr_ceil (ceil->value.real, e->value.real);
686 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real);
688 gfc_free_expr (ceil);
690 return range_check (result, "CEILING");
695 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
701 kind = get_kind (BT_CHARACTER, k, "CHAR", gfc_default_character_kind);
703 return &gfc_bad_expr;
705 if (e->expr_type != EXPR_CONSTANT)
708 ch = gfc_extract_int (e, &c);
711 gfc_internal_error ("gfc_simplify_char: %s", ch);
713 if (c < 0 || c > UCHAR_MAX)
714 gfc_error ("Argument of CHAR function at %L outside of range [0,255]",
717 result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
719 result->value.character.length = 1;
720 result->value.character.string = gfc_getmem (2);
722 result->value.character.string[0] = c;
723 result->value.character.string[1] = '\0'; /* For debugger */
729 /* Common subroutine for simplifying CMPLX and DCMPLX. */
732 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
736 result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
738 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
744 mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
748 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
752 mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
753 mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
757 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
766 mpfr_set_z (result->value.complex.i, y->value.integer, GFC_RND_MODE);
770 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
774 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
782 ts.kind = result->ts.kind;
784 gfc_convert_boz (x, &ts);
785 mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
791 ts.kind = result->ts.kind;
793 gfc_convert_boz (y, &ts);
794 mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
797 return range_check (result, name);
802 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
806 if (x->expr_type != EXPR_CONSTANT
807 || (y != NULL && y->expr_type != EXPR_CONSTANT))
810 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
812 return &gfc_bad_expr;
814 return simplify_cmplx ("CMPLX", x, y, kind);
819 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
823 if (x->expr_type != EXPR_CONSTANT
824 || (y != NULL && y->expr_type != EXPR_CONSTANT))
827 if (x->ts.type == BT_INTEGER)
829 if (y->ts.type == BT_INTEGER)
830 kind = gfc_default_real_kind;
836 if (y->ts.type == BT_REAL)
837 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
842 return simplify_cmplx ("COMPLEX", x, y, kind);
847 gfc_simplify_conjg (gfc_expr *e)
851 if (e->expr_type != EXPR_CONSTANT)
854 result = gfc_copy_expr (e);
855 mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
857 return range_check (result, "CONJG");
862 gfc_simplify_cos (gfc_expr *x)
867 if (x->expr_type != EXPR_CONSTANT)
870 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
875 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
878 gfc_set_model_kind (x->ts.kind);
882 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
883 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
884 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
886 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
887 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
888 mpfr_mul (xp, xp, xq, GFC_RND_MODE);
889 mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
895 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
898 return range_check (result, "COS");
904 gfc_simplify_cosh (gfc_expr *x)
908 if (x->expr_type != EXPR_CONSTANT)
911 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
913 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
915 return range_check (result, "COSH");
920 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
923 if (x->expr_type != EXPR_CONSTANT
924 || (y != NULL && y->expr_type != EXPR_CONSTANT))
927 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
932 gfc_simplify_dble (gfc_expr *e)
936 if (e->expr_type != EXPR_CONSTANT)
943 result = gfc_int2real (e, gfc_default_double_kind);
947 result = gfc_real2real (e, gfc_default_double_kind);
951 result = gfc_complex2real (e, gfc_default_double_kind);
955 gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
958 if (e->ts.type == BT_INTEGER && e->is_boz)
962 ts.kind = gfc_default_double_kind;
963 result = gfc_copy_expr (e);
964 gfc_convert_boz (result, &ts);
967 return range_check (result, "DBLE");
972 gfc_simplify_digits (gfc_expr *x)
976 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
980 digits = gfc_integer_kinds[i].digits;
985 digits = gfc_real_kinds[i].digits;
992 return gfc_int_expr (digits);
997 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1002 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1005 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1006 result = gfc_constant_result (x->ts.type, kind, &x->where);
1011 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1012 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1014 mpz_set_ui (result->value.integer, 0);
1019 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1020 mpfr_sub (result->value.real, x->value.real, y->value.real,
1023 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1028 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1031 return range_check (result, "DIM");
1036 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1038 gfc_expr *a1, *a2, *result;
1040 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1043 result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
1045 a1 = gfc_real2real (x, gfc_default_double_kind);
1046 a2 = gfc_real2real (y, gfc_default_double_kind);
1048 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1053 return range_check (result, "DPROD");
1058 gfc_simplify_epsilon (gfc_expr *e)
1063 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1065 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1067 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1069 return range_check (result, "EPSILON");
1074 gfc_simplify_exp (gfc_expr *x)
1079 if (x->expr_type != EXPR_CONSTANT)
1082 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1087 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
1091 gfc_set_model_kind (x->ts.kind);
1094 mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1095 mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1096 mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1097 mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1098 mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1104 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1107 return range_check (result, "EXP");
1111 gfc_simplify_exponent (gfc_expr *x)
1116 if (x->expr_type != EXPR_CONSTANT)
1119 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1122 gfc_set_model (x->value.real);
1124 if (mpfr_sgn (x->value.real) == 0)
1126 mpz_set_ui (result->value.integer, 0);
1130 i = (int) mpfr_get_exp (x->value.real);
1131 mpz_set_si (result->value.integer, i);
1133 return range_check (result, "EXPONENT");
1138 gfc_simplify_float (gfc_expr *a)
1142 if (a->expr_type != EXPR_CONSTANT)
1150 ts.kind = gfc_default_real_kind;
1152 result = gfc_copy_expr (a);
1153 gfc_convert_boz (result, &ts);
1156 result = gfc_int2real (a, gfc_default_real_kind);
1157 return range_check (result, "FLOAT");
1162 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
1168 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1170 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1172 if (e->expr_type != EXPR_CONSTANT)
1175 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1177 gfc_set_model_kind (kind);
1179 mpfr_floor (floor, e->value.real);
1181 gfc_mpfr_to_mpz (result->value.integer, floor);
1185 return range_check (result, "FLOOR");
1190 gfc_simplify_fraction (gfc_expr *x)
1193 mpfr_t absv, exp, pow2;
1195 if (x->expr_type != EXPR_CONSTANT)
1198 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1200 gfc_set_model_kind (x->ts.kind);
1202 if (mpfr_sgn (x->value.real) == 0)
1204 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1212 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1213 mpfr_log2 (exp, absv, GFC_RND_MODE);
1215 mpfr_trunc (exp, exp);
1216 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1218 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1220 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1226 return range_check (result, "FRACTION");
1231 gfc_simplify_gamma (gfc_expr *x)
1235 if (x->expr_type != EXPR_CONSTANT)
1238 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1240 gfc_set_model_kind (x->ts.kind);
1242 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
1244 return range_check (result, "GAMMA");
1249 gfc_simplify_huge (gfc_expr *e)
1254 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1256 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1261 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1265 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1275 /* We use the processor's collating sequence, because all
1276 systems that gfortran currently works on are ASCII. */
1279 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
1284 if (e->expr_type != EXPR_CONSTANT)
1287 if (e->value.character.length != 1)
1289 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1290 return &gfc_bad_expr;
1293 index = (unsigned char) e->value.character.string[0];
1295 if (gfc_option.warn_surprising && index > 127)
1296 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
1299 if ((result = int_expr_with_kind (index, kind, "IACHAR")) == NULL)
1300 return &gfc_bad_expr;
1302 result->where = e->where;
1304 return range_check (result, "IACHAR");
1309 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
1313 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1316 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1318 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1320 return range_check (result, "IAND");
1325 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
1330 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1333 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1335 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1336 return &gfc_bad_expr;
1339 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1341 if (pos >= gfc_integer_kinds[k].bit_size)
1343 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1345 return &gfc_bad_expr;
1348 result = gfc_copy_expr (x);
1350 convert_mpz_to_unsigned (result->value.integer,
1351 gfc_integer_kinds[k].bit_size);
1353 mpz_clrbit (result->value.integer, pos);
1355 convert_mpz_to_signed (result->value.integer,
1356 gfc_integer_kinds[k].bit_size);
1358 return range_check (result, "IBCLR");
1363 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
1370 if (x->expr_type != EXPR_CONSTANT
1371 || y->expr_type != EXPR_CONSTANT
1372 || z->expr_type != EXPR_CONSTANT)
1375 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1377 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1378 return &gfc_bad_expr;
1381 if (gfc_extract_int (z, &len) != NULL || len < 0)
1383 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1384 return &gfc_bad_expr;
1387 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1389 bitsize = gfc_integer_kinds[k].bit_size;
1391 if (pos + len > bitsize)
1393 gfc_error ("Sum of second and third arguments of IBITS exceeds "
1394 "bit size at %L", &y->where);
1395 return &gfc_bad_expr;
1398 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1400 bits = gfc_getmem (bitsize * sizeof (int));
1402 for (i = 0; i < bitsize; i++)
1405 for (i = 0; i < len; i++)
1406 bits[i] = mpz_tstbit (x->value.integer, i + pos);
1408 for (i = 0; i < bitsize; i++)
1411 mpz_clrbit (result->value.integer, i);
1412 else if (bits[i] == 1)
1413 mpz_setbit (result->value.integer, i);
1415 gfc_internal_error ("IBITS: Bad bit");
1420 return range_check (result, "IBITS");
1425 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
1430 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1433 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1435 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1436 return &gfc_bad_expr;
1439 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1441 if (pos >= gfc_integer_kinds[k].bit_size)
1443 gfc_error ("Second argument of IBSET exceeds bit size at %L",
1445 return &gfc_bad_expr;
1448 result = gfc_copy_expr (x);
1450 convert_mpz_to_unsigned (result->value.integer,
1451 gfc_integer_kinds[k].bit_size);
1453 mpz_setbit (result->value.integer, pos);
1455 convert_mpz_to_signed (result->value.integer,
1456 gfc_integer_kinds[k].bit_size);
1458 return range_check (result, "IBSET");
1463 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
1468 if (e->expr_type != EXPR_CONSTANT)
1471 if (e->value.character.length != 1)
1473 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1474 return &gfc_bad_expr;
1477 index = (unsigned char) e->value.character.string[0];
1479 if (index < 0 || index > UCHAR_MAX)
1480 gfc_internal_error("Argument of ICHAR at %L out of range", &e->where);
1482 if ((result = int_expr_with_kind (index, kind, "ICHAR")) == NULL)
1483 return &gfc_bad_expr;
1485 result->where = e->where;
1486 return range_check (result, "ICHAR");
1491 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
1495 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1498 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1500 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1502 return range_check (result, "IEOR");
1507 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
1510 int back, len, lensub;
1511 int i, j, k, count, index = 0, start;
1513 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1516 if (b != NULL && b->value.logical != 0)
1521 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
1523 return &gfc_bad_expr;
1525 result = gfc_constant_result (BT_INTEGER, k, &x->where);
1527 len = x->value.character.length;
1528 lensub = y->value.character.length;
1532 mpz_set_si (result->value.integer, 0);
1540 mpz_set_si (result->value.integer, 1);
1543 else if (lensub == 1)
1545 for (i = 0; i < len; i++)
1547 for (j = 0; j < lensub; j++)
1549 if (y->value.character.string[j]
1550 == x->value.character.string[i])
1560 for (i = 0; i < len; i++)
1562 for (j = 0; j < lensub; j++)
1564 if (y->value.character.string[j]
1565 == x->value.character.string[i])
1570 for (k = 0; k < lensub; k++)
1572 if (y->value.character.string[k]
1573 == x->value.character.string[k + start])
1577 if (count == lensub)
1592 mpz_set_si (result->value.integer, len + 1);
1595 else if (lensub == 1)
1597 for (i = 0; i < len; i++)
1599 for (j = 0; j < lensub; j++)
1601 if (y->value.character.string[j]
1602 == x->value.character.string[len - i])
1604 index = len - i + 1;
1612 for (i = 0; i < len; i++)
1614 for (j = 0; j < lensub; j++)
1616 if (y->value.character.string[j]
1617 == x->value.character.string[len - i])
1620 if (start <= len - lensub)
1623 for (k = 0; k < lensub; k++)
1624 if (y->value.character.string[k]
1625 == x->value.character.string[k + start])
1628 if (count == lensub)
1645 mpz_set_si (result->value.integer, index);
1646 return range_check (result, "INDEX");
1651 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
1653 gfc_expr *rpart, *rtrunc, *result;
1656 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1658 return &gfc_bad_expr;
1660 if (e->expr_type != EXPR_CONSTANT)
1663 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1668 mpz_set (result->value.integer, e->value.integer);
1672 rtrunc = gfc_copy_expr (e);
1673 mpfr_trunc (rtrunc->value.real, e->value.real);
1674 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1675 gfc_free_expr (rtrunc);
1679 rpart = gfc_complex2real (e, kind);
1680 rtrunc = gfc_copy_expr (rpart);
1681 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1682 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1683 gfc_free_expr (rpart);
1684 gfc_free_expr (rtrunc);
1688 gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1689 gfc_free_expr (result);
1690 return &gfc_bad_expr;
1693 return range_check (result, "INT");
1698 gfc_simplify_intconv (gfc_expr *e, int kind, const char *name)
1700 gfc_expr *rpart, *rtrunc, *result;
1702 if (e->expr_type != EXPR_CONSTANT)
1705 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1710 mpz_set (result->value.integer, e->value.integer);
1714 rtrunc = gfc_copy_expr (e);
1715 mpfr_trunc (rtrunc->value.real, e->value.real);
1716 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1717 gfc_free_expr (rtrunc);
1721 rpart = gfc_complex2real (e, kind);
1722 rtrunc = gfc_copy_expr (rpart);
1723 mpfr_trunc (rtrunc->value.real, rpart->value.real);
1724 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1725 gfc_free_expr (rpart);
1726 gfc_free_expr (rtrunc);
1730 gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
1731 gfc_free_expr (result);
1732 return &gfc_bad_expr;
1735 return range_check (result, name);
1740 gfc_simplify_int2 (gfc_expr *e)
1742 return gfc_simplify_intconv (e, 2, "INT2");
1747 gfc_simplify_int8 (gfc_expr *e)
1749 return gfc_simplify_intconv (e, 8, "INT8");
1754 gfc_simplify_long (gfc_expr *e)
1756 return gfc_simplify_intconv (e, 4, "LONG");
1761 gfc_simplify_ifix (gfc_expr *e)
1763 gfc_expr *rtrunc, *result;
1765 if (e->expr_type != EXPR_CONSTANT)
1768 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1771 rtrunc = gfc_copy_expr (e);
1773 mpfr_trunc (rtrunc->value.real, e->value.real);
1774 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1776 gfc_free_expr (rtrunc);
1777 return range_check (result, "IFIX");
1782 gfc_simplify_idint (gfc_expr *e)
1784 gfc_expr *rtrunc, *result;
1786 if (e->expr_type != EXPR_CONSTANT)
1789 result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1792 rtrunc = gfc_copy_expr (e);
1794 mpfr_trunc (rtrunc->value.real, e->value.real);
1795 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1797 gfc_free_expr (rtrunc);
1798 return range_check (result, "IDINT");
1803 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
1807 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1810 result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1812 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1813 return range_check (result, "IOR");
1818 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
1821 int shift, ashift, isize, k, *bits, i;
1823 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1826 if (gfc_extract_int (s, &shift) != NULL)
1828 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1829 return &gfc_bad_expr;
1832 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1834 isize = gfc_integer_kinds[k].bit_size;
1843 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
1844 "at %L", &s->where);
1845 return &gfc_bad_expr;
1848 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1852 mpz_set (result->value.integer, e->value.integer);
1853 return range_check (result, "ISHFT");
1856 bits = gfc_getmem (isize * sizeof (int));
1858 for (i = 0; i < isize; i++)
1859 bits[i] = mpz_tstbit (e->value.integer, i);
1863 for (i = 0; i < shift; i++)
1864 mpz_clrbit (result->value.integer, i);
1866 for (i = 0; i < isize - shift; i++)
1869 mpz_clrbit (result->value.integer, i + shift);
1871 mpz_setbit (result->value.integer, i + shift);
1876 for (i = isize - 1; i >= isize - ashift; i--)
1877 mpz_clrbit (result->value.integer, i);
1879 for (i = isize - 1; i >= ashift; i--)
1882 mpz_clrbit (result->value.integer, i - ashift);
1884 mpz_setbit (result->value.integer, i - ashift);
1888 convert_mpz_to_signed (result->value.integer, isize);
1896 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
1899 int shift, ashift, isize, ssize, delta, k;
1902 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1905 if (gfc_extract_int (s, &shift) != NULL)
1907 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
1908 return &gfc_bad_expr;
1911 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1912 isize = gfc_integer_kinds[k].bit_size;
1916 if (sz->expr_type != EXPR_CONSTANT)
1919 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
1921 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
1922 return &gfc_bad_expr;
1927 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
1928 "BIT_SIZE of first argument at %L", &s->where);
1929 return &gfc_bad_expr;
1943 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
1944 "third argument at %L", &s->where);
1946 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
1947 "BIT_SIZE of first argument at %L", &s->where);
1948 return &gfc_bad_expr;
1951 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1953 mpz_set (result->value.integer, e->value.integer);
1958 convert_mpz_to_unsigned (result->value.integer, isize);
1960 bits = gfc_getmem (ssize * sizeof (int));
1962 for (i = 0; i < ssize; i++)
1963 bits[i] = mpz_tstbit (e->value.integer, i);
1965 delta = ssize - ashift;
1969 for (i = 0; i < delta; i++)
1972 mpz_clrbit (result->value.integer, i + shift);
1974 mpz_setbit (result->value.integer, i + shift);
1977 for (i = delta; i < ssize; i++)
1980 mpz_clrbit (result->value.integer, i - delta);
1982 mpz_setbit (result->value.integer, i - delta);
1987 for (i = 0; i < ashift; i++)
1990 mpz_clrbit (result->value.integer, i + delta);
1992 mpz_setbit (result->value.integer, i + delta);
1995 for (i = ashift; i < ssize; i++)
1998 mpz_clrbit (result->value.integer, i + shift);
2000 mpz_setbit (result->value.integer, i + shift);
2004 convert_mpz_to_signed (result->value.integer, isize);
2012 gfc_simplify_kind (gfc_expr *e)
2015 if (e->ts.type == BT_DERIVED)
2017 gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
2018 return &gfc_bad_expr;
2021 return gfc_int_expr (e->ts.kind);
2026 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2029 gfc_expr *l, *u, *result;
2032 /* The last dimension of an assumed-size array is special. */
2033 if (d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2035 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2036 return gfc_copy_expr (as->lower[d-1]);
2041 /* Then, we need to know the extent of the given dimension. */
2045 if (l->expr_type != EXPR_CONSTANT || u->expr_type != EXPR_CONSTANT)
2048 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2049 gfc_default_integer_kind);
2051 return &gfc_bad_expr;
2053 result = gfc_constant_result (BT_INTEGER, k, &array->where);
2055 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2059 mpz_set_si (result->value.integer, 0);
2061 mpz_set_si (result->value.integer, 1);
2065 /* Nonzero extent. */
2067 mpz_set (result->value.integer, u->value.integer);
2069 mpz_set (result->value.integer, l->value.integer);
2072 return range_check (result, upper ? "UBOUND" : "LBOUND");
2077 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
2083 if (array->expr_type != EXPR_VARIABLE)
2086 /* Follow any component references. */
2087 as = array->symtree->n.sym->as;
2088 for (ref = array->ref; ref; ref = ref->next)
2093 switch (ref->u.ar.type)
2100 /* We're done because 'as' has already been set in the
2101 previous iteration. */
2112 as = ref->u.c.component->as;
2124 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
2129 /* Multi-dimensional bounds. */
2130 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
2132 gfc_constructor *head, *tail;
2135 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
2136 if (upper && as->type == AS_ASSUMED_SIZE)
2138 /* An error message will be emitted in
2139 check_assumed_size_reference (resolve.c). */
2140 return &gfc_bad_expr;
2143 /* Simplify the bounds for each dimension. */
2144 for (d = 0; d < array->rank; d++)
2146 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as);
2147 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
2151 for (j = 0; j < d; j++)
2152 gfc_free_expr (bounds[j]);
2157 /* Allocate the result expression. */
2158 e = gfc_get_expr ();
2159 e->where = array->where;
2160 e->expr_type = EXPR_ARRAY;
2161 e->ts.type = BT_INTEGER;
2162 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2163 gfc_default_integer_kind);
2165 return &gfc_bad_expr;
2168 /* The result is a rank 1 array; its size is the rank of the first
2169 argument to {L,U}BOUND. */
2171 e->shape = gfc_get_shape (1);
2172 mpz_init_set_ui (e->shape[0], array->rank);
2174 /* Create the constructor for this array. */
2176 for (d = 0; d < array->rank; d++)
2178 /* Get a new constructor element. */
2180 head = tail = gfc_get_constructor ();
2183 tail->next = gfc_get_constructor ();
2187 tail->where = e->where;
2188 tail->expr = bounds[d];
2190 e->value.constructor = head;
2196 /* A DIM argument is specified. */
2197 if (dim->expr_type != EXPR_CONSTANT)
2200 d = mpz_get_si (dim->value.integer);
2202 if (d < 1 || d > as->rank
2203 || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
2205 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
2206 return &gfc_bad_expr;
2209 return simplify_bound_dim (array, kind, d, upper, as);
2215 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2217 return simplify_bound (array, dim, kind, 0);
2222 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
2225 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
2228 return &gfc_bad_expr;
2230 if (e->expr_type == EXPR_CONSTANT)
2232 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2233 mpz_set_si (result->value.integer, e->value.character.length);
2234 return range_check (result, "LEN");
2237 if (e->ts.cl != NULL && e->ts.cl->length != NULL
2238 && e->ts.cl->length->expr_type == EXPR_CONSTANT
2239 && e->ts.cl->length->ts.type == BT_INTEGER)
2241 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2242 mpz_set (result->value.integer, e->ts.cl->length->value.integer);
2243 return range_check (result, "LEN");
2251 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
2254 int count, len, lentrim, i;
2255 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
2258 return &gfc_bad_expr;
2260 if (e->expr_type != EXPR_CONSTANT)
2263 result = gfc_constant_result (BT_INTEGER, k, &e->where);
2264 len = e->value.character.length;
2266 for (count = 0, i = 1; i <= len; i++)
2267 if (e->value.character.string[len - i] == ' ')
2272 lentrim = len - count;
2274 mpz_set_si (result->value.integer, lentrim);
2275 return range_check (result, "LEN_TRIM");
2279 gfc_simplify_lgamma (gfc_expr *x __attribute__((unused)))
2281 #if MPFR_VERSION >= MPFR_VERSION_NUM(2,3,0)
2285 if (x->expr_type != EXPR_CONSTANT)
2288 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2290 gfc_set_model_kind (x->ts.kind);
2292 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
2294 return range_check (result, "LGAMMA");
2302 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
2304 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2307 return gfc_logical_expr (gfc_compare_string (a, b) >= 0, &a->where);
2312 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
2314 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2317 return gfc_logical_expr (gfc_compare_string (a, b) > 0,
2323 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
2325 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2328 return gfc_logical_expr (gfc_compare_string (a, b) <= 0, &a->where);
2333 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
2335 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2338 return gfc_logical_expr (gfc_compare_string (a, b) < 0, &a->where);
2343 gfc_simplify_log (gfc_expr *x)
2348 if (x->expr_type != EXPR_CONSTANT)
2351 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2353 gfc_set_model_kind (x->ts.kind);
2358 if (mpfr_sgn (x->value.real) <= 0)
2360 gfc_error ("Argument of LOG at %L cannot be less than or equal "
2361 "to zero", &x->where);
2362 gfc_free_expr (result);
2363 return &gfc_bad_expr;
2366 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
2370 if ((mpfr_sgn (x->value.complex.r) == 0)
2371 && (mpfr_sgn (x->value.complex.i) == 0))
2373 gfc_error ("Complex argument of LOG at %L cannot be zero",
2375 gfc_free_expr (result);
2376 return &gfc_bad_expr;
2382 mpfr_atan2 (result->value.complex.i, x->value.complex.i,
2383 x->value.complex.r, GFC_RND_MODE);
2385 mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2386 mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2387 mpfr_add (xr, xr, xi, GFC_RND_MODE);
2388 mpfr_sqrt (xr, xr, GFC_RND_MODE);
2389 mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2397 gfc_internal_error ("gfc_simplify_log: bad type");
2400 return range_check (result, "LOG");
2405 gfc_simplify_log10 (gfc_expr *x)
2409 if (x->expr_type != EXPR_CONSTANT)
2412 gfc_set_model_kind (x->ts.kind);
2414 if (mpfr_sgn (x->value.real) <= 0)
2416 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
2417 "to zero", &x->where);
2418 return &gfc_bad_expr;
2421 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2423 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2425 return range_check (result, "LOG10");
2430 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
2435 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2437 return &gfc_bad_expr;
2439 if (e->expr_type != EXPR_CONSTANT)
2442 result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2444 result->value.logical = e->value.logical;
2450 /* This function is special since MAX() can take any number of
2451 arguments. The simplified expression is a rewritten version of the
2452 argument list containing at most one constant element. Other
2453 constant elements are deleted. Because the argument list has
2454 already been checked, this function always succeeds. sign is 1 for
2455 MAX(), -1 for MIN(). */
2458 simplify_min_max (gfc_expr *expr, int sign)
2460 gfc_actual_arglist *arg, *last, *extremum;
2461 gfc_intrinsic_sym * specific;
2465 specific = expr->value.function.isym;
2467 arg = expr->value.function.actual;
2469 for (; arg; last = arg, arg = arg->next)
2471 if (arg->expr->expr_type != EXPR_CONSTANT)
2474 if (extremum == NULL)
2480 switch (arg->expr->ts.type)
2483 if (mpz_cmp (arg->expr->value.integer,
2484 extremum->expr->value.integer) * sign > 0)
2485 mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2489 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
2491 mpfr_max (extremum->expr->value.real, extremum->expr->value.real,
2492 arg->expr->value.real, GFC_RND_MODE);
2494 mpfr_min (extremum->expr->value.real, extremum->expr->value.real,
2495 arg->expr->value.real, GFC_RND_MODE);
2499 #define LENGTH(x) ((x)->expr->value.character.length)
2500 #define STRING(x) ((x)->expr->value.character.string)
2501 if (LENGTH(extremum) < LENGTH(arg))
2503 char * tmp = STRING(extremum);
2505 STRING(extremum) = gfc_getmem (LENGTH(arg) + 1);
2506 memcpy (STRING(extremum), tmp, LENGTH(extremum));
2507 memset (&STRING(extremum)[LENGTH(extremum)], ' ',
2508 LENGTH(arg) - LENGTH(extremum));
2509 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
2510 LENGTH(extremum) = LENGTH(arg);
2514 if (gfc_compare_string (arg->expr, extremum->expr) * sign > 0)
2516 gfc_free (STRING(extremum));
2517 STRING(extremum) = gfc_getmem (LENGTH(extremum) + 1);
2518 memcpy (STRING(extremum), STRING(arg), LENGTH(arg));
2519 memset (&STRING(extremum)[LENGTH(arg)], ' ',
2520 LENGTH(extremum) - LENGTH(arg));
2521 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
2529 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
2532 /* Delete the extra constant argument. */
2534 expr->value.function.actual = arg->next;
2536 last->next = arg->next;
2539 gfc_free_actual_arglist (arg);
2543 /* If there is one value left, replace the function call with the
2545 if (expr->value.function.actual->next != NULL)
2548 /* Convert to the correct type and kind. */
2549 if (expr->ts.type != BT_UNKNOWN)
2550 return gfc_convert_constant (expr->value.function.actual->expr,
2551 expr->ts.type, expr->ts.kind);
2553 if (specific->ts.type != BT_UNKNOWN)
2554 return gfc_convert_constant (expr->value.function.actual->expr,
2555 specific->ts.type, specific->ts.kind);
2557 return gfc_copy_expr (expr->value.function.actual->expr);
2562 gfc_simplify_min (gfc_expr *e)
2564 return simplify_min_max (e, -1);
2569 gfc_simplify_max (gfc_expr *e)
2571 return simplify_min_max (e, 1);
2576 gfc_simplify_maxexponent (gfc_expr *x)
2581 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2583 result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2584 result->where = x->where;
2591 gfc_simplify_minexponent (gfc_expr *x)
2596 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2598 result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2599 result->where = x->where;
2606 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
2609 mpfr_t quot, iquot, term;
2612 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2615 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2616 result = gfc_constant_result (a->ts.type, kind, &a->where);
2621 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2623 /* Result is processor-dependent. */
2624 gfc_error ("Second argument MOD at %L is zero", &a->where);
2625 gfc_free_expr (result);
2626 return &gfc_bad_expr;
2628 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2632 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2634 /* Result is processor-dependent. */
2635 gfc_error ("Second argument of MOD at %L is zero", &p->where);
2636 gfc_free_expr (result);
2637 return &gfc_bad_expr;
2640 gfc_set_model_kind (kind);
2645 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2646 mpfr_trunc (iquot, quot);
2647 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2648 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2656 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2659 return range_check (result, "MOD");
2664 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
2667 mpfr_t quot, iquot, term;
2670 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2673 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2674 result = gfc_constant_result (a->ts.type, kind, &a->where);
2679 if (mpz_cmp_ui (p->value.integer, 0) == 0)
2681 /* Result is processor-dependent. This processor just opts
2682 to not handle it at all. */
2683 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2684 gfc_free_expr (result);
2685 return &gfc_bad_expr;
2687 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2692 if (mpfr_cmp_ui (p->value.real, 0) == 0)
2694 /* Result is processor-dependent. */
2695 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2696 gfc_free_expr (result);
2697 return &gfc_bad_expr;
2700 gfc_set_model_kind (kind);
2705 mpfr_div (quot, a->value.real, p->value.real, GFC_RND_MODE);
2706 mpfr_floor (iquot, quot);
2707 mpfr_mul (term, iquot, p->value.real, GFC_RND_MODE);
2708 mpfr_sub (result->value.real, a->value.real, term, GFC_RND_MODE);
2716 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2719 return range_check (result, "MODULO");
2723 /* Exists for the sole purpose of consistency with other intrinsics. */
2725 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
2726 gfc_expr *fp ATTRIBUTE_UNUSED,
2727 gfc_expr *l ATTRIBUTE_UNUSED,
2728 gfc_expr *to ATTRIBUTE_UNUSED,
2729 gfc_expr *tp ATTRIBUTE_UNUSED)
2736 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
2739 mp_exp_t emin, emax;
2742 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2745 if (mpfr_sgn (s->value.real) == 0)
2747 gfc_error ("Second argument of NEAREST at %L shall not be zero",
2749 return &gfc_bad_expr;
2752 gfc_set_model_kind (x->ts.kind);
2753 result = gfc_copy_expr (x);
2755 /* Save current values of emin and emax. */
2756 emin = mpfr_get_emin ();
2757 emax = mpfr_get_emax ();
2759 /* Set emin and emax for the current model number. */
2760 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2761 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
2762 mpfr_get_prec(result->value.real) + 1);
2763 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
2765 if (mpfr_sgn (s->value.real) > 0)
2767 mpfr_nextabove (result->value.real);
2768 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
2772 mpfr_nextbelow (result->value.real);
2773 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
2776 mpfr_set_emin (emin);
2777 mpfr_set_emax (emax);
2779 /* Only NaN can occur. Do not use range check as it gives an
2780 error for denormal numbers. */
2781 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
2783 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
2784 return &gfc_bad_expr;
2792 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
2794 gfc_expr *itrunc, *result;
2797 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2799 return &gfc_bad_expr;
2801 if (e->expr_type != EXPR_CONSTANT)
2804 result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2806 itrunc = gfc_copy_expr (e);
2808 mpfr_round (itrunc->value.real, e->value.real);
2810 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2812 gfc_free_expr (itrunc);
2814 return range_check (result, name);
2819 gfc_simplify_new_line (gfc_expr *e)
2823 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2824 result->value.character.string = gfc_getmem (2);
2825 result->value.character.length = 1;
2826 result->value.character.string[0] = '\n';
2827 result->value.character.string[1] = '\0'; /* For debugger */
2833 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
2835 return simplify_nint ("NINT", e, k);
2840 gfc_simplify_idnint (gfc_expr *e)
2842 return simplify_nint ("IDNINT", e, NULL);
2847 gfc_simplify_not (gfc_expr *e)
2851 if (e->expr_type != EXPR_CONSTANT)
2854 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2856 mpz_com (result->value.integer, e->value.integer);
2858 return range_check (result, "NOT");
2863 gfc_simplify_null (gfc_expr *mold)
2869 result = gfc_get_expr ();
2870 result->ts.type = BT_UNKNOWN;
2873 result = gfc_copy_expr (mold);
2874 result->expr_type = EXPR_NULL;
2881 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
2886 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2889 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2890 if (x->ts.type == BT_INTEGER)
2892 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
2893 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2895 else /* BT_LOGICAL */
2897 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
2898 result->value.logical = x->value.logical || y->value.logical;
2901 return range_check (result, "OR");
2906 gfc_simplify_precision (gfc_expr *e)
2911 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2913 result = gfc_int_expr (gfc_real_kinds[i].precision);
2914 result->where = e->where;
2921 gfc_simplify_radix (gfc_expr *e)
2926 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2930 i = gfc_integer_kinds[i].radix;
2934 i = gfc_real_kinds[i].radix;
2941 result = gfc_int_expr (i);
2942 result->where = e->where;
2949 gfc_simplify_range (gfc_expr *e)
2955 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2960 j = gfc_integer_kinds[i].range;
2965 j = gfc_real_kinds[i].range;
2972 result = gfc_int_expr (j);
2973 result->where = e->where;
2980 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
2985 if (e->ts.type == BT_COMPLEX)
2986 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
2988 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
2991 return &gfc_bad_expr;
2993 if (e->expr_type != EXPR_CONSTANT)
3000 result = gfc_int2real (e, kind);
3004 result = gfc_real2real (e, kind);
3008 result = gfc_complex2real (e, kind);
3012 gfc_internal_error ("bad type in REAL");
3016 if (e->ts.type == BT_INTEGER && e->is_boz)
3021 result = gfc_copy_expr (e);
3022 gfc_convert_boz (result, &ts);
3024 return range_check (result, "REAL");
3029 gfc_simplify_realpart (gfc_expr *e)
3033 if (e->expr_type != EXPR_CONSTANT)
3036 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3037 mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
3039 return range_check (result, "REALPART");
3043 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
3046 int i, j, len, ncop, nlen;
3048 bool have_length = false;
3050 /* If NCOPIES isn't a constant, there's nothing we can do. */
3051 if (n->expr_type != EXPR_CONSTANT)
3054 /* If NCOPIES is negative, it's an error. */
3055 if (mpz_sgn (n->value.integer) < 0)
3057 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
3059 return &gfc_bad_expr;
3062 /* If we don't know the character length, we can do no more. */
3063 if (e->ts.cl && e->ts.cl->length
3064 && e->ts.cl->length->expr_type == EXPR_CONSTANT)
3066 len = mpz_get_si (e->ts.cl->length->value.integer);
3069 else if (e->expr_type == EXPR_CONSTANT
3070 && (e->ts.cl == NULL || e->ts.cl->length == NULL))
3072 len = e->value.character.length;
3077 /* If the source length is 0, any value of NCOPIES is valid
3078 and everything behaves as if NCOPIES == 0. */
3081 mpz_set_ui (ncopies, 0);
3083 mpz_set (ncopies, n->value.integer);
3085 /* Check that NCOPIES isn't too large. */
3091 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
3093 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3097 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
3098 e->ts.cl->length->value.integer);
3102 mpz_init_set_si (mlen, len);
3103 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
3107 /* The check itself. */
3108 if (mpz_cmp (ncopies, max) > 0)
3111 mpz_clear (ncopies);
3112 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
3114 return &gfc_bad_expr;
3119 mpz_clear (ncopies);
3121 /* For further simplification, we need the character string to be
3123 if (e->expr_type != EXPR_CONSTANT)
3126 if (len || mpz_sgn (e->ts.cl->length->value.integer) != 0)
3128 const char *res = gfc_extract_int (n, &ncop);
3129 gcc_assert (res == NULL);
3134 len = e->value.character.length;
3137 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3141 result->value.character.string = gfc_getmem (1);
3142 result->value.character.length = 0;
3143 result->value.character.string[0] = '\0';
3147 result->value.character.length = nlen;
3148 result->value.character.string = gfc_getmem (nlen + 1);
3150 for (i = 0; i < ncop; i++)
3151 for (j = 0; j < len; j++)
3152 result->value.character.string[j + i * len]
3153 = e->value.character.string[j];
3155 result->value.character.string[nlen] = '\0'; /* For debugger */
3160 /* This one is a bear, but mainly has to do with shuffling elements. */
3163 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
3164 gfc_expr *pad, gfc_expr *order_exp)
3166 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
3167 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
3168 gfc_constructor *head, *tail;
3174 /* Unpack the shape array. */
3175 if (source->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (source))
3178 if (shape_exp->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (shape_exp))
3182 && (pad->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (pad)))
3185 if (order_exp != NULL
3186 && (order_exp->expr_type != EXPR_ARRAY
3187 || !gfc_is_constant_expr (order_exp)))
3196 e = gfc_get_array_element (shape_exp, rank);
3200 if (gfc_extract_int (e, &shape[rank]) != NULL)
3202 gfc_error ("Integer too large in shape specification at %L",
3210 if (rank >= GFC_MAX_DIMENSIONS)
3212 gfc_error ("Too many dimensions in shape specification for RESHAPE "
3213 "at %L", &e->where);
3218 if (shape[rank] < 0)
3220 gfc_error ("Shape specification at %L cannot be negative",
3230 gfc_error ("Shape specification at %L cannot be the null array",
3235 /* Now unpack the order array if present. */
3236 if (order_exp == NULL)
3238 for (i = 0; i < rank; i++)
3243 for (i = 0; i < rank; i++)
3246 for (i = 0; i < rank; i++)
3248 e = gfc_get_array_element (order_exp, i);
3251 gfc_error ("ORDER parameter of RESHAPE at %L is not the same "
3252 "size as SHAPE parameter", &order_exp->where);
3256 if (gfc_extract_int (e, &order[i]) != NULL)
3258 gfc_error ("Error in ORDER parameter of RESHAPE at %L",
3266 if (order[i] < 1 || order[i] > rank)
3268 gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
3277 gfc_error ("Invalid permutation in ORDER parameter at %L",
3286 /* Count the elements in the source and padding arrays. */
3291 gfc_array_size (pad, &size);
3292 npad = mpz_get_ui (size);
3296 gfc_array_size (source, &size);
3297 nsource = mpz_get_ui (size);
3300 /* If it weren't for that pesky permutation we could just loop
3301 through the source and round out any shortage with pad elements.
3302 But no, someone just had to have the compiler do something the
3303 user should be doing. */
3305 for (i = 0; i < rank; i++)
3310 /* Figure out which element to extract. */
3311 mpz_set_ui (index, 0);
3313 for (i = rank - 1; i >= 0; i--)
3315 mpz_add_ui (index, index, x[order[i]]);
3317 mpz_mul_ui (index, index, shape[order[i - 1]]);
3320 if (mpz_cmp_ui (index, INT_MAX) > 0)
3321 gfc_internal_error ("Reshaped array too large at %L", &e->where);
3323 j = mpz_get_ui (index);
3326 e = gfc_get_array_element (source, j);
3333 gfc_error ("PAD parameter required for short SOURCE parameter "
3334 "at %L", &source->where);
3339 e = gfc_get_array_element (pad, j);
3343 head = tail = gfc_get_constructor ();
3346 tail->next = gfc_get_constructor ();
3353 tail->where = e->where;
3356 /* Calculate the next element. */
3360 if (++x[i] < shape[i])
3371 e = gfc_get_expr ();
3372 e->where = source->where;
3373 e->expr_type = EXPR_ARRAY;
3374 e->value.constructor = head;
3375 e->shape = gfc_get_shape (rank);
3377 for (i = 0; i < rank; i++)
3378 mpz_init_set_ui (e->shape[i], shape[i]);
3386 gfc_free_constructor (head);
3388 return &gfc_bad_expr;
3393 gfc_simplify_rrspacing (gfc_expr *x)
3399 if (x->expr_type != EXPR_CONSTANT)
3402 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3404 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3406 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3408 /* Special case x = -0 and 0. */
3409 if (mpfr_sgn (result->value.real) == 0)
3411 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3415 /* | x * 2**(-e) | * 2**p. */
3416 e = - (long int) mpfr_get_exp (x->value.real);
3417 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
3419 p = (long int) gfc_real_kinds[i].digits;
3420 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
3422 return range_check (result, "RRSPACING");
3427 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
3429 int k, neg_flag, power, exp_range;
3430 mpfr_t scale, radix;
3433 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3436 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3438 if (mpfr_sgn (x->value.real) == 0)
3440 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3444 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3446 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3448 /* This check filters out values of i that would overflow an int. */
3449 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3450 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3452 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3453 return &gfc_bad_expr;
3456 /* Compute scale = radix ** power. */
3457 power = mpz_get_si (i->value.integer);
3467 gfc_set_model_kind (x->ts.kind);
3470 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3471 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3474 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3476 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3481 return range_check (result, "SCALE");
3486 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
3491 size_t indx, len, lenc;
3492 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
3495 return &gfc_bad_expr;
3497 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3500 if (b != NULL && b->value.logical != 0)
3505 result = gfc_constant_result (BT_INTEGER, k, &e->where);
3507 len = e->value.character.length;
3508 lenc = c->value.character.length;
3510 if (len == 0 || lenc == 0)
3518 indx = strcspn (e->value.character.string, c->value.character.string)
3526 for (indx = len; indx > 0; indx--)
3528 for (i = 0; i < lenc; i++)
3530 if (c->value.character.string[i]
3531 == e->value.character.string[indx - 1])
3539 mpz_set_ui (result->value.integer, indx);
3540 return range_check (result, "SCAN");
3545 gfc_simplify_selected_int_kind (gfc_expr *e)
3550 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3555 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3556 if (gfc_integer_kinds[i].range >= range
3557 && gfc_integer_kinds[i].kind < kind)
3558 kind = gfc_integer_kinds[i].kind;
3560 if (kind == INT_MAX)
3563 result = gfc_int_expr (kind);
3564 result->where = e->where;
3571 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q)
3573 int range, precision, i, kind, found_precision, found_range;
3580 if (p->expr_type != EXPR_CONSTANT
3581 || gfc_extract_int (p, &precision) != NULL)
3589 if (q->expr_type != EXPR_CONSTANT
3590 || gfc_extract_int (q, &range) != NULL)
3595 found_precision = 0;
3598 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3600 if (gfc_real_kinds[i].precision >= precision)
3601 found_precision = 1;
3603 if (gfc_real_kinds[i].range >= range)
3606 if (gfc_real_kinds[i].precision >= precision
3607 && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3608 kind = gfc_real_kinds[i].kind;
3611 if (kind == INT_MAX)
3615 if (!found_precision)
3621 result = gfc_int_expr (kind);
3622 result->where = (p != NULL) ? p->where : q->where;
3629 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
3632 mpfr_t exp, absv, log2, pow2, frac;
3635 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3638 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3640 gfc_set_model_kind (x->ts.kind);
3642 if (mpfr_sgn (x->value.real) == 0)
3644 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3654 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3655 mpfr_log2 (log2, absv, GFC_RND_MODE);
3657 mpfr_trunc (log2, log2);
3658 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3660 /* Old exponent value, and fraction. */
3661 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3663 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3666 exp2 = (unsigned long) mpz_get_d (i->value.integer);
3667 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3674 return range_check (result, "SET_EXPONENT");
3679 gfc_simplify_shape (gfc_expr *source)
3681 mpz_t shape[GFC_MAX_DIMENSIONS];
3682 gfc_expr *result, *e, *f;
3687 if (source->rank == 0 || source->expr_type != EXPR_VARIABLE)
3690 result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3693 ar = gfc_find_array_ref (source);
3695 t = gfc_array_ref_shape (ar, shape);
3697 for (n = 0; n < source->rank; n++)
3699 e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3704 mpz_set (e->value.integer, shape[n]);
3705 mpz_clear (shape[n]);
3709 mpz_set_ui (e->value.integer, n + 1);
3711 f = gfc_simplify_size (source, e, NULL);
3715 gfc_free_expr (result);
3724 gfc_append_constructor (result, e);
3732 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3737 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
3740 return &gfc_bad_expr;
3744 if (gfc_array_size (array, &size) == FAILURE)
3749 if (dim->expr_type != EXPR_CONSTANT)
3752 d = mpz_get_ui (dim->value.integer) - 1;
3753 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
3757 result = gfc_constant_result (BT_INTEGER, k, &array->where);
3758 mpz_set (result->value.integer, size);
3764 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
3768 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3771 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3776 mpz_abs (result->value.integer, x->value.integer);
3777 if (mpz_sgn (y->value.integer) < 0)
3778 mpz_neg (result->value.integer, result->value.integer);
3783 /* TODO: Handle -0.0 and +0.0 correctly on machines that support
3785 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3786 if (mpfr_sgn (y->value.real) < 0)
3787 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
3792 gfc_internal_error ("Bad type in gfc_simplify_sign");
3800 gfc_simplify_sin (gfc_expr *x)
3805 if (x->expr_type != EXPR_CONSTANT)
3808 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3813 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
3817 gfc_set_model (x->value.real);
3821 mpfr_sin (xp, x->value.complex.r, GFC_RND_MODE);
3822 mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
3823 mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
3825 mpfr_cos (xp, x->value.complex.r, GFC_RND_MODE);
3826 mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
3827 mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
3834 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
3837 return range_check (result, "SIN");
3842 gfc_simplify_sinh (gfc_expr *x)
3846 if (x->expr_type != EXPR_CONSTANT)
3849 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
3851 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
3853 return range_check (result, "SINH");
3857 /* The argument is always a double precision real that is converted to
3858 single precision. TODO: Rounding! */
3861 gfc_simplify_sngl (gfc_expr *a)
3865 if (a->expr_type != EXPR_CONSTANT)
3868 result = gfc_real2real (a, gfc_default_real_kind);
3869 return range_check (result, "SNGL");
3874 gfc_simplify_spacing (gfc_expr *x)
3880 if (x->expr_type != EXPR_CONSTANT)
3883 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3885 result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3887 /* Special case x = 0 and -0. */
3888 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3889 if (mpfr_sgn (result->value.real) == 0)
3891 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
3895 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
3896 are the radix, exponent of x, and precision. This excludes the
3897 possibility of subnormal numbers. Fortran 2003 states the result is
3898 b**max(e - p, emin - 1). */
3900 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
3901 en = (long int) gfc_real_kinds[i].min_exponent - 1;
3902 en = en > ep ? en : ep;
3904 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
3905 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
3907 return range_check (result, "SPACING");
3912 gfc_simplify_sqrt (gfc_expr *e)
3915 mpfr_t ac, ad, s, t, w;
3917 if (e->expr_type != EXPR_CONSTANT)
3920 result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3925 if (mpfr_cmp_si (e->value.real, 0) < 0)
3927 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
3932 /* Formula taken from Numerical Recipes to avoid over- and
3935 gfc_set_model (e->value.real);
3942 if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
3943 && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
3945 mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
3946 mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
3950 mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
3951 mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
3953 if (mpfr_cmp (ac, ad) >= 0)
3955 mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
3956 mpfr_mul (t, t, t, GFC_RND_MODE);
3957 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3958 mpfr_sqrt (t, t, GFC_RND_MODE);
3959 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3960 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3961 mpfr_sqrt (t, t, GFC_RND_MODE);
3962 mpfr_sqrt (s, ac, GFC_RND_MODE);
3963 mpfr_mul (w, s, t, GFC_RND_MODE);
3967 mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
3968 mpfr_mul (t, s, s, GFC_RND_MODE);
3969 mpfr_add_ui (t, t, 1, GFC_RND_MODE);
3970 mpfr_sqrt (t, t, GFC_RND_MODE);
3971 mpfr_abs (s, s, GFC_RND_MODE);
3972 mpfr_add (t, t, s, GFC_RND_MODE);
3973 mpfr_div_ui (t, t, 2, GFC_RND_MODE);
3974 mpfr_sqrt (t, t, GFC_RND_MODE);
3975 mpfr_sqrt (s, ad, GFC_RND_MODE);
3976 mpfr_mul (w, s, t, GFC_RND_MODE);
3979 if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
3981 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3982 mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
3983 mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
3985 else if (mpfr_cmp_ui (w, 0) != 0
3986 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3987 && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
3989 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3990 mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
3991 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
3993 else if (mpfr_cmp_ui (w, 0) != 0
3994 && mpfr_cmp_ui (e->value.complex.r, 0) < 0
3995 && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
3997 mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
3998 mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
3999 mpfr_neg (w, w, GFC_RND_MODE);
4000 mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4003 gfc_internal_error ("invalid complex argument of SQRT at %L",
4015 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
4018 return range_check (result, "SQRT");
4021 gfc_free_expr (result);
4022 gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
4023 return &gfc_bad_expr;
4028 gfc_simplify_tan (gfc_expr *x)
4033 if (x->expr_type != EXPR_CONSTANT)
4036 i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4038 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4040 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
4042 return range_check (result, "TAN");
4047 gfc_simplify_tanh (gfc_expr *x)
4051 if (x->expr_type != EXPR_CONSTANT)
4054 result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4056 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
4058 return range_check (result, "TANH");
4064 gfc_simplify_tiny (gfc_expr *e)
4069 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
4071 result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
4072 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4079 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
4082 gfc_expr *mold_element;
4085 size_t result_elt_size;
4088 unsigned char *buffer;
4090 if (!gfc_is_constant_expr (source)
4091 || !gfc_is_constant_expr (size))
4094 if (source->expr_type == EXPR_FUNCTION)
4097 /* Calculate the size of the source. */
4098 if (source->expr_type == EXPR_ARRAY
4099 && gfc_array_size (source, &tmp) == FAILURE)
4100 gfc_internal_error ("Failure getting length of a constant array.");
4102 source_size = gfc_target_expr_size (source);
4104 /* Create an empty new expression with the appropriate characteristics. */
4105 result = gfc_constant_result (mold->ts.type, mold->ts.kind,
4107 result->ts = mold->ts;
4109 mold_element = mold->expr_type == EXPR_ARRAY
4110 ? mold->value.constructor->expr
4113 /* Set result character length, if needed. Note that this needs to be
4114 set even for array expressions, in order to pass this information into
4115 gfc_target_interpret_expr. */
4116 if (result->ts.type == BT_CHARACTER)
4117 result->value.character.length = mold_element->value.character.length;
4119 /* Set the number of elements in the result, and determine its size. */
4120 result_elt_size = gfc_target_expr_size (mold_element);
4121 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
4125 result->expr_type = EXPR_ARRAY;
4129 result_length = (size_t)mpz_get_ui (size->value.integer);
4132 result_length = source_size / result_elt_size;
4133 if (result_length * result_elt_size < source_size)
4137 result->shape = gfc_get_shape (1);
4138 mpz_init_set_ui (result->shape[0], result_length);
4140 result_size = result_length * result_elt_size;
4145 result_size = result_elt_size;
4148 if (gfc_option.warn_surprising && source_size < result_size)
4149 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
4150 "source size %ld < result size %ld", &source->where,
4151 (long) source_size, (long) result_size);
4153 /* Allocate the buffer to store the binary version of the source. */
4154 buffer_size = MAX (source_size, result_size);
4155 buffer = (unsigned char*)alloca (buffer_size);
4157 /* Now write source to the buffer. */
4158 gfc_target_encode_expr (source, buffer, buffer_size);
4160 /* And read the buffer back into the new expression. */
4161 gfc_target_interpret_expr (buffer, buffer_size, result);
4168 gfc_simplify_trim (gfc_expr *e)
4171 int count, i, len, lentrim;
4173 if (e->expr_type != EXPR_CONSTANT)
4176 len = e->value.character.length;
4178 result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
4180 for (count = 0, i = 1; i <= len; ++i)
4182 if (e->value.character.string[len - i] == ' ')
4188 lentrim = len - count;
4190 result->value.character.length = lentrim;
4191 result->value.character.string = gfc_getmem (lentrim + 1);
4193 for (i = 0; i < lentrim; i++)
4194 result->value.character.string[i] = e->value.character.string[i];
4196 result->value.character.string[lentrim] = '\0'; /* For debugger */
4203 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4205 return simplify_bound (array, dim, kind, 1);
4210 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
4214 size_t index, len, lenset;
4216 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
4219 return &gfc_bad_expr;
4221 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
4224 if (b != NULL && b->value.logical != 0)
4229 result = gfc_constant_result (BT_INTEGER, k, &s->where);
4231 len = s->value.character.length;
4232 lenset = set->value.character.length;
4236 mpz_set_ui (result->value.integer, 0);
4244 mpz_set_ui (result->value.integer, 1);
4248 index = strspn (s->value.character.string, set->value.character.string)
4258 mpz_set_ui (result->value.integer, len);
4261 for (index = len; index > 0; index --)
4263 for (i = 0; i < lenset; i++)
4265 if (s->value.character.string[index - 1]
4266 == set->value.character.string[i])
4274 mpz_set_ui (result->value.integer, index);
4280 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
4285 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4288 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4289 if (x->ts.type == BT_INTEGER)
4291 result = gfc_constant_result (BT_INTEGER, kind, &x->where);
4292 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
4294 else /* BT_LOGICAL */
4296 result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
4297 result->value.logical = (x->value.logical && !y->value.logical)
4298 || (!x->value.logical && y->value.logical);
4301 return range_check (result, "XOR");
4305 /****************** Constant simplification *****************/
4307 /* Master function to convert one constant to another. While this is
4308 used as a simplification function, it requires the destination type
4309 and kind information which is supplied by a special case in
4313 gfc_convert_constant (gfc_expr *e, bt type, int kind)
4315 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
4316 gfc_constructor *head, *c, *tail = NULL;
4330 f = gfc_int2complex;
4350 f = gfc_real2complex;
4361 f = gfc_complex2int;
4364 f = gfc_complex2real;
4367 f = gfc_complex2complex;
4393 f = gfc_hollerith2int;
4397 f = gfc_hollerith2real;
4401 f = gfc_hollerith2complex;
4405 f = gfc_hollerith2character;
4409 f = gfc_hollerith2logical;
4419 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4424 switch (e->expr_type)
4427 result = f (e, kind);
4429 return &gfc_bad_expr;
4433 if (!gfc_is_constant_expr (e))
4438 for (c = e->value.constructor; c; c = c->next)
4441 head = tail = gfc_get_constructor ();
4444 tail->next = gfc_get_constructor ();
4448 tail->where = c->where;
4450 if (c->iterator == NULL)
4451 tail->expr = f (c->expr, kind);
4454 g = gfc_convert_constant (c->expr, type, kind);
4455 if (g == &gfc_bad_expr)
4460 if (tail->expr == NULL)
4462 gfc_free_constructor (head);
4467 result = gfc_get_expr ();
4468 result->ts.type = type;
4469 result->ts.kind = kind;
4470 result->expr_type = EXPR_ARRAY;
4471 result->value.constructor = head;
4472 result->shape = gfc_copy_shape (e->shape, e->rank);
4473 result->where = e->where;
4474 result->rank = e->rank;