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