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(). The result might be post processed using post_op. */
494 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
495 gfc_expr *mask, transformational_op op,
496 transformational_op post_op)
499 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
500 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
501 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
503 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
504 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
505 tmpstride[GFC_MAX_DIMENSIONS];
507 /* Shortcut for constant .FALSE. MASK. */
509 && mask->expr_type == EXPR_CONSTANT
510 && !mask->value.logical)
513 /* Build an indexed table for array element expressions to minimize
514 linked-list traversal. Masked elements are set to NULL. */
515 gfc_array_size (array, &size);
516 arraysize = mpz_get_ui (size);
518 arrayvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * arraysize);
520 array_ctor = gfc_constructor_first (array->value.constructor);
522 if (mask && mask->expr_type == EXPR_ARRAY)
523 mask_ctor = gfc_constructor_first (mask->value.constructor);
525 for (i = 0; i < arraysize; ++i)
527 arrayvec[i] = array_ctor->expr;
528 array_ctor = gfc_constructor_next (array_ctor);
532 if (!mask_ctor->expr->value.logical)
535 mask_ctor = gfc_constructor_next (mask_ctor);
539 /* Same for the result expression. */
540 gfc_array_size (result, &size);
541 resultsize = mpz_get_ui (size);
544 resultvec = (gfc_expr**) gfc_getmem (sizeof (gfc_expr*) * resultsize);
545 result_ctor = gfc_constructor_first (result->value.constructor);
546 for (i = 0; i < resultsize; ++i)
548 resultvec[i] = result_ctor->expr;
549 result_ctor = gfc_constructor_next (result_ctor);
552 gfc_extract_int (dim, &dim_index);
553 dim_index -= 1; /* zero-base index */
557 for (i = 0, n = 0; i < array->rank; ++i)
560 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
563 dim_extent = mpz_get_si (array->shape[i]);
564 dim_stride = tmpstride[i];
568 extent[n] = mpz_get_si (array->shape[i]);
569 sstride[n] = tmpstride[i];
570 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
579 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
581 *dest = op (*dest, gfc_copy_expr (*src));
588 while (!done && count[n] == extent[n])
591 base -= sstride[n] * extent[n];
592 dest -= dstride[n] * extent[n];
595 if (n < result->rank)
606 /* Place updated expression in result constructor. */
607 result_ctor = gfc_constructor_first (result->value.constructor);
608 for (i = 0; i < resultsize; ++i)
611 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
613 result_ctor->expr = resultvec[i];
614 result_ctor = gfc_constructor_next (result_ctor);
618 gfc_free (resultvec);
624 /********************** Simplification functions *****************************/
627 gfc_simplify_abs (gfc_expr *e)
631 if (e->expr_type != EXPR_CONSTANT)
637 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
638 mpz_abs (result->value.integer, e->value.integer);
639 return range_check (result, "IABS");
642 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
643 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
644 return range_check (result, "ABS");
647 gfc_set_model_kind (e->ts.kind);
648 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
649 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
650 return range_check (result, "CABS");
653 gfc_internal_error ("gfc_simplify_abs(): Bad type");
659 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
663 bool too_large = false;
665 if (e->expr_type != EXPR_CONSTANT)
668 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
670 return &gfc_bad_expr;
672 if (mpz_cmp_si (e->value.integer, 0) < 0)
674 gfc_error ("Argument of %s function at %L is negative", name,
676 return &gfc_bad_expr;
679 if (ascii && gfc_option.warn_surprising
680 && mpz_cmp_si (e->value.integer, 127) > 0)
681 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
684 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
689 mpz_init_set_ui (t, 2);
690 mpz_pow_ui (t, t, 32);
691 mpz_sub_ui (t, t, 1);
692 if (mpz_cmp (e->value.integer, t) > 0)
699 gfc_error ("Argument of %s function at %L is too large for the "
700 "collating sequence of kind %d", name, &e->where, kind);
701 return &gfc_bad_expr;
704 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
705 result->value.character.string[0] = mpz_get_ui (e->value.integer);
712 /* We use the processor's collating sequence, because all
713 systems that gfortran currently works on are ASCII. */
716 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
718 return simplify_achar_char (e, k, "ACHAR", true);
723 gfc_simplify_acos (gfc_expr *x)
727 if (x->expr_type != EXPR_CONSTANT)
733 if (mpfr_cmp_si (x->value.real, 1) > 0
734 || mpfr_cmp_si (x->value.real, -1) < 0)
736 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
738 return &gfc_bad_expr;
740 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
741 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
745 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
746 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
750 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
753 return range_check (result, "ACOS");
757 gfc_simplify_acosh (gfc_expr *x)
761 if (x->expr_type != EXPR_CONSTANT)
767 if (mpfr_cmp_si (x->value.real, 1) < 0)
769 gfc_error ("Argument of ACOSH at %L must not be less than 1",
771 return &gfc_bad_expr;
774 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
775 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
779 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
780 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
784 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
787 return range_check (result, "ACOSH");
791 gfc_simplify_adjustl (gfc_expr *e)
797 if (e->expr_type != EXPR_CONSTANT)
800 len = e->value.character.length;
802 for (count = 0, i = 0; i < len; ++i)
804 ch = e->value.character.string[i];
810 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
811 for (i = 0; i < len - count; ++i)
812 result->value.character.string[i] = e->value.character.string[count + i];
819 gfc_simplify_adjustr (gfc_expr *e)
825 if (e->expr_type != EXPR_CONSTANT)
828 len = e->value.character.length;
830 for (count = 0, i = len - 1; i >= 0; --i)
832 ch = e->value.character.string[i];
838 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
839 for (i = 0; i < count; ++i)
840 result->value.character.string[i] = ' ';
842 for (i = count; i < len; ++i)
843 result->value.character.string[i] = e->value.character.string[i - count];
850 gfc_simplify_aimag (gfc_expr *e)
854 if (e->expr_type != EXPR_CONSTANT)
857 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
858 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
860 return range_check (result, "AIMAG");
865 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
867 gfc_expr *rtrunc, *result;
870 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
872 return &gfc_bad_expr;
874 if (e->expr_type != EXPR_CONSTANT)
877 rtrunc = gfc_copy_expr (e);
878 mpfr_trunc (rtrunc->value.real, e->value.real);
880 result = gfc_real2real (rtrunc, kind);
882 gfc_free_expr (rtrunc);
884 return range_check (result, "AINT");
889 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
893 if (!is_constant_array_expr (mask)
894 || !gfc_is_constant_expr (dim))
897 result = transformational_result (mask, dim, mask->ts.type,
898 mask->ts.kind, &mask->where);
899 init_result_expr (result, true, NULL);
901 return !dim || mask->rank == 1 ?
902 simplify_transformation_to_scalar (result, mask, NULL, gfc_and) :
903 simplify_transformation_to_array (result, mask, dim, NULL, gfc_and, NULL);
908 gfc_simplify_dint (gfc_expr *e)
910 gfc_expr *rtrunc, *result;
912 if (e->expr_type != EXPR_CONSTANT)
915 rtrunc = gfc_copy_expr (e);
916 mpfr_trunc (rtrunc->value.real, e->value.real);
918 result = gfc_real2real (rtrunc, gfc_default_double_kind);
920 gfc_free_expr (rtrunc);
922 return range_check (result, "DINT");
927 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
932 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
934 return &gfc_bad_expr;
936 if (e->expr_type != EXPR_CONSTANT)
939 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
940 mpfr_round (result->value.real, e->value.real);
942 return range_check (result, "ANINT");
947 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
952 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
955 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
960 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
961 mpz_and (result->value.integer, x->value.integer, y->value.integer);
962 return range_check (result, "AND");
965 return gfc_get_logical_expr (kind, &x->where,
966 x->value.logical && y->value.logical);
975 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
979 if (!is_constant_array_expr (mask)
980 || !gfc_is_constant_expr (dim))
983 result = transformational_result (mask, dim, mask->ts.type,
984 mask->ts.kind, &mask->where);
985 init_result_expr (result, false, NULL);
987 return !dim || mask->rank == 1 ?
988 simplify_transformation_to_scalar (result, mask, NULL, gfc_or) :
989 simplify_transformation_to_array (result, mask, dim, NULL, gfc_or, NULL);
994 gfc_simplify_dnint (gfc_expr *e)
998 if (e->expr_type != EXPR_CONSTANT)
1001 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1002 mpfr_round (result->value.real, e->value.real);
1004 return range_check (result, "DNINT");
1009 gfc_simplify_asin (gfc_expr *x)
1013 if (x->expr_type != EXPR_CONSTANT)
1019 if (mpfr_cmp_si (x->value.real, 1) > 0
1020 || mpfr_cmp_si (x->value.real, -1) < 0)
1022 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1024 return &gfc_bad_expr;
1026 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1027 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1031 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1032 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1036 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1039 return range_check (result, "ASIN");
1044 gfc_simplify_asinh (gfc_expr *x)
1048 if (x->expr_type != EXPR_CONSTANT)
1051 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1056 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1060 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1064 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1067 return range_check (result, "ASINH");
1072 gfc_simplify_atan (gfc_expr *x)
1076 if (x->expr_type != EXPR_CONSTANT)
1079 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1084 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1088 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1092 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1095 return range_check (result, "ATAN");
1100 gfc_simplify_atanh (gfc_expr *x)
1104 if (x->expr_type != EXPR_CONSTANT)
1110 if (mpfr_cmp_si (x->value.real, 1) >= 0
1111 || mpfr_cmp_si (x->value.real, -1) <= 0)
1113 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1115 return &gfc_bad_expr;
1117 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1118 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1122 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1123 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1127 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1130 return range_check (result, "ATANH");
1135 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1139 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1142 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1144 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1145 "second argument must not be zero", &x->where);
1146 return &gfc_bad_expr;
1149 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1150 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1152 return range_check (result, "ATAN2");
1157 gfc_simplify_bessel_j0 (gfc_expr *x)
1161 if (x->expr_type != EXPR_CONSTANT)
1164 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1165 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1167 return range_check (result, "BESSEL_J0");
1172 gfc_simplify_bessel_j1 (gfc_expr *x)
1176 if (x->expr_type != EXPR_CONSTANT)
1179 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1180 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1182 return range_check (result, "BESSEL_J1");
1187 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1192 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1195 n = mpz_get_si (order->value.integer);
1196 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1197 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1199 return range_check (result, "BESSEL_JN");
1203 /* Simplify transformational form of JN and YN. */
1206 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1213 mpfr_t x2rev, last1, last2;
1215 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1216 || order2->expr_type != EXPR_CONSTANT)
1219 n1 = mpz_get_si (order1->value.integer);
1220 n2 = mpz_get_si (order2->value.integer);
1221 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1223 result->shape = gfc_get_shape (1);
1224 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1229 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1230 YN(N, 0.0) = -Inf. */
1232 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1234 if (!jn && gfc_option.flag_range_check)
1236 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1237 gfc_free_expr (result);
1238 return &gfc_bad_expr;
1243 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1244 mpfr_set_ui (e->value.real, 1.0, GFC_RND_MODE);
1245 gfc_constructor_append_expr (&result->value.constructor, e,
1250 for (i = n1; i <= n2; i++)
1252 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1254 mpfr_set_ui (e->value.real, 0.0, GFC_RND_MODE);
1256 mpfr_set_inf (e->value.real, -1);
1257 gfc_constructor_append_expr (&result->value.constructor, e,
1264 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1265 are stable for downward recursion and Neumann functions are stable
1266 for upward recursion. It is
1268 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1269 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1270 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1272 gfc_set_model_kind (x->ts.kind);
1274 /* Get first recursion anchor. */
1278 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1280 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1282 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1283 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1284 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1288 gfc_free_expr (result);
1289 return &gfc_bad_expr;
1291 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1299 /* Get second recursion anchor. */
1303 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1305 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1307 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1308 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1309 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1314 gfc_free_expr (result);
1315 return &gfc_bad_expr;
1318 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1320 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1329 /* Start actual recursion. */
1332 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1334 for (i = 2; i <= n2-n1; i++)
1336 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1338 /* Special case: For YN, if the previous N gave -INF, set
1339 also N+1 to -INF. */
1340 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1342 mpfr_set_inf (e->value.real, -1);
1343 gfc_constructor_append_expr (&result->value.constructor, e,
1348 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1350 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1351 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1353 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1357 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1360 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1362 mpfr_set (last1, last2, GFC_RND_MODE);
1363 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1376 gfc_free_expr (result);
1377 return &gfc_bad_expr;
1382 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1384 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1389 gfc_simplify_bessel_y0 (gfc_expr *x)
1393 if (x->expr_type != EXPR_CONSTANT)
1396 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1397 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1399 return range_check (result, "BESSEL_Y0");
1404 gfc_simplify_bessel_y1 (gfc_expr *x)
1408 if (x->expr_type != EXPR_CONSTANT)
1411 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1412 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1414 return range_check (result, "BESSEL_Y1");
1419 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1424 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1427 n = mpz_get_si (order->value.integer);
1428 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1429 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1431 return range_check (result, "BESSEL_YN");
1436 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1438 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1443 gfc_simplify_bit_size (gfc_expr *e)
1445 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1446 return gfc_get_int_expr (e->ts.kind, &e->where,
1447 gfc_integer_kinds[i].bit_size);
1452 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1456 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1459 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1460 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1462 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1463 mpz_tstbit (e->value.integer, b));
1468 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1470 gfc_expr *ceil, *result;
1473 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1475 return &gfc_bad_expr;
1477 if (e->expr_type != EXPR_CONSTANT)
1480 ceil = gfc_copy_expr (e);
1481 mpfr_ceil (ceil->value.real, e->value.real);
1483 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1484 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1486 gfc_free_expr (ceil);
1488 return range_check (result, "CEILING");
1493 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1495 return simplify_achar_char (e, k, "CHAR", false);
1499 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1502 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1506 if (convert_boz (x, kind) == &gfc_bad_expr)
1507 return &gfc_bad_expr;
1509 if (convert_boz (y, kind) == &gfc_bad_expr)
1510 return &gfc_bad_expr;
1512 if (x->expr_type != EXPR_CONSTANT
1513 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1516 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1521 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1525 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1529 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1533 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1537 return range_check (result, name);
1542 mpfr_set_z (mpc_imagref (result->value.complex),
1543 y->value.integer, GFC_RND_MODE);
1547 mpfr_set (mpc_imagref (result->value.complex),
1548 y->value.real, GFC_RND_MODE);
1552 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1555 return range_check (result, name);
1560 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1564 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1566 return &gfc_bad_expr;
1568 return simplify_cmplx ("CMPLX", x, y, kind);
1573 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1577 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1578 kind = gfc_default_complex_kind;
1579 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1581 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1583 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1584 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1588 return simplify_cmplx ("COMPLEX", x, y, kind);
1593 gfc_simplify_conjg (gfc_expr *e)
1597 if (e->expr_type != EXPR_CONSTANT)
1600 result = gfc_copy_expr (e);
1601 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1603 return range_check (result, "CONJG");
1608 gfc_simplify_cos (gfc_expr *x)
1612 if (x->expr_type != EXPR_CONSTANT)
1615 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1620 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1624 gfc_set_model_kind (x->ts.kind);
1625 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1629 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1632 return range_check (result, "COS");
1637 gfc_simplify_cosh (gfc_expr *x)
1641 if (x->expr_type != EXPR_CONSTANT)
1644 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1649 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1653 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1660 return range_check (result, "COSH");
1665 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1669 if (!is_constant_array_expr (mask)
1670 || !gfc_is_constant_expr (dim)
1671 || !gfc_is_constant_expr (kind))
1674 result = transformational_result (mask, dim,
1676 get_kind (BT_INTEGER, kind, "COUNT",
1677 gfc_default_integer_kind),
1680 init_result_expr (result, 0, NULL);
1682 /* Passing MASK twice, once as data array, once as mask.
1683 Whenever gfc_count is called, '1' is added to the result. */
1684 return !dim || mask->rank == 1 ?
1685 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1686 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1691 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1693 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1698 gfc_simplify_dble (gfc_expr *e)
1700 gfc_expr *result = NULL;
1702 if (e->expr_type != EXPR_CONSTANT)
1705 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1706 return &gfc_bad_expr;
1708 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1709 if (result == &gfc_bad_expr)
1710 return &gfc_bad_expr;
1712 return range_check (result, "DBLE");
1717 gfc_simplify_digits (gfc_expr *x)
1721 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1726 digits = gfc_integer_kinds[i].digits;
1731 digits = gfc_real_kinds[i].digits;
1738 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1743 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1748 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1751 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1752 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1757 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1758 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1760 mpz_set_ui (result->value.integer, 0);
1765 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1766 mpfr_sub (result->value.real, x->value.real, y->value.real,
1769 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1774 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1777 return range_check (result, "DIM");
1782 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1784 if (!is_constant_array_expr (vector_a)
1785 || !is_constant_array_expr (vector_b))
1788 gcc_assert (vector_a->rank == 1);
1789 gcc_assert (vector_b->rank == 1);
1790 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1792 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1797 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1799 gfc_expr *a1, *a2, *result;
1801 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1804 a1 = gfc_real2real (x, gfc_default_double_kind);
1805 a2 = gfc_real2real (y, gfc_default_double_kind);
1807 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1808 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1813 return range_check (result, "DPROD");
1818 gfc_simplify_erf (gfc_expr *x)
1822 if (x->expr_type != EXPR_CONSTANT)
1825 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1826 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1828 return range_check (result, "ERF");
1833 gfc_simplify_erfc (gfc_expr *x)
1837 if (x->expr_type != EXPR_CONSTANT)
1840 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1841 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1843 return range_check (result, "ERFC");
1847 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1849 #define MAX_ITER 200
1850 #define ARG_LIMIT 12
1852 /* Calculate ERFC_SCALED directly by its definition:
1854 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1856 using a large precision for intermediate results. This is used for all
1857 but large values of the argument. */
1859 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1864 prec = mpfr_get_default_prec ();
1865 mpfr_set_default_prec (10 * prec);
1870 mpfr_set (a, arg, GFC_RND_MODE);
1871 mpfr_sqr (b, a, GFC_RND_MODE);
1872 mpfr_exp (b, b, GFC_RND_MODE);
1873 mpfr_erfc (a, a, GFC_RND_MODE);
1874 mpfr_mul (a, a, b, GFC_RND_MODE);
1876 mpfr_set (res, a, GFC_RND_MODE);
1877 mpfr_set_default_prec (prec);
1883 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
1885 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
1886 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
1889 This is used for large values of the argument. Intermediate calculations
1890 are performed with twice the precision. We don't do a fixed number of
1891 iterations of the sum, but stop when it has converged to the required
1894 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
1896 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
1901 prec = mpfr_get_default_prec ();
1902 mpfr_set_default_prec (2 * prec);
1912 mpfr_init (sumtrunc);
1913 mpfr_set_prec (oldsum, prec);
1914 mpfr_set_prec (sumtrunc, prec);
1916 mpfr_set (x, arg, GFC_RND_MODE);
1917 mpfr_set_ui (sum, 1, GFC_RND_MODE);
1918 mpz_set_ui (num, 1);
1920 mpfr_set (u, x, GFC_RND_MODE);
1921 mpfr_sqr (u, u, GFC_RND_MODE);
1922 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
1923 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
1925 for (i = 1; i < MAX_ITER; i++)
1927 mpfr_set (oldsum, sum, GFC_RND_MODE);
1929 mpz_mul_ui (num, num, 2 * i - 1);
1932 mpfr_set (w, u, GFC_RND_MODE);
1933 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
1935 mpfr_set_z (v, num, GFC_RND_MODE);
1936 mpfr_mul (v, v, w, GFC_RND_MODE);
1938 mpfr_add (sum, sum, v, GFC_RND_MODE);
1940 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
1941 if (mpfr_cmp (sumtrunc, oldsum) == 0)
1945 /* We should have converged by now; otherwise, ARG_LIMIT is probably
1947 gcc_assert (i < MAX_ITER);
1949 /* Divide by x * sqrt(Pi). */
1950 mpfr_const_pi (u, GFC_RND_MODE);
1951 mpfr_sqrt (u, u, GFC_RND_MODE);
1952 mpfr_mul (u, u, x, GFC_RND_MODE);
1953 mpfr_div (sum, sum, u, GFC_RND_MODE);
1955 mpfr_set (res, sum, GFC_RND_MODE);
1956 mpfr_set_default_prec (prec);
1958 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
1964 gfc_simplify_erfc_scaled (gfc_expr *x)
1968 if (x->expr_type != EXPR_CONSTANT)
1971 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1972 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
1973 asympt_erfc_scaled (result->value.real, x->value.real);
1975 fullprec_erfc_scaled (result->value.real, x->value.real);
1977 return range_check (result, "ERFC_SCALED");
1985 gfc_simplify_epsilon (gfc_expr *e)
1990 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1992 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
1993 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1995 return range_check (result, "EPSILON");
2000 gfc_simplify_exp (gfc_expr *x)
2004 if (x->expr_type != EXPR_CONSTANT)
2007 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2012 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2016 gfc_set_model_kind (x->ts.kind);
2017 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2021 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2024 return range_check (result, "EXP");
2029 gfc_simplify_exponent (gfc_expr *x)
2034 if (x->expr_type != EXPR_CONSTANT)
2037 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2040 gfc_set_model (x->value.real);
2042 if (mpfr_sgn (x->value.real) == 0)
2044 mpz_set_ui (result->value.integer, 0);
2048 i = (int) mpfr_get_exp (x->value.real);
2049 mpz_set_si (result->value.integer, i);
2051 return range_check (result, "EXPONENT");
2056 gfc_simplify_float (gfc_expr *a)
2060 if (a->expr_type != EXPR_CONSTANT)
2065 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2066 return &gfc_bad_expr;
2068 result = gfc_copy_expr (a);
2071 result = gfc_int2real (a, gfc_default_real_kind);
2073 return range_check (result, "FLOAT");
2078 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2084 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2086 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2088 if (e->expr_type != EXPR_CONSTANT)
2091 gfc_set_model_kind (kind);
2094 mpfr_floor (floor, e->value.real);
2096 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2097 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2101 return range_check (result, "FLOOR");
2106 gfc_simplify_fraction (gfc_expr *x)
2109 mpfr_t absv, exp, pow2;
2111 if (x->expr_type != EXPR_CONSTANT)
2114 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2116 if (mpfr_sgn (x->value.real) == 0)
2118 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2122 gfc_set_model_kind (x->ts.kind);
2127 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2128 mpfr_log2 (exp, absv, GFC_RND_MODE);
2130 mpfr_trunc (exp, exp);
2131 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2133 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2135 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2137 mpfr_clears (exp, absv, pow2, NULL);
2139 return range_check (result, "FRACTION");
2144 gfc_simplify_gamma (gfc_expr *x)
2148 if (x->expr_type != EXPR_CONSTANT)
2151 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2152 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2154 return range_check (result, "GAMMA");
2159 gfc_simplify_huge (gfc_expr *e)
2164 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2165 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2170 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2174 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2186 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2190 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2193 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2194 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2195 return range_check (result, "HYPOT");
2199 /* We use the processor's collating sequence, because all
2200 systems that gfortran currently works on are ASCII. */
2203 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2209 if (e->expr_type != EXPR_CONSTANT)
2212 if (e->value.character.length != 1)
2214 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2215 return &gfc_bad_expr;
2218 index = e->value.character.string[0];
2220 if (gfc_option.warn_surprising && index > 127)
2221 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2224 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2226 return &gfc_bad_expr;
2228 result = gfc_get_int_expr (k, &e->where, index);
2230 return range_check (result, "IACHAR");
2235 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2239 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2242 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2243 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2245 return range_check (result, "IAND");
2250 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2255 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2258 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2260 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2261 return &gfc_bad_expr;
2264 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2266 if (pos >= gfc_integer_kinds[k].bit_size)
2268 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2270 return &gfc_bad_expr;
2273 result = gfc_copy_expr (x);
2275 convert_mpz_to_unsigned (result->value.integer,
2276 gfc_integer_kinds[k].bit_size);
2278 mpz_clrbit (result->value.integer, pos);
2280 convert_mpz_to_signed (result->value.integer,
2281 gfc_integer_kinds[k].bit_size);
2288 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2295 if (x->expr_type != EXPR_CONSTANT
2296 || y->expr_type != EXPR_CONSTANT
2297 || z->expr_type != EXPR_CONSTANT)
2300 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2302 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2303 return &gfc_bad_expr;
2306 if (gfc_extract_int (z, &len) != NULL || len < 0)
2308 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2309 return &gfc_bad_expr;
2312 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2314 bitsize = gfc_integer_kinds[k].bit_size;
2316 if (pos + len > bitsize)
2318 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2319 "bit size at %L", &y->where);
2320 return &gfc_bad_expr;
2323 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2324 convert_mpz_to_unsigned (result->value.integer,
2325 gfc_integer_kinds[k].bit_size);
2327 bits = XCNEWVEC (int, bitsize);
2329 for (i = 0; i < bitsize; i++)
2332 for (i = 0; i < len; i++)
2333 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2335 for (i = 0; i < bitsize; i++)
2338 mpz_clrbit (result->value.integer, i);
2339 else if (bits[i] == 1)
2340 mpz_setbit (result->value.integer, i);
2342 gfc_internal_error ("IBITS: Bad bit");
2347 convert_mpz_to_signed (result->value.integer,
2348 gfc_integer_kinds[k].bit_size);
2355 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2360 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2363 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2365 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2366 return &gfc_bad_expr;
2369 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2371 if (pos >= gfc_integer_kinds[k].bit_size)
2373 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2375 return &gfc_bad_expr;
2378 result = gfc_copy_expr (x);
2380 convert_mpz_to_unsigned (result->value.integer,
2381 gfc_integer_kinds[k].bit_size);
2383 mpz_setbit (result->value.integer, pos);
2385 convert_mpz_to_signed (result->value.integer,
2386 gfc_integer_kinds[k].bit_size);
2393 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2399 if (e->expr_type != EXPR_CONSTANT)
2402 if (e->value.character.length != 1)
2404 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2405 return &gfc_bad_expr;
2408 index = e->value.character.string[0];
2410 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2412 return &gfc_bad_expr;
2414 result = gfc_get_int_expr (k, &e->where, index);
2416 return range_check (result, "ICHAR");
2421 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2425 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2428 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2429 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2431 return range_check (result, "IEOR");
2436 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2439 int back, len, lensub;
2440 int i, j, k, count, index = 0, start;
2442 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2443 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2446 if (b != NULL && b->value.logical != 0)
2451 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2453 return &gfc_bad_expr;
2455 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2457 len = x->value.character.length;
2458 lensub = y->value.character.length;
2462 mpz_set_si (result->value.integer, 0);
2470 mpz_set_si (result->value.integer, 1);
2473 else if (lensub == 1)
2475 for (i = 0; i < len; i++)
2477 for (j = 0; j < lensub; j++)
2479 if (y->value.character.string[j]
2480 == x->value.character.string[i])
2490 for (i = 0; i < len; i++)
2492 for (j = 0; j < lensub; j++)
2494 if (y->value.character.string[j]
2495 == x->value.character.string[i])
2500 for (k = 0; k < lensub; k++)
2502 if (y->value.character.string[k]
2503 == x->value.character.string[k + start])
2507 if (count == lensub)
2522 mpz_set_si (result->value.integer, len + 1);
2525 else if (lensub == 1)
2527 for (i = 0; i < len; i++)
2529 for (j = 0; j < lensub; j++)
2531 if (y->value.character.string[j]
2532 == x->value.character.string[len - i])
2534 index = len - i + 1;
2542 for (i = 0; i < len; i++)
2544 for (j = 0; j < lensub; j++)
2546 if (y->value.character.string[j]
2547 == x->value.character.string[len - i])
2550 if (start <= len - lensub)
2553 for (k = 0; k < lensub; k++)
2554 if (y->value.character.string[k]
2555 == x->value.character.string[k + start])
2558 if (count == lensub)
2575 mpz_set_si (result->value.integer, index);
2576 return range_check (result, "INDEX");
2581 simplify_intconv (gfc_expr *e, int kind, const char *name)
2583 gfc_expr *result = NULL;
2585 if (e->expr_type != EXPR_CONSTANT)
2588 result = gfc_convert_constant (e, BT_INTEGER, kind);
2589 if (result == &gfc_bad_expr)
2590 return &gfc_bad_expr;
2592 return range_check (result, name);
2597 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2601 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2603 return &gfc_bad_expr;
2605 return simplify_intconv (e, kind, "INT");
2609 gfc_simplify_int2 (gfc_expr *e)
2611 return simplify_intconv (e, 2, "INT2");
2616 gfc_simplify_int8 (gfc_expr *e)
2618 return simplify_intconv (e, 8, "INT8");
2623 gfc_simplify_long (gfc_expr *e)
2625 return simplify_intconv (e, 4, "LONG");
2630 gfc_simplify_ifix (gfc_expr *e)
2632 gfc_expr *rtrunc, *result;
2634 if (e->expr_type != EXPR_CONSTANT)
2637 rtrunc = gfc_copy_expr (e);
2638 mpfr_trunc (rtrunc->value.real, e->value.real);
2640 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2642 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2644 gfc_free_expr (rtrunc);
2646 return range_check (result, "IFIX");
2651 gfc_simplify_idint (gfc_expr *e)
2653 gfc_expr *rtrunc, *result;
2655 if (e->expr_type != EXPR_CONSTANT)
2658 rtrunc = gfc_copy_expr (e);
2659 mpfr_trunc (rtrunc->value.real, e->value.real);
2661 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2663 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2665 gfc_free_expr (rtrunc);
2667 return range_check (result, "IDINT");
2672 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2676 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2679 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2680 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2682 return range_check (result, "IOR");
2687 gfc_simplify_is_iostat_end (gfc_expr *x)
2689 if (x->expr_type != EXPR_CONSTANT)
2692 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2693 mpz_cmp_si (x->value.integer,
2694 LIBERROR_END) == 0);
2699 gfc_simplify_is_iostat_eor (gfc_expr *x)
2701 if (x->expr_type != EXPR_CONSTANT)
2704 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2705 mpz_cmp_si (x->value.integer,
2706 LIBERROR_EOR) == 0);
2711 gfc_simplify_isnan (gfc_expr *x)
2713 if (x->expr_type != EXPR_CONSTANT)
2716 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2717 mpfr_nan_p (x->value.real));
2722 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
2725 int shift, ashift, isize, k, *bits, i;
2727 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2730 if (gfc_extract_int (s, &shift) != NULL)
2732 gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
2733 return &gfc_bad_expr;
2736 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
2738 isize = gfc_integer_kinds[k].bit_size;
2747 gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
2748 "at %L", &s->where);
2749 return &gfc_bad_expr;
2752 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2756 mpz_set (result->value.integer, e->value.integer);
2757 return range_check (result, "ISHFT");
2760 bits = XCNEWVEC (int, isize);
2762 for (i = 0; i < isize; i++)
2763 bits[i] = mpz_tstbit (e->value.integer, i);
2767 for (i = 0; i < shift; i++)
2768 mpz_clrbit (result->value.integer, i);
2770 for (i = 0; i < isize - shift; i++)
2773 mpz_clrbit (result->value.integer, i + shift);
2775 mpz_setbit (result->value.integer, i + shift);
2780 for (i = isize - 1; i >= isize - ashift; i--)
2781 mpz_clrbit (result->value.integer, i);
2783 for (i = isize - 1; i >= ashift; i--)
2786 mpz_clrbit (result->value.integer, i - ashift);
2788 mpz_setbit (result->value.integer, i - ashift);
2792 convert_mpz_to_signed (result->value.integer, isize);
2800 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2803 int shift, ashift, isize, ssize, delta, k;
2806 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2809 if (gfc_extract_int (s, &shift) != NULL)
2811 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2812 return &gfc_bad_expr;
2815 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2816 isize = gfc_integer_kinds[k].bit_size;
2820 if (sz->expr_type != EXPR_CONSTANT)
2823 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2825 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2826 return &gfc_bad_expr;
2831 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2832 "BIT_SIZE of first argument at %L", &s->where);
2833 return &gfc_bad_expr;
2847 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2848 "third argument at %L", &s->where);
2850 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2851 "BIT_SIZE of first argument at %L", &s->where);
2852 return &gfc_bad_expr;
2855 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2857 mpz_set (result->value.integer, e->value.integer);
2862 convert_mpz_to_unsigned (result->value.integer, isize);
2864 bits = XCNEWVEC (int, ssize);
2866 for (i = 0; i < ssize; i++)
2867 bits[i] = mpz_tstbit (e->value.integer, i);
2869 delta = ssize - ashift;
2873 for (i = 0; i < delta; i++)
2876 mpz_clrbit (result->value.integer, i + shift);
2878 mpz_setbit (result->value.integer, i + shift);
2881 for (i = delta; i < ssize; i++)
2884 mpz_clrbit (result->value.integer, i - delta);
2886 mpz_setbit (result->value.integer, i - delta);
2891 for (i = 0; i < ashift; i++)
2894 mpz_clrbit (result->value.integer, i + delta);
2896 mpz_setbit (result->value.integer, i + delta);
2899 for (i = ashift; i < ssize; i++)
2902 mpz_clrbit (result->value.integer, i + shift);
2904 mpz_setbit (result->value.integer, i + shift);
2908 convert_mpz_to_signed (result->value.integer, isize);
2916 gfc_simplify_kind (gfc_expr *e)
2918 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
2923 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2924 gfc_array_spec *as, gfc_ref *ref, bool coarray)
2926 gfc_expr *l, *u, *result;
2929 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2930 gfc_default_integer_kind);
2932 return &gfc_bad_expr;
2934 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2936 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
2937 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
2938 if (!coarray && array->expr_type != EXPR_VARIABLE)
2942 gfc_expr* dim = result;
2943 mpz_set_si (dim->value.integer, d);
2945 result = gfc_simplify_size (array, dim, kind);
2946 gfc_free_expr (dim);
2951 mpz_set_si (result->value.integer, 1);
2956 /* Otherwise, we have a variable expression. */
2957 gcc_assert (array->expr_type == EXPR_VARIABLE);
2960 /* The last dimension of an assumed-size array is special. */
2961 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2962 || (coarray && d == as->rank + as->corank))
2964 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2966 gfc_free_expr (result);
2967 return gfc_copy_expr (as->lower[d-1]);
2973 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
2975 /* Then, we need to know the extent of the given dimension. */
2976 if (coarray || ref->u.ar.type == AR_FULL)
2981 if (l->expr_type != EXPR_CONSTANT || u == NULL
2982 || u->expr_type != EXPR_CONSTANT)
2985 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2989 mpz_set_si (result->value.integer, 0);
2991 mpz_set_si (result->value.integer, 1);
2995 /* Nonzero extent. */
2997 mpz_set (result->value.integer, u->value.integer);
2999 mpz_set (result->value.integer, l->value.integer);
3006 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3011 mpz_set_si (result->value.integer, (long int) 1);
3015 return range_check (result, upper ? "UBOUND" : "LBOUND");
3018 gfc_free_expr (result);
3024 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3030 if (array->expr_type != EXPR_VARIABLE)
3037 /* Follow any component references. */
3038 as = array->symtree->n.sym->as;
3039 for (ref = array->ref; ref; ref = ref->next)
3044 switch (ref->u.ar.type)
3051 /* We're done because 'as' has already been set in the
3052 previous iteration. */
3069 as = ref->u.c.component->as;
3081 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3086 /* Multi-dimensional bounds. */
3087 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3091 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3092 if (upper && as && as->type == AS_ASSUMED_SIZE)
3094 /* An error message will be emitted in
3095 check_assumed_size_reference (resolve.c). */
3096 return &gfc_bad_expr;
3099 /* Simplify the bounds for each dimension. */
3100 for (d = 0; d < array->rank; d++)
3102 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3104 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3108 for (j = 0; j < d; j++)
3109 gfc_free_expr (bounds[j]);
3114 /* Allocate the result expression. */
3115 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3116 gfc_default_integer_kind);
3118 return &gfc_bad_expr;
3120 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3122 /* The result is a rank 1 array; its size is the rank of the first
3123 argument to {L,U}BOUND. */
3125 e->shape = gfc_get_shape (1);
3126 mpz_init_set_ui (e->shape[0], array->rank);
3128 /* Create the constructor for this array. */
3129 for (d = 0; d < array->rank; d++)
3130 gfc_constructor_append_expr (&e->value.constructor,
3131 bounds[d], &e->where);
3137 /* A DIM argument is specified. */
3138 if (dim->expr_type != EXPR_CONSTANT)
3141 d = mpz_get_si (dim->value.integer);
3143 if (d < 1 || d > array->rank
3144 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3146 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3147 return &gfc_bad_expr;
3150 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3156 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3162 if (array->expr_type != EXPR_VARIABLE)
3165 /* Follow any component references. */
3166 as = array->symtree->n.sym->as;
3167 for (ref = array->ref; ref; ref = ref->next)
3172 switch (ref->u.ar.type)
3175 if (ref->next == NULL)
3177 gcc_assert (ref->u.ar.as->corank > 0
3178 && ref->u.ar.as->rank == 0);
3186 /* We're done because 'as' has already been set in the
3187 previous iteration. */
3204 as = ref->u.c.component->as;
3216 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3221 /* Multi-dimensional cobounds. */
3222 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3226 /* Simplify the cobounds for each dimension. */
3227 for (d = 0; d < as->corank; d++)
3229 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3230 upper, as, ref, true);
3231 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3235 for (j = 0; j < d; j++)
3236 gfc_free_expr (bounds[j]);
3241 /* Allocate the result expression. */
3242 e = gfc_get_expr ();
3243 e->where = array->where;
3244 e->expr_type = EXPR_ARRAY;
3245 e->ts.type = BT_INTEGER;
3246 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3247 gfc_default_integer_kind);
3251 return &gfc_bad_expr;
3255 /* The result is a rank 1 array; its size is the rank of the first
3256 argument to {L,U}COBOUND. */
3258 e->shape = gfc_get_shape (1);
3259 mpz_init_set_ui (e->shape[0], as->corank);
3261 /* Create the constructor for this array. */
3262 for (d = 0; d < as->corank; d++)
3263 gfc_constructor_append_expr (&e->value.constructor,
3264 bounds[d], &e->where);
3269 /* A DIM argument is specified. */
3270 if (dim->expr_type != EXPR_CONSTANT)
3273 d = mpz_get_si (dim->value.integer);
3275 if (d < 1 || d > as->corank)
3277 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3278 return &gfc_bad_expr;
3281 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3287 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3289 return simplify_bound (array, dim, kind, 0);
3294 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3297 /* return simplify_cobound (array, dim, kind, 0);*/
3299 e = simplify_cobound (array, dim, kind, 0);
3303 gfc_error ("Not yet implemented: LCOBOUND for coarray with non-constant "
3304 "cobounds at %L", &array->where);
3305 return &gfc_bad_expr;
3309 gfc_simplify_leadz (gfc_expr *e)
3311 unsigned long lz, bs;
3314 if (e->expr_type != EXPR_CONSTANT)
3317 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3318 bs = gfc_integer_kinds[i].bit_size;
3319 if (mpz_cmp_si (e->value.integer, 0) == 0)
3321 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3324 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3326 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3331 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3334 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3337 return &gfc_bad_expr;
3339 if (e->expr_type == EXPR_CONSTANT)
3341 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3342 mpz_set_si (result->value.integer, e->value.character.length);
3343 return range_check (result, "LEN");
3345 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3346 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3347 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3349 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3350 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3351 return range_check (result, "LEN");
3359 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3363 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3366 return &gfc_bad_expr;
3368 if (e->expr_type != EXPR_CONSTANT)
3371 len = e->value.character.length;
3372 for (count = 0, i = 1; i <= len; i++)
3373 if (e->value.character.string[len - i] == ' ')
3378 result = gfc_get_int_expr (k, &e->where, len - count);
3379 return range_check (result, "LEN_TRIM");
3383 gfc_simplify_lgamma (gfc_expr *x)
3388 if (x->expr_type != EXPR_CONSTANT)
3391 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3392 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3394 return range_check (result, "LGAMMA");
3399 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3401 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3404 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3405 gfc_compare_string (a, b) >= 0);
3410 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3412 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3415 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3416 gfc_compare_string (a, b) > 0);
3421 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3423 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3426 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3427 gfc_compare_string (a, b) <= 0);
3432 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3434 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3437 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3438 gfc_compare_string (a, b) < 0);
3443 gfc_simplify_log (gfc_expr *x)
3447 if (x->expr_type != EXPR_CONSTANT)
3450 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3455 if (mpfr_sgn (x->value.real) <= 0)
3457 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3458 "to zero", &x->where);
3459 gfc_free_expr (result);
3460 return &gfc_bad_expr;
3463 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3467 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3468 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3470 gfc_error ("Complex argument of LOG at %L cannot be zero",
3472 gfc_free_expr (result);
3473 return &gfc_bad_expr;
3476 gfc_set_model_kind (x->ts.kind);
3477 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3481 gfc_internal_error ("gfc_simplify_log: bad type");
3484 return range_check (result, "LOG");
3489 gfc_simplify_log10 (gfc_expr *x)
3493 if (x->expr_type != EXPR_CONSTANT)
3496 if (mpfr_sgn (x->value.real) <= 0)
3498 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3499 "to zero", &x->where);
3500 return &gfc_bad_expr;
3503 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3504 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3506 return range_check (result, "LOG10");
3511 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3515 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3517 return &gfc_bad_expr;
3519 if (e->expr_type != EXPR_CONSTANT)
3522 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3527 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3530 int row, result_rows, col, result_columns;
3531 int stride_a, offset_a, stride_b, offset_b;
3533 if (!is_constant_array_expr (matrix_a)
3534 || !is_constant_array_expr (matrix_b))
3537 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3538 result = gfc_get_array_expr (matrix_a->ts.type,
3542 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3545 result_columns = mpz_get_si (matrix_b->shape[0]);
3547 stride_b = mpz_get_si (matrix_b->shape[0]);
3550 result->shape = gfc_get_shape (result->rank);
3551 mpz_init_set_si (result->shape[0], result_columns);
3553 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3555 result_rows = mpz_get_si (matrix_b->shape[0]);
3557 stride_a = mpz_get_si (matrix_a->shape[0]);
3561 result->shape = gfc_get_shape (result->rank);
3562 mpz_init_set_si (result->shape[0], result_rows);
3564 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3566 result_rows = mpz_get_si (matrix_a->shape[0]);
3567 result_columns = mpz_get_si (matrix_b->shape[1]);
3568 stride_a = mpz_get_si (matrix_a->shape[1]);
3569 stride_b = mpz_get_si (matrix_b->shape[0]);
3572 result->shape = gfc_get_shape (result->rank);
3573 mpz_init_set_si (result->shape[0], result_rows);
3574 mpz_init_set_si (result->shape[1], result_columns);
3579 offset_a = offset_b = 0;
3580 for (col = 0; col < result_columns; ++col)
3584 for (row = 0; row < result_rows; ++row)
3586 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3587 matrix_b, 1, offset_b);
3588 gfc_constructor_append_expr (&result->value.constructor,
3594 offset_b += stride_b;
3602 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
3604 if (tsource->expr_type != EXPR_CONSTANT
3605 || fsource->expr_type != EXPR_CONSTANT
3606 || mask->expr_type != EXPR_CONSTANT)
3609 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
3613 /* Selects bewteen current value and extremum for simplify_min_max
3614 and simplify_minval_maxval. */
3616 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
3618 switch (arg->ts.type)
3621 if (mpz_cmp (arg->value.integer,
3622 extremum->value.integer) * sign > 0)
3623 mpz_set (extremum->value.integer, arg->value.integer);
3627 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
3629 mpfr_max (extremum->value.real, extremum->value.real,
3630 arg->value.real, GFC_RND_MODE);
3632 mpfr_min (extremum->value.real, extremum->value.real,
3633 arg->value.real, GFC_RND_MODE);
3637 #define LENGTH(x) ((x)->value.character.length)
3638 #define STRING(x) ((x)->value.character.string)
3639 if (LENGTH(extremum) < LENGTH(arg))
3641 gfc_char_t *tmp = STRING(extremum);
3643 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
3644 memcpy (STRING(extremum), tmp,
3645 LENGTH(extremum) * sizeof (gfc_char_t));
3646 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
3647 LENGTH(arg) - LENGTH(extremum));
3648 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
3649 LENGTH(extremum) = LENGTH(arg);
3653 if (gfc_compare_string (arg, extremum) * sign > 0)
3655 gfc_free (STRING(extremum));
3656 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
3657 memcpy (STRING(extremum), STRING(arg),
3658 LENGTH(arg) * sizeof (gfc_char_t));
3659 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
3660 LENGTH(extremum) - LENGTH(arg));
3661 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
3668 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
3673 /* This function is special since MAX() can take any number of
3674 arguments. The simplified expression is a rewritten version of the
3675 argument list containing at most one constant element. Other
3676 constant elements are deleted. Because the argument list has
3677 already been checked, this function always succeeds. sign is 1 for
3678 MAX(), -1 for MIN(). */
3681 simplify_min_max (gfc_expr *expr, int sign)
3683 gfc_actual_arglist *arg, *last, *extremum;
3684 gfc_intrinsic_sym * specific;
3688 specific = expr->value.function.isym;
3690 arg = expr->value.function.actual;
3692 for (; arg; last = arg, arg = arg->next)
3694 if (arg->expr->expr_type != EXPR_CONSTANT)
3697 if (extremum == NULL)
3703 min_max_choose (arg->expr, extremum->expr, sign);
3705 /* Delete the extra constant argument. */
3707 expr->value.function.actual = arg->next;
3709 last->next = arg->next;
3712 gfc_free_actual_arglist (arg);
3716 /* If there is one value left, replace the function call with the
3718 if (expr->value.function.actual->next != NULL)
3721 /* Convert to the correct type and kind. */
3722 if (expr->ts.type != BT_UNKNOWN)
3723 return gfc_convert_constant (expr->value.function.actual->expr,
3724 expr->ts.type, expr->ts.kind);
3726 if (specific->ts.type != BT_UNKNOWN)
3727 return gfc_convert_constant (expr->value.function.actual->expr,
3728 specific->ts.type, specific->ts.kind);
3730 return gfc_copy_expr (expr->value.function.actual->expr);
3735 gfc_simplify_min (gfc_expr *e)
3737 return simplify_min_max (e, -1);
3742 gfc_simplify_max (gfc_expr *e)
3744 return simplify_min_max (e, 1);
3748 /* This is a simplified version of simplify_min_max to provide
3749 simplification of minval and maxval for a vector. */
3752 simplify_minval_maxval (gfc_expr *expr, int sign)
3754 gfc_constructor *c, *extremum;
3755 gfc_intrinsic_sym * specific;
3758 specific = expr->value.function.isym;
3760 for (c = gfc_constructor_first (expr->value.constructor);
3761 c; c = gfc_constructor_next (c))
3763 if (c->expr->expr_type != EXPR_CONSTANT)
3766 if (extremum == NULL)
3772 min_max_choose (c->expr, extremum->expr, sign);
3775 if (extremum == NULL)
3778 /* Convert to the correct type and kind. */
3779 if (expr->ts.type != BT_UNKNOWN)
3780 return gfc_convert_constant (extremum->expr,
3781 expr->ts.type, expr->ts.kind);
3783 if (specific->ts.type != BT_UNKNOWN)
3784 return gfc_convert_constant (extremum->expr,
3785 specific->ts.type, specific->ts.kind);
3787 return gfc_copy_expr (extremum->expr);
3792 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3794 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3797 return simplify_minval_maxval (array, -1);
3802 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
3804 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
3807 return simplify_minval_maxval (array, 1);
3812 gfc_simplify_maxexponent (gfc_expr *x)
3814 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3815 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3816 gfc_real_kinds[i].max_exponent);
3821 gfc_simplify_minexponent (gfc_expr *x)
3823 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3824 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
3825 gfc_real_kinds[i].min_exponent);
3830 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
3836 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3839 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3840 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3845 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3847 /* Result is processor-dependent. */
3848 gfc_error ("Second argument MOD at %L is zero", &a->where);
3849 gfc_free_expr (result);
3850 return &gfc_bad_expr;
3852 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
3856 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3858 /* Result is processor-dependent. */
3859 gfc_error ("Second argument of MOD at %L is zero", &p->where);
3860 gfc_free_expr (result);
3861 return &gfc_bad_expr;
3864 gfc_set_model_kind (kind);
3866 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3867 mpfr_trunc (tmp, tmp);
3868 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3869 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3874 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
3877 return range_check (result, "MOD");
3882 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
3888 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
3891 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
3892 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
3897 if (mpz_cmp_ui (p->value.integer, 0) == 0)
3899 /* Result is processor-dependent. This processor just opts
3900 to not handle it at all. */
3901 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
3902 gfc_free_expr (result);
3903 return &gfc_bad_expr;
3905 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
3910 if (mpfr_cmp_ui (p->value.real, 0) == 0)
3912 /* Result is processor-dependent. */
3913 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
3914 gfc_free_expr (result);
3915 return &gfc_bad_expr;
3918 gfc_set_model_kind (kind);
3920 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
3921 mpfr_floor (tmp, tmp);
3922 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
3923 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
3928 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
3931 return range_check (result, "MODULO");
3935 /* Exists for the sole purpose of consistency with other intrinsics. */
3937 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
3938 gfc_expr *fp ATTRIBUTE_UNUSED,
3939 gfc_expr *l ATTRIBUTE_UNUSED,
3940 gfc_expr *to ATTRIBUTE_UNUSED,
3941 gfc_expr *tp ATTRIBUTE_UNUSED)
3948 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
3951 mp_exp_t emin, emax;
3954 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3957 if (mpfr_sgn (s->value.real) == 0)
3959 gfc_error ("Second argument of NEAREST at %L shall not be zero",
3961 return &gfc_bad_expr;
3964 result = gfc_copy_expr (x);
3966 /* Save current values of emin and emax. */
3967 emin = mpfr_get_emin ();
3968 emax = mpfr_get_emax ();
3970 /* Set emin and emax for the current model number. */
3971 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
3972 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
3973 mpfr_get_prec(result->value.real) + 1);
3974 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
3975 mpfr_check_range (result->value.real, 0, GMP_RNDU);
3977 if (mpfr_sgn (s->value.real) > 0)
3979 mpfr_nextabove (result->value.real);
3980 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
3984 mpfr_nextbelow (result->value.real);
3985 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
3988 mpfr_set_emin (emin);
3989 mpfr_set_emax (emax);
3991 /* Only NaN can occur. Do not use range check as it gives an
3992 error for denormal numbers. */
3993 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
3995 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
3996 gfc_free_expr (result);
3997 return &gfc_bad_expr;
4005 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4007 gfc_expr *itrunc, *result;
4010 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4012 return &gfc_bad_expr;
4014 if (e->expr_type != EXPR_CONSTANT)
4017 itrunc = gfc_copy_expr (e);
4018 mpfr_round (itrunc->value.real, e->value.real);
4020 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4021 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4023 gfc_free_expr (itrunc);
4025 return range_check (result, name);
4030 gfc_simplify_new_line (gfc_expr *e)
4034 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4035 result->value.character.string[0] = '\n';
4042 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4044 return simplify_nint ("NINT", e, k);
4049 gfc_simplify_idnint (gfc_expr *e)
4051 return simplify_nint ("IDNINT", e, NULL);
4056 add_squared (gfc_expr *result, gfc_expr *e)
4060 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4061 gcc_assert (result->ts.type == BT_REAL
4062 && result->expr_type == EXPR_CONSTANT);
4064 gfc_set_model_kind (result->ts.kind);
4066 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4067 mpfr_add (result->value.real, result->value.real, tmp,
4076 do_sqrt (gfc_expr *result, gfc_expr *e)
4078 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4079 gcc_assert (result->ts.type == BT_REAL
4080 && result->expr_type == EXPR_CONSTANT);
4082 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4083 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4089 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4093 if (!is_constant_array_expr (e)
4094 || (dim != NULL && !gfc_is_constant_expr (dim)))
4097 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4098 init_result_expr (result, 0, NULL);
4100 if (!dim || e->rank == 1)
4102 result = simplify_transformation_to_scalar (result, e, NULL,
4104 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4107 result = simplify_transformation_to_array (result, e, dim, NULL,
4108 add_squared, &do_sqrt);
4115 gfc_simplify_not (gfc_expr *e)
4119 if (e->expr_type != EXPR_CONSTANT)
4122 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4123 mpz_com (result->value.integer, e->value.integer);
4125 return range_check (result, "NOT");
4130 gfc_simplify_null (gfc_expr *mold)
4136 result = gfc_copy_expr (mold);
4137 result->expr_type = EXPR_NULL;
4140 result = gfc_get_null_expr (NULL);
4147 gfc_simplify_num_images (void)
4151 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4153 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4154 return &gfc_bad_expr;
4157 /* FIXME: gfc_current_locus is wrong. */
4158 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4159 &gfc_current_locus);
4160 mpz_set_si (result->value.integer, 1);
4166 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4171 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4174 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4179 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4180 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4181 return range_check (result, "OR");
4184 return gfc_get_logical_expr (kind, &x->where,
4185 x->value.logical || y->value.logical);
4193 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4196 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4198 if (!is_constant_array_expr(array)
4199 || !is_constant_array_expr(vector)
4200 || (!gfc_is_constant_expr (mask)
4201 && !is_constant_array_expr(mask)))
4204 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4206 array_ctor = gfc_constructor_first (array->value.constructor);
4207 vector_ctor = vector
4208 ? gfc_constructor_first (vector->value.constructor)
4211 if (mask->expr_type == EXPR_CONSTANT
4212 && mask->value.logical)
4214 /* Copy all elements of ARRAY to RESULT. */
4217 gfc_constructor_append_expr (&result->value.constructor,
4218 gfc_copy_expr (array_ctor->expr),
4221 array_ctor = gfc_constructor_next (array_ctor);
4222 vector_ctor = gfc_constructor_next (vector_ctor);
4225 else if (mask->expr_type == EXPR_ARRAY)
4227 /* Copy only those elements of ARRAY to RESULT whose
4228 MASK equals .TRUE.. */
4229 mask_ctor = gfc_constructor_first (mask->value.constructor);
4232 if (mask_ctor->expr->value.logical)
4234 gfc_constructor_append_expr (&result->value.constructor,
4235 gfc_copy_expr (array_ctor->expr),
4237 vector_ctor = gfc_constructor_next (vector_ctor);
4240 array_ctor = gfc_constructor_next (array_ctor);
4241 mask_ctor = gfc_constructor_next (mask_ctor);
4245 /* Append any left-over elements from VECTOR to RESULT. */
4248 gfc_constructor_append_expr (&result->value.constructor,
4249 gfc_copy_expr (vector_ctor->expr),
4251 vector_ctor = gfc_constructor_next (vector_ctor);
4254 result->shape = gfc_get_shape (1);
4255 gfc_array_size (result, &result->shape[0]);
4257 if (array->ts.type == BT_CHARACTER)
4258 result->ts.u.cl = array->ts.u.cl;
4265 do_xor (gfc_expr *result, gfc_expr *e)
4267 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4268 gcc_assert (result->ts.type == BT_LOGICAL
4269 && result->expr_type == EXPR_CONSTANT);
4271 result->value.logical = result->value.logical != e->value.logical;
4278 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4282 if (!is_constant_array_expr (e)
4283 || (dim != NULL && !gfc_is_constant_expr (dim)))
4286 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4287 init_result_expr (result, 0, NULL);
4289 return (!dim || e->rank == 1)
4290 ? simplify_transformation_to_scalar (result, e, NULL, do_xor)
4291 : simplify_transformation_to_array (result, e, dim, NULL, do_xor, NULL);
4296 gfc_simplify_precision (gfc_expr *e)
4298 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4299 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4300 gfc_real_kinds[i].precision);
4305 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4309 if (!is_constant_array_expr (array)
4310 || !gfc_is_constant_expr (dim))
4314 && !is_constant_array_expr (mask)
4315 && mask->expr_type != EXPR_CONSTANT)
4318 result = transformational_result (array, dim, array->ts.type,
4319 array->ts.kind, &array->where);
4320 init_result_expr (result, 1, NULL);
4322 return !dim || array->rank == 1 ?
4323 simplify_transformation_to_scalar (result, array, mask, gfc_multiply) :
4324 simplify_transformation_to_array (result, array, dim, mask, gfc_multiply, NULL);
4329 gfc_simplify_radix (gfc_expr *e)
4332 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4337 i = gfc_integer_kinds[i].radix;
4341 i = gfc_real_kinds[i].radix;
4348 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4353 gfc_simplify_range (gfc_expr *e)
4356 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4361 i = gfc_integer_kinds[i].range;
4366 i = gfc_real_kinds[i].range;
4373 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4378 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4380 gfc_expr *result = NULL;
4383 if (e->ts.type == BT_COMPLEX)
4384 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4386 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4389 return &gfc_bad_expr;
4391 if (e->expr_type != EXPR_CONSTANT)
4394 if (convert_boz (e, kind) == &gfc_bad_expr)
4395 return &gfc_bad_expr;
4397 result = gfc_convert_constant (e, BT_REAL, kind);
4398 if (result == &gfc_bad_expr)
4399 return &gfc_bad_expr;
4401 return range_check (result, "REAL");
4406 gfc_simplify_realpart (gfc_expr *e)
4410 if (e->expr_type != EXPR_CONSTANT)
4413 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4414 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4416 return range_check (result, "REALPART");
4420 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4423 int i, j, len, ncop, nlen;
4425 bool have_length = false;
4427 /* If NCOPIES isn't a constant, there's nothing we can do. */
4428 if (n->expr_type != EXPR_CONSTANT)
4431 /* If NCOPIES is negative, it's an error. */
4432 if (mpz_sgn (n->value.integer) < 0)
4434 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4436 return &gfc_bad_expr;
4439 /* If we don't know the character length, we can do no more. */
4440 if (e->ts.u.cl && e->ts.u.cl->length
4441 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4443 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4446 else if (e->expr_type == EXPR_CONSTANT
4447 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4449 len = e->value.character.length;
4454 /* If the source length is 0, any value of NCOPIES is valid
4455 and everything behaves as if NCOPIES == 0. */
4458 mpz_set_ui (ncopies, 0);
4460 mpz_set (ncopies, n->value.integer);
4462 /* Check that NCOPIES isn't too large. */
4468 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4470 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4474 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4475 e->ts.u.cl->length->value.integer);
4479 mpz_init_set_si (mlen, len);
4480 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4484 /* The check itself. */
4485 if (mpz_cmp (ncopies, max) > 0)
4488 mpz_clear (ncopies);
4489 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4491 return &gfc_bad_expr;
4496 mpz_clear (ncopies);
4498 /* For further simplification, we need the character string to be
4500 if (e->expr_type != EXPR_CONSTANT)
4504 (e->ts.u.cl->length &&
4505 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4507 const char *res = gfc_extract_int (n, &ncop);
4508 gcc_assert (res == NULL);
4513 len = e->value.character.length;
4516 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4519 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4521 len = e->value.character.length;
4524 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4525 for (i = 0; i < ncop; i++)
4526 for (j = 0; j < len; j++)
4527 result->value.character.string[j+i*len]= e->value.character.string[j];
4529 result->value.character.string[nlen] = '\0'; /* For debugger */
4534 /* This one is a bear, but mainly has to do with shuffling elements. */
4537 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4538 gfc_expr *pad, gfc_expr *order_exp)
4540 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4541 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4545 gfc_expr *e, *result;
4547 /* Check that argument expression types are OK. */
4548 if (!is_constant_array_expr (source)
4549 || !is_constant_array_expr (shape_exp)
4550 || !is_constant_array_expr (pad)
4551 || !is_constant_array_expr (order_exp))
4554 /* Proceed with simplification, unpacking the array. */
4561 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
4565 gfc_extract_int (e, &shape[rank]);
4567 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
4568 gcc_assert (shape[rank] >= 0);
4573 gcc_assert (rank > 0);
4575 /* Now unpack the order array if present. */
4576 if (order_exp == NULL)
4578 for (i = 0; i < rank; i++)
4583 for (i = 0; i < rank; i++)
4586 for (i = 0; i < rank; i++)
4588 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
4591 gfc_extract_int (e, &order[i]);
4593 gcc_assert (order[i] >= 1 && order[i] <= rank);
4595 gcc_assert (x[order[i]] == 0);
4600 /* Count the elements in the source and padding arrays. */
4605 gfc_array_size (pad, &size);
4606 npad = mpz_get_ui (size);
4610 gfc_array_size (source, &size);
4611 nsource = mpz_get_ui (size);
4614 /* If it weren't for that pesky permutation we could just loop
4615 through the source and round out any shortage with pad elements.
4616 But no, someone just had to have the compiler do something the
4617 user should be doing. */
4619 for (i = 0; i < rank; i++)
4622 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
4624 result->rank = rank;
4625 result->shape = gfc_get_shape (rank);
4626 for (i = 0; i < rank; i++)
4627 mpz_init_set_ui (result->shape[i], shape[i]);
4629 while (nsource > 0 || npad > 0)
4631 /* Figure out which element to extract. */
4632 mpz_set_ui (index, 0);
4634 for (i = rank - 1; i >= 0; i--)
4636 mpz_add_ui (index, index, x[order[i]]);
4638 mpz_mul_ui (index, index, shape[order[i - 1]]);
4641 if (mpz_cmp_ui (index, INT_MAX) > 0)
4642 gfc_internal_error ("Reshaped array too large at %C");
4644 j = mpz_get_ui (index);
4647 e = gfc_constructor_lookup_expr (source->value.constructor, j);
4650 gcc_assert (npad > 0);
4654 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
4658 gfc_constructor_append_expr (&result->value.constructor,
4659 gfc_copy_expr (e), &e->where);
4661 /* Calculate the next element. */
4665 if (++x[i] < shape[i])
4681 gfc_simplify_rrspacing (gfc_expr *x)
4687 if (x->expr_type != EXPR_CONSTANT)
4690 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
4692 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
4693 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4695 /* Special case x = -0 and 0. */
4696 if (mpfr_sgn (result->value.real) == 0)
4698 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4702 /* | x * 2**(-e) | * 2**p. */
4703 e = - (long int) mpfr_get_exp (x->value.real);
4704 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
4706 p = (long int) gfc_real_kinds[i].digits;
4707 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
4709 return range_check (result, "RRSPACING");
4714 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
4716 int k, neg_flag, power, exp_range;
4717 mpfr_t scale, radix;
4720 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
4723 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
4725 if (mpfr_sgn (x->value.real) == 0)
4727 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
4731 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4733 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
4735 /* This check filters out values of i that would overflow an int. */
4736 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
4737 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
4739 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
4740 gfc_free_expr (result);
4741 return &gfc_bad_expr;
4744 /* Compute scale = radix ** power. */
4745 power = mpz_get_si (i->value.integer);
4755 gfc_set_model_kind (x->ts.kind);
4758 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
4759 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
4762 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
4764 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
4766 mpfr_clears (scale, radix, NULL);
4768 return range_check (result, "SCALE");
4772 /* Variants of strspn and strcspn that operate on wide characters. */
4775 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
4778 const gfc_char_t *c;
4782 for (c = s2; *c; c++)
4796 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
4799 const gfc_char_t *c;
4803 for (c = s2; *c; c++)
4818 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
4823 size_t indx, len, lenc;
4824 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
4827 return &gfc_bad_expr;
4829 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
4832 if (b != NULL && b->value.logical != 0)
4837 len = e->value.character.length;
4838 lenc = c->value.character.length;
4840 if (len == 0 || lenc == 0)
4848 indx = wide_strcspn (e->value.character.string,
4849 c->value.character.string) + 1;
4856 for (indx = len; indx > 0; indx--)
4858 for (i = 0; i < lenc; i++)
4860 if (c->value.character.string[i]
4861 == e->value.character.string[indx - 1])
4870 result = gfc_get_int_expr (k, &e->where, indx);
4871 return range_check (result, "SCAN");
4876 gfc_simplify_selected_char_kind (gfc_expr *e)
4880 if (e->expr_type != EXPR_CONSTANT)
4883 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
4884 || gfc_compare_with_Cstring (e, "default", false) == 0)
4886 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
4891 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
4896 gfc_simplify_selected_int_kind (gfc_expr *e)
4900 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
4905 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
4906 if (gfc_integer_kinds[i].range >= range
4907 && gfc_integer_kinds[i].kind < kind)
4908 kind = gfc_integer_kinds[i].kind;
4910 if (kind == INT_MAX)
4913 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
4918 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
4920 int range, precision, radix, i, kind, found_precision, found_range,
4922 locus *loc = &gfc_current_locus;
4928 if (p->expr_type != EXPR_CONSTANT
4929 || gfc_extract_int (p, &precision) != NULL)
4938 if (q->expr_type != EXPR_CONSTANT
4939 || gfc_extract_int (q, &range) != NULL)
4950 if (rdx->expr_type != EXPR_CONSTANT
4951 || gfc_extract_int (rdx, &radix) != NULL)
4959 found_precision = 0;
4963 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
4965 if (gfc_real_kinds[i].precision >= precision)
4966 found_precision = 1;
4968 if (gfc_real_kinds[i].range >= range)
4971 if (gfc_real_kinds[i].radix >= radix)
4974 if (gfc_real_kinds[i].precision >= precision
4975 && gfc_real_kinds[i].range >= range
4976 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
4977 kind = gfc_real_kinds[i].kind;
4980 if (kind == INT_MAX)
4982 if (found_radix && found_range && !found_precision)
4984 else if (found_radix && found_precision && !found_range)
4986 else if (found_radix && !found_precision && !found_range)
4988 else if (found_radix)
4994 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
4999 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5002 mpfr_t exp, absv, log2, pow2, frac;
5005 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5008 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5010 if (mpfr_sgn (x->value.real) == 0)
5012 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5016 gfc_set_model_kind (x->ts.kind);
5023 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5024 mpfr_log2 (log2, absv, GFC_RND_MODE);
5026 mpfr_trunc (log2, log2);
5027 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5029 /* Old exponent value, and fraction. */
5030 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5032 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5035 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5036 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5038 mpfr_clears (absv, log2, pow2, frac, NULL);
5040 return range_check (result, "SET_EXPONENT");
5045 gfc_simplify_shape (gfc_expr *source)
5047 mpz_t shape[GFC_MAX_DIMENSIONS];
5048 gfc_expr *result, *e, *f;
5053 if (source->rank == 0)
5054 return gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind,
5057 result = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind,
5060 if (source->expr_type == EXPR_VARIABLE)
5062 ar = gfc_find_array_ref (source);
5063 t = gfc_array_ref_shape (ar, shape);
5065 else if (source->shape)
5068 for (n = 0; n < source->rank; n++)
5070 mpz_init (shape[n]);
5071 mpz_set (shape[n], source->shape[n]);
5077 for (n = 0; n < source->rank; n++)
5079 e = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5084 mpz_set (e->value.integer, shape[n]);
5085 mpz_clear (shape[n]);
5089 mpz_set_ui (e->value.integer, n + 1);
5091 f = gfc_simplify_size (source, e, NULL);
5095 gfc_free_expr (result);
5102 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5110 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5114 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5117 return &gfc_bad_expr;
5119 /* For unary operations, the size of the result is given by the size
5120 of the operand. For binary ones, it's the size of the first operand
5121 unless it is scalar, then it is the size of the second. */
5122 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5124 gfc_expr* replacement;
5125 gfc_expr* simplified;
5127 switch (array->value.op.op)
5129 /* Unary operations. */
5131 case INTRINSIC_UPLUS:
5132 case INTRINSIC_UMINUS:
5133 replacement = array->value.op.op1;
5136 /* Binary operations. If any one of the operands is scalar, take
5137 the other one's size. If both of them are arrays, it does not
5138 matter -- try to find one with known shape, if possible. */
5140 if (array->value.op.op1->rank == 0)
5141 replacement = array->value.op.op2;
5142 else if (array->value.op.op2->rank == 0)
5143 replacement = array->value.op.op1;
5146 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5150 replacement = array->value.op.op2;
5155 /* Try to reduce it directly if possible. */
5156 simplified = gfc_simplify_size (replacement, dim, kind);
5158 /* Otherwise, we build a new SIZE call. This is hopefully at least
5159 simpler than the original one. */
5161 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5162 gfc_copy_expr (replacement),
5163 gfc_copy_expr (dim),
5164 gfc_copy_expr (kind));
5171 if (gfc_array_size (array, &size) == FAILURE)
5176 if (dim->expr_type != EXPR_CONSTANT)
5179 d = mpz_get_ui (dim->value.integer) - 1;
5180 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5184 return gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5189 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5193 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5196 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5201 mpz_abs (result->value.integer, x->value.integer);
5202 if (mpz_sgn (y->value.integer) < 0)
5203 mpz_neg (result->value.integer, result->value.integer);
5207 if (gfc_option.flag_sign_zero)
5208 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5211 mpfr_setsign (result->value.real, x->value.real,
5212 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5216 gfc_internal_error ("Bad type in gfc_simplify_sign");
5224 gfc_simplify_sin (gfc_expr *x)
5228 if (x->expr_type != EXPR_CONSTANT)
5231 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5236 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5240 gfc_set_model (x->value.real);
5241 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5245 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5248 return range_check (result, "SIN");
5253 gfc_simplify_sinh (gfc_expr *x)
5257 if (x->expr_type != EXPR_CONSTANT)
5260 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5265 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5269 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5276 return range_check (result, "SINH");
5280 /* The argument is always a double precision real that is converted to
5281 single precision. TODO: Rounding! */
5284 gfc_simplify_sngl (gfc_expr *a)
5288 if (a->expr_type != EXPR_CONSTANT)
5291 result = gfc_real2real (a, gfc_default_real_kind);
5292 return range_check (result, "SNGL");
5297 gfc_simplify_spacing (gfc_expr *x)
5303 if (x->expr_type != EXPR_CONSTANT)
5306 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5308 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5310 /* Special case x = 0 and -0. */
5311 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5312 if (mpfr_sgn (result->value.real) == 0)
5314 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5318 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5319 are the radix, exponent of x, and precision. This excludes the
5320 possibility of subnormal numbers. Fortran 2003 states the result is
5321 b**max(e - p, emin - 1). */
5323 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5324 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5325 en = en > ep ? en : ep;
5327 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5328 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5330 return range_check (result, "SPACING");
5335 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5337 gfc_expr *result = 0L;
5338 int i, j, dim, ncopies;
5341 if ((!gfc_is_constant_expr (source)
5342 && !is_constant_array_expr (source))
5343 || !gfc_is_constant_expr (dim_expr)
5344 || !gfc_is_constant_expr (ncopies_expr))
5347 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5348 gfc_extract_int (dim_expr, &dim);
5349 dim -= 1; /* zero-base DIM */
5351 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5352 gfc_extract_int (ncopies_expr, &ncopies);
5353 ncopies = MAX (ncopies, 0);
5355 /* Do not allow the array size to exceed the limit for an array
5357 if (source->expr_type == EXPR_ARRAY)
5359 if (gfc_array_size (source, &size) == FAILURE)
5360 gfc_internal_error ("Failure getting length of a constant array.");
5363 mpz_init_set_ui (size, 1);
5365 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5368 if (source->expr_type == EXPR_CONSTANT)
5370 gcc_assert (dim == 0);
5372 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5375 result->shape = gfc_get_shape (result->rank);
5376 mpz_init_set_si (result->shape[0], ncopies);
5378 for (i = 0; i < ncopies; ++i)
5379 gfc_constructor_append_expr (&result->value.constructor,
5380 gfc_copy_expr (source), NULL);
5382 else if (source->expr_type == EXPR_ARRAY)
5384 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5385 gfc_constructor *source_ctor;
5387 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5388 gcc_assert (dim >= 0 && dim <= source->rank);
5390 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5392 result->rank = source->rank + 1;
5393 result->shape = gfc_get_shape (result->rank);
5395 for (i = 0, j = 0; i < result->rank; ++i)
5398 mpz_init_set (result->shape[i], source->shape[j++]);
5400 mpz_init_set_si (result->shape[i], ncopies);
5402 extent[i] = mpz_get_si (result->shape[i]);
5403 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5407 for (source_ctor = gfc_constructor_first (source->value.constructor);
5408 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5410 for (i = 0; i < ncopies; ++i)
5411 gfc_constructor_insert_expr (&result->value.constructor,
5412 gfc_copy_expr (source_ctor->expr),
5413 NULL, offset + i * rstride[dim]);
5415 offset += (dim == 0 ? ncopies : 1);
5419 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5420 Replace NULL with gcc_unreachable() after implementing
5421 gfc_simplify_cshift(). */
5424 if (source->ts.type == BT_CHARACTER)
5425 result->ts.u.cl = source->ts.u.cl;
5432 gfc_simplify_sqrt (gfc_expr *e)
5434 gfc_expr *result = NULL;
5436 if (e->expr_type != EXPR_CONSTANT)
5442 if (mpfr_cmp_si (e->value.real, 0) < 0)
5444 gfc_error ("Argument of SQRT at %L has a negative value",
5446 return &gfc_bad_expr;
5448 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5449 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5453 gfc_set_model (e->value.real);
5455 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5456 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5460 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5463 return range_check (result, "SQRT");
5468 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5472 if (!is_constant_array_expr (array)
5473 || !gfc_is_constant_expr (dim))
5477 && !is_constant_array_expr (mask)
5478 && mask->expr_type != EXPR_CONSTANT)
5481 result = transformational_result (array, dim, array->ts.type,
5482 array->ts.kind, &array->where);
5483 init_result_expr (result, 0, NULL);
5485 return !dim || array->rank == 1 ?
5486 simplify_transformation_to_scalar (result, array, mask, gfc_add) :
5487 simplify_transformation_to_array (result, array, dim, mask, gfc_add, NULL);
5492 gfc_simplify_tan (gfc_expr *x)
5496 if (x->expr_type != EXPR_CONSTANT)
5499 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5504 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5508 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5515 return range_check (result, "TAN");
5520 gfc_simplify_tanh (gfc_expr *x)
5524 if (x->expr_type != EXPR_CONSTANT)
5527 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5532 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5536 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5543 return range_check (result, "TANH");
5548 gfc_simplify_tiny (gfc_expr *e)
5553 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5555 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5556 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5563 gfc_simplify_trailz (gfc_expr *e)
5565 unsigned long tz, bs;
5568 if (e->expr_type != EXPR_CONSTANT)
5571 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5572 bs = gfc_integer_kinds[i].bit_size;
5573 tz = mpz_scan1 (e->value.integer, 0);
5575 return gfc_get_int_expr (gfc_default_integer_kind,
5576 &e->where, MIN (tz, bs));
5581 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
5584 gfc_expr *mold_element;
5587 size_t result_elt_size;
5590 unsigned char *buffer;
5592 if (!gfc_is_constant_expr (source)
5593 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
5594 || !gfc_is_constant_expr (size))
5597 if (source->expr_type == EXPR_FUNCTION)
5600 /* Calculate the size of the source. */
5601 if (source->expr_type == EXPR_ARRAY
5602 && gfc_array_size (source, &tmp) == FAILURE)
5603 gfc_internal_error ("Failure getting length of a constant array.");
5605 source_size = gfc_target_expr_size (source);
5607 /* Create an empty new expression with the appropriate characteristics. */
5608 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
5610 result->ts = mold->ts;
5612 mold_element = mold->expr_type == EXPR_ARRAY
5613 ? gfc_constructor_first (mold->value.constructor)->expr
5616 /* Set result character length, if needed. Note that this needs to be
5617 set even for array expressions, in order to pass this information into
5618 gfc_target_interpret_expr. */
5619 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
5620 result->value.character.length = mold_element->value.character.length;
5622 /* Set the number of elements in the result, and determine its size. */
5623 result_elt_size = gfc_target_expr_size (mold_element);
5624 if (result_elt_size == 0)
5626 gfc_free_expr (result);
5630 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
5634 result->expr_type = EXPR_ARRAY;
5638 result_length = (size_t)mpz_get_ui (size->value.integer);
5641 result_length = source_size / result_elt_size;
5642 if (result_length * result_elt_size < source_size)
5646 result->shape = gfc_get_shape (1);
5647 mpz_init_set_ui (result->shape[0], result_length);
5649 result_size = result_length * result_elt_size;
5654 result_size = result_elt_size;
5657 if (gfc_option.warn_surprising && source_size < result_size)
5658 gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
5659 "source size %ld < result size %ld", &source->where,
5660 (long) source_size, (long) result_size);
5662 /* Allocate the buffer to store the binary version of the source. */
5663 buffer_size = MAX (source_size, result_size);
5664 buffer = (unsigned char*)alloca (buffer_size);
5665 memset (buffer, 0, buffer_size);
5667 /* Now write source to the buffer. */
5668 gfc_target_encode_expr (source, buffer, buffer_size);
5670 /* And read the buffer back into the new expression. */
5671 gfc_target_interpret_expr (buffer, buffer_size, result);
5678 gfc_simplify_transpose (gfc_expr *matrix)
5680 int row, matrix_rows, col, matrix_cols;
5683 if (!is_constant_array_expr (matrix))
5686 gcc_assert (matrix->rank == 2);
5688 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
5691 result->shape = gfc_get_shape (result->rank);
5692 mpz_set (result->shape[0], matrix->shape[1]);
5693 mpz_set (result->shape[1], matrix->shape[0]);
5695 if (matrix->ts.type == BT_CHARACTER)
5696 result->ts.u.cl = matrix->ts.u.cl;
5698 matrix_rows = mpz_get_si (matrix->shape[0]);
5699 matrix_cols = mpz_get_si (matrix->shape[1]);
5700 for (row = 0; row < matrix_rows; ++row)
5701 for (col = 0; col < matrix_cols; ++col)
5703 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
5704 col * matrix_rows + row);
5705 gfc_constructor_insert_expr (&result->value.constructor,
5706 gfc_copy_expr (e), &matrix->where,
5707 row * matrix_cols + col);
5715 gfc_simplify_trim (gfc_expr *e)
5718 int count, i, len, lentrim;
5720 if (e->expr_type != EXPR_CONSTANT)
5723 len = e->value.character.length;
5724 for (count = 0, i = 1; i <= len; ++i)
5726 if (e->value.character.string[len - i] == ' ')
5732 lentrim = len - count;
5734 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
5735 for (i = 0; i < lentrim; i++)
5736 result->value.character.string[i] = e->value.character.string[i];
5743 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
5748 gfc_constructor *sub_cons;
5752 if (!is_constant_array_expr (sub))
5753 goto not_implemented; /* return NULL;*/
5755 /* Follow any component references. */
5756 as = coarray->symtree->n.sym->as;
5757 for (ref = coarray->ref; ref; ref = ref->next)
5758 if (ref->type == REF_COMPONENT)
5761 if (as->type == AS_DEFERRED)
5762 goto not_implemented; /* return NULL;*/
5764 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
5765 the cosubscript addresses the first image. */
5767 sub_cons = gfc_constructor_first (sub->value.constructor);
5770 for (d = 1; d <= as->corank; d++)
5775 if (sub_cons == NULL)
5777 gfc_error ("Too few elements in expression for SUB= argument at %L",
5779 return &gfc_bad_expr;
5782 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
5784 if (ca_bound == NULL)
5785 goto not_implemented; /* return NULL */
5787 if (ca_bound == &gfc_bad_expr)
5790 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
5794 gfc_free_expr (ca_bound);
5795 sub_cons = gfc_constructor_next (sub_cons);
5799 first_image = false;
5803 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
5804 "SUB has %ld and COARRAY lower bound is %ld)",
5806 mpz_get_si (sub_cons->expr->value.integer),
5807 mpz_get_si (ca_bound->value.integer));
5808 gfc_free_expr (ca_bound);
5809 return &gfc_bad_expr;
5812 gfc_free_expr (ca_bound);
5814 /* Check whether upperbound is valid for the multi-images case. */
5817 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
5819 if (ca_bound == &gfc_bad_expr)
5822 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
5823 && mpz_cmp (ca_bound->value.integer,
5824 sub_cons->expr->value.integer) < 0)
5826 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
5827 "SUB has %ld and COARRAY upper bound is %ld)",
5829 mpz_get_si (sub_cons->expr->value.integer),
5830 mpz_get_si (ca_bound->value.integer));
5831 gfc_free_expr (ca_bound);
5832 return &gfc_bad_expr;
5836 gfc_free_expr (ca_bound);
5839 sub_cons = gfc_constructor_next (sub_cons);
5842 if (sub_cons != NULL)
5844 gfc_error ("Too many elements in expression for SUB= argument at %L",
5846 return &gfc_bad_expr;
5849 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5850 &gfc_current_locus);
5852 mpz_set_si (result->value.integer, 1);
5854 mpz_set_si (result->value.integer, 0);
5859 gfc_error ("Not yet implemented: IMAGE_INDEX for coarray with non-constant "
5860 "cobounds at %L", &coarray->where);
5861 return &gfc_bad_expr;
5866 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
5872 if (coarray == NULL)
5875 /* FIXME: gfc_current_locus is wrong. */
5876 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5877 &gfc_current_locus);
5878 mpz_set_si (result->value.integer, 1);
5882 gcc_assert (coarray->expr_type == EXPR_VARIABLE);
5884 /* Follow any component references. */
5885 as = coarray->symtree->n.sym->as;
5886 for (ref = coarray->ref; ref; ref = ref->next)
5887 if (ref->type == REF_COMPONENT)
5890 if (as->type == AS_DEFERRED)
5891 goto not_implemented; /* return NULL;*/
5895 /* Multi-dimensional bounds. */
5896 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
5899 /* Simplify the bounds for each dimension. */
5900 for (d = 0; d < as->corank; d++)
5902 bounds[d] = simplify_bound_dim (coarray, NULL, d + as->rank + 1, 0,
5904 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
5908 for (j = 0; j < d; j++)
5909 gfc_free_expr (bounds[j]);
5910 if (bounds[d] == NULL)
5911 goto not_implemented;
5916 /* Allocate the result expression. */
5917 e = gfc_get_expr ();
5918 e->where = coarray->where;
5919 e->expr_type = EXPR_ARRAY;
5920 e->ts.type = BT_INTEGER;
5921 e->ts.kind = gfc_default_integer_kind;
5924 e->shape = gfc_get_shape (1);
5925 mpz_init_set_ui (e->shape[0], as->corank);
5927 /* Create the constructor for this array. */
5928 for (d = 0; d < as->corank; d++)
5929 gfc_constructor_append_expr (&e->value.constructor,
5930 bounds[d], &e->where);
5937 /* A DIM argument is specified. */
5938 if (dim->expr_type != EXPR_CONSTANT)
5939 goto not_implemented; /*return NULL;*/
5941 d = mpz_get_si (dim->value.integer);
5943 if (d < 1 || d > as->corank)
5945 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
5946 return &gfc_bad_expr;
5949 /*return simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL, true);*/
5950 e = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL, true);
5954 goto not_implemented;
5958 gfc_error ("Not yet implemented: THIS_IMAGE for coarray with non-constant "
5959 "cobounds at %L", &coarray->where);
5960 return &gfc_bad_expr;
5965 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5967 return simplify_bound (array, dim, kind, 1);
5971 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5974 /* return simplify_cobound (array, dim, kind, 1);*/
5976 e = simplify_cobound (array, dim, kind, 1);
5980 gfc_error ("Not yet implemented: UCOBOUND for coarray with non-constant "
5981 "cobounds at %L", &array->where);
5982 return &gfc_bad_expr;
5987 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
5989 gfc_expr *result, *e;
5990 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
5992 if (!is_constant_array_expr (vector)
5993 || !is_constant_array_expr (mask)
5994 || (!gfc_is_constant_expr (field)
5995 && !is_constant_array_expr(field)))
5998 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6000 result->rank = mask->rank;
6001 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6003 if (vector->ts.type == BT_CHARACTER)
6004 result->ts.u.cl = vector->ts.u.cl;
6006 vector_ctor = gfc_constructor_first (vector->value.constructor);
6007 mask_ctor = gfc_constructor_first (mask->value.constructor);
6009 = field->expr_type == EXPR_ARRAY
6010 ? gfc_constructor_first (field->value.constructor)
6015 if (mask_ctor->expr->value.logical)
6017 gcc_assert (vector_ctor);
6018 e = gfc_copy_expr (vector_ctor->expr);
6019 vector_ctor = gfc_constructor_next (vector_ctor);
6021 else if (field->expr_type == EXPR_ARRAY)
6022 e = gfc_copy_expr (field_ctor->expr);
6024 e = gfc_copy_expr (field);
6026 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6028 mask_ctor = gfc_constructor_next (mask_ctor);
6029 field_ctor = gfc_constructor_next (field_ctor);
6037 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6041 size_t index, len, lenset;
6043 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6046 return &gfc_bad_expr;
6048 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
6051 if (b != NULL && b->value.logical != 0)
6056 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6058 len = s->value.character.length;
6059 lenset = set->value.character.length;
6063 mpz_set_ui (result->value.integer, 0);
6071 mpz_set_ui (result->value.integer, 1);
6075 index = wide_strspn (s->value.character.string,
6076 set->value.character.string) + 1;
6085 mpz_set_ui (result->value.integer, len);
6088 for (index = len; index > 0; index --)
6090 for (i = 0; i < lenset; i++)
6092 if (s->value.character.string[index - 1]
6093 == set->value.character.string[i])
6101 mpz_set_ui (result->value.integer, index);
6107 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6112 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6115 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6120 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6121 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6122 return range_check (result, "XOR");
6125 return gfc_get_logical_expr (kind, &x->where,
6126 (x->value.logical && !y->value.logical)
6127 || (!x->value.logical && y->value.logical));
6135 /****************** Constant simplification *****************/
6137 /* Master function to convert one constant to another. While this is
6138 used as a simplification function, it requires the destination type
6139 and kind information which is supplied by a special case in
6143 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6145 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6160 f = gfc_int2complex;
6180 f = gfc_real2complex;
6191 f = gfc_complex2int;
6194 f = gfc_complex2real;
6197 f = gfc_complex2complex;
6223 f = gfc_hollerith2int;
6227 f = gfc_hollerith2real;
6231 f = gfc_hollerith2complex;
6235 f = gfc_hollerith2character;
6239 f = gfc_hollerith2logical;
6249 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6254 switch (e->expr_type)
6257 result = f (e, kind);
6259 return &gfc_bad_expr;
6263 if (!gfc_is_constant_expr (e))
6266 result = gfc_get_array_expr (type, kind, &e->where);
6267 result->shape = gfc_copy_shape (e->shape, e->rank);
6268 result->rank = e->rank;
6270 for (c = gfc_constructor_first (e->value.constructor);
6271 c; c = gfc_constructor_next (c))
6274 if (c->iterator == NULL)
6275 tmp = f (c->expr, kind);
6278 g = gfc_convert_constant (c->expr, type, kind);
6279 if (g == &gfc_bad_expr)
6281 gfc_free_expr (result);
6289 gfc_free_expr (result);
6293 gfc_constructor_append_expr (&result->value.constructor,
6307 /* Function for converting character constants. */
6309 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6314 if (!gfc_is_constant_expr (e))
6317 if (e->expr_type == EXPR_CONSTANT)
6319 /* Simple case of a scalar. */
6320 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6322 return &gfc_bad_expr;
6324 result->value.character.length = e->value.character.length;
6325 result->value.character.string
6326 = gfc_get_wide_string (e->value.character.length + 1);
6327 memcpy (result->value.character.string, e->value.character.string,
6328 (e->value.character.length + 1) * sizeof (gfc_char_t));
6330 /* Check we only have values representable in the destination kind. */
6331 for (i = 0; i < result->value.character.length; i++)
6332 if (!gfc_check_character_range (result->value.character.string[i],
6335 gfc_error ("Character '%s' in string at %L cannot be converted "
6336 "into character kind %d",
6337 gfc_print_wide_char (result->value.character.string[i]),
6339 return &gfc_bad_expr;
6344 else if (e->expr_type == EXPR_ARRAY)
6346 /* For an array constructor, we convert each constructor element. */
6349 result = gfc_get_array_expr (type, kind, &e->where);
6350 result->shape = gfc_copy_shape (e->shape, e->rank);
6351 result->rank = e->rank;
6352 result->ts.u.cl = e->ts.u.cl;
6354 for (c = gfc_constructor_first (e->value.constructor);
6355 c; c = gfc_constructor_next (c))
6357 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6358 if (tmp == &gfc_bad_expr)
6360 gfc_free_expr (result);
6361 return &gfc_bad_expr;
6366 gfc_free_expr (result);
6370 gfc_constructor_append_expr (&result->value.constructor,