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