1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
31 /* For matching and debugging purposes. Order matters here! The
32 unary operators /must/ precede the binary plus and minus, or
33 the expression parser breaks. */
35 mstring intrinsic_operators[] = {
36 minit ("+", INTRINSIC_UPLUS),
37 minit ("-", INTRINSIC_UMINUS),
38 minit ("+", INTRINSIC_PLUS),
39 minit ("-", INTRINSIC_MINUS),
40 minit ("**", INTRINSIC_POWER),
41 minit ("//", INTRINSIC_CONCAT),
42 minit ("*", INTRINSIC_TIMES),
43 minit ("/", INTRINSIC_DIVIDE),
44 minit (".and.", INTRINSIC_AND),
45 minit (".or.", INTRINSIC_OR),
46 minit (".eqv.", INTRINSIC_EQV),
47 minit (".neqv.", INTRINSIC_NEQV),
48 minit (".eq.", INTRINSIC_EQ),
49 minit ("==", INTRINSIC_EQ),
50 minit (".ne.", INTRINSIC_NE),
51 minit ("/=", INTRINSIC_NE),
52 minit (".ge.", INTRINSIC_GE),
53 minit (">=", INTRINSIC_GE),
54 minit (".le.", INTRINSIC_LE),
55 minit ("<=", INTRINSIC_LE),
56 minit (".lt.", INTRINSIC_LT),
57 minit ("<", INTRINSIC_LT),
58 minit (".gt.", INTRINSIC_GT),
59 minit (">", INTRINSIC_GT),
60 minit (".not.", INTRINSIC_NOT),
61 minit ("parens", INTRINSIC_PARENTHESES),
62 minit (NULL, INTRINSIC_NONE)
66 /******************** Generic matching subroutines ************************/
68 /* In free form, match at least one space. Always matches in fixed
72 gfc_match_space (void)
77 if (gfc_current_form == FORM_FIXED)
80 old_loc = gfc_current_locus;
83 if (!gfc_is_whitespace (c))
85 gfc_current_locus = old_loc;
89 gfc_gobble_whitespace ();
95 /* Match an end of statement. End of statement is optional
96 whitespace, followed by a ';' or '\n' or comment '!'. If a
97 semicolon is found, we continue to eat whitespace and semicolons. */
109 old_loc = gfc_current_locus;
110 gfc_gobble_whitespace ();
112 c = gfc_next_char ();
118 c = gfc_next_char ();
135 gfc_current_locus = old_loc;
136 return (flag) ? MATCH_YES : MATCH_NO;
140 /* Match a literal integer on the input, setting the value on
141 MATCH_YES. Literal ints occur in kind-parameters as well as
142 old-style character length specifications. If cnt is non-NULL it
143 will be set to the number of digits. */
146 gfc_match_small_literal_int (int *value, int *cnt)
152 old_loc = gfc_current_locus;
154 gfc_gobble_whitespace ();
155 c = gfc_next_char ();
161 gfc_current_locus = old_loc;
170 old_loc = gfc_current_locus;
171 c = gfc_next_char ();
176 i = 10 * i + c - '0';
181 gfc_error ("Integer too large at %C");
186 gfc_current_locus = old_loc;
195 /* Match a small, constant integer expression, like in a kind
196 statement. On MATCH_YES, 'value' is set. */
199 gfc_match_small_int (int *value)
206 m = gfc_match_expr (&expr);
210 p = gfc_extract_int (expr, &i);
211 gfc_free_expr (expr);
224 /* Matches a statement label. Uses gfc_match_small_literal_int() to
225 do most of the work. */
228 gfc_match_st_label (gfc_st_label ** label)
234 old_loc = gfc_current_locus;
236 m = gfc_match_small_literal_int (&i, &cnt);
242 gfc_error ("Too many digits in statement label at %C");
248 gfc_error ("Statement label at %C is zero");
252 *label = gfc_get_st_label (i);
257 gfc_current_locus = old_loc;
262 /* Match and validate a label associated with a named IF, DO or SELECT
263 statement. If the symbol does not have the label attribute, we add
264 it. We also make sure the symbol does not refer to another
265 (active) block. A matched label is pointed to by gfc_new_block. */
268 gfc_match_label (void)
270 char name[GFC_MAX_SYMBOL_LEN + 1];
273 gfc_new_block = NULL;
275 m = gfc_match (" %n :", name);
279 if (gfc_get_symbol (name, NULL, &gfc_new_block))
281 gfc_error ("Label name '%s' at %C is ambiguous", name);
285 if (gfc_new_block->attr.flavor == FL_LABEL)
287 gfc_error ("Duplicate construct label '%s' at %C", name);
291 if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
292 gfc_new_block->name, NULL) == FAILURE)
299 /* Try and match the input against an array of possibilities. If one
300 potential matching string is a substring of another, the longest
301 match takes precedence. Spaces in the target strings are optional
302 spaces that do not necessarily have to be found in the input
303 stream. In fixed mode, spaces never appear. If whitespace is
304 matched, it matches unlimited whitespace in the input. For this
305 reason, the 'mp' member of the mstring structure is used to track
306 the progress of each potential match.
308 If there is no match we return the tag associated with the
309 terminating NULL mstring structure and leave the locus pointer
310 where it started. If there is a match we return the tag member of
311 the matched mstring and leave the locus pointer after the matched
314 A '%' character is a mandatory space. */
317 gfc_match_strings (mstring * a)
319 mstring *p, *best_match;
320 int no_match, c, possibles;
325 for (p = a; p->string != NULL; p++)
334 match_loc = gfc_current_locus;
336 gfc_gobble_whitespace ();
338 while (possibles > 0)
340 c = gfc_next_char ();
342 /* Apply the next character to the current possibilities. */
343 for (p = a; p->string != NULL; p++)
350 /* Space matches 1+ whitespace(s). */
351 if ((gfc_current_form == FORM_FREE)
352 && gfc_is_whitespace (c))
370 match_loc = gfc_current_locus;
378 gfc_current_locus = match_loc;
380 return (best_match == NULL) ? no_match : best_match->tag;
384 /* See if the current input looks like a name of some sort. Modifies
385 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long. */
388 gfc_match_name (char *buffer)
393 old_loc = gfc_current_locus;
394 gfc_gobble_whitespace ();
396 c = gfc_next_char ();
399 gfc_current_locus = old_loc;
409 if (i > gfc_option.max_identifier_length)
411 gfc_error ("Name at %C is too long");
415 old_loc = gfc_current_locus;
416 c = gfc_next_char ();
420 || (gfc_option.flag_dollar_ok && c == '$'));
423 gfc_current_locus = old_loc;
429 /* Match a symbol on the input. Modifies the pointer to the symbol
430 pointer if successful. */
433 gfc_match_sym_tree (gfc_symtree ** matched_symbol, int host_assoc)
435 char buffer[GFC_MAX_SYMBOL_LEN + 1];
438 m = gfc_match_name (buffer);
443 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
444 ? MATCH_ERROR : MATCH_YES;
446 if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
454 gfc_match_symbol (gfc_symbol ** matched_symbol, int host_assoc)
459 m = gfc_match_sym_tree (&st, host_assoc);
464 *matched_symbol = st->n.sym;
466 *matched_symbol = NULL;
469 *matched_symbol = NULL;
473 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
474 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
478 gfc_match_intrinsic_op (gfc_intrinsic_op * result)
482 op = (gfc_intrinsic_op) gfc_match_strings (intrinsic_operators);
484 if (op == INTRINSIC_NONE)
492 /* Match a loop control phrase:
494 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
496 If the final integer expression is not present, a constant unity
497 expression is returned. We don't return MATCH_ERROR until after
498 the equals sign is seen. */
501 gfc_match_iterator (gfc_iterator * iter, int init_flag)
503 char name[GFC_MAX_SYMBOL_LEN + 1];
504 gfc_expr *var, *e1, *e2, *e3;
508 /* Match the start of an iterator without affecting the symbol
511 start = gfc_current_locus;
512 m = gfc_match (" %n =", name);
513 gfc_current_locus = start;
518 m = gfc_match_variable (&var, 0);
522 gfc_match_char ('=');
526 if (var->ref != NULL)
528 gfc_error ("Loop variable at %C cannot be a sub-component");
532 if (var->symtree->n.sym->attr.intent == INTENT_IN)
534 gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
535 var->symtree->n.sym->name);
539 if (var->symtree->n.sym->attr.pointer)
541 gfc_error ("Loop variable at %C cannot have the POINTER attribute");
545 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
548 if (m == MATCH_ERROR)
551 if (gfc_match_char (',') != MATCH_YES)
554 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
557 if (m == MATCH_ERROR)
560 if (gfc_match_char (',') != MATCH_YES)
562 e3 = gfc_int_expr (1);
566 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
567 if (m == MATCH_ERROR)
571 gfc_error ("Expected a step value in iterator at %C");
583 gfc_error ("Syntax error in iterator at %C");
594 /* Tries to match the next non-whitespace character on the input.
595 This subroutine does not return MATCH_ERROR. */
598 gfc_match_char (char c)
602 where = gfc_current_locus;
603 gfc_gobble_whitespace ();
605 if (gfc_next_char () == c)
608 gfc_current_locus = where;
613 /* General purpose matching subroutine. The target string is a
614 scanf-like format string in which spaces correspond to arbitrary
615 whitespace (including no whitespace), characters correspond to
616 themselves. The %-codes are:
618 %% Literal percent sign
619 %e Expression, pointer to a pointer is set
620 %s Symbol, pointer to the symbol is set
621 %n Name, character buffer is set to name
622 %t Matches end of statement.
623 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
624 %l Matches a statement label
625 %v Matches a variable expression (an lvalue)
626 % Matches a required space (in free form) and optional spaces. */
629 gfc_match (const char *target, ...)
631 gfc_st_label **label;
640 old_loc = gfc_current_locus;
641 va_start (argp, target);
651 gfc_gobble_whitespace ();
662 vp = va_arg (argp, void **);
663 n = gfc_match_expr ((gfc_expr **) vp);
674 vp = va_arg (argp, void **);
675 n = gfc_match_variable ((gfc_expr **) vp, 0);
686 vp = va_arg (argp, void **);
687 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
698 np = va_arg (argp, char *);
699 n = gfc_match_name (np);
710 label = va_arg (argp, gfc_st_label **);
711 n = gfc_match_st_label (label);
722 ip = va_arg (argp, int *);
723 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
734 if (gfc_match_eos () != MATCH_YES)
742 if (gfc_match_space () == MATCH_YES)
748 break; /* Fall through to character matcher */
751 gfc_internal_error ("gfc_match(): Bad match code %c", c);
755 if (c == gfc_next_char ())
765 /* Clean up after a failed match. */
766 gfc_current_locus = old_loc;
767 va_start (argp, target);
770 for (; matches > 0; matches--)
780 /* Matches that don't have to be undone */
785 (void)va_arg (argp, void **);
790 vp = va_arg (argp, void **);
804 /*********************** Statement level matching **********************/
806 /* Matches the start of a program unit, which is the program keyword
807 followed by an obligatory symbol. */
810 gfc_match_program (void)
815 m = gfc_match ("% %s%t", &sym);
819 gfc_error ("Invalid form of PROGRAM statement at %C");
823 if (m == MATCH_ERROR)
826 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
835 /* Match a simple assignment statement. */
838 gfc_match_assignment (void)
840 gfc_expr *lvalue, *rvalue;
844 old_loc = gfc_current_locus;
846 lvalue = rvalue = NULL;
847 m = gfc_match (" %v =", &lvalue);
851 if (lvalue->symtree->n.sym->attr.flavor == FL_PARAMETER)
853 gfc_error ("Cannot assign to a PARAMETER variable at %C");
858 m = gfc_match (" %e%t", &rvalue);
862 gfc_set_sym_referenced (lvalue->symtree->n.sym);
864 new_st.op = EXEC_ASSIGN;
865 new_st.expr = lvalue;
866 new_st.expr2 = rvalue;
868 gfc_check_do_variable (lvalue->symtree);
873 gfc_current_locus = old_loc;
874 gfc_free_expr (lvalue);
875 gfc_free_expr (rvalue);
880 /* Match a pointer assignment statement. */
883 gfc_match_pointer_assignment (void)
885 gfc_expr *lvalue, *rvalue;
889 old_loc = gfc_current_locus;
891 lvalue = rvalue = NULL;
893 m = gfc_match (" %v =>", &lvalue);
900 m = gfc_match (" %e%t", &rvalue);
904 new_st.op = EXEC_POINTER_ASSIGN;
905 new_st.expr = lvalue;
906 new_st.expr2 = rvalue;
911 gfc_current_locus = old_loc;
912 gfc_free_expr (lvalue);
913 gfc_free_expr (rvalue);
918 /* We try to match an easy arithmetic IF statement. This only happens
919 when just after having encountered a simple IF statement. This code
920 is really duplicate with parts of the gfc_match_if code, but this is
923 match_arithmetic_if (void)
925 gfc_st_label *l1, *l2, *l3;
929 m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
933 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
934 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
935 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
937 gfc_free_expr (expr);
941 if (gfc_notify_std (GFC_STD_F95_DEL,
942 "Obsolete: arithmetic IF statement at %C") == FAILURE)
945 new_st.op = EXEC_ARITHMETIC_IF;
955 /* The IF statement is a bit of a pain. First of all, there are three
956 forms of it, the simple IF, the IF that starts a block and the
959 There is a problem with the simple IF and that is the fact that we
960 only have a single level of undo information on symbols. What this
961 means is for a simple IF, we must re-match the whole IF statement
962 multiple times in order to guarantee that the symbol table ends up
963 in the proper state. */
965 static match match_simple_forall (void);
966 static match match_simple_where (void);
969 gfc_match_if (gfc_statement * if_type)
972 gfc_st_label *l1, *l2, *l3;
977 n = gfc_match_label ();
978 if (n == MATCH_ERROR)
981 old_loc = gfc_current_locus;
983 m = gfc_match (" if ( %e", &expr);
987 if (gfc_match_char (')') != MATCH_YES)
989 gfc_error ("Syntax error in IF-expression at %C");
990 gfc_free_expr (expr);
994 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1001 ("Block label not appropriate for arithmetic IF statement "
1004 gfc_free_expr (expr);
1008 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1009 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1010 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1013 gfc_free_expr (expr);
1017 if (gfc_notify_std (GFC_STD_F95_DEL,
1018 "Obsolete: arithmetic IF statement at %C")
1022 new_st.op = EXEC_ARITHMETIC_IF;
1028 *if_type = ST_ARITHMETIC_IF;
1032 if (gfc_match (" then%t") == MATCH_YES)
1034 new_st.op = EXEC_IF;
1037 *if_type = ST_IF_BLOCK;
1043 gfc_error ("Block label is not appropriate IF statement at %C");
1045 gfc_free_expr (expr);
1049 /* At this point the only thing left is a simple IF statement. At
1050 this point, n has to be MATCH_NO, so we don't have to worry about
1051 re-matching a block label. From what we've got so far, try
1052 matching an assignment. */
1054 *if_type = ST_SIMPLE_IF;
1056 m = gfc_match_assignment ();
1060 gfc_free_expr (expr);
1061 gfc_undo_symbols ();
1062 gfc_current_locus = old_loc;
1064 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1066 m = gfc_match_pointer_assignment ();
1070 gfc_free_expr (expr);
1071 gfc_undo_symbols ();
1072 gfc_current_locus = old_loc;
1074 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1076 /* Look at the next keyword to see which matcher to call. Matching
1077 the keyword doesn't affect the symbol table, so we don't have to
1078 restore between tries. */
1080 #define match(string, subr, statement) \
1081 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1085 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1086 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1087 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1088 match ("call", gfc_match_call, ST_CALL)
1089 match ("close", gfc_match_close, ST_CLOSE)
1090 match ("continue", gfc_match_continue, ST_CONTINUE)
1091 match ("cycle", gfc_match_cycle, ST_CYCLE)
1092 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1093 match ("end file", gfc_match_endfile, ST_END_FILE)
1094 match ("exit", gfc_match_exit, ST_EXIT)
1095 match ("flush", gfc_match_flush, ST_FLUSH)
1096 match ("forall", match_simple_forall, ST_FORALL)
1097 match ("go to", gfc_match_goto, ST_GOTO)
1098 match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1099 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1100 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1101 match ("open", gfc_match_open, ST_OPEN)
1102 match ("pause", gfc_match_pause, ST_NONE)
1103 match ("print", gfc_match_print, ST_WRITE)
1104 match ("read", gfc_match_read, ST_READ)
1105 match ("return", gfc_match_return, ST_RETURN)
1106 match ("rewind", gfc_match_rewind, ST_REWIND)
1107 match ("stop", gfc_match_stop, ST_STOP)
1108 match ("where", match_simple_where, ST_WHERE)
1109 match ("write", gfc_match_write, ST_WRITE)
1111 /* All else has failed, so give up. See if any of the matchers has
1112 stored an error message of some sort. */
1113 if (gfc_error_check () == 0)
1114 gfc_error ("Unclassifiable statement in IF-clause at %C");
1116 gfc_free_expr (expr);
1121 gfc_error ("Syntax error in IF-clause at %C");
1124 gfc_free_expr (expr);
1128 /* At this point, we've matched the single IF and the action clause
1129 is in new_st. Rearrange things so that the IF statement appears
1132 p = gfc_get_code ();
1133 p->next = gfc_get_code ();
1135 p->next->loc = gfc_current_locus;
1140 gfc_clear_new_st ();
1142 new_st.op = EXEC_IF;
1151 /* Match an ELSE statement. */
1154 gfc_match_else (void)
1156 char name[GFC_MAX_SYMBOL_LEN + 1];
1158 if (gfc_match_eos () == MATCH_YES)
1161 if (gfc_match_name (name) != MATCH_YES
1162 || gfc_current_block () == NULL
1163 || gfc_match_eos () != MATCH_YES)
1165 gfc_error ("Unexpected junk after ELSE statement at %C");
1169 if (strcmp (name, gfc_current_block ()->name) != 0)
1171 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1172 name, gfc_current_block ()->name);
1180 /* Match an ELSE IF statement. */
1183 gfc_match_elseif (void)
1185 char name[GFC_MAX_SYMBOL_LEN + 1];
1189 m = gfc_match (" ( %e ) then", &expr);
1193 if (gfc_match_eos () == MATCH_YES)
1196 if (gfc_match_name (name) != MATCH_YES
1197 || gfc_current_block () == NULL
1198 || gfc_match_eos () != MATCH_YES)
1200 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1204 if (strcmp (name, gfc_current_block ()->name) != 0)
1206 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1207 name, gfc_current_block ()->name);
1212 new_st.op = EXEC_IF;
1217 gfc_free_expr (expr);
1222 /* Free a gfc_iterator structure. */
1225 gfc_free_iterator (gfc_iterator * iter, int flag)
1231 gfc_free_expr (iter->var);
1232 gfc_free_expr (iter->start);
1233 gfc_free_expr (iter->end);
1234 gfc_free_expr (iter->step);
1241 /* Match a DO statement. */
1246 gfc_iterator iter, *ip;
1248 gfc_st_label *label;
1251 old_loc = gfc_current_locus;
1254 iter.var = iter.start = iter.end = iter.step = NULL;
1256 m = gfc_match_label ();
1257 if (m == MATCH_ERROR)
1260 if (gfc_match (" do") != MATCH_YES)
1263 m = gfc_match_st_label (&label);
1264 if (m == MATCH_ERROR)
1267 /* Match an infinite DO, make it like a DO WHILE(.TRUE.) */
1269 if (gfc_match_eos () == MATCH_YES)
1271 iter.end = gfc_logical_expr (1, NULL);
1272 new_st.op = EXEC_DO_WHILE;
1276 /* match an optional comma, if no comma is found a space is obligatory. */
1277 if (gfc_match_char(',') != MATCH_YES
1278 && gfc_match ("% ") != MATCH_YES)
1281 /* See if we have a DO WHILE. */
1282 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1284 new_st.op = EXEC_DO_WHILE;
1288 /* The abortive DO WHILE may have done something to the symbol
1289 table, so we start over: */
1290 gfc_undo_symbols ();
1291 gfc_current_locus = old_loc;
1293 gfc_match_label (); /* This won't error */
1294 gfc_match (" do "); /* This will work */
1296 gfc_match_st_label (&label); /* Can't error out */
1297 gfc_match_char (','); /* Optional comma */
1299 m = gfc_match_iterator (&iter, 0);
1302 if (m == MATCH_ERROR)
1305 gfc_check_do_variable (iter.var->symtree);
1307 if (gfc_match_eos () != MATCH_YES)
1309 gfc_syntax_error (ST_DO);
1313 new_st.op = EXEC_DO;
1317 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1320 new_st.label = label;
1322 if (new_st.op == EXEC_DO_WHILE)
1323 new_st.expr = iter.end;
1326 new_st.ext.iterator = ip = gfc_get_iterator ();
1333 gfc_free_iterator (&iter, 0);
1339 /* Match an EXIT or CYCLE statement. */
1342 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1348 if (gfc_match_eos () == MATCH_YES)
1352 m = gfc_match ("% %s%t", &sym);
1353 if (m == MATCH_ERROR)
1357 gfc_syntax_error (st);
1361 if (sym->attr.flavor != FL_LABEL)
1363 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1364 sym->name, gfc_ascii_statement (st));
1369 /* Find the loop mentioned specified by the label (or lack of a
1371 for (p = gfc_state_stack; p; p = p->previous)
1372 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1378 gfc_error ("%s statement at %C is not within a loop",
1379 gfc_ascii_statement (st));
1381 gfc_error ("%s statement at %C is not within loop '%s'",
1382 gfc_ascii_statement (st), sym->name);
1387 /* Save the first statement in the loop - needed by the backend. */
1388 new_st.ext.whichloop = p->head;
1391 /* new_st.sym = sym;*/
1397 /* Match the EXIT statement. */
1400 gfc_match_exit (void)
1403 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1407 /* Match the CYCLE statement. */
1410 gfc_match_cycle (void)
1413 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1417 /* Match a number or character constant after a STOP or PAUSE statement. */
1420 gfc_match_stopcode (gfc_statement st)
1430 if (gfc_match_eos () != MATCH_YES)
1432 m = gfc_match_small_literal_int (&stop_code, &cnt);
1433 if (m == MATCH_ERROR)
1436 if (m == MATCH_YES && cnt > 5)
1438 gfc_error ("Too many digits in STOP code at %C");
1444 /* Try a character constant. */
1445 m = gfc_match_expr (&e);
1446 if (m == MATCH_ERROR)
1450 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1454 if (gfc_match_eos () != MATCH_YES)
1458 if (gfc_pure (NULL))
1460 gfc_error ("%s statement not allowed in PURE procedure at %C",
1461 gfc_ascii_statement (st));
1465 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1467 new_st.ext.stop_code = stop_code;
1472 gfc_syntax_error (st);
1480 /* Match the (deprecated) PAUSE statement. */
1483 gfc_match_pause (void)
1487 m = gfc_match_stopcode (ST_PAUSE);
1490 if (gfc_notify_std (GFC_STD_F95_DEL,
1491 "Obsolete: PAUSE statement at %C")
1499 /* Match the STOP statement. */
1502 gfc_match_stop (void)
1504 return gfc_match_stopcode (ST_STOP);
1508 /* Match a CONTINUE statement. */
1511 gfc_match_continue (void)
1514 if (gfc_match_eos () != MATCH_YES)
1516 gfc_syntax_error (ST_CONTINUE);
1520 new_st.op = EXEC_CONTINUE;
1525 /* Match the (deprecated) ASSIGN statement. */
1528 gfc_match_assign (void)
1531 gfc_st_label *label;
1533 if (gfc_match (" %l", &label) == MATCH_YES)
1535 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
1537 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
1539 if (gfc_notify_std (GFC_STD_F95_DEL,
1540 "Obsolete: ASSIGN statement at %C")
1544 expr->symtree->n.sym->attr.assign = 1;
1546 new_st.op = EXEC_LABEL_ASSIGN;
1547 new_st.label = label;
1556 /* Match the GO TO statement. As a computed GOTO statement is
1557 matched, it is transformed into an equivalent SELECT block. No
1558 tree is necessary, and the resulting jumps-to-jumps are
1559 specifically optimized away by the back end. */
1562 gfc_match_goto (void)
1564 gfc_code *head, *tail;
1567 gfc_st_label *label;
1571 if (gfc_match (" %l%t", &label) == MATCH_YES)
1573 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1576 new_st.op = EXEC_GOTO;
1577 new_st.label = label;
1581 /* The assigned GO TO statement. */
1583 if (gfc_match_variable (&expr, 0) == MATCH_YES)
1585 if (gfc_notify_std (GFC_STD_F95_DEL,
1586 "Obsolete: Assigned GOTO statement at %C")
1590 new_st.op = EXEC_GOTO;
1593 if (gfc_match_eos () == MATCH_YES)
1596 /* Match label list. */
1597 gfc_match_char (',');
1598 if (gfc_match_char ('(') != MATCH_YES)
1600 gfc_syntax_error (ST_GOTO);
1607 m = gfc_match_st_label (&label);
1611 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1615 head = tail = gfc_get_code ();
1618 tail->block = gfc_get_code ();
1622 tail->label = label;
1623 tail->op = EXEC_GOTO;
1625 while (gfc_match_char (',') == MATCH_YES);
1627 if (gfc_match (")%t") != MATCH_YES)
1633 "Statement label list in GOTO at %C cannot be empty");
1636 new_st.block = head;
1641 /* Last chance is a computed GO TO statement. */
1642 if (gfc_match_char ('(') != MATCH_YES)
1644 gfc_syntax_error (ST_GOTO);
1653 m = gfc_match_st_label (&label);
1657 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1661 head = tail = gfc_get_code ();
1664 tail->block = gfc_get_code ();
1668 cp = gfc_get_case ();
1669 cp->low = cp->high = gfc_int_expr (i++);
1671 tail->op = EXEC_SELECT;
1672 tail->ext.case_list = cp;
1674 tail->next = gfc_get_code ();
1675 tail->next->op = EXEC_GOTO;
1676 tail->next->label = label;
1678 while (gfc_match_char (',') == MATCH_YES);
1680 if (gfc_match_char (')') != MATCH_YES)
1685 gfc_error ("Statement label list in GOTO at %C cannot be empty");
1689 /* Get the rest of the statement. */
1690 gfc_match_char (',');
1692 if (gfc_match (" %e%t", &expr) != MATCH_YES)
1695 /* At this point, a computed GOTO has been fully matched and an
1696 equivalent SELECT statement constructed. */
1698 new_st.op = EXEC_SELECT;
1701 /* Hack: For a "real" SELECT, the expression is in expr. We put
1702 it in expr2 so we can distinguish then and produce the correct
1704 new_st.expr2 = expr;
1705 new_st.block = head;
1709 gfc_syntax_error (ST_GOTO);
1711 gfc_free_statements (head);
1716 /* Frees a list of gfc_alloc structures. */
1719 gfc_free_alloc_list (gfc_alloc * p)
1726 gfc_free_expr (p->expr);
1732 /* Match an ALLOCATE statement. */
1735 gfc_match_allocate (void)
1737 gfc_alloc *head, *tail;
1744 if (gfc_match_char ('(') != MATCH_YES)
1750 head = tail = gfc_get_alloc ();
1753 tail->next = gfc_get_alloc ();
1757 m = gfc_match_variable (&tail->expr, 0);
1760 if (m == MATCH_ERROR)
1763 if (gfc_check_do_variable (tail->expr->symtree))
1767 && gfc_impure_variable (tail->expr->symtree->n.sym))
1769 gfc_error ("Bad allocate-object in ALLOCATE statement at %C for a "
1774 if (gfc_match_char (',') != MATCH_YES)
1777 m = gfc_match (" stat = %v", &stat);
1778 if (m == MATCH_ERROR)
1786 if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1789 ("STAT variable '%s' of ALLOCATE statement at %C cannot be "
1790 "INTENT(IN)", stat->symtree->n.sym->name);
1794 if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
1797 ("Illegal STAT variable in ALLOCATE statement at %C for a PURE "
1802 if (stat->symtree->n.sym->attr.flavor != FL_VARIABLE)
1804 gfc_error("STAT expression at %C must be a variable");
1808 gfc_check_do_variable(stat->symtree);
1811 if (gfc_match (" )%t") != MATCH_YES)
1814 new_st.op = EXEC_ALLOCATE;
1816 new_st.ext.alloc_list = head;
1821 gfc_syntax_error (ST_ALLOCATE);
1824 gfc_free_expr (stat);
1825 gfc_free_alloc_list (head);
1830 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
1831 a set of pointer assignments to intrinsic NULL(). */
1834 gfc_match_nullify (void)
1842 if (gfc_match_char ('(') != MATCH_YES)
1847 m = gfc_match_variable (&p, 0);
1848 if (m == MATCH_ERROR)
1853 if (gfc_check_do_variable(p->symtree))
1856 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
1859 ("Illegal variable in NULLIFY at %C for a PURE procedure");
1863 /* build ' => NULL() ' */
1864 e = gfc_get_expr ();
1865 e->where = gfc_current_locus;
1866 e->expr_type = EXPR_NULL;
1867 e->ts.type = BT_UNKNOWN;
1874 tail->next = gfc_get_code ();
1878 tail->op = EXEC_POINTER_ASSIGN;
1882 if (gfc_match (" )%t") == MATCH_YES)
1884 if (gfc_match_char (',') != MATCH_YES)
1891 gfc_syntax_error (ST_NULLIFY);
1894 gfc_free_statements (new_st.next);
1899 /* Match a DEALLOCATE statement. */
1902 gfc_match_deallocate (void)
1904 gfc_alloc *head, *tail;
1911 if (gfc_match_char ('(') != MATCH_YES)
1917 head = tail = gfc_get_alloc ();
1920 tail->next = gfc_get_alloc ();
1924 m = gfc_match_variable (&tail->expr, 0);
1925 if (m == MATCH_ERROR)
1930 if (gfc_check_do_variable (tail->expr->symtree))
1934 && gfc_impure_variable (tail->expr->symtree->n.sym))
1937 ("Illegal deallocate-expression in DEALLOCATE at %C for a PURE "
1942 if (gfc_match_char (',') != MATCH_YES)
1945 m = gfc_match (" stat = %v", &stat);
1946 if (m == MATCH_ERROR)
1954 if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1956 gfc_error ("STAT variable '%s' of DEALLOCATE statement at %C "
1957 "cannot be INTENT(IN)", stat->symtree->n.sym->name);
1961 if (gfc_pure(NULL) && gfc_impure_variable (stat->symtree->n.sym))
1963 gfc_error ("Illegal STAT variable in DEALLOCATE statement at %C "
1964 "for a PURE procedure");
1968 if (stat->symtree->n.sym->attr.flavor != FL_VARIABLE)
1970 gfc_error("STAT expression at %C must be a variable");
1974 gfc_check_do_variable(stat->symtree);
1977 if (gfc_match (" )%t") != MATCH_YES)
1980 new_st.op = EXEC_DEALLOCATE;
1982 new_st.ext.alloc_list = head;
1987 gfc_syntax_error (ST_DEALLOCATE);
1990 gfc_free_expr (stat);
1991 gfc_free_alloc_list (head);
1996 /* Match a RETURN statement. */
1999 gfc_match_return (void)
2003 gfc_compile_state s;
2007 if (gfc_match_eos () == MATCH_YES)
2010 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2012 gfc_error ("Alternate RETURN statement at %C is only allowed within "
2017 if (gfc_current_form == FORM_FREE)
2019 /* The following are valid, so we can't require a blank after the
2023 c = gfc_peek_char ();
2024 if (ISALPHA (c) || ISDIGIT (c))
2028 m = gfc_match (" %e%t", &e);
2031 if (m == MATCH_ERROR)
2034 gfc_syntax_error (ST_RETURN);
2041 gfc_enclosing_unit (&s);
2042 if (s == COMP_PROGRAM
2043 && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2044 "main program at %C") == FAILURE)
2047 new_st.op = EXEC_RETURN;
2054 /* Match a CALL statement. The tricky part here are possible
2055 alternate return specifiers. We handle these by having all
2056 "subroutines" actually return an integer via a register that gives
2057 the return number. If the call specifies alternate returns, we
2058 generate code for a SELECT statement whose case clauses contain
2059 GOTOs to the various labels. */
2062 gfc_match_call (void)
2064 char name[GFC_MAX_SYMBOL_LEN + 1];
2065 gfc_actual_arglist *a, *arglist;
2075 m = gfc_match ("% %n", name);
2081 if (gfc_get_ha_sym_tree (name, &st))
2085 gfc_set_sym_referenced (sym);
2087 if (!sym->attr.generic
2088 && !sym->attr.subroutine
2089 && gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2092 if (gfc_match_eos () != MATCH_YES)
2094 m = gfc_match_actual_arglist (1, &arglist);
2097 if (m == MATCH_ERROR)
2100 if (gfc_match_eos () != MATCH_YES)
2104 /* If any alternate return labels were found, construct a SELECT
2105 statement that will jump to the right place. */
2108 for (a = arglist; a; a = a->next)
2109 if (a->expr == NULL)
2114 gfc_symtree *select_st;
2115 gfc_symbol *select_sym;
2116 char name[GFC_MAX_SYMBOL_LEN + 1];
2118 new_st.next = c = gfc_get_code ();
2119 c->op = EXEC_SELECT;
2120 sprintf (name, "_result_%s",sym->name);
2121 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail */
2123 select_sym = select_st->n.sym;
2124 select_sym->ts.type = BT_INTEGER;
2125 select_sym->ts.kind = gfc_default_integer_kind;
2126 gfc_set_sym_referenced (select_sym);
2127 c->expr = gfc_get_expr ();
2128 c->expr->expr_type = EXPR_VARIABLE;
2129 c->expr->symtree = select_st;
2130 c->expr->ts = select_sym->ts;
2131 c->expr->where = gfc_current_locus;
2134 for (a = arglist; a; a = a->next)
2136 if (a->expr != NULL)
2139 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2144 c->block = gfc_get_code ();
2146 c->op = EXEC_SELECT;
2148 new_case = gfc_get_case ();
2149 new_case->high = new_case->low = gfc_int_expr (i);
2150 c->ext.case_list = new_case;
2152 c->next = gfc_get_code ();
2153 c->next->op = EXEC_GOTO;
2154 c->next->label = a->label;
2158 new_st.op = EXEC_CALL;
2159 new_st.symtree = st;
2160 new_st.ext.actual = arglist;
2165 gfc_syntax_error (ST_CALL);
2168 gfc_free_actual_arglist (arglist);
2173 /* Given a name, return a pointer to the common head structure,
2174 creating it if it does not exist. If FROM_MODULE is nonzero, we
2175 mangle the name so that it doesn't interfere with commons defined
2176 in the using namespace.
2177 TODO: Add to global symbol tree. */
2180 gfc_get_common (const char *name, int from_module)
2183 static int serial = 0;
2184 char mangled_name[GFC_MAX_SYMBOL_LEN+1];
2188 /* A use associated common block is only needed to correctly layout
2189 the variables it contains. */
2190 snprintf(mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
2191 st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
2195 st = gfc_find_symtree (gfc_current_ns->common_root, name);
2198 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2201 if (st->n.common == NULL)
2203 st->n.common = gfc_get_common_head ();
2204 st->n.common->where = gfc_current_locus;
2205 strcpy (st->n.common->name, name);
2208 return st->n.common;
2212 /* Match a common block name. */
2215 match_common_name (char *name)
2219 if (gfc_match_char ('/') == MATCH_NO)
2225 if (gfc_match_char ('/') == MATCH_YES)
2231 m = gfc_match_name (name);
2233 if (m == MATCH_ERROR)
2235 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2238 gfc_error ("Syntax error in common block name at %C");
2243 /* Match a COMMON statement. */
2246 gfc_match_common (void)
2248 gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
2249 char name[GFC_MAX_SYMBOL_LEN+1];
2252 gfc_equiv * e1, * e2;
2256 old_blank_common = gfc_current_ns->blank_common.head;
2257 if (old_blank_common)
2259 while (old_blank_common->common_next)
2260 old_blank_common = old_blank_common->common_next;
2267 m = match_common_name (name);
2268 if (m == MATCH_ERROR)
2271 gsym = gfc_get_gsymbol (name);
2272 if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
2274 gfc_error ("Symbol '%s' at %C is already an external symbol that is not COMMON",
2279 if (gsym->type == GSYM_UNKNOWN)
2281 gsym->type = GSYM_COMMON;
2282 gsym->where = gfc_current_locus;
2288 if (name[0] == '\0')
2290 t = &gfc_current_ns->blank_common;
2291 if (t->head == NULL)
2292 t->where = gfc_current_locus;
2297 t = gfc_get_common (name, 0);
2306 while (tail->common_next)
2307 tail = tail->common_next;
2310 /* Grab the list of symbols. */
2313 m = gfc_match_symbol (&sym, 0);
2314 if (m == MATCH_ERROR)
2319 if (sym->attr.in_common)
2321 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2326 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
2329 if (sym->value != NULL
2330 && (name[0] == '\0' || !sym->attr.data))
2332 if (name[0] == '\0')
2333 gfc_error ("Previously initialized symbol '%s' in "
2334 "blank COMMON block at %C", sym->name);
2336 gfc_error ("Previously initialized symbol '%s' in "
2337 "COMMON block '%s' at %C", sym->name, name);
2341 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
2344 /* Derived type names must have the SEQUENCE attribute. */
2345 if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.sequence)
2348 ("Derived type variable in COMMON at %C does not have the "
2349 "SEQUENCE attribute");
2354 tail->common_next = sym;
2360 /* Deal with an optional array specification after the
2362 m = gfc_match_array_spec (&as);
2363 if (m == MATCH_ERROR)
2368 if (as->type != AS_EXPLICIT)
2371 ("Array specification for symbol '%s' in COMMON at %C "
2372 "must be explicit", sym->name);
2376 if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
2379 if (sym->attr.pointer)
2382 ("Symbol '%s' in COMMON at %C cannot be a POINTER array",
2392 sym->common_head = t;
2394 /* Check to see if the symbol is already in an equivalence group.
2395 If it is, set the other members as being in common. */
2396 if (sym->attr.in_equivalence)
2398 for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
2400 for (e2 = e1; e2; e2 = e2->eq)
2401 if (e2->expr->symtree->n.sym == sym)
2408 for (e2 = e1; e2; e2 = e2->eq)
2410 other = e2->expr->symtree->n.sym;
2411 if (other->common_head
2412 && other->common_head != sym->common_head)
2414 gfc_error ("Symbol '%s', in COMMON block '%s' at "
2415 "%C is being indirectly equivalenced to "
2416 "another COMMON block '%s'",
2418 sym->common_head->name,
2419 other->common_head->name);
2422 other->attr.in_common = 1;
2423 other->common_head = t;
2429 gfc_gobble_whitespace ();
2430 if (gfc_match_eos () == MATCH_YES)
2432 if (gfc_peek_char () == '/')
2434 if (gfc_match_char (',') != MATCH_YES)
2436 gfc_gobble_whitespace ();
2437 if (gfc_peek_char () == '/')
2446 gfc_syntax_error (ST_COMMON);
2449 if (old_blank_common)
2450 old_blank_common->common_next = NULL;
2452 gfc_current_ns->blank_common.head = NULL;
2453 gfc_free_array_spec (as);
2458 /* Match a BLOCK DATA program unit. */
2461 gfc_match_block_data (void)
2463 char name[GFC_MAX_SYMBOL_LEN + 1];
2467 if (gfc_match_eos () == MATCH_YES)
2469 gfc_new_block = NULL;
2473 m = gfc_match ("% %n%t", name);
2477 if (gfc_get_symbol (name, NULL, &sym))
2480 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
2483 gfc_new_block = sym;
2489 /* Free a namelist structure. */
2492 gfc_free_namelist (gfc_namelist * name)
2496 for (; name; name = n)
2504 /* Match a NAMELIST statement. */
2507 gfc_match_namelist (void)
2509 gfc_symbol *group_name, *sym;
2513 m = gfc_match (" / %s /", &group_name);
2516 if (m == MATCH_ERROR)
2521 if (group_name->ts.type != BT_UNKNOWN)
2524 ("Namelist group name '%s' at %C already has a basic type "
2525 "of %s", group_name->name, gfc_typename (&group_name->ts));
2529 if (group_name->attr.flavor == FL_NAMELIST
2530 && group_name->attr.use_assoc
2531 && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
2532 "at %C already is USE associated and can"
2533 "not be respecified.", group_name->name)
2537 if (group_name->attr.flavor != FL_NAMELIST
2538 && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
2539 group_name->name, NULL) == FAILURE)
2544 m = gfc_match_symbol (&sym, 1);
2547 if (m == MATCH_ERROR)
2550 if (sym->attr.in_namelist == 0
2551 && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
2554 /* Use gfc_error_check here, rather than goto error, so that this
2555 these are the only errors for the next two lines. */
2556 if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
2558 gfc_error ("Assumed size array '%s' in namelist '%s'at "
2559 "%C is not allowed.", sym->name, group_name->name);
2563 if (sym->as && sym->as->type == AS_ASSUMED_SHAPE
2564 && gfc_notify_std (GFC_STD_GNU, "Assumed shape array '%s' in "
2565 "namelist '%s' at %C is an extension.",
2566 sym->name, group_name->name) == FAILURE)
2569 nl = gfc_get_namelist ();
2572 if (group_name->namelist == NULL)
2573 group_name->namelist = group_name->namelist_tail = nl;
2576 group_name->namelist_tail->next = nl;
2577 group_name->namelist_tail = nl;
2580 if (gfc_match_eos () == MATCH_YES)
2583 m = gfc_match_char (',');
2585 if (gfc_match_char ('/') == MATCH_YES)
2587 m2 = gfc_match (" %s /", &group_name);
2588 if (m2 == MATCH_YES)
2590 if (m2 == MATCH_ERROR)
2604 gfc_syntax_error (ST_NAMELIST);
2611 /* Match a MODULE statement. */
2614 gfc_match_module (void)
2618 m = gfc_match (" %s%t", &gfc_new_block);
2622 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
2623 gfc_new_block->name, NULL) == FAILURE)
2630 /* Free equivalence sets and lists. Recursively is the easiest way to
2634 gfc_free_equiv (gfc_equiv * eq)
2640 gfc_free_equiv (eq->eq);
2641 gfc_free_equiv (eq->next);
2643 gfc_free_expr (eq->expr);
2648 /* Match an EQUIVALENCE statement. */
2651 gfc_match_equivalence (void)
2653 gfc_equiv *eq, *set, *tail;
2657 gfc_common_head *common_head = NULL;
2665 eq = gfc_get_equiv ();
2669 eq->next = gfc_current_ns->equiv;
2670 gfc_current_ns->equiv = eq;
2672 if (gfc_match_char ('(') != MATCH_YES)
2676 common_flag = FALSE;
2681 m = gfc_match_equiv_variable (&set->expr);
2682 if (m == MATCH_ERROR)
2687 /* count the number of objects. */
2690 if (gfc_match_char ('%') == MATCH_YES)
2692 gfc_error ("Derived type component %C is not a "
2693 "permitted EQUIVALENCE member");
2697 for (ref = set->expr->ref; ref; ref = ref->next)
2698 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2701 ("Array reference in EQUIVALENCE at %C cannot be an "
2706 sym = set->expr->symtree->n.sym;
2708 if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL)
2712 if (sym->attr.in_common)
2715 common_head = sym->common_head;
2718 if (gfc_match_char (')') == MATCH_YES)
2721 if (gfc_match_char (',') != MATCH_YES)
2724 set->eq = gfc_get_equiv ();
2730 gfc_error ("EQUIVALENCE at %C requires two or more objects");
2734 /* If one of the members of an equivalence is in common, then
2735 mark them all as being in common. Before doing this, check
2736 that members of the equivalence group are not in different
2739 for (set = eq; set; set = set->eq)
2741 sym = set->expr->symtree->n.sym;
2742 if (sym->common_head && sym->common_head != common_head)
2744 gfc_error ("Attempt to indirectly overlap COMMON "
2745 "blocks %s and %s by EQUIVALENCE at %C",
2746 sym->common_head->name,
2750 sym->attr.in_common = 1;
2751 sym->common_head = common_head;
2754 if (gfc_match_eos () == MATCH_YES)
2756 if (gfc_match_char (',') != MATCH_YES)
2763 gfc_syntax_error (ST_EQUIVALENCE);
2769 gfc_free_equiv (gfc_current_ns->equiv);
2770 gfc_current_ns->equiv = eq;
2775 /* Check that a statement function is not recursive. This is done by looking
2776 for the statement function symbol(sym) by looking recursively through its
2777 expression(e). If a reference to sym is found, true is returned. */
2779 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
2781 gfc_actual_arglist *arg;
2788 switch (e->expr_type)
2791 for (arg = e->value.function.actual; arg; arg = arg->next)
2793 if (sym->name == arg->name
2794 || recursive_stmt_fcn (arg->expr, sym))
2798 if (e->symtree == NULL)
2801 /* Check the name before testing for nested recursion! */
2802 if (sym->name == e->symtree->n.sym->name)
2805 /* Catch recursion via other statement functions. */
2806 if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
2807 && e->symtree->n.sym->value
2808 && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
2814 if (e->symtree && sym->name == e->symtree->n.sym->name)
2819 if (recursive_stmt_fcn (e->value.op.op1, sym)
2820 || recursive_stmt_fcn (e->value.op.op2, sym))
2828 /* Component references do not need to be checked. */
2831 for (ref = e->ref; ref; ref = ref->next)
2836 for (i = 0; i < ref->u.ar.dimen; i++)
2838 if (recursive_stmt_fcn (ref->u.ar.start[i], sym)
2839 || recursive_stmt_fcn (ref->u.ar.end[i], sym)
2840 || recursive_stmt_fcn (ref->u.ar.stride[i], sym))
2846 if (recursive_stmt_fcn (ref->u.ss.start, sym)
2847 || recursive_stmt_fcn (ref->u.ss.end, sym))
2861 /* Match a statement function declaration. It is so easy to match
2862 non-statement function statements with a MATCH_ERROR as opposed to
2863 MATCH_NO that we suppress error message in most cases. */
2866 gfc_match_st_function (void)
2868 gfc_error_buf old_error;
2873 m = gfc_match_symbol (&sym, 0);
2877 gfc_push_error (&old_error);
2879 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
2880 sym->name, NULL) == FAILURE)
2883 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
2886 m = gfc_match (" = %e%t", &expr);
2890 gfc_free_error (&old_error);
2891 if (m == MATCH_ERROR)
2894 if (recursive_stmt_fcn (expr, sym))
2896 gfc_error ("Statement function at %L is recursive",
2906 gfc_pop_error (&old_error);
2911 /***************** SELECT CASE subroutines ******************/
2913 /* Free a single case structure. */
2916 free_case (gfc_case * p)
2918 if (p->low == p->high)
2920 gfc_free_expr (p->low);
2921 gfc_free_expr (p->high);
2926 /* Free a list of case structures. */
2929 gfc_free_case_list (gfc_case * p)
2941 /* Match a single case selector. */
2944 match_case_selector (gfc_case ** cp)
2949 c = gfc_get_case ();
2950 c->where = gfc_current_locus;
2952 if (gfc_match_char (':') == MATCH_YES)
2954 m = gfc_match_init_expr (&c->high);
2957 if (m == MATCH_ERROR)
2963 m = gfc_match_init_expr (&c->low);
2964 if (m == MATCH_ERROR)
2969 /* If we're not looking at a ':' now, make a range out of a single
2970 target. Else get the upper bound for the case range. */
2971 if (gfc_match_char (':') != MATCH_YES)
2975 m = gfc_match_init_expr (&c->high);
2976 if (m == MATCH_ERROR)
2978 /* MATCH_NO is fine. It's OK if nothing is there! */
2986 gfc_error ("Expected initialization expression in CASE at %C");
2994 /* Match the end of a case statement. */
2997 match_case_eos (void)
2999 char name[GFC_MAX_SYMBOL_LEN + 1];
3002 if (gfc_match_eos () == MATCH_YES)
3005 gfc_gobble_whitespace ();
3007 m = gfc_match_name (name);
3011 if (strcmp (name, gfc_current_block ()->name) != 0)
3013 gfc_error ("Expected case name of '%s' at %C",
3014 gfc_current_block ()->name);
3018 return gfc_match_eos ();
3022 /* Match a SELECT statement. */
3025 gfc_match_select (void)
3030 m = gfc_match_label ();
3031 if (m == MATCH_ERROR)
3034 m = gfc_match (" select case ( %e )%t", &expr);
3038 new_st.op = EXEC_SELECT;
3045 /* Match a CASE statement. */
3048 gfc_match_case (void)
3050 gfc_case *c, *head, *tail;
3055 if (gfc_current_state () != COMP_SELECT)
3057 gfc_error ("Unexpected CASE statement at %C");
3061 if (gfc_match ("% default") == MATCH_YES)
3063 m = match_case_eos ();
3066 if (m == MATCH_ERROR)
3069 new_st.op = EXEC_SELECT;
3070 c = gfc_get_case ();
3071 c->where = gfc_current_locus;
3072 new_st.ext.case_list = c;
3076 if (gfc_match_char ('(') != MATCH_YES)
3081 if (match_case_selector (&c) == MATCH_ERROR)
3091 if (gfc_match_char (')') == MATCH_YES)
3093 if (gfc_match_char (',') != MATCH_YES)
3097 m = match_case_eos ();
3100 if (m == MATCH_ERROR)
3103 new_st.op = EXEC_SELECT;
3104 new_st.ext.case_list = head;
3109 gfc_error ("Syntax error in CASE-specification at %C");
3112 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
3116 /********************* WHERE subroutines ********************/
3118 /* Match the rest of a simple WHERE statement that follows an IF statement.
3122 match_simple_where (void)
3128 m = gfc_match (" ( %e )", &expr);
3132 m = gfc_match_assignment ();
3135 if (m == MATCH_ERROR)
3138 if (gfc_match_eos () != MATCH_YES)
3141 c = gfc_get_code ();
3145 c->next = gfc_get_code ();
3148 gfc_clear_new_st ();
3150 new_st.op = EXEC_WHERE;
3156 gfc_syntax_error (ST_WHERE);
3159 gfc_free_expr (expr);
3163 /* Match a WHERE statement. */
3166 gfc_match_where (gfc_statement * st)
3172 m0 = gfc_match_label ();
3173 if (m0 == MATCH_ERROR)
3176 m = gfc_match (" where ( %e )", &expr);
3180 if (gfc_match_eos () == MATCH_YES)
3182 *st = ST_WHERE_BLOCK;
3184 new_st.op = EXEC_WHERE;
3189 m = gfc_match_assignment ();
3191 gfc_syntax_error (ST_WHERE);
3195 gfc_free_expr (expr);
3199 /* We've got a simple WHERE statement. */
3201 c = gfc_get_code ();
3205 c->next = gfc_get_code ();
3208 gfc_clear_new_st ();
3210 new_st.op = EXEC_WHERE;
3217 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
3218 new_st if successful. */
3221 gfc_match_elsewhere (void)
3223 char name[GFC_MAX_SYMBOL_LEN + 1];
3227 if (gfc_current_state () != COMP_WHERE)
3229 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3235 if (gfc_match_char ('(') == MATCH_YES)
3237 m = gfc_match_expr (&expr);
3240 if (m == MATCH_ERROR)
3243 if (gfc_match_char (')') != MATCH_YES)
3247 if (gfc_match_eos () != MATCH_YES)
3248 { /* Better be a name at this point */
3249 m = gfc_match_name (name);
3252 if (m == MATCH_ERROR)
3255 if (gfc_match_eos () != MATCH_YES)
3258 if (strcmp (name, gfc_current_block ()->name) != 0)
3260 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3261 name, gfc_current_block ()->name);
3266 new_st.op = EXEC_WHERE;
3271 gfc_syntax_error (ST_ELSEWHERE);
3274 gfc_free_expr (expr);
3279 /******************** FORALL subroutines ********************/
3281 /* Free a list of FORALL iterators. */
3284 gfc_free_forall_iterator (gfc_forall_iterator * iter)
3286 gfc_forall_iterator *next;
3292 gfc_free_expr (iter->var);
3293 gfc_free_expr (iter->start);
3294 gfc_free_expr (iter->end);
3295 gfc_free_expr (iter->stride);
3303 /* Match an iterator as part of a FORALL statement. The format is:
3305 <var> = <start>:<end>[:<stride>][, <scalar mask>] */
3308 match_forall_iterator (gfc_forall_iterator ** result)
3310 gfc_forall_iterator *iter;
3314 where = gfc_current_locus;
3315 iter = gfc_getmem (sizeof (gfc_forall_iterator));
3317 m = gfc_match_variable (&iter->var, 0);
3321 if (gfc_match_char ('=') != MATCH_YES)
3327 m = gfc_match_expr (&iter->start);
3331 if (gfc_match_char (':') != MATCH_YES)
3334 m = gfc_match_expr (&iter->end);
3337 if (m == MATCH_ERROR)
3340 if (gfc_match_char (':') == MATCH_NO)
3341 iter->stride = gfc_int_expr (1);
3344 m = gfc_match_expr (&iter->stride);
3347 if (m == MATCH_ERROR)
3355 gfc_error ("Syntax error in FORALL iterator at %C");
3359 gfc_current_locus = where;
3360 gfc_free_forall_iterator (iter);
3365 /* Match the header of a FORALL statement. */
3368 match_forall_header (gfc_forall_iterator ** phead, gfc_expr ** mask)
3370 gfc_forall_iterator *head, *tail, *new;
3374 gfc_gobble_whitespace ();
3379 if (gfc_match_char ('(') != MATCH_YES)
3382 m = match_forall_iterator (&new);
3383 if (m == MATCH_ERROR)
3392 if (gfc_match_char (',') != MATCH_YES)
3395 m = match_forall_iterator (&new);
3396 if (m == MATCH_ERROR)
3406 /* Have to have a mask expression */
3408 m = gfc_match_expr (&msk);
3411 if (m == MATCH_ERROR)
3417 if (gfc_match_char (')') == MATCH_NO)
3425 gfc_syntax_error (ST_FORALL);
3428 gfc_free_expr (msk);
3429 gfc_free_forall_iterator (head);
3434 /* Match the rest of a simple FORALL statement that follows an IF statement.
3438 match_simple_forall (void)
3440 gfc_forall_iterator *head;
3449 m = match_forall_header (&head, &mask);
3456 m = gfc_match_assignment ();
3458 if (m == MATCH_ERROR)
3462 m = gfc_match_pointer_assignment ();
3463 if (m == MATCH_ERROR)
3469 c = gfc_get_code ();
3471 c->loc = gfc_current_locus;
3473 if (gfc_match_eos () != MATCH_YES)
3476 gfc_clear_new_st ();
3477 new_st.op = EXEC_FORALL;
3479 new_st.ext.forall_iterator = head;
3480 new_st.block = gfc_get_code ();
3482 new_st.block->op = EXEC_FORALL;
3483 new_st.block->next = c;
3488 gfc_syntax_error (ST_FORALL);
3491 gfc_free_forall_iterator (head);
3492 gfc_free_expr (mask);
3498 /* Match a FORALL statement. */
3501 gfc_match_forall (gfc_statement * st)
3503 gfc_forall_iterator *head;
3512 m0 = gfc_match_label ();
3513 if (m0 == MATCH_ERROR)
3516 m = gfc_match (" forall");
3520 m = match_forall_header (&head, &mask);
3521 if (m == MATCH_ERROR)
3526 if (gfc_match_eos () == MATCH_YES)
3528 *st = ST_FORALL_BLOCK;
3530 new_st.op = EXEC_FORALL;
3532 new_st.ext.forall_iterator = head;
3537 m = gfc_match_assignment ();
3538 if (m == MATCH_ERROR)
3542 m = gfc_match_pointer_assignment ();
3543 if (m == MATCH_ERROR)
3549 c = gfc_get_code ();
3552 if (gfc_match_eos () != MATCH_YES)
3555 gfc_clear_new_st ();
3556 new_st.op = EXEC_FORALL;
3558 new_st.ext.forall_iterator = head;
3559 new_st.block = gfc_get_code ();
3561 new_st.block->op = EXEC_FORALL;
3562 new_st.block->next = c;
3568 gfc_syntax_error (ST_FORALL);
3571 gfc_free_forall_iterator (head);
3572 gfc_free_expr (mask);
3573 gfc_free_statements (c);