arith.c (gfc_arith_uplus): Rename to ...
[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 static try
1578 check_intrinsic_op (gfc_expr *e, try (*check_function) (gfc_expr *))
1579 {
1580 gfc_expr *op1 = e->value.op.op1;
1581 gfc_expr *op2 = e->value.op.op2;
1582
1583 if ((*check_function) (op1) == FAILURE)
1584 return FAILURE;
1585
1586 switch (e->value.op.operator)
1587 {
1588 case INTRINSIC_UPLUS:
1589 case INTRINSIC_UMINUS:
1590 if (!numeric_type (et0 (op1)))
1591 goto not_numeric;
1592 break;
1593
1594 case INTRINSIC_EQ:
1595 case INTRINSIC_NE:
1596 case INTRINSIC_GT:
1597 case INTRINSIC_GE:
1598 case INTRINSIC_LT:
1599 case INTRINSIC_LE:
1600 if ((*check_function) (op2) == FAILURE)
1601 return FAILURE;
1602
1603 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1604 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1605 {
1606 gfc_error ("Numeric or CHARACTER operands are required in "
1607 "expression at %L", &e->where);
1608 return FAILURE;
1609 }
1610 break;
1611
1612 case INTRINSIC_PLUS:
1613 case INTRINSIC_MINUS:
1614 case INTRINSIC_TIMES:
1615 case INTRINSIC_DIVIDE:
1616 case INTRINSIC_POWER:
1617 if ((*check_function) (op2) == FAILURE)
1618 return FAILURE;
1619
1620 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1621 goto not_numeric;
1622
1623 if (e->value.op.operator == INTRINSIC_POWER
1624 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1625 {
1626 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1627 "exponent in an initialization "
1628 "expression at %L", &op2->where)
1629 == FAILURE)
1630 return FAILURE;
1631 }
1632
1633 break;
1634
1635 case INTRINSIC_CONCAT:
1636 if ((*check_function) (op2) == FAILURE)
1637 return FAILURE;
1638
1639 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1640 {
1641 gfc_error ("Concatenation operator in expression at %L "
1642 "must have two CHARACTER operands", &op1->where);
1643 return FAILURE;
1644 }
1645
1646 if (op1->ts.kind != op2->ts.kind)
1647 {
1648 gfc_error ("Concat operator at %L must concatenate strings of the "
1649 "same kind", &e->where);
1650 return FAILURE;
1651 }
1652
1653 break;
1654
1655 case INTRINSIC_NOT:
1656 if (et0 (op1) != BT_LOGICAL)
1657 {
1658 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1659 "operand", &op1->where);
1660 return FAILURE;
1661 }
1662
1663 break;
1664
1665 case INTRINSIC_AND:
1666 case INTRINSIC_OR:
1667 case INTRINSIC_EQV:
1668 case INTRINSIC_NEQV:
1669 if ((*check_function) (op2) == FAILURE)
1670 return FAILURE;
1671
1672 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1673 {
1674 gfc_error ("LOGICAL operands are required in expression at %L",
1675 &e->where);
1676 return FAILURE;
1677 }
1678
1679 break;
1680
1681 case INTRINSIC_PARENTHESES:
1682 break;
1683
1684 default:
1685 gfc_error ("Only intrinsic operators can be used in expression at %L",
1686 &e->where);
1687 return FAILURE;
1688 }
1689
1690 return SUCCESS;
1691
1692 not_numeric:
1693 gfc_error ("Numeric operands are required in expression at %L", &e->where);
1694
1695 return FAILURE;
1696 }
1697
1698
1699
1700 /* Certain inquiry functions are specifically allowed to have variable
1701 arguments, which is an exception to the normal requirement that an
1702 initialization function have initialization arguments. We head off
1703 this problem here. */
1704
1705 static try
1706 check_inquiry (gfc_expr *e, int not_restricted)
1707 {
1708 const char *name;
1709
1710 /* FIXME: This should be moved into the intrinsic definitions,
1711 to eliminate this ugly hack. */
1712 static const char * const inquiry_function[] = {
1713 "digits", "epsilon", "huge", "kind", "len", "maxexponent", "minexponent",
1714 "precision", "radix", "range", "tiny", "bit_size", "size", "shape",
1715 "lbound", "ubound", NULL
1716 };
1717
1718 int i;
1719
1720 /* An undeclared parameter will get us here (PR25018). */
1721 if (e->symtree == NULL)
1722 return FAILURE;
1723
1724 name = e->symtree->n.sym->name;
1725
1726 for (i = 0; inquiry_function[i]; i++)
1727 if (strcmp (inquiry_function[i], name) == 0)
1728 break;
1729
1730 if (inquiry_function[i] == NULL)
1731 return FAILURE;
1732
1733 e = e->value.function.actual->expr;
1734
1735 if (e == NULL || e->expr_type != EXPR_VARIABLE)
1736 return FAILURE;
1737
1738 /* At this point we have an inquiry function with a variable argument. The
1739 type of the variable might be undefined, but we need it now, because the
1740 arguments of these functions are allowed to be undefined. */
1741
1742 if (e->ts.type == BT_UNKNOWN)
1743 {
1744 if (e->symtree->n.sym->ts.type == BT_UNKNOWN
1745 && gfc_set_default_type (e->symtree->n.sym, 0, gfc_current_ns)
1746 == FAILURE)
1747 return FAILURE;
1748
1749 e->ts = e->symtree->n.sym->ts;
1750 }
1751
1752 /* Assumed character length will not reduce to a constant expression
1753 with LEN, as required by the standard. */
1754 if (i == 4 && not_restricted
1755 && e->symtree->n.sym->ts.type == BT_CHARACTER
1756 && e->symtree->n.sym->ts.cl->length == NULL)
1757 gfc_notify_std (GFC_STD_GNU, "assumed character length "
1758 "variable '%s' in constant expression at %L",
1759 e->symtree->n.sym->name, &e->where);
1760
1761 return SUCCESS;
1762 }
1763
1764
1765 /* Verify that an expression is an initialization expression. A side
1766 effect is that the expression tree is reduced to a single constant
1767 node if all goes well. This would normally happen when the
1768 expression is constructed but function references are assumed to be
1769 intrinsics in the context of initialization expressions. If
1770 FAILURE is returned an error message has been generated. */
1771
1772 static try
1773 check_init_expr (gfc_expr *e)
1774 {
1775 gfc_actual_arglist *ap;
1776 match m;
1777 try t;
1778
1779 if (e == NULL)
1780 return SUCCESS;
1781
1782 switch (e->expr_type)
1783 {
1784 case EXPR_OP:
1785 t = check_intrinsic_op (e, check_init_expr);
1786 if (t == SUCCESS)
1787 t = gfc_simplify_expr (e, 0);
1788
1789 break;
1790
1791 case EXPR_FUNCTION:
1792 t = SUCCESS;
1793
1794 if (check_inquiry (e, 1) != SUCCESS)
1795 {
1796 t = SUCCESS;
1797 for (ap = e->value.function.actual; ap; ap = ap->next)
1798 if (check_init_expr (ap->expr) == FAILURE)
1799 {
1800 t = FAILURE;
1801 break;
1802 }
1803 }
1804
1805 if (t == SUCCESS)
1806 {
1807 m = gfc_intrinsic_func_interface (e, 0);
1808
1809 if (m == MATCH_NO)
1810 gfc_error ("Function '%s' in initialization expression at %L "
1811 "must be an intrinsic function",
1812 e->symtree->n.sym->name, &e->where);
1813
1814 if (m != MATCH_YES)
1815 t = FAILURE;
1816 }
1817
1818 break;
1819
1820 case EXPR_VARIABLE:
1821 t = SUCCESS;
1822
1823 if (gfc_check_iter_variable (e) == SUCCESS)
1824 break;
1825
1826 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
1827 {
1828 t = simplify_parameter_variable (e, 0);
1829 break;
1830 }
1831
1832 if (gfc_in_match_data ())
1833 break;
1834
1835 gfc_error ("Parameter '%s' at %L has not been declared or is "
1836 "a variable, which does not reduce to a constant "
1837 "expression", e->symtree->n.sym->name, &e->where);
1838 t = FAILURE;
1839 break;
1840
1841 case EXPR_CONSTANT:
1842 case EXPR_NULL:
1843 t = SUCCESS;
1844 break;
1845
1846 case EXPR_SUBSTRING:
1847 t = check_init_expr (e->ref->u.ss.start);
1848 if (t == FAILURE)
1849 break;
1850
1851 t = check_init_expr (e->ref->u.ss.end);
1852 if (t == SUCCESS)
1853 t = gfc_simplify_expr (e, 0);
1854
1855 break;
1856
1857 case EXPR_STRUCTURE:
1858 t = gfc_check_constructor (e, check_init_expr);
1859 break;
1860
1861 case EXPR_ARRAY:
1862 t = gfc_check_constructor (e, check_init_expr);
1863 if (t == FAILURE)
1864 break;
1865
1866 t = gfc_expand_constructor (e);
1867 if (t == FAILURE)
1868 break;
1869
1870 t = gfc_check_constructor_type (e);
1871 break;
1872
1873 default:
1874 gfc_internal_error ("check_init_expr(): Unknown expression type");
1875 }
1876
1877 return t;
1878 }
1879
1880
1881 /* Match an initialization expression. We work by first matching an
1882 expression, then reducing it to a constant. */
1883
1884 match
1885 gfc_match_init_expr (gfc_expr **result)
1886 {
1887 gfc_expr *expr;
1888 match m;
1889 try t;
1890
1891 m = gfc_match_expr (&expr);
1892 if (m != MATCH_YES)
1893 return m;
1894
1895 gfc_init_expr = 1;
1896 t = gfc_resolve_expr (expr);
1897 if (t == SUCCESS)
1898 t = check_init_expr (expr);
1899 gfc_init_expr = 0;
1900
1901 if (t == FAILURE)
1902 {
1903 gfc_free_expr (expr);
1904 return MATCH_ERROR;
1905 }
1906
1907 if (expr->expr_type == EXPR_ARRAY
1908 && (gfc_check_constructor_type (expr) == FAILURE
1909 || gfc_expand_constructor (expr) == FAILURE))
1910 {
1911 gfc_free_expr (expr);
1912 return MATCH_ERROR;
1913 }
1914
1915 /* Not all inquiry functions are simplified to constant expressions
1916 so it is necessary to call check_inquiry again. */
1917 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) == FAILURE
1918 && !gfc_in_match_data ())
1919 {
1920 gfc_error ("Initialization expression didn't reduce %C");
1921 return MATCH_ERROR;
1922 }
1923
1924 *result = expr;
1925
1926 return MATCH_YES;
1927 }
1928
1929
1930 static try check_restricted (gfc_expr *);
1931
1932 /* Given an actual argument list, test to see that each argument is a
1933 restricted expression and optionally if the expression type is
1934 integer or character. */
1935
1936 static try
1937 restricted_args (gfc_actual_arglist *a)
1938 {
1939 for (; a; a = a->next)
1940 {
1941 if (check_restricted (a->expr) == FAILURE)
1942 return FAILURE;
1943 }
1944
1945 return SUCCESS;
1946 }
1947
1948
1949 /************* Restricted/specification expressions *************/
1950
1951
1952 /* Make sure a non-intrinsic function is a specification function. */
1953
1954 static try
1955 external_spec_function (gfc_expr *e)
1956 {
1957 gfc_symbol *f;
1958
1959 f = e->value.function.esym;
1960
1961 if (f->attr.proc == PROC_ST_FUNCTION)
1962 {
1963 gfc_error ("Specification function '%s' at %L cannot be a statement "
1964 "function", f->name, &e->where);
1965 return FAILURE;
1966 }
1967
1968 if (f->attr.proc == PROC_INTERNAL)
1969 {
1970 gfc_error ("Specification function '%s' at %L cannot be an internal "
1971 "function", f->name, &e->where);
1972 return FAILURE;
1973 }
1974
1975 if (!f->attr.pure && !f->attr.elemental)
1976 {
1977 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
1978 &e->where);
1979 return FAILURE;
1980 }
1981
1982 if (f->attr.recursive)
1983 {
1984 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
1985 f->name, &e->where);
1986 return FAILURE;
1987 }
1988
1989 return restricted_args (e->value.function.actual);
1990 }
1991
1992
1993 /* Check to see that a function reference to an intrinsic is a
1994 restricted expression. */
1995
1996 static try
1997 restricted_intrinsic (gfc_expr *e)
1998 {
1999 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2000 if (check_inquiry (e, 0) == SUCCESS)
2001 return SUCCESS;
2002
2003 return restricted_args (e->value.function.actual);
2004 }
2005
2006
2007 /* Verify that an expression is a restricted expression. Like its
2008 cousin check_init_expr(), an error message is generated if we
2009 return FAILURE. */
2010
2011 static try
2012 check_restricted (gfc_expr *e)
2013 {
2014 gfc_symbol *sym;
2015 try t;
2016
2017 if (e == NULL)
2018 return SUCCESS;
2019
2020 switch (e->expr_type)
2021 {
2022 case EXPR_OP:
2023 t = check_intrinsic_op (e, check_restricted);
2024 if (t == SUCCESS)
2025 t = gfc_simplify_expr (e, 0);
2026
2027 break;
2028
2029 case EXPR_FUNCTION:
2030 t = e->value.function.esym ? external_spec_function (e)
2031 : restricted_intrinsic (e);
2032
2033 break;
2034
2035 case EXPR_VARIABLE:
2036 sym = e->symtree->n.sym;
2037 t = FAILURE;
2038
2039 if (sym->attr.optional)
2040 {
2041 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2042 sym->name, &e->where);
2043 break;
2044 }
2045
2046 if (sym->attr.intent == INTENT_OUT)
2047 {
2048 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2049 sym->name, &e->where);
2050 break;
2051 }
2052
2053 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2054 processed in resolve.c(resolve_formal_arglist). This is done so
2055 that host associated dummy array indices are accepted (PR23446).
2056 This mechanism also does the same for the specification expressions
2057 of array-valued functions. */
2058 if (sym->attr.in_common
2059 || sym->attr.use_assoc
2060 || sym->attr.dummy
2061 || sym->ns != gfc_current_ns
2062 || (sym->ns->proc_name != NULL
2063 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2064 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2065 {
2066 t = SUCCESS;
2067 break;
2068 }
2069
2070 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2071 sym->name, &e->where);
2072
2073 break;
2074
2075 case EXPR_NULL:
2076 case EXPR_CONSTANT:
2077 t = SUCCESS;
2078 break;
2079
2080 case EXPR_SUBSTRING:
2081 t = gfc_specification_expr (e->ref->u.ss.start);
2082 if (t == FAILURE)
2083 break;
2084
2085 t = gfc_specification_expr (e->ref->u.ss.end);
2086 if (t == SUCCESS)
2087 t = gfc_simplify_expr (e, 0);
2088
2089 break;
2090
2091 case EXPR_STRUCTURE:
2092 t = gfc_check_constructor (e, check_restricted);
2093 break;
2094
2095 case EXPR_ARRAY:
2096 t = gfc_check_constructor (e, check_restricted);
2097 break;
2098
2099 default:
2100 gfc_internal_error ("check_restricted(): Unknown expression type");
2101 }
2102
2103 return t;
2104 }
2105
2106
2107 /* Check to see that an expression is a specification expression. If
2108 we return FAILURE, an error has been generated. */
2109
2110 try
2111 gfc_specification_expr (gfc_expr *e)
2112 {
2113 if (e == NULL)
2114 return SUCCESS;
2115
2116 if (e->ts.type != BT_INTEGER)
2117 {
2118 gfc_error ("Expression at %L must be of INTEGER type", &e->where);
2119 return FAILURE;
2120 }
2121
2122 if (e->rank != 0)
2123 {
2124 gfc_error ("Expression at %L must be scalar", &e->where);
2125 return FAILURE;
2126 }
2127
2128 if (gfc_simplify_expr (e, 0) == FAILURE)
2129 return FAILURE;
2130
2131 return check_restricted (e);
2132 }
2133
2134
2135 /************** Expression conformance checks. *************/
2136
2137 /* Given two expressions, make sure that the arrays are conformable. */
2138
2139 try
2140 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2141 {
2142 int op1_flag, op2_flag, d;
2143 mpz_t op1_size, op2_size;
2144 try t;
2145
2146 if (op1->rank == 0 || op2->rank == 0)
2147 return SUCCESS;
2148
2149 if (op1->rank != op2->rank)
2150 {
2151 gfc_error ("Incompatible ranks in %s at %L", _(optype_msgid),
2152 &op1->where);
2153 return FAILURE;
2154 }
2155
2156 t = SUCCESS;
2157
2158 for (d = 0; d < op1->rank; d++)
2159 {
2160 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2161 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2162
2163 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2164 {
2165 gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
2166 _(optype_msgid), &op1->where, d + 1,
2167 (int) mpz_get_si (op1_size),
2168 (int) mpz_get_si (op2_size));
2169
2170 t = FAILURE;
2171 }
2172
2173 if (op1_flag)
2174 mpz_clear (op1_size);
2175 if (op2_flag)
2176 mpz_clear (op2_size);
2177
2178 if (t == FAILURE)
2179 return FAILURE;
2180 }
2181
2182 return SUCCESS;
2183 }
2184
2185
2186 /* Given an assignable expression and an arbitrary expression, make
2187 sure that the assignment can take place. */
2188
2189 try
2190 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2191 {
2192 gfc_symbol *sym;
2193 gfc_ref *ref;
2194 int has_pointer;
2195
2196 sym = lvalue->symtree->n.sym;
2197
2198 /* Check INTENT(IN), unless the object itself is the component or
2199 sub-component of a pointer. */
2200 has_pointer = sym->attr.pointer;
2201
2202 for (ref = lvalue->ref; ref; ref = ref->next)
2203 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2204 {
2205 has_pointer = 1;
2206 break;
2207 }
2208
2209 if (!has_pointer && sym->attr.intent == INTENT_IN)
2210 {
2211 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2212 sym->name, &lvalue->where);
2213 return FAILURE;
2214 }
2215
2216 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2217 variable local to a function subprogram. Its existence begins when
2218 execution of the function is initiated and ends when execution of the
2219 function is terminated.....
2220 Therefore, the left hand side is no longer a varaiable, when it is: */
2221 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2222 && !sym->attr.external)
2223 {
2224 bool bad_proc;
2225 bad_proc = false;
2226
2227 /* (i) Use associated; */
2228 if (sym->attr.use_assoc)
2229 bad_proc = true;
2230
2231 /* (ii) The assignment is in the main program; or */
2232 if (gfc_current_ns->proc_name->attr.is_main_program)
2233 bad_proc = true;
2234
2235 /* (iii) A module or internal procedure.... */
2236 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2237 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2238 && gfc_current_ns->parent
2239 && (!(gfc_current_ns->parent->proc_name->attr.function
2240 || gfc_current_ns->parent->proc_name->attr.subroutine)
2241 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2242 {
2243 /* .... that is not a function.... */
2244 if (!gfc_current_ns->proc_name->attr.function)
2245 bad_proc = true;
2246
2247 /* .... or is not an entry and has a different name. */
2248 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2249 bad_proc = true;
2250 }
2251
2252 if (bad_proc)
2253 {
2254 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2255 return FAILURE;
2256 }
2257 }
2258
2259 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2260 {
2261 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2262 lvalue->rank, rvalue->rank, &lvalue->where);
2263 return FAILURE;
2264 }
2265
2266 if (lvalue->ts.type == BT_UNKNOWN)
2267 {
2268 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2269 &lvalue->where);
2270 return FAILURE;
2271 }
2272
2273 if (rvalue->expr_type == EXPR_NULL)
2274 {
2275 gfc_error ("NULL appears on right-hand side in assignment at %L",
2276 &rvalue->where);
2277 return FAILURE;
2278 }
2279
2280 if (sym->attr.cray_pointee
2281 && lvalue->ref != NULL
2282 && lvalue->ref->u.ar.type == AR_FULL
2283 && lvalue->ref->u.ar.as->cp_was_assumed)
2284 {
2285 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2286 "is illegal", &lvalue->where);
2287 return FAILURE;
2288 }
2289
2290 /* This is possibly a typo: x = f() instead of x => f() */
2291 if (gfc_option.warn_surprising
2292 && rvalue->expr_type == EXPR_FUNCTION
2293 && rvalue->symtree->n.sym->attr.pointer)
2294 gfc_warning ("POINTER valued function appears on right-hand side of "
2295 "assignment at %L", &rvalue->where);
2296
2297 /* Check size of array assignments. */
2298 if (lvalue->rank != 0 && rvalue->rank != 0
2299 && gfc_check_conformance ("Array assignment", lvalue, rvalue) != SUCCESS)
2300 return FAILURE;
2301
2302 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2303 return SUCCESS;
2304
2305 if (!conform)
2306 {
2307 /* Numeric can be converted to any other numeric. And Hollerith can be
2308 converted to any other type. */
2309 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2310 || rvalue->ts.type == BT_HOLLERITH)
2311 return SUCCESS;
2312
2313 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2314 return SUCCESS;
2315
2316 gfc_error ("Incompatible types in assignment at %L, %s to %s",
2317 &rvalue->where, gfc_typename (&rvalue->ts),
2318 gfc_typename (&lvalue->ts));
2319
2320 return FAILURE;
2321 }
2322
2323 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2324 }
2325
2326
2327 /* Check that a pointer assignment is OK. We first check lvalue, and
2328 we only check rvalue if it's not an assignment to NULL() or a
2329 NULLIFY statement. */
2330
2331 try
2332 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2333 {
2334 symbol_attribute attr;
2335 gfc_ref *ref;
2336 int is_pure;
2337 int pointer, check_intent_in;
2338
2339 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN)
2340 {
2341 gfc_error ("Pointer assignment target is not a POINTER at %L",
2342 &lvalue->where);
2343 return FAILURE;
2344 }
2345
2346 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2347 && lvalue->symtree->n.sym->attr.use_assoc)
2348 {
2349 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2350 "l-value since it is a procedure",
2351 lvalue->symtree->n.sym->name, &lvalue->where);
2352 return FAILURE;
2353 }
2354
2355
2356 /* Check INTENT(IN), unless the object itself is the component or
2357 sub-component of a pointer. */
2358 check_intent_in = 1;
2359 pointer = lvalue->symtree->n.sym->attr.pointer;
2360
2361 for (ref = lvalue->ref; ref; ref = ref->next)
2362 {
2363 if (pointer)
2364 check_intent_in = 0;
2365
2366 if (ref->type == REF_COMPONENT && ref->u.c.component->pointer)
2367 pointer = 1;
2368 }
2369
2370 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2371 {
2372 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2373 lvalue->symtree->n.sym->name, &lvalue->where);
2374 return FAILURE;
2375 }
2376
2377 if (!pointer)
2378 {
2379 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2380 return FAILURE;
2381 }
2382
2383 is_pure = gfc_pure (NULL);
2384
2385 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
2386 {
2387 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2388 return FAILURE;
2389 }
2390
2391 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2392 kind, etc for lvalue and rvalue must match, and rvalue must be a
2393 pure variable if we're in a pure function. */
2394 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2395 return SUCCESS;
2396
2397 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2398 {
2399 gfc_error ("Different types in pointer assignment at %L",
2400 &lvalue->where);
2401 return FAILURE;
2402 }
2403
2404 if (lvalue->ts.kind != rvalue->ts.kind)
2405 {
2406 gfc_error ("Different kind type parameters in pointer "
2407 "assignment at %L", &lvalue->where);
2408 return FAILURE;
2409 }
2410
2411 if (lvalue->rank != rvalue->rank)
2412 {
2413 gfc_error ("Different ranks in pointer assignment at %L",
2414 &lvalue->where);
2415 return FAILURE;
2416 }
2417
2418 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
2419 if (rvalue->expr_type == EXPR_NULL)
2420 return SUCCESS;
2421
2422 if (lvalue->ts.type == BT_CHARACTER
2423 && lvalue->ts.cl->length && rvalue->ts.cl->length
2424 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
2425 rvalue->ts.cl->length)) == 1)
2426 {
2427 gfc_error ("Different character lengths in pointer "
2428 "assignment at %L", &lvalue->where);
2429 return FAILURE;
2430 }
2431
2432 attr = gfc_expr_attr (rvalue);
2433 if (!attr.target && !attr.pointer)
2434 {
2435 gfc_error ("Pointer assignment target is neither TARGET "
2436 "nor POINTER at %L", &rvalue->where);
2437 return FAILURE;
2438 }
2439
2440 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
2441 {
2442 gfc_error ("Bad target in pointer assignment in PURE "
2443 "procedure at %L", &rvalue->where);
2444 }
2445
2446 if (gfc_has_vector_index (rvalue))
2447 {
2448 gfc_error ("Pointer assignment with vector subscript "
2449 "on rhs at %L", &rvalue->where);
2450 return FAILURE;
2451 }
2452
2453 if (attr.protected && attr.use_assoc)
2454 {
2455 gfc_error ("Pointer assigment target has PROTECTED "
2456 "attribute at %L", &rvalue->where);
2457 return FAILURE;
2458 }
2459
2460 return SUCCESS;
2461 }
2462
2463
2464 /* Relative of gfc_check_assign() except that the lvalue is a single
2465 symbol. Used for initialization assignments. */
2466
2467 try
2468 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
2469 {
2470 gfc_expr lvalue;
2471 try r;
2472
2473 memset (&lvalue, '\0', sizeof (gfc_expr));
2474
2475 lvalue.expr_type = EXPR_VARIABLE;
2476 lvalue.ts = sym->ts;
2477 if (sym->as)
2478 lvalue.rank = sym->as->rank;
2479 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
2480 lvalue.symtree->n.sym = sym;
2481 lvalue.where = sym->declared_at;
2482
2483 if (sym->attr.pointer)
2484 r = gfc_check_pointer_assign (&lvalue, rvalue);
2485 else
2486 r = gfc_check_assign (&lvalue, rvalue, 1);
2487
2488 gfc_free (lvalue.symtree);
2489
2490 return r;
2491 }
2492
2493
2494 /* Get an expression for a default initializer. */
2495
2496 gfc_expr *
2497 gfc_default_initializer (gfc_typespec *ts)
2498 {
2499 gfc_constructor *tail;
2500 gfc_expr *init;
2501 gfc_component *c;
2502
2503 init = NULL;
2504
2505 /* See if we have a default initializer. */
2506 for (c = ts->derived->components; c; c = c->next)
2507 {
2508 if ((c->initializer || c->allocatable) && init == NULL)
2509 init = gfc_get_expr ();
2510 }
2511
2512 if (init == NULL)
2513 return NULL;
2514
2515 /* Build the constructor. */
2516 init->expr_type = EXPR_STRUCTURE;
2517 init->ts = *ts;
2518 init->where = ts->derived->declared_at;
2519 tail = NULL;
2520 for (c = ts->derived->components; c; c = c->next)
2521 {
2522 if (tail == NULL)
2523 init->value.constructor = tail = gfc_get_constructor ();
2524 else
2525 {
2526 tail->next = gfc_get_constructor ();
2527 tail = tail->next;
2528 }
2529
2530 if (c->initializer)
2531 tail->expr = gfc_copy_expr (c->initializer);
2532
2533 if (c->allocatable)
2534 {
2535 tail->expr = gfc_get_expr ();
2536 tail->expr->expr_type = EXPR_NULL;
2537 tail->expr->ts = c->ts;
2538 }
2539 }
2540 return init;
2541 }
2542
2543
2544 /* Given a symbol, create an expression node with that symbol as a
2545 variable. If the symbol is array valued, setup a reference of the
2546 whole array. */
2547
2548 gfc_expr *
2549 gfc_get_variable_expr (gfc_symtree *var)
2550 {
2551 gfc_expr *e;
2552
2553 e = gfc_get_expr ();
2554 e->expr_type = EXPR_VARIABLE;
2555 e->symtree = var;
2556 e->ts = var->n.sym->ts;
2557
2558 if (var->n.sym->as != NULL)
2559 {
2560 e->rank = var->n.sym->as->rank;
2561 e->ref = gfc_get_ref ();
2562 e->ref->type = REF_ARRAY;
2563 e->ref->u.ar.type = AR_FULL;
2564 }
2565
2566 return e;
2567 }
2568
2569
2570 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
2571
2572 void
2573 gfc_expr_set_symbols_referenced (gfc_expr *expr)
2574 {
2575 gfc_actual_arglist *arg;
2576 gfc_constructor *c;
2577 gfc_ref *ref;
2578 int i;
2579
2580 if (!expr) return;
2581
2582 switch (expr->expr_type)
2583 {
2584 case EXPR_OP:
2585 gfc_expr_set_symbols_referenced (expr->value.op.op1);
2586 gfc_expr_set_symbols_referenced (expr->value.op.op2);
2587 break;
2588
2589 case EXPR_FUNCTION:
2590 for (arg = expr->value.function.actual; arg; arg = arg->next)
2591 gfc_expr_set_symbols_referenced (arg->expr);
2592 break;
2593
2594 case EXPR_VARIABLE:
2595 gfc_set_sym_referenced (expr->symtree->n.sym);
2596 break;
2597
2598 case EXPR_CONSTANT:
2599 case EXPR_NULL:
2600 case EXPR_SUBSTRING:
2601 break;
2602
2603 case EXPR_STRUCTURE:
2604 case EXPR_ARRAY:
2605 for (c = expr->value.constructor; c; c = c->next)
2606 gfc_expr_set_symbols_referenced (c->expr);
2607 break;
2608
2609 default:
2610 gcc_unreachable ();
2611 break;
2612 }
2613
2614 for (ref = expr->ref; ref; ref = ref->next)
2615 switch (ref->type)
2616 {
2617 case REF_ARRAY:
2618 for (i = 0; i < ref->u.ar.dimen; i++)
2619 {
2620 gfc_expr_set_symbols_referenced (ref->u.ar.start[i]);
2621 gfc_expr_set_symbols_referenced (ref->u.ar.end[i]);
2622 gfc_expr_set_symbols_referenced (ref->u.ar.stride[i]);
2623 }
2624 break;
2625
2626 case REF_COMPONENT:
2627 break;
2628
2629 case REF_SUBSTRING:
2630 gfc_expr_set_symbols_referenced (ref->u.ss.start);
2631 gfc_expr_set_symbols_referenced (ref->u.ss.end);
2632 break;
2633
2634 default:
2635 gcc_unreachable ();
2636 break;
2637 }
2638 }