1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010 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"
29 #include "constructor.h"
32 gfc_expr gfc_bad_expr;
35 /* Note that 'simplification' is not just transforming expressions.
36 For functions that are not simplified at compile time, range
37 checking is done if possible.
39 The return convention is that each simplification function returns:
41 A new expression node corresponding to the simplified arguments.
42 The original arguments are destroyed by the caller, and must not
43 be a part of the new expression.
45 NULL pointer indicating that no simplification was possible and
46 the original expression should remain intact.
48 An expression pointer to gfc_bad_expr (a static placeholder)
49 indicating that some error has prevented simplification. The
50 error is generated within the function and should be propagated
53 By the time a simplification function gets control, it has been
54 decided that the function call is really supposed to be the
55 intrinsic. No type checking is strictly necessary, since only
56 valid types will be passed on. On the other hand, a simplification
57 subroutine may have to look at the type of an argument as part of
60 Array arguments are only passed to these subroutines that implement
61 the simplification of transformational intrinsics.
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 if (result->expr_type != EXPR_CONSTANT)
79 switch (gfc_range_check (result))
85 gfc_error ("Result of %s overflows its kind at %L", name,
90 gfc_error ("Result of %s underflows its kind at %L", name,
95 gfc_error ("Result of %s is NaN at %L", name, &result->where);
99 gfc_error ("Result of %s gives range error for its kind at %L", name,
104 gfc_free_expr (result);
105 return &gfc_bad_expr;
109 /* A helper function that gets an optional and possibly missing
110 kind parameter. Returns the kind, -1 if something went wrong. */
113 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
120 if (k->expr_type != EXPR_CONSTANT)
122 gfc_error ("KIND parameter of %s at %L must be an initialization "
123 "expression", name, &k->where);
127 if (gfc_extract_int (k, &kind) != NULL
128 || gfc_validate_kind (type, kind, true) < 0)
130 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
138 /* Converts an mpz_t signed variable into an unsigned one, assuming
139 two's complement representations and a binary width of bitsize.
140 The conversion is a no-op unless x is negative; otherwise, it can
141 be accomplished by masking out the high bits. */
144 convert_mpz_to_unsigned (mpz_t x, int bitsize)
150 /* Confirm that no bits above the signed range are unset. */
151 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
153 mpz_init_set_ui (mask, 1);
154 mpz_mul_2exp (mask, mask, bitsize);
155 mpz_sub_ui (mask, mask, 1);
157 mpz_and (x, x, mask);
163 /* Confirm that no bits above the signed range are set. */
164 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
169 /* Converts an mpz_t unsigned variable into a signed one, assuming
170 two's complement representations and a binary width of bitsize.
171 If the bitsize-1 bit is set, this is taken as a sign bit and
172 the number is converted to the corresponding negative number. */
175 convert_mpz_to_signed (mpz_t x, int bitsize)
179 /* Confirm that no bits above the unsigned range are set. */
180 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
182 if (mpz_tstbit (x, bitsize - 1) == 1)
184 mpz_init_set_ui (mask, 1);
185 mpz_mul_2exp (mask, mask, bitsize);
186 mpz_sub_ui (mask, mask, 1);
188 /* We negate the number by hand, zeroing the high bits, that is
189 make it the corresponding positive number, and then have it
190 negated by GMP, giving the correct representation of the
193 mpz_add_ui (x, x, 1);
194 mpz_and (x, x, mask);
203 /* In-place convert BOZ to REAL of the specified kind. */
206 convert_boz (gfc_expr *x, int kind)
208 if (x && x->ts.type == BT_INTEGER && x->is_boz)
215 if (!gfc_convert_boz (x, &ts))
216 return &gfc_bad_expr;
223 /* Test that the expression is an constant array. */
226 is_constant_array_expr (gfc_expr *e)
233 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
236 for (c = gfc_constructor_first (e->value.constructor);
237 c; c = gfc_constructor_next (c))
238 if (c->expr->expr_type != EXPR_CONSTANT)
245 /* Initialize a transformational result expression with a given value. */
248 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
250 if (e && e->expr_type == EXPR_ARRAY)
252 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
255 init_result_expr (ctor->expr, init, array);
256 ctor = gfc_constructor_next (ctor);
259 else if (e && e->expr_type == EXPR_CONSTANT)
261 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
268 e->value.logical = (init ? 1 : 0);
273 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
274 else if (init == INT_MAX)
275 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
277 mpz_set_si (e->value.integer, init);
283 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
284 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
286 else if (init == INT_MAX)
287 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
289 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
293 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
299 gfc_expr *len = gfc_simplify_len (array, NULL);
300 gfc_extract_int (len, &length);
301 string = gfc_get_wide_string (length + 1);
302 gfc_wide_memset (string, 0, length);
304 else if (init == INT_MAX)
306 gfc_expr *len = gfc_simplify_len (array, NULL);
307 gfc_extract_int (len, &length);
308 string = gfc_get_wide_string (length + 1);
309 gfc_wide_memset (string, 255, length);
314 string = gfc_get_wide_string (1);
317 string[length] = '\0';
318 e->value.character.length = length;
319 e->value.character.string = string;
331 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
334 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
335 gfc_expr *matrix_b, int stride_b, int offset_b)
337 gfc_expr *result, *a, *b;
339 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
341 init_result_expr (result, 0, NULL);
343 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
344 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
347 /* Copying of expressions is required as operands are free'd
348 by the gfc_arith routines. */
349 switch (result->ts.type)
352 result = gfc_or (result,
353 gfc_and (gfc_copy_expr (a),
360 result = gfc_add (result,
361 gfc_multiply (gfc_copy_expr (a),
369 offset_a += stride_a;
370 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
372 offset_b += stride_b;
373 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
380 /* Build a result expression for transformational intrinsics,
384 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
385 int kind, locus* where)
390 if (!dim || array->rank == 1)
391 return gfc_get_constant_expr (type, kind, where);
393 result = gfc_get_array_expr (type, kind, where);
394 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
395 result->rank = array->rank - 1;
397 /* gfc_array_size() would count the number of elements in the constructor,
398 we have not built those yet. */
400 for (i = 0; i < result->rank; ++i)
401 nelem *= mpz_get_ui (result->shape[i]);
403 for (i = 0; i < nelem; ++i)
405 gfc_constructor_append_expr (&result->value.constructor,
406 gfc_get_constant_expr (type, kind, where),
414 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
416 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
417 of COUNT intrinsic is .TRUE..
419 Interface and implimentation mimics arith functions as
420 gfc_add, gfc_multiply, etc. */
422 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
426 gcc_assert (op1->ts.type == BT_INTEGER);
427 gcc_assert (op2->ts.type == BT_LOGICAL);
428 gcc_assert (op2->value.logical);
430 result = gfc_copy_expr (op1);
431 mpz_add_ui (result->value.integer, result->value.integer, 1);
439 /* Transforms an ARRAY with operation OP, according to MASK, to a
440 scalar RESULT. E.g. called if
442 REAL, PARAMETER :: array(n, m) = ...
443 REAL, PARAMETER :: s = SUM(array)
445 where OP == gfc_add(). */
448 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
449 transformational_op op)
452 gfc_constructor *array_ctor, *mask_ctor;
454 /* Shortcut for constant .FALSE. MASK. */
456 && mask->expr_type == EXPR_CONSTANT
457 && !mask->value.logical)
460 array_ctor = gfc_constructor_first (array->value.constructor);
462 if (mask && mask->expr_type == EXPR_ARRAY)
463 mask_ctor = gfc_constructor_first (mask->value.constructor);
467 a = array_ctor->expr;
468 array_ctor = gfc_constructor_next (array_ctor);
470 /* A constant MASK equals .TRUE. here and can be ignored. */
474 mask_ctor = gfc_constructor_next (mask_ctor);
475 if (!m->value.logical)
479 result = op (result, gfc_copy_expr (a));
485 /* Transforms an ARRAY with operation OP, according to MASK, to an
486 array RESULT. E.g. called if
488 REAL, PARAMETER :: array(n, m) = ...
489 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
491 where OP == gfc_multiply(). */
494 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
495 gfc_expr *mask, transformational_op op)
498 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
499 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
500 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
502 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
503 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
504 tmpstride[GFC_MAX_DIMENSIONS];
506 /* Shortcut for constant .FALSE. MASK. */
508 && mask->expr_type == EXPR_CONSTANT
509 && !mask->value.logical)
512 /* Build an indexed table for array element expressions to minimize
513 linked-list traversal. Masked elements are set to NULL. */
514 gfc_array_size (array, &size);
515 arraysize = mpz_get_ui (size);
517 arrayvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * arraysize);
519 array_ctor = gfc_constructor_first (array->value.constructor);
521 if (mask && mask->expr_type == EXPR_ARRAY)
522 mask_ctor = gfc_constructor_first (mask->value.constructor);
524 for (i = 0; i < arraysize; ++i)
526 arrayvec[i] = array_ctor->expr;
527 array_ctor = gfc_constructor_next (array_ctor);
531 if (!mask_ctor->expr->value.logical)
534 mask_ctor = gfc_constructor_next (mask_ctor);
538 /* Same for the result expression. */
539 gfc_array_size (result, &size);
540 resultsize = mpz_get_ui (size);
543 resultvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * resultsize);
544 result_ctor = gfc_constructor_first (result->value.constructor);
545 for (i = 0; i < resultsize; ++i)
547 resultvec[i] = result_ctor->expr;
548 result_ctor = gfc_constructor_next (result_ctor);
551 gfc_extract_int (dim, &dim_index);
552 dim_index -= 1; /* zero-base index */
556 for (i = 0, n = 0; i < array->rank; ++i)
559 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
562 dim_extent = mpz_get_si (array->shape[i]);
563 dim_stride = tmpstride[i];
567 extent[n] = mpz_get_si (array->shape[i]);
568 sstride[n] = tmpstride[i];
569 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
578 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
580 *dest = op (*dest, gfc_copy_expr (*src));
587 while (!done && count[n] == extent[n])
590 base -= sstride[n] * extent[n];
591 dest -= dstride[n] * extent[n];
594 if (n < result->rank)
605 /* Place updated expression in result constructor. */
606 result_ctor = gfc_constructor_first (result->value.constructor);
607 for (i = 0; i < resultsize; ++i)
609 result_ctor->expr = resultvec[i];
610 result_ctor = gfc_constructor_next (result_ctor);
614 gfc_free (resultvec);
620 /********************** Simplification functions *****************************/
623 gfc_simplify_abs (gfc_expr *e)
627 if (e->expr_type != EXPR_CONSTANT)
633 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
634 mpz_abs (result->value.integer, e->value.integer);
635 return range_check (result, "IABS");
638 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
639 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
640 return range_check (result, "ABS");
643 gfc_set_model_kind (e->ts.kind);
644 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
645 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
646 return range_check (result, "CABS");
649 gfc_internal_error ("gfc_simplify_abs(): Bad type");
655 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
659 bool too_large = false;
661 if (e->expr_type != EXPR_CONSTANT)
664 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
666 return &gfc_bad_expr;
668 if (mpz_cmp_si (e->value.integer, 0) < 0)
670 gfc_error ("Argument of %s function at %L is negative", name,
672 return &gfc_bad_expr;
675 if (ascii && gfc_option.warn_surprising
676 && mpz_cmp_si (e->value.integer, 127) > 0)
677 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
680 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
685 mpz_init_set_ui (t, 2);
686 mpz_pow_ui (t, t, 32);
687 mpz_sub_ui (t, t, 1);
688 if (mpz_cmp (e->value.integer, t) > 0)
695 gfc_error ("Argument of %s function at %L is too large for the "
696 "collating sequence of kind %d", name, &e->where, kind);
697 return &gfc_bad_expr;
700 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
701 result->value.character.string[0] = mpz_get_ui (e->value.integer);
708 /* We use the processor's collating sequence, because all
709 systems that gfortran currently works on are ASCII. */
712 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
714 return simplify_achar_char (e, k, "ACHAR", true);
719 gfc_simplify_acos (gfc_expr *x)
723 if (x->expr_type != EXPR_CONSTANT)
729 if (mpfr_cmp_si (x->value.real, 1) > 0
730 || mpfr_cmp_si (x->value.real, -1) < 0)
732 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
734 return &gfc_bad_expr;
736 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
737 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
741 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
742 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
746 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
749 return range_check (result, "ACOS");
753 gfc_simplify_acosh (gfc_expr *x)
757 if (x->expr_type != EXPR_CONSTANT)
763 if (mpfr_cmp_si (x->value.real, 1) < 0)
765 gfc_error ("Argument of ACOSH at %L must not be less than 1",
767 return &gfc_bad_expr;
770 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
771 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
775 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
776 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
780 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
783 return range_check (result, "ACOSH");
787 gfc_simplify_adjustl (gfc_expr *e)
793 if (e->expr_type != EXPR_CONSTANT)
796 len = e->value.character.length;
798 for (count = 0, i = 0; i < len; ++i)
800 ch = e->value.character.string[i];
806 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
807 for (i = 0; i < len - count; ++i)
808 result->value.character.string[i] = e->value.character.string[count + i];
815 gfc_simplify_adjustr (gfc_expr *e)
821 if (e->expr_type != EXPR_CONSTANT)
824 len = e->value.character.length;
826 for (count = 0, i = len - 1; i >= 0; --i)
828 ch = e->value.character.string[i];
834 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
835 for (i = 0; i < count; ++i)
836 result->value.character.string[i] = ' ';
838 for (i = count; i < len; ++i)
839 result->value.character.string[i] = e->value.character.string[i - count];
846 gfc_simplify_aimag (gfc_expr *e)
850 if (e->expr_type != EXPR_CONSTANT)
853 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
854 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
856 return range_check (result, "AIMAG");
861 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
863 gfc_expr *rtrunc, *result;
866 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
868 return &gfc_bad_expr;
870 if (e->expr_type != EXPR_CONSTANT)
873 rtrunc = gfc_copy_expr (e);
874 mpfr_trunc (rtrunc->value.real, e->value.real);
876 result = gfc_real2real (rtrunc, kind);
878 gfc_free_expr (rtrunc);
880 return range_check (result, "AINT");
885 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
889 if (!is_constant_array_expr (mask)
890 || !gfc_is_constant_expr (dim))
893 result = transformational_result (mask, dim, mask->ts.type,
894 mask->ts.kind, &mask->where);
895 init_result_expr (result, true, NULL);
897 return !dim || mask->rank == 1 ?
898 simplify_transformation_to_scalar (result, mask, NULL, gfc_and) :
899 simplify_transformation_to_array (result, mask, dim, NULL, gfc_and);
904 gfc_simplify_dint (gfc_expr *e)
906 gfc_expr *rtrunc, *result;
908 if (e->expr_type != EXPR_CONSTANT)
911 rtrunc = gfc_copy_expr (e);
912 mpfr_trunc (rtrunc->value.real, e->value.real);
914 result = gfc_real2real (rtrunc, gfc_default_double_kind);
916 gfc_free_expr (rtrunc);
918 return range_check (result, "DINT");
923 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
928 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
930 return &gfc_bad_expr;
932 if (e->expr_type != EXPR_CONSTANT)
935 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
936 mpfr_round (result->value.real, e->value.real);
938 return range_check (result, "ANINT");
943 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
948 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
951 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
956 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
957 mpz_and (result->value.integer, x->value.integer, y->value.integer);
958 return range_check (result, "AND");
961 return gfc_get_logical_expr (kind, &x->where,
962 x->value.logical && y->value.logical);
971 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
975 if (!is_constant_array_expr (mask)
976 || !gfc_is_constant_expr (dim))
979 result = transformational_result (mask, dim, mask->ts.type,
980 mask->ts.kind, &mask->where);
981 init_result_expr (result, false, NULL);
983 return !dim || mask->rank == 1 ?
984 simplify_transformation_to_scalar (result, mask, NULL, gfc_or) :
985 simplify_transformation_to_array (result, mask, dim, NULL, gfc_or);
990 gfc_simplify_dnint (gfc_expr *e)
994 if (e->expr_type != EXPR_CONSTANT)
997 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
998 mpfr_round (result->value.real, e->value.real);
1000 return range_check (result, "DNINT");
1005 gfc_simplify_asin (gfc_expr *x)
1009 if (x->expr_type != EXPR_CONSTANT)
1015 if (mpfr_cmp_si (x->value.real, 1) > 0
1016 || mpfr_cmp_si (x->value.real, -1) < 0)
1018 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1020 return &gfc_bad_expr;
1022 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1023 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1027 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1028 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1032 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1035 return range_check (result, "ASIN");
1040 gfc_simplify_asinh (gfc_expr *x)
1044 if (x->expr_type != EXPR_CONSTANT)
1047 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1052 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1056 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1060 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1063 return range_check (result, "ASINH");
1068 gfc_simplify_atan (gfc_expr *x)
1072 if (x->expr_type != EXPR_CONSTANT)
1075 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1080 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1084 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1088 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1091 return range_check (result, "ATAN");
1096 gfc_simplify_atanh (gfc_expr *x)
1100 if (x->expr_type != EXPR_CONSTANT)
1106 if (mpfr_cmp_si (x->value.real, 1) >= 0
1107 || mpfr_cmp_si (x->value.real, -1) <= 0)
1109 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1111 return &gfc_bad_expr;
1113 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1114 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1118 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1119 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1123 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1126 return range_check (result, "ATANH");
1131 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1135 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1138 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1140 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1141 "second argument must not be zero", &x->where);
1142 return &gfc_bad_expr;
1145 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1146 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1148 return range_check (result, "ATAN2");
1153 gfc_simplify_bessel_j0 (gfc_expr *x)
1157 if (x->expr_type != EXPR_CONSTANT)
1160 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1161 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1163 return range_check (result, "BESSEL_J0");
1168 gfc_simplify_bessel_j1 (gfc_expr *x)
1172 if (x->expr_type != EXPR_CONSTANT)
1175 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1176 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1178 return range_check (result, "BESSEL_J1");
1183 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1188 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1191 n = mpz_get_si (order->value.integer);
1192 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1193 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1195 return range_check (result, "BESSEL_JN");
1199 /* Simplify transformational form of JN and YN. */
1202 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1209 mpfr_t x2rev, last1, last2;
1211 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1212 || order2->expr_type != EXPR_CONSTANT)
1215 n1 = mpz_get_si (order1->value.integer);
1216 n2 = mpz_get_si (order2->value.integer);
1217 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1219 result->shape = gfc_get_shape (1);
1220 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1225 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1226 YN(N, 0.0) = -Inf. */
1228 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1230 if (!jn && gfc_option.flag_range_check)
1232 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1233 gfc_free_expr (result);
1234 return &gfc_bad_expr;
1239 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1240 mpfr_set_ui (e->value.real, 1.0, GFC_RND_MODE);
1241 gfc_constructor_append_expr (&result->value.constructor, e,
1246 for (i = n1; i <= n2; i++)
1248 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1250 mpfr_set_ui (e->value.real, 0.0, GFC_RND_MODE);
1252 mpfr_set_inf (e->value.real, -1);
1253 gfc_constructor_append_expr (&result->value.constructor, e,
1260 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1261 are stable for downward recursion and Neumann functions are stable
1262 for upward recursion. It is
1264 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1265 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1266 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1268 gfc_set_model_kind (x->ts.kind);
1270 /* Get first recursion anchor. */
1274 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1276 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1278 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1279 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1280 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1284 gfc_free_expr (result);
1285 return &gfc_bad_expr;
1287 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1295 /* Get second recursion anchor. */
1299 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1301 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1303 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1304 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1305 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1310 gfc_free_expr (result);
1311 return &gfc_bad_expr;
1314 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1316 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1325 /* Start actual recursion. */
1328 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1330 for (i = 2; i <= n2-n1; i++)
1332 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1334 /* Special case: For YN, if the previous N gave -INF, set
1335 also N+1 to -INF. */
1336 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1338 mpfr_set_inf (e->value.real, -1);
1339 gfc_constructor_append_expr (&result->value.constructor, e,
1344 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1346 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1347 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1349 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1353 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1356 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1358 mpfr_set (last1, last2, GFC_RND_MODE);
1359 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1372 gfc_free_expr (result);
1373 return &gfc_bad_expr;
1378 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1380 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1385 gfc_simplify_bessel_y0 (gfc_expr *x)
1389 if (x->expr_type != EXPR_CONSTANT)
1392 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1393 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1395 return range_check (result, "BESSEL_Y0");
1400 gfc_simplify_bessel_y1 (gfc_expr *x)
1404 if (x->expr_type != EXPR_CONSTANT)
1407 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1408 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1410 return range_check (result, "BESSEL_Y1");
1415 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1420 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1423 n = mpz_get_si (order->value.integer);
1424 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1425 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1427 return range_check (result, "BESSEL_YN");
1432 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1434 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1439 gfc_simplify_bit_size (gfc_expr *e)
1441 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1442 return gfc_get_int_expr (e->ts.kind, &e->where,
1443 gfc_integer_kinds[i].bit_size);
1448 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1452 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1455 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1456 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1458 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1459 mpz_tstbit (e->value.integer, b));
1464 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1466 gfc_expr *ceil, *result;
1469 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1471 return &gfc_bad_expr;
1473 if (e->expr_type != EXPR_CONSTANT)
1476 ceil = gfc_copy_expr (e);
1477 mpfr_ceil (ceil->value.real, e->value.real);
1479 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1480 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1482 gfc_free_expr (ceil);
1484 return range_check (result, "CEILING");
1489 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1491 return simplify_achar_char (e, k, "CHAR", false);
1495 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1498 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1502 if (convert_boz (x, kind) == &gfc_bad_expr)
1503 return &gfc_bad_expr;
1505 if (convert_boz (y, kind) == &gfc_bad_expr)
1506 return &gfc_bad_expr;
1508 if (x->expr_type != EXPR_CONSTANT
1509 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1512 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1517 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1521 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1525 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1529 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1533 return range_check (result, name);
1538 mpfr_set_z (mpc_imagref (result->value.complex),
1539 y->value.integer, GFC_RND_MODE);
1543 mpfr_set (mpc_imagref (result->value.complex),
1544 y->value.real, GFC_RND_MODE);
1548 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1551 return range_check (result, name);
1556 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1560 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1562 return &gfc_bad_expr;
1564 return simplify_cmplx ("CMPLX", x, y, kind);
1569 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1573 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1574 kind = gfc_default_complex_kind;
1575 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1577 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1579 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1580 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1584 return simplify_cmplx ("COMPLEX", x, y, kind);
1589 gfc_simplify_conjg (gfc_expr *e)
1593 if (e->expr_type != EXPR_CONSTANT)
1596 result = gfc_copy_expr (e);
1597 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1599 return range_check (result, "CONJG");
1604 gfc_simplify_cos (gfc_expr *x)
1608 if (x->expr_type != EXPR_CONSTANT)
1611 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1616 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1620 gfc_set_model_kind (x->ts.kind);
1621 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1625 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1628 return range_check (result, "COS");
1633 gfc_simplify_cosh (gfc_expr *x)
1637 if (x->expr_type != EXPR_CONSTANT)
1640 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1645 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1649 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1656 return range_check (result, "COSH");
1661 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1665 if (!is_constant_array_expr (mask)
1666 || !gfc_is_constant_expr (dim)
1667 || !gfc_is_constant_expr (kind))
1670 result = transformational_result (mask, dim,
1672 get_kind (BT_INTEGER, kind, "COUNT",
1673 gfc_default_integer_kind),
1676 init_result_expr (result, 0, NULL);
1678 /* Passing MASK twice, once as data array, once as mask.
1679 Whenever gfc_count is called, '1' is added to the result. */
1680 return !dim || mask->rank == 1 ?
1681 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1682 simplify_transformation_to_array (result, mask, dim, mask, gfc_count);
1687 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1689 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1694 gfc_simplify_dble (gfc_expr *e)
1696 gfc_expr *result = NULL;
1698 if (e->expr_type != EXPR_CONSTANT)
1701 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1702 return &gfc_bad_expr;
1704 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1705 if (result == &gfc_bad_expr)
1706 return &gfc_bad_expr;
1708 return range_check (result, "DBLE");
1713 gfc_simplify_digits (gfc_expr *x)
1717 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1722 digits = gfc_integer_kinds[i].digits;
1727 digits = gfc_real_kinds[i].digits;
1734 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1739 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1744 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1747 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1748 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1753 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1754 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1756 mpz_set_ui (result->value.integer, 0);
1761 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1762 mpfr_sub (result->value.real, x->value.real, y->value.real,
1765 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1770 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1773 return range_check (result, "DIM");
1778 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1780 if (!is_constant_array_expr (vector_a)
1781 || !is_constant_array_expr (vector_b))
1784 gcc_assert (vector_a->rank == 1);
1785 gcc_assert (vector_b->rank == 1);
1786 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1788 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1793 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1795 gfc_expr *a1, *a2, *result;
1797 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1800 a1 = gfc_real2real (x, gfc_default_double_kind);
1801 a2 = gfc_real2real (y, gfc_default_double_kind);
1803 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1804 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1809 return range_check (result, "DPROD");
1814 gfc_simplify_erf (gfc_expr *x)
1818 if (x->expr_type != EXPR_CONSTANT)
1821 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1822 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1824 return range_check (result, "ERF");
1829 gfc_simplify_erfc (gfc_expr *x)
1833 if (x->expr_type != EXPR_CONSTANT)
1836 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1837 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1839 return range_check (result, "ERFC");
1843 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1845 #define MAX_ITER 200
1846 #define ARG_LIMIT 12
1848 /* Calculate ERFC_SCALED directly by its definition:
1850 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1852 using a large precision for intermediate results. This is used for all
1853 but large values of the argument. */
1855 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1860 prec = mpfr_get_default_prec ();
1861 mpfr_set_default_prec (10 * prec);
1866 mpfr_set (a, arg, GFC_RND_MODE);
1867 mpfr_sqr (b, a, GFC_RND_MODE);
1868 mpfr_exp (b, b, GFC_RND_MODE);
1869 mpfr_erfc (a, a, GFC_RND_MODE);
1870 mpfr_mul (a, a, b, GFC_RND_MODE);
1872 mpfr_set (res, a, GFC_RND_MODE);
1873 mpfr_set_default_prec (prec);
1879 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
1881 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
1882 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
1885 This is used for large values of the argument. Intermediate calculations
1886 are performed with twice the precision. We don't do a fixed number of
1887 iterations of the sum, but stop when it has converged to the required
1890 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
1892 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
1897 prec = mpfr_get_default_prec ();
1898 mpfr_set_default_prec (2 * prec);
1908 mpfr_init (sumtrunc);
1909 mpfr_set_prec (oldsum, prec);
1910 mpfr_set_prec (sumtrunc, prec);
1912 mpfr_set (x, arg, GFC_RND_MODE);
1913 mpfr_set_ui (sum, 1, GFC_RND_MODE);
1914 mpz_set_ui (num, 1);
1916 mpfr_set (u, x, GFC_RND_MODE);
1917 mpfr_sqr (u, u, GFC_RND_MODE);
1918 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
1919 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
1921 for (i = 1; i < MAX_ITER; i++)
1923 mpfr_set (oldsum, sum, GFC_RND_MODE);
1925 mpz_mul_ui (num, num, 2 * i - 1);
1928 mpfr_set (w, u, GFC_RND_MODE);
1929 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
1931 mpfr_set_z (v, num, GFC_RND_MODE);
1932 mpfr_mul (v, v, w, GFC_RND_MODE);
1934 mpfr_add (sum, sum, v, GFC_RND_MODE);
1936 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
1937 if (mpfr_cmp (sumtrunc, oldsum) == 0)
1941 /* We should have converged by now; otherwise, ARG_LIMIT is probably
1943 gcc_assert (i < MAX_ITER);
1945 /* Divide by x * sqrt(Pi). */
1946 mpfr_const_pi (u, GFC_RND_MODE);
1947 mpfr_sqrt (u, u, GFC_RND_MODE);
1948 mpfr_mul (u, u, x, GFC_RND_MODE);
1949 mpfr_div (sum, sum, u, GFC_RND_MODE);
1951 mpfr_set (res, sum, GFC_RND_MODE);
1952 mpfr_set_default_prec (prec);
1954 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
1960 gfc_simplify_erfc_scaled (gfc_expr *x)
1964 if (x->expr_type != EXPR_CONSTANT)
1967 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1968 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
1969 asympt_erfc_scaled (result->value.real, x->value.real);
1971 fullprec_erfc_scaled (result->value.real, x->value.real);
1973 return range_check (result, "ERFC_SCALED");
1981 gfc_simplify_epsilon (gfc_expr *e)
1986 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1988 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
1989 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1991 return range_check (result, "EPSILON");
1996 gfc_simplify_exp (gfc_expr *x)
2000 if (x->expr_type != EXPR_CONSTANT)
2003 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2008 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2012 gfc_set_model_kind (x->ts.kind);
2013 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2017 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2020 return range_check (result, "EXP");
2025 gfc_simplify_exponent (gfc_expr *x)
2030 if (x->expr_type != EXPR_CONSTANT)
2033 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2036 gfc_set_model (x->value.real);
2038 if (mpfr_sgn (x->value.real) == 0)
2040 mpz_set_ui (result->value.integer, 0);
2044 i = (int) mpfr_get_exp (x->value.real);
2045 mpz_set_si (result->value.integer, i);
2047 return range_check (result, "EXPONENT");
2052 gfc_simplify_float (gfc_expr *a)
2056 if (a->expr_type != EXPR_CONSTANT)
2061 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2062 return &gfc_bad_expr;
2064 result = gfc_copy_expr (a);
2067 result = gfc_int2real (a, gfc_default_real_kind);
2069 return range_check (result, "FLOAT");
2074 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2080 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2082 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2084 if (e->expr_type != EXPR_CONSTANT)
2087 gfc_set_model_kind (kind);
2090 mpfr_floor (floor, e->value.real);
2092 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2093 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2097 return range_check (result, "FLOOR");
2102 gfc_simplify_fraction (gfc_expr *x)
2105 mpfr_t absv, exp, pow2;
2107 if (x->expr_type != EXPR_CONSTANT)
2110 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2112 if (mpfr_sgn (x->value.real) == 0)
2114 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2118 gfc_set_model_kind (x->ts.kind);
2123 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2124 mpfr_log2 (exp, absv, GFC_RND_MODE);
2126 mpfr_trunc (exp, exp);
2127 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2129 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2131 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2133 mpfr_clears (exp, absv, pow2, NULL);
2135 return range_check (result, "FRACTION");
2140 gfc_simplify_gamma (gfc_expr *x)
2144 if (x->expr_type != EXPR_CONSTANT)
2147 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2148 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2150 return range_check (result, "GAMMA");
2155 gfc_simplify_huge (gfc_expr *e)
2160 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2161 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2166 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2170 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2182 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2186 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2189 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2190 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2191 return range_check (result, "HYPOT");
2195 /* We use the processor's collating sequence, because all
2196 systems that gfortran currently works on are ASCII. */
2199 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2205 if (e->expr_type != EXPR_CONSTANT)
2208 if (e->value.character.length != 1)
2210 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2211 return &gfc_bad_expr;
2214 index = e->value.character.string[0];
2216 if (gfc_option.warn_surprising && index > 127)
2217 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2220 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2222 return &gfc_bad_expr;
2224 result = gfc_get_int_expr (k, &e->where, index);
2226 return range_check (result, "IACHAR");
2231 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2235 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2238 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2239 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2241 return range_check (result, "IAND");
2246 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2251 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2254 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2256 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2257 return &gfc_bad_expr;
2260 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2262 if (pos >= gfc_integer_kinds[k].bit_size)
2264 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2266 return &gfc_bad_expr;
2269 result = gfc_copy_expr (x);
2271 convert_mpz_to_unsigned (result->value.integer,
2272 gfc_integer_kinds[k].bit_size);
2274 mpz_clrbit (result->value.integer, pos);
2276 convert_mpz_to_signed (result->value.integer,
2277 gfc_integer_kinds[k].bit_size);
2284 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2291 if (x->expr_type != EXPR_CONSTANT
2292 || y->expr_type != EXPR_CONSTANT
2293 || z->expr_type != EXPR_CONSTANT)
2296 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2298 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2299 return &gfc_bad_expr;
2302 if (gfc_extract_int (z, &len) != NULL || len < 0)
2304 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2305 return &gfc_bad_expr;
2308 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2310 bitsize = gfc_integer_kinds[k].bit_size;
2312 if (pos + len > bitsize)
2314 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2315 "bit size at %L", &y->where);
2316 return &gfc_bad_expr;
2319 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2320 convert_mpz_to_unsigned (result->value.integer,
2321 gfc_integer_kinds[k].bit_size);
2323 bits = XCNEWVEC (int, bitsize);
2325 for (i = 0; i < bitsize; i++)
2328 for (i = 0; i < len; i++)
2329 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2331 for (i = 0; i < bitsize; i++)
2334 mpz_clrbit (result->value.integer, i);
2335 else if (bits[i] == 1)
2336 mpz_setbit (result->value.integer, i);
2338 gfc_internal_error ("IBITS: Bad bit");
2343 convert_mpz_to_signed (result->value.integer,
2344 gfc_integer_kinds[k].bit_size);
2351 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2356 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2359 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2361 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2362 return &gfc_bad_expr;
2365 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2367 if (pos >= gfc_integer_kinds[k].bit_size)
2369 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2371 return &gfc_bad_expr;
2374 result = gfc_copy_expr (x);
2376 convert_mpz_to_unsigned (result->value.integer,
2377 gfc_integer_kinds[k].bit_size);
2379 mpz_setbit (result->value.integer, pos);
2381 convert_mpz_to_signed (result->value.integer,
2382 gfc_integer_kinds[k].bit_size);
2389 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2395 if (e->expr_type != EXPR_CONSTANT)
2398 if (e->value.character.length != 1)
2400 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2401 return &gfc_bad_expr;
2404 index = e->value.character.string[0];
2406 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2408 return &gfc_bad_expr;
2410 result = gfc_get_int_expr (k, &e->where, index);
2412 return range_check (result, "ICHAR");
2417 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2421 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2424 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2425 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2427 return range_check (result, "IEOR");
2432 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2435 int back, len, lensub;
2436 int i, j, k, count, index = 0, start;
2438 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2439 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2442 if (b != NULL && b->value.logical != 0)
2447 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2449 return &gfc_bad_expr;
2451 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2453 len = x->value.character.length;
2454 lensub = y->value.character.length;
2458 mpz_set_si (result->value.integer, 0);
2466 mpz_set_si (result->value.integer, 1);
2469 else if (lensub == 1)
2471 for (i = 0; i < len; i++)
2473 for (j = 0; j < lensub; j++)
2475 if (y->value.character.string[j]
2476 == x->value.character.string[i])
2486 for (i = 0; i < len; i++)
2488 for (j = 0; j < lensub; j++)
2490 if (y->value.character.string[j]
2491 == x->value.character.string[i])
2496 for (k = 0; k < lensub; k++)
2498 if (y->value.character.string[k]
2499 == x->value.character.string[k + start])
2503 if (count == lensub)
2518 mpz_set_si (result->value.integer, len + 1);
2521 else if (lensub == 1)
2523 for (i = 0; i < len; i++)
2525 for (j = 0; j < lensub; j++)
2527 if (y->value.character.string[j]
2528 == x->value.character.string[len - i])
2530 index = len - i + 1;
2538 for (i = 0; i < len; i++)
2540 for (j = 0; j < lensub; j++)
2542 if (y->value.character.string[j]
2543 == x->value.character.string[len - i])
2546 if (start <= len - lensub)
2549 for (k = 0; k < lensub; k++)
2550 if (y->value.character.string[k]
2551 == x->value.character.string[k + start])
2554 if (count == lensub)
2571 mpz_set_si (result->value.integer, index);
2572 return range_check (result, "INDEX");
2577 simplify_intconv (gfc_expr *e, int kind, const char *name)
2579 gfc_expr *result = NULL;
2581 if (e->expr_type != EXPR_CONSTANT)
2584 result = gfc_convert_constant (e, BT_INTEGER, kind);
2585 if (result == &gfc_bad_expr)
2586 return &gfc_bad_expr;
2588 return range_check (result, name);
2593 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2597 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2599 return &gfc_bad_expr;
2601 return simplify_intconv (e, kind, "INT");
2605 gfc_simplify_int2 (gfc_expr *e)
2607 return simplify_intconv (e, 2, "INT2");
2612 gfc_simplify_int8 (gfc_expr *e)
2614 return simplify_intconv (e, 8, "INT8");
2619 gfc_simplify_long (gfc_expr *e)
2621 return simplify_intconv (e, 4, "LONG");
2626 gfc_simplify_ifix (gfc_expr *e)
2628 gfc_expr *rtrunc, *result;
2630 if (e->expr_type != EXPR_CONSTANT)
2633 rtrunc = gfc_copy_expr (e);
2634 mpfr_trunc (rtrunc->value.real, e->value.real);
2636 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2638 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2640 gfc_free_expr (rtrunc);
2642 return range_check (result, "IFIX");
2647 gfc_simplify_idint (gfc_expr *e)
2649 gfc_expr *rtrunc, *result;
2651 if (e->expr_type != EXPR_CONSTANT)
2654 rtrunc = gfc_copy_expr (e);
2655 mpfr_trunc (rtrunc->value.real, e->value.real);
2657 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2659 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2661 gfc_free_expr (rtrunc);
2663 return range_check (result, "IDINT");
2668 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2672 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2675 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2676 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2678 return range_check (result, "IOR");
2683 gfc_simplify_is_iostat_end (gfc_expr *x)
2685 if (x->expr_type != EXPR_CONSTANT)
2688 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2689 mpz_cmp_si (x->value.integer,
2690 LIBERROR_END) == 0);
2695 gfc_simplify_is_iostat_eor (gfc_expr *x)
2697 if (x->expr_type != EXPR_CONSTANT)
2700 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2701 mpz_cmp_si (x->value.integer,
2702 LIBERROR_EOR) == 0);
2707 gfc_simplify_isnan (gfc_expr *x)
2709 if (x->expr_type != EXPR_CONSTANT)
2712 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2713 mpfr_nan_p (x->value.real));
2718 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
2721 int shift, ashift, isize, k, *bits, i;
2723 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2726 if (gfc_extract_int (s, &shift) != NULL)
2728 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
2729 return &gfc_bad_expr;
2732 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2734 isize = gfc_integer_kinds[k].bit_size;
2743 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2744 "at %L", &s->where);
2745 return &gfc_bad_expr;
2748 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2752 mpz_set (result->value.integer, e->value.integer);
2753 return range_check (result, "ISHFT");
2756 bits = XCNEWVEC (int, isize);
2758 for (i = 0; i < isize; i++)
2759 bits[i] = mpz_tstbit (e->value.integer, i);
2763 for (i = 0; i < shift; i++)
2764 mpz_clrbit (result->value.integer, i);
2766 for (i = 0; i < isize - shift; i++)
2769 mpz_clrbit (result->value.integer, i + shift);
2771 mpz_setbit (result->value.integer, i + shift);
2776 for (i = isize - 1; i >= isize - ashift; i--)
2777 mpz_clrbit (result->value.integer, i);
2779 for (i = isize - 1; i >= ashift; i--)
2782 mpz_clrbit (result->value.integer, i - ashift);
2784 mpz_setbit (result->value.integer, i - ashift);
2788 convert_mpz_to_signed (result->value.integer, isize);
2796 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2799 int shift, ashift, isize, ssize, delta, k;
2802 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2805 if (gfc_extract_int (s, &shift) != NULL)
2807 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2808 return &gfc_bad_expr;
2811 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2812 isize = gfc_integer_kinds[k].bit_size;
2816 if (sz->expr_type != EXPR_CONSTANT)
2819 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2821 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2822 return &gfc_bad_expr;
2827 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2828 "BIT_SIZE of first argument at %L", &s->where);
2829 return &gfc_bad_expr;
2843 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2844 "third argument at %L", &s->where);
2846 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2847 "BIT_SIZE of first argument at %L", &s->where);
2848 return &gfc_bad_expr;
2851 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2853 mpz_set (result->value.integer, e->value.integer);
2858 convert_mpz_to_unsigned (result->value.integer, isize);
2860 bits = XCNEWVEC (int, ssize);
2862 for (i = 0; i < ssize; i++)
2863 bits[i] = mpz_tstbit (e->value.integer, i);
2865 delta = ssize - ashift;
2869 for (i = 0; i < delta; i++)
2872 mpz_clrbit (result->value.integer, i + shift);
2874 mpz_setbit (result->value.integer, i + shift);
2877 for (i = delta; i < ssize; i++)
2880 mpz_clrbit (result->value.integer, i - delta);
2882 mpz_setbit (result->value.integer, i - delta);
2887 for (i = 0; i < ashift; i++)
2890 mpz_clrbit (result->value.integer, i + delta);
2892 mpz_setbit (result->value.integer, i + delta);
2895 for (i = ashift; i < ssize; i++)
2898 mpz_clrbit (result->value.integer, i + shift);
2900 mpz_setbit (result->value.integer, i + shift);
2904 convert_mpz_to_signed (result->value.integer, isize);
2912 gfc_simplify_kind (gfc_expr *e)
2914 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
2919 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2920 gfc_array_spec *as, gfc_ref *ref, bool coarray)
2922 gfc_expr *l, *u, *result;
2925 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2926 gfc_default_integer_kind);
2928 return &gfc_bad_expr;
2930 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2932 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
2933 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
2934 if (!coarray && array->expr_type != EXPR_VARIABLE)
2938 gfc_expr* dim = result;
2939 mpz_set_si (dim->value.integer, d);
2941 result = gfc_simplify_size (array, dim, kind);
2942 gfc_free_expr (dim);
2947 mpz_set_si (result->value.integer, 1);
2952 /* Otherwise, we have a variable expression. */
2953 gcc_assert (array->expr_type == EXPR_VARIABLE);
2956 /* The last dimension of an assumed-size array is special. */
2957 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2958 || (coarray && d == as->rank + as->corank))
2960 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2962 gfc_free_expr (result);
2963 return gfc_copy_expr (as->lower[d-1]);
2969 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2971 /* Then, we need to know the extent of the given dimension. */
2972 if (coarray || ref->u.ar.type == AR_FULL)
2977 if (l->expr_type != EXPR_CONSTANT || u == NULL
2978 || u->expr_type != EXPR_CONSTANT)
2981 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2985 mpz_set_si (result->value.integer, 0);
2987 mpz_set_si (result->value.integer, 1);
2991 /* Nonzero extent. */
2993 mpz_set (result->value.integer, u->value.integer);
2995 mpz_set (result->value.integer, l->value.integer);
3002 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3007 mpz_set_si (result->value.integer, (long int) 1);
3011 return range_check (result, upper ? "UBOUND" : "LBOUND");
3014 gfc_free_expr (result);
3020 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3026 if (array->expr_type != EXPR_VARIABLE)
3033 /* Follow any component references. */
3034 as = array->symtree->n.sym->as;
3035 for (ref = array->ref; ref; ref = ref->next)
3040 switch (ref->u.ar.type)
3047 /* We're done because 'as' has already been set in the
3048 previous iteration. */
3065 as = ref->u.c.component->as;
3077 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3082 /* Multi-dimensional bounds. */
3083 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3087 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3088 if (upper && as && as->type == AS_ASSUMED_SIZE)
3090 /* An error message will be emitted in
3091 check_assumed_size_reference (resolve.c). */
3092 return &gfc_bad_expr;
3095 /* Simplify the bounds for each dimension. */
3096 for (d = 0; d < array->rank; d++)
3098 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3100 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3104 for (j = 0; j < d; j++)
3105 gfc_free_expr (bounds[j]);
3110 /* Allocate the result expression. */
3111 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3112 gfc_default_integer_kind);
3114 return &gfc_bad_expr;
3116 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3118 /* The result is a rank 1 array; its size is the rank of the first
3119 argument to {L,U}BOUND. */
3121 e->shape = gfc_get_shape (1);
3122 mpz_init_set_ui (e->shape[0], array->rank);
3124 /* Create the constructor for this array. */
3125 for (d = 0; d < array->rank; d++)
3126 gfc_constructor_append_expr (&e->value.constructor,
3127 bounds[d], &e->where);
3133 /* A DIM argument is specified. */
3134 if (dim->expr_type != EXPR_CONSTANT)
3137 d = mpz_get_si (dim->value.integer);
3139 if (d < 1 || d > array->rank
3140 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3142 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3143 return &gfc_bad_expr;
3146 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3152 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3158 if (array->expr_type != EXPR_VARIABLE)
3161 /* Follow any component references. */
3162 as = array->symtree->n.sym->as;
3163 for (ref = array->ref; ref; ref = ref->next)
3168 switch (ref->u.ar.type)
3171 if (ref->next == NULL)
3173 gcc_assert (ref->u.ar.as->corank > 0
3174 && ref->u.ar.as->rank == 0);
3182 /* We're done because 'as' has already been set in the
3183 previous iteration. */
3200 as = ref->u.c.component->as;
3212 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3217 /* Multi-dimensional cobounds. */
3218 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3222 /* Simplify the cobounds for each dimension. */
3223 for (d = 0; d < as->corank; d++)
3225 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3226 upper, as, ref, true);
3227 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3231 for (j = 0; j < d; j++)
3232 gfc_free_expr (bounds[j]);
3237 /* Allocate the result expression. */
3238 e = gfc_get_expr ();
3239 e->where = array->where;
3240 e->expr_type = EXPR_ARRAY;
3241 e->ts.type = BT_INTEGER;
3242 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3243 gfc_default_integer_kind);
3247 return &gfc_bad_expr;
3251 /* The result is a rank 1 array; its size is the rank of the first
3252 argument to {L,U}COBOUND. */
3254 e->shape = gfc_get_shape (1);
3255 mpz_init_set_ui (e->shape[0], as->corank);
3257 /* Create the constructor for this array. */
3258 for (d = 0; d < as->corank; d++)
3259 gfc_constructor_append_expr (&e->value.constructor,
3260 bounds[d], &e->where);
3265 /* A DIM argument is specified. */
3266 if (dim->expr_type != EXPR_CONSTANT)
3269 d = mpz_get_si (dim->value.integer);
3271 if (d < 1 || d > as->corank)
3273 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3274 return &gfc_bad_expr;
3277 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3283 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3285 return simplify_bound (array, dim, kind, 0);
3290 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3293 /* return simplify_cobound (array, dim, kind, 0);*/
3295 e = simplify_cobound (array, dim, kind, 0);
3299 gfc_error ("Not yet implemented: LCOBOUND for coarray with non-constant "
3300 "cobounds at %L", &array->where);
3301 return &gfc_bad_expr;
3305 gfc_simplify_leadz (gfc_expr *e)
3307 unsigned long lz, bs;
3310 if (e->expr_type != EXPR_CONSTANT)
3313 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3314 bs = gfc_integer_kinds[i].bit_size;
3315 if (mpz_cmp_si (e->value.integer, 0) == 0)
3317 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3320 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3322 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3327 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3330 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3333 return &gfc_bad_expr;
3335 if (e->expr_type == EXPR_CONSTANT)
3337 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3338 mpz_set_si (result->value.integer, e->value.character.length);
3339 return range_check (result, "LEN");
3341 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3342 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3343 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3345 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3346 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3347 return range_check (result, "LEN");
3355 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3359 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3362 return &gfc_bad_expr;
3364 if (e->expr_type != EXPR_CONSTANT)
3367 len = e->value.character.length;
3368 for (count = 0, i = 1; i <= len; i++)
3369 if (e->value.character.string[len - i] == ' ')
3374 result = gfc_get_int_expr (k, &e->where, len - count);
3375 return range_check (result, "LEN_TRIM");
3379 gfc_simplify_lgamma (gfc_expr *x)
3384 if (x->expr_type != EXPR_CONSTANT)
3387 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3388 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3390 return range_check (result, "LGAMMA");
3395 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3397 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3400 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3401 gfc_compare_string (a, b) >= 0);
3406 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3408 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3411 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3412 gfc_compare_string (a, b) > 0);
3417 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3419 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3422 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3423 gfc_compare_string (a, b) <= 0);
3428 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3430 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3433 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3434 gfc_compare_string (a, b) < 0);
3439 gfc_simplify_log (gfc_expr *x)
3443 if (x->expr_type != EXPR_CONSTANT)
3446 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3451 if (mpfr_sgn (x->value.real) <= 0)
3453 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3454 "to zero", &x->where);
3455 gfc_free_expr (result);
3456 return &gfc_bad_expr;
3459 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3463 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3464 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3466 gfc_error ("Complex argument of LOG at %L cannot be zero",
3468 gfc_free_expr (result);
3469 return &gfc_bad_expr;
3472 gfc_set_model_kind (x->ts.kind);
3473 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3477 gfc_internal_error ("gfc_simplify_log: bad type");
3480 return range_check (result, "LOG");
3485 gfc_simplify_log10 (gfc_expr *x)
3489 if (x->expr_type != EXPR_CONSTANT)
3492 if (mpfr_sgn (x->value.real) <= 0)
3494 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3495 "to zero", &x->where);
3496 return &gfc_bad_expr;
3499 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3500 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3502 return range_check (result, "LOG10");
3507 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3511 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3513 return &gfc_bad_expr;
3515 if (e->expr_type != EXPR_CONSTANT)
3518 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3523 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3526 int row, result_rows, col, result_columns;
3527 int stride_a, offset_a, stride_b, offset_b;
3529 if (!is_constant_array_expr (matrix_a)
3530 || !is_constant_array_expr (matrix_b))
3533 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3534 result = gfc_get_array_expr (matrix_a->ts.type,
3538 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3541 result_columns = mpz_get_si (matrix_b->shape[0]);
3543 stride_b = mpz_get_si (matrix_b->shape[0]);
3546 result->shape = gfc_get_shape (result->rank);
3547 mpz_init_set_si (result->shape[0], result_columns);
3549 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3551 result_rows = mpz_get_si (matrix_b->shape[0]);
3553 stride_a = mpz_get_si (matrix_a->shape[0]);
3557 result->shape = gfc_get_shape (result->rank);
3558 mpz_init_set_si (result->shape[0], result_rows);
3560 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3562 result_rows = mpz_get_si (matrix_a->shape[0]);
3563 result_columns = mpz_get_si (matrix_b->shape[1]);
3564 stride_a = mpz_get_si (matrix_a->shape[1]);
3565 stride_b = mpz_get_si (matrix_b->shape[0]);
3568 result->shape = gfc_get_shape (result->rank);
3569 mpz_init_set_si (result->shape[0], result_rows);
3570 mpz_init_set_si (result->shape[1], result_columns);
3575 offset_a = offset_b = 0;
3576 for (col = 0; col < result_columns; ++col)
3580 for (row = 0; row < result_rows; ++row)
3582 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3583 matrix_b, 1, offset_b);
3584 gfc_constructor_append_expr (&result->value.constructor,
3590 offset_b += stride_b;
3598 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3600 if (tsource->expr_type != EXPR_CONSTANT
3601 || fsource->expr_type != EXPR_CONSTANT
3602 || mask->expr_type != EXPR_CONSTANT)
3605 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3609 /* Selects bewteen current value and extremum for simplify_min_max
3610 and simplify_minval_maxval. */
3612 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
3614 switch (arg->ts.type)
3617 if (mpz_cmp (arg->value.integer,
3618 extremum->value.integer) * sign > 0)
3619 mpz_set (extremum->value.integer, arg->value.integer);
3623 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
3625 mpfr_max (extremum->value.real, extremum->value.real,
3626 arg->value.real, GFC_RND_MODE);
3628 mpfr_min (extremum->value.real, extremum->value.real,
3629 arg->value.real, GFC_RND_MODE);
3633 #define LENGTH(x) ((x)->value.character.length)
3634 #define STRING(x) ((x)->value.character.string)
3635 if (LENGTH(extremum) < LENGTH(arg))
3637 gfc_char_t *tmp = STRING(extremum);
3639 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
3640 memcpy (STRING(extremum), tmp,
3641 LENGTH(extremum) * sizeof (gfc_char_t));
3642 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
3643 LENGTH(arg) - LENGTH(extremum));
3644 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
3645 LENGTH(extremum) = LENGTH(arg);
3649 if (gfc_compare_string (arg, extremum) * sign > 0)
3651 gfc_free (STRING(extremum));
3652 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
3653 memcpy (STRING(extremum), STRING(arg),
3654 LENGTH(arg) * sizeof (gfc_char_t));
3655 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
3656 LENGTH(extremum) - LENGTH(arg));
3657 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
3664 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
3669 /* This function is special since MAX() can take any number of
3670 arguments. The simplified expression is a rewritten version of the
3671 argument list containing at most one constant element. Other
3672 constant elements are deleted. Because the argument list has
3673 already been checked, this function always succeeds. sign is 1 for
3674 MAX(), -1 for MIN(). */
3677 simplify_min_max (gfc_expr *expr, int sign)
3679 gfc_actual_arglist *arg, *last, *extremum;
3680 gfc_intrinsic_sym * specific;
3684 specific = expr->value.function.isym;
3686 arg = expr->value.function.actual;
3688 for (; arg; last = arg, arg = arg->next)
3690 if (arg->expr->expr_type != EXPR_CONSTANT)
3693 if (extremum == NULL)
3699 min_max_choose (arg->expr, extremum->expr, sign);
3701 /* Delete the extra constant argument. */
3703 expr->value.function.actual = arg->next;
3705 last->next = arg->next;
3708 gfc_free_actual_arglist (arg);
3712 /* If there is one value left, replace the function call with the
3714 if (expr->value.function.actual->next != NULL)
3717 /* Convert to the correct type and kind. */
3718 if (expr->ts.type != BT_UNKNOWN)
3719 return gfc_convert_constant (expr->value.function.actual->expr,
3720 expr->ts.type, expr->ts.kind);
3722 if (specific->ts.type != BT_UNKNOWN)
3723 return gfc_convert_constant (expr->value.function.actual->expr,
3724 specific->ts.type, specific->ts.kind);
3726 return gfc_copy_expr (expr->value.function.actual->expr);
3731 gfc_simplify_min (gfc_expr *e)
3733 return simplify_min_max (e, -1);
3738 gfc_simplify_max (gfc_expr *e)
3740 return simplify_min_max (e, 1);
3744 /* This is a simplified version of simplify_min_max to provide
3745 simplification of minval and maxval for a vector. */
3748 simplify_minval_maxval (gfc_expr *expr, int sign)
3750 gfc_constructor *c, *extremum;
3751 gfc_intrinsic_sym * specific;
3754 specific = expr->value.function.isym;
3756 for (c = gfc_constructor_first (expr->value.constructor);
3757 c; c = gfc_constructor_next (c))
3759 if (c->expr->expr_type != EXPR_CONSTANT)
3762 if (extremum == NULL)
3768 min_max_choose (c->expr, extremum->expr, sign);
3771 if (extremum == NULL)
3774 /* Convert to the correct type and kind. */
3775 if (expr->ts.type != BT_UNKNOWN)
3776 return gfc_convert_constant (extremum->expr,
3777 expr->ts.type, expr->ts.kind);
3779 if (specific->ts.type != BT_UNKNOWN)
3780 return gfc_convert_constant (extremum->expr,
3781 specific->ts.type, specific->ts.kind);
3783 return gfc_copy_expr (extremum->expr);
3788 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3790 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3793 return simplify_minval_maxval (array, -1);
3798 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3800 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3803 return simplify_minval_maxval (array, 1);
3808 gfc_simplify_maxexponent (gfc_expr *x)
3810 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3811 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3812 gfc_real_kinds[i].max_exponent);
3817 gfc_simplify_minexponent (gfc_expr *x)
3819 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3820 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3821 gfc_real_kinds[i].min_exponent);
3826 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
3832 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3835 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3836 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3841 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3843 /* Result is processor-dependent. */
3844 gfc_error ("Second argument MOD at %L is zero", &a->where);
3845 gfc_free_expr (result);
3846 return &gfc_bad_expr;
3848 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
3852 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3854 /* Result is processor-dependent. */
3855 gfc_error ("Second argument of MOD at %L is zero", &p->where);
3856 gfc_free_expr (result);
3857 return &gfc_bad_expr;
3860 gfc_set_model_kind (kind);
3862 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3863 mpfr_trunc (tmp, tmp);
3864 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3865 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3870 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
3873 return range_check (result, "MOD");
3878 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
3884 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3887 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3888 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3893 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3895 /* Result is processor-dependent. This processor just opts
3896 to not handle it at all. */
3897 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
3898 gfc_free_expr (result);
3899 return &gfc_bad_expr;
3901 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
3906 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3908 /* Result is processor-dependent. */
3909 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
3910 gfc_free_expr (result);
3911 return &gfc_bad_expr;
3914 gfc_set_model_kind (kind);
3916 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3917 mpfr_floor (tmp, tmp);
3918 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3919 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3924 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
3927 return range_check (result, "MODULO");
3931 /* Exists for the sole purpose of consistency with other intrinsics. */
3933 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
3934 gfc_expr *fp ATTRIBUTE_UNUSED,
3935 gfc_expr *l ATTRIBUTE_UNUSED,
3936 gfc_expr *to ATTRIBUTE_UNUSED,
3937 gfc_expr *tp ATTRIBUTE_UNUSED)
3944 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
3947 mp_exp_t emin, emax;
3950 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3953 if (mpfr_sgn (s->value.real) == 0)
3955 gfc_error ("Second argument of NEAREST at %L shall not be zero",
3957 return &gfc_bad_expr;
3960 result = gfc_copy_expr (x);
3962 /* Save current values of emin and emax. */
3963 emin = mpfr_get_emin ();
3964 emax = mpfr_get_emax ();
3966 /* Set emin and emax for the current model number. */
3967 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
3968 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
3969 mpfr_get_prec(result->value.real) + 1);
3970 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
3971 mpfr_check_range (result->value.real, 0, GMP_RNDU);
3973 if (mpfr_sgn (s->value.real) > 0)
3975 mpfr_nextabove (result->value.real);
3976 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
3980 mpfr_nextbelow (result->value.real);
3981 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
3984 mpfr_set_emin (emin);
3985 mpfr_set_emax (emax);
3987 /* Only NaN can occur. Do not use range check as it gives an
3988 error for denormal numbers. */
3989 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
3991 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
3992 gfc_free_expr (result);
3993 return &gfc_bad_expr;
4001 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4003 gfc_expr *itrunc, *result;
4006 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4008 return &gfc_bad_expr;
4010 if (e->expr_type != EXPR_CONSTANT)
4013 itrunc = gfc_copy_expr (e);
4014 mpfr_round (itrunc->value.real, e->value.real);
4016 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4017 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4019 gfc_free_expr (itrunc);
4021 return range_check (result, name);
4026 gfc_simplify_new_line (gfc_expr *e)
4030 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4031 result->value.character.string[0] = '\n';
4038 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4040 return simplify_nint ("NINT", e, k);
4045 gfc_simplify_idnint (gfc_expr *e)
4047 return simplify_nint ("IDNINT", e, NULL);
4052 gfc_simplify_not (gfc_expr *e)
4056 if (e->expr_type != EXPR_CONSTANT)
4059 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4060 mpz_com (result->value.integer, e->value.integer);
4062 return range_check (result, "NOT");
4067 gfc_simplify_null (gfc_expr *mold)
4073 result = gfc_copy_expr (mold);
4074 result->expr_type = EXPR_NULL;
4077 result = gfc_get_null_expr (NULL);
4084 gfc_simplify_num_images (void)
4088 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4090 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4091 return &gfc_bad_expr;
4094 /* FIXME: gfc_current_locus is wrong. */
4095 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4096 &gfc_current_locus);
4097 mpz_set_si (result->value.integer, 1);
4103 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4108 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4111 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4116 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4117 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4118 return range_check (result, "OR");
4121 return gfc_get_logical_expr (kind, &x->where,
4122 x->value.logical || y->value.logical);
4130 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4133 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4135 if (!is_constant_array_expr(array)
4136 || !is_constant_array_expr(vector)
4137 || (!gfc_is_constant_expr (mask)
4138 && !is_constant_array_expr(mask)))
4141 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4143 array_ctor = gfc_constructor_first (array->value.constructor);
4144 vector_ctor = vector
4145 ? gfc_constructor_first (vector->value.constructor)
4148 if (mask->expr_type == EXPR_CONSTANT
4149 && mask->value.logical)
4151 /* Copy all elements of ARRAY to RESULT. */
4154 gfc_constructor_append_expr (&result->value.constructor,
4155 gfc_copy_expr (array_ctor->expr),
4158 array_ctor = gfc_constructor_next (array_ctor);
4159 vector_ctor = gfc_constructor_next (vector_ctor);
4162 else if (mask->expr_type == EXPR_ARRAY)
4164 /* Copy only those elements of ARRAY to RESULT whose
4165 MASK equals .TRUE.. */
4166 mask_ctor = gfc_constructor_first (mask->value.constructor);
4169 if (mask_ctor->expr->value.logical)
4171 gfc_constructor_append_expr (&result->value.constructor,
4172 gfc_copy_expr (array_ctor->expr),
4174 vector_ctor = gfc_constructor_next (vector_ctor);
4177 array_ctor = gfc_constructor_next (array_ctor);
4178 mask_ctor = gfc_constructor_next (mask_ctor);
4182 /* Append any left-over elements from VECTOR to RESULT. */
4185 gfc_constructor_append_expr (&result->value.constructor,
4186 gfc_copy_expr (vector_ctor->expr),
4188 vector_ctor = gfc_constructor_next (vector_ctor);
4191 result->shape = gfc_get_shape (1);
4192 gfc_array_size (result, &result->shape[0]);
4194 if (array->ts.type == BT_CHARACTER)
4195 result->ts.u.cl = array->ts.u.cl;
4202 gfc_simplify_precision (gfc_expr *e)
4204 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4205 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4206 gfc_real_kinds[i].precision);
4211 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4215 if (!is_constant_array_expr (array)
4216 || !gfc_is_constant_expr (dim))
4220 && !is_constant_array_expr (mask)
4221 && mask->expr_type != EXPR_CONSTANT)
4224 result = transformational_result (array, dim, array->ts.type,
4225 array->ts.kind, &array->where);
4226 init_result_expr (result, 1, NULL);
4228 return !dim || array->rank == 1 ?
4229 simplify_transformation_to_scalar (result, array, mask, gfc_multiply) :
4230 simplify_transformation_to_array (result, array, dim, mask, gfc_multiply);
4235 gfc_simplify_radix (gfc_expr *e)
4238 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4243 i = gfc_integer_kinds[i].radix;
4247 i = gfc_real_kinds[i].radix;
4254 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4259 gfc_simplify_range (gfc_expr *e)
4262 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4267 i = gfc_integer_kinds[i].range;
4272 i = gfc_real_kinds[i].range;
4279 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4284 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4286 gfc_expr *result = NULL;
4289 if (e->ts.type == BT_COMPLEX)
4290 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4292 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4295 return &gfc_bad_expr;
4297 if (e->expr_type != EXPR_CONSTANT)
4300 if (convert_boz (e, kind) == &gfc_bad_expr)
4301 return &gfc_bad_expr;
4303 result = gfc_convert_constant (e, BT_REAL, kind);
4304 if (result == &gfc_bad_expr)
4305 return &gfc_bad_expr;
4307 return range_check (result, "REAL");
4312 gfc_simplify_realpart (gfc_expr *e)
4316 if (e->expr_type != EXPR_CONSTANT)
4319 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4320 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4322 return range_check (result, "REALPART");
4326 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4329 int i, j, len, ncop, nlen;
4331 bool have_length = false;
4333 /* If NCOPIES isn't a constant, there's nothing we can do. */
4334 if (n->expr_type != EXPR_CONSTANT)
4337 /* If NCOPIES is negative, it's an error. */
4338 if (mpz_sgn (n->value.integer) < 0)
4340 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4342 return &gfc_bad_expr;
4345 /* If we don't know the character length, we can do no more. */
4346 if (e->ts.u.cl && e->ts.u.cl->length
4347 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4349 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4352 else if (e->expr_type == EXPR_CONSTANT
4353 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4355 len = e->value.character.length;
4360 /* If the source length is 0, any value of NCOPIES is valid
4361 and everything behaves as if NCOPIES == 0. */
4364 mpz_set_ui (ncopies, 0);
4366 mpz_set (ncopies, n->value.integer);
4368 /* Check that NCOPIES isn't too large. */
4374 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4376 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4380 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4381 e->ts.u.cl->length->value.integer);
4385 mpz_init_set_si (mlen, len);
4386 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4390 /* The check itself. */
4391 if (mpz_cmp (ncopies, max) > 0)
4394 mpz_clear (ncopies);
4395 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4397 return &gfc_bad_expr;
4402 mpz_clear (ncopies);
4404 /* For further simplification, we need the character string to be
4406 if (e->expr_type != EXPR_CONSTANT)
4410 (e->ts.u.cl->length &&
4411 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4413 const char *res = gfc_extract_int (n, &ncop);
4414 gcc_assert (res == NULL);
4419 len = e->value.character.length;
4422 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4425 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4427 len = e->value.character.length;
4430 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4431 for (i = 0; i < ncop; i++)
4432 for (j = 0; j < len; j++)
4433 result->value.character.string[j+i*len]= e->value.character.string[j];
4435 result->value.character.string[nlen] = '\0'; /* For debugger */
4440 /* This one is a bear, but mainly has to do with shuffling elements. */
4443 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4444 gfc_expr *pad, gfc_expr *order_exp)
4446 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4447 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4451 gfc_expr *e, *result;
4453 /* Check that argument expression types are OK. */
4454 if (!is_constant_array_expr (source)
4455 || !is_constant_array_expr (shape_exp)
4456 || !is_constant_array_expr (pad)
4457 || !is_constant_array_expr (order_exp))
4460 /* Proceed with simplification, unpacking the array. */
4467 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
4471 gfc_extract_int (e, &shape[rank]);
4473 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
4474 gcc_assert (shape[rank] >= 0);
4479 gcc_assert (rank > 0);
4481 /* Now unpack the order array if present. */
4482 if (order_exp == NULL)
4484 for (i = 0; i < rank; i++)
4489 for (i = 0; i < rank; i++)
4492 for (i = 0; i < rank; i++)
4494 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
4497 gfc_extract_int (e, &order[i]);
4499 gcc_assert (order[i] >= 1 && order[i] <= rank);
4501 gcc_assert (x[order[i]] == 0);
4506 /* Count the elements in the source and padding arrays. */
4511 gfc_array_size (pad, &size);
4512 npad = mpz_get_ui (size);
4516 gfc_array_size (source, &size);
4517 nsource = mpz_get_ui (size);
4520 /* If it weren't for that pesky permutation we could just loop
4521 through the source and round out any shortage with pad elements.
4522 But no, someone just had to have the compiler do something the
4523 user should be doing. */
4525 for (i = 0; i < rank; i++)
4528 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
4530 result->rank = rank;
4531 result->shape = gfc_get_shape (rank);
4532 for (i = 0; i < rank; i++)
4533 mpz_init_set_ui (result->shape[i], shape[i]);
4535 while (nsource > 0 || npad > 0)
4537 /* Figure out which element to extract. */
4538 mpz_set_ui (index, 0);
4540 for (i = rank - 1; i >= 0; i--)
4542 mpz_add_ui (index, index, x[order[i]]);
4544 mpz_mul_ui (index, index, shape[order[i - 1]]);
4547 if (mpz_cmp_ui (index, INT_MAX) > 0)
4548 gfc_internal_error ("Reshaped array too large at %C");
4550 j = mpz_get_ui (index);
4553 e = gfc_constructor_lookup_expr (source->value.constructor, j);
4556 gcc_assert (npad > 0);
4560 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
4564 gfc_constructor_append_expr (&result->value.constructor,
4565 gfc_copy_expr (e), &e->where);
4567 /* Calculate the next element. */
4571 if (++x[i] < shape[i])
4587 gfc_simplify_rrspacing (gfc_expr *x)
4593 if (x->expr_type != EXPR_CONSTANT)
4596 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
4598 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
4599 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4601 /* Special case x = -0 and 0. */
4602 if (mpfr_sgn (result->value.real) == 0)
4604 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4608 /* | x * 2**(-e) | * 2**p. */
4609 e = - (long int) mpfr_get_exp (x->value.real);
4610 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
4612 p = (long int) gfc_real_kinds[i].digits;
4613 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
4615 return range_check (result, "RRSPACING");
4620 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
4622 int k, neg_flag, power, exp_range;
4623 mpfr_t scale, radix;
4626 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
4629 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
4631 if (mpfr_sgn (x->value.real) == 0)
4633 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4637 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4639 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
4641 /* This check filters out values of i that would overflow an int. */
4642 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
4643 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
4645 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
4646 gfc_free_expr (result);
4647 return &gfc_bad_expr;
4650 /* Compute scale = radix ** power. */
4651 power = mpz_get_si (i->value.integer);
4661 gfc_set_model_kind (x->ts.kind);
4664 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
4665 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
4668 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
4670 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
4672 mpfr_clears (scale, radix, NULL);
4674 return range_check (result, "SCALE");
4678 /* Variants of strspn and strcspn that operate on wide characters. */
4681 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
4684 const gfc_char_t *c;
4688 for (c = s2; *c; c++)
4702 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
4705 const gfc_char_t *c;
4709 for (c = s2; *c; c++)
4724 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
4729 size_t indx, len, lenc;
4730 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
4733 return &gfc_bad_expr;
4735 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
4738 if (b != NULL && b->value.logical != 0)
4743 len = e->value.character.length;
4744 lenc = c->value.character.length;
4746 if (len == 0 || lenc == 0)
4754 indx = wide_strcspn (e->value.character.string,
4755 c->value.character.string) + 1;
4762 for (indx = len; indx > 0; indx--)
4764 for (i = 0; i < lenc; i++)
4766 if (c->value.character.string[i]
4767 == e->value.character.string[indx - 1])
4776 result = gfc_get_int_expr (k, &e->where, indx);
4777 return range_check (result, "SCAN");
4782 gfc_simplify_selected_char_kind (gfc_expr *e)
4786 if (e->expr_type != EXPR_CONSTANT)
4789 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
4790 || gfc_compare_with_Cstring (e, "default", false) == 0)
4792 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
4797 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
4802 gfc_simplify_selected_int_kind (gfc_expr *e)
4806 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
4811 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
4812 if (gfc_integer_kinds[i].range >= range
4813 && gfc_integer_kinds[i].kind < kind)
4814 kind = gfc_integer_kinds[i].kind;
4816 if (kind == INT_MAX)
4819 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
4824 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
4826 int range, precision, radix, i, kind, found_precision, found_range,
4828 locus *loc = &gfc_current_locus;
4834 if (p->expr_type != EXPR_CONSTANT
4835 || gfc_extract_int (p, &precision) != NULL)
4844 if (q->expr_type != EXPR_CONSTANT
4845 || gfc_extract_int (q, &range) != NULL)
4856 if (rdx->expr_type != EXPR_CONSTANT
4857 || gfc_extract_int (rdx, &radix) != NULL)
4865 found_precision = 0;
4869 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
4871 if (gfc_real_kinds[i].precision >= precision)
4872 found_precision = 1;
4874 if (gfc_real_kinds[i].range >= range)
4877 if (gfc_real_kinds[i].radix >= radix)
4880 if (gfc_real_kinds[i].precision >= precision
4881 && gfc_real_kinds[i].range >= range
4882 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
4883 kind = gfc_real_kinds[i].kind;
4886 if (kind == INT_MAX)
4888 if (found_radix && found_range && !found_precision)
4890 else if (found_radix && found_precision && !found_range)
4892 else if (found_radix && !found_precision && !found_range)
4894 else if (found_radix)
4900 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
4905 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
4908 mpfr_t exp, absv, log2, pow2, frac;
4911 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
4914 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
4916 if (mpfr_sgn (x->value.real) == 0)
4918 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4922 gfc_set_model_kind (x->ts.kind);
4929 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
4930 mpfr_log2 (log2, absv, GFC_RND_MODE);
4932 mpfr_trunc (log2, log2);
4933 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
4935 /* Old exponent value, and fraction. */
4936 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
4938 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
4941 exp2 = (unsigned long) mpz_get_d (i->value.integer);
4942 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
4944 mpfr_clears (absv, log2, pow2, frac, NULL);
4946 return range_check (result, "SET_EXPONENT");
4951 gfc_simplify_shape (gfc_expr *source)
4953 mpz_t shape[GFC_MAX_DIMENSIONS];
4954 gfc_expr *result, *e, *f;
4959 if (source->rank == 0)
4960 return gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind,
4963 result = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind,
4966 if (source->expr_type == EXPR_VARIABLE)
4968 ar = gfc_find_array_ref (source);
4969 t = gfc_array_ref_shape (ar, shape);
4971 else if (source->shape)
4974 for (n = 0; n < source->rank; n++)
4976 mpz_init (shape[n]);
4977 mpz_set (shape[n], source->shape[n]);
4983 for (n = 0; n < source->rank; n++)
4985 e = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4990 mpz_set (e->value.integer, shape[n]);
4991 mpz_clear (shape[n]);
4995 mpz_set_ui (e->value.integer, n + 1);
4997 f = gfc_simplify_size (source, e, NULL);
5001 gfc_free_expr (result);
5008 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5016 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5020 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5023 return &gfc_bad_expr;
5025 /* For unary operations, the size of the result is given by the size
5026 of the operand. For binary ones, it's the size of the first operand
5027 unless it is scalar, then it is the size of the second. */
5028 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5030 gfc_expr* replacement;
5031 gfc_expr* simplified;
5033 switch (array->value.op.op)
5035 /* Unary operations. */
5037 case INTRINSIC_UPLUS:
5038 case INTRINSIC_UMINUS:
5039 replacement = array->value.op.op1;
5042 /* Binary operations. If any one of the operands is scalar, take
5043 the other one's size. If both of them are arrays, it does not
5044 matter -- try to find one with known shape, if possible. */
5046 if (array->value.op.op1->rank == 0)
5047 replacement = array->value.op.op2;
5048 else if (array->value.op.op2->rank == 0)
5049 replacement = array->value.op.op1;
5052 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5056 replacement = array->value.op.op2;
5061 /* Try to reduce it directly if possible. */
5062 simplified = gfc_simplify_size (replacement, dim, kind);
5064 /* Otherwise, we build a new SIZE call. This is hopefully at least
5065 simpler than the original one. */
5067 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5068 gfc_copy_expr (replacement),
5069 gfc_copy_expr (dim),
5070 gfc_copy_expr (kind));
5077 if (gfc_array_size (array, &size) == FAILURE)
5082 if (dim->expr_type != EXPR_CONSTANT)
5085 d = mpz_get_ui (dim->value.integer) - 1;
5086 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5090 return gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5095 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5099 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5102 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5107 mpz_abs (result->value.integer, x->value.integer);
5108 if (mpz_sgn (y->value.integer) < 0)
5109 mpz_neg (result->value.integer, result->value.integer);
5113 if (gfc_option.flag_sign_zero)
5114 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5117 mpfr_setsign (result->value.real, x->value.real,
5118 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5122 gfc_internal_error ("Bad type in gfc_simplify_sign");
5130 gfc_simplify_sin (gfc_expr *x)
5134 if (x->expr_type != EXPR_CONSTANT)
5137 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5142 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5146 gfc_set_model (x->value.real);
5147 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5151 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5154 return range_check (result, "SIN");
5159 gfc_simplify_sinh (gfc_expr *x)
5163 if (x->expr_type != EXPR_CONSTANT)
5166 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5171 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5175 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5182 return range_check (result, "SINH");
5186 /* The argument is always a double precision real that is converted to
5187 single precision. TODO: Rounding! */
5190 gfc_simplify_sngl (gfc_expr *a)
5194 if (a->expr_type != EXPR_CONSTANT)
5197 result = gfc_real2real (a, gfc_default_real_kind);
5198 return range_check (result, "SNGL");
5203 gfc_simplify_spacing (gfc_expr *x)
5209 if (x->expr_type != EXPR_CONSTANT)
5212 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5214 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5216 /* Special case x = 0 and -0. */
5217 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5218 if (mpfr_sgn (result->value.real) == 0)
5220 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5224 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5225 are the radix, exponent of x, and precision. This excludes the
5226 possibility of subnormal numbers. Fortran 2003 states the result is
5227 b**max(e - p, emin - 1). */
5229 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5230 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5231 en = en > ep ? en : ep;
5233 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5234 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5236 return range_check (result, "SPACING");
5241 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5243 gfc_expr *result = 0L;
5244 int i, j, dim, ncopies;
5247 if ((!gfc_is_constant_expr (source)
5248 && !is_constant_array_expr (source))
5249 || !gfc_is_constant_expr (dim_expr)
5250 || !gfc_is_constant_expr (ncopies_expr))
5253 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5254 gfc_extract_int (dim_expr, &dim);
5255 dim -= 1; /* zero-base DIM */
5257 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5258 gfc_extract_int (ncopies_expr, &ncopies);
5259 ncopies = MAX (ncopies, 0);
5261 /* Do not allow the array size to exceed the limit for an array
5263 if (source->expr_type == EXPR_ARRAY)
5265 if (gfc_array_size (source, &size) == FAILURE)
5266 gfc_internal_error ("Failure getting length of a constant array.");
5269 mpz_init_set_ui (size, 1);
5271 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5274 if (source->expr_type == EXPR_CONSTANT)
5276 gcc_assert (dim == 0);
5278 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5281 result->shape = gfc_get_shape (result->rank);
5282 mpz_init_set_si (result->shape[0], ncopies);
5284 for (i = 0; i < ncopies; ++i)
5285 gfc_constructor_append_expr (&result->value.constructor,
5286 gfc_copy_expr (source), NULL);
5288 else if (source->expr_type == EXPR_ARRAY)
5290 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5291 gfc_constructor *source_ctor;
5293 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5294 gcc_assert (dim >= 0 && dim <= source->rank);
5296 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5298 result->rank = source->rank + 1;
5299 result->shape = gfc_get_shape (result->rank);
5301 for (i = 0, j = 0; i < result->rank; ++i)
5304 mpz_init_set (result->shape[i], source->shape[j++]);
5306 mpz_init_set_si (result->shape[i], ncopies);
5308 extent[i] = mpz_get_si (result->shape[i]);
5309 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5313 for (source_ctor = gfc_constructor_first (source->value.constructor);
5314 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5316 for (i = 0; i < ncopies; ++i)
5317 gfc_constructor_insert_expr (&result->value.constructor,
5318 gfc_copy_expr (source_ctor->expr),
5319 NULL, offset + i * rstride[dim]);
5321 offset += (dim == 0 ? ncopies : 1);
5325 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5326 Replace NULL with gcc_unreachable() after implementing
5327 gfc_simplify_cshift(). */
5330 if (source->ts.type == BT_CHARACTER)
5331 result->ts.u.cl = source->ts.u.cl;
5338 gfc_simplify_sqrt (gfc_expr *e)
5340 gfc_expr *result = NULL;
5342 if (e->expr_type != EXPR_CONSTANT)
5348 if (mpfr_cmp_si (e->value.real, 0) < 0)
5350 gfc_error ("Argument of SQRT at %L has a negative value",
5352 return &gfc_bad_expr;
5354 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5355 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5359 gfc_set_model (e->value.real);
5361 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5362 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5366 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5369 return range_check (result, "SQRT");
5374 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5378 if (!is_constant_array_expr (array)
5379 || !gfc_is_constant_expr (dim))
5383 && !is_constant_array_expr (mask)
5384 && mask->expr_type != EXPR_CONSTANT)
5387 result = transformational_result (array, dim, array->ts.type,
5388 array->ts.kind, &array->where);
5389 init_result_expr (result, 0, NULL);
5391 return !dim || array->rank == 1 ?
5392 simplify_transformation_to_scalar (result, array, mask, gfc_add) :
5393 simplify_transformation_to_array (result, array, dim, mask, gfc_add);
5398 gfc_simplify_tan (gfc_expr *x)
5402 if (x->expr_type != EXPR_CONSTANT)
5405 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5410 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5414 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5421 return range_check (result, "TAN");
5426 gfc_simplify_tanh (gfc_expr *x)
5430 if (x->expr_type != EXPR_CONSTANT)
5433 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5438 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5442 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5449 return range_check (result, "TANH");
5454 gfc_simplify_tiny (gfc_expr *e)
5459 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5461 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5462 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5469 gfc_simplify_trailz (gfc_expr *e)
5471 unsigned long tz, bs;
5474 if (e->expr_type != EXPR_CONSTANT)
5477 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5478 bs = gfc_integer_kinds[i].bit_size;
5479 tz = mpz_scan1 (e->value.integer, 0);
5481 return gfc_get_int_expr (gfc_default_integer_kind,
5482 &e->where, MIN (tz, bs));
5487 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
5490 gfc_expr *mold_element;
5493 size_t result_elt_size;
5496 unsigned char *buffer;
5498 if (!gfc_is_constant_expr (source)
5499 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
5500 || !gfc_is_constant_expr (size))
5503 if (source->expr_type == EXPR_FUNCTION)
5506 /* Calculate the size of the source. */
5507 if (source->expr_type == EXPR_ARRAY
5508 && gfc_array_size (source, &tmp) == FAILURE)
5509 gfc_internal_error ("Failure getting length of a constant array.");
5511 source_size = gfc_target_expr_size (source);
5513 /* Create an empty new expression with the appropriate characteristics. */
5514 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
5516 result->ts = mold->ts;
5518 mold_element = mold->expr_type == EXPR_ARRAY
5519 ? gfc_constructor_first (mold->value.constructor)->expr
5522 /* Set result character length, if needed. Note that this needs to be
5523 set even for array expressions, in order to pass this information into
5524 gfc_target_interpret_expr. */
5525 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
5526 result->value.character.length = mold_element->value.character.length;
5528 /* Set the number of elements in the result, and determine its size. */
5529 result_elt_size = gfc_target_expr_size (mold_element);
5530 if (result_elt_size == 0)
5532 gfc_free_expr (result);
5536 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
5540 result->expr_type = EXPR_ARRAY;
5544 result_length = (size_t)mpz_get_ui (size->value.integer);
5547 result_length = source_size / result_elt_size;
5548 if (result_length * result_elt_size < source_size)
5552 result->shape = gfc_get_shape (1);
5553 mpz_init_set_ui (result->shape[0], result_length);
5555 result_size = result_length * result_elt_size;
5560 result_size = result_elt_size;
5563 if (gfc_option.warn_surprising && source_size < result_size)
5564 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
5565 "source size %ld < result size %ld", &source->where,
5566 (long) source_size, (long) result_size);
5568 /* Allocate the buffer to store the binary version of the source. */
5569 buffer_size = MAX (source_size, result_size);
5570 buffer = (unsigned char*)alloca (buffer_size);
5571 memset (buffer, 0, buffer_size);
5573 /* Now write source to the buffer. */
5574 gfc_target_encode_expr (source, buffer, buffer_size);
5576 /* And read the buffer back into the new expression. */
5577 gfc_target_interpret_expr (buffer, buffer_size, result);
5584 gfc_simplify_transpose (gfc_expr *matrix)
5586 int row, matrix_rows, col, matrix_cols;
5589 if (!is_constant_array_expr (matrix))
5592 gcc_assert (matrix->rank == 2);
5594 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
5597 result->shape = gfc_get_shape (result->rank);
5598 mpz_set (result->shape[0], matrix->shape[1]);
5599 mpz_set (result->shape[1], matrix->shape[0]);
5601 if (matrix->ts.type == BT_CHARACTER)
5602 result->ts.u.cl = matrix->ts.u.cl;
5604 matrix_rows = mpz_get_si (matrix->shape[0]);
5605 matrix_cols = mpz_get_si (matrix->shape[1]);
5606 for (row = 0; row < matrix_rows; ++row)
5607 for (col = 0; col < matrix_cols; ++col)
5609 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
5610 col * matrix_rows + row);
5611 gfc_constructor_insert_expr (&result->value.constructor,
5612 gfc_copy_expr (e), &matrix->where,
5613 row * matrix_cols + col);
5621 gfc_simplify_trim (gfc_expr *e)
5624 int count, i, len, lentrim;
5626 if (e->expr_type != EXPR_CONSTANT)
5629 len = e->value.character.length;
5630 for (count = 0, i = 1; i <= len; ++i)
5632 if (e->value.character.string[len - i] == ' ')
5638 lentrim = len - count;
5640 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
5641 for (i = 0; i < lentrim; i++)
5642 result->value.character.string[i] = e->value.character.string[i];
5649 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
5654 gfc_constructor *sub_cons;
5658 if (!is_constant_array_expr (sub))
5659 goto not_implemented; /* return NULL;*/
5661 /* Follow any component references. */
5662 as = coarray->symtree->n.sym->as;
5663 for (ref = coarray->ref; ref; ref = ref->next)
5664 if (ref->type == REF_COMPONENT)
5667 if (as->type == AS_DEFERRED)
5668 goto not_implemented; /* return NULL;*/
5670 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
5671 the cosubscript addresses the first image. */
5673 sub_cons = gfc_constructor_first (sub->value.constructor);
5676 for (d = 1; d <= as->corank; d++)
5681 if (sub_cons == NULL)
5683 gfc_error ("Too few elements in expression for SUB= argument at %L",
5685 return &gfc_bad_expr;
5688 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
5690 if (ca_bound == NULL)
5691 goto not_implemented; /* return NULL */
5693 if (ca_bound == &gfc_bad_expr)
5696 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
5700 gfc_free_expr (ca_bound);
5701 sub_cons = gfc_constructor_next (sub_cons);
5705 first_image = false;
5709 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
5710 "SUB has %ld and COARRAY lower bound is %ld)",
5712 mpz_get_si (sub_cons->expr->value.integer),
5713 mpz_get_si (ca_bound->value.integer));
5714 gfc_free_expr (ca_bound);
5715 return &gfc_bad_expr;
5718 gfc_free_expr (ca_bound);
5720 /* Check whether upperbound is valid for the multi-images case. */
5723 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
5725 if (ca_bound == &gfc_bad_expr)
5728 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
5729 && mpz_cmp (ca_bound->value.integer,
5730 sub_cons->expr->value.integer) < 0)
5732 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
5733 "SUB has %ld and COARRAY upper bound is %ld)",
5735 mpz_get_si (sub_cons->expr->value.integer),
5736 mpz_get_si (ca_bound->value.integer));
5737 gfc_free_expr (ca_bound);
5738 return &gfc_bad_expr;
5742 gfc_free_expr (ca_bound);
5745 sub_cons = gfc_constructor_next (sub_cons);
5748 if (sub_cons != NULL)
5750 gfc_error ("Too many elements in expression for SUB= argument at %L",
5752 return &gfc_bad_expr;
5755 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5756 &gfc_current_locus);
5758 mpz_set_si (result->value.integer, 1);
5760 mpz_set_si (result->value.integer, 0);
5765 gfc_error ("Not yet implemented: IMAGE_INDEX for coarray with non-constant "
5766 "cobounds at %L", &coarray->where);
5767 return &gfc_bad_expr;
5772 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
5778 if (coarray == NULL)
5781 /* FIXME: gfc_current_locus is wrong. */
5782 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5783 &gfc_current_locus);
5784 mpz_set_si (result->value.integer, 1);
5788 gcc_assert (coarray->expr_type == EXPR_VARIABLE);
5790 /* Follow any component references. */
5791 as = coarray->symtree->n.sym->as;
5792 for (ref = coarray->ref; ref; ref = ref->next)
5793 if (ref->type == REF_COMPONENT)
5796 if (as->type == AS_DEFERRED)
5797 goto not_implemented; /* return NULL;*/
5801 /* Multi-dimensional bounds. */
5802 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
5805 /* Simplify the bounds for each dimension. */
5806 for (d = 0; d < as->corank; d++)
5808 bounds[d] = simplify_bound_dim (coarray, NULL, d + as->rank + 1, 0,
5810 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
5814 for (j = 0; j < d; j++)
5815 gfc_free_expr (bounds[j]);
5816 if (bounds[d] == NULL)
5817 goto not_implemented;
5822 /* Allocate the result expression. */
5823 e = gfc_get_expr ();
5824 e->where = coarray->where;
5825 e->expr_type = EXPR_ARRAY;
5826 e->ts.type = BT_INTEGER;
5827 e->ts.kind = gfc_default_integer_kind;
5830 e->shape = gfc_get_shape (1);
5831 mpz_init_set_ui (e->shape[0], as->corank);
5833 /* Create the constructor for this array. */
5834 for (d = 0; d < as->corank; d++)
5835 gfc_constructor_append_expr (&e->value.constructor,
5836 bounds[d], &e->where);
5843 /* A DIM argument is specified. */
5844 if (dim->expr_type != EXPR_CONSTANT)
5845 goto not_implemented; /*return NULL;*/
5847 d = mpz_get_si (dim->value.integer);
5849 if (d < 1 || d > as->corank)
5851 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
5852 return &gfc_bad_expr;
5855 /*return simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL, true);*/
5856 e = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL, true);
5860 goto not_implemented;
5864 gfc_error ("Not yet implemented: THIS_IMAGE for coarray with non-constant "
5865 "cobounds at %L", &coarray->where);
5866 return &gfc_bad_expr;
5871 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5873 return simplify_bound (array, dim, kind, 1);
5877 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5880 /* return simplify_cobound (array, dim, kind, 1);*/
5882 e = simplify_cobound (array, dim, kind, 1);
5886 gfc_error ("Not yet implemented: UCOBOUND for coarray with non-constant "
5887 "cobounds at %L", &array->where);
5888 return &gfc_bad_expr;
5893 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
5895 gfc_expr *result, *e;
5896 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
5898 if (!is_constant_array_expr (vector)
5899 || !is_constant_array_expr (mask)
5900 || (!gfc_is_constant_expr (field)
5901 && !is_constant_array_expr(field)))
5904 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
5906 result->rank = mask->rank;
5907 result->shape = gfc_copy_shape (mask->shape, mask->rank);
5909 if (vector->ts.type == BT_CHARACTER)
5910 result->ts.u.cl = vector->ts.u.cl;
5912 vector_ctor = gfc_constructor_first (vector->value.constructor);
5913 mask_ctor = gfc_constructor_first (mask->value.constructor);
5915 = field->expr_type == EXPR_ARRAY
5916 ? gfc_constructor_first (field->value.constructor)
5921 if (mask_ctor->expr->value.logical)
5923 gcc_assert (vector_ctor);
5924 e = gfc_copy_expr (vector_ctor->expr);
5925 vector_ctor = gfc_constructor_next (vector_ctor);
5927 else if (field->expr_type == EXPR_ARRAY)
5928 e = gfc_copy_expr (field_ctor->expr);
5930 e = gfc_copy_expr (field);
5932 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5934 mask_ctor = gfc_constructor_next (mask_ctor);
5935 field_ctor = gfc_constructor_next (field_ctor);
5943 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
5947 size_t index, len, lenset;
5949 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
5952 return &gfc_bad_expr;
5954 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
5957 if (b != NULL && b->value.logical != 0)
5962 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
5964 len = s->value.character.length;
5965 lenset = set->value.character.length;
5969 mpz_set_ui (result->value.integer, 0);
5977 mpz_set_ui (result->value.integer, 1);
5981 index = wide_strspn (s->value.character.string,
5982 set->value.character.string) + 1;
5991 mpz_set_ui (result->value.integer, len);
5994 for (index = len; index > 0; index --)
5996 for (i = 0; i < lenset; i++)
5998 if (s->value.character.string[index - 1]
5999 == set->value.character.string[i])
6007 mpz_set_ui (result->value.integer, index);
6013 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6018 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6021 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6026 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6027 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6028 return range_check (result, "XOR");
6031 return gfc_get_logical_expr (kind, &x->where,
6032 (x->value.logical && !y->value.logical)
6033 || (!x->value.logical && y->value.logical));
6041 /****************** Constant simplification *****************/
6043 /* Master function to convert one constant to another. While this is
6044 used as a simplification function, it requires the destination type
6045 and kind information which is supplied by a special case in
6049 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6051 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6066 f = gfc_int2complex;
6086 f = gfc_real2complex;
6097 f = gfc_complex2int;
6100 f = gfc_complex2real;
6103 f = gfc_complex2complex;
6129 f = gfc_hollerith2int;
6133 f = gfc_hollerith2real;
6137 f = gfc_hollerith2complex;
6141 f = gfc_hollerith2character;
6145 f = gfc_hollerith2logical;
6155 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6160 switch (e->expr_type)
6163 result = f (e, kind);
6165 return &gfc_bad_expr;
6169 if (!gfc_is_constant_expr (e))
6172 result = gfc_get_array_expr (type, kind, &e->where);
6173 result->shape = gfc_copy_shape (e->shape, e->rank);
6174 result->rank = e->rank;
6176 for (c = gfc_constructor_first (e->value.constructor);
6177 c; c = gfc_constructor_next (c))
6180 if (c->iterator == NULL)
6181 tmp = f (c->expr, kind);
6184 g = gfc_convert_constant (c->expr, type, kind);
6185 if (g == &gfc_bad_expr)
6187 gfc_free_expr (result);
6195 gfc_free_expr (result);
6199 gfc_constructor_append_expr (&result->value.constructor,
6213 /* Function for converting character constants. */
6215 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6220 if (!gfc_is_constant_expr (e))
6223 if (e->expr_type == EXPR_CONSTANT)
6225 /* Simple case of a scalar. */
6226 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6228 return &gfc_bad_expr;
6230 result->value.character.length = e->value.character.length;
6231 result->value.character.string
6232 = gfc_get_wide_string (e->value.character.length + 1);
6233 memcpy (result->value.character.string, e->value.character.string,
6234 (e->value.character.length + 1) * sizeof (gfc_char_t));
6236 /* Check we only have values representable in the destination kind. */
6237 for (i = 0; i < result->value.character.length; i++)
6238 if (!gfc_check_character_range (result->value.character.string[i],
6241 gfc_error ("Character '%s' in string at %L cannot be converted "
6242 "into character kind %d",
6243 gfc_print_wide_char (result->value.character.string[i]),
6245 return &gfc_bad_expr;
6250 else if (e->expr_type == EXPR_ARRAY)
6252 /* For an array constructor, we convert each constructor element. */
6255 result = gfc_get_array_expr (type, kind, &e->where);
6256 result->shape = gfc_copy_shape (e->shape, e->rank);
6257 result->rank = e->rank;
6258 result->ts.u.cl = e->ts.u.cl;
6260 for (c = gfc_constructor_first (e->value.constructor);
6261 c; c = gfc_constructor_next (c))
6263 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6264 if (tmp == &gfc_bad_expr)
6266 gfc_free_expr (result);
6267 return &gfc_bad_expr;
6272 gfc_free_expr (result);
6276 gfc_constructor_append_expr (&result->value.constructor,