1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "target-memory.h" /* for gfc_convert_boz */
29 #include "constructor.h"
32 /* The following set of functions provide access to gfc_expr* of
33 various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
35 There are two functions available elsewhere that provide
36 slightly different flavours of variables. Namely:
37 expr.c (gfc_get_variable_expr)
38 symbol.c (gfc_lval_expr_from_sym)
39 TODO: Merge these functions, if possible. */
41 /* Get a new expression node. */
49 gfc_clear_ts (&e
->ts
);
57 /* Get a new expression node that is an array constructor
58 of given type and kind. */
61 gfc_get_array_expr (bt type
, int kind
, locus
*where
)
66 e
->expr_type
= EXPR_ARRAY
;
67 e
->value
.constructor
= NULL
;
80 /* Get a new expression node that is the NULL expression. */
83 gfc_get_null_expr (locus
*where
)
88 e
->expr_type
= EXPR_NULL
;
89 e
->ts
.type
= BT_UNKNOWN
;
98 /* Get a new expression node that is an operator expression node. */
101 gfc_get_operator_expr (locus
*where
, gfc_intrinsic_op op
,
102 gfc_expr
*op1
, gfc_expr
*op2
)
107 e
->expr_type
= EXPR_OP
;
109 e
->value
.op
.op1
= op1
;
110 e
->value
.op
.op2
= op2
;
119 /* Get a new expression node that is an structure constructor
120 of given type and kind. */
123 gfc_get_structure_constructor_expr (bt type
, int kind
, locus
*where
)
128 e
->expr_type
= EXPR_STRUCTURE
;
129 e
->value
.constructor
= NULL
;
140 /* Get a new expression node that is an constant of given type and kind. */
143 gfc_get_constant_expr (bt type
, int kind
, locus
*where
)
148 gfc_internal_error ("gfc_get_constant_expr(): locus %<where%> cannot be "
153 e
->expr_type
= EXPR_CONSTANT
;
161 mpz_init (e
->value
.integer
);
165 gfc_set_model_kind (kind
);
166 mpfr_init (e
->value
.real
);
170 gfc_set_model_kind (kind
);
171 mpc_init2 (e
->value
.complex, mpfr_get_default_prec());
182 /* Get a new expression node that is an string constant.
183 If no string is passed, a string of len is allocated,
184 blanked and null-terminated. */
187 gfc_get_character_expr (int kind
, locus
*where
, const char *src
, int len
)
194 dest
= gfc_get_wide_string (len
+ 1);
195 gfc_wide_memset (dest
, ' ', len
);
199 dest
= gfc_char_to_widechar (src
);
201 e
= gfc_get_constant_expr (BT_CHARACTER
, kind
,
202 where
? where
: &gfc_current_locus
);
203 e
->value
.character
.string
= dest
;
204 e
->value
.character
.length
= len
;
210 /* Get a new expression node that is an integer constant. */
213 gfc_get_int_expr (int kind
, locus
*where
, int value
)
216 p
= gfc_get_constant_expr (BT_INTEGER
, kind
,
217 where
? where
: &gfc_current_locus
);
219 mpz_set_si (p
->value
.integer
, value
);
225 /* Get a new expression node that is a logical constant. */
228 gfc_get_logical_expr (int kind
, locus
*where
, bool value
)
231 p
= gfc_get_constant_expr (BT_LOGICAL
, kind
,
232 where
? where
: &gfc_current_locus
);
234 p
->value
.logical
= value
;
241 gfc_get_iokind_expr (locus
*where
, io_kind k
)
245 /* Set the types to something compatible with iokind. This is needed to
246 get through gfc_free_expr later since iokind really has no Basic Type,
250 e
->expr_type
= EXPR_CONSTANT
;
251 e
->ts
.type
= BT_LOGICAL
;
259 /* Given an expression pointer, return a copy of the expression. This
260 subroutine is recursive. */
263 gfc_copy_expr (gfc_expr
*p
)
275 switch (q
->expr_type
)
278 s
= gfc_get_wide_string (p
->value
.character
.length
+ 1);
279 q
->value
.character
.string
= s
;
280 memcpy (s
, p
->value
.character
.string
,
281 (p
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
285 /* Copy target representation, if it exists. */
286 if (p
->representation
.string
)
288 c
= XCNEWVEC (char, p
->representation
.length
+ 1);
289 q
->representation
.string
= c
;
290 memcpy (c
, p
->representation
.string
, (p
->representation
.length
+ 1));
293 /* Copy the values of any pointer components of p->value. */
297 mpz_init_set (q
->value
.integer
, p
->value
.integer
);
301 gfc_set_model_kind (q
->ts
.kind
);
302 mpfr_init (q
->value
.real
);
303 mpfr_set (q
->value
.real
, p
->value
.real
, GFC_RND_MODE
);
307 gfc_set_model_kind (q
->ts
.kind
);
308 mpc_init2 (q
->value
.complex, mpfr_get_default_prec());
309 mpc_set (q
->value
.complex, p
->value
.complex, GFC_MPC_RND_MODE
);
313 if (p
->representation
.string
)
314 q
->value
.character
.string
315 = gfc_char_to_widechar (q
->representation
.string
);
318 s
= gfc_get_wide_string (p
->value
.character
.length
+ 1);
319 q
->value
.character
.string
= s
;
321 /* This is the case for the C_NULL_CHAR named constant. */
322 if (p
->value
.character
.length
== 0
323 && (p
->ts
.is_c_interop
|| p
->ts
.is_iso_c
))
326 /* Need to set the length to 1 to make sure the NUL
327 terminator is copied. */
328 q
->value
.character
.length
= 1;
331 memcpy (s
, p
->value
.character
.string
,
332 (p
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
341 break; /* Already done. */
345 /* Should never be reached. */
347 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
354 switch (q
->value
.op
.op
)
357 case INTRINSIC_PARENTHESES
:
358 case INTRINSIC_UPLUS
:
359 case INTRINSIC_UMINUS
:
360 q
->value
.op
.op1
= gfc_copy_expr (p
->value
.op
.op1
);
363 default: /* Binary operators. */
364 q
->value
.op
.op1
= gfc_copy_expr (p
->value
.op
.op1
);
365 q
->value
.op
.op2
= gfc_copy_expr (p
->value
.op
.op2
);
372 q
->value
.function
.actual
=
373 gfc_copy_actual_arglist (p
->value
.function
.actual
);
378 q
->value
.compcall
.actual
=
379 gfc_copy_actual_arglist (p
->value
.compcall
.actual
);
380 q
->value
.compcall
.tbp
= p
->value
.compcall
.tbp
;
385 q
->value
.constructor
= gfc_constructor_copy (p
->value
.constructor
);
393 q
->shape
= gfc_copy_shape (p
->shape
, p
->rank
);
395 q
->ref
= gfc_copy_ref (p
->ref
);
398 q
->param_list
= gfc_copy_actual_arglist (p
->param_list
);
405 gfc_clear_shape (mpz_t
*shape
, int rank
)
409 for (i
= 0; i
< rank
; i
++)
410 mpz_clear (shape
[i
]);
415 gfc_free_shape (mpz_t
**shape
, int rank
)
420 gfc_clear_shape (*shape
, rank
);
426 /* Workhorse function for gfc_free_expr() that frees everything
427 beneath an expression node, but not the node itself. This is
428 useful when we want to simplify a node and replace it with
429 something else or the expression node belongs to another structure. */
432 free_expr0 (gfc_expr
*e
)
434 switch (e
->expr_type
)
437 /* Free any parts of the value that need freeing. */
441 mpz_clear (e
->value
.integer
);
445 mpfr_clear (e
->value
.real
);
449 free (e
->value
.character
.string
);
453 mpc_clear (e
->value
.complex);
460 /* Free the representation. */
461 free (e
->representation
.string
);
466 if (e
->value
.op
.op1
!= NULL
)
467 gfc_free_expr (e
->value
.op
.op1
);
468 if (e
->value
.op
.op2
!= NULL
)
469 gfc_free_expr (e
->value
.op
.op2
);
473 gfc_free_actual_arglist (e
->value
.function
.actual
);
478 gfc_free_actual_arglist (e
->value
.compcall
.actual
);
486 gfc_constructor_free (e
->value
.constructor
);
490 free (e
->value
.character
.string
);
497 gfc_internal_error ("free_expr0(): Bad expr type");
500 /* Free a shape array. */
501 gfc_free_shape (&e
->shape
, e
->rank
);
503 gfc_free_ref_list (e
->ref
);
505 gfc_free_actual_arglist (e
->param_list
);
507 memset (e
, '\0', sizeof (gfc_expr
));
511 /* Free an expression node and everything beneath it. */
514 gfc_free_expr (gfc_expr
*e
)
523 /* Free an argument list and everything below it. */
526 gfc_free_actual_arglist (gfc_actual_arglist
*a1
)
528 gfc_actual_arglist
*a2
;
534 gfc_free_expr (a1
->expr
);
541 /* Copy an arglist structure and all of the arguments. */
544 gfc_copy_actual_arglist (gfc_actual_arglist
*p
)
546 gfc_actual_arglist
*head
, *tail
, *new_arg
;
550 for (; p
; p
= p
->next
)
552 new_arg
= gfc_get_actual_arglist ();
555 new_arg
->expr
= gfc_copy_expr (p
->expr
);
556 new_arg
->next
= NULL
;
561 tail
->next
= new_arg
;
570 /* Free a list of reference structures. */
573 gfc_free_ref_list (gfc_ref
*p
)
585 for (i
= 0; i
< GFC_MAX_DIMENSIONS
; i
++)
587 gfc_free_expr (p
->u
.ar
.start
[i
]);
588 gfc_free_expr (p
->u
.ar
.end
[i
]);
589 gfc_free_expr (p
->u
.ar
.stride
[i
]);
595 gfc_free_expr (p
->u
.ss
.start
);
596 gfc_free_expr (p
->u
.ss
.end
);
608 /* Graft the *src expression onto the *dest subexpression. */
611 gfc_replace_expr (gfc_expr
*dest
, gfc_expr
*src
)
619 /* Try to extract an integer constant from the passed expression node.
620 Return true if some error occurred, false on success. If REPORT_ERROR
621 is non-zero, emit error, for positive REPORT_ERROR using gfc_error,
622 for negative using gfc_error_now. */
625 gfc_extract_int (gfc_expr
*expr
, int *result
, int report_error
)
629 /* A KIND component is a parameter too. The expression for it
630 is stored in the initializer and should be consistent with
632 if (gfc_expr_attr(expr
).pdt_kind
)
634 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
636 if (ref
->u
.c
.component
->attr
.pdt_kind
)
637 expr
= ref
->u
.c
.component
->initializer
;
641 if (expr
->expr_type
!= EXPR_CONSTANT
)
643 if (report_error
> 0)
644 gfc_error ("Constant expression required at %C");
645 else if (report_error
< 0)
646 gfc_error_now ("Constant expression required at %C");
650 if (expr
->ts
.type
!= BT_INTEGER
)
652 if (report_error
> 0)
653 gfc_error ("Integer expression required at %C");
654 else if (report_error
< 0)
655 gfc_error_now ("Integer expression required at %C");
659 if ((mpz_cmp_si (expr
->value
.integer
, INT_MAX
) > 0)
660 || (mpz_cmp_si (expr
->value
.integer
, INT_MIN
) < 0))
662 if (report_error
> 0)
663 gfc_error ("Integer value too large in expression at %C");
664 else if (report_error
< 0)
665 gfc_error_now ("Integer value too large in expression at %C");
669 *result
= (int) mpz_get_si (expr
->value
.integer
);
675 /* Recursively copy a list of reference structures. */
678 gfc_copy_ref (gfc_ref
*src
)
686 dest
= gfc_get_ref ();
687 dest
->type
= src
->type
;
692 ar
= gfc_copy_array_ref (&src
->u
.ar
);
698 dest
->u
.c
= src
->u
.c
;
702 dest
->u
.ss
= src
->u
.ss
;
703 dest
->u
.ss
.start
= gfc_copy_expr (src
->u
.ss
.start
);
704 dest
->u
.ss
.end
= gfc_copy_expr (src
->u
.ss
.end
);
708 dest
->next
= gfc_copy_ref (src
->next
);
714 /* Detect whether an expression has any vector index array references. */
717 gfc_has_vector_index (gfc_expr
*e
)
721 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
722 if (ref
->type
== REF_ARRAY
)
723 for (i
= 0; i
< ref
->u
.ar
.dimen
; i
++)
724 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_VECTOR
)
730 /* Copy a shape array. */
733 gfc_copy_shape (mpz_t
*shape
, int rank
)
741 new_shape
= gfc_get_shape (rank
);
743 for (n
= 0; n
< rank
; n
++)
744 mpz_init_set (new_shape
[n
], shape
[n
]);
750 /* Copy a shape array excluding dimension N, where N is an integer
751 constant expression. Dimensions are numbered in Fortran style --
754 So, if the original shape array contains R elements
755 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
756 the result contains R-1 elements:
757 { s1 ... sN-1 sN+1 ... sR-1}
759 If anything goes wrong -- N is not a constant, its value is out
760 of range -- or anything else, just returns NULL. */
763 gfc_copy_shape_excluding (mpz_t
*shape
, int rank
, gfc_expr
*dim
)
765 mpz_t
*new_shape
, *s
;
771 || dim
->expr_type
!= EXPR_CONSTANT
772 || dim
->ts
.type
!= BT_INTEGER
)
775 n
= mpz_get_si (dim
->value
.integer
);
776 n
--; /* Convert to zero based index. */
777 if (n
< 0 || n
>= rank
)
780 s
= new_shape
= gfc_get_shape (rank
- 1);
782 for (i
= 0; i
< rank
; i
++)
786 mpz_init_set (*s
, shape
[i
]);
794 /* Return the maximum kind of two expressions. In general, higher
795 kind numbers mean more precision for numeric types. */
798 gfc_kind_max (gfc_expr
*e1
, gfc_expr
*e2
)
800 return (e1
->ts
.kind
> e2
->ts
.kind
) ? e1
->ts
.kind
: e2
->ts
.kind
;
804 /* Returns nonzero if the type is numeric, zero otherwise. */
807 numeric_type (bt type
)
809 return type
== BT_COMPLEX
|| type
== BT_REAL
|| type
== BT_INTEGER
;
813 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
816 gfc_numeric_ts (gfc_typespec
*ts
)
818 return numeric_type (ts
->type
);
822 /* Return an expression node with an optional argument list attached.
823 A variable number of gfc_expr pointers are strung together in an
824 argument list with a NULL pointer terminating the list. */
827 gfc_build_conversion (gfc_expr
*e
)
832 p
->expr_type
= EXPR_FUNCTION
;
834 p
->value
.function
.actual
= gfc_get_actual_arglist ();
835 p
->value
.function
.actual
->expr
= e
;
841 /* Given an expression node with some sort of numeric binary
842 expression, insert type conversions required to make the operands
843 have the same type. Conversion warnings are disabled if wconversion
846 The exception is that the operands of an exponential don't have to
847 have the same type. If possible, the base is promoted to the type
848 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
849 1.0**2 stays as it is. */
852 gfc_type_convert_binary (gfc_expr
*e
, int wconversion
)
856 op1
= e
->value
.op
.op1
;
857 op2
= e
->value
.op
.op2
;
859 if (op1
->ts
.type
== BT_UNKNOWN
|| op2
->ts
.type
== BT_UNKNOWN
)
861 gfc_clear_ts (&e
->ts
);
865 /* Kind conversions of same type. */
866 if (op1
->ts
.type
== op2
->ts
.type
)
868 if (op1
->ts
.kind
== op2
->ts
.kind
)
870 /* No type conversions. */
875 if (op1
->ts
.kind
> op2
->ts
.kind
)
876 gfc_convert_type_warn (op2
, &op1
->ts
, 2, wconversion
);
878 gfc_convert_type_warn (op1
, &op2
->ts
, 2, wconversion
);
884 /* Integer combined with real or complex. */
885 if (op2
->ts
.type
== BT_INTEGER
)
889 /* Special case for ** operator. */
890 if (e
->value
.op
.op
== INTRINSIC_POWER
)
893 gfc_convert_type_warn (e
->value
.op
.op2
, &e
->ts
, 2, wconversion
);
897 if (op1
->ts
.type
== BT_INTEGER
)
900 gfc_convert_type_warn (e
->value
.op
.op1
, &e
->ts
, 2, wconversion
);
904 /* Real combined with complex. */
905 e
->ts
.type
= BT_COMPLEX
;
906 if (op1
->ts
.kind
> op2
->ts
.kind
)
907 e
->ts
.kind
= op1
->ts
.kind
;
909 e
->ts
.kind
= op2
->ts
.kind
;
910 if (op1
->ts
.type
!= BT_COMPLEX
|| op1
->ts
.kind
!= e
->ts
.kind
)
911 gfc_convert_type_warn (e
->value
.op
.op1
, &e
->ts
, 2, wconversion
);
912 if (op2
->ts
.type
!= BT_COMPLEX
|| op2
->ts
.kind
!= e
->ts
.kind
)
913 gfc_convert_type_warn (e
->value
.op
.op2
, &e
->ts
, 2, wconversion
);
920 /* Determine if an expression is constant in the sense of F08:7.1.12.
921 * This function expects that the expression has already been simplified. */
924 gfc_is_constant_expr (gfc_expr
*e
)
927 gfc_actual_arglist
*arg
;
932 switch (e
->expr_type
)
935 return (gfc_is_constant_expr (e
->value
.op
.op1
)
936 && (e
->value
.op
.op2
== NULL
937 || gfc_is_constant_expr (e
->value
.op
.op2
)));
940 /* The only context in which this can occur is in a parameterized
941 derived type declaration, so returning true is OK. */
942 if (e
->symtree
->n
.sym
->attr
.pdt_len
943 || e
->symtree
->n
.sym
->attr
.pdt_kind
)
950 gcc_assert (e
->symtree
|| e
->value
.function
.esym
951 || e
->value
.function
.isym
);
953 /* Call to intrinsic with at least one argument. */
954 if (e
->value
.function
.isym
&& e
->value
.function
.actual
)
956 for (arg
= e
->value
.function
.actual
; arg
; arg
= arg
->next
)
957 if (!gfc_is_constant_expr (arg
->expr
))
961 if (e
->value
.function
.isym
962 && (e
->value
.function
.isym
->elemental
963 || e
->value
.function
.isym
->pure
964 || e
->value
.function
.isym
->inquiry
965 || e
->value
.function
.isym
->transformational
))
975 return e
->ref
== NULL
|| (gfc_is_constant_expr (e
->ref
->u
.ss
.start
)
976 && gfc_is_constant_expr (e
->ref
->u
.ss
.end
));
980 c
= gfc_constructor_first (e
->value
.constructor
);
981 if ((e
->expr_type
== EXPR_ARRAY
) && c
&& c
->iterator
)
982 return gfc_constant_ac (e
);
984 for (; c
; c
= gfc_constructor_next (c
))
985 if (!gfc_is_constant_expr (c
->expr
))
992 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
998 /* Is true if an array reference is followed by a component or substring
1001 is_subref_array (gfc_expr
* e
)
1006 if (e
->expr_type
!= EXPR_VARIABLE
)
1009 if (e
->symtree
->n
.sym
->attr
.subref_array_pointer
)
1012 if (e
->symtree
->n
.sym
->ts
.type
== BT_CLASS
1013 && e
->symtree
->n
.sym
->attr
.dummy
1014 && CLASS_DATA (e
->symtree
->n
.sym
)->attr
.class_pointer
)
1018 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
1020 if (ref
->type
== REF_ARRAY
1021 && ref
->u
.ar
.type
!= AR_ELEMENT
)
1025 && ref
->type
!= REF_ARRAY
)
1032 /* Try to collapse intrinsic expressions. */
1035 simplify_intrinsic_op (gfc_expr
*p
, int type
)
1037 gfc_intrinsic_op op
;
1038 gfc_expr
*op1
, *op2
, *result
;
1040 if (p
->value
.op
.op
== INTRINSIC_USER
)
1043 op1
= p
->value
.op
.op1
;
1044 op2
= p
->value
.op
.op2
;
1045 op
= p
->value
.op
.op
;
1047 if (!gfc_simplify_expr (op1
, type
))
1049 if (!gfc_simplify_expr (op2
, type
))
1052 if (!gfc_is_constant_expr (op1
)
1053 || (op2
!= NULL
&& !gfc_is_constant_expr (op2
)))
1057 p
->value
.op
.op1
= NULL
;
1058 p
->value
.op
.op2
= NULL
;
1062 case INTRINSIC_PARENTHESES
:
1063 result
= gfc_parentheses (op1
);
1066 case INTRINSIC_UPLUS
:
1067 result
= gfc_uplus (op1
);
1070 case INTRINSIC_UMINUS
:
1071 result
= gfc_uminus (op1
);
1074 case INTRINSIC_PLUS
:
1075 result
= gfc_add (op1
, op2
);
1078 case INTRINSIC_MINUS
:
1079 result
= gfc_subtract (op1
, op2
);
1082 case INTRINSIC_TIMES
:
1083 result
= gfc_multiply (op1
, op2
);
1086 case INTRINSIC_DIVIDE
:
1087 result
= gfc_divide (op1
, op2
);
1090 case INTRINSIC_POWER
:
1091 result
= gfc_power (op1
, op2
);
1094 case INTRINSIC_CONCAT
:
1095 result
= gfc_concat (op1
, op2
);
1099 case INTRINSIC_EQ_OS
:
1100 result
= gfc_eq (op1
, op2
, op
);
1104 case INTRINSIC_NE_OS
:
1105 result
= gfc_ne (op1
, op2
, op
);
1109 case INTRINSIC_GT_OS
:
1110 result
= gfc_gt (op1
, op2
, op
);
1114 case INTRINSIC_GE_OS
:
1115 result
= gfc_ge (op1
, op2
, op
);
1119 case INTRINSIC_LT_OS
:
1120 result
= gfc_lt (op1
, op2
, op
);
1124 case INTRINSIC_LE_OS
:
1125 result
= gfc_le (op1
, op2
, op
);
1129 result
= gfc_not (op1
);
1133 result
= gfc_and (op1
, op2
);
1137 result
= gfc_or (op1
, op2
);
1141 result
= gfc_eqv (op1
, op2
);
1144 case INTRINSIC_NEQV
:
1145 result
= gfc_neqv (op1
, op2
);
1149 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
1154 gfc_free_expr (op1
);
1155 gfc_free_expr (op2
);
1159 result
->rank
= p
->rank
;
1160 result
->where
= p
->where
;
1161 gfc_replace_expr (p
, result
);
1167 /* Subroutine to simplify constructor expressions. Mutually recursive
1168 with gfc_simplify_expr(). */
1171 simplify_constructor (gfc_constructor_base base
, int type
)
1176 for (c
= gfc_constructor_first (base
); c
; c
= gfc_constructor_next (c
))
1179 && (!gfc_simplify_expr(c
->iterator
->start
, type
)
1180 || !gfc_simplify_expr (c
->iterator
->end
, type
)
1181 || !gfc_simplify_expr (c
->iterator
->step
, type
)))
1186 /* Try and simplify a copy. Replace the original if successful
1187 but keep going through the constructor at all costs. Not
1188 doing so can make a dog's dinner of complicated things. */
1189 p
= gfc_copy_expr (c
->expr
);
1191 if (!gfc_simplify_expr (p
, type
))
1197 gfc_replace_expr (c
->expr
, p
);
1205 /* Pull a single array element out of an array constructor. */
1208 find_array_element (gfc_constructor_base base
, gfc_array_ref
*ar
,
1209 gfc_constructor
**rval
)
1211 unsigned long nelemen
;
1217 gfc_constructor
*cons
;
1224 mpz_init_set_ui (offset
, 0);
1227 mpz_init_set_ui (span
, 1);
1228 for (i
= 0; i
< ar
->dimen
; i
++)
1230 if (!gfc_reduce_init_expr (ar
->as
->lower
[i
])
1231 || !gfc_reduce_init_expr (ar
->as
->upper
[i
]))
1239 if (e
->expr_type
!= EXPR_CONSTANT
)
1245 gcc_assert (ar
->as
->upper
[i
]->expr_type
== EXPR_CONSTANT
1246 && ar
->as
->lower
[i
]->expr_type
== EXPR_CONSTANT
);
1248 /* Check the bounds. */
1249 if ((ar
->as
->upper
[i
]
1250 && mpz_cmp (e
->value
.integer
,
1251 ar
->as
->upper
[i
]->value
.integer
) > 0)
1252 || (mpz_cmp (e
->value
.integer
,
1253 ar
->as
->lower
[i
]->value
.integer
) < 0))
1255 gfc_error ("Index in dimension %d is out of bounds "
1256 "at %L", i
+ 1, &ar
->c_where
[i
]);
1262 mpz_sub (delta
, e
->value
.integer
, ar
->as
->lower
[i
]->value
.integer
);
1263 mpz_mul (delta
, delta
, span
);
1264 mpz_add (offset
, offset
, delta
);
1266 mpz_set_ui (tmp
, 1);
1267 mpz_add (tmp
, tmp
, ar
->as
->upper
[i
]->value
.integer
);
1268 mpz_sub (tmp
, tmp
, ar
->as
->lower
[i
]->value
.integer
);
1269 mpz_mul (span
, span
, tmp
);
1272 for (cons
= gfc_constructor_first (base
), nelemen
= mpz_get_ui (offset
);
1273 cons
&& nelemen
> 0; cons
= gfc_constructor_next (cons
), nelemen
--)
1292 /* Find a component of a structure constructor. */
1294 static gfc_constructor
*
1295 find_component_ref (gfc_constructor_base base
, gfc_ref
*ref
)
1297 gfc_component
*pick
= ref
->u
.c
.component
;
1298 gfc_constructor
*c
= gfc_constructor_first (base
);
1300 gfc_symbol
*dt
= ref
->u
.c
.sym
;
1301 int ext
= dt
->attr
.extension
;
1303 /* For extended types, check if the desired component is in one of the
1305 while (ext
> 0 && gfc_find_component (dt
->components
->ts
.u
.derived
,
1306 pick
->name
, true, true, NULL
))
1308 dt
= dt
->components
->ts
.u
.derived
;
1309 c
= gfc_constructor_first (c
->expr
->value
.constructor
);
1313 gfc_component
*comp
= dt
->components
;
1314 while (comp
!= pick
)
1317 c
= gfc_constructor_next (c
);
1324 /* Replace an expression with the contents of a constructor, removing
1325 the subobject reference in the process. */
1328 remove_subobject_ref (gfc_expr
*p
, gfc_constructor
*cons
)
1338 e
= gfc_copy_expr (p
);
1339 e
->ref
= p
->ref
->next
;
1340 p
->ref
->next
= NULL
;
1341 gfc_replace_expr (p
, e
);
1345 /* Pull an array section out of an array constructor. */
1348 find_array_section (gfc_expr
*expr
, gfc_ref
*ref
)
1355 long unsigned one
= 1;
1357 mpz_t start
[GFC_MAX_DIMENSIONS
];
1358 mpz_t end
[GFC_MAX_DIMENSIONS
];
1359 mpz_t stride
[GFC_MAX_DIMENSIONS
];
1360 mpz_t delta
[GFC_MAX_DIMENSIONS
];
1361 mpz_t ctr
[GFC_MAX_DIMENSIONS
];
1366 gfc_constructor_base base
;
1367 gfc_constructor
*cons
, *vecsub
[GFC_MAX_DIMENSIONS
];
1377 base
= expr
->value
.constructor
;
1378 expr
->value
.constructor
= NULL
;
1380 rank
= ref
->u
.ar
.as
->rank
;
1382 if (expr
->shape
== NULL
)
1383 expr
->shape
= gfc_get_shape (rank
);
1385 mpz_init_set_ui (delta_mpz
, one
);
1386 mpz_init_set_ui (nelts
, one
);
1389 /* Do the initialization now, so that we can cleanup without
1390 keeping track of where we were. */
1391 for (d
= 0; d
< rank
; d
++)
1393 mpz_init (delta
[d
]);
1394 mpz_init (start
[d
]);
1397 mpz_init (stride
[d
]);
1401 /* Build the counters to clock through the array reference. */
1403 for (d
= 0; d
< rank
; d
++)
1405 /* Make this stretch of code easier on the eye! */
1406 begin
= ref
->u
.ar
.start
[d
];
1407 finish
= ref
->u
.ar
.end
[d
];
1408 step
= ref
->u
.ar
.stride
[d
];
1409 lower
= ref
->u
.ar
.as
->lower
[d
];
1410 upper
= ref
->u
.ar
.as
->upper
[d
];
1412 if (ref
->u
.ar
.dimen_type
[d
] == DIMEN_VECTOR
) /* Vector subscript. */
1414 gfc_constructor
*ci
;
1417 if (begin
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (begin
))
1423 gcc_assert (begin
->rank
== 1);
1424 /* Zero-sized arrays have no shape and no elements, stop early. */
1427 mpz_init_set_ui (nelts
, 0);
1431 vecsub
[d
] = gfc_constructor_first (begin
->value
.constructor
);
1432 mpz_set (ctr
[d
], vecsub
[d
]->expr
->value
.integer
);
1433 mpz_mul (nelts
, nelts
, begin
->shape
[0]);
1434 mpz_set (expr
->shape
[shape_i
++], begin
->shape
[0]);
1437 for (ci
= vecsub
[d
]; ci
; ci
= gfc_constructor_next (ci
))
1439 if (mpz_cmp (ci
->expr
->value
.integer
, upper
->value
.integer
) > 0
1440 || mpz_cmp (ci
->expr
->value
.integer
,
1441 lower
->value
.integer
) < 0)
1443 gfc_error ("index in dimension %d is out of bounds "
1444 "at %L", d
+ 1, &ref
->u
.ar
.c_where
[d
]);
1452 if ((begin
&& begin
->expr_type
!= EXPR_CONSTANT
)
1453 || (finish
&& finish
->expr_type
!= EXPR_CONSTANT
)
1454 || (step
&& step
->expr_type
!= EXPR_CONSTANT
))
1460 /* Obtain the stride. */
1462 mpz_set (stride
[d
], step
->value
.integer
);
1464 mpz_set_ui (stride
[d
], one
);
1466 if (mpz_cmp_ui (stride
[d
], 0) == 0)
1467 mpz_set_ui (stride
[d
], one
);
1469 /* Obtain the start value for the index. */
1471 mpz_set (start
[d
], begin
->value
.integer
);
1473 mpz_set (start
[d
], lower
->value
.integer
);
1475 mpz_set (ctr
[d
], start
[d
]);
1477 /* Obtain the end value for the index. */
1479 mpz_set (end
[d
], finish
->value
.integer
);
1481 mpz_set (end
[d
], upper
->value
.integer
);
1483 /* Separate 'if' because elements sometimes arrive with
1485 if (ref
->u
.ar
.dimen_type
[d
] == DIMEN_ELEMENT
)
1486 mpz_set (end
[d
], begin
->value
.integer
);
1488 /* Check the bounds. */
1489 if (mpz_cmp (ctr
[d
], upper
->value
.integer
) > 0
1490 || mpz_cmp (end
[d
], upper
->value
.integer
) > 0
1491 || mpz_cmp (ctr
[d
], lower
->value
.integer
) < 0
1492 || mpz_cmp (end
[d
], lower
->value
.integer
) < 0)
1494 gfc_error ("index in dimension %d is out of bounds "
1495 "at %L", d
+ 1, &ref
->u
.ar
.c_where
[d
]);
1500 /* Calculate the number of elements and the shape. */
1501 mpz_set (tmp_mpz
, stride
[d
]);
1502 mpz_add (tmp_mpz
, end
[d
], tmp_mpz
);
1503 mpz_sub (tmp_mpz
, tmp_mpz
, ctr
[d
]);
1504 mpz_div (tmp_mpz
, tmp_mpz
, stride
[d
]);
1505 mpz_mul (nelts
, nelts
, tmp_mpz
);
1507 /* An element reference reduces the rank of the expression; don't
1508 add anything to the shape array. */
1509 if (ref
->u
.ar
.dimen_type
[d
] != DIMEN_ELEMENT
)
1510 mpz_set (expr
->shape
[shape_i
++], tmp_mpz
);
1513 /* Calculate the 'stride' (=delta) for conversion of the
1514 counter values into the index along the constructor. */
1515 mpz_set (delta
[d
], delta_mpz
);
1516 mpz_sub (tmp_mpz
, upper
->value
.integer
, lower
->value
.integer
);
1517 mpz_add_ui (tmp_mpz
, tmp_mpz
, one
);
1518 mpz_mul (delta_mpz
, delta_mpz
, tmp_mpz
);
1522 cons
= gfc_constructor_first (base
);
1524 /* Now clock through the array reference, calculating the index in
1525 the source constructor and transferring the elements to the new
1527 for (idx
= 0; idx
< (int) mpz_get_si (nelts
); idx
++)
1529 mpz_init_set_ui (ptr
, 0);
1532 for (d
= 0; d
< rank
; d
++)
1534 mpz_set (tmp_mpz
, ctr
[d
]);
1535 mpz_sub (tmp_mpz
, tmp_mpz
, ref
->u
.ar
.as
->lower
[d
]->value
.integer
);
1536 mpz_mul (tmp_mpz
, tmp_mpz
, delta
[d
]);
1537 mpz_add (ptr
, ptr
, tmp_mpz
);
1539 if (!incr_ctr
) continue;
1541 if (ref
->u
.ar
.dimen_type
[d
] == DIMEN_VECTOR
) /* Vector subscript. */
1543 gcc_assert(vecsub
[d
]);
1545 if (!gfc_constructor_next (vecsub
[d
]))
1546 vecsub
[d
] = gfc_constructor_first (ref
->u
.ar
.start
[d
]->value
.constructor
);
1549 vecsub
[d
] = gfc_constructor_next (vecsub
[d
]);
1552 mpz_set (ctr
[d
], vecsub
[d
]->expr
->value
.integer
);
1556 mpz_add (ctr
[d
], ctr
[d
], stride
[d
]);
1558 if (mpz_cmp_ui (stride
[d
], 0) > 0
1559 ? mpz_cmp (ctr
[d
], end
[d
]) > 0
1560 : mpz_cmp (ctr
[d
], end
[d
]) < 0)
1561 mpz_set (ctr
[d
], start
[d
]);
1567 limit
= mpz_get_ui (ptr
);
1568 if (limit
>= flag_max_array_constructor
)
1570 gfc_error ("The number of elements in the array constructor "
1571 "at %L requires an increase of the allowed %d "
1572 "upper limit. See -fmax-array-constructor "
1573 "option", &expr
->where
, flag_max_array_constructor
);
1577 cons
= gfc_constructor_lookup (base
, limit
);
1579 gfc_constructor_append_expr (&expr
->value
.constructor
,
1580 gfc_copy_expr (cons
->expr
), NULL
);
1587 mpz_clear (delta_mpz
);
1588 mpz_clear (tmp_mpz
);
1590 for (d
= 0; d
< rank
; d
++)
1592 mpz_clear (delta
[d
]);
1593 mpz_clear (start
[d
]);
1596 mpz_clear (stride
[d
]);
1598 gfc_constructor_free (base
);
1602 /* Pull a substring out of an expression. */
1605 find_substring_ref (gfc_expr
*p
, gfc_expr
**newp
)
1612 if (p
->ref
->u
.ss
.start
->expr_type
!= EXPR_CONSTANT
1613 || p
->ref
->u
.ss
.end
->expr_type
!= EXPR_CONSTANT
)
1616 *newp
= gfc_copy_expr (p
);
1617 free ((*newp
)->value
.character
.string
);
1619 end
= (int) mpz_get_ui (p
->ref
->u
.ss
.end
->value
.integer
);
1620 start
= (int) mpz_get_ui (p
->ref
->u
.ss
.start
->value
.integer
);
1621 length
= end
- start
+ 1;
1623 chr
= (*newp
)->value
.character
.string
= gfc_get_wide_string (length
+ 1);
1624 (*newp
)->value
.character
.length
= length
;
1625 memcpy (chr
, &p
->value
.character
.string
[start
- 1],
1626 length
* sizeof (gfc_char_t
));
1633 /* Simplify a subobject reference of a constructor. This occurs when
1634 parameter variable values are substituted. */
1637 simplify_const_ref (gfc_expr
*p
)
1639 gfc_constructor
*cons
, *c
;
1645 switch (p
->ref
->type
)
1648 switch (p
->ref
->u
.ar
.type
)
1651 /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1652 will generate this. */
1653 if (p
->expr_type
!= EXPR_ARRAY
)
1655 remove_subobject_ref (p
, NULL
);
1658 if (!find_array_element (p
->value
.constructor
, &p
->ref
->u
.ar
, &cons
))
1664 remove_subobject_ref (p
, cons
);
1668 if (!find_array_section (p
, p
->ref
))
1670 p
->ref
->u
.ar
.type
= AR_FULL
;
1675 if (p
->ref
->next
!= NULL
1676 && (p
->ts
.type
== BT_CHARACTER
|| gfc_bt_struct (p
->ts
.type
)))
1678 for (c
= gfc_constructor_first (p
->value
.constructor
);
1679 c
; c
= gfc_constructor_next (c
))
1681 c
->expr
->ref
= gfc_copy_ref (p
->ref
->next
);
1682 if (!simplify_const_ref (c
->expr
))
1686 if (gfc_bt_struct (p
->ts
.type
)
1688 && (c
= gfc_constructor_first (p
->value
.constructor
)))
1690 /* There may have been component references. */
1691 p
->ts
= c
->expr
->ts
;
1695 for (; last_ref
->next
; last_ref
= last_ref
->next
) {};
1697 if (p
->ts
.type
== BT_CHARACTER
1698 && last_ref
->type
== REF_SUBSTRING
)
1700 /* If this is a CHARACTER array and we possibly took
1701 a substring out of it, update the type-spec's
1702 character length according to the first element
1703 (as all should have the same length). */
1705 if ((c
= gfc_constructor_first (p
->value
.constructor
)))
1707 const gfc_expr
* first
= c
->expr
;
1708 gcc_assert (first
->expr_type
== EXPR_CONSTANT
);
1709 gcc_assert (first
->ts
.type
== BT_CHARACTER
);
1710 string_len
= first
->value
.character
.length
;
1716 p
->ts
.u
.cl
= gfc_new_charlen (p
->symtree
->n
.sym
->ns
,
1719 gfc_free_expr (p
->ts
.u
.cl
->length
);
1722 = gfc_get_int_expr (gfc_default_integer_kind
,
1726 gfc_free_ref_list (p
->ref
);
1737 cons
= find_component_ref (p
->value
.constructor
, p
->ref
);
1738 remove_subobject_ref (p
, cons
);
1742 if (!find_substring_ref (p
, &newp
))
1745 gfc_replace_expr (p
, newp
);
1746 gfc_free_ref_list (p
->ref
);
1756 /* Simplify a chain of references. */
1759 simplify_ref_chain (gfc_ref
*ref
, int type
)
1763 for (; ref
; ref
= ref
->next
)
1768 for (n
= 0; n
< ref
->u
.ar
.dimen
; n
++)
1770 if (!gfc_simplify_expr (ref
->u
.ar
.start
[n
], type
))
1772 if (!gfc_simplify_expr (ref
->u
.ar
.end
[n
], type
))
1774 if (!gfc_simplify_expr (ref
->u
.ar
.stride
[n
], type
))
1780 if (!gfc_simplify_expr (ref
->u
.ss
.start
, type
))
1782 if (!gfc_simplify_expr (ref
->u
.ss
.end
, type
))
1794 /* Try to substitute the value of a parameter variable. */
1797 simplify_parameter_variable (gfc_expr
*p
, int type
)
1802 e
= gfc_copy_expr (p
->symtree
->n
.sym
->value
);
1808 /* Do not copy subobject refs for constant. */
1809 if (e
->expr_type
!= EXPR_CONSTANT
&& p
->ref
!= NULL
)
1810 e
->ref
= gfc_copy_ref (p
->ref
);
1811 t
= gfc_simplify_expr (e
, type
);
1813 /* Only use the simplification if it eliminated all subobject references. */
1815 gfc_replace_expr (p
, e
);
1822 /* Given an expression, simplify it by collapsing constant
1823 expressions. Most simplification takes place when the expression
1824 tree is being constructed. If an intrinsic function is simplified
1825 at some point, we get called again to collapse the result against
1828 We work by recursively simplifying expression nodes, simplifying
1829 intrinsic functions where possible, which can lead to further
1830 constant collapsing. If an operator has constant operand(s), we
1831 rip the expression apart, and rebuild it, hoping that it becomes
1834 The expression type is defined for:
1835 0 Basic expression parsing
1836 1 Simplifying array constructors -- will substitute
1838 Returns false on error, true otherwise.
1839 NOTE: Will return true even if the expression can not be simplified. */
1842 gfc_simplify_expr (gfc_expr
*p
, int type
)
1844 gfc_actual_arglist
*ap
;
1849 switch (p
->expr_type
)
1856 for (ap
= p
->value
.function
.actual
; ap
; ap
= ap
->next
)
1857 if (!gfc_simplify_expr (ap
->expr
, type
))
1860 if (p
->value
.function
.isym
!= NULL
1861 && gfc_intrinsic_func_interface (p
, 1) == MATCH_ERROR
)
1866 case EXPR_SUBSTRING
:
1867 if (!simplify_ref_chain (p
->ref
, type
))
1870 if (gfc_is_constant_expr (p
))
1876 if (p
->ref
&& p
->ref
->u
.ss
.start
)
1878 gfc_extract_int (p
->ref
->u
.ss
.start
, &start
);
1879 start
--; /* Convert from one-based to zero-based. */
1882 end
= p
->value
.character
.length
;
1883 if (p
->ref
&& p
->ref
->u
.ss
.end
)
1884 gfc_extract_int (p
->ref
->u
.ss
.end
, &end
);
1889 s
= gfc_get_wide_string (end
- start
+ 2);
1890 memcpy (s
, p
->value
.character
.string
+ start
,
1891 (end
- start
) * sizeof (gfc_char_t
));
1892 s
[end
- start
+ 1] = '\0'; /* TODO: C-style string. */
1893 free (p
->value
.character
.string
);
1894 p
->value
.character
.string
= s
;
1895 p
->value
.character
.length
= end
- start
;
1896 p
->ts
.u
.cl
= gfc_new_charlen (gfc_current_ns
, NULL
);
1897 p
->ts
.u
.cl
->length
= gfc_get_int_expr (gfc_default_integer_kind
,
1899 p
->value
.character
.length
);
1900 gfc_free_ref_list (p
->ref
);
1902 p
->expr_type
= EXPR_CONSTANT
;
1907 if (!simplify_intrinsic_op (p
, type
))
1912 /* Only substitute array parameter variables if we are in an
1913 initialization expression, or we want a subsection. */
1914 if (p
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
1915 && (gfc_init_expr_flag
|| p
->ref
1916 || p
->symtree
->n
.sym
->value
->expr_type
!= EXPR_ARRAY
))
1918 if (!simplify_parameter_variable (p
, type
))
1925 gfc_simplify_iterator_var (p
);
1928 /* Simplify subcomponent references. */
1929 if (!simplify_ref_chain (p
->ref
, type
))
1934 case EXPR_STRUCTURE
:
1936 if (!simplify_ref_chain (p
->ref
, type
))
1939 if (!simplify_constructor (p
->value
.constructor
, type
))
1942 if (p
->expr_type
== EXPR_ARRAY
&& p
->ref
&& p
->ref
->type
== REF_ARRAY
1943 && p
->ref
->u
.ar
.type
== AR_FULL
)
1944 gfc_expand_constructor (p
, false);
1946 if (!simplify_const_ref (p
))
1960 /* Returns the type of an expression with the exception that iterator
1961 variables are automatically integers no matter what else they may
1967 if (e
->expr_type
== EXPR_VARIABLE
&& gfc_check_iter_variable (e
))
1974 /* Scalarize an expression for an elemental intrinsic call. */
1977 scalarize_intrinsic_call (gfc_expr
*e
)
1979 gfc_actual_arglist
*a
, *b
;
1980 gfc_constructor_base ctor
;
1981 gfc_constructor
*args
[5] = {}; /* Avoid uninitialized warnings. */
1982 gfc_constructor
*ci
, *new_ctor
;
1983 gfc_expr
*expr
, *old
;
1984 int n
, i
, rank
[5], array_arg
;
1986 /* Find which, if any, arguments are arrays. Assume that the old
1987 expression carries the type information and that the first arg
1988 that is an array expression carries all the shape information.*/
1990 a
= e
->value
.function
.actual
;
1991 for (; a
; a
= a
->next
)
1994 if (!a
->expr
|| a
->expr
->expr_type
!= EXPR_ARRAY
)
1997 expr
= gfc_copy_expr (a
->expr
);
2004 old
= gfc_copy_expr (e
);
2006 gfc_constructor_free (expr
->value
.constructor
);
2007 expr
->value
.constructor
= NULL
;
2009 expr
->where
= old
->where
;
2010 expr
->expr_type
= EXPR_ARRAY
;
2012 /* Copy the array argument constructors into an array, with nulls
2015 a
= old
->value
.function
.actual
;
2016 for (; a
; a
= a
->next
)
2018 /* Check that this is OK for an initialization expression. */
2019 if (a
->expr
&& !gfc_check_init_expr (a
->expr
))
2023 if (a
->expr
&& a
->expr
->rank
&& a
->expr
->expr_type
== EXPR_VARIABLE
)
2025 rank
[n
] = a
->expr
->rank
;
2026 ctor
= a
->expr
->symtree
->n
.sym
->value
->value
.constructor
;
2027 args
[n
] = gfc_constructor_first (ctor
);
2029 else if (a
->expr
&& a
->expr
->expr_type
== EXPR_ARRAY
)
2032 rank
[n
] = a
->expr
->rank
;
2035 ctor
= gfc_constructor_copy (a
->expr
->value
.constructor
);
2036 args
[n
] = gfc_constructor_first (ctor
);
2045 /* Using the array argument as the master, step through the array
2046 calling the function for each element and advancing the array
2047 constructors together. */
2048 for (ci
= args
[array_arg
- 1]; ci
; ci
= gfc_constructor_next (ci
))
2050 new_ctor
= gfc_constructor_append_expr (&expr
->value
.constructor
,
2051 gfc_copy_expr (old
), NULL
);
2053 gfc_free_actual_arglist (new_ctor
->expr
->value
.function
.actual
);
2055 b
= old
->value
.function
.actual
;
2056 for (i
= 0; i
< n
; i
++)
2059 new_ctor
->expr
->value
.function
.actual
2060 = a
= gfc_get_actual_arglist ();
2063 a
->next
= gfc_get_actual_arglist ();
2068 a
->expr
= gfc_copy_expr (args
[i
]->expr
);
2070 a
->expr
= gfc_copy_expr (b
->expr
);
2075 /* Simplify the function calls. If the simplification fails, the
2076 error will be flagged up down-stream or the library will deal
2078 gfc_simplify_expr (new_ctor
->expr
, 0);
2080 for (i
= 0; i
< n
; i
++)
2082 args
[i
] = gfc_constructor_next (args
[i
]);
2084 for (i
= 1; i
< n
; i
++)
2085 if (rank
[i
] && ((args
[i
] != NULL
&& args
[array_arg
- 1] == NULL
)
2086 || (args
[i
] == NULL
&& args
[array_arg
- 1] != NULL
)))
2092 /* Free "expr" but not the pointers it contains. */
2094 gfc_free_expr (old
);
2098 gfc_error_now ("elemental function arguments at %C are not compliant");
2101 gfc_free_expr (expr
);
2102 gfc_free_expr (old
);
2108 check_intrinsic_op (gfc_expr
*e
, bool (*check_function
) (gfc_expr
*))
2110 gfc_expr
*op1
= e
->value
.op
.op1
;
2111 gfc_expr
*op2
= e
->value
.op
.op2
;
2113 if (!(*check_function
)(op1
))
2116 switch (e
->value
.op
.op
)
2118 case INTRINSIC_UPLUS
:
2119 case INTRINSIC_UMINUS
:
2120 if (!numeric_type (et0 (op1
)))
2125 case INTRINSIC_EQ_OS
:
2127 case INTRINSIC_NE_OS
:
2129 case INTRINSIC_GT_OS
:
2131 case INTRINSIC_GE_OS
:
2133 case INTRINSIC_LT_OS
:
2135 case INTRINSIC_LE_OS
:
2136 if (!(*check_function
)(op2
))
2139 if (!(et0 (op1
) == BT_CHARACTER
&& et0 (op2
) == BT_CHARACTER
)
2140 && !(numeric_type (et0 (op1
)) && numeric_type (et0 (op2
))))
2142 gfc_error ("Numeric or CHARACTER operands are required in "
2143 "expression at %L", &e
->where
);
2148 case INTRINSIC_PLUS
:
2149 case INTRINSIC_MINUS
:
2150 case INTRINSIC_TIMES
:
2151 case INTRINSIC_DIVIDE
:
2152 case INTRINSIC_POWER
:
2153 if (!(*check_function
)(op2
))
2156 if (!numeric_type (et0 (op1
)) || !numeric_type (et0 (op2
)))
2161 case INTRINSIC_CONCAT
:
2162 if (!(*check_function
)(op2
))
2165 if (et0 (op1
) != BT_CHARACTER
|| et0 (op2
) != BT_CHARACTER
)
2167 gfc_error ("Concatenation operator in expression at %L "
2168 "must have two CHARACTER operands", &op1
->where
);
2172 if (op1
->ts
.kind
!= op2
->ts
.kind
)
2174 gfc_error ("Concat operator at %L must concatenate strings of the "
2175 "same kind", &e
->where
);
2182 if (et0 (op1
) != BT_LOGICAL
)
2184 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2185 "operand", &op1
->where
);
2194 case INTRINSIC_NEQV
:
2195 if (!(*check_function
)(op2
))
2198 if (et0 (op1
) != BT_LOGICAL
|| et0 (op2
) != BT_LOGICAL
)
2200 gfc_error ("LOGICAL operands are required in expression at %L",
2207 case INTRINSIC_PARENTHESES
:
2211 gfc_error ("Only intrinsic operators can be used in expression at %L",
2219 gfc_error ("Numeric operands are required in expression at %L", &e
->where
);
2224 /* F2003, 7.1.7 (3): In init expression, allocatable components
2225 must not be data-initialized. */
2227 check_alloc_comp_init (gfc_expr
*e
)
2229 gfc_component
*comp
;
2230 gfc_constructor
*ctor
;
2232 gcc_assert (e
->expr_type
== EXPR_STRUCTURE
);
2233 gcc_assert (e
->ts
.type
== BT_DERIVED
|| e
->ts
.type
== BT_CLASS
);
2235 for (comp
= e
->ts
.u
.derived
->components
,
2236 ctor
= gfc_constructor_first (e
->value
.constructor
);
2237 comp
; comp
= comp
->next
, ctor
= gfc_constructor_next (ctor
))
2239 if (comp
->attr
.allocatable
&& ctor
->expr
2240 && ctor
->expr
->expr_type
!= EXPR_NULL
)
2242 gfc_error ("Invalid initialization expression for ALLOCATABLE "
2243 "component %qs in structure constructor at %L",
2244 comp
->name
, &ctor
->expr
->where
);
2253 check_init_expr_arguments (gfc_expr
*e
)
2255 gfc_actual_arglist
*ap
;
2257 for (ap
= e
->value
.function
.actual
; ap
; ap
= ap
->next
)
2258 if (!gfc_check_init_expr (ap
->expr
))
2264 static bool check_restricted (gfc_expr
*);
2266 /* F95, 7.1.6.1, Initialization expressions, (7)
2267 F2003, 7.1.7 Initialization expression, (8) */
2270 check_inquiry (gfc_expr
*e
, int not_restricted
)
2273 const char *const *functions
;
2275 static const char *const inquiry_func_f95
[] = {
2276 "lbound", "shape", "size", "ubound",
2277 "bit_size", "len", "kind",
2278 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2279 "precision", "radix", "range", "tiny",
2283 static const char *const inquiry_func_f2003
[] = {
2284 "lbound", "shape", "size", "ubound",
2285 "bit_size", "len", "kind",
2286 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2287 "precision", "radix", "range", "tiny",
2292 gfc_actual_arglist
*ap
;
2294 if (!e
->value
.function
.isym
2295 || !e
->value
.function
.isym
->inquiry
)
2298 /* An undeclared parameter will get us here (PR25018). */
2299 if (e
->symtree
== NULL
)
2302 if (e
->symtree
->n
.sym
->from_intmod
)
2304 if (e
->symtree
->n
.sym
->from_intmod
== INTMOD_ISO_FORTRAN_ENV
2305 && e
->symtree
->n
.sym
->intmod_sym_id
!= ISOFORTRAN_COMPILER_OPTIONS
2306 && e
->symtree
->n
.sym
->intmod_sym_id
!= ISOFORTRAN_COMPILER_VERSION
)
2309 if (e
->symtree
->n
.sym
->from_intmod
== INTMOD_ISO_C_BINDING
2310 && e
->symtree
->n
.sym
->intmod_sym_id
!= ISOCBINDING_C_SIZEOF
)
2315 name
= e
->symtree
->n
.sym
->name
;
2317 functions
= (gfc_option
.warn_std
& GFC_STD_F2003
)
2318 ? inquiry_func_f2003
: inquiry_func_f95
;
2320 for (i
= 0; functions
[i
]; i
++)
2321 if (strcmp (functions
[i
], name
) == 0)
2324 if (functions
[i
] == NULL
)
2328 /* At this point we have an inquiry function with a variable argument. The
2329 type of the variable might be undefined, but we need it now, because the
2330 arguments of these functions are not allowed to be undefined. */
2332 for (ap
= e
->value
.function
.actual
; ap
; ap
= ap
->next
)
2337 if (ap
->expr
->ts
.type
== BT_UNKNOWN
)
2339 if (ap
->expr
->symtree
->n
.sym
->ts
.type
== BT_UNKNOWN
2340 && !gfc_set_default_type (ap
->expr
->symtree
->n
.sym
, 0, gfc_current_ns
))
2343 ap
->expr
->ts
= ap
->expr
->symtree
->n
.sym
->ts
;
2346 /* Assumed character length will not reduce to a constant expression
2347 with LEN, as required by the standard. */
2348 if (i
== 5 && not_restricted
2349 && ap
->expr
->symtree
->n
.sym
->ts
.type
== BT_CHARACTER
2350 && (ap
->expr
->symtree
->n
.sym
->ts
.u
.cl
->length
== NULL
2351 || ap
->expr
->symtree
->n
.sym
->ts
.deferred
))
2353 gfc_error ("Assumed or deferred character length variable %qs "
2354 "in constant expression at %L",
2355 ap
->expr
->symtree
->n
.sym
->name
,
2359 else if (not_restricted
&& !gfc_check_init_expr (ap
->expr
))
2362 if (not_restricted
== 0
2363 && ap
->expr
->expr_type
!= EXPR_VARIABLE
2364 && !check_restricted (ap
->expr
))
2367 if (not_restricted
== 0
2368 && ap
->expr
->expr_type
== EXPR_VARIABLE
2369 && ap
->expr
->symtree
->n
.sym
->attr
.dummy
2370 && ap
->expr
->symtree
->n
.sym
->attr
.optional
)
2378 /* F95, 7.1.6.1, Initialization expressions, (5)
2379 F2003, 7.1.7 Initialization expression, (5) */
2382 check_transformational (gfc_expr
*e
)
2384 static const char * const trans_func_f95
[] = {
2385 "repeat", "reshape", "selected_int_kind",
2386 "selected_real_kind", "transfer", "trim", NULL
2389 static const char * const trans_func_f2003
[] = {
2390 "all", "any", "count", "dot_product", "matmul", "null", "pack",
2391 "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2392 "selected_real_kind", "spread", "sum", "transfer", "transpose",
2393 "trim", "unpack", NULL
2398 const char *const *functions
;
2400 if (!e
->value
.function
.isym
2401 || !e
->value
.function
.isym
->transformational
)
2404 name
= e
->symtree
->n
.sym
->name
;
2406 functions
= (gfc_option
.allow_std
& GFC_STD_F2003
)
2407 ? trans_func_f2003
: trans_func_f95
;
2409 /* NULL() is dealt with below. */
2410 if (strcmp ("null", name
) == 0)
2413 for (i
= 0; functions
[i
]; i
++)
2414 if (strcmp (functions
[i
], name
) == 0)
2417 if (functions
[i
] == NULL
)
2419 gfc_error ("transformational intrinsic %qs at %L is not permitted "
2420 "in an initialization expression", name
, &e
->where
);
2424 return check_init_expr_arguments (e
);
2428 /* F95, 7.1.6.1, Initialization expressions, (6)
2429 F2003, 7.1.7 Initialization expression, (6) */
2432 check_null (gfc_expr
*e
)
2434 if (strcmp ("null", e
->symtree
->n
.sym
->name
) != 0)
2437 return check_init_expr_arguments (e
);
2442 check_elemental (gfc_expr
*e
)
2444 if (!e
->value
.function
.isym
2445 || !e
->value
.function
.isym
->elemental
)
2448 if (e
->ts
.type
!= BT_INTEGER
2449 && e
->ts
.type
!= BT_CHARACTER
2450 && !gfc_notify_std (GFC_STD_F2003
, "Evaluation of nonstandard "
2451 "initialization expression at %L", &e
->where
))
2454 return check_init_expr_arguments (e
);
2459 check_conversion (gfc_expr
*e
)
2461 if (!e
->value
.function
.isym
2462 || !e
->value
.function
.isym
->conversion
)
2465 return check_init_expr_arguments (e
);
2469 /* Verify that an expression is an initialization expression. A side
2470 effect is that the expression tree is reduced to a single constant
2471 node if all goes well. This would normally happen when the
2472 expression is constructed but function references are assumed to be
2473 intrinsics in the context of initialization expressions. If
2474 false is returned an error message has been generated. */
2477 gfc_check_init_expr (gfc_expr
*e
)
2485 switch (e
->expr_type
)
2488 t
= check_intrinsic_op (e
, gfc_check_init_expr
);
2490 t
= gfc_simplify_expr (e
, 0);
2499 gfc_intrinsic_sym
* isym
= NULL
;
2500 gfc_symbol
* sym
= e
->symtree
->n
.sym
;
2502 /* Simplify here the intrinsics from the IEEE_ARITHMETIC and
2503 IEEE_EXCEPTIONS modules. */
2504 int mod
= sym
->from_intmod
;
2505 if (mod
== INTMOD_NONE
&& sym
->generic
)
2506 mod
= sym
->generic
->sym
->from_intmod
;
2507 if (mod
== INTMOD_IEEE_ARITHMETIC
|| mod
== INTMOD_IEEE_EXCEPTIONS
)
2509 gfc_expr
*new_expr
= gfc_simplify_ieee_functions (e
);
2512 gfc_replace_expr (e
, new_expr
);
2518 /* If a conversion function, e.g., __convert_i8_i4, was inserted
2519 into an array constructor, we need to skip the error check here.
2520 Conversion errors are caught below in scalarize_intrinsic_call. */
2521 conversion
= e
->value
.function
.isym
2522 && (e
->value
.function
.isym
->conversion
== 1);
2524 if (!conversion
&& (!gfc_is_intrinsic (sym
, 0, e
->where
)
2525 || (m
= gfc_intrinsic_func_interface (e
, 0)) != MATCH_YES
))
2527 gfc_error ("Function %qs in initialization expression at %L "
2528 "must be an intrinsic function",
2529 e
->symtree
->n
.sym
->name
, &e
->where
);
2533 if ((m
= check_conversion (e
)) == MATCH_NO
2534 && (m
= check_inquiry (e
, 1)) == MATCH_NO
2535 && (m
= check_null (e
)) == MATCH_NO
2536 && (m
= check_transformational (e
)) == MATCH_NO
2537 && (m
= check_elemental (e
)) == MATCH_NO
)
2539 gfc_error ("Intrinsic function %qs at %L is not permitted "
2540 "in an initialization expression",
2541 e
->symtree
->n
.sym
->name
, &e
->where
);
2545 if (m
== MATCH_ERROR
)
2548 /* Try to scalarize an elemental intrinsic function that has an
2550 isym
= gfc_find_function (e
->symtree
->n
.sym
->name
);
2551 if (isym
&& isym
->elemental
2552 && (t
= scalarize_intrinsic_call (e
)))
2557 t
= gfc_simplify_expr (e
, 0);
2564 /* This occurs when parsing pdt templates. */
2565 if (gfc_expr_attr (e
).pdt_kind
)
2568 if (gfc_check_iter_variable (e
))
2571 if (e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
2573 /* A PARAMETER shall not be used to define itself, i.e.
2574 REAL, PARAMETER :: x = transfer(0, x)
2576 if (!e
->symtree
->n
.sym
->value
)
2578 gfc_error ("PARAMETER %qs is used at %L before its definition "
2579 "is complete", e
->symtree
->n
.sym
->name
, &e
->where
);
2583 t
= simplify_parameter_variable (e
, 0);
2588 if (gfc_in_match_data ())
2593 if (e
->symtree
->n
.sym
->as
)
2595 switch (e
->symtree
->n
.sym
->as
->type
)
2597 case AS_ASSUMED_SIZE
:
2598 gfc_error ("Assumed size array %qs at %L is not permitted "
2599 "in an initialization expression",
2600 e
->symtree
->n
.sym
->name
, &e
->where
);
2603 case AS_ASSUMED_SHAPE
:
2604 gfc_error ("Assumed shape array %qs at %L is not permitted "
2605 "in an initialization expression",
2606 e
->symtree
->n
.sym
->name
, &e
->where
);
2610 gfc_error ("Deferred array %qs at %L is not permitted "
2611 "in an initialization expression",
2612 e
->symtree
->n
.sym
->name
, &e
->where
);
2616 gfc_error ("Array %qs at %L is a variable, which does "
2617 "not reduce to a constant expression",
2618 e
->symtree
->n
.sym
->name
, &e
->where
);
2626 gfc_error ("Parameter %qs at %L has not been declared or is "
2627 "a variable, which does not reduce to a constant "
2628 "expression", e
->symtree
->name
, &e
->where
);
2637 case EXPR_SUBSTRING
:
2640 t
= gfc_check_init_expr (e
->ref
->u
.ss
.start
);
2644 t
= gfc_check_init_expr (e
->ref
->u
.ss
.end
);
2646 t
= gfc_simplify_expr (e
, 0);
2652 case EXPR_STRUCTURE
:
2653 t
= e
->ts
.is_iso_c
? true : false;
2657 t
= check_alloc_comp_init (e
);
2661 t
= gfc_check_constructor (e
, gfc_check_init_expr
);
2668 t
= gfc_check_constructor (e
, gfc_check_init_expr
);
2672 t
= gfc_expand_constructor (e
, true);
2676 t
= gfc_check_constructor_type (e
);
2680 gfc_internal_error ("check_init_expr(): Unknown expression type");
2686 /* Reduces a general expression to an initialization expression (a constant).
2687 This used to be part of gfc_match_init_expr.
2688 Note that this function doesn't free the given expression on false. */
2691 gfc_reduce_init_expr (gfc_expr
*expr
)
2695 gfc_init_expr_flag
= true;
2696 t
= gfc_resolve_expr (expr
);
2698 t
= gfc_check_init_expr (expr
);
2699 gfc_init_expr_flag
= false;
2704 if (expr
->expr_type
== EXPR_ARRAY
)
2706 if (!gfc_check_constructor_type (expr
))
2708 if (!gfc_expand_constructor (expr
, true))
2716 /* Match an initialization expression. We work by first matching an
2717 expression, then reducing it to a constant. */
2720 gfc_match_init_expr (gfc_expr
**result
)
2728 gfc_init_expr_flag
= true;
2730 m
= gfc_match_expr (&expr
);
2733 gfc_init_expr_flag
= false;
2737 if (gfc_derived_parameter_expr (expr
))
2740 gfc_init_expr_flag
= false;
2744 t
= gfc_reduce_init_expr (expr
);
2747 gfc_free_expr (expr
);
2748 gfc_init_expr_flag
= false;
2753 gfc_init_expr_flag
= false;
2759 /* Given an actual argument list, test to see that each argument is a
2760 restricted expression and optionally if the expression type is
2761 integer or character. */
2764 restricted_args (gfc_actual_arglist
*a
)
2766 for (; a
; a
= a
->next
)
2768 if (!check_restricted (a
->expr
))
2776 /************* Restricted/specification expressions *************/
2779 /* Make sure a non-intrinsic function is a specification function,
2780 * see F08:7.1.11.5. */
2783 external_spec_function (gfc_expr
*e
)
2787 f
= e
->value
.function
.esym
;
2789 /* IEEE functions allowed are "a reference to a transformational function
2790 from the intrinsic module IEEE_ARITHMETIC or IEEE_EXCEPTIONS", and
2791 "inquiry function from the intrinsic modules IEEE_ARITHMETIC and
2792 IEEE_EXCEPTIONS". */
2793 if (f
->from_intmod
== INTMOD_IEEE_ARITHMETIC
2794 || f
->from_intmod
== INTMOD_IEEE_EXCEPTIONS
)
2796 if (!strcmp (f
->name
, "ieee_selected_real_kind")
2797 || !strcmp (f
->name
, "ieee_support_rounding")
2798 || !strcmp (f
->name
, "ieee_support_flag")
2799 || !strcmp (f
->name
, "ieee_support_halting")
2800 || !strcmp (f
->name
, "ieee_support_datatype")
2801 || !strcmp (f
->name
, "ieee_support_denormal")
2802 || !strcmp (f
->name
, "ieee_support_divide")
2803 || !strcmp (f
->name
, "ieee_support_inf")
2804 || !strcmp (f
->name
, "ieee_support_io")
2805 || !strcmp (f
->name
, "ieee_support_nan")
2806 || !strcmp (f
->name
, "ieee_support_sqrt")
2807 || !strcmp (f
->name
, "ieee_support_standard")
2808 || !strcmp (f
->name
, "ieee_support_underflow_control"))
2809 goto function_allowed
;
2812 if (f
->attr
.proc
== PROC_ST_FUNCTION
)
2814 gfc_error ("Specification function %qs at %L cannot be a statement "
2815 "function", f
->name
, &e
->where
);
2819 if (f
->attr
.proc
== PROC_INTERNAL
)
2821 gfc_error ("Specification function %qs at %L cannot be an internal "
2822 "function", f
->name
, &e
->where
);
2826 if (!f
->attr
.pure
&& !f
->attr
.elemental
)
2828 gfc_error ("Specification function %qs at %L must be PURE", f
->name
,
2834 if (f
->attr
.recursive
2835 && !gfc_notify_std (GFC_STD_F2003
,
2836 "Specification function %qs "
2837 "at %L cannot be RECURSIVE", f
->name
, &e
->where
))
2841 return restricted_args (e
->value
.function
.actual
);
2845 /* Check to see that a function reference to an intrinsic is a
2846 restricted expression. */
2849 restricted_intrinsic (gfc_expr
*e
)
2851 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2852 if (check_inquiry (e
, 0) == MATCH_YES
)
2855 return restricted_args (e
->value
.function
.actual
);
2859 /* Check the expressions of an actual arglist. Used by check_restricted. */
2862 check_arglist (gfc_actual_arglist
* arg
, bool (*checker
) (gfc_expr
*))
2864 for (; arg
; arg
= arg
->next
)
2865 if (!checker (arg
->expr
))
2872 /* Check the subscription expressions of a reference chain with a checking
2873 function; used by check_restricted. */
2876 check_references (gfc_ref
* ref
, bool (*checker
) (gfc_expr
*))
2886 for (dim
= 0; dim
!= ref
->u
.ar
.dimen
; ++dim
)
2888 if (!checker (ref
->u
.ar
.start
[dim
]))
2890 if (!checker (ref
->u
.ar
.end
[dim
]))
2892 if (!checker (ref
->u
.ar
.stride
[dim
]))
2898 /* Nothing needed, just proceed to next reference. */
2902 if (!checker (ref
->u
.ss
.start
))
2904 if (!checker (ref
->u
.ss
.end
))
2913 return check_references (ref
->next
, checker
);
2916 /* Return true if ns is a parent of the current ns. */
2919 is_parent_of_current_ns (gfc_namespace
*ns
)
2922 for (p
= gfc_current_ns
->parent
; p
; p
= p
->parent
)
2929 /* Verify that an expression is a restricted expression. Like its
2930 cousin check_init_expr(), an error message is generated if we
2934 check_restricted (gfc_expr
*e
)
2942 switch (e
->expr_type
)
2945 t
= check_intrinsic_op (e
, check_restricted
);
2947 t
= gfc_simplify_expr (e
, 0);
2952 if (e
->value
.function
.esym
)
2954 t
= check_arglist (e
->value
.function
.actual
, &check_restricted
);
2956 t
= external_spec_function (e
);
2960 if (e
->value
.function
.isym
&& e
->value
.function
.isym
->inquiry
)
2963 t
= check_arglist (e
->value
.function
.actual
, &check_restricted
);
2966 t
= restricted_intrinsic (e
);
2971 sym
= e
->symtree
->n
.sym
;
2974 /* If a dummy argument appears in a context that is valid for a
2975 restricted expression in an elemental procedure, it will have
2976 already been simplified away once we get here. Therefore we
2977 don't need to jump through hoops to distinguish valid from
2979 if (sym
->attr
.dummy
&& sym
->ns
== gfc_current_ns
2980 && sym
->ns
->proc_name
&& sym
->ns
->proc_name
->attr
.elemental
)
2982 gfc_error ("Dummy argument %qs not allowed in expression at %L",
2983 sym
->name
, &e
->where
);
2987 if (sym
->attr
.optional
)
2989 gfc_error ("Dummy argument %qs at %L cannot be OPTIONAL",
2990 sym
->name
, &e
->where
);
2994 if (sym
->attr
.intent
== INTENT_OUT
)
2996 gfc_error ("Dummy argument %qs at %L cannot be INTENT(OUT)",
2997 sym
->name
, &e
->where
);
3001 /* Check reference chain if any. */
3002 if (!check_references (e
->ref
, &check_restricted
))
3005 /* gfc_is_formal_arg broadcasts that a formal argument list is being
3006 processed in resolve.c(resolve_formal_arglist). This is done so
3007 that host associated dummy array indices are accepted (PR23446).
3008 This mechanism also does the same for the specification expressions
3009 of array-valued functions. */
3011 || sym
->attr
.in_common
3012 || sym
->attr
.use_assoc
3014 || sym
->attr
.implied_index
3015 || sym
->attr
.flavor
== FL_PARAMETER
3016 || is_parent_of_current_ns (sym
->ns
)
3017 || (sym
->ns
->proc_name
!= NULL
3018 && sym
->ns
->proc_name
->attr
.flavor
== FL_MODULE
)
3019 || (gfc_is_formal_arg () && (sym
->ns
== gfc_current_ns
)))
3025 gfc_error ("Variable %qs cannot appear in the expression at %L",
3026 sym
->name
, &e
->where
);
3027 /* Prevent a repetition of the error. */
3036 case EXPR_SUBSTRING
:
3037 t
= gfc_specification_expr (e
->ref
->u
.ss
.start
);
3041 t
= gfc_specification_expr (e
->ref
->u
.ss
.end
);
3043 t
= gfc_simplify_expr (e
, 0);
3047 case EXPR_STRUCTURE
:
3048 t
= gfc_check_constructor (e
, check_restricted
);
3052 t
= gfc_check_constructor (e
, check_restricted
);
3056 gfc_internal_error ("check_restricted(): Unknown expression type");
3063 /* Check to see that an expression is a specification expression. If
3064 we return false, an error has been generated. */
3067 gfc_specification_expr (gfc_expr
*e
)
3069 gfc_component
*comp
;
3074 if (e
->ts
.type
!= BT_INTEGER
)
3076 gfc_error ("Expression at %L must be of INTEGER type, found %s",
3077 &e
->where
, gfc_basic_typename (e
->ts
.type
));
3081 comp
= gfc_get_proc_ptr_comp (e
);
3082 if (e
->expr_type
== EXPR_FUNCTION
3083 && !e
->value
.function
.isym
3084 && !e
->value
.function
.esym
3085 && !gfc_pure (e
->symtree
->n
.sym
)
3086 && (!comp
|| !comp
->attr
.pure
))
3088 gfc_error ("Function %qs at %L must be PURE",
3089 e
->symtree
->n
.sym
->name
, &e
->where
);
3090 /* Prevent repeat error messages. */
3091 e
->symtree
->n
.sym
->attr
.pure
= 1;
3097 gfc_error ("Expression at %L must be scalar", &e
->where
);
3101 if (!gfc_simplify_expr (e
, 0))
3104 return check_restricted (e
);
3108 /************** Expression conformance checks. *************/
3110 /* Given two expressions, make sure that the arrays are conformable. */
3113 gfc_check_conformance (gfc_expr
*op1
, gfc_expr
*op2
, const char *optype_msgid
, ...)
3115 int op1_flag
, op2_flag
, d
;
3116 mpz_t op1_size
, op2_size
;
3122 if (op1
->rank
== 0 || op2
->rank
== 0)
3125 va_start (argp
, optype_msgid
);
3126 vsnprintf (buffer
, 240, optype_msgid
, argp
);
3129 if (op1
->rank
!= op2
->rank
)
3131 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer
),
3132 op1
->rank
, op2
->rank
, &op1
->where
);
3138 for (d
= 0; d
< op1
->rank
; d
++)
3140 op1_flag
= gfc_array_dimen_size(op1
, d
, &op1_size
);
3141 op2_flag
= gfc_array_dimen_size(op2
, d
, &op2_size
);
3143 if (op1_flag
&& op2_flag
&& mpz_cmp (op1_size
, op2_size
) != 0)
3145 gfc_error ("Different shape for %s at %L on dimension %d "
3146 "(%d and %d)", _(buffer
), &op1
->where
, d
+ 1,
3147 (int) mpz_get_si (op1_size
),
3148 (int) mpz_get_si (op2_size
));
3154 mpz_clear (op1_size
);
3156 mpz_clear (op2_size
);
3166 /* Given an assignable expression and an arbitrary expression, make
3167 sure that the assignment can take place. Only add a call to the intrinsic
3168 conversion routines, when allow_convert is set. When this assign is a
3169 coarray call, then the convert is done by the coarray routine implictly and
3170 adding the intrinsic conversion would do harm in most cases. */
3173 gfc_check_assign (gfc_expr
*lvalue
, gfc_expr
*rvalue
, int conform
,
3180 sym
= lvalue
->symtree
->n
.sym
;
3182 /* See if this is the component or subcomponent of a pointer. */
3183 has_pointer
= sym
->attr
.pointer
;
3184 for (ref
= lvalue
->ref
; ref
; ref
= ref
->next
)
3185 if (ref
->type
== REF_COMPONENT
&& ref
->u
.c
.component
->attr
.pointer
)
3191 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3192 variable local to a function subprogram. Its existence begins when
3193 execution of the function is initiated and ends when execution of the
3194 function is terminated...
3195 Therefore, the left hand side is no longer a variable, when it is: */
3196 if (sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.proc
!= PROC_ST_FUNCTION
3197 && !sym
->attr
.external
)
3202 /* (i) Use associated; */
3203 if (sym
->attr
.use_assoc
)
3206 /* (ii) The assignment is in the main program; or */
3207 if (gfc_current_ns
->proc_name
3208 && gfc_current_ns
->proc_name
->attr
.is_main_program
)
3211 /* (iii) A module or internal procedure... */
3212 if (gfc_current_ns
->proc_name
3213 && (gfc_current_ns
->proc_name
->attr
.proc
== PROC_INTERNAL
3214 || gfc_current_ns
->proc_name
->attr
.proc
== PROC_MODULE
)
3215 && gfc_current_ns
->parent
3216 && (!(gfc_current_ns
->parent
->proc_name
->attr
.function
3217 || gfc_current_ns
->parent
->proc_name
->attr
.subroutine
)
3218 || gfc_current_ns
->parent
->proc_name
->attr
.is_main_program
))
3220 /* ... that is not a function... */
3221 if (gfc_current_ns
->proc_name
3222 && !gfc_current_ns
->proc_name
->attr
.function
)
3225 /* ... or is not an entry and has a different name. */
3226 if (!sym
->attr
.entry
&& sym
->name
!= gfc_current_ns
->proc_name
->name
)
3230 /* (iv) Host associated and not the function symbol or the
3231 parent result. This picks up sibling references, which
3232 cannot be entries. */
3233 if (!sym
->attr
.entry
3234 && sym
->ns
== gfc_current_ns
->parent
3235 && sym
!= gfc_current_ns
->proc_name
3236 && sym
!= gfc_current_ns
->parent
->proc_name
->result
)
3241 gfc_error ("%qs at %L is not a VALUE", sym
->name
, &lvalue
->where
);
3246 if (rvalue
->rank
!= 0 && lvalue
->rank
!= rvalue
->rank
)
3248 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3249 lvalue
->rank
, rvalue
->rank
, &lvalue
->where
);
3253 if (lvalue
->ts
.type
== BT_UNKNOWN
)
3255 gfc_error ("Variable type is UNKNOWN in assignment at %L",
3260 if (rvalue
->expr_type
== EXPR_NULL
)
3262 if (has_pointer
&& (ref
== NULL
|| ref
->next
== NULL
)
3263 && lvalue
->symtree
->n
.sym
->attr
.data
)
3267 gfc_error ("NULL appears on right-hand side in assignment at %L",
3273 /* This is possibly a typo: x = f() instead of x => f(). */
3275 && rvalue
->expr_type
== EXPR_FUNCTION
&& gfc_expr_attr (rvalue
).pointer
)
3276 gfc_warning (OPT_Wsurprising
,
3277 "POINTER-valued function appears on right-hand side of "
3278 "assignment at %L", &rvalue
->where
);
3280 /* Check size of array assignments. */
3281 if (lvalue
->rank
!= 0 && rvalue
->rank
!= 0
3282 && !gfc_check_conformance (lvalue
, rvalue
, "array assignment"))
3285 if (rvalue
->is_boz
&& lvalue
->ts
.type
!= BT_INTEGER
3286 && lvalue
->symtree
->n
.sym
->attr
.data
3287 && !gfc_notify_std (GFC_STD_GNU
, "BOZ literal at %L used to "
3288 "initialize non-integer variable %qs",
3289 &rvalue
->where
, lvalue
->symtree
->n
.sym
->name
))
3291 else if (rvalue
->is_boz
&& !lvalue
->symtree
->n
.sym
->attr
.data
3292 && !gfc_notify_std (GFC_STD_GNU
, "BOZ literal at %L outside "
3293 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3297 /* Handle the case of a BOZ literal on the RHS. */
3298 if (rvalue
->is_boz
&& lvalue
->ts
.type
!= BT_INTEGER
)
3301 if (warn_surprising
)
3302 gfc_warning (OPT_Wsurprising
,
3303 "BOZ literal at %L is bitwise transferred "
3304 "non-integer symbol %qs", &rvalue
->where
,
3305 lvalue
->symtree
->n
.sym
->name
);
3306 if (!gfc_convert_boz (rvalue
, &lvalue
->ts
))
3308 if ((rc
= gfc_range_check (rvalue
)) != ARITH_OK
)
3310 if (rc
== ARITH_UNDERFLOW
)
3311 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3312 ". This check can be disabled with the option "
3313 "%<-fno-range-check%>", &rvalue
->where
);
3314 else if (rc
== ARITH_OVERFLOW
)
3315 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3316 ". This check can be disabled with the option "
3317 "%<-fno-range-check%>", &rvalue
->where
);
3318 else if (rc
== ARITH_NAN
)
3319 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3320 ". This check can be disabled with the option "
3321 "%<-fno-range-check%>", &rvalue
->where
);
3326 if (gfc_expr_attr (lvalue
).pdt_kind
|| gfc_expr_attr (lvalue
).pdt_len
)
3328 gfc_error ("The assignment to a KIND or LEN component of a "
3329 "parameterized type at %L is not allowed",
3334 if (gfc_compare_types (&lvalue
->ts
, &rvalue
->ts
))
3337 /* Only DATA Statements come here. */
3340 /* Numeric can be converted to any other numeric. And Hollerith can be
3341 converted to any other type. */
3342 if ((gfc_numeric_ts (&lvalue
->ts
) && gfc_numeric_ts (&rvalue
->ts
))
3343 || rvalue
->ts
.type
== BT_HOLLERITH
)
3346 if (lvalue
->ts
.type
== BT_LOGICAL
&& rvalue
->ts
.type
== BT_LOGICAL
)
3349 gfc_error ("Incompatible types in DATA statement at %L; attempted "
3350 "conversion of %s to %s", &lvalue
->where
,
3351 gfc_typename (&rvalue
->ts
), gfc_typename (&lvalue
->ts
));
3356 /* Assignment is the only case where character variables of different
3357 kind values can be converted into one another. */
3358 if (lvalue
->ts
.type
== BT_CHARACTER
&& rvalue
->ts
.type
== BT_CHARACTER
)
3360 if (lvalue
->ts
.kind
!= rvalue
->ts
.kind
&& allow_convert
)
3361 return gfc_convert_chartype (rvalue
, &lvalue
->ts
);
3369 return gfc_convert_type (rvalue
, &lvalue
->ts
, 1);
3373 /* Check that a pointer assignment is OK. We first check lvalue, and
3374 we only check rvalue if it's not an assignment to NULL() or a
3375 NULLIFY statement. */
3378 gfc_check_pointer_assign (gfc_expr
*lvalue
, gfc_expr
*rvalue
)
3380 symbol_attribute attr
, lhs_attr
;
3382 bool is_pure
, is_implicit_pure
, rank_remap
;
3385 lhs_attr
= gfc_expr_attr (lvalue
);
3386 if (lvalue
->ts
.type
== BT_UNKNOWN
&& !lhs_attr
.proc_pointer
)
3388 gfc_error ("Pointer assignment target is not a POINTER at %L",
3393 if (lhs_attr
.flavor
== FL_PROCEDURE
&& lhs_attr
.use_assoc
3394 && !lhs_attr
.proc_pointer
)
3396 gfc_error ("%qs in the pointer assignment at %L cannot be an "
3397 "l-value since it is a procedure",
3398 lvalue
->symtree
->n
.sym
->name
, &lvalue
->where
);
3402 proc_pointer
= lvalue
->symtree
->n
.sym
->attr
.proc_pointer
;
3405 for (ref
= lvalue
->ref
; ref
; ref
= ref
->next
)
3407 if (ref
->type
== REF_COMPONENT
)
3408 proc_pointer
= ref
->u
.c
.component
->attr
.proc_pointer
;
3410 if (ref
->type
== REF_ARRAY
&& ref
->next
== NULL
)
3414 if (ref
->u
.ar
.type
== AR_FULL
)
3417 if (ref
->u
.ar
.type
!= AR_SECTION
)
3419 gfc_error ("Expected bounds specification for %qs at %L",
3420 lvalue
->symtree
->n
.sym
->name
, &lvalue
->where
);
3424 if (!gfc_notify_std (GFC_STD_F2003
, "Bounds specification "
3425 "for %qs in pointer assignment at %L",
3426 lvalue
->symtree
->n
.sym
->name
, &lvalue
->where
))
3429 /* When bounds are given, all lbounds are necessary and either all
3430 or none of the upper bounds; no strides are allowed. If the
3431 upper bounds are present, we may do rank remapping. */
3432 for (dim
= 0; dim
< ref
->u
.ar
.dimen
; ++dim
)
3434 if (!ref
->u
.ar
.start
[dim
]
3435 || ref
->u
.ar
.dimen_type
[dim
] != DIMEN_RANGE
)
3437 gfc_error ("Lower bound has to be present at %L",
3441 if (ref
->u
.ar
.stride
[dim
])
3443 gfc_error ("Stride must not be present at %L",
3449 rank_remap
= (ref
->u
.ar
.end
[dim
] != NULL
);
3452 if ((rank_remap
&& !ref
->u
.ar
.end
[dim
])
3453 || (!rank_remap
&& ref
->u
.ar
.end
[dim
]))
3455 gfc_error ("Either all or none of the upper bounds"
3456 " must be specified at %L", &lvalue
->where
);
3464 is_pure
= gfc_pure (NULL
);
3465 is_implicit_pure
= gfc_implicit_pure (NULL
);
3467 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3468 kind, etc for lvalue and rvalue must match, and rvalue must be a
3469 pure variable if we're in a pure function. */
3470 if (rvalue
->expr_type
== EXPR_NULL
&& rvalue
->ts
.type
== BT_UNKNOWN
)
3473 /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283. */
3474 if (lvalue
->expr_type
== EXPR_VARIABLE
3475 && gfc_is_coindexed (lvalue
))
3478 for (ref
= lvalue
->ref
; ref
; ref
= ref
->next
)
3479 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
)
3481 gfc_error ("Pointer object at %L shall not have a coindex",
3487 /* Checks on rvalue for procedure pointer assignments. */
3492 gfc_component
*comp1
, *comp2
;
3495 attr
= gfc_expr_attr (rvalue
);
3496 if (!((rvalue
->expr_type
== EXPR_NULL
)
3497 || (rvalue
->expr_type
== EXPR_FUNCTION
&& attr
.proc_pointer
)
3498 || (rvalue
->expr_type
== EXPR_VARIABLE
&& attr
.proc_pointer
)
3499 || (rvalue
->expr_type
== EXPR_VARIABLE
3500 && attr
.flavor
== FL_PROCEDURE
)))
3502 gfc_error ("Invalid procedure pointer assignment at %L",
3506 if (rvalue
->expr_type
== EXPR_VARIABLE
&& !attr
.proc_pointer
)
3508 /* Check for intrinsics. */
3509 gfc_symbol
*sym
= rvalue
->symtree
->n
.sym
;
3510 if (!sym
->attr
.intrinsic
3511 && (gfc_is_intrinsic (sym
, 0, sym
->declared_at
)
3512 || gfc_is_intrinsic (sym
, 1, sym
->declared_at
)))
3514 sym
->attr
.intrinsic
= 1;
3515 gfc_resolve_intrinsic (sym
, &rvalue
->where
);
3516 attr
= gfc_expr_attr (rvalue
);
3518 /* Check for result of embracing function. */
3519 if (sym
->attr
.function
&& sym
->result
== sym
)
3523 for (ns
= gfc_current_ns
; ns
; ns
= ns
->parent
)
3524 if (sym
== ns
->proc_name
)
3526 gfc_error ("Function result %qs is invalid as proc-target "
3527 "in procedure pointer assignment at %L",
3528 sym
->name
, &rvalue
->where
);
3535 gfc_error ("Abstract interface %qs is invalid "
3536 "in procedure pointer assignment at %L",
3537 rvalue
->symtree
->name
, &rvalue
->where
);
3540 /* Check for F08:C729. */
3541 if (attr
.flavor
== FL_PROCEDURE
)
3543 if (attr
.proc
== PROC_ST_FUNCTION
)
3545 gfc_error ("Statement function %qs is invalid "
3546 "in procedure pointer assignment at %L",
3547 rvalue
->symtree
->name
, &rvalue
->where
);
3550 if (attr
.proc
== PROC_INTERNAL
&&
3551 !gfc_notify_std(GFC_STD_F2008
, "Internal procedure %qs "
3552 "is invalid in procedure pointer assignment "
3553 "at %L", rvalue
->symtree
->name
, &rvalue
->where
))
3555 if (attr
.intrinsic
&& gfc_intrinsic_actual_ok (rvalue
->symtree
->name
,
3556 attr
.subroutine
) == 0)
3558 gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
3559 "assignment", rvalue
->symtree
->name
, &rvalue
->where
);
3563 /* Check for F08:C730. */
3564 if (attr
.elemental
&& !attr
.intrinsic
)
3566 gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
3567 "in procedure pointer assignment at %L",
3568 rvalue
->symtree
->name
, &rvalue
->where
);
3572 /* Ensure that the calling convention is the same. As other attributes
3573 such as DLLEXPORT may differ, one explicitly only tests for the
3574 calling conventions. */
3575 if (rvalue
->expr_type
== EXPR_VARIABLE
3576 && lvalue
->symtree
->n
.sym
->attr
.ext_attr
3577 != rvalue
->symtree
->n
.sym
->attr
.ext_attr
)
3579 symbol_attribute calls
;
3582 gfc_add_ext_attribute (&calls
, EXT_ATTR_CDECL
, NULL
);
3583 gfc_add_ext_attribute (&calls
, EXT_ATTR_STDCALL
, NULL
);
3584 gfc_add_ext_attribute (&calls
, EXT_ATTR_FASTCALL
, NULL
);
3586 if ((calls
.ext_attr
& lvalue
->symtree
->n
.sym
->attr
.ext_attr
)
3587 != (calls
.ext_attr
& rvalue
->symtree
->n
.sym
->attr
.ext_attr
))
3589 gfc_error ("Mismatch in the procedure pointer assignment "
3590 "at %L: mismatch in the calling convention",
3596 comp1
= gfc_get_proc_ptr_comp (lvalue
);
3598 s1
= comp1
->ts
.interface
;
3601 s1
= lvalue
->symtree
->n
.sym
;
3602 if (s1
->ts
.interface
)
3603 s1
= s1
->ts
.interface
;
3606 comp2
= gfc_get_proc_ptr_comp (rvalue
);
3609 if (rvalue
->expr_type
== EXPR_FUNCTION
)
3611 s2
= comp2
->ts
.interface
->result
;
3616 s2
= comp2
->ts
.interface
;
3620 else if (rvalue
->expr_type
== EXPR_FUNCTION
)
3622 if (rvalue
->value
.function
.esym
)
3623 s2
= rvalue
->value
.function
.esym
->result
;
3625 s2
= rvalue
->symtree
->n
.sym
->result
;
3631 s2
= rvalue
->symtree
->n
.sym
;
3635 if (s2
&& s2
->attr
.proc_pointer
&& s2
->ts
.interface
)
3636 s2
= s2
->ts
.interface
;
3638 /* Special check for the case of absent interface on the lvalue.
3639 * All other interface checks are done below. */
3640 if (!s1
&& comp1
&& comp1
->attr
.subroutine
&& s2
&& s2
->attr
.function
)
3642 gfc_error ("Interface mismatch in procedure pointer assignment "
3643 "at %L: %qs is not a subroutine", &rvalue
->where
, name
);
3647 /* F08:7.2.2.4 (4) */
3648 if (s2
&& gfc_explicit_interface_required (s2
, err
, sizeof(err
)))
3652 gfc_error ("Explicit interface required for component %qs at %L: %s",
3653 comp1
->name
, &lvalue
->where
, err
);
3656 else if (s1
->attr
.if_source
== IFSRC_UNKNOWN
)
3658 gfc_error ("Explicit interface required for %qs at %L: %s",
3659 s1
->name
, &lvalue
->where
, err
);
3663 if (s1
&& gfc_explicit_interface_required (s1
, err
, sizeof(err
)))
3667 gfc_error ("Explicit interface required for component %qs at %L: %s",
3668 comp2
->name
, &rvalue
->where
, err
);
3671 else if (s2
->attr
.if_source
== IFSRC_UNKNOWN
)
3673 gfc_error ("Explicit interface required for %qs at %L: %s",
3674 s2
->name
, &rvalue
->where
, err
);
3679 if (s1
== s2
|| !s1
|| !s2
)
3682 if (!gfc_compare_interfaces (s1
, s2
, name
, 0, 1,
3683 err
, sizeof(err
), NULL
, NULL
))
3685 gfc_error ("Interface mismatch in procedure pointer assignment "
3686 "at %L: %s", &rvalue
->where
, err
);
3690 /* Check F2008Cor2, C729. */
3691 if (!s2
->attr
.intrinsic
&& s2
->attr
.if_source
== IFSRC_UNKNOWN
3692 && !s2
->attr
.external
&& !s2
->attr
.subroutine
&& !s2
->attr
.function
)
3694 gfc_error ("Procedure pointer target %qs at %L must be either an "
3695 "intrinsic, host or use associated, referenced or have "
3696 "the EXTERNAL attribute", s2
->name
, &rvalue
->where
);
3703 if (!gfc_compare_types (&lvalue
->ts
, &rvalue
->ts
))
3705 /* Check for F03:C717. */
3706 if (UNLIMITED_POLY (rvalue
)
3707 && !(UNLIMITED_POLY (lvalue
)
3708 || (lvalue
->ts
.type
== BT_DERIVED
3709 && (lvalue
->ts
.u
.derived
->attr
.is_bind_c
3710 || lvalue
->ts
.u
.derived
->attr
.sequence
))))
3711 gfc_error ("Data-pointer-object at %L must be unlimited "
3712 "polymorphic, or of a type with the BIND or SEQUENCE "
3713 "attribute, to be compatible with an unlimited "
3714 "polymorphic target", &lvalue
->where
);
3716 gfc_error ("Different types in pointer assignment at %L; "
3717 "attempted assignment of %s to %s", &lvalue
->where
,
3718 gfc_typename (&rvalue
->ts
),
3719 gfc_typename (&lvalue
->ts
));
3723 if (lvalue
->ts
.type
!= BT_CLASS
&& lvalue
->ts
.kind
!= rvalue
->ts
.kind
)
3725 gfc_error ("Different kind type parameters in pointer "
3726 "assignment at %L", &lvalue
->where
);
3730 if (lvalue
->rank
!= rvalue
->rank
&& !rank_remap
)
3732 gfc_error ("Different ranks in pointer assignment at %L", &lvalue
->where
);
3736 /* Make sure the vtab is present. */
3737 if (lvalue
->ts
.type
== BT_CLASS
&& !UNLIMITED_POLY (rvalue
))
3738 gfc_find_vtab (&rvalue
->ts
);
3740 /* Check rank remapping. */
3745 /* If this can be determined, check that the target must be at least as
3746 large as the pointer assigned to it is. */
3747 if (gfc_array_size (lvalue
, &lsize
)
3748 && gfc_array_size (rvalue
, &rsize
)
3749 && mpz_cmp (rsize
, lsize
) < 0)
3751 gfc_error ("Rank remapping target is smaller than size of the"
3752 " pointer (%ld < %ld) at %L",
3753 mpz_get_si (rsize
), mpz_get_si (lsize
),
3758 /* The target must be either rank one or it must be simply contiguous
3759 and F2008 must be allowed. */
3760 if (rvalue
->rank
!= 1)
3762 if (!gfc_is_simply_contiguous (rvalue
, true, false))
3764 gfc_error ("Rank remapping target must be rank 1 or"
3765 " simply contiguous at %L", &rvalue
->where
);
3768 if (!gfc_notify_std (GFC_STD_F2008
, "Rank remapping target is not "
3769 "rank 1 at %L", &rvalue
->where
))
3774 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
3775 if (rvalue
->expr_type
== EXPR_NULL
)
3778 if (lvalue
->ts
.type
== BT_CHARACTER
)
3780 bool t
= gfc_check_same_strlen (lvalue
, rvalue
, "pointer assignment");
3785 if (rvalue
->expr_type
== EXPR_VARIABLE
&& is_subref_array (rvalue
))
3786 lvalue
->symtree
->n
.sym
->attr
.subref_array_pointer
= 1;
3788 attr
= gfc_expr_attr (rvalue
);
3790 if (rvalue
->expr_type
== EXPR_FUNCTION
&& !attr
.pointer
)
3792 /* F2008, C725. For PURE also C1283. Sometimes rvalue is a function call
3793 to caf_get. Map this to the same error message as below when it is
3794 still a variable expression. */
3795 if (rvalue
->value
.function
.isym
3796 && rvalue
->value
.function
.isym
->id
== GFC_ISYM_CAF_GET
)
3797 /* The test above might need to be extend when F08, Note 5.4 has to be
3798 interpreted in the way that target and pointer with the same coindex
3800 gfc_error ("Data target at %L shall not have a coindex",
3803 gfc_error ("Target expression in pointer assignment "
3804 "at %L must deliver a pointer result",
3809 if (!attr
.target
&& !attr
.pointer
)
3811 gfc_error ("Pointer assignment target is neither TARGET "
3812 "nor POINTER at %L", &rvalue
->where
);
3816 if (is_pure
&& gfc_impure_variable (rvalue
->symtree
->n
.sym
))
3818 gfc_error ("Bad target in pointer assignment in PURE "
3819 "procedure at %L", &rvalue
->where
);
3822 if (is_implicit_pure
&& gfc_impure_variable (rvalue
->symtree
->n
.sym
))
3823 gfc_unset_implicit_pure (gfc_current_ns
->proc_name
);
3825 if (gfc_has_vector_index (rvalue
))
3827 gfc_error ("Pointer assignment with vector subscript "
3828 "on rhs at %L", &rvalue
->where
);
3832 if (attr
.is_protected
&& attr
.use_assoc
3833 && !(attr
.pointer
|| attr
.proc_pointer
))
3835 gfc_error ("Pointer assignment target has PROTECTED "
3836 "attribute at %L", &rvalue
->where
);
3840 /* F2008, C725. For PURE also C1283. */
3841 if (rvalue
->expr_type
== EXPR_VARIABLE
3842 && gfc_is_coindexed (rvalue
))
3845 for (ref
= rvalue
->ref
; ref
; ref
= ref
->next
)
3846 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
)
3848 gfc_error ("Data target at %L shall not have a coindex",
3854 /* Error for assignments of contiguous pointers to targets which is not
3855 contiguous. Be lenient in the definition of what counts as
3858 if (lhs_attr
.contiguous
&& !gfc_is_simply_contiguous (rvalue
, false, true))
3859 gfc_error ("Assignment to contiguous pointer from non-contiguous "
3860 "target at %L", &rvalue
->where
);
3862 /* Warn if it is the LHS pointer may lives longer than the RHS target. */
3863 if (warn_target_lifetime
3864 && rvalue
->expr_type
== EXPR_VARIABLE
3865 && !rvalue
->symtree
->n
.sym
->attr
.save
3866 && !rvalue
->symtree
->n
.sym
->attr
.pointer
&& !attr
.pointer
3867 && !rvalue
->symtree
->n
.sym
->attr
.host_assoc
3868 && !rvalue
->symtree
->n
.sym
->attr
.in_common
3869 && !rvalue
->symtree
->n
.sym
->attr
.use_assoc
3870 && !rvalue
->symtree
->n
.sym
->attr
.dummy
)
3875 warn
= lvalue
->symtree
->n
.sym
->attr
.dummy
3876 || lvalue
->symtree
->n
.sym
->attr
.result
3877 || lvalue
->symtree
->n
.sym
->attr
.function
3878 || (lvalue
->symtree
->n
.sym
->attr
.host_assoc
3879 && lvalue
->symtree
->n
.sym
->ns
3880 != rvalue
->symtree
->n
.sym
->ns
)
3881 || lvalue
->symtree
->n
.sym
->attr
.use_assoc
3882 || lvalue
->symtree
->n
.sym
->attr
.in_common
;
3884 if (rvalue
->symtree
->n
.sym
->ns
->proc_name
3885 && rvalue
->symtree
->n
.sym
->ns
->proc_name
->attr
.flavor
!= FL_PROCEDURE
3886 && rvalue
->symtree
->n
.sym
->ns
->proc_name
->attr
.flavor
!= FL_PROGRAM
)
3887 for (ns
= rvalue
->symtree
->n
.sym
->ns
;
3888 ns
&& ns
->proc_name
&& ns
->proc_name
->attr
.flavor
!= FL_PROCEDURE
;
3890 if (ns
->parent
== lvalue
->symtree
->n
.sym
->ns
)
3897 gfc_warning (OPT_Wtarget_lifetime
,
3898 "Pointer at %L in pointer assignment might outlive the "
3899 "pointer target", &lvalue
->where
);
3906 /* Relative of gfc_check_assign() except that the lvalue is a single
3907 symbol. Used for initialization assignments. */
3910 gfc_check_assign_symbol (gfc_symbol
*sym
, gfc_component
*comp
, gfc_expr
*rvalue
)
3914 bool pointer
, proc_pointer
;
3916 memset (&lvalue
, '\0', sizeof (gfc_expr
));
3918 lvalue
.expr_type
= EXPR_VARIABLE
;
3919 lvalue
.ts
= sym
->ts
;
3921 lvalue
.rank
= sym
->as
->rank
;
3922 lvalue
.symtree
= XCNEW (gfc_symtree
);
3923 lvalue
.symtree
->n
.sym
= sym
;
3924 lvalue
.where
= sym
->declared_at
;
3928 lvalue
.ref
= gfc_get_ref ();
3929 lvalue
.ref
->type
= REF_COMPONENT
;
3930 lvalue
.ref
->u
.c
.component
= comp
;
3931 lvalue
.ref
->u
.c
.sym
= sym
;
3932 lvalue
.ts
= comp
->ts
;
3933 lvalue
.rank
= comp
->as
? comp
->as
->rank
: 0;
3934 lvalue
.where
= comp
->loc
;
3935 pointer
= comp
->ts
.type
== BT_CLASS
&& CLASS_DATA (comp
)
3936 ? CLASS_DATA (comp
)->attr
.class_pointer
: comp
->attr
.pointer
;
3937 proc_pointer
= comp
->attr
.proc_pointer
;
3941 pointer
= sym
->ts
.type
== BT_CLASS
&& CLASS_DATA (sym
)
3942 ? CLASS_DATA (sym
)->attr
.class_pointer
: sym
->attr
.pointer
;
3943 proc_pointer
= sym
->attr
.proc_pointer
;
3946 if (pointer
|| proc_pointer
)
3947 r
= gfc_check_pointer_assign (&lvalue
, rvalue
);
3950 /* If a conversion function, e.g., __convert_i8_i4, was inserted
3951 into an array constructor, we should check if it can be reduced
3952 as an initialization expression. */
3953 if (rvalue
->expr_type
== EXPR_FUNCTION
3954 && rvalue
->value
.function
.isym
3955 && (rvalue
->value
.function
.isym
->conversion
== 1))
3956 gfc_check_init_expr (rvalue
);
3958 r
= gfc_check_assign (&lvalue
, rvalue
, 1);
3961 free (lvalue
.symtree
);
3967 if (pointer
&& rvalue
->expr_type
!= EXPR_NULL
)
3969 /* F08:C461. Additional checks for pointer initialization. */
3970 symbol_attribute attr
;
3971 attr
= gfc_expr_attr (rvalue
);
3972 if (attr
.allocatable
)
3974 gfc_error ("Pointer initialization target at %L "
3975 "must not be ALLOCATABLE", &rvalue
->where
);
3978 if (!attr
.target
|| attr
.pointer
)
3980 gfc_error ("Pointer initialization target at %L "
3981 "must have the TARGET attribute", &rvalue
->where
);
3985 if (!attr
.save
&& rvalue
->expr_type
== EXPR_VARIABLE
3986 && rvalue
->symtree
->n
.sym
->ns
->proc_name
3987 && rvalue
->symtree
->n
.sym
->ns
->proc_name
->attr
.is_main_program
)
3989 rvalue
->symtree
->n
.sym
->ns
->proc_name
->attr
.save
= SAVE_IMPLICIT
;
3990 attr
.save
= SAVE_IMPLICIT
;
3995 gfc_error ("Pointer initialization target at %L "
3996 "must have the SAVE attribute", &rvalue
->where
);
4001 if (proc_pointer
&& rvalue
->expr_type
!= EXPR_NULL
)
4003 /* F08:C1220. Additional checks for procedure pointer initialization. */
4004 symbol_attribute attr
= gfc_expr_attr (rvalue
);
4005 if (attr
.proc_pointer
)
4007 gfc_error ("Procedure pointer initialization target at %L "
4008 "may not be a procedure pointer", &rvalue
->where
);
4016 /* Invoke gfc_build_init_expr to create an initializer expression, but do not
4017 * require that an expression be built. */
4020 gfc_build_default_init_expr (gfc_typespec
*ts
, locus
*where
)
4022 return gfc_build_init_expr (ts
, where
, false);
4025 /* Build an initializer for a local integer, real, complex, logical, or
4026 character variable, based on the command line flags finit-local-zero,
4027 finit-integer=, finit-real=, finit-logical=, and finit-character=.
4028 With force, an initializer is ALWAYS generated. */
4031 gfc_build_init_expr (gfc_typespec
*ts
, locus
*where
, bool force
)
4034 gfc_expr
*init_expr
;
4037 /* Try to build an initializer expression. */
4038 init_expr
= gfc_get_constant_expr (ts
->type
, ts
->kind
, where
);
4040 /* If we want to force generation, make sure we default to zero. */
4041 gfc_init_local_real init_real
= flag_init_real
;
4042 int init_logical
= gfc_option
.flag_init_logical
;
4045 if (init_real
== GFC_INIT_REAL_OFF
)
4046 init_real
= GFC_INIT_REAL_ZERO
;
4047 if (init_logical
== GFC_INIT_LOGICAL_OFF
)
4048 init_logical
= GFC_INIT_LOGICAL_FALSE
;
4051 /* We will only initialize integers, reals, complex, logicals, and
4052 characters, and only if the corresponding command-line flags
4053 were set. Otherwise, we free init_expr and return null. */
4057 if (force
|| gfc_option
.flag_init_integer
!= GFC_INIT_INTEGER_OFF
)
4058 mpz_set_si (init_expr
->value
.integer
,
4059 gfc_option
.flag_init_integer_value
);
4062 gfc_free_expr (init_expr
);
4070 case GFC_INIT_REAL_SNAN
:
4071 init_expr
->is_snan
= 1;
4073 case GFC_INIT_REAL_NAN
:
4074 mpfr_set_nan (init_expr
->value
.real
);
4077 case GFC_INIT_REAL_INF
:
4078 mpfr_set_inf (init_expr
->value
.real
, 1);
4081 case GFC_INIT_REAL_NEG_INF
:
4082 mpfr_set_inf (init_expr
->value
.real
, -1);
4085 case GFC_INIT_REAL_ZERO
:
4086 mpfr_set_ui (init_expr
->value
.real
, 0.0, GFC_RND_MODE
);
4090 gfc_free_expr (init_expr
);
4099 case GFC_INIT_REAL_SNAN
:
4100 init_expr
->is_snan
= 1;
4102 case GFC_INIT_REAL_NAN
:
4103 mpfr_set_nan (mpc_realref (init_expr
->value
.complex));
4104 mpfr_set_nan (mpc_imagref (init_expr
->value
.complex));
4107 case GFC_INIT_REAL_INF
:
4108 mpfr_set_inf (mpc_realref (init_expr
->value
.complex), 1);
4109 mpfr_set_inf (mpc_imagref (init_expr
->value
.complex), 1);
4112 case GFC_INIT_REAL_NEG_INF
:
4113 mpfr_set_inf (mpc_realref (init_expr
->value
.complex), -1);
4114 mpfr_set_inf (mpc_imagref (init_expr
->value
.complex), -1);
4117 case GFC_INIT_REAL_ZERO
:
4118 mpc_set_ui (init_expr
->value
.complex, 0, GFC_MPC_RND_MODE
);
4122 gfc_free_expr (init_expr
);
4129 if (init_logical
== GFC_INIT_LOGICAL_FALSE
)
4130 init_expr
->value
.logical
= 0;
4131 else if (init_logical
== GFC_INIT_LOGICAL_TRUE
)
4132 init_expr
->value
.logical
= 1;
4135 gfc_free_expr (init_expr
);
4141 /* For characters, the length must be constant in order to
4142 create a default initializer. */
4143 if ((force
|| gfc_option
.flag_init_character
== GFC_INIT_CHARACTER_ON
)
4145 && ts
->u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4147 char_len
= mpz_get_si (ts
->u
.cl
->length
->value
.integer
);
4148 init_expr
->value
.character
.length
= char_len
;
4149 init_expr
->value
.character
.string
= gfc_get_wide_string (char_len
+1);
4150 for (i
= 0; i
< char_len
; i
++)
4151 init_expr
->value
.character
.string
[i
]
4152 = (unsigned char) gfc_option
.flag_init_character_value
;
4156 gfc_free_expr (init_expr
);
4160 && (force
|| gfc_option
.flag_init_character
== GFC_INIT_CHARACTER_ON
)
4161 && ts
->u
.cl
->length
&& flag_max_stack_var_size
!= 0)
4163 gfc_actual_arglist
*arg
;
4164 init_expr
= gfc_get_expr ();
4165 init_expr
->where
= *where
;
4166 init_expr
->ts
= *ts
;
4167 init_expr
->expr_type
= EXPR_FUNCTION
;
4168 init_expr
->value
.function
.isym
=
4169 gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT
);
4170 init_expr
->value
.function
.name
= "repeat";
4171 arg
= gfc_get_actual_arglist ();
4172 arg
->expr
= gfc_get_character_expr (ts
->kind
, where
, NULL
, 1);
4173 arg
->expr
->value
.character
.string
[0] =
4174 gfc_option
.flag_init_character_value
;
4175 arg
->next
= gfc_get_actual_arglist ();
4176 arg
->next
->expr
= gfc_copy_expr (ts
->u
.cl
->length
);
4177 init_expr
->value
.function
.actual
= arg
;
4182 gfc_free_expr (init_expr
);
4189 /* Apply an initialization expression to a typespec. Can be used for symbols or
4190 components. Similar to add_init_expr_to_sym in decl.c; could probably be
4191 combined with some effort. */
4194 gfc_apply_init (gfc_typespec
*ts
, symbol_attribute
*attr
, gfc_expr
*init
)
4196 if (ts
->type
== BT_CHARACTER
&& !attr
->pointer
&& init
4198 && ts
->u
.cl
->length
&& ts
->u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
4202 gcc_assert (ts
->u
.cl
&& ts
->u
.cl
->length
);
4203 gcc_assert (ts
->u
.cl
->length
->expr_type
== EXPR_CONSTANT
);
4204 gcc_assert (ts
->u
.cl
->length
->ts
.type
== BT_INTEGER
);
4206 len
= mpz_get_si (ts
->u
.cl
->length
->value
.integer
);
4208 if (init
->expr_type
== EXPR_CONSTANT
)
4209 gfc_set_constant_character_len (len
, init
, -1);
4211 && init
->ts
.type
== BT_CHARACTER
4213 && mpz_cmp (ts
->u
.cl
->length
->value
.integer
,
4214 init
->ts
.u
.cl
->length
->value
.integer
))
4216 gfc_constructor
*ctor
;
4217 ctor
= gfc_constructor_first (init
->value
.constructor
);
4222 bool has_ts
= (init
->ts
.u
.cl
4223 && init
->ts
.u
.cl
->length_from_typespec
);
4225 /* Remember the length of the first element for checking
4226 that all elements *in the constructor* have the same
4227 length. This need not be the length of the LHS! */
4228 gcc_assert (ctor
->expr
->expr_type
== EXPR_CONSTANT
);
4229 gcc_assert (ctor
->expr
->ts
.type
== BT_CHARACTER
);
4230 first_len
= ctor
->expr
->value
.character
.length
;
4232 for ( ; ctor
; ctor
= gfc_constructor_next (ctor
))
4233 if (ctor
->expr
->expr_type
== EXPR_CONSTANT
)
4235 gfc_set_constant_character_len (len
, ctor
->expr
,
4236 has_ts
? -1 : first_len
);
4237 if (!ctor
->expr
->ts
.u
.cl
)
4239 = gfc_new_charlen (gfc_current_ns
, ts
->u
.cl
);
4241 ctor
->expr
->ts
.u
.cl
->length
4242 = gfc_copy_expr (ts
->u
.cl
->length
);
4250 /* Check whether an expression is a structure constructor and whether it has
4251 other values than NULL. */
4254 is_non_empty_structure_constructor (gfc_expr
* e
)
4256 if (e
->expr_type
!= EXPR_STRUCTURE
)
4259 gfc_constructor
*cons
= gfc_constructor_first (e
->value
.constructor
);
4262 if (!cons
->expr
|| cons
->expr
->expr_type
!= EXPR_NULL
)
4264 cons
= gfc_constructor_next (cons
);
4270 /* Check for default initializer; sym->value is not enough
4271 as it is also set for EXPR_NULL of allocatables. */
4274 gfc_has_default_initializer (gfc_symbol
*der
)
4278 gcc_assert (gfc_fl_struct (der
->attr
.flavor
));
4279 for (c
= der
->components
; c
; c
= c
->next
)
4280 if (gfc_bt_struct (c
->ts
.type
))
4282 if (!c
->attr
.pointer
&& !c
->attr
.proc_pointer
4283 && !(c
->attr
.allocatable
&& der
== c
->ts
.u
.derived
)
4285 && is_non_empty_structure_constructor (c
->initializer
))
4286 || gfc_has_default_initializer (c
->ts
.u
.derived
)))
4288 if (c
->attr
.pointer
&& c
->initializer
)
4302 Generate an initializer expression which initializes the entirety of a union.
4303 A normal structure constructor is insufficient without undue effort, because
4304 components of maps may be oddly aligned/overlapped. (For example if a
4305 character is initialized from one map overtop a real from the other, only one
4306 byte of the real is actually initialized.) Unfortunately we don't know the
4307 size of the union right now, so we can't generate a proper initializer, but
4308 we use a NULL expr as a placeholder and do the right thing later in
4309 gfc_trans_subcomponent_assign.
4312 generate_union_initializer (gfc_component
*un
)
4314 if (un
== NULL
|| un
->ts
.type
!= BT_UNION
)
4317 gfc_expr
*placeholder
= gfc_get_null_expr (&un
->loc
);
4318 placeholder
->ts
= un
->ts
;
4323 /* Get the user-specified initializer for a union, if any. This means the user
4324 has said to initialize component(s) of a map. For simplicity's sake we
4325 only allow the user to initialize the first map. We don't have to worry
4326 about overlapping initializers as they are released early in resolution (see
4327 resolve_fl_struct). */
4330 get_union_initializer (gfc_symbol
*union_type
, gfc_component
**map_p
)
4333 gfc_expr
*init
=NULL
;
4335 if (!union_type
|| union_type
->attr
.flavor
!= FL_UNION
)
4338 for (map
= union_type
->components
; map
; map
= map
->next
)
4340 if (gfc_has_default_initializer (map
->ts
.u
.derived
))
4342 init
= gfc_default_initializer (&map
->ts
);
4355 /* Fetch or generate an initializer for the given component.
4356 Only generate an initializer if generate is true. */
4359 component_initializer (gfc_typespec
*ts
, gfc_component
*c
, bool generate
)
4361 gfc_expr
*init
= NULL
;
4363 /* See if we can find the initializer immediately.
4364 Some components should never get initializers. */
4365 if (c
->initializer
|| !generate
4366 || (ts
->type
== BT_CLASS
&& !c
->attr
.allocatable
)
4368 || c
->attr
.class_pointer
4369 || c
->attr
.proc_pointer
)
4370 return c
->initializer
;
4372 /* Recursively handle derived type components. */
4373 if (c
->ts
.type
== BT_DERIVED
|| c
->ts
.type
== BT_CLASS
)
4374 init
= gfc_generate_initializer (&c
->ts
, true);
4376 else if (c
->ts
.type
== BT_UNION
&& c
->ts
.u
.derived
->components
)
4378 gfc_component
*map
= NULL
;
4379 gfc_constructor
*ctor
;
4380 gfc_expr
*user_init
;
4382 /* If we don't have a user initializer and we aren't generating one, this
4383 union has no initializer. */
4384 user_init
= get_union_initializer (c
->ts
.u
.derived
, &map
);
4385 if (!user_init
&& !generate
)
4388 /* Otherwise use a structure constructor. */
4389 init
= gfc_get_structure_constructor_expr (c
->ts
.type
, c
->ts
.kind
,
4393 /* If we are to generate an initializer for the union, add a constructor
4394 which initializes the whole union first. */
4397 ctor
= gfc_constructor_get ();
4398 ctor
->expr
= generate_union_initializer (c
);
4399 gfc_constructor_append (&init
->value
.constructor
, ctor
);
4402 /* If we found an initializer in one of our maps, apply it. Note this
4403 is applied _after_ the entire-union initializer above if any. */
4406 ctor
= gfc_constructor_get ();
4407 ctor
->expr
= user_init
;
4408 ctor
->n
.component
= map
;
4409 gfc_constructor_append (&init
->value
.constructor
, ctor
);
4413 /* Treat simple components like locals. */
4416 /* We MUST give an initializer, so force generation. */
4417 init
= gfc_build_init_expr (&c
->ts
, &c
->loc
, true);
4418 gfc_apply_init (&c
->ts
, &c
->attr
, init
);
4425 /* Get an expression for a default initializer of a derived type. */
4428 gfc_default_initializer (gfc_typespec
*ts
)
4430 return gfc_generate_initializer (ts
, false);
4434 /* Get or generate an expression for a default initializer of a derived type.
4435 If -finit-derived is specified, generate default initialization expressions
4436 for components that lack them when generate is set. */
4439 gfc_generate_initializer (gfc_typespec
*ts
, bool generate
)
4441 gfc_expr
*init
, *tmp
;
4442 gfc_component
*comp
;
4443 generate
= flag_init_derived
&& generate
;
4445 /* See if we have a default initializer in this, but not in nested
4446 types (otherwise we could use gfc_has_default_initializer()).
4447 We don't need to check if we are going to generate them. */
4448 comp
= ts
->u
.derived
->components
;
4451 for (; comp
; comp
= comp
->next
)
4452 if (comp
->initializer
|| comp
->attr
.allocatable
4453 || (comp
->ts
.type
== BT_CLASS
&& CLASS_DATA (comp
)
4454 && CLASS_DATA (comp
)->attr
.allocatable
))
4461 init
= gfc_get_structure_constructor_expr (ts
->type
, ts
->kind
,
4462 &ts
->u
.derived
->declared_at
);
4465 for (comp
= ts
->u
.derived
->components
; comp
; comp
= comp
->next
)
4467 gfc_constructor
*ctor
= gfc_constructor_get();
4469 /* Fetch or generate an initializer for the component. */
4470 tmp
= component_initializer (ts
, comp
, generate
);
4473 /* Save the component ref for STRUCTUREs and UNIONs. */
4474 if (ts
->u
.derived
->attr
.flavor
== FL_STRUCT
4475 || ts
->u
.derived
->attr
.flavor
== FL_UNION
)
4476 ctor
->n
.component
= comp
;
4478 /* If the initializer was not generated, we need a copy. */
4479 ctor
->expr
= comp
->initializer
? gfc_copy_expr (tmp
) : tmp
;
4480 if ((comp
->ts
.type
!= tmp
->ts
.type
4481 || comp
->ts
.kind
!= tmp
->ts
.kind
)
4482 && !comp
->attr
.pointer
&& !comp
->attr
.proc_pointer
)
4485 val
= gfc_convert_type_warn (ctor
->expr
, &comp
->ts
, 1, false);
4491 if (comp
->attr
.allocatable
4492 || (comp
->ts
.type
== BT_CLASS
&& CLASS_DATA (comp
)->attr
.allocatable
))
4494 ctor
->expr
= gfc_get_expr ();
4495 ctor
->expr
->expr_type
= EXPR_NULL
;
4496 ctor
->expr
->where
= init
->where
;
4497 ctor
->expr
->ts
= comp
->ts
;
4500 gfc_constructor_append (&init
->value
.constructor
, ctor
);
4507 /* Given a symbol, create an expression node with that symbol as a
4508 variable. If the symbol is array valued, setup a reference of the
4512 gfc_get_variable_expr (gfc_symtree
*var
)
4516 e
= gfc_get_expr ();
4517 e
->expr_type
= EXPR_VARIABLE
;
4519 e
->ts
= var
->n
.sym
->ts
;
4521 if (var
->n
.sym
->attr
.flavor
!= FL_PROCEDURE
4522 && ((var
->n
.sym
->as
!= NULL
&& var
->n
.sym
->ts
.type
!= BT_CLASS
)
4523 || (var
->n
.sym
->ts
.type
== BT_CLASS
&& CLASS_DATA (var
->n
.sym
)
4524 && CLASS_DATA (var
->n
.sym
)->as
)))
4526 e
->rank
= var
->n
.sym
->ts
.type
== BT_CLASS
4527 ? CLASS_DATA (var
->n
.sym
)->as
->rank
: var
->n
.sym
->as
->rank
;
4528 e
->ref
= gfc_get_ref ();
4529 e
->ref
->type
= REF_ARRAY
;
4530 e
->ref
->u
.ar
.type
= AR_FULL
;
4531 e
->ref
->u
.ar
.as
= gfc_copy_array_spec (var
->n
.sym
->ts
.type
== BT_CLASS
4532 ? CLASS_DATA (var
->n
.sym
)->as
4540 /* Adds a full array reference to an expression, as needed. */
4543 gfc_add_full_array_ref (gfc_expr
*e
, gfc_array_spec
*as
)
4546 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
4551 ref
->next
= gfc_get_ref ();
4556 e
->ref
= gfc_get_ref ();
4559 ref
->type
= REF_ARRAY
;
4560 ref
->u
.ar
.type
= AR_FULL
;
4561 ref
->u
.ar
.dimen
= e
->rank
;
4562 ref
->u
.ar
.where
= e
->where
;
4568 gfc_lval_expr_from_sym (gfc_symbol
*sym
)
4572 lval
= gfc_get_expr ();
4573 lval
->expr_type
= EXPR_VARIABLE
;
4574 lval
->where
= sym
->declared_at
;
4576 lval
->symtree
= gfc_find_symtree (sym
->ns
->sym_root
, sym
->name
);
4578 /* It will always be a full array. */
4579 as
= IS_CLASS_ARRAY (sym
) ? CLASS_DATA (sym
)->as
: sym
->as
;
4580 lval
->rank
= as
? as
->rank
: 0;
4582 gfc_add_full_array_ref (lval
, as
);
4587 /* Returns the array_spec of a full array expression. A NULL is
4588 returned otherwise. */
4590 gfc_get_full_arrayspec_from_expr (gfc_expr
*expr
)
4595 if (expr
->rank
== 0)
4598 /* Follow any component references. */
4599 if (expr
->expr_type
== EXPR_VARIABLE
4600 || expr
->expr_type
== EXPR_CONSTANT
)
4603 as
= expr
->symtree
->n
.sym
->as
;
4607 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
4612 as
= ref
->u
.c
.component
->as
;
4620 switch (ref
->u
.ar
.type
)
4643 /* General expression traversal function. */
4646 gfc_traverse_expr (gfc_expr
*expr
, gfc_symbol
*sym
,
4647 bool (*func
)(gfc_expr
*, gfc_symbol
*, int*),
4652 gfc_actual_arglist
*args
;
4659 if ((*func
) (expr
, sym
, &f
))
4662 if (expr
->ts
.type
== BT_CHARACTER
4664 && expr
->ts
.u
.cl
->length
4665 && expr
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
4666 && gfc_traverse_expr (expr
->ts
.u
.cl
->length
, sym
, func
, f
))
4669 switch (expr
->expr_type
)
4674 for (args
= expr
->value
.function
.actual
; args
; args
= args
->next
)
4676 if (gfc_traverse_expr (args
->expr
, sym
, func
, f
))
4684 case EXPR_SUBSTRING
:
4687 case EXPR_STRUCTURE
:
4689 for (c
= gfc_constructor_first (expr
->value
.constructor
);
4690 c
; c
= gfc_constructor_next (c
))
4692 if (gfc_traverse_expr (c
->expr
, sym
, func
, f
))
4696 if (gfc_traverse_expr (c
->iterator
->var
, sym
, func
, f
))
4698 if (gfc_traverse_expr (c
->iterator
->start
, sym
, func
, f
))
4700 if (gfc_traverse_expr (c
->iterator
->end
, sym
, func
, f
))
4702 if (gfc_traverse_expr (c
->iterator
->step
, sym
, func
, f
))
4709 if (gfc_traverse_expr (expr
->value
.op
.op1
, sym
, func
, f
))
4711 if (gfc_traverse_expr (expr
->value
.op
.op2
, sym
, func
, f
))
4727 for (i
= 0; i
< GFC_MAX_DIMENSIONS
; i
++)
4729 if (gfc_traverse_expr (ar
.start
[i
], sym
, func
, f
))
4731 if (gfc_traverse_expr (ar
.end
[i
], sym
, func
, f
))
4733 if (gfc_traverse_expr (ar
.stride
[i
], sym
, func
, f
))
4739 if (gfc_traverse_expr (ref
->u
.ss
.start
, sym
, func
, f
))
4741 if (gfc_traverse_expr (ref
->u
.ss
.end
, sym
, func
, f
))
4746 if (ref
->u
.c
.component
->ts
.type
== BT_CHARACTER
4747 && ref
->u
.c
.component
->ts
.u
.cl
4748 && ref
->u
.c
.component
->ts
.u
.cl
->length
4749 && ref
->u
.c
.component
->ts
.u
.cl
->length
->expr_type
4751 && gfc_traverse_expr (ref
->u
.c
.component
->ts
.u
.cl
->length
,
4755 if (ref
->u
.c
.component
->as
)
4756 for (i
= 0; i
< ref
->u
.c
.component
->as
->rank
4757 + ref
->u
.c
.component
->as
->corank
; i
++)
4759 if (gfc_traverse_expr (ref
->u
.c
.component
->as
->lower
[i
],
4762 if (gfc_traverse_expr (ref
->u
.c
.component
->as
->upper
[i
],
4776 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4779 expr_set_symbols_referenced (gfc_expr
*expr
,
4780 gfc_symbol
*sym ATTRIBUTE_UNUSED
,
4781 int *f ATTRIBUTE_UNUSED
)
4783 if (expr
->expr_type
!= EXPR_VARIABLE
)
4785 gfc_set_sym_referenced (expr
->symtree
->n
.sym
);
4790 gfc_expr_set_symbols_referenced (gfc_expr
*expr
)
4792 gfc_traverse_expr (expr
, NULL
, expr_set_symbols_referenced
, 0);
4796 /* Determine if an expression is a procedure pointer component and return
4797 the component in that case. Otherwise return NULL. */
4800 gfc_get_proc_ptr_comp (gfc_expr
*expr
)
4804 if (!expr
|| !expr
->ref
)
4811 if (ref
->type
== REF_COMPONENT
4812 && ref
->u
.c
.component
->attr
.proc_pointer
)
4813 return ref
->u
.c
.component
;
4819 /* Determine if an expression is a procedure pointer component. */
4822 gfc_is_proc_ptr_comp (gfc_expr
*expr
)
4824 return (gfc_get_proc_ptr_comp (expr
) != NULL
);
4828 /* Determine if an expression is a function with an allocatable class scalar
4831 gfc_is_alloc_class_scalar_function (gfc_expr
*expr
)
4833 if (expr
->expr_type
== EXPR_FUNCTION
4834 && expr
->value
.function
.esym
4835 && expr
->value
.function
.esym
->result
4836 && expr
->value
.function
.esym
->result
->ts
.type
== BT_CLASS
4837 && !CLASS_DATA (expr
->value
.function
.esym
->result
)->attr
.dimension
4838 && CLASS_DATA (expr
->value
.function
.esym
->result
)->attr
.allocatable
)
4845 /* Determine if an expression is a function with an allocatable class array
4848 gfc_is_class_array_function (gfc_expr
*expr
)
4850 if (expr
->expr_type
== EXPR_FUNCTION
4851 && expr
->value
.function
.esym
4852 && expr
->value
.function
.esym
->result
4853 && expr
->value
.function
.esym
->result
->ts
.type
== BT_CLASS
4854 && CLASS_DATA (expr
->value
.function
.esym
->result
)->attr
.dimension
4855 && (CLASS_DATA (expr
->value
.function
.esym
->result
)->attr
.allocatable
4856 || CLASS_DATA (expr
->value
.function
.esym
->result
)->attr
.pointer
))
4863 /* Walk an expression tree and check each variable encountered for being typed.
4864 If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4865 mode as is a basic arithmetic expression using those; this is for things in
4868 INTEGER :: arr(n), n
4869 INTEGER :: arr(n + 1), n
4871 The namespace is needed for IMPLICIT typing. */
4873 static gfc_namespace
* check_typed_ns
;
4876 expr_check_typed_help (gfc_expr
* e
, gfc_symbol
* sym ATTRIBUTE_UNUSED
,
4877 int* f ATTRIBUTE_UNUSED
)
4881 if (e
->expr_type
!= EXPR_VARIABLE
)
4884 gcc_assert (e
->symtree
);
4885 t
= gfc_check_symbol_typed (e
->symtree
->n
.sym
, check_typed_ns
,
4892 gfc_expr_check_typed (gfc_expr
* e
, gfc_namespace
* ns
, bool strict
)
4896 /* If this is a top-level variable or EXPR_OP, do the check with strict given
4900 if (e
->expr_type
== EXPR_VARIABLE
&& !e
->ref
)
4901 return gfc_check_symbol_typed (e
->symtree
->n
.sym
, ns
, strict
, e
->where
);
4903 if (e
->expr_type
== EXPR_OP
)
4907 gcc_assert (e
->value
.op
.op1
);
4908 t
= gfc_expr_check_typed (e
->value
.op
.op1
, ns
, strict
);
4910 if (t
&& e
->value
.op
.op2
)
4911 t
= gfc_expr_check_typed (e
->value
.op
.op2
, ns
, strict
);
4917 /* Otherwise, walk the expression and do it strictly. */
4918 check_typed_ns
= ns
;
4919 error_found
= gfc_traverse_expr (e
, NULL
, &expr_check_typed_help
, 0);
4921 return error_found
? false : true;
4925 /* This function returns true if it contains any references to PDT KIND
4926 or LEN parameters. */
4929 derived_parameter_expr (gfc_expr
* e
, gfc_symbol
* sym ATTRIBUTE_UNUSED
,
4930 int* f ATTRIBUTE_UNUSED
)
4932 if (e
->expr_type
!= EXPR_VARIABLE
)
4935 gcc_assert (e
->symtree
);
4936 if (e
->symtree
->n
.sym
->attr
.pdt_kind
4937 || e
->symtree
->n
.sym
->attr
.pdt_len
)
4945 gfc_derived_parameter_expr (gfc_expr
*e
)
4947 return gfc_traverse_expr (e
, NULL
, &derived_parameter_expr
, 0);
4951 /* This function returns the overall type of a type parameter spec list.
4952 If all the specs are explicit, SPEC_EXPLICIT is returned. If any of the
4953 parameters are assumed/deferred then SPEC_ASSUMED/DEFERRED is returned
4954 unless derived is not NULL. In this latter case, all the LEN parameters
4955 must be either assumed or deferred for the return argument to be set to
4956 anything other than SPEC_EXPLICIT. */
4959 gfc_spec_list_type (gfc_actual_arglist
*param_list
, gfc_symbol
*derived
)
4961 gfc_param_spec_type res
= SPEC_EXPLICIT
;
4963 bool seen_assumed
= false;
4964 bool seen_deferred
= false;
4966 if (derived
== NULL
)
4968 for (; param_list
; param_list
= param_list
->next
)
4969 if (param_list
->spec_type
== SPEC_ASSUMED
4970 || param_list
->spec_type
== SPEC_DEFERRED
)
4971 return param_list
->spec_type
;
4975 for (; param_list
; param_list
= param_list
->next
)
4977 c
= gfc_find_component (derived
, param_list
->name
,
4979 gcc_assert (c
!= NULL
);
4980 if (c
->attr
.pdt_kind
)
4982 else if (param_list
->spec_type
== SPEC_EXPLICIT
)
4983 return SPEC_EXPLICIT
;
4984 seen_assumed
= param_list
->spec_type
== SPEC_ASSUMED
;
4985 seen_deferred
= param_list
->spec_type
== SPEC_DEFERRED
;
4986 if (seen_assumed
&& seen_deferred
)
4987 return SPEC_EXPLICIT
;
4989 res
= seen_assumed
? SPEC_ASSUMED
: SPEC_DEFERRED
;
4996 gfc_ref_this_image (gfc_ref
*ref
)
5000 gcc_assert (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
> 0);
5002 for (n
= ref
->u
.ar
.dimen
; n
< ref
->u
.ar
.dimen
+ ref
->u
.ar
.codimen
; n
++)
5003 if (ref
->u
.ar
.dimen_type
[n
] != DIMEN_THIS_IMAGE
)
5010 gfc_find_stat_co(gfc_expr
*e
)
5014 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5015 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
> 0)
5016 return ref
->u
.ar
.stat
;
5018 if (e
->value
.function
.actual
->expr
)
5019 for (ref
= e
->value
.function
.actual
->expr
->ref
; ref
;
5021 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
> 0)
5022 return ref
->u
.ar
.stat
;
5028 gfc_is_coindexed (gfc_expr
*e
)
5032 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5033 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.codimen
> 0)
5034 return !gfc_ref_this_image (ref
);
5040 /* Coarrays are variables with a corank but not being coindexed. However, also
5041 the following is a coarray: A subobject of a coarray is a coarray if it does
5042 not have any cosubscripts, vector subscripts, allocatable component
5043 selection, or pointer component selection. (F2008, 2.4.7) */
5046 gfc_is_coarray (gfc_expr
*e
)
5050 gfc_component
*comp
;
5055 if (e
->expr_type
!= EXPR_VARIABLE
)
5059 sym
= e
->symtree
->n
.sym
;
5061 if (sym
->ts
.type
== BT_CLASS
&& sym
->attr
.class_ok
)
5062 coarray
= CLASS_DATA (sym
)->attr
.codimension
;
5064 coarray
= sym
->attr
.codimension
;
5066 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5070 comp
= ref
->u
.c
.component
;
5071 if (comp
->ts
.type
== BT_CLASS
&& comp
->attr
.class_ok
5072 && (CLASS_DATA (comp
)->attr
.class_pointer
5073 || CLASS_DATA (comp
)->attr
.allocatable
))
5076 coarray
= CLASS_DATA (comp
)->attr
.codimension
;
5078 else if (comp
->attr
.pointer
|| comp
->attr
.allocatable
)
5081 coarray
= comp
->attr
.codimension
;
5089 if (ref
->u
.ar
.codimen
> 0 && !gfc_ref_this_image (ref
))
5095 for (i
= 0; i
< ref
->u
.ar
.dimen
; i
++)
5096 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_VECTOR
)
5107 return coarray
&& !coindexed
;
5112 gfc_get_corank (gfc_expr
*e
)
5117 if (!gfc_is_coarray (e
))
5120 if (e
->ts
.type
== BT_CLASS
&& e
->ts
.u
.derived
->components
)
5121 corank
= e
->ts
.u
.derived
->components
->as
5122 ? e
->ts
.u
.derived
->components
->as
->corank
: 0;
5124 corank
= e
->symtree
->n
.sym
->as
? e
->symtree
->n
.sym
->as
->corank
: 0;
5126 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5128 if (ref
->type
== REF_ARRAY
)
5129 corank
= ref
->u
.ar
.as
->corank
;
5130 gcc_assert (ref
->type
!= REF_SUBSTRING
);
5137 /* Check whether the expression has an ultimate allocatable component.
5138 Being itself allocatable does not count. */
5140 gfc_has_ultimate_allocatable (gfc_expr
*e
)
5142 gfc_ref
*ref
, *last
= NULL
;
5144 if (e
->expr_type
!= EXPR_VARIABLE
)
5147 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5148 if (ref
->type
== REF_COMPONENT
)
5151 if (last
&& last
->u
.c
.component
->ts
.type
== BT_CLASS
)
5152 return CLASS_DATA (last
->u
.c
.component
)->attr
.alloc_comp
;
5153 else if (last
&& last
->u
.c
.component
->ts
.type
== BT_DERIVED
)
5154 return last
->u
.c
.component
->ts
.u
.derived
->attr
.alloc_comp
;
5158 if (e
->ts
.type
== BT_CLASS
)
5159 return CLASS_DATA (e
)->attr
.alloc_comp
;
5160 else if (e
->ts
.type
== BT_DERIVED
)
5161 return e
->ts
.u
.derived
->attr
.alloc_comp
;
5167 /* Check whether the expression has an pointer component.
5168 Being itself a pointer does not count. */
5170 gfc_has_ultimate_pointer (gfc_expr
*e
)
5172 gfc_ref
*ref
, *last
= NULL
;
5174 if (e
->expr_type
!= EXPR_VARIABLE
)
5177 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
5178 if (ref
->type
== REF_COMPONENT
)
5181 if (last
&& last
->u
.c
.component
->ts
.type
== BT_CLASS
)
5182 return CLASS_DATA (last
->u
.c
.component
)->attr
.pointer_comp
;
5183 else if (last
&& last
->u
.c
.component
->ts
.type
== BT_DERIVED
)
5184 return last
->u
.c
.component
->ts
.u
.derived
->attr
.pointer_comp
;
5188 if (e
->ts
.type
== BT_CLASS
)
5189 return CLASS_DATA (e
)->attr
.pointer_comp
;
5190 else if (e
->ts
.type
== BT_DERIVED
)
5191 return e
->ts
.u
.derived
->attr
.pointer_comp
;
5197 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
5198 Note: A scalar is not regarded as "simply contiguous" by the standard.
5199 if bool is not strict, some further checks are done - for instance,
5200 a "(::1)" is accepted. */
5203 gfc_is_simply_contiguous (gfc_expr
*expr
, bool strict
, bool permit_element
)
5207 gfc_array_ref
*ar
= NULL
;
5208 gfc_ref
*ref
, *part_ref
= NULL
;
5211 if (expr
->expr_type
== EXPR_FUNCTION
)
5213 if (expr
->value
.function
.esym
)
5214 return expr
->value
.function
.esym
->result
->attr
.contiguous
;
5217 /* We have to jump through some hoops if this is a vtab entry. */
5221 s
= expr
->symtree
->n
.sym
;
5222 if (s
->ts
.type
!= BT_CLASS
)
5226 for (r
= expr
->ref
; r
; r
= r
->next
)
5227 if (r
->type
== REF_COMPONENT
)
5230 if (rc
== NULL
|| rc
->u
.c
.component
== NULL
5231 || rc
->u
.c
.component
->ts
.interface
== NULL
)
5234 return rc
->u
.c
.component
->ts
.interface
->attr
.contiguous
;
5237 else if (expr
->expr_type
!= EXPR_VARIABLE
)
5240 if (!permit_element
&& expr
->rank
== 0)
5243 for (ref
= expr
->ref
; ref
; ref
= ref
->next
)
5246 return false; /* Array shall be last part-ref. */
5248 if (ref
->type
== REF_COMPONENT
)
5250 else if (ref
->type
== REF_SUBSTRING
)
5252 else if (ref
->u
.ar
.type
!= AR_ELEMENT
)
5256 sym
= expr
->symtree
->n
.sym
;
5257 if (expr
->ts
.type
!= BT_CLASS
5259 && !part_ref
->u
.c
.component
->attr
.contiguous
5260 && part_ref
->u
.c
.component
->attr
.pointer
)
5262 && !sym
->attr
.contiguous
5263 && (sym
->attr
.pointer
5264 || sym
->as
->type
== AS_ASSUMED_RANK
5265 || sym
->as
->type
== AS_ASSUMED_SHAPE
))))
5268 if (!ar
|| ar
->type
== AR_FULL
)
5271 gcc_assert (ar
->type
== AR_SECTION
);
5273 /* Check for simply contiguous array */
5275 for (i
= 0; i
< ar
->dimen
; i
++)
5277 if (ar
->dimen_type
[i
] == DIMEN_VECTOR
)
5280 if (ar
->dimen_type
[i
] == DIMEN_ELEMENT
)
5286 gcc_assert (ar
->dimen_type
[i
] == DIMEN_RANGE
);
5289 /* If the previous section was not contiguous, that's an error,
5290 unless we have effective only one element and checking is not
5292 if (!colon
&& (strict
|| !ar
->start
[i
] || !ar
->end
[i
]
5293 || ar
->start
[i
]->expr_type
!= EXPR_CONSTANT
5294 || ar
->end
[i
]->expr_type
!= EXPR_CONSTANT
5295 || mpz_cmp (ar
->start
[i
]->value
.integer
,
5296 ar
->end
[i
]->value
.integer
) != 0))
5299 /* Following the standard, "(::1)" or - if known at compile time -
5300 "(lbound:ubound)" are not simply contiguous; if strict
5301 is false, they are regarded as simply contiguous. */
5302 if (ar
->stride
[i
] && (strict
|| ar
->stride
[i
]->expr_type
!= EXPR_CONSTANT
5303 || ar
->stride
[i
]->ts
.type
!= BT_INTEGER
5304 || mpz_cmp_si (ar
->stride
[i
]->value
.integer
, 1) != 0))
5308 && (strict
|| ar
->start
[i
]->expr_type
!= EXPR_CONSTANT
5309 || !ar
->as
->lower
[i
]
5310 || ar
->as
->lower
[i
]->expr_type
!= EXPR_CONSTANT
5311 || mpz_cmp (ar
->start
[i
]->value
.integer
,
5312 ar
->as
->lower
[i
]->value
.integer
) != 0))
5316 && (strict
|| ar
->end
[i
]->expr_type
!= EXPR_CONSTANT
5317 || !ar
->as
->upper
[i
]
5318 || ar
->as
->upper
[i
]->expr_type
!= EXPR_CONSTANT
5319 || mpz_cmp (ar
->end
[i
]->value
.integer
,
5320 ar
->as
->upper
[i
]->value
.integer
) != 0))
5328 /* Build call to an intrinsic procedure. The number of arguments has to be
5329 passed (rather than ending the list with a NULL value) because we may
5330 want to add arguments but with a NULL-expression. */
5333 gfc_build_intrinsic_call (gfc_namespace
*ns
, gfc_isym_id id
, const char* name
,
5334 locus where
, unsigned numarg
, ...)
5337 gfc_actual_arglist
* atail
;
5338 gfc_intrinsic_sym
* isym
;
5341 const char *mangled_name
= gfc_get_string (GFC_PREFIX ("%s"), name
);
5343 isym
= gfc_intrinsic_function_by_id (id
);
5346 result
= gfc_get_expr ();
5347 result
->expr_type
= EXPR_FUNCTION
;
5348 result
->ts
= isym
->ts
;
5349 result
->where
= where
;
5350 result
->value
.function
.name
= mangled_name
;
5351 result
->value
.function
.isym
= isym
;
5353 gfc_get_sym_tree (mangled_name
, ns
, &result
->symtree
, false);
5354 gfc_commit_symbol (result
->symtree
->n
.sym
);
5355 gcc_assert (result
->symtree
5356 && (result
->symtree
->n
.sym
->attr
.flavor
== FL_PROCEDURE
5357 || result
->symtree
->n
.sym
->attr
.flavor
== FL_UNKNOWN
));
5358 result
->symtree
->n
.sym
->intmod_sym_id
= id
;
5359 result
->symtree
->n
.sym
->attr
.flavor
= FL_PROCEDURE
;
5360 result
->symtree
->n
.sym
->attr
.intrinsic
= 1;
5361 result
->symtree
->n
.sym
->attr
.artificial
= 1;
5363 va_start (ap
, numarg
);
5365 for (i
= 0; i
< numarg
; ++i
)
5369 atail
->next
= gfc_get_actual_arglist ();
5370 atail
= atail
->next
;
5373 atail
= result
->value
.function
.actual
= gfc_get_actual_arglist ();
5375 atail
->expr
= va_arg (ap
, gfc_expr
*);
5383 /* Check if an expression may appear in a variable definition context
5384 (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
5385 This is called from the various places when resolving
5386 the pieces that make up such a context.
5387 If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
5388 variables), some checks are not performed.
5390 Optionally, a possible error message can be suppressed if context is NULL
5391 and just the return status (true / false) be requested. */
5394 gfc_check_vardef_context (gfc_expr
* e
, bool pointer
, bool alloc_obj
,
5395 bool own_scope
, const char* context
)
5397 gfc_symbol
* sym
= NULL
;
5399 bool check_intentin
;
5401 symbol_attribute attr
;
5405 if (e
->expr_type
== EXPR_VARIABLE
)
5407 gcc_assert (e
->symtree
);
5408 sym
= e
->symtree
->n
.sym
;
5410 else if (e
->expr_type
== EXPR_FUNCTION
)
5412 gcc_assert (e
->symtree
);
5413 sym
= e
->value
.function
.esym
? e
->value
.function
.esym
: e
->symtree
->n
.sym
;
5416 attr
= gfc_expr_attr (e
);
5417 if (!pointer
&& e
->expr_type
== EXPR_FUNCTION
&& attr
.pointer
)
5419 if (!(gfc_option
.allow_std
& GFC_STD_F2008
))
5422 gfc_error ("Fortran 2008: Pointer functions in variable definition"
5423 " context (%s) at %L", context
, &e
->where
);
5427 else if (e
->expr_type
!= EXPR_VARIABLE
)
5430 gfc_error ("Non-variable expression in variable definition context (%s)"
5431 " at %L", context
, &e
->where
);
5435 if (!pointer
&& sym
->attr
.flavor
== FL_PARAMETER
)
5438 gfc_error ("Named constant %qs in variable definition context (%s)"
5439 " at %L", sym
->name
, context
, &e
->where
);
5442 if (!pointer
&& sym
->attr
.flavor
!= FL_VARIABLE
5443 && !(sym
->attr
.flavor
== FL_PROCEDURE
&& sym
== sym
->result
)
5444 && !(sym
->attr
.flavor
== FL_PROCEDURE
&& sym
->attr
.proc_pointer
))
5447 gfc_error ("%qs in variable definition context (%s) at %L is not"
5448 " a variable", sym
->name
, context
, &e
->where
);
5452 /* Find out whether the expr is a pointer; this also means following
5453 component references to the last one. */
5454 is_pointer
= (attr
.pointer
|| attr
.proc_pointer
);
5455 if (pointer
&& !is_pointer
)
5458 gfc_error ("Non-POINTER in pointer association context (%s)"
5459 " at %L", context
, &e
->where
);
5463 if (e
->ts
.type
== BT_DERIVED
5464 && e
->ts
.u
.derived
== NULL
)
5467 gfc_error ("Type inaccessible in variable definition context (%s) "
5468 "at %L", context
, &e
->where
);
5475 || (e
->ts
.type
== BT_DERIVED
5476 && e
->ts
.u
.derived
->from_intmod
== INTMOD_ISO_FORTRAN_ENV
5477 && e
->ts
.u
.derived
->intmod_sym_id
== ISOFORTRAN_LOCK_TYPE
)))
5480 gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
5481 context
, &e
->where
);
5485 /* TS18508, C702/C203. */
5488 || (e
->ts
.type
== BT_DERIVED
5489 && e
->ts
.u
.derived
->from_intmod
== INTMOD_ISO_FORTRAN_ENV
5490 && e
->ts
.u
.derived
->intmod_sym_id
== ISOFORTRAN_EVENT_TYPE
)))
5493 gfc_error ("LOCK_EVENT in variable definition context (%s) at %L",
5494 context
, &e
->where
);
5498 /* INTENT(IN) dummy argument. Check this, unless the object itself is the
5499 component of sub-component of a pointer; we need to distinguish
5500 assignment to a pointer component from pointer-assignment to a pointer
5501 component. Note that (normal) assignment to procedure pointers is not
5503 check_intentin
= !own_scope
;
5504 ptr_component
= (sym
->ts
.type
== BT_CLASS
&& sym
->ts
.u
.derived
5505 && CLASS_DATA (sym
))
5506 ? CLASS_DATA (sym
)->attr
.class_pointer
: sym
->attr
.pointer
;
5507 for (ref
= e
->ref
; ref
&& check_intentin
; ref
= ref
->next
)
5509 if (ptr_component
&& ref
->type
== REF_COMPONENT
)
5510 check_intentin
= false;
5511 if (ref
->type
== REF_COMPONENT
&& ref
->u
.c
.component
->attr
.pointer
)
5513 ptr_component
= true;
5515 check_intentin
= false;
5518 if (check_intentin
&& sym
->attr
.intent
== INTENT_IN
)
5520 if (pointer
&& is_pointer
)
5523 gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
5524 " association context (%s) at %L",
5525 sym
->name
, context
, &e
->where
);
5528 if (!pointer
&& !is_pointer
&& !sym
->attr
.pointer
)
5531 gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
5532 " definition context (%s) at %L",
5533 sym
->name
, context
, &e
->where
);
5538 /* PROTECTED and use-associated. */
5539 if (sym
->attr
.is_protected
&& sym
->attr
.use_assoc
&& check_intentin
)
5541 if (pointer
&& is_pointer
)
5544 gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5545 " pointer association context (%s) at %L",
5546 sym
->name
, context
, &e
->where
);
5549 if (!pointer
&& !is_pointer
)
5552 gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5553 " variable definition context (%s) at %L",
5554 sym
->name
, context
, &e
->where
);
5559 /* Variable not assignable from a PURE procedure but appears in
5560 variable definition context. */
5561 if (!pointer
&& !own_scope
&& gfc_pure (NULL
) && gfc_impure_variable (sym
))
5564 gfc_error ("Variable %qs can not appear in a variable definition"
5565 " context (%s) at %L in PURE procedure",
5566 sym
->name
, context
, &e
->where
);
5570 if (!pointer
&& context
&& gfc_implicit_pure (NULL
)
5571 && gfc_impure_variable (sym
))
5576 for (ns
= gfc_current_ns
; ns
; ns
= ns
->parent
)
5578 sym
= ns
->proc_name
;
5581 if (sym
->attr
.flavor
== FL_PROCEDURE
)
5583 sym
->attr
.implicit_pure
= 0;
5588 /* Check variable definition context for associate-names. */
5589 if (!pointer
&& sym
->assoc
)
5592 gfc_association_list
* assoc
;
5594 gcc_assert (sym
->assoc
->target
);
5596 /* If this is a SELECT TYPE temporary (the association is used internally
5597 for SELECT TYPE), silently go over to the target. */
5598 if (sym
->attr
.select_type_temporary
)
5600 gfc_expr
* t
= sym
->assoc
->target
;
5602 gcc_assert (t
->expr_type
== EXPR_VARIABLE
);
5603 name
= t
->symtree
->name
;
5605 if (t
->symtree
->n
.sym
->assoc
)
5606 assoc
= t
->symtree
->n
.sym
->assoc
;
5615 gcc_assert (name
&& assoc
);
5617 /* Is association to a valid variable? */
5618 if (!assoc
->variable
)
5622 if (assoc
->target
->expr_type
== EXPR_VARIABLE
)
5623 gfc_error ("%qs at %L associated to vector-indexed target can"
5624 " not be used in a variable definition context (%s)",
5625 name
, &e
->where
, context
);
5627 gfc_error ("%qs at %L associated to expression can"
5628 " not be used in a variable definition context (%s)",
5629 name
, &e
->where
, context
);
5634 /* Target must be allowed to appear in a variable definition context. */
5635 if (!gfc_check_vardef_context (assoc
->target
, pointer
, false, false, NULL
))
5638 gfc_error ("Associate-name %qs can not appear in a variable"
5639 " definition context (%s) at %L because its target"
5640 " at %L can not, either",
5641 name
, context
, &e
->where
,
5642 &assoc
->target
->where
);
5647 /* Check for same value in vector expression subscript. */
5650 for (ref
= e
->ref
; ref
!= NULL
; ref
= ref
->next
)
5651 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.type
== AR_SECTION
)
5652 for (i
= 0; i
< GFC_MAX_DIMENSIONS
5653 && ref
->u
.ar
.dimen_type
[i
] != 0; i
++)
5654 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_VECTOR
)
5656 gfc_expr
*arr
= ref
->u
.ar
.start
[i
];
5657 if (arr
->expr_type
== EXPR_ARRAY
)
5659 gfc_constructor
*c
, *n
;
5662 for (c
= gfc_constructor_first (arr
->value
.constructor
);
5663 c
!= NULL
; c
= gfc_constructor_next (c
))
5665 if (c
== NULL
|| c
->iterator
!= NULL
)
5670 for (n
= gfc_constructor_next (c
); n
!= NULL
;
5671 n
= gfc_constructor_next (n
))
5673 if (n
->iterator
!= NULL
)
5677 if (gfc_dep_compare_expr (ec
, en
) == 0)
5680 gfc_error_now ("Elements with the same value "
5681 "at %L and %L in vector "
5682 "subscript in a variable "
5683 "definition context (%s)",
5684 &(ec
->where
), &(en
->where
),