1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
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, 59 Temple Place - Suite 330, Boston, MA
35 /* For matching and debugging purposes. Order matters here! The
36 unary operators /must/ precede the binary plus and minus, or
37 the expression parser breaks. */
39 mstring intrinsic_operators[] = {
40 minit ("+", INTRINSIC_UPLUS),
41 minit ("-", INTRINSIC_UMINUS),
42 minit ("+", INTRINSIC_PLUS),
43 minit ("-", INTRINSIC_MINUS),
44 minit ("**", INTRINSIC_POWER),
45 minit ("//", INTRINSIC_CONCAT),
46 minit ("*", INTRINSIC_TIMES),
47 minit ("/", INTRINSIC_DIVIDE),
48 minit (".and.", INTRINSIC_AND),
49 minit (".or.", INTRINSIC_OR),
50 minit (".eqv.", INTRINSIC_EQV),
51 minit (".neqv.", INTRINSIC_NEQV),
52 minit (".eq.", INTRINSIC_EQ),
53 minit ("==", INTRINSIC_EQ),
54 minit (".ne.", INTRINSIC_NE),
55 minit ("/=", INTRINSIC_NE),
56 minit (".ge.", INTRINSIC_GE),
57 minit (">=", INTRINSIC_GE),
58 minit (".le.", INTRINSIC_LE),
59 minit ("<=", INTRINSIC_LE),
60 minit (".lt.", INTRINSIC_LT),
61 minit ("<", INTRINSIC_LT),
62 minit (".gt.", INTRINSIC_GT),
63 minit (">", INTRINSIC_GT),
64 minit (".not.", INTRINSIC_NOT),
65 minit (NULL, INTRINSIC_NONE)
69 /******************** Generic matching subroutines ************************/
71 /* In free form, match at least one space. Always matches in fixed
75 gfc_match_space (void)
80 if (gfc_current_form == FORM_FIXED)
83 old_loc = gfc_current_locus;
86 if (!gfc_is_whitespace (c))
88 gfc_current_locus = old_loc;
92 gfc_gobble_whitespace ();
98 /* Match an end of statement. End of statement is optional
99 whitespace, followed by a ';' or '\n' or comment '!'. If a
100 semicolon is found, we continue to eat whitespace and semicolons. */
112 old_loc = gfc_current_locus;
113 gfc_gobble_whitespace ();
115 c = gfc_next_char ();
121 c = gfc_next_char ();
138 gfc_current_locus = old_loc;
139 return (flag) ? MATCH_YES : MATCH_NO;
143 /* Match a literal integer on the input, setting the value on
144 MATCH_YES. Literal ints occur in kind-parameters as well as
145 old-style character length specifications. */
148 gfc_match_small_literal_int (int *value)
154 old_loc = gfc_current_locus;
156 gfc_gobble_whitespace ();
157 c = gfc_next_char ();
161 gfc_current_locus = old_loc;
169 old_loc = gfc_current_locus;
170 c = gfc_next_char ();
175 i = 10 * i + c - '0';
179 gfc_error ("Integer too large at %C");
184 gfc_current_locus = old_loc;
191 /* Match a small, constant integer expression, like in a kind
192 statement. On MATCH_YES, 'value' is set. */
195 gfc_match_small_int (int *value)
202 m = gfc_match_expr (&expr);
206 p = gfc_extract_int (expr, &i);
207 gfc_free_expr (expr);
220 /* Matches a statement label. Uses gfc_match_small_literal_int() to
221 do most of the work. */
224 gfc_match_st_label (gfc_st_label ** label, int allow_zero)
230 old_loc = gfc_current_locus;
232 m = gfc_match_small_literal_int (&i);
236 if (((i == 0) && allow_zero) || i <= 99999)
238 *label = gfc_get_st_label (i);
242 gfc_error ("Statement label at %C is out of range");
243 gfc_current_locus = old_loc;
248 /* Match and validate a label associated with a named IF, DO or SELECT
249 statement. If the symbol does not have the label attribute, we add
250 it. We also make sure the symbol does not refer to another
251 (active) block. A matched label is pointed to by gfc_new_block. */
254 gfc_match_label (void)
256 char name[GFC_MAX_SYMBOL_LEN + 1];
260 gfc_new_block = NULL;
262 m = gfc_match (" %n :", name);
266 if (gfc_get_symbol (name, NULL, &gfc_new_block))
268 gfc_error ("Label name '%s' at %C is ambiguous", name);
272 if (gfc_new_block->attr.flavor != FL_LABEL
273 && gfc_add_flavor (&gfc_new_block->attr, FL_LABEL, NULL) == FAILURE)
276 for (p = gfc_state_stack; p; p = p->previous)
277 if (p->sym == gfc_new_block)
279 gfc_error ("Label %s at %C already in use by a parent block",
280 gfc_new_block->name);
288 /* Try and match the input against an array of possibilities. If one
289 potential matching string is a substring of another, the longest
290 match takes precedence. Spaces in the target strings are optional
291 spaces that do not necessarily have to be found in the input
292 stream. In fixed mode, spaces never appear. If whitespace is
293 matched, it matches unlimited whitespace in the input. For this
294 reason, the 'mp' member of the mstring structure is used to track
295 the progress of each potential match.
297 If there is no match we return the tag associated with the
298 terminating NULL mstring structure and leave the locus pointer
299 where it started. If there is a match we return the tag member of
300 the matched mstring and leave the locus pointer after the matched
303 A '%' character is a mandatory space. */
306 gfc_match_strings (mstring * a)
308 mstring *p, *best_match;
309 int no_match, c, possibles;
314 for (p = a; p->string != NULL; p++)
323 match_loc = gfc_current_locus;
325 gfc_gobble_whitespace ();
327 while (possibles > 0)
329 c = gfc_next_char ();
331 /* Apply the next character to the current possibilities. */
332 for (p = a; p->string != NULL; p++)
339 /* Space matches 1+ whitespace(s). */
340 if ((gfc_current_form == FORM_FREE)
341 && gfc_is_whitespace (c))
359 match_loc = gfc_current_locus;
367 gfc_current_locus = match_loc;
369 return (best_match == NULL) ? no_match : best_match->tag;
373 /* See if the current input looks like a name of some sort. Modifies
374 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long. */
377 gfc_match_name (char *buffer)
382 old_loc = gfc_current_locus;
383 gfc_gobble_whitespace ();
385 c = gfc_next_char ();
388 gfc_current_locus = old_loc;
398 if (i > gfc_option.max_identifier_length)
400 gfc_error ("Name at %C is too long");
404 old_loc = gfc_current_locus;
405 c = gfc_next_char ();
409 || (gfc_option.flag_dollar_ok && c == '$'));
412 gfc_current_locus = old_loc;
418 /* Match a symbol on the input. Modifies the pointer to the symbol
419 pointer if successful. */
422 gfc_match_sym_tree (gfc_symtree ** matched_symbol, int host_assoc)
424 char buffer[GFC_MAX_SYMBOL_LEN + 1];
427 m = gfc_match_name (buffer);
432 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
433 ? MATCH_ERROR : MATCH_YES;
435 if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
443 gfc_match_symbol (gfc_symbol ** matched_symbol, int host_assoc)
448 m = gfc_match_sym_tree (&st, host_assoc);
453 *matched_symbol = st->n.sym;
455 *matched_symbol = NULL;
460 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
461 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
465 gfc_match_intrinsic_op (gfc_intrinsic_op * result)
469 op = (gfc_intrinsic_op) gfc_match_strings (intrinsic_operators);
471 if (op == INTRINSIC_NONE)
479 /* Match a loop control phrase:
481 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
483 If the final integer expression is not present, a constant unity
484 expression is returned. We don't return MATCH_ERROR until after
485 the equals sign is seen. */
488 gfc_match_iterator (gfc_iterator * iter, int init_flag)
490 char name[GFC_MAX_SYMBOL_LEN + 1];
491 gfc_expr *var, *e1, *e2, *e3;
495 /* Match the start of an iterator without affecting the symbol
498 start = gfc_current_locus;
499 m = gfc_match (" %n =", name);
500 gfc_current_locus = start;
505 m = gfc_match_variable (&var, 0);
509 gfc_match_char ('=');
513 if (var->ref != NULL)
515 gfc_error ("Loop variable at %C cannot be a sub-component");
519 if (var->symtree->n.sym->attr.intent == INTENT_IN)
521 gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
522 var->symtree->n.sym->name);
526 if (var->symtree->n.sym->attr.pointer)
528 gfc_error ("Loop variable at %C cannot have the POINTER attribute");
532 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
535 if (m == MATCH_ERROR)
538 if (gfc_match_char (',') != MATCH_YES)
541 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
544 if (m == MATCH_ERROR)
547 if (gfc_match_char (',') != MATCH_YES)
549 e3 = gfc_int_expr (1);
553 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
554 if (m == MATCH_ERROR)
558 gfc_error ("Expected a step value in iterator at %C");
570 gfc_error ("Syntax error in iterator at %C");
581 /* Tries to match the next non-whitespace character on the input.
582 This subroutine does not return MATCH_ERROR. */
585 gfc_match_char (char c)
589 where = gfc_current_locus;
590 gfc_gobble_whitespace ();
592 if (gfc_next_char () == c)
595 gfc_current_locus = where;
600 /* General purpose matching subroutine. The target string is a
601 scanf-like format string in which spaces correspond to arbitrary
602 whitespace (including no whitespace), characters correspond to
603 themselves. The %-codes are:
605 %% Literal percent sign
606 %e Expression, pointer to a pointer is set
607 %s Symbol, pointer to the symbol is set
608 %n Name, character buffer is set to name
609 %t Matches end of statement.
610 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
611 %l Matches a statement label
612 %v Matches a variable expression (an lvalue)
613 % Matches a required space (in free form) and optional spaces. */
616 gfc_match (const char *target, ...)
618 gfc_st_label **label;
627 old_loc = gfc_current_locus;
628 va_start (argp, target);
638 gfc_gobble_whitespace ();
649 vp = va_arg (argp, void **);
650 n = gfc_match_expr ((gfc_expr **) vp);
661 vp = va_arg (argp, void **);
662 n = gfc_match_variable ((gfc_expr **) vp, 0);
673 vp = va_arg (argp, void **);
674 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
685 np = va_arg (argp, char *);
686 n = gfc_match_name (np);
697 label = va_arg (argp, gfc_st_label **);
698 n = gfc_match_st_label (label, 0);
709 ip = va_arg (argp, int *);
710 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
721 if (gfc_match_eos () != MATCH_YES)
729 if (gfc_match_space () == MATCH_YES)
735 break; /* Fall through to character matcher */
738 gfc_internal_error ("gfc_match(): Bad match code %c", c);
742 if (c == gfc_next_char ())
752 /* Clean up after a failed match. */
753 gfc_current_locus = old_loc;
754 va_start (argp, target);
757 for (; matches > 0; matches--)
767 /* Matches that don't have to be undone */
772 (void)va_arg (argp, void **);
777 vp = va_arg (argp, void **);
791 /*********************** Statement level matching **********************/
793 /* Matches the start of a program unit, which is the program keyword
794 followed by an optional symbol. */
797 gfc_match_program (void)
802 m = gfc_match_eos ();
806 m = gfc_match ("% %s%t", &sym);
810 gfc_error ("Invalid form of PROGRAM statement at %C");
814 if (m == MATCH_ERROR)
817 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, NULL) == FAILURE)
826 /* Match a simple assignment statement. */
829 gfc_match_assignment (void)
831 gfc_expr *lvalue, *rvalue;
835 old_loc = gfc_current_locus;
837 lvalue = rvalue = NULL;
838 m = gfc_match (" %v =", &lvalue);
842 m = gfc_match (" %e%t", &rvalue);
846 gfc_set_sym_referenced (lvalue->symtree->n.sym);
848 new_st.op = EXEC_ASSIGN;
849 new_st.expr = lvalue;
850 new_st.expr2 = rvalue;
855 gfc_current_locus = old_loc;
856 gfc_free_expr (lvalue);
857 gfc_free_expr (rvalue);
862 /* Match a pointer assignment statement. */
865 gfc_match_pointer_assignment (void)
867 gfc_expr *lvalue, *rvalue;
871 old_loc = gfc_current_locus;
873 lvalue = rvalue = NULL;
875 m = gfc_match (" %v =>", &lvalue);
882 m = gfc_match (" %e%t", &rvalue);
886 new_st.op = EXEC_POINTER_ASSIGN;
887 new_st.expr = lvalue;
888 new_st.expr2 = rvalue;
893 gfc_current_locus = old_loc;
894 gfc_free_expr (lvalue);
895 gfc_free_expr (rvalue);
900 /* The IF statement is a bit of a pain. First of all, there are three
901 forms of it, the simple IF, the IF that starts a block and the
904 There is a problem with the simple IF and that is the fact that we
905 only have a single level of undo information on symbols. What this
906 means is for a simple IF, we must re-match the whole IF statement
907 multiple times in order to guarantee that the symbol table ends up
908 in the proper state. */
911 gfc_match_if (gfc_statement * if_type)
914 gfc_st_label *l1, *l2, *l3;
919 n = gfc_match_label ();
920 if (n == MATCH_ERROR)
923 old_loc = gfc_current_locus;
925 m = gfc_match (" if ( %e", &expr);
929 if (gfc_match_char (')') != MATCH_YES)
931 gfc_error ("Syntax error in IF-expression at %C");
932 gfc_free_expr (expr);
936 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
943 ("Block label not appropriate for arithmetic IF statement "
946 gfc_free_expr (expr);
950 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
951 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
952 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
955 gfc_free_expr (expr);
959 new_st.op = EXEC_ARITHMETIC_IF;
965 *if_type = ST_ARITHMETIC_IF;
969 if (gfc_match (" then %t") == MATCH_YES)
974 *if_type = ST_IF_BLOCK;
980 gfc_error ("Block label is not appropriate IF statement at %C");
982 gfc_free_expr (expr);
986 /* At this point the only thing left is a simple IF statement. At
987 this point, n has to be MATCH_NO, so we don't have to worry about
988 re-matching a block label. From what we've got so far, try
989 matching an assignment. */
991 *if_type = ST_SIMPLE_IF;
993 m = gfc_match_assignment ();
997 gfc_free_expr (expr);
999 gfc_current_locus = old_loc;
1001 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1003 m = gfc_match_pointer_assignment ();
1007 gfc_free_expr (expr);
1008 gfc_undo_symbols ();
1009 gfc_current_locus = old_loc;
1011 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1013 /* Look at the next keyword to see which matcher to call. Matching
1014 the keyword doesn't affect the symbol table, so we don't have to
1015 restore between tries. */
1017 #define match(string, subr, statement) \
1018 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1022 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1023 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1024 match ("call", gfc_match_call, ST_CALL)
1025 match ("close", gfc_match_close, ST_CLOSE)
1026 match ("continue", gfc_match_continue, ST_CONTINUE)
1027 match ("cycle", gfc_match_cycle, ST_CYCLE)
1028 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1029 match ("end file", gfc_match_endfile, ST_END_FILE)
1030 match ("exit", gfc_match_exit, ST_EXIT)
1031 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1032 match ("go to", gfc_match_goto, ST_GOTO)
1033 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1034 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1035 match ("open", gfc_match_open, ST_OPEN)
1036 match ("pause", gfc_match_pause, ST_NONE)
1037 match ("print", gfc_match_print, ST_WRITE)
1038 match ("read", gfc_match_read, ST_READ)
1039 match ("return", gfc_match_return, ST_RETURN)
1040 match ("rewind", gfc_match_rewind, ST_REWIND)
1041 match ("pause", gfc_match_stop, ST_PAUSE)
1042 match ("stop", gfc_match_stop, ST_STOP)
1043 match ("write", gfc_match_write, ST_WRITE)
1045 /* All else has failed, so give up. See if any of the matchers has
1046 stored an error message of some sort. */
1047 if (gfc_error_check () == 0)
1048 gfc_error ("Unclassifiable statement in IF-clause at %C");
1050 gfc_free_expr (expr);
1055 gfc_error ("Syntax error in IF-clause at %C");
1058 gfc_free_expr (expr);
1062 /* At this point, we've matched the single IF and the action clause
1063 is in new_st. Rearrange things so that the IF statement appears
1066 p = gfc_get_code ();
1067 p->next = gfc_get_code ();
1069 p->next->loc = gfc_current_locus;
1074 gfc_clear_new_st ();
1076 new_st.op = EXEC_IF;
1085 /* Match an ELSE statement. */
1088 gfc_match_else (void)
1090 char name[GFC_MAX_SYMBOL_LEN + 1];
1092 if (gfc_match_eos () == MATCH_YES)
1095 if (gfc_match_name (name) != MATCH_YES
1096 || gfc_current_block () == NULL
1097 || gfc_match_eos () != MATCH_YES)
1099 gfc_error ("Unexpected junk after ELSE statement at %C");
1103 if (strcmp (name, gfc_current_block ()->name) != 0)
1105 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1106 name, gfc_current_block ()->name);
1114 /* Match an ELSE IF statement. */
1117 gfc_match_elseif (void)
1119 char name[GFC_MAX_SYMBOL_LEN + 1];
1123 m = gfc_match (" ( %e ) then", &expr);
1127 if (gfc_match_eos () == MATCH_YES)
1130 if (gfc_match_name (name) != MATCH_YES
1131 || gfc_current_block () == NULL
1132 || gfc_match_eos () != MATCH_YES)
1134 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1138 if (strcmp (name, gfc_current_block ()->name) != 0)
1140 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1141 name, gfc_current_block ()->name);
1146 new_st.op = EXEC_IF;
1151 gfc_free_expr (expr);
1156 /* Free a gfc_iterator structure. */
1159 gfc_free_iterator (gfc_iterator * iter, int flag)
1165 gfc_free_expr (iter->var);
1166 gfc_free_expr (iter->start);
1167 gfc_free_expr (iter->end);
1168 gfc_free_expr (iter->step);
1175 /* Match a DO statement. */
1180 gfc_iterator iter, *ip;
1182 gfc_st_label *label;
1185 old_loc = gfc_current_locus;
1188 iter.var = iter.start = iter.end = iter.step = NULL;
1190 m = gfc_match_label ();
1191 if (m == MATCH_ERROR)
1194 if (gfc_match (" do") != MATCH_YES)
1197 m = gfc_match_st_label (&label, 0);
1198 if (m == MATCH_ERROR)
1201 /* Match an infinite DO, make it like a DO WHILE(.TRUE.) */
1203 if (gfc_match_eos () == MATCH_YES)
1205 iter.end = gfc_logical_expr (1, NULL);
1206 new_st.op = EXEC_DO_WHILE;
1210 /* match an optional comma, if no comma is found a space is obligatory. */
1211 if (gfc_match_char(',') != MATCH_YES
1212 && gfc_match ("% ") != MATCH_YES)
1215 /* See if we have a DO WHILE. */
1216 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1218 new_st.op = EXEC_DO_WHILE;
1222 /* The abortive DO WHILE may have done something to the symbol
1223 table, so we start over: */
1224 gfc_undo_symbols ();
1225 gfc_current_locus = old_loc;
1227 gfc_match_label (); /* This won't error */
1228 gfc_match (" do "); /* This will work */
1230 gfc_match_st_label (&label, 0); /* Can't error out */
1231 gfc_match_char (','); /* Optional comma */
1233 m = gfc_match_iterator (&iter, 0);
1236 if (m == MATCH_ERROR)
1239 if (gfc_match_eos () != MATCH_YES)
1241 gfc_syntax_error (ST_DO);
1245 new_st.op = EXEC_DO;
1249 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1252 new_st.label = label;
1254 if (new_st.op == EXEC_DO_WHILE)
1255 new_st.expr = iter.end;
1258 new_st.ext.iterator = ip = gfc_get_iterator ();
1265 gfc_free_iterator (&iter, 0);
1271 /* Match an EXIT or CYCLE statement. */
1274 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1280 if (gfc_match_eos () == MATCH_YES)
1284 m = gfc_match ("% %s%t", &sym);
1285 if (m == MATCH_ERROR)
1289 gfc_syntax_error (st);
1293 if (sym->attr.flavor != FL_LABEL)
1295 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1296 sym->name, gfc_ascii_statement (st));
1301 /* Find the loop mentioned specified by the label (or lack of a
1303 for (p = gfc_state_stack; p; p = p->previous)
1304 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1310 gfc_error ("%s statement at %C is not within a loop",
1311 gfc_ascii_statement (st));
1313 gfc_error ("%s statement at %C is not within loop '%s'",
1314 gfc_ascii_statement (st), sym->name);
1319 /* Save the first statement in the loop - needed by the backend. */
1320 new_st.ext.whichloop = p->head;
1323 /* new_st.sym = sym;*/
1329 /* Match the EXIT statement. */
1332 gfc_match_exit (void)
1335 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1339 /* Match the CYCLE statement. */
1342 gfc_match_cycle (void)
1345 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1349 /* Match a number or character constant after a STOP or PAUSE statement. */
1352 gfc_match_stopcode (gfc_statement st)
1361 if (gfc_match_eos () != MATCH_YES)
1363 m = gfc_match_small_literal_int (&stop_code);
1364 if (m == MATCH_ERROR)
1367 if (m == MATCH_YES && stop_code > 99999)
1369 gfc_error ("STOP code out of range at %C");
1375 /* Try a character constant. */
1376 m = gfc_match_expr (&e);
1377 if (m == MATCH_ERROR)
1381 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1385 if (gfc_match_eos () != MATCH_YES)
1389 if (gfc_pure (NULL))
1391 gfc_error ("%s statement not allowed in PURE procedure at %C",
1392 gfc_ascii_statement (st));
1396 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1398 new_st.ext.stop_code = stop_code;
1403 gfc_syntax_error (st);
1411 /* Match the (deprecated) PAUSE statement. */
1414 gfc_match_pause (void)
1418 m = gfc_match_stopcode (ST_PAUSE);
1421 if (gfc_notify_std (GFC_STD_F95_DEL,
1422 "Obsolete: PAUSE statement at %C")
1430 /* Match the STOP statement. */
1433 gfc_match_stop (void)
1435 return gfc_match_stopcode (ST_STOP);
1439 /* Match a CONTINUE statement. */
1442 gfc_match_continue (void)
1445 if (gfc_match_eos () != MATCH_YES)
1447 gfc_syntax_error (ST_CONTINUE);
1451 new_st.op = EXEC_CONTINUE;
1456 /* Match the (deprecated) ASSIGN statement. */
1459 gfc_match_assign (void)
1462 gfc_st_label *label;
1464 if (gfc_match (" %l", &label) == MATCH_YES)
1466 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
1468 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
1470 if (gfc_notify_std (GFC_STD_F95_DEL,
1471 "Obsolete: ASSIGN statement at %C")
1475 expr->symtree->n.sym->attr.assign = 1;
1477 new_st.op = EXEC_LABEL_ASSIGN;
1478 new_st.label = label;
1487 /* Match the GO TO statement. As a computed GOTO statement is
1488 matched, it is transformed into an equivalent SELECT block. No
1489 tree is necessary, and the resulting jumps-to-jumps are
1490 specifically optimized away by the back end. */
1493 gfc_match_goto (void)
1495 gfc_code *head, *tail;
1498 gfc_st_label *label;
1502 if (gfc_match (" %l%t", &label) == MATCH_YES)
1504 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1507 new_st.op = EXEC_GOTO;
1508 new_st.label = label;
1512 /* The assigned GO TO statement. */
1514 if (gfc_match_variable (&expr, 0) == MATCH_YES)
1516 if (gfc_notify_std (GFC_STD_F95_DEL,
1517 "Obsolete: Assigned GOTO statement at %C")
1521 expr->symtree->n.sym->attr.assign = 1;
1522 new_st.op = EXEC_GOTO;
1525 if (gfc_match_eos () == MATCH_YES)
1528 /* Match label list. */
1529 gfc_match_char (',');
1530 if (gfc_match_char ('(') != MATCH_YES)
1532 gfc_syntax_error (ST_GOTO);
1539 m = gfc_match_st_label (&label, 0);
1543 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1547 head = tail = gfc_get_code ();
1550 tail->block = gfc_get_code ();
1554 tail->label = label;
1555 tail->op = EXEC_GOTO;
1557 while (gfc_match_char (',') == MATCH_YES);
1559 if (gfc_match (")%t") != MATCH_YES)
1565 "Statement label list in GOTO at %C cannot be empty");
1568 new_st.block = head;
1573 /* Last chance is a computed GO TO statement. */
1574 if (gfc_match_char ('(') != MATCH_YES)
1576 gfc_syntax_error (ST_GOTO);
1585 m = gfc_match_st_label (&label, 0);
1589 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1593 head = tail = gfc_get_code ();
1596 tail->block = gfc_get_code ();
1600 cp = gfc_get_case ();
1601 cp->low = cp->high = gfc_int_expr (i++);
1603 tail->op = EXEC_SELECT;
1604 tail->ext.case_list = cp;
1606 tail->next = gfc_get_code ();
1607 tail->next->op = EXEC_GOTO;
1608 tail->next->label = label;
1610 while (gfc_match_char (',') == MATCH_YES);
1612 if (gfc_match_char (')') != MATCH_YES)
1617 gfc_error ("Statement label list in GOTO at %C cannot be empty");
1621 /* Get the rest of the statement. */
1622 gfc_match_char (',');
1624 if (gfc_match (" %e%t", &expr) != MATCH_YES)
1627 /* At this point, a computed GOTO has been fully matched and an
1628 equivalent SELECT statement constructed. */
1630 new_st.op = EXEC_SELECT;
1633 /* Hack: For a "real" SELECT, the expression is in expr. We put
1634 it in expr2 so we can distinguish then and produce the correct
1636 new_st.expr2 = expr;
1637 new_st.block = head;
1641 gfc_syntax_error (ST_GOTO);
1643 gfc_free_statements (head);
1648 /* Frees a list of gfc_alloc structures. */
1651 gfc_free_alloc_list (gfc_alloc * p)
1658 gfc_free_expr (p->expr);
1664 /* Match an ALLOCATE statement. */
1667 gfc_match_allocate (void)
1669 gfc_alloc *head, *tail;
1676 if (gfc_match_char ('(') != MATCH_YES)
1682 head = tail = gfc_get_alloc ();
1685 tail->next = gfc_get_alloc ();
1689 m = gfc_match_variable (&tail->expr, 0);
1692 if (m == MATCH_ERROR)
1696 && gfc_impure_variable (tail->expr->symtree->n.sym))
1698 gfc_error ("Bad allocate-object in ALLOCATE statement at %C for a "
1703 if (gfc_match_char (',') != MATCH_YES)
1706 m = gfc_match (" stat = %v", &stat);
1707 if (m == MATCH_ERROR)
1715 if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1718 ("STAT variable '%s' of ALLOCATE statement at %C cannot be "
1719 "INTENT(IN)", stat->symtree->n.sym->name);
1723 if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
1726 ("Illegal STAT variable in ALLOCATE statement at %C for a PURE "
1732 if (gfc_match (" )%t") != MATCH_YES)
1735 new_st.op = EXEC_ALLOCATE;
1737 new_st.ext.alloc_list = head;
1742 gfc_syntax_error (ST_ALLOCATE);
1745 gfc_free_expr (stat);
1746 gfc_free_alloc_list (head);
1751 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
1752 a set of pointer assignments to intrinsic NULL(). */
1755 gfc_match_nullify (void)
1763 if (gfc_match_char ('(') != MATCH_YES)
1768 m = gfc_match_variable (&p, 0);
1769 if (m == MATCH_ERROR)
1774 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
1777 ("Illegal variable in NULLIFY at %C for a PURE procedure");
1781 /* build ' => NULL() ' */
1782 e = gfc_get_expr ();
1783 e->where = gfc_current_locus;
1784 e->expr_type = EXPR_NULL;
1785 e->ts.type = BT_UNKNOWN;
1792 tail->next = gfc_get_code ();
1796 tail->op = EXEC_POINTER_ASSIGN;
1800 if (gfc_match_char (')') == MATCH_YES)
1802 if (gfc_match_char (',') != MATCH_YES)
1809 gfc_syntax_error (ST_NULLIFY);
1812 gfc_free_statements (tail);
1817 /* Match a DEALLOCATE statement. */
1820 gfc_match_deallocate (void)
1822 gfc_alloc *head, *tail;
1829 if (gfc_match_char ('(') != MATCH_YES)
1835 head = tail = gfc_get_alloc ();
1838 tail->next = gfc_get_alloc ();
1842 m = gfc_match_variable (&tail->expr, 0);
1843 if (m == MATCH_ERROR)
1849 && gfc_impure_variable (tail->expr->symtree->n.sym))
1852 ("Illegal deallocate-expression in DEALLOCATE at %C for a PURE "
1857 if (gfc_match_char (',') != MATCH_YES)
1860 m = gfc_match (" stat = %v", &stat);
1861 if (m == MATCH_ERROR)
1867 if (stat != NULL && stat->symtree->n.sym->attr.intent == INTENT_IN)
1869 gfc_error ("STAT variable '%s' of DEALLOCATE statement at %C cannot be "
1870 "INTENT(IN)", stat->symtree->n.sym->name);
1874 if (gfc_match (" )%t") != MATCH_YES)
1877 new_st.op = EXEC_DEALLOCATE;
1879 new_st.ext.alloc_list = head;
1884 gfc_syntax_error (ST_DEALLOCATE);
1887 gfc_free_expr (stat);
1888 gfc_free_alloc_list (head);
1893 /* Match a RETURN statement. */
1896 gfc_match_return (void)
1902 if (gfc_match_eos () == MATCH_YES)
1905 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
1907 gfc_error ("Alternate RETURN statement at %C is only allowed within "
1912 m = gfc_match ("% %e%t", &e);
1915 if (m == MATCH_ERROR)
1918 gfc_syntax_error (ST_RETURN);
1925 new_st.op = EXEC_RETURN;
1932 /* Match a CALL statement. The tricky part here are possible
1933 alternate return specifiers. We handle these by having all
1934 "subroutines" actually return an integer via a register that gives
1935 the return number. If the call specifies alternate returns, we
1936 generate code for a SELECT statement whose case clauses contain
1937 GOTOs to the various labels. */
1940 gfc_match_call (void)
1942 char name[GFC_MAX_SYMBOL_LEN + 1];
1943 gfc_actual_arglist *a, *arglist;
1953 m = gfc_match ("% %n", name);
1959 if (gfc_get_ha_sym_tree (name, &st))
1963 gfc_set_sym_referenced (sym);
1965 if (!sym->attr.generic
1966 && !sym->attr.subroutine
1967 && gfc_add_subroutine (&sym->attr, NULL) == FAILURE)
1970 if (gfc_match_eos () != MATCH_YES)
1972 m = gfc_match_actual_arglist (1, &arglist);
1975 if (m == MATCH_ERROR)
1978 if (gfc_match_eos () != MATCH_YES)
1982 /* If any alternate return labels were found, construct a SELECT
1983 statement that will jump to the right place. */
1986 for (a = arglist; a; a = a->next)
1987 if (a->expr == NULL)
1992 gfc_symtree *select_st;
1993 gfc_symbol *select_sym;
1994 char name[GFC_MAX_SYMBOL_LEN + 1];
1996 new_st.next = c = gfc_get_code ();
1997 c->op = EXEC_SELECT;
1998 sprintf (name, "_result_%s",sym->name);
1999 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail */
2001 select_sym = select_st->n.sym;
2002 select_sym->ts.type = BT_INTEGER;
2003 select_sym->ts.kind = gfc_default_integer_kind ();
2004 gfc_set_sym_referenced (select_sym);
2005 c->expr = gfc_get_expr ();
2006 c->expr->expr_type = EXPR_VARIABLE;
2007 c->expr->symtree = select_st;
2008 c->expr->ts = select_sym->ts;
2009 c->expr->where = gfc_current_locus;
2012 for (a = arglist; a; a = a->next)
2014 if (a->expr != NULL)
2017 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2022 c->block = gfc_get_code ();
2024 c->op = EXEC_SELECT;
2026 new_case = gfc_get_case ();
2027 new_case->high = new_case->low = gfc_int_expr (i);
2028 c->ext.case_list = new_case;
2030 c->next = gfc_get_code ();
2031 c->next->op = EXEC_GOTO;
2032 c->next->label = a->label;
2036 new_st.op = EXEC_CALL;
2037 new_st.symtree = st;
2038 new_st.ext.actual = arglist;
2043 gfc_syntax_error (ST_CALL);
2046 gfc_free_actual_arglist (arglist);
2051 /* Match an IMPLICIT NONE statement. Actually, this statement is
2052 already matched in parse.c, or we would not end up here in the
2053 first place. So the only thing we need to check, is if there is
2054 trailing garbage. If not, the match is successful. */
2057 gfc_match_implicit_none (void)
2060 return (gfc_match_eos () == MATCH_YES) ? MATCH_YES : MATCH_NO;
2064 /* Match the letter range(s) of an IMPLICIT statement. */
2067 match_implicit_range (gfc_typespec * ts)
2069 int c, c1, c2, inner;
2072 cur_loc = gfc_current_locus;
2074 gfc_gobble_whitespace ();
2075 c = gfc_next_char ();
2078 gfc_error ("Missing character range in IMPLICIT at %C");
2085 gfc_gobble_whitespace ();
2086 c1 = gfc_next_char ();
2090 gfc_gobble_whitespace ();
2091 c = gfc_next_char ();
2096 inner = 0; /* Fall through */
2103 gfc_gobble_whitespace ();
2104 c2 = gfc_next_char ();
2108 gfc_gobble_whitespace ();
2109 c = gfc_next_char ();
2111 if ((c != ',') && (c != ')'))
2124 gfc_error ("Letters must be in alphabetic order in "
2125 "IMPLICIT statement at %C");
2129 /* See if we can add the newly matched range to the pending
2130 implicits from this IMPLICIT statement. We do not check for
2131 conflicts with whatever earlier IMPLICIT statements may have
2132 set. This is done when we've successfully finished matching
2134 if (gfc_add_new_implicit_range (c1, c2, ts) != SUCCESS)
2141 gfc_syntax_error (ST_IMPLICIT);
2143 gfc_current_locus = cur_loc;
2148 /* Match an IMPLICIT statement, storing the types for
2149 gfc_set_implicit() if the statement is accepted by the parser.
2150 There is a strange looking, but legal syntactic construction
2151 possible. It looks like:
2153 IMPLICIT INTEGER (a-b) (c-d)
2155 This is legal if "a-b" is a constant expression that happens to
2156 equal one of the legal kinds for integers. The real problem
2157 happens with an implicit specification that looks like:
2159 IMPLICIT INTEGER (a-b)
2161 In this case, a typespec matcher that is "greedy" (as most of the
2162 matchers are) gobbles the character range as a kindspec, leaving
2163 nothing left. We therefore have to go a bit more slowly in the
2164 matching process by inhibiting the kindspec checking during
2165 typespec matching and checking for a kind later. */
2168 gfc_match_implicit (void)
2175 /* We don't allow empty implicit statements. */
2176 if (gfc_match_eos () == MATCH_YES)
2178 gfc_error ("Empty IMPLICIT statement at %C");
2182 /* First cleanup. */
2183 gfc_clear_new_implicit ();
2187 /* A basic type is mandatory here. */
2188 m = gfc_match_type_spec (&ts, 0);
2189 if (m == MATCH_ERROR)
2194 cur_loc = gfc_current_locus;
2195 m = match_implicit_range (&ts);
2199 /* Looks like we have the <TYPE> (<RANGE>). */
2200 gfc_gobble_whitespace ();
2201 c = gfc_next_char ();
2202 if ((c == '\n') || (c == ','))
2205 gfc_current_locus = cur_loc;
2208 /* Last chance -- check <TYPE> (<KIND>) (<RANGE>). */
2209 m = gfc_match_kind_spec (&ts);
2210 if (m == MATCH_ERROR)
2214 m = gfc_match_old_kind_spec (&ts);
2215 if (m == MATCH_ERROR)
2221 m = match_implicit_range (&ts);
2222 if (m == MATCH_ERROR)
2227 gfc_gobble_whitespace ();
2228 c = gfc_next_char ();
2229 if ((c != '\n') && (c != ','))
2235 /* All we need to now is try to merge the new implicit types back
2236 into the existing types. This will fail if another implicit
2237 type is already defined for a letter. */
2238 return (gfc_merge_new_implicit () == SUCCESS) ?
2239 MATCH_YES : MATCH_ERROR;
2242 gfc_syntax_error (ST_IMPLICIT);
2249 /* Given a name, return a pointer to the common head structure,
2250 creating it if it does not exist.
2251 TODO: Add to global symbol tree. */
2254 gfc_get_common (char *name)
2258 st = gfc_find_symtree (gfc_current_ns->common_root, name);
2260 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2262 if (st->n.common == NULL)
2264 st->n.common = gfc_get_common_head ();
2265 st->n.common->where = gfc_current_locus;
2268 return st->n.common;
2272 /* Match a common block name. */
2275 match_common_name (char *name)
2279 if (gfc_match_char ('/') == MATCH_NO)
2285 if (gfc_match_char ('/') == MATCH_YES)
2291 m = gfc_match_name (name);
2293 if (m == MATCH_ERROR)
2295 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2298 gfc_error ("Syntax error in common block name at %C");
2303 /* Match a COMMON statement. */
2306 gfc_match_common (void)
2308 gfc_symbol *sym, **head, *tail, *old_blank_common;
2309 char name[GFC_MAX_SYMBOL_LEN+1];
2314 old_blank_common = gfc_current_ns->blank_common.head;
2315 if (old_blank_common)
2317 while (old_blank_common->common_next)
2318 old_blank_common = old_blank_common->common_next;
2323 if (gfc_match_eos () == MATCH_YES)
2328 m = match_common_name (name);
2329 if (m == MATCH_ERROR)
2332 if (name[0] == '\0')
2334 t = &gfc_current_ns->blank_common;
2335 if (t->head == NULL)
2336 t->where = gfc_current_locus;
2341 t = gfc_get_common (name);
2346 gfc_error ("COMMON block '%s' at %C has already "
2347 "been USE-associated");
2357 while (tail->common_next)
2358 tail = tail->common_next;
2361 /* Grab the list of symbols. */
2362 if (gfc_match_eos () == MATCH_YES)
2367 m = gfc_match_symbol (&sym, 0);
2368 if (m == MATCH_ERROR)
2373 if (sym->attr.in_common)
2375 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2380 if (gfc_add_in_common (&sym->attr, NULL) == FAILURE)
2383 if (sym->value != NULL
2384 && (name[0] == '\0' || !sym->attr.data))
2386 if (name[0] == '\0')
2387 gfc_error ("Previously initialized symbol '%s' in "
2388 "blank COMMON block at %C", sym->name);
2390 gfc_error ("Previously initialized symbol '%s' in "
2391 "COMMON block '%s' at %C", sym->name, name);
2395 if (gfc_add_in_common (&sym->attr, NULL) == FAILURE)
2398 /* Derived type names must have the SEQUENCE attribute. */
2399 if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.sequence)
2402 ("Derived type variable in COMMON at %C does not have the "
2403 "SEQUENCE attribute");
2408 tail->common_next = sym;
2414 /* Deal with an optional array specification after the
2416 m = gfc_match_array_spec (&as);
2417 if (m == MATCH_ERROR)
2422 if (as->type != AS_EXPLICIT)
2425 ("Array specification for symbol '%s' in COMMON at %C "
2426 "must be explicit", sym->name);
2430 if (gfc_add_dimension (&sym->attr, NULL) == FAILURE)
2433 if (sym->attr.pointer)
2436 ("Symbol '%s' in COMMON at %C cannot be a POINTER array",
2445 if (gfc_match_eos () == MATCH_YES)
2447 if (gfc_peek_char () == '/')
2449 if (gfc_match_char (',') != MATCH_YES)
2451 if (gfc_peek_char () == '/')
2460 gfc_syntax_error (ST_COMMON);
2463 if (old_blank_common)
2464 old_blank_common->common_next = NULL;
2466 gfc_current_ns->blank_common.head = NULL;
2467 gfc_free_array_spec (as);
2472 /* Match a BLOCK DATA program unit. */
2475 gfc_match_block_data (void)
2477 char name[GFC_MAX_SYMBOL_LEN + 1];
2481 if (gfc_match_eos () == MATCH_YES)
2483 gfc_new_block = NULL;
2487 m = gfc_match (" %n%t", name);
2491 if (gfc_get_symbol (name, NULL, &sym))
2494 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, NULL) == FAILURE)
2497 gfc_new_block = sym;
2503 /* Free a namelist structure. */
2506 gfc_free_namelist (gfc_namelist * name)
2510 for (; name; name = n)
2518 /* Match a NAMELIST statement. */
2521 gfc_match_namelist (void)
2523 gfc_symbol *group_name, *sym;
2527 m = gfc_match (" / %s /", &group_name);
2530 if (m == MATCH_ERROR)
2535 if (group_name->ts.type != BT_UNKNOWN)
2538 ("Namelist group name '%s' at %C already has a basic type "
2539 "of %s", group_name->name, gfc_typename (&group_name->ts));
2543 if (group_name->attr.flavor != FL_NAMELIST
2544 && gfc_add_flavor (&group_name->attr, FL_NAMELIST, NULL) == FAILURE)
2549 m = gfc_match_symbol (&sym, 1);
2552 if (m == MATCH_ERROR)
2555 if (sym->attr.in_namelist == 0
2556 && gfc_add_in_namelist (&sym->attr, NULL) == FAILURE)
2559 /* TODO: worry about PRIVATE members of a PUBLIC namelist
2562 nl = gfc_get_namelist ();
2565 if (group_name->namelist == NULL)
2566 group_name->namelist = group_name->namelist_tail = nl;
2569 group_name->namelist_tail->next = nl;
2570 group_name->namelist_tail = nl;
2573 if (gfc_match_eos () == MATCH_YES)
2576 m = gfc_match_char (',');
2578 if (gfc_match_char ('/') == MATCH_YES)
2580 m2 = gfc_match (" %s /", &group_name);
2581 if (m2 == MATCH_YES)
2583 if (m2 == MATCH_ERROR)
2597 gfc_syntax_error (ST_NAMELIST);
2604 /* Match a MODULE statement. */
2607 gfc_match_module (void)
2611 m = gfc_match (" %s%t", &gfc_new_block);
2615 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE, NULL) == FAILURE)
2622 /* Free equivalence sets and lists. Recursively is the easiest way to
2626 gfc_free_equiv (gfc_equiv * eq)
2632 gfc_free_equiv (eq->eq);
2633 gfc_free_equiv (eq->next);
2635 gfc_free_expr (eq->expr);
2640 /* Match an EQUIVALENCE statement. */
2643 gfc_match_equivalence (void)
2645 gfc_equiv *eq, *set, *tail;
2653 eq = gfc_get_equiv ();
2657 eq->next = gfc_current_ns->equiv;
2658 gfc_current_ns->equiv = eq;
2660 if (gfc_match_char ('(') != MATCH_YES)
2667 m = gfc_match_variable (&set->expr, 1);
2668 if (m == MATCH_ERROR)
2673 for (ref = set->expr->ref; ref; ref = ref->next)
2674 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2677 ("Array reference in EQUIVALENCE at %C cannot be an "
2682 if (gfc_match_char (')') == MATCH_YES)
2684 if (gfc_match_char (',') != MATCH_YES)
2687 set->eq = gfc_get_equiv ();
2691 if (gfc_match_eos () == MATCH_YES)
2693 if (gfc_match_char (',') != MATCH_YES)
2700 gfc_syntax_error (ST_EQUIVALENCE);
2706 gfc_free_equiv (gfc_current_ns->equiv);
2707 gfc_current_ns->equiv = eq;
2713 /* Match a statement function declaration. It is so easy to match
2714 non-statement function statements with a MATCH_ERROR as opposed to
2715 MATCH_NO that we suppress error message in most cases. */
2718 gfc_match_st_function (void)
2720 gfc_error_buf old_error;
2725 m = gfc_match_symbol (&sym, 0);
2729 gfc_push_error (&old_error);
2731 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION, NULL) == FAILURE)
2734 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
2737 m = gfc_match (" = %e%t", &expr);
2740 if (m == MATCH_ERROR)
2748 gfc_pop_error (&old_error);
2753 /********************* DATA statement subroutines *********************/
2755 /* Free a gfc_data_variable structure and everything beneath it. */
2758 free_variable (gfc_data_variable * p)
2760 gfc_data_variable *q;
2765 gfc_free_expr (p->expr);
2766 gfc_free_iterator (&p->iter, 0);
2767 free_variable (p->list);
2774 /* Free a gfc_data_value structure and everything beneath it. */
2777 free_value (gfc_data_value * p)
2784 gfc_free_expr (p->expr);
2790 /* Free a list of gfc_data structures. */
2793 gfc_free_data (gfc_data * p)
2801 free_variable (p->var);
2802 free_value (p->value);
2809 static match var_element (gfc_data_variable *);
2811 /* Match a list of variables terminated by an iterator and a right
2815 var_list (gfc_data_variable * parent)
2817 gfc_data_variable *tail, var;
2820 m = var_element (&var);
2821 if (m == MATCH_ERROR)
2826 tail = gfc_get_data_variable ();
2829 parent->list = tail;
2833 if (gfc_match_char (',') != MATCH_YES)
2836 m = gfc_match_iterator (&parent->iter, 1);
2839 if (m == MATCH_ERROR)
2842 m = var_element (&var);
2843 if (m == MATCH_ERROR)
2848 tail->next = gfc_get_data_variable ();
2854 if (gfc_match_char (')') != MATCH_YES)
2859 gfc_syntax_error (ST_DATA);
2864 /* Match a single element in a data variable list, which can be a
2865 variable-iterator list. */
2868 var_element (gfc_data_variable * new)
2874 memset (new, '\0', sizeof (gfc_data_variable));
2876 if (gfc_match_char ('(') == MATCH_YES)
2877 return var_list (new);
2879 m = gfc_match_variable (&new->expr, 0);
2883 sym = new->expr->symtree->n.sym;
2885 if(sym->value != NULL)
2887 gfc_error ("Variable '%s' at %C already has an initialization",
2892 #if 0 // TODO: Find out where to move this message
2893 if (sym->attr.in_common)
2894 /* See if sym is in the blank common block. */
2895 for (t = &sym->ns->blank_common; t; t = t->common_next)
2898 gfc_error ("DATA statement at %C may not initialize variable "
2899 "'%s' from blank COMMON", sym->name);
2904 if (gfc_add_data (&sym->attr, &new->expr->where) == FAILURE)
2911 /* Match the top-level list of data variables. */
2914 top_var_list (gfc_data * d)
2916 gfc_data_variable var, *tail, *new;
2923 m = var_element (&var);
2926 if (m == MATCH_ERROR)
2929 new = gfc_get_data_variable ();
2939 if (gfc_match_char ('/') == MATCH_YES)
2941 if (gfc_match_char (',') != MATCH_YES)
2948 gfc_syntax_error (ST_DATA);
2954 match_data_constant (gfc_expr ** result)
2956 char name[GFC_MAX_SYMBOL_LEN + 1];
2961 m = gfc_match_literal_constant (&expr, 1);
2968 if (m == MATCH_ERROR)
2971 m = gfc_match_null (result);
2975 m = gfc_match_name (name);
2979 if (gfc_find_symbol (name, NULL, 1, &sym))
2983 || (sym->attr.flavor != FL_PARAMETER && sym->attr.flavor != FL_DERIVED))
2985 gfc_error ("Symbol '%s' must be a PARAMETER in DATA statement at %C",
2989 else if (sym->attr.flavor == FL_DERIVED)
2990 return gfc_match_structure_constructor (sym, result);
2992 *result = gfc_copy_expr (sym->value);
2997 /* Match a list of values in a DATA statement. The leading '/' has
2998 already been seen at this point. */
3001 top_val_list (gfc_data * data)
3003 gfc_data_value *new, *tail;
3012 m = match_data_constant (&expr);
3015 if (m == MATCH_ERROR)
3018 new = gfc_get_data_value ();
3027 if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
3034 msg = gfc_extract_int (expr, &tail->repeat);
3035 gfc_free_expr (expr);
3042 m = match_data_constant (&tail->expr);
3045 if (m == MATCH_ERROR)
3049 if (gfc_match_char ('/') == MATCH_YES)
3051 if (gfc_match_char (',') == MATCH_NO)
3058 gfc_syntax_error (ST_DATA);
3063 /* Match a DATA statement. */
3066 gfc_match_data (void)
3073 new = gfc_get_data ();
3074 new->where = gfc_current_locus;
3076 m = top_var_list (new);
3080 m = top_val_list (new);
3084 new->next = gfc_current_ns->data;
3085 gfc_current_ns->data = new;
3087 if (gfc_match_eos () == MATCH_YES)
3090 gfc_match_char (','); /* Optional comma */
3093 if (gfc_pure (NULL))
3095 gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
3102 gfc_free_data (new);
3107 /***************** SELECT CASE subroutines ******************/
3109 /* Free a single case structure. */
3112 free_case (gfc_case * p)
3114 if (p->low == p->high)
3116 gfc_free_expr (p->low);
3117 gfc_free_expr (p->high);
3122 /* Free a list of case structures. */
3125 gfc_free_case_list (gfc_case * p)
3137 /* Match a single case selector. */
3140 match_case_selector (gfc_case ** cp)
3145 c = gfc_get_case ();
3146 c->where = gfc_current_locus;
3148 if (gfc_match_char (':') == MATCH_YES)
3150 m = gfc_match_init_expr (&c->high);
3153 if (m == MATCH_ERROR)
3159 m = gfc_match_init_expr (&c->low);
3160 if (m == MATCH_ERROR)
3165 /* If we're not looking at a ':' now, make a range out of a single
3166 target. Else get the upper bound for the case range. */
3167 if (gfc_match_char (':') != MATCH_YES)
3171 m = gfc_match_init_expr (&c->high);
3172 if (m == MATCH_ERROR)
3174 /* MATCH_NO is fine. It's OK if nothing is there! */
3182 gfc_error ("Expected initialization expression in CASE at %C");
3190 /* Match the end of a case statement. */
3193 match_case_eos (void)
3195 char name[GFC_MAX_SYMBOL_LEN + 1];
3198 if (gfc_match_eos () == MATCH_YES)
3201 gfc_gobble_whitespace ();
3203 m = gfc_match_name (name);
3207 if (strcmp (name, gfc_current_block ()->name) != 0)
3209 gfc_error ("Expected case name of '%s' at %C",
3210 gfc_current_block ()->name);
3214 return gfc_match_eos ();
3218 /* Match a SELECT statement. */
3221 gfc_match_select (void)
3226 m = gfc_match_label ();
3227 if (m == MATCH_ERROR)
3230 m = gfc_match (" select case ( %e )%t", &expr);
3234 new_st.op = EXEC_SELECT;
3241 /* Match a CASE statement. */
3244 gfc_match_case (void)
3246 gfc_case *c, *head, *tail;
3251 if (gfc_current_state () != COMP_SELECT)
3253 gfc_error ("Unexpected CASE statement at %C");
3257 if (gfc_match ("% default") == MATCH_YES)
3259 m = match_case_eos ();
3262 if (m == MATCH_ERROR)
3265 new_st.op = EXEC_SELECT;
3266 c = gfc_get_case ();
3267 c->where = gfc_current_locus;
3268 new_st.ext.case_list = c;
3272 if (gfc_match_char ('(') != MATCH_YES)
3277 if (match_case_selector (&c) == MATCH_ERROR)
3287 if (gfc_match_char (')') == MATCH_YES)
3289 if (gfc_match_char (',') != MATCH_YES)
3293 m = match_case_eos ();
3296 if (m == MATCH_ERROR)
3299 new_st.op = EXEC_SELECT;
3300 new_st.ext.case_list = head;
3305 gfc_error ("Syntax error in CASE-specification at %C");
3308 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
3312 /********************* WHERE subroutines ********************/
3314 /* Match a WHERE statement. */
3317 gfc_match_where (gfc_statement * st)
3323 m0 = gfc_match_label ();
3324 if (m0 == MATCH_ERROR)
3327 m = gfc_match (" where ( %e )", &expr);
3331 if (gfc_match_eos () == MATCH_YES)
3333 *st = ST_WHERE_BLOCK;
3335 new_st.op = EXEC_WHERE;
3340 m = gfc_match_assignment ();
3342 gfc_syntax_error (ST_WHERE);
3346 gfc_free_expr (expr);
3350 /* We've got a simple WHERE statement. */
3352 c = gfc_get_code ();
3356 c->next = gfc_get_code ();
3359 gfc_clear_new_st ();
3361 new_st.op = EXEC_WHERE;
3368 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
3369 new_st if successful. */
3372 gfc_match_elsewhere (void)
3374 char name[GFC_MAX_SYMBOL_LEN + 1];
3378 if (gfc_current_state () != COMP_WHERE)
3380 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3386 if (gfc_match_char ('(') == MATCH_YES)
3388 m = gfc_match_expr (&expr);
3391 if (m == MATCH_ERROR)
3394 if (gfc_match_char (')') != MATCH_YES)
3398 if (gfc_match_eos () != MATCH_YES)
3399 { /* Better be a name at this point */
3400 m = gfc_match_name (name);
3403 if (m == MATCH_ERROR)
3406 if (gfc_match_eos () != MATCH_YES)
3409 if (strcmp (name, gfc_current_block ()->name) != 0)
3411 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3412 name, gfc_current_block ()->name);
3417 new_st.op = EXEC_WHERE;
3422 gfc_syntax_error (ST_ELSEWHERE);
3425 gfc_free_expr (expr);
3430 /******************** FORALL subroutines ********************/
3432 /* Free a list of FORALL iterators. */
3435 gfc_free_forall_iterator (gfc_forall_iterator * iter)
3437 gfc_forall_iterator *next;
3443 gfc_free_expr (iter->var);
3444 gfc_free_expr (iter->start);
3445 gfc_free_expr (iter->end);
3446 gfc_free_expr (iter->stride);
3454 /* Match an iterator as part of a FORALL statement. The format is:
3456 <var> = <start>:<end>[:<stride>][, <scalar mask>] */
3459 match_forall_iterator (gfc_forall_iterator ** result)
3461 gfc_forall_iterator *iter;
3465 where = gfc_current_locus;
3466 iter = gfc_getmem (sizeof (gfc_forall_iterator));
3468 m = gfc_match_variable (&iter->var, 0);
3472 if (gfc_match_char ('=') != MATCH_YES)
3478 m = gfc_match_expr (&iter->start);
3481 if (m == MATCH_ERROR)
3484 if (gfc_match_char (':') != MATCH_YES)
3487 m = gfc_match_expr (&iter->end);
3490 if (m == MATCH_ERROR)
3493 if (gfc_match_char (':') == MATCH_NO)
3494 iter->stride = gfc_int_expr (1);
3497 m = gfc_match_expr (&iter->stride);
3500 if (m == MATCH_ERROR)
3508 gfc_error ("Syntax error in FORALL iterator at %C");
3512 gfc_current_locus = where;
3513 gfc_free_forall_iterator (iter);
3518 /* Match a FORALL statement. */
3521 gfc_match_forall (gfc_statement * st)
3523 gfc_forall_iterator *head, *tail, *new;
3532 m0 = gfc_match_label ();
3533 if (m0 == MATCH_ERROR)
3536 m = gfc_match (" forall (");
3540 m = match_forall_iterator (&new);
3541 if (m == MATCH_ERROR)
3550 if (gfc_match_char (',') != MATCH_YES)
3553 m = match_forall_iterator (&new);
3554 if (m == MATCH_ERROR)
3563 /* Have to have a mask expression. */
3564 m = gfc_match_expr (&mask);
3567 if (m == MATCH_ERROR)
3573 if (gfc_match_char (')') == MATCH_NO)
3576 if (gfc_match_eos () == MATCH_YES)
3578 *st = ST_FORALL_BLOCK;
3580 new_st.op = EXEC_FORALL;
3582 new_st.ext.forall_iterator = head;
3587 m = gfc_match_assignment ();
3588 if (m == MATCH_ERROR)
3592 m = gfc_match_pointer_assignment ();
3593 if (m == MATCH_ERROR)
3599 c = gfc_get_code ();
3602 if (gfc_match_eos () != MATCH_YES)
3605 gfc_clear_new_st ();
3606 new_st.op = EXEC_FORALL;
3608 new_st.ext.forall_iterator = head;
3609 new_st.block = gfc_get_code ();
3611 new_st.block->op = EXEC_FORALL;
3612 new_st.block->next = c;
3618 gfc_syntax_error (ST_FORALL);
3621 gfc_free_forall_iterator (head);
3622 gfc_free_expr (mask);
3623 gfc_free_statements (c);