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, false))
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.expr1 = 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_is_proc_ptr_comp (lvalue, NULL))
1341 gfc_matching_procptr_assignment = 1;
1343 m = gfc_match (" %e%t", &rvalue);
1344 gfc_matching_procptr_assignment = 0;
1348 new_st.op = EXEC_POINTER_ASSIGN;
1349 new_st.expr1 = lvalue;
1350 new_st.expr2 = rvalue;
1355 gfc_current_locus = old_loc;
1356 gfc_free_expr (lvalue);
1357 gfc_free_expr (rvalue);
1362 /* We try to match an easy arithmetic IF statement. This only happens
1363 when just after having encountered a simple IF statement. This code
1364 is really duplicate with parts of the gfc_match_if code, but this is
1368 match_arithmetic_if (void)
1370 gfc_st_label *l1, *l2, *l3;
1374 m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1378 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1379 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1380 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1382 gfc_free_expr (expr);
1386 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1387 "statement at %C") == FAILURE)
1390 new_st.op = EXEC_ARITHMETIC_IF;
1391 new_st.expr1 = expr;
1400 /* The IF statement is a bit of a pain. First of all, there are three
1401 forms of it, the simple IF, the IF that starts a block and the
1404 There is a problem with the simple IF and that is the fact that we
1405 only have a single level of undo information on symbols. What this
1406 means is for a simple IF, we must re-match the whole IF statement
1407 multiple times in order to guarantee that the symbol table ends up
1408 in the proper state. */
1410 static match match_simple_forall (void);
1411 static match match_simple_where (void);
1414 gfc_match_if (gfc_statement *if_type)
1417 gfc_st_label *l1, *l2, *l3;
1418 locus old_loc, old_loc2;
1422 n = gfc_match_label ();
1423 if (n == MATCH_ERROR)
1426 old_loc = gfc_current_locus;
1428 m = gfc_match (" if ( %e", &expr);
1432 old_loc2 = gfc_current_locus;
1433 gfc_current_locus = old_loc;
1435 if (gfc_match_parens () == MATCH_ERROR)
1438 gfc_current_locus = old_loc2;
1440 if (gfc_match_char (')') != MATCH_YES)
1442 gfc_error ("Syntax error in IF-expression at %C");
1443 gfc_free_expr (expr);
1447 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1453 gfc_error ("Block label not appropriate for arithmetic IF "
1455 gfc_free_expr (expr);
1459 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1460 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1461 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1463 gfc_free_expr (expr);
1467 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1468 "statement at %C") == FAILURE)
1471 new_st.op = EXEC_ARITHMETIC_IF;
1472 new_st.expr1 = expr;
1477 *if_type = ST_ARITHMETIC_IF;
1481 if (gfc_match (" then%t") == MATCH_YES)
1483 new_st.op = EXEC_IF;
1484 new_st.expr1 = expr;
1485 *if_type = ST_IF_BLOCK;
1491 gfc_error ("Block label is not appropriate for IF statement at %C");
1492 gfc_free_expr (expr);
1496 /* At this point the only thing left is a simple IF statement. At
1497 this point, n has to be MATCH_NO, so we don't have to worry about
1498 re-matching a block label. From what we've got so far, try
1499 matching an assignment. */
1501 *if_type = ST_SIMPLE_IF;
1503 m = gfc_match_assignment ();
1507 gfc_free_expr (expr);
1508 gfc_undo_symbols ();
1509 gfc_current_locus = old_loc;
1511 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1512 assignment was found. For MATCH_NO, continue to call the various
1514 if (m == MATCH_ERROR)
1517 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1519 m = gfc_match_pointer_assignment ();
1523 gfc_free_expr (expr);
1524 gfc_undo_symbols ();
1525 gfc_current_locus = old_loc;
1527 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1529 /* Look at the next keyword to see which matcher to call. Matching
1530 the keyword doesn't affect the symbol table, so we don't have to
1531 restore between tries. */
1533 #define match(string, subr, statement) \
1534 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1538 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1539 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1540 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1541 match ("call", gfc_match_call, ST_CALL)
1542 match ("close", gfc_match_close, ST_CLOSE)
1543 match ("continue", gfc_match_continue, ST_CONTINUE)
1544 match ("cycle", gfc_match_cycle, ST_CYCLE)
1545 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1546 match ("end file", gfc_match_endfile, ST_END_FILE)
1547 match ("exit", gfc_match_exit, ST_EXIT)
1548 match ("flush", gfc_match_flush, ST_FLUSH)
1549 match ("forall", match_simple_forall, ST_FORALL)
1550 match ("go to", gfc_match_goto, ST_GOTO)
1551 match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1552 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1553 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1554 match ("open", gfc_match_open, ST_OPEN)
1555 match ("pause", gfc_match_pause, ST_NONE)
1556 match ("print", gfc_match_print, ST_WRITE)
1557 match ("read", gfc_match_read, ST_READ)
1558 match ("return", gfc_match_return, ST_RETURN)
1559 match ("rewind", gfc_match_rewind, ST_REWIND)
1560 match ("stop", gfc_match_stop, ST_STOP)
1561 match ("wait", gfc_match_wait, ST_WAIT)
1562 match ("where", match_simple_where, ST_WHERE)
1563 match ("write", gfc_match_write, ST_WRITE)
1565 /* The gfc_match_assignment() above may have returned a MATCH_NO
1566 where the assignment was to a named constant. Check that
1567 special case here. */
1568 m = gfc_match_assignment ();
1571 gfc_error ("Cannot assign to a named constant at %C");
1572 gfc_free_expr (expr);
1573 gfc_undo_symbols ();
1574 gfc_current_locus = old_loc;
1578 /* All else has failed, so give up. See if any of the matchers has
1579 stored an error message of some sort. */
1580 if (gfc_error_check () == 0)
1581 gfc_error ("Unclassifiable statement in IF-clause at %C");
1583 gfc_free_expr (expr);
1588 gfc_error ("Syntax error in IF-clause at %C");
1591 gfc_free_expr (expr);
1595 /* At this point, we've matched the single IF and the action clause
1596 is in new_st. Rearrange things so that the IF statement appears
1599 p = gfc_get_code ();
1600 p->next = gfc_get_code ();
1602 p->next->loc = gfc_current_locus;
1607 gfc_clear_new_st ();
1609 new_st.op = EXEC_IF;
1618 /* Match an ELSE statement. */
1621 gfc_match_else (void)
1623 char name[GFC_MAX_SYMBOL_LEN + 1];
1625 if (gfc_match_eos () == MATCH_YES)
1628 if (gfc_match_name (name) != MATCH_YES
1629 || gfc_current_block () == NULL
1630 || gfc_match_eos () != MATCH_YES)
1632 gfc_error ("Unexpected junk after ELSE statement at %C");
1636 if (strcmp (name, gfc_current_block ()->name) != 0)
1638 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1639 name, gfc_current_block ()->name);
1647 /* Match an ELSE IF statement. */
1650 gfc_match_elseif (void)
1652 char name[GFC_MAX_SYMBOL_LEN + 1];
1656 m = gfc_match (" ( %e ) then", &expr);
1660 if (gfc_match_eos () == MATCH_YES)
1663 if (gfc_match_name (name) != MATCH_YES
1664 || gfc_current_block () == NULL
1665 || gfc_match_eos () != MATCH_YES)
1667 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1671 if (strcmp (name, gfc_current_block ()->name) != 0)
1673 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1674 name, gfc_current_block ()->name);
1679 new_st.op = EXEC_IF;
1680 new_st.expr1 = expr;
1684 gfc_free_expr (expr);
1689 /* Free a gfc_iterator structure. */
1692 gfc_free_iterator (gfc_iterator *iter, int flag)
1698 gfc_free_expr (iter->var);
1699 gfc_free_expr (iter->start);
1700 gfc_free_expr (iter->end);
1701 gfc_free_expr (iter->step);
1708 /* Match a BLOCK statement. */
1711 gfc_match_block (void)
1715 if (gfc_match_label () == MATCH_ERROR)
1718 if (gfc_match (" block") != MATCH_YES)
1721 /* For this to be a correct BLOCK statement, the line must end now. */
1722 m = gfc_match_eos ();
1723 if (m == MATCH_ERROR)
1732 /* Match a DO statement. */
1737 gfc_iterator iter, *ip;
1739 gfc_st_label *label;
1742 old_loc = gfc_current_locus;
1745 iter.var = iter.start = iter.end = iter.step = NULL;
1747 m = gfc_match_label ();
1748 if (m == MATCH_ERROR)
1751 if (gfc_match (" do") != MATCH_YES)
1754 m = gfc_match_st_label (&label);
1755 if (m == MATCH_ERROR)
1758 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
1760 if (gfc_match_eos () == MATCH_YES)
1762 iter.end = gfc_logical_expr (1, NULL);
1763 new_st.op = EXEC_DO_WHILE;
1767 /* Match an optional comma, if no comma is found, a space is obligatory. */
1768 if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1771 /* Check for balanced parens. */
1773 if (gfc_match_parens () == MATCH_ERROR)
1776 /* See if we have a DO WHILE. */
1777 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1779 new_st.op = EXEC_DO_WHILE;
1783 /* The abortive DO WHILE may have done something to the symbol
1784 table, so we start over. */
1785 gfc_undo_symbols ();
1786 gfc_current_locus = old_loc;
1788 gfc_match_label (); /* This won't error. */
1789 gfc_match (" do "); /* This will work. */
1791 gfc_match_st_label (&label); /* Can't error out. */
1792 gfc_match_char (','); /* Optional comma. */
1794 m = gfc_match_iterator (&iter, 0);
1797 if (m == MATCH_ERROR)
1800 iter.var->symtree->n.sym->attr.implied_index = 0;
1801 gfc_check_do_variable (iter.var->symtree);
1803 if (gfc_match_eos () != MATCH_YES)
1805 gfc_syntax_error (ST_DO);
1809 new_st.op = EXEC_DO;
1813 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1816 new_st.label1 = label;
1818 if (new_st.op == EXEC_DO_WHILE)
1819 new_st.expr1 = iter.end;
1822 new_st.ext.iterator = ip = gfc_get_iterator ();
1829 gfc_free_iterator (&iter, 0);
1835 /* Match an EXIT or CYCLE statement. */
1838 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1840 gfc_state_data *p, *o;
1844 if (gfc_match_eos () == MATCH_YES)
1848 m = gfc_match ("% %s%t", &sym);
1849 if (m == MATCH_ERROR)
1853 gfc_syntax_error (st);
1857 if (sym->attr.flavor != FL_LABEL)
1859 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1860 sym->name, gfc_ascii_statement (st));
1865 /* Find the loop mentioned specified by the label (or lack of a label). */
1866 for (o = NULL, p = gfc_state_stack; p; p = p->previous)
1867 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1869 else if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
1875 gfc_error ("%s statement at %C is not within a loop",
1876 gfc_ascii_statement (st));
1878 gfc_error ("%s statement at %C is not within loop '%s'",
1879 gfc_ascii_statement (st), sym->name);
1886 gfc_error ("%s statement at %C leaving OpenMP structured block",
1887 gfc_ascii_statement (st));
1890 else if (st == ST_EXIT
1891 && p->previous != NULL
1892 && p->previous->state == COMP_OMP_STRUCTURED_BLOCK
1893 && (p->previous->head->op == EXEC_OMP_DO
1894 || p->previous->head->op == EXEC_OMP_PARALLEL_DO))
1896 gcc_assert (p->previous->head->next != NULL);
1897 gcc_assert (p->previous->head->next->op == EXEC_DO
1898 || p->previous->head->next->op == EXEC_DO_WHILE);
1899 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
1903 /* Save the first statement in the loop - needed by the backend. */
1904 new_st.ext.whichloop = p->head;
1912 /* Match the EXIT statement. */
1915 gfc_match_exit (void)
1917 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1921 /* Match the CYCLE statement. */
1924 gfc_match_cycle (void)
1926 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1930 /* Match a number or character constant after a STOP or PAUSE statement. */
1933 gfc_match_stopcode (gfc_statement st)
1943 if (gfc_match_eos () != MATCH_YES)
1945 m = gfc_match_small_literal_int (&stop_code, &cnt);
1946 if (m == MATCH_ERROR)
1949 if (m == MATCH_YES && cnt > 5)
1951 gfc_error ("Too many digits in STOP code at %C");
1957 /* Try a character constant. */
1958 m = gfc_match_expr (&e);
1959 if (m == MATCH_ERROR)
1963 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1967 if (gfc_match_eos () != MATCH_YES)
1971 if (gfc_pure (NULL))
1973 gfc_error ("%s statement not allowed in PURE procedure at %C",
1974 gfc_ascii_statement (st));
1978 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1980 new_st.ext.stop_code = stop_code;
1985 gfc_syntax_error (st);
1994 /* Match the (deprecated) PAUSE statement. */
1997 gfc_match_pause (void)
2001 m = gfc_match_stopcode (ST_PAUSE);
2004 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
2013 /* Match the STOP statement. */
2016 gfc_match_stop (void)
2018 return gfc_match_stopcode (ST_STOP);
2022 /* Match a CONTINUE statement. */
2025 gfc_match_continue (void)
2027 if (gfc_match_eos () != MATCH_YES)
2029 gfc_syntax_error (ST_CONTINUE);
2033 new_st.op = EXEC_CONTINUE;
2038 /* Match the (deprecated) ASSIGN statement. */
2041 gfc_match_assign (void)
2044 gfc_st_label *label;
2046 if (gfc_match (" %l", &label) == MATCH_YES)
2048 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
2050 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
2052 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
2057 expr->symtree->n.sym->attr.assign = 1;
2059 new_st.op = EXEC_LABEL_ASSIGN;
2060 new_st.label1 = label;
2061 new_st.expr1 = expr;
2069 /* Match the GO TO statement. As a computed GOTO statement is
2070 matched, it is transformed into an equivalent SELECT block. No
2071 tree is necessary, and the resulting jumps-to-jumps are
2072 specifically optimized away by the back end. */
2075 gfc_match_goto (void)
2077 gfc_code *head, *tail;
2080 gfc_st_label *label;
2084 if (gfc_match (" %l%t", &label) == MATCH_YES)
2086 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2089 new_st.op = EXEC_GOTO;
2090 new_st.label1 = label;
2094 /* The assigned GO TO statement. */
2096 if (gfc_match_variable (&expr, 0) == MATCH_YES)
2098 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2103 new_st.op = EXEC_GOTO;
2104 new_st.expr1 = expr;
2106 if (gfc_match_eos () == MATCH_YES)
2109 /* Match label list. */
2110 gfc_match_char (',');
2111 if (gfc_match_char ('(') != MATCH_YES)
2113 gfc_syntax_error (ST_GOTO);
2120 m = gfc_match_st_label (&label);
2124 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2128 head = tail = gfc_get_code ();
2131 tail->block = gfc_get_code ();
2135 tail->label1 = label;
2136 tail->op = EXEC_GOTO;
2138 while (gfc_match_char (',') == MATCH_YES);
2140 if (gfc_match (")%t") != MATCH_YES)
2145 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2148 new_st.block = head;
2153 /* Last chance is a computed GO TO statement. */
2154 if (gfc_match_char ('(') != MATCH_YES)
2156 gfc_syntax_error (ST_GOTO);
2165 m = gfc_match_st_label (&label);
2169 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2173 head = tail = gfc_get_code ();
2176 tail->block = gfc_get_code ();
2180 cp = gfc_get_case ();
2181 cp->low = cp->high = gfc_int_expr (i++);
2183 tail->op = EXEC_SELECT;
2184 tail->ext.case_list = cp;
2186 tail->next = gfc_get_code ();
2187 tail->next->op = EXEC_GOTO;
2188 tail->next->label1 = label;
2190 while (gfc_match_char (',') == MATCH_YES);
2192 if (gfc_match_char (')') != MATCH_YES)
2197 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2201 /* Get the rest of the statement. */
2202 gfc_match_char (',');
2204 if (gfc_match (" %e%t", &expr) != MATCH_YES)
2207 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Computed GOTO "
2208 "at %C") == FAILURE)
2211 /* At this point, a computed GOTO has been fully matched and an
2212 equivalent SELECT statement constructed. */
2214 new_st.op = EXEC_SELECT;
2215 new_st.expr1 = NULL;
2217 /* Hack: For a "real" SELECT, the expression is in expr. We put
2218 it in expr2 so we can distinguish then and produce the correct
2220 new_st.expr2 = expr;
2221 new_st.block = head;
2225 gfc_syntax_error (ST_GOTO);
2227 gfc_free_statements (head);
2232 /* Frees a list of gfc_alloc structures. */
2235 gfc_free_alloc_list (gfc_alloc *p)
2242 gfc_free_expr (p->expr);
2248 /* Match a Fortran 2003 type-spec (F03:R401). This is similar to
2249 gfc_match_decl_type_spec() from decl.c, with the following exceptions:
2250 It only includes the intrinsic types from the Fortran 2003 standard
2251 (thus, neither BYTE nor forms like REAL*4 are allowed). Additionally,
2252 the implicit_flag is not needed, so it was removed. Derived types are
2253 identified by their name alone. */
2256 match_type_spec (gfc_typespec *ts)
2259 gfc_symbol *derived;
2263 old_locus = gfc_current_locus;
2265 if (gfc_match ("integer") == MATCH_YES)
2267 ts->type = BT_INTEGER;
2268 ts->kind = gfc_default_integer_kind;
2272 if (gfc_match ("real") == MATCH_YES)
2275 ts->kind = gfc_default_real_kind;
2279 if (gfc_match ("double precision") == MATCH_YES)
2282 ts->kind = gfc_default_double_kind;
2286 if (gfc_match ("complex") == MATCH_YES)
2288 ts->type = BT_COMPLEX;
2289 ts->kind = gfc_default_complex_kind;
2293 if (gfc_match ("character") == MATCH_YES)
2295 ts->type = BT_CHARACTER;
2299 if (gfc_match ("logical") == MATCH_YES)
2301 ts->type = BT_LOGICAL;
2302 ts->kind = gfc_default_logical_kind;
2306 if (gfc_match_symbol (&derived, 1) == MATCH_YES)
2308 if (derived->attr.flavor == FL_DERIVED)
2310 old_locus = gfc_current_locus;
2311 if (gfc_match (" :: ") != MATCH_YES)
2313 gfc_current_locus = old_locus;
2314 ts->type = BT_DERIVED;
2315 ts->u.derived = derived;
2316 /* Enfore F03:C401. */
2317 if (derived->attr.abstract)
2319 gfc_error ("Derived type '%s' at %L may not be ABSTRACT",
2320 derived->name, &old_locus);
2327 if (gfc_match (" :: ") == MATCH_YES)
2329 /* Enforce F03:C476. */
2330 gfc_error ("'%s' at %L is not an accessible derived type",
2331 derived->name, &old_locus);
2336 gfc_current_locus = old_locus;
2342 /* If a type is not matched, simply return MATCH_NO. */
2347 gfc_gobble_whitespace ();
2348 if (gfc_peek_ascii_char () == '*')
2350 gfc_error ("Invalid type-spec at %C");
2354 m = gfc_match_kind_spec (ts, false);
2357 m = MATCH_YES; /* No kind specifier found. */
2363 m = gfc_match_char_spec (ts);
2366 m = MATCH_YES; /* No kind specifier found. */
2372 /* Used in gfc_match_allocate to check that a allocation-object and
2373 a source-expr are conformable. This does not catch all possible
2374 cases; in particular a runtime checking is needed. */
2377 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
2379 /* First compare rank. */
2380 if (e2->ref && e1->rank != e2->ref->u.ar.as->rank)
2382 gfc_error ("Source-expr at %L must be scalar or have the "
2383 "same rank as the allocate-object at %L",
2384 &e1->where, &e2->where);
2395 for (i = 0; i < e1->rank; i++)
2397 if (e2->ref->u.ar.end[i])
2399 mpz_set (s, e2->ref->u.ar.end[i]->value.integer);
2400 mpz_sub (s, s, e2->ref->u.ar.start[i]->value.integer);
2401 mpz_add_ui (s, s, 1);
2405 mpz_set (s, e2->ref->u.ar.start[i]->value.integer);
2408 if (mpz_cmp (e1->shape[i], s) != 0)
2410 gfc_error ("Source-expr at %L and allocate-object at %L must "
2411 "have the same shape", &e1->where, &e2->where);
2424 /* Match an ALLOCATE statement. */
2427 gfc_match_allocate (void)
2429 gfc_alloc *head, *tail;
2430 gfc_expr *stat, *errmsg, *tmp, *source;
2434 bool saw_stat, saw_errmsg, saw_source, b1, b2, b3;
2437 stat = errmsg = source = tmp = NULL;
2438 saw_stat = saw_errmsg = saw_source = false;
2440 if (gfc_match_char ('(') != MATCH_YES)
2443 /* Match an optional type-spec. */
2444 old_locus = gfc_current_locus;
2445 m = match_type_spec (&ts);
2446 if (m == MATCH_ERROR)
2448 else if (m == MATCH_NO)
2449 ts.type = BT_UNKNOWN;
2452 if (gfc_match (" :: ") == MATCH_YES)
2454 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: typespec in "
2455 "ALLOCATE at %L", &old_locus) == FAILURE)
2460 ts.type = BT_UNKNOWN;
2461 gfc_current_locus = old_locus;
2468 head = tail = gfc_get_alloc ();
2471 tail->next = gfc_get_alloc ();
2475 m = gfc_match_variable (&tail->expr, 0);
2478 if (m == MATCH_ERROR)
2481 if (gfc_check_do_variable (tail->expr->symtree))
2484 if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2486 gfc_error ("Bad allocate-object at %C for a PURE procedure");
2490 /* The ALLOCATE statement had an optional typespec. Check the
2492 if (ts.type != BT_UNKNOWN)
2494 /* Enforce F03:C624. */
2495 if (!gfc_type_compatible (&tail->expr->ts, &ts))
2497 gfc_error ("Type of entity at %L is type incompatible with "
2498 "typespec", &tail->expr->where);
2502 /* Enforce F03:C627. */
2503 if (ts.kind != tail->expr->ts.kind)
2505 gfc_error ("Kind type parameter for entity at %L differs from "
2506 "the kind type parameter of the typespec",
2507 &tail->expr->where);
2512 if (tail->expr->ts.type == BT_DERIVED)
2513 tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
2515 /* FIXME: disable the checking on derived types and arrays. */
2516 b1 = !(tail->expr->ref
2517 && (tail->expr->ref->type == REF_COMPONENT
2518 || tail->expr->ref->type == REF_ARRAY));
2519 b2 = tail->expr->symtree->n.sym
2520 && !(tail->expr->symtree->n.sym->attr.allocatable
2521 || tail->expr->symtree->n.sym->attr.pointer
2522 || tail->expr->symtree->n.sym->attr.proc_pointer);
2523 b3 = tail->expr->symtree->n.sym
2524 && tail->expr->symtree->n.sym->ns
2525 && tail->expr->symtree->n.sym->ns->proc_name
2526 && (tail->expr->symtree->n.sym->ns->proc_name->attr.allocatable
2527 || tail->expr->symtree->n.sym->ns->proc_name->attr.pointer
2528 || tail->expr->symtree->n.sym->ns->proc_name->attr.proc_pointer);
2529 if (b1 && b2 && !b3)
2531 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2532 "or an allocatable variable");
2536 if (gfc_match_char (',') != MATCH_YES)
2541 m = gfc_match (" stat = %v", &tmp);
2542 if (m == MATCH_ERROR)
2549 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2556 if (gfc_check_do_variable (stat->symtree))
2559 if (gfc_match_char (',') == MATCH_YES)
2560 goto alloc_opt_list;
2563 m = gfc_match (" errmsg = %v", &tmp);
2564 if (m == MATCH_ERROR)
2568 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG tag at %L",
2569 &tmp->where) == FAILURE)
2575 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2582 if (gfc_match_char (',') == MATCH_YES)
2583 goto alloc_opt_list;
2586 m = gfc_match (" source = %e", &tmp);
2587 if (m == MATCH_ERROR)
2591 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SOURCE tag at %L",
2592 &tmp->where) == FAILURE)
2598 gfc_error ("Redundant SOURCE tag found at %L ", &tmp->where);
2602 /* The next 3 conditionals check C631. */
2603 if (ts.type != BT_UNKNOWN)
2605 gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
2606 &tmp->where, &old_locus);
2612 gfc_error ("SOURCE tag at %L requires only a single entity in "
2613 "the allocation-list", &tmp->where);
2617 gfc_resolve_expr (tmp);
2619 if (head->expr->ts.type != tmp->ts.type)
2621 gfc_error ("Type of entity at %L is type incompatible with "
2622 "source-expr at %L", &head->expr->where, &tmp->where);
2627 if (tmp->ts.kind != head->expr->ts.kind)
2629 gfc_error ("The allocate-object at %L and the source-expr at %L "
2630 "shall have the same kind type parameter",
2631 &head->expr->where, &tmp->where);
2635 /* Check C632 and restriction following Note 6.18. */
2636 if (tmp->rank > 0 && conformable_arrays (tmp, head->expr) == FAILURE)
2642 if (gfc_match_char (',') == MATCH_YES)
2643 goto alloc_opt_list;
2646 gfc_gobble_whitespace ();
2648 if (gfc_peek_char () == ')')
2653 if (gfc_match (" )%t") != MATCH_YES)
2656 new_st.op = EXEC_ALLOCATE;
2657 new_st.expr1 = stat;
2658 new_st.expr2 = errmsg;
2659 new_st.expr3 = source;
2660 new_st.ext.alloc_list = head;
2665 gfc_syntax_error (ST_ALLOCATE);
2668 gfc_free_expr (errmsg);
2669 gfc_free_expr (source);
2670 gfc_free_expr (stat);
2671 gfc_free_expr (tmp);
2672 gfc_free_alloc_list (head);
2677 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
2678 a set of pointer assignments to intrinsic NULL(). */
2681 gfc_match_nullify (void)
2689 if (gfc_match_char ('(') != MATCH_YES)
2694 m = gfc_match_variable (&p, 0);
2695 if (m == MATCH_ERROR)
2700 if (gfc_check_do_variable (p->symtree))
2703 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2705 gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2709 /* build ' => NULL() '. */
2710 e = gfc_get_expr ();
2711 e->where = gfc_current_locus;
2712 e->expr_type = EXPR_NULL;
2713 e->ts.type = BT_UNKNOWN;
2715 /* Chain to list. */
2720 tail->next = gfc_get_code ();
2724 tail->op = EXEC_POINTER_ASSIGN;
2728 if (gfc_match (" )%t") == MATCH_YES)
2730 if (gfc_match_char (',') != MATCH_YES)
2737 gfc_syntax_error (ST_NULLIFY);
2740 gfc_free_statements (new_st.next);
2742 gfc_free_expr (new_st.expr1);
2743 new_st.expr1 = NULL;
2744 gfc_free_expr (new_st.expr2);
2745 new_st.expr2 = NULL;
2750 /* Match a DEALLOCATE statement. */
2753 gfc_match_deallocate (void)
2755 gfc_alloc *head, *tail;
2756 gfc_expr *stat, *errmsg, *tmp;
2758 bool saw_stat, saw_errmsg;
2761 stat = errmsg = tmp = NULL;
2762 saw_stat = saw_errmsg = false;
2764 if (gfc_match_char ('(') != MATCH_YES)
2770 head = tail = gfc_get_alloc ();
2773 tail->next = gfc_get_alloc ();
2777 m = gfc_match_variable (&tail->expr, 0);
2778 if (m == MATCH_ERROR)
2783 if (gfc_check_do_variable (tail->expr->symtree))
2786 if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2788 gfc_error ("Illegal allocate-object at %C for a PURE procedure");
2792 /* FIXME: disable the checking on derived types. */
2793 if (!(tail->expr->ref
2794 && (tail->expr->ref->type == REF_COMPONENT
2795 || tail->expr->ref->type == REF_ARRAY))
2796 && tail->expr->symtree->n.sym
2797 && !(tail->expr->symtree->n.sym->attr.allocatable
2798 || tail->expr->symtree->n.sym->attr.pointer
2799 || tail->expr->symtree->n.sym->attr.proc_pointer))
2801 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2802 "or an allocatable variable");
2806 if (gfc_match_char (',') != MATCH_YES)
2811 m = gfc_match (" stat = %v", &tmp);
2812 if (m == MATCH_ERROR)
2818 gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2819 gfc_free_expr (tmp);
2826 if (gfc_check_do_variable (stat->symtree))
2829 if (gfc_match_char (',') == MATCH_YES)
2830 goto dealloc_opt_list;
2833 m = gfc_match (" errmsg = %v", &tmp);
2834 if (m == MATCH_ERROR)
2838 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2839 &tmp->where) == FAILURE)
2844 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2845 gfc_free_expr (tmp);
2852 if (gfc_match_char (',') == MATCH_YES)
2853 goto dealloc_opt_list;
2856 gfc_gobble_whitespace ();
2858 if (gfc_peek_char () == ')')
2862 if (gfc_match (" )%t") != MATCH_YES)
2865 new_st.op = EXEC_DEALLOCATE;
2866 new_st.expr1 = stat;
2867 new_st.expr2 = errmsg;
2868 new_st.ext.alloc_list = head;
2873 gfc_syntax_error (ST_DEALLOCATE);
2876 gfc_free_expr (errmsg);
2877 gfc_free_expr (stat);
2878 gfc_free_alloc_list (head);
2883 /* Match a RETURN statement. */
2886 gfc_match_return (void)
2890 gfc_compile_state s;
2893 if (gfc_match_eos () == MATCH_YES)
2896 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2898 gfc_error ("Alternate RETURN statement at %C is only allowed within "
2903 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Alternate RETURN "
2904 "at %C") == FAILURE)
2907 if (gfc_current_form == FORM_FREE)
2909 /* The following are valid, so we can't require a blank after the
2913 char c = gfc_peek_ascii_char ();
2914 if (ISALPHA (c) || ISDIGIT (c))
2918 m = gfc_match (" %e%t", &e);
2921 if (m == MATCH_ERROR)
2924 gfc_syntax_error (ST_RETURN);
2931 gfc_enclosing_unit (&s);
2932 if (s == COMP_PROGRAM
2933 && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2934 "main program at %C") == FAILURE)
2937 new_st.op = EXEC_RETURN;
2944 /* Match the call of a type-bound procedure, if CALL%var has already been
2945 matched and var found to be a derived-type variable. */
2948 match_typebound_call (gfc_symtree* varst)
2956 base = gfc_get_expr ();
2957 base->expr_type = EXPR_VARIABLE;
2958 base->symtree = varst;
2959 base->where = gfc_current_locus;
2960 gfc_set_sym_referenced (varst->n.sym);
2962 m = gfc_match_varspec (base, 0, true, true);
2964 gfc_error ("Expected component reference at %C");
2968 if (gfc_match_eos () != MATCH_YES)
2970 gfc_error ("Junk after CALL at %C");
2974 if (base->expr_type == EXPR_COMPCALL)
2975 new_st.op = EXEC_COMPCALL;
2976 else if (base->expr_type == EXPR_PPC)
2977 new_st.op = EXEC_CALL_PPC;
2980 gfc_error ("Expected type-bound procedure or procedure pointer component "
2984 new_st.expr1 = base;
2990 /* Match a CALL statement. The tricky part here are possible
2991 alternate return specifiers. We handle these by having all
2992 "subroutines" actually return an integer via a register that gives
2993 the return number. If the call specifies alternate returns, we
2994 generate code for a SELECT statement whose case clauses contain
2995 GOTOs to the various labels. */
2998 gfc_match_call (void)
3000 char name[GFC_MAX_SYMBOL_LEN + 1];
3001 gfc_actual_arglist *a, *arglist;
3011 m = gfc_match ("% %n", name);
3017 if (gfc_get_ha_sym_tree (name, &st))
3022 /* If this is a variable of derived-type, it probably starts a type-bound
3024 if (sym->attr.flavor != FL_PROCEDURE && sym->ts.type == BT_DERIVED)
3025 return match_typebound_call (st);
3027 /* If it does not seem to be callable (include functions so that the
3028 right association is made. They are thrown out in resolution.)
3030 if (!sym->attr.generic
3031 && !sym->attr.subroutine
3032 && !sym->attr.function)
3034 if (!(sym->attr.external && !sym->attr.referenced))
3036 /* ...create a symbol in this scope... */
3037 if (sym->ns != gfc_current_ns
3038 && gfc_get_sym_tree (name, NULL, &st, false) == 1)
3041 if (sym != st->n.sym)
3045 /* ...and then to try to make the symbol into a subroutine. */
3046 if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
3050 gfc_set_sym_referenced (sym);
3052 if (gfc_match_eos () != MATCH_YES)
3054 m = gfc_match_actual_arglist (1, &arglist);
3057 if (m == MATCH_ERROR)
3060 if (gfc_match_eos () != MATCH_YES)
3064 /* If any alternate return labels were found, construct a SELECT
3065 statement that will jump to the right place. */
3068 for (a = arglist; a; a = a->next)
3069 if (a->expr == NULL)
3074 gfc_symtree *select_st;
3075 gfc_symbol *select_sym;
3076 char name[GFC_MAX_SYMBOL_LEN + 1];
3078 new_st.next = c = gfc_get_code ();
3079 c->op = EXEC_SELECT;
3080 sprintf (name, "_result_%s", sym->name);
3081 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail. */
3083 select_sym = select_st->n.sym;
3084 select_sym->ts.type = BT_INTEGER;
3085 select_sym->ts.kind = gfc_default_integer_kind;
3086 gfc_set_sym_referenced (select_sym);
3087 c->expr1 = gfc_get_expr ();
3088 c->expr1->expr_type = EXPR_VARIABLE;
3089 c->expr1->symtree = select_st;
3090 c->expr1->ts = select_sym->ts;
3091 c->expr1->where = gfc_current_locus;
3094 for (a = arglist; a; a = a->next)
3096 if (a->expr != NULL)
3099 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
3104 c->block = gfc_get_code ();
3106 c->op = EXEC_SELECT;
3108 new_case = gfc_get_case ();
3109 new_case->high = new_case->low = gfc_int_expr (i);
3110 c->ext.case_list = new_case;
3112 c->next = gfc_get_code ();
3113 c->next->op = EXEC_GOTO;
3114 c->next->label1 = a->label;
3118 new_st.op = EXEC_CALL;
3119 new_st.symtree = st;
3120 new_st.ext.actual = arglist;
3125 gfc_syntax_error (ST_CALL);
3128 gfc_free_actual_arglist (arglist);
3133 /* Given a name, return a pointer to the common head structure,
3134 creating it if it does not exist. If FROM_MODULE is nonzero, we
3135 mangle the name so that it doesn't interfere with commons defined
3136 in the using namespace.
3137 TODO: Add to global symbol tree. */
3140 gfc_get_common (const char *name, int from_module)
3143 static int serial = 0;
3144 char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
3148 /* A use associated common block is only needed to correctly layout
3149 the variables it contains. */
3150 snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
3151 st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
3155 st = gfc_find_symtree (gfc_current_ns->common_root, name);
3158 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
3161 if (st->n.common == NULL)
3163 st->n.common = gfc_get_common_head ();
3164 st->n.common->where = gfc_current_locus;
3165 strcpy (st->n.common->name, name);
3168 return st->n.common;
3172 /* Match a common block name. */
3174 match match_common_name (char *name)
3178 if (gfc_match_char ('/') == MATCH_NO)
3184 if (gfc_match_char ('/') == MATCH_YES)
3190 m = gfc_match_name (name);
3192 if (m == MATCH_ERROR)
3194 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
3197 gfc_error ("Syntax error in common block name at %C");
3202 /* Match a COMMON statement. */
3205 gfc_match_common (void)
3207 gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
3208 char name[GFC_MAX_SYMBOL_LEN + 1];
3215 old_blank_common = gfc_current_ns->blank_common.head;
3216 if (old_blank_common)
3218 while (old_blank_common->common_next)
3219 old_blank_common = old_blank_common->common_next;
3226 m = match_common_name (name);
3227 if (m == MATCH_ERROR)
3230 gsym = gfc_get_gsymbol (name);
3231 if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
3233 gfc_error ("Symbol '%s' at %C is already an external symbol that "
3234 "is not COMMON", name);
3238 if (gsym->type == GSYM_UNKNOWN)
3240 gsym->type = GSYM_COMMON;
3241 gsym->where = gfc_current_locus;
3247 if (name[0] == '\0')
3249 t = &gfc_current_ns->blank_common;
3250 if (t->head == NULL)
3251 t->where = gfc_current_locus;
3255 t = gfc_get_common (name, 0);
3264 while (tail->common_next)
3265 tail = tail->common_next;
3268 /* Grab the list of symbols. */
3271 m = gfc_match_symbol (&sym, 0);
3272 if (m == MATCH_ERROR)
3277 /* Store a ref to the common block for error checking. */
3278 sym->common_block = t;
3280 /* See if we know the current common block is bind(c), and if
3281 so, then see if we can check if the symbol is (which it'll
3282 need to be). This can happen if the bind(c) attr stmt was
3283 applied to the common block, and the variable(s) already
3284 defined, before declaring the common block. */
3285 if (t->is_bind_c == 1)
3287 if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
3289 /* If we find an error, just print it and continue,
3290 cause it's just semantic, and we can see if there
3292 gfc_error_now ("Variable '%s' at %L in common block '%s' "
3293 "at %C must be declared with a C "
3294 "interoperable kind since common block "
3296 sym->name, &(sym->declared_at), t->name,
3300 if (sym->attr.is_bind_c == 1)
3301 gfc_error_now ("Variable '%s' in common block "
3302 "'%s' at %C can not be bind(c) since "
3303 "it is not global", sym->name, t->name);
3306 if (sym->attr.in_common)
3308 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
3313 if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
3314 || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
3316 if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
3317 "can only be COMMON in "
3318 "BLOCK DATA", sym->name)
3323 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
3327 tail->common_next = sym;
3333 /* Deal with an optional array specification after the
3335 m = gfc_match_array_spec (&as);
3336 if (m == MATCH_ERROR)
3341 if (as->type != AS_EXPLICIT)
3343 gfc_error ("Array specification for symbol '%s' in COMMON "
3344 "at %C must be explicit", sym->name);
3348 if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3351 if (sym->attr.pointer)
3353 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3354 "POINTER array", sym->name);
3363 sym->common_head = t;
3365 /* Check to see if the symbol is already in an equivalence group.
3366 If it is, set the other members as being in common. */
3367 if (sym->attr.in_equivalence)
3369 for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3371 for (e2 = e1; e2; e2 = e2->eq)
3372 if (e2->expr->symtree->n.sym == sym)
3379 for (e2 = e1; e2; e2 = e2->eq)
3381 other = e2->expr->symtree->n.sym;
3382 if (other->common_head
3383 && other->common_head != sym->common_head)
3385 gfc_error ("Symbol '%s', in COMMON block '%s' at "
3386 "%C is being indirectly equivalenced to "
3387 "another COMMON block '%s'",
3388 sym->name, sym->common_head->name,
3389 other->common_head->name);
3392 other->attr.in_common = 1;
3393 other->common_head = t;
3399 gfc_gobble_whitespace ();
3400 if (gfc_match_eos () == MATCH_YES)
3402 if (gfc_peek_ascii_char () == '/')
3404 if (gfc_match_char (',') != MATCH_YES)
3406 gfc_gobble_whitespace ();
3407 if (gfc_peek_ascii_char () == '/')
3416 gfc_syntax_error (ST_COMMON);
3419 if (old_blank_common)
3420 old_blank_common->common_next = NULL;
3422 gfc_current_ns->blank_common.head = NULL;
3423 gfc_free_array_spec (as);
3428 /* Match a BLOCK DATA program unit. */
3431 gfc_match_block_data (void)
3433 char name[GFC_MAX_SYMBOL_LEN + 1];
3437 if (gfc_match_eos () == MATCH_YES)
3439 gfc_new_block = NULL;
3443 m = gfc_match ("% %n%t", name);
3447 if (gfc_get_symbol (name, NULL, &sym))
3450 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3453 gfc_new_block = sym;
3459 /* Free a namelist structure. */
3462 gfc_free_namelist (gfc_namelist *name)
3466 for (; name; name = n)
3474 /* Match a NAMELIST statement. */
3477 gfc_match_namelist (void)
3479 gfc_symbol *group_name, *sym;
3483 m = gfc_match (" / %s /", &group_name);
3486 if (m == MATCH_ERROR)
3491 if (group_name->ts.type != BT_UNKNOWN)
3493 gfc_error ("Namelist group name '%s' at %C already has a basic "
3494 "type of %s", group_name->name,
3495 gfc_typename (&group_name->ts));
3499 if (group_name->attr.flavor == FL_NAMELIST
3500 && group_name->attr.use_assoc
3501 && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3502 "at %C already is USE associated and can"
3503 "not be respecified.", group_name->name)
3507 if (group_name->attr.flavor != FL_NAMELIST
3508 && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3509 group_name->name, NULL) == FAILURE)
3514 m = gfc_match_symbol (&sym, 1);
3517 if (m == MATCH_ERROR)
3520 if (sym->attr.in_namelist == 0
3521 && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3524 /* Use gfc_error_check here, rather than goto error, so that
3525 these are the only errors for the next two lines. */
3526 if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3528 gfc_error ("Assumed size array '%s' in namelist '%s' at "
3529 "%C is not allowed", sym->name, group_name->name);
3533 if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl->length == NULL)
3535 gfc_error ("Assumed character length '%s' in namelist '%s' at "
3536 "%C is not allowed", sym->name, group_name->name);
3540 nl = gfc_get_namelist ();
3544 if (group_name->namelist == NULL)
3545 group_name->namelist = group_name->namelist_tail = nl;
3548 group_name->namelist_tail->next = nl;
3549 group_name->namelist_tail = nl;
3552 if (gfc_match_eos () == MATCH_YES)
3555 m = gfc_match_char (',');
3557 if (gfc_match_char ('/') == MATCH_YES)
3559 m2 = gfc_match (" %s /", &group_name);
3560 if (m2 == MATCH_YES)
3562 if (m2 == MATCH_ERROR)
3576 gfc_syntax_error (ST_NAMELIST);
3583 /* Match a MODULE statement. */
3586 gfc_match_module (void)
3590 m = gfc_match (" %s%t", &gfc_new_block);
3594 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3595 gfc_new_block->name, NULL) == FAILURE)
3602 /* Free equivalence sets and lists. Recursively is the easiest way to
3606 gfc_free_equiv (gfc_equiv *eq)
3611 gfc_free_equiv (eq->eq);
3612 gfc_free_equiv (eq->next);
3613 gfc_free_expr (eq->expr);
3618 /* Match an EQUIVALENCE statement. */
3621 gfc_match_equivalence (void)
3623 gfc_equiv *eq, *set, *tail;
3627 gfc_common_head *common_head = NULL;
3635 eq = gfc_get_equiv ();
3639 eq->next = gfc_current_ns->equiv;
3640 gfc_current_ns->equiv = eq;
3642 if (gfc_match_char ('(') != MATCH_YES)
3646 common_flag = FALSE;
3651 m = gfc_match_equiv_variable (&set->expr);
3652 if (m == MATCH_ERROR)
3657 /* count the number of objects. */
3660 if (gfc_match_char ('%') == MATCH_YES)
3662 gfc_error ("Derived type component %C is not a "
3663 "permitted EQUIVALENCE member");
3667 for (ref = set->expr->ref; ref; ref = ref->next)
3668 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3670 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3671 "be an array section");
3675 sym = set->expr->symtree->n.sym;
3677 if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3680 if (sym->attr.in_common)
3683 common_head = sym->common_head;
3686 if (gfc_match_char (')') == MATCH_YES)
3689 if (gfc_match_char (',') != MATCH_YES)
3692 set->eq = gfc_get_equiv ();
3698 gfc_error ("EQUIVALENCE at %C requires two or more objects");
3702 /* If one of the members of an equivalence is in common, then
3703 mark them all as being in common. Before doing this, check
3704 that members of the equivalence group are not in different
3707 for (set = eq; set; set = set->eq)
3709 sym = set->expr->symtree->n.sym;
3710 if (sym->common_head && sym->common_head != common_head)
3712 gfc_error ("Attempt to indirectly overlap COMMON "
3713 "blocks %s and %s by EQUIVALENCE at %C",
3714 sym->common_head->name, common_head->name);
3717 sym->attr.in_common = 1;
3718 sym->common_head = common_head;
3721 if (gfc_match_eos () == MATCH_YES)
3723 if (gfc_match_char (',') != MATCH_YES)
3730 gfc_syntax_error (ST_EQUIVALENCE);
3736 gfc_free_equiv (gfc_current_ns->equiv);
3737 gfc_current_ns->equiv = eq;
3743 /* Check that a statement function is not recursive. This is done by looking
3744 for the statement function symbol(sym) by looking recursively through its
3745 expression(e). If a reference to sym is found, true is returned.
3746 12.5.4 requires that any variable of function that is implicitly typed
3747 shall have that type confirmed by any subsequent type declaration. The
3748 implicit typing is conveniently done here. */
3750 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3753 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3759 switch (e->expr_type)
3762 if (e->symtree == NULL)
3765 /* Check the name before testing for nested recursion! */
3766 if (sym->name == e->symtree->n.sym->name)
3769 /* Catch recursion via other statement functions. */
3770 if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3771 && e->symtree->n.sym->value
3772 && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3775 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3776 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3781 if (e->symtree && sym->name == e->symtree->n.sym->name)
3784 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3785 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3797 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3799 return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3803 /* Match a statement function declaration. It is so easy to match
3804 non-statement function statements with a MATCH_ERROR as opposed to
3805 MATCH_NO that we suppress error message in most cases. */
3808 gfc_match_st_function (void)
3810 gfc_error_buf old_error;
3815 m = gfc_match_symbol (&sym, 0);
3819 gfc_push_error (&old_error);
3821 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3822 sym->name, NULL) == FAILURE)
3825 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3828 m = gfc_match (" = %e%t", &expr);
3832 gfc_free_error (&old_error);
3833 if (m == MATCH_ERROR)
3836 if (recursive_stmt_fcn (expr, sym))
3838 gfc_error ("Statement function at %L is recursive", &expr->where);
3844 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
3845 "Statement function at %C") == FAILURE)
3851 gfc_pop_error (&old_error);
3856 /***************** SELECT CASE subroutines ******************/
3858 /* Free a single case structure. */
3861 free_case (gfc_case *p)
3863 if (p->low == p->high)
3865 gfc_free_expr (p->low);
3866 gfc_free_expr (p->high);
3871 /* Free a list of case structures. */
3874 gfc_free_case_list (gfc_case *p)
3886 /* Match a single case selector. */
3889 match_case_selector (gfc_case **cp)
3894 c = gfc_get_case ();
3895 c->where = gfc_current_locus;
3897 if (gfc_match_char (':') == MATCH_YES)
3899 m = gfc_match_init_expr (&c->high);
3902 if (m == MATCH_ERROR)
3907 m = gfc_match_init_expr (&c->low);
3908 if (m == MATCH_ERROR)
3913 /* If we're not looking at a ':' now, make a range out of a single
3914 target. Else get the upper bound for the case range. */
3915 if (gfc_match_char (':') != MATCH_YES)
3919 m = gfc_match_init_expr (&c->high);
3920 if (m == MATCH_ERROR)
3922 /* MATCH_NO is fine. It's OK if nothing is there! */
3930 gfc_error ("Expected initialization expression in CASE at %C");
3938 /* Match the end of a case statement. */
3941 match_case_eos (void)
3943 char name[GFC_MAX_SYMBOL_LEN + 1];
3946 if (gfc_match_eos () == MATCH_YES)
3949 /* If the case construct doesn't have a case-construct-name, we
3950 should have matched the EOS. */
3951 if (!gfc_current_block ())
3953 gfc_error ("Expected the name of the SELECT CASE construct at %C");
3957 gfc_gobble_whitespace ();
3959 m = gfc_match_name (name);
3963 if (strcmp (name, gfc_current_block ()->name) != 0)
3965 gfc_error ("Expected case name of '%s' at %C",
3966 gfc_current_block ()->name);
3970 return gfc_match_eos ();
3974 /* Match a SELECT statement. */
3977 gfc_match_select (void)
3982 m = gfc_match_label ();
3983 if (m == MATCH_ERROR)
3986 m = gfc_match (" select case ( %e )%t", &expr);
3990 new_st.op = EXEC_SELECT;
3991 new_st.expr1 = expr;
3997 /* Match a CASE statement. */
4000 gfc_match_case (void)
4002 gfc_case *c, *head, *tail;
4007 if (gfc_current_state () != COMP_SELECT)
4009 gfc_error ("Unexpected CASE statement at %C");
4013 if (gfc_match ("% default") == MATCH_YES)
4015 m = match_case_eos ();
4018 if (m == MATCH_ERROR)
4021 new_st.op = EXEC_SELECT;
4022 c = gfc_get_case ();
4023 c->where = gfc_current_locus;
4024 new_st.ext.case_list = c;
4028 if (gfc_match_char ('(') != MATCH_YES)
4033 if (match_case_selector (&c) == MATCH_ERROR)
4043 if (gfc_match_char (')') == MATCH_YES)
4045 if (gfc_match_char (',') != MATCH_YES)
4049 m = match_case_eos ();
4052 if (m == MATCH_ERROR)
4055 new_st.op = EXEC_SELECT;
4056 new_st.ext.case_list = head;
4061 gfc_error ("Syntax error in CASE-specification at %C");
4064 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
4068 /********************* WHERE subroutines ********************/
4070 /* Match the rest of a simple WHERE statement that follows an IF statement.
4074 match_simple_where (void)
4080 m = gfc_match (" ( %e )", &expr);
4084 m = gfc_match_assignment ();
4087 if (m == MATCH_ERROR)
4090 if (gfc_match_eos () != MATCH_YES)
4093 c = gfc_get_code ();
4097 c->next = gfc_get_code ();
4100 gfc_clear_new_st ();
4102 new_st.op = EXEC_WHERE;
4108 gfc_syntax_error (ST_WHERE);
4111 gfc_free_expr (expr);
4116 /* Match a WHERE statement. */
4119 gfc_match_where (gfc_statement *st)
4125 m0 = gfc_match_label ();
4126 if (m0 == MATCH_ERROR)
4129 m = gfc_match (" where ( %e )", &expr);
4133 if (gfc_match_eos () == MATCH_YES)
4135 *st = ST_WHERE_BLOCK;
4136 new_st.op = EXEC_WHERE;
4137 new_st.expr1 = expr;
4141 m = gfc_match_assignment ();
4143 gfc_syntax_error (ST_WHERE);
4147 gfc_free_expr (expr);
4151 /* We've got a simple WHERE statement. */
4153 c = gfc_get_code ();
4157 c->next = gfc_get_code ();
4160 gfc_clear_new_st ();
4162 new_st.op = EXEC_WHERE;
4169 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
4170 new_st if successful. */
4173 gfc_match_elsewhere (void)
4175 char name[GFC_MAX_SYMBOL_LEN + 1];
4179 if (gfc_current_state () != COMP_WHERE)
4181 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
4187 if (gfc_match_char ('(') == MATCH_YES)
4189 m = gfc_match_expr (&expr);
4192 if (m == MATCH_ERROR)
4195 if (gfc_match_char (')') != MATCH_YES)
4199 if (gfc_match_eos () != MATCH_YES)
4201 /* Only makes sense if we have a where-construct-name. */
4202 if (!gfc_current_block ())
4207 /* Better be a name at this point. */
4208 m = gfc_match_name (name);
4211 if (m == MATCH_ERROR)
4214 if (gfc_match_eos () != MATCH_YES)
4217 if (strcmp (name, gfc_current_block ()->name) != 0)
4219 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
4220 name, gfc_current_block ()->name);
4225 new_st.op = EXEC_WHERE;
4226 new_st.expr1 = expr;
4230 gfc_syntax_error (ST_ELSEWHERE);
4233 gfc_free_expr (expr);
4238 /******************** FORALL subroutines ********************/
4240 /* Free a list of FORALL iterators. */
4243 gfc_free_forall_iterator (gfc_forall_iterator *iter)
4245 gfc_forall_iterator *next;
4250 gfc_free_expr (iter->var);
4251 gfc_free_expr (iter->start);
4252 gfc_free_expr (iter->end);
4253 gfc_free_expr (iter->stride);
4260 /* Match an iterator as part of a FORALL statement. The format is:
4262 <var> = <start>:<end>[:<stride>]
4264 On MATCH_NO, the caller tests for the possibility that there is a
4265 scalar mask expression. */
4268 match_forall_iterator (gfc_forall_iterator **result)
4270 gfc_forall_iterator *iter;
4274 where = gfc_current_locus;
4275 iter = XCNEW (gfc_forall_iterator);
4277 m = gfc_match_expr (&iter->var);
4281 if (gfc_match_char ('=') != MATCH_YES
4282 || iter->var->expr_type != EXPR_VARIABLE)
4288 m = gfc_match_expr (&iter->start);
4292 if (gfc_match_char (':') != MATCH_YES)
4295 m = gfc_match_expr (&iter->end);
4298 if (m == MATCH_ERROR)
4301 if (gfc_match_char (':') == MATCH_NO)
4302 iter->stride = gfc_int_expr (1);
4305 m = gfc_match_expr (&iter->stride);
4308 if (m == MATCH_ERROR)
4312 /* Mark the iteration variable's symbol as used as a FORALL index. */
4313 iter->var->symtree->n.sym->forall_index = true;
4319 gfc_error ("Syntax error in FORALL iterator at %C");
4324 gfc_current_locus = where;
4325 gfc_free_forall_iterator (iter);
4330 /* Match the header of a FORALL statement. */
4333 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
4335 gfc_forall_iterator *head, *tail, *new_iter;
4339 gfc_gobble_whitespace ();
4344 if (gfc_match_char ('(') != MATCH_YES)
4347 m = match_forall_iterator (&new_iter);
4348 if (m == MATCH_ERROR)
4353 head = tail = new_iter;
4357 if (gfc_match_char (',') != MATCH_YES)
4360 m = match_forall_iterator (&new_iter);
4361 if (m == MATCH_ERROR)
4366 tail->next = new_iter;
4371 /* Have to have a mask expression. */
4373 m = gfc_match_expr (&msk);
4376 if (m == MATCH_ERROR)
4382 if (gfc_match_char (')') == MATCH_NO)
4390 gfc_syntax_error (ST_FORALL);
4393 gfc_free_expr (msk);
4394 gfc_free_forall_iterator (head);
4399 /* Match the rest of a simple FORALL statement that follows an
4403 match_simple_forall (void)
4405 gfc_forall_iterator *head;
4414 m = match_forall_header (&head, &mask);
4421 m = gfc_match_assignment ();
4423 if (m == MATCH_ERROR)
4427 m = gfc_match_pointer_assignment ();
4428 if (m == MATCH_ERROR)
4434 c = gfc_get_code ();
4436 c->loc = gfc_current_locus;
4438 if (gfc_match_eos () != MATCH_YES)
4441 gfc_clear_new_st ();
4442 new_st.op = EXEC_FORALL;
4443 new_st.expr1 = mask;
4444 new_st.ext.forall_iterator = head;
4445 new_st.block = gfc_get_code ();
4447 new_st.block->op = EXEC_FORALL;
4448 new_st.block->next = c;
4453 gfc_syntax_error (ST_FORALL);
4456 gfc_free_forall_iterator (head);
4457 gfc_free_expr (mask);
4463 /* Match a FORALL statement. */
4466 gfc_match_forall (gfc_statement *st)
4468 gfc_forall_iterator *head;
4477 m0 = gfc_match_label ();
4478 if (m0 == MATCH_ERROR)
4481 m = gfc_match (" forall");
4485 m = match_forall_header (&head, &mask);
4486 if (m == MATCH_ERROR)
4491 if (gfc_match_eos () == MATCH_YES)
4493 *st = ST_FORALL_BLOCK;
4494 new_st.op = EXEC_FORALL;
4495 new_st.expr1 = mask;
4496 new_st.ext.forall_iterator = head;
4500 m = gfc_match_assignment ();
4501 if (m == MATCH_ERROR)
4505 m = gfc_match_pointer_assignment ();
4506 if (m == MATCH_ERROR)
4512 c = gfc_get_code ();
4514 c->loc = gfc_current_locus;
4516 gfc_clear_new_st ();
4517 new_st.op = EXEC_FORALL;
4518 new_st.expr1 = mask;
4519 new_st.ext.forall_iterator = head;
4520 new_st.block = gfc_get_code ();
4521 new_st.block->op = EXEC_FORALL;
4522 new_st.block->next = c;
4528 gfc_syntax_error (ST_FORALL);
4531 gfc_free_forall_iterator (head);
4532 gfc_free_expr (mask);
4533 gfc_free_statements (c);