OSDN Git Service

c5327940e9eed5da2e23c7885217bf9b6b172694
[pf3gnuchains/gcc-fork.git] / gcc / fortran / simplify.c
1 /* Simplify intrinsic functions at compile-time.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Andy Vaught & Katherine Holcomb
5
6 This file is part of GCC.
7
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
11 version.
12
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
16 for more details.
17
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/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "intrinsic.h"
28 #include "target-memory.h"
29
30 gfc_expr gfc_bad_expr;
31
32
33 /* Note that 'simplification' is not just transforming expressions.
34    For functions that are not simplified at compile time, range
35    checking is done if possible.
36
37    The return convention is that each simplification function returns:
38
39      A new expression node corresponding to the simplified arguments.
40      The original arguments are destroyed by the caller, and must not
41      be a part of the new expression.
42
43      NULL pointer indicating that no simplification was possible and
44      the original expression should remain intact.  If the
45      simplification function sets the type and/or the function name
46      via the pointer gfc_simple_expression, then this type is
47      retained.
48
49      An expression pointer to gfc_bad_expr (a static placeholder)
50      indicating that some error has prevented simplification.  For
51      example, sqrt(-1.0).  The error is generated within the function
52      and should be propagated upwards
53
54    By the time a simplification function gets control, it has been
55    decided that the function call is really supposed to be the
56    intrinsic.  No type checking is strictly necessary, since only
57    valid types will be passed on.  On the other hand, a simplification
58    subroutine may have to look at the type of an argument as part of
59    its processing.
60
61    Array arguments are never passed to these subroutines.
62
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.  */
66
67 /* Range checks an expression node.  If all goes well, returns the
68    node, otherwise returns &gfc_bad_expr and frees the node.  */
69
70 static gfc_expr *
71 range_check (gfc_expr *result, const char *name)
72 {
73   if (result == NULL)
74     return &gfc_bad_expr;
75
76   switch (gfc_range_check (result))
77     {
78       case ARITH_OK:
79         return result;
80  
81       case ARITH_OVERFLOW:
82         gfc_error ("Result of %s overflows its kind at %L", name,
83                    &result->where);
84         break;
85
86       case ARITH_UNDERFLOW:
87         gfc_error ("Result of %s underflows its kind at %L", name,
88                    &result->where);
89         break;
90
91       case ARITH_NAN:
92         gfc_error ("Result of %s is NaN at %L", name, &result->where);
93         break;
94
95       default:
96         gfc_error ("Result of %s gives range error for its kind at %L", name,
97                    &result->where);
98         break;
99     }
100
101   gfc_free_expr (result);
102   return &gfc_bad_expr;
103 }
104
105
106 /* A helper function that gets an optional and possibly missing
107    kind parameter.  Returns the kind, -1 if something went wrong.  */
108
109 static int
110 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
111 {
112   int kind;
113
114   if (k == NULL)
115     return default_kind;
116
117   if (k->expr_type != EXPR_CONSTANT)
118     {
119       gfc_error ("KIND parameter of %s at %L must be an initialization "
120                  "expression", name, &k->where);
121       return -1;
122     }
123
124   if (gfc_extract_int (k, &kind) != NULL
125       || gfc_validate_kind (type, kind, true) < 0)
126     {
127       gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
128       return -1;
129     }
130
131   return kind;
132 }
133
134
135 /* Helper function to get an integer constant with a kind number given
136    by an integer constant expression.  */
137 static gfc_expr *
138 int_expr_with_kind (int i, gfc_expr *kind, const char *name)
139 {
140   gfc_expr *res = gfc_int_expr (i);
141   res->ts.kind = get_kind (BT_INTEGER, kind, name, gfc_default_integer_kind); 
142   if (res->ts.kind == -1)
143     return NULL;
144   else
145     return res;
146 }
147
148
149 /* Converts an mpz_t signed variable into an unsigned one, assuming
150    two's complement representations and a binary width of bitsize.
151    The conversion is a no-op unless x is negative; otherwise, it can
152    be accomplished by masking out the high bits.  */
153
154 static void
155 convert_mpz_to_unsigned (mpz_t x, int bitsize)
156 {
157   mpz_t mask;
158
159   if (mpz_sgn (x) < 0)
160     {
161       /* Confirm that no bits above the signed range are unset.  */
162       gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
163
164       mpz_init_set_ui (mask, 1);
165       mpz_mul_2exp (mask, mask, bitsize);
166       mpz_sub_ui (mask, mask, 1);
167
168       mpz_and (x, x, mask);
169
170       mpz_clear (mask);
171     }
172   else
173     {
174       /* Confirm that no bits above the signed range are set.  */
175       gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
176     }
177 }
178
179
180 /* Converts an mpz_t unsigned variable into a signed one, assuming
181    two's complement representations and a binary width of bitsize.
182    If the bitsize-1 bit is set, this is taken as a sign bit and
183    the number is converted to the corresponding negative number.  */
184
185 static void
186 convert_mpz_to_signed (mpz_t x, int bitsize)
187 {
188   mpz_t mask;
189
190   /* Confirm that no bits above the unsigned range are set.  */
191   gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
192
193   if (mpz_tstbit (x, bitsize - 1) == 1)
194     {
195       mpz_init_set_ui (mask, 1);
196       mpz_mul_2exp (mask, mask, bitsize);
197       mpz_sub_ui (mask, mask, 1);
198
199       /* We negate the number by hand, zeroing the high bits, that is
200          make it the corresponding positive number, and then have it
201          negated by GMP, giving the correct representation of the
202          negative number.  */
203       mpz_com (x, x);
204       mpz_add_ui (x, x, 1);
205       mpz_and (x, x, mask);
206
207       mpz_neg (x, x);
208
209       mpz_clear (mask);
210     }
211 }
212
213
214 /********************** Simplification functions *****************************/
215
216 gfc_expr *
217 gfc_simplify_abs (gfc_expr *e)
218 {
219   gfc_expr *result;
220
221   if (e->expr_type != EXPR_CONSTANT)
222     return NULL;
223
224   switch (e->ts.type)
225     {
226     case BT_INTEGER:
227       result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
228
229       mpz_abs (result->value.integer, e->value.integer);
230
231       result = range_check (result, "IABS");
232       break;
233
234     case BT_REAL:
235       result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
236
237       mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
238
239       result = range_check (result, "ABS");
240       break;
241
242     case BT_COMPLEX:
243       result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
244
245       gfc_set_model_kind (e->ts.kind);
246
247       mpfr_hypot (result->value.real, e->value.complex.r, 
248                   e->value.complex.i, GFC_RND_MODE);
249       result = range_check (result, "CABS");
250       break;
251
252     default:
253       gfc_internal_error ("gfc_simplify_abs(): Bad type");
254     }
255
256   return result;
257 }
258
259
260 static gfc_expr *
261 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
262 {
263   gfc_expr *result;
264   int kind;
265   bool too_large = false;
266
267   if (e->expr_type != EXPR_CONSTANT)
268     return NULL;
269
270   kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
271   if (kind == -1)
272     return &gfc_bad_expr;
273
274   if (mpz_cmp_si (e->value.integer, 0) < 0)
275     {
276       gfc_error ("Argument of %s function at %L is negative", name,
277                  &e->where);
278       return &gfc_bad_expr;
279     }
280
281   if (ascii && gfc_option.warn_surprising
282       && mpz_cmp_si (e->value.integer, 127) > 0)
283     gfc_warning ("Argument of %s function at %L outside of range [0,127]",
284                  name, &e->where);
285
286   if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
287     too_large = true;
288   else if (kind == 4)
289     {
290       mpz_t t;
291       mpz_init_set_ui (t, 2);
292       mpz_pow_ui (t, t, 32);
293       mpz_sub_ui (t, t, 1);
294       if (mpz_cmp (e->value.integer, t) > 0)
295         too_large = true;
296       mpz_clear (t);
297     }
298
299   if (too_large)
300     {
301       gfc_error ("Argument of %s function at %L is too large for the "
302                  "collating sequence of kind %d", name, &e->where, kind);
303       return &gfc_bad_expr;
304     }
305
306   result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
307   result->value.character.string = gfc_get_wide_string (2);
308   result->value.character.length = 1;
309   result->value.character.string[0] = mpz_get_ui (e->value.integer);
310   result->value.character.string[1] = '\0';     /* For debugger */
311   return result;
312 }
313
314
315
316 /* We use the processor's collating sequence, because all
317    systems that gfortran currently works on are ASCII.  */
318
319 gfc_expr *
320 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
321 {
322   return simplify_achar_char (e, k, "ACHAR", true);
323 }
324
325
326 gfc_expr *
327 gfc_simplify_acos (gfc_expr *x)
328 {
329   gfc_expr *result;
330
331   if (x->expr_type != EXPR_CONSTANT)
332     return NULL;
333
334   if (mpfr_cmp_si (x->value.real, 1) > 0
335       || mpfr_cmp_si (x->value.real, -1) < 0)
336     {
337       gfc_error ("Argument of ACOS at %L must be between -1 and 1",
338                  &x->where);
339       return &gfc_bad_expr;
340     }
341
342   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
343
344   mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
345
346   return range_check (result, "ACOS");
347 }
348
349 gfc_expr *
350 gfc_simplify_acosh (gfc_expr *x)
351 {
352   gfc_expr *result;
353
354   if (x->expr_type != EXPR_CONSTANT)
355     return NULL;
356
357   if (mpfr_cmp_si (x->value.real, 1) < 0)
358     {
359       gfc_error ("Argument of ACOSH at %L must not be less than 1",
360                  &x->where);
361       return &gfc_bad_expr;
362     }
363
364   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
365
366   mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
367
368   return range_check (result, "ACOSH");
369 }
370
371 gfc_expr *
372 gfc_simplify_adjustl (gfc_expr *e)
373 {
374   gfc_expr *result;
375   int count, i, len;
376   gfc_char_t ch;
377
378   if (e->expr_type != EXPR_CONSTANT)
379     return NULL;
380
381   len = e->value.character.length;
382
383   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
384
385   result->value.character.length = len;
386   result->value.character.string = gfc_get_wide_string (len + 1);
387
388   for (count = 0, i = 0; i < len; ++i)
389     {
390       ch = e->value.character.string[i];
391       if (ch != ' ')
392         break;
393       ++count;
394     }
395
396   for (i = 0; i < len - count; ++i)
397     result->value.character.string[i] = e->value.character.string[count + i];
398
399   for (i = len - count; i < len; ++i)
400     result->value.character.string[i] = ' ';
401
402   result->value.character.string[len] = '\0';   /* For debugger */
403
404   return result;
405 }
406
407
408 gfc_expr *
409 gfc_simplify_adjustr (gfc_expr *e)
410 {
411   gfc_expr *result;
412   int count, i, len;
413   gfc_char_t ch;
414
415   if (e->expr_type != EXPR_CONSTANT)
416     return NULL;
417
418   len = e->value.character.length;
419
420   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
421
422   result->value.character.length = len;
423   result->value.character.string = gfc_get_wide_string (len + 1);
424
425   for (count = 0, i = len - 1; i >= 0; --i)
426     {
427       ch = e->value.character.string[i];
428       if (ch != ' ')
429         break;
430       ++count;
431     }
432
433   for (i = 0; i < count; ++i)
434     result->value.character.string[i] = ' ';
435
436   for (i = count; i < len; ++i)
437     result->value.character.string[i] = e->value.character.string[i - count];
438
439   result->value.character.string[len] = '\0';   /* For debugger */
440
441   return result;
442 }
443
444
445 gfc_expr *
446 gfc_simplify_aimag (gfc_expr *e)
447 {
448   gfc_expr *result;
449
450   if (e->expr_type != EXPR_CONSTANT)
451     return NULL;
452
453   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
454   mpfr_set (result->value.real, e->value.complex.i, GFC_RND_MODE);
455
456   return range_check (result, "AIMAG");
457 }
458
459
460 gfc_expr *
461 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
462 {
463   gfc_expr *rtrunc, *result;
464   int kind;
465
466   kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
467   if (kind == -1)
468     return &gfc_bad_expr;
469
470   if (e->expr_type != EXPR_CONSTANT)
471     return NULL;
472
473   rtrunc = gfc_copy_expr (e);
474
475   mpfr_trunc (rtrunc->value.real, e->value.real);
476
477   result = gfc_real2real (rtrunc, kind);
478   gfc_free_expr (rtrunc);
479
480   return range_check (result, "AINT");
481 }
482
483
484 gfc_expr *
485 gfc_simplify_dint (gfc_expr *e)
486 {
487   gfc_expr *rtrunc, *result;
488
489   if (e->expr_type != EXPR_CONSTANT)
490     return NULL;
491
492   rtrunc = gfc_copy_expr (e);
493
494   mpfr_trunc (rtrunc->value.real, e->value.real);
495
496   result = gfc_real2real (rtrunc, gfc_default_double_kind);
497   gfc_free_expr (rtrunc);
498
499   return range_check (result, "DINT");
500 }
501
502
503 gfc_expr *
504 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
505 {
506   gfc_expr *result;
507   int kind;
508
509   kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
510   if (kind == -1)
511     return &gfc_bad_expr;
512
513   if (e->expr_type != EXPR_CONSTANT)
514     return NULL;
515
516   result = gfc_constant_result (e->ts.type, kind, &e->where);
517
518   mpfr_round (result->value.real, e->value.real);
519
520   return range_check (result, "ANINT");
521 }
522
523
524 gfc_expr *
525 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
526 {
527   gfc_expr *result;
528   int kind;
529
530   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
531     return NULL;
532
533   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
534   if (x->ts.type == BT_INTEGER)
535     {
536       result = gfc_constant_result (BT_INTEGER, kind, &x->where);
537       mpz_and (result->value.integer, x->value.integer, y->value.integer);
538       return range_check (result, "AND");
539     }
540   else /* BT_LOGICAL */
541     {
542       result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
543       result->value.logical = x->value.logical && y->value.logical;
544       return result;
545     }
546 }
547
548
549 gfc_expr *
550 gfc_simplify_dnint (gfc_expr *e)
551 {
552   gfc_expr *result;
553
554   if (e->expr_type != EXPR_CONSTANT)
555     return NULL;
556
557   result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &e->where);
558
559   mpfr_round (result->value.real, e->value.real);
560
561   return range_check (result, "DNINT");
562 }
563
564
565 gfc_expr *
566 gfc_simplify_asin (gfc_expr *x)
567 {
568   gfc_expr *result;
569
570   if (x->expr_type != EXPR_CONSTANT)
571     return NULL;
572
573   if (mpfr_cmp_si (x->value.real, 1) > 0
574       || mpfr_cmp_si (x->value.real, -1) < 0)
575     {
576       gfc_error ("Argument of ASIN at %L must be between -1 and 1",
577                  &x->where);
578       return &gfc_bad_expr;
579     }
580
581   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
582
583   mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
584
585   return range_check (result, "ASIN");
586 }
587
588
589 gfc_expr *
590 gfc_simplify_asinh (gfc_expr *x)
591 {
592   gfc_expr *result;
593
594   if (x->expr_type != EXPR_CONSTANT)
595     return NULL;
596
597   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
598
599   mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
600
601   return range_check (result, "ASINH");
602 }
603
604
605 gfc_expr *
606 gfc_simplify_atan (gfc_expr *x)
607 {
608   gfc_expr *result;
609
610   if (x->expr_type != EXPR_CONSTANT)
611     return NULL;
612     
613   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
614
615   mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
616
617   return range_check (result, "ATAN");
618 }
619
620
621 gfc_expr *
622 gfc_simplify_atanh (gfc_expr *x)
623 {
624   gfc_expr *result;
625
626   if (x->expr_type != EXPR_CONSTANT)
627     return NULL;
628
629   if (mpfr_cmp_si (x->value.real, 1) >= 0
630       || mpfr_cmp_si (x->value.real, -1) <= 0)
631     {
632       gfc_error ("Argument of ATANH at %L must be inside the range -1 to 1",
633                  &x->where);
634       return &gfc_bad_expr;
635     }
636
637   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
638
639   mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
640
641   return range_check (result, "ATANH");
642 }
643
644
645 gfc_expr *
646 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
647 {
648   gfc_expr *result;
649
650   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
651     return NULL;
652
653   if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
654     {
655       gfc_error ("If first argument of ATAN2 %L is zero, then the "
656                  "second argument must not be zero", &x->where);
657       return &gfc_bad_expr;
658     }
659
660   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
661
662   mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
663
664   return range_check (result, "ATAN2");
665 }
666
667
668 gfc_expr *
669 gfc_simplify_bessel_j0 (gfc_expr *x ATTRIBUTE_UNUSED)
670 {
671   gfc_expr *result;
672
673   if (x->expr_type != EXPR_CONSTANT)
674     return NULL;
675
676   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
677   mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
678
679   return range_check (result, "BESSEL_J0");
680 }
681
682
683 gfc_expr *
684 gfc_simplify_bessel_j1 (gfc_expr *x ATTRIBUTE_UNUSED)
685 {
686   gfc_expr *result;
687
688   if (x->expr_type != EXPR_CONSTANT)
689     return NULL;
690
691   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
692   mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
693
694   return range_check (result, "BESSEL_J1");
695 }
696
697
698 gfc_expr *
699 gfc_simplify_bessel_jn (gfc_expr *order ATTRIBUTE_UNUSED,
700                         gfc_expr *x ATTRIBUTE_UNUSED)
701 {
702   gfc_expr *result;
703   long n;
704
705   if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
706     return NULL;
707
708   n = mpz_get_si (order->value.integer);
709   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
710   mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
711
712   return range_check (result, "BESSEL_JN");
713 }
714
715
716 gfc_expr *
717 gfc_simplify_bessel_y0 (gfc_expr *x ATTRIBUTE_UNUSED)
718 {
719   gfc_expr *result;
720
721   if (x->expr_type != EXPR_CONSTANT)
722     return NULL;
723
724   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
725   mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
726
727   return range_check (result, "BESSEL_Y0");
728 }
729
730
731 gfc_expr *
732 gfc_simplify_bessel_y1 (gfc_expr *x ATTRIBUTE_UNUSED)
733 {
734   gfc_expr *result;
735
736   if (x->expr_type != EXPR_CONSTANT)
737     return NULL;
738
739   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
740   mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
741
742   return range_check (result, "BESSEL_Y1");
743 }
744
745
746 gfc_expr *
747 gfc_simplify_bessel_yn (gfc_expr *order ATTRIBUTE_UNUSED,
748                         gfc_expr *x ATTRIBUTE_UNUSED)
749 {
750   gfc_expr *result;
751   long n;
752
753   if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
754     return NULL;
755
756   n = mpz_get_si (order->value.integer);
757   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
758   mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
759
760   return range_check (result, "BESSEL_YN");
761 }
762
763
764 gfc_expr *
765 gfc_simplify_bit_size (gfc_expr *e)
766 {
767   gfc_expr *result;
768   int i;
769
770   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
771   result = gfc_constant_result (BT_INTEGER, e->ts.kind, &e->where);
772   mpz_set_ui (result->value.integer, gfc_integer_kinds[i].bit_size);
773
774   return result;
775 }
776
777
778 gfc_expr *
779 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
780 {
781   int b;
782
783   if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
784     return NULL;
785
786   if (gfc_extract_int (bit, &b) != NULL || b < 0)
787     return gfc_logical_expr (0, &e->where);
788
789   return gfc_logical_expr (mpz_tstbit (e->value.integer, b), &e->where);
790 }
791
792
793 gfc_expr *
794 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
795 {
796   gfc_expr *ceil, *result;
797   int kind;
798
799   kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
800   if (kind == -1)
801     return &gfc_bad_expr;
802
803   if (e->expr_type != EXPR_CONSTANT)
804     return NULL;
805
806   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
807
808   ceil = gfc_copy_expr (e);
809
810   mpfr_ceil (ceil->value.real, e->value.real);
811   gfc_mpfr_to_mpz (result->value.integer, ceil->value.real);
812
813   gfc_free_expr (ceil);
814
815   return range_check (result, "CEILING");
816 }
817
818
819 gfc_expr *
820 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
821 {
822   return simplify_achar_char (e, k, "CHAR", false);
823 }
824
825
826 /* Common subroutine for simplifying CMPLX and DCMPLX.  */
827
828 static gfc_expr *
829 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
830 {
831   gfc_expr *result;
832
833   result = gfc_constant_result (BT_COMPLEX, kind, &x->where);
834
835   mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
836
837   switch (x->ts.type)
838     {
839     case BT_INTEGER:
840       if (!x->is_boz)
841         mpfr_set_z (result->value.complex.r, x->value.integer, GFC_RND_MODE);
842       break;
843
844     case BT_REAL:
845       mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
846       break;
847
848     case BT_COMPLEX:
849       mpfr_set (result->value.complex.r, x->value.complex.r, GFC_RND_MODE);
850       mpfr_set (result->value.complex.i, x->value.complex.i, GFC_RND_MODE);
851       break;
852
853     default:
854       gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
855     }
856
857   if (y != NULL)
858     {
859       switch (y->ts.type)
860         {
861         case BT_INTEGER:
862           if (!y->is_boz)
863             mpfr_set_z (result->value.complex.i, y->value.integer,
864                         GFC_RND_MODE);
865           break;
866
867         case BT_REAL:
868           mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
869           break;
870
871         default:
872           gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
873         }
874     }
875
876   /* Handle BOZ.  */
877   if (x->is_boz)
878     {
879       gfc_typespec ts;
880       gfc_clear_ts (&ts);
881       ts.kind = result->ts.kind;
882       ts.type = BT_REAL;
883       if (!gfc_convert_boz (x, &ts))
884         return &gfc_bad_expr;
885       mpfr_set (result->value.complex.r, x->value.real, GFC_RND_MODE);
886     }
887
888   if (y && y->is_boz)
889     {
890       gfc_typespec ts;
891       gfc_clear_ts (&ts);
892       ts.kind = result->ts.kind;
893       ts.type = BT_REAL;
894       if (!gfc_convert_boz (y, &ts))
895         return &gfc_bad_expr;
896       mpfr_set (result->value.complex.i, y->value.real, GFC_RND_MODE);
897     }
898
899   return range_check (result, name);
900 }
901
902
903 /* Function called when we won't simplify an expression like CMPLX (or
904    COMPLEX or DCMPLX) but still want to convert BOZ arguments.  */
905
906 static gfc_expr *
907 only_convert_cmplx_boz (gfc_expr *x, gfc_expr *y, int kind)
908 {
909   gfc_typespec ts;
910   gfc_clear_ts (&ts);
911   ts.type = BT_REAL;
912   ts.kind = kind;
913
914   if (x->is_boz && !gfc_convert_boz (x, &ts))
915     return &gfc_bad_expr;
916
917   if (y && y->is_boz && !gfc_convert_boz (y, &ts))
918     return &gfc_bad_expr;
919
920   return NULL;
921 }
922
923
924 gfc_expr *
925 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
926 {
927   int kind;
928
929   kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_real_kind);
930   if (kind == -1)
931     return &gfc_bad_expr;
932
933   if (x->expr_type != EXPR_CONSTANT
934       || (y != NULL && y->expr_type != EXPR_CONSTANT))
935     return only_convert_cmplx_boz (x, y, kind);
936
937   return simplify_cmplx ("CMPLX", x, y, kind);
938 }
939
940
941 gfc_expr *
942 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
943 {
944   int kind;
945
946   if (x->ts.type == BT_INTEGER)
947     {
948       if (y->ts.type == BT_INTEGER)
949         kind = gfc_default_real_kind;
950       else
951         kind = y->ts.kind;
952     }
953   else
954     {
955       if (y->ts.type == BT_REAL)
956         kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
957       else
958         kind = x->ts.kind;
959     }
960
961   if (x->expr_type != EXPR_CONSTANT
962       || (y != NULL && y->expr_type != EXPR_CONSTANT))
963     return only_convert_cmplx_boz (x, y, kind);
964
965   return simplify_cmplx ("COMPLEX", x, y, kind);
966 }
967
968
969 gfc_expr *
970 gfc_simplify_conjg (gfc_expr *e)
971 {
972   gfc_expr *result;
973
974   if (e->expr_type != EXPR_CONSTANT)
975     return NULL;
976
977   result = gfc_copy_expr (e);
978   mpfr_neg (result->value.complex.i, result->value.complex.i, GFC_RND_MODE);
979
980   return range_check (result, "CONJG");
981 }
982
983
984 gfc_expr *
985 gfc_simplify_cos (gfc_expr *x)
986 {
987   gfc_expr *result;
988   mpfr_t xp, xq;
989
990   if (x->expr_type != EXPR_CONSTANT)
991     return NULL;
992
993   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
994
995   switch (x->ts.type)
996     {
997     case BT_REAL:
998       mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
999       break;
1000     case BT_COMPLEX:
1001       gfc_set_model_kind (x->ts.kind);
1002       mpfr_init (xp);
1003       mpfr_init (xq);
1004
1005       mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
1006       mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
1007       mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
1008
1009       mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
1010       mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
1011       mpfr_mul (xp, xp, xq, GFC_RND_MODE);
1012       mpfr_neg (result->value.complex.i, xp, GFC_RND_MODE );
1013
1014       mpfr_clears (xp, xq, NULL);
1015       break;
1016     default:
1017       gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1018     }
1019
1020   return range_check (result, "COS");
1021
1022 }
1023
1024
1025 gfc_expr *
1026 gfc_simplify_cosh (gfc_expr *x)
1027 {
1028   gfc_expr *result;
1029
1030   if (x->expr_type != EXPR_CONSTANT)
1031     return NULL;
1032
1033   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1034
1035   mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1036
1037   return range_check (result, "COSH");
1038 }
1039
1040
1041 gfc_expr *
1042 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1043 {
1044
1045   if (x->expr_type != EXPR_CONSTANT
1046       || (y != NULL && y->expr_type != EXPR_CONSTANT))
1047     return only_convert_cmplx_boz (x, y, gfc_default_double_kind);
1048
1049   return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1050 }
1051
1052
1053 gfc_expr *
1054 gfc_simplify_dble (gfc_expr *e)
1055 {
1056   gfc_expr *result = NULL;
1057
1058   if (e->expr_type != EXPR_CONSTANT)
1059     return NULL;
1060
1061   switch (e->ts.type)
1062     {
1063     case BT_INTEGER:
1064       if (!e->is_boz)
1065         result = gfc_int2real (e, gfc_default_double_kind);
1066       break;
1067
1068     case BT_REAL:
1069       result = gfc_real2real (e, gfc_default_double_kind);
1070       break;
1071
1072     case BT_COMPLEX:
1073       result = gfc_complex2real (e, gfc_default_double_kind);
1074       break;
1075
1076     default:
1077       gfc_internal_error ("gfc_simplify_dble(): bad type at %L", &e->where);
1078     }
1079
1080   if (e->ts.type == BT_INTEGER && e->is_boz)
1081     {
1082       gfc_typespec ts;
1083       gfc_clear_ts (&ts);
1084       ts.type = BT_REAL;
1085       ts.kind = gfc_default_double_kind;
1086       result = gfc_copy_expr (e);
1087       if (!gfc_convert_boz (result, &ts))
1088         {
1089           gfc_free_expr (result);
1090           return &gfc_bad_expr;
1091         }
1092     }
1093
1094   return range_check (result, "DBLE");
1095 }
1096
1097
1098 gfc_expr *
1099 gfc_simplify_digits (gfc_expr *x)
1100 {
1101   int i, digits;
1102
1103   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1104   switch (x->ts.type)
1105     {
1106     case BT_INTEGER:
1107       digits = gfc_integer_kinds[i].digits;
1108       break;
1109
1110     case BT_REAL:
1111     case BT_COMPLEX:
1112       digits = gfc_real_kinds[i].digits;
1113       break;
1114
1115     default:
1116       gcc_unreachable ();
1117     }
1118
1119   return gfc_int_expr (digits);
1120 }
1121
1122
1123 gfc_expr *
1124 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1125 {
1126   gfc_expr *result;
1127   int kind;
1128
1129   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1130     return NULL;
1131
1132   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1133   result = gfc_constant_result (x->ts.type, kind, &x->where);
1134
1135   switch (x->ts.type)
1136     {
1137     case BT_INTEGER:
1138       if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1139         mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1140       else
1141         mpz_set_ui (result->value.integer, 0);
1142
1143       break;
1144
1145     case BT_REAL:
1146       if (mpfr_cmp (x->value.real, y->value.real) > 0)
1147         mpfr_sub (result->value.real, x->value.real, y->value.real,
1148                   GFC_RND_MODE);
1149       else
1150         mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1151
1152       break;
1153
1154     default:
1155       gfc_internal_error ("gfc_simplify_dim(): Bad type");
1156     }
1157
1158   return range_check (result, "DIM");
1159 }
1160
1161
1162 gfc_expr *
1163 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1164 {
1165   gfc_expr *a1, *a2, *result;
1166
1167   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1168     return NULL;
1169
1170   result = gfc_constant_result (BT_REAL, gfc_default_double_kind, &x->where);
1171
1172   a1 = gfc_real2real (x, gfc_default_double_kind);
1173   a2 = gfc_real2real (y, gfc_default_double_kind);
1174
1175   mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1176
1177   gfc_free_expr (a1);
1178   gfc_free_expr (a2);
1179
1180   return range_check (result, "DPROD");
1181 }
1182
1183
1184 gfc_expr *
1185 gfc_simplify_erf (gfc_expr *x)
1186 {
1187   gfc_expr *result;
1188
1189   if (x->expr_type != EXPR_CONSTANT)
1190     return NULL;
1191
1192   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1193
1194   mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1195
1196   return range_check (result, "ERF");
1197 }
1198
1199
1200 gfc_expr *
1201 gfc_simplify_erfc (gfc_expr *x)
1202 {
1203   gfc_expr *result;
1204
1205   if (x->expr_type != EXPR_CONSTANT)
1206     return NULL;
1207
1208   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1209
1210   mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1211
1212   return range_check (result, "ERFC");
1213 }
1214
1215
1216 gfc_expr *
1217 gfc_simplify_epsilon (gfc_expr *e)
1218 {
1219   gfc_expr *result;
1220   int i;
1221
1222   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1223
1224   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
1225
1226   mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
1227
1228   return range_check (result, "EPSILON");
1229 }
1230
1231
1232 gfc_expr *
1233 gfc_simplify_exp (gfc_expr *x)
1234 {
1235   gfc_expr *result;
1236   mpfr_t xp, xq;
1237
1238   if (x->expr_type != EXPR_CONSTANT)
1239     return NULL;
1240
1241   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1242
1243   switch (x->ts.type)
1244     {
1245     case BT_REAL:
1246       mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
1247       break;
1248
1249     case BT_COMPLEX:
1250       gfc_set_model_kind (x->ts.kind);
1251       mpfr_init (xp);
1252       mpfr_init (xq);
1253       mpfr_exp (xq, x->value.complex.r, GFC_RND_MODE);
1254       mpfr_cos (xp, x->value.complex.i, GFC_RND_MODE);
1255       mpfr_mul (result->value.complex.r, xq, xp, GFC_RND_MODE);
1256       mpfr_sin (xp, x->value.complex.i, GFC_RND_MODE);
1257       mpfr_mul (result->value.complex.i, xq, xp, GFC_RND_MODE);
1258       mpfr_clears (xp, xq, NULL);
1259       break;
1260
1261     default:
1262       gfc_internal_error ("in gfc_simplify_exp(): Bad type");
1263     }
1264
1265   return range_check (result, "EXP");
1266 }
1267
1268 gfc_expr *
1269 gfc_simplify_exponent (gfc_expr *x)
1270 {
1271   int i;
1272   gfc_expr *result;
1273
1274   if (x->expr_type != EXPR_CONSTANT)
1275     return NULL;
1276
1277   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1278                                 &x->where);
1279
1280   gfc_set_model (x->value.real);
1281
1282   if (mpfr_sgn (x->value.real) == 0)
1283     {
1284       mpz_set_ui (result->value.integer, 0);
1285       return result;
1286     }
1287
1288   i = (int) mpfr_get_exp (x->value.real);
1289   mpz_set_si (result->value.integer, i);
1290
1291   return range_check (result, "EXPONENT");
1292 }
1293
1294
1295 gfc_expr *
1296 gfc_simplify_float (gfc_expr *a)
1297 {
1298   gfc_expr *result;
1299
1300   if (a->expr_type != EXPR_CONSTANT)
1301     return NULL;
1302
1303   if (a->is_boz)
1304     {
1305       gfc_typespec ts;
1306       gfc_clear_ts (&ts);
1307
1308       ts.type = BT_REAL;
1309       ts.kind = gfc_default_real_kind;
1310
1311       result = gfc_copy_expr (a);
1312       if (!gfc_convert_boz (result, &ts))
1313         {
1314           gfc_free_expr (result);
1315           return &gfc_bad_expr;
1316         }
1317     }
1318   else
1319     result = gfc_int2real (a, gfc_default_real_kind);
1320   return range_check (result, "FLOAT");
1321 }
1322
1323
1324 gfc_expr *
1325 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
1326 {
1327   gfc_expr *result;
1328   mpfr_t floor;
1329   int kind;
1330
1331   kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
1332   if (kind == -1)
1333     gfc_internal_error ("gfc_simplify_floor(): Bad kind");
1334
1335   if (e->expr_type != EXPR_CONSTANT)
1336     return NULL;
1337
1338   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
1339
1340   gfc_set_model_kind (kind);
1341   mpfr_init (floor);
1342   mpfr_floor (floor, e->value.real);
1343
1344   gfc_mpfr_to_mpz (result->value.integer, floor);
1345
1346   mpfr_clear (floor);
1347
1348   return range_check (result, "FLOOR");
1349 }
1350
1351
1352 gfc_expr *
1353 gfc_simplify_fraction (gfc_expr *x)
1354 {
1355   gfc_expr *result;
1356   mpfr_t absv, exp, pow2;
1357
1358   if (x->expr_type != EXPR_CONSTANT)
1359     return NULL;
1360
1361   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
1362
1363   if (mpfr_sgn (x->value.real) == 0)
1364     {
1365       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1366       return result;
1367     }
1368
1369   gfc_set_model_kind (x->ts.kind);
1370   mpfr_init (exp);
1371   mpfr_init (absv);
1372   mpfr_init (pow2);
1373
1374   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
1375   mpfr_log2 (exp, absv, GFC_RND_MODE);
1376
1377   mpfr_trunc (exp, exp);
1378   mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
1379
1380   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
1381
1382   mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
1383
1384   mpfr_clears (exp, absv, pow2, NULL);
1385
1386   return range_check (result, "FRACTION");
1387 }
1388
1389
1390 gfc_expr *
1391 gfc_simplify_gamma (gfc_expr *x)
1392 {
1393   gfc_expr *result;
1394
1395   if (x->expr_type != EXPR_CONSTANT)
1396     return NULL;
1397
1398   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1399
1400   mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
1401
1402   return range_check (result, "GAMMA");
1403 }
1404
1405
1406 gfc_expr *
1407 gfc_simplify_huge (gfc_expr *e)
1408 {
1409   gfc_expr *result;
1410   int i;
1411
1412   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1413
1414   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
1415
1416   switch (e->ts.type)
1417     {
1418     case BT_INTEGER:
1419       mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
1420       break;
1421
1422     case BT_REAL:
1423       mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
1424       break;
1425
1426     default:
1427       gcc_unreachable ();
1428     }
1429
1430   return result;
1431 }
1432
1433
1434 gfc_expr *
1435 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
1436 {
1437   gfc_expr *result;
1438
1439   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1440     return NULL;
1441
1442   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1443   mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
1444   return range_check (result, "HYPOT");
1445 }
1446
1447
1448 /* We use the processor's collating sequence, because all
1449    systems that gfortran currently works on are ASCII.  */
1450
1451 gfc_expr *
1452 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
1453 {
1454   gfc_expr *result;
1455   gfc_char_t index;
1456
1457   if (e->expr_type != EXPR_CONSTANT)
1458     return NULL;
1459
1460   if (e->value.character.length != 1)
1461     {
1462       gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
1463       return &gfc_bad_expr;
1464     }
1465
1466   index = e->value.character.string[0];
1467
1468   if (gfc_option.warn_surprising && index > 127)
1469     gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
1470                  &e->where);
1471
1472   if ((result = int_expr_with_kind (index, kind, "IACHAR")) == NULL)
1473     return &gfc_bad_expr;
1474
1475   result->where = e->where;
1476
1477   return range_check (result, "IACHAR");
1478 }
1479
1480
1481 gfc_expr *
1482 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
1483 {
1484   gfc_expr *result;
1485
1486   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1487     return NULL;
1488
1489   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1490
1491   mpz_and (result->value.integer, x->value.integer, y->value.integer);
1492
1493   return range_check (result, "IAND");
1494 }
1495
1496
1497 gfc_expr *
1498 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
1499 {
1500   gfc_expr *result;
1501   int k, pos;
1502
1503   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1504     return NULL;
1505
1506   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1507     {
1508       gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
1509       return &gfc_bad_expr;
1510     }
1511
1512   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1513
1514   if (pos >= gfc_integer_kinds[k].bit_size)
1515     {
1516       gfc_error ("Second argument of IBCLR exceeds bit size at %L",
1517                  &y->where);
1518       return &gfc_bad_expr;
1519     }
1520
1521   result = gfc_copy_expr (x);
1522
1523   convert_mpz_to_unsigned (result->value.integer,
1524                            gfc_integer_kinds[k].bit_size);
1525
1526   mpz_clrbit (result->value.integer, pos);
1527
1528   convert_mpz_to_signed (result->value.integer,
1529                          gfc_integer_kinds[k].bit_size);
1530
1531   return result;
1532 }
1533
1534
1535 gfc_expr *
1536 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
1537 {
1538   gfc_expr *result;
1539   int pos, len;
1540   int i, k, bitsize;
1541   int *bits;
1542
1543   if (x->expr_type != EXPR_CONSTANT
1544       || y->expr_type != EXPR_CONSTANT
1545       || z->expr_type != EXPR_CONSTANT)
1546     return NULL;
1547
1548   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1549     {
1550       gfc_error ("Invalid second argument of IBITS at %L", &y->where);
1551       return &gfc_bad_expr;
1552     }
1553
1554   if (gfc_extract_int (z, &len) != NULL || len < 0)
1555     {
1556       gfc_error ("Invalid third argument of IBITS at %L", &z->where);
1557       return &gfc_bad_expr;
1558     }
1559
1560   k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
1561
1562   bitsize = gfc_integer_kinds[k].bit_size;
1563
1564   if (pos + len > bitsize)
1565     {
1566       gfc_error ("Sum of second and third arguments of IBITS exceeds "
1567                  "bit size at %L", &y->where);
1568       return &gfc_bad_expr;
1569     }
1570
1571   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
1572   convert_mpz_to_unsigned (result->value.integer,
1573                            gfc_integer_kinds[k].bit_size);
1574
1575   bits = XCNEWVEC (int, bitsize);
1576
1577   for (i = 0; i < bitsize; i++)
1578     bits[i] = 0;
1579
1580   for (i = 0; i < len; i++)
1581     bits[i] = mpz_tstbit (x->value.integer, i + pos);
1582
1583   for (i = 0; i < bitsize; i++)
1584     {
1585       if (bits[i] == 0)
1586         mpz_clrbit (result->value.integer, i);
1587       else if (bits[i] == 1)
1588         mpz_setbit (result->value.integer, i);
1589       else
1590         gfc_internal_error ("IBITS: Bad bit");
1591     }
1592
1593   gfc_free (bits);
1594
1595   convert_mpz_to_signed (result->value.integer,
1596                          gfc_integer_kinds[k].bit_size);
1597
1598   return result;
1599 }
1600
1601
1602 gfc_expr *
1603 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
1604 {
1605   gfc_expr *result;
1606   int k, pos;
1607
1608   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1609     return NULL;
1610
1611   if (gfc_extract_int (y, &pos) != NULL || pos < 0)
1612     {
1613       gfc_error ("Invalid second argument of IBSET at %L", &y->where);
1614       return &gfc_bad_expr;
1615     }
1616
1617   k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1618
1619   if (pos >= gfc_integer_kinds[k].bit_size)
1620     {
1621       gfc_error ("Second argument of IBSET exceeds bit size at %L",
1622                  &y->where);
1623       return &gfc_bad_expr;
1624     }
1625
1626   result = gfc_copy_expr (x);
1627
1628   convert_mpz_to_unsigned (result->value.integer,
1629                            gfc_integer_kinds[k].bit_size);
1630
1631   mpz_setbit (result->value.integer, pos);
1632
1633   convert_mpz_to_signed (result->value.integer,
1634                          gfc_integer_kinds[k].bit_size);
1635
1636   return result;
1637 }
1638
1639
1640 gfc_expr *
1641 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
1642 {
1643   gfc_expr *result;
1644   gfc_char_t index;
1645
1646   if (e->expr_type != EXPR_CONSTANT)
1647     return NULL;
1648
1649   if (e->value.character.length != 1)
1650     {
1651       gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
1652       return &gfc_bad_expr;
1653     }
1654
1655   index = e->value.character.string[0];
1656
1657   if ((result = int_expr_with_kind (index, kind, "ICHAR")) == NULL)
1658     return &gfc_bad_expr;
1659
1660   result->where = e->where;
1661   return range_check (result, "ICHAR");
1662 }
1663
1664
1665 gfc_expr *
1666 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
1667 {
1668   gfc_expr *result;
1669
1670   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1671     return NULL;
1672
1673   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1674
1675   mpz_xor (result->value.integer, x->value.integer, y->value.integer);
1676
1677   return range_check (result, "IEOR");
1678 }
1679
1680
1681 gfc_expr *
1682 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
1683 {
1684   gfc_expr *result;
1685   int back, len, lensub;
1686   int i, j, k, count, index = 0, start;
1687
1688   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT 
1689       || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
1690     return NULL;
1691
1692   if (b != NULL && b->value.logical != 0)
1693     back = 1;
1694   else
1695     back = 0;
1696
1697   k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind); 
1698   if (k == -1)
1699     return &gfc_bad_expr;
1700
1701   result = gfc_constant_result (BT_INTEGER, k, &x->where);
1702
1703   len = x->value.character.length;
1704   lensub = y->value.character.length;
1705
1706   if (len < lensub)
1707     {
1708       mpz_set_si (result->value.integer, 0);
1709       return result;
1710     }
1711
1712   if (back == 0)
1713     {
1714       if (lensub == 0)
1715         {
1716           mpz_set_si (result->value.integer, 1);
1717           return result;
1718         }
1719       else if (lensub == 1)
1720         {
1721           for (i = 0; i < len; i++)
1722             {
1723               for (j = 0; j < lensub; j++)
1724                 {
1725                   if (y->value.character.string[j]
1726                       == x->value.character.string[i])
1727                     {
1728                       index = i + 1;
1729                       goto done;
1730                     }
1731                 }
1732             }
1733         }
1734       else
1735         {
1736           for (i = 0; i < len; i++)
1737             {
1738               for (j = 0; j < lensub; j++)
1739                 {
1740                   if (y->value.character.string[j]
1741                       == x->value.character.string[i])
1742                     {
1743                       start = i;
1744                       count = 0;
1745
1746                       for (k = 0; k < lensub; k++)
1747                         {
1748                           if (y->value.character.string[k]
1749                               == x->value.character.string[k + start])
1750                             count++;
1751                         }
1752
1753                       if (count == lensub)
1754                         {
1755                           index = start + 1;
1756                           goto done;
1757                         }
1758                     }
1759                 }
1760             }
1761         }
1762
1763     }
1764   else
1765     {
1766       if (lensub == 0)
1767         {
1768           mpz_set_si (result->value.integer, len + 1);
1769           return result;
1770         }
1771       else if (lensub == 1)
1772         {
1773           for (i = 0; i < len; i++)
1774             {
1775               for (j = 0; j < lensub; j++)
1776                 {
1777                   if (y->value.character.string[j]
1778                       == x->value.character.string[len - i])
1779                     {
1780                       index = len - i + 1;
1781                       goto done;
1782                     }
1783                 }
1784             }
1785         }
1786       else
1787         {
1788           for (i = 0; i < len; i++)
1789             {
1790               for (j = 0; j < lensub; j++)
1791                 {
1792                   if (y->value.character.string[j]
1793                       == x->value.character.string[len - i])
1794                     {
1795                       start = len - i;
1796                       if (start <= len - lensub)
1797                         {
1798                           count = 0;
1799                           for (k = 0; k < lensub; k++)
1800                             if (y->value.character.string[k]
1801                                 == x->value.character.string[k + start])
1802                               count++;
1803
1804                           if (count == lensub)
1805                             {
1806                               index = start + 1;
1807                               goto done;
1808                             }
1809                         }
1810                       else
1811                         {
1812                           continue;
1813                         }
1814                     }
1815                 }
1816             }
1817         }
1818     }
1819
1820 done:
1821   mpz_set_si (result->value.integer, index);
1822   return range_check (result, "INDEX");
1823 }
1824
1825
1826 gfc_expr *
1827 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
1828 {
1829   gfc_expr *result = NULL;
1830   int kind;
1831
1832   kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
1833   if (kind == -1)
1834     return &gfc_bad_expr;
1835
1836   if (e->expr_type != EXPR_CONSTANT)
1837     return NULL;
1838
1839   switch (e->ts.type)
1840     {
1841     case BT_INTEGER:
1842       result = gfc_int2int (e, kind);
1843       break;
1844
1845     case BT_REAL:
1846       result = gfc_real2int (e, kind);
1847       break;
1848
1849     case BT_COMPLEX:
1850       result = gfc_complex2int (e, kind);
1851       break;
1852
1853     default:
1854       gfc_error ("Argument of INT at %L is not a valid type", &e->where);
1855       return &gfc_bad_expr;
1856     }
1857
1858   return range_check (result, "INT");
1859 }
1860
1861
1862 static gfc_expr *
1863 simplify_intconv (gfc_expr *e, int kind, const char *name)
1864 {
1865   gfc_expr *result = NULL;
1866
1867   if (e->expr_type != EXPR_CONSTANT)
1868     return NULL;
1869
1870   switch (e->ts.type)
1871     {
1872     case BT_INTEGER:
1873       result = gfc_int2int (e, kind);
1874       break;
1875
1876     case BT_REAL:
1877       result = gfc_real2int (e, kind);
1878       break;
1879
1880     case BT_COMPLEX:
1881       result = gfc_complex2int (e, kind);
1882       break;
1883
1884     default:
1885       gfc_error ("Argument of %s at %L is not a valid type", name, &e->where);
1886       return &gfc_bad_expr;
1887     }
1888
1889   return range_check (result, name);
1890 }
1891
1892
1893 gfc_expr *
1894 gfc_simplify_int2 (gfc_expr *e)
1895 {
1896   return simplify_intconv (e, 2, "INT2");
1897 }
1898
1899
1900 gfc_expr *
1901 gfc_simplify_int8 (gfc_expr *e)
1902 {
1903   return simplify_intconv (e, 8, "INT8");
1904 }
1905
1906
1907 gfc_expr *
1908 gfc_simplify_long (gfc_expr *e)
1909 {
1910   return simplify_intconv (e, 4, "LONG");
1911 }
1912
1913
1914 gfc_expr *
1915 gfc_simplify_ifix (gfc_expr *e)
1916 {
1917   gfc_expr *rtrunc, *result;
1918
1919   if (e->expr_type != EXPR_CONSTANT)
1920     return NULL;
1921
1922   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1923                                 &e->where);
1924
1925   rtrunc = gfc_copy_expr (e);
1926
1927   mpfr_trunc (rtrunc->value.real, e->value.real);
1928   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1929
1930   gfc_free_expr (rtrunc);
1931   return range_check (result, "IFIX");
1932 }
1933
1934
1935 gfc_expr *
1936 gfc_simplify_idint (gfc_expr *e)
1937 {
1938   gfc_expr *rtrunc, *result;
1939
1940   if (e->expr_type != EXPR_CONSTANT)
1941     return NULL;
1942
1943   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
1944                                 &e->where);
1945
1946   rtrunc = gfc_copy_expr (e);
1947
1948   mpfr_trunc (rtrunc->value.real, e->value.real);
1949   gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real);
1950
1951   gfc_free_expr (rtrunc);
1952   return range_check (result, "IDINT");
1953 }
1954
1955
1956 gfc_expr *
1957 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
1958 {
1959   gfc_expr *result;
1960
1961   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1962     return NULL;
1963
1964   result = gfc_constant_result (BT_INTEGER, x->ts.kind, &x->where);
1965
1966   mpz_ior (result->value.integer, x->value.integer, y->value.integer);
1967   return range_check (result, "IOR");
1968 }
1969
1970
1971 gfc_expr *
1972 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
1973 {
1974   gfc_expr *result;
1975   int shift, ashift, isize, k, *bits, i;
1976
1977   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
1978     return NULL;
1979
1980   if (gfc_extract_int (s, &shift) != NULL)
1981     {
1982       gfc_error ("Invalid second argument of ISHFT at %L", &s->where);
1983       return &gfc_bad_expr;
1984     }
1985
1986   k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
1987
1988   isize = gfc_integer_kinds[k].bit_size;
1989
1990   if (shift >= 0)
1991     ashift = shift;
1992   else
1993     ashift = -shift;
1994
1995   if (ashift > isize)
1996     {
1997       gfc_error ("Magnitude of second argument of ISHFT exceeds bit size "
1998                  "at %L", &s->where);
1999       return &gfc_bad_expr;
2000     }
2001
2002   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2003
2004   if (shift == 0)
2005     {
2006       mpz_set (result->value.integer, e->value.integer);
2007       return range_check (result, "ISHFT");
2008     }
2009   
2010   bits = XCNEWVEC (int, isize);
2011
2012   for (i = 0; i < isize; i++)
2013     bits[i] = mpz_tstbit (e->value.integer, i);
2014
2015   if (shift > 0)
2016     {
2017       for (i = 0; i < shift; i++)
2018         mpz_clrbit (result->value.integer, i);
2019
2020       for (i = 0; i < isize - shift; i++)
2021         {
2022           if (bits[i] == 0)
2023             mpz_clrbit (result->value.integer, i + shift);
2024           else
2025             mpz_setbit (result->value.integer, i + shift);
2026         }
2027     }
2028   else
2029     {
2030       for (i = isize - 1; i >= isize - ashift; i--)
2031         mpz_clrbit (result->value.integer, i);
2032
2033       for (i = isize - 1; i >= ashift; i--)
2034         {
2035           if (bits[i] == 0)
2036             mpz_clrbit (result->value.integer, i - ashift);
2037           else
2038             mpz_setbit (result->value.integer, i - ashift);
2039         }
2040     }
2041
2042   convert_mpz_to_signed (result->value.integer, isize);
2043
2044   gfc_free (bits);
2045   return result;
2046 }
2047
2048
2049 gfc_expr *
2050 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
2051 {
2052   gfc_expr *result;
2053   int shift, ashift, isize, ssize, delta, k;
2054   int i, *bits;
2055
2056   if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2057     return NULL;
2058
2059   if (gfc_extract_int (s, &shift) != NULL)
2060     {
2061       gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
2062       return &gfc_bad_expr;
2063     }
2064
2065   k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2066   isize = gfc_integer_kinds[k].bit_size;
2067
2068   if (sz != NULL)
2069     {
2070       if (sz->expr_type != EXPR_CONSTANT)
2071         return NULL;
2072
2073       if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
2074         {
2075           gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
2076           return &gfc_bad_expr;
2077         }
2078
2079       if (ssize > isize)
2080         {
2081           gfc_error ("Magnitude of third argument of ISHFTC exceeds "
2082                      "BIT_SIZE of first argument at %L", &s->where);
2083           return &gfc_bad_expr;
2084         }
2085     }
2086   else
2087     ssize = isize;
2088
2089   if (shift >= 0)
2090     ashift = shift;
2091   else
2092     ashift = -shift;
2093
2094   if (ashift > ssize)
2095     {
2096       if (sz != NULL)
2097         gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2098                    "third argument at %L", &s->where);
2099       else
2100         gfc_error ("Magnitude of second argument of ISHFTC exceeds "
2101                    "BIT_SIZE of first argument at %L", &s->where);
2102       return &gfc_bad_expr;
2103     }
2104
2105   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
2106
2107   mpz_set (result->value.integer, e->value.integer);
2108
2109   if (shift == 0)
2110     return result;
2111
2112   convert_mpz_to_unsigned (result->value.integer, isize);
2113
2114   bits = XCNEWVEC (int, ssize);
2115
2116   for (i = 0; i < ssize; i++)
2117     bits[i] = mpz_tstbit (e->value.integer, i);
2118
2119   delta = ssize - ashift;
2120
2121   if (shift > 0)
2122     {
2123       for (i = 0; i < delta; i++)
2124         {
2125           if (bits[i] == 0)
2126             mpz_clrbit (result->value.integer, i + shift);
2127           else
2128             mpz_setbit (result->value.integer, i + shift);
2129         }
2130
2131       for (i = delta; i < ssize; i++)
2132         {
2133           if (bits[i] == 0)
2134             mpz_clrbit (result->value.integer, i - delta);
2135           else
2136             mpz_setbit (result->value.integer, i - delta);
2137         }
2138     }
2139   else
2140     {
2141       for (i = 0; i < ashift; i++)
2142         {
2143           if (bits[i] == 0)
2144             mpz_clrbit (result->value.integer, i + delta);
2145           else
2146             mpz_setbit (result->value.integer, i + delta);
2147         }
2148
2149       for (i = ashift; i < ssize; i++)
2150         {
2151           if (bits[i] == 0)
2152             mpz_clrbit (result->value.integer, i + shift);
2153           else
2154             mpz_setbit (result->value.integer, i + shift);
2155         }
2156     }
2157
2158   convert_mpz_to_signed (result->value.integer, isize);
2159
2160   gfc_free (bits);
2161   return result;
2162 }
2163
2164
2165 gfc_expr *
2166 gfc_simplify_kind (gfc_expr *e)
2167 {
2168
2169   if (e->ts.type == BT_DERIVED)
2170     {
2171       gfc_error ("Argument of KIND at %L is a DERIVED type", &e->where);
2172       return &gfc_bad_expr;
2173     }
2174
2175   return gfc_int_expr (e->ts.kind);
2176 }
2177
2178
2179 static gfc_expr *
2180 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
2181                     gfc_array_spec *as)
2182 {
2183   gfc_expr *l, *u, *result;
2184   int k;
2185
2186   /* The last dimension of an assumed-size array is special.  */
2187   if (d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
2188     {
2189       if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
2190         return gfc_copy_expr (as->lower[d-1]);
2191       else
2192         return NULL;
2193     }
2194
2195   /* Then, we need to know the extent of the given dimension.  */
2196   l = as->lower[d-1];
2197   u = as->upper[d-1];
2198
2199   if (l->expr_type != EXPR_CONSTANT || u->expr_type != EXPR_CONSTANT)
2200     return NULL;
2201
2202   k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2203                 gfc_default_integer_kind); 
2204   if (k == -1)
2205     return &gfc_bad_expr;
2206
2207   result = gfc_constant_result (BT_INTEGER, k, &array->where);
2208
2209   if (mpz_cmp (l->value.integer, u->value.integer) > 0)
2210     {
2211       /* Zero extent.  */
2212       if (upper)
2213         mpz_set_si (result->value.integer, 0);
2214       else
2215         mpz_set_si (result->value.integer, 1);
2216     }
2217   else
2218     {
2219       /* Nonzero extent.  */
2220       if (upper)
2221         mpz_set (result->value.integer, u->value.integer);
2222       else
2223         mpz_set (result->value.integer, l->value.integer);
2224     }
2225
2226   return range_check (result, upper ? "UBOUND" : "LBOUND");
2227 }
2228
2229
2230 static gfc_expr *
2231 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
2232 {
2233   gfc_ref *ref;
2234   gfc_array_spec *as;
2235   int d;
2236
2237   if (array->expr_type != EXPR_VARIABLE)
2238     return NULL;
2239
2240   /* Follow any component references.  */
2241   as = array->symtree->n.sym->as;
2242   for (ref = array->ref; ref; ref = ref->next)
2243     {
2244       switch (ref->type)
2245         {
2246         case REF_ARRAY:
2247           switch (ref->u.ar.type)
2248             {
2249             case AR_ELEMENT:
2250               as = NULL;
2251               continue;
2252
2253             case AR_FULL:
2254               /* We're done because 'as' has already been set in the
2255                  previous iteration.  */
2256               goto done;
2257
2258             case AR_SECTION:
2259             case AR_UNKNOWN:
2260               return NULL;
2261             }
2262
2263           gcc_unreachable ();
2264
2265         case REF_COMPONENT:
2266           as = ref->u.c.component->as;
2267           continue;
2268
2269         case REF_SUBSTRING:
2270           continue;
2271         }
2272     }
2273
2274   gcc_unreachable ();
2275
2276  done:
2277
2278   if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
2279     return NULL;
2280
2281   if (dim == NULL)
2282     {
2283       /* Multi-dimensional bounds.  */
2284       gfc_expr *bounds[GFC_MAX_DIMENSIONS];
2285       gfc_expr *e;
2286       gfc_constructor *head, *tail;
2287       int k;
2288
2289       /* UBOUND(ARRAY) is not valid for an assumed-size array.  */
2290       if (upper && as->type == AS_ASSUMED_SIZE)
2291         {
2292           /* An error message will be emitted in
2293              check_assumed_size_reference (resolve.c).  */
2294           return &gfc_bad_expr;
2295         }
2296
2297       /* Simplify the bounds for each dimension.  */
2298       for (d = 0; d < array->rank; d++)
2299         {
2300           bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as);
2301           if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
2302             {
2303               int j;
2304
2305               for (j = 0; j < d; j++)
2306                 gfc_free_expr (bounds[j]);
2307               return bounds[d];
2308             }
2309         }
2310
2311       /* Allocate the result expression.  */
2312       e = gfc_get_expr ();
2313       e->where = array->where;
2314       e->expr_type = EXPR_ARRAY;
2315       e->ts.type = BT_INTEGER;
2316       k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
2317                     gfc_default_integer_kind); 
2318       if (k == -1)
2319         {
2320           gfc_free_expr (e);
2321           return &gfc_bad_expr;
2322         }
2323       e->ts.kind = k;
2324
2325       /* The result is a rank 1 array; its size is the rank of the first
2326          argument to {L,U}BOUND.  */
2327       e->rank = 1;
2328       e->shape = gfc_get_shape (1);
2329       mpz_init_set_ui (e->shape[0], array->rank);
2330
2331       /* Create the constructor for this array.  */
2332       head = tail = NULL;
2333       for (d = 0; d < array->rank; d++)
2334         {
2335           /* Get a new constructor element.  */
2336           if (head == NULL)
2337             head = tail = gfc_get_constructor ();
2338           else
2339             {
2340               tail->next = gfc_get_constructor ();
2341               tail = tail->next;
2342             }
2343
2344           tail->where = e->where;
2345           tail->expr = bounds[d];
2346         }
2347       e->value.constructor = head;
2348
2349       return e;
2350     }
2351   else
2352     {
2353       /* A DIM argument is specified.  */
2354       if (dim->expr_type != EXPR_CONSTANT)
2355         return NULL;
2356
2357       d = mpz_get_si (dim->value.integer);
2358
2359       if (d < 1 || d > as->rank
2360           || (d == as->rank && as->type == AS_ASSUMED_SIZE && upper))
2361         {
2362           gfc_error ("DIM argument at %L is out of bounds", &dim->where);
2363           return &gfc_bad_expr;
2364         }
2365
2366       return simplify_bound_dim (array, kind, d, upper, as);
2367     }
2368 }
2369
2370
2371 gfc_expr *
2372 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
2373 {
2374   return simplify_bound (array, dim, kind, 0);
2375 }
2376
2377
2378 gfc_expr *
2379 gfc_simplify_leadz (gfc_expr *e)
2380 {
2381   gfc_expr *result;
2382   unsigned long lz, bs;
2383   int i;
2384
2385   if (e->expr_type != EXPR_CONSTANT)
2386     return NULL;
2387
2388   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2389   bs = gfc_integer_kinds[i].bit_size;
2390   if (mpz_cmp_si (e->value.integer, 0) == 0)
2391     lz = bs;
2392   else
2393     lz = bs - mpz_sizeinbase (e->value.integer, 2);
2394
2395   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, &e->where);
2396   mpz_set_ui (result->value.integer, lz);
2397
2398   return result;
2399 }
2400
2401
2402 gfc_expr *
2403 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
2404 {
2405   gfc_expr *result;
2406   int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
2407
2408   if (k == -1)
2409     return &gfc_bad_expr;
2410
2411   if (e->expr_type == EXPR_CONSTANT)
2412     {
2413       result = gfc_constant_result (BT_INTEGER, k, &e->where);
2414       mpz_set_si (result->value.integer, e->value.character.length);
2415       return range_check (result, "LEN");
2416     }
2417
2418   if (e->ts.cl != NULL && e->ts.cl->length != NULL
2419       && e->ts.cl->length->expr_type == EXPR_CONSTANT
2420       && e->ts.cl->length->ts.type == BT_INTEGER)
2421     {
2422       result = gfc_constant_result (BT_INTEGER, k, &e->where);
2423       mpz_set (result->value.integer, e->ts.cl->length->value.integer);
2424       return range_check (result, "LEN");
2425     }
2426
2427   return NULL;
2428 }
2429
2430
2431 gfc_expr *
2432 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
2433 {
2434   gfc_expr *result;
2435   int count, len, lentrim, i;
2436   int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
2437
2438   if (k == -1)
2439     return &gfc_bad_expr;
2440
2441   if (e->expr_type != EXPR_CONSTANT)
2442     return NULL;
2443
2444   result = gfc_constant_result (BT_INTEGER, k, &e->where);
2445   len = e->value.character.length;
2446
2447   for (count = 0, i = 1; i <= len; i++)
2448     if (e->value.character.string[len - i] == ' ')
2449       count++;
2450     else
2451       break;
2452
2453   lentrim = len - count;
2454
2455   mpz_set_si (result->value.integer, lentrim);
2456   return range_check (result, "LEN_TRIM");
2457 }
2458
2459 gfc_expr *
2460 gfc_simplify_lgamma (gfc_expr *x ATTRIBUTE_UNUSED)
2461 {
2462   gfc_expr *result;
2463   int sg;
2464
2465   if (x->expr_type != EXPR_CONSTANT)
2466     return NULL;
2467
2468   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2469
2470   mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
2471
2472   return range_check (result, "LGAMMA");
2473 }
2474
2475
2476 gfc_expr *
2477 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
2478 {
2479   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2480     return NULL;
2481
2482   return gfc_logical_expr (gfc_compare_string (a, b) >= 0, &a->where);
2483 }
2484
2485
2486 gfc_expr *
2487 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
2488 {
2489   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2490     return NULL;
2491
2492   return gfc_logical_expr (gfc_compare_string (a, b) > 0,
2493                            &a->where);
2494 }
2495
2496
2497 gfc_expr *
2498 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
2499 {
2500   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2501     return NULL;
2502
2503   return gfc_logical_expr (gfc_compare_string (a, b) <= 0, &a->where);
2504 }
2505
2506
2507 gfc_expr *
2508 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
2509 {
2510   if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
2511     return NULL;
2512
2513   return gfc_logical_expr (gfc_compare_string (a, b) < 0, &a->where);
2514 }
2515
2516
2517 gfc_expr *
2518 gfc_simplify_log (gfc_expr *x)
2519 {
2520   gfc_expr *result;
2521   mpfr_t xr, xi;
2522
2523   if (x->expr_type != EXPR_CONSTANT)
2524     return NULL;
2525
2526   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2527
2528
2529   switch (x->ts.type)
2530     {
2531     case BT_REAL:
2532       if (mpfr_sgn (x->value.real) <= 0)
2533         {
2534           gfc_error ("Argument of LOG at %L cannot be less than or equal "
2535                      "to zero", &x->where);
2536           gfc_free_expr (result);
2537           return &gfc_bad_expr;
2538         }
2539
2540       mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
2541       break;
2542
2543     case BT_COMPLEX:
2544       if ((mpfr_sgn (x->value.complex.r) == 0)
2545           && (mpfr_sgn (x->value.complex.i) == 0))
2546         {
2547           gfc_error ("Complex argument of LOG at %L cannot be zero",
2548                      &x->where);
2549           gfc_free_expr (result);
2550           return &gfc_bad_expr;
2551         }
2552
2553       gfc_set_model_kind (x->ts.kind);
2554       mpfr_init (xr);
2555       mpfr_init (xi);
2556
2557       mpfr_atan2 (result->value.complex.i, x->value.complex.i,
2558                   x->value.complex.r, GFC_RND_MODE);
2559
2560       mpfr_mul (xr, x->value.complex.r, x->value.complex.r, GFC_RND_MODE);
2561       mpfr_mul (xi, x->value.complex.i, x->value.complex.i, GFC_RND_MODE);
2562       mpfr_add (xr, xr, xi, GFC_RND_MODE);
2563       mpfr_sqrt (xr, xr, GFC_RND_MODE);
2564       mpfr_log (result->value.complex.r, xr, GFC_RND_MODE);
2565
2566       mpfr_clears (xr, xi, NULL);
2567
2568       break;
2569
2570     default:
2571       gfc_internal_error ("gfc_simplify_log: bad type");
2572     }
2573
2574   return range_check (result, "LOG");
2575 }
2576
2577
2578 gfc_expr *
2579 gfc_simplify_log10 (gfc_expr *x)
2580 {
2581   gfc_expr *result;
2582
2583   if (x->expr_type != EXPR_CONSTANT)
2584     return NULL;
2585
2586   if (mpfr_sgn (x->value.real) <= 0)
2587     {
2588       gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
2589                  "to zero", &x->where);
2590       return &gfc_bad_expr;
2591     }
2592
2593   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
2594
2595   mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
2596
2597   return range_check (result, "LOG10");
2598 }
2599
2600
2601 gfc_expr *
2602 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
2603 {
2604   gfc_expr *result;
2605   int kind;
2606
2607   kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
2608   if (kind < 0)
2609     return &gfc_bad_expr;
2610
2611   if (e->expr_type != EXPR_CONSTANT)
2612     return NULL;
2613
2614   result = gfc_constant_result (BT_LOGICAL, kind, &e->where);
2615
2616   result->value.logical = e->value.logical;
2617
2618   return result;
2619 }
2620
2621
2622 /* This function is special since MAX() can take any number of
2623    arguments.  The simplified expression is a rewritten version of the
2624    argument list containing at most one constant element.  Other
2625    constant elements are deleted.  Because the argument list has
2626    already been checked, this function always succeeds.  sign is 1 for
2627    MAX(), -1 for MIN().  */
2628
2629 static gfc_expr *
2630 simplify_min_max (gfc_expr *expr, int sign)
2631 {
2632   gfc_actual_arglist *arg, *last, *extremum;
2633   gfc_intrinsic_sym * specific;
2634
2635   last = NULL;
2636   extremum = NULL;
2637   specific = expr->value.function.isym;
2638
2639   arg = expr->value.function.actual;
2640
2641   for (; arg; last = arg, arg = arg->next)
2642     {
2643       if (arg->expr->expr_type != EXPR_CONSTANT)
2644         continue;
2645
2646       if (extremum == NULL)
2647         {
2648           extremum = arg;
2649           continue;
2650         }
2651
2652       switch (arg->expr->ts.type)
2653         {
2654         case BT_INTEGER:
2655           if (mpz_cmp (arg->expr->value.integer,
2656                        extremum->expr->value.integer) * sign > 0)
2657             mpz_set (extremum->expr->value.integer, arg->expr->value.integer);
2658           break;
2659
2660         case BT_REAL:
2661           /* We need to use mpfr_min and mpfr_max to treat NaN properly.  */
2662           if (sign > 0)
2663             mpfr_max (extremum->expr->value.real, extremum->expr->value.real,
2664                       arg->expr->value.real, GFC_RND_MODE);
2665           else
2666             mpfr_min (extremum->expr->value.real, extremum->expr->value.real,
2667                       arg->expr->value.real, GFC_RND_MODE);
2668           break;
2669
2670         case BT_CHARACTER:
2671 #define LENGTH(x) ((x)->expr->value.character.length)
2672 #define STRING(x) ((x)->expr->value.character.string)
2673           if (LENGTH(extremum) < LENGTH(arg))
2674             {
2675               gfc_char_t *tmp = STRING(extremum);
2676
2677               STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
2678               memcpy (STRING(extremum), tmp,
2679                       LENGTH(extremum) * sizeof (gfc_char_t));
2680               gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
2681                                LENGTH(arg) - LENGTH(extremum));
2682               STRING(extremum)[LENGTH(arg)] = '\0';  /* For debugger  */
2683               LENGTH(extremum) = LENGTH(arg);
2684               gfc_free (tmp);
2685             }
2686
2687           if (gfc_compare_string (arg->expr, extremum->expr) * sign > 0)
2688             {
2689               gfc_free (STRING(extremum));
2690               STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
2691               memcpy (STRING(extremum), STRING(arg),
2692                       LENGTH(arg) * sizeof (gfc_char_t));
2693               gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
2694                                LENGTH(extremum) - LENGTH(arg));
2695               STRING(extremum)[LENGTH(extremum)] = '\0';  /* For debugger  */
2696             }
2697 #undef LENGTH
2698 #undef STRING
2699           break;
2700               
2701
2702         default:
2703           gfc_internal_error ("simplify_min_max(): Bad type in arglist");
2704         }
2705
2706       /* Delete the extra constant argument.  */
2707       if (last == NULL)
2708         expr->value.function.actual = arg->next;
2709       else
2710         last->next = arg->next;
2711
2712       arg->next = NULL;
2713       gfc_free_actual_arglist (arg);
2714       arg = last;
2715     }
2716
2717   /* If there is one value left, replace the function call with the
2718      expression.  */
2719   if (expr->value.function.actual->next != NULL)
2720     return NULL;
2721
2722   /* Convert to the correct type and kind.  */
2723   if (expr->ts.type != BT_UNKNOWN) 
2724     return gfc_convert_constant (expr->value.function.actual->expr,
2725         expr->ts.type, expr->ts.kind);
2726
2727   if (specific->ts.type != BT_UNKNOWN) 
2728     return gfc_convert_constant (expr->value.function.actual->expr,
2729         specific->ts.type, specific->ts.kind); 
2730  
2731   return gfc_copy_expr (expr->value.function.actual->expr);
2732 }
2733
2734
2735 gfc_expr *
2736 gfc_simplify_min (gfc_expr *e)
2737 {
2738   return simplify_min_max (e, -1);
2739 }
2740
2741
2742 gfc_expr *
2743 gfc_simplify_max (gfc_expr *e)
2744 {
2745   return simplify_min_max (e, 1);
2746 }
2747
2748
2749 gfc_expr *
2750 gfc_simplify_maxexponent (gfc_expr *x)
2751 {
2752   gfc_expr *result;
2753   int i;
2754
2755   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2756
2757   result = gfc_int_expr (gfc_real_kinds[i].max_exponent);
2758   result->where = x->where;
2759
2760   return result;
2761 }
2762
2763
2764 gfc_expr *
2765 gfc_simplify_minexponent (gfc_expr *x)
2766 {
2767   gfc_expr *result;
2768   int i;
2769
2770   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
2771
2772   result = gfc_int_expr (gfc_real_kinds[i].min_exponent);
2773   result->where = x->where;
2774
2775   return result;
2776 }
2777
2778
2779 gfc_expr *
2780 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
2781 {
2782   gfc_expr *result;
2783   mpfr_t tmp;
2784   int kind;
2785
2786   if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2787     return NULL;
2788
2789   kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2790   result = gfc_constant_result (a->ts.type, kind, &a->where);
2791
2792   switch (a->ts.type)
2793     {
2794     case BT_INTEGER:
2795       if (mpz_cmp_ui (p->value.integer, 0) == 0)
2796         {
2797           /* Result is processor-dependent.  */
2798           gfc_error ("Second argument MOD at %L is zero", &a->where);
2799           gfc_free_expr (result);
2800           return &gfc_bad_expr;
2801         }
2802       mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
2803       break;
2804
2805     case BT_REAL:
2806       if (mpfr_cmp_ui (p->value.real, 0) == 0)
2807         {
2808           /* Result is processor-dependent.  */
2809           gfc_error ("Second argument of MOD at %L is zero", &p->where);
2810           gfc_free_expr (result);
2811           return &gfc_bad_expr;
2812         }
2813
2814       gfc_set_model_kind (kind);
2815       mpfr_init (tmp);
2816       mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
2817       mpfr_trunc (tmp, tmp);
2818       mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
2819       mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
2820       mpfr_clear (tmp);
2821       break;
2822
2823     default:
2824       gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
2825     }
2826
2827   return range_check (result, "MOD");
2828 }
2829
2830
2831 gfc_expr *
2832 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
2833 {
2834   gfc_expr *result;
2835   mpfr_t tmp;
2836   int kind;
2837
2838   if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
2839     return NULL;
2840
2841   kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
2842   result = gfc_constant_result (a->ts.type, kind, &a->where);
2843
2844   switch (a->ts.type)
2845     {
2846     case BT_INTEGER:
2847       if (mpz_cmp_ui (p->value.integer, 0) == 0)
2848         {
2849           /* Result is processor-dependent. This processor just opts
2850              to not handle it at all.  */
2851           gfc_error ("Second argument of MODULO at %L is zero", &a->where);
2852           gfc_free_expr (result);
2853           return &gfc_bad_expr;
2854         }
2855       mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
2856
2857       break;
2858
2859     case BT_REAL:
2860       if (mpfr_cmp_ui (p->value.real, 0) == 0)
2861         {
2862           /* Result is processor-dependent.  */
2863           gfc_error ("Second argument of MODULO at %L is zero", &p->where);
2864           gfc_free_expr (result);
2865           return &gfc_bad_expr;
2866         }
2867
2868       gfc_set_model_kind (kind);
2869       mpfr_init (tmp);
2870       mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
2871       mpfr_floor (tmp, tmp);
2872       mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
2873       mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
2874       mpfr_clear (tmp);
2875       break;
2876
2877     default:
2878       gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
2879     }
2880
2881   return range_check (result, "MODULO");
2882 }
2883
2884
2885 /* Exists for the sole purpose of consistency with other intrinsics.  */
2886 gfc_expr *
2887 gfc_simplify_mvbits (gfc_expr *f  ATTRIBUTE_UNUSED,
2888                      gfc_expr *fp ATTRIBUTE_UNUSED,
2889                      gfc_expr *l  ATTRIBUTE_UNUSED,
2890                      gfc_expr *to ATTRIBUTE_UNUSED,
2891                      gfc_expr *tp ATTRIBUTE_UNUSED)
2892 {
2893   return NULL;
2894 }
2895
2896
2897 gfc_expr *
2898 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
2899 {
2900   gfc_expr *result;
2901   mp_exp_t emin, emax;
2902   int kind;
2903
2904   if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
2905     return NULL;
2906
2907   if (mpfr_sgn (s->value.real) == 0)
2908     {
2909       gfc_error ("Second argument of NEAREST at %L shall not be zero",
2910                  &s->where);
2911       return &gfc_bad_expr;
2912     }
2913
2914   result = gfc_copy_expr (x);
2915
2916   /* Save current values of emin and emax.  */
2917   emin = mpfr_get_emin ();
2918   emax = mpfr_get_emax ();
2919
2920   /* Set emin and emax for the current model number.  */
2921   kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
2922   mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
2923                 mpfr_get_prec(result->value.real) + 1);
2924   mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
2925
2926   if (mpfr_sgn (s->value.real) > 0)
2927     {
2928       mpfr_nextabove (result->value.real);
2929       mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
2930     }
2931   else
2932     {
2933       mpfr_nextbelow (result->value.real);
2934       mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
2935     }
2936
2937   mpfr_set_emin (emin);
2938   mpfr_set_emax (emax);
2939
2940   /* Only NaN can occur. Do not use range check as it gives an
2941      error for denormal numbers.  */
2942   if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
2943     {
2944       gfc_error ("Result of NEAREST is NaN at %L", &result->where);
2945       gfc_free_expr (result);
2946       return &gfc_bad_expr;
2947     }
2948
2949   return result;
2950 }
2951
2952
2953 static gfc_expr *
2954 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
2955 {
2956   gfc_expr *itrunc, *result;
2957   int kind;
2958
2959   kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
2960   if (kind == -1)
2961     return &gfc_bad_expr;
2962
2963   if (e->expr_type != EXPR_CONSTANT)
2964     return NULL;
2965
2966   result = gfc_constant_result (BT_INTEGER, kind, &e->where);
2967
2968   itrunc = gfc_copy_expr (e);
2969
2970   mpfr_round (itrunc->value.real, e->value.real);
2971
2972   gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real);
2973
2974   gfc_free_expr (itrunc);
2975
2976   return range_check (result, name);
2977 }
2978
2979
2980 gfc_expr *
2981 gfc_simplify_new_line (gfc_expr *e)
2982 {
2983   gfc_expr *result;
2984
2985   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
2986   result->value.character.string = gfc_get_wide_string (2);
2987   result->value.character.length = 1;
2988   result->value.character.string[0] = '\n';
2989   result->value.character.string[1] = '\0';     /* For debugger */
2990   return result;
2991 }
2992
2993
2994 gfc_expr *
2995 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
2996 {
2997   return simplify_nint ("NINT", e, k);
2998 }
2999
3000
3001 gfc_expr *
3002 gfc_simplify_idnint (gfc_expr *e)
3003 {
3004   return simplify_nint ("IDNINT", e, NULL);
3005 }
3006
3007
3008 gfc_expr *
3009 gfc_simplify_not (gfc_expr *e)
3010 {
3011   gfc_expr *result;
3012
3013   if (e->expr_type != EXPR_CONSTANT)
3014     return NULL;
3015
3016   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
3017
3018   mpz_com (result->value.integer, e->value.integer);
3019
3020   return range_check (result, "NOT");
3021 }
3022
3023
3024 gfc_expr *
3025 gfc_simplify_null (gfc_expr *mold)
3026 {
3027   gfc_expr *result;
3028
3029   if (mold == NULL)
3030     {
3031       result = gfc_get_expr ();
3032       result->ts.type = BT_UNKNOWN;
3033     }
3034   else
3035     result = gfc_copy_expr (mold);
3036   result->expr_type = EXPR_NULL;
3037
3038   return result;
3039 }
3040
3041
3042 gfc_expr *
3043 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
3044 {
3045   gfc_expr *result;
3046   int kind;
3047
3048   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3049     return NULL;
3050
3051   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
3052   if (x->ts.type == BT_INTEGER)
3053     {
3054       result = gfc_constant_result (BT_INTEGER, kind, &x->where);
3055       mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3056       return range_check (result, "OR");
3057     }
3058   else /* BT_LOGICAL */
3059     {
3060       result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
3061       result->value.logical = x->value.logical || y->value.logical;
3062       return result;
3063     }
3064 }
3065
3066
3067 gfc_expr *
3068 gfc_simplify_precision (gfc_expr *e)
3069 {
3070   gfc_expr *result;
3071   int i;
3072
3073   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3074
3075   result = gfc_int_expr (gfc_real_kinds[i].precision);
3076   result->where = e->where;
3077
3078   return result;
3079 }
3080
3081
3082 gfc_expr *
3083 gfc_simplify_radix (gfc_expr *e)
3084 {
3085   gfc_expr *result;
3086   int i;
3087
3088   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3089   switch (e->ts.type)
3090     {
3091     case BT_INTEGER:
3092       i = gfc_integer_kinds[i].radix;
3093       break;
3094
3095     case BT_REAL:
3096       i = gfc_real_kinds[i].radix;
3097       break;
3098
3099     default:
3100       gcc_unreachable ();
3101     }
3102
3103   result = gfc_int_expr (i);
3104   result->where = e->where;
3105
3106   return result;
3107 }
3108
3109
3110 gfc_expr *
3111 gfc_simplify_range (gfc_expr *e)
3112 {
3113   gfc_expr *result;
3114   int i;
3115   long j;
3116
3117   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3118
3119   switch (e->ts.type)
3120     {
3121     case BT_INTEGER:
3122       j = gfc_integer_kinds[i].range;
3123       break;
3124
3125     case BT_REAL:
3126     case BT_COMPLEX:
3127       j = gfc_real_kinds[i].range;
3128       break;
3129
3130     default:
3131       gcc_unreachable ();
3132     }
3133
3134   result = gfc_int_expr (j);
3135   result->where = e->where;
3136
3137   return result;
3138 }
3139
3140
3141 gfc_expr *
3142 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
3143 {
3144   gfc_expr *result = NULL;
3145   int kind;
3146
3147   if (e->ts.type == BT_COMPLEX)
3148     kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
3149   else
3150     kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
3151
3152   if (kind == -1)
3153     return &gfc_bad_expr;
3154
3155   if (e->expr_type != EXPR_CONSTANT)
3156     return NULL;
3157
3158   switch (e->ts.type)
3159     {
3160     case BT_INTEGER:
3161       if (!e->is_boz)
3162         result = gfc_int2real (e, kind);
3163       break;
3164
3165     case BT_REAL:
3166       result = gfc_real2real (e, kind);
3167       break;
3168
3169     case BT_COMPLEX:
3170       result = gfc_complex2real (e, kind);
3171       break;
3172
3173     default:
3174       gfc_internal_error ("bad type in REAL");
3175       /* Not reached */
3176     }
3177
3178   if (e->ts.type == BT_INTEGER && e->is_boz)
3179     {
3180       gfc_typespec ts;
3181       gfc_clear_ts (&ts);
3182       ts.type = BT_REAL;
3183       ts.kind = kind;
3184       result = gfc_copy_expr (e);
3185       if (!gfc_convert_boz (result, &ts))
3186         {
3187           gfc_free_expr (result);
3188           return &gfc_bad_expr;
3189         }
3190     }
3191
3192   return range_check (result, "REAL");
3193 }
3194
3195
3196 gfc_expr *
3197 gfc_simplify_realpart (gfc_expr *e)
3198 {
3199   gfc_expr *result;
3200
3201   if (e->expr_type != EXPR_CONSTANT)
3202     return NULL;
3203
3204   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
3205   mpfr_set (result->value.real, e->value.complex.r, GFC_RND_MODE);
3206
3207   return range_check (result, "REALPART");
3208 }
3209
3210 gfc_expr *
3211 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
3212 {
3213   gfc_expr *result;
3214   int i, j, len, ncop, nlen;
3215   mpz_t ncopies;
3216   bool have_length = false;
3217
3218   /* If NCOPIES isn't a constant, there's nothing we can do.  */
3219   if (n->expr_type != EXPR_CONSTANT)
3220     return NULL;
3221
3222   /* If NCOPIES is negative, it's an error.  */
3223   if (mpz_sgn (n->value.integer) < 0)
3224     {
3225       gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
3226                  &n->where);
3227       return &gfc_bad_expr;
3228     }
3229
3230   /* If we don't know the character length, we can do no more.  */
3231   if (e->ts.cl && e->ts.cl->length
3232         && e->ts.cl->length->expr_type == EXPR_CONSTANT)
3233     {
3234       len = mpz_get_si (e->ts.cl->length->value.integer);
3235       have_length = true;
3236     }
3237   else if (e->expr_type == EXPR_CONSTANT
3238              && (e->ts.cl == NULL || e->ts.cl->length == NULL))
3239     {
3240       len = e->value.character.length;
3241     }
3242   else
3243     return NULL;
3244
3245   /* If the source length is 0, any value of NCOPIES is valid
3246      and everything behaves as if NCOPIES == 0.  */
3247   mpz_init (ncopies);
3248   if (len == 0)
3249     mpz_set_ui (ncopies, 0);
3250   else
3251     mpz_set (ncopies, n->value.integer);
3252
3253   /* Check that NCOPIES isn't too large.  */
3254   if (len)
3255     {
3256       mpz_t max, mlen;
3257       int i;
3258
3259       /* Compute the maximum value allowed for NCOPIES: huge(cl) / len.  */
3260       mpz_init (max);
3261       i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3262
3263       if (have_length)
3264         {
3265           mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
3266                       e->ts.cl->length->value.integer);
3267         }
3268       else
3269         {
3270           mpz_init_set_si (mlen, len);
3271           mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
3272           mpz_clear (mlen);
3273         }
3274
3275       /* The check itself.  */
3276       if (mpz_cmp (ncopies, max) > 0)
3277         {
3278           mpz_clear (max);
3279           mpz_clear (ncopies);
3280           gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
3281                      &n->where);
3282           return &gfc_bad_expr;
3283         }
3284
3285       mpz_clear (max);
3286     }
3287   mpz_clear (ncopies);
3288
3289   /* For further simplification, we need the character string to be
3290      constant.  */
3291   if (e->expr_type != EXPR_CONSTANT)
3292     return NULL;
3293
3294   if (len || 
3295       (e->ts.cl->length && 
3296        mpz_sgn (e->ts.cl->length->value.integer)) != 0)
3297     {
3298       const char *res = gfc_extract_int (n, &ncop);
3299       gcc_assert (res == NULL);
3300     }
3301   else
3302     ncop = 0;
3303
3304   len = e->value.character.length;
3305   nlen = ncop * len;
3306
3307   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
3308
3309   if (ncop == 0)
3310     {
3311       result->value.character.string = gfc_get_wide_string (1);
3312       result->value.character.length = 0;
3313       result->value.character.string[0] = '\0';
3314       return result;
3315     }
3316
3317   result->value.character.length = nlen;
3318   result->value.character.string = gfc_get_wide_string (nlen + 1);
3319
3320   for (i = 0; i < ncop; i++)
3321     for (j = 0; j < len; j++)
3322       result->value.character.string[j+i*len]= e->value.character.string[j];
3323
3324   result->value.character.string[nlen] = '\0';  /* For debugger */
3325   return result;
3326 }
3327
3328
3329 /* Test that the expression is an constant array.  */
3330
3331 static bool
3332 is_constant_array_expr (gfc_expr *e)
3333 {
3334   gfc_constructor *c;
3335
3336   if (e == NULL)
3337     return true;
3338
3339   if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
3340     return false;
3341   
3342   if (e->value.constructor == NULL)
3343     return false;
3344   
3345   for (c = e->value.constructor; c; c = c->next)
3346     if (c->expr->expr_type != EXPR_CONSTANT)
3347       return false;
3348
3349   return true;
3350 }
3351
3352
3353 /* This one is a bear, but mainly has to do with shuffling elements.  */
3354
3355 gfc_expr *
3356 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
3357                       gfc_expr *pad, gfc_expr *order_exp)
3358 {
3359   int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
3360   int i, rank, npad, x[GFC_MAX_DIMENSIONS];
3361   gfc_constructor *head, *tail;
3362   mpz_t index, size;
3363   unsigned long j;
3364   size_t nsource;
3365   gfc_expr *e;
3366
3367   /* Check that argument expression types are OK.  */
3368   if (!is_constant_array_expr (source))
3369     return NULL;
3370
3371   if (!is_constant_array_expr (shape_exp))
3372     return NULL;
3373
3374   if (!is_constant_array_expr (pad))
3375     return NULL;
3376
3377   if (!is_constant_array_expr (order_exp))
3378     return NULL;
3379
3380   /* Proceed with simplification, unpacking the array.  */
3381
3382   mpz_init (index);
3383   rank = 0;
3384   head = tail = NULL;
3385
3386   for (;;)
3387     {
3388       e = gfc_get_array_element (shape_exp, rank);
3389       if (e == NULL)
3390         break;
3391
3392       if (gfc_extract_int (e, &shape[rank]) != NULL)
3393         {
3394           gfc_error ("Integer too large in shape specification at %L",
3395                      &e->where);
3396           gfc_free_expr (e);
3397           goto bad_reshape;
3398         }
3399
3400       if (rank >= GFC_MAX_DIMENSIONS)
3401         {
3402           gfc_error ("Too many dimensions in shape specification for RESHAPE "
3403                      "at %L", &e->where);
3404           gfc_free_expr (e);
3405           goto bad_reshape;
3406         }
3407
3408       if (shape[rank] < 0)
3409         {
3410           gfc_error ("Shape specification at %L cannot be negative",
3411                      &e->where);
3412           gfc_free_expr (e);
3413           goto bad_reshape;
3414         }
3415
3416       gfc_free_expr (e);
3417       rank++;
3418     }
3419
3420   if (rank == 0)
3421     {
3422       gfc_error ("Shape specification at %L cannot be the null array",
3423                  &shape_exp->where);
3424       goto bad_reshape;
3425     }
3426
3427   /* Now unpack the order array if present.  */
3428   if (order_exp == NULL)
3429     {
3430       for (i = 0; i < rank; i++)
3431         order[i] = i;
3432     }
3433   else
3434     {
3435       for (i = 0; i < rank; i++)
3436         x[i] = 0;
3437
3438       for (i = 0; i < rank; i++)
3439         {
3440           e = gfc_get_array_element (order_exp, i);
3441           if (e == NULL)
3442             {
3443               gfc_error ("ORDER parameter of RESHAPE at %L is not the same "
3444                          "size as SHAPE parameter", &order_exp->where);
3445               goto bad_reshape;
3446             }
3447
3448           if (gfc_extract_int (e, &order[i]) != NULL)
3449             {
3450               gfc_error ("Error in ORDER parameter of RESHAPE at %L",
3451                          &e->where);
3452               gfc_free_expr (e);
3453               goto bad_reshape;
3454             }
3455
3456           if (order[i] < 1 || order[i] > rank)
3457             {
3458               gfc_error ("ORDER parameter of RESHAPE at %L is out of range",
3459                          &e->where);
3460               gfc_free_expr (e);
3461               goto bad_reshape;
3462             }
3463
3464           order[i]--;
3465
3466           if (x[order[i]])
3467             {
3468               gfc_error ("Invalid permutation in ORDER parameter at %L",
3469                          &e->where);
3470               gfc_free_expr (e);
3471               goto bad_reshape;
3472             }
3473
3474           gfc_free_expr (e);
3475
3476           x[order[i]] = 1;
3477         }
3478     }
3479
3480   /* Count the elements in the source and padding arrays.  */
3481
3482   npad = 0;
3483   if (pad != NULL)
3484     {
3485       gfc_array_size (pad, &size);
3486       npad = mpz_get_ui (size);
3487       mpz_clear (size);
3488     }
3489
3490   gfc_array_size (source, &size);
3491   nsource = mpz_get_ui (size);
3492   mpz_clear (size);
3493
3494   /* If it weren't for that pesky permutation we could just loop
3495      through the source and round out any shortage with pad elements.
3496      But no, someone just had to have the compiler do something the
3497      user should be doing.  */
3498
3499   for (i = 0; i < rank; i++)
3500     x[i] = 0;
3501
3502   for (;;)
3503     {
3504       /* Figure out which element to extract.  */
3505       mpz_set_ui (index, 0);
3506
3507       for (i = rank - 1; i >= 0; i--)
3508         {
3509           mpz_add_ui (index, index, x[order[i]]);
3510           if (i != 0)
3511             mpz_mul_ui (index, index, shape[order[i - 1]]);
3512         }
3513
3514       if (mpz_cmp_ui (index, INT_MAX) > 0)
3515         gfc_internal_error ("Reshaped array too large at %C");
3516
3517       j = mpz_get_ui (index);
3518
3519       if (j < nsource)
3520         e = gfc_get_array_element (source, j);
3521       else
3522         {
3523           j = j - nsource;
3524
3525           if (npad == 0)
3526             {
3527               gfc_error ("PAD parameter required for short SOURCE parameter "
3528                          "at %L", &source->where);
3529               goto bad_reshape;
3530             }
3531
3532           j = j % npad;
3533           e = gfc_get_array_element (pad, j);
3534         }
3535
3536       if (head == NULL)
3537         head = tail = gfc_get_constructor ();
3538       else
3539         {
3540           tail->next = gfc_get_constructor ();
3541           tail = tail->next;
3542         }
3543
3544       if (e == NULL)
3545         goto bad_reshape;
3546
3547       tail->where = e->where;
3548       tail->expr = e;
3549
3550       /* Calculate the next element.  */
3551       i = 0;
3552
3553 inc:
3554       if (++x[i] < shape[i])
3555         continue;
3556       x[i++] = 0;
3557       if (i < rank)
3558         goto inc;
3559
3560       break;
3561     }
3562
3563   mpz_clear (index);
3564
3565   e = gfc_get_expr ();
3566   e->where = source->where;
3567   e->expr_type = EXPR_ARRAY;
3568   e->value.constructor = head;
3569   e->shape = gfc_get_shape (rank);
3570
3571   for (i = 0; i < rank; i++)
3572     mpz_init_set_ui (e->shape[i], shape[i]);
3573
3574   e->ts = source->ts;
3575   e->rank = rank;
3576
3577   return e;
3578
3579 bad_reshape:
3580   gfc_free_constructor (head);
3581   mpz_clear (index);
3582   return &gfc_bad_expr;
3583 }
3584
3585
3586 gfc_expr *
3587 gfc_simplify_rrspacing (gfc_expr *x)
3588 {
3589   gfc_expr *result;
3590   int i;
3591   long int e, p;
3592
3593   if (x->expr_type != EXPR_CONSTANT)
3594     return NULL;
3595
3596   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3597
3598   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3599
3600   mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
3601
3602   /* Special case x = -0 and 0.  */
3603   if (mpfr_sgn (result->value.real) == 0)
3604     {
3605       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3606       return result;
3607     }
3608
3609   /* | x * 2**(-e) | * 2**p.  */
3610   e = - (long int) mpfr_get_exp (x->value.real);
3611   mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
3612
3613   p = (long int) gfc_real_kinds[i].digits;
3614   mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
3615
3616   return range_check (result, "RRSPACING");
3617 }
3618
3619
3620 gfc_expr *
3621 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
3622 {
3623   int k, neg_flag, power, exp_range;
3624   mpfr_t scale, radix;
3625   gfc_expr *result;
3626
3627   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3628     return NULL;
3629
3630   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3631
3632   if (mpfr_sgn (x->value.real) == 0)
3633     {
3634       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3635       return result;
3636     }
3637
3638   k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
3639
3640   exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
3641
3642   /* This check filters out values of i that would overflow an int.  */
3643   if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
3644       || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
3645     {
3646       gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
3647       gfc_free_expr (result);
3648       return &gfc_bad_expr;
3649     }
3650
3651   /* Compute scale = radix ** power.  */
3652   power = mpz_get_si (i->value.integer);
3653
3654   if (power >= 0)
3655     neg_flag = 0;
3656   else
3657     {
3658       neg_flag = 1;
3659       power = -power;
3660     }
3661
3662   gfc_set_model_kind (x->ts.kind);
3663   mpfr_init (scale);
3664   mpfr_init (radix);
3665   mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
3666   mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
3667
3668   if (neg_flag)
3669     mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
3670   else
3671     mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
3672
3673   mpfr_clears (scale, radix, NULL);
3674
3675   return range_check (result, "SCALE");
3676 }
3677
3678
3679 /* Variants of strspn and strcspn that operate on wide characters.  */
3680
3681 static size_t
3682 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
3683 {
3684   size_t i = 0;
3685   const gfc_char_t *c;
3686
3687   while (s1[i])
3688     {
3689       for (c = s2; *c; c++)
3690         {
3691           if (s1[i] == *c)
3692             break;
3693         }
3694       if (*c == '\0')
3695         break;
3696       i++;
3697     }
3698
3699   return i;
3700 }
3701
3702 static size_t
3703 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
3704 {
3705   size_t i = 0;
3706   const gfc_char_t *c;
3707
3708   while (s1[i])
3709     {
3710       for (c = s2; *c; c++)
3711         {
3712           if (s1[i] == *c)
3713             break;
3714         }
3715       if (*c)
3716         break;
3717       i++;
3718     }
3719
3720   return i;
3721 }
3722
3723
3724 gfc_expr *
3725 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
3726 {
3727   gfc_expr *result;
3728   int back;
3729   size_t i;
3730   size_t indx, len, lenc;
3731   int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
3732
3733   if (k == -1)
3734     return &gfc_bad_expr;
3735
3736   if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
3737     return NULL;
3738
3739   if (b != NULL && b->value.logical != 0)
3740     back = 1;
3741   else
3742     back = 0;
3743
3744   result = gfc_constant_result (BT_INTEGER, k, &e->where);
3745
3746   len = e->value.character.length;
3747   lenc = c->value.character.length;
3748
3749   if (len == 0 || lenc == 0)
3750     {
3751       indx = 0;
3752     }
3753   else
3754     {
3755       if (back == 0)
3756         {
3757           indx = wide_strcspn (e->value.character.string,
3758                                c->value.character.string) + 1;
3759           if (indx > len)
3760             indx = 0;
3761         }
3762       else
3763         {
3764           i = 0;
3765           for (indx = len; indx > 0; indx--)
3766             {
3767               for (i = 0; i < lenc; i++)
3768                 {
3769                   if (c->value.character.string[i]
3770                       == e->value.character.string[indx - 1])
3771                     break;
3772                 }
3773               if (i < lenc)
3774                 break;
3775             }
3776         }
3777     }
3778   mpz_set_ui (result->value.integer, indx);
3779   return range_check (result, "SCAN");
3780 }
3781
3782
3783 gfc_expr *
3784 gfc_simplify_selected_char_kind (gfc_expr *e)
3785 {
3786   int kind;
3787   gfc_expr *result;
3788
3789   if (e->expr_type != EXPR_CONSTANT)
3790     return NULL;
3791
3792   if (gfc_compare_with_Cstring (e, "ascii", false) == 0
3793       || gfc_compare_with_Cstring (e, "default", false) == 0)
3794     kind = 1;
3795   else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
3796     kind = 4;
3797   else
3798     kind = -1;
3799
3800   result = gfc_int_expr (kind);
3801   result->where = e->where;
3802
3803   return result;
3804 }
3805
3806
3807 gfc_expr *
3808 gfc_simplify_selected_int_kind (gfc_expr *e)
3809 {
3810   int i, kind, range;
3811   gfc_expr *result;
3812
3813   if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
3814     return NULL;
3815
3816   kind = INT_MAX;
3817
3818   for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
3819     if (gfc_integer_kinds[i].range >= range
3820         && gfc_integer_kinds[i].kind < kind)
3821       kind = gfc_integer_kinds[i].kind;
3822
3823   if (kind == INT_MAX)
3824     kind = -1;
3825
3826   result = gfc_int_expr (kind);
3827   result->where = e->where;
3828
3829   return result;
3830 }
3831
3832
3833 gfc_expr *
3834 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q)
3835 {
3836   int range, precision, i, kind, found_precision, found_range;
3837   gfc_expr *result;
3838
3839   if (p == NULL)
3840     precision = 0;
3841   else
3842     {
3843       if (p->expr_type != EXPR_CONSTANT
3844           || gfc_extract_int (p, &precision) != NULL)
3845         return NULL;
3846     }
3847
3848   if (q == NULL)
3849     range = 0;
3850   else
3851     {
3852       if (q->expr_type != EXPR_CONSTANT
3853           || gfc_extract_int (q, &range) != NULL)
3854         return NULL;
3855     }
3856
3857   kind = INT_MAX;
3858   found_precision = 0;
3859   found_range = 0;
3860
3861   for (i = 0; gfc_real_kinds[i].kind != 0; i++)
3862     {
3863       if (gfc_real_kinds[i].precision >= precision)
3864         found_precision = 1;
3865
3866       if (gfc_real_kinds[i].range >= range)
3867         found_range = 1;
3868
3869       if (gfc_real_kinds[i].precision >= precision
3870           && gfc_real_kinds[i].range >= range && gfc_real_kinds[i].kind < kind)
3871         kind = gfc_real_kinds[i].kind;
3872     }
3873
3874   if (kind == INT_MAX)
3875     {
3876       kind = 0;
3877
3878       if (!found_precision)
3879         kind = -1;
3880       if (!found_range)
3881         kind -= 2;
3882     }
3883
3884   result = gfc_int_expr (kind);
3885   result->where = (p != NULL) ? p->where : q->where;
3886
3887   return result;
3888 }
3889
3890
3891 gfc_expr *
3892 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
3893 {
3894   gfc_expr *result;
3895   mpfr_t exp, absv, log2, pow2, frac;
3896   unsigned long exp2;
3897
3898   if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
3899     return NULL;
3900
3901   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
3902
3903   if (mpfr_sgn (x->value.real) == 0)
3904     {
3905       mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
3906       return result;
3907     }
3908
3909   gfc_set_model_kind (x->ts.kind);
3910   mpfr_init (absv);
3911   mpfr_init (log2);
3912   mpfr_init (exp);
3913   mpfr_init (pow2);
3914   mpfr_init (frac);
3915
3916   mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3917   mpfr_log2 (log2, absv, GFC_RND_MODE);
3918
3919   mpfr_trunc (log2, log2);
3920   mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
3921
3922   /* Old exponent value, and fraction.  */
3923   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3924
3925   mpfr_div (frac, absv, pow2, GFC_RND_MODE);
3926
3927   /* New exponent.  */
3928   exp2 = (unsigned long) mpz_get_d (i->value.integer);
3929   mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
3930
3931   mpfr_clears (absv, log2, pow2, frac, NULL);
3932
3933   return range_check (result, "SET_EXPONENT");
3934 }
3935
3936
3937 gfc_expr *
3938 gfc_simplify_shape (gfc_expr *source)
3939 {
3940   mpz_t shape[GFC_MAX_DIMENSIONS];
3941   gfc_expr *result, *e, *f;
3942   gfc_array_ref *ar;
3943   int n;
3944   gfc_try t;
3945
3946   if (source->rank == 0)
3947     return gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3948                                   &source->where);
3949
3950   if (source->expr_type != EXPR_VARIABLE)
3951     return NULL;
3952
3953   result = gfc_start_constructor (BT_INTEGER, gfc_default_integer_kind,
3954                                   &source->where);
3955
3956   ar = gfc_find_array_ref (source);
3957
3958   t = gfc_array_ref_shape (ar, shape);
3959
3960   for (n = 0; n < source->rank; n++)
3961     {
3962       e = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind,
3963                                &source->where);
3964
3965       if (t == SUCCESS)
3966         {
3967           mpz_set (e->value.integer, shape[n]);
3968           mpz_clear (shape[n]);
3969         }
3970       else
3971         {
3972           mpz_set_ui (e->value.integer, n + 1);
3973
3974           f = gfc_simplify_size (source, e, NULL);
3975           gfc_free_expr (e);
3976           if (f == NULL)
3977             {
3978               gfc_free_expr (result);
3979               return NULL;
3980             }
3981           else
3982             {
3983               e = f;
3984             }
3985         }
3986
3987       gfc_append_constructor (result, e);
3988     }
3989
3990   return result;
3991 }
3992
3993
3994 gfc_expr *
3995 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3996 {
3997   mpz_t size;
3998   gfc_expr *result;
3999   int d;
4000   int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
4001
4002   if (k == -1)
4003     return &gfc_bad_expr;
4004
4005   if (dim == NULL)
4006     {
4007       if (gfc_array_size (array, &size) == FAILURE)
4008         return NULL;
4009     }
4010   else
4011     {
4012       if (dim->expr_type != EXPR_CONSTANT)
4013         return NULL;
4014
4015       d = mpz_get_ui (dim->value.integer) - 1;
4016       if (gfc_array_dimen_size (array, d, &size) == FAILURE)
4017         return NULL;
4018     }
4019
4020   result = gfc_constant_result (BT_INTEGER, k, &array->where);
4021   mpz_set (result->value.integer, size);
4022   return result;
4023 }
4024
4025
4026 gfc_expr *
4027 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
4028 {
4029   gfc_expr *result;
4030
4031   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4032     return NULL;
4033
4034   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4035
4036   switch (x->ts.type)
4037     {
4038     case BT_INTEGER:
4039       mpz_abs (result->value.integer, x->value.integer);
4040       if (mpz_sgn (y->value.integer) < 0)
4041         mpz_neg (result->value.integer, result->value.integer);
4042
4043       break;
4044
4045     case BT_REAL:
4046       /* TODO: Handle -0.0 and +0.0 correctly on machines that support
4047          it.  */
4048       mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4049       if (mpfr_sgn (y->value.real) < 0)
4050         mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE);
4051
4052       break;
4053
4054     default:
4055       gfc_internal_error ("Bad type in gfc_simplify_sign");
4056     }
4057
4058   return result;
4059 }
4060
4061
4062 gfc_expr *
4063 gfc_simplify_sin (gfc_expr *x)
4064 {
4065   gfc_expr *result;
4066   mpfr_t xp, xq;
4067
4068   if (x->expr_type != EXPR_CONSTANT)
4069     return NULL;
4070
4071   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4072
4073   switch (x->ts.type)
4074     {
4075     case BT_REAL:
4076       mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
4077       break;
4078
4079     case BT_COMPLEX:
4080       gfc_set_model (x->value.real);
4081       mpfr_init (xp);
4082       mpfr_init (xq);
4083
4084       mpfr_sin  (xp, x->value.complex.r, GFC_RND_MODE);
4085       mpfr_cosh (xq, x->value.complex.i, GFC_RND_MODE);
4086       mpfr_mul (result->value.complex.r, xp, xq, GFC_RND_MODE);
4087
4088       mpfr_cos  (xp, x->value.complex.r, GFC_RND_MODE);
4089       mpfr_sinh (xq, x->value.complex.i, GFC_RND_MODE);
4090       mpfr_mul (result->value.complex.i, xp, xq, GFC_RND_MODE);
4091
4092       mpfr_clears (xp, xq, NULL);
4093       break;
4094
4095     default:
4096       gfc_internal_error ("in gfc_simplify_sin(): Bad type");
4097     }
4098
4099   return range_check (result, "SIN");
4100 }
4101
4102
4103 gfc_expr *
4104 gfc_simplify_sinh (gfc_expr *x)
4105 {
4106   gfc_expr *result;
4107
4108   if (x->expr_type != EXPR_CONSTANT)
4109     return NULL;
4110
4111   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4112
4113   mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
4114
4115   return range_check (result, "SINH");
4116 }
4117
4118
4119 /* The argument is always a double precision real that is converted to
4120    single precision.  TODO: Rounding!  */
4121
4122 gfc_expr *
4123 gfc_simplify_sngl (gfc_expr *a)
4124 {
4125   gfc_expr *result;
4126
4127   if (a->expr_type != EXPR_CONSTANT)
4128     return NULL;
4129
4130   result = gfc_real2real (a, gfc_default_real_kind);
4131   return range_check (result, "SNGL");
4132 }
4133
4134
4135 gfc_expr *
4136 gfc_simplify_spacing (gfc_expr *x)
4137 {
4138   gfc_expr *result;
4139   int i;
4140   long int en, ep;
4141
4142   if (x->expr_type != EXPR_CONSTANT)
4143     return NULL;
4144
4145   i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
4146
4147   result = gfc_constant_result (BT_REAL, x->ts.kind, &x->where);
4148
4149   /* Special case x = 0 and -0.  */
4150   mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
4151   if (mpfr_sgn (result->value.real) == 0)
4152     {
4153       mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4154       return result;
4155     }
4156
4157   /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
4158      are the radix, exponent of x, and precision.  This excludes the 
4159      possibility of subnormal numbers.  Fortran 2003 states the result is
4160      b**max(e - p, emin - 1).  */
4161
4162   ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
4163   en = (long int) gfc_real_kinds[i].min_exponent - 1;
4164   en = en > ep ? en : ep;
4165
4166   mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
4167   mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
4168
4169   return range_check (result, "SPACING");
4170 }
4171
4172
4173 gfc_expr *
4174 gfc_simplify_sqrt (gfc_expr *e)
4175 {
4176   gfc_expr *result;
4177   mpfr_t ac, ad, s, t, w;
4178
4179   if (e->expr_type != EXPR_CONSTANT)
4180     return NULL;
4181
4182   result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where);
4183
4184   switch (e->ts.type)
4185     {
4186     case BT_REAL:
4187       if (mpfr_cmp_si (e->value.real, 0) < 0)
4188         goto negative_arg;
4189       mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
4190
4191       break;
4192
4193     case BT_COMPLEX:
4194       /* Formula taken from Numerical Recipes to avoid over- and
4195          underflow.  */
4196
4197       gfc_set_model (e->value.real);
4198       mpfr_init (ac);
4199       mpfr_init (ad);
4200       mpfr_init (s);
4201       mpfr_init (t);
4202       mpfr_init (w);
4203
4204       if (mpfr_cmp_ui (e->value.complex.r, 0) == 0
4205           && mpfr_cmp_ui (e->value.complex.i, 0) == 0)
4206         {
4207           mpfr_set_ui (result->value.complex.r, 0, GFC_RND_MODE);
4208           mpfr_set_ui (result->value.complex.i, 0, GFC_RND_MODE);
4209           break;
4210         }
4211
4212       mpfr_abs (ac, e->value.complex.r, GFC_RND_MODE);
4213       mpfr_abs (ad, e->value.complex.i, GFC_RND_MODE);
4214
4215       if (mpfr_cmp (ac, ad) >= 0)
4216         {
4217           mpfr_div (t, e->value.complex.i, e->value.complex.r, GFC_RND_MODE);
4218           mpfr_mul (t, t, t, GFC_RND_MODE);
4219           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4220           mpfr_sqrt (t, t, GFC_RND_MODE);
4221           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4222           mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4223           mpfr_sqrt (t, t, GFC_RND_MODE);
4224           mpfr_sqrt (s, ac, GFC_RND_MODE);
4225           mpfr_mul (w, s, t, GFC_RND_MODE);
4226         }
4227       else
4228         {
4229           mpfr_div (s, e->value.complex.r, e->value.complex.i, GFC_RND_MODE);
4230           mpfr_mul (t, s, s, GFC_RND_MODE);
4231           mpfr_add_ui (t, t, 1, GFC_RND_MODE);
4232           mpfr_sqrt (t, t, GFC_RND_MODE);
4233           mpfr_abs (s, s, GFC_RND_MODE);
4234           mpfr_add (t, t, s, GFC_RND_MODE);
4235           mpfr_div_ui (t, t, 2, GFC_RND_MODE);
4236           mpfr_sqrt (t, t, GFC_RND_MODE);
4237           mpfr_sqrt (s, ad, GFC_RND_MODE);
4238           mpfr_mul (w, s, t, GFC_RND_MODE);
4239         }
4240
4241       if (mpfr_cmp_ui (w, 0) != 0 && mpfr_cmp_ui (e->value.complex.r, 0) >= 0)
4242         {
4243           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4244           mpfr_div (result->value.complex.i, e->value.complex.i, t, GFC_RND_MODE);
4245           mpfr_set (result->value.complex.r, w, GFC_RND_MODE);
4246         }
4247       else if (mpfr_cmp_ui (w, 0) != 0
4248                && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4249                && mpfr_cmp_ui (e->value.complex.i, 0) >= 0)
4250         {
4251           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4252           mpfr_div (result->value.complex.r, e->value.complex.i, t, GFC_RND_MODE);
4253           mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4254         }
4255       else if (mpfr_cmp_ui (w, 0) != 0
4256                && mpfr_cmp_ui (e->value.complex.r, 0) < 0
4257                && mpfr_cmp_ui (e->value.complex.i, 0) < 0)
4258         {
4259           mpfr_mul_ui (t, w, 2, GFC_RND_MODE);
4260           mpfr_div (result->value.complex.r, ad, t, GFC_RND_MODE);
4261           mpfr_neg (w, w, GFC_RND_MODE);
4262           mpfr_set (result->value.complex.i, w, GFC_RND_MODE);
4263         }
4264       else
4265         gfc_internal_error ("invalid complex argument of SQRT at %L",
4266                             &e->where);
4267
4268       mpfr_clears (s, t, ac, ad, w, NULL);
4269
4270       break;
4271
4272     default:
4273       gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
4274     }
4275
4276   return range_check (result, "SQRT");
4277
4278 negative_arg:
4279   gfc_free_expr (result);
4280   gfc_error ("Argument of SQRT at %L has a negative value", &e->where);
4281   return &gfc_bad_expr;
4282 }
4283
4284
4285 gfc_expr *
4286 gfc_simplify_tan (gfc_expr *x)
4287 {
4288   int i;
4289   gfc_expr *result;
4290
4291   if (x->expr_type != EXPR_CONSTANT)
4292     return NULL;
4293
4294   i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4295
4296   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4297
4298   mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
4299
4300   return range_check (result, "TAN");
4301 }
4302
4303
4304 gfc_expr *
4305 gfc_simplify_tanh (gfc_expr *x)
4306 {
4307   gfc_expr *result;
4308
4309   if (x->expr_type != EXPR_CONSTANT)
4310     return NULL;
4311
4312   result = gfc_constant_result (x->ts.type, x->ts.kind, &x->where);
4313
4314   mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
4315
4316   return range_check (result, "TANH");
4317
4318 }
4319
4320
4321 gfc_expr *
4322 gfc_simplify_tiny (gfc_expr *e)
4323 {
4324   gfc_expr *result;
4325   int i;
4326
4327   i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
4328
4329   result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where);
4330   mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
4331
4332   return result;
4333 }
4334
4335
4336 gfc_expr *
4337 gfc_simplify_trailz (gfc_expr *e)
4338 {
4339   gfc_expr *result;
4340   unsigned long tz, bs;
4341   int i;
4342
4343   if (e->expr_type != EXPR_CONSTANT)
4344     return NULL;
4345
4346   i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4347   bs = gfc_integer_kinds[i].bit_size;
4348   tz = mpz_scan1 (e->value.integer, 0);
4349
4350   result = gfc_constant_result (BT_INTEGER, gfc_default_integer_kind, &e->where);
4351   mpz_set_ui (result->value.integer, MIN (tz, bs));
4352
4353   return result;
4354 }
4355
4356
4357 gfc_expr *
4358 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
4359 {
4360   gfc_expr *result;
4361   gfc_expr *mold_element;
4362   size_t source_size;
4363   size_t result_size;
4364   size_t result_elt_size;
4365   size_t buffer_size;
4366   mpz_t tmp;
4367   unsigned char *buffer;
4368
4369   if (!gfc_is_constant_expr (source)
4370         || (gfc_init_expr && !gfc_is_constant_expr (mold))
4371         || !gfc_is_constant_expr (size))
4372     return NULL;
4373
4374   if (source->expr_type == EXPR_FUNCTION)
4375     return NULL;
4376
4377   /* Calculate the size of the source.  */
4378   if (source->expr_type == EXPR_ARRAY
4379       && gfc_array_size (source, &tmp) == FAILURE)
4380     gfc_internal_error ("Failure getting length of a constant array.");
4381
4382   source_size = gfc_target_expr_size (source);
4383
4384   /* Create an empty new expression with the appropriate characteristics.  */
4385   result = gfc_constant_result (mold->ts.type, mold->ts.kind,
4386                                 &source->where);
4387   result->ts = mold->ts;
4388
4389   mold_element = mold->expr_type == EXPR_ARRAY
4390                  ? mold->value.constructor->expr
4391                  : mold;
4392
4393   /* Set result character length, if needed.  Note that this needs to be
4394      set even for array expressions, in order to pass this information into 
4395      gfc_target_interpret_expr.  */
4396   if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
4397     result->value.character.length = mold_element->value.character.length;
4398   
4399   /* Set the number of elements in the result, and determine its size.  */
4400   result_elt_size = gfc_target_expr_size (mold_element);
4401   if (result_elt_size == 0)
4402     {
4403       gfc_free_expr (result);
4404       return NULL;
4405     }
4406
4407   if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
4408     {
4409       int result_length;
4410
4411       result->expr_type = EXPR_ARRAY;
4412       result->rank = 1;
4413
4414       if (size)
4415         result_length = (size_t)mpz_get_ui (size->value.integer);
4416       else
4417         {
4418           result_length = source_size / result_elt_size;
4419           if (result_length * result_elt_size < source_size)
4420             result_length += 1;
4421         }
4422
4423       result->shape = gfc_get_shape (1);
4424       mpz_init_set_ui (result->shape[0], result_length);
4425
4426       result_size = result_length * result_elt_size;
4427     }
4428   else
4429     {
4430       result->rank = 0;
4431       result_size = result_elt_size;
4432     }
4433
4434   if (gfc_option.warn_surprising && source_size < result_size)
4435     gfc_warning("Intrinsic TRANSFER at %L has partly undefined result: "
4436                 "source size %ld < result size %ld", &source->where,
4437                 (long) source_size, (long) result_size);
4438
4439   /* Allocate the buffer to store the binary version of the source.  */
4440   buffer_size = MAX (source_size, result_size);
4441   buffer = (unsigned char*)alloca (buffer_size);
4442
4443   /* Now write source to the buffer.  */
4444   gfc_target_encode_expr (source, buffer, buffer_size);
4445
4446   /* And read the buffer back into the new expression.  */
4447   gfc_target_interpret_expr (buffer, buffer_size, result);
4448
4449   return result;
4450 }
4451
4452
4453 gfc_expr *
4454 gfc_simplify_trim (gfc_expr *e)
4455 {
4456   gfc_expr *result;
4457   int count, i, len, lentrim;
4458
4459   if (e->expr_type != EXPR_CONSTANT)
4460     return NULL;
4461
4462   len = e->value.character.length;
4463
4464   result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where);
4465
4466   for (count = 0, i = 1; i <= len; ++i)
4467     {
4468       if (e->value.character.string[len - i] == ' ')
4469         count++;
4470       else
4471         break;
4472     }
4473
4474   lentrim = len - count;
4475
4476   result->value.character.length = lentrim;
4477   result->value.character.string = gfc_get_wide_string (lentrim + 1);
4478
4479   for (i = 0; i < lentrim; i++)
4480     result->value.character.string[i] = e->value.character.string[i];
4481
4482   result->value.character.string[lentrim] = '\0';       /* For debugger */
4483
4484   return result;
4485 }
4486
4487
4488 gfc_expr *
4489 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4490 {
4491   return simplify_bound (array, dim, kind, 1);
4492 }
4493
4494
4495 gfc_expr *
4496 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
4497 {
4498   gfc_expr *result;
4499   int back;
4500   size_t index, len, lenset;
4501   size_t i;
4502   int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
4503
4504   if (k == -1)
4505     return &gfc_bad_expr;
4506
4507   if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
4508     return NULL;
4509
4510   if (b != NULL && b->value.logical != 0)
4511     back = 1;
4512   else
4513     back = 0;
4514
4515   result = gfc_constant_result (BT_INTEGER, k, &s->where);
4516
4517   len = s->value.character.length;
4518   lenset = set->value.character.length;
4519
4520   if (len == 0)
4521     {
4522       mpz_set_ui (result->value.integer, 0);
4523       return result;
4524     }
4525
4526   if (back == 0)
4527     {
4528       if (lenset == 0)
4529         {
4530           mpz_set_ui (result->value.integer, 1);
4531           return result;
4532         }
4533
4534       index = wide_strspn (s->value.character.string,
4535                            set->value.character.string) + 1;
4536       if (index > len)
4537         index = 0;
4538
4539     }
4540   else
4541     {
4542       if (lenset == 0)
4543         {
4544           mpz_set_ui (result->value.integer, len);
4545           return result;
4546         }
4547       for (index = len; index > 0; index --)
4548         {
4549           for (i = 0; i < lenset; i++)
4550             {
4551               if (s->value.character.string[index - 1]
4552                   == set->value.character.string[i])
4553                 break;
4554             }
4555           if (i == lenset)
4556             break;
4557         }
4558     }
4559
4560   mpz_set_ui (result->value.integer, index);
4561   return result;
4562 }
4563
4564
4565 gfc_expr *
4566 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
4567 {
4568   gfc_expr *result;
4569   int kind;
4570
4571   if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4572     return NULL;
4573
4574   kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4575   if (x->ts.type == BT_INTEGER)
4576     {
4577       result = gfc_constant_result (BT_INTEGER, kind, &x->where);
4578       mpz_xor (result->value.integer, x->value.integer, y->value.integer);
4579       return range_check (result, "XOR");
4580     }
4581   else /* BT_LOGICAL */
4582     {
4583       result = gfc_constant_result (BT_LOGICAL, kind, &x->where);
4584       result->value.logical = (x->value.logical && !y->value.logical)
4585                               || (!x->value.logical && y->value.logical);
4586       return result;
4587     }
4588
4589 }
4590
4591
4592 /****************** Constant simplification *****************/
4593
4594 /* Master function to convert one constant to another.  While this is
4595    used as a simplification function, it requires the destination type
4596    and kind information which is supplied by a special case in
4597    do_simplify().  */
4598
4599 gfc_expr *
4600 gfc_convert_constant (gfc_expr *e, bt type, int kind)
4601 {
4602   gfc_expr *g, *result, *(*f) (gfc_expr *, int);
4603   gfc_constructor *head, *c, *tail = NULL;
4604
4605   switch (e->ts.type)
4606     {
4607     case BT_INTEGER:
4608       switch (type)
4609         {
4610         case BT_INTEGER:
4611           f = gfc_int2int;
4612           break;
4613         case BT_REAL:
4614           f = gfc_int2real;
4615           break;
4616         case BT_COMPLEX:
4617           f = gfc_int2complex;
4618           break;
4619         case BT_LOGICAL:
4620           f = gfc_int2log;
4621           break;
4622         default:
4623           goto oops;
4624         }
4625       break;
4626
4627     case BT_REAL:
4628       switch (type)
4629         {
4630         case BT_INTEGER:
4631           f = gfc_real2int;
4632           break;
4633         case BT_REAL:
4634           f = gfc_real2real;
4635           break;
4636         case BT_COMPLEX:
4637           f = gfc_real2complex;
4638           break;
4639         default:
4640           goto oops;
4641         }
4642       break;
4643
4644     case BT_COMPLEX:
4645       switch (type)
4646         {
4647         case BT_INTEGER:
4648           f = gfc_complex2int;
4649           break;
4650         case BT_REAL:
4651           f = gfc_complex2real;
4652           break;
4653         case BT_COMPLEX:
4654           f = gfc_complex2complex;
4655           break;
4656
4657         default:
4658           goto oops;
4659         }
4660       break;
4661
4662     case BT_LOGICAL:
4663       switch (type)
4664         {
4665         case BT_INTEGER:
4666           f = gfc_log2int;
4667           break;
4668         case BT_LOGICAL:
4669           f = gfc_log2log;
4670           break;
4671         default:
4672           goto oops;
4673         }
4674       break;
4675
4676     case BT_HOLLERITH:
4677       switch (type)
4678         {
4679         case BT_INTEGER:
4680           f = gfc_hollerith2int;
4681           break;
4682
4683         case BT_REAL:
4684           f = gfc_hollerith2real;
4685           break;
4686
4687         case BT_COMPLEX:
4688           f = gfc_hollerith2complex;
4689           break;
4690
4691         case BT_CHARACTER:
4692           f = gfc_hollerith2character;
4693           break;
4694
4695         case BT_LOGICAL:
4696           f = gfc_hollerith2logical;
4697           break;
4698
4699         default:
4700           goto oops;
4701         }
4702       break;
4703
4704     default:
4705     oops:
4706       gfc_internal_error ("gfc_convert_constant(): Unexpected type");
4707     }
4708
4709   result = NULL;
4710
4711   switch (e->expr_type)
4712     {
4713     case EXPR_CONSTANT:
4714       result = f (e, kind);
4715       if (result == NULL)
4716         return &gfc_bad_expr;
4717       break;
4718
4719     case EXPR_ARRAY:
4720       if (!gfc_is_constant_expr (e))
4721         break;
4722
4723       head = NULL;
4724
4725       for (c = e->value.constructor; c; c = c->next)
4726         {
4727           if (head == NULL)
4728             head = tail = gfc_get_constructor ();
4729           else
4730             {
4731               tail->next = gfc_get_constructor ();
4732               tail = tail->next;
4733             }
4734
4735           tail->where = c->where;
4736
4737           if (c->iterator == NULL)
4738             tail->expr = f (c->expr, kind);
4739           else
4740             {
4741               g = gfc_convert_constant (c->expr, type, kind);
4742               if (g == &gfc_bad_expr)
4743                 return g;
4744               tail->expr = g;
4745             }
4746
4747           if (tail->expr == NULL)
4748             {
4749               gfc_free_constructor (head);
4750               return NULL;
4751             }
4752         }
4753
4754       result = gfc_get_expr ();
4755       result->ts.type = type;
4756       result->ts.kind = kind;
4757       result->expr_type = EXPR_ARRAY;
4758       result->value.constructor = head;
4759       result->shape = gfc_copy_shape (e->shape, e->rank);
4760       result->where = e->where;
4761       result->rank = e->rank;
4762       break;
4763
4764     default:
4765       break;
4766     }
4767
4768   return result;
4769 }
4770
4771
4772 /* Function for converting character constants.  */
4773 gfc_expr *
4774 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
4775 {
4776   gfc_expr *result;
4777   int i;
4778
4779   if (!gfc_is_constant_expr (e))
4780     return NULL;
4781
4782   if (e->expr_type == EXPR_CONSTANT)
4783     {
4784       /* Simple case of a scalar.  */
4785       result = gfc_constant_result (BT_CHARACTER, kind, &e->where);
4786       if (result == NULL)
4787         return &gfc_bad_expr;
4788
4789       result->value.character.length = e->value.character.length;
4790       result->value.character.string
4791         = gfc_get_wide_string (e->value.character.length + 1);
4792       memcpy (result->value.character.string, e->value.character.string,
4793               (e->value.character.length + 1) * sizeof (gfc_char_t));
4794
4795       /* Check we only have values representable in the destination kind.  */
4796       for (i = 0; i < result->value.character.length; i++)
4797         if (!gfc_check_character_range (result->value.character.string[i],
4798                                         kind))
4799           {
4800             gfc_error ("Character '%s' in string at %L cannot be converted "
4801                        "into character kind %d",
4802                        gfc_print_wide_char (result->value.character.string[i]),
4803                        &e->where, kind);
4804             return &gfc_bad_expr;
4805           }
4806
4807       return result;
4808     }
4809   else if (e->expr_type == EXPR_ARRAY)
4810     {
4811       /* For an array constructor, we convert each constructor element.  */
4812       gfc_constructor *head = NULL, *tail = NULL, *c;
4813
4814       for (c = e->value.constructor; c; c = c->next)
4815         {
4816           if (head == NULL)
4817             head = tail = gfc_get_constructor ();
4818           else
4819             {
4820               tail->next = gfc_get_constructor ();
4821               tail = tail->next;
4822             }
4823
4824           tail->where = c->where;
4825           tail->expr = gfc_convert_char_constant (c->expr, type, kind);
4826           if (tail->expr == &gfc_bad_expr)
4827             {
4828               tail->expr = NULL;
4829               return &gfc_bad_expr;
4830             }
4831
4832           if (tail->expr == NULL)
4833             {
4834               gfc_free_constructor (head);
4835               return NULL;
4836             }
4837         }
4838
4839       result = gfc_get_expr ();
4840       result->ts.type = type;
4841       result->ts.kind = kind;
4842       result->expr_type = EXPR_ARRAY;
4843       result->value.constructor = head;
4844       result->shape = gfc_copy_shape (e->shape, e->rank);
4845       result->where = e->where;
4846       result->rank = e->rank;
4847       result->ts.cl = e->ts.cl;
4848
4849       return result;
4850     }
4851   else
4852     return NULL;
4853 }