OSDN Git Service

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