1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000-2014 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"
29 #include "stringpool.h"
31 int gfc_matching_ptr_assignment
= 0;
32 int gfc_matching_procptr_assignment
= 0;
33 bool gfc_matching_prefix
= false;
35 /* Stack of SELECT TYPE statements. */
36 gfc_select_type_stack
*select_type_stack
= NULL
;
38 /* For debugging and diagnostic purposes. Return the textual representation
39 of the intrinsic operator OP. */
41 gfc_op2string (gfc_intrinsic_op op
)
49 case INTRINSIC_UMINUS
:
55 case INTRINSIC_CONCAT
:
59 case INTRINSIC_DIVIDE
:
98 case INTRINSIC_ASSIGN
:
101 case INTRINSIC_PARENTHESES
:
108 gfc_internal_error ("gfc_op2string(): Bad code");
113 /******************** Generic matching subroutines ************************/
115 /* This function scans the current statement counting the opened and closed
116 parenthesis to make sure they are balanced. */
119 gfc_match_parens (void)
121 locus old_loc
, where
;
123 gfc_instring instring
;
126 old_loc
= gfc_current_locus
;
128 instring
= NONSTRING
;
133 c
= gfc_next_char_literal (instring
);
136 if (quote
== ' ' && ((c
== '\'') || (c
== '"')))
139 instring
= INSTRING_WARN
;
142 if (quote
!= ' ' && c
== quote
)
145 instring
= NONSTRING
;
149 if (c
== '(' && quote
== ' ')
152 where
= gfc_current_locus
;
154 if (c
== ')' && quote
== ' ')
157 where
= gfc_current_locus
;
161 gfc_current_locus
= old_loc
;
165 gfc_error ("Missing ')' in statement at or before %L", &where
);
170 gfc_error ("Missing '(' in statement at or before %L", &where
);
178 /* See if the next character is a special character that has
179 escaped by a \ via the -fbackslash option. */
182 gfc_match_special_char (gfc_char_t
*res
)
190 switch ((c
= gfc_next_char_literal (INSTRING_WARN
)))
223 /* Hexadecimal form of wide characters. */
224 len
= (c
== 'x' ? 2 : (c
== 'u' ? 4 : 8));
226 for (i
= 0; i
< len
; i
++)
228 char buf
[2] = { '\0', '\0' };
230 c
= gfc_next_char_literal (INSTRING_WARN
);
231 if (!gfc_wide_fits_in_byte (c
)
232 || !gfc_check_digit ((unsigned char) c
, 16))
235 buf
[0] = (unsigned char) c
;
237 n
+= strtol (buf
, NULL
, 16);
243 /* Unknown backslash codes are simply not expanded. */
252 /* In free form, match at least one space. Always matches in fixed
256 gfc_match_space (void)
261 if (gfc_current_form
== FORM_FIXED
)
264 old_loc
= gfc_current_locus
;
266 c
= gfc_next_ascii_char ();
267 if (!gfc_is_whitespace (c
))
269 gfc_current_locus
= old_loc
;
273 gfc_gobble_whitespace ();
279 /* Match an end of statement. End of statement is optional
280 whitespace, followed by a ';' or '\n' or comment '!'. If a
281 semicolon is found, we continue to eat whitespace and semicolons. */
294 old_loc
= gfc_current_locus
;
295 gfc_gobble_whitespace ();
297 c
= gfc_next_ascii_char ();
303 c
= gfc_next_ascii_char ();
320 gfc_current_locus
= old_loc
;
321 return (flag
) ? MATCH_YES
: MATCH_NO
;
325 /* Match a literal integer on the input, setting the value on
326 MATCH_YES. Literal ints occur in kind-parameters as well as
327 old-style character length specifications. If cnt is non-NULL it
328 will be set to the number of digits. */
331 gfc_match_small_literal_int (int *value
, int *cnt
)
337 old_loc
= gfc_current_locus
;
340 gfc_gobble_whitespace ();
341 c
= gfc_next_ascii_char ();
347 gfc_current_locus
= old_loc
;
356 old_loc
= gfc_current_locus
;
357 c
= gfc_next_ascii_char ();
362 i
= 10 * i
+ c
- '0';
367 gfc_error ("Integer too large at %C");
372 gfc_current_locus
= old_loc
;
381 /* Match a small, constant integer expression, like in a kind
382 statement. On MATCH_YES, 'value' is set. */
385 gfc_match_small_int (int *value
)
392 m
= gfc_match_expr (&expr
);
396 p
= gfc_extract_int (expr
, &i
);
397 gfc_free_expr (expr
);
410 /* This function is the same as the gfc_match_small_int, except that
411 we're keeping the pointer to the expr. This function could just be
412 removed and the previously mentioned one modified, though all calls
413 to it would have to be modified then (and there were a number of
414 them). Return MATCH_ERROR if fail to extract the int; otherwise,
415 return the result of gfc_match_expr(). The expr (if any) that was
416 matched is returned in the parameter expr. */
419 gfc_match_small_int_expr (int *value
, gfc_expr
**expr
)
425 m
= gfc_match_expr (expr
);
429 p
= gfc_extract_int (*expr
, &i
);
442 /* Matches a statement label. Uses gfc_match_small_literal_int() to
443 do most of the work. */
446 gfc_match_st_label (gfc_st_label
**label
)
452 old_loc
= gfc_current_locus
;
454 m
= gfc_match_small_literal_int (&i
, &cnt
);
460 gfc_error ("Too many digits in statement label at %C");
466 gfc_error ("Statement label at %C is zero");
470 *label
= gfc_get_st_label (i
);
475 gfc_current_locus
= old_loc
;
480 /* Match and validate a label associated with a named IF, DO or SELECT
481 statement. If the symbol does not have the label attribute, we add
482 it. We also make sure the symbol does not refer to another
483 (active) block. A matched label is pointed to by gfc_new_block. */
486 gfc_match_label (void)
488 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
491 gfc_new_block
= NULL
;
493 m
= gfc_match (" %n :", name
);
497 if (gfc_get_symbol (name
, NULL
, &gfc_new_block
))
499 gfc_error ("Label name '%s' at %C is ambiguous", name
);
503 if (gfc_new_block
->attr
.flavor
== FL_LABEL
)
505 gfc_error ("Duplicate construct label '%s' at %C", name
);
509 if (!gfc_add_flavor (&gfc_new_block
->attr
, FL_LABEL
,
510 gfc_new_block
->name
, NULL
))
517 /* See if the current input looks like a name of some sort. Modifies
518 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
519 Note that options.c restricts max_identifier_length to not more
520 than GFC_MAX_SYMBOL_LEN. */
523 gfc_match_name (char *buffer
)
529 old_loc
= gfc_current_locus
;
530 gfc_gobble_whitespace ();
532 c
= gfc_next_ascii_char ();
533 if (!(ISALPHA (c
) || (c
== '_' && gfc_option
.flag_allow_leading_underscore
)))
535 if (gfc_error_flag_test () == 0 && c
!= '(')
536 gfc_error ("Invalid character in name at %C");
537 gfc_current_locus
= old_loc
;
547 if (i
> gfc_option
.max_identifier_length
)
549 gfc_error ("Name at %C is too long");
553 old_loc
= gfc_current_locus
;
554 c
= gfc_next_ascii_char ();
556 while (ISALNUM (c
) || c
== '_' || (gfc_option
.flag_dollar_ok
&& c
== '$'));
558 if (c
== '$' && !gfc_option
.flag_dollar_ok
)
560 gfc_fatal_error ("Invalid character '$' at %L. Use -fdollar-ok to allow "
561 "it as an extension", &old_loc
);
566 gfc_current_locus
= old_loc
;
572 /* Match a symbol on the input. Modifies the pointer to the symbol
573 pointer if successful. */
576 gfc_match_sym_tree (gfc_symtree
**matched_symbol
, int host_assoc
)
578 char buffer
[GFC_MAX_SYMBOL_LEN
+ 1];
581 m
= gfc_match_name (buffer
);
586 return (gfc_get_ha_sym_tree (buffer
, matched_symbol
))
587 ? MATCH_ERROR
: MATCH_YES
;
589 if (gfc_get_sym_tree (buffer
, NULL
, matched_symbol
, false))
597 gfc_match_symbol (gfc_symbol
**matched_symbol
, int host_assoc
)
602 m
= gfc_match_sym_tree (&st
, host_assoc
);
607 *matched_symbol
= st
->n
.sym
;
609 *matched_symbol
= NULL
;
612 *matched_symbol
= NULL
;
617 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
618 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
622 gfc_match_intrinsic_op (gfc_intrinsic_op
*result
)
624 locus orig_loc
= gfc_current_locus
;
627 gfc_gobble_whitespace ();
628 ch
= gfc_next_ascii_char ();
633 *result
= INTRINSIC_PLUS
;
638 *result
= INTRINSIC_MINUS
;
642 if (gfc_next_ascii_char () == '=')
645 *result
= INTRINSIC_EQ
;
651 if (gfc_peek_ascii_char () == '=')
654 gfc_next_ascii_char ();
655 *result
= INTRINSIC_LE
;
659 *result
= INTRINSIC_LT
;
663 if (gfc_peek_ascii_char () == '=')
666 gfc_next_ascii_char ();
667 *result
= INTRINSIC_GE
;
671 *result
= INTRINSIC_GT
;
675 if (gfc_peek_ascii_char () == '*')
678 gfc_next_ascii_char ();
679 *result
= INTRINSIC_POWER
;
683 *result
= INTRINSIC_TIMES
;
687 ch
= gfc_peek_ascii_char ();
691 gfc_next_ascii_char ();
692 *result
= INTRINSIC_NE
;
698 gfc_next_ascii_char ();
699 *result
= INTRINSIC_CONCAT
;
703 *result
= INTRINSIC_DIVIDE
;
707 ch
= gfc_next_ascii_char ();
711 if (gfc_next_ascii_char () == 'n'
712 && gfc_next_ascii_char () == 'd'
713 && gfc_next_ascii_char () == '.')
715 /* Matched ".and.". */
716 *result
= INTRINSIC_AND
;
722 if (gfc_next_ascii_char () == 'q')
724 ch
= gfc_next_ascii_char ();
727 /* Matched ".eq.". */
728 *result
= INTRINSIC_EQ_OS
;
733 if (gfc_next_ascii_char () == '.')
735 /* Matched ".eqv.". */
736 *result
= INTRINSIC_EQV
;
744 ch
= gfc_next_ascii_char ();
747 if (gfc_next_ascii_char () == '.')
749 /* Matched ".ge.". */
750 *result
= INTRINSIC_GE_OS
;
756 if (gfc_next_ascii_char () == '.')
758 /* Matched ".gt.". */
759 *result
= INTRINSIC_GT_OS
;
766 ch
= gfc_next_ascii_char ();
769 if (gfc_next_ascii_char () == '.')
771 /* Matched ".le.". */
772 *result
= INTRINSIC_LE_OS
;
778 if (gfc_next_ascii_char () == '.')
780 /* Matched ".lt.". */
781 *result
= INTRINSIC_LT_OS
;
788 ch
= gfc_next_ascii_char ();
791 ch
= gfc_next_ascii_char ();
794 /* Matched ".ne.". */
795 *result
= INTRINSIC_NE_OS
;
800 if (gfc_next_ascii_char () == 'v'
801 && gfc_next_ascii_char () == '.')
803 /* Matched ".neqv.". */
804 *result
= INTRINSIC_NEQV
;
811 if (gfc_next_ascii_char () == 't'
812 && gfc_next_ascii_char () == '.')
814 /* Matched ".not.". */
815 *result
= INTRINSIC_NOT
;
822 if (gfc_next_ascii_char () == 'r'
823 && gfc_next_ascii_char () == '.')
825 /* Matched ".or.". */
826 *result
= INTRINSIC_OR
;
840 gfc_current_locus
= orig_loc
;
845 /* Match a loop control phrase:
847 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
849 If the final integer expression is not present, a constant unity
850 expression is returned. We don't return MATCH_ERROR until after
851 the equals sign is seen. */
854 gfc_match_iterator (gfc_iterator
*iter
, int init_flag
)
856 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
857 gfc_expr
*var
, *e1
, *e2
, *e3
;
863 /* Match the start of an iterator without affecting the symbol table. */
865 start
= gfc_current_locus
;
866 m
= gfc_match (" %n =", name
);
867 gfc_current_locus
= start
;
872 m
= gfc_match_variable (&var
, 0);
876 /* F2008, C617 & C565. */
877 if (var
->symtree
->n
.sym
->attr
.codimension
)
879 gfc_error ("Loop variable at %C cannot be a coarray");
883 if (var
->ref
!= NULL
)
885 gfc_error ("Loop variable at %C cannot be a sub-component");
889 gfc_match_char ('=');
891 var
->symtree
->n
.sym
->attr
.implied_index
= 1;
893 m
= init_flag
? gfc_match_init_expr (&e1
) : gfc_match_expr (&e1
);
896 if (m
== MATCH_ERROR
)
899 if (gfc_match_char (',') != MATCH_YES
)
902 m
= init_flag
? gfc_match_init_expr (&e2
) : gfc_match_expr (&e2
);
905 if (m
== MATCH_ERROR
)
908 if (gfc_match_char (',') != MATCH_YES
)
910 e3
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 1);
914 m
= init_flag
? gfc_match_init_expr (&e3
) : gfc_match_expr (&e3
);
915 if (m
== MATCH_ERROR
)
919 gfc_error ("Expected a step value in iterator at %C");
931 gfc_error ("Syntax error in iterator at %C");
942 /* Tries to match the next non-whitespace character on the input.
943 This subroutine does not return MATCH_ERROR. */
946 gfc_match_char (char c
)
950 where
= gfc_current_locus
;
951 gfc_gobble_whitespace ();
953 if (gfc_next_ascii_char () == c
)
956 gfc_current_locus
= where
;
961 /* General purpose matching subroutine. The target string is a
962 scanf-like format string in which spaces correspond to arbitrary
963 whitespace (including no whitespace), characters correspond to
964 themselves. The %-codes are:
966 %% Literal percent sign
967 %e Expression, pointer to a pointer is set
968 %s Symbol, pointer to the symbol is set
969 %n Name, character buffer is set to name
970 %t Matches end of statement.
971 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
972 %l Matches a statement label
973 %v Matches a variable expression (an lvalue)
974 % Matches a required space (in free form) and optional spaces. */
977 gfc_match (const char *target
, ...)
979 gfc_st_label
**label
;
988 old_loc
= gfc_current_locus
;
989 va_start (argp
, target
);
999 gfc_gobble_whitespace ();
1010 vp
= va_arg (argp
, void **);
1011 n
= gfc_match_expr ((gfc_expr
**) vp
);
1022 vp
= va_arg (argp
, void **);
1023 n
= gfc_match_variable ((gfc_expr
**) vp
, 0);
1034 vp
= va_arg (argp
, void **);
1035 n
= gfc_match_symbol ((gfc_symbol
**) vp
, 0);
1046 np
= va_arg (argp
, char *);
1047 n
= gfc_match_name (np
);
1058 label
= va_arg (argp
, gfc_st_label
**);
1059 n
= gfc_match_st_label (label
);
1070 ip
= va_arg (argp
, int *);
1071 n
= gfc_match_intrinsic_op ((gfc_intrinsic_op
*) ip
);
1082 if (gfc_match_eos () != MATCH_YES
)
1090 if (gfc_match_space () == MATCH_YES
)
1096 break; /* Fall through to character matcher. */
1099 gfc_internal_error ("gfc_match(): Bad match code %c", c
);
1104 /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1105 expect an upper case character here! */
1106 gcc_assert (TOLOWER (c
) == c
);
1108 if (c
== gfc_next_ascii_char ())
1118 /* Clean up after a failed match. */
1119 gfc_current_locus
= old_loc
;
1120 va_start (argp
, target
);
1123 for (; matches
> 0; matches
--)
1125 while (*p
++ != '%');
1133 /* Matches that don't have to be undone */
1138 (void) va_arg (argp
, void **);
1143 vp
= va_arg (argp
, void **);
1144 gfc_free_expr ((struct gfc_expr
*)*vp
);
1157 /*********************** Statement level matching **********************/
1159 /* Matches the start of a program unit, which is the program keyword
1160 followed by an obligatory symbol. */
1163 gfc_match_program (void)
1168 m
= gfc_match ("% %s%t", &sym
);
1172 gfc_error ("Invalid form of PROGRAM statement at %C");
1176 if (m
== MATCH_ERROR
)
1179 if (!gfc_add_flavor (&sym
->attr
, FL_PROGRAM
, sym
->name
, NULL
))
1182 gfc_new_block
= sym
;
1188 /* Match a simple assignment statement. */
1191 gfc_match_assignment (void)
1193 gfc_expr
*lvalue
, *rvalue
;
1197 old_loc
= gfc_current_locus
;
1200 m
= gfc_match (" %v =", &lvalue
);
1203 gfc_current_locus
= old_loc
;
1204 gfc_free_expr (lvalue
);
1209 m
= gfc_match (" %e%t", &rvalue
);
1212 gfc_current_locus
= old_loc
;
1213 gfc_free_expr (lvalue
);
1214 gfc_free_expr (rvalue
);
1218 gfc_set_sym_referenced (lvalue
->symtree
->n
.sym
);
1220 new_st
.op
= EXEC_ASSIGN
;
1221 new_st
.expr1
= lvalue
;
1222 new_st
.expr2
= rvalue
;
1224 gfc_check_do_variable (lvalue
->symtree
);
1230 /* Match a pointer assignment statement. */
1233 gfc_match_pointer_assignment (void)
1235 gfc_expr
*lvalue
, *rvalue
;
1239 old_loc
= gfc_current_locus
;
1241 lvalue
= rvalue
= NULL
;
1242 gfc_matching_ptr_assignment
= 0;
1243 gfc_matching_procptr_assignment
= 0;
1245 m
= gfc_match (" %v =>", &lvalue
);
1252 if (lvalue
->symtree
->n
.sym
->attr
.proc_pointer
1253 || gfc_is_proc_ptr_comp (lvalue
))
1254 gfc_matching_procptr_assignment
= 1;
1256 gfc_matching_ptr_assignment
= 1;
1258 m
= gfc_match (" %e%t", &rvalue
);
1259 gfc_matching_ptr_assignment
= 0;
1260 gfc_matching_procptr_assignment
= 0;
1264 new_st
.op
= EXEC_POINTER_ASSIGN
;
1265 new_st
.expr1
= lvalue
;
1266 new_st
.expr2
= rvalue
;
1271 gfc_current_locus
= old_loc
;
1272 gfc_free_expr (lvalue
);
1273 gfc_free_expr (rvalue
);
1278 /* We try to match an easy arithmetic IF statement. This only happens
1279 when just after having encountered a simple IF statement. This code
1280 is really duplicate with parts of the gfc_match_if code, but this is
1284 match_arithmetic_if (void)
1286 gfc_st_label
*l1
, *l2
, *l3
;
1290 m
= gfc_match (" ( %e ) %l , %l , %l%t", &expr
, &l1
, &l2
, &l3
);
1294 if (!gfc_reference_st_label (l1
, ST_LABEL_TARGET
)
1295 || !gfc_reference_st_label (l2
, ST_LABEL_TARGET
)
1296 || !gfc_reference_st_label (l3
, ST_LABEL_TARGET
))
1298 gfc_free_expr (expr
);
1302 if (!gfc_notify_std (GFC_STD_F95_OBS
, "Arithmetic IF statement at %C"))
1305 new_st
.op
= EXEC_ARITHMETIC_IF
;
1306 new_st
.expr1
= expr
;
1315 /* The IF statement is a bit of a pain. First of all, there are three
1316 forms of it, the simple IF, the IF that starts a block and the
1319 There is a problem with the simple IF and that is the fact that we
1320 only have a single level of undo information on symbols. What this
1321 means is for a simple IF, we must re-match the whole IF statement
1322 multiple times in order to guarantee that the symbol table ends up
1323 in the proper state. */
1325 static match
match_simple_forall (void);
1326 static match
match_simple_where (void);
1329 gfc_match_if (gfc_statement
*if_type
)
1332 gfc_st_label
*l1
, *l2
, *l3
;
1333 locus old_loc
, old_loc2
;
1337 n
= gfc_match_label ();
1338 if (n
== MATCH_ERROR
)
1341 old_loc
= gfc_current_locus
;
1343 m
= gfc_match (" if ( %e", &expr
);
1347 old_loc2
= gfc_current_locus
;
1348 gfc_current_locus
= old_loc
;
1350 if (gfc_match_parens () == MATCH_ERROR
)
1353 gfc_current_locus
= old_loc2
;
1355 if (gfc_match_char (')') != MATCH_YES
)
1357 gfc_error ("Syntax error in IF-expression at %C");
1358 gfc_free_expr (expr
);
1362 m
= gfc_match (" %l , %l , %l%t", &l1
, &l2
, &l3
);
1368 gfc_error ("Block label not appropriate for arithmetic IF "
1370 gfc_free_expr (expr
);
1374 if (!gfc_reference_st_label (l1
, ST_LABEL_TARGET
)
1375 || !gfc_reference_st_label (l2
, ST_LABEL_TARGET
)
1376 || !gfc_reference_st_label (l3
, ST_LABEL_TARGET
))
1378 gfc_free_expr (expr
);
1382 if (!gfc_notify_std (GFC_STD_F95_OBS
, "Arithmetic IF statement at %C"))
1385 new_st
.op
= EXEC_ARITHMETIC_IF
;
1386 new_st
.expr1
= expr
;
1391 *if_type
= ST_ARITHMETIC_IF
;
1395 if (gfc_match (" then%t") == MATCH_YES
)
1397 new_st
.op
= EXEC_IF
;
1398 new_st
.expr1
= expr
;
1399 *if_type
= ST_IF_BLOCK
;
1405 gfc_error ("Block label is not appropriate for IF statement at %C");
1406 gfc_free_expr (expr
);
1410 /* At this point the only thing left is a simple IF statement. At
1411 this point, n has to be MATCH_NO, so we don't have to worry about
1412 re-matching a block label. From what we've got so far, try
1413 matching an assignment. */
1415 *if_type
= ST_SIMPLE_IF
;
1417 m
= gfc_match_assignment ();
1421 gfc_free_expr (expr
);
1422 gfc_undo_symbols ();
1423 gfc_current_locus
= old_loc
;
1425 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1426 assignment was found. For MATCH_NO, continue to call the various
1428 if (m
== MATCH_ERROR
)
1431 gfc_match (" if ( %e ) ", &expr
); /* Guaranteed to match. */
1433 m
= gfc_match_pointer_assignment ();
1437 gfc_free_expr (expr
);
1438 gfc_undo_symbols ();
1439 gfc_current_locus
= old_loc
;
1441 gfc_match (" if ( %e ) ", &expr
); /* Guaranteed to match. */
1443 /* Look at the next keyword to see which matcher to call. Matching
1444 the keyword doesn't affect the symbol table, so we don't have to
1445 restore between tries. */
1447 #define match(string, subr, statement) \
1448 if (gfc_match (string) == MATCH_YES) { m = subr(); goto got_match; }
1452 match ("allocate", gfc_match_allocate
, ST_ALLOCATE
)
1453 match ("assign", gfc_match_assign
, ST_LABEL_ASSIGNMENT
)
1454 match ("backspace", gfc_match_backspace
, ST_BACKSPACE
)
1455 match ("call", gfc_match_call
, ST_CALL
)
1456 match ("close", gfc_match_close
, ST_CLOSE
)
1457 match ("continue", gfc_match_continue
, ST_CONTINUE
)
1458 match ("cycle", gfc_match_cycle
, ST_CYCLE
)
1459 match ("deallocate", gfc_match_deallocate
, ST_DEALLOCATE
)
1460 match ("end file", gfc_match_endfile
, ST_END_FILE
)
1461 match ("error stop", gfc_match_error_stop
, ST_ERROR_STOP
)
1462 match ("exit", gfc_match_exit
, ST_EXIT
)
1463 match ("flush", gfc_match_flush
, ST_FLUSH
)
1464 match ("forall", match_simple_forall
, ST_FORALL
)
1465 match ("go to", gfc_match_goto
, ST_GOTO
)
1466 match ("if", match_arithmetic_if
, ST_ARITHMETIC_IF
)
1467 match ("inquire", gfc_match_inquire
, ST_INQUIRE
)
1468 match ("lock", gfc_match_lock
, ST_LOCK
)
1469 match ("nullify", gfc_match_nullify
, ST_NULLIFY
)
1470 match ("open", gfc_match_open
, ST_OPEN
)
1471 match ("pause", gfc_match_pause
, ST_NONE
)
1472 match ("print", gfc_match_print
, ST_WRITE
)
1473 match ("read", gfc_match_read
, ST_READ
)
1474 match ("return", gfc_match_return
, ST_RETURN
)
1475 match ("rewind", gfc_match_rewind
, ST_REWIND
)
1476 match ("stop", gfc_match_stop
, ST_STOP
)
1477 match ("wait", gfc_match_wait
, ST_WAIT
)
1478 match ("sync all", gfc_match_sync_all
, ST_SYNC_CALL
);
1479 match ("sync images", gfc_match_sync_images
, ST_SYNC_IMAGES
);
1480 match ("sync memory", gfc_match_sync_memory
, ST_SYNC_MEMORY
);
1481 match ("unlock", gfc_match_unlock
, ST_UNLOCK
)
1482 match ("where", match_simple_where
, ST_WHERE
)
1483 match ("write", gfc_match_write
, ST_WRITE
)
1485 /* The gfc_match_assignment() above may have returned a MATCH_NO
1486 where the assignment was to a named constant. Check that
1487 special case here. */
1488 m
= gfc_match_assignment ();
1491 gfc_error ("Cannot assign to a named constant at %C");
1492 gfc_free_expr (expr
);
1493 gfc_undo_symbols ();
1494 gfc_current_locus
= old_loc
;
1498 /* All else has failed, so give up. See if any of the matchers has
1499 stored an error message of some sort. */
1500 if (gfc_error_check () == 0)
1501 gfc_error ("Unclassifiable statement in IF-clause at %C");
1503 gfc_free_expr (expr
);
1508 gfc_error ("Syntax error in IF-clause at %C");
1511 gfc_free_expr (expr
);
1515 /* At this point, we've matched the single IF and the action clause
1516 is in new_st. Rearrange things so that the IF statement appears
1519 p
= gfc_get_code (EXEC_IF
);
1520 p
->next
= XCNEW (gfc_code
);
1522 p
->next
->loc
= gfc_current_locus
;
1526 gfc_clear_new_st ();
1528 new_st
.op
= EXEC_IF
;
1537 /* Match an ELSE statement. */
1540 gfc_match_else (void)
1542 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1544 if (gfc_match_eos () == MATCH_YES
)
1547 if (gfc_match_name (name
) != MATCH_YES
1548 || gfc_current_block () == NULL
1549 || gfc_match_eos () != MATCH_YES
)
1551 gfc_error ("Unexpected junk after ELSE statement at %C");
1555 if (strcmp (name
, gfc_current_block ()->name
) != 0)
1557 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1558 name
, gfc_current_block ()->name
);
1566 /* Match an ELSE IF statement. */
1569 gfc_match_elseif (void)
1571 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1575 m
= gfc_match (" ( %e ) then", &expr
);
1579 if (gfc_match_eos () == MATCH_YES
)
1582 if (gfc_match_name (name
) != MATCH_YES
1583 || gfc_current_block () == NULL
1584 || gfc_match_eos () != MATCH_YES
)
1586 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1590 if (strcmp (name
, gfc_current_block ()->name
) != 0)
1592 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1593 name
, gfc_current_block ()->name
);
1598 new_st
.op
= EXEC_IF
;
1599 new_st
.expr1
= expr
;
1603 gfc_free_expr (expr
);
1608 /* Free a gfc_iterator structure. */
1611 gfc_free_iterator (gfc_iterator
*iter
, int flag
)
1617 gfc_free_expr (iter
->var
);
1618 gfc_free_expr (iter
->start
);
1619 gfc_free_expr (iter
->end
);
1620 gfc_free_expr (iter
->step
);
1627 /* Match a CRITICAL statement. */
1629 gfc_match_critical (void)
1631 gfc_st_label
*label
= NULL
;
1633 if (gfc_match_label () == MATCH_ERROR
)
1636 if (gfc_match (" critical") != MATCH_YES
)
1639 if (gfc_match_st_label (&label
) == MATCH_ERROR
)
1642 if (gfc_match_eos () != MATCH_YES
)
1644 gfc_syntax_error (ST_CRITICAL
);
1648 if (gfc_pure (NULL
))
1650 gfc_error ("Image control statement CRITICAL at %C in PURE procedure");
1654 if (gfc_find_state (COMP_DO_CONCURRENT
))
1656 gfc_error ("Image control statement CRITICAL at %C in DO CONCURRENT "
1661 gfc_unset_implicit_pure (NULL
);
1663 if (!gfc_notify_std (GFC_STD_F2008
, "CRITICAL statement at %C"))
1666 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
1668 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
1672 if (gfc_find_state (COMP_CRITICAL
))
1674 gfc_error ("Nested CRITICAL block at %C");
1678 new_st
.op
= EXEC_CRITICAL
;
1681 && !gfc_reference_st_label (label
, ST_LABEL_TARGET
))
1688 /* Match a BLOCK statement. */
1691 gfc_match_block (void)
1695 if (gfc_match_label () == MATCH_ERROR
)
1698 if (gfc_match (" block") != MATCH_YES
)
1701 /* For this to be a correct BLOCK statement, the line must end now. */
1702 m
= gfc_match_eos ();
1703 if (m
== MATCH_ERROR
)
1712 /* Match an ASSOCIATE statement. */
1715 gfc_match_associate (void)
1717 if (gfc_match_label () == MATCH_ERROR
)
1720 if (gfc_match (" associate") != MATCH_YES
)
1723 /* Match the association list. */
1724 if (gfc_match_char ('(') != MATCH_YES
)
1726 gfc_error ("Expected association list at %C");
1729 new_st
.ext
.block
.assoc
= NULL
;
1732 gfc_association_list
* newAssoc
= gfc_get_association_list ();
1733 gfc_association_list
* a
;
1735 /* Match the next association. */
1736 if (gfc_match (" %n => %e", newAssoc
->name
, &newAssoc
->target
)
1739 gfc_error ("Expected association at %C");
1740 goto assocListError
;
1742 newAssoc
->where
= gfc_current_locus
;
1744 /* Check that the current name is not yet in the list. */
1745 for (a
= new_st
.ext
.block
.assoc
; a
; a
= a
->next
)
1746 if (!strcmp (a
->name
, newAssoc
->name
))
1748 gfc_error ("Duplicate name '%s' in association at %C",
1750 goto assocListError
;
1753 /* The target expression must not be coindexed. */
1754 if (gfc_is_coindexed (newAssoc
->target
))
1756 gfc_error ("Association target at %C must not be coindexed");
1757 goto assocListError
;
1760 /* The `variable' field is left blank for now; because the target is not
1761 yet resolved, we can't use gfc_has_vector_subscript to determine it
1762 for now. This is set during resolution. */
1764 /* Put it into the list. */
1765 newAssoc
->next
= new_st
.ext
.block
.assoc
;
1766 new_st
.ext
.block
.assoc
= newAssoc
;
1768 /* Try next one or end if closing parenthesis is found. */
1769 gfc_gobble_whitespace ();
1770 if (gfc_peek_char () == ')')
1772 if (gfc_match_char (',') != MATCH_YES
)
1774 gfc_error ("Expected ')' or ',' at %C");
1784 if (gfc_match_char (')') != MATCH_YES
)
1786 /* This should never happen as we peek above. */
1790 if (gfc_match_eos () != MATCH_YES
)
1792 gfc_error ("Junk after ASSOCIATE statement at %C");
1799 gfc_free_association_list (new_st
.ext
.block
.assoc
);
1804 /* Match a Fortran 2003 derived-type-spec (F03:R455), which is just the name of
1805 an accessible derived type. */
1808 match_derived_type_spec (gfc_typespec
*ts
)
1810 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1812 gfc_symbol
*derived
;
1814 old_locus
= gfc_current_locus
;
1816 if (gfc_match ("%n", name
) != MATCH_YES
)
1818 gfc_current_locus
= old_locus
;
1822 gfc_find_symbol (name
, NULL
, 1, &derived
);
1824 if (derived
&& derived
->attr
.flavor
== FL_PROCEDURE
&& derived
->attr
.generic
)
1825 derived
= gfc_find_dt_in_generic (derived
);
1827 if (derived
&& derived
->attr
.flavor
== FL_DERIVED
)
1829 ts
->type
= BT_DERIVED
;
1830 ts
->u
.derived
= derived
;
1834 gfc_current_locus
= old_locus
;
1839 /* Match a Fortran 2003 type-spec (F03:R401). This is similar to
1840 gfc_match_decl_type_spec() from decl.c, with the following exceptions:
1841 It only includes the intrinsic types from the Fortran 2003 standard
1842 (thus, neither BYTE nor forms like REAL*4 are allowed). Additionally,
1843 the implicit_flag is not needed, so it was removed. Derived types are
1844 identified by their name alone. */
1847 gfc_match_type_spec (gfc_typespec
*ts
)
1853 gfc_gobble_whitespace ();
1854 old_locus
= gfc_current_locus
;
1856 if (match_derived_type_spec (ts
) == MATCH_YES
)
1858 /* Enforce F03:C401. */
1859 if (ts
->u
.derived
->attr
.abstract
)
1861 gfc_error ("Derived type '%s' at %L may not be ABSTRACT",
1862 ts
->u
.derived
->name
, &old_locus
);
1868 if (gfc_match ("integer") == MATCH_YES
)
1870 ts
->type
= BT_INTEGER
;
1871 ts
->kind
= gfc_default_integer_kind
;
1875 if (gfc_match ("real") == MATCH_YES
)
1878 ts
->kind
= gfc_default_real_kind
;
1882 if (gfc_match ("double precision") == MATCH_YES
)
1885 ts
->kind
= gfc_default_double_kind
;
1889 if (gfc_match ("complex") == MATCH_YES
)
1891 ts
->type
= BT_COMPLEX
;
1892 ts
->kind
= gfc_default_complex_kind
;
1896 if (gfc_match ("character") == MATCH_YES
)
1898 ts
->type
= BT_CHARACTER
;
1900 m
= gfc_match_char_spec (ts
);
1908 if (gfc_match ("logical") == MATCH_YES
)
1910 ts
->type
= BT_LOGICAL
;
1911 ts
->kind
= gfc_default_logical_kind
;
1915 /* If a type is not matched, simply return MATCH_NO. */
1916 gfc_current_locus
= old_locus
;
1921 gfc_gobble_whitespace ();
1922 if (gfc_peek_ascii_char () == '*')
1924 gfc_error ("Invalid type-spec at %C");
1928 m
= gfc_match_kind_spec (ts
, false);
1931 m
= MATCH_YES
; /* No kind specifier found. */
1937 /******************** FORALL subroutines ********************/
1939 /* Free a list of FORALL iterators. */
1942 gfc_free_forall_iterator (gfc_forall_iterator
*iter
)
1944 gfc_forall_iterator
*next
;
1949 gfc_free_expr (iter
->var
);
1950 gfc_free_expr (iter
->start
);
1951 gfc_free_expr (iter
->end
);
1952 gfc_free_expr (iter
->stride
);
1959 /* Match an iterator as part of a FORALL statement. The format is:
1961 <var> = <start>:<end>[:<stride>]
1963 On MATCH_NO, the caller tests for the possibility that there is a
1964 scalar mask expression. */
1967 match_forall_iterator (gfc_forall_iterator
**result
)
1969 gfc_forall_iterator
*iter
;
1973 where
= gfc_current_locus
;
1974 iter
= XCNEW (gfc_forall_iterator
);
1976 m
= gfc_match_expr (&iter
->var
);
1980 if (gfc_match_char ('=') != MATCH_YES
1981 || iter
->var
->expr_type
!= EXPR_VARIABLE
)
1987 m
= gfc_match_expr (&iter
->start
);
1991 if (gfc_match_char (':') != MATCH_YES
)
1994 m
= gfc_match_expr (&iter
->end
);
1997 if (m
== MATCH_ERROR
)
2000 if (gfc_match_char (':') == MATCH_NO
)
2001 iter
->stride
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 1);
2004 m
= gfc_match_expr (&iter
->stride
);
2007 if (m
== MATCH_ERROR
)
2011 /* Mark the iteration variable's symbol as used as a FORALL index. */
2012 iter
->var
->symtree
->n
.sym
->forall_index
= true;
2018 gfc_error ("Syntax error in FORALL iterator at %C");
2023 gfc_current_locus
= where
;
2024 gfc_free_forall_iterator (iter
);
2029 /* Match the header of a FORALL statement. */
2032 match_forall_header (gfc_forall_iterator
**phead
, gfc_expr
**mask
)
2034 gfc_forall_iterator
*head
, *tail
, *new_iter
;
2038 gfc_gobble_whitespace ();
2043 if (gfc_match_char ('(') != MATCH_YES
)
2046 m
= match_forall_iterator (&new_iter
);
2047 if (m
== MATCH_ERROR
)
2052 head
= tail
= new_iter
;
2056 if (gfc_match_char (',') != MATCH_YES
)
2059 m
= match_forall_iterator (&new_iter
);
2060 if (m
== MATCH_ERROR
)
2065 tail
->next
= new_iter
;
2070 /* Have to have a mask expression. */
2072 m
= gfc_match_expr (&msk
);
2075 if (m
== MATCH_ERROR
)
2081 if (gfc_match_char (')') == MATCH_NO
)
2089 gfc_syntax_error (ST_FORALL
);
2092 gfc_free_expr (msk
);
2093 gfc_free_forall_iterator (head
);
2098 /* Match the rest of a simple FORALL statement that follows an
2102 match_simple_forall (void)
2104 gfc_forall_iterator
*head
;
2113 m
= match_forall_header (&head
, &mask
);
2120 m
= gfc_match_assignment ();
2122 if (m
== MATCH_ERROR
)
2126 m
= gfc_match_pointer_assignment ();
2127 if (m
== MATCH_ERROR
)
2133 c
= XCNEW (gfc_code
);
2135 c
->loc
= gfc_current_locus
;
2137 if (gfc_match_eos () != MATCH_YES
)
2140 gfc_clear_new_st ();
2141 new_st
.op
= EXEC_FORALL
;
2142 new_st
.expr1
= mask
;
2143 new_st
.ext
.forall_iterator
= head
;
2144 new_st
.block
= gfc_get_code (EXEC_FORALL
);
2145 new_st
.block
->next
= c
;
2150 gfc_syntax_error (ST_FORALL
);
2153 gfc_free_forall_iterator (head
);
2154 gfc_free_expr (mask
);
2160 /* Match a FORALL statement. */
2163 gfc_match_forall (gfc_statement
*st
)
2165 gfc_forall_iterator
*head
;
2174 m0
= gfc_match_label ();
2175 if (m0
== MATCH_ERROR
)
2178 m
= gfc_match (" forall");
2182 m
= match_forall_header (&head
, &mask
);
2183 if (m
== MATCH_ERROR
)
2188 if (gfc_match_eos () == MATCH_YES
)
2190 *st
= ST_FORALL_BLOCK
;
2191 new_st
.op
= EXEC_FORALL
;
2192 new_st
.expr1
= mask
;
2193 new_st
.ext
.forall_iterator
= head
;
2197 m
= gfc_match_assignment ();
2198 if (m
== MATCH_ERROR
)
2202 m
= gfc_match_pointer_assignment ();
2203 if (m
== MATCH_ERROR
)
2209 c
= XCNEW (gfc_code
);
2211 c
->loc
= gfc_current_locus
;
2213 gfc_clear_new_st ();
2214 new_st
.op
= EXEC_FORALL
;
2215 new_st
.expr1
= mask
;
2216 new_st
.ext
.forall_iterator
= head
;
2217 new_st
.block
= gfc_get_code (EXEC_FORALL
);
2218 new_st
.block
->next
= c
;
2224 gfc_syntax_error (ST_FORALL
);
2227 gfc_free_forall_iterator (head
);
2228 gfc_free_expr (mask
);
2229 gfc_free_statements (c
);
2234 /* Match a DO statement. */
2239 gfc_iterator iter
, *ip
;
2241 gfc_st_label
*label
;
2244 old_loc
= gfc_current_locus
;
2247 iter
.var
= iter
.start
= iter
.end
= iter
.step
= NULL
;
2249 m
= gfc_match_label ();
2250 if (m
== MATCH_ERROR
)
2253 if (gfc_match (" do") != MATCH_YES
)
2256 m
= gfc_match_st_label (&label
);
2257 if (m
== MATCH_ERROR
)
2260 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
2262 if (gfc_match_eos () == MATCH_YES
)
2264 iter
.end
= gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, true);
2265 new_st
.op
= EXEC_DO_WHILE
;
2269 /* Match an optional comma, if no comma is found, a space is obligatory. */
2270 if (gfc_match_char (',') != MATCH_YES
&& gfc_match ("% ") != MATCH_YES
)
2273 /* Check for balanced parens. */
2275 if (gfc_match_parens () == MATCH_ERROR
)
2278 if (gfc_match (" concurrent") == MATCH_YES
)
2280 gfc_forall_iterator
*head
;
2283 if (!gfc_notify_std (GFC_STD_F2008
, "DO CONCURRENT construct at %C"))
2289 m
= match_forall_header (&head
, &mask
);
2293 if (m
== MATCH_ERROR
)
2294 goto concurr_cleanup
;
2296 if (gfc_match_eos () != MATCH_YES
)
2297 goto concurr_cleanup
;
2300 && !gfc_reference_st_label (label
, ST_LABEL_DO_TARGET
))
2301 goto concurr_cleanup
;
2303 new_st
.label1
= label
;
2304 new_st
.op
= EXEC_DO_CONCURRENT
;
2305 new_st
.expr1
= mask
;
2306 new_st
.ext
.forall_iterator
= head
;
2311 gfc_syntax_error (ST_DO
);
2312 gfc_free_expr (mask
);
2313 gfc_free_forall_iterator (head
);
2317 /* See if we have a DO WHILE. */
2318 if (gfc_match (" while ( %e )%t", &iter
.end
) == MATCH_YES
)
2320 new_st
.op
= EXEC_DO_WHILE
;
2324 /* The abortive DO WHILE may have done something to the symbol
2325 table, so we start over. */
2326 gfc_undo_symbols ();
2327 gfc_current_locus
= old_loc
;
2329 gfc_match_label (); /* This won't error. */
2330 gfc_match (" do "); /* This will work. */
2332 gfc_match_st_label (&label
); /* Can't error out. */
2333 gfc_match_char (','); /* Optional comma. */
2335 m
= gfc_match_iterator (&iter
, 0);
2338 if (m
== MATCH_ERROR
)
2341 iter
.var
->symtree
->n
.sym
->attr
.implied_index
= 0;
2342 gfc_check_do_variable (iter
.var
->symtree
);
2344 if (gfc_match_eos () != MATCH_YES
)
2346 gfc_syntax_error (ST_DO
);
2350 new_st
.op
= EXEC_DO
;
2354 && !gfc_reference_st_label (label
, ST_LABEL_DO_TARGET
))
2357 new_st
.label1
= label
;
2359 if (new_st
.op
== EXEC_DO_WHILE
)
2360 new_st
.expr1
= iter
.end
;
2363 new_st
.ext
.iterator
= ip
= gfc_get_iterator ();
2370 gfc_free_iterator (&iter
, 0);
2376 /* Match an EXIT or CYCLE statement. */
2379 match_exit_cycle (gfc_statement st
, gfc_exec_op op
)
2381 gfc_state_data
*p
, *o
;
2386 if (gfc_match_eos () == MATCH_YES
)
2390 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2393 m
= gfc_match ("% %n%t", name
);
2394 if (m
== MATCH_ERROR
)
2398 gfc_syntax_error (st
);
2402 /* Find the corresponding symbol. If there's a BLOCK statement
2403 between here and the label, it is not in gfc_current_ns but a parent
2405 stree
= gfc_find_symtree_in_proc (name
, gfc_current_ns
);
2408 gfc_error ("Name '%s' in %s statement at %C is unknown",
2409 name
, gfc_ascii_statement (st
));
2414 if (sym
->attr
.flavor
!= FL_LABEL
)
2416 gfc_error ("Name '%s' in %s statement at %C is not a construct name",
2417 name
, gfc_ascii_statement (st
));
2422 /* Find the loop specified by the label (or lack of a label). */
2423 for (o
= NULL
, p
= gfc_state_stack
; p
; p
= p
->previous
)
2424 if (o
== NULL
&& p
->state
== COMP_OMP_STRUCTURED_BLOCK
)
2426 else if (p
->state
== COMP_CRITICAL
)
2428 gfc_error("%s statement at %C leaves CRITICAL construct",
2429 gfc_ascii_statement (st
));
2432 else if (p
->state
== COMP_DO_CONCURRENT
2433 && (op
== EXEC_EXIT
|| (sym
&& sym
!= p
->sym
)))
2435 /* F2008, C821 & C845. */
2436 gfc_error("%s statement at %C leaves DO CONCURRENT construct",
2437 gfc_ascii_statement (st
));
2440 else if ((sym
&& sym
== p
->sym
)
2441 || (!sym
&& (p
->state
== COMP_DO
2442 || p
->state
== COMP_DO_CONCURRENT
)))
2448 gfc_error ("%s statement at %C is not within a construct",
2449 gfc_ascii_statement (st
));
2451 gfc_error ("%s statement at %C is not within construct '%s'",
2452 gfc_ascii_statement (st
), sym
->name
);
2457 /* Special checks for EXIT from non-loop constructs. */
2461 case COMP_DO_CONCURRENT
:
2465 /* This is already handled above. */
2468 case COMP_ASSOCIATE
:
2472 case COMP_SELECT_TYPE
:
2474 if (op
== EXEC_CYCLE
)
2476 gfc_error ("CYCLE statement at %C is not applicable to non-loop"
2477 " construct '%s'", sym
->name
);
2480 gcc_assert (op
== EXEC_EXIT
);
2481 if (!gfc_notify_std (GFC_STD_F2008
, "EXIT statement with no"
2482 " do-construct-name at %C"))
2487 gfc_error ("%s statement at %C is not applicable to construct '%s'",
2488 gfc_ascii_statement (st
), sym
->name
);
2494 gfc_error ("%s statement at %C leaving OpenMP structured block",
2495 gfc_ascii_statement (st
));
2499 for (o
= p
, cnt
= 0; o
->state
== COMP_DO
&& o
->previous
!= NULL
; cnt
++)
2503 && o
->state
== COMP_OMP_STRUCTURED_BLOCK
2504 && (o
->head
->op
== EXEC_OMP_DO
2505 || o
->head
->op
== EXEC_OMP_PARALLEL_DO
2506 || o
->head
->op
== EXEC_OMP_SIMD
2507 || o
->head
->op
== EXEC_OMP_DO_SIMD
2508 || o
->head
->op
== EXEC_OMP_PARALLEL_DO_SIMD
))
2511 gcc_assert (o
->head
->next
!= NULL
2512 && (o
->head
->next
->op
== EXEC_DO
2513 || o
->head
->next
->op
== EXEC_DO_WHILE
)
2514 && o
->previous
!= NULL
2515 && o
->previous
->tail
->op
== o
->head
->op
);
2516 if (o
->previous
->tail
->ext
.omp_clauses
!= NULL
2517 && o
->previous
->tail
->ext
.omp_clauses
->collapse
> 1)
2518 collapse
= o
->previous
->tail
->ext
.omp_clauses
->collapse
;
2519 if (st
== ST_EXIT
&& cnt
<= collapse
)
2521 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
2524 if (st
== ST_CYCLE
&& cnt
< collapse
)
2526 gfc_error ("CYCLE statement at %C to non-innermost collapsed"
2532 /* Save the first statement in the construct - needed by the backend. */
2533 new_st
.ext
.which_construct
= p
->construct
;
2541 /* Match the EXIT statement. */
2544 gfc_match_exit (void)
2546 return match_exit_cycle (ST_EXIT
, EXEC_EXIT
);
2550 /* Match the CYCLE statement. */
2553 gfc_match_cycle (void)
2555 return match_exit_cycle (ST_CYCLE
, EXEC_CYCLE
);
2559 /* Match a number or character constant after an (ALL) STOP or PAUSE statement. */
2562 gfc_match_stopcode (gfc_statement st
)
2569 if (gfc_match_eos () != MATCH_YES
)
2571 m
= gfc_match_init_expr (&e
);
2572 if (m
== MATCH_ERROR
)
2577 if (gfc_match_eos () != MATCH_YES
)
2581 if (gfc_pure (NULL
))
2583 gfc_error ("%s statement not allowed in PURE procedure at %C",
2584 gfc_ascii_statement (st
));
2588 gfc_unset_implicit_pure (NULL
);
2590 if (st
== ST_STOP
&& gfc_find_state (COMP_CRITICAL
))
2592 gfc_error ("Image control statement STOP at %C in CRITICAL block");
2595 if (st
== ST_STOP
&& gfc_find_state (COMP_DO_CONCURRENT
))
2597 gfc_error ("Image control statement STOP at %C in DO CONCURRENT block");
2603 if (!(e
->ts
.type
== BT_CHARACTER
|| e
->ts
.type
== BT_INTEGER
))
2605 gfc_error ("STOP code at %L must be either INTEGER or CHARACTER type",
2612 gfc_error ("STOP code at %L must be scalar",
2617 if (e
->ts
.type
== BT_CHARACTER
2618 && e
->ts
.kind
!= gfc_default_character_kind
)
2620 gfc_error ("STOP code at %L must be default character KIND=%d",
2621 &e
->where
, (int) gfc_default_character_kind
);
2625 if (e
->ts
.type
== BT_INTEGER
2626 && e
->ts
.kind
!= gfc_default_integer_kind
)
2628 gfc_error ("STOP code at %L must be default integer KIND=%d",
2629 &e
->where
, (int) gfc_default_integer_kind
);
2637 new_st
.op
= EXEC_STOP
;
2640 new_st
.op
= EXEC_ERROR_STOP
;
2643 new_st
.op
= EXEC_PAUSE
;
2650 new_st
.ext
.stop_code
= -1;
2655 gfc_syntax_error (st
);
2664 /* Match the (deprecated) PAUSE statement. */
2667 gfc_match_pause (void)
2671 m
= gfc_match_stopcode (ST_PAUSE
);
2674 if (!gfc_notify_std (GFC_STD_F95_DEL
, "PAUSE statement at %C"))
2681 /* Match the STOP statement. */
2684 gfc_match_stop (void)
2686 return gfc_match_stopcode (ST_STOP
);
2690 /* Match the ERROR STOP statement. */
2693 gfc_match_error_stop (void)
2695 if (!gfc_notify_std (GFC_STD_F2008
, "ERROR STOP statement at %C"))
2698 return gfc_match_stopcode (ST_ERROR_STOP
);
2702 /* Match LOCK/UNLOCK statement. Syntax:
2703 LOCK ( lock-variable [ , lock-stat-list ] )
2704 UNLOCK ( lock-variable [ , sync-stat-list ] )
2705 where lock-stat is ACQUIRED_LOCK or sync-stat
2706 and sync-stat is STAT= or ERRMSG=. */
2709 lock_unlock_statement (gfc_statement st
)
2712 gfc_expr
*tmp
, *lockvar
, *acq_lock
, *stat
, *errmsg
;
2713 bool saw_acq_lock
, saw_stat
, saw_errmsg
;
2715 tmp
= lockvar
= acq_lock
= stat
= errmsg
= NULL
;
2716 saw_acq_lock
= saw_stat
= saw_errmsg
= false;
2718 if (gfc_pure (NULL
))
2720 gfc_error ("Image control statement %s at %C in PURE procedure",
2721 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2725 gfc_unset_implicit_pure (NULL
);
2727 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
2729 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
2733 if (gfc_find_state (COMP_CRITICAL
))
2735 gfc_error ("Image control statement %s at %C in CRITICAL block",
2736 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2740 if (gfc_find_state (COMP_DO_CONCURRENT
))
2742 gfc_error ("Image control statement %s at %C in DO CONCURRENT block",
2743 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2747 if (gfc_match_char ('(') != MATCH_YES
)
2750 if (gfc_match ("%e", &lockvar
) != MATCH_YES
)
2752 m
= gfc_match_char (',');
2753 if (m
== MATCH_ERROR
)
2757 m
= gfc_match_char (')');
2765 m
= gfc_match (" stat = %v", &tmp
);
2766 if (m
== MATCH_ERROR
)
2772 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
2778 m
= gfc_match_char (',');
2786 m
= gfc_match (" errmsg = %v", &tmp
);
2787 if (m
== MATCH_ERROR
)
2793 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
2799 m
= gfc_match_char (',');
2807 m
= gfc_match (" acquired_lock = %v", &tmp
);
2808 if (m
== MATCH_ERROR
|| st
== ST_UNLOCK
)
2814 gfc_error ("Redundant ACQUIRED_LOCK tag found at %L ",
2819 saw_acq_lock
= true;
2821 m
= gfc_match_char (',');
2832 if (m
== MATCH_ERROR
)
2835 if (gfc_match (" )%t") != MATCH_YES
)
2842 new_st
.op
= EXEC_LOCK
;
2845 new_st
.op
= EXEC_UNLOCK
;
2851 new_st
.expr1
= lockvar
;
2852 new_st
.expr2
= stat
;
2853 new_st
.expr3
= errmsg
;
2854 new_st
.expr4
= acq_lock
;
2859 gfc_syntax_error (st
);
2862 if (acq_lock
!= tmp
)
2863 gfc_free_expr (acq_lock
);
2865 gfc_free_expr (errmsg
);
2867 gfc_free_expr (stat
);
2869 gfc_free_expr (tmp
);
2870 gfc_free_expr (lockvar
);
2877 gfc_match_lock (void)
2879 if (!gfc_notify_std (GFC_STD_F2008
, "LOCK statement at %C"))
2882 return lock_unlock_statement (ST_LOCK
);
2887 gfc_match_unlock (void)
2889 if (!gfc_notify_std (GFC_STD_F2008
, "UNLOCK statement at %C"))
2892 return lock_unlock_statement (ST_UNLOCK
);
2896 /* Match SYNC ALL/IMAGES/MEMORY statement. Syntax:
2897 SYNC ALL [(sync-stat-list)]
2898 SYNC MEMORY [(sync-stat-list)]
2899 SYNC IMAGES (image-set [, sync-stat-list] )
2900 with sync-stat is int-expr or *. */
2903 sync_statement (gfc_statement st
)
2906 gfc_expr
*tmp
, *imageset
, *stat
, *errmsg
;
2907 bool saw_stat
, saw_errmsg
;
2909 tmp
= imageset
= stat
= errmsg
= NULL
;
2910 saw_stat
= saw_errmsg
= false;
2912 if (gfc_pure (NULL
))
2914 gfc_error ("Image control statement SYNC at %C in PURE procedure");
2918 gfc_unset_implicit_pure (NULL
);
2920 if (!gfc_notify_std (GFC_STD_F2008
, "SYNC statement at %C"))
2923 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
2925 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
2929 if (gfc_find_state (COMP_CRITICAL
))
2931 gfc_error ("Image control statement SYNC at %C in CRITICAL block");
2935 if (gfc_find_state (COMP_DO_CONCURRENT
))
2937 gfc_error ("Image control statement SYNC at %C in DO CONCURRENT block");
2941 if (gfc_match_eos () == MATCH_YES
)
2943 if (st
== ST_SYNC_IMAGES
)
2948 if (gfc_match_char ('(') != MATCH_YES
)
2951 if (st
== ST_SYNC_IMAGES
)
2953 /* Denote '*' as imageset == NULL. */
2954 m
= gfc_match_char ('*');
2955 if (m
== MATCH_ERROR
)
2959 if (gfc_match ("%e", &imageset
) != MATCH_YES
)
2962 m
= gfc_match_char (',');
2963 if (m
== MATCH_ERROR
)
2967 m
= gfc_match_char (')');
2976 m
= gfc_match (" stat = %v", &tmp
);
2977 if (m
== MATCH_ERROR
)
2983 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
2989 if (gfc_match_char (',') == MATCH_YES
)
2996 m
= gfc_match (" errmsg = %v", &tmp
);
2997 if (m
== MATCH_ERROR
)
3003 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3009 if (gfc_match_char (',') == MATCH_YES
)
3019 if (gfc_match (" )%t") != MATCH_YES
)
3026 new_st
.op
= EXEC_SYNC_ALL
;
3028 case ST_SYNC_IMAGES
:
3029 new_st
.op
= EXEC_SYNC_IMAGES
;
3031 case ST_SYNC_MEMORY
:
3032 new_st
.op
= EXEC_SYNC_MEMORY
;
3038 new_st
.expr1
= imageset
;
3039 new_st
.expr2
= stat
;
3040 new_st
.expr3
= errmsg
;
3045 gfc_syntax_error (st
);
3049 gfc_free_expr (stat
);
3051 gfc_free_expr (errmsg
);
3053 gfc_free_expr (tmp
);
3054 gfc_free_expr (imageset
);
3060 /* Match SYNC ALL statement. */
3063 gfc_match_sync_all (void)
3065 return sync_statement (ST_SYNC_ALL
);
3069 /* Match SYNC IMAGES statement. */
3072 gfc_match_sync_images (void)
3074 return sync_statement (ST_SYNC_IMAGES
);
3078 /* Match SYNC MEMORY statement. */
3081 gfc_match_sync_memory (void)
3083 return sync_statement (ST_SYNC_MEMORY
);
3087 /* Match a CONTINUE statement. */
3090 gfc_match_continue (void)
3092 if (gfc_match_eos () != MATCH_YES
)
3094 gfc_syntax_error (ST_CONTINUE
);
3098 new_st
.op
= EXEC_CONTINUE
;
3103 /* Match the (deprecated) ASSIGN statement. */
3106 gfc_match_assign (void)
3109 gfc_st_label
*label
;
3111 if (gfc_match (" %l", &label
) == MATCH_YES
)
3113 if (!gfc_reference_st_label (label
, ST_LABEL_UNKNOWN
))
3115 if (gfc_match (" to %v%t", &expr
) == MATCH_YES
)
3117 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGN statement at %C"))
3120 expr
->symtree
->n
.sym
->attr
.assign
= 1;
3122 new_st
.op
= EXEC_LABEL_ASSIGN
;
3123 new_st
.label1
= label
;
3124 new_st
.expr1
= expr
;
3132 /* Match the GO TO statement. As a computed GOTO statement is
3133 matched, it is transformed into an equivalent SELECT block. No
3134 tree is necessary, and the resulting jumps-to-jumps are
3135 specifically optimized away by the back end. */
3138 gfc_match_goto (void)
3140 gfc_code
*head
, *tail
;
3143 gfc_st_label
*label
;
3147 if (gfc_match (" %l%t", &label
) == MATCH_YES
)
3149 if (!gfc_reference_st_label (label
, ST_LABEL_TARGET
))
3152 new_st
.op
= EXEC_GOTO
;
3153 new_st
.label1
= label
;
3157 /* The assigned GO TO statement. */
3159 if (gfc_match_variable (&expr
, 0) == MATCH_YES
)
3161 if (!gfc_notify_std (GFC_STD_F95_DEL
, "Assigned GOTO statement at %C"))
3164 new_st
.op
= EXEC_GOTO
;
3165 new_st
.expr1
= expr
;
3167 if (gfc_match_eos () == MATCH_YES
)
3170 /* Match label list. */
3171 gfc_match_char (',');
3172 if (gfc_match_char ('(') != MATCH_YES
)
3174 gfc_syntax_error (ST_GOTO
);
3181 m
= gfc_match_st_label (&label
);
3185 if (!gfc_reference_st_label (label
, ST_LABEL_TARGET
))
3189 head
= tail
= gfc_get_code (EXEC_GOTO
);
3192 tail
->block
= gfc_get_code (EXEC_GOTO
);
3196 tail
->label1
= label
;
3198 while (gfc_match_char (',') == MATCH_YES
);
3200 if (gfc_match (")%t") != MATCH_YES
)
3205 gfc_error ("Statement label list in GOTO at %C cannot be empty");
3208 new_st
.block
= head
;
3213 /* Last chance is a computed GO TO statement. */
3214 if (gfc_match_char ('(') != MATCH_YES
)
3216 gfc_syntax_error (ST_GOTO
);
3225 m
= gfc_match_st_label (&label
);
3229 if (!gfc_reference_st_label (label
, ST_LABEL_TARGET
))
3233 head
= tail
= gfc_get_code (EXEC_SELECT
);
3236 tail
->block
= gfc_get_code (EXEC_SELECT
);
3240 cp
= gfc_get_case ();
3241 cp
->low
= cp
->high
= gfc_get_int_expr (gfc_default_integer_kind
,
3244 tail
->ext
.block
.case_list
= cp
;
3246 tail
->next
= gfc_get_code (EXEC_GOTO
);
3247 tail
->next
->label1
= label
;
3249 while (gfc_match_char (',') == MATCH_YES
);
3251 if (gfc_match_char (')') != MATCH_YES
)
3256 gfc_error ("Statement label list in GOTO at %C cannot be empty");
3260 /* Get the rest of the statement. */
3261 gfc_match_char (',');
3263 if (gfc_match (" %e%t", &expr
) != MATCH_YES
)
3266 if (!gfc_notify_std (GFC_STD_F95_OBS
, "Computed GOTO at %C"))
3269 /* At this point, a computed GOTO has been fully matched and an
3270 equivalent SELECT statement constructed. */
3272 new_st
.op
= EXEC_SELECT
;
3273 new_st
.expr1
= NULL
;
3275 /* Hack: For a "real" SELECT, the expression is in expr. We put
3276 it in expr2 so we can distinguish then and produce the correct
3278 new_st
.expr2
= expr
;
3279 new_st
.block
= head
;
3283 gfc_syntax_error (ST_GOTO
);
3285 gfc_free_statements (head
);
3290 /* Frees a list of gfc_alloc structures. */
3293 gfc_free_alloc_list (gfc_alloc
*p
)
3300 gfc_free_expr (p
->expr
);
3306 /* Match an ALLOCATE statement. */
3309 gfc_match_allocate (void)
3311 gfc_alloc
*head
, *tail
;
3312 gfc_expr
*stat
, *errmsg
, *tmp
, *source
, *mold
;
3316 locus old_locus
, deferred_locus
;
3317 bool saw_stat
, saw_errmsg
, saw_source
, saw_mold
, saw_deferred
, b1
, b2
, b3
;
3318 bool saw_unlimited
= false;
3321 stat
= errmsg
= source
= mold
= tmp
= NULL
;
3322 saw_stat
= saw_errmsg
= saw_source
= saw_mold
= saw_deferred
= false;
3324 if (gfc_match_char ('(') != MATCH_YES
)
3327 /* Match an optional type-spec. */
3328 old_locus
= gfc_current_locus
;
3329 m
= gfc_match_type_spec (&ts
);
3330 if (m
== MATCH_ERROR
)
3332 else if (m
== MATCH_NO
)
3334 char name
[GFC_MAX_SYMBOL_LEN
+ 3];
3336 if (gfc_match ("%n :: ", name
) == MATCH_YES
)
3338 gfc_error ("Error in type-spec at %L", &old_locus
);
3342 ts
.type
= BT_UNKNOWN
;
3346 if (gfc_match (" :: ") == MATCH_YES
)
3348 if (!gfc_notify_std (GFC_STD_F2003
, "typespec in ALLOCATE at %L",
3354 gfc_error ("Type-spec at %L cannot contain a deferred "
3355 "type parameter", &old_locus
);
3359 if (ts
.type
== BT_CHARACTER
)
3360 ts
.u
.cl
->length_from_typespec
= true;
3364 ts
.type
= BT_UNKNOWN
;
3365 gfc_current_locus
= old_locus
;
3372 head
= tail
= gfc_get_alloc ();
3375 tail
->next
= gfc_get_alloc ();
3379 m
= gfc_match_variable (&tail
->expr
, 0);
3382 if (m
== MATCH_ERROR
)
3385 if (gfc_check_do_variable (tail
->expr
->symtree
))
3388 bool impure
= gfc_impure_variable (tail
->expr
->symtree
->n
.sym
);
3389 if (impure
&& gfc_pure (NULL
))
3391 gfc_error ("Bad allocate-object at %C for a PURE procedure");
3396 gfc_unset_implicit_pure (NULL
);
3398 if (tail
->expr
->ts
.deferred
)
3400 saw_deferred
= true;
3401 deferred_locus
= tail
->expr
->where
;
3404 if (gfc_find_state (COMP_DO_CONCURRENT
)
3405 || gfc_find_state (COMP_CRITICAL
))
3408 bool coarray
= tail
->expr
->symtree
->n
.sym
->attr
.codimension
;
3409 for (ref
= tail
->expr
->ref
; ref
; ref
= ref
->next
)
3410 if (ref
->type
== REF_COMPONENT
)
3411 coarray
= ref
->u
.c
.component
->attr
.codimension
;
3413 if (coarray
&& gfc_find_state (COMP_DO_CONCURRENT
))
3415 gfc_error ("ALLOCATE of coarray at %C in DO CONCURRENT block");
3418 if (coarray
&& gfc_find_state (COMP_CRITICAL
))
3420 gfc_error ("ALLOCATE of coarray at %C in CRITICAL block");
3425 /* Check for F08:C628. */
3426 sym
= tail
->expr
->symtree
->n
.sym
;
3427 b1
= !(tail
->expr
->ref
3428 && (tail
->expr
->ref
->type
== REF_COMPONENT
3429 || tail
->expr
->ref
->type
== REF_ARRAY
));
3430 if (sym
&& sym
->ts
.type
== BT_CLASS
&& sym
->attr
.class_ok
)
3431 b2
= !(CLASS_DATA (sym
)->attr
.allocatable
3432 || CLASS_DATA (sym
)->attr
.class_pointer
);
3434 b2
= sym
&& !(sym
->attr
.allocatable
|| sym
->attr
.pointer
3435 || sym
->attr
.proc_pointer
);
3436 b3
= sym
&& sym
->ns
&& sym
->ns
->proc_name
3437 && (sym
->ns
->proc_name
->attr
.allocatable
3438 || sym
->ns
->proc_name
->attr
.pointer
3439 || sym
->ns
->proc_name
->attr
.proc_pointer
);
3440 if (b1
&& b2
&& !b3
)
3442 gfc_error ("Allocate-object at %L is neither a data pointer "
3443 "nor an allocatable variable", &tail
->expr
->where
);
3447 /* The ALLOCATE statement had an optional typespec. Check the
3449 if (ts
.type
!= BT_UNKNOWN
)
3451 /* Enforce F03:C624. */
3452 if (!gfc_type_compatible (&tail
->expr
->ts
, &ts
))
3454 gfc_error ("Type of entity at %L is type incompatible with "
3455 "typespec", &tail
->expr
->where
);
3459 /* Enforce F03:C627. */
3460 if (ts
.kind
!= tail
->expr
->ts
.kind
&& !UNLIMITED_POLY (tail
->expr
))
3462 gfc_error ("Kind type parameter for entity at %L differs from "
3463 "the kind type parameter of the typespec",
3464 &tail
->expr
->where
);
3469 if (tail
->expr
->ts
.type
== BT_DERIVED
)
3470 tail
->expr
->ts
.u
.derived
= gfc_use_derived (tail
->expr
->ts
.u
.derived
);
3472 saw_unlimited
= saw_unlimited
| UNLIMITED_POLY (tail
->expr
);
3474 if (gfc_peek_ascii_char () == '(' && !sym
->attr
.dimension
)
3476 gfc_error ("Shape specification for allocatable scalar at %C");
3480 if (gfc_match_char (',') != MATCH_YES
)
3485 m
= gfc_match (" stat = %v", &tmp
);
3486 if (m
== MATCH_ERROR
)
3493 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
3501 if (gfc_check_do_variable (stat
->symtree
))
3504 if (gfc_match_char (',') == MATCH_YES
)
3505 goto alloc_opt_list
;
3508 m
= gfc_match (" errmsg = %v", &tmp
);
3509 if (m
== MATCH_ERROR
)
3513 if (!gfc_notify_std (GFC_STD_F2003
, "ERRMSG tag at %L", &tmp
->where
))
3519 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3527 if (gfc_match_char (',') == MATCH_YES
)
3528 goto alloc_opt_list
;
3531 m
= gfc_match (" source = %e", &tmp
);
3532 if (m
== MATCH_ERROR
)
3536 if (!gfc_notify_std (GFC_STD_F2003
, "SOURCE tag at %L", &tmp
->where
))
3542 gfc_error ("Redundant SOURCE tag found at %L ", &tmp
->where
);
3546 /* The next 2 conditionals check C631. */
3547 if (ts
.type
!= BT_UNKNOWN
)
3549 gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
3550 &tmp
->where
, &old_locus
);
3555 && !gfc_notify_std (GFC_STD_F2008
, "SOURCE tag at %L"
3556 " with more than a single allocate object",
3564 if (gfc_match_char (',') == MATCH_YES
)
3565 goto alloc_opt_list
;
3568 m
= gfc_match (" mold = %e", &tmp
);
3569 if (m
== MATCH_ERROR
)
3573 if (!gfc_notify_std (GFC_STD_F2008
, "MOLD tag at %L", &tmp
->where
))
3576 /* Check F08:C636. */
3579 gfc_error ("Redundant MOLD tag found at %L ", &tmp
->where
);
3583 /* Check F08:C637. */
3584 if (ts
.type
!= BT_UNKNOWN
)
3586 gfc_error ("MOLD tag at %L conflicts with the typespec at %L",
3587 &tmp
->where
, &old_locus
);
3596 if (gfc_match_char (',') == MATCH_YES
)
3597 goto alloc_opt_list
;
3600 gfc_gobble_whitespace ();
3602 if (gfc_peek_char () == ')')
3606 if (gfc_match (" )%t") != MATCH_YES
)
3609 /* Check F08:C637. */
3612 gfc_error ("MOLD tag at %L conflicts with SOURCE tag at %L",
3613 &mold
->where
, &source
->where
);
3617 /* Check F03:C623, */
3618 if (saw_deferred
&& ts
.type
== BT_UNKNOWN
&& !source
&& !mold
)
3620 gfc_error ("Allocate-object at %L with a deferred type parameter "
3621 "requires either a type-spec or SOURCE tag or a MOLD tag",
3626 /* Check F03:C625, */
3627 if (saw_unlimited
&& ts
.type
== BT_UNKNOWN
&& !source
&& !mold
)
3629 for (tail
= head
; tail
; tail
= tail
->next
)
3631 if (UNLIMITED_POLY (tail
->expr
))
3632 gfc_error ("Unlimited polymorphic allocate-object at %L "
3633 "requires either a type-spec or SOURCE tag "
3634 "or a MOLD tag", &tail
->expr
->where
);
3639 new_st
.op
= EXEC_ALLOCATE
;
3640 new_st
.expr1
= stat
;
3641 new_st
.expr2
= errmsg
;
3643 new_st
.expr3
= source
;
3645 new_st
.expr3
= mold
;
3646 new_st
.ext
.alloc
.list
= head
;
3647 new_st
.ext
.alloc
.ts
= ts
;
3652 gfc_syntax_error (ST_ALLOCATE
);
3655 gfc_free_expr (errmsg
);
3656 gfc_free_expr (source
);
3657 gfc_free_expr (stat
);
3658 gfc_free_expr (mold
);
3659 if (tmp
&& tmp
->expr_type
) gfc_free_expr (tmp
);
3660 gfc_free_alloc_list (head
);
3665 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
3666 a set of pointer assignments to intrinsic NULL(). */
3669 gfc_match_nullify (void)
3677 if (gfc_match_char ('(') != MATCH_YES
)
3682 m
= gfc_match_variable (&p
, 0);
3683 if (m
== MATCH_ERROR
)
3688 if (gfc_check_do_variable (p
->symtree
))
3692 if (gfc_is_coindexed (p
))
3694 gfc_error ("Pointer object at %C shall not be coindexed");
3698 /* build ' => NULL() '. */
3699 e
= gfc_get_null_expr (&gfc_current_locus
);
3701 /* Chain to list. */
3705 tail
->op
= EXEC_POINTER_ASSIGN
;
3709 tail
->next
= gfc_get_code (EXEC_POINTER_ASSIGN
);
3716 if (gfc_match (" )%t") == MATCH_YES
)
3718 if (gfc_match_char (',') != MATCH_YES
)
3725 gfc_syntax_error (ST_NULLIFY
);
3728 gfc_free_statements (new_st
.next
);
3730 gfc_free_expr (new_st
.expr1
);
3731 new_st
.expr1
= NULL
;
3732 gfc_free_expr (new_st
.expr2
);
3733 new_st
.expr2
= NULL
;
3738 /* Match a DEALLOCATE statement. */
3741 gfc_match_deallocate (void)
3743 gfc_alloc
*head
, *tail
;
3744 gfc_expr
*stat
, *errmsg
, *tmp
;
3747 bool saw_stat
, saw_errmsg
, b1
, b2
;
3750 stat
= errmsg
= tmp
= NULL
;
3751 saw_stat
= saw_errmsg
= false;
3753 if (gfc_match_char ('(') != MATCH_YES
)
3759 head
= tail
= gfc_get_alloc ();
3762 tail
->next
= gfc_get_alloc ();
3766 m
= gfc_match_variable (&tail
->expr
, 0);
3767 if (m
== MATCH_ERROR
)
3772 if (gfc_check_do_variable (tail
->expr
->symtree
))
3775 sym
= tail
->expr
->symtree
->n
.sym
;
3777 bool impure
= gfc_impure_variable (sym
);
3778 if (impure
&& gfc_pure (NULL
))
3780 gfc_error ("Illegal allocate-object at %C for a PURE procedure");
3785 gfc_unset_implicit_pure (NULL
);
3787 if (gfc_is_coarray (tail
->expr
)
3788 && gfc_find_state (COMP_DO_CONCURRENT
))
3790 gfc_error ("DEALLOCATE of coarray at %C in DO CONCURRENT block");
3794 if (gfc_is_coarray (tail
->expr
)
3795 && gfc_find_state (COMP_CRITICAL
))
3797 gfc_error ("DEALLOCATE of coarray at %C in CRITICAL block");
3801 /* FIXME: disable the checking on derived types. */
3802 b1
= !(tail
->expr
->ref
3803 && (tail
->expr
->ref
->type
== REF_COMPONENT
3804 || tail
->expr
->ref
->type
== REF_ARRAY
));
3805 if (sym
&& sym
->ts
.type
== BT_CLASS
)
3806 b2
= !(CLASS_DATA (sym
)->attr
.allocatable
3807 || CLASS_DATA (sym
)->attr
.class_pointer
);
3809 b2
= sym
&& !(sym
->attr
.allocatable
|| sym
->attr
.pointer
3810 || sym
->attr
.proc_pointer
);
3813 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
3814 "nor an allocatable variable");
3818 if (gfc_match_char (',') != MATCH_YES
)
3823 m
= gfc_match (" stat = %v", &tmp
);
3824 if (m
== MATCH_ERROR
)
3830 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
3831 gfc_free_expr (tmp
);
3838 if (gfc_check_do_variable (stat
->symtree
))
3841 if (gfc_match_char (',') == MATCH_YES
)
3842 goto dealloc_opt_list
;
3845 m
= gfc_match (" errmsg = %v", &tmp
);
3846 if (m
== MATCH_ERROR
)
3850 if (!gfc_notify_std (GFC_STD_F2003
, "ERRMSG at %L", &tmp
->where
))
3855 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3856 gfc_free_expr (tmp
);
3863 if (gfc_match_char (',') == MATCH_YES
)
3864 goto dealloc_opt_list
;
3867 gfc_gobble_whitespace ();
3869 if (gfc_peek_char () == ')')
3873 if (gfc_match (" )%t") != MATCH_YES
)
3876 new_st
.op
= EXEC_DEALLOCATE
;
3877 new_st
.expr1
= stat
;
3878 new_st
.expr2
= errmsg
;
3879 new_st
.ext
.alloc
.list
= head
;
3884 gfc_syntax_error (ST_DEALLOCATE
);
3887 gfc_free_expr (errmsg
);
3888 gfc_free_expr (stat
);
3889 gfc_free_alloc_list (head
);
3894 /* Match a RETURN statement. */
3897 gfc_match_return (void)
3901 gfc_compile_state s
;
3905 if (gfc_find_state (COMP_CRITICAL
))
3907 gfc_error ("Image control statement RETURN at %C in CRITICAL block");
3911 if (gfc_find_state (COMP_DO_CONCURRENT
))
3913 gfc_error ("Image control statement RETURN at %C in DO CONCURRENT block");
3917 if (gfc_match_eos () == MATCH_YES
)
3920 if (!gfc_find_state (COMP_SUBROUTINE
))
3922 gfc_error ("Alternate RETURN statement at %C is only allowed within "
3927 if (gfc_current_form
== FORM_FREE
)
3929 /* The following are valid, so we can't require a blank after the
3933 char c
= gfc_peek_ascii_char ();
3934 if (ISALPHA (c
) || ISDIGIT (c
))
3938 m
= gfc_match (" %e%t", &e
);
3941 if (m
== MATCH_ERROR
)
3944 gfc_syntax_error (ST_RETURN
);
3951 gfc_enclosing_unit (&s
);
3952 if (s
== COMP_PROGRAM
3953 && !gfc_notify_std (GFC_STD_GNU
, "RETURN statement in "
3954 "main program at %C"))
3957 new_st
.op
= EXEC_RETURN
;
3964 /* Match the call of a type-bound procedure, if CALL%var has already been
3965 matched and var found to be a derived-type variable. */
3968 match_typebound_call (gfc_symtree
* varst
)
3973 base
= gfc_get_expr ();
3974 base
->expr_type
= EXPR_VARIABLE
;
3975 base
->symtree
= varst
;
3976 base
->where
= gfc_current_locus
;
3977 gfc_set_sym_referenced (varst
->n
.sym
);
3979 m
= gfc_match_varspec (base
, 0, true, true);
3981 gfc_error ("Expected component reference at %C");
3984 gfc_free_expr (base
);
3988 if (gfc_match_eos () != MATCH_YES
)
3990 gfc_error ("Junk after CALL at %C");
3991 gfc_free_expr (base
);
3995 if (base
->expr_type
== EXPR_COMPCALL
)
3996 new_st
.op
= EXEC_COMPCALL
;
3997 else if (base
->expr_type
== EXPR_PPC
)
3998 new_st
.op
= EXEC_CALL_PPC
;
4001 gfc_error ("Expected type-bound procedure or procedure pointer component "
4003 gfc_free_expr (base
);
4006 new_st
.expr1
= base
;
4012 /* Match a CALL statement. The tricky part here are possible
4013 alternate return specifiers. We handle these by having all
4014 "subroutines" actually return an integer via a register that gives
4015 the return number. If the call specifies alternate returns, we
4016 generate code for a SELECT statement whose case clauses contain
4017 GOTOs to the various labels. */
4020 gfc_match_call (void)
4022 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4023 gfc_actual_arglist
*a
, *arglist
;
4033 m
= gfc_match ("% %n", name
);
4039 if (gfc_get_ha_sym_tree (name
, &st
))
4044 /* If this is a variable of derived-type, it probably starts a type-bound
4046 if ((sym
->attr
.flavor
!= FL_PROCEDURE
4047 || gfc_is_function_return_value (sym
, gfc_current_ns
))
4048 && (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
))
4049 return match_typebound_call (st
);
4051 /* If it does not seem to be callable (include functions so that the
4052 right association is made. They are thrown out in resolution.)
4054 if (!sym
->attr
.generic
4055 && !sym
->attr
.subroutine
4056 && !sym
->attr
.function
)
4058 if (!(sym
->attr
.external
&& !sym
->attr
.referenced
))
4060 /* ...create a symbol in this scope... */
4061 if (sym
->ns
!= gfc_current_ns
4062 && gfc_get_sym_tree (name
, NULL
, &st
, false) == 1)
4065 if (sym
!= st
->n
.sym
)
4069 /* ...and then to try to make the symbol into a subroutine. */
4070 if (!gfc_add_subroutine (&sym
->attr
, sym
->name
, NULL
))
4074 gfc_set_sym_referenced (sym
);
4076 if (gfc_match_eos () != MATCH_YES
)
4078 m
= gfc_match_actual_arglist (1, &arglist
);
4081 if (m
== MATCH_ERROR
)
4084 if (gfc_match_eos () != MATCH_YES
)
4088 /* If any alternate return labels were found, construct a SELECT
4089 statement that will jump to the right place. */
4092 for (a
= arglist
; a
; a
= a
->next
)
4093 if (a
->expr
== NULL
)
4101 gfc_symtree
*select_st
;
4102 gfc_symbol
*select_sym
;
4103 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4105 new_st
.next
= c
= gfc_get_code (EXEC_SELECT
);
4106 sprintf (name
, "_result_%s", sym
->name
);
4107 gfc_get_ha_sym_tree (name
, &select_st
); /* Can't fail. */
4109 select_sym
= select_st
->n
.sym
;
4110 select_sym
->ts
.type
= BT_INTEGER
;
4111 select_sym
->ts
.kind
= gfc_default_integer_kind
;
4112 gfc_set_sym_referenced (select_sym
);
4113 c
->expr1
= gfc_get_expr ();
4114 c
->expr1
->expr_type
= EXPR_VARIABLE
;
4115 c
->expr1
->symtree
= select_st
;
4116 c
->expr1
->ts
= select_sym
->ts
;
4117 c
->expr1
->where
= gfc_current_locus
;
4120 for (a
= arglist
; a
; a
= a
->next
)
4122 if (a
->expr
!= NULL
)
4125 if (!gfc_reference_st_label (a
->label
, ST_LABEL_TARGET
))
4130 c
->block
= gfc_get_code (EXEC_SELECT
);
4133 new_case
= gfc_get_case ();
4134 new_case
->high
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, i
);
4135 new_case
->low
= new_case
->high
;
4136 c
->ext
.block
.case_list
= new_case
;
4138 c
->next
= gfc_get_code (EXEC_GOTO
);
4139 c
->next
->label1
= a
->label
;
4143 new_st
.op
= EXEC_CALL
;
4144 new_st
.symtree
= st
;
4145 new_st
.ext
.actual
= arglist
;
4150 gfc_syntax_error (ST_CALL
);
4153 gfc_free_actual_arglist (arglist
);
4158 /* Given a name, return a pointer to the common head structure,
4159 creating it if it does not exist. If FROM_MODULE is nonzero, we
4160 mangle the name so that it doesn't interfere with commons defined
4161 in the using namespace.
4162 TODO: Add to global symbol tree. */
4165 gfc_get_common (const char *name
, int from_module
)
4168 static int serial
= 0;
4169 char mangled_name
[GFC_MAX_SYMBOL_LEN
+ 1];
4173 /* A use associated common block is only needed to correctly layout
4174 the variables it contains. */
4175 snprintf (mangled_name
, GFC_MAX_SYMBOL_LEN
, "_%d_%s", serial
++, name
);
4176 st
= gfc_new_symtree (&gfc_current_ns
->common_root
, mangled_name
);
4180 st
= gfc_find_symtree (gfc_current_ns
->common_root
, name
);
4183 st
= gfc_new_symtree (&gfc_current_ns
->common_root
, name
);
4186 if (st
->n
.common
== NULL
)
4188 st
->n
.common
= gfc_get_common_head ();
4189 st
->n
.common
->where
= gfc_current_locus
;
4190 strcpy (st
->n
.common
->name
, name
);
4193 return st
->n
.common
;
4197 /* Match a common block name. */
4199 match
match_common_name (char *name
)
4203 if (gfc_match_char ('/') == MATCH_NO
)
4209 if (gfc_match_char ('/') == MATCH_YES
)
4215 m
= gfc_match_name (name
);
4217 if (m
== MATCH_ERROR
)
4219 if (m
== MATCH_YES
&& gfc_match_char ('/') == MATCH_YES
)
4222 gfc_error ("Syntax error in common block name at %C");
4227 /* Match a COMMON statement. */
4230 gfc_match_common (void)
4232 gfc_symbol
*sym
, **head
, *tail
, *other
, *old_blank_common
;
4233 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4239 old_blank_common
= gfc_current_ns
->blank_common
.head
;
4240 if (old_blank_common
)
4242 while (old_blank_common
->common_next
)
4243 old_blank_common
= old_blank_common
->common_next
;
4250 m
= match_common_name (name
);
4251 if (m
== MATCH_ERROR
)
4254 if (name
[0] == '\0')
4256 t
= &gfc_current_ns
->blank_common
;
4257 if (t
->head
== NULL
)
4258 t
->where
= gfc_current_locus
;
4262 t
= gfc_get_common (name
, 0);
4271 while (tail
->common_next
)
4272 tail
= tail
->common_next
;
4275 /* Grab the list of symbols. */
4278 m
= gfc_match_symbol (&sym
, 0);
4279 if (m
== MATCH_ERROR
)
4284 /* Store a ref to the common block for error checking. */
4285 sym
->common_block
= t
;
4286 sym
->common_block
->refs
++;
4288 /* See if we know the current common block is bind(c), and if
4289 so, then see if we can check if the symbol is (which it'll
4290 need to be). This can happen if the bind(c) attr stmt was
4291 applied to the common block, and the variable(s) already
4292 defined, before declaring the common block. */
4293 if (t
->is_bind_c
== 1)
4295 if (sym
->ts
.type
!= BT_UNKNOWN
&& sym
->ts
.is_c_interop
!= 1)
4297 /* If we find an error, just print it and continue,
4298 cause it's just semantic, and we can see if there
4300 gfc_error_now ("Variable '%s' at %L in common block '%s' "
4301 "at %C must be declared with a C "
4302 "interoperable kind since common block "
4304 sym
->name
, &(sym
->declared_at
), t
->name
,
4308 if (sym
->attr
.is_bind_c
== 1)
4309 gfc_error_now ("Variable '%s' in common block "
4310 "'%s' at %C can not be bind(c) since "
4311 "it is not global", sym
->name
, t
->name
);
4314 if (sym
->attr
.in_common
)
4316 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
4321 if (((sym
->value
!= NULL
&& sym
->value
->expr_type
!= EXPR_NULL
)
4322 || sym
->attr
.data
) && gfc_current_state () != COMP_BLOCK_DATA
)
4324 if (!gfc_notify_std (GFC_STD_GNU
, "Initialized symbol '%s' at "
4325 "%C can only be COMMON in BLOCK DATA",
4330 if (!gfc_add_in_common (&sym
->attr
, sym
->name
, NULL
))
4334 tail
->common_next
= sym
;
4340 /* Deal with an optional array specification after the
4342 m
= gfc_match_array_spec (&as
, true, true);
4343 if (m
== MATCH_ERROR
)
4348 if (as
->type
!= AS_EXPLICIT
)
4350 gfc_error ("Array specification for symbol '%s' in COMMON "
4351 "at %C must be explicit", sym
->name
);
4355 if (!gfc_add_dimension (&sym
->attr
, sym
->name
, NULL
))
4358 if (sym
->attr
.pointer
)
4360 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
4361 "POINTER array", sym
->name
);
4370 sym
->common_head
= t
;
4372 /* Check to see if the symbol is already in an equivalence group.
4373 If it is, set the other members as being in common. */
4374 if (sym
->attr
.in_equivalence
)
4376 for (e1
= gfc_current_ns
->equiv
; e1
; e1
= e1
->next
)
4378 for (e2
= e1
; e2
; e2
= e2
->eq
)
4379 if (e2
->expr
->symtree
->n
.sym
== sym
)
4386 for (e2
= e1
; e2
; e2
= e2
->eq
)
4388 other
= e2
->expr
->symtree
->n
.sym
;
4389 if (other
->common_head
4390 && other
->common_head
!= sym
->common_head
)
4392 gfc_error ("Symbol '%s', in COMMON block '%s' at "
4393 "%C is being indirectly equivalenced to "
4394 "another COMMON block '%s'",
4395 sym
->name
, sym
->common_head
->name
,
4396 other
->common_head
->name
);
4399 other
->attr
.in_common
= 1;
4400 other
->common_head
= t
;
4406 gfc_gobble_whitespace ();
4407 if (gfc_match_eos () == MATCH_YES
)
4409 if (gfc_peek_ascii_char () == '/')
4411 if (gfc_match_char (',') != MATCH_YES
)
4413 gfc_gobble_whitespace ();
4414 if (gfc_peek_ascii_char () == '/')
4423 gfc_syntax_error (ST_COMMON
);
4426 gfc_free_array_spec (as
);
4431 /* Match a BLOCK DATA program unit. */
4434 gfc_match_block_data (void)
4436 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4440 if (gfc_match_eos () == MATCH_YES
)
4442 gfc_new_block
= NULL
;
4446 m
= gfc_match ("% %n%t", name
);
4450 if (gfc_get_symbol (name
, NULL
, &sym
))
4453 if (!gfc_add_flavor (&sym
->attr
, FL_BLOCK_DATA
, sym
->name
, NULL
))
4456 gfc_new_block
= sym
;
4462 /* Free a namelist structure. */
4465 gfc_free_namelist (gfc_namelist
*name
)
4469 for (; name
; name
= n
)
4477 /* Free an OpenMP namelist structure. */
4480 gfc_free_omp_namelist (gfc_omp_namelist
*name
)
4482 gfc_omp_namelist
*n
;
4484 for (; name
; name
= n
)
4486 gfc_free_expr (name
->expr
);
4489 if (name
->udr
->combiner
)
4490 gfc_free_statement (name
->udr
->combiner
);
4491 if (name
->udr
->initializer
)
4492 gfc_free_statement (name
->udr
->initializer
);
4501 /* Match a NAMELIST statement. */
4504 gfc_match_namelist (void)
4506 gfc_symbol
*group_name
, *sym
;
4510 m
= gfc_match (" / %s /", &group_name
);
4513 if (m
== MATCH_ERROR
)
4518 if (group_name
->ts
.type
!= BT_UNKNOWN
)
4520 gfc_error ("Namelist group name '%s' at %C already has a basic "
4521 "type of %s", group_name
->name
,
4522 gfc_typename (&group_name
->ts
));
4526 if (group_name
->attr
.flavor
== FL_NAMELIST
4527 && group_name
->attr
.use_assoc
4528 && !gfc_notify_std (GFC_STD_GNU
, "Namelist group name '%s' "
4529 "at %C already is USE associated and can"
4530 "not be respecified.", group_name
->name
))
4533 if (group_name
->attr
.flavor
!= FL_NAMELIST
4534 && !gfc_add_flavor (&group_name
->attr
, FL_NAMELIST
,
4535 group_name
->name
, NULL
))
4540 m
= gfc_match_symbol (&sym
, 1);
4543 if (m
== MATCH_ERROR
)
4546 if (sym
->attr
.in_namelist
== 0
4547 && !gfc_add_in_namelist (&sym
->attr
, sym
->name
, NULL
))
4550 /* Use gfc_error_check here, rather than goto error, so that
4551 these are the only errors for the next two lines. */
4552 if (sym
->as
&& sym
->as
->type
== AS_ASSUMED_SIZE
)
4554 gfc_error ("Assumed size array '%s' in namelist '%s' at "
4555 "%C is not allowed", sym
->name
, group_name
->name
);
4559 nl
= gfc_get_namelist ();
4563 if (group_name
->namelist
== NULL
)
4564 group_name
->namelist
= group_name
->namelist_tail
= nl
;
4567 group_name
->namelist_tail
->next
= nl
;
4568 group_name
->namelist_tail
= nl
;
4571 if (gfc_match_eos () == MATCH_YES
)
4574 m
= gfc_match_char (',');
4576 if (gfc_match_char ('/') == MATCH_YES
)
4578 m2
= gfc_match (" %s /", &group_name
);
4579 if (m2
== MATCH_YES
)
4581 if (m2
== MATCH_ERROR
)
4595 gfc_syntax_error (ST_NAMELIST
);
4602 /* Match a MODULE statement. */
4605 gfc_match_module (void)
4609 m
= gfc_match (" %s%t", &gfc_new_block
);
4613 if (!gfc_add_flavor (&gfc_new_block
->attr
, FL_MODULE
,
4614 gfc_new_block
->name
, NULL
))
4621 /* Free equivalence sets and lists. Recursively is the easiest way to
4625 gfc_free_equiv_until (gfc_equiv
*eq
, gfc_equiv
*stop
)
4630 gfc_free_equiv (eq
->eq
);
4631 gfc_free_equiv_until (eq
->next
, stop
);
4632 gfc_free_expr (eq
->expr
);
4638 gfc_free_equiv (gfc_equiv
*eq
)
4640 gfc_free_equiv_until (eq
, NULL
);
4644 /* Match an EQUIVALENCE statement. */
4647 gfc_match_equivalence (void)
4649 gfc_equiv
*eq
, *set
, *tail
;
4653 gfc_common_head
*common_head
= NULL
;
4661 eq
= gfc_get_equiv ();
4665 eq
->next
= gfc_current_ns
->equiv
;
4666 gfc_current_ns
->equiv
= eq
;
4668 if (gfc_match_char ('(') != MATCH_YES
)
4672 common_flag
= FALSE
;
4677 m
= gfc_match_equiv_variable (&set
->expr
);
4678 if (m
== MATCH_ERROR
)
4683 /* count the number of objects. */
4686 if (gfc_match_char ('%') == MATCH_YES
)
4688 gfc_error ("Derived type component %C is not a "
4689 "permitted EQUIVALENCE member");
4693 for (ref
= set
->expr
->ref
; ref
; ref
= ref
->next
)
4694 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.type
== AR_SECTION
)
4696 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
4697 "be an array section");
4701 sym
= set
->expr
->symtree
->n
.sym
;
4703 if (!gfc_add_in_equivalence (&sym
->attr
, sym
->name
, NULL
))
4706 if (sym
->attr
.in_common
)
4709 common_head
= sym
->common_head
;
4712 if (gfc_match_char (')') == MATCH_YES
)
4715 if (gfc_match_char (',') != MATCH_YES
)
4718 set
->eq
= gfc_get_equiv ();
4724 gfc_error ("EQUIVALENCE at %C requires two or more objects");
4728 /* If one of the members of an equivalence is in common, then
4729 mark them all as being in common. Before doing this, check
4730 that members of the equivalence group are not in different
4733 for (set
= eq
; set
; set
= set
->eq
)
4735 sym
= set
->expr
->symtree
->n
.sym
;
4736 if (sym
->common_head
&& sym
->common_head
!= common_head
)
4738 gfc_error ("Attempt to indirectly overlap COMMON "
4739 "blocks %s and %s by EQUIVALENCE at %C",
4740 sym
->common_head
->name
, common_head
->name
);
4743 sym
->attr
.in_common
= 1;
4744 sym
->common_head
= common_head
;
4747 if (gfc_match_eos () == MATCH_YES
)
4749 if (gfc_match_char (',') != MATCH_YES
)
4751 gfc_error ("Expecting a comma in EQUIVALENCE at %C");
4759 gfc_syntax_error (ST_EQUIVALENCE
);
4765 gfc_free_equiv (gfc_current_ns
->equiv
);
4766 gfc_current_ns
->equiv
= eq
;
4772 /* Check that a statement function is not recursive. This is done by looking
4773 for the statement function symbol(sym) by looking recursively through its
4774 expression(e). If a reference to sym is found, true is returned.
4775 12.5.4 requires that any variable of function that is implicitly typed
4776 shall have that type confirmed by any subsequent type declaration. The
4777 implicit typing is conveniently done here. */
4779 recursive_stmt_fcn (gfc_expr
*, gfc_symbol
*);
4782 check_stmt_fcn (gfc_expr
*e
, gfc_symbol
*sym
, int *f ATTRIBUTE_UNUSED
)
4788 switch (e
->expr_type
)
4791 if (e
->symtree
== NULL
)
4794 /* Check the name before testing for nested recursion! */
4795 if (sym
->name
== e
->symtree
->n
.sym
->name
)
4798 /* Catch recursion via other statement functions. */
4799 if (e
->symtree
->n
.sym
->attr
.proc
== PROC_ST_FUNCTION
4800 && e
->symtree
->n
.sym
->value
4801 && recursive_stmt_fcn (e
->symtree
->n
.sym
->value
, sym
))
4804 if (e
->symtree
->n
.sym
->ts
.type
== BT_UNKNOWN
)
4805 gfc_set_default_type (e
->symtree
->n
.sym
, 0, NULL
);
4810 if (e
->symtree
&& sym
->name
== e
->symtree
->n
.sym
->name
)
4813 if (e
->symtree
->n
.sym
->ts
.type
== BT_UNKNOWN
)
4814 gfc_set_default_type (e
->symtree
->n
.sym
, 0, NULL
);
4826 recursive_stmt_fcn (gfc_expr
*e
, gfc_symbol
*sym
)
4828 return gfc_traverse_expr (e
, sym
, check_stmt_fcn
, 0);
4832 /* Match a statement function declaration. It is so easy to match
4833 non-statement function statements with a MATCH_ERROR as opposed to
4834 MATCH_NO that we suppress error message in most cases. */
4837 gfc_match_st_function (void)
4839 gfc_error_buf old_error
;
4844 m
= gfc_match_symbol (&sym
, 0);
4848 gfc_push_error (&old_error
);
4850 if (!gfc_add_procedure (&sym
->attr
, PROC_ST_FUNCTION
, sym
->name
, NULL
))
4853 if (gfc_match_formal_arglist (sym
, 1, 0) != MATCH_YES
)
4856 m
= gfc_match (" = %e%t", &expr
);
4860 gfc_free_error (&old_error
);
4861 if (m
== MATCH_ERROR
)
4864 if (recursive_stmt_fcn (expr
, sym
))
4866 gfc_error ("Statement function at %L is recursive", &expr
->where
);
4872 if (!gfc_notify_std (GFC_STD_F95_OBS
, "Statement function at %C"))
4878 gfc_pop_error (&old_error
);
4883 /***************** SELECT CASE subroutines ******************/
4885 /* Free a single case structure. */
4888 free_case (gfc_case
*p
)
4890 if (p
->low
== p
->high
)
4892 gfc_free_expr (p
->low
);
4893 gfc_free_expr (p
->high
);
4898 /* Free a list of case structures. */
4901 gfc_free_case_list (gfc_case
*p
)
4913 /* Match a single case selector. */
4916 match_case_selector (gfc_case
**cp
)
4921 c
= gfc_get_case ();
4922 c
->where
= gfc_current_locus
;
4924 if (gfc_match_char (':') == MATCH_YES
)
4926 m
= gfc_match_init_expr (&c
->high
);
4929 if (m
== MATCH_ERROR
)
4934 m
= gfc_match_init_expr (&c
->low
);
4935 if (m
== MATCH_ERROR
)
4940 /* If we're not looking at a ':' now, make a range out of a single
4941 target. Else get the upper bound for the case range. */
4942 if (gfc_match_char (':') != MATCH_YES
)
4946 m
= gfc_match_init_expr (&c
->high
);
4947 if (m
== MATCH_ERROR
)
4949 /* MATCH_NO is fine. It's OK if nothing is there! */
4957 gfc_error ("Expected initialization expression in CASE at %C");
4965 /* Match the end of a case statement. */
4968 match_case_eos (void)
4970 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4973 if (gfc_match_eos () == MATCH_YES
)
4976 /* If the case construct doesn't have a case-construct-name, we
4977 should have matched the EOS. */
4978 if (!gfc_current_block ())
4981 gfc_gobble_whitespace ();
4983 m
= gfc_match_name (name
);
4987 if (strcmp (name
, gfc_current_block ()->name
) != 0)
4989 gfc_error ("Expected block name '%s' of SELECT construct at %C",
4990 gfc_current_block ()->name
);
4994 return gfc_match_eos ();
4998 /* Match a SELECT statement. */
5001 gfc_match_select (void)
5006 m
= gfc_match_label ();
5007 if (m
== MATCH_ERROR
)
5010 m
= gfc_match (" select case ( %e )%t", &expr
);
5014 new_st
.op
= EXEC_SELECT
;
5015 new_st
.expr1
= expr
;
5021 /* Transfer the selector typespec to the associate name. */
5024 copy_ts_from_selector_to_associate (gfc_expr
*associate
, gfc_expr
*selector
)
5027 gfc_symbol
*assoc_sym
;
5029 assoc_sym
= associate
->symtree
->n
.sym
;
5031 /* At this stage the expression rank and arrayspec dimensions have
5032 not been completely sorted out. We must get the expr2->rank
5033 right here, so that the correct class container is obtained. */
5034 ref
= selector
->ref
;
5035 while (ref
&& ref
->next
)
5038 if (selector
->ts
.type
== BT_CLASS
&& CLASS_DATA (selector
)->as
5039 && ref
&& ref
->type
== REF_ARRAY
)
5041 /* Ensure that the array reference type is set. We cannot use
5042 gfc_resolve_expr at this point, so the usable parts of
5043 resolve.c(resolve_array_ref) are employed to do it. */
5044 if (ref
->u
.ar
.type
== AR_UNKNOWN
)
5046 ref
->u
.ar
.type
= AR_ELEMENT
;
5047 for (int i
= 0; i
< ref
->u
.ar
.dimen
+ ref
->u
.ar
.codimen
; i
++)
5048 if (ref
->u
.ar
.dimen_type
[i
] == DIMEN_RANGE
5049 || ref
->u
.ar
.dimen_type
[i
] == DIMEN_VECTOR
5050 || (ref
->u
.ar
.dimen_type
[i
] == DIMEN_UNKNOWN
5051 && ref
->u
.ar
.start
[i
] && ref
->u
.ar
.start
[i
]->rank
))
5053 ref
->u
.ar
.type
= AR_SECTION
;
5058 if (ref
->u
.ar
.type
== AR_FULL
)
5059 selector
->rank
= CLASS_DATA (selector
)->as
->rank
;
5060 else if (ref
->u
.ar
.type
== AR_SECTION
)
5061 selector
->rank
= ref
->u
.ar
.dimen
;
5068 assoc_sym
->attr
.dimension
= 1;
5069 assoc_sym
->as
= gfc_get_array_spec ();
5070 assoc_sym
->as
->rank
= selector
->rank
;
5071 assoc_sym
->as
->type
= AS_DEFERRED
;
5074 assoc_sym
->as
= NULL
;
5076 if (selector
->ts
.type
== BT_CLASS
)
5078 /* The correct class container has to be available. */
5079 assoc_sym
->ts
.type
= BT_CLASS
;
5080 assoc_sym
->ts
.u
.derived
= CLASS_DATA (selector
)->ts
.u
.derived
;
5081 assoc_sym
->attr
.pointer
= 1;
5082 gfc_build_class_symbol (&assoc_sym
->ts
, &assoc_sym
->attr
, &assoc_sym
->as
);
5087 /* Push the current selector onto the SELECT TYPE stack. */
5090 select_type_push (gfc_symbol
*sel
)
5092 gfc_select_type_stack
*top
= gfc_get_select_type_stack ();
5093 top
->selector
= sel
;
5095 top
->prev
= select_type_stack
;
5097 select_type_stack
= top
;
5101 /* Set the temporary for the current intrinsic SELECT TYPE selector. */
5103 static gfc_symtree
*
5104 select_intrinsic_set_tmp (gfc_typespec
*ts
)
5106 char name
[GFC_MAX_SYMBOL_LEN
];
5110 if (ts
->type
== BT_CLASS
|| ts
->type
== BT_DERIVED
)
5113 if (select_type_stack
->selector
->ts
.type
== BT_CLASS
5114 && !select_type_stack
->selector
->attr
.class_ok
)
5117 if (ts
->type
== BT_CHARACTER
&& ts
->u
.cl
&& ts
->u
.cl
->length
5118 && ts
->u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
5119 charlen
= mpz_get_si (ts
->u
.cl
->length
->value
.integer
);
5121 if (ts
->type
!= BT_CHARACTER
)
5122 sprintf (name
, "__tmp_%s_%d", gfc_basic_typename (ts
->type
),
5125 sprintf (name
, "__tmp_%s_%d_%d", gfc_basic_typename (ts
->type
),
5128 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp
, false);
5129 gfc_add_type (tmp
->n
.sym
, ts
, NULL
);
5131 /* Copy across the array spec to the selector. */
5132 if (select_type_stack
->selector
->ts
.type
== BT_CLASS
5133 && (CLASS_DATA (select_type_stack
->selector
)->attr
.dimension
5134 || CLASS_DATA (select_type_stack
->selector
)->attr
.codimension
))
5136 tmp
->n
.sym
->attr
.pointer
= 1;
5137 tmp
->n
.sym
->attr
.dimension
5138 = CLASS_DATA (select_type_stack
->selector
)->attr
.dimension
;
5139 tmp
->n
.sym
->attr
.codimension
5140 = CLASS_DATA (select_type_stack
->selector
)->attr
.codimension
;
5142 = gfc_copy_array_spec (CLASS_DATA (select_type_stack
->selector
)->as
);
5145 gfc_set_sym_referenced (tmp
->n
.sym
);
5146 gfc_add_flavor (&tmp
->n
.sym
->attr
, FL_VARIABLE
, name
, NULL
);
5147 tmp
->n
.sym
->attr
.select_type_temporary
= 1;
5153 /* Set up a temporary for the current TYPE IS / CLASS IS branch . */
5156 select_type_set_tmp (gfc_typespec
*ts
)
5158 char name
[GFC_MAX_SYMBOL_LEN
];
5159 gfc_symtree
*tmp
= NULL
;
5163 select_type_stack
->tmp
= NULL
;
5167 tmp
= select_intrinsic_set_tmp (ts
);
5174 if (ts
->type
== BT_CLASS
)
5175 sprintf (name
, "__tmp_class_%s", ts
->u
.derived
->name
);
5177 sprintf (name
, "__tmp_type_%s", ts
->u
.derived
->name
);
5178 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp
, false);
5179 gfc_add_type (tmp
->n
.sym
, ts
, NULL
);
5181 if (select_type_stack
->selector
->ts
.type
== BT_CLASS
5182 && select_type_stack
->selector
->attr
.class_ok
)
5184 tmp
->n
.sym
->attr
.pointer
5185 = CLASS_DATA (select_type_stack
->selector
)->attr
.class_pointer
;
5187 /* Copy across the array spec to the selector. */
5188 if (CLASS_DATA (select_type_stack
->selector
)->attr
.dimension
5189 || CLASS_DATA (select_type_stack
->selector
)->attr
.codimension
)
5191 tmp
->n
.sym
->attr
.dimension
5192 = CLASS_DATA (select_type_stack
->selector
)->attr
.dimension
;
5193 tmp
->n
.sym
->attr
.codimension
5194 = CLASS_DATA (select_type_stack
->selector
)->attr
.codimension
;
5196 = gfc_copy_array_spec (CLASS_DATA (select_type_stack
->selector
)->as
);
5200 gfc_set_sym_referenced (tmp
->n
.sym
);
5201 gfc_add_flavor (&tmp
->n
.sym
->attr
, FL_VARIABLE
, name
, NULL
);
5202 tmp
->n
.sym
->attr
.select_type_temporary
= 1;
5204 if (ts
->type
== BT_CLASS
)
5205 gfc_build_class_symbol (&tmp
->n
.sym
->ts
, &tmp
->n
.sym
->attr
,
5209 /* Add an association for it, so the rest of the parser knows it is
5210 an associate-name. The target will be set during resolution. */
5211 tmp
->n
.sym
->assoc
= gfc_get_association_list ();
5212 tmp
->n
.sym
->assoc
->dangling
= 1;
5213 tmp
->n
.sym
->assoc
->st
= tmp
;
5215 select_type_stack
->tmp
= tmp
;
5219 /* Match a SELECT TYPE statement. */
5222 gfc_match_select_type (void)
5224 gfc_expr
*expr1
, *expr2
= NULL
;
5226 char name
[GFC_MAX_SYMBOL_LEN
];
5230 m
= gfc_match_label ();
5231 if (m
== MATCH_ERROR
)
5234 m
= gfc_match (" select type ( ");
5238 m
= gfc_match (" %n => %e", name
, &expr2
);
5241 expr1
= gfc_get_expr();
5242 expr1
->expr_type
= EXPR_VARIABLE
;
5243 if (gfc_get_sym_tree (name
, NULL
, &expr1
->symtree
, false))
5249 sym
= expr1
->symtree
->n
.sym
;
5250 if (expr2
->ts
.type
== BT_UNKNOWN
)
5251 sym
->attr
.untyped
= 1;
5253 copy_ts_from_selector_to_associate (expr1
, expr2
);
5255 sym
->attr
.flavor
= FL_VARIABLE
;
5256 sym
->attr
.referenced
= 1;
5257 sym
->attr
.class_ok
= 1;
5261 m
= gfc_match (" %e ", &expr1
);
5266 m
= gfc_match (" )%t");
5269 gfc_error ("parse error in SELECT TYPE statement at %C");
5273 /* This ghastly expression seems to be needed to distinguish a CLASS
5274 array, which can have a reference, from other expressions that
5275 have references, such as derived type components, and are not
5276 allowed by the standard.
5277 TODO: see if it is sufficient to exclude component and substring
5279 class_array
= expr1
->expr_type
== EXPR_VARIABLE
5280 && expr1
->ts
.type
== BT_CLASS
5281 && CLASS_DATA (expr1
)
5282 && (strcmp (CLASS_DATA (expr1
)->name
, "_data") == 0)
5283 && (CLASS_DATA (expr1
)->attr
.dimension
5284 || CLASS_DATA (expr1
)->attr
.codimension
)
5286 && expr1
->ref
->type
== REF_ARRAY
5287 && expr1
->ref
->next
== NULL
;
5289 /* Check for F03:C811. */
5290 if (!expr2
&& (expr1
->expr_type
!= EXPR_VARIABLE
5291 || (!class_array
&& expr1
->ref
!= NULL
)))
5293 gfc_error ("Selector in SELECT TYPE at %C is not a named variable; "
5294 "use associate-name=>");
5299 new_st
.op
= EXEC_SELECT_TYPE
;
5300 new_st
.expr1
= expr1
;
5301 new_st
.expr2
= expr2
;
5302 new_st
.ext
.block
.ns
= gfc_current_ns
;
5304 select_type_push (expr1
->symtree
->n
.sym
);
5309 gfc_free_expr (expr1
);
5310 gfc_free_expr (expr2
);
5315 /* Match a CASE statement. */
5318 gfc_match_case (void)
5320 gfc_case
*c
, *head
, *tail
;
5325 if (gfc_current_state () != COMP_SELECT
)
5327 gfc_error ("Unexpected CASE statement at %C");
5331 if (gfc_match ("% default") == MATCH_YES
)
5333 m
= match_case_eos ();
5336 if (m
== MATCH_ERROR
)
5339 new_st
.op
= EXEC_SELECT
;
5340 c
= gfc_get_case ();
5341 c
->where
= gfc_current_locus
;
5342 new_st
.ext
.block
.case_list
= c
;
5346 if (gfc_match_char ('(') != MATCH_YES
)
5351 if (match_case_selector (&c
) == MATCH_ERROR
)
5361 if (gfc_match_char (')') == MATCH_YES
)
5363 if (gfc_match_char (',') != MATCH_YES
)
5367 m
= match_case_eos ();
5370 if (m
== MATCH_ERROR
)
5373 new_st
.op
= EXEC_SELECT
;
5374 new_st
.ext
.block
.case_list
= head
;
5379 gfc_error ("Syntax error in CASE specification at %C");
5382 gfc_free_case_list (head
); /* new_st is cleaned up in parse.c. */
5387 /* Match a TYPE IS statement. */
5390 gfc_match_type_is (void)
5395 if (gfc_current_state () != COMP_SELECT_TYPE
)
5397 gfc_error ("Unexpected TYPE IS statement at %C");
5401 if (gfc_match_char ('(') != MATCH_YES
)
5404 c
= gfc_get_case ();
5405 c
->where
= gfc_current_locus
;
5407 if (gfc_match_type_spec (&c
->ts
) == MATCH_ERROR
)
5410 if (gfc_match_char (')') != MATCH_YES
)
5413 m
= match_case_eos ();
5416 if (m
== MATCH_ERROR
)
5419 new_st
.op
= EXEC_SELECT_TYPE
;
5420 new_st
.ext
.block
.case_list
= c
;
5422 if (c
->ts
.type
== BT_DERIVED
&& c
->ts
.u
.derived
5423 && (c
->ts
.u
.derived
->attr
.sequence
5424 || c
->ts
.u
.derived
->attr
.is_bind_c
))
5426 gfc_error ("The type-spec shall not specify a sequence derived "
5427 "type or a type with the BIND attribute in SELECT "
5428 "TYPE at %C [F2003:C815]");
5432 /* Create temporary variable. */
5433 select_type_set_tmp (&c
->ts
);
5438 gfc_error ("Syntax error in TYPE IS specification at %C");
5442 gfc_free_case_list (c
); /* new_st is cleaned up in parse.c. */
5447 /* Match a CLASS IS or CLASS DEFAULT statement. */
5450 gfc_match_class_is (void)
5455 if (gfc_current_state () != COMP_SELECT_TYPE
)
5458 if (gfc_match ("% default") == MATCH_YES
)
5460 m
= match_case_eos ();
5463 if (m
== MATCH_ERROR
)
5466 new_st
.op
= EXEC_SELECT_TYPE
;
5467 c
= gfc_get_case ();
5468 c
->where
= gfc_current_locus
;
5469 c
->ts
.type
= BT_UNKNOWN
;
5470 new_st
.ext
.block
.case_list
= c
;
5471 select_type_set_tmp (NULL
);
5475 m
= gfc_match ("% is");
5478 if (m
== MATCH_ERROR
)
5481 if (gfc_match_char ('(') != MATCH_YES
)
5484 c
= gfc_get_case ();
5485 c
->where
= gfc_current_locus
;
5487 if (match_derived_type_spec (&c
->ts
) == MATCH_ERROR
)
5490 if (c
->ts
.type
== BT_DERIVED
)
5491 c
->ts
.type
= BT_CLASS
;
5493 if (gfc_match_char (')') != MATCH_YES
)
5496 m
= match_case_eos ();
5499 if (m
== MATCH_ERROR
)
5502 new_st
.op
= EXEC_SELECT_TYPE
;
5503 new_st
.ext
.block
.case_list
= c
;
5505 /* Create temporary variable. */
5506 select_type_set_tmp (&c
->ts
);
5511 gfc_error ("Syntax error in CLASS IS specification at %C");
5515 gfc_free_case_list (c
); /* new_st is cleaned up in parse.c. */
5520 /********************* WHERE subroutines ********************/
5522 /* Match the rest of a simple WHERE statement that follows an IF statement.
5526 match_simple_where (void)
5532 m
= gfc_match (" ( %e )", &expr
);
5536 m
= gfc_match_assignment ();
5539 if (m
== MATCH_ERROR
)
5542 if (gfc_match_eos () != MATCH_YES
)
5545 c
= gfc_get_code (EXEC_WHERE
);
5548 c
->next
= XCNEW (gfc_code
);
5550 gfc_clear_new_st ();
5552 new_st
.op
= EXEC_WHERE
;
5558 gfc_syntax_error (ST_WHERE
);
5561 gfc_free_expr (expr
);
5566 /* Match a WHERE statement. */
5569 gfc_match_where (gfc_statement
*st
)
5575 m0
= gfc_match_label ();
5576 if (m0
== MATCH_ERROR
)
5579 m
= gfc_match (" where ( %e )", &expr
);
5583 if (gfc_match_eos () == MATCH_YES
)
5585 *st
= ST_WHERE_BLOCK
;
5586 new_st
.op
= EXEC_WHERE
;
5587 new_st
.expr1
= expr
;
5591 m
= gfc_match_assignment ();
5593 gfc_syntax_error (ST_WHERE
);
5597 gfc_free_expr (expr
);
5601 /* We've got a simple WHERE statement. */
5603 c
= gfc_get_code (EXEC_WHERE
);
5606 c
->next
= XCNEW (gfc_code
);
5608 gfc_clear_new_st ();
5610 new_st
.op
= EXEC_WHERE
;
5617 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
5618 new_st if successful. */
5621 gfc_match_elsewhere (void)
5623 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
5627 if (gfc_current_state () != COMP_WHERE
)
5629 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
5635 if (gfc_match_char ('(') == MATCH_YES
)
5637 m
= gfc_match_expr (&expr
);
5640 if (m
== MATCH_ERROR
)
5643 if (gfc_match_char (')') != MATCH_YES
)
5647 if (gfc_match_eos () != MATCH_YES
)
5649 /* Only makes sense if we have a where-construct-name. */
5650 if (!gfc_current_block ())
5655 /* Better be a name at this point. */
5656 m
= gfc_match_name (name
);
5659 if (m
== MATCH_ERROR
)
5662 if (gfc_match_eos () != MATCH_YES
)
5665 if (strcmp (name
, gfc_current_block ()->name
) != 0)
5667 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
5668 name
, gfc_current_block ()->name
);
5673 new_st
.op
= EXEC_WHERE
;
5674 new_st
.expr1
= expr
;
5678 gfc_syntax_error (ST_ELSEWHERE
);
5681 gfc_free_expr (expr
);