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