1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 2010 Free Software Foundation, Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
30 int gfc_matching_ptr_assignment = 0;
31 int gfc_matching_procptr_assignment = 0;
32 bool gfc_matching_prefix = false;
34 /* Stack of SELECT TYPE statements. */
35 gfc_select_type_stack *select_type_stack = NULL;
37 /* For debugging and diagnostic purposes. Return the textual representation
38 of the intrinsic operator OP. */
40 gfc_op2string (gfc_intrinsic_op op)
48 case INTRINSIC_UMINUS:
54 case INTRINSIC_CONCAT:
58 case INTRINSIC_DIVIDE:
97 case INTRINSIC_ASSIGN:
100 case INTRINSIC_PARENTHESES:
107 gfc_internal_error ("gfc_op2string(): Bad code");
112 /******************** Generic matching subroutines ************************/
114 /* This function scans the current statement counting the opened and closed
115 parenthesis to make sure they are balanced. */
118 gfc_match_parens (void)
120 locus old_loc, where;
124 old_loc = gfc_current_locus;
131 c = gfc_next_char_literal (instring);
134 if (quote == ' ' && ((c == '\'') || (c == '"')))
140 if (quote != ' ' && c == quote)
147 if (c == '(' && quote == ' ')
150 where = gfc_current_locus;
152 if (c == ')' && quote == ' ')
155 where = gfc_current_locus;
159 gfc_current_locus = old_loc;
163 gfc_error ("Missing ')' in statement at or before %L", &where);
168 gfc_error ("Missing '(' in statement at or before %L", &where);
176 /* See if the next character is a special character that has
177 escaped by a \ via the -fbackslash option. */
180 gfc_match_special_char (gfc_char_t *res)
188 switch ((c = gfc_next_char_literal (1)))
221 /* Hexadecimal form of wide characters. */
222 len = (c == 'x' ? 2 : (c == 'u' ? 4 : 8));
224 for (i = 0; i < len; i++)
226 char buf[2] = { '\0', '\0' };
228 c = gfc_next_char_literal (1);
229 if (!gfc_wide_fits_in_byte (c)
230 || !gfc_check_digit ((unsigned char) c, 16))
233 buf[0] = (unsigned char) c;
235 n += strtol (buf, NULL, 16);
241 /* Unknown backslash codes are simply not expanded. */
250 /* In free form, match at least one space. Always matches in fixed
254 gfc_match_space (void)
259 if (gfc_current_form == FORM_FIXED)
262 old_loc = gfc_current_locus;
264 c = gfc_next_ascii_char ();
265 if (!gfc_is_whitespace (c))
267 gfc_current_locus = old_loc;
271 gfc_gobble_whitespace ();
277 /* Match an end of statement. End of statement is optional
278 whitespace, followed by a ';' or '\n' or comment '!'. If a
279 semicolon is found, we continue to eat whitespace and semicolons. */
292 old_loc = gfc_current_locus;
293 gfc_gobble_whitespace ();
295 c = gfc_next_ascii_char ();
301 c = gfc_next_ascii_char ();
318 gfc_current_locus = old_loc;
319 return (flag) ? MATCH_YES : MATCH_NO;
323 /* Match a literal integer on the input, setting the value on
324 MATCH_YES. Literal ints occur in kind-parameters as well as
325 old-style character length specifications. If cnt is non-NULL it
326 will be set to the number of digits. */
329 gfc_match_small_literal_int (int *value, int *cnt)
335 old_loc = gfc_current_locus;
338 gfc_gobble_whitespace ();
339 c = gfc_next_ascii_char ();
345 gfc_current_locus = old_loc;
354 old_loc = gfc_current_locus;
355 c = gfc_next_ascii_char ();
360 i = 10 * i + c - '0';
365 gfc_error ("Integer too large at %C");
370 gfc_current_locus = old_loc;
379 /* Match a small, constant integer expression, like in a kind
380 statement. On MATCH_YES, 'value' is set. */
383 gfc_match_small_int (int *value)
390 m = gfc_match_expr (&expr);
394 p = gfc_extract_int (expr, &i);
395 gfc_free_expr (expr);
408 /* This function is the same as the gfc_match_small_int, except that
409 we're keeping the pointer to the expr. This function could just be
410 removed and the previously mentioned one modified, though all calls
411 to it would have to be modified then (and there were a number of
412 them). Return MATCH_ERROR if fail to extract the int; otherwise,
413 return the result of gfc_match_expr(). The expr (if any) that was
414 matched is returned in the parameter expr. */
417 gfc_match_small_int_expr (int *value, gfc_expr **expr)
423 m = gfc_match_expr (expr);
427 p = gfc_extract_int (*expr, &i);
440 /* Matches a statement label. Uses gfc_match_small_literal_int() to
441 do most of the work. */
444 gfc_match_st_label (gfc_st_label **label)
450 old_loc = gfc_current_locus;
452 m = gfc_match_small_literal_int (&i, &cnt);
458 gfc_error ("Too many digits in statement label at %C");
464 gfc_error ("Statement label at %C is zero");
468 *label = gfc_get_st_label (i);
473 gfc_current_locus = old_loc;
478 /* Match and validate a label associated with a named IF, DO or SELECT
479 statement. If the symbol does not have the label attribute, we add
480 it. We also make sure the symbol does not refer to another
481 (active) block. A matched label is pointed to by gfc_new_block. */
484 gfc_match_label (void)
486 char name[GFC_MAX_SYMBOL_LEN + 1];
489 gfc_new_block = NULL;
491 m = gfc_match (" %n :", name);
495 if (gfc_get_symbol (name, NULL, &gfc_new_block))
497 gfc_error ("Label name '%s' at %C is ambiguous", name);
501 if (gfc_new_block->attr.flavor == FL_LABEL)
503 gfc_error ("Duplicate construct label '%s' at %C", name);
507 if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
508 gfc_new_block->name, NULL) == FAILURE)
515 /* See if the current input looks like a name of some sort. Modifies
516 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
517 Note that options.c restricts max_identifier_length to not more
518 than GFC_MAX_SYMBOL_LEN. */
521 gfc_match_name (char *buffer)
527 old_loc = gfc_current_locus;
528 gfc_gobble_whitespace ();
530 c = gfc_next_ascii_char ();
531 if (!(ISALPHA (c) || (c == '_' && gfc_option.flag_allow_leading_underscore)))
533 if (gfc_error_flag_test() == 0 && c != '(')
534 gfc_error ("Invalid character in name at %C");
535 gfc_current_locus = old_loc;
545 if (i > gfc_option.max_identifier_length)
547 gfc_error ("Name at %C is too long");
551 old_loc = gfc_current_locus;
552 c = gfc_next_ascii_char ();
554 while (ISALNUM (c) || c == '_' || (gfc_option.flag_dollar_ok && c == '$'));
556 if (c == '$' && !gfc_option.flag_dollar_ok)
558 gfc_error ("Invalid character '$' at %C. Use -fdollar-ok to allow it "
564 gfc_current_locus = old_loc;
570 /* Match a valid name for C, which is almost the same as for Fortran,
571 except that you can start with an underscore, etc.. It could have
572 been done by modifying the gfc_match_name, but this way other
573 things C allows can be added, such as no limits on the length.
574 Right now, the length is limited to the same thing as Fortran..
575 Also, by rewriting it, we use the gfc_next_char_C() to prevent the
576 input characters from being automatically lower cased, since C is
577 case sensitive. The parameter, buffer, is used to return the name
578 that is matched. Return MATCH_ERROR if the name is too long
579 (though this is a self-imposed limit), MATCH_NO if what we're
580 seeing isn't a name, and MATCH_YES if we successfully match a C
584 gfc_match_name_C (char *buffer)
590 old_loc = gfc_current_locus;
591 gfc_gobble_whitespace ();
593 /* Get the next char (first possible char of name) and see if
594 it's valid for C (either a letter or an underscore). */
595 c = gfc_next_char_literal (1);
597 /* If the user put nothing expect spaces between the quotes, it is valid
598 and simply means there is no name= specifier and the name is the fortran
599 symbol name, all lowercase. */
600 if (c == '"' || c == '\'')
603 gfc_current_locus = old_loc;
607 if (!ISALPHA (c) && c != '_')
609 gfc_error ("Invalid C name in NAME= specifier at %C");
613 /* Continue to read valid variable name characters. */
616 gcc_assert (gfc_wide_fits_in_byte (c));
618 buffer[i++] = (unsigned char) c;
620 /* C does not define a maximum length of variable names, to my
621 knowledge, but the compiler typically places a limit on them.
622 For now, i'll use the same as the fortran limit for simplicity,
623 but this may need to be changed to a dynamic buffer that can
624 be realloc'ed here if necessary, or more likely, a larger
626 if (i > gfc_option.max_identifier_length)
628 gfc_error ("Name at %C is too long");
632 old_loc = gfc_current_locus;
634 /* Get next char; param means we're in a string. */
635 c = gfc_next_char_literal (1);
636 } while (ISALNUM (c) || c == '_');
639 gfc_current_locus = old_loc;
641 /* See if we stopped because of whitespace. */
644 gfc_gobble_whitespace ();
645 c = gfc_peek_ascii_char ();
646 if (c != '"' && c != '\'')
648 gfc_error ("Embedded space in NAME= specifier at %C");
653 /* If we stopped because we had an invalid character for a C name, report
654 that to the user by returning MATCH_NO. */
655 if (c != '"' && c != '\'')
657 gfc_error ("Invalid C name in NAME= specifier at %C");
665 /* Match a symbol on the input. Modifies the pointer to the symbol
666 pointer if successful. */
669 gfc_match_sym_tree (gfc_symtree **matched_symbol, int host_assoc)
671 char buffer[GFC_MAX_SYMBOL_LEN + 1];
674 m = gfc_match_name (buffer);
679 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
680 ? MATCH_ERROR : MATCH_YES;
682 if (gfc_get_sym_tree (buffer, NULL, matched_symbol, false))
690 gfc_match_symbol (gfc_symbol **matched_symbol, int host_assoc)
695 m = gfc_match_sym_tree (&st, host_assoc);
700 *matched_symbol = st->n.sym;
702 *matched_symbol = NULL;
705 *matched_symbol = NULL;
710 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
711 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
715 gfc_match_intrinsic_op (gfc_intrinsic_op *result)
717 locus orig_loc = gfc_current_locus;
720 gfc_gobble_whitespace ();
721 ch = gfc_next_ascii_char ();
726 *result = INTRINSIC_PLUS;
731 *result = INTRINSIC_MINUS;
735 if (gfc_next_ascii_char () == '=')
738 *result = INTRINSIC_EQ;
744 if (gfc_peek_ascii_char () == '=')
747 gfc_next_ascii_char ();
748 *result = INTRINSIC_LE;
752 *result = INTRINSIC_LT;
756 if (gfc_peek_ascii_char () == '=')
759 gfc_next_ascii_char ();
760 *result = INTRINSIC_GE;
764 *result = INTRINSIC_GT;
768 if (gfc_peek_ascii_char () == '*')
771 gfc_next_ascii_char ();
772 *result = INTRINSIC_POWER;
776 *result = INTRINSIC_TIMES;
780 ch = gfc_peek_ascii_char ();
784 gfc_next_ascii_char ();
785 *result = INTRINSIC_NE;
791 gfc_next_ascii_char ();
792 *result = INTRINSIC_CONCAT;
796 *result = INTRINSIC_DIVIDE;
800 ch = gfc_next_ascii_char ();
804 if (gfc_next_ascii_char () == 'n'
805 && gfc_next_ascii_char () == 'd'
806 && gfc_next_ascii_char () == '.')
808 /* Matched ".and.". */
809 *result = INTRINSIC_AND;
815 if (gfc_next_ascii_char () == 'q')
817 ch = gfc_next_ascii_char ();
820 /* Matched ".eq.". */
821 *result = INTRINSIC_EQ_OS;
826 if (gfc_next_ascii_char () == '.')
828 /* Matched ".eqv.". */
829 *result = INTRINSIC_EQV;
837 ch = gfc_next_ascii_char ();
840 if (gfc_next_ascii_char () == '.')
842 /* Matched ".ge.". */
843 *result = INTRINSIC_GE_OS;
849 if (gfc_next_ascii_char () == '.')
851 /* Matched ".gt.". */
852 *result = INTRINSIC_GT_OS;
859 ch = gfc_next_ascii_char ();
862 if (gfc_next_ascii_char () == '.')
864 /* Matched ".le.". */
865 *result = INTRINSIC_LE_OS;
871 if (gfc_next_ascii_char () == '.')
873 /* Matched ".lt.". */
874 *result = INTRINSIC_LT_OS;
881 ch = gfc_next_ascii_char ();
884 ch = gfc_next_ascii_char ();
887 /* Matched ".ne.". */
888 *result = INTRINSIC_NE_OS;
893 if (gfc_next_ascii_char () == 'v'
894 && gfc_next_ascii_char () == '.')
896 /* Matched ".neqv.". */
897 *result = INTRINSIC_NEQV;
904 if (gfc_next_ascii_char () == 't'
905 && gfc_next_ascii_char () == '.')
907 /* Matched ".not.". */
908 *result = INTRINSIC_NOT;
915 if (gfc_next_ascii_char () == 'r'
916 && gfc_next_ascii_char () == '.')
918 /* Matched ".or.". */
919 *result = INTRINSIC_OR;
933 gfc_current_locus = orig_loc;
938 /* Match a loop control phrase:
940 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
942 If the final integer expression is not present, a constant unity
943 expression is returned. We don't return MATCH_ERROR until after
944 the equals sign is seen. */
947 gfc_match_iterator (gfc_iterator *iter, int init_flag)
949 char name[GFC_MAX_SYMBOL_LEN + 1];
950 gfc_expr *var, *e1, *e2, *e3;
956 /* Match the start of an iterator without affecting the symbol table. */
958 start = gfc_current_locus;
959 m = gfc_match (" %n =", name);
960 gfc_current_locus = start;
965 m = gfc_match_variable (&var, 0);
969 /* F2008, C617 & C565. */
970 if (var->symtree->n.sym->attr.codimension)
972 gfc_error ("Loop variable at %C cannot be a coarray");
976 if (var->ref != NULL)
978 gfc_error ("Loop variable at %C cannot be a sub-component");
982 gfc_match_char ('=');
984 var->symtree->n.sym->attr.implied_index = 1;
986 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
989 if (m == MATCH_ERROR)
992 if (gfc_match_char (',') != MATCH_YES)
995 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
998 if (m == MATCH_ERROR)
1001 if (gfc_match_char (',') != MATCH_YES)
1003 e3 = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
1007 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
1008 if (m == MATCH_ERROR)
1012 gfc_error ("Expected a step value in iterator at %C");
1024 gfc_error ("Syntax error in iterator at %C");
1035 /* Tries to match the next non-whitespace character on the input.
1036 This subroutine does not return MATCH_ERROR. */
1039 gfc_match_char (char c)
1043 where = gfc_current_locus;
1044 gfc_gobble_whitespace ();
1046 if (gfc_next_ascii_char () == c)
1049 gfc_current_locus = where;
1054 /* General purpose matching subroutine. The target string is a
1055 scanf-like format string in which spaces correspond to arbitrary
1056 whitespace (including no whitespace), characters correspond to
1057 themselves. The %-codes are:
1059 %% Literal percent sign
1060 %e Expression, pointer to a pointer is set
1061 %s Symbol, pointer to the symbol is set
1062 %n Name, character buffer is set to name
1063 %t Matches end of statement.
1064 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
1065 %l Matches a statement label
1066 %v Matches a variable expression (an lvalue)
1067 % Matches a required space (in free form) and optional spaces. */
1070 gfc_match (const char *target, ...)
1072 gfc_st_label **label;
1081 old_loc = gfc_current_locus;
1082 va_start (argp, target);
1092 gfc_gobble_whitespace ();
1103 vp = va_arg (argp, void **);
1104 n = gfc_match_expr ((gfc_expr **) vp);
1115 vp = va_arg (argp, void **);
1116 n = gfc_match_variable ((gfc_expr **) vp, 0);
1127 vp = va_arg (argp, void **);
1128 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
1139 np = va_arg (argp, char *);
1140 n = gfc_match_name (np);
1151 label = va_arg (argp, gfc_st_label **);
1152 n = gfc_match_st_label (label);
1163 ip = va_arg (argp, int *);
1164 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
1175 if (gfc_match_eos () != MATCH_YES)
1183 if (gfc_match_space () == MATCH_YES)
1189 break; /* Fall through to character matcher. */
1192 gfc_internal_error ("gfc_match(): Bad match code %c", c);
1197 /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1198 expect an upper case character here! */
1199 gcc_assert (TOLOWER (c) == c);
1201 if (c == gfc_next_ascii_char ())
1211 /* Clean up after a failed match. */
1212 gfc_current_locus = old_loc;
1213 va_start (argp, target);
1216 for (; matches > 0; matches--)
1218 while (*p++ != '%');
1226 /* Matches that don't have to be undone */
1231 (void) va_arg (argp, void **);
1236 vp = va_arg (argp, void **);
1237 gfc_free_expr ((struct gfc_expr *)*vp);
1250 /*********************** Statement level matching **********************/
1252 /* Matches the start of a program unit, which is the program keyword
1253 followed by an obligatory symbol. */
1256 gfc_match_program (void)
1261 m = gfc_match ("% %s%t", &sym);
1265 gfc_error ("Invalid form of PROGRAM statement at %C");
1269 if (m == MATCH_ERROR)
1272 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
1275 gfc_new_block = sym;
1281 /* Match a simple assignment statement. */
1284 gfc_match_assignment (void)
1286 gfc_expr *lvalue, *rvalue;
1290 old_loc = gfc_current_locus;
1293 m = gfc_match (" %v =", &lvalue);
1296 gfc_current_locus = old_loc;
1297 gfc_free_expr (lvalue);
1302 m = gfc_match (" %e%t", &rvalue);
1305 gfc_current_locus = old_loc;
1306 gfc_free_expr (lvalue);
1307 gfc_free_expr (rvalue);
1311 gfc_set_sym_referenced (lvalue->symtree->n.sym);
1313 new_st.op = EXEC_ASSIGN;
1314 new_st.expr1 = lvalue;
1315 new_st.expr2 = rvalue;
1317 gfc_check_do_variable (lvalue->symtree);
1323 /* Match a pointer assignment statement. */
1326 gfc_match_pointer_assignment (void)
1328 gfc_expr *lvalue, *rvalue;
1332 old_loc = gfc_current_locus;
1334 lvalue = rvalue = NULL;
1335 gfc_matching_ptr_assignment = 0;
1336 gfc_matching_procptr_assignment = 0;
1338 m = gfc_match (" %v =>", &lvalue);
1345 if (lvalue->symtree->n.sym->attr.proc_pointer
1346 || gfc_is_proc_ptr_comp (lvalue, NULL))
1347 gfc_matching_procptr_assignment = 1;
1349 gfc_matching_ptr_assignment = 1;
1351 m = gfc_match (" %e%t", &rvalue);
1352 gfc_matching_ptr_assignment = 0;
1353 gfc_matching_procptr_assignment = 0;
1357 new_st.op = EXEC_POINTER_ASSIGN;
1358 new_st.expr1 = lvalue;
1359 new_st.expr2 = rvalue;
1364 gfc_current_locus = old_loc;
1365 gfc_free_expr (lvalue);
1366 gfc_free_expr (rvalue);
1371 /* We try to match an easy arithmetic IF statement. This only happens
1372 when just after having encountered a simple IF statement. This code
1373 is really duplicate with parts of the gfc_match_if code, but this is
1377 match_arithmetic_if (void)
1379 gfc_st_label *l1, *l2, *l3;
1383 m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1387 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1388 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1389 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1391 gfc_free_expr (expr);
1395 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1396 "statement at %C") == FAILURE)
1399 new_st.op = EXEC_ARITHMETIC_IF;
1400 new_st.expr1 = expr;
1409 /* The IF statement is a bit of a pain. First of all, there are three
1410 forms of it, the simple IF, the IF that starts a block and the
1413 There is a problem with the simple IF and that is the fact that we
1414 only have a single level of undo information on symbols. What this
1415 means is for a simple IF, we must re-match the whole IF statement
1416 multiple times in order to guarantee that the symbol table ends up
1417 in the proper state. */
1419 static match match_simple_forall (void);
1420 static match match_simple_where (void);
1423 gfc_match_if (gfc_statement *if_type)
1426 gfc_st_label *l1, *l2, *l3;
1427 locus old_loc, old_loc2;
1431 n = gfc_match_label ();
1432 if (n == MATCH_ERROR)
1435 old_loc = gfc_current_locus;
1437 m = gfc_match (" if ( %e", &expr);
1441 old_loc2 = gfc_current_locus;
1442 gfc_current_locus = old_loc;
1444 if (gfc_match_parens () == MATCH_ERROR)
1447 gfc_current_locus = old_loc2;
1449 if (gfc_match_char (')') != MATCH_YES)
1451 gfc_error ("Syntax error in IF-expression at %C");
1452 gfc_free_expr (expr);
1456 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1462 gfc_error ("Block label not appropriate for arithmetic IF "
1464 gfc_free_expr (expr);
1468 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1469 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1470 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1472 gfc_free_expr (expr);
1476 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1477 "statement at %C") == FAILURE)
1480 new_st.op = EXEC_ARITHMETIC_IF;
1481 new_st.expr1 = expr;
1486 *if_type = ST_ARITHMETIC_IF;
1490 if (gfc_match (" then%t") == MATCH_YES)
1492 new_st.op = EXEC_IF;
1493 new_st.expr1 = expr;
1494 *if_type = ST_IF_BLOCK;
1500 gfc_error ("Block label is not appropriate for IF statement at %C");
1501 gfc_free_expr (expr);
1505 /* At this point the only thing left is a simple IF statement. At
1506 this point, n has to be MATCH_NO, so we don't have to worry about
1507 re-matching a block label. From what we've got so far, try
1508 matching an assignment. */
1510 *if_type = ST_SIMPLE_IF;
1512 m = gfc_match_assignment ();
1516 gfc_free_expr (expr);
1517 gfc_undo_symbols ();
1518 gfc_current_locus = old_loc;
1520 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1521 assignment was found. For MATCH_NO, continue to call the various
1523 if (m == MATCH_ERROR)
1526 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1528 m = gfc_match_pointer_assignment ();
1532 gfc_free_expr (expr);
1533 gfc_undo_symbols ();
1534 gfc_current_locus = old_loc;
1536 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1538 /* Look at the next keyword to see which matcher to call. Matching
1539 the keyword doesn't affect the symbol table, so we don't have to
1540 restore between tries. */
1542 #define match(string, subr, statement) \
1543 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1547 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1548 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1549 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1550 match ("call", gfc_match_call, ST_CALL)
1551 match ("close", gfc_match_close, ST_CLOSE)
1552 match ("continue", gfc_match_continue, ST_CONTINUE)
1553 match ("cycle", gfc_match_cycle, ST_CYCLE)
1554 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1555 match ("end file", gfc_match_endfile, ST_END_FILE)
1556 match ("error stop", gfc_match_error_stop, ST_ERROR_STOP)
1557 match ("exit", gfc_match_exit, ST_EXIT)
1558 match ("flush", gfc_match_flush, ST_FLUSH)
1559 match ("forall", match_simple_forall, ST_FORALL)
1560 match ("go to", gfc_match_goto, ST_GOTO)
1561 match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1562 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1563 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1564 match ("open", gfc_match_open, ST_OPEN)
1565 match ("pause", gfc_match_pause, ST_NONE)
1566 match ("print", gfc_match_print, ST_WRITE)
1567 match ("read", gfc_match_read, ST_READ)
1568 match ("return", gfc_match_return, ST_RETURN)
1569 match ("rewind", gfc_match_rewind, ST_REWIND)
1570 match ("stop", gfc_match_stop, ST_STOP)
1571 match ("wait", gfc_match_wait, ST_WAIT)
1572 match ("sync all", gfc_match_sync_all, ST_SYNC_CALL);
1573 match ("sync images", gfc_match_sync_images, ST_SYNC_IMAGES);
1574 match ("sync memory", gfc_match_sync_memory, ST_SYNC_MEMORY);
1575 match ("where", match_simple_where, ST_WHERE)
1576 match ("write", gfc_match_write, ST_WRITE)
1578 /* The gfc_match_assignment() above may have returned a MATCH_NO
1579 where the assignment was to a named constant. Check that
1580 special case here. */
1581 m = gfc_match_assignment ();
1584 gfc_error ("Cannot assign to a named constant at %C");
1585 gfc_free_expr (expr);
1586 gfc_undo_symbols ();
1587 gfc_current_locus = old_loc;
1591 /* All else has failed, so give up. See if any of the matchers has
1592 stored an error message of some sort. */
1593 if (gfc_error_check () == 0)
1594 gfc_error ("Unclassifiable statement in IF-clause at %C");
1596 gfc_free_expr (expr);
1601 gfc_error ("Syntax error in IF-clause at %C");
1604 gfc_free_expr (expr);
1608 /* At this point, we've matched the single IF and the action clause
1609 is in new_st. Rearrange things so that the IF statement appears
1612 p = gfc_get_code ();
1613 p->next = gfc_get_code ();
1615 p->next->loc = gfc_current_locus;
1620 gfc_clear_new_st ();
1622 new_st.op = EXEC_IF;
1631 /* Match an ELSE statement. */
1634 gfc_match_else (void)
1636 char name[GFC_MAX_SYMBOL_LEN + 1];
1638 if (gfc_match_eos () == MATCH_YES)
1641 if (gfc_match_name (name) != MATCH_YES
1642 || gfc_current_block () == NULL
1643 || gfc_match_eos () != MATCH_YES)
1645 gfc_error ("Unexpected junk after ELSE statement at %C");
1649 if (strcmp (name, gfc_current_block ()->name) != 0)
1651 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1652 name, gfc_current_block ()->name);
1660 /* Match an ELSE IF statement. */
1663 gfc_match_elseif (void)
1665 char name[GFC_MAX_SYMBOL_LEN + 1];
1669 m = gfc_match (" ( %e ) then", &expr);
1673 if (gfc_match_eos () == MATCH_YES)
1676 if (gfc_match_name (name) != MATCH_YES
1677 || gfc_current_block () == NULL
1678 || gfc_match_eos () != MATCH_YES)
1680 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1684 if (strcmp (name, gfc_current_block ()->name) != 0)
1686 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1687 name, gfc_current_block ()->name);
1692 new_st.op = EXEC_IF;
1693 new_st.expr1 = expr;
1697 gfc_free_expr (expr);
1702 /* Free a gfc_iterator structure. */
1705 gfc_free_iterator (gfc_iterator *iter, int flag)
1711 gfc_free_expr (iter->var);
1712 gfc_free_expr (iter->start);
1713 gfc_free_expr (iter->end);
1714 gfc_free_expr (iter->step);
1721 /* Match a CRITICAL statement. */
1723 gfc_match_critical (void)
1725 gfc_st_label *label = NULL;
1727 if (gfc_match_label () == MATCH_ERROR)
1730 if (gfc_match (" critical") != MATCH_YES)
1733 if (gfc_match_st_label (&label) == MATCH_ERROR)
1736 if (gfc_match_eos () != MATCH_YES)
1738 gfc_syntax_error (ST_CRITICAL);
1742 if (gfc_pure (NULL))
1744 gfc_error ("Image control statement CRITICAL at %C in PURE procedure");
1748 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: CRITICAL statement at %C")
1752 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
1754 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
1758 if (gfc_find_state (COMP_CRITICAL) == SUCCESS)
1760 gfc_error ("Nested CRITICAL block at %C");
1764 new_st.op = EXEC_CRITICAL;
1767 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1774 /* Match a BLOCK statement. */
1777 gfc_match_block (void)
1781 if (gfc_match_label () == MATCH_ERROR)
1784 if (gfc_match (" block") != MATCH_YES)
1787 /* For this to be a correct BLOCK statement, the line must end now. */
1788 m = gfc_match_eos ();
1789 if (m == MATCH_ERROR)
1798 /* Match an ASSOCIATE statement. */
1801 gfc_match_associate (void)
1803 if (gfc_match_label () == MATCH_ERROR)
1806 if (gfc_match (" associate") != MATCH_YES)
1809 /* Match the association list. */
1810 if (gfc_match_char ('(') != MATCH_YES)
1812 gfc_error ("Expected association list at %C");
1815 new_st.ext.block.assoc = NULL;
1818 gfc_association_list* newAssoc = gfc_get_association_list ();
1819 gfc_association_list* a;
1821 /* Match the next association. */
1822 if (gfc_match (" %n => %e", newAssoc->name, &newAssoc->target)
1825 gfc_error ("Expected association at %C");
1826 goto assocListError;
1828 newAssoc->where = gfc_current_locus;
1830 /* Check that the current name is not yet in the list. */
1831 for (a = new_st.ext.block.assoc; a; a = a->next)
1832 if (!strcmp (a->name, newAssoc->name))
1834 gfc_error ("Duplicate name '%s' in association at %C",
1836 goto assocListError;
1839 /* The target expression must not be coindexed. */
1840 if (gfc_is_coindexed (newAssoc->target))
1842 gfc_error ("Association target at %C must not be coindexed");
1843 goto assocListError;
1846 /* The `variable' field is left blank for now; because the target is not
1847 yet resolved, we can't use gfc_has_vector_subscript to determine it
1848 for now. This is set during resolution. */
1850 /* Put it into the list. */
1851 newAssoc->next = new_st.ext.block.assoc;
1852 new_st.ext.block.assoc = newAssoc;
1854 /* Try next one or end if closing parenthesis is found. */
1855 gfc_gobble_whitespace ();
1856 if (gfc_peek_char () == ')')
1858 if (gfc_match_char (',') != MATCH_YES)
1860 gfc_error ("Expected ')' or ',' at %C");
1867 gfc_free (newAssoc);
1870 if (gfc_match_char (')') != MATCH_YES)
1872 /* This should never happen as we peek above. */
1876 if (gfc_match_eos () != MATCH_YES)
1878 gfc_error ("Junk after ASSOCIATE statement at %C");
1885 gfc_free_association_list (new_st.ext.block.assoc);
1890 /* Match a DO statement. */
1895 gfc_iterator iter, *ip;
1897 gfc_st_label *label;
1900 old_loc = gfc_current_locus;
1903 iter.var = iter.start = iter.end = iter.step = NULL;
1905 m = gfc_match_label ();
1906 if (m == MATCH_ERROR)
1909 if (gfc_match (" do") != MATCH_YES)
1912 m = gfc_match_st_label (&label);
1913 if (m == MATCH_ERROR)
1916 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
1918 if (gfc_match_eos () == MATCH_YES)
1920 iter.end = gfc_get_logical_expr (gfc_default_logical_kind, NULL, true);
1921 new_st.op = EXEC_DO_WHILE;
1925 /* Match an optional comma, if no comma is found, a space is obligatory. */
1926 if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1929 /* Check for balanced parens. */
1931 if (gfc_match_parens () == MATCH_ERROR)
1934 /* See if we have a DO WHILE. */
1935 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1937 new_st.op = EXEC_DO_WHILE;
1941 /* The abortive DO WHILE may have done something to the symbol
1942 table, so we start over. */
1943 gfc_undo_symbols ();
1944 gfc_current_locus = old_loc;
1946 gfc_match_label (); /* This won't error. */
1947 gfc_match (" do "); /* This will work. */
1949 gfc_match_st_label (&label); /* Can't error out. */
1950 gfc_match_char (','); /* Optional comma. */
1952 m = gfc_match_iterator (&iter, 0);
1955 if (m == MATCH_ERROR)
1958 iter.var->symtree->n.sym->attr.implied_index = 0;
1959 gfc_check_do_variable (iter.var->symtree);
1961 if (gfc_match_eos () != MATCH_YES)
1963 gfc_syntax_error (ST_DO);
1967 new_st.op = EXEC_DO;
1971 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1974 new_st.label1 = label;
1976 if (new_st.op == EXEC_DO_WHILE)
1977 new_st.expr1 = iter.end;
1980 new_st.ext.iterator = ip = gfc_get_iterator ();
1987 gfc_free_iterator (&iter, 0);
1993 /* Match an EXIT or CYCLE statement. */
1996 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1998 gfc_state_data *p, *o;
2003 if (gfc_match_eos () == MATCH_YES)
2007 char name[GFC_MAX_SYMBOL_LEN + 1];
2010 m = gfc_match ("% %n%t", name);
2011 if (m == MATCH_ERROR)
2015 gfc_syntax_error (st);
2019 /* Find the corresponding symbol. If there's a BLOCK statement
2020 between here and the label, it is not in gfc_current_ns but a parent
2022 stree = gfc_find_symtree_in_proc (name, gfc_current_ns);
2025 gfc_error ("Name '%s' in %s statement at %C is unknown",
2026 name, gfc_ascii_statement (st));
2031 if (sym->attr.flavor != FL_LABEL)
2033 gfc_error ("Name '%s' in %s statement at %C is not a construct name",
2034 name, gfc_ascii_statement (st));
2039 /* Find the loop specified by the label (or lack of a label). */
2040 for (o = NULL, p = gfc_state_stack; p; p = p->previous)
2041 if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
2043 else if (p->state == COMP_CRITICAL)
2045 gfc_error("%s statement at %C leaves CRITICAL construct",
2046 gfc_ascii_statement (st));
2049 else if ((sym && sym == p->sym) || (!sym && p->state == COMP_DO))
2055 gfc_error ("%s statement at %C is not within a construct",
2056 gfc_ascii_statement (st));
2058 gfc_error ("%s statement at %C is not within construct '%s'",
2059 gfc_ascii_statement (st), sym->name);
2064 /* Special checks for EXIT from non-loop constructs. */
2071 /* This is already handled above. */
2074 case COMP_ASSOCIATE:
2078 case COMP_SELECT_TYPE:
2080 if (op == EXEC_CYCLE)
2082 gfc_error ("CYCLE statement at %C is not applicable to non-loop"
2083 " construct '%s'", sym->name);
2086 gcc_assert (op == EXEC_EXIT);
2087 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: EXIT statement with no"
2088 " do-construct-name at %C") == FAILURE)
2093 gfc_error ("%s statement at %C is not applicable to construct '%s'",
2094 gfc_ascii_statement (st), sym->name);
2100 gfc_error ("%s statement at %C leaving OpenMP structured block",
2101 gfc_ascii_statement (st));
2105 for (o = p, cnt = 0; o->state == COMP_DO && o->previous != NULL; cnt++)
2109 && o->state == COMP_OMP_STRUCTURED_BLOCK
2110 && (o->head->op == EXEC_OMP_DO
2111 || o->head->op == EXEC_OMP_PARALLEL_DO))
2114 gcc_assert (o->head->next != NULL
2115 && (o->head->next->op == EXEC_DO
2116 || o->head->next->op == EXEC_DO_WHILE)
2117 && o->previous != NULL
2118 && o->previous->tail->op == o->head->op);
2119 if (o->previous->tail->ext.omp_clauses != NULL
2120 && o->previous->tail->ext.omp_clauses->collapse > 1)
2121 collapse = o->previous->tail->ext.omp_clauses->collapse;
2122 if (st == ST_EXIT && cnt <= collapse)
2124 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
2127 if (st == ST_CYCLE && cnt < collapse)
2129 gfc_error ("CYCLE statement at %C to non-innermost collapsed"
2135 /* Save the first statement in the construct - needed by the backend. */
2136 new_st.ext.which_construct = p->construct;
2144 /* Match the EXIT statement. */
2147 gfc_match_exit (void)
2149 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
2153 /* Match the CYCLE statement. */
2156 gfc_match_cycle (void)
2158 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
2162 /* Match a number or character constant after an (ALL) STOP or PAUSE statement. */
2165 gfc_match_stopcode (gfc_statement st)
2172 if (gfc_match_eos () != MATCH_YES)
2174 m = gfc_match_init_expr (&e);
2175 if (m == MATCH_ERROR)
2180 if (gfc_match_eos () != MATCH_YES)
2184 if (gfc_pure (NULL))
2186 gfc_error ("%s statement not allowed in PURE procedure at %C",
2187 gfc_ascii_statement (st));
2191 if (st == ST_STOP && gfc_find_state (COMP_CRITICAL) == SUCCESS)
2193 gfc_error ("Image control statement STOP at %C in CRITICAL block");
2199 if (!(e->ts.type == BT_CHARACTER || e->ts.type == BT_INTEGER))
2201 gfc_error ("STOP code at %L must be either INTEGER or CHARACTER type",
2208 gfc_error ("STOP code at %L must be scalar",
2213 if (e->ts.type == BT_CHARACTER
2214 && e->ts.kind != gfc_default_character_kind)
2216 gfc_error ("STOP code at %L must be default character KIND=%d",
2217 &e->where, (int) gfc_default_character_kind);
2221 if (e->ts.type == BT_INTEGER
2222 && e->ts.kind != gfc_default_integer_kind)
2224 gfc_error ("STOP code at %L must be default integer KIND=%d",
2225 &e->where, (int) gfc_default_integer_kind);
2233 new_st.op = EXEC_STOP;
2236 new_st.op = EXEC_ERROR_STOP;
2239 new_st.op = EXEC_PAUSE;
2246 new_st.ext.stop_code = -1;
2251 gfc_syntax_error (st);
2260 /* Match the (deprecated) PAUSE statement. */
2263 gfc_match_pause (void)
2267 m = gfc_match_stopcode (ST_PAUSE);
2270 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
2279 /* Match the STOP statement. */
2282 gfc_match_stop (void)
2284 return gfc_match_stopcode (ST_STOP);
2288 /* Match the ERROR STOP statement. */
2291 gfc_match_error_stop (void)
2293 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: ERROR STOP statement at %C")
2297 return gfc_match_stopcode (ST_ERROR_STOP);
2301 /* Match SYNC ALL/IMAGES/MEMORY statement. Syntax:
2302 SYNC ALL [(sync-stat-list)]
2303 SYNC MEMORY [(sync-stat-list)]
2304 SYNC IMAGES (image-set [, sync-stat-list] )
2305 with sync-stat is int-expr or *. */
2308 sync_statement (gfc_statement st)
2311 gfc_expr *tmp, *imageset, *stat, *errmsg;
2312 bool saw_stat, saw_errmsg;
2314 tmp = imageset = stat = errmsg = NULL;
2315 saw_stat = saw_errmsg = false;
2317 if (gfc_pure (NULL))
2319 gfc_error ("Image control statement SYNC at %C in PURE procedure");
2323 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: SYNC statement at %C")
2327 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
2329 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
2333 if (gfc_find_state (COMP_CRITICAL) == SUCCESS)
2335 gfc_error ("Image control statement SYNC at %C in CRITICAL block");
2339 if (gfc_match_eos () == MATCH_YES)
2341 if (st == ST_SYNC_IMAGES)
2346 if (gfc_match_char ('(') != MATCH_YES)
2349 if (st == ST_SYNC_IMAGES)
2351 /* Denote '*' as imageset == NULL. */
2352 m = gfc_match_char ('*');
2353 if (m == MATCH_ERROR)
2357 if (gfc_match ("%e", &imageset) != MATCH_YES)
2360 m = gfc_match_char (',');
2361 if (m == MATCH_ERROR)
2365 m = gfc_match_char (')');
2374 m = gfc_match (" stat = %v", &tmp);
2375 if (m == MATCH_ERROR)
2381 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2387 if (gfc_match_char (',') == MATCH_YES)
2391 m = gfc_match (" errmsg = %v", &tmp);
2392 if (m == MATCH_ERROR)
2398 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2404 if (gfc_match_char (',') == MATCH_YES)
2408 gfc_gobble_whitespace ();
2410 if (gfc_peek_char () == ')')
2416 if (gfc_match (" )%t") != MATCH_YES)
2423 new_st.op = EXEC_SYNC_ALL;
2425 case ST_SYNC_IMAGES:
2426 new_st.op = EXEC_SYNC_IMAGES;
2428 case ST_SYNC_MEMORY:
2429 new_st.op = EXEC_SYNC_MEMORY;
2435 new_st.expr1 = imageset;
2436 new_st.expr2 = stat;
2437 new_st.expr3 = errmsg;
2442 gfc_syntax_error (st);
2445 gfc_free_expr (tmp);
2446 gfc_free_expr (imageset);
2447 gfc_free_expr (stat);
2448 gfc_free_expr (errmsg);
2454 /* Match SYNC ALL statement. */
2457 gfc_match_sync_all (void)
2459 return sync_statement (ST_SYNC_ALL);
2463 /* Match SYNC IMAGES statement. */
2466 gfc_match_sync_images (void)
2468 return sync_statement (ST_SYNC_IMAGES);
2472 /* Match SYNC MEMORY statement. */
2475 gfc_match_sync_memory (void)
2477 return sync_statement (ST_SYNC_MEMORY);
2481 /* Match a CONTINUE statement. */
2484 gfc_match_continue (void)
2486 if (gfc_match_eos () != MATCH_YES)
2488 gfc_syntax_error (ST_CONTINUE);
2492 new_st.op = EXEC_CONTINUE;
2497 /* Match the (deprecated) ASSIGN statement. */
2500 gfc_match_assign (void)
2503 gfc_st_label *label;
2505 if (gfc_match (" %l", &label) == MATCH_YES)
2507 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
2509 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
2511 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
2516 expr->symtree->n.sym->attr.assign = 1;
2518 new_st.op = EXEC_LABEL_ASSIGN;
2519 new_st.label1 = label;
2520 new_st.expr1 = expr;
2528 /* Match the GO TO statement. As a computed GOTO statement is
2529 matched, it is transformed into an equivalent SELECT block. No
2530 tree is necessary, and the resulting jumps-to-jumps are
2531 specifically optimized away by the back end. */
2534 gfc_match_goto (void)
2536 gfc_code *head, *tail;
2539 gfc_st_label *label;
2543 if (gfc_match (" %l%t", &label) == MATCH_YES)
2545 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2548 new_st.op = EXEC_GOTO;
2549 new_st.label1 = label;
2553 /* The assigned GO TO statement. */
2555 if (gfc_match_variable (&expr, 0) == MATCH_YES)
2557 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2562 new_st.op = EXEC_GOTO;
2563 new_st.expr1 = expr;
2565 if (gfc_match_eos () == MATCH_YES)
2568 /* Match label list. */
2569 gfc_match_char (',');
2570 if (gfc_match_char ('(') != MATCH_YES)
2572 gfc_syntax_error (ST_GOTO);
2579 m = gfc_match_st_label (&label);
2583 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2587 head = tail = gfc_get_code ();
2590 tail->block = gfc_get_code ();
2594 tail->label1 = label;
2595 tail->op = EXEC_GOTO;
2597 while (gfc_match_char (',') == MATCH_YES);
2599 if (gfc_match (")%t") != MATCH_YES)
2604 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2607 new_st.block = head;
2612 /* Last chance is a computed GO TO statement. */
2613 if (gfc_match_char ('(') != MATCH_YES)
2615 gfc_syntax_error (ST_GOTO);
2624 m = gfc_match_st_label (&label);
2628 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2632 head = tail = gfc_get_code ();
2635 tail->block = gfc_get_code ();
2639 cp = gfc_get_case ();
2640 cp->low = cp->high = gfc_get_int_expr (gfc_default_integer_kind,
2643 tail->op = EXEC_SELECT;
2644 tail->ext.case_list = cp;
2646 tail->next = gfc_get_code ();
2647 tail->next->op = EXEC_GOTO;
2648 tail->next->label1 = label;
2650 while (gfc_match_char (',') == MATCH_YES);
2652 if (gfc_match_char (')') != MATCH_YES)
2657 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2661 /* Get the rest of the statement. */
2662 gfc_match_char (',');
2664 if (gfc_match (" %e%t", &expr) != MATCH_YES)
2667 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Computed GOTO "
2668 "at %C") == FAILURE)
2671 /* At this point, a computed GOTO has been fully matched and an
2672 equivalent SELECT statement constructed. */
2674 new_st.op = EXEC_SELECT;
2675 new_st.expr1 = NULL;
2677 /* Hack: For a "real" SELECT, the expression is in expr. We put
2678 it in expr2 so we can distinguish then and produce the correct
2680 new_st.expr2 = expr;
2681 new_st.block = head;
2685 gfc_syntax_error (ST_GOTO);
2687 gfc_free_statements (head);
2692 /* Frees a list of gfc_alloc structures. */
2695 gfc_free_alloc_list (gfc_alloc *p)
2702 gfc_free_expr (p->expr);
2708 /* Match a Fortran 2003 derived-type-spec (F03:R455), which is just the name of
2709 an accessible derived type. */
2712 match_derived_type_spec (gfc_typespec *ts)
2714 char name[GFC_MAX_SYMBOL_LEN + 1];
2716 gfc_symbol *derived;
2718 old_locus = gfc_current_locus;
2720 if (gfc_match ("%n", name) != MATCH_YES)
2722 gfc_current_locus = old_locus;
2726 gfc_find_symbol (name, NULL, 1, &derived);
2728 if (derived && derived->attr.flavor == FL_DERIVED)
2730 ts->type = BT_DERIVED;
2731 ts->u.derived = derived;
2735 gfc_current_locus = old_locus;
2740 /* Match a Fortran 2003 type-spec (F03:R401). This is similar to
2741 gfc_match_decl_type_spec() from decl.c, with the following exceptions:
2742 It only includes the intrinsic types from the Fortran 2003 standard
2743 (thus, neither BYTE nor forms like REAL*4 are allowed). Additionally,
2744 the implicit_flag is not needed, so it was removed. Derived types are
2745 identified by their name alone. */
2748 match_type_spec (gfc_typespec *ts)
2754 gfc_gobble_whitespace ();
2755 old_locus = gfc_current_locus;
2757 if (match_derived_type_spec (ts) == MATCH_YES)
2759 /* Enforce F03:C401. */
2760 if (ts->u.derived->attr.abstract)
2762 gfc_error ("Derived type '%s' at %L may not be ABSTRACT",
2763 ts->u.derived->name, &old_locus);
2769 if (gfc_match ("integer") == MATCH_YES)
2771 ts->type = BT_INTEGER;
2772 ts->kind = gfc_default_integer_kind;
2776 if (gfc_match ("real") == MATCH_YES)
2779 ts->kind = gfc_default_real_kind;
2783 if (gfc_match ("double precision") == MATCH_YES)
2786 ts->kind = gfc_default_double_kind;
2790 if (gfc_match ("complex") == MATCH_YES)
2792 ts->type = BT_COMPLEX;
2793 ts->kind = gfc_default_complex_kind;
2797 if (gfc_match ("character") == MATCH_YES)
2799 ts->type = BT_CHARACTER;
2801 m = gfc_match_char_spec (ts);
2809 if (gfc_match ("logical") == MATCH_YES)
2811 ts->type = BT_LOGICAL;
2812 ts->kind = gfc_default_logical_kind;
2816 /* If a type is not matched, simply return MATCH_NO. */
2817 gfc_current_locus = old_locus;
2822 gfc_gobble_whitespace ();
2823 if (gfc_peek_ascii_char () == '*')
2825 gfc_error ("Invalid type-spec at %C");
2829 m = gfc_match_kind_spec (ts, false);
2832 m = MATCH_YES; /* No kind specifier found. */
2838 /* Match an ALLOCATE statement. */
2841 gfc_match_allocate (void)
2843 gfc_alloc *head, *tail;
2844 gfc_expr *stat, *errmsg, *tmp, *source, *mold;
2849 bool saw_stat, saw_errmsg, saw_source, saw_mold, b1, b2, b3;
2852 stat = errmsg = source = mold = tmp = NULL;
2853 saw_stat = saw_errmsg = saw_source = saw_mold = false;
2855 if (gfc_match_char ('(') != MATCH_YES)
2858 /* Match an optional type-spec. */
2859 old_locus = gfc_current_locus;
2860 m = match_type_spec (&ts);
2861 if (m == MATCH_ERROR)
2863 else if (m == MATCH_NO)
2865 char name[GFC_MAX_SYMBOL_LEN + 3];
2867 if (gfc_match ("%n :: ", name) == MATCH_YES)
2869 gfc_error ("Error in type-spec at %L", &old_locus);
2873 ts.type = BT_UNKNOWN;
2877 if (gfc_match (" :: ") == MATCH_YES)
2879 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: typespec in "
2880 "ALLOCATE at %L", &old_locus) == FAILURE)
2885 ts.type = BT_UNKNOWN;
2886 gfc_current_locus = old_locus;
2893 head = tail = gfc_get_alloc ();
2896 tail->next = gfc_get_alloc ();
2900 m = gfc_match_variable (&tail->expr, 0);
2903 if (m == MATCH_ERROR)
2906 if (gfc_check_do_variable (tail->expr->symtree))
2909 if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2911 gfc_error ("Bad allocate-object at %C for a PURE procedure");
2915 /* The ALLOCATE statement had an optional typespec. Check the
2917 if (ts.type != BT_UNKNOWN)
2919 /* Enforce F03:C624. */
2920 if (!gfc_type_compatible (&tail->expr->ts, &ts))
2922 gfc_error ("Type of entity at %L is type incompatible with "
2923 "typespec", &tail->expr->where);
2927 /* Enforce F03:C627. */
2928 if (ts.kind != tail->expr->ts.kind)
2930 gfc_error ("Kind type parameter for entity at %L differs from "
2931 "the kind type parameter of the typespec",
2932 &tail->expr->where);
2937 if (tail->expr->ts.type == BT_DERIVED)
2938 tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
2940 /* FIXME: disable the checking on derived types and arrays. */
2941 sym = tail->expr->symtree->n.sym;
2942 b1 = !(tail->expr->ref
2943 && (tail->expr->ref->type == REF_COMPONENT
2944 || tail->expr->ref->type == REF_ARRAY));
2945 if (sym && sym->ts.type == BT_CLASS)
2946 b2 = !(CLASS_DATA (sym)->attr.allocatable
2947 || CLASS_DATA (sym)->attr.class_pointer);
2949 b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
2950 || sym->attr.proc_pointer);
2951 b3 = sym && sym->ns && sym->ns->proc_name
2952 && (sym->ns->proc_name->attr.allocatable
2953 || sym->ns->proc_name->attr.pointer
2954 || sym->ns->proc_name->attr.proc_pointer);
2955 if (b1 && b2 && !b3)
2957 gfc_error ("Allocate-object at %L is not a nonprocedure pointer "
2958 "or an allocatable variable", &tail->expr->where);
2962 if (gfc_peek_ascii_char () == '(' && !sym->attr.dimension)
2964 gfc_error ("Shape specification for allocatable scalar at %C");
2968 if (gfc_match_char (',') != MATCH_YES)
2973 m = gfc_match (" stat = %v", &tmp);
2974 if (m == MATCH_ERROR)
2981 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2989 if (gfc_check_do_variable (stat->symtree))
2992 if (gfc_match_char (',') == MATCH_YES)
2993 goto alloc_opt_list;
2996 m = gfc_match (" errmsg = %v", &tmp);
2997 if (m == MATCH_ERROR)
3001 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG tag at %L",
3002 &tmp->where) == FAILURE)
3008 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
3016 if (gfc_match_char (',') == MATCH_YES)
3017 goto alloc_opt_list;
3020 m = gfc_match (" source = %e", &tmp);
3021 if (m == MATCH_ERROR)
3025 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SOURCE tag at %L",
3026 &tmp->where) == FAILURE)
3032 gfc_error ("Redundant SOURCE tag found at %L ", &tmp->where);
3036 /* The next 2 conditionals check C631. */
3037 if (ts.type != BT_UNKNOWN)
3039 gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
3040 &tmp->where, &old_locus);
3046 gfc_error ("SOURCE tag at %L requires only a single entity in "
3047 "the allocation-list", &tmp->where);
3055 if (gfc_match_char (',') == MATCH_YES)
3056 goto alloc_opt_list;
3059 m = gfc_match (" mold = %e", &tmp);
3060 if (m == MATCH_ERROR)
3064 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: MOLD tag at %L",
3065 &tmp->where) == FAILURE)
3068 /* Check F08:C636. */
3071 gfc_error ("Redundant MOLD tag found at %L ", &tmp->where);
3075 /* Check F08:C637. */
3076 if (ts.type != BT_UNKNOWN)
3078 gfc_error ("MOLD tag at %L conflicts with the typespec at %L",
3079 &tmp->where, &old_locus);
3088 if (gfc_match_char (',') == MATCH_YES)
3089 goto alloc_opt_list;
3092 gfc_gobble_whitespace ();
3094 if (gfc_peek_char () == ')')
3099 if (gfc_match (" )%t") != MATCH_YES)
3102 /* Check F08:C637. */
3105 gfc_error ("MOLD tag at %L conflicts with SOURCE tag at %L",
3106 &mold->where, &source->where);
3110 new_st.op = EXEC_ALLOCATE;
3111 new_st.expr1 = stat;
3112 new_st.expr2 = errmsg;
3114 new_st.expr3 = source;
3116 new_st.expr3 = mold;
3117 new_st.ext.alloc.list = head;
3118 new_st.ext.alloc.ts = ts;
3123 gfc_syntax_error (ST_ALLOCATE);
3126 gfc_free_expr (errmsg);
3127 gfc_free_expr (source);
3128 gfc_free_expr (stat);
3129 gfc_free_expr (mold);
3130 if (tmp && tmp->expr_type) gfc_free_expr (tmp);
3131 gfc_free_alloc_list (head);
3136 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
3137 a set of pointer assignments to intrinsic NULL(). */
3140 gfc_match_nullify (void)
3148 if (gfc_match_char ('(') != MATCH_YES)
3153 m = gfc_match_variable (&p, 0);
3154 if (m == MATCH_ERROR)
3159 if (gfc_check_do_variable (p->symtree))
3162 /* build ' => NULL() '. */
3163 e = gfc_get_null_expr (&gfc_current_locus);
3165 /* Chain to list. */
3170 tail->next = gfc_get_code ();
3174 tail->op = EXEC_POINTER_ASSIGN;
3178 if (gfc_match (" )%t") == MATCH_YES)
3180 if (gfc_match_char (',') != MATCH_YES)
3187 gfc_syntax_error (ST_NULLIFY);
3190 gfc_free_statements (new_st.next);
3192 gfc_free_expr (new_st.expr1);
3193 new_st.expr1 = NULL;
3194 gfc_free_expr (new_st.expr2);
3195 new_st.expr2 = NULL;
3200 /* Match a DEALLOCATE statement. */
3203 gfc_match_deallocate (void)
3205 gfc_alloc *head, *tail;
3206 gfc_expr *stat, *errmsg, *tmp;
3209 bool saw_stat, saw_errmsg, b1, b2;
3212 stat = errmsg = tmp = NULL;
3213 saw_stat = saw_errmsg = false;
3215 if (gfc_match_char ('(') != MATCH_YES)
3221 head = tail = gfc_get_alloc ();
3224 tail->next = gfc_get_alloc ();
3228 m = gfc_match_variable (&tail->expr, 0);
3229 if (m == MATCH_ERROR)
3234 if (gfc_check_do_variable (tail->expr->symtree))
3237 sym = tail->expr->symtree->n.sym;
3239 if (gfc_pure (NULL) && gfc_impure_variable (sym))
3241 gfc_error ("Illegal allocate-object at %C for a PURE procedure");
3245 /* FIXME: disable the checking on derived types. */
3246 b1 = !(tail->expr->ref
3247 && (tail->expr->ref->type == REF_COMPONENT
3248 || tail->expr->ref->type == REF_ARRAY));
3249 if (sym && sym->ts.type == BT_CLASS)
3250 b2 = !(CLASS_DATA (sym)->attr.allocatable
3251 || CLASS_DATA (sym)->attr.class_pointer);
3253 b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
3254 || sym->attr.proc_pointer);
3257 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
3258 "or an allocatable variable");
3262 if (gfc_match_char (',') != MATCH_YES)
3267 m = gfc_match (" stat = %v", &tmp);
3268 if (m == MATCH_ERROR)
3274 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
3275 gfc_free_expr (tmp);
3282 if (gfc_check_do_variable (stat->symtree))
3285 if (gfc_match_char (',') == MATCH_YES)
3286 goto dealloc_opt_list;
3289 m = gfc_match (" errmsg = %v", &tmp);
3290 if (m == MATCH_ERROR)
3294 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
3295 &tmp->where) == FAILURE)
3300 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
3301 gfc_free_expr (tmp);
3308 if (gfc_match_char (',') == MATCH_YES)
3309 goto dealloc_opt_list;
3312 gfc_gobble_whitespace ();
3314 if (gfc_peek_char () == ')')
3318 if (gfc_match (" )%t") != MATCH_YES)
3321 new_st.op = EXEC_DEALLOCATE;
3322 new_st.expr1 = stat;
3323 new_st.expr2 = errmsg;
3324 new_st.ext.alloc.list = head;
3329 gfc_syntax_error (ST_DEALLOCATE);
3332 gfc_free_expr (errmsg);
3333 gfc_free_expr (stat);
3334 gfc_free_alloc_list (head);
3339 /* Match a RETURN statement. */
3342 gfc_match_return (void)
3346 gfc_compile_state s;
3350 if (gfc_find_state (COMP_CRITICAL) == SUCCESS)
3352 gfc_error ("Image control statement RETURN at %C in CRITICAL block");
3356 if (gfc_match_eos () == MATCH_YES)
3359 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
3361 gfc_error ("Alternate RETURN statement at %C is only allowed within "
3366 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Alternate RETURN "
3367 "at %C") == FAILURE)
3370 if (gfc_current_form == FORM_FREE)
3372 /* The following are valid, so we can't require a blank after the
3376 char c = gfc_peek_ascii_char ();
3377 if (ISALPHA (c) || ISDIGIT (c))
3381 m = gfc_match (" %e%t", &e);
3384 if (m == MATCH_ERROR)
3387 gfc_syntax_error (ST_RETURN);
3394 gfc_enclosing_unit (&s);
3395 if (s == COMP_PROGRAM
3396 && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
3397 "main program at %C") == FAILURE)
3400 new_st.op = EXEC_RETURN;
3407 /* Match the call of a type-bound procedure, if CALL%var has already been
3408 matched and var found to be a derived-type variable. */
3411 match_typebound_call (gfc_symtree* varst)
3416 base = gfc_get_expr ();
3417 base->expr_type = EXPR_VARIABLE;
3418 base->symtree = varst;
3419 base->where = gfc_current_locus;
3420 gfc_set_sym_referenced (varst->n.sym);
3422 m = gfc_match_varspec (base, 0, true, true);
3424 gfc_error ("Expected component reference at %C");
3428 if (gfc_match_eos () != MATCH_YES)
3430 gfc_error ("Junk after CALL at %C");
3434 if (base->expr_type == EXPR_COMPCALL)
3435 new_st.op = EXEC_COMPCALL;
3436 else if (base->expr_type == EXPR_PPC)
3437 new_st.op = EXEC_CALL_PPC;
3440 gfc_error ("Expected type-bound procedure or procedure pointer component "
3444 new_st.expr1 = base;
3450 /* Match a CALL statement. The tricky part here are possible
3451 alternate return specifiers. We handle these by having all
3452 "subroutines" actually return an integer via a register that gives
3453 the return number. If the call specifies alternate returns, we
3454 generate code for a SELECT statement whose case clauses contain
3455 GOTOs to the various labels. */
3458 gfc_match_call (void)
3460 char name[GFC_MAX_SYMBOL_LEN + 1];
3461 gfc_actual_arglist *a, *arglist;
3471 m = gfc_match ("% %n", name);
3477 if (gfc_get_ha_sym_tree (name, &st))
3482 /* If this is a variable of derived-type, it probably starts a type-bound
3484 if ((sym->attr.flavor != FL_PROCEDURE
3485 || gfc_is_function_return_value (sym, gfc_current_ns))
3486 && (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS))
3487 return match_typebound_call (st);
3489 /* If it does not seem to be callable (include functions so that the
3490 right association is made. They are thrown out in resolution.)
3492 if (!sym->attr.generic
3493 && !sym->attr.subroutine
3494 && !sym->attr.function)
3496 if (!(sym->attr.external && !sym->attr.referenced))
3498 /* ...create a symbol in this scope... */
3499 if (sym->ns != gfc_current_ns
3500 && gfc_get_sym_tree (name, NULL, &st, false) == 1)
3503 if (sym != st->n.sym)
3507 /* ...and then to try to make the symbol into a subroutine. */
3508 if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
3512 gfc_set_sym_referenced (sym);
3514 if (gfc_match_eos () != MATCH_YES)
3516 m = gfc_match_actual_arglist (1, &arglist);
3519 if (m == MATCH_ERROR)
3522 if (gfc_match_eos () != MATCH_YES)
3526 /* If any alternate return labels were found, construct a SELECT
3527 statement that will jump to the right place. */
3530 for (a = arglist; a; a = a->next)
3531 if (a->expr == NULL)
3536 gfc_symtree *select_st;
3537 gfc_symbol *select_sym;
3538 char name[GFC_MAX_SYMBOL_LEN + 1];
3540 new_st.next = c = gfc_get_code ();
3541 c->op = EXEC_SELECT;
3542 sprintf (name, "_result_%s", sym->name);
3543 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail. */
3545 select_sym = select_st->n.sym;
3546 select_sym->ts.type = BT_INTEGER;
3547 select_sym->ts.kind = gfc_default_integer_kind;
3548 gfc_set_sym_referenced (select_sym);
3549 c->expr1 = gfc_get_expr ();
3550 c->expr1->expr_type = EXPR_VARIABLE;
3551 c->expr1->symtree = select_st;
3552 c->expr1->ts = select_sym->ts;
3553 c->expr1->where = gfc_current_locus;
3556 for (a = arglist; a; a = a->next)
3558 if (a->expr != NULL)
3561 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
3566 c->block = gfc_get_code ();
3568 c->op = EXEC_SELECT;
3570 new_case = gfc_get_case ();
3571 new_case->high = gfc_get_int_expr (gfc_default_integer_kind, NULL, i);
3572 new_case->low = new_case->high;
3573 c->ext.case_list = new_case;
3575 c->next = gfc_get_code ();
3576 c->next->op = EXEC_GOTO;
3577 c->next->label1 = a->label;
3581 new_st.op = EXEC_CALL;
3582 new_st.symtree = st;
3583 new_st.ext.actual = arglist;
3588 gfc_syntax_error (ST_CALL);
3591 gfc_free_actual_arglist (arglist);
3596 /* Given a name, return a pointer to the common head structure,
3597 creating it if it does not exist. If FROM_MODULE is nonzero, we
3598 mangle the name so that it doesn't interfere with commons defined
3599 in the using namespace.
3600 TODO: Add to global symbol tree. */
3603 gfc_get_common (const char *name, int from_module)
3606 static int serial = 0;
3607 char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
3611 /* A use associated common block is only needed to correctly layout
3612 the variables it contains. */
3613 snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
3614 st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
3618 st = gfc_find_symtree (gfc_current_ns->common_root, name);
3621 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
3624 if (st->n.common == NULL)
3626 st->n.common = gfc_get_common_head ();
3627 st->n.common->where = gfc_current_locus;
3628 strcpy (st->n.common->name, name);
3631 return st->n.common;
3635 /* Match a common block name. */
3637 match match_common_name (char *name)
3641 if (gfc_match_char ('/') == MATCH_NO)
3647 if (gfc_match_char ('/') == MATCH_YES)
3653 m = gfc_match_name (name);
3655 if (m == MATCH_ERROR)
3657 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
3660 gfc_error ("Syntax error in common block name at %C");
3665 /* Match a COMMON statement. */
3668 gfc_match_common (void)
3670 gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
3671 char name[GFC_MAX_SYMBOL_LEN + 1];
3678 old_blank_common = gfc_current_ns->blank_common.head;
3679 if (old_blank_common)
3681 while (old_blank_common->common_next)
3682 old_blank_common = old_blank_common->common_next;
3689 m = match_common_name (name);
3690 if (m == MATCH_ERROR)
3693 gsym = gfc_get_gsymbol (name);
3694 if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
3696 gfc_error ("Symbol '%s' at %C is already an external symbol that "
3697 "is not COMMON", name);
3701 if (gsym->type == GSYM_UNKNOWN)
3703 gsym->type = GSYM_COMMON;
3704 gsym->where = gfc_current_locus;
3710 if (name[0] == '\0')
3712 t = &gfc_current_ns->blank_common;
3713 if (t->head == NULL)
3714 t->where = gfc_current_locus;
3718 t = gfc_get_common (name, 0);
3727 while (tail->common_next)
3728 tail = tail->common_next;
3731 /* Grab the list of symbols. */
3734 m = gfc_match_symbol (&sym, 0);
3735 if (m == MATCH_ERROR)
3740 /* Store a ref to the common block for error checking. */
3741 sym->common_block = t;
3743 /* See if we know the current common block is bind(c), and if
3744 so, then see if we can check if the symbol is (which it'll
3745 need to be). This can happen if the bind(c) attr stmt was
3746 applied to the common block, and the variable(s) already
3747 defined, before declaring the common block. */
3748 if (t->is_bind_c == 1)
3750 if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
3752 /* If we find an error, just print it and continue,
3753 cause it's just semantic, and we can see if there
3755 gfc_error_now ("Variable '%s' at %L in common block '%s' "
3756 "at %C must be declared with a C "
3757 "interoperable kind since common block "
3759 sym->name, &(sym->declared_at), t->name,
3763 if (sym->attr.is_bind_c == 1)
3764 gfc_error_now ("Variable '%s' in common block "
3765 "'%s' at %C can not be bind(c) since "
3766 "it is not global", sym->name, t->name);
3769 if (sym->attr.in_common)
3771 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
3776 if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
3777 || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
3779 if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
3780 "can only be COMMON in "
3781 "BLOCK DATA", sym->name)
3786 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
3790 tail->common_next = sym;
3796 /* Deal with an optional array specification after the
3798 m = gfc_match_array_spec (&as, true, true);
3799 if (m == MATCH_ERROR)
3804 if (as->type != AS_EXPLICIT)
3806 gfc_error ("Array specification for symbol '%s' in COMMON "
3807 "at %C must be explicit", sym->name);
3811 if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3814 if (sym->attr.pointer)
3816 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3817 "POINTER array", sym->name);
3826 sym->common_head = t;
3828 /* Check to see if the symbol is already in an equivalence group.
3829 If it is, set the other members as being in common. */
3830 if (sym->attr.in_equivalence)
3832 for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3834 for (e2 = e1; e2; e2 = e2->eq)
3835 if (e2->expr->symtree->n.sym == sym)
3842 for (e2 = e1; e2; e2 = e2->eq)
3844 other = e2->expr->symtree->n.sym;
3845 if (other->common_head
3846 && other->common_head != sym->common_head)
3848 gfc_error ("Symbol '%s', in COMMON block '%s' at "
3849 "%C is being indirectly equivalenced to "
3850 "another COMMON block '%s'",
3851 sym->name, sym->common_head->name,
3852 other->common_head->name);
3855 other->attr.in_common = 1;
3856 other->common_head = t;
3862 gfc_gobble_whitespace ();
3863 if (gfc_match_eos () == MATCH_YES)
3865 if (gfc_peek_ascii_char () == '/')
3867 if (gfc_match_char (',') != MATCH_YES)
3869 gfc_gobble_whitespace ();
3870 if (gfc_peek_ascii_char () == '/')
3879 gfc_syntax_error (ST_COMMON);
3882 if (old_blank_common)
3883 old_blank_common->common_next = NULL;
3885 gfc_current_ns->blank_common.head = NULL;
3886 gfc_free_array_spec (as);
3891 /* Match a BLOCK DATA program unit. */
3894 gfc_match_block_data (void)
3896 char name[GFC_MAX_SYMBOL_LEN + 1];
3900 if (gfc_match_eos () == MATCH_YES)
3902 gfc_new_block = NULL;
3906 m = gfc_match ("% %n%t", name);
3910 if (gfc_get_symbol (name, NULL, &sym))
3913 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3916 gfc_new_block = sym;
3922 /* Free a namelist structure. */
3925 gfc_free_namelist (gfc_namelist *name)
3929 for (; name; name = n)
3937 /* Match a NAMELIST statement. */
3940 gfc_match_namelist (void)
3942 gfc_symbol *group_name, *sym;
3946 m = gfc_match (" / %s /", &group_name);
3949 if (m == MATCH_ERROR)
3954 if (group_name->ts.type != BT_UNKNOWN)
3956 gfc_error ("Namelist group name '%s' at %C already has a basic "
3957 "type of %s", group_name->name,
3958 gfc_typename (&group_name->ts));
3962 if (group_name->attr.flavor == FL_NAMELIST
3963 && group_name->attr.use_assoc
3964 && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3965 "at %C already is USE associated and can"
3966 "not be respecified.", group_name->name)
3970 if (group_name->attr.flavor != FL_NAMELIST
3971 && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3972 group_name->name, NULL) == FAILURE)
3977 m = gfc_match_symbol (&sym, 1);
3980 if (m == MATCH_ERROR)
3983 if (sym->attr.in_namelist == 0
3984 && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3987 /* Use gfc_error_check here, rather than goto error, so that
3988 these are the only errors for the next two lines. */
3989 if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3991 gfc_error ("Assumed size array '%s' in namelist '%s' at "
3992 "%C is not allowed", sym->name, group_name->name);
3996 if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl->length == NULL)
3998 gfc_error ("Assumed character length '%s' in namelist '%s' at "
3999 "%C is not allowed", sym->name, group_name->name);
4003 nl = gfc_get_namelist ();
4007 if (group_name->namelist == NULL)
4008 group_name->namelist = group_name->namelist_tail = nl;
4011 group_name->namelist_tail->next = nl;
4012 group_name->namelist_tail = nl;
4015 if (gfc_match_eos () == MATCH_YES)
4018 m = gfc_match_char (',');
4020 if (gfc_match_char ('/') == MATCH_YES)
4022 m2 = gfc_match (" %s /", &group_name);
4023 if (m2 == MATCH_YES)
4025 if (m2 == MATCH_ERROR)
4039 gfc_syntax_error (ST_NAMELIST);
4046 /* Match a MODULE statement. */
4049 gfc_match_module (void)
4053 m = gfc_match (" %s%t", &gfc_new_block);
4057 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
4058 gfc_new_block->name, NULL) == FAILURE)
4065 /* Free equivalence sets and lists. Recursively is the easiest way to
4069 gfc_free_equiv_until (gfc_equiv *eq, gfc_equiv *stop)
4074 gfc_free_equiv (eq->eq);
4075 gfc_free_equiv_until (eq->next, stop);
4076 gfc_free_expr (eq->expr);
4082 gfc_free_equiv (gfc_equiv *eq)
4084 gfc_free_equiv_until (eq, NULL);
4088 /* Match an EQUIVALENCE statement. */
4091 gfc_match_equivalence (void)
4093 gfc_equiv *eq, *set, *tail;
4097 gfc_common_head *common_head = NULL;
4105 eq = gfc_get_equiv ();
4109 eq->next = gfc_current_ns->equiv;
4110 gfc_current_ns->equiv = eq;
4112 if (gfc_match_char ('(') != MATCH_YES)
4116 common_flag = FALSE;
4121 m = gfc_match_equiv_variable (&set->expr);
4122 if (m == MATCH_ERROR)
4127 /* count the number of objects. */
4130 if (gfc_match_char ('%') == MATCH_YES)
4132 gfc_error ("Derived type component %C is not a "
4133 "permitted EQUIVALENCE member");
4137 for (ref = set->expr->ref; ref; ref = ref->next)
4138 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
4140 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
4141 "be an array section");
4145 sym = set->expr->symtree->n.sym;
4147 if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
4150 if (sym->attr.in_common)
4153 common_head = sym->common_head;
4156 if (gfc_match_char (')') == MATCH_YES)
4159 if (gfc_match_char (',') != MATCH_YES)
4162 set->eq = gfc_get_equiv ();
4168 gfc_error ("EQUIVALENCE at %C requires two or more objects");
4172 /* If one of the members of an equivalence is in common, then
4173 mark them all as being in common. Before doing this, check
4174 that members of the equivalence group are not in different
4177 for (set = eq; set; set = set->eq)
4179 sym = set->expr->symtree->n.sym;
4180 if (sym->common_head && sym->common_head != common_head)
4182 gfc_error ("Attempt to indirectly overlap COMMON "
4183 "blocks %s and %s by EQUIVALENCE at %C",
4184 sym->common_head->name, common_head->name);
4187 sym->attr.in_common = 1;
4188 sym->common_head = common_head;
4191 if (gfc_match_eos () == MATCH_YES)
4193 if (gfc_match_char (',') != MATCH_YES)
4195 gfc_error ("Expecting a comma in EQUIVALENCE at %C");
4203 gfc_syntax_error (ST_EQUIVALENCE);
4209 gfc_free_equiv (gfc_current_ns->equiv);
4210 gfc_current_ns->equiv = eq;
4216 /* Check that a statement function is not recursive. This is done by looking
4217 for the statement function symbol(sym) by looking recursively through its
4218 expression(e). If a reference to sym is found, true is returned.
4219 12.5.4 requires that any variable of function that is implicitly typed
4220 shall have that type confirmed by any subsequent type declaration. The
4221 implicit typing is conveniently done here. */
4223 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
4226 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
4232 switch (e->expr_type)
4235 if (e->symtree == NULL)
4238 /* Check the name before testing for nested recursion! */
4239 if (sym->name == e->symtree->n.sym->name)
4242 /* Catch recursion via other statement functions. */
4243 if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
4244 && e->symtree->n.sym->value
4245 && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
4248 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
4249 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
4254 if (e->symtree && sym->name == e->symtree->n.sym->name)
4257 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
4258 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
4270 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
4272 return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
4276 /* Match a statement function declaration. It is so easy to match
4277 non-statement function statements with a MATCH_ERROR as opposed to
4278 MATCH_NO that we suppress error message in most cases. */
4281 gfc_match_st_function (void)
4283 gfc_error_buf old_error;
4288 m = gfc_match_symbol (&sym, 0);
4292 gfc_push_error (&old_error);
4294 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
4295 sym->name, NULL) == FAILURE)
4298 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
4301 m = gfc_match (" = %e%t", &expr);
4305 gfc_free_error (&old_error);
4306 if (m == MATCH_ERROR)
4309 if (recursive_stmt_fcn (expr, sym))
4311 gfc_error ("Statement function at %L is recursive", &expr->where);
4317 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
4318 "Statement function at %C") == FAILURE)
4324 gfc_pop_error (&old_error);
4329 /***************** SELECT CASE subroutines ******************/
4331 /* Free a single case structure. */
4334 free_case (gfc_case *p)
4336 if (p->low == p->high)
4338 gfc_free_expr (p->low);
4339 gfc_free_expr (p->high);
4344 /* Free a list of case structures. */
4347 gfc_free_case_list (gfc_case *p)
4359 /* Match a single case selector. */
4362 match_case_selector (gfc_case **cp)
4367 c = gfc_get_case ();
4368 c->where = gfc_current_locus;
4370 if (gfc_match_char (':') == MATCH_YES)
4372 m = gfc_match_init_expr (&c->high);
4375 if (m == MATCH_ERROR)
4380 m = gfc_match_init_expr (&c->low);
4381 if (m == MATCH_ERROR)
4386 /* If we're not looking at a ':' now, make a range out of a single
4387 target. Else get the upper bound for the case range. */
4388 if (gfc_match_char (':') != MATCH_YES)
4392 m = gfc_match_init_expr (&c->high);
4393 if (m == MATCH_ERROR)
4395 /* MATCH_NO is fine. It's OK if nothing is there! */
4403 gfc_error ("Expected initialization expression in CASE at %C");
4411 /* Match the end of a case statement. */
4414 match_case_eos (void)
4416 char name[GFC_MAX_SYMBOL_LEN + 1];
4419 if (gfc_match_eos () == MATCH_YES)
4422 /* If the case construct doesn't have a case-construct-name, we
4423 should have matched the EOS. */
4424 if (!gfc_current_block ())
4427 gfc_gobble_whitespace ();
4429 m = gfc_match_name (name);
4433 if (strcmp (name, gfc_current_block ()->name) != 0)
4435 gfc_error ("Expected block name '%s' of SELECT construct at %C",
4436 gfc_current_block ()->name);
4440 return gfc_match_eos ();
4444 /* Match a SELECT statement. */
4447 gfc_match_select (void)
4452 m = gfc_match_label ();
4453 if (m == MATCH_ERROR)
4456 m = gfc_match (" select case ( %e )%t", &expr);
4460 new_st.op = EXEC_SELECT;
4461 new_st.expr1 = expr;
4467 /* Push the current selector onto the SELECT TYPE stack. */
4470 select_type_push (gfc_symbol *sel)
4472 gfc_select_type_stack *top = gfc_get_select_type_stack ();
4473 top->selector = sel;
4475 top->prev = select_type_stack;
4477 select_type_stack = top;
4481 /* Set the temporary for the current SELECT TYPE selector. */
4484 select_type_set_tmp (gfc_typespec *ts)
4486 char name[GFC_MAX_SYMBOL_LEN];
4491 select_type_stack->tmp = NULL;
4495 if (!gfc_type_is_extensible (ts->u.derived))
4498 if (ts->type == BT_CLASS)
4499 sprintf (name, "tmp$class$%s", ts->u.derived->name);
4501 sprintf (name, "tmp$type$%s", ts->u.derived->name);
4502 gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
4503 gfc_add_type (tmp->n.sym, ts, NULL);
4504 gfc_set_sym_referenced (tmp->n.sym);
4505 gfc_add_pointer (&tmp->n.sym->attr, NULL);
4506 gfc_add_flavor (&tmp->n.sym->attr, FL_VARIABLE, name, NULL);
4507 if (ts->type == BT_CLASS)
4509 gfc_build_class_symbol (&tmp->n.sym->ts, &tmp->n.sym->attr,
4510 &tmp->n.sym->as, false);
4511 tmp->n.sym->attr.class_ok = 1;
4513 tmp->n.sym->attr.select_type_temporary = 1;
4515 /* Add an association for it, so the rest of the parser knows it is
4516 an associate-name. The target will be set during resolution. */
4517 tmp->n.sym->assoc = gfc_get_association_list ();
4518 tmp->n.sym->assoc->dangling = 1;
4519 tmp->n.sym->assoc->st = tmp;
4521 select_type_stack->tmp = tmp;
4525 /* Match a SELECT TYPE statement. */
4528 gfc_match_select_type (void)
4530 gfc_expr *expr1, *expr2 = NULL;
4532 char name[GFC_MAX_SYMBOL_LEN];
4534 m = gfc_match_label ();
4535 if (m == MATCH_ERROR)
4538 m = gfc_match (" select type ( ");
4542 gfc_current_ns = gfc_build_block_ns (gfc_current_ns);
4544 m = gfc_match (" %n => %e", name, &expr2);
4547 expr1 = gfc_get_expr();
4548 expr1->expr_type = EXPR_VARIABLE;
4549 if (gfc_get_sym_tree (name, NULL, &expr1->symtree, false))
4554 if (expr2->ts.type == BT_UNKNOWN)
4555 expr1->symtree->n.sym->attr.untyped = 1;
4557 expr1->symtree->n.sym->ts = expr2->ts;
4558 expr1->symtree->n.sym->attr.flavor = FL_VARIABLE;
4559 expr1->symtree->n.sym->attr.referenced = 1;
4560 expr1->symtree->n.sym->attr.class_ok = 1;
4564 m = gfc_match (" %e ", &expr1);
4569 m = gfc_match (" )%t");
4573 /* Check for F03:C811. */
4574 if (!expr2 && (expr1->expr_type != EXPR_VARIABLE || expr1->ref != NULL))
4576 gfc_error ("Selector in SELECT TYPE at %C is not a named variable; "
4577 "use associate-name=>");
4582 new_st.op = EXEC_SELECT_TYPE;
4583 new_st.expr1 = expr1;
4584 new_st.expr2 = expr2;
4585 new_st.ext.block.ns = gfc_current_ns;
4587 select_type_push (expr1->symtree->n.sym);
4592 gfc_current_ns = gfc_current_ns->parent;
4597 /* Match a CASE statement. */
4600 gfc_match_case (void)
4602 gfc_case *c, *head, *tail;
4607 if (gfc_current_state () != COMP_SELECT)
4609 gfc_error ("Unexpected CASE statement at %C");
4613 if (gfc_match ("% default") == MATCH_YES)
4615 m = match_case_eos ();
4618 if (m == MATCH_ERROR)
4621 new_st.op = EXEC_SELECT;
4622 c = gfc_get_case ();
4623 c->where = gfc_current_locus;
4624 new_st.ext.case_list = c;
4628 if (gfc_match_char ('(') != MATCH_YES)
4633 if (match_case_selector (&c) == MATCH_ERROR)
4643 if (gfc_match_char (')') == MATCH_YES)
4645 if (gfc_match_char (',') != MATCH_YES)
4649 m = match_case_eos ();
4652 if (m == MATCH_ERROR)
4655 new_st.op = EXEC_SELECT;
4656 new_st.ext.case_list = head;
4661 gfc_error ("Syntax error in CASE specification at %C");
4664 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
4669 /* Match a TYPE IS statement. */
4672 gfc_match_type_is (void)
4677 if (gfc_current_state () != COMP_SELECT_TYPE)
4679 gfc_error ("Unexpected TYPE IS statement at %C");
4683 if (gfc_match_char ('(') != MATCH_YES)
4686 c = gfc_get_case ();
4687 c->where = gfc_current_locus;
4689 /* TODO: Once unlimited polymorphism is implemented, we will need to call
4690 match_type_spec here. */
4691 if (match_derived_type_spec (&c->ts) == MATCH_ERROR)
4694 if (gfc_match_char (')') != MATCH_YES)
4697 m = match_case_eos ();
4700 if (m == MATCH_ERROR)
4703 new_st.op = EXEC_SELECT_TYPE;
4704 new_st.ext.case_list = c;
4706 /* Create temporary variable. */
4707 select_type_set_tmp (&c->ts);
4712 gfc_error ("Syntax error in TYPE IS specification at %C");
4716 gfc_free_case_list (c); /* new_st is cleaned up in parse.c. */
4721 /* Match a CLASS IS or CLASS DEFAULT statement. */
4724 gfc_match_class_is (void)
4729 if (gfc_current_state () != COMP_SELECT_TYPE)
4732 if (gfc_match ("% default") == MATCH_YES)
4734 m = match_case_eos ();
4737 if (m == MATCH_ERROR)
4740 new_st.op = EXEC_SELECT_TYPE;
4741 c = gfc_get_case ();
4742 c->where = gfc_current_locus;
4743 c->ts.type = BT_UNKNOWN;
4744 new_st.ext.case_list = c;
4745 select_type_set_tmp (NULL);
4749 m = gfc_match ("% is");
4752 if (m == MATCH_ERROR)
4755 if (gfc_match_char ('(') != MATCH_YES)
4758 c = gfc_get_case ();
4759 c->where = gfc_current_locus;
4761 if (match_derived_type_spec (&c->ts) == MATCH_ERROR)
4764 if (c->ts.type == BT_DERIVED)
4765 c->ts.type = BT_CLASS;
4767 if (gfc_match_char (')') != MATCH_YES)
4770 m = match_case_eos ();
4773 if (m == MATCH_ERROR)
4776 new_st.op = EXEC_SELECT_TYPE;
4777 new_st.ext.case_list = c;
4779 /* Create temporary variable. */
4780 select_type_set_tmp (&c->ts);
4785 gfc_error ("Syntax error in CLASS IS specification at %C");
4789 gfc_free_case_list (c); /* new_st is cleaned up in parse.c. */
4794 /********************* WHERE subroutines ********************/
4796 /* Match the rest of a simple WHERE statement that follows an IF statement.
4800 match_simple_where (void)
4806 m = gfc_match (" ( %e )", &expr);
4810 m = gfc_match_assignment ();
4813 if (m == MATCH_ERROR)
4816 if (gfc_match_eos () != MATCH_YES)
4819 c = gfc_get_code ();
4823 c->next = gfc_get_code ();
4826 gfc_clear_new_st ();
4828 new_st.op = EXEC_WHERE;
4834 gfc_syntax_error (ST_WHERE);
4837 gfc_free_expr (expr);
4842 /* Match a WHERE statement. */
4845 gfc_match_where (gfc_statement *st)
4851 m0 = gfc_match_label ();
4852 if (m0 == MATCH_ERROR)
4855 m = gfc_match (" where ( %e )", &expr);
4859 if (gfc_match_eos () == MATCH_YES)
4861 *st = ST_WHERE_BLOCK;
4862 new_st.op = EXEC_WHERE;
4863 new_st.expr1 = expr;
4867 m = gfc_match_assignment ();
4869 gfc_syntax_error (ST_WHERE);
4873 gfc_free_expr (expr);
4877 /* We've got a simple WHERE statement. */
4879 c = gfc_get_code ();
4883 c->next = gfc_get_code ();
4886 gfc_clear_new_st ();
4888 new_st.op = EXEC_WHERE;
4895 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
4896 new_st if successful. */
4899 gfc_match_elsewhere (void)
4901 char name[GFC_MAX_SYMBOL_LEN + 1];
4905 if (gfc_current_state () != COMP_WHERE)
4907 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
4913 if (gfc_match_char ('(') == MATCH_YES)
4915 m = gfc_match_expr (&expr);
4918 if (m == MATCH_ERROR)
4921 if (gfc_match_char (')') != MATCH_YES)
4925 if (gfc_match_eos () != MATCH_YES)
4927 /* Only makes sense if we have a where-construct-name. */
4928 if (!gfc_current_block ())
4933 /* Better be a name at this point. */
4934 m = gfc_match_name (name);
4937 if (m == MATCH_ERROR)
4940 if (gfc_match_eos () != MATCH_YES)
4943 if (strcmp (name, gfc_current_block ()->name) != 0)
4945 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
4946 name, gfc_current_block ()->name);
4951 new_st.op = EXEC_WHERE;
4952 new_st.expr1 = expr;
4956 gfc_syntax_error (ST_ELSEWHERE);
4959 gfc_free_expr (expr);
4964 /******************** FORALL subroutines ********************/
4966 /* Free a list of FORALL iterators. */
4969 gfc_free_forall_iterator (gfc_forall_iterator *iter)
4971 gfc_forall_iterator *next;
4976 gfc_free_expr (iter->var);
4977 gfc_free_expr (iter->start);
4978 gfc_free_expr (iter->end);
4979 gfc_free_expr (iter->stride);
4986 /* Match an iterator as part of a FORALL statement. The format is:
4988 <var> = <start>:<end>[:<stride>]
4990 On MATCH_NO, the caller tests for the possibility that there is a
4991 scalar mask expression. */
4994 match_forall_iterator (gfc_forall_iterator **result)
4996 gfc_forall_iterator *iter;
5000 where = gfc_current_locus;
5001 iter = XCNEW (gfc_forall_iterator);
5003 m = gfc_match_expr (&iter->var);
5007 if (gfc_match_char ('=') != MATCH_YES
5008 || iter->var->expr_type != EXPR_VARIABLE)
5014 m = gfc_match_expr (&iter->start);
5018 if (gfc_match_char (':') != MATCH_YES)
5021 m = gfc_match_expr (&iter->end);
5024 if (m == MATCH_ERROR)
5027 if (gfc_match_char (':') == MATCH_NO)
5028 iter->stride = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
5031 m = gfc_match_expr (&iter->stride);
5034 if (m == MATCH_ERROR)
5038 /* Mark the iteration variable's symbol as used as a FORALL index. */
5039 iter->var->symtree->n.sym->forall_index = true;
5045 gfc_error ("Syntax error in FORALL iterator at %C");
5050 gfc_current_locus = where;
5051 gfc_free_forall_iterator (iter);
5056 /* Match the header of a FORALL statement. */
5059 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
5061 gfc_forall_iterator *head, *tail, *new_iter;
5065 gfc_gobble_whitespace ();
5070 if (gfc_match_char ('(') != MATCH_YES)
5073 m = match_forall_iterator (&new_iter);
5074 if (m == MATCH_ERROR)
5079 head = tail = new_iter;
5083 if (gfc_match_char (',') != MATCH_YES)
5086 m = match_forall_iterator (&new_iter);
5087 if (m == MATCH_ERROR)
5092 tail->next = new_iter;
5097 /* Have to have a mask expression. */
5099 m = gfc_match_expr (&msk);
5102 if (m == MATCH_ERROR)
5108 if (gfc_match_char (')') == MATCH_NO)
5116 gfc_syntax_error (ST_FORALL);
5119 gfc_free_expr (msk);
5120 gfc_free_forall_iterator (head);
5125 /* Match the rest of a simple FORALL statement that follows an
5129 match_simple_forall (void)
5131 gfc_forall_iterator *head;
5140 m = match_forall_header (&head, &mask);
5147 m = gfc_match_assignment ();
5149 if (m == MATCH_ERROR)
5153 m = gfc_match_pointer_assignment ();
5154 if (m == MATCH_ERROR)
5160 c = gfc_get_code ();
5162 c->loc = gfc_current_locus;
5164 if (gfc_match_eos () != MATCH_YES)
5167 gfc_clear_new_st ();
5168 new_st.op = EXEC_FORALL;
5169 new_st.expr1 = mask;
5170 new_st.ext.forall_iterator = head;
5171 new_st.block = gfc_get_code ();
5173 new_st.block->op = EXEC_FORALL;
5174 new_st.block->next = c;
5179 gfc_syntax_error (ST_FORALL);
5182 gfc_free_forall_iterator (head);
5183 gfc_free_expr (mask);
5189 /* Match a FORALL statement. */
5192 gfc_match_forall (gfc_statement *st)
5194 gfc_forall_iterator *head;
5203 m0 = gfc_match_label ();
5204 if (m0 == MATCH_ERROR)
5207 m = gfc_match (" forall");
5211 m = match_forall_header (&head, &mask);
5212 if (m == MATCH_ERROR)
5217 if (gfc_match_eos () == MATCH_YES)
5219 *st = ST_FORALL_BLOCK;
5220 new_st.op = EXEC_FORALL;
5221 new_st.expr1 = mask;
5222 new_st.ext.forall_iterator = head;
5226 m = gfc_match_assignment ();
5227 if (m == MATCH_ERROR)
5231 m = gfc_match_pointer_assignment ();
5232 if (m == MATCH_ERROR)
5238 c = gfc_get_code ();
5240 c->loc = gfc_current_locus;
5242 gfc_clear_new_st ();
5243 new_st.op = EXEC_FORALL;
5244 new_st.expr1 = mask;
5245 new_st.ext.forall_iterator = head;
5246 new_st.block = gfc_get_code ();
5247 new_st.block->op = EXEC_FORALL;
5248 new_st.block->next = c;
5254 gfc_syntax_error (ST_FORALL);
5257 gfc_free_forall_iterator (head);
5258 gfc_free_expr (mask);
5259 gfc_free_statements (c);