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