[multiple changes]
[gcc.git] / gcc / fortran / expr.c
1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
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 "gfortran.h"
26 #include "arith.h"
27 #include "match.h"
28
29 /* Get a new expr node. */
30
31 gfc_expr *
32 gfc_get_expr (void)
33 {
34 gfc_expr *e;
35
36 e = gfc_getmem (sizeof (gfc_expr));
37 gfc_clear_ts (&e->ts);
38 e->shape = NULL;
39 e->ref = NULL;
40 e->symtree = NULL;
41 e->con_by_offset = NULL;
42 return e;
43 }
44
45
46 /* Free an argument list and everything below it. */
47
48 void
49 gfc_free_actual_arglist (gfc_actual_arglist *a1)
50 {
51 gfc_actual_arglist *a2;
52
53 while (a1)
54 {
55 a2 = a1->next;
56 gfc_free_expr (a1->expr);
57 gfc_free (a1);
58 a1 = a2;
59 }
60 }
61
62
63 /* Copy an arglist structure and all of the arguments. */
64
65 gfc_actual_arglist *
66 gfc_copy_actual_arglist (gfc_actual_arglist *p)
67 {
68 gfc_actual_arglist *head, *tail, *new;
69
70 head = tail = NULL;
71
72 for (; p; p = p->next)
73 {
74 new = gfc_get_actual_arglist ();
75 *new = *p;
76
77 new->expr = gfc_copy_expr (p->expr);
78 new->next = NULL;
79
80 if (head == NULL)
81 head = new;
82 else
83 tail->next = new;
84
85 tail = new;
86 }
87
88 return head;
89 }
90
91
92 /* Free a list of reference structures. */
93
94 void
95 gfc_free_ref_list (gfc_ref *p)
96 {
97 gfc_ref *q;
98 int i;
99
100 for (; p; p = q)
101 {
102 q = p->next;
103
104 switch (p->type)
105 {
106 case REF_ARRAY:
107 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
108 {
109 gfc_free_expr (p->u.ar.start[i]);
110 gfc_free_expr (p->u.ar.end[i]);
111 gfc_free_expr (p->u.ar.stride[i]);
112 }
113
114 break;
115
116 case REF_SUBSTRING:
117 gfc_free_expr (p->u.ss.start);
118 gfc_free_expr (p->u.ss.end);
119 break;
120
121 case REF_COMPONENT:
122 break;
123 }
124
125 gfc_free (p);
126 }
127 }
128
129
130 /* Workhorse function for gfc_free_expr() that frees everything
131 beneath an expression node, but not the node itself. This is
132 useful when we want to simplify a node and replace it with
133 something else or the expression node belongs to another structure. */
134
135 static void
136 free_expr0 (gfc_expr *e)
137 {
138 int n;
139
140 switch (e->expr_type)
141 {
142 case EXPR_CONSTANT:
143 /* Free any parts of the value that need freeing. */
144 switch (e->ts.type)
145 {
146 case BT_INTEGER:
147 mpz_clear (e->value.integer);
148 break;
149
150 case BT_REAL:
151 mpfr_clear (e->value.real);
152 break;
153
154 case BT_CHARACTER:
155 gfc_free (e->value.character.string);
156 break;
157
158 case BT_COMPLEX:
159 mpfr_clear (e->value.complex.r);
160 mpfr_clear (e->value.complex.i);
161 break;
162
163 default:
164 break;
165 }
166
167 /* Free the representation, except in character constants where it
168 is the same as value.character.string and thus already freed. */
169 if (e->representation.string && e->ts.type != BT_CHARACTER)
170 gfc_free (e->representation.string);
171
172 break;
173
174 case EXPR_OP:
175 if (e->value.op.op1 != NULL)
176 gfc_free_expr (e->value.op.op1);
177 if (e->value.op.op2 != NULL)
178 gfc_free_expr (e->value.op.op2);
179 break;
180
181 case EXPR_FUNCTION:
182 gfc_free_actual_arglist (e->value.function.actual);
183 break;
184
185 case EXPR_VARIABLE:
186 break;
187
188 case EXPR_ARRAY:
189 case EXPR_STRUCTURE:
190 gfc_free_constructor (e->value.constructor);
191 break;
192
193 case EXPR_SUBSTRING:
194 gfc_free (e->value.character.string);
195 break;
196
197 case EXPR_NULL:
198 break;
199
200 default:
201 gfc_internal_error ("free_expr0(): Bad expr type");
202 }
203
204 /* Free a shape array. */
205 if (e->shape != NULL)
206 {
207 for (n = 0; n < e->rank; n++)
208 mpz_clear (e->shape[n]);
209
210 gfc_free (e->shape);
211 }
212
213 gfc_free_ref_list (e->ref);
214
215 memset (e, '\0', sizeof (gfc_expr));
216 }
217
218
219 /* Free an expression node and everything beneath it. */
220
221 void
222 gfc_free_expr (gfc_expr *e)
223 {
224 if (e == NULL)
225 return;
226 if (e->con_by_offset)
227 splay_tree_delete (e->con_by_offset);
228 free_expr0 (e);
229 gfc_free (e);
230 }
231
232
233 /* Graft the *src expression onto the *dest subexpression. */
234
235 void
236 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
237 {
238 free_expr0 (dest);
239 *dest = *src;
240 gfc_free (src);
241 }
242
243
244 /* Try to extract an integer constant from the passed expression node.
245 Returns an error message or NULL if the result is set. It is
246 tempting to generate an error and return SUCCESS or FAILURE, but
247 failure is OK for some callers. */
248
249 const char *
250 gfc_extract_int (gfc_expr *expr, int *result)
251 {
252 if (expr->expr_type != EXPR_CONSTANT)
253 return _("Constant expression required at %C");
254
255 if (expr->ts.type != BT_INTEGER)
256 return _("Integer expression required at %C");
257
258 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
259 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
260 {
261 return _("Integer value too large in expression at %C");
262 }
263
264 *result = (int) mpz_get_si (expr->value.integer);
265
266 return NULL;
267 }
268
269
270 /* Recursively copy a list of reference structures. */
271
272 static gfc_ref *
273 copy_ref (gfc_ref *src)
274 {
275 gfc_array_ref *ar;
276 gfc_ref *dest;
277
278 if (src == NULL)
279 return NULL;
280
281 dest = gfc_get_ref ();
282 dest->type = src->type;
283
284 switch (src->type)
285 {
286 case REF_ARRAY:
287 ar = gfc_copy_array_ref (&src->u.ar);
288 dest->u.ar = *ar;
289 gfc_free (ar);
290 break;
291
292 case REF_COMPONENT:
293 dest->u.c = src->u.c;
294 break;
295
296 case REF_SUBSTRING:
297 dest->u.ss = src->u.ss;
298 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
299 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
300 break;
301 }
302
303 dest->next = copy_ref (src->next);
304
305 return dest;
306 }
307
308
309 /* Detect whether an expression has any vector index array references. */
310
311 int
312 gfc_has_vector_index (gfc_expr *e)
313 {
314 gfc_ref *ref;
315 int i;
316 for (ref = e->ref; ref; ref = ref->next)
317 if (ref->type == REF_ARRAY)
318 for (i = 0; i < ref->u.ar.dimen; i++)
319 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
320 return 1;
321 return 0;
322 }
323
324
325 /* Copy a shape array. */
326
327 mpz_t *
328 gfc_copy_shape (mpz_t *shape, int rank)
329 {
330 mpz_t *new_shape;
331 int n;
332
333 if (shape == NULL)
334 return NULL;
335
336 new_shape = gfc_get_shape (rank);
337
338 for (n = 0; n < rank; n++)
339 mpz_init_set (new_shape[n], shape[n]);
340
341 return new_shape;
342 }
343
344
345 /* Copy a shape array excluding dimension N, where N is an integer
346 constant expression. Dimensions are numbered in fortran style --
347 starting with ONE.
348
349 So, if the original shape array contains R elements
350 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
351 the result contains R-1 elements:
352 { s1 ... sN-1 sN+1 ... sR-1}
353
354 If anything goes wrong -- N is not a constant, its value is out
355 of range -- or anything else, just returns NULL. */
356
357 mpz_t *
358 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
359 {
360 mpz_t *new_shape, *s;
361 int i, n;
362
363 if (shape == NULL
364 || rank <= 1
365 || dim == NULL
366 || dim->expr_type != EXPR_CONSTANT
367 || dim->ts.type != BT_INTEGER)
368 return NULL;
369
370 n = mpz_get_si (dim->value.integer);
371 n--; /* Convert to zero based index. */
372 if (n < 0 || n >= rank)
373 return NULL;
374
375 s = new_shape = gfc_get_shape (rank - 1);
376
377 for (i = 0; i < rank; i++)
378 {
379 if (i == n)
380 continue;
381 mpz_init_set (*s, shape[i]);
382 s++;
383 }
384
385 return new_shape;
386 }
387
388
389 /* Given an expression pointer, return a copy of the expression. This
390 subroutine is recursive. */
391
392 gfc_expr *
393 gfc_copy_expr (gfc_expr *p)
394 {
395 gfc_expr *q;
396 char *s;
397
398 if (p == NULL)
399 return NULL;
400
401 q = gfc_get_expr ();
402 *q = *p;
403
404 switch (q->expr_type)
405 {
406 case EXPR_SUBSTRING:
407 s = gfc_getmem (p->value.character.length + 1);
408 q->value.character.string = s;
409
410 memcpy (s, p->value.character.string, p->value.character.length + 1);
411 break;
412
413 case EXPR_CONSTANT:
414 /* Copy target representation, if it exists. */
415 if (p->representation.string)
416 {
417 s = gfc_getmem (p->representation.length + 1);
418 q->representation.string = s;
419
420 memcpy (s, p->representation.string, p->representation.length + 1);
421 }
422
423 /* Copy the values of any pointer components of p->value. */
424 switch (q->ts.type)
425 {
426 case BT_INTEGER:
427 mpz_init_set (q->value.integer, p->value.integer);
428 break;
429
430 case BT_REAL:
431 gfc_set_model_kind (q->ts.kind);
432 mpfr_init (q->value.real);
433 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
434 break;
435
436 case BT_COMPLEX:
437 gfc_set_model_kind (q->ts.kind);
438 mpfr_init (q->value.complex.r);
439 mpfr_init (q->value.complex.i);
440 mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
441 mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
442 break;
443
444 case BT_CHARACTER:
445 if (p->representation.string)
446 q->value.character.string = q->representation.string;
447 else
448 {
449 s = gfc_getmem (p->value.character.length + 1);
450 q->value.character.string = s;
451
452 /* This is the case for the C_NULL_CHAR named constant. */
453 if (p->value.character.length == 0
454 && (p->ts.is_c_interop || p->ts.is_iso_c))
455 {
456 *s = '\0';
457 /* Need to set the length to 1 to make sure the NUL
458 terminator is copied. */
459 q->value.character.length = 1;
460 }
461 else
462 memcpy (s, p->value.character.string,
463 p->value.character.length + 1);
464 }
465 break;
466
467 case BT_HOLLERITH:
468 case BT_LOGICAL:
469 case BT_DERIVED:
470 break; /* Already done. */
471
472 case BT_PROCEDURE:
473 case BT_VOID:
474 /* Should never be reached. */
475 case BT_UNKNOWN:
476 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
477 /* Not reached. */
478 }
479
480 break;
481
482 case EXPR_OP:
483 switch (q->value.op.operator)
484 {
485 case INTRINSIC_NOT:
486 case INTRINSIC_PARENTHESES:
487 case INTRINSIC_UPLUS:
488 case INTRINSIC_UMINUS:
489 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
490 break;
491
492 default: /* Binary operators. */
493 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
494 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
495 break;
496 }
497
498 break;
499
500 case EXPR_FUNCTION:
501 q->value.function.actual =
502 gfc_copy_actual_arglist (p->value.function.actual);
503 break;
504
505 case EXPR_STRUCTURE:
506 case EXPR_ARRAY:
507 q->value.constructor = gfc_copy_constructor (p->value.constructor);
508 break;
509
510 case EXPR_VARIABLE:
511 case EXPR_NULL:
512 break;
513 }
514
515 q->shape = gfc_copy_shape (p->shape, p->rank);
516
517 q->ref = copy_ref (p->ref);
518
519 return q;
520 }
521
522
523 /* Return the maximum kind of two expressions. In general, higher
524 kind numbers mean more precision for numeric types. */
525
526 int
527 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
528 {
529 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
530 }
531
532
533 /* Returns nonzero if the type is numeric, zero otherwise. */
534
535 static int
536 numeric_type (bt type)
537 {
538 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
539 }
540
541
542 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
543
544 int
545 gfc_numeric_ts (gfc_typespec *ts)
546 {
547 return numeric_type (ts->type);
548 }
549
550
551 /* Returns an expression node that is an integer constant. */
552
553 gfc_expr *
554 gfc_int_expr (int i)
555 {
556 gfc_expr *p;
557
558 p = gfc_get_expr ();
559
560 p->expr_type = EXPR_CONSTANT;
561 p->ts.type = BT_INTEGER;
562 p->ts.kind = gfc_default_integer_kind;
563
564 p->where = gfc_current_locus;
565 mpz_init_set_si (p->value.integer, i);
566
567 return p;
568 }
569
570
571 /* Returns an expression node that is a logical constant. */
572
573 gfc_expr *
574 gfc_logical_expr (int i, locus *where)
575 {
576 gfc_expr *p;
577
578 p = gfc_get_expr ();
579
580 p->expr_type = EXPR_CONSTANT;
581 p->ts.type = BT_LOGICAL;
582 p->ts.kind = gfc_default_logical_kind;
583
584 if (where == NULL)
585 where = &gfc_current_locus;
586 p->where = *where;
587 p->value.logical = i;
588
589 return p;
590 }
591
592
593 /* Return an expression node with an optional argument list attached.
594 A variable number of gfc_expr pointers are strung together in an
595 argument list with a NULL pointer terminating the list. */
596
597 gfc_expr *
598 gfc_build_conversion (gfc_expr *e)
599 {
600 gfc_expr *p;
601
602 p = gfc_get_expr ();
603 p->expr_type = EXPR_FUNCTION;
604 p->symtree = NULL;
605 p->value.function.actual = NULL;
606
607 p->value.function.actual = gfc_get_actual_arglist ();
608 p->value.function.actual->expr = e;
609
610 return p;
611 }
612
613
614 /* Given an expression node with some sort of numeric binary
615 expression, insert type conversions required to make the operands
616 have the same type.
617
618 The exception is that the operands of an exponential don't have to
619 have the same type. If possible, the base is promoted to the type
620 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
621 1.0**2 stays as it is. */
622
623 void
624 gfc_type_convert_binary (gfc_expr *e)
625 {
626 gfc_expr *op1, *op2;
627
628 op1 = e->value.op.op1;
629 op2 = e->value.op.op2;
630
631 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
632 {
633 gfc_clear_ts (&e->ts);
634 return;
635 }
636
637 /* Kind conversions of same type. */
638 if (op1->ts.type == op2->ts.type)
639 {
640 if (op1->ts.kind == op2->ts.kind)
641 {
642 /* No type conversions. */
643 e->ts = op1->ts;
644 goto done;
645 }
646
647 if (op1->ts.kind > op2->ts.kind)
648 gfc_convert_type (op2, &op1->ts, 2);
649 else
650 gfc_convert_type (op1, &op2->ts, 2);
651
652 e->ts = op1->ts;
653 goto done;
654 }
655
656 /* Integer combined with real or complex. */
657 if (op2->ts.type == BT_INTEGER)
658 {
659 e->ts = op1->ts;
660
661 /* Special case for ** operator. */
662 if (e->value.op.operator == INTRINSIC_POWER)
663 goto done;
664
665 gfc_convert_type (e->value.op.op2, &e->ts, 2);
666 goto done;
667 }
668
669 if (op1->ts.type == BT_INTEGER)
670 {
671 e->ts = op2->ts;
672 gfc_convert_type (e->value.op.op1, &e->ts, 2);
673 goto done;
674 }
675
676 /* Real combined with complex. */
677 e->ts.type = BT_COMPLEX;
678 if (op1->ts.kind > op2->ts.kind)
679 e->ts.kind = op1->ts.kind;
680 else
681 e->ts.kind = op2->ts.kind;
682 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
683 gfc_convert_type (e->value.op.op1, &e->ts, 2);
684 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
685 gfc_convert_type (e->value.op.op2, &e->ts, 2);
686
687 done:
688 return;
689 }
690
691
692 /* Function to determine if an expression is constant or not. This
693 function expects that the expression has already been simplified. */
694
695 int
696 gfc_is_constant_expr (gfc_expr *e)
697 {
698 gfc_constructor *c;
699 gfc_actual_arglist *arg;
700 int rv;
701
702 if (e == NULL)
703 return 1;
704
705 switch (e->expr_type)
706 {
707 case EXPR_OP:
708 rv = (gfc_is_constant_expr (e->value.op.op1)
709 && (e->value.op.op2 == NULL
710 || gfc_is_constant_expr (e->value.op.op2)));
711 break;
712
713 case EXPR_VARIABLE:
714 rv = 0;
715 break;
716
717 case EXPR_FUNCTION:
718 /* Call to intrinsic with at least one argument. */
719 rv = 0;
720 if (e->value.function.isym && e->value.function.actual)
721 {
722 for (arg = e->value.function.actual; arg; arg = arg->next)
723 {
724 if (!gfc_is_constant_expr (arg->expr))
725 break;
726 }
727 if (arg == NULL)
728 rv = 1;
729 }
730 break;
731
732 case EXPR_CONSTANT:
733 case EXPR_NULL:
734 rv = 1;
735 break;
736
737 case EXPR_SUBSTRING:
738 rv = (gfc_is_constant_expr (e->ref->u.ss.start)
739 && gfc_is_constant_expr (e->ref->u.ss.end));
740 break;
741
742 case EXPR_STRUCTURE:
743 rv = 0;
744 for (c = e->value.constructor; c; c = c->next)
745 if (!gfc_is_constant_expr (c->expr))
746 break;
747
748 if (c == NULL)
749 rv = 1;
750 break;
751
752 case EXPR_ARRAY:
753 rv = gfc_constant_ac (e);
754 break;
755
756 default:
757 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
758 }
759
760 return rv;
761 }
762
763
764 /* Try to collapse intrinsic expressions. */
765
766 static try
767 simplify_intrinsic_op (gfc_expr *p, int type)
768 {
769 gfc_expr *op1, *op2, *result;
770
771 if (p->value.op.operator == INTRINSIC_USER)
772 return SUCCESS;
773
774 op1 = p->value.op.op1;
775 op2 = p->value.op.op2;
776
777 if (gfc_simplify_expr (op1, type) == FAILURE)
778 return FAILURE;
779 if (gfc_simplify_expr (op2, type) == FAILURE)
780 return FAILURE;
781
782 if (!gfc_is_constant_expr (op1)
783 || (op2 != NULL && !gfc_is_constant_expr (op2)))
784 return SUCCESS;
785
786 /* Rip p apart. */
787 p->value.op.op1 = NULL;
788 p->value.op.op2 = NULL;
789
790 switch (p->value.op.operator)
791 {
792 case INTRINSIC_PARENTHESES:
793 result = gfc_parentheses (op1);
794 break;
795
796 case INTRINSIC_UPLUS:
797 result = gfc_uplus (op1);
798 break;
799
800 case INTRINSIC_UMINUS:
801 result = gfc_uminus (op1);
802 break;
803
804 case INTRINSIC_PLUS:
805 result = gfc_add (op1, op2);
806 break;
807
808 case INTRINSIC_MINUS:
809 result = gfc_subtract (op1, op2);
810 break;
811
812 case INTRINSIC_TIMES:
813 result = gfc_multiply (op1, op2);
814 break;
815
816 case INTRINSIC_DIVIDE:
817 result = gfc_divide (op1, op2);
818 break;
819
820 case INTRINSIC_POWER:
821 result = gfc_power (op1, op2);
822 break;
823
824 case INTRINSIC_CONCAT:
825 result = gfc_concat (op1, op2);
826 break;
827
828 case INTRINSIC_EQ:
829 result = gfc_eq (op1, op2);
830 break;
831
832 case INTRINSIC_NE:
833 result = gfc_ne (op1, op2);
834 break;
835
836 case INTRINSIC_GT:
837 result = gfc_gt (op1, op2);
838 break;
839
840 case INTRINSIC_GE:
841 result = gfc_ge (op1, op2);
842 break;
843
844 case INTRINSIC_LT:
845 result = gfc_lt (op1, op2);
846 break;
847
848 case INTRINSIC_LE:
849 result = gfc_le (op1, op2);
850 break;
851
852 case INTRINSIC_NOT:
853 result = gfc_not (op1);
854 break;
855
856 case INTRINSIC_AND:
857 result = gfc_and (op1, op2);
858 break;
859
860 case INTRINSIC_OR:
861 result = gfc_or (op1, op2);
862 break;
863
864 case INTRINSIC_EQV:
865 result = gfc_eqv (op1, op2);
866 break;
867
868 case INTRINSIC_NEQV:
869 result = gfc_neqv (op1, op2);
870 break;
871
872 default:
873 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
874 }
875
876 if (result == NULL)
877 {
878 gfc_free_expr (op1);
879 gfc_free_expr (op2);
880 return FAILURE;
881 }
882
883 result->rank = p->rank;
884 result->where = p->where;
885 gfc_replace_expr (p, result);
886
887 return SUCCESS;
888 }
889
890
891 /* Subroutine to simplify constructor expressions. Mutually recursive
892 with gfc_simplify_expr(). */
893
894 static try
895 simplify_constructor (gfc_constructor *c, int type)
896 {
897 for (; c; c = c->next)
898 {
899 if (c->iterator
900 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
901 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
902 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
903 return FAILURE;
904
905 if (c->expr && gfc_simplify_expr (c->expr, type) == FAILURE)
906 return FAILURE;
907 }
908
909 return SUCCESS;
910 }
911
912
913 /* Pull a single array element out of an array constructor. */
914
915 static try
916 find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
917 gfc_constructor **rval)
918 {
919 unsigned long nelemen;
920 int i;
921 mpz_t delta;
922 mpz_t offset;
923 mpz_t span;
924 mpz_t tmp;
925 gfc_expr *e;
926 try t;
927
928 t = SUCCESS;
929 e = NULL;
930
931 mpz_init_set_ui (offset, 0);
932 mpz_init (delta);
933 mpz_init (tmp);
934 mpz_init_set_ui (span, 1);
935 for (i = 0; i < ar->dimen; i++)
936 {
937 e = gfc_copy_expr (ar->start[i]);
938 if (e->expr_type != EXPR_CONSTANT)
939 {
940 cons = NULL;
941 goto depart;
942 }
943
944 /* Check the bounds. */
945 if (ar->as->upper[i]
946 && (mpz_cmp (e->value.integer, ar->as->upper[i]->value.integer) > 0
947 || mpz_cmp (e->value.integer,
948 ar->as->lower[i]->value.integer) < 0))
949 {
950 gfc_error ("index in dimension %d is out of bounds "
951 "at %L", i + 1, &ar->c_where[i]);
952 cons = NULL;
953 t = FAILURE;
954 goto depart;
955 }
956
957 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
958 mpz_mul (delta, delta, span);
959 mpz_add (offset, offset, delta);
960
961 mpz_set_ui (tmp, 1);
962 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
963 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
964 mpz_mul (span, span, tmp);
965 }
966
967 if (cons)
968 {
969 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
970 {
971 if (cons->iterator)
972 {
973 cons = NULL;
974 goto depart;
975 }
976 cons = cons->next;
977 }
978 }
979
980 depart:
981 mpz_clear (delta);
982 mpz_clear (offset);
983 mpz_clear (span);
984 mpz_clear (tmp);
985 if (e)
986 gfc_free_expr (e);
987 *rval = cons;
988 return t;
989 }
990
991
992 /* Find a component of a structure constructor. */
993
994 static gfc_constructor *
995 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
996 {
997 gfc_component *comp;
998 gfc_component *pick;
999
1000 comp = ref->u.c.sym->components;
1001 pick = ref->u.c.component;
1002 while (comp != pick)
1003 {
1004 comp = comp->next;
1005 cons = cons->next;
1006 }
1007
1008 return cons;
1009 }
1010
1011
1012 /* Replace an expression with the contents of a constructor, removing
1013 the subobject reference in the process. */
1014
1015 static void
1016 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1017 {
1018 gfc_expr *e;
1019
1020 e = cons->expr;
1021 cons->expr = NULL;
1022 e->ref = p->ref->next;
1023 p->ref->next = NULL;
1024 gfc_replace_expr (p, e);
1025 }
1026
1027
1028 /* Pull an array section out of an array constructor. */
1029
1030 static try
1031 find_array_section (gfc_expr *expr, gfc_ref *ref)
1032 {
1033 int idx;
1034 int rank;
1035 int d;
1036 int shape_i;
1037 long unsigned one = 1;
1038 bool incr_ctr;
1039 mpz_t start[GFC_MAX_DIMENSIONS];
1040 mpz_t end[GFC_MAX_DIMENSIONS];
1041 mpz_t stride[GFC_MAX_DIMENSIONS];
1042 mpz_t delta[GFC_MAX_DIMENSIONS];
1043 mpz_t ctr[GFC_MAX_DIMENSIONS];
1044 mpz_t delta_mpz;
1045 mpz_t tmp_mpz;
1046 mpz_t nelts;
1047 mpz_t ptr;
1048 mpz_t index;
1049 gfc_constructor *cons;
1050 gfc_constructor *base;
1051 gfc_expr *begin;
1052 gfc_expr *finish;
1053 gfc_expr *step;
1054 gfc_expr *upper;
1055 gfc_expr *lower;
1056 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1057 try t;
1058
1059 t = SUCCESS;
1060
1061 base = expr->value.constructor;
1062 expr->value.constructor = NULL;
1063
1064 rank = ref->u.ar.as->rank;
1065
1066 if (expr->shape == NULL)
1067 expr->shape = gfc_get_shape (rank);
1068
1069 mpz_init_set_ui (delta_mpz, one);
1070 mpz_init_set_ui (nelts, one);
1071 mpz_init (tmp_mpz);
1072
1073 /* Do the initialization now, so that we can cleanup without
1074 keeping track of where we were. */
1075 for (d = 0; d < rank; d++)
1076 {
1077 mpz_init (delta[d]);
1078 mpz_init (start[d]);
1079 mpz_init (end[d]);
1080 mpz_init (ctr[d]);
1081 mpz_init (stride[d]);
1082 vecsub[d] = NULL;
1083 }
1084
1085 /* Build the counters to clock through the array reference. */
1086 shape_i = 0;
1087 for (d = 0; d < rank; d++)
1088 {
1089 /* Make this stretch of code easier on the eye! */
1090 begin = ref->u.ar.start[d];
1091 finish = ref->u.ar.end[d];
1092 step = ref->u.ar.stride[d];
1093 lower = ref->u.ar.as->lower[d];
1094 upper = ref->u.ar.as->upper[d];
1095
1096 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1097 {
1098 gcc_assert (begin);
1099
1100 if (begin->expr_type != EXPR_ARRAY)
1101 {
1102 t = FAILURE;
1103 goto cleanup;
1104 }
1105
1106 gcc_assert (begin->rank == 1);
1107 gcc_assert (begin->shape);
1108
1109 vecsub[d] = begin->value.constructor;
1110 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1111 mpz_mul (nelts, nelts, begin->shape[0]);
1112 mpz_set (expr->shape[shape_i++], begin->shape[0]);
1113
1114 /* Check bounds. */
1115 for (c = vecsub[d]; c; c = c->next)
1116 {
1117 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1118 || mpz_cmp (c->expr->value.integer,
1119 lower->value.integer) < 0)
1120 {
1121 gfc_error ("index in dimension %d is out of bounds "
1122 "at %L", d + 1, &ref->u.ar.c_where[d]);
1123 t = FAILURE;
1124 goto cleanup;
1125 }
1126 }
1127 }
1128 else
1129 {
1130 if ((begin && begin->expr_type != EXPR_CONSTANT)
1131 || (finish && finish->expr_type != EXPR_CONSTANT)
1132 || (step && step->expr_type != EXPR_CONSTANT))
1133 {
1134 t = FAILURE;
1135 goto cleanup;
1136 }
1137
1138 /* Obtain the stride. */
1139 if (step)
1140 mpz_set (stride[d], step->value.integer);
1141 else
1142 mpz_set_ui (stride[d], one);
1143
1144 if (mpz_cmp_ui (stride[d], 0) == 0)
1145 mpz_set_ui (stride[d], one);
1146
1147 /* Obtain the start value for the index. */
1148 if (begin)
1149 mpz_set (start[d], begin->value.integer);
1150 else
1151 mpz_set (start[d], lower->value.integer);
1152
1153 mpz_set (ctr[d], start[d]);
1154
1155 /* Obtain the end value for the index. */
1156 if (finish)
1157 mpz_set (end[d], finish->value.integer);
1158 else
1159 mpz_set (end[d], upper->value.integer);
1160
1161 /* Separate 'if' because elements sometimes arrive with
1162 non-null end. */
1163 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1164 mpz_set (end [d], begin->value.integer);
1165
1166 /* Check the bounds. */
1167 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1168 || mpz_cmp (end[d], upper->value.integer) > 0
1169 || mpz_cmp (ctr[d], lower->value.integer) < 0
1170 || mpz_cmp (end[d], lower->value.integer) < 0)
1171 {
1172 gfc_error ("index in dimension %d is out of bounds "
1173 "at %L", d + 1, &ref->u.ar.c_where[d]);
1174 t = FAILURE;
1175 goto cleanup;
1176 }
1177
1178 /* Calculate the number of elements and the shape. */
1179 mpz_set (tmp_mpz, stride[d]);
1180 mpz_add (tmp_mpz, end[d], tmp_mpz);
1181 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1182 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1183 mpz_mul (nelts, nelts, tmp_mpz);
1184
1185 /* An element reference reduces the rank of the expression; don't
1186 add anything to the shape array. */
1187 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1188 mpz_set (expr->shape[shape_i++], tmp_mpz);
1189 }
1190
1191 /* Calculate the 'stride' (=delta) for conversion of the
1192 counter values into the index along the constructor. */
1193 mpz_set (delta[d], delta_mpz);
1194 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1195 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1196 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1197 }
1198
1199 mpz_init (index);
1200 mpz_init (ptr);
1201 cons = base;
1202
1203 /* Now clock through the array reference, calculating the index in
1204 the source constructor and transferring the elements to the new
1205 constructor. */
1206 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1207 {
1208 if (ref->u.ar.offset)
1209 mpz_set (ptr, ref->u.ar.offset->value.integer);
1210 else
1211 mpz_init_set_ui (ptr, 0);
1212
1213 incr_ctr = true;
1214 for (d = 0; d < rank; d++)
1215 {
1216 mpz_set (tmp_mpz, ctr[d]);
1217 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1218 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1219 mpz_add (ptr, ptr, tmp_mpz);
1220
1221 if (!incr_ctr) continue;
1222
1223 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1224 {
1225 gcc_assert(vecsub[d]);
1226
1227 if (!vecsub[d]->next)
1228 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1229 else
1230 {
1231 vecsub[d] = vecsub[d]->next;
1232 incr_ctr = false;
1233 }
1234 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1235 }
1236 else
1237 {
1238 mpz_add (ctr[d], ctr[d], stride[d]);
1239
1240 if (mpz_cmp_ui (stride[d], 0) > 0
1241 ? mpz_cmp (ctr[d], end[d]) > 0
1242 : mpz_cmp (ctr[d], end[d]) < 0)
1243 mpz_set (ctr[d], start[d]);
1244 else
1245 incr_ctr = false;
1246 }
1247 }
1248
1249 /* There must be a better way of dealing with negative strides
1250 than resetting the index and the constructor pointer! */
1251 if (mpz_cmp (ptr, index) < 0)
1252 {
1253 mpz_set_ui (index, 0);
1254 cons = base;
1255 }
1256
1257 while (mpz_cmp (ptr, index) > 0)
1258 {
1259 mpz_add_ui (index, index, one);
1260 cons = cons->next;
1261 }
1262
1263 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1264 }
1265
1266 mpz_clear (ptr);
1267 mpz_clear (index);
1268
1269 cleanup:
1270
1271 mpz_clear (delta_mpz);
1272 mpz_clear (tmp_mpz);
1273 mpz_clear (nelts);
1274 for (d = 0; d < rank; d++)
1275 {
1276 mpz_clear (delta[d]);
1277 mpz_clear (start[d]);
1278 mpz_clear (end[d]);
1279 mpz_clear (ctr[d]);
1280 mpz_clear (stride[d]);
1281 }
1282 gfc_free_constructor (base);
1283 return t;
1284 }
1285
1286 /* Pull a substring out of an expression. */
1287
1288 static try
1289 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1290 {
1291 int end;
1292 int start;
1293 char *chr;
1294
1295 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1296 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1297 return FAILURE;
1298
1299 *newp = gfc_copy_expr (p);
1300 chr = p->value.character.string;
1301 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1302 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1303
1304 (*newp)->value.character.length = end - start + 1;
1305 strncpy ((*newp)->value.character.string, &chr[start - 1],
1306 (*newp)->value.character.length);
1307 return SUCCESS;
1308 }
1309
1310
1311
1312 /* Simplify a subobject reference of a constructor. This occurs when
1313 parameter variable values are substituted. */
1314
1315 static try
1316 simplify_const_ref (gfc_expr *p)
1317 {
1318 gfc_constructor *cons;
1319 gfc_expr *newp;
1320
1321 while (p->ref)
1322 {
1323 switch (p->ref->type)
1324 {
1325 case REF_ARRAY:
1326 switch (p->ref->u.ar.type)
1327 {
1328 case AR_ELEMENT:
1329 if (find_array_element (p->value.constructor, &p->ref->u.ar,
1330 &cons) == FAILURE)
1331 return FAILURE;
1332
1333 if (!cons)
1334 return SUCCESS;
1335
1336 remove_subobject_ref (p, cons);
1337 break;
1338
1339 case AR_SECTION:
1340 if (find_array_section (p, p->ref) == FAILURE)
1341 return FAILURE;
1342 p->ref->u.ar.type = AR_FULL;
1343
1344 /* Fall through. */
1345
1346 case AR_FULL:
1347 if (p->ref->next != NULL
1348 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1349 {
1350 cons = p->value.constructor;
1351 for (; cons; cons = cons->next)
1352 {
1353 cons->expr->ref = copy_ref (p->ref->next);
1354 simplify_const_ref (cons->expr);
1355 }
1356 }
1357 gfc_free_ref_list (p->ref);
1358 p->ref = NULL;
1359 break;
1360
1361 default:
1362 return SUCCESS;
1363 }
1364
1365 break;
1366
1367 case REF_COMPONENT:
1368 cons = find_component_ref (p->value.constructor, p->ref);
1369 remove_subobject_ref (p, cons);
1370 break;
1371
1372 case REF_SUBSTRING:
1373 if (find_substring_ref (p, &newp) == FAILURE)
1374 return FAILURE;
1375
1376 gfc_replace_expr (p, newp);
1377 gfc_free_ref_list (p->ref);
1378 p->ref = NULL;
1379 break;
1380 }
1381 }
1382
1383 return SUCCESS;
1384 }
1385
1386
1387 /* Simplify a chain of references. */
1388
1389 static try
1390 simplify_ref_chain (gfc_ref *ref, int type)
1391 {
1392 int n;
1393
1394 for (; ref; ref = ref->next)
1395 {
1396 switch (ref->type)
1397 {
1398 case REF_ARRAY:
1399 for (n = 0; n < ref->u.ar.dimen; n++)
1400 {
1401 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1402 return FAILURE;
1403 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1404 return FAILURE;
1405 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1406 return FAILURE;
1407 }
1408 break;
1409
1410 case REF_SUBSTRING:
1411 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1412 return FAILURE;
1413 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1414 return FAILURE;
1415 break;
1416
1417 default:
1418 break;
1419 }
1420 }
1421 return SUCCESS;
1422 }
1423
1424
1425 /* Try to substitute the value of a parameter variable. */
1426
1427 static try
1428 simplify_parameter_variable (gfc_expr *p, int type)
1429 {
1430 gfc_expr *e;
1431 try t;
1432
1433 e = gfc_copy_expr (p->symtree->n.sym->value);
1434 if (e == NULL)
1435 return FAILURE;
1436
1437 e->rank = p->rank;
1438
1439 /* Do not copy subobject refs for constant. */
1440 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1441 e->ref = copy_ref (p->ref);
1442 t = gfc_simplify_expr (e, type);
1443
1444 /* Only use the simplification if it eliminated all subobject references. */
1445 if (t == SUCCESS && !e->ref)
1446 gfc_replace_expr (p, e);
1447 else
1448 gfc_free_expr (e);
1449
1450 return t;
1451 }
1452
1453 /* Given an expression, simplify it by collapsing constant
1454 expressions. Most simplification takes place when the expression
1455 tree is being constructed. If an intrinsic function is simplified
1456 at some point, we get called again to collapse the result against
1457 other constants.
1458
1459 We work by recursively simplifying expression nodes, simplifying
1460 intrinsic functions where possible, which can lead to further
1461 constant collapsing. If an operator has constant operand(s), we
1462 rip the expression apart, and rebuild it, hoping that it becomes
1463 something simpler.
1464
1465 The expression type is defined for:
1466 0 Basic expression parsing
1467 1 Simplifying array constructors -- will substitute
1468 iterator values.
1469 Returns FAILURE on error, SUCCESS otherwise.
1470 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1471
1472 try
1473 gfc_simplify_expr (gfc_expr *p, int type)
1474 {
1475 gfc_actual_arglist *ap;
1476
1477 if (p == NULL)
1478 return SUCCESS;
1479
1480 switch (p->expr_type)
1481 {
1482 case EXPR_CONSTANT:
1483 case EXPR_NULL:
1484 break;
1485
1486 case EXPR_FUNCTION:
1487 for (ap = p->value.function.actual; ap; ap = ap->next)
1488 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1489 return FAILURE;
1490
1491 if (p->value.function.isym != NULL
1492 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1493 return FAILURE;
1494
1495 break;
1496
1497 case EXPR_SUBSTRING:
1498 if (simplify_ref_chain (p->ref, type) == FAILURE)
1499 return FAILURE;
1500
1501 if (gfc_is_constant_expr (p))
1502 {
1503 char *s;
1504 int start, end;
1505
1506 gfc_extract_int (p->ref->u.ss.start, &start);
1507 start--; /* Convert from one-based to zero-based. */
1508 gfc_extract_int (p->ref->u.ss.end, &end);
1509 s = gfc_getmem (end - start + 2);
1510 memcpy (s, p->value.character.string + start, end - start);
1511 s[end - start + 1] = '\0'; /* TODO: C-style string. */
1512 gfc_free (p->value.character.string);
1513 p->value.character.string = s;
1514 p->value.character.length = end - start;
1515 p->ts.cl = gfc_get_charlen ();
1516 p->ts.cl->next = gfc_current_ns->cl_list;
1517 gfc_current_ns->cl_list = p->ts.cl;
1518 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1519 gfc_free_ref_list (p->ref);
1520 p->ref = NULL;
1521 p->expr_type = EXPR_CONSTANT;
1522 }
1523 break;
1524
1525 case EXPR_OP:
1526 if (simplify_intrinsic_op (p, type) == FAILURE)
1527 return FAILURE;
1528 break;
1529
1530 case EXPR_VARIABLE:
1531 /* Only substitute array parameter variables if we are in an
1532 initialization expression, or we want a subsection. */
1533 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1534 && (gfc_init_expr || p->ref
1535 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1536 {
1537 if (simplify_parameter_variable (p, type) == FAILURE)
1538 return FAILURE;
1539 break;
1540 }
1541
1542 if (type == 1)
1543 {
1544 gfc_simplify_iterator_var (p);
1545 }
1546
1547 /* Simplify subcomponent references. */
1548 if (simplify_ref_chain (p->ref, type) == FAILURE)
1549 return FAILURE;
1550
1551 break;
1552
1553 case EXPR_STRUCTURE:
1554 case EXPR_ARRAY:
1555 if (simplify_ref_chain (p->ref, type) == FAILURE)
1556 return FAILURE;
1557
1558 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1559 return FAILURE;
1560
1561 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1562 && p->ref->u.ar.type == AR_FULL)
1563 gfc_expand_constructor (p);
1564
1565 if (simplify_const_ref (p) == FAILURE)
1566 return FAILURE;
1567
1568 break;
1569 }
1570
1571 return SUCCESS;
1572 }
1573
1574
1575 /* Returns the type of an expression with the exception that iterator
1576 variables are automatically integers no matter what else they may
1577 be declared as. */
1578
1579 static bt
1580 et0 (gfc_expr *e)
1581 {
1582 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1583 return BT_INTEGER;
1584
1585 return e->ts.type;
1586 }
1587
1588
1589 /* Check an intrinsic arithmetic operation to see if it is consistent
1590 with some type of expression. */
1591
1592 static try check_init_expr (gfc_expr *);
1593
1594
1595 /* Scalarize an expression for an elemental intrinsic call. */
1596
1597 static try
1598 scalarize_intrinsic_call (gfc_expr *e)
1599 {
1600 gfc_actual_arglist *a, *b;
1601 gfc_constructor *args[5], *ctor, *new_ctor;
1602 gfc_expr *expr, *old;
1603 int n, i, rank[5];
1604
1605 old = gfc_copy_expr (e);
1606
1607 /* Assume that the old expression carries the type information and
1608 that the first arg carries all the shape information. */
1609 expr = gfc_copy_expr (old->value.function.actual->expr);
1610 gfc_free_constructor (expr->value.constructor);
1611 expr->value.constructor = NULL;
1612
1613 expr->ts = old->ts;
1614 expr->expr_type = EXPR_ARRAY;
1615
1616 /* Copy the array argument constructors into an array, with nulls
1617 for the scalars. */
1618 n = 0;
1619 a = old->value.function.actual;
1620 for (; a; a = a->next)
1621 {
1622 /* Check that this is OK for an initialization expression. */
1623 if (a->expr && check_init_expr (a->expr) == FAILURE)
1624 goto cleanup;
1625
1626 rank[n] = 0;
1627 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1628 {
1629 rank[n] = a->expr->rank;
1630 ctor = a->expr->symtree->n.sym->value->value.constructor;
1631 args[n] = gfc_copy_constructor (ctor);
1632 }
1633 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1634 {
1635 if (a->expr->rank)
1636 rank[n] = a->expr->rank;
1637 else
1638 rank[n] = 1;
1639 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1640 }
1641 else
1642 args[n] = NULL;
1643 n++;
1644 }
1645
1646 for (i = 1; i < n; i++)
1647 if (rank[i] && rank[i] != rank[0])
1648 goto compliance;
1649
1650 /* Using the first argument as the master, step through the array
1651 calling the function for each element and advancing the array
1652 constructors together. */
1653 ctor = args[0];
1654 new_ctor = NULL;
1655 for (; ctor; ctor = ctor->next)
1656 {
1657 if (expr->value.constructor == NULL)
1658 expr->value.constructor
1659 = new_ctor = gfc_get_constructor ();
1660 else
1661 {
1662 new_ctor->next = gfc_get_constructor ();
1663 new_ctor = new_ctor->next;
1664 }
1665 new_ctor->expr = gfc_copy_expr (old);
1666 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1667 a = NULL;
1668 b = old->value.function.actual;
1669 for (i = 0; i < n; i++)
1670 {
1671 if (a == NULL)
1672 new_ctor->expr->value.function.actual
1673 = a = gfc_get_actual_arglist ();
1674 else
1675 {
1676 a->next = gfc_get_actual_arglist ();
1677 a = a->next;
1678 }
1679 if (args[i])
1680 a->expr = gfc_copy_expr (args[i]->expr);
1681 else
1682 a->expr = gfc_copy_expr (b->expr);
1683
1684 b = b->next;
1685 }
1686
1687 /* Simplify the function calls. */
1688 if (gfc_simplify_expr (new_ctor->expr, 0) == FAILURE)
1689 goto cleanup;
1690
1691 for (i = 0; i < n; i++)
1692 if (args[i])
1693 args[i] = args[i]->next;
1694
1695 for (i = 1; i < n; i++)
1696 if (rank[i] && ((args[i] != NULL && args[0] == NULL)
1697 || (args[i] == NULL && args[0] != NULL)))
1698 goto compliance;
1699 }
1700
1701 free_expr0 (e);
1702 *e = *expr;
1703 gfc_free_expr (old);
1704 return SUCCESS;
1705
1706 compliance:
1707 gfc_error_now ("elemental function arguments at %C are not compliant");
1708
1709 cleanup:
1710 gfc_free_expr (expr);
1711 gfc_free_expr (old);
1712 return FAILURE;
1713 }
1714
1715
1716 static try
1717 check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
1718 {
1719 gfc_expr *op1 = e->value.op.op1;
1720 gfc_expr *op2 = e->value.op.op2;
1721
1722 if ((*check_function) (op1) == FAILURE)
1723 return FAILURE;
1724
1725 switch (e->value.op.operator)
1726 {
1727 case INTRINSIC_UPLUS:
1728 case INTRINSIC_UMINUS:
1729 if (!numeric_type (et0 (op1)))
1730 goto not_numeric;
1731 break;
1732
1733 case INTRINSIC_EQ:
1734 case INTRINSIC_NE:
1735 case INTRINSIC_GT:
1736 case INTRINSIC_GE:
1737 case INTRINSIC_LT:
1738 case INTRINSIC_LE:
1739 if ((*check_function) (op2) == FAILURE)
1740 return FAILURE;
1741
1742 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1743 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1744 {
1745 gfc_error ("Numeric or CHARACTER operands are required in "
1746 "expression at %L", &e->where);
1747 return FAILURE;
1748 }
1749 break;
1750
1751 case INTRINSIC_PLUS:
1752 case INTRINSIC_MINUS:
1753 case INTRINSIC_TIMES:
1754 case INTRINSIC_DIVIDE:
1755 case INTRINSIC_POWER:
1756 if ((*check_function) (op2) == FAILURE)
1757 return FAILURE;
1758
1759 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1760 goto not_numeric;
1761
1762 if (e->value.op.operator == INTRINSIC_POWER
1763 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1764 {
1765 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1766 "exponent in an initialization "
1767 "expression at %L", &op2->where)
1768 == FAILURE)
1769 return FAILURE;
1770 }
1771
1772 break;
1773
1774 case INTRINSIC_CONCAT:
1775 if ((*check_function) (op2) == FAILURE)
1776 return FAILURE;
1777
1778 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1779 {
1780 gfc_error ("Concatenation operator in expression at %L "
1781 "must have two CHARACTER operands", &op1->where);
1782 return FAILURE;
1783 }
1784
1785 if (op1->ts.kind != op2->ts.kind)
1786 {
1787 gfc_error ("Concat operator at %L must concatenate strings of the "
1788 "same kind", &e->where);
1789 return FAILURE;
1790 }
1791
1792 break;
1793
1794 case INTRINSIC_NOT:
1795 if (et0 (op1) != BT_LOGICAL)
1796 {
1797 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1798 "operand", &op1->where);
1799 return FAILURE;
1800 }
1801
1802 break;
1803
1804 case INTRINSIC_AND:
1805 case INTRINSIC_OR:
1806 case INTRINSIC_EQV:
1807 case INTRINSIC_NEQV:
1808 if ((*check_function) (op2) == FAILURE)
1809 return FAILURE;
1810
1811 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1812 {
1813 gfc_error ("LOGICAL operands are required in expression at %L",
1814 &e->where);
1815 return FAILURE;
1816 }
1817
1818 break;
1819
1820 case INTRINSIC_PARENTHESES:
1821 break;
1822
1823 default:
1824 gfc_error ("Only intrinsic operators can be used in expression at %L",
1825 &e->where);
1826 return FAILURE;
1827 }
1828
1829 return SUCCESS;
1830
1831 not_numeric:
1832 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1833
1834 return FAILURE;
1835 }
1836
1837
1838
1839 /* Certain inquiry functions are specifically allowed to have variable
1840 arguments, which is an exception to the normal requirement that an
1841 initialization function have initialization arguments. We head off
1842 this problem here. */
1843
1844 static try
1845 check_inquiry (gfc_expr *e, int not_restricted)
1846 {
1847 const char *name;
1848
1849 /* FIXME: This should be moved into the intrinsic definitions,
1850 to eliminate this ugly hack. */
1851 static const char * const inquiry_function[] = {
1852 "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1853 "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1854 "lbound", "ubound", NULL
1855 };
1856
1857 int i;
1858
1859 /* An undeclared parameter will get us here (PR25018). */
1860 if (e->symtree == NULL)
1861 return FAILURE;
1862
1863 name = e->symtree->n.sym->name;
1864
1865 for (i = 0; inquiry_function[i]; i++)
1866 if (strcmp (inquiry_function[i], name) == 0)
1867 break;
1868
1869 if (inquiry_function[i] == NULL)
1870 return FAILURE;
1871
1872 e = e->value.function.actual->expr;
1873
1874 if (e == NULL || e->expr_type != EXPR_VARIABLE)
1875 return FAILURE;
1876
1877 /* At this point we have an inquiry function with a variable argument. The
1878 type of the variable might be undefined, but we need it now, because the
1879 arguments of these functions are allowed to be undefined. */
1880
1881 if (e->ts.type == BT_UNKNOWN)
1882 {
1883 if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1884 && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1885 == FAILURE)
1886 return FAILURE;
1887
1888 e->ts = e->symtree->n.sym->ts;
1889 }
1890
1891 /* Assumed character length will not reduce to a constant expression
1892 with LEN, as required by the standard. */
1893 if (i == 4 && not_restricted
1894 && e->symtree->n.sym->ts.type == BT_CHARACTER
1895 && e->symtree->n.sym->ts.cl->length == NULL)
1896 gfc_notify_std (GFC_STD_GNU, "assumed character length "
1897 "variable '%s' in constant expression at %L",
1898 e->symtree->n.sym->name, &e->where);
1899
1900 return SUCCESS;
1901 }
1902
1903
1904 /* Verify that an expression is an initialization expression. A side
1905 effect is that the expression tree is reduced to a single constant
1906 node if all goes well. This would normally happen when the
1907 expression is constructed but function references are assumed to be
1908 intrinsics in the context of initialization expressions. If
1909 FAILURE is returned an error message has been generated. */
1910
1911 static try
1912 check_init_expr (gfc_expr *e)
1913 {
1914 gfc_actual_arglist *ap;
1915 match m;
1916 try t;
1917 gfc_intrinsic_sym *isym;
1918
1919 if (e == NULL)
1920 return SUCCESS;
1921
1922 switch (e->expr_type)
1923 {
1924 case EXPR_OP:
1925 t = check_intrinsic_op (e, check_init_expr);
1926 if (t == SUCCESS)
1927 t = gfc_simplify_expr (e, 0);
1928
1929 break;
1930
1931 case EXPR_FUNCTION:
1932 t = SUCCESS;
1933
1934 if (check_inquiry (e, 1) != SUCCESS)
1935 {
1936 t = SUCCESS;
1937 for (ap = e->value.function.actual; ap; ap = ap->next)
1938 if (check_init_expr (ap->expr) == FAILURE)
1939 {
1940 t = FAILURE;
1941 break;
1942 }
1943 }
1944
1945 /* Try to scalarize an elemental intrinsic function that has an
1946 array argument. */
1947 isym = gfc_find_function (e->symtree->n.sym->name);
1948 if (isym && isym->elemental
1949 && e->value.function.actual->expr->expr_type == EXPR_ARRAY)
1950 {
1951 if (scalarize_intrinsic_call (e) == SUCCESS)
1952 break;
1953 }
1954
1955 if (t == SUCCESS)
1956 {
1957 m = gfc_intrinsic_func_interface (e, 0);
1958
1959 if (m == MATCH_NO)
1960 gfc_error ("Function '%s' in initialization expression at %L "
1961 "must be an intrinsic function",
1962 e->symtree->n.sym->name, &e->where);
1963
1964 if (m != MATCH_YES)
1965 t = FAILURE;
1966 }
1967
1968 break;
1969
1970 case EXPR_VARIABLE:
1971 t = SUCCESS;
1972
1973 if (gfc_check_iter_variable (e) == SUCCESS)
1974 break;
1975
1976 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1977 {
1978 t = simplify_parameter_variable (e, 0);
1979 break;
1980 }
1981
1982 if (gfc_in_match_data ())
1983 break;
1984
1985 gfc_error ("Parameter '%s' at %L has not been declared or is "
1986 "a variable, which does not reduce to a constant "
1987 "expression", e->symtree->n.sym->name, &e->where);
1988 t = FAILURE;
1989 break;
1990
1991 case EXPR_CONSTANT:
1992 case EXPR_NULL:
1993 t = SUCCESS;
1994 break;
1995
1996 case EXPR_SUBSTRING:
1997 t = check_init_expr (e->ref->u.ss.start);
1998 if (t == FAILURE)
1999 break;
2000
2001 t = check_init_expr (e->ref->u.ss.end);
2002 if (t == SUCCESS)
2003 t = gfc_simplify_expr (e, 0);
2004
2005 break;
2006
2007 case EXPR_STRUCTURE:
2008 t = gfc_check_constructor (e, check_init_expr);
2009 break;
2010
2011 case EXPR_ARRAY:
2012 t = gfc_check_constructor (e, check_init_expr);
2013 if (t == FAILURE)
2014 break;
2015
2016 t = gfc_expand_constructor (e);
2017 if (t == FAILURE)
2018 break;
2019
2020 t = gfc_check_constructor_type (e);
2021 break;
2022
2023 default:
2024 gfc_internal_error ("check_init_expr(): Unknown expression type");
2025 }
2026
2027 return t;
2028 }
2029
2030
2031 /* Match an initialization expression. We work by first matching an
2032 expression, then reducing it to a constant. */
2033
2034 match
2035 gfc_match_init_expr (gfc_expr **result)
2036 {
2037 gfc_expr *expr;
2038 match m;
2039 try t;
2040
2041 m = gfc_match_expr (&expr);
2042 if (m != MATCH_YES)
2043 return m;
2044
2045 gfc_init_expr = 1;
2046 t = gfc_resolve_expr (expr);
2047 if (t == SUCCESS)
2048 t = check_init_expr (expr);
2049 gfc_init_expr = 0;
2050
2051 if (t == FAILURE)
2052 {
2053 gfc_free_expr (expr);
2054 return MATCH_ERROR;
2055 }
2056
2057 if (expr->expr_type == EXPR_ARRAY
2058 && (gfc_check_constructor_type (expr) == FAILURE
2059 || gfc_expand_constructor (expr) == FAILURE))
2060 {
2061 gfc_free_expr (expr);
2062 return MATCH_ERROR;
2063 }
2064
2065 /* Not all inquiry functions are simplified to constant expressions
2066 so it is necessary to call check_inquiry again. */
2067 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) == FAILURE
2068 && !gfc_in_match_data ())
2069 {
2070 gfc_error ("Initialization expression didn't reduce %C");
2071 return MATCH_ERROR;
2072 }
2073
2074 *result = expr;
2075
2076 return MATCH_YES;
2077 }
2078
2079
2080 static try check_restricted (gfc_expr *);
2081
2082 /* Given an actual argument list, test to see that each argument is a
2083 restricted expression and optionally if the expression type is
2084 integer or character. */
2085
2086 static try
2087 restricted_args (gfc_actual_arglist *a)
2088 {
2089 for (; a; a = a->next)
2090 {
2091 if (check_restricted (a->expr) == FAILURE)
2092 return FAILURE;
2093 }
2094
2095 return SUCCESS;
2096 }
2097
2098
2099 /************* Restricted/specification expressions *************/
2100
2101
2102 /* Make sure a non-intrinsic function is a specification function. */
2103
2104 static try
2105 external_spec_function (gfc_expr *e)
2106 {
2107 gfc_symbol *f;
2108
2109 f = e->value.function.esym;
2110
2111 if (f->attr.proc == PROC_ST_FUNCTION)
2112 {
2113 gfc_error ("Specification function '%s' at %L cannot be a statement "
2114 "function", f->name, &e->where);
2115 return FAILURE;
2116 }
2117
2118 if (f->attr.proc == PROC_INTERNAL)
2119 {
2120 gfc_error ("Specification function '%s' at %L cannot be an internal "
2121 "function", f->name, &e->where);
2122 return FAILURE;
2123 }
2124
2125 if (!f->attr.pure && !f->attr.elemental)
2126 {
2127 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2128 &e->where);
2129 return FAILURE;
2130 }
2131
2132 if (f->attr.recursive)
2133 {
2134 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2135 f->name, &e->where);
2136 return FAILURE;
2137 }
2138
2139 return restricted_args (e->value.function.actual);
2140 }
2141
2142
2143 /* Check to see that a function reference to an intrinsic is a
2144 restricted expression. */
2145
2146 static try
2147 restricted_intrinsic (gfc_expr *e)
2148 {
2149 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2150 if (check_inquiry (e, 0) == SUCCESS)
2151 return SUCCESS;
2152
2153 return restricted_args (e->value.function.actual);
2154 }
2155
2156
2157 /* Verify that an expression is a restricted expression. Like its
2158 cousin check_init_expr(), an error message is generated if we
2159 return FAILURE. */
2160
2161 static try
2162 check_restricted (gfc_expr *e)
2163 {
2164 gfc_symbol *sym;
2165 try t;
2166
2167 if (e == NULL)
2168 return SUCCESS;
2169
2170 switch (e->expr_type)
2171 {
2172 case EXPR_OP:
2173 t = check_intrinsic_op (e, check_restricted);
2174 if (t == SUCCESS)
2175 t = gfc_simplify_expr (e, 0);
2176
2177 break;
2178
2179 case EXPR_FUNCTION:
2180 t = e->value.function.esym ? external_spec_function (e)
2181 : restricted_intrinsic (e);
2182 break;
2183
2184 case EXPR_VARIABLE:
2185 sym = e->symtree->n.sym;
2186 t = FAILURE;
2187
2188 if (sym->attr.optional)
2189 {
2190 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2191 sym->name, &e->where);
2192 break;
2193 }
2194
2195 if (sym->attr.intent == INTENT_OUT)
2196 {
2197 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2198 sym->name, &e->where);
2199 break;
2200 }
2201
2202 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2203 processed in resolve.c(resolve_formal_arglist). This is done so
2204 that host associated dummy array indices are accepted (PR23446).
2205 This mechanism also does the same for the specification expressions
2206 of array-valued functions. */
2207 if (sym->attr.in_common
2208 || sym->attr.use_assoc
2209 || sym->attr.dummy
2210 || sym->ns != gfc_current_ns
2211 || (sym->ns->proc_name != NULL
2212 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2213 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2214 {
2215 t = SUCCESS;
2216 break;
2217 }
2218
2219 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2220 sym->name, &e->where);
2221
2222 break;
2223
2224 case EXPR_NULL:
2225 case EXPR_CONSTANT:
2226 t = SUCCESS;
2227 break;
2228
2229 case EXPR_SUBSTRING:
2230 t = gfc_specification_expr (e->ref->u.ss.start);
2231 if (t == FAILURE)
2232 break;
2233
2234 t = gfc_specification_expr (e->ref->u.ss.end);
2235 if (t == SUCCESS)
2236 t = gfc_simplify_expr (e, 0);
2237
2238 break;
2239
2240 case EXPR_STRUCTURE:
2241 t = gfc_check_constructor (e, check_restricted);
2242 break;
2243
2244 case EXPR_ARRAY:
2245 t = gfc_check_constructor (e, check_restricted);
2246 break;
2247
2248 default:
2249 gfc_internal_error ("check_restricted(): Unknown expression type");
2250 }
2251
2252 return t;
2253 }
2254
2255
2256 /* Check to see that an expression is a specification expression. If
2257 we return FAILURE, an error has been generated. */
2258
2259 try
2260 gfc_specification_expr (gfc_expr *e)
2261 {
2262
2263 if (e == NULL)
2264 return SUCCESS;
2265
2266 if (e->ts.type != BT_INTEGER)
2267 {
2268 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2269 return FAILURE;
2270 }
2271
2272 if (e->rank != 0)
2273 {
2274 gfc_error ("Expression at %L must be scalar", &e->where);
2275 return FAILURE;
2276 }
2277
2278 if (gfc_simplify_expr (e, 0) == FAILURE)
2279 return FAILURE;
2280
2281 return check_restricted (e);
2282 }
2283
2284
2285 /************** Expression conformance checks. *************/
2286
2287 /* Given two expressions, make sure that the arrays are conformable. */
2288
2289 try
2290 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2291 {
2292 int op1_flag, op2_flag, d;
2293 mpz_t op1_size, op2_size;
2294 try t;
2295
2296 if (op1->rank == 0 || op2->rank == 0)
2297 return SUCCESS;
2298
2299 if (op1->rank != op2->rank)
2300 {
2301 gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2302 &op1->where);
2303 return FAILURE;
2304 }
2305
2306 t = SUCCESS;
2307
2308 for (d = 0; d < op1->rank; d++)
2309 {
2310 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2311 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2312
2313 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2314 {
2315 gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2316 _(optype_msgid), &op1->where, d + 1,
2317 (int) mpz_get_si (op1_size),
2318 (int) mpz_get_si (op2_size));
2319
2320 t = FAILURE;
2321 }
2322
2323 if (op1_flag)
2324 mpz_clear (op1_size);
2325 if (op2_flag)
2326 mpz_clear (op2_size);
2327
2328 if (t == FAILURE)
2329 return FAILURE;
2330 }
2331
2332 return SUCCESS;
2333 }
2334
2335
2336 /* Given an assignable expression and an arbitrary expression, make
2337 sure that the assignment can take place. */
2338
2339 try
2340 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2341 {
2342 gfc_symbol *sym;
2343 gfc_ref *ref;
2344 int has_pointer;
2345
2346 sym = lvalue->symtree->n.sym;
2347
2348 /* Check INTENT(IN), unless the object itself is the component or
2349 sub-component of a pointer. */
2350 has_pointer = sym->attr.pointer;
2351
2352 for (ref = lvalue->ref; ref; ref = ref->next)
2353 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2354 {
2355 has_pointer = 1;
2356 break;
2357 }
2358
2359 if (!has_pointer && sym->attr.intent == INTENT_IN)
2360 {
2361 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2362 sym->name, &lvalue->where);
2363 return FAILURE;
2364 }
2365
2366 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2367 variable local to a function subprogram. Its existence begins when
2368 execution of the function is initiated and ends when execution of the
2369 function is terminated...
2370 Therefore, the left hand side is no longer a variable, when it is: */
2371 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2372 && !sym->attr.external)
2373 {
2374 bool bad_proc;
2375 bad_proc = false;
2376
2377 /* (i) Use associated; */
2378 if (sym->attr.use_assoc)
2379 bad_proc = true;
2380
2381 /* (ii) The assignment is in the main program; or */
2382 if (gfc_current_ns->proc_name->attr.is_main_program)
2383 bad_proc = true;
2384
2385 /* (iii) A module or internal procedure... */
2386 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2387 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2388 && gfc_current_ns->parent
2389 && (!(gfc_current_ns->parent->proc_name->attr.function
2390 || gfc_current_ns->parent->proc_name->attr.subroutine)
2391 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2392 {
2393 /* ... that is not a function... */
2394 if (!gfc_current_ns->proc_name->attr.function)
2395 bad_proc = true;
2396
2397 /* ... or is not an entry and has a different name. */
2398 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2399 bad_proc = true;
2400 }
2401
2402 if (bad_proc)
2403 {
2404 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2405 return FAILURE;
2406 }
2407 }
2408
2409 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2410 {
2411 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2412 lvalue->rank, rvalue->rank, &lvalue->where);
2413 return FAILURE;
2414 }
2415
2416 if (lvalue->ts.type == BT_UNKNOWN)
2417 {
2418 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2419 &lvalue->where);
2420 return FAILURE;
2421 }
2422
2423 if (rvalue->expr_type == EXPR_NULL)
2424 {
2425 if (lvalue->symtree->n.sym->attr.pointer
2426 && lvalue->symtree->n.sym->attr.data)
2427 return SUCCESS;
2428 else
2429 {
2430 gfc_error ("NULL appears on right-hand side in assignment at %L",
2431 &rvalue->where);
2432 return FAILURE;
2433 }
2434 }
2435
2436 if (sym->attr.cray_pointee
2437 && lvalue->ref != NULL
2438 && lvalue->ref->u.ar.type == AR_FULL
2439 && lvalue->ref->u.ar.as->cp_was_assumed)
2440 {
2441 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2442 "is illegal", &lvalue->where);
2443 return FAILURE;
2444 }
2445
2446 /* This is possibly a typo: x = f() instead of x => f(). */
2447 if (gfc_option.warn_surprising
2448 && rvalue->expr_type == EXPR_FUNCTION
2449 && rvalue->symtree->n.sym->attr.pointer)
2450 gfc_warning ("POINTER valued function appears on right-hand side of "
2451 "assignment at %L", &rvalue->where);
2452
2453 /* Check size of array assignments. */
2454 if (lvalue->rank != 0 && rvalue->rank != 0
2455 && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2456 return FAILURE;
2457
2458 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2459 return SUCCESS;
2460
2461 if (!conform)
2462 {
2463 /* Numeric can be converted to any other numeric. And Hollerith can be
2464 converted to any other type. */
2465 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2466 || rvalue->ts.type == BT_HOLLERITH)
2467 return SUCCESS;
2468
2469 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2470 return SUCCESS;
2471
2472 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2473 &rvalue->where, gfc_typename (&rvalue->ts),
2474 gfc_typename (&lvalue->ts));
2475
2476 return FAILURE;
2477 }
2478
2479 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2480 }
2481
2482
2483 /* Check that a pointer assignment is OK. We first check lvalue, and
2484 we only check rvalue if it's not an assignment to NULL() or a
2485 NULLIFY statement. */
2486
2487 try
2488 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2489 {
2490 symbol_attribute attr;
2491 gfc_ref *ref;
2492 int is_pure;
2493 int pointer, check_intent_in;
2494
2495 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2496 {
2497 gfc_error ("Pointer assignment target is not a POINTER at %L",
2498 &lvalue->where);
2499 return FAILURE;
2500 }
2501
2502 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2503 && lvalue->symtree->n.sym->attr.use_assoc)
2504 {
2505 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2506 "l-value since it is a procedure",
2507 lvalue->symtree->n.sym->name, &lvalue->where);
2508 return FAILURE;
2509 }
2510
2511
2512 /* Check INTENT(IN), unless the object itself is the component or
2513 sub-component of a pointer. */
2514 check_intent_in = 1;
2515 pointer = lvalue->symtree->n.sym->attr.pointer;
2516
2517 for (ref = lvalue->ref; ref; ref = ref->next)
2518 {
2519 if (pointer)
2520 check_intent_in = 0;
2521
2522 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2523 pointer = 1;
2524 }
2525
2526 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2527 {
2528 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2529 lvalue->symtree->n.sym->name, &lvalue->where);
2530 return FAILURE;
2531 }
2532
2533 if (!pointer)
2534 {
2535 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2536 return FAILURE;
2537 }
2538
2539 is_pure = gfc_pure (NULL);
2540
2541 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2542 {
2543 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2544 return FAILURE;
2545 }
2546
2547 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2548 kind, etc for lvalue and rvalue must match, and rvalue must be a
2549 pure variable if we're in a pure function. */
2550 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2551 return SUCCESS;
2552
2553 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2554 {
2555 gfc_error ("Different types in pointer assignment at %L",
2556 &lvalue->where);
2557 return FAILURE;
2558 }
2559
2560 if (lvalue->ts.kind != rvalue->ts.kind)
2561 {
2562 gfc_error ("Different kind type parameters in pointer "
2563 "assignment at %L", &lvalue->where);
2564 return FAILURE;
2565 }
2566
2567 if (lvalue->rank != rvalue->rank)
2568 {
2569 gfc_error ("Different ranks in pointer assignment at %L",
2570 &lvalue->where);
2571 return FAILURE;
2572 }
2573
2574 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2575 if (rvalue->expr_type == EXPR_NULL)
2576 return SUCCESS;
2577
2578 if (lvalue->ts.type == BT_CHARACTER
2579 && lvalue->ts.cl && rvalue->ts.cl
2580 && lvalue->ts.cl->length && rvalue->ts.cl->length
2581 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2582 rvalue->ts.cl->length)) == 1)
2583 {
2584 gfc_error ("Different character lengths in pointer "
2585 "assignment at %L", &lvalue->where);
2586 return FAILURE;
2587 }
2588
2589 attr = gfc_expr_attr (rvalue);
2590 if (!attr.target && !attr.pointer)
2591 {
2592 gfc_error ("Pointer assignment target is neither TARGET "
2593 "nor POINTER at %L", &rvalue->where);
2594 return FAILURE;
2595 }
2596
2597 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2598 {
2599 gfc_error ("Bad target in pointer assignment in PURE "
2600 "procedure at %L", &rvalue->where);
2601 }
2602
2603 if (gfc_has_vector_index (rvalue))
2604 {
2605 gfc_error ("Pointer assignment with vector subscript "
2606 "on rhs at %L", &rvalue->where);
2607 return FAILURE;
2608 }
2609
2610 if (attr.protected && attr.use_assoc)
2611 {
2612 gfc_error ("Pointer assigment target has PROTECTED "
2613 "attribute at %L", &rvalue->where);
2614 return FAILURE;
2615 }
2616
2617 return SUCCESS;
2618 }
2619
2620
2621 /* Relative of gfc_check_assign() except that the lvalue is a single
2622 symbol. Used for initialization assignments. */
2623
2624 try
2625 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2626 {
2627 gfc_expr lvalue;
2628 try r;
2629
2630 memset (&lvalue, '\0', sizeof (gfc_expr));
2631
2632 lvalue.expr_type = EXPR_VARIABLE;
2633 lvalue.ts = sym->ts;
2634 if (sym->as)
2635 lvalue.rank = sym->as->rank;
2636 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2637 lvalue.symtree->n.sym = sym;
2638 lvalue.where = sym->declared_at;
2639
2640 if (sym->attr.pointer)
2641 r = gfc_check_pointer_assign (&lvalue, rvalue);
2642 else
2643 r = gfc_check_assign (&lvalue, rvalue, 1);
2644
2645 gfc_free (lvalue.symtree);
2646
2647 return r;
2648 }
2649
2650
2651 /* Get an expression for a default initializer. */
2652
2653 gfc_expr *
2654 gfc_default_initializer (gfc_typespec *ts)
2655 {
2656 gfc_constructor *tail;
2657 gfc_expr *init;
2658 gfc_component *c;
2659
2660 init = NULL;
2661
2662 /* See if we have a default initializer. */
2663 for (c = ts->derived->components; c; c = c->next)
2664 {
2665 if ((c->initializer || c->allocatable) && init == NULL)
2666 init = gfc_get_expr ();
2667 }
2668
2669 if (init == NULL)
2670 return NULL;
2671
2672 /* Build the constructor. */
2673 init->expr_type = EXPR_STRUCTURE;
2674 init->ts = *ts;
2675 init->where = ts->derived->declared_at;
2676 tail = NULL;
2677 for (c = ts->derived->components; c; c = c->next)
2678 {
2679 if (tail == NULL)
2680 init->value.constructor = tail = gfc_get_constructor ();
2681 else
2682 {
2683 tail->next = gfc_get_constructor ();
2684 tail = tail->next;
2685 }
2686
2687 if (c->initializer)
2688 tail->expr = gfc_copy_expr (c->initializer);
2689
2690 if (c->allocatable)
2691 {
2692 tail->expr = gfc_get_expr ();
2693 tail->expr->expr_type = EXPR_NULL;
2694 tail->expr->ts = c->ts;
2695 }
2696 }
2697 return init;
2698 }
2699
2700
2701 /* Given a symbol, create an expression node with that symbol as a
2702 variable. If the symbol is array valued, setup a reference of the
2703 whole array. */
2704
2705 gfc_expr *
2706 gfc_get_variable_expr (gfc_symtree *var)
2707 {
2708 gfc_expr *e;
2709
2710 e = gfc_get_expr ();
2711 e->expr_type = EXPR_VARIABLE;
2712 e->symtree = var;
2713 e->ts = var->n.sym->ts;
2714
2715 if (var->n.sym->as != NULL)
2716 {
2717 e->rank = var->n.sym->as->rank;
2718 e->ref = gfc_get_ref ();
2719 e->ref->type = REF_ARRAY;
2720 e->ref->u.ar.type = AR_FULL;
2721 }
2722
2723 return e;
2724 }
2725
2726
2727 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
2728
2729 void
2730 gfc_expr_set_symbols_referenced (gfc_expr *expr)
2731 {
2732 gfc_actual_arglist *arg;
2733 gfc_constructor *c;
2734 gfc_ref *ref;
2735 int i;
2736
2737 if (!expr) return;
2738
2739 switch (expr->expr_type)
2740 {
2741 case EXPR_OP:
2742 gfc_expr_set_symbols_referenced (expr->value.op.op1);
2743 gfc_expr_set_symbols_referenced (expr->value.op.op2);
2744 break;
2745
2746 case EXPR_FUNCTION:
2747 for (arg = expr->value.function.actual; arg; arg = arg->next)
2748 gfc_expr_set_symbols_referenced (arg->expr);
2749 break;
2750
2751 case EXPR_VARIABLE:
2752 gfc_set_sym_referenced (expr->symtree->n.sym);
2753 break;
2754
2755 case EXPR_CONSTANT:
2756 case EXPR_NULL:
2757 case EXPR_SUBSTRING:
2758 break;
2759
2760 case EXPR_STRUCTURE:
2761 case EXPR_ARRAY:
2762 for (c = expr->value.constructor; c; c = c->next)
2763 gfc_expr_set_symbols_referenced (c->expr);
2764 break;
2765
2766 default:
2767 gcc_unreachable ();
2768 break;
2769 }
2770
2771 for (ref = expr->ref; ref; ref = ref->next)
2772 switch (ref->type)
2773 {
2774 case REF_ARRAY:
2775 for (i = 0; i < ref->u.ar.dimen; i++)
2776 {
2777 gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2778 gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2779 gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2780 }
2781 break;
2782
2783 case REF_COMPONENT:
2784 break;
2785
2786 case REF_SUBSTRING:
2787 gfc_expr_set_symbols_referenced (ref->u.ss.start);
2788 gfc_expr_set_symbols_referenced (ref->u.ss.end);
2789 break;
2790
2791 default:
2792 gcc_unreachable ();
2793 break;
2794 }
2795 }