1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
29 int gfc_matching_procptr_assignment = 0;
30 bool gfc_matching_prefix = false;
32 /* For debugging and diagnostic purposes. Return the textual representation
33 of the intrinsic operator OP. */
35 gfc_op2string (gfc_intrinsic_op op)
43 case INTRINSIC_UMINUS:
49 case INTRINSIC_CONCAT:
53 case INTRINSIC_DIVIDE:
92 case INTRINSIC_ASSIGN:
95 case INTRINSIC_PARENTHESES:
102 gfc_internal_error ("gfc_op2string(): Bad code");
107 /******************** Generic matching subroutines ************************/
109 /* This function scans the current statement counting the opened and closed
110 parenthesis to make sure they are balanced. */
113 gfc_match_parens (void)
115 locus old_loc, where;
119 old_loc = gfc_current_locus;
126 c = gfc_next_char_literal (instring);
129 if (quote == ' ' && ((c == '\'') || (c == '"')))
135 if (quote != ' ' && c == quote)
142 if (c == '(' && quote == ' ')
145 where = gfc_current_locus;
147 if (c == ')' && quote == ' ')
150 where = gfc_current_locus;
154 gfc_current_locus = old_loc;
158 gfc_error ("Missing ')' in statement at or before %L", &where);
163 gfc_error ("Missing '(' in statement at or before %L", &where);
171 /* See if the next character is a special character that has
172 escaped by a \ via the -fbackslash option. */
175 gfc_match_special_char (gfc_char_t *res)
183 switch ((c = gfc_next_char_literal (1)))
216 /* Hexadecimal form of wide characters. */
217 len = (c == 'x' ? 2 : (c == 'u' ? 4 : 8));
219 for (i = 0; i < len; i++)
221 char buf[2] = { '\0', '\0' };
223 c = gfc_next_char_literal (1);
224 if (!gfc_wide_fits_in_byte (c)
225 || !gfc_check_digit ((unsigned char) c, 16))
228 buf[0] = (unsigned char) c;
230 n += strtol (buf, NULL, 16);
236 /* Unknown backslash codes are simply not expanded. */
245 /* In free form, match at least one space. Always matches in fixed
249 gfc_match_space (void)
254 if (gfc_current_form == FORM_FIXED)
257 old_loc = gfc_current_locus;
259 c = gfc_next_ascii_char ();
260 if (!gfc_is_whitespace (c))
262 gfc_current_locus = old_loc;
266 gfc_gobble_whitespace ();
272 /* Match an end of statement. End of statement is optional
273 whitespace, followed by a ';' or '\n' or comment '!'. If a
274 semicolon is found, we continue to eat whitespace and semicolons. */
287 old_loc = gfc_current_locus;
288 gfc_gobble_whitespace ();
290 c = gfc_next_ascii_char ();
296 c = gfc_next_ascii_char ();
313 gfc_current_locus = old_loc;
314 return (flag) ? MATCH_YES : MATCH_NO;
318 /* Match a literal integer on the input, setting the value on
319 MATCH_YES. Literal ints occur in kind-parameters as well as
320 old-style character length specifications. If cnt is non-NULL it
321 will be set to the number of digits. */
324 gfc_match_small_literal_int (int *value, int *cnt)
330 old_loc = gfc_current_locus;
333 gfc_gobble_whitespace ();
334 c = gfc_next_ascii_char ();
340 gfc_current_locus = old_loc;
349 old_loc = gfc_current_locus;
350 c = gfc_next_ascii_char ();
355 i = 10 * i + c - '0';
360 gfc_error ("Integer too large at %C");
365 gfc_current_locus = old_loc;
374 /* Match a small, constant integer expression, like in a kind
375 statement. On MATCH_YES, 'value' is set. */
378 gfc_match_small_int (int *value)
385 m = gfc_match_expr (&expr);
389 p = gfc_extract_int (expr, &i);
390 gfc_free_expr (expr);
403 /* This function is the same as the gfc_match_small_int, except that
404 we're keeping the pointer to the expr. This function could just be
405 removed and the previously mentioned one modified, though all calls
406 to it would have to be modified then (and there were a number of
407 them). Return MATCH_ERROR if fail to extract the int; otherwise,
408 return the result of gfc_match_expr(). The expr (if any) that was
409 matched is returned in the parameter expr. */
412 gfc_match_small_int_expr (int *value, gfc_expr **expr)
418 m = gfc_match_expr (expr);
422 p = gfc_extract_int (*expr, &i);
435 /* Matches a statement label. Uses gfc_match_small_literal_int() to
436 do most of the work. */
439 gfc_match_st_label (gfc_st_label **label)
445 old_loc = gfc_current_locus;
447 m = gfc_match_small_literal_int (&i, &cnt);
453 gfc_error ("Too many digits in statement label at %C");
459 gfc_error ("Statement label at %C is zero");
463 *label = gfc_get_st_label (i);
468 gfc_current_locus = old_loc;
473 /* Match and validate a label associated with a named IF, DO or SELECT
474 statement. If the symbol does not have the label attribute, we add
475 it. We also make sure the symbol does not refer to another
476 (active) block. A matched label is pointed to by gfc_new_block. */
479 gfc_match_label (void)
481 char name[GFC_MAX_SYMBOL_LEN + 1];
484 gfc_new_block = NULL;
486 m = gfc_match (" %n :", name);
490 if (gfc_get_symbol (name, NULL, &gfc_new_block))
492 gfc_error ("Label name '%s' at %C is ambiguous", name);
496 if (gfc_new_block->attr.flavor == FL_LABEL)
498 gfc_error ("Duplicate construct label '%s' at %C", name);
502 if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
503 gfc_new_block->name, NULL) == FAILURE)
510 /* See if the current input looks like a name of some sort. Modifies
511 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
512 Note that options.c restricts max_identifier_length to not more
513 than GFC_MAX_SYMBOL_LEN. */
516 gfc_match_name (char *buffer)
522 old_loc = gfc_current_locus;
523 gfc_gobble_whitespace ();
525 c = gfc_next_ascii_char ();
526 if (!(ISALPHA (c) || (c == '_' && gfc_option.flag_allow_leading_underscore)))
528 if (gfc_error_flag_test() == 0 && c != '(')
529 gfc_error ("Invalid character in name at %C");
530 gfc_current_locus = old_loc;
540 if (i > gfc_option.max_identifier_length)
542 gfc_error ("Name at %C is too long");
546 old_loc = gfc_current_locus;
547 c = gfc_next_ascii_char ();
549 while (ISALNUM (c) || c == '_' || (gfc_option.flag_dollar_ok && c == '$'));
551 if (c == '$' && !gfc_option.flag_dollar_ok)
553 gfc_error ("Invalid character '$' at %C. Use -fdollar-ok to allow it "
559 gfc_current_locus = old_loc;
565 /* Match a valid name for C, which is almost the same as for Fortran,
566 except that you can start with an underscore, etc.. It could have
567 been done by modifying the gfc_match_name, but this way other
568 things C allows can be added, such as no limits on the length.
569 Right now, the length is limited to the same thing as Fortran..
570 Also, by rewriting it, we use the gfc_next_char_C() to prevent the
571 input characters from being automatically lower cased, since C is
572 case sensitive. The parameter, buffer, is used to return the name
573 that is matched. Return MATCH_ERROR if the name is too long
574 (though this is a self-imposed limit), MATCH_NO if what we're
575 seeing isn't a name, and MATCH_YES if we successfully match a C
579 gfc_match_name_C (char *buffer)
585 old_loc = gfc_current_locus;
586 gfc_gobble_whitespace ();
588 /* Get the next char (first possible char of name) and see if
589 it's valid for C (either a letter or an underscore). */
590 c = gfc_next_char_literal (1);
592 /* If the user put nothing expect spaces between the quotes, it is valid
593 and simply means there is no name= specifier and the name is the fortran
594 symbol name, all lowercase. */
595 if (c == '"' || c == '\'')
598 gfc_current_locus = old_loc;
602 if (!ISALPHA (c) && c != '_')
604 gfc_error ("Invalid C name in NAME= specifier at %C");
608 /* Continue to read valid variable name characters. */
611 gcc_assert (gfc_wide_fits_in_byte (c));
613 buffer[i++] = (unsigned char) c;
615 /* C does not define a maximum length of variable names, to my
616 knowledge, but the compiler typically places a limit on them.
617 For now, i'll use the same as the fortran limit for simplicity,
618 but this may need to be changed to a dynamic buffer that can
619 be realloc'ed here if necessary, or more likely, a larger
621 if (i > gfc_option.max_identifier_length)
623 gfc_error ("Name at %C is too long");
627 old_loc = gfc_current_locus;
629 /* Get next char; param means we're in a string. */
630 c = gfc_next_char_literal (1);
631 } while (ISALNUM (c) || c == '_');
634 gfc_current_locus = old_loc;
636 /* See if we stopped because of whitespace. */
639 gfc_gobble_whitespace ();
640 c = gfc_peek_ascii_char ();
641 if (c != '"' && c != '\'')
643 gfc_error ("Embedded space in NAME= specifier at %C");
648 /* If we stopped because we had an invalid character for a C name, report
649 that to the user by returning MATCH_NO. */
650 if (c != '"' && c != '\'')
652 gfc_error ("Invalid C name in NAME= specifier at %C");
660 /* Match a symbol on the input. Modifies the pointer to the symbol
661 pointer if successful. */
664 gfc_match_sym_tree (gfc_symtree **matched_symbol, int host_assoc)
666 char buffer[GFC_MAX_SYMBOL_LEN + 1];
669 m = gfc_match_name (buffer);
674 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
675 ? MATCH_ERROR : MATCH_YES;
677 if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
685 gfc_match_symbol (gfc_symbol **matched_symbol, int host_assoc)
690 m = gfc_match_sym_tree (&st, host_assoc);
695 *matched_symbol = st->n.sym;
697 *matched_symbol = NULL;
700 *matched_symbol = NULL;
705 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
706 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
710 gfc_match_intrinsic_op (gfc_intrinsic_op *result)
712 locus orig_loc = gfc_current_locus;
715 gfc_gobble_whitespace ();
716 ch = gfc_next_ascii_char ();
721 *result = INTRINSIC_PLUS;
726 *result = INTRINSIC_MINUS;
730 if (gfc_next_ascii_char () == '=')
733 *result = INTRINSIC_EQ;
739 if (gfc_peek_ascii_char () == '=')
742 gfc_next_ascii_char ();
743 *result = INTRINSIC_LE;
747 *result = INTRINSIC_LT;
751 if (gfc_peek_ascii_char () == '=')
754 gfc_next_ascii_char ();
755 *result = INTRINSIC_GE;
759 *result = INTRINSIC_GT;
763 if (gfc_peek_ascii_char () == '*')
766 gfc_next_ascii_char ();
767 *result = INTRINSIC_POWER;
771 *result = INTRINSIC_TIMES;
775 ch = gfc_peek_ascii_char ();
779 gfc_next_ascii_char ();
780 *result = INTRINSIC_NE;
786 gfc_next_ascii_char ();
787 *result = INTRINSIC_CONCAT;
791 *result = INTRINSIC_DIVIDE;
795 ch = gfc_next_ascii_char ();
799 if (gfc_next_ascii_char () == 'n'
800 && gfc_next_ascii_char () == 'd'
801 && gfc_next_ascii_char () == '.')
803 /* Matched ".and.". */
804 *result = INTRINSIC_AND;
810 if (gfc_next_ascii_char () == 'q')
812 ch = gfc_next_ascii_char ();
815 /* Matched ".eq.". */
816 *result = INTRINSIC_EQ_OS;
821 if (gfc_next_ascii_char () == '.')
823 /* Matched ".eqv.". */
824 *result = INTRINSIC_EQV;
832 ch = gfc_next_ascii_char ();
835 if (gfc_next_ascii_char () == '.')
837 /* Matched ".ge.". */
838 *result = INTRINSIC_GE_OS;
844 if (gfc_next_ascii_char () == '.')
846 /* Matched ".gt.". */
847 *result = INTRINSIC_GT_OS;
854 ch = gfc_next_ascii_char ();
857 if (gfc_next_ascii_char () == '.')
859 /* Matched ".le.". */
860 *result = INTRINSIC_LE_OS;
866 if (gfc_next_ascii_char () == '.')
868 /* Matched ".lt.". */
869 *result = INTRINSIC_LT_OS;
876 ch = gfc_next_ascii_char ();
879 ch = gfc_next_ascii_char ();
882 /* Matched ".ne.". */
883 *result = INTRINSIC_NE_OS;
888 if (gfc_next_ascii_char () == 'v'
889 && gfc_next_ascii_char () == '.')
891 /* Matched ".neqv.". */
892 *result = INTRINSIC_NEQV;
899 if (gfc_next_ascii_char () == 't'
900 && gfc_next_ascii_char () == '.')
902 /* Matched ".not.". */
903 *result = INTRINSIC_NOT;
910 if (gfc_next_ascii_char () == 'r'
911 && gfc_next_ascii_char () == '.')
913 /* Matched ".or.". */
914 *result = INTRINSIC_OR;
928 gfc_current_locus = orig_loc;
933 /* Match a loop control phrase:
935 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
937 If the final integer expression is not present, a constant unity
938 expression is returned. We don't return MATCH_ERROR until after
939 the equals sign is seen. */
942 gfc_match_iterator (gfc_iterator *iter, int init_flag)
944 char name[GFC_MAX_SYMBOL_LEN + 1];
945 gfc_expr *var, *e1, *e2, *e3;
949 /* Match the start of an iterator without affecting the symbol table. */
951 start = gfc_current_locus;
952 m = gfc_match (" %n =", name);
953 gfc_current_locus = start;
958 m = gfc_match_variable (&var, 0);
962 gfc_match_char ('=');
966 if (var->ref != NULL)
968 gfc_error ("Loop variable at %C cannot be a sub-component");
972 if (var->symtree->n.sym->attr.intent == INTENT_IN)
974 gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
975 var->symtree->n.sym->name);
979 var->symtree->n.sym->attr.implied_index = 1;
981 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
984 if (m == MATCH_ERROR)
987 if (gfc_match_char (',') != MATCH_YES)
990 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
993 if (m == MATCH_ERROR)
996 if (gfc_match_char (',') != MATCH_YES)
998 e3 = gfc_int_expr (1);
1002 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
1003 if (m == MATCH_ERROR)
1007 gfc_error ("Expected a step value in iterator at %C");
1019 gfc_error ("Syntax error in iterator at %C");
1030 /* Tries to match the next non-whitespace character on the input.
1031 This subroutine does not return MATCH_ERROR. */
1034 gfc_match_char (char c)
1038 where = gfc_current_locus;
1039 gfc_gobble_whitespace ();
1041 if (gfc_next_ascii_char () == c)
1044 gfc_current_locus = where;
1049 /* General purpose matching subroutine. The target string is a
1050 scanf-like format string in which spaces correspond to arbitrary
1051 whitespace (including no whitespace), characters correspond to
1052 themselves. The %-codes are:
1054 %% Literal percent sign
1055 %e Expression, pointer to a pointer is set
1056 %s Symbol, pointer to the symbol is set
1057 %n Name, character buffer is set to name
1058 %t Matches end of statement.
1059 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
1060 %l Matches a statement label
1061 %v Matches a variable expression (an lvalue)
1062 % Matches a required space (in free form) and optional spaces. */
1065 gfc_match (const char *target, ...)
1067 gfc_st_label **label;
1076 old_loc = gfc_current_locus;
1077 va_start (argp, target);
1087 gfc_gobble_whitespace ();
1098 vp = va_arg (argp, void **);
1099 n = gfc_match_expr ((gfc_expr **) vp);
1110 vp = va_arg (argp, void **);
1111 n = gfc_match_variable ((gfc_expr **) vp, 0);
1122 vp = va_arg (argp, void **);
1123 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
1134 np = va_arg (argp, char *);
1135 n = gfc_match_name (np);
1146 label = va_arg (argp, gfc_st_label **);
1147 n = gfc_match_st_label (label);
1158 ip = va_arg (argp, int *);
1159 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
1170 if (gfc_match_eos () != MATCH_YES)
1178 if (gfc_match_space () == MATCH_YES)
1184 break; /* Fall through to character matcher. */
1187 gfc_internal_error ("gfc_match(): Bad match code %c", c);
1192 /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1193 expect an upper case character here! */
1194 gcc_assert (TOLOWER (c) == c);
1196 if (c == gfc_next_ascii_char ())
1206 /* Clean up after a failed match. */
1207 gfc_current_locus = old_loc;
1208 va_start (argp, target);
1211 for (; matches > 0; matches--)
1213 while (*p++ != '%');
1221 /* Matches that don't have to be undone */
1226 (void) va_arg (argp, void **);
1231 vp = va_arg (argp, void **);
1232 gfc_free_expr ((struct gfc_expr *)*vp);
1245 /*********************** Statement level matching **********************/
1247 /* Matches the start of a program unit, which is the program keyword
1248 followed by an obligatory symbol. */
1251 gfc_match_program (void)
1256 m = gfc_match ("% %s%t", &sym);
1260 gfc_error ("Invalid form of PROGRAM statement at %C");
1264 if (m == MATCH_ERROR)
1267 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
1270 gfc_new_block = sym;
1276 /* Match a simple assignment statement. */
1279 gfc_match_assignment (void)
1281 gfc_expr *lvalue, *rvalue;
1285 old_loc = gfc_current_locus;
1288 m = gfc_match (" %v =", &lvalue);
1291 gfc_current_locus = old_loc;
1292 gfc_free_expr (lvalue);
1297 m = gfc_match (" %e%t", &rvalue);
1300 gfc_current_locus = old_loc;
1301 gfc_free_expr (lvalue);
1302 gfc_free_expr (rvalue);
1306 gfc_set_sym_referenced (lvalue->symtree->n.sym);
1308 new_st.op = EXEC_ASSIGN;
1309 new_st.expr = lvalue;
1310 new_st.expr2 = rvalue;
1312 gfc_check_do_variable (lvalue->symtree);
1318 /* Match a pointer assignment statement. */
1321 gfc_match_pointer_assignment (void)
1323 gfc_expr *lvalue, *rvalue;
1327 old_loc = gfc_current_locus;
1329 lvalue = rvalue = NULL;
1330 gfc_matching_procptr_assignment = 0;
1332 m = gfc_match (" %v =>", &lvalue);
1339 if (lvalue->symtree->n.sym->attr.proc_pointer)
1340 gfc_matching_procptr_assignment = 1;
1342 m = gfc_match (" %e%t", &rvalue);
1343 gfc_matching_procptr_assignment = 0;
1347 new_st.op = EXEC_POINTER_ASSIGN;
1348 new_st.expr = lvalue;
1349 new_st.expr2 = rvalue;
1354 gfc_current_locus = old_loc;
1355 gfc_free_expr (lvalue);
1356 gfc_free_expr (rvalue);
1361 /* We try to match an easy arithmetic IF statement. This only happens
1362 when just after having encountered a simple IF statement. This code
1363 is really duplicate with parts of the gfc_match_if code, but this is
1367 match_arithmetic_if (void)
1369 gfc_st_label *l1, *l2, *l3;
1373 m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1377 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1378 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1379 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1381 gfc_free_expr (expr);
1385 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF statement "
1386 "at %C") == FAILURE)
1389 new_st.op = EXEC_ARITHMETIC_IF;
1399 /* The IF statement is a bit of a pain. First of all, there are three
1400 forms of it, the simple IF, the IF that starts a block and the
1403 There is a problem with the simple IF and that is the fact that we
1404 only have a single level of undo information on symbols. What this
1405 means is for a simple IF, we must re-match the whole IF statement
1406 multiple times in order to guarantee that the symbol table ends up
1407 in the proper state. */
1409 static match match_simple_forall (void);
1410 static match match_simple_where (void);
1413 gfc_match_if (gfc_statement *if_type)
1416 gfc_st_label *l1, *l2, *l3;
1417 locus old_loc, old_loc2;
1421 n = gfc_match_label ();
1422 if (n == MATCH_ERROR)
1425 old_loc = gfc_current_locus;
1427 m = gfc_match (" if ( %e", &expr);
1431 old_loc2 = gfc_current_locus;
1432 gfc_current_locus = old_loc;
1434 if (gfc_match_parens () == MATCH_ERROR)
1437 gfc_current_locus = old_loc2;
1439 if (gfc_match_char (')') != MATCH_YES)
1441 gfc_error ("Syntax error in IF-expression at %C");
1442 gfc_free_expr (expr);
1446 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1452 gfc_error ("Block label not appropriate for arithmetic IF "
1454 gfc_free_expr (expr);
1458 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1459 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1460 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1462 gfc_free_expr (expr);
1466 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF "
1467 "statement at %C") == FAILURE)
1470 new_st.op = EXEC_ARITHMETIC_IF;
1476 *if_type = ST_ARITHMETIC_IF;
1480 if (gfc_match (" then%t") == MATCH_YES)
1482 new_st.op = EXEC_IF;
1484 *if_type = ST_IF_BLOCK;
1490 gfc_error ("Block label is not appropriate for IF statement at %C");
1491 gfc_free_expr (expr);
1495 /* At this point the only thing left is a simple IF statement. At
1496 this point, n has to be MATCH_NO, so we don't have to worry about
1497 re-matching a block label. From what we've got so far, try
1498 matching an assignment. */
1500 *if_type = ST_SIMPLE_IF;
1502 m = gfc_match_assignment ();
1506 gfc_free_expr (expr);
1507 gfc_undo_symbols ();
1508 gfc_current_locus = old_loc;
1510 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1511 assignment was found. For MATCH_NO, continue to call the various
1513 if (m == MATCH_ERROR)
1516 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1518 m = gfc_match_pointer_assignment ();
1522 gfc_free_expr (expr);
1523 gfc_undo_symbols ();
1524 gfc_current_locus = old_loc;
1526 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1528 /* Look at the next keyword to see which matcher to call. Matching
1529 the keyword doesn't affect the symbol table, so we don't have to
1530 restore between tries. */
1532 #define match(string, subr, statement) \
1533 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1537 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1538 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1539 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1540 match ("call", gfc_match_call, ST_CALL)
1541 match ("close", gfc_match_close, ST_CLOSE)
1542 match ("continue", gfc_match_continue, ST_CONTINUE)
1543 match ("cycle", gfc_match_cycle, ST_CYCLE)
1544 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1545 match ("end file", gfc_match_endfile, ST_END_FILE)
1546 match ("exit", gfc_match_exit, ST_EXIT)
1547 match ("flush", gfc_match_flush, ST_FLUSH)
1548 match ("forall", match_simple_forall, ST_FORALL)
1549 match ("go to", gfc_match_goto, ST_GOTO)
1550 match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1551 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1552 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1553 match ("open", gfc_match_open, ST_OPEN)
1554 match ("pause", gfc_match_pause, ST_NONE)
1555 match ("print", gfc_match_print, ST_WRITE)
1556 match ("read", gfc_match_read, ST_READ)
1557 match ("return", gfc_match_return, ST_RETURN)
1558 match ("rewind", gfc_match_rewind, ST_REWIND)
1559 match ("stop", gfc_match_stop, ST_STOP)
1560 match ("wait", gfc_match_wait, ST_WAIT)
1561 match ("where", match_simple_where, ST_WHERE)
1562 match ("write", gfc_match_write, ST_WRITE)
1564 /* The gfc_match_assignment() above may have returned a MATCH_NO
1565 where the assignment was to a named constant. Check that
1566 special case here. */
1567 m = gfc_match_assignment ();
1570 gfc_error ("Cannot assign to a named constant at %C");
1571 gfc_free_expr (expr);
1572 gfc_undo_symbols ();
1573 gfc_current_locus = old_loc;
1577 /* All else has failed, so give up. See if any of the matchers has
1578 stored an error message of some sort. */
1579 if (gfc_error_check () == 0)
1580 gfc_error ("Unclassifiable statement in IF-clause at %C");
1582 gfc_free_expr (expr);
1587 gfc_error ("Syntax error in IF-clause at %C");
1590 gfc_free_expr (expr);
1594 /* At this point, we've matched the single IF and the action clause
1595 is in new_st. Rearrange things so that the IF statement appears
1598 p = gfc_get_code ();
1599 p->next = gfc_get_code ();
1601 p->next->loc = gfc_current_locus;
1606 gfc_clear_new_st ();
1608 new_st.op = EXEC_IF;
1617 /* Match an ELSE statement. */
1620 gfc_match_else (void)
1622 char name[GFC_MAX_SYMBOL_LEN + 1];
1624 if (gfc_match_eos () == MATCH_YES)
1627 if (gfc_match_name (name) != MATCH_YES
1628 || gfc_current_block () == NULL
1629 || gfc_match_eos () != MATCH_YES)
1631 gfc_error ("Unexpected junk after ELSE statement at %C");
1635 if (strcmp (name, gfc_current_block ()->name) != 0)
1637 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1638 name, gfc_current_block ()->name);
1646 /* Match an ELSE IF statement. */
1649 gfc_match_elseif (void)
1651 char name[GFC_MAX_SYMBOL_LEN + 1];
1655 m = gfc_match (" ( %e ) then", &expr);
1659 if (gfc_match_eos () == MATCH_YES)
1662 if (gfc_match_name (name) != MATCH_YES
1663 || gfc_current_block () == NULL
1664 || gfc_match_eos () != MATCH_YES)
1666 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1670 if (strcmp (name, gfc_current_block ()->name) != 0)
1672 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1673 name, gfc_current_block ()->name);
1678 new_st.op = EXEC_IF;
1683 gfc_free_expr (expr);
1688 /* Free a gfc_iterator structure. */
1691 gfc_free_iterator (gfc_iterator *iter, int flag)
1697 gfc_free_expr (iter->var);
1698 gfc_free_expr (iter->start);
1699 gfc_free_expr (iter->end);
1700 gfc_free_expr (iter->step);
1707 /* Match a DO statement. */
1712 gfc_iterator iter, *ip;
1714 gfc_st_label *label;
1717 old_loc = gfc_current_locus;
1720 iter.var = iter.start = iter.end = iter.step = NULL;
1722 m = gfc_match_label ();
1723 if (m == MATCH_ERROR)
1726 if (gfc_match (" do") != MATCH_YES)
1729 m = gfc_match_st_label (&label);
1730 if (m == MATCH_ERROR)
1733 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
1735 if (gfc_match_eos () == MATCH_YES)
1737 iter.end = gfc_logical_expr (1, NULL);
1738 new_st.op = EXEC_DO_WHILE;
1742 /* Match an optional comma, if no comma is found, a space is obligatory. */
1743 if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1746 /* Check for balanced parens. */
1748 if (gfc_match_parens () == MATCH_ERROR)
1751 /* See if we have a DO WHILE. */
1752 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1754 new_st.op = EXEC_DO_WHILE;
1758 /* The abortive DO WHILE may have done something to the symbol
1759 table, so we start over. */
1760 gfc_undo_symbols ();
1761 gfc_current_locus = old_loc;
1763 gfc_match_label (); /* This won't error. */
1764 gfc_match (" do "); /* This will work. */
1766 gfc_match_st_label (&label); /* Can't error out. */
1767 gfc_match_char (','); /* Optional comma. */
1769 m = gfc_match_iterator (&iter, 0);
1772 if (m == MATCH_ERROR)
1775 iter.var->symtree->n.sym->attr.implied_index = 0;
1776 gfc_check_do_variable (iter.var->symtree);
1778 if (gfc_match_eos () != MATCH_YES)
1780 gfc_syntax_error (ST_DO);
1784 new_st.op = EXEC_DO;
1788 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1791 new_st.label = label;
1793 if (new_st.op == EXEC_DO_WHILE)
1794 new_st.expr = iter.end;
1797 new_st.ext.iterator = ip = gfc_get_iterator ();
1804 gfc_free_iterator (&iter, 0);
1810 /* Match an EXIT or CYCLE statement. */
1813 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1815 gfc_state_data *p, *o;
1819 if (gfc_match_eos () == MATCH_YES)
1823 m = gfc_match ("% %s%t", &sym);
1824 if (m == MATCH_ERROR)
1828 gfc_syntax_error (st);
1832 if (sym->attr.flavor != FL_LABEL)
1834 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1835 sym->name, gfc_ascii_statement (st));
1840 /* Find the loop mentioned specified by the label (or lack of a label). */
1841 for (o = NULL, p = gfc_state_stack; p; p = p->previous)
1842 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1844 else if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
1850 gfc_error ("%s statement at %C is not within a loop",
1851 gfc_ascii_statement (st));
1853 gfc_error ("%s statement at %C is not within loop '%s'",
1854 gfc_ascii_statement (st), sym->name);
1861 gfc_error ("%s statement at %C leaving OpenMP structured block",
1862 gfc_ascii_statement (st));
1865 else if (st == ST_EXIT
1866 && p->previous != NULL
1867 && p->previous->state == COMP_OMP_STRUCTURED_BLOCK
1868 && (p->previous->head->op == EXEC_OMP_DO
1869 || p->previous->head->op == EXEC_OMP_PARALLEL_DO))
1871 gcc_assert (p->previous->head->next != NULL);
1872 gcc_assert (p->previous->head->next->op == EXEC_DO
1873 || p->previous->head->next->op == EXEC_DO_WHILE);
1874 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
1878 /* Save the first statement in the loop - needed by the backend. */
1879 new_st.ext.whichloop = p->head;
1887 /* Match the EXIT statement. */
1890 gfc_match_exit (void)
1892 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1896 /* Match the CYCLE statement. */
1899 gfc_match_cycle (void)
1901 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1905 /* Match a number or character constant after a STOP or PAUSE statement. */
1908 gfc_match_stopcode (gfc_statement st)
1918 if (gfc_match_eos () != MATCH_YES)
1920 m = gfc_match_small_literal_int (&stop_code, &cnt);
1921 if (m == MATCH_ERROR)
1924 if (m == MATCH_YES && cnt > 5)
1926 gfc_error ("Too many digits in STOP code at %C");
1932 /* Try a character constant. */
1933 m = gfc_match_expr (&e);
1934 if (m == MATCH_ERROR)
1938 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1942 if (gfc_match_eos () != MATCH_YES)
1946 if (gfc_pure (NULL))
1948 gfc_error ("%s statement not allowed in PURE procedure at %C",
1949 gfc_ascii_statement (st));
1953 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1955 new_st.ext.stop_code = stop_code;
1960 gfc_syntax_error (st);
1969 /* Match the (deprecated) PAUSE statement. */
1972 gfc_match_pause (void)
1976 m = gfc_match_stopcode (ST_PAUSE);
1979 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
1988 /* Match the STOP statement. */
1991 gfc_match_stop (void)
1993 return gfc_match_stopcode (ST_STOP);
1997 /* Match a CONTINUE statement. */
2000 gfc_match_continue (void)
2002 if (gfc_match_eos () != MATCH_YES)
2004 gfc_syntax_error (ST_CONTINUE);
2008 new_st.op = EXEC_CONTINUE;
2013 /* Match the (deprecated) ASSIGN statement. */
2016 gfc_match_assign (void)
2019 gfc_st_label *label;
2021 if (gfc_match (" %l", &label) == MATCH_YES)
2023 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
2025 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
2027 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
2032 expr->symtree->n.sym->attr.assign = 1;
2034 new_st.op = EXEC_LABEL_ASSIGN;
2035 new_st.label = label;
2044 /* Match the GO TO statement. As a computed GOTO statement is
2045 matched, it is transformed into an equivalent SELECT block. No
2046 tree is necessary, and the resulting jumps-to-jumps are
2047 specifically optimized away by the back end. */
2050 gfc_match_goto (void)
2052 gfc_code *head, *tail;
2055 gfc_st_label *label;
2059 if (gfc_match (" %l%t", &label) == MATCH_YES)
2061 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2064 new_st.op = EXEC_GOTO;
2065 new_st.label = label;
2069 /* The assigned GO TO statement. */
2071 if (gfc_match_variable (&expr, 0) == MATCH_YES)
2073 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2078 new_st.op = EXEC_GOTO;
2081 if (gfc_match_eos () == MATCH_YES)
2084 /* Match label list. */
2085 gfc_match_char (',');
2086 if (gfc_match_char ('(') != MATCH_YES)
2088 gfc_syntax_error (ST_GOTO);
2095 m = gfc_match_st_label (&label);
2099 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2103 head = tail = gfc_get_code ();
2106 tail->block = gfc_get_code ();
2110 tail->label = label;
2111 tail->op = EXEC_GOTO;
2113 while (gfc_match_char (',') == MATCH_YES);
2115 if (gfc_match (")%t") != MATCH_YES)
2120 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2123 new_st.block = head;
2128 /* Last chance is a computed GO TO statement. */
2129 if (gfc_match_char ('(') != MATCH_YES)
2131 gfc_syntax_error (ST_GOTO);
2140 m = gfc_match_st_label (&label);
2144 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2148 head = tail = gfc_get_code ();
2151 tail->block = gfc_get_code ();
2155 cp = gfc_get_case ();
2156 cp->low = cp->high = gfc_int_expr (i++);
2158 tail->op = EXEC_SELECT;
2159 tail->ext.case_list = cp;
2161 tail->next = gfc_get_code ();
2162 tail->next->op = EXEC_GOTO;
2163 tail->next->label = label;
2165 while (gfc_match_char (',') == MATCH_YES);
2167 if (gfc_match_char (')') != MATCH_YES)
2172 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2176 /* Get the rest of the statement. */
2177 gfc_match_char (',');
2179 if (gfc_match (" %e%t", &expr) != MATCH_YES)
2182 /* At this point, a computed GOTO has been fully matched and an
2183 equivalent SELECT statement constructed. */
2185 new_st.op = EXEC_SELECT;
2188 /* Hack: For a "real" SELECT, the expression is in expr. We put
2189 it in expr2 so we can distinguish then and produce the correct
2191 new_st.expr2 = expr;
2192 new_st.block = head;
2196 gfc_syntax_error (ST_GOTO);
2198 gfc_free_statements (head);
2203 /* Frees a list of gfc_alloc structures. */
2206 gfc_free_alloc_list (gfc_alloc *p)
2213 gfc_free_expr (p->expr);
2219 /* Match an ALLOCATE statement. */
2222 gfc_match_allocate (void)
2224 gfc_alloc *head, *tail;
2225 gfc_expr *stat, *errmsg, *tmp;
2227 bool saw_stat, saw_errmsg;
2230 stat = errmsg = tmp = NULL;
2231 saw_stat = saw_errmsg = false;
2233 if (gfc_match_char ('(') != MATCH_YES)
2239 head = tail = gfc_get_alloc ();
2242 tail->next = gfc_get_alloc ();
2246 m = gfc_match_variable (&tail->expr, 0);
2249 if (m == MATCH_ERROR)
2252 if (gfc_check_do_variable (tail->expr->symtree))
2255 if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2257 gfc_error ("Bad allocate-object at %C for a PURE procedure");
2261 if (tail->expr->ts.type == BT_DERIVED)
2262 tail->expr->ts.derived = gfc_use_derived (tail->expr->ts.derived);
2264 /* FIXME: disable the checking on derived types and arrays. */
2265 if (!(tail->expr->ref
2266 && (tail->expr->ref->type == REF_COMPONENT
2267 || tail->expr->ref->type == REF_ARRAY))
2268 && tail->expr->symtree->n.sym
2269 && !(tail->expr->symtree->n.sym->attr.allocatable
2270 || tail->expr->symtree->n.sym->attr.pointer
2271 || tail->expr->symtree->n.sym->attr.proc_pointer))
2273 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2274 "or an allocatable variable");
2278 if (gfc_match_char (',') != MATCH_YES)
2283 m = gfc_match (" stat = %v", &tmp);
2284 if (m == MATCH_ERROR)
2290 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2291 gfc_free_expr (tmp);
2298 if (gfc_check_do_variable (stat->symtree))
2301 if (gfc_match_char (',') == MATCH_YES)
2302 goto alloc_opt_list;
2305 m = gfc_match (" errmsg = %v", &tmp);
2306 if (m == MATCH_ERROR)
2310 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2311 &tmp->where) == FAILURE)
2316 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2317 gfc_free_expr (tmp);
2324 if (gfc_match_char (',') == MATCH_YES)
2325 goto alloc_opt_list;
2328 gfc_gobble_whitespace ();
2330 if (gfc_peek_char () == ')')
2335 if (gfc_match (" )%t") != MATCH_YES)
2338 new_st.op = EXEC_ALLOCATE;
2340 new_st.expr2 = errmsg;
2341 new_st.ext.alloc_list = head;
2346 gfc_syntax_error (ST_ALLOCATE);
2349 gfc_free_expr (errmsg);
2350 gfc_free_expr (stat);
2351 gfc_free_alloc_list (head);
2356 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
2357 a set of pointer assignments to intrinsic NULL(). */
2360 gfc_match_nullify (void)
2368 if (gfc_match_char ('(') != MATCH_YES)
2373 m = gfc_match_variable (&p, 0);
2374 if (m == MATCH_ERROR)
2379 if (gfc_check_do_variable (p->symtree))
2382 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2384 gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2388 /* build ' => NULL() '. */
2389 e = gfc_get_expr ();
2390 e->where = gfc_current_locus;
2391 e->expr_type = EXPR_NULL;
2392 e->ts.type = BT_UNKNOWN;
2394 /* Chain to list. */
2399 tail->next = gfc_get_code ();
2403 tail->op = EXEC_POINTER_ASSIGN;
2407 if (gfc_match (" )%t") == MATCH_YES)
2409 if (gfc_match_char (',') != MATCH_YES)
2416 gfc_syntax_error (ST_NULLIFY);
2419 gfc_free_statements (new_st.next);
2424 /* Match a DEALLOCATE statement. */
2427 gfc_match_deallocate (void)
2429 gfc_alloc *head, *tail;
2430 gfc_expr *stat, *errmsg, *tmp;
2432 bool saw_stat, saw_errmsg;
2435 stat = errmsg = tmp = NULL;
2436 saw_stat = saw_errmsg = false;
2438 if (gfc_match_char ('(') != MATCH_YES)
2444 head = tail = gfc_get_alloc ();
2447 tail->next = gfc_get_alloc ();
2451 m = gfc_match_variable (&tail->expr, 0);
2452 if (m == MATCH_ERROR)
2457 if (gfc_check_do_variable (tail->expr->symtree))
2460 if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2462 gfc_error ("Illegal allocate-object at %C for a PURE procedure");
2466 /* FIXME: disable the checking on derived types. */
2467 if (!(tail->expr->ref
2468 && (tail->expr->ref->type == REF_COMPONENT
2469 || tail->expr->ref->type == REF_ARRAY))
2470 && tail->expr->symtree->n.sym
2471 && !(tail->expr->symtree->n.sym->attr.allocatable
2472 || tail->expr->symtree->n.sym->attr.pointer
2473 || tail->expr->symtree->n.sym->attr.proc_pointer))
2475 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2476 "or an allocatable variable");
2480 if (gfc_match_char (',') != MATCH_YES)
2485 m = gfc_match (" stat = %v", &tmp);
2486 if (m == MATCH_ERROR)
2492 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2493 gfc_free_expr (tmp);
2500 if (gfc_check_do_variable (stat->symtree))
2503 if (gfc_match_char (',') == MATCH_YES)
2504 goto dealloc_opt_list;
2507 m = gfc_match (" errmsg = %v", &tmp);
2508 if (m == MATCH_ERROR)
2512 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2513 &tmp->where) == FAILURE)
2518 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2519 gfc_free_expr (tmp);
2526 if (gfc_match_char (',') == MATCH_YES)
2527 goto dealloc_opt_list;
2530 gfc_gobble_whitespace ();
2532 if (gfc_peek_char () == ')')
2536 if (gfc_match (" )%t") != MATCH_YES)
2539 new_st.op = EXEC_DEALLOCATE;
2541 new_st.expr2 = errmsg;
2542 new_st.ext.alloc_list = head;
2547 gfc_syntax_error (ST_DEALLOCATE);
2550 gfc_free_expr (errmsg);
2551 gfc_free_expr (stat);
2552 gfc_free_alloc_list (head);
2557 /* Match a RETURN statement. */
2560 gfc_match_return (void)
2564 gfc_compile_state s;
2567 if (gfc_match_eos () == MATCH_YES)
2570 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2572 gfc_error ("Alternate RETURN statement at %C is only allowed within "
2577 if (gfc_current_form == FORM_FREE)
2579 /* The following are valid, so we can't require a blank after the
2583 char c = gfc_peek_ascii_char ();
2584 if (ISALPHA (c) || ISDIGIT (c))
2588 m = gfc_match (" %e%t", &e);
2591 if (m == MATCH_ERROR)
2594 gfc_syntax_error (ST_RETURN);
2601 gfc_enclosing_unit (&s);
2602 if (s == COMP_PROGRAM
2603 && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2604 "main program at %C") == FAILURE)
2607 new_st.op = EXEC_RETURN;
2614 /* Match the call of a type-bound procedure, if CALL%var has already been
2615 matched and var found to be a derived-type variable. */
2618 match_typebound_call (gfc_symtree* varst)
2626 base = gfc_get_expr ();
2627 base->expr_type = EXPR_VARIABLE;
2628 base->symtree = varst;
2629 base->where = gfc_current_locus;
2630 gfc_set_sym_referenced (varst->n.sym);
2632 m = gfc_match_varspec (base, 0, true);
2634 gfc_error ("Expected component reference at %C");
2638 if (gfc_match_eos () != MATCH_YES)
2640 gfc_error ("Junk after CALL at %C");
2644 if (base->expr_type != EXPR_COMPCALL)
2646 gfc_error ("Expected type-bound procedure reference at %C");
2650 new_st.op = EXEC_COMPCALL;
2657 /* Match a CALL statement. The tricky part here are possible
2658 alternate return specifiers. We handle these by having all
2659 "subroutines" actually return an integer via a register that gives
2660 the return number. If the call specifies alternate returns, we
2661 generate code for a SELECT statement whose case clauses contain
2662 GOTOs to the various labels. */
2665 gfc_match_call (void)
2667 char name[GFC_MAX_SYMBOL_LEN + 1];
2668 gfc_actual_arglist *a, *arglist;
2678 m = gfc_match ("% %n", name);
2684 if (gfc_get_ha_sym_tree (name, &st))
2689 /* If this is a variable of derived-type, it probably starts a type-bound
2691 if (sym->attr.flavor != FL_PROCEDURE && sym->ts.type == BT_DERIVED)
2692 return match_typebound_call (st);
2694 /* If it does not seem to be callable (include functions so that the
2695 right association is made. They are thrown out in resolution.)
2697 if (!sym->attr.generic
2698 && !sym->attr.subroutine
2699 && !sym->attr.function)
2701 if (!(sym->attr.external && !sym->attr.referenced))
2703 /* ...create a symbol in this scope... */
2704 if (sym->ns != gfc_current_ns
2705 && gfc_get_sym_tree (name, NULL, &st) == 1)
2708 if (sym != st->n.sym)
2712 /* ...and then to try to make the symbol into a subroutine. */
2713 if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2717 gfc_set_sym_referenced (sym);
2719 if (gfc_match_eos () != MATCH_YES)
2721 m = gfc_match_actual_arglist (1, &arglist);
2724 if (m == MATCH_ERROR)
2727 if (gfc_match_eos () != MATCH_YES)
2731 /* If any alternate return labels were found, construct a SELECT
2732 statement that will jump to the right place. */
2735 for (a = arglist; a; a = a->next)
2736 if (a->expr == NULL)
2741 gfc_symtree *select_st;
2742 gfc_symbol *select_sym;
2743 char name[GFC_MAX_SYMBOL_LEN + 1];
2745 new_st.next = c = gfc_get_code ();
2746 c->op = EXEC_SELECT;
2747 sprintf (name, "_result_%s", sym->name);
2748 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail. */
2750 select_sym = select_st->n.sym;
2751 select_sym->ts.type = BT_INTEGER;
2752 select_sym->ts.kind = gfc_default_integer_kind;
2753 gfc_set_sym_referenced (select_sym);
2754 c->expr = gfc_get_expr ();
2755 c->expr->expr_type = EXPR_VARIABLE;
2756 c->expr->symtree = select_st;
2757 c->expr->ts = select_sym->ts;
2758 c->expr->where = gfc_current_locus;
2761 for (a = arglist; a; a = a->next)
2763 if (a->expr != NULL)
2766 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2771 c->block = gfc_get_code ();
2773 c->op = EXEC_SELECT;
2775 new_case = gfc_get_case ();
2776 new_case->high = new_case->low = gfc_int_expr (i);
2777 c->ext.case_list = new_case;
2779 c->next = gfc_get_code ();
2780 c->next->op = EXEC_GOTO;
2781 c->next->label = a->label;
2785 new_st.op = EXEC_CALL;
2786 new_st.symtree = st;
2787 new_st.ext.actual = arglist;
2792 gfc_syntax_error (ST_CALL);
2795 gfc_free_actual_arglist (arglist);
2800 /* Given a name, return a pointer to the common head structure,
2801 creating it if it does not exist. If FROM_MODULE is nonzero, we
2802 mangle the name so that it doesn't interfere with commons defined
2803 in the using namespace.
2804 TODO: Add to global symbol tree. */
2807 gfc_get_common (const char *name, int from_module)
2810 static int serial = 0;
2811 char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
2815 /* A use associated common block is only needed to correctly layout
2816 the variables it contains. */
2817 snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
2818 st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
2822 st = gfc_find_symtree (gfc_current_ns->common_root, name);
2825 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2828 if (st->n.common == NULL)
2830 st->n.common = gfc_get_common_head ();
2831 st->n.common->where = gfc_current_locus;
2832 strcpy (st->n.common->name, name);
2835 return st->n.common;
2839 /* Match a common block name. */
2841 match match_common_name (char *name)
2845 if (gfc_match_char ('/') == MATCH_NO)
2851 if (gfc_match_char ('/') == MATCH_YES)
2857 m = gfc_match_name (name);
2859 if (m == MATCH_ERROR)
2861 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2864 gfc_error ("Syntax error in common block name at %C");
2869 /* Match a COMMON statement. */
2872 gfc_match_common (void)
2874 gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
2875 char name[GFC_MAX_SYMBOL_LEN + 1];
2882 old_blank_common = gfc_current_ns->blank_common.head;
2883 if (old_blank_common)
2885 while (old_blank_common->common_next)
2886 old_blank_common = old_blank_common->common_next;
2893 m = match_common_name (name);
2894 if (m == MATCH_ERROR)
2897 gsym = gfc_get_gsymbol (name);
2898 if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
2900 gfc_error ("Symbol '%s' at %C is already an external symbol that "
2901 "is not COMMON", name);
2905 if (gsym->type == GSYM_UNKNOWN)
2907 gsym->type = GSYM_COMMON;
2908 gsym->where = gfc_current_locus;
2914 if (name[0] == '\0')
2916 t = &gfc_current_ns->blank_common;
2917 if (t->head == NULL)
2918 t->where = gfc_current_locus;
2922 t = gfc_get_common (name, 0);
2931 while (tail->common_next)
2932 tail = tail->common_next;
2935 /* Grab the list of symbols. */
2938 m = gfc_match_symbol (&sym, 0);
2939 if (m == MATCH_ERROR)
2944 /* Store a ref to the common block for error checking. */
2945 sym->common_block = t;
2947 /* See if we know the current common block is bind(c), and if
2948 so, then see if we can check if the symbol is (which it'll
2949 need to be). This can happen if the bind(c) attr stmt was
2950 applied to the common block, and the variable(s) already
2951 defined, before declaring the common block. */
2952 if (t->is_bind_c == 1)
2954 if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
2956 /* If we find an error, just print it and continue,
2957 cause it's just semantic, and we can see if there
2959 gfc_error_now ("Variable '%s' at %L in common block '%s' "
2960 "at %C must be declared with a C "
2961 "interoperable kind since common block "
2963 sym->name, &(sym->declared_at), t->name,
2967 if (sym->attr.is_bind_c == 1)
2968 gfc_error_now ("Variable '%s' in common block "
2969 "'%s' at %C can not be bind(c) since "
2970 "it is not global", sym->name, t->name);
2973 if (sym->attr.in_common)
2975 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2980 if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
2981 || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
2983 if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
2984 "can only be COMMON in "
2985 "BLOCK DATA", sym->name)
2990 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
2994 tail->common_next = sym;
3000 /* Deal with an optional array specification after the
3002 m = gfc_match_array_spec (&as);
3003 if (m == MATCH_ERROR)
3008 if (as->type != AS_EXPLICIT)
3010 gfc_error ("Array specification for symbol '%s' in COMMON "
3011 "at %C must be explicit", sym->name);
3015 if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3018 if (sym->attr.pointer)
3020 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3021 "POINTER array", sym->name);
3030 sym->common_head = t;
3032 /* Check to see if the symbol is already in an equivalence group.
3033 If it is, set the other members as being in common. */
3034 if (sym->attr.in_equivalence)
3036 for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3038 for (e2 = e1; e2; e2 = e2->eq)
3039 if (e2->expr->symtree->n.sym == sym)
3046 for (e2 = e1; e2; e2 = e2->eq)
3048 other = e2->expr->symtree->n.sym;
3049 if (other->common_head
3050 && other->common_head != sym->common_head)
3052 gfc_error ("Symbol '%s', in COMMON block '%s' at "
3053 "%C is being indirectly equivalenced to "
3054 "another COMMON block '%s'",
3055 sym->name, sym->common_head->name,
3056 other->common_head->name);
3059 other->attr.in_common = 1;
3060 other->common_head = t;
3066 gfc_gobble_whitespace ();
3067 if (gfc_match_eos () == MATCH_YES)
3069 if (gfc_peek_ascii_char () == '/')
3071 if (gfc_match_char (',') != MATCH_YES)
3073 gfc_gobble_whitespace ();
3074 if (gfc_peek_ascii_char () == '/')
3083 gfc_syntax_error (ST_COMMON);
3086 if (old_blank_common)
3087 old_blank_common->common_next = NULL;
3089 gfc_current_ns->blank_common.head = NULL;
3090 gfc_free_array_spec (as);
3095 /* Match a BLOCK DATA program unit. */
3098 gfc_match_block_data (void)
3100 char name[GFC_MAX_SYMBOL_LEN + 1];
3104 if (gfc_match_eos () == MATCH_YES)
3106 gfc_new_block = NULL;
3110 m = gfc_match ("% %n%t", name);
3114 if (gfc_get_symbol (name, NULL, &sym))
3117 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3120 gfc_new_block = sym;
3126 /* Free a namelist structure. */
3129 gfc_free_namelist (gfc_namelist *name)
3133 for (; name; name = n)
3141 /* Match a NAMELIST statement. */
3144 gfc_match_namelist (void)
3146 gfc_symbol *group_name, *sym;
3150 m = gfc_match (" / %s /", &group_name);
3153 if (m == MATCH_ERROR)
3158 if (group_name->ts.type != BT_UNKNOWN)
3160 gfc_error ("Namelist group name '%s' at %C already has a basic "
3161 "type of %s", group_name->name,
3162 gfc_typename (&group_name->ts));
3166 if (group_name->attr.flavor == FL_NAMELIST
3167 && group_name->attr.use_assoc
3168 && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3169 "at %C already is USE associated and can"
3170 "not be respecified.", group_name->name)
3174 if (group_name->attr.flavor != FL_NAMELIST
3175 && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3176 group_name->name, NULL) == FAILURE)
3181 m = gfc_match_symbol (&sym, 1);
3184 if (m == MATCH_ERROR)
3187 if (sym->attr.in_namelist == 0
3188 && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3191 /* Use gfc_error_check here, rather than goto error, so that
3192 these are the only errors for the next two lines. */
3193 if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3195 gfc_error ("Assumed size array '%s' in namelist '%s' at "
3196 "%C is not allowed", sym->name, group_name->name);
3200 if (sym->ts.type == BT_CHARACTER && sym->ts.cl->length == NULL)
3202 gfc_error ("Assumed character length '%s' in namelist '%s' at "
3203 "%C is not allowed", sym->name, group_name->name);
3207 nl = gfc_get_namelist ();
3211 if (group_name->namelist == NULL)
3212 group_name->namelist = group_name->namelist_tail = nl;
3215 group_name->namelist_tail->next = nl;
3216 group_name->namelist_tail = nl;
3219 if (gfc_match_eos () == MATCH_YES)
3222 m = gfc_match_char (',');
3224 if (gfc_match_char ('/') == MATCH_YES)
3226 m2 = gfc_match (" %s /", &group_name);
3227 if (m2 == MATCH_YES)
3229 if (m2 == MATCH_ERROR)
3243 gfc_syntax_error (ST_NAMELIST);
3250 /* Match a MODULE statement. */
3253 gfc_match_module (void)
3257 m = gfc_match (" %s%t", &gfc_new_block);
3261 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3262 gfc_new_block->name, NULL) == FAILURE)
3269 /* Free equivalence sets and lists. Recursively is the easiest way to
3273 gfc_free_equiv (gfc_equiv *eq)
3278 gfc_free_equiv (eq->eq);
3279 gfc_free_equiv (eq->next);
3280 gfc_free_expr (eq->expr);
3285 /* Match an EQUIVALENCE statement. */
3288 gfc_match_equivalence (void)
3290 gfc_equiv *eq, *set, *tail;
3294 gfc_common_head *common_head = NULL;
3302 eq = gfc_get_equiv ();
3306 eq->next = gfc_current_ns->equiv;
3307 gfc_current_ns->equiv = eq;
3309 if (gfc_match_char ('(') != MATCH_YES)
3313 common_flag = FALSE;
3318 m = gfc_match_equiv_variable (&set->expr);
3319 if (m == MATCH_ERROR)
3324 /* count the number of objects. */
3327 if (gfc_match_char ('%') == MATCH_YES)
3329 gfc_error ("Derived type component %C is not a "
3330 "permitted EQUIVALENCE member");
3334 for (ref = set->expr->ref; ref; ref = ref->next)
3335 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3337 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3338 "be an array section");
3342 sym = set->expr->symtree->n.sym;
3344 if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3347 if (sym->attr.in_common)
3350 common_head = sym->common_head;
3353 if (gfc_match_char (')') == MATCH_YES)
3356 if (gfc_match_char (',') != MATCH_YES)
3359 set->eq = gfc_get_equiv ();
3365 gfc_error ("EQUIVALENCE at %C requires two or more objects");
3369 /* If one of the members of an equivalence is in common, then
3370 mark them all as being in common. Before doing this, check
3371 that members of the equivalence group are not in different
3374 for (set = eq; set; set = set->eq)
3376 sym = set->expr->symtree->n.sym;
3377 if (sym->common_head && sym->common_head != common_head)
3379 gfc_error ("Attempt to indirectly overlap COMMON "
3380 "blocks %s and %s by EQUIVALENCE at %C",
3381 sym->common_head->name, common_head->name);
3384 sym->attr.in_common = 1;
3385 sym->common_head = common_head;
3388 if (gfc_match_eos () == MATCH_YES)
3390 if (gfc_match_char (',') != MATCH_YES)
3397 gfc_syntax_error (ST_EQUIVALENCE);
3403 gfc_free_equiv (gfc_current_ns->equiv);
3404 gfc_current_ns->equiv = eq;
3410 /* Check that a statement function is not recursive. This is done by looking
3411 for the statement function symbol(sym) by looking recursively through its
3412 expression(e). If a reference to sym is found, true is returned.
3413 12.5.4 requires that any variable of function that is implicitly typed
3414 shall have that type confirmed by any subsequent type declaration. The
3415 implicit typing is conveniently done here. */
3417 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3420 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3426 switch (e->expr_type)
3429 if (e->symtree == NULL)
3432 /* Check the name before testing for nested recursion! */
3433 if (sym->name == e->symtree->n.sym->name)
3436 /* Catch recursion via other statement functions. */
3437 if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3438 && e->symtree->n.sym->value
3439 && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3442 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3443 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3448 if (e->symtree && sym->name == e->symtree->n.sym->name)
3451 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3452 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3464 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3466 return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3470 /* Match a statement function declaration. It is so easy to match
3471 non-statement function statements with a MATCH_ERROR as opposed to
3472 MATCH_NO that we suppress error message in most cases. */
3475 gfc_match_st_function (void)
3477 gfc_error_buf old_error;
3482 m = gfc_match_symbol (&sym, 0);
3486 gfc_push_error (&old_error);
3488 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3489 sym->name, NULL) == FAILURE)
3492 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3495 m = gfc_match (" = %e%t", &expr);
3499 gfc_free_error (&old_error);
3500 if (m == MATCH_ERROR)
3503 if (recursive_stmt_fcn (expr, sym))
3505 gfc_error ("Statement function at %L is recursive", &expr->where);
3514 gfc_pop_error (&old_error);
3519 /***************** SELECT CASE subroutines ******************/
3521 /* Free a single case structure. */
3524 free_case (gfc_case *p)
3526 if (p->low == p->high)
3528 gfc_free_expr (p->low);
3529 gfc_free_expr (p->high);
3534 /* Free a list of case structures. */
3537 gfc_free_case_list (gfc_case *p)
3549 /* Match a single case selector. */
3552 match_case_selector (gfc_case **cp)
3557 c = gfc_get_case ();
3558 c->where = gfc_current_locus;
3560 if (gfc_match_char (':') == MATCH_YES)
3562 m = gfc_match_init_expr (&c->high);
3565 if (m == MATCH_ERROR)
3570 m = gfc_match_init_expr (&c->low);
3571 if (m == MATCH_ERROR)
3576 /* If we're not looking at a ':' now, make a range out of a single
3577 target. Else get the upper bound for the case range. */
3578 if (gfc_match_char (':') != MATCH_YES)
3582 m = gfc_match_init_expr (&c->high);
3583 if (m == MATCH_ERROR)
3585 /* MATCH_NO is fine. It's OK if nothing is there! */
3593 gfc_error ("Expected initialization expression in CASE at %C");
3601 /* Match the end of a case statement. */
3604 match_case_eos (void)
3606 char name[GFC_MAX_SYMBOL_LEN + 1];
3609 if (gfc_match_eos () == MATCH_YES)
3612 /* If the case construct doesn't have a case-construct-name, we
3613 should have matched the EOS. */
3614 if (!gfc_current_block ())
3616 gfc_error ("Expected the name of the SELECT CASE construct at %C");
3620 gfc_gobble_whitespace ();
3622 m = gfc_match_name (name);
3626 if (strcmp (name, gfc_current_block ()->name) != 0)
3628 gfc_error ("Expected case name of '%s' at %C",
3629 gfc_current_block ()->name);
3633 return gfc_match_eos ();
3637 /* Match a SELECT statement. */
3640 gfc_match_select (void)
3645 m = gfc_match_label ();
3646 if (m == MATCH_ERROR)
3649 m = gfc_match (" select case ( %e )%t", &expr);
3653 new_st.op = EXEC_SELECT;
3660 /* Match a CASE statement. */
3663 gfc_match_case (void)
3665 gfc_case *c, *head, *tail;
3670 if (gfc_current_state () != COMP_SELECT)
3672 gfc_error ("Unexpected CASE statement at %C");
3676 if (gfc_match ("% default") == MATCH_YES)
3678 m = match_case_eos ();
3681 if (m == MATCH_ERROR)
3684 new_st.op = EXEC_SELECT;
3685 c = gfc_get_case ();
3686 c->where = gfc_current_locus;
3687 new_st.ext.case_list = c;
3691 if (gfc_match_char ('(') != MATCH_YES)
3696 if (match_case_selector (&c) == MATCH_ERROR)
3706 if (gfc_match_char (')') == MATCH_YES)
3708 if (gfc_match_char (',') != MATCH_YES)
3712 m = match_case_eos ();
3715 if (m == MATCH_ERROR)
3718 new_st.op = EXEC_SELECT;
3719 new_st.ext.case_list = head;
3724 gfc_error ("Syntax error in CASE-specification at %C");
3727 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
3731 /********************* WHERE subroutines ********************/
3733 /* Match the rest of a simple WHERE statement that follows an IF statement.
3737 match_simple_where (void)
3743 m = gfc_match (" ( %e )", &expr);
3747 m = gfc_match_assignment ();
3750 if (m == MATCH_ERROR)
3753 if (gfc_match_eos () != MATCH_YES)
3756 c = gfc_get_code ();
3760 c->next = gfc_get_code ();
3763 gfc_clear_new_st ();
3765 new_st.op = EXEC_WHERE;
3771 gfc_syntax_error (ST_WHERE);
3774 gfc_free_expr (expr);
3779 /* Match a WHERE statement. */
3782 gfc_match_where (gfc_statement *st)
3788 m0 = gfc_match_label ();
3789 if (m0 == MATCH_ERROR)
3792 m = gfc_match (" where ( %e )", &expr);
3796 if (gfc_match_eos () == MATCH_YES)
3798 *st = ST_WHERE_BLOCK;
3799 new_st.op = EXEC_WHERE;
3804 m = gfc_match_assignment ();
3806 gfc_syntax_error (ST_WHERE);
3810 gfc_free_expr (expr);
3814 /* We've got a simple WHERE statement. */
3816 c = gfc_get_code ();
3820 c->next = gfc_get_code ();
3823 gfc_clear_new_st ();
3825 new_st.op = EXEC_WHERE;
3832 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
3833 new_st if successful. */
3836 gfc_match_elsewhere (void)
3838 char name[GFC_MAX_SYMBOL_LEN + 1];
3842 if (gfc_current_state () != COMP_WHERE)
3844 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3850 if (gfc_match_char ('(') == MATCH_YES)
3852 m = gfc_match_expr (&expr);
3855 if (m == MATCH_ERROR)
3858 if (gfc_match_char (')') != MATCH_YES)
3862 if (gfc_match_eos () != MATCH_YES)
3864 /* Only makes sense if we have a where-construct-name. */
3865 if (!gfc_current_block ())
3870 /* Better be a name at this point. */
3871 m = gfc_match_name (name);
3874 if (m == MATCH_ERROR)
3877 if (gfc_match_eos () != MATCH_YES)
3880 if (strcmp (name, gfc_current_block ()->name) != 0)
3882 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3883 name, gfc_current_block ()->name);
3888 new_st.op = EXEC_WHERE;
3893 gfc_syntax_error (ST_ELSEWHERE);
3896 gfc_free_expr (expr);
3901 /******************** FORALL subroutines ********************/
3903 /* Free a list of FORALL iterators. */
3906 gfc_free_forall_iterator (gfc_forall_iterator *iter)
3908 gfc_forall_iterator *next;
3913 gfc_free_expr (iter->var);
3914 gfc_free_expr (iter->start);
3915 gfc_free_expr (iter->end);
3916 gfc_free_expr (iter->stride);
3923 /* Match an iterator as part of a FORALL statement. The format is:
3925 <var> = <start>:<end>[:<stride>]
3927 On MATCH_NO, the caller tests for the possibility that there is a
3928 scalar mask expression. */
3931 match_forall_iterator (gfc_forall_iterator **result)
3933 gfc_forall_iterator *iter;
3937 where = gfc_current_locus;
3938 iter = XCNEW (gfc_forall_iterator);
3940 m = gfc_match_expr (&iter->var);
3944 if (gfc_match_char ('=') != MATCH_YES
3945 || iter->var->expr_type != EXPR_VARIABLE)
3951 m = gfc_match_expr (&iter->start);
3955 if (gfc_match_char (':') != MATCH_YES)
3958 m = gfc_match_expr (&iter->end);
3961 if (m == MATCH_ERROR)
3964 if (gfc_match_char (':') == MATCH_NO)
3965 iter->stride = gfc_int_expr (1);
3968 m = gfc_match_expr (&iter->stride);
3971 if (m == MATCH_ERROR)
3975 /* Mark the iteration variable's symbol as used as a FORALL index. */
3976 iter->var->symtree->n.sym->forall_index = true;
3982 gfc_error ("Syntax error in FORALL iterator at %C");
3987 gfc_current_locus = where;
3988 gfc_free_forall_iterator (iter);
3993 /* Match the header of a FORALL statement. */
3996 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
3998 gfc_forall_iterator *head, *tail, *new_iter;
4002 gfc_gobble_whitespace ();
4007 if (gfc_match_char ('(') != MATCH_YES)
4010 m = match_forall_iterator (&new_iter);
4011 if (m == MATCH_ERROR)
4016 head = tail = new_iter;
4020 if (gfc_match_char (',') != MATCH_YES)
4023 m = match_forall_iterator (&new_iter);
4024 if (m == MATCH_ERROR)
4029 tail->next = new_iter;
4034 /* Have to have a mask expression. */
4036 m = gfc_match_expr (&msk);
4039 if (m == MATCH_ERROR)
4045 if (gfc_match_char (')') == MATCH_NO)
4053 gfc_syntax_error (ST_FORALL);
4056 gfc_free_expr (msk);
4057 gfc_free_forall_iterator (head);
4062 /* Match the rest of a simple FORALL statement that follows an
4066 match_simple_forall (void)
4068 gfc_forall_iterator *head;
4077 m = match_forall_header (&head, &mask);
4084 m = gfc_match_assignment ();
4086 if (m == MATCH_ERROR)
4090 m = gfc_match_pointer_assignment ();
4091 if (m == MATCH_ERROR)
4097 c = gfc_get_code ();
4099 c->loc = gfc_current_locus;
4101 if (gfc_match_eos () != MATCH_YES)
4104 gfc_clear_new_st ();
4105 new_st.op = EXEC_FORALL;
4107 new_st.ext.forall_iterator = head;
4108 new_st.block = gfc_get_code ();
4110 new_st.block->op = EXEC_FORALL;
4111 new_st.block->next = c;
4116 gfc_syntax_error (ST_FORALL);
4119 gfc_free_forall_iterator (head);
4120 gfc_free_expr (mask);
4126 /* Match a FORALL statement. */
4129 gfc_match_forall (gfc_statement *st)
4131 gfc_forall_iterator *head;
4140 m0 = gfc_match_label ();
4141 if (m0 == MATCH_ERROR)
4144 m = gfc_match (" forall");
4148 m = match_forall_header (&head, &mask);
4149 if (m == MATCH_ERROR)
4154 if (gfc_match_eos () == MATCH_YES)
4156 *st = ST_FORALL_BLOCK;
4157 new_st.op = EXEC_FORALL;
4159 new_st.ext.forall_iterator = head;
4163 m = gfc_match_assignment ();
4164 if (m == MATCH_ERROR)
4168 m = gfc_match_pointer_assignment ();
4169 if (m == MATCH_ERROR)
4175 c = gfc_get_code ();
4177 c->loc = gfc_current_locus;
4179 gfc_clear_new_st ();
4180 new_st.op = EXEC_FORALL;
4182 new_st.ext.forall_iterator = head;
4183 new_st.block = gfc_get_code ();
4184 new_st.block->op = EXEC_FORALL;
4185 new_st.block->next = c;
4191 gfc_syntax_error (ST_FORALL);
4194 gfc_free_forall_iterator (head);
4195 gfc_free_expr (mask);
4196 gfc_free_statements (c);