Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / fortran / match.c
blob324e52ecee042d532c5acb6985c25d104dc54043
1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
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
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "match.h"
27 #include "parse.h"
30 /* For debugging and diagnostic purposes. Return the textual representation
31 of the intrinsic operator OP. */
32 const char *
33 gfc_op2string (gfc_intrinsic_op op)
35 switch (op)
37 case INTRINSIC_UPLUS:
38 case INTRINSIC_PLUS:
39 return "+";
41 case INTRINSIC_UMINUS:
42 case INTRINSIC_MINUS:
43 return "-";
45 case INTRINSIC_POWER:
46 return "**";
47 case INTRINSIC_CONCAT:
48 return "//";
49 case INTRINSIC_TIMES:
50 return "*";
51 case INTRINSIC_DIVIDE:
52 return "/";
54 case INTRINSIC_AND:
55 return ".and.";
56 case INTRINSIC_OR:
57 return ".or.";
58 case INTRINSIC_EQV:
59 return ".eqv.";
60 case INTRINSIC_NEQV:
61 return ".neqv.";
63 case INTRINSIC_EQ_OS:
64 return ".eq.";
65 case INTRINSIC_EQ:
66 return "==";
67 case INTRINSIC_NE_OS:
68 return ".ne.";
69 case INTRINSIC_NE:
70 return "/=";
71 case INTRINSIC_GE_OS:
72 return ".ge.";
73 case INTRINSIC_GE:
74 return ">=";
75 case INTRINSIC_LE_OS:
76 return ".le.";
77 case INTRINSIC_LE:
78 return "<=";
79 case INTRINSIC_LT_OS:
80 return ".lt.";
81 case INTRINSIC_LT:
82 return "<";
83 case INTRINSIC_GT_OS:
84 return ".gt.";
85 case INTRINSIC_GT:
86 return ">";
87 case INTRINSIC_NOT:
88 return ".not.";
90 case INTRINSIC_ASSIGN:
91 return "=";
93 case INTRINSIC_PARENTHESES:
94 return "parens";
96 default:
97 break;
100 gfc_internal_error ("gfc_op2string(): Bad code");
101 /* Not reached. */
105 /******************** Generic matching subroutines ************************/
107 /* This function scans the current statement counting the opened and closed
108 parenthesis to make sure they are balanced. */
110 match
111 gfc_match_parens (void)
113 locus old_loc, where;
114 int c, count, instring;
115 char quote;
117 old_loc = gfc_current_locus;
118 count = 0;
119 instring = 0;
120 quote = ' ';
122 for (;;)
124 c = gfc_next_char_literal (instring);
125 if (c == '\n')
126 break;
127 if (quote == ' ' && ((c == '\'') || (c == '"')))
129 quote = (char) c;
130 instring = 1;
131 continue;
133 if (quote != ' ' && c == quote)
135 quote = ' ';
136 instring = 0;
137 continue;
140 if (c == '(' && quote == ' ')
142 count++;
143 where = gfc_current_locus;
145 if (c == ')' && quote == ' ')
147 count--;
148 where = gfc_current_locus;
152 gfc_current_locus = old_loc;
154 if (count > 0)
156 gfc_error ("Missing ')' in statement before %L", &where);
157 return MATCH_ERROR;
159 if (count < 0)
161 gfc_error ("Missing '(' in statement before %L", &where);
162 return MATCH_ERROR;
165 return MATCH_YES;
169 /* See if the next character is a special character that has
170 escaped by a \ via the -fbackslash option. */
172 match
173 gfc_match_special_char (int *c)
176 match m;
178 m = MATCH_YES;
180 switch (gfc_next_char_literal (1))
182 case 'a':
183 *c = '\a';
184 break;
185 case 'b':
186 *c = '\b';
187 break;
188 case 't':
189 *c = '\t';
190 break;
191 case 'f':
192 *c = '\f';
193 break;
194 case 'n':
195 *c = '\n';
196 break;
197 case 'r':
198 *c = '\r';
199 break;
200 case 'v':
201 *c = '\v';
202 break;
203 case '\\':
204 *c = '\\';
205 break;
206 case '0':
207 *c = '\0';
208 break;
209 default:
210 /* Unknown backslash codes are simply not expanded. */
211 m = MATCH_NO;
212 break;
215 return m;
219 /* In free form, match at least one space. Always matches in fixed
220 form. */
222 match
223 gfc_match_space (void)
225 locus old_loc;
226 int c;
228 if (gfc_current_form == FORM_FIXED)
229 return MATCH_YES;
231 old_loc = gfc_current_locus;
233 c = gfc_next_char ();
234 if (!gfc_is_whitespace (c))
236 gfc_current_locus = old_loc;
237 return MATCH_NO;
240 gfc_gobble_whitespace ();
242 return MATCH_YES;
246 /* Match an end of statement. End of statement is optional
247 whitespace, followed by a ';' or '\n' or comment '!'. If a
248 semicolon is found, we continue to eat whitespace and semicolons. */
250 match
251 gfc_match_eos (void)
253 locus old_loc;
254 int flag, c;
256 flag = 0;
258 for (;;)
260 old_loc = gfc_current_locus;
261 gfc_gobble_whitespace ();
263 c = gfc_next_char ();
264 switch (c)
266 case '!':
269 c = gfc_next_char ();
271 while (c != '\n');
273 /* Fall through. */
275 case '\n':
276 return MATCH_YES;
278 case ';':
279 flag = 1;
280 continue;
283 break;
286 gfc_current_locus = old_loc;
287 return (flag) ? MATCH_YES : MATCH_NO;
291 /* Match a literal integer on the input, setting the value on
292 MATCH_YES. Literal ints occur in kind-parameters as well as
293 old-style character length specifications. If cnt is non-NULL it
294 will be set to the number of digits. */
296 match
297 gfc_match_small_literal_int (int *value, int *cnt)
299 locus old_loc;
300 char c;
301 int i, j;
303 old_loc = gfc_current_locus;
305 gfc_gobble_whitespace ();
306 c = gfc_next_char ();
307 if (cnt)
308 *cnt = 0;
310 if (!ISDIGIT (c))
312 gfc_current_locus = old_loc;
313 return MATCH_NO;
316 i = c - '0';
317 j = 1;
319 for (;;)
321 old_loc = gfc_current_locus;
322 c = gfc_next_char ();
324 if (!ISDIGIT (c))
325 break;
327 i = 10 * i + c - '0';
328 j++;
330 if (i > 99999999)
332 gfc_error ("Integer too large at %C");
333 return MATCH_ERROR;
337 gfc_current_locus = old_loc;
339 *value = i;
340 if (cnt)
341 *cnt = j;
342 return MATCH_YES;
346 /* Match a small, constant integer expression, like in a kind
347 statement. On MATCH_YES, 'value' is set. */
349 match
350 gfc_match_small_int (int *value)
352 gfc_expr *expr;
353 const char *p;
354 match m;
355 int i;
357 m = gfc_match_expr (&expr);
358 if (m != MATCH_YES)
359 return m;
361 p = gfc_extract_int (expr, &i);
362 gfc_free_expr (expr);
364 if (p != NULL)
366 gfc_error (p);
367 m = MATCH_ERROR;
370 *value = i;
371 return m;
375 /* This function is the same as the gfc_match_small_int, except that
376 we're keeping the pointer to the expr. This function could just be
377 removed and the previously mentioned one modified, though all calls
378 to it would have to be modified then (and there were a number of
379 them). Return MATCH_ERROR if fail to extract the int; otherwise,
380 return the result of gfc_match_expr(). The expr (if any) that was
381 matched is returned in the parameter expr. */
383 match
384 gfc_match_small_int_expr (int *value, gfc_expr **expr)
386 const char *p;
387 match m;
388 int i;
390 m = gfc_match_expr (expr);
391 if (m != MATCH_YES)
392 return m;
394 p = gfc_extract_int (*expr, &i);
396 if (p != NULL)
398 gfc_error (p);
399 m = MATCH_ERROR;
402 *value = i;
403 return m;
407 /* Matches a statement label. Uses gfc_match_small_literal_int() to
408 do most of the work. */
410 match
411 gfc_match_st_label (gfc_st_label **label)
413 locus old_loc;
414 match m;
415 int i, cnt;
417 old_loc = gfc_current_locus;
419 m = gfc_match_small_literal_int (&i, &cnt);
420 if (m != MATCH_YES)
421 return m;
423 if (cnt > 5)
425 gfc_error ("Too many digits in statement label at %C");
426 goto cleanup;
429 if (i == 0)
431 gfc_error ("Statement label at %C is zero");
432 goto cleanup;
435 *label = gfc_get_st_label (i);
436 return MATCH_YES;
438 cleanup:
440 gfc_current_locus = old_loc;
441 return MATCH_ERROR;
445 /* Match and validate a label associated with a named IF, DO or SELECT
446 statement. If the symbol does not have the label attribute, we add
447 it. We also make sure the symbol does not refer to another
448 (active) block. A matched label is pointed to by gfc_new_block. */
450 match
451 gfc_match_label (void)
453 char name[GFC_MAX_SYMBOL_LEN + 1];
454 match m;
456 gfc_new_block = NULL;
458 m = gfc_match (" %n :", name);
459 if (m != MATCH_YES)
460 return m;
462 if (gfc_get_symbol (name, NULL, &gfc_new_block))
464 gfc_error ("Label name '%s' at %C is ambiguous", name);
465 return MATCH_ERROR;
468 if (gfc_new_block->attr.flavor == FL_LABEL)
470 gfc_error ("Duplicate construct label '%s' at %C", name);
471 return MATCH_ERROR;
474 if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
475 gfc_new_block->name, NULL) == FAILURE)
476 return MATCH_ERROR;
478 return MATCH_YES;
482 /* See if the current input looks like a name of some sort. Modifies
483 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
484 Note that options.c restricts max_identifier_length to not more
485 than GFC_MAX_SYMBOL_LEN. */
487 match
488 gfc_match_name (char *buffer)
490 locus old_loc;
491 int i, c;
493 old_loc = gfc_current_locus;
494 gfc_gobble_whitespace ();
496 c = gfc_next_char ();
497 if (!(ISALPHA (c) || (c == '_' && gfc_option.flag_allow_leading_underscore)))
499 if (gfc_error_flag_test() == 0 && c != '(')
500 gfc_error ("Invalid character in name at %C");
501 gfc_current_locus = old_loc;
502 return MATCH_NO;
505 i = 0;
509 buffer[i++] = c;
511 if (i > gfc_option.max_identifier_length)
513 gfc_error ("Name at %C is too long");
514 return MATCH_ERROR;
517 old_loc = gfc_current_locus;
518 c = gfc_next_char ();
520 while (ISALNUM (c) || c == '_' || (gfc_option.flag_dollar_ok && c == '$'));
522 buffer[i] = '\0';
523 gfc_current_locus = old_loc;
525 return MATCH_YES;
529 /* Match a valid name for C, which is almost the same as for Fortran,
530 except that you can start with an underscore, etc.. It could have
531 been done by modifying the gfc_match_name, but this way other
532 things C allows can be added, such as no limits on the length.
533 Right now, the length is limited to the same thing as Fortran..
534 Also, by rewriting it, we use the gfc_next_char_C() to prevent the
535 input characters from being automatically lower cased, since C is
536 case sensitive. The parameter, buffer, is used to return the name
537 that is matched. Return MATCH_ERROR if the name is too long
538 (though this is a self-imposed limit), MATCH_NO if what we're
539 seeing isn't a name, and MATCH_YES if we successfully match a C
540 name. */
542 match
543 gfc_match_name_C (char *buffer)
545 locus old_loc;
546 int i = 0;
547 int c;
549 old_loc = gfc_current_locus;
550 gfc_gobble_whitespace ();
552 /* Get the next char (first possible char of name) and see if
553 it's valid for C (either a letter or an underscore). */
554 c = gfc_next_char_literal (1);
556 /* If the user put nothing expect spaces between the quotes, it is valid
557 and simply means there is no name= specifier and the name is the fortran
558 symbol name, all lowercase. */
559 if (c == '"' || c == '\'')
561 buffer[0] = '\0';
562 gfc_current_locus = old_loc;
563 return MATCH_YES;
566 if (!ISALPHA (c) && c != '_')
568 gfc_error ("Invalid C name in NAME= specifier at %C");
569 return MATCH_ERROR;
572 /* Continue to read valid variable name characters. */
575 buffer[i++] = c;
577 /* C does not define a maximum length of variable names, to my
578 knowledge, but the compiler typically places a limit on them.
579 For now, i'll use the same as the fortran limit for simplicity,
580 but this may need to be changed to a dynamic buffer that can
581 be realloc'ed here if necessary, or more likely, a larger
582 upper-bound set. */
583 if (i > gfc_option.max_identifier_length)
585 gfc_error ("Name at %C is too long");
586 return MATCH_ERROR;
589 old_loc = gfc_current_locus;
591 /* Get next char; param means we're in a string. */
592 c = gfc_next_char_literal (1);
593 } while (ISALNUM (c) || c == '_');
595 buffer[i] = '\0';
596 gfc_current_locus = old_loc;
598 /* See if we stopped because of whitespace. */
599 if (c == ' ')
601 gfc_gobble_whitespace ();
602 c = gfc_peek_char ();
603 if (c != '"' && c != '\'')
605 gfc_error ("Embedded space in NAME= specifier at %C");
606 return MATCH_ERROR;
610 /* If we stopped because we had an invalid character for a C name, report
611 that to the user by returning MATCH_NO. */
612 if (c != '"' && c != '\'')
614 gfc_error ("Invalid C name in NAME= specifier at %C");
615 return MATCH_ERROR;
618 return MATCH_YES;
622 /* Match a symbol on the input. Modifies the pointer to the symbol
623 pointer if successful. */
625 match
626 gfc_match_sym_tree (gfc_symtree **matched_symbol, int host_assoc)
628 char buffer[GFC_MAX_SYMBOL_LEN + 1];
629 match m;
631 m = gfc_match_name (buffer);
632 if (m != MATCH_YES)
633 return m;
635 if (host_assoc)
636 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
637 ? MATCH_ERROR : MATCH_YES;
639 if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
640 return MATCH_ERROR;
642 return MATCH_YES;
646 match
647 gfc_match_symbol (gfc_symbol **matched_symbol, int host_assoc)
649 gfc_symtree *st;
650 match m;
652 m = gfc_match_sym_tree (&st, host_assoc);
654 if (m == MATCH_YES)
656 if (st)
657 *matched_symbol = st->n.sym;
658 else
659 *matched_symbol = NULL;
661 else
662 *matched_symbol = NULL;
663 return m;
667 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
668 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
669 in matchexp.c. */
671 match
672 gfc_match_intrinsic_op (gfc_intrinsic_op *result)
674 locus orig_loc = gfc_current_locus;
675 int ch;
677 gfc_gobble_whitespace ();
678 ch = gfc_next_char ();
679 switch (ch)
681 case '+':
682 /* Matched "+". */
683 *result = INTRINSIC_PLUS;
684 return MATCH_YES;
686 case '-':
687 /* Matched "-". */
688 *result = INTRINSIC_MINUS;
689 return MATCH_YES;
691 case '=':
692 if (gfc_next_char () == '=')
694 /* Matched "==". */
695 *result = INTRINSIC_EQ;
696 return MATCH_YES;
698 break;
700 case '<':
701 if (gfc_peek_char () == '=')
703 /* Matched "<=". */
704 gfc_next_char ();
705 *result = INTRINSIC_LE;
706 return MATCH_YES;
708 /* Matched "<". */
709 *result = INTRINSIC_LT;
710 return MATCH_YES;
712 case '>':
713 if (gfc_peek_char () == '=')
715 /* Matched ">=". */
716 gfc_next_char ();
717 *result = INTRINSIC_GE;
718 return MATCH_YES;
720 /* Matched ">". */
721 *result = INTRINSIC_GT;
722 return MATCH_YES;
724 case '*':
725 if (gfc_peek_char () == '*')
727 /* Matched "**". */
728 gfc_next_char ();
729 *result = INTRINSIC_POWER;
730 return MATCH_YES;
732 /* Matched "*". */
733 *result = INTRINSIC_TIMES;
734 return MATCH_YES;
736 case '/':
737 ch = gfc_peek_char ();
738 if (ch == '=')
740 /* Matched "/=". */
741 gfc_next_char ();
742 *result = INTRINSIC_NE;
743 return MATCH_YES;
745 else if (ch == '/')
747 /* Matched "//". */
748 gfc_next_char ();
749 *result = INTRINSIC_CONCAT;
750 return MATCH_YES;
752 /* Matched "/". */
753 *result = INTRINSIC_DIVIDE;
754 return MATCH_YES;
756 case '.':
757 ch = gfc_next_char ();
758 switch (ch)
760 case 'a':
761 if (gfc_next_char () == 'n'
762 && gfc_next_char () == 'd'
763 && gfc_next_char () == '.')
765 /* Matched ".and.". */
766 *result = INTRINSIC_AND;
767 return MATCH_YES;
769 break;
771 case 'e':
772 if (gfc_next_char () == 'q')
774 ch = gfc_next_char ();
775 if (ch == '.')
777 /* Matched ".eq.". */
778 *result = INTRINSIC_EQ_OS;
779 return MATCH_YES;
781 else if (ch == 'v')
783 if (gfc_next_char () == '.')
785 /* Matched ".eqv.". */
786 *result = INTRINSIC_EQV;
787 return MATCH_YES;
791 break;
793 case 'g':
794 ch = gfc_next_char ();
795 if (ch == 'e')
797 if (gfc_next_char () == '.')
799 /* Matched ".ge.". */
800 *result = INTRINSIC_GE_OS;
801 return MATCH_YES;
804 else if (ch == 't')
806 if (gfc_next_char () == '.')
808 /* Matched ".gt.". */
809 *result = INTRINSIC_GT_OS;
810 return MATCH_YES;
813 break;
815 case 'l':
816 ch = gfc_next_char ();
817 if (ch == 'e')
819 if (gfc_next_char () == '.')
821 /* Matched ".le.". */
822 *result = INTRINSIC_LE_OS;
823 return MATCH_YES;
826 else if (ch == 't')
828 if (gfc_next_char () == '.')
830 /* Matched ".lt.". */
831 *result = INTRINSIC_LT_OS;
832 return MATCH_YES;
835 break;
837 case 'n':
838 ch = gfc_next_char ();
839 if (ch == 'e')
841 ch = gfc_next_char ();
842 if (ch == '.')
844 /* Matched ".ne.". */
845 *result = INTRINSIC_NE_OS;
846 return MATCH_YES;
848 else if (ch == 'q')
850 if (gfc_next_char () == 'v'
851 && gfc_next_char () == '.')
853 /* Matched ".neqv.". */
854 *result = INTRINSIC_NEQV;
855 return MATCH_YES;
859 else if (ch == 'o')
861 if (gfc_next_char () == 't'
862 && gfc_next_char () == '.')
864 /* Matched ".not.". */
865 *result = INTRINSIC_NOT;
866 return MATCH_YES;
869 break;
871 case 'o':
872 if (gfc_next_char () == 'r'
873 && gfc_next_char () == '.')
875 /* Matched ".or.". */
876 *result = INTRINSIC_OR;
877 return MATCH_YES;
879 break;
881 default:
882 break;
884 break;
886 default:
887 break;
890 gfc_current_locus = orig_loc;
891 return MATCH_NO;
895 /* Match a loop control phrase:
897 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
899 If the final integer expression is not present, a constant unity
900 expression is returned. We don't return MATCH_ERROR until after
901 the equals sign is seen. */
903 match
904 gfc_match_iterator (gfc_iterator *iter, int init_flag)
906 char name[GFC_MAX_SYMBOL_LEN + 1];
907 gfc_expr *var, *e1, *e2, *e3;
908 locus start;
909 match m;
911 /* Match the start of an iterator without affecting the symbol table. */
913 start = gfc_current_locus;
914 m = gfc_match (" %n =", name);
915 gfc_current_locus = start;
917 if (m != MATCH_YES)
918 return MATCH_NO;
920 m = gfc_match_variable (&var, 0);
921 if (m != MATCH_YES)
922 return MATCH_NO;
924 gfc_match_char ('=');
926 e1 = e2 = e3 = NULL;
928 if (var->ref != NULL)
930 gfc_error ("Loop variable at %C cannot be a sub-component");
931 goto cleanup;
934 if (var->symtree->n.sym->attr.intent == INTENT_IN)
936 gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
937 var->symtree->n.sym->name);
938 goto cleanup;
941 var->symtree->n.sym->attr.implied_index = 1;
943 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
944 if (m == MATCH_NO)
945 goto syntax;
946 if (m == MATCH_ERROR)
947 goto cleanup;
949 if (gfc_match_char (',') != MATCH_YES)
950 goto syntax;
952 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
953 if (m == MATCH_NO)
954 goto syntax;
955 if (m == MATCH_ERROR)
956 goto cleanup;
958 if (gfc_match_char (',') != MATCH_YES)
960 e3 = gfc_int_expr (1);
961 goto done;
964 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
965 if (m == MATCH_ERROR)
966 goto cleanup;
967 if (m == MATCH_NO)
969 gfc_error ("Expected a step value in iterator at %C");
970 goto cleanup;
973 done:
974 iter->var = var;
975 iter->start = e1;
976 iter->end = e2;
977 iter->step = e3;
978 return MATCH_YES;
980 syntax:
981 gfc_error ("Syntax error in iterator at %C");
983 cleanup:
984 gfc_free_expr (e1);
985 gfc_free_expr (e2);
986 gfc_free_expr (e3);
988 return MATCH_ERROR;
992 /* Tries to match the next non-whitespace character on the input.
993 This subroutine does not return MATCH_ERROR. */
995 match
996 gfc_match_char (char c)
998 locus where;
1000 where = gfc_current_locus;
1001 gfc_gobble_whitespace ();
1003 if (gfc_next_char () == c)
1004 return MATCH_YES;
1006 gfc_current_locus = where;
1007 return MATCH_NO;
1011 /* General purpose matching subroutine. The target string is a
1012 scanf-like format string in which spaces correspond to arbitrary
1013 whitespace (including no whitespace), characters correspond to
1014 themselves. The %-codes are:
1016 %% Literal percent sign
1017 %e Expression, pointer to a pointer is set
1018 %s Symbol, pointer to the symbol is set
1019 %n Name, character buffer is set to name
1020 %t Matches end of statement.
1021 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
1022 %l Matches a statement label
1023 %v Matches a variable expression (an lvalue)
1024 % Matches a required space (in free form) and optional spaces. */
1026 match
1027 gfc_match (const char *target, ...)
1029 gfc_st_label **label;
1030 int matches, *ip;
1031 locus old_loc;
1032 va_list argp;
1033 char c, *np;
1034 match m, n;
1035 void **vp;
1036 const char *p;
1038 old_loc = gfc_current_locus;
1039 va_start (argp, target);
1040 m = MATCH_NO;
1041 matches = 0;
1042 p = target;
1044 loop:
1045 c = *p++;
1046 switch (c)
1048 case ' ':
1049 gfc_gobble_whitespace ();
1050 goto loop;
1051 case '\0':
1052 m = MATCH_YES;
1053 break;
1055 case '%':
1056 c = *p++;
1057 switch (c)
1059 case 'e':
1060 vp = va_arg (argp, void **);
1061 n = gfc_match_expr ((gfc_expr **) vp);
1062 if (n != MATCH_YES)
1064 m = n;
1065 goto not_yes;
1068 matches++;
1069 goto loop;
1071 case 'v':
1072 vp = va_arg (argp, void **);
1073 n = gfc_match_variable ((gfc_expr **) vp, 0);
1074 if (n != MATCH_YES)
1076 m = n;
1077 goto not_yes;
1080 matches++;
1081 goto loop;
1083 case 's':
1084 vp = va_arg (argp, void **);
1085 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
1086 if (n != MATCH_YES)
1088 m = n;
1089 goto not_yes;
1092 matches++;
1093 goto loop;
1095 case 'n':
1096 np = va_arg (argp, char *);
1097 n = gfc_match_name (np);
1098 if (n != MATCH_YES)
1100 m = n;
1101 goto not_yes;
1104 matches++;
1105 goto loop;
1107 case 'l':
1108 label = va_arg (argp, gfc_st_label **);
1109 n = gfc_match_st_label (label);
1110 if (n != MATCH_YES)
1112 m = n;
1113 goto not_yes;
1116 matches++;
1117 goto loop;
1119 case 'o':
1120 ip = va_arg (argp, int *);
1121 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
1122 if (n != MATCH_YES)
1124 m = n;
1125 goto not_yes;
1128 matches++;
1129 goto loop;
1131 case 't':
1132 if (gfc_match_eos () != MATCH_YES)
1134 m = MATCH_NO;
1135 goto not_yes;
1137 goto loop;
1139 case ' ':
1140 if (gfc_match_space () == MATCH_YES)
1141 goto loop;
1142 m = MATCH_NO;
1143 goto not_yes;
1145 case '%':
1146 break; /* Fall through to character matcher. */
1148 default:
1149 gfc_internal_error ("gfc_match(): Bad match code %c", c);
1152 default:
1153 if (c == gfc_next_char ())
1154 goto loop;
1155 break;
1158 not_yes:
1159 va_end (argp);
1161 if (m != MATCH_YES)
1163 /* Clean up after a failed match. */
1164 gfc_current_locus = old_loc;
1165 va_start (argp, target);
1167 p = target;
1168 for (; matches > 0; matches--)
1170 while (*p++ != '%');
1172 switch (*p++)
1174 case '%':
1175 matches++;
1176 break; /* Skip. */
1178 /* Matches that don't have to be undone */
1179 case 'o':
1180 case 'l':
1181 case 'n':
1182 case 's':
1183 (void) va_arg (argp, void **);
1184 break;
1186 case 'e':
1187 case 'v':
1188 vp = va_arg (argp, void **);
1189 gfc_free_expr (*vp);
1190 *vp = NULL;
1191 break;
1195 va_end (argp);
1198 return m;
1202 /*********************** Statement level matching **********************/
1204 /* Matches the start of a program unit, which is the program keyword
1205 followed by an obligatory symbol. */
1207 match
1208 gfc_match_program (void)
1210 gfc_symbol *sym;
1211 match m;
1213 m = gfc_match ("% %s%t", &sym);
1215 if (m == MATCH_NO)
1217 gfc_error ("Invalid form of PROGRAM statement at %C");
1218 m = MATCH_ERROR;
1221 if (m == MATCH_ERROR)
1222 return m;
1224 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
1225 return MATCH_ERROR;
1227 gfc_new_block = sym;
1229 return MATCH_YES;
1233 /* Match a simple assignment statement. */
1235 match
1236 gfc_match_assignment (void)
1238 gfc_expr *lvalue, *rvalue;
1239 locus old_loc;
1240 match m;
1242 old_loc = gfc_current_locus;
1244 lvalue = NULL;
1245 m = gfc_match (" %v =", &lvalue);
1246 if (m != MATCH_YES)
1248 gfc_current_locus = old_loc;
1249 gfc_free_expr (lvalue);
1250 return MATCH_NO;
1253 if (lvalue->symtree->n.sym->attr.protected
1254 && lvalue->symtree->n.sym->attr.use_assoc)
1256 gfc_current_locus = old_loc;
1257 gfc_free_expr (lvalue);
1258 gfc_error ("Setting value of PROTECTED variable at %C");
1259 return MATCH_ERROR;
1262 rvalue = NULL;
1263 m = gfc_match (" %e%t", &rvalue);
1264 if (m != MATCH_YES)
1266 gfc_current_locus = old_loc;
1267 gfc_free_expr (lvalue);
1268 gfc_free_expr (rvalue);
1269 return m;
1272 gfc_set_sym_referenced (lvalue->symtree->n.sym);
1274 new_st.op = EXEC_ASSIGN;
1275 new_st.expr = lvalue;
1276 new_st.expr2 = rvalue;
1278 gfc_check_do_variable (lvalue->symtree);
1280 return MATCH_YES;
1284 /* Match a pointer assignment statement. */
1286 match
1287 gfc_match_pointer_assignment (void)
1289 gfc_expr *lvalue, *rvalue;
1290 locus old_loc;
1291 match m;
1293 old_loc = gfc_current_locus;
1295 lvalue = rvalue = NULL;
1297 m = gfc_match (" %v =>", &lvalue);
1298 if (m != MATCH_YES)
1300 m = MATCH_NO;
1301 goto cleanup;
1304 m = gfc_match (" %e%t", &rvalue);
1305 if (m != MATCH_YES)
1306 goto cleanup;
1308 if (lvalue->symtree->n.sym->attr.protected
1309 && lvalue->symtree->n.sym->attr.use_assoc)
1311 gfc_error ("Assigning to a PROTECTED pointer at %C");
1312 m = MATCH_ERROR;
1313 goto cleanup;
1316 new_st.op = EXEC_POINTER_ASSIGN;
1317 new_st.expr = lvalue;
1318 new_st.expr2 = rvalue;
1320 return MATCH_YES;
1322 cleanup:
1323 gfc_current_locus = old_loc;
1324 gfc_free_expr (lvalue);
1325 gfc_free_expr (rvalue);
1326 return m;
1330 /* We try to match an easy arithmetic IF statement. This only happens
1331 when just after having encountered a simple IF statement. This code
1332 is really duplicate with parts of the gfc_match_if code, but this is
1333 *much* easier. */
1335 static match
1336 match_arithmetic_if (void)
1338 gfc_st_label *l1, *l2, *l3;
1339 gfc_expr *expr;
1340 match m;
1342 m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1343 if (m != MATCH_YES)
1344 return m;
1346 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1347 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1348 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1350 gfc_free_expr (expr);
1351 return MATCH_ERROR;
1354 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF statement "
1355 "at %C") == FAILURE)
1356 return MATCH_ERROR;
1358 new_st.op = EXEC_ARITHMETIC_IF;
1359 new_st.expr = expr;
1360 new_st.label = l1;
1361 new_st.label2 = l2;
1362 new_st.label3 = l3;
1364 return MATCH_YES;
1368 /* The IF statement is a bit of a pain. First of all, there are three
1369 forms of it, the simple IF, the IF that starts a block and the
1370 arithmetic IF.
1372 There is a problem with the simple IF and that is the fact that we
1373 only have a single level of undo information on symbols. What this
1374 means is for a simple IF, we must re-match the whole IF statement
1375 multiple times in order to guarantee that the symbol table ends up
1376 in the proper state. */
1378 static match match_simple_forall (void);
1379 static match match_simple_where (void);
1381 match
1382 gfc_match_if (gfc_statement *if_type)
1384 gfc_expr *expr;
1385 gfc_st_label *l1, *l2, *l3;
1386 locus old_loc, old_loc2;
1387 gfc_code *p;
1388 match m, n;
1390 n = gfc_match_label ();
1391 if (n == MATCH_ERROR)
1392 return n;
1394 old_loc = gfc_current_locus;
1396 m = gfc_match (" if ( %e", &expr);
1397 if (m != MATCH_YES)
1398 return m;
1400 old_loc2 = gfc_current_locus;
1401 gfc_current_locus = old_loc;
1403 if (gfc_match_parens () == MATCH_ERROR)
1404 return MATCH_ERROR;
1406 gfc_current_locus = old_loc2;
1408 if (gfc_match_char (')') != MATCH_YES)
1410 gfc_error ("Syntax error in IF-expression at %C");
1411 gfc_free_expr (expr);
1412 return MATCH_ERROR;
1415 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1417 if (m == MATCH_YES)
1419 if (n == MATCH_YES)
1421 gfc_error ("Block label not appropriate for arithmetic IF "
1422 "statement at %C");
1423 gfc_free_expr (expr);
1424 return MATCH_ERROR;
1427 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1428 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1429 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1431 gfc_free_expr (expr);
1432 return MATCH_ERROR;
1435 if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF "
1436 "statement at %C") == FAILURE)
1437 return MATCH_ERROR;
1439 new_st.op = EXEC_ARITHMETIC_IF;
1440 new_st.expr = expr;
1441 new_st.label = l1;
1442 new_st.label2 = l2;
1443 new_st.label3 = l3;
1445 *if_type = ST_ARITHMETIC_IF;
1446 return MATCH_YES;
1449 if (gfc_match (" then%t") == MATCH_YES)
1451 new_st.op = EXEC_IF;
1452 new_st.expr = expr;
1453 *if_type = ST_IF_BLOCK;
1454 return MATCH_YES;
1457 if (n == MATCH_YES)
1459 gfc_error ("Block label is not appropriate for IF statement at %C");
1460 gfc_free_expr (expr);
1461 return MATCH_ERROR;
1464 /* At this point the only thing left is a simple IF statement. At
1465 this point, n has to be MATCH_NO, so we don't have to worry about
1466 re-matching a block label. From what we've got so far, try
1467 matching an assignment. */
1469 *if_type = ST_SIMPLE_IF;
1471 m = gfc_match_assignment ();
1472 if (m == MATCH_YES)
1473 goto got_match;
1475 gfc_free_expr (expr);
1476 gfc_undo_symbols ();
1477 gfc_current_locus = old_loc;
1479 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1480 assignment was found. For MATCH_NO, continue to call the various
1481 matchers. */
1482 if (m == MATCH_ERROR)
1483 return MATCH_ERROR;
1485 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1487 m = gfc_match_pointer_assignment ();
1488 if (m == MATCH_YES)
1489 goto got_match;
1491 gfc_free_expr (expr);
1492 gfc_undo_symbols ();
1493 gfc_current_locus = old_loc;
1495 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match. */
1497 /* Look at the next keyword to see which matcher to call. Matching
1498 the keyword doesn't affect the symbol table, so we don't have to
1499 restore between tries. */
1501 #define match(string, subr, statement) \
1502 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1504 gfc_clear_error ();
1506 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1507 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1508 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1509 match ("call", gfc_match_call, ST_CALL)
1510 match ("close", gfc_match_close, ST_CLOSE)
1511 match ("continue", gfc_match_continue, ST_CONTINUE)
1512 match ("cycle", gfc_match_cycle, ST_CYCLE)
1513 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1514 match ("end file", gfc_match_endfile, ST_END_FILE)
1515 match ("exit", gfc_match_exit, ST_EXIT)
1516 match ("flush", gfc_match_flush, ST_FLUSH)
1517 match ("forall", match_simple_forall, ST_FORALL)
1518 match ("go to", gfc_match_goto, ST_GOTO)
1519 match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1520 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1521 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1522 match ("open", gfc_match_open, ST_OPEN)
1523 match ("pause", gfc_match_pause, ST_NONE)
1524 match ("print", gfc_match_print, ST_WRITE)
1525 match ("read", gfc_match_read, ST_READ)
1526 match ("return", gfc_match_return, ST_RETURN)
1527 match ("rewind", gfc_match_rewind, ST_REWIND)
1528 match ("stop", gfc_match_stop, ST_STOP)
1529 match ("where", match_simple_where, ST_WHERE)
1530 match ("write", gfc_match_write, ST_WRITE)
1532 /* The gfc_match_assignment() above may have returned a MATCH_NO
1533 where the assignment was to a named constant. Check that
1534 special case here. */
1535 m = gfc_match_assignment ();
1536 if (m == MATCH_NO)
1538 gfc_error ("Cannot assign to a named constant at %C");
1539 gfc_free_expr (expr);
1540 gfc_undo_symbols ();
1541 gfc_current_locus = old_loc;
1542 return MATCH_ERROR;
1545 /* All else has failed, so give up. See if any of the matchers has
1546 stored an error message of some sort. */
1547 if (gfc_error_check () == 0)
1548 gfc_error ("Unclassifiable statement in IF-clause at %C");
1550 gfc_free_expr (expr);
1551 return MATCH_ERROR;
1553 got_match:
1554 if (m == MATCH_NO)
1555 gfc_error ("Syntax error in IF-clause at %C");
1556 if (m != MATCH_YES)
1558 gfc_free_expr (expr);
1559 return MATCH_ERROR;
1562 /* At this point, we've matched the single IF and the action clause
1563 is in new_st. Rearrange things so that the IF statement appears
1564 in new_st. */
1566 p = gfc_get_code ();
1567 p->next = gfc_get_code ();
1568 *p->next = new_st;
1569 p->next->loc = gfc_current_locus;
1571 p->expr = expr;
1572 p->op = EXEC_IF;
1574 gfc_clear_new_st ();
1576 new_st.op = EXEC_IF;
1577 new_st.block = p;
1579 return MATCH_YES;
1582 #undef match
1585 /* Match an ELSE statement. */
1587 match
1588 gfc_match_else (void)
1590 char name[GFC_MAX_SYMBOL_LEN + 1];
1592 if (gfc_match_eos () == MATCH_YES)
1593 return MATCH_YES;
1595 if (gfc_match_name (name) != MATCH_YES
1596 || gfc_current_block () == NULL
1597 || gfc_match_eos () != MATCH_YES)
1599 gfc_error ("Unexpected junk after ELSE statement at %C");
1600 return MATCH_ERROR;
1603 if (strcmp (name, gfc_current_block ()->name) != 0)
1605 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1606 name, gfc_current_block ()->name);
1607 return MATCH_ERROR;
1610 return MATCH_YES;
1614 /* Match an ELSE IF statement. */
1616 match
1617 gfc_match_elseif (void)
1619 char name[GFC_MAX_SYMBOL_LEN + 1];
1620 gfc_expr *expr;
1621 match m;
1623 m = gfc_match (" ( %e ) then", &expr);
1624 if (m != MATCH_YES)
1625 return m;
1627 if (gfc_match_eos () == MATCH_YES)
1628 goto done;
1630 if (gfc_match_name (name) != MATCH_YES
1631 || gfc_current_block () == NULL
1632 || gfc_match_eos () != MATCH_YES)
1634 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1635 goto cleanup;
1638 if (strcmp (name, gfc_current_block ()->name) != 0)
1640 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1641 name, gfc_current_block ()->name);
1642 goto cleanup;
1645 done:
1646 new_st.op = EXEC_IF;
1647 new_st.expr = expr;
1648 return MATCH_YES;
1650 cleanup:
1651 gfc_free_expr (expr);
1652 return MATCH_ERROR;
1656 /* Free a gfc_iterator structure. */
1658 void
1659 gfc_free_iterator (gfc_iterator *iter, int flag)
1662 if (iter == NULL)
1663 return;
1665 gfc_free_expr (iter->var);
1666 gfc_free_expr (iter->start);
1667 gfc_free_expr (iter->end);
1668 gfc_free_expr (iter->step);
1670 if (flag)
1671 gfc_free (iter);
1675 /* Match a DO statement. */
1677 match
1678 gfc_match_do (void)
1680 gfc_iterator iter, *ip;
1681 locus old_loc;
1682 gfc_st_label *label;
1683 match m;
1685 old_loc = gfc_current_locus;
1687 label = NULL;
1688 iter.var = iter.start = iter.end = iter.step = NULL;
1690 m = gfc_match_label ();
1691 if (m == MATCH_ERROR)
1692 return m;
1694 if (gfc_match (" do") != MATCH_YES)
1695 return MATCH_NO;
1697 m = gfc_match_st_label (&label);
1698 if (m == MATCH_ERROR)
1699 goto cleanup;
1701 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
1703 if (gfc_match_eos () == MATCH_YES)
1705 iter.end = gfc_logical_expr (1, NULL);
1706 new_st.op = EXEC_DO_WHILE;
1707 goto done;
1710 /* Match an optional comma, if no comma is found, a space is obligatory. */
1711 if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1712 return MATCH_NO;
1714 /* See if we have a DO WHILE. */
1715 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1717 new_st.op = EXEC_DO_WHILE;
1718 goto done;
1721 /* The abortive DO WHILE may have done something to the symbol
1722 table, so we start over. */
1723 gfc_undo_symbols ();
1724 gfc_current_locus = old_loc;
1726 gfc_match_label (); /* This won't error. */
1727 gfc_match (" do "); /* This will work. */
1729 gfc_match_st_label (&label); /* Can't error out. */
1730 gfc_match_char (','); /* Optional comma. */
1732 m = gfc_match_iterator (&iter, 0);
1733 if (m == MATCH_NO)
1734 return MATCH_NO;
1735 if (m == MATCH_ERROR)
1736 goto cleanup;
1738 iter.var->symtree->n.sym->attr.implied_index = 0;
1739 gfc_check_do_variable (iter.var->symtree);
1741 if (gfc_match_eos () != MATCH_YES)
1743 gfc_syntax_error (ST_DO);
1744 goto cleanup;
1747 new_st.op = EXEC_DO;
1749 done:
1750 if (label != NULL
1751 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1752 goto cleanup;
1754 new_st.label = label;
1756 if (new_st.op == EXEC_DO_WHILE)
1757 new_st.expr = iter.end;
1758 else
1760 new_st.ext.iterator = ip = gfc_get_iterator ();
1761 *ip = iter;
1764 return MATCH_YES;
1766 cleanup:
1767 gfc_free_iterator (&iter, 0);
1769 return MATCH_ERROR;
1773 /* Match an EXIT or CYCLE statement. */
1775 static match
1776 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1778 gfc_state_data *p, *o;
1779 gfc_symbol *sym;
1780 match m;
1782 if (gfc_match_eos () == MATCH_YES)
1783 sym = NULL;
1784 else
1786 m = gfc_match ("% %s%t", &sym);
1787 if (m == MATCH_ERROR)
1788 return MATCH_ERROR;
1789 if (m == MATCH_NO)
1791 gfc_syntax_error (st);
1792 return MATCH_ERROR;
1795 if (sym->attr.flavor != FL_LABEL)
1797 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1798 sym->name, gfc_ascii_statement (st));
1799 return MATCH_ERROR;
1803 /* Find the loop mentioned specified by the label (or lack of a label). */
1804 for (o = NULL, p = gfc_state_stack; p; p = p->previous)
1805 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1806 break;
1807 else if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
1808 o = p;
1810 if (p == NULL)
1812 if (sym == NULL)
1813 gfc_error ("%s statement at %C is not within a loop",
1814 gfc_ascii_statement (st));
1815 else
1816 gfc_error ("%s statement at %C is not within loop '%s'",
1817 gfc_ascii_statement (st), sym->name);
1819 return MATCH_ERROR;
1822 if (o != NULL)
1824 gfc_error ("%s statement at %C leaving OpenMP structured block",
1825 gfc_ascii_statement (st));
1826 return MATCH_ERROR;
1828 else if (st == ST_EXIT
1829 && p->previous != NULL
1830 && p->previous->state == COMP_OMP_STRUCTURED_BLOCK
1831 && (p->previous->head->op == EXEC_OMP_DO
1832 || p->previous->head->op == EXEC_OMP_PARALLEL_DO))
1834 gcc_assert (p->previous->head->next != NULL);
1835 gcc_assert (p->previous->head->next->op == EXEC_DO
1836 || p->previous->head->next->op == EXEC_DO_WHILE);
1837 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
1838 return MATCH_ERROR;
1841 /* Save the first statement in the loop - needed by the backend. */
1842 new_st.ext.whichloop = p->head;
1844 new_st.op = op;
1846 return MATCH_YES;
1850 /* Match the EXIT statement. */
1852 match
1853 gfc_match_exit (void)
1855 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1859 /* Match the CYCLE statement. */
1861 match
1862 gfc_match_cycle (void)
1864 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1868 /* Match a number or character constant after a STOP or PAUSE statement. */
1870 static match
1871 gfc_match_stopcode (gfc_statement st)
1873 int stop_code;
1874 gfc_expr *e;
1875 match m;
1876 int cnt;
1878 stop_code = -1;
1879 e = NULL;
1881 if (gfc_match_eos () != MATCH_YES)
1883 m = gfc_match_small_literal_int (&stop_code, &cnt);
1884 if (m == MATCH_ERROR)
1885 goto cleanup;
1887 if (m == MATCH_YES && cnt > 5)
1889 gfc_error ("Too many digits in STOP code at %C");
1890 goto cleanup;
1893 if (m == MATCH_NO)
1895 /* Try a character constant. */
1896 m = gfc_match_expr (&e);
1897 if (m == MATCH_ERROR)
1898 goto cleanup;
1899 if (m == MATCH_NO)
1900 goto syntax;
1901 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1902 goto syntax;
1905 if (gfc_match_eos () != MATCH_YES)
1906 goto syntax;
1909 if (gfc_pure (NULL))
1911 gfc_error ("%s statement not allowed in PURE procedure at %C",
1912 gfc_ascii_statement (st));
1913 goto cleanup;
1916 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1917 new_st.expr = e;
1918 new_st.ext.stop_code = stop_code;
1920 return MATCH_YES;
1922 syntax:
1923 gfc_syntax_error (st);
1925 cleanup:
1927 gfc_free_expr (e);
1928 return MATCH_ERROR;
1932 /* Match the (deprecated) PAUSE statement. */
1934 match
1935 gfc_match_pause (void)
1937 match m;
1939 m = gfc_match_stopcode (ST_PAUSE);
1940 if (m == MATCH_YES)
1942 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
1943 " at %C")
1944 == FAILURE)
1945 m = MATCH_ERROR;
1947 return m;
1951 /* Match the STOP statement. */
1953 match
1954 gfc_match_stop (void)
1956 return gfc_match_stopcode (ST_STOP);
1960 /* Match a CONTINUE statement. */
1962 match
1963 gfc_match_continue (void)
1965 if (gfc_match_eos () != MATCH_YES)
1967 gfc_syntax_error (ST_CONTINUE);
1968 return MATCH_ERROR;
1971 new_st.op = EXEC_CONTINUE;
1972 return MATCH_YES;
1976 /* Match the (deprecated) ASSIGN statement. */
1978 match
1979 gfc_match_assign (void)
1981 gfc_expr *expr;
1982 gfc_st_label *label;
1984 if (gfc_match (" %l", &label) == MATCH_YES)
1986 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
1987 return MATCH_ERROR;
1988 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
1990 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
1991 "statement at %C")
1992 == FAILURE)
1993 return MATCH_ERROR;
1995 expr->symtree->n.sym->attr.assign = 1;
1997 new_st.op = EXEC_LABEL_ASSIGN;
1998 new_st.label = label;
1999 new_st.expr = expr;
2000 return MATCH_YES;
2003 return MATCH_NO;
2007 /* Match the GO TO statement. As a computed GOTO statement is
2008 matched, it is transformed into an equivalent SELECT block. No
2009 tree is necessary, and the resulting jumps-to-jumps are
2010 specifically optimized away by the back end. */
2012 match
2013 gfc_match_goto (void)
2015 gfc_code *head, *tail;
2016 gfc_expr *expr;
2017 gfc_case *cp;
2018 gfc_st_label *label;
2019 int i;
2020 match m;
2022 if (gfc_match (" %l%t", &label) == MATCH_YES)
2024 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2025 return MATCH_ERROR;
2027 new_st.op = EXEC_GOTO;
2028 new_st.label = label;
2029 return MATCH_YES;
2032 /* The assigned GO TO statement. */
2034 if (gfc_match_variable (&expr, 0) == MATCH_YES)
2036 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2037 "statement at %C")
2038 == FAILURE)
2039 return MATCH_ERROR;
2041 new_st.op = EXEC_GOTO;
2042 new_st.expr = expr;
2044 if (gfc_match_eos () == MATCH_YES)
2045 return MATCH_YES;
2047 /* Match label list. */
2048 gfc_match_char (',');
2049 if (gfc_match_char ('(') != MATCH_YES)
2051 gfc_syntax_error (ST_GOTO);
2052 return MATCH_ERROR;
2054 head = tail = NULL;
2058 m = gfc_match_st_label (&label);
2059 if (m != MATCH_YES)
2060 goto syntax;
2062 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2063 goto cleanup;
2065 if (head == NULL)
2066 head = tail = gfc_get_code ();
2067 else
2069 tail->block = gfc_get_code ();
2070 tail = tail->block;
2073 tail->label = label;
2074 tail->op = EXEC_GOTO;
2076 while (gfc_match_char (',') == MATCH_YES);
2078 if (gfc_match (")%t") != MATCH_YES)
2079 goto syntax;
2081 if (head == NULL)
2083 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2084 goto syntax;
2086 new_st.block = head;
2088 return MATCH_YES;
2091 /* Last chance is a computed GO TO statement. */
2092 if (gfc_match_char ('(') != MATCH_YES)
2094 gfc_syntax_error (ST_GOTO);
2095 return MATCH_ERROR;
2098 head = tail = NULL;
2099 i = 1;
2103 m = gfc_match_st_label (&label);
2104 if (m != MATCH_YES)
2105 goto syntax;
2107 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2108 goto cleanup;
2110 if (head == NULL)
2111 head = tail = gfc_get_code ();
2112 else
2114 tail->block = gfc_get_code ();
2115 tail = tail->block;
2118 cp = gfc_get_case ();
2119 cp->low = cp->high = gfc_int_expr (i++);
2121 tail->op = EXEC_SELECT;
2122 tail->ext.case_list = cp;
2124 tail->next = gfc_get_code ();
2125 tail->next->op = EXEC_GOTO;
2126 tail->next->label = label;
2128 while (gfc_match_char (',') == MATCH_YES);
2130 if (gfc_match_char (')') != MATCH_YES)
2131 goto syntax;
2133 if (head == NULL)
2135 gfc_error ("Statement label list in GOTO at %C cannot be empty");
2136 goto syntax;
2139 /* Get the rest of the statement. */
2140 gfc_match_char (',');
2142 if (gfc_match (" %e%t", &expr) != MATCH_YES)
2143 goto syntax;
2145 /* At this point, a computed GOTO has been fully matched and an
2146 equivalent SELECT statement constructed. */
2148 new_st.op = EXEC_SELECT;
2149 new_st.expr = NULL;
2151 /* Hack: For a "real" SELECT, the expression is in expr. We put
2152 it in expr2 so we can distinguish then and produce the correct
2153 diagnostics. */
2154 new_st.expr2 = expr;
2155 new_st.block = head;
2156 return MATCH_YES;
2158 syntax:
2159 gfc_syntax_error (ST_GOTO);
2160 cleanup:
2161 gfc_free_statements (head);
2162 return MATCH_ERROR;
2166 /* Frees a list of gfc_alloc structures. */
2168 void
2169 gfc_free_alloc_list (gfc_alloc *p)
2171 gfc_alloc *q;
2173 for (; p; p = q)
2175 q = p->next;
2176 gfc_free_expr (p->expr);
2177 gfc_free (p);
2182 /* Match an ALLOCATE statement. */
2184 match
2185 gfc_match_allocate (void)
2187 gfc_alloc *head, *tail;
2188 gfc_expr *stat;
2189 match m;
2191 head = tail = NULL;
2192 stat = NULL;
2194 if (gfc_match_char ('(') != MATCH_YES)
2195 goto syntax;
2197 for (;;)
2199 if (head == NULL)
2200 head = tail = gfc_get_alloc ();
2201 else
2203 tail->next = gfc_get_alloc ();
2204 tail = tail->next;
2207 m = gfc_match_variable (&tail->expr, 0);
2208 if (m == MATCH_NO)
2209 goto syntax;
2210 if (m == MATCH_ERROR)
2211 goto cleanup;
2213 if (gfc_check_do_variable (tail->expr->symtree))
2214 goto cleanup;
2216 if (gfc_pure (NULL)
2217 && gfc_impure_variable (tail->expr->symtree->n.sym))
2219 gfc_error ("Bad allocate-object in ALLOCATE statement at %C for a "
2220 "PURE procedure");
2221 goto cleanup;
2224 if (tail->expr->ts.type == BT_DERIVED)
2225 tail->expr->ts.derived = gfc_use_derived (tail->expr->ts.derived);
2227 if (gfc_match_char (',') != MATCH_YES)
2228 break;
2230 m = gfc_match (" stat = %v", &stat);
2231 if (m == MATCH_ERROR)
2232 goto cleanup;
2233 if (m == MATCH_YES)
2234 break;
2237 if (stat != NULL)
2238 gfc_check_do_variable(stat->symtree);
2240 if (gfc_match (" )%t") != MATCH_YES)
2241 goto syntax;
2243 new_st.op = EXEC_ALLOCATE;
2244 new_st.expr = stat;
2245 new_st.ext.alloc_list = head;
2247 return MATCH_YES;
2249 syntax:
2250 gfc_syntax_error (ST_ALLOCATE);
2252 cleanup:
2253 gfc_free_expr (stat);
2254 gfc_free_alloc_list (head);
2255 return MATCH_ERROR;
2259 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
2260 a set of pointer assignments to intrinsic NULL(). */
2262 match
2263 gfc_match_nullify (void)
2265 gfc_code *tail;
2266 gfc_expr *e, *p;
2267 match m;
2269 tail = NULL;
2271 if (gfc_match_char ('(') != MATCH_YES)
2272 goto syntax;
2274 for (;;)
2276 m = gfc_match_variable (&p, 0);
2277 if (m == MATCH_ERROR)
2278 goto cleanup;
2279 if (m == MATCH_NO)
2280 goto syntax;
2282 if (gfc_check_do_variable (p->symtree))
2283 goto cleanup;
2285 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2287 gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2288 goto cleanup;
2291 /* build ' => NULL() '. */
2292 e = gfc_get_expr ();
2293 e->where = gfc_current_locus;
2294 e->expr_type = EXPR_NULL;
2295 e->ts.type = BT_UNKNOWN;
2297 /* Chain to list. */
2298 if (tail == NULL)
2299 tail = &new_st;
2300 else
2302 tail->next = gfc_get_code ();
2303 tail = tail->next;
2306 tail->op = EXEC_POINTER_ASSIGN;
2307 tail->expr = p;
2308 tail->expr2 = e;
2310 if (gfc_match (" )%t") == MATCH_YES)
2311 break;
2312 if (gfc_match_char (',') != MATCH_YES)
2313 goto syntax;
2316 return MATCH_YES;
2318 syntax:
2319 gfc_syntax_error (ST_NULLIFY);
2321 cleanup:
2322 gfc_free_statements (new_st.next);
2323 return MATCH_ERROR;
2327 /* Match a DEALLOCATE statement. */
2329 match
2330 gfc_match_deallocate (void)
2332 gfc_alloc *head, *tail;
2333 gfc_expr *stat;
2334 match m;
2336 head = tail = NULL;
2337 stat = NULL;
2339 if (gfc_match_char ('(') != MATCH_YES)
2340 goto syntax;
2342 for (;;)
2344 if (head == NULL)
2345 head = tail = gfc_get_alloc ();
2346 else
2348 tail->next = gfc_get_alloc ();
2349 tail = tail->next;
2352 m = gfc_match_variable (&tail->expr, 0);
2353 if (m == MATCH_ERROR)
2354 goto cleanup;
2355 if (m == MATCH_NO)
2356 goto syntax;
2358 if (gfc_check_do_variable (tail->expr->symtree))
2359 goto cleanup;
2361 if (gfc_pure (NULL)
2362 && gfc_impure_variable (tail->expr->symtree->n.sym))
2364 gfc_error ("Illegal deallocate-expression in DEALLOCATE at %C "
2365 "for a PURE procedure");
2366 goto cleanup;
2369 if (gfc_match_char (',') != MATCH_YES)
2370 break;
2372 m = gfc_match (" stat = %v", &stat);
2373 if (m == MATCH_ERROR)
2374 goto cleanup;
2375 if (m == MATCH_YES)
2376 break;
2379 if (stat != NULL)
2380 gfc_check_do_variable(stat->symtree);
2382 if (gfc_match (" )%t") != MATCH_YES)
2383 goto syntax;
2385 new_st.op = EXEC_DEALLOCATE;
2386 new_st.expr = stat;
2387 new_st.ext.alloc_list = head;
2389 return MATCH_YES;
2391 syntax:
2392 gfc_syntax_error (ST_DEALLOCATE);
2394 cleanup:
2395 gfc_free_expr (stat);
2396 gfc_free_alloc_list (head);
2397 return MATCH_ERROR;
2401 /* Match a RETURN statement. */
2403 match
2404 gfc_match_return (void)
2406 gfc_expr *e;
2407 match m;
2408 gfc_compile_state s;
2409 int c;
2411 e = NULL;
2412 if (gfc_match_eos () == MATCH_YES)
2413 goto done;
2415 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2417 gfc_error ("Alternate RETURN statement at %C is only allowed within "
2418 "a SUBROUTINE");
2419 goto cleanup;
2422 if (gfc_current_form == FORM_FREE)
2424 /* The following are valid, so we can't require a blank after the
2425 RETURN keyword:
2426 return+1
2427 return(1) */
2428 c = gfc_peek_char ();
2429 if (ISALPHA (c) || ISDIGIT (c))
2430 return MATCH_NO;
2433 m = gfc_match (" %e%t", &e);
2434 if (m == MATCH_YES)
2435 goto done;
2436 if (m == MATCH_ERROR)
2437 goto cleanup;
2439 gfc_syntax_error (ST_RETURN);
2441 cleanup:
2442 gfc_free_expr (e);
2443 return MATCH_ERROR;
2445 done:
2446 gfc_enclosing_unit (&s);
2447 if (s == COMP_PROGRAM
2448 && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2449 "main program at %C") == FAILURE)
2450 return MATCH_ERROR;
2452 new_st.op = EXEC_RETURN;
2453 new_st.expr = e;
2455 return MATCH_YES;
2459 /* Match a CALL statement. The tricky part here are possible
2460 alternate return specifiers. We handle these by having all
2461 "subroutines" actually return an integer via a register that gives
2462 the return number. If the call specifies alternate returns, we
2463 generate code for a SELECT statement whose case clauses contain
2464 GOTOs to the various labels. */
2466 match
2467 gfc_match_call (void)
2469 char name[GFC_MAX_SYMBOL_LEN + 1];
2470 gfc_actual_arglist *a, *arglist;
2471 gfc_case *new_case;
2472 gfc_symbol *sym;
2473 gfc_symtree *st;
2474 gfc_code *c;
2475 match m;
2476 int i;
2478 arglist = NULL;
2480 m = gfc_match ("% %n", name);
2481 if (m == MATCH_NO)
2482 goto syntax;
2483 if (m != MATCH_YES)
2484 return m;
2486 if (gfc_get_ha_sym_tree (name, &st))
2487 return MATCH_ERROR;
2489 sym = st->n.sym;
2491 /* If it does not seem to be callable... */
2492 if (!sym->attr.generic
2493 && !sym->attr.subroutine)
2495 if (!(sym->attr.external && !sym->attr.referenced))
2497 /* ...create a symbol in this scope... */
2498 if (sym->ns != gfc_current_ns
2499 && gfc_get_sym_tree (name, NULL, &st) == 1)
2500 return MATCH_ERROR;
2502 if (sym != st->n.sym)
2503 sym = st->n.sym;
2506 /* ...and then to try to make the symbol into a subroutine. */
2507 if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2508 return MATCH_ERROR;
2511 gfc_set_sym_referenced (sym);
2513 if (gfc_match_eos () != MATCH_YES)
2515 m = gfc_match_actual_arglist (1, &arglist);
2516 if (m == MATCH_NO)
2517 goto syntax;
2518 if (m == MATCH_ERROR)
2519 goto cleanup;
2521 if (gfc_match_eos () != MATCH_YES)
2522 goto syntax;
2525 /* If any alternate return labels were found, construct a SELECT
2526 statement that will jump to the right place. */
2528 i = 0;
2529 for (a = arglist; a; a = a->next)
2530 if (a->expr == NULL)
2531 i = 1;
2533 if (i)
2535 gfc_symtree *select_st;
2536 gfc_symbol *select_sym;
2537 char name[GFC_MAX_SYMBOL_LEN + 1];
2539 new_st.next = c = gfc_get_code ();
2540 c->op = EXEC_SELECT;
2541 sprintf (name, "_result_%s", sym->name);
2542 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail. */
2544 select_sym = select_st->n.sym;
2545 select_sym->ts.type = BT_INTEGER;
2546 select_sym->ts.kind = gfc_default_integer_kind;
2547 gfc_set_sym_referenced (select_sym);
2548 c->expr = gfc_get_expr ();
2549 c->expr->expr_type = EXPR_VARIABLE;
2550 c->expr->symtree = select_st;
2551 c->expr->ts = select_sym->ts;
2552 c->expr->where = gfc_current_locus;
2554 i = 0;
2555 for (a = arglist; a; a = a->next)
2557 if (a->expr != NULL)
2558 continue;
2560 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2561 continue;
2563 i++;
2565 c->block = gfc_get_code ();
2566 c = c->block;
2567 c->op = EXEC_SELECT;
2569 new_case = gfc_get_case ();
2570 new_case->high = new_case->low = gfc_int_expr (i);
2571 c->ext.case_list = new_case;
2573 c->next = gfc_get_code ();
2574 c->next->op = EXEC_GOTO;
2575 c->next->label = a->label;
2579 new_st.op = EXEC_CALL;
2580 new_st.symtree = st;
2581 new_st.ext.actual = arglist;
2583 return MATCH_YES;
2585 syntax:
2586 gfc_syntax_error (ST_CALL);
2588 cleanup:
2589 gfc_free_actual_arglist (arglist);
2590 return MATCH_ERROR;
2594 /* Given a name, return a pointer to the common head structure,
2595 creating it if it does not exist. If FROM_MODULE is nonzero, we
2596 mangle the name so that it doesn't interfere with commons defined
2597 in the using namespace.
2598 TODO: Add to global symbol tree. */
2600 gfc_common_head *
2601 gfc_get_common (const char *name, int from_module)
2603 gfc_symtree *st;
2604 static int serial = 0;
2605 char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
2607 if (from_module)
2609 /* A use associated common block is only needed to correctly layout
2610 the variables it contains. */
2611 snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
2612 st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
2614 else
2616 st = gfc_find_symtree (gfc_current_ns->common_root, name);
2618 if (st == NULL)
2619 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2622 if (st->n.common == NULL)
2624 st->n.common = gfc_get_common_head ();
2625 st->n.common->where = gfc_current_locus;
2626 strcpy (st->n.common->name, name);
2629 return st->n.common;
2633 /* Match a common block name. */
2635 match match_common_name (char *name)
2637 match m;
2639 if (gfc_match_char ('/') == MATCH_NO)
2641 name[0] = '\0';
2642 return MATCH_YES;
2645 if (gfc_match_char ('/') == MATCH_YES)
2647 name[0] = '\0';
2648 return MATCH_YES;
2651 m = gfc_match_name (name);
2653 if (m == MATCH_ERROR)
2654 return MATCH_ERROR;
2655 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2656 return MATCH_YES;
2658 gfc_error ("Syntax error in common block name at %C");
2659 return MATCH_ERROR;
2663 /* Match a COMMON statement. */
2665 match
2666 gfc_match_common (void)
2668 gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
2669 char name[GFC_MAX_SYMBOL_LEN + 1];
2670 gfc_common_head *t;
2671 gfc_array_spec *as;
2672 gfc_equiv *e1, *e2;
2673 match m;
2674 gfc_gsymbol *gsym;
2676 old_blank_common = gfc_current_ns->blank_common.head;
2677 if (old_blank_common)
2679 while (old_blank_common->common_next)
2680 old_blank_common = old_blank_common->common_next;
2683 as = NULL;
2685 for (;;)
2687 m = match_common_name (name);
2688 if (m == MATCH_ERROR)
2689 goto cleanup;
2691 gsym = gfc_get_gsymbol (name);
2692 if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
2694 gfc_error ("Symbol '%s' at %C is already an external symbol that "
2695 "is not COMMON", name);
2696 goto cleanup;
2699 if (gsym->type == GSYM_UNKNOWN)
2701 gsym->type = GSYM_COMMON;
2702 gsym->where = gfc_current_locus;
2703 gsym->defined = 1;
2706 gsym->used = 1;
2708 if (name[0] == '\0')
2710 t = &gfc_current_ns->blank_common;
2711 if (t->head == NULL)
2712 t->where = gfc_current_locus;
2714 else
2716 t = gfc_get_common (name, 0);
2718 head = &t->head;
2720 if (*head == NULL)
2721 tail = NULL;
2722 else
2724 tail = *head;
2725 while (tail->common_next)
2726 tail = tail->common_next;
2729 /* Grab the list of symbols. */
2730 for (;;)
2732 m = gfc_match_symbol (&sym, 0);
2733 if (m == MATCH_ERROR)
2734 goto cleanup;
2735 if (m == MATCH_NO)
2736 goto syntax;
2738 /* Store a ref to the common block for error checking. */
2739 sym->common_block = t;
2741 /* See if we know the current common block is bind(c), and if
2742 so, then see if we can check if the symbol is (which it'll
2743 need to be). This can happen if the bind(c) attr stmt was
2744 applied to the common block, and the variable(s) already
2745 defined, before declaring the common block. */
2746 if (t->is_bind_c == 1)
2748 if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
2750 /* If we find an error, just print it and continue,
2751 cause it's just semantic, and we can see if there
2752 are more errors. */
2753 gfc_error_now ("Variable '%s' at %L in common block '%s' "
2754 "at %C must be declared with a C "
2755 "interoperable kind since common block "
2756 "'%s' is bind(c)",
2757 sym->name, &(sym->declared_at), t->name,
2758 t->name);
2761 if (sym->attr.is_bind_c == 1)
2762 gfc_error_now ("Variable '%s' in common block "
2763 "'%s' at %C can not be bind(c) since "
2764 "it is not global", sym->name, t->name);
2767 if (sym->attr.in_common)
2769 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2770 sym->name);
2771 goto cleanup;
2774 if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
2775 || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
2777 if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
2778 "can only be COMMON in "
2779 "BLOCK DATA", sym->name)
2780 == FAILURE)
2781 goto cleanup;
2784 if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
2785 goto cleanup;
2787 if (tail != NULL)
2788 tail->common_next = sym;
2789 else
2790 *head = sym;
2792 tail = sym;
2794 /* Deal with an optional array specification after the
2795 symbol name. */
2796 m = gfc_match_array_spec (&as);
2797 if (m == MATCH_ERROR)
2798 goto cleanup;
2800 if (m == MATCH_YES)
2802 if (as->type != AS_EXPLICIT)
2804 gfc_error ("Array specification for symbol '%s' in COMMON "
2805 "at %C must be explicit", sym->name);
2806 goto cleanup;
2809 if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
2810 goto cleanup;
2812 if (sym->attr.pointer)
2814 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
2815 "POINTER array", sym->name);
2816 goto cleanup;
2819 sym->as = as;
2820 as = NULL;
2824 sym->common_head = t;
2826 /* Check to see if the symbol is already in an equivalence group.
2827 If it is, set the other members as being in common. */
2828 if (sym->attr.in_equivalence)
2830 for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
2832 for (e2 = e1; e2; e2 = e2->eq)
2833 if (e2->expr->symtree->n.sym == sym)
2834 goto equiv_found;
2836 continue;
2838 equiv_found:
2840 for (e2 = e1; e2; e2 = e2->eq)
2842 other = e2->expr->symtree->n.sym;
2843 if (other->common_head
2844 && other->common_head != sym->common_head)
2846 gfc_error ("Symbol '%s', in COMMON block '%s' at "
2847 "%C is being indirectly equivalenced to "
2848 "another COMMON block '%s'",
2849 sym->name, sym->common_head->name,
2850 other->common_head->name);
2851 goto cleanup;
2853 other->attr.in_common = 1;
2854 other->common_head = t;
2860 gfc_gobble_whitespace ();
2861 if (gfc_match_eos () == MATCH_YES)
2862 goto done;
2863 if (gfc_peek_char () == '/')
2864 break;
2865 if (gfc_match_char (',') != MATCH_YES)
2866 goto syntax;
2867 gfc_gobble_whitespace ();
2868 if (gfc_peek_char () == '/')
2869 break;
2873 done:
2874 return MATCH_YES;
2876 syntax:
2877 gfc_syntax_error (ST_COMMON);
2879 cleanup:
2880 if (old_blank_common)
2881 old_blank_common->common_next = NULL;
2882 else
2883 gfc_current_ns->blank_common.head = NULL;
2884 gfc_free_array_spec (as);
2885 return MATCH_ERROR;
2889 /* Match a BLOCK DATA program unit. */
2891 match
2892 gfc_match_block_data (void)
2894 char name[GFC_MAX_SYMBOL_LEN + 1];
2895 gfc_symbol *sym;
2896 match m;
2898 if (gfc_match_eos () == MATCH_YES)
2900 gfc_new_block = NULL;
2901 return MATCH_YES;
2904 m = gfc_match ("% %n%t", name);
2905 if (m != MATCH_YES)
2906 return MATCH_ERROR;
2908 if (gfc_get_symbol (name, NULL, &sym))
2909 return MATCH_ERROR;
2911 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
2912 return MATCH_ERROR;
2914 gfc_new_block = sym;
2916 return MATCH_YES;
2920 /* Free a namelist structure. */
2922 void
2923 gfc_free_namelist (gfc_namelist *name)
2925 gfc_namelist *n;
2927 for (; name; name = n)
2929 n = name->next;
2930 gfc_free (name);
2935 /* Match a NAMELIST statement. */
2937 match
2938 gfc_match_namelist (void)
2940 gfc_symbol *group_name, *sym;
2941 gfc_namelist *nl;
2942 match m, m2;
2944 m = gfc_match (" / %s /", &group_name);
2945 if (m == MATCH_NO)
2946 goto syntax;
2947 if (m == MATCH_ERROR)
2948 goto error;
2950 for (;;)
2952 if (group_name->ts.type != BT_UNKNOWN)
2954 gfc_error ("Namelist group name '%s' at %C already has a basic "
2955 "type of %s", group_name->name,
2956 gfc_typename (&group_name->ts));
2957 return MATCH_ERROR;
2960 if (group_name->attr.flavor == FL_NAMELIST
2961 && group_name->attr.use_assoc
2962 && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
2963 "at %C already is USE associated and can"
2964 "not be respecified.", group_name->name)
2965 == FAILURE)
2966 return MATCH_ERROR;
2968 if (group_name->attr.flavor != FL_NAMELIST
2969 && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
2970 group_name->name, NULL) == FAILURE)
2971 return MATCH_ERROR;
2973 for (;;)
2975 m = gfc_match_symbol (&sym, 1);
2976 if (m == MATCH_NO)
2977 goto syntax;
2978 if (m == MATCH_ERROR)
2979 goto error;
2981 if (sym->attr.in_namelist == 0
2982 && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
2983 goto error;
2985 /* Use gfc_error_check here, rather than goto error, so that
2986 these are the only errors for the next two lines. */
2987 if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
2989 gfc_error ("Assumed size array '%s' in namelist '%s' at "
2990 "%C is not allowed", sym->name, group_name->name);
2991 gfc_error_check ();
2994 if (sym->ts.type == BT_CHARACTER && sym->ts.cl->length == NULL)
2996 gfc_error ("Assumed character length '%s' in namelist '%s' at "
2997 "%C is not allowed", sym->name, group_name->name);
2998 gfc_error_check ();
3001 nl = gfc_get_namelist ();
3002 nl->sym = sym;
3003 sym->refs++;
3005 if (group_name->namelist == NULL)
3006 group_name->namelist = group_name->namelist_tail = nl;
3007 else
3009 group_name->namelist_tail->next = nl;
3010 group_name->namelist_tail = nl;
3013 if (gfc_match_eos () == MATCH_YES)
3014 goto done;
3016 m = gfc_match_char (',');
3018 if (gfc_match_char ('/') == MATCH_YES)
3020 m2 = gfc_match (" %s /", &group_name);
3021 if (m2 == MATCH_YES)
3022 break;
3023 if (m2 == MATCH_ERROR)
3024 goto error;
3025 goto syntax;
3028 if (m != MATCH_YES)
3029 goto syntax;
3033 done:
3034 return MATCH_YES;
3036 syntax:
3037 gfc_syntax_error (ST_NAMELIST);
3039 error:
3040 return MATCH_ERROR;
3044 /* Match a MODULE statement. */
3046 match
3047 gfc_match_module (void)
3049 match m;
3051 m = gfc_match (" %s%t", &gfc_new_block);
3052 if (m != MATCH_YES)
3053 return m;
3055 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3056 gfc_new_block->name, NULL) == FAILURE)
3057 return MATCH_ERROR;
3059 return MATCH_YES;
3063 /* Free equivalence sets and lists. Recursively is the easiest way to
3064 do this. */
3066 void
3067 gfc_free_equiv (gfc_equiv *eq)
3069 if (eq == NULL)
3070 return;
3072 gfc_free_equiv (eq->eq);
3073 gfc_free_equiv (eq->next);
3074 gfc_free_expr (eq->expr);
3075 gfc_free (eq);
3079 /* Match an EQUIVALENCE statement. */
3081 match
3082 gfc_match_equivalence (void)
3084 gfc_equiv *eq, *set, *tail;
3085 gfc_ref *ref;
3086 gfc_symbol *sym;
3087 match m;
3088 gfc_common_head *common_head = NULL;
3089 bool common_flag;
3090 int cnt;
3092 tail = NULL;
3094 for (;;)
3096 eq = gfc_get_equiv ();
3097 if (tail == NULL)
3098 tail = eq;
3100 eq->next = gfc_current_ns->equiv;
3101 gfc_current_ns->equiv = eq;
3103 if (gfc_match_char ('(') != MATCH_YES)
3104 goto syntax;
3106 set = eq;
3107 common_flag = FALSE;
3108 cnt = 0;
3110 for (;;)
3112 m = gfc_match_equiv_variable (&set->expr);
3113 if (m == MATCH_ERROR)
3114 goto cleanup;
3115 if (m == MATCH_NO)
3116 goto syntax;
3118 /* count the number of objects. */
3119 cnt++;
3121 if (gfc_match_char ('%') == MATCH_YES)
3123 gfc_error ("Derived type component %C is not a "
3124 "permitted EQUIVALENCE member");
3125 goto cleanup;
3128 for (ref = set->expr->ref; ref; ref = ref->next)
3129 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3131 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3132 "be an array section");
3133 goto cleanup;
3136 sym = set->expr->symtree->n.sym;
3138 if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3139 goto cleanup;
3141 if (sym->attr.in_common)
3143 common_flag = TRUE;
3144 common_head = sym->common_head;
3147 if (gfc_match_char (')') == MATCH_YES)
3148 break;
3150 if (gfc_match_char (',') != MATCH_YES)
3151 goto syntax;
3153 set->eq = gfc_get_equiv ();
3154 set = set->eq;
3157 if (cnt < 2)
3159 gfc_error ("EQUIVALENCE at %C requires two or more objects");
3160 goto cleanup;
3163 /* If one of the members of an equivalence is in common, then
3164 mark them all as being in common. Before doing this, check
3165 that members of the equivalence group are not in different
3166 common blocks. */
3167 if (common_flag)
3168 for (set = eq; set; set = set->eq)
3170 sym = set->expr->symtree->n.sym;
3171 if (sym->common_head && sym->common_head != common_head)
3173 gfc_error ("Attempt to indirectly overlap COMMON "
3174 "blocks %s and %s by EQUIVALENCE at %C",
3175 sym->common_head->name, common_head->name);
3176 goto cleanup;
3178 sym->attr.in_common = 1;
3179 sym->common_head = common_head;
3182 if (gfc_match_eos () == MATCH_YES)
3183 break;
3184 if (gfc_match_char (',') != MATCH_YES)
3185 goto syntax;
3188 return MATCH_YES;
3190 syntax:
3191 gfc_syntax_error (ST_EQUIVALENCE);
3193 cleanup:
3194 eq = tail->next;
3195 tail->next = NULL;
3197 gfc_free_equiv (gfc_current_ns->equiv);
3198 gfc_current_ns->equiv = eq;
3200 return MATCH_ERROR;
3204 /* Check that a statement function is not recursive. This is done by looking
3205 for the statement function symbol(sym) by looking recursively through its
3206 expression(e). If a reference to sym is found, true is returned.
3207 12.5.4 requires that any variable of function that is implicitly typed
3208 shall have that type confirmed by any subsequent type declaration. The
3209 implicit typing is conveniently done here. */
3210 static bool
3211 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3213 static bool
3214 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3217 if (e == NULL)
3218 return false;
3220 switch (e->expr_type)
3222 case EXPR_FUNCTION:
3223 if (e->symtree == NULL)
3224 return false;
3226 /* Check the name before testing for nested recursion! */
3227 if (sym->name == e->symtree->n.sym->name)
3228 return true;
3230 /* Catch recursion via other statement functions. */
3231 if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3232 && e->symtree->n.sym->value
3233 && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3234 return true;
3236 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3237 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3239 break;
3241 case EXPR_VARIABLE:
3242 if (e->symtree && sym->name == e->symtree->n.sym->name)
3243 return true;
3245 if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3246 gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3247 break;
3249 default:
3250 break;
3253 return false;
3257 static bool
3258 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3260 return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3264 /* Match a statement function declaration. It is so easy to match
3265 non-statement function statements with a MATCH_ERROR as opposed to
3266 MATCH_NO that we suppress error message in most cases. */
3268 match
3269 gfc_match_st_function (void)
3271 gfc_error_buf old_error;
3272 gfc_symbol *sym;
3273 gfc_expr *expr;
3274 match m;
3276 m = gfc_match_symbol (&sym, 0);
3277 if (m != MATCH_YES)
3278 return m;
3280 gfc_push_error (&old_error);
3282 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3283 sym->name, NULL) == FAILURE)
3284 goto undo_error;
3286 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3287 goto undo_error;
3289 m = gfc_match (" = %e%t", &expr);
3290 if (m == MATCH_NO)
3291 goto undo_error;
3293 gfc_free_error (&old_error);
3294 if (m == MATCH_ERROR)
3295 return m;
3297 if (recursive_stmt_fcn (expr, sym))
3299 gfc_error ("Statement function at %L is recursive", &expr->where);
3300 return MATCH_ERROR;
3303 sym->value = expr;
3305 return MATCH_YES;
3307 undo_error:
3308 gfc_pop_error (&old_error);
3309 return MATCH_NO;
3313 /***************** SELECT CASE subroutines ******************/
3315 /* Free a single case structure. */
3317 static void
3318 free_case (gfc_case *p)
3320 if (p->low == p->high)
3321 p->high = NULL;
3322 gfc_free_expr (p->low);
3323 gfc_free_expr (p->high);
3324 gfc_free (p);
3328 /* Free a list of case structures. */
3330 void
3331 gfc_free_case_list (gfc_case *p)
3333 gfc_case *q;
3335 for (; p; p = q)
3337 q = p->next;
3338 free_case (p);
3343 /* Match a single case selector. */
3345 static match
3346 match_case_selector (gfc_case **cp)
3348 gfc_case *c;
3349 match m;
3351 c = gfc_get_case ();
3352 c->where = gfc_current_locus;
3354 if (gfc_match_char (':') == MATCH_YES)
3356 m = gfc_match_init_expr (&c->high);
3357 if (m == MATCH_NO)
3358 goto need_expr;
3359 if (m == MATCH_ERROR)
3360 goto cleanup;
3362 else
3364 m = gfc_match_init_expr (&c->low);
3365 if (m == MATCH_ERROR)
3366 goto cleanup;
3367 if (m == MATCH_NO)
3368 goto need_expr;
3370 /* If we're not looking at a ':' now, make a range out of a single
3371 target. Else get the upper bound for the case range. */
3372 if (gfc_match_char (':') != MATCH_YES)
3373 c->high = c->low;
3374 else
3376 m = gfc_match_init_expr (&c->high);
3377 if (m == MATCH_ERROR)
3378 goto cleanup;
3379 /* MATCH_NO is fine. It's OK if nothing is there! */
3383 *cp = c;
3384 return MATCH_YES;
3386 need_expr:
3387 gfc_error ("Expected initialization expression in CASE at %C");
3389 cleanup:
3390 free_case (c);
3391 return MATCH_ERROR;
3395 /* Match the end of a case statement. */
3397 static match
3398 match_case_eos (void)
3400 char name[GFC_MAX_SYMBOL_LEN + 1];
3401 match m;
3403 if (gfc_match_eos () == MATCH_YES)
3404 return MATCH_YES;
3406 /* If the case construct doesn't have a case-construct-name, we
3407 should have matched the EOS. */
3408 if (!gfc_current_block ())
3410 gfc_error ("Expected the name of the SELECT CASE construct at %C");
3411 return MATCH_ERROR;
3414 gfc_gobble_whitespace ();
3416 m = gfc_match_name (name);
3417 if (m != MATCH_YES)
3418 return m;
3420 if (strcmp (name, gfc_current_block ()->name) != 0)
3422 gfc_error ("Expected case name of '%s' at %C",
3423 gfc_current_block ()->name);
3424 return MATCH_ERROR;
3427 return gfc_match_eos ();
3431 /* Match a SELECT statement. */
3433 match
3434 gfc_match_select (void)
3436 gfc_expr *expr;
3437 match m;
3439 m = gfc_match_label ();
3440 if (m == MATCH_ERROR)
3441 return m;
3443 m = gfc_match (" select case ( %e )%t", &expr);
3444 if (m != MATCH_YES)
3445 return m;
3447 new_st.op = EXEC_SELECT;
3448 new_st.expr = expr;
3450 return MATCH_YES;
3454 /* Match a CASE statement. */
3456 match
3457 gfc_match_case (void)
3459 gfc_case *c, *head, *tail;
3460 match m;
3462 head = tail = NULL;
3464 if (gfc_current_state () != COMP_SELECT)
3466 gfc_error ("Unexpected CASE statement at %C");
3467 return MATCH_ERROR;
3470 if (gfc_match ("% default") == MATCH_YES)
3472 m = match_case_eos ();
3473 if (m == MATCH_NO)
3474 goto syntax;
3475 if (m == MATCH_ERROR)
3476 goto cleanup;
3478 new_st.op = EXEC_SELECT;
3479 c = gfc_get_case ();
3480 c->where = gfc_current_locus;
3481 new_st.ext.case_list = c;
3482 return MATCH_YES;
3485 if (gfc_match_char ('(') != MATCH_YES)
3486 goto syntax;
3488 for (;;)
3490 if (match_case_selector (&c) == MATCH_ERROR)
3491 goto cleanup;
3493 if (head == NULL)
3494 head = c;
3495 else
3496 tail->next = c;
3498 tail = c;
3500 if (gfc_match_char (')') == MATCH_YES)
3501 break;
3502 if (gfc_match_char (',') != MATCH_YES)
3503 goto syntax;
3506 m = match_case_eos ();
3507 if (m == MATCH_NO)
3508 goto syntax;
3509 if (m == MATCH_ERROR)
3510 goto cleanup;
3512 new_st.op = EXEC_SELECT;
3513 new_st.ext.case_list = head;
3515 return MATCH_YES;
3517 syntax:
3518 gfc_error ("Syntax error in CASE-specification at %C");
3520 cleanup:
3521 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
3522 return MATCH_ERROR;
3525 /********************* WHERE subroutines ********************/
3527 /* Match the rest of a simple WHERE statement that follows an IF statement.
3530 static match
3531 match_simple_where (void)
3533 gfc_expr *expr;
3534 gfc_code *c;
3535 match m;
3537 m = gfc_match (" ( %e )", &expr);
3538 if (m != MATCH_YES)
3539 return m;
3541 m = gfc_match_assignment ();
3542 if (m == MATCH_NO)
3543 goto syntax;
3544 if (m == MATCH_ERROR)
3545 goto cleanup;
3547 if (gfc_match_eos () != MATCH_YES)
3548 goto syntax;
3550 c = gfc_get_code ();
3552 c->op = EXEC_WHERE;
3553 c->expr = expr;
3554 c->next = gfc_get_code ();
3556 *c->next = new_st;
3557 gfc_clear_new_st ();
3559 new_st.op = EXEC_WHERE;
3560 new_st.block = c;
3562 return MATCH_YES;
3564 syntax:
3565 gfc_syntax_error (ST_WHERE);
3567 cleanup:
3568 gfc_free_expr (expr);
3569 return MATCH_ERROR;
3573 /* Match a WHERE statement. */
3575 match
3576 gfc_match_where (gfc_statement *st)
3578 gfc_expr *expr;
3579 match m0, m;
3580 gfc_code *c;
3582 m0 = gfc_match_label ();
3583 if (m0 == MATCH_ERROR)
3584 return m0;
3586 m = gfc_match (" where ( %e )", &expr);
3587 if (m != MATCH_YES)
3588 return m;
3590 if (gfc_match_eos () == MATCH_YES)
3592 *st = ST_WHERE_BLOCK;
3593 new_st.op = EXEC_WHERE;
3594 new_st.expr = expr;
3595 return MATCH_YES;
3598 m = gfc_match_assignment ();
3599 if (m == MATCH_NO)
3600 gfc_syntax_error (ST_WHERE);
3602 if (m != MATCH_YES)
3604 gfc_free_expr (expr);
3605 return MATCH_ERROR;
3608 /* We've got a simple WHERE statement. */
3609 *st = ST_WHERE;
3610 c = gfc_get_code ();
3612 c->op = EXEC_WHERE;
3613 c->expr = expr;
3614 c->next = gfc_get_code ();
3616 *c->next = new_st;
3617 gfc_clear_new_st ();
3619 new_st.op = EXEC_WHERE;
3620 new_st.block = c;
3622 return MATCH_YES;
3626 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
3627 new_st if successful. */
3629 match
3630 gfc_match_elsewhere (void)
3632 char name[GFC_MAX_SYMBOL_LEN + 1];
3633 gfc_expr *expr;
3634 match m;
3636 if (gfc_current_state () != COMP_WHERE)
3638 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3639 return MATCH_ERROR;
3642 expr = NULL;
3644 if (gfc_match_char ('(') == MATCH_YES)
3646 m = gfc_match_expr (&expr);
3647 if (m == MATCH_NO)
3648 goto syntax;
3649 if (m == MATCH_ERROR)
3650 return MATCH_ERROR;
3652 if (gfc_match_char (')') != MATCH_YES)
3653 goto syntax;
3656 if (gfc_match_eos () != MATCH_YES)
3658 /* Only makes sense if we have a where-construct-name. */
3659 if (!gfc_current_block ())
3661 m = MATCH_ERROR;
3662 goto cleanup;
3664 /* Better be a name at this point. */
3665 m = gfc_match_name (name);
3666 if (m == MATCH_NO)
3667 goto syntax;
3668 if (m == MATCH_ERROR)
3669 goto cleanup;
3671 if (gfc_match_eos () != MATCH_YES)
3672 goto syntax;
3674 if (strcmp (name, gfc_current_block ()->name) != 0)
3676 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3677 name, gfc_current_block ()->name);
3678 goto cleanup;
3682 new_st.op = EXEC_WHERE;
3683 new_st.expr = expr;
3684 return MATCH_YES;
3686 syntax:
3687 gfc_syntax_error (ST_ELSEWHERE);
3689 cleanup:
3690 gfc_free_expr (expr);
3691 return MATCH_ERROR;
3695 /******************** FORALL subroutines ********************/
3697 /* Free a list of FORALL iterators. */
3699 void
3700 gfc_free_forall_iterator (gfc_forall_iterator *iter)
3702 gfc_forall_iterator *next;
3704 while (iter)
3706 next = iter->next;
3707 gfc_free_expr (iter->var);
3708 gfc_free_expr (iter->start);
3709 gfc_free_expr (iter->end);
3710 gfc_free_expr (iter->stride);
3711 gfc_free (iter);
3712 iter = next;
3717 /* Match an iterator as part of a FORALL statement. The format is:
3719 <var> = <start>:<end>[:<stride>]
3721 On MATCH_NO, the caller tests for the possibility that there is a
3722 scalar mask expression. */
3724 static match
3725 match_forall_iterator (gfc_forall_iterator **result)
3727 gfc_forall_iterator *iter;
3728 locus where;
3729 match m;
3731 where = gfc_current_locus;
3732 iter = gfc_getmem (sizeof (gfc_forall_iterator));
3734 m = gfc_match_expr (&iter->var);
3735 if (m != MATCH_YES)
3736 goto cleanup;
3738 if (gfc_match_char ('=') != MATCH_YES
3739 || iter->var->expr_type != EXPR_VARIABLE)
3741 m = MATCH_NO;
3742 goto cleanup;
3745 m = gfc_match_expr (&iter->start);
3746 if (m != MATCH_YES)
3747 goto cleanup;
3749 if (gfc_match_char (':') != MATCH_YES)
3750 goto syntax;
3752 m = gfc_match_expr (&iter->end);
3753 if (m == MATCH_NO)
3754 goto syntax;
3755 if (m == MATCH_ERROR)
3756 goto cleanup;
3758 if (gfc_match_char (':') == MATCH_NO)
3759 iter->stride = gfc_int_expr (1);
3760 else
3762 m = gfc_match_expr (&iter->stride);
3763 if (m == MATCH_NO)
3764 goto syntax;
3765 if (m == MATCH_ERROR)
3766 goto cleanup;
3769 /* Mark the iteration variable's symbol as used as a FORALL index. */
3770 iter->var->symtree->n.sym->forall_index = true;
3772 *result = iter;
3773 return MATCH_YES;
3775 syntax:
3776 gfc_error ("Syntax error in FORALL iterator at %C");
3777 m = MATCH_ERROR;
3779 cleanup:
3781 gfc_current_locus = where;
3782 gfc_free_forall_iterator (iter);
3783 return m;
3787 /* Match the header of a FORALL statement. */
3789 static match
3790 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
3792 gfc_forall_iterator *head, *tail, *new;
3793 gfc_expr *msk;
3794 match m;
3796 gfc_gobble_whitespace ();
3798 head = tail = NULL;
3799 msk = NULL;
3801 if (gfc_match_char ('(') != MATCH_YES)
3802 return MATCH_NO;
3804 m = match_forall_iterator (&new);
3805 if (m == MATCH_ERROR)
3806 goto cleanup;
3807 if (m == MATCH_NO)
3808 goto syntax;
3810 head = tail = new;
3812 for (;;)
3814 if (gfc_match_char (',') != MATCH_YES)
3815 break;
3817 m = match_forall_iterator (&new);
3818 if (m == MATCH_ERROR)
3819 goto cleanup;
3821 if (m == MATCH_YES)
3823 tail->next = new;
3824 tail = new;
3825 continue;
3828 /* Have to have a mask expression. */
3830 m = gfc_match_expr (&msk);
3831 if (m == MATCH_NO)
3832 goto syntax;
3833 if (m == MATCH_ERROR)
3834 goto cleanup;
3836 break;
3839 if (gfc_match_char (')') == MATCH_NO)
3840 goto syntax;
3842 *phead = head;
3843 *mask = msk;
3844 return MATCH_YES;
3846 syntax:
3847 gfc_syntax_error (ST_FORALL);
3849 cleanup:
3850 gfc_free_expr (msk);
3851 gfc_free_forall_iterator (head);
3853 return MATCH_ERROR;
3856 /* Match the rest of a simple FORALL statement that follows an
3857 IF statement. */
3859 static match
3860 match_simple_forall (void)
3862 gfc_forall_iterator *head;
3863 gfc_expr *mask;
3864 gfc_code *c;
3865 match m;
3867 mask = NULL;
3868 head = NULL;
3869 c = NULL;
3871 m = match_forall_header (&head, &mask);
3873 if (m == MATCH_NO)
3874 goto syntax;
3875 if (m != MATCH_YES)
3876 goto cleanup;
3878 m = gfc_match_assignment ();
3880 if (m == MATCH_ERROR)
3881 goto cleanup;
3882 if (m == MATCH_NO)
3884 m = gfc_match_pointer_assignment ();
3885 if (m == MATCH_ERROR)
3886 goto cleanup;
3887 if (m == MATCH_NO)
3888 goto syntax;
3891 c = gfc_get_code ();
3892 *c = new_st;
3893 c->loc = gfc_current_locus;
3895 if (gfc_match_eos () != MATCH_YES)
3896 goto syntax;
3898 gfc_clear_new_st ();
3899 new_st.op = EXEC_FORALL;
3900 new_st.expr = mask;
3901 new_st.ext.forall_iterator = head;
3902 new_st.block = gfc_get_code ();
3904 new_st.block->op = EXEC_FORALL;
3905 new_st.block->next = c;
3907 return MATCH_YES;
3909 syntax:
3910 gfc_syntax_error (ST_FORALL);
3912 cleanup:
3913 gfc_free_forall_iterator (head);
3914 gfc_free_expr (mask);
3916 return MATCH_ERROR;
3920 /* Match a FORALL statement. */
3922 match
3923 gfc_match_forall (gfc_statement *st)
3925 gfc_forall_iterator *head;
3926 gfc_expr *mask;
3927 gfc_code *c;
3928 match m0, m;
3930 head = NULL;
3931 mask = NULL;
3932 c = NULL;
3934 m0 = gfc_match_label ();
3935 if (m0 == MATCH_ERROR)
3936 return MATCH_ERROR;
3938 m = gfc_match (" forall");
3939 if (m != MATCH_YES)
3940 return m;
3942 m = match_forall_header (&head, &mask);
3943 if (m == MATCH_ERROR)
3944 goto cleanup;
3945 if (m == MATCH_NO)
3946 goto syntax;
3948 if (gfc_match_eos () == MATCH_YES)
3950 *st = ST_FORALL_BLOCK;
3951 new_st.op = EXEC_FORALL;
3952 new_st.expr = mask;
3953 new_st.ext.forall_iterator = head;
3954 return MATCH_YES;
3957 m = gfc_match_assignment ();
3958 if (m == MATCH_ERROR)
3959 goto cleanup;
3960 if (m == MATCH_NO)
3962 m = gfc_match_pointer_assignment ();
3963 if (m == MATCH_ERROR)
3964 goto cleanup;
3965 if (m == MATCH_NO)
3966 goto syntax;
3969 c = gfc_get_code ();
3970 *c = new_st;
3971 c->loc = gfc_current_locus;
3973 gfc_clear_new_st ();
3974 new_st.op = EXEC_FORALL;
3975 new_st.expr = mask;
3976 new_st.ext.forall_iterator = head;
3977 new_st.block = gfc_get_code ();
3978 new_st.block->op = EXEC_FORALL;
3979 new_st.block->next = c;
3981 *st = ST_FORALL;
3982 return MATCH_YES;
3984 syntax:
3985 gfc_syntax_error (ST_FORALL);
3987 cleanup:
3988 gfc_free_forall_iterator (head);
3989 gfc_free_expr (mask);
3990 gfc_free_statements (c);
3991 return MATCH_NO;