OSDN Git Service

2009-05-26 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / match.c
1 /* Matching subroutines in all sizes, shapes and colors.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Andy Vaught
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "flags.h"
25 #include "gfortran.h"
26 #include "match.h"
27 #include "parse.h"
28
29 int gfc_matching_procptr_assignment = 0;
30 bool gfc_matching_prefix = false;
31
32 /* For debugging and diagnostic purposes.  Return the textual representation
33    of the intrinsic operator OP.  */
34 const char *
35 gfc_op2string (gfc_intrinsic_op op)
36 {
37   switch (op)
38     {
39     case INTRINSIC_UPLUS:
40     case INTRINSIC_PLUS:
41       return "+";
42
43     case INTRINSIC_UMINUS:
44     case INTRINSIC_MINUS:
45       return "-";
46
47     case INTRINSIC_POWER:
48       return "**";
49     case INTRINSIC_CONCAT:
50       return "//";
51     case INTRINSIC_TIMES:
52       return "*";
53     case INTRINSIC_DIVIDE:
54       return "/";
55
56     case INTRINSIC_AND:
57       return ".and.";
58     case INTRINSIC_OR:
59       return ".or.";
60     case INTRINSIC_EQV:
61       return ".eqv.";
62     case INTRINSIC_NEQV:
63       return ".neqv.";
64
65     case INTRINSIC_EQ_OS:
66       return ".eq.";
67     case INTRINSIC_EQ:
68       return "==";
69     case INTRINSIC_NE_OS:
70       return ".ne.";
71     case INTRINSIC_NE:
72       return "/=";
73     case INTRINSIC_GE_OS:
74       return ".ge.";
75     case INTRINSIC_GE:
76       return ">=";
77     case INTRINSIC_LE_OS:
78       return ".le.";
79     case INTRINSIC_LE:
80       return "<=";
81     case INTRINSIC_LT_OS:
82       return ".lt.";
83     case INTRINSIC_LT:
84       return "<";
85     case INTRINSIC_GT_OS:
86       return ".gt.";
87     case INTRINSIC_GT:
88       return ">";
89     case INTRINSIC_NOT:
90       return ".not.";
91
92     case INTRINSIC_ASSIGN:
93       return "=";
94
95     case INTRINSIC_PARENTHESES:
96       return "parens";
97
98     default:
99       break;
100     }
101
102   gfc_internal_error ("gfc_op2string(): Bad code");
103   /* Not reached.  */
104 }
105
106
107 /******************** Generic matching subroutines ************************/
108
109 /* This function scans the current statement counting the opened and closed
110    parenthesis to make sure they are balanced.  */
111
112 match
113 gfc_match_parens (void)
114 {
115   locus old_loc, where;
116   int count, instring;
117   gfc_char_t c, quote;
118
119   old_loc = gfc_current_locus;
120   count = 0;
121   instring = 0;
122   quote = ' ';
123
124   for (;;)
125     {
126       c = gfc_next_char_literal (instring);
127       if (c == '\n')
128         break;
129       if (quote == ' ' && ((c == '\'') || (c == '"')))
130         {
131           quote = c;
132           instring = 1;
133           continue;
134         }
135       if (quote != ' ' && c == quote)
136         {
137           quote = ' ';
138           instring = 0;
139           continue;
140         }
141
142       if (c == '(' && quote == ' ')
143         {
144           count++;
145           where = gfc_current_locus;
146         }
147       if (c == ')' && quote == ' ')
148         {
149           count--;
150           where = gfc_current_locus;
151         }
152     }
153
154   gfc_current_locus = old_loc;
155
156   if (count > 0)
157     {
158       gfc_error ("Missing ')' in statement at or before %L", &where);
159       return MATCH_ERROR;
160     }
161   if (count < 0)
162     {
163       gfc_error ("Missing '(' in statement at or before %L", &where);
164       return MATCH_ERROR;
165     }
166
167   return MATCH_YES;
168 }
169
170
171 /* See if the next character is a special character that has
172    escaped by a \ via the -fbackslash option.  */
173
174 match
175 gfc_match_special_char (gfc_char_t *res)
176 {
177   int len, i;
178   gfc_char_t c, n;
179   match m;
180
181   m = MATCH_YES;
182
183   switch ((c = gfc_next_char_literal (1)))
184     {
185     case 'a':
186       *res = '\a';
187       break;
188     case 'b':
189       *res = '\b';
190       break;
191     case 't':
192       *res = '\t';
193       break;
194     case 'f':
195       *res = '\f';
196       break;
197     case 'n':
198       *res = '\n';
199       break;
200     case 'r':
201       *res = '\r';
202       break;
203     case 'v':
204       *res = '\v';
205       break;
206     case '\\':
207       *res = '\\';
208       break;
209     case '0':
210       *res = '\0';
211       break;
212
213     case 'x':
214     case 'u':
215     case 'U':
216       /* Hexadecimal form of wide characters.  */
217       len = (c == 'x' ? 2 : (c == 'u' ? 4 : 8));
218       n = 0;
219       for (i = 0; i < len; i++)
220         {
221           char buf[2] = { '\0', '\0' };
222
223           c = gfc_next_char_literal (1);
224           if (!gfc_wide_fits_in_byte (c)
225               || !gfc_check_digit ((unsigned char) c, 16))
226             return MATCH_NO;
227
228           buf[0] = (unsigned char) c;
229           n = n << 4;
230           n += strtol (buf, NULL, 16);
231         }
232       *res = n;
233       break;
234
235     default:
236       /* Unknown backslash codes are simply not expanded.  */
237       m = MATCH_NO;
238       break;
239     }
240
241   return m;
242 }
243
244
245 /* In free form, match at least one space.  Always matches in fixed
246    form.  */
247
248 match
249 gfc_match_space (void)
250 {
251   locus old_loc;
252   char c;
253
254   if (gfc_current_form == FORM_FIXED)
255     return MATCH_YES;
256
257   old_loc = gfc_current_locus;
258
259   c = gfc_next_ascii_char ();
260   if (!gfc_is_whitespace (c))
261     {
262       gfc_current_locus = old_loc;
263       return MATCH_NO;
264     }
265
266   gfc_gobble_whitespace ();
267
268   return MATCH_YES;
269 }
270
271
272 /* Match an end of statement.  End of statement is optional
273    whitespace, followed by a ';' or '\n' or comment '!'.  If a
274    semicolon is found, we continue to eat whitespace and semicolons.  */
275
276 match
277 gfc_match_eos (void)
278 {
279   locus old_loc;
280   int flag;
281   char c;
282
283   flag = 0;
284
285   for (;;)
286     {
287       old_loc = gfc_current_locus;
288       gfc_gobble_whitespace ();
289
290       c = gfc_next_ascii_char ();
291       switch (c)
292         {
293         case '!':
294           do
295             {
296               c = gfc_next_ascii_char ();
297             }
298           while (c != '\n');
299
300           /* Fall through.  */
301
302         case '\n':
303           return MATCH_YES;
304
305         case ';':
306           flag = 1;
307           continue;
308         }
309
310       break;
311     }
312
313   gfc_current_locus = old_loc;
314   return (flag) ? MATCH_YES : MATCH_NO;
315 }
316
317
318 /* Match a literal integer on the input, setting the value on
319    MATCH_YES.  Literal ints occur in kind-parameters as well as
320    old-style character length specifications.  If cnt is non-NULL it
321    will be set to the number of digits.  */
322
323 match
324 gfc_match_small_literal_int (int *value, int *cnt)
325 {
326   locus old_loc;
327   char c;
328   int i, j;
329
330   old_loc = gfc_current_locus;
331
332   *value = -1;
333   gfc_gobble_whitespace ();
334   c = gfc_next_ascii_char ();
335   if (cnt)
336     *cnt = 0;
337
338   if (!ISDIGIT (c))
339     {
340       gfc_current_locus = old_loc;
341       return MATCH_NO;
342     }
343
344   i = c - '0';
345   j = 1;
346
347   for (;;)
348     {
349       old_loc = gfc_current_locus;
350       c = gfc_next_ascii_char ();
351
352       if (!ISDIGIT (c))
353         break;
354
355       i = 10 * i + c - '0';
356       j++;
357
358       if (i > 99999999)
359         {
360           gfc_error ("Integer too large at %C");
361           return MATCH_ERROR;
362         }
363     }
364
365   gfc_current_locus = old_loc;
366
367   *value = i;
368   if (cnt)
369     *cnt = j;
370   return MATCH_YES;
371 }
372
373
374 /* Match a small, constant integer expression, like in a kind
375    statement.  On MATCH_YES, 'value' is set.  */
376
377 match
378 gfc_match_small_int (int *value)
379 {
380   gfc_expr *expr;
381   const char *p;
382   match m;
383   int i;
384
385   m = gfc_match_expr (&expr);
386   if (m != MATCH_YES)
387     return m;
388
389   p = gfc_extract_int (expr, &i);
390   gfc_free_expr (expr);
391
392   if (p != NULL)
393     {
394       gfc_error (p);
395       m = MATCH_ERROR;
396     }
397
398   *value = i;
399   return m;
400 }
401
402
403 /* This function is the same as the gfc_match_small_int, except that
404    we're keeping the pointer to the expr.  This function could just be
405    removed and the previously mentioned one modified, though all calls
406    to it would have to be modified then (and there were a number of
407    them).  Return MATCH_ERROR if fail to extract the int; otherwise,
408    return the result of gfc_match_expr().  The expr (if any) that was
409    matched is returned in the parameter expr.  */
410
411 match
412 gfc_match_small_int_expr (int *value, gfc_expr **expr)
413 {
414   const char *p;
415   match m;
416   int i;
417
418   m = gfc_match_expr (expr);
419   if (m != MATCH_YES)
420     return m;
421
422   p = gfc_extract_int (*expr, &i);
423
424   if (p != NULL)
425     {
426       gfc_error (p);
427       m = MATCH_ERROR;
428     }
429
430   *value = i;
431   return m;
432 }
433
434
435 /* Matches a statement label.  Uses gfc_match_small_literal_int() to
436    do most of the work.  */
437
438 match
439 gfc_match_st_label (gfc_st_label **label)
440 {
441   locus old_loc;
442   match m;
443   int i, cnt;
444
445   old_loc = gfc_current_locus;
446
447   m = gfc_match_small_literal_int (&i, &cnt);
448   if (m != MATCH_YES)
449     return m;
450
451   if (cnt > 5)
452     {
453       gfc_error ("Too many digits in statement label at %C");
454       goto cleanup;
455     }
456
457   if (i == 0)
458     {
459       gfc_error ("Statement label at %C is zero");
460       goto cleanup;
461     }
462
463   *label = gfc_get_st_label (i);
464   return MATCH_YES;
465
466 cleanup:
467
468   gfc_current_locus = old_loc;
469   return MATCH_ERROR;
470 }
471
472
473 /* Match and validate a label associated with a named IF, DO or SELECT
474    statement.  If the symbol does not have the label attribute, we add
475    it.  We also make sure the symbol does not refer to another
476    (active) block.  A matched label is pointed to by gfc_new_block.  */
477
478 match
479 gfc_match_label (void)
480 {
481   char name[GFC_MAX_SYMBOL_LEN + 1];
482   match m;
483
484   gfc_new_block = NULL;
485
486   m = gfc_match (" %n :", name);
487   if (m != MATCH_YES)
488     return m;
489
490   if (gfc_get_symbol (name, NULL, &gfc_new_block))
491     {
492       gfc_error ("Label name '%s' at %C is ambiguous", name);
493       return MATCH_ERROR;
494     }
495
496   if (gfc_new_block->attr.flavor == FL_LABEL)
497     {
498       gfc_error ("Duplicate construct label '%s' at %C", name);
499       return MATCH_ERROR;
500     }
501
502   if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
503                       gfc_new_block->name, NULL) == FAILURE)
504     return MATCH_ERROR;
505
506   return MATCH_YES;
507 }
508
509
510 /* See if the current input looks like a name of some sort.  Modifies
511    the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
512    Note that options.c restricts max_identifier_length to not more
513    than GFC_MAX_SYMBOL_LEN.  */
514
515 match
516 gfc_match_name (char *buffer)
517 {
518   locus old_loc;
519   int i;
520   char c;
521
522   old_loc = gfc_current_locus;
523   gfc_gobble_whitespace ();
524
525   c = gfc_next_ascii_char ();
526   if (!(ISALPHA (c) || (c == '_' && gfc_option.flag_allow_leading_underscore)))
527     {
528       if (gfc_error_flag_test() == 0 && c != '(')
529         gfc_error ("Invalid character in name at %C");
530       gfc_current_locus = old_loc;
531       return MATCH_NO;
532     }
533
534   i = 0;
535
536   do
537     {
538       buffer[i++] = c;
539
540       if (i > gfc_option.max_identifier_length)
541         {
542           gfc_error ("Name at %C is too long");
543           return MATCH_ERROR;
544         }
545
546       old_loc = gfc_current_locus;
547       c = gfc_next_ascii_char ();
548     }
549   while (ISALNUM (c) || c == '_' || (gfc_option.flag_dollar_ok && c == '$'));
550
551   if (c == '$' && !gfc_option.flag_dollar_ok)
552     {
553       gfc_error ("Invalid character '$' at %C. Use -fdollar-ok to allow it "
554                  "as an extension");
555       return MATCH_ERROR;
556     }
557
558   buffer[i] = '\0';
559   gfc_current_locus = old_loc;
560
561   return MATCH_YES;
562 }
563
564
565 /* Match a valid name for C, which is almost the same as for Fortran,
566    except that you can start with an underscore, etc..  It could have
567    been done by modifying the gfc_match_name, but this way other
568    things C allows can be added, such as no limits on the length.
569    Right now, the length is limited to the same thing as Fortran..
570    Also, by rewriting it, we use the gfc_next_char_C() to prevent the
571    input characters from being automatically lower cased, since C is
572    case sensitive.  The parameter, buffer, is used to return the name
573    that is matched.  Return MATCH_ERROR if the name is too long
574    (though this is a self-imposed limit), MATCH_NO if what we're
575    seeing isn't a name, and MATCH_YES if we successfully match a C
576    name.  */
577
578 match
579 gfc_match_name_C (char *buffer)
580 {
581   locus old_loc;
582   int i = 0;
583   gfc_char_t c;
584
585   old_loc = gfc_current_locus;
586   gfc_gobble_whitespace ();
587
588   /* Get the next char (first possible char of name) and see if
589      it's valid for C (either a letter or an underscore).  */
590   c = gfc_next_char_literal (1);
591
592   /* If the user put nothing expect spaces between the quotes, it is valid
593      and simply means there is no name= specifier and the name is the fortran
594      symbol name, all lowercase.  */
595   if (c == '"' || c == '\'')
596     {
597       buffer[0] = '\0';
598       gfc_current_locus = old_loc;
599       return MATCH_YES;
600     }
601   
602   if (!ISALPHA (c) && c != '_')
603     {
604       gfc_error ("Invalid C name in NAME= specifier at %C");
605       return MATCH_ERROR;
606     }
607
608   /* Continue to read valid variable name characters.  */
609   do
610     {
611       gcc_assert (gfc_wide_fits_in_byte (c));
612
613       buffer[i++] = (unsigned char) c;
614       
615     /* C does not define a maximum length of variable names, to my
616        knowledge, but the compiler typically places a limit on them.
617        For now, i'll use the same as the fortran limit for simplicity,
618        but this may need to be changed to a dynamic buffer that can
619        be realloc'ed here if necessary, or more likely, a larger
620        upper-bound set.  */
621       if (i > gfc_option.max_identifier_length)
622         {
623           gfc_error ("Name at %C is too long");
624           return MATCH_ERROR;
625         }
626       
627       old_loc = gfc_current_locus;
628       
629       /* Get next char; param means we're in a string.  */
630       c = gfc_next_char_literal (1);
631     } while (ISALNUM (c) || c == '_');
632
633   buffer[i] = '\0';
634   gfc_current_locus = old_loc;
635
636   /* See if we stopped because of whitespace.  */
637   if (c == ' ')
638     {
639       gfc_gobble_whitespace ();
640       c = gfc_peek_ascii_char ();
641       if (c != '"' && c != '\'')
642         {
643           gfc_error ("Embedded space in NAME= specifier at %C");
644           return MATCH_ERROR;
645         }
646     }
647   
648   /* If we stopped because we had an invalid character for a C name, report
649      that to the user by returning MATCH_NO.  */
650   if (c != '"' && c != '\'')
651     {
652       gfc_error ("Invalid C name in NAME= specifier at %C");
653       return MATCH_ERROR;
654     }
655
656   return MATCH_YES;
657 }
658
659
660 /* Match a symbol on the input.  Modifies the pointer to the symbol
661    pointer if successful.  */
662
663 match
664 gfc_match_sym_tree (gfc_symtree **matched_symbol, int host_assoc)
665 {
666   char buffer[GFC_MAX_SYMBOL_LEN + 1];
667   match m;
668
669   m = gfc_match_name (buffer);
670   if (m != MATCH_YES)
671     return m;
672
673   if (host_assoc)
674     return (gfc_get_ha_sym_tree (buffer, matched_symbol))
675             ? MATCH_ERROR : MATCH_YES;
676
677   if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
678     return MATCH_ERROR;
679
680   return MATCH_YES;
681 }
682
683
684 match
685 gfc_match_symbol (gfc_symbol **matched_symbol, int host_assoc)
686 {
687   gfc_symtree *st;
688   match m;
689
690   m = gfc_match_sym_tree (&st, host_assoc);
691
692   if (m == MATCH_YES)
693     {
694       if (st)
695         *matched_symbol = st->n.sym;
696       else
697         *matched_symbol = NULL;
698     }
699   else
700     *matched_symbol = NULL;
701   return m;
702 }
703
704
705 /* Match an intrinsic operator.  Returns an INTRINSIC enum. While matching, 
706    we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this 
707    in matchexp.c.  */
708
709 match
710 gfc_match_intrinsic_op (gfc_intrinsic_op *result)
711 {
712   locus orig_loc = gfc_current_locus;
713   char ch;
714
715   gfc_gobble_whitespace ();
716   ch = gfc_next_ascii_char ();
717   switch (ch)
718     {
719     case '+':
720       /* Matched "+".  */
721       *result = INTRINSIC_PLUS;
722       return MATCH_YES;
723
724     case '-':
725       /* Matched "-".  */
726       *result = INTRINSIC_MINUS;
727       return MATCH_YES;
728
729     case '=':
730       if (gfc_next_ascii_char () == '=')
731         {
732           /* Matched "==".  */
733           *result = INTRINSIC_EQ;
734           return MATCH_YES;
735         }
736       break;
737
738     case '<':
739       if (gfc_peek_ascii_char () == '=')
740         {
741           /* Matched "<=".  */
742           gfc_next_ascii_char ();
743           *result = INTRINSIC_LE;
744           return MATCH_YES;
745         }
746       /* Matched "<".  */
747       *result = INTRINSIC_LT;
748       return MATCH_YES;
749
750     case '>':
751       if (gfc_peek_ascii_char () == '=')
752         {
753           /* Matched ">=".  */
754           gfc_next_ascii_char ();
755           *result = INTRINSIC_GE;
756           return MATCH_YES;
757         }
758       /* Matched ">".  */
759       *result = INTRINSIC_GT;
760       return MATCH_YES;
761
762     case '*':
763       if (gfc_peek_ascii_char () == '*')
764         {
765           /* Matched "**".  */
766           gfc_next_ascii_char ();
767           *result = INTRINSIC_POWER;
768           return MATCH_YES;
769         }
770       /* Matched "*".  */
771       *result = INTRINSIC_TIMES;
772       return MATCH_YES;
773
774     case '/':
775       ch = gfc_peek_ascii_char ();
776       if (ch == '=')
777         {
778           /* Matched "/=".  */
779           gfc_next_ascii_char ();
780           *result = INTRINSIC_NE;
781           return MATCH_YES;
782         }
783       else if (ch == '/')
784         {
785           /* Matched "//".  */
786           gfc_next_ascii_char ();
787           *result = INTRINSIC_CONCAT;
788           return MATCH_YES;
789         }
790       /* Matched "/".  */
791       *result = INTRINSIC_DIVIDE;
792       return MATCH_YES;
793
794     case '.':
795       ch = gfc_next_ascii_char ();
796       switch (ch)
797         {
798         case 'a':
799           if (gfc_next_ascii_char () == 'n'
800               && gfc_next_ascii_char () == 'd'
801               && gfc_next_ascii_char () == '.')
802             {
803               /* Matched ".and.".  */
804               *result = INTRINSIC_AND;
805               return MATCH_YES;
806             }
807           break;
808
809         case 'e':
810           if (gfc_next_ascii_char () == 'q')
811             {
812               ch = gfc_next_ascii_char ();
813               if (ch == '.')
814                 {
815                   /* Matched ".eq.".  */
816                   *result = INTRINSIC_EQ_OS;
817                   return MATCH_YES;
818                 }
819               else if (ch == 'v')
820                 {
821                   if (gfc_next_ascii_char () == '.')
822                     {
823                       /* Matched ".eqv.".  */
824                       *result = INTRINSIC_EQV;
825                       return MATCH_YES;
826                     }
827                 }
828             }
829           break;
830
831         case 'g':
832           ch = gfc_next_ascii_char ();
833           if (ch == 'e')
834             {
835               if (gfc_next_ascii_char () == '.')
836                 {
837                   /* Matched ".ge.".  */
838                   *result = INTRINSIC_GE_OS;
839                   return MATCH_YES;
840                 }
841             }
842           else if (ch == 't')
843             {
844               if (gfc_next_ascii_char () == '.')
845                 {
846                   /* Matched ".gt.".  */
847                   *result = INTRINSIC_GT_OS;
848                   return MATCH_YES;
849                 }
850             }
851           break;
852
853         case 'l':
854           ch = gfc_next_ascii_char ();
855           if (ch == 'e')
856             {
857               if (gfc_next_ascii_char () == '.')
858                 {
859                   /* Matched ".le.".  */
860                   *result = INTRINSIC_LE_OS;
861                   return MATCH_YES;
862                 }
863             }
864           else if (ch == 't')
865             {
866               if (gfc_next_ascii_char () == '.')
867                 {
868                   /* Matched ".lt.".  */
869                   *result = INTRINSIC_LT_OS;
870                   return MATCH_YES;
871                 }
872             }
873           break;
874
875         case 'n':
876           ch = gfc_next_ascii_char ();
877           if (ch == 'e')
878             {
879               ch = gfc_next_ascii_char ();
880               if (ch == '.')
881                 {
882                   /* Matched ".ne.".  */
883                   *result = INTRINSIC_NE_OS;
884                   return MATCH_YES;
885                 }
886               else if (ch == 'q')
887                 {
888                   if (gfc_next_ascii_char () == 'v'
889                       && gfc_next_ascii_char () == '.')
890                     {
891                       /* Matched ".neqv.".  */
892                       *result = INTRINSIC_NEQV;
893                       return MATCH_YES;
894                     }
895                 }
896             }
897           else if (ch == 'o')
898             {
899               if (gfc_next_ascii_char () == 't'
900                   && gfc_next_ascii_char () == '.')
901                 {
902                   /* Matched ".not.".  */
903                   *result = INTRINSIC_NOT;
904                   return MATCH_YES;
905                 }
906             }
907           break;
908
909         case 'o':
910           if (gfc_next_ascii_char () == 'r'
911               && gfc_next_ascii_char () == '.')
912             {
913               /* Matched ".or.".  */
914               *result = INTRINSIC_OR;
915               return MATCH_YES;
916             }
917           break;
918
919         default:
920           break;
921         }
922       break;
923
924     default:
925       break;
926     }
927
928   gfc_current_locus = orig_loc;
929   return MATCH_NO;
930 }
931
932
933 /* Match a loop control phrase:
934
935     <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
936
937    If the final integer expression is not present, a constant unity
938    expression is returned.  We don't return MATCH_ERROR until after
939    the equals sign is seen.  */
940
941 match
942 gfc_match_iterator (gfc_iterator *iter, int init_flag)
943 {
944   char name[GFC_MAX_SYMBOL_LEN + 1];
945   gfc_expr *var, *e1, *e2, *e3;
946   locus start;
947   match m;
948
949   /* Match the start of an iterator without affecting the symbol table.  */
950
951   start = gfc_current_locus;
952   m = gfc_match (" %n =", name);
953   gfc_current_locus = start;
954
955   if (m != MATCH_YES)
956     return MATCH_NO;
957
958   m = gfc_match_variable (&var, 0);
959   if (m != MATCH_YES)
960     return MATCH_NO;
961
962   gfc_match_char ('=');
963
964   e1 = e2 = e3 = NULL;
965
966   if (var->ref != NULL)
967     {
968       gfc_error ("Loop variable at %C cannot be a sub-component");
969       goto cleanup;
970     }
971
972   if (var->symtree->n.sym->attr.intent == INTENT_IN)
973     {
974       gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
975                  var->symtree->n.sym->name);
976       goto cleanup;
977     }
978
979   var->symtree->n.sym->attr.implied_index = 1;
980
981   m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
982   if (m == MATCH_NO)
983     goto syntax;
984   if (m == MATCH_ERROR)
985     goto cleanup;
986
987   if (gfc_match_char (',') != MATCH_YES)
988     goto syntax;
989
990   m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
991   if (m == MATCH_NO)
992     goto syntax;
993   if (m == MATCH_ERROR)
994     goto cleanup;
995
996   if (gfc_match_char (',') != MATCH_YES)
997     {
998       e3 = gfc_int_expr (1);
999       goto done;
1000     }
1001
1002   m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
1003   if (m == MATCH_ERROR)
1004     goto cleanup;
1005   if (m == MATCH_NO)
1006     {
1007       gfc_error ("Expected a step value in iterator at %C");
1008       goto cleanup;
1009     }
1010
1011 done:
1012   iter->var = var;
1013   iter->start = e1;
1014   iter->end = e2;
1015   iter->step = e3;
1016   return MATCH_YES;
1017
1018 syntax:
1019   gfc_error ("Syntax error in iterator at %C");
1020
1021 cleanup:
1022   gfc_free_expr (e1);
1023   gfc_free_expr (e2);
1024   gfc_free_expr (e3);
1025
1026   return MATCH_ERROR;
1027 }
1028
1029
1030 /* Tries to match the next non-whitespace character on the input.
1031    This subroutine does not return MATCH_ERROR.  */
1032
1033 match
1034 gfc_match_char (char c)
1035 {
1036   locus where;
1037
1038   where = gfc_current_locus;
1039   gfc_gobble_whitespace ();
1040
1041   if (gfc_next_ascii_char () == c)
1042     return MATCH_YES;
1043
1044   gfc_current_locus = where;
1045   return MATCH_NO;
1046 }
1047
1048
1049 /* General purpose matching subroutine.  The target string is a
1050    scanf-like format string in which spaces correspond to arbitrary
1051    whitespace (including no whitespace), characters correspond to
1052    themselves.  The %-codes are:
1053
1054    %%  Literal percent sign
1055    %e  Expression, pointer to a pointer is set
1056    %s  Symbol, pointer to the symbol is set
1057    %n  Name, character buffer is set to name
1058    %t  Matches end of statement.
1059    %o  Matches an intrinsic operator, returned as an INTRINSIC enum.
1060    %l  Matches a statement label
1061    %v  Matches a variable expression (an lvalue)
1062    %   Matches a required space (in free form) and optional spaces.  */
1063
1064 match
1065 gfc_match (const char *target, ...)
1066 {
1067   gfc_st_label **label;
1068   int matches, *ip;
1069   locus old_loc;
1070   va_list argp;
1071   char c, *np;
1072   match m, n;
1073   void **vp;
1074   const char *p;
1075
1076   old_loc = gfc_current_locus;
1077   va_start (argp, target);
1078   m = MATCH_NO;
1079   matches = 0;
1080   p = target;
1081
1082 loop:
1083   c = *p++;
1084   switch (c)
1085     {
1086     case ' ':
1087       gfc_gobble_whitespace ();
1088       goto loop;
1089     case '\0':
1090       m = MATCH_YES;
1091       break;
1092
1093     case '%':
1094       c = *p++;
1095       switch (c)
1096         {
1097         case 'e':
1098           vp = va_arg (argp, void **);
1099           n = gfc_match_expr ((gfc_expr **) vp);
1100           if (n != MATCH_YES)
1101             {
1102               m = n;
1103               goto not_yes;
1104             }
1105
1106           matches++;
1107           goto loop;
1108
1109         case 'v':
1110           vp = va_arg (argp, void **);
1111           n = gfc_match_variable ((gfc_expr **) vp, 0);
1112           if (n != MATCH_YES)
1113             {
1114               m = n;
1115               goto not_yes;
1116             }
1117
1118           matches++;
1119           goto loop;
1120
1121         case 's':
1122           vp = va_arg (argp, void **);
1123           n = gfc_match_symbol ((gfc_symbol **) vp, 0);
1124           if (n != MATCH_YES)
1125             {
1126               m = n;
1127               goto not_yes;
1128             }
1129
1130           matches++;
1131           goto loop;
1132
1133         case 'n':
1134           np = va_arg (argp, char *);
1135           n = gfc_match_name (np);
1136           if (n != MATCH_YES)
1137             {
1138               m = n;
1139               goto not_yes;
1140             }
1141
1142           matches++;
1143           goto loop;
1144
1145         case 'l':
1146           label = va_arg (argp, gfc_st_label **);
1147           n = gfc_match_st_label (label);
1148           if (n != MATCH_YES)
1149             {
1150               m = n;
1151               goto not_yes;
1152             }
1153
1154           matches++;
1155           goto loop;
1156
1157         case 'o':
1158           ip = va_arg (argp, int *);
1159           n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
1160           if (n != MATCH_YES)
1161             {
1162               m = n;
1163               goto not_yes;
1164             }
1165
1166           matches++;
1167           goto loop;
1168
1169         case 't':
1170           if (gfc_match_eos () != MATCH_YES)
1171             {
1172               m = MATCH_NO;
1173               goto not_yes;
1174             }
1175           goto loop;
1176
1177         case ' ':
1178           if (gfc_match_space () == MATCH_YES)
1179             goto loop;
1180           m = MATCH_NO;
1181           goto not_yes;
1182
1183         case '%':
1184           break;        /* Fall through to character matcher.  */
1185
1186         default:
1187           gfc_internal_error ("gfc_match(): Bad match code %c", c);
1188         }
1189
1190     default:
1191
1192       /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1193          expect an upper case character here!  */
1194       gcc_assert (TOLOWER (c) == c);
1195
1196       if (c == gfc_next_ascii_char ())
1197         goto loop;
1198       break;
1199     }
1200
1201 not_yes:
1202   va_end (argp);
1203
1204   if (m != MATCH_YES)
1205     {
1206       /* Clean up after a failed match.  */
1207       gfc_current_locus = old_loc;
1208       va_start (argp, target);
1209
1210       p = target;
1211       for (; matches > 0; matches--)
1212         {
1213           while (*p++ != '%');
1214
1215           switch (*p++)
1216             {
1217             case '%':
1218               matches++;
1219               break;            /* Skip.  */
1220
1221             /* Matches that don't have to be undone */
1222             case 'o':
1223             case 'l':
1224             case 'n':
1225             case 's':
1226               (void) va_arg (argp, void **);
1227               break;
1228
1229             case 'e':
1230             case 'v':
1231               vp = va_arg (argp, void **);
1232               gfc_free_expr ((struct gfc_expr *)*vp);
1233               *vp = NULL;
1234               break;
1235             }
1236         }
1237
1238       va_end (argp);
1239     }
1240
1241   return m;
1242 }
1243
1244
1245 /*********************** Statement level matching **********************/
1246
1247 /* Matches the start of a program unit, which is the program keyword
1248    followed by an obligatory symbol.  */
1249
1250 match
1251 gfc_match_program (void)
1252 {
1253   gfc_symbol *sym;
1254   match m;
1255
1256   m = gfc_match ("% %s%t", &sym);
1257
1258   if (m == MATCH_NO)
1259     {
1260       gfc_error ("Invalid form of PROGRAM statement at %C");
1261       m = MATCH_ERROR;
1262     }
1263
1264   if (m == MATCH_ERROR)
1265     return m;
1266
1267   if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
1268     return MATCH_ERROR;
1269
1270   gfc_new_block = sym;
1271
1272   return MATCH_YES;
1273 }
1274
1275
1276 /* Match a simple assignment statement.  */
1277
1278 match
1279 gfc_match_assignment (void)
1280 {
1281   gfc_expr *lvalue, *rvalue;
1282   locus old_loc;
1283   match m;
1284
1285   old_loc = gfc_current_locus;
1286
1287   lvalue = NULL;
1288   m = gfc_match (" %v =", &lvalue);
1289   if (m != MATCH_YES)
1290     {
1291       gfc_current_locus = old_loc;
1292       gfc_free_expr (lvalue);
1293       return MATCH_NO;
1294     }
1295
1296   rvalue = NULL;
1297   m = gfc_match (" %e%t", &rvalue);
1298   if (m != MATCH_YES)
1299     {
1300       gfc_current_locus = old_loc;
1301       gfc_free_expr (lvalue);
1302       gfc_free_expr (rvalue);
1303       return m;
1304     }
1305
1306   gfc_set_sym_referenced (lvalue->symtree->n.sym);
1307
1308   new_st.op = EXEC_ASSIGN;
1309   new_st.expr1 = lvalue;
1310   new_st.expr2 = rvalue;
1311
1312   gfc_check_do_variable (lvalue->symtree);
1313
1314   return MATCH_YES;
1315 }
1316
1317
1318 /* Match a pointer assignment statement.  */
1319
1320 match
1321 gfc_match_pointer_assignment (void)
1322 {
1323   gfc_expr *lvalue, *rvalue;
1324   locus old_loc;
1325   match m;
1326
1327   old_loc = gfc_current_locus;
1328
1329   lvalue = rvalue = NULL;
1330   gfc_matching_procptr_assignment = 0;
1331
1332   m = gfc_match (" %v =>", &lvalue);
1333   if (m != MATCH_YES)
1334     {
1335       m = MATCH_NO;
1336       goto cleanup;
1337     }
1338
1339   if (lvalue->symtree->n.sym->attr.proc_pointer
1340       || is_proc_ptr_comp (lvalue, NULL))
1341     gfc_matching_procptr_assignment = 1;
1342
1343   m = gfc_match (" %e%t", &rvalue);
1344   gfc_matching_procptr_assignment = 0;
1345   if (m != MATCH_YES)
1346     goto cleanup;
1347
1348   new_st.op = EXEC_POINTER_ASSIGN;
1349   new_st.expr1 = lvalue;
1350   new_st.expr2 = rvalue;
1351
1352   return MATCH_YES;
1353
1354 cleanup:
1355   gfc_current_locus = old_loc;
1356   gfc_free_expr (lvalue);
1357   gfc_free_expr (rvalue);
1358   return m;
1359 }
1360
1361
1362 /* We try to match an easy arithmetic IF statement. This only happens
1363    when just after having encountered a simple IF statement. This code
1364    is really duplicate with parts of the gfc_match_if code, but this is
1365    *much* easier.  */
1366
1367 static match
1368 match_arithmetic_if (void)
1369 {
1370   gfc_st_label *l1, *l2, *l3;
1371   gfc_expr *expr;
1372   match m;
1373
1374   m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1375   if (m != MATCH_YES)
1376     return m;
1377
1378   if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1379       || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1380       || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1381     {
1382       gfc_free_expr (expr);
1383       return MATCH_ERROR;
1384     }
1385
1386   if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF statement "
1387                       "at %C") == FAILURE)
1388     return MATCH_ERROR;
1389
1390   new_st.op = EXEC_ARITHMETIC_IF;
1391   new_st.expr1 = expr;
1392   new_st.label1 = l1;
1393   new_st.label2 = l2;
1394   new_st.label3 = l3;
1395
1396   return MATCH_YES;
1397 }
1398
1399
1400 /* The IF statement is a bit of a pain.  First of all, there are three
1401    forms of it, the simple IF, the IF that starts a block and the
1402    arithmetic IF.
1403
1404    There is a problem with the simple IF and that is the fact that we
1405    only have a single level of undo information on symbols.  What this
1406    means is for a simple IF, we must re-match the whole IF statement
1407    multiple times in order to guarantee that the symbol table ends up
1408    in the proper state.  */
1409
1410 static match match_simple_forall (void);
1411 static match match_simple_where (void);
1412
1413 match
1414 gfc_match_if (gfc_statement *if_type)
1415 {
1416   gfc_expr *expr;
1417   gfc_st_label *l1, *l2, *l3;
1418   locus old_loc, old_loc2;
1419   gfc_code *p;
1420   match m, n;
1421
1422   n = gfc_match_label ();
1423   if (n == MATCH_ERROR)
1424     return n;
1425
1426   old_loc = gfc_current_locus;
1427
1428   m = gfc_match (" if ( %e", &expr);
1429   if (m != MATCH_YES)
1430     return m;
1431
1432   old_loc2 = gfc_current_locus;
1433   gfc_current_locus = old_loc;
1434   
1435   if (gfc_match_parens () == MATCH_ERROR)
1436     return MATCH_ERROR;
1437
1438   gfc_current_locus = old_loc2;
1439
1440   if (gfc_match_char (')') != MATCH_YES)
1441     {
1442       gfc_error ("Syntax error in IF-expression at %C");
1443       gfc_free_expr (expr);
1444       return MATCH_ERROR;
1445     }
1446
1447   m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1448
1449   if (m == MATCH_YES)
1450     {
1451       if (n == MATCH_YES)
1452         {
1453           gfc_error ("Block label not appropriate for arithmetic IF "
1454                      "statement at %C");
1455           gfc_free_expr (expr);
1456           return MATCH_ERROR;
1457         }
1458
1459       if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1460           || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1461           || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1462         {
1463           gfc_free_expr (expr);
1464           return MATCH_ERROR;
1465         }
1466       
1467       if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent: arithmetic IF "
1468                           "statement at %C") == FAILURE)
1469         return MATCH_ERROR;
1470
1471       new_st.op = EXEC_ARITHMETIC_IF;
1472       new_st.expr1 = expr;
1473       new_st.label1 = l1;
1474       new_st.label2 = l2;
1475       new_st.label3 = l3;
1476
1477       *if_type = ST_ARITHMETIC_IF;
1478       return MATCH_YES;
1479     }
1480
1481   if (gfc_match (" then%t") == MATCH_YES)
1482     {
1483       new_st.op = EXEC_IF;
1484       new_st.expr1 = expr;
1485       *if_type = ST_IF_BLOCK;
1486       return MATCH_YES;
1487     }
1488
1489   if (n == MATCH_YES)
1490     {
1491       gfc_error ("Block label is not appropriate for IF statement at %C");
1492       gfc_free_expr (expr);
1493       return MATCH_ERROR;
1494     }
1495
1496   /* At this point the only thing left is a simple IF statement.  At
1497      this point, n has to be MATCH_NO, so we don't have to worry about
1498      re-matching a block label.  From what we've got so far, try
1499      matching an assignment.  */
1500
1501   *if_type = ST_SIMPLE_IF;
1502
1503   m = gfc_match_assignment ();
1504   if (m == MATCH_YES)
1505     goto got_match;
1506
1507   gfc_free_expr (expr);
1508   gfc_undo_symbols ();
1509   gfc_current_locus = old_loc;
1510
1511   /* m can be MATCH_NO or MATCH_ERROR, here.  For MATCH_ERROR, a mangled
1512      assignment was found.  For MATCH_NO, continue to call the various
1513      matchers.  */
1514   if (m == MATCH_ERROR)
1515     return MATCH_ERROR;
1516
1517   gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match.  */
1518
1519   m = gfc_match_pointer_assignment ();
1520   if (m == MATCH_YES)
1521     goto got_match;
1522
1523   gfc_free_expr (expr);
1524   gfc_undo_symbols ();
1525   gfc_current_locus = old_loc;
1526
1527   gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match.  */
1528
1529   /* Look at the next keyword to see which matcher to call.  Matching
1530      the keyword doesn't affect the symbol table, so we don't have to
1531      restore between tries.  */
1532
1533 #define match(string, subr, statement) \
1534   if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1535
1536   gfc_clear_error ();
1537
1538   match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1539   match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1540   match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1541   match ("call", gfc_match_call, ST_CALL)
1542   match ("close", gfc_match_close, ST_CLOSE)
1543   match ("continue", gfc_match_continue, ST_CONTINUE)
1544   match ("cycle", gfc_match_cycle, ST_CYCLE)
1545   match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1546   match ("end file", gfc_match_endfile, ST_END_FILE)
1547   match ("exit", gfc_match_exit, ST_EXIT)
1548   match ("flush", gfc_match_flush, ST_FLUSH)
1549   match ("forall", match_simple_forall, ST_FORALL)
1550   match ("go to", gfc_match_goto, ST_GOTO)
1551   match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1552   match ("inquire", gfc_match_inquire, ST_INQUIRE)
1553   match ("nullify", gfc_match_nullify, ST_NULLIFY)
1554   match ("open", gfc_match_open, ST_OPEN)
1555   match ("pause", gfc_match_pause, ST_NONE)
1556   match ("print", gfc_match_print, ST_WRITE)
1557   match ("read", gfc_match_read, ST_READ)
1558   match ("return", gfc_match_return, ST_RETURN)
1559   match ("rewind", gfc_match_rewind, ST_REWIND)
1560   match ("stop", gfc_match_stop, ST_STOP)
1561   match ("wait", gfc_match_wait, ST_WAIT)
1562   match ("where", match_simple_where, ST_WHERE)
1563   match ("write", gfc_match_write, ST_WRITE)
1564
1565   /* The gfc_match_assignment() above may have returned a MATCH_NO
1566      where the assignment was to a named constant.  Check that 
1567      special case here.  */
1568   m = gfc_match_assignment ();
1569   if (m == MATCH_NO)
1570    {
1571       gfc_error ("Cannot assign to a named constant at %C");
1572       gfc_free_expr (expr);
1573       gfc_undo_symbols ();
1574       gfc_current_locus = old_loc;
1575       return MATCH_ERROR;
1576    }
1577
1578   /* All else has failed, so give up.  See if any of the matchers has
1579      stored an error message of some sort.  */
1580   if (gfc_error_check () == 0)
1581     gfc_error ("Unclassifiable statement in IF-clause at %C");
1582
1583   gfc_free_expr (expr);
1584   return MATCH_ERROR;
1585
1586 got_match:
1587   if (m == MATCH_NO)
1588     gfc_error ("Syntax error in IF-clause at %C");
1589   if (m != MATCH_YES)
1590     {
1591       gfc_free_expr (expr);
1592       return MATCH_ERROR;
1593     }
1594
1595   /* At this point, we've matched the single IF and the action clause
1596      is in new_st.  Rearrange things so that the IF statement appears
1597      in new_st.  */
1598
1599   p = gfc_get_code ();
1600   p->next = gfc_get_code ();
1601   *p->next = new_st;
1602   p->next->loc = gfc_current_locus;
1603
1604   p->expr1 = expr;
1605   p->op = EXEC_IF;
1606
1607   gfc_clear_new_st ();
1608
1609   new_st.op = EXEC_IF;
1610   new_st.block = p;
1611
1612   return MATCH_YES;
1613 }
1614
1615 #undef match
1616
1617
1618 /* Match an ELSE statement.  */
1619
1620 match
1621 gfc_match_else (void)
1622 {
1623   char name[GFC_MAX_SYMBOL_LEN + 1];
1624
1625   if (gfc_match_eos () == MATCH_YES)
1626     return MATCH_YES;
1627
1628   if (gfc_match_name (name) != MATCH_YES
1629       || gfc_current_block () == NULL
1630       || gfc_match_eos () != MATCH_YES)
1631     {
1632       gfc_error ("Unexpected junk after ELSE statement at %C");
1633       return MATCH_ERROR;
1634     }
1635
1636   if (strcmp (name, gfc_current_block ()->name) != 0)
1637     {
1638       gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1639                  name, gfc_current_block ()->name);
1640       return MATCH_ERROR;
1641     }
1642
1643   return MATCH_YES;
1644 }
1645
1646
1647 /* Match an ELSE IF statement.  */
1648
1649 match
1650 gfc_match_elseif (void)
1651 {
1652   char name[GFC_MAX_SYMBOL_LEN + 1];
1653   gfc_expr *expr;
1654   match m;
1655
1656   m = gfc_match (" ( %e ) then", &expr);
1657   if (m != MATCH_YES)
1658     return m;
1659
1660   if (gfc_match_eos () == MATCH_YES)
1661     goto done;
1662
1663   if (gfc_match_name (name) != MATCH_YES
1664       || gfc_current_block () == NULL
1665       || gfc_match_eos () != MATCH_YES)
1666     {
1667       gfc_error ("Unexpected junk after ELSE IF statement at %C");
1668       goto cleanup;
1669     }
1670
1671   if (strcmp (name, gfc_current_block ()->name) != 0)
1672     {
1673       gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1674                  name, gfc_current_block ()->name);
1675       goto cleanup;
1676     }
1677
1678 done:
1679   new_st.op = EXEC_IF;
1680   new_st.expr1 = expr;
1681   return MATCH_YES;
1682
1683 cleanup:
1684   gfc_free_expr (expr);
1685   return MATCH_ERROR;
1686 }
1687
1688
1689 /* Free a gfc_iterator structure.  */
1690
1691 void
1692 gfc_free_iterator (gfc_iterator *iter, int flag)
1693 {
1694
1695   if (iter == NULL)
1696     return;
1697
1698   gfc_free_expr (iter->var);
1699   gfc_free_expr (iter->start);
1700   gfc_free_expr (iter->end);
1701   gfc_free_expr (iter->step);
1702
1703   if (flag)
1704     gfc_free (iter);
1705 }
1706
1707
1708 /* Match a DO statement.  */
1709
1710 match
1711 gfc_match_do (void)
1712 {
1713   gfc_iterator iter, *ip;
1714   locus old_loc;
1715   gfc_st_label *label;
1716   match m;
1717
1718   old_loc = gfc_current_locus;
1719
1720   label = NULL;
1721   iter.var = iter.start = iter.end = iter.step = NULL;
1722
1723   m = gfc_match_label ();
1724   if (m == MATCH_ERROR)
1725     return m;
1726
1727   if (gfc_match (" do") != MATCH_YES)
1728     return MATCH_NO;
1729
1730   m = gfc_match_st_label (&label);
1731   if (m == MATCH_ERROR)
1732     goto cleanup;
1733
1734   /* Match an infinite DO, make it like a DO WHILE(.TRUE.).  */
1735
1736   if (gfc_match_eos () == MATCH_YES)
1737     {
1738       iter.end = gfc_logical_expr (1, NULL);
1739       new_st.op = EXEC_DO_WHILE;
1740       goto done;
1741     }
1742
1743   /* Match an optional comma, if no comma is found, a space is obligatory.  */
1744   if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1745     return MATCH_NO;
1746
1747   /* Check for balanced parens.  */
1748   
1749   if (gfc_match_parens () == MATCH_ERROR)
1750     return MATCH_ERROR;
1751
1752   /* See if we have a DO WHILE.  */
1753   if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1754     {
1755       new_st.op = EXEC_DO_WHILE;
1756       goto done;
1757     }
1758
1759   /* The abortive DO WHILE may have done something to the symbol
1760      table, so we start over.  */
1761   gfc_undo_symbols ();
1762   gfc_current_locus = old_loc;
1763
1764   gfc_match_label ();           /* This won't error.  */
1765   gfc_match (" do ");           /* This will work.  */
1766
1767   gfc_match_st_label (&label);  /* Can't error out.  */
1768   gfc_match_char (',');         /* Optional comma.  */
1769
1770   m = gfc_match_iterator (&iter, 0);
1771   if (m == MATCH_NO)
1772     return MATCH_NO;
1773   if (m == MATCH_ERROR)
1774     goto cleanup;
1775
1776   iter.var->symtree->n.sym->attr.implied_index = 0;
1777   gfc_check_do_variable (iter.var->symtree);
1778
1779   if (gfc_match_eos () != MATCH_YES)
1780     {
1781       gfc_syntax_error (ST_DO);
1782       goto cleanup;
1783     }
1784
1785   new_st.op = EXEC_DO;
1786
1787 done:
1788   if (label != NULL
1789       && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1790     goto cleanup;
1791
1792   new_st.label1 = label;
1793
1794   if (new_st.op == EXEC_DO_WHILE)
1795     new_st.expr1 = iter.end;
1796   else
1797     {
1798       new_st.ext.iterator = ip = gfc_get_iterator ();
1799       *ip = iter;
1800     }
1801
1802   return MATCH_YES;
1803
1804 cleanup:
1805   gfc_free_iterator (&iter, 0);
1806
1807   return MATCH_ERROR;
1808 }
1809
1810
1811 /* Match an EXIT or CYCLE statement.  */
1812
1813 static match
1814 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1815 {
1816   gfc_state_data *p, *o;
1817   gfc_symbol *sym;
1818   match m;
1819
1820   if (gfc_match_eos () == MATCH_YES)
1821     sym = NULL;
1822   else
1823     {
1824       m = gfc_match ("% %s%t", &sym);
1825       if (m == MATCH_ERROR)
1826         return MATCH_ERROR;
1827       if (m == MATCH_NO)
1828         {
1829           gfc_syntax_error (st);
1830           return MATCH_ERROR;
1831         }
1832
1833       if (sym->attr.flavor != FL_LABEL)
1834         {
1835           gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1836                      sym->name, gfc_ascii_statement (st));
1837           return MATCH_ERROR;
1838         }
1839     }
1840
1841   /* Find the loop mentioned specified by the label (or lack of a label).  */
1842   for (o = NULL, p = gfc_state_stack; p; p = p->previous)
1843     if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1844       break;
1845     else if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
1846       o = p;
1847
1848   if (p == NULL)
1849     {
1850       if (sym == NULL)
1851         gfc_error ("%s statement at %C is not within a loop",
1852                    gfc_ascii_statement (st));
1853       else
1854         gfc_error ("%s statement at %C is not within loop '%s'",
1855                    gfc_ascii_statement (st), sym->name);
1856
1857       return MATCH_ERROR;
1858     }
1859
1860   if (o != NULL)
1861     {
1862       gfc_error ("%s statement at %C leaving OpenMP structured block",
1863                  gfc_ascii_statement (st));
1864       return MATCH_ERROR;
1865     }
1866   else if (st == ST_EXIT
1867            && p->previous != NULL
1868            && p->previous->state == COMP_OMP_STRUCTURED_BLOCK
1869            && (p->previous->head->op == EXEC_OMP_DO
1870                || p->previous->head->op == EXEC_OMP_PARALLEL_DO))
1871     {
1872       gcc_assert (p->previous->head->next != NULL);
1873       gcc_assert (p->previous->head->next->op == EXEC_DO
1874                   || p->previous->head->next->op == EXEC_DO_WHILE);
1875       gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
1876       return MATCH_ERROR;
1877     }
1878
1879   /* Save the first statement in the loop - needed by the backend.  */
1880   new_st.ext.whichloop = p->head;
1881
1882   new_st.op = op;
1883
1884   return MATCH_YES;
1885 }
1886
1887
1888 /* Match the EXIT statement.  */
1889
1890 match
1891 gfc_match_exit (void)
1892 {
1893   return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1894 }
1895
1896
1897 /* Match the CYCLE statement.  */
1898
1899 match
1900 gfc_match_cycle (void)
1901 {
1902   return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1903 }
1904
1905
1906 /* Match a number or character constant after a STOP or PAUSE statement.  */
1907
1908 static match
1909 gfc_match_stopcode (gfc_statement st)
1910 {
1911   int stop_code;
1912   gfc_expr *e;
1913   match m;
1914   int cnt;
1915
1916   stop_code = -1;
1917   e = NULL;
1918
1919   if (gfc_match_eos () != MATCH_YES)
1920     {
1921       m = gfc_match_small_literal_int (&stop_code, &cnt);
1922       if (m == MATCH_ERROR)
1923         goto cleanup;
1924
1925       if (m == MATCH_YES && cnt > 5)
1926         {
1927           gfc_error ("Too many digits in STOP code at %C");
1928           goto cleanup;
1929         }
1930
1931       if (m == MATCH_NO)
1932         {
1933           /* Try a character constant.  */
1934           m = gfc_match_expr (&e);
1935           if (m == MATCH_ERROR)
1936             goto cleanup;
1937           if (m == MATCH_NO)
1938             goto syntax;
1939           if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1940             goto syntax;
1941         }
1942
1943       if (gfc_match_eos () != MATCH_YES)
1944         goto syntax;
1945     }
1946
1947   if (gfc_pure (NULL))
1948     {
1949       gfc_error ("%s statement not allowed in PURE procedure at %C",
1950                  gfc_ascii_statement (st));
1951       goto cleanup;
1952     }
1953
1954   new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1955   new_st.expr1 = e;
1956   new_st.ext.stop_code = stop_code;
1957
1958   return MATCH_YES;
1959
1960 syntax:
1961   gfc_syntax_error (st);
1962
1963 cleanup:
1964
1965   gfc_free_expr (e);
1966   return MATCH_ERROR;
1967 }
1968
1969
1970 /* Match the (deprecated) PAUSE statement.  */
1971
1972 match
1973 gfc_match_pause (void)
1974 {
1975   match m;
1976
1977   m = gfc_match_stopcode (ST_PAUSE);
1978   if (m == MATCH_YES)
1979     {
1980       if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
1981           " at %C")
1982           == FAILURE)
1983         m = MATCH_ERROR;
1984     }
1985   return m;
1986 }
1987
1988
1989 /* Match the STOP statement.  */
1990
1991 match
1992 gfc_match_stop (void)
1993 {
1994   return gfc_match_stopcode (ST_STOP);
1995 }
1996
1997
1998 /* Match a CONTINUE statement.  */
1999
2000 match
2001 gfc_match_continue (void)
2002 {
2003   if (gfc_match_eos () != MATCH_YES)
2004     {
2005       gfc_syntax_error (ST_CONTINUE);
2006       return MATCH_ERROR;
2007     }
2008
2009   new_st.op = EXEC_CONTINUE;
2010   return MATCH_YES;
2011 }
2012
2013
2014 /* Match the (deprecated) ASSIGN statement.  */
2015
2016 match
2017 gfc_match_assign (void)
2018 {
2019   gfc_expr *expr;
2020   gfc_st_label *label;
2021
2022   if (gfc_match (" %l", &label) == MATCH_YES)
2023     {
2024       if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
2025         return MATCH_ERROR;
2026       if (gfc_match (" to %v%t", &expr) == MATCH_YES)
2027         {
2028           if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
2029                               "statement at %C")
2030               == FAILURE)
2031             return MATCH_ERROR;
2032
2033           expr->symtree->n.sym->attr.assign = 1;
2034
2035           new_st.op = EXEC_LABEL_ASSIGN;
2036           new_st.label1 = label;
2037           new_st.expr1 = expr;
2038           return MATCH_YES;
2039         }
2040     }
2041   return MATCH_NO;
2042 }
2043
2044
2045 /* Match the GO TO statement.  As a computed GOTO statement is
2046    matched, it is transformed into an equivalent SELECT block.  No
2047    tree is necessary, and the resulting jumps-to-jumps are
2048    specifically optimized away by the back end.  */
2049
2050 match
2051 gfc_match_goto (void)
2052 {
2053   gfc_code *head, *tail;
2054   gfc_expr *expr;
2055   gfc_case *cp;
2056   gfc_st_label *label;
2057   int i;
2058   match m;
2059
2060   if (gfc_match (" %l%t", &label) == MATCH_YES)
2061     {
2062       if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2063         return MATCH_ERROR;
2064
2065       new_st.op = EXEC_GOTO;
2066       new_st.label1 = label;
2067       return MATCH_YES;
2068     }
2069
2070   /* The assigned GO TO statement.  */ 
2071
2072   if (gfc_match_variable (&expr, 0) == MATCH_YES)
2073     {
2074       if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2075                           "statement at %C")
2076           == FAILURE)
2077         return MATCH_ERROR;
2078
2079       new_st.op = EXEC_GOTO;
2080       new_st.expr1 = expr;
2081
2082       if (gfc_match_eos () == MATCH_YES)
2083         return MATCH_YES;
2084
2085       /* Match label list.  */
2086       gfc_match_char (',');
2087       if (gfc_match_char ('(') != MATCH_YES)
2088         {
2089           gfc_syntax_error (ST_GOTO);
2090           return MATCH_ERROR;
2091         }
2092       head = tail = NULL;
2093
2094       do
2095         {
2096           m = gfc_match_st_label (&label);
2097           if (m != MATCH_YES)
2098             goto syntax;
2099
2100           if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2101             goto cleanup;
2102
2103           if (head == NULL)
2104             head = tail = gfc_get_code ();
2105           else
2106             {
2107               tail->block = gfc_get_code ();
2108               tail = tail->block;
2109             }
2110
2111           tail->label1 = label;
2112           tail->op = EXEC_GOTO;
2113         }
2114       while (gfc_match_char (',') == MATCH_YES);
2115
2116       if (gfc_match (")%t") != MATCH_YES)
2117         goto syntax;
2118
2119       if (head == NULL)
2120         {
2121            gfc_error ("Statement label list in GOTO at %C cannot be empty");
2122            goto syntax;
2123         }
2124       new_st.block = head;
2125
2126       return MATCH_YES;
2127     }
2128
2129   /* Last chance is a computed GO TO statement.  */
2130   if (gfc_match_char ('(') != MATCH_YES)
2131     {
2132       gfc_syntax_error (ST_GOTO);
2133       return MATCH_ERROR;
2134     }
2135
2136   head = tail = NULL;
2137   i = 1;
2138
2139   do
2140     {
2141       m = gfc_match_st_label (&label);
2142       if (m != MATCH_YES)
2143         goto syntax;
2144
2145       if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2146         goto cleanup;
2147
2148       if (head == NULL)
2149         head = tail = gfc_get_code ();
2150       else
2151         {
2152           tail->block = gfc_get_code ();
2153           tail = tail->block;
2154         }
2155
2156       cp = gfc_get_case ();
2157       cp->low = cp->high = gfc_int_expr (i++);
2158
2159       tail->op = EXEC_SELECT;
2160       tail->ext.case_list = cp;
2161
2162       tail->next = gfc_get_code ();
2163       tail->next->op = EXEC_GOTO;
2164       tail->next->label1 = label;
2165     }
2166   while (gfc_match_char (',') == MATCH_YES);
2167
2168   if (gfc_match_char (')') != MATCH_YES)
2169     goto syntax;
2170
2171   if (head == NULL)
2172     {
2173       gfc_error ("Statement label list in GOTO at %C cannot be empty");
2174       goto syntax;
2175     }
2176
2177   /* Get the rest of the statement.  */
2178   gfc_match_char (',');
2179
2180   if (gfc_match (" %e%t", &expr) != MATCH_YES)
2181     goto syntax;
2182
2183   /* At this point, a computed GOTO has been fully matched and an
2184      equivalent SELECT statement constructed.  */
2185
2186   new_st.op = EXEC_SELECT;
2187   new_st.expr1 = NULL;
2188
2189   /* Hack: For a "real" SELECT, the expression is in expr. We put
2190      it in expr2 so we can distinguish then and produce the correct
2191      diagnostics.  */
2192   new_st.expr2 = expr;
2193   new_st.block = head;
2194   return MATCH_YES;
2195
2196 syntax:
2197   gfc_syntax_error (ST_GOTO);
2198 cleanup:
2199   gfc_free_statements (head);
2200   return MATCH_ERROR;
2201 }
2202
2203
2204 /* Frees a list of gfc_alloc structures.  */
2205
2206 void
2207 gfc_free_alloc_list (gfc_alloc *p)
2208 {
2209   gfc_alloc *q;
2210
2211   for (; p; p = q)
2212     {
2213       q = p->next;
2214       gfc_free_expr (p->expr);
2215       gfc_free (p);
2216     }
2217 }
2218
2219
2220 /* Match an ALLOCATE statement.  */
2221
2222 match
2223 gfc_match_allocate (void)
2224 {
2225   gfc_alloc *head, *tail;
2226   gfc_expr *stat, *errmsg, *tmp;
2227   match m;
2228   bool saw_stat, saw_errmsg;
2229
2230   head = tail = NULL;
2231   stat = errmsg = tmp = NULL;
2232   saw_stat = saw_errmsg = false;
2233
2234   if (gfc_match_char ('(') != MATCH_YES)
2235     goto syntax;
2236
2237   for (;;)
2238     {
2239       if (head == NULL)
2240         head = tail = gfc_get_alloc ();
2241       else
2242         {
2243           tail->next = gfc_get_alloc ();
2244           tail = tail->next;
2245         }
2246
2247       m = gfc_match_variable (&tail->expr, 0);
2248       if (m == MATCH_NO)
2249         goto syntax;
2250       if (m == MATCH_ERROR)
2251         goto cleanup;
2252
2253       if (gfc_check_do_variable (tail->expr->symtree))
2254         goto cleanup;
2255
2256       if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2257         {
2258           gfc_error ("Bad allocate-object at %C for a PURE procedure");
2259           goto cleanup;
2260         }
2261
2262       if (tail->expr->ts.type == BT_DERIVED)
2263         tail->expr->ts.derived = gfc_use_derived (tail->expr->ts.derived);
2264
2265       /* FIXME: disable the checking on derived types and arrays.  */
2266       if (!(tail->expr->ref
2267            && (tail->expr->ref->type == REF_COMPONENT
2268                || tail->expr->ref->type == REF_ARRAY)) 
2269           && tail->expr->symtree->n.sym
2270           && !(tail->expr->symtree->n.sym->attr.allocatable
2271                || tail->expr->symtree->n.sym->attr.pointer
2272                || tail->expr->symtree->n.sym->attr.proc_pointer))
2273         {
2274           gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2275                      "or an allocatable variable");
2276           goto cleanup;
2277         }
2278
2279       if (gfc_match_char (',') != MATCH_YES)
2280         break;
2281
2282 alloc_opt_list:
2283
2284       m = gfc_match (" stat = %v", &tmp);
2285       if (m == MATCH_ERROR)
2286         goto cleanup;
2287       if (m == MATCH_YES)
2288         {
2289           if (saw_stat)
2290             {
2291               gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2292               gfc_free_expr (tmp);
2293               goto cleanup;
2294             }
2295
2296           stat = tmp;
2297           saw_stat = true;
2298
2299           if (gfc_check_do_variable (stat->symtree))
2300             goto cleanup;
2301
2302           if (gfc_match_char (',') == MATCH_YES)
2303             goto alloc_opt_list;
2304         }
2305
2306       m = gfc_match (" errmsg = %v", &tmp);
2307       if (m == MATCH_ERROR)
2308         goto cleanup;
2309       if (m == MATCH_YES)
2310         {
2311           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2312                               &tmp->where) == FAILURE)
2313             goto cleanup;
2314
2315           if (saw_errmsg)
2316             {
2317               gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2318               gfc_free_expr (tmp);
2319               goto cleanup;
2320             }
2321
2322           errmsg = tmp;
2323           saw_errmsg = true;
2324
2325           if (gfc_match_char (',') == MATCH_YES)
2326             goto alloc_opt_list;
2327         }
2328
2329         gfc_gobble_whitespace ();
2330
2331         if (gfc_peek_char () == ')')
2332           break;
2333     }
2334
2335
2336   if (gfc_match (" )%t") != MATCH_YES)
2337     goto syntax;
2338
2339   new_st.op = EXEC_ALLOCATE;
2340   new_st.expr1 = stat;
2341   new_st.expr2 = errmsg;
2342   new_st.ext.alloc_list = head;
2343
2344   return MATCH_YES;
2345
2346 syntax:
2347   gfc_syntax_error (ST_ALLOCATE);
2348
2349 cleanup:
2350   gfc_free_expr (errmsg);
2351   gfc_free_expr (stat);
2352   gfc_free_alloc_list (head);
2353   return MATCH_ERROR;
2354 }
2355
2356
2357 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
2358    a set of pointer assignments to intrinsic NULL().  */
2359
2360 match
2361 gfc_match_nullify (void)
2362 {
2363   gfc_code *tail;
2364   gfc_expr *e, *p;
2365   match m;
2366
2367   tail = NULL;
2368
2369   if (gfc_match_char ('(') != MATCH_YES)
2370     goto syntax;
2371
2372   for (;;)
2373     {
2374       m = gfc_match_variable (&p, 0);
2375       if (m == MATCH_ERROR)
2376         goto cleanup;
2377       if (m == MATCH_NO)
2378         goto syntax;
2379
2380       if (gfc_check_do_variable (p->symtree))
2381         goto cleanup;
2382
2383       if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2384         {
2385           gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2386           goto cleanup;
2387         }
2388
2389       /* build ' => NULL() '.  */
2390       e = gfc_get_expr ();
2391       e->where = gfc_current_locus;
2392       e->expr_type = EXPR_NULL;
2393       e->ts.type = BT_UNKNOWN;
2394
2395       /* Chain to list.  */
2396       if (tail == NULL)
2397         tail = &new_st;
2398       else
2399         {
2400           tail->next = gfc_get_code ();
2401           tail = tail->next;
2402         }
2403
2404       tail->op = EXEC_POINTER_ASSIGN;
2405       tail->expr1 = p;
2406       tail->expr2 = e;
2407
2408       if (gfc_match (" )%t") == MATCH_YES)
2409         break;
2410       if (gfc_match_char (',') != MATCH_YES)
2411         goto syntax;
2412     }
2413
2414   return MATCH_YES;
2415
2416 syntax:
2417   gfc_syntax_error (ST_NULLIFY);
2418
2419 cleanup:
2420   gfc_free_statements (new_st.next);
2421   new_st.next = NULL;
2422   gfc_free_expr (new_st.expr1);
2423   new_st.expr1 = NULL;
2424   gfc_free_expr (new_st.expr2);
2425   new_st.expr2 = NULL;
2426   return MATCH_ERROR;
2427 }
2428
2429
2430 /* Match a DEALLOCATE statement.  */
2431
2432 match
2433 gfc_match_deallocate (void)
2434 {
2435   gfc_alloc *head, *tail;
2436   gfc_expr *stat, *errmsg, *tmp;
2437   match m;
2438   bool saw_stat, saw_errmsg;
2439
2440   head = tail = NULL;
2441   stat = errmsg = tmp = NULL;
2442   saw_stat = saw_errmsg = false;
2443
2444   if (gfc_match_char ('(') != MATCH_YES)
2445     goto syntax;
2446
2447   for (;;)
2448     {
2449       if (head == NULL)
2450         head = tail = gfc_get_alloc ();
2451       else
2452         {
2453           tail->next = gfc_get_alloc ();
2454           tail = tail->next;
2455         }
2456
2457       m = gfc_match_variable (&tail->expr, 0);
2458       if (m == MATCH_ERROR)
2459         goto cleanup;
2460       if (m == MATCH_NO)
2461         goto syntax;
2462
2463       if (gfc_check_do_variable (tail->expr->symtree))
2464         goto cleanup;
2465
2466       if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2467         {
2468           gfc_error ("Illegal allocate-object at %C for a PURE procedure");
2469           goto cleanup;
2470         }
2471
2472       /* FIXME: disable the checking on derived types.  */
2473       if (!(tail->expr->ref
2474            && (tail->expr->ref->type == REF_COMPONENT
2475                || tail->expr->ref->type == REF_ARRAY)) 
2476           && tail->expr->symtree->n.sym
2477           && !(tail->expr->symtree->n.sym->attr.allocatable
2478                || tail->expr->symtree->n.sym->attr.pointer
2479                || tail->expr->symtree->n.sym->attr.proc_pointer))
2480         {
2481           gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2482                      "or an allocatable variable");
2483           goto cleanup;
2484         }
2485
2486       if (gfc_match_char (',') != MATCH_YES)
2487         break;
2488
2489 dealloc_opt_list:
2490
2491       m = gfc_match (" stat = %v", &tmp);
2492       if (m == MATCH_ERROR)
2493         goto cleanup;
2494       if (m == MATCH_YES)
2495         {
2496           if (saw_stat)
2497             {
2498               gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2499               gfc_free_expr (tmp);
2500               goto cleanup;
2501             }
2502
2503           stat = tmp;
2504           saw_stat = true;
2505
2506           if (gfc_check_do_variable (stat->symtree))
2507             goto cleanup;
2508
2509           if (gfc_match_char (',') == MATCH_YES)
2510             goto dealloc_opt_list;
2511         }
2512
2513       m = gfc_match (" errmsg = %v", &tmp);
2514       if (m == MATCH_ERROR)
2515         goto cleanup;
2516       if (m == MATCH_YES)
2517         {
2518           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2519                               &tmp->where) == FAILURE)
2520             goto cleanup;
2521
2522           if (saw_errmsg)
2523             {
2524               gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2525               gfc_free_expr (tmp);
2526               goto cleanup;
2527             }
2528
2529           errmsg = tmp;
2530           saw_errmsg = true;
2531
2532           if (gfc_match_char (',') == MATCH_YES)
2533             goto dealloc_opt_list;
2534         }
2535
2536         gfc_gobble_whitespace ();
2537
2538         if (gfc_peek_char () == ')')
2539           break;
2540     }
2541
2542   if (gfc_match (" )%t") != MATCH_YES)
2543     goto syntax;
2544
2545   new_st.op = EXEC_DEALLOCATE;
2546   new_st.expr1 = stat;
2547   new_st.expr2 = errmsg;
2548   new_st.ext.alloc_list = head;
2549
2550   return MATCH_YES;
2551
2552 syntax:
2553   gfc_syntax_error (ST_DEALLOCATE);
2554
2555 cleanup:
2556   gfc_free_expr (errmsg);
2557   gfc_free_expr (stat);
2558   gfc_free_alloc_list (head);
2559   return MATCH_ERROR;
2560 }
2561
2562
2563 /* Match a RETURN statement.  */
2564
2565 match
2566 gfc_match_return (void)
2567 {
2568   gfc_expr *e;
2569   match m;
2570   gfc_compile_state s;
2571
2572   e = NULL;
2573   if (gfc_match_eos () == MATCH_YES)
2574     goto done;
2575
2576   if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2577     {
2578       gfc_error ("Alternate RETURN statement at %C is only allowed within "
2579                  "a SUBROUTINE");
2580       goto cleanup;
2581     }
2582
2583   if (gfc_current_form == FORM_FREE)
2584     {
2585       /* The following are valid, so we can't require a blank after the
2586         RETURN keyword:
2587           return+1
2588           return(1)  */
2589       char c = gfc_peek_ascii_char ();
2590       if (ISALPHA (c) || ISDIGIT (c))
2591         return MATCH_NO;
2592     }
2593
2594   m = gfc_match (" %e%t", &e);
2595   if (m == MATCH_YES)
2596     goto done;
2597   if (m == MATCH_ERROR)
2598     goto cleanup;
2599
2600   gfc_syntax_error (ST_RETURN);
2601
2602 cleanup:
2603   gfc_free_expr (e);
2604   return MATCH_ERROR;
2605
2606 done:
2607   gfc_enclosing_unit (&s);
2608   if (s == COMP_PROGRAM
2609       && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2610                         "main program at %C") == FAILURE)
2611       return MATCH_ERROR;
2612
2613   new_st.op = EXEC_RETURN;
2614   new_st.expr1 = e;
2615
2616   return MATCH_YES;
2617 }
2618
2619
2620 /* Match the call of a type-bound procedure, if CALL%var has already been 
2621    matched and var found to be a derived-type variable.  */
2622
2623 static match
2624 match_typebound_call (gfc_symtree* varst)
2625 {
2626   gfc_symbol* var;
2627   gfc_expr* base;
2628   match m;
2629
2630   var = varst->n.sym;
2631
2632   base = gfc_get_expr ();
2633   base->expr_type = EXPR_VARIABLE;
2634   base->symtree = varst;
2635   base->where = gfc_current_locus;
2636   gfc_set_sym_referenced (varst->n.sym);
2637   
2638   m = gfc_match_varspec (base, 0, true, true);
2639   if (m == MATCH_NO)
2640     gfc_error ("Expected component reference at %C");
2641   if (m != MATCH_YES)
2642     return MATCH_ERROR;
2643
2644   if (gfc_match_eos () != MATCH_YES)
2645     {
2646       gfc_error ("Junk after CALL at %C");
2647       return MATCH_ERROR;
2648     }
2649
2650   if (base->expr_type == EXPR_COMPCALL)
2651     new_st.op = EXEC_COMPCALL;
2652   else if (base->expr_type == EXPR_PPC)
2653     new_st.op = EXEC_CALL_PPC;
2654   else
2655     {
2656       gfc_error ("Expected type-bound procedure or procedure pointer component "
2657                  "at %C");
2658       return MATCH_ERROR;
2659     }
2660   new_st.expr1 = base;
2661
2662   return MATCH_YES;
2663 }
2664
2665
2666 /* Match a CALL statement.  The tricky part here are possible
2667    alternate return specifiers.  We handle these by having all
2668    "subroutines" actually return an integer via a register that gives
2669    the return number.  If the call specifies alternate returns, we
2670    generate code for a SELECT statement whose case clauses contain
2671    GOTOs to the various labels.  */
2672
2673 match
2674 gfc_match_call (void)
2675 {
2676   char name[GFC_MAX_SYMBOL_LEN + 1];
2677   gfc_actual_arglist *a, *arglist;
2678   gfc_case *new_case;
2679   gfc_symbol *sym;
2680   gfc_symtree *st;
2681   gfc_code *c;
2682   match m;
2683   int i;
2684
2685   arglist = NULL;
2686
2687   m = gfc_match ("% %n", name);
2688   if (m == MATCH_NO)
2689     goto syntax;
2690   if (m != MATCH_YES)
2691     return m;
2692
2693   if (gfc_get_ha_sym_tree (name, &st))
2694     return MATCH_ERROR;
2695
2696   sym = st->n.sym;
2697
2698   /* If this is a variable of derived-type, it probably starts a type-bound
2699      procedure call.  */
2700   if (sym->attr.flavor != FL_PROCEDURE && sym->ts.type == BT_DERIVED)
2701     return match_typebound_call (st);
2702
2703   /* If it does not seem to be callable (include functions so that the
2704      right association is made.  They are thrown out in resolution.)
2705      ...  */
2706   if (!sym->attr.generic
2707         && !sym->attr.subroutine
2708         && !sym->attr.function)
2709     {
2710       if (!(sym->attr.external && !sym->attr.referenced))
2711         {
2712           /* ...create a symbol in this scope...  */
2713           if (sym->ns != gfc_current_ns
2714                 && gfc_get_sym_tree (name, NULL, &st) == 1)
2715             return MATCH_ERROR;
2716
2717           if (sym != st->n.sym)
2718             sym = st->n.sym;
2719         }
2720
2721       /* ...and then to try to make the symbol into a subroutine.  */
2722       if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2723         return MATCH_ERROR;
2724     }
2725
2726   gfc_set_sym_referenced (sym);
2727
2728   if (gfc_match_eos () != MATCH_YES)
2729     {
2730       m = gfc_match_actual_arglist (1, &arglist);
2731       if (m == MATCH_NO)
2732         goto syntax;
2733       if (m == MATCH_ERROR)
2734         goto cleanup;
2735
2736       if (gfc_match_eos () != MATCH_YES)
2737         goto syntax;
2738     }
2739
2740   /* If any alternate return labels were found, construct a SELECT
2741      statement that will jump to the right place.  */
2742
2743   i = 0;
2744   for (a = arglist; a; a = a->next)
2745     if (a->expr == NULL)
2746       i = 1;
2747
2748   if (i)
2749     {
2750       gfc_symtree *select_st;
2751       gfc_symbol *select_sym;
2752       char name[GFC_MAX_SYMBOL_LEN + 1];
2753
2754       new_st.next = c = gfc_get_code ();
2755       c->op = EXEC_SELECT;
2756       sprintf (name, "_result_%s", sym->name);
2757       gfc_get_ha_sym_tree (name, &select_st);   /* Can't fail.  */
2758
2759       select_sym = select_st->n.sym;
2760       select_sym->ts.type = BT_INTEGER;
2761       select_sym->ts.kind = gfc_default_integer_kind;
2762       gfc_set_sym_referenced (select_sym);
2763       c->expr1 = gfc_get_expr ();
2764       c->expr1->expr_type = EXPR_VARIABLE;
2765       c->expr1->symtree = select_st;
2766       c->expr1->ts = select_sym->ts;
2767       c->expr1->where = gfc_current_locus;
2768
2769       i = 0;
2770       for (a = arglist; a; a = a->next)
2771         {
2772           if (a->expr != NULL)
2773             continue;
2774
2775           if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2776             continue;
2777
2778           i++;
2779
2780           c->block = gfc_get_code ();
2781           c = c->block;
2782           c->op = EXEC_SELECT;
2783
2784           new_case = gfc_get_case ();
2785           new_case->high = new_case->low = gfc_int_expr (i);
2786           c->ext.case_list = new_case;
2787
2788           c->next = gfc_get_code ();
2789           c->next->op = EXEC_GOTO;
2790           c->next->label1 = a->label;
2791         }
2792     }
2793
2794   new_st.op = EXEC_CALL;
2795   new_st.symtree = st;
2796   new_st.ext.actual = arglist;
2797
2798   return MATCH_YES;
2799
2800 syntax:
2801   gfc_syntax_error (ST_CALL);
2802
2803 cleanup:
2804   gfc_free_actual_arglist (arglist);
2805   return MATCH_ERROR;
2806 }
2807
2808
2809 /* Given a name, return a pointer to the common head structure,
2810    creating it if it does not exist. If FROM_MODULE is nonzero, we
2811    mangle the name so that it doesn't interfere with commons defined 
2812    in the using namespace.
2813    TODO: Add to global symbol tree.  */
2814
2815 gfc_common_head *
2816 gfc_get_common (const char *name, int from_module)
2817 {
2818   gfc_symtree *st;
2819   static int serial = 0;
2820   char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
2821
2822   if (from_module)
2823     {
2824       /* A use associated common block is only needed to correctly layout
2825          the variables it contains.  */
2826       snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
2827       st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
2828     }
2829   else
2830     {
2831       st = gfc_find_symtree (gfc_current_ns->common_root, name);
2832
2833       if (st == NULL)
2834         st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2835     }
2836
2837   if (st->n.common == NULL)
2838     {
2839       st->n.common = gfc_get_common_head ();
2840       st->n.common->where = gfc_current_locus;
2841       strcpy (st->n.common->name, name);
2842     }
2843
2844   return st->n.common;
2845 }
2846
2847
2848 /* Match a common block name.  */
2849
2850 match match_common_name (char *name)
2851 {
2852   match m;
2853
2854   if (gfc_match_char ('/') == MATCH_NO)
2855     {
2856       name[0] = '\0';
2857       return MATCH_YES;
2858     }
2859
2860   if (gfc_match_char ('/') == MATCH_YES)
2861     {
2862       name[0] = '\0';
2863       return MATCH_YES;
2864     }
2865
2866   m = gfc_match_name (name);
2867
2868   if (m == MATCH_ERROR)
2869     return MATCH_ERROR;
2870   if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2871     return MATCH_YES;
2872
2873   gfc_error ("Syntax error in common block name at %C");
2874   return MATCH_ERROR;
2875 }
2876
2877
2878 /* Match a COMMON statement.  */
2879
2880 match
2881 gfc_match_common (void)
2882 {
2883   gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
2884   char name[GFC_MAX_SYMBOL_LEN + 1];
2885   gfc_common_head *t;
2886   gfc_array_spec *as;
2887   gfc_equiv *e1, *e2;
2888   match m;
2889   gfc_gsymbol *gsym;
2890
2891   old_blank_common = gfc_current_ns->blank_common.head;
2892   if (old_blank_common)
2893     {
2894       while (old_blank_common->common_next)
2895         old_blank_common = old_blank_common->common_next;
2896     }
2897
2898   as = NULL;
2899
2900   for (;;)
2901     {
2902       m = match_common_name (name);
2903       if (m == MATCH_ERROR)
2904         goto cleanup;
2905
2906       gsym = gfc_get_gsymbol (name);
2907       if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
2908         {
2909           gfc_error ("Symbol '%s' at %C is already an external symbol that "
2910                      "is not COMMON", name);
2911           goto cleanup;
2912         }
2913
2914       if (gsym->type == GSYM_UNKNOWN)
2915         {
2916           gsym->type = GSYM_COMMON;
2917           gsym->where = gfc_current_locus;
2918           gsym->defined = 1;
2919         }
2920
2921       gsym->used = 1;
2922
2923       if (name[0] == '\0')
2924         {
2925           t = &gfc_current_ns->blank_common;
2926           if (t->head == NULL)
2927             t->where = gfc_current_locus;
2928         }
2929       else
2930         {
2931           t = gfc_get_common (name, 0);
2932         }
2933       head = &t->head;
2934
2935       if (*head == NULL)
2936         tail = NULL;
2937       else
2938         {
2939           tail = *head;
2940           while (tail->common_next)
2941             tail = tail->common_next;
2942         }
2943
2944       /* Grab the list of symbols.  */
2945       for (;;)
2946         {
2947           m = gfc_match_symbol (&sym, 0);
2948           if (m == MATCH_ERROR)
2949             goto cleanup;
2950           if (m == MATCH_NO)
2951             goto syntax;
2952
2953           /* Store a ref to the common block for error checking.  */
2954           sym->common_block = t;
2955           
2956           /* See if we know the current common block is bind(c), and if
2957              so, then see if we can check if the symbol is (which it'll
2958              need to be).  This can happen if the bind(c) attr stmt was
2959              applied to the common block, and the variable(s) already
2960              defined, before declaring the common block.  */
2961           if (t->is_bind_c == 1)
2962             {
2963               if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
2964                 {
2965                   /* If we find an error, just print it and continue,
2966                      cause it's just semantic, and we can see if there
2967                      are more errors.  */
2968                   gfc_error_now ("Variable '%s' at %L in common block '%s' "
2969                                  "at %C must be declared with a C "
2970                                  "interoperable kind since common block "
2971                                  "'%s' is bind(c)",
2972                                  sym->name, &(sym->declared_at), t->name,
2973                                  t->name);
2974                 }
2975               
2976               if (sym->attr.is_bind_c == 1)
2977                 gfc_error_now ("Variable '%s' in common block "
2978                                "'%s' at %C can not be bind(c) since "
2979                                "it is not global", sym->name, t->name);
2980             }
2981           
2982           if (sym->attr.in_common)
2983             {
2984               gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2985                          sym->name);
2986               goto cleanup;
2987             }
2988
2989           if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
2990                || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
2991             {
2992               if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
2993                                                "can only be COMMON in "
2994                                                "BLOCK DATA", sym->name)
2995                   == FAILURE)
2996                 goto cleanup;
2997             }
2998
2999           if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
3000             goto cleanup;
3001
3002           if (tail != NULL)
3003             tail->common_next = sym;
3004           else
3005             *head = sym;
3006
3007           tail = sym;
3008
3009           /* Deal with an optional array specification after the
3010              symbol name.  */
3011           m = gfc_match_array_spec (&as);
3012           if (m == MATCH_ERROR)
3013             goto cleanup;
3014
3015           if (m == MATCH_YES)
3016             {
3017               if (as->type != AS_EXPLICIT)
3018                 {
3019                   gfc_error ("Array specification for symbol '%s' in COMMON "
3020                              "at %C must be explicit", sym->name);
3021                   goto cleanup;
3022                 }
3023
3024               if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3025                 goto cleanup;
3026
3027               if (sym->attr.pointer)
3028                 {
3029                   gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3030                              "POINTER array", sym->name);
3031                   goto cleanup;
3032                 }
3033
3034               sym->as = as;
3035               as = NULL;
3036
3037             }
3038
3039           sym->common_head = t;
3040
3041           /* Check to see if the symbol is already in an equivalence group.
3042              If it is, set the other members as being in common.  */
3043           if (sym->attr.in_equivalence)
3044             {
3045               for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3046                 {
3047                   for (e2 = e1; e2; e2 = e2->eq)
3048                     if (e2->expr->symtree->n.sym == sym)
3049                       goto equiv_found;
3050
3051                   continue;
3052
3053           equiv_found:
3054
3055                   for (e2 = e1; e2; e2 = e2->eq)
3056                     {
3057                       other = e2->expr->symtree->n.sym;
3058                       if (other->common_head
3059                           && other->common_head != sym->common_head)
3060                         {
3061                           gfc_error ("Symbol '%s', in COMMON block '%s' at "
3062                                      "%C is being indirectly equivalenced to "
3063                                      "another COMMON block '%s'",
3064                                      sym->name, sym->common_head->name,
3065                                      other->common_head->name);
3066                             goto cleanup;
3067                         }
3068                       other->attr.in_common = 1;
3069                       other->common_head = t;
3070                     }
3071                 }
3072             }
3073
3074
3075           gfc_gobble_whitespace ();
3076           if (gfc_match_eos () == MATCH_YES)
3077             goto done;
3078           if (gfc_peek_ascii_char () == '/')
3079             break;
3080           if (gfc_match_char (',') != MATCH_YES)
3081             goto syntax;
3082           gfc_gobble_whitespace ();
3083           if (gfc_peek_ascii_char () == '/')
3084             break;
3085         }
3086     }
3087
3088 done:
3089   return MATCH_YES;
3090
3091 syntax:
3092   gfc_syntax_error (ST_COMMON);
3093
3094 cleanup:
3095   if (old_blank_common)
3096     old_blank_common->common_next = NULL;
3097   else
3098     gfc_current_ns->blank_common.head = NULL;
3099   gfc_free_array_spec (as);
3100   return MATCH_ERROR;
3101 }
3102
3103
3104 /* Match a BLOCK DATA program unit.  */
3105
3106 match
3107 gfc_match_block_data (void)
3108 {
3109   char name[GFC_MAX_SYMBOL_LEN + 1];
3110   gfc_symbol *sym;
3111   match m;
3112
3113   if (gfc_match_eos () == MATCH_YES)
3114     {
3115       gfc_new_block = NULL;
3116       return MATCH_YES;
3117     }
3118
3119   m = gfc_match ("% %n%t", name);
3120   if (m != MATCH_YES)
3121     return MATCH_ERROR;
3122
3123   if (gfc_get_symbol (name, NULL, &sym))
3124     return MATCH_ERROR;
3125
3126   if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3127     return MATCH_ERROR;
3128
3129   gfc_new_block = sym;
3130
3131   return MATCH_YES;
3132 }
3133
3134
3135 /* Free a namelist structure.  */
3136
3137 void
3138 gfc_free_namelist (gfc_namelist *name)
3139 {
3140   gfc_namelist *n;
3141
3142   for (; name; name = n)
3143     {
3144       n = name->next;
3145       gfc_free (name);
3146     }
3147 }
3148
3149
3150 /* Match a NAMELIST statement.  */
3151
3152 match
3153 gfc_match_namelist (void)
3154 {
3155   gfc_symbol *group_name, *sym;
3156   gfc_namelist *nl;
3157   match m, m2;
3158
3159   m = gfc_match (" / %s /", &group_name);
3160   if (m == MATCH_NO)
3161     goto syntax;
3162   if (m == MATCH_ERROR)
3163     goto error;
3164
3165   for (;;)
3166     {
3167       if (group_name->ts.type != BT_UNKNOWN)
3168         {
3169           gfc_error ("Namelist group name '%s' at %C already has a basic "
3170                      "type of %s", group_name->name,
3171                      gfc_typename (&group_name->ts));
3172           return MATCH_ERROR;
3173         }
3174
3175       if (group_name->attr.flavor == FL_NAMELIST
3176           && group_name->attr.use_assoc
3177           && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3178                              "at %C already is USE associated and can"
3179                              "not be respecified.", group_name->name)
3180              == FAILURE)
3181         return MATCH_ERROR;
3182
3183       if (group_name->attr.flavor != FL_NAMELIST
3184           && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3185                              group_name->name, NULL) == FAILURE)
3186         return MATCH_ERROR;
3187
3188       for (;;)
3189         {
3190           m = gfc_match_symbol (&sym, 1);
3191           if (m == MATCH_NO)
3192             goto syntax;
3193           if (m == MATCH_ERROR)
3194             goto error;
3195
3196           if (sym->attr.in_namelist == 0
3197               && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3198             goto error;
3199
3200           /* Use gfc_error_check here, rather than goto error, so that
3201              these are the only errors for the next two lines.  */
3202           if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3203             {
3204               gfc_error ("Assumed size array '%s' in namelist '%s' at "
3205                          "%C is not allowed", sym->name, group_name->name);
3206               gfc_error_check ();
3207             }
3208
3209           if (sym->ts.type == BT_CHARACTER && sym->ts.cl->length == NULL)
3210             {
3211               gfc_error ("Assumed character length '%s' in namelist '%s' at "
3212                          "%C is not allowed", sym->name, group_name->name);
3213               gfc_error_check ();
3214             }
3215
3216           nl = gfc_get_namelist ();
3217           nl->sym = sym;
3218           sym->refs++;
3219
3220           if (group_name->namelist == NULL)
3221             group_name->namelist = group_name->namelist_tail = nl;
3222           else
3223             {
3224               group_name->namelist_tail->next = nl;
3225               group_name->namelist_tail = nl;
3226             }
3227
3228           if (gfc_match_eos () == MATCH_YES)
3229             goto done;
3230
3231           m = gfc_match_char (',');
3232
3233           if (gfc_match_char ('/') == MATCH_YES)
3234             {
3235               m2 = gfc_match (" %s /", &group_name);
3236               if (m2 == MATCH_YES)
3237                 break;
3238               if (m2 == MATCH_ERROR)
3239                 goto error;
3240               goto syntax;
3241             }
3242
3243           if (m != MATCH_YES)
3244             goto syntax;
3245         }
3246     }
3247
3248 done:
3249   return MATCH_YES;
3250
3251 syntax:
3252   gfc_syntax_error (ST_NAMELIST);
3253
3254 error:
3255   return MATCH_ERROR;
3256 }
3257
3258
3259 /* Match a MODULE statement.  */
3260
3261 match
3262 gfc_match_module (void)
3263 {
3264   match m;
3265
3266   m = gfc_match (" %s%t", &gfc_new_block);
3267   if (m != MATCH_YES)
3268     return m;
3269
3270   if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3271                       gfc_new_block->name, NULL) == FAILURE)
3272     return MATCH_ERROR;
3273
3274   return MATCH_YES;
3275 }
3276
3277
3278 /* Free equivalence sets and lists.  Recursively is the easiest way to
3279    do this.  */
3280
3281 void
3282 gfc_free_equiv (gfc_equiv *eq)
3283 {
3284   if (eq == NULL)
3285     return;
3286
3287   gfc_free_equiv (eq->eq);
3288   gfc_free_equiv (eq->next);
3289   gfc_free_expr (eq->expr);
3290   gfc_free (eq);
3291 }
3292
3293
3294 /* Match an EQUIVALENCE statement.  */
3295
3296 match
3297 gfc_match_equivalence (void)
3298 {
3299   gfc_equiv *eq, *set, *tail;
3300   gfc_ref *ref;
3301   gfc_symbol *sym;
3302   match m;
3303   gfc_common_head *common_head = NULL;
3304   bool common_flag;
3305   int cnt;
3306
3307   tail = NULL;
3308
3309   for (;;)
3310     {
3311       eq = gfc_get_equiv ();
3312       if (tail == NULL)
3313         tail = eq;
3314
3315       eq->next = gfc_current_ns->equiv;
3316       gfc_current_ns->equiv = eq;
3317
3318       if (gfc_match_char ('(') != MATCH_YES)
3319         goto syntax;
3320
3321       set = eq;
3322       common_flag = FALSE;
3323       cnt = 0;
3324
3325       for (;;)
3326         {
3327           m = gfc_match_equiv_variable (&set->expr);
3328           if (m == MATCH_ERROR)
3329             goto cleanup;
3330           if (m == MATCH_NO)
3331             goto syntax;
3332
3333           /*  count the number of objects.  */
3334           cnt++;
3335
3336           if (gfc_match_char ('%') == MATCH_YES)
3337             {
3338               gfc_error ("Derived type component %C is not a "
3339                          "permitted EQUIVALENCE member");
3340               goto cleanup;
3341             }
3342
3343           for (ref = set->expr->ref; ref; ref = ref->next)
3344             if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3345               {
3346                 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3347                            "be an array section");
3348                 goto cleanup;
3349               }
3350
3351           sym = set->expr->symtree->n.sym;
3352
3353           if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3354             goto cleanup;
3355
3356           if (sym->attr.in_common)
3357             {
3358               common_flag = TRUE;
3359               common_head = sym->common_head;
3360             }
3361
3362           if (gfc_match_char (')') == MATCH_YES)
3363             break;
3364
3365           if (gfc_match_char (',') != MATCH_YES)
3366             goto syntax;
3367
3368           set->eq = gfc_get_equiv ();
3369           set = set->eq;
3370         }
3371
3372       if (cnt < 2)
3373         {
3374           gfc_error ("EQUIVALENCE at %C requires two or more objects");
3375           goto cleanup;
3376         }
3377
3378       /* If one of the members of an equivalence is in common, then
3379          mark them all as being in common.  Before doing this, check
3380          that members of the equivalence group are not in different
3381          common blocks.  */
3382       if (common_flag)
3383         for (set = eq; set; set = set->eq)
3384           {
3385             sym = set->expr->symtree->n.sym;
3386             if (sym->common_head && sym->common_head != common_head)
3387               {
3388                 gfc_error ("Attempt to indirectly overlap COMMON "
3389                            "blocks %s and %s by EQUIVALENCE at %C",
3390                            sym->common_head->name, common_head->name);
3391                 goto cleanup;
3392               }
3393             sym->attr.in_common = 1;
3394             sym->common_head = common_head;
3395           }
3396
3397       if (gfc_match_eos () == MATCH_YES)
3398         break;
3399       if (gfc_match_char (',') != MATCH_YES)
3400         goto syntax;
3401     }
3402
3403   return MATCH_YES;
3404
3405 syntax:
3406   gfc_syntax_error (ST_EQUIVALENCE);
3407
3408 cleanup:
3409   eq = tail->next;
3410   tail->next = NULL;
3411
3412   gfc_free_equiv (gfc_current_ns->equiv);
3413   gfc_current_ns->equiv = eq;
3414
3415   return MATCH_ERROR;
3416 }
3417
3418
3419 /* Check that a statement function is not recursive. This is done by looking
3420    for the statement function symbol(sym) by looking recursively through its
3421    expression(e).  If a reference to sym is found, true is returned.  
3422    12.5.4 requires that any variable of function that is implicitly typed
3423    shall have that type confirmed by any subsequent type declaration.  The
3424    implicit typing is conveniently done here.  */
3425 static bool
3426 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3427
3428 static bool
3429 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3430 {
3431
3432   if (e == NULL)
3433     return false;
3434
3435   switch (e->expr_type)
3436     {
3437     case EXPR_FUNCTION:
3438       if (e->symtree == NULL)
3439         return false;
3440
3441       /* Check the name before testing for nested recursion!  */
3442       if (sym->name == e->symtree->n.sym->name)
3443         return true;
3444
3445       /* Catch recursion via other statement functions.  */
3446       if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3447           && e->symtree->n.sym->value
3448           && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3449         return true;
3450
3451       if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3452         gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3453
3454       break;
3455
3456     case EXPR_VARIABLE:
3457       if (e->symtree && sym->name == e->symtree->n.sym->name)
3458         return true;
3459
3460       if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3461         gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3462       break;
3463
3464     default:
3465       break;
3466     }
3467
3468   return false;
3469 }
3470
3471
3472 static bool
3473 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3474 {
3475   return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3476 }
3477
3478
3479 /* Match a statement function declaration.  It is so easy to match
3480    non-statement function statements with a MATCH_ERROR as opposed to
3481    MATCH_NO that we suppress error message in most cases.  */
3482
3483 match
3484 gfc_match_st_function (void)
3485 {
3486   gfc_error_buf old_error;
3487   gfc_symbol *sym;
3488   gfc_expr *expr;
3489   match m;
3490
3491   m = gfc_match_symbol (&sym, 0);
3492   if (m != MATCH_YES)
3493     return m;
3494
3495   gfc_push_error (&old_error);
3496
3497   if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3498                          sym->name, NULL) == FAILURE)
3499     goto undo_error;
3500
3501   if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3502     goto undo_error;
3503
3504   m = gfc_match (" = %e%t", &expr);
3505   if (m == MATCH_NO)
3506     goto undo_error;
3507
3508   gfc_free_error (&old_error);
3509   if (m == MATCH_ERROR)
3510     return m;
3511
3512   if (recursive_stmt_fcn (expr, sym))
3513     {
3514       gfc_error ("Statement function at %L is recursive", &expr->where);
3515       return MATCH_ERROR;
3516     }
3517
3518   sym->value = expr;
3519
3520   return MATCH_YES;
3521
3522 undo_error:
3523   gfc_pop_error (&old_error);
3524   return MATCH_NO;
3525 }
3526
3527
3528 /***************** SELECT CASE subroutines ******************/
3529
3530 /* Free a single case structure.  */
3531
3532 static void
3533 free_case (gfc_case *p)
3534 {
3535   if (p->low == p->high)
3536     p->high = NULL;
3537   gfc_free_expr (p->low);
3538   gfc_free_expr (p->high);
3539   gfc_free (p);
3540 }
3541
3542
3543 /* Free a list of case structures.  */
3544
3545 void
3546 gfc_free_case_list (gfc_case *p)
3547 {
3548   gfc_case *q;
3549
3550   for (; p; p = q)
3551     {
3552       q = p->next;
3553       free_case (p);
3554     }
3555 }
3556
3557
3558 /* Match a single case selector.  */
3559
3560 static match
3561 match_case_selector (gfc_case **cp)
3562 {
3563   gfc_case *c;
3564   match m;
3565
3566   c = gfc_get_case ();
3567   c->where = gfc_current_locus;
3568
3569   if (gfc_match_char (':') == MATCH_YES)
3570     {
3571       m = gfc_match_init_expr (&c->high);
3572       if (m == MATCH_NO)
3573         goto need_expr;
3574       if (m == MATCH_ERROR)
3575         goto cleanup;
3576     }
3577   else
3578     {
3579       m = gfc_match_init_expr (&c->low);
3580       if (m == MATCH_ERROR)
3581         goto cleanup;
3582       if (m == MATCH_NO)
3583         goto need_expr;
3584
3585       /* If we're not looking at a ':' now, make a range out of a single
3586          target.  Else get the upper bound for the case range.  */
3587       if (gfc_match_char (':') != MATCH_YES)
3588         c->high = c->low;
3589       else
3590         {
3591           m = gfc_match_init_expr (&c->high);
3592           if (m == MATCH_ERROR)
3593             goto cleanup;
3594           /* MATCH_NO is fine.  It's OK if nothing is there!  */
3595         }
3596     }
3597
3598   *cp = c;
3599   return MATCH_YES;
3600
3601 need_expr:
3602   gfc_error ("Expected initialization expression in CASE at %C");
3603
3604 cleanup:
3605   free_case (c);
3606   return MATCH_ERROR;
3607 }
3608
3609
3610 /* Match the end of a case statement.  */
3611
3612 static match
3613 match_case_eos (void)
3614 {
3615   char name[GFC_MAX_SYMBOL_LEN + 1];
3616   match m;
3617
3618   if (gfc_match_eos () == MATCH_YES)
3619     return MATCH_YES;
3620
3621   /* If the case construct doesn't have a case-construct-name, we
3622      should have matched the EOS.  */
3623   if (!gfc_current_block ())
3624     {
3625       gfc_error ("Expected the name of the SELECT CASE construct at %C");
3626       return MATCH_ERROR;
3627     }
3628
3629   gfc_gobble_whitespace ();
3630
3631   m = gfc_match_name (name);
3632   if (m != MATCH_YES)
3633     return m;
3634
3635   if (strcmp (name, gfc_current_block ()->name) != 0)
3636     {
3637       gfc_error ("Expected case name of '%s' at %C",
3638                  gfc_current_block ()->name);
3639       return MATCH_ERROR;
3640     }
3641
3642   return gfc_match_eos ();
3643 }
3644
3645
3646 /* Match a SELECT statement.  */
3647
3648 match
3649 gfc_match_select (void)
3650 {
3651   gfc_expr *expr;
3652   match m;
3653
3654   m = gfc_match_label ();
3655   if (m == MATCH_ERROR)
3656     return m;
3657
3658   m = gfc_match (" select case ( %e )%t", &expr);
3659   if (m != MATCH_YES)
3660     return m;
3661
3662   new_st.op = EXEC_SELECT;
3663   new_st.expr1 = expr;
3664
3665   return MATCH_YES;
3666 }
3667
3668
3669 /* Match a CASE statement.  */
3670
3671 match
3672 gfc_match_case (void)
3673 {
3674   gfc_case *c, *head, *tail;
3675   match m;
3676
3677   head = tail = NULL;
3678
3679   if (gfc_current_state () != COMP_SELECT)
3680     {
3681       gfc_error ("Unexpected CASE statement at %C");
3682       return MATCH_ERROR;
3683     }
3684
3685   if (gfc_match ("% default") == MATCH_YES)
3686     {
3687       m = match_case_eos ();
3688       if (m == MATCH_NO)
3689         goto syntax;
3690       if (m == MATCH_ERROR)
3691         goto cleanup;
3692
3693       new_st.op = EXEC_SELECT;
3694       c = gfc_get_case ();
3695       c->where = gfc_current_locus;
3696       new_st.ext.case_list = c;
3697       return MATCH_YES;
3698     }
3699
3700   if (gfc_match_char ('(') != MATCH_YES)
3701     goto syntax;
3702
3703   for (;;)
3704     {
3705       if (match_case_selector (&c) == MATCH_ERROR)
3706         goto cleanup;
3707
3708       if (head == NULL)
3709         head = c;
3710       else
3711         tail->next = c;
3712
3713       tail = c;
3714
3715       if (gfc_match_char (')') == MATCH_YES)
3716         break;
3717       if (gfc_match_char (',') != MATCH_YES)
3718         goto syntax;
3719     }
3720
3721   m = match_case_eos ();
3722   if (m == MATCH_NO)
3723     goto syntax;
3724   if (m == MATCH_ERROR)
3725     goto cleanup;
3726
3727   new_st.op = EXEC_SELECT;
3728   new_st.ext.case_list = head;
3729
3730   return MATCH_YES;
3731
3732 syntax:
3733   gfc_error ("Syntax error in CASE-specification at %C");
3734
3735 cleanup:
3736   gfc_free_case_list (head);  /* new_st is cleaned up in parse.c.  */
3737   return MATCH_ERROR;
3738 }
3739
3740 /********************* WHERE subroutines ********************/
3741
3742 /* Match the rest of a simple WHERE statement that follows an IF statement.  
3743  */
3744
3745 static match
3746 match_simple_where (void)
3747 {
3748   gfc_expr *expr;
3749   gfc_code *c;
3750   match m;
3751
3752   m = gfc_match (" ( %e )", &expr);
3753   if (m != MATCH_YES)
3754     return m;
3755
3756   m = gfc_match_assignment ();
3757   if (m == MATCH_NO)
3758     goto syntax;
3759   if (m == MATCH_ERROR)
3760     goto cleanup;
3761
3762   if (gfc_match_eos () != MATCH_YES)
3763     goto syntax;
3764
3765   c = gfc_get_code ();
3766
3767   c->op = EXEC_WHERE;
3768   c->expr1 = expr;
3769   c->next = gfc_get_code ();
3770
3771   *c->next = new_st;
3772   gfc_clear_new_st ();
3773
3774   new_st.op = EXEC_WHERE;
3775   new_st.block = c;
3776
3777   return MATCH_YES;
3778
3779 syntax:
3780   gfc_syntax_error (ST_WHERE);
3781
3782 cleanup:
3783   gfc_free_expr (expr);
3784   return MATCH_ERROR;
3785 }
3786
3787
3788 /* Match a WHERE statement.  */
3789
3790 match
3791 gfc_match_where (gfc_statement *st)
3792 {
3793   gfc_expr *expr;
3794   match m0, m;
3795   gfc_code *c;
3796
3797   m0 = gfc_match_label ();
3798   if (m0 == MATCH_ERROR)
3799     return m0;
3800
3801   m = gfc_match (" where ( %e )", &expr);
3802   if (m != MATCH_YES)
3803     return m;
3804
3805   if (gfc_match_eos () == MATCH_YES)
3806     {
3807       *st = ST_WHERE_BLOCK;
3808       new_st.op = EXEC_WHERE;
3809       new_st.expr1 = expr;
3810       return MATCH_YES;
3811     }
3812
3813   m = gfc_match_assignment ();
3814   if (m == MATCH_NO)
3815     gfc_syntax_error (ST_WHERE);
3816
3817   if (m != MATCH_YES)
3818     {
3819       gfc_free_expr (expr);
3820       return MATCH_ERROR;
3821     }
3822
3823   /* We've got a simple WHERE statement.  */
3824   *st = ST_WHERE;
3825   c = gfc_get_code ();
3826
3827   c->op = EXEC_WHERE;
3828   c->expr1 = expr;
3829   c->next = gfc_get_code ();
3830
3831   *c->next = new_st;
3832   gfc_clear_new_st ();
3833
3834   new_st.op = EXEC_WHERE;
3835   new_st.block = c;
3836
3837   return MATCH_YES;
3838 }
3839
3840
3841 /* Match an ELSEWHERE statement.  We leave behind a WHERE node in
3842    new_st if successful.  */
3843
3844 match
3845 gfc_match_elsewhere (void)
3846 {
3847   char name[GFC_MAX_SYMBOL_LEN + 1];
3848   gfc_expr *expr;
3849   match m;
3850
3851   if (gfc_current_state () != COMP_WHERE)
3852     {
3853       gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3854       return MATCH_ERROR;
3855     }
3856
3857   expr = NULL;
3858
3859   if (gfc_match_char ('(') == MATCH_YES)
3860     {
3861       m = gfc_match_expr (&expr);
3862       if (m == MATCH_NO)
3863         goto syntax;
3864       if (m == MATCH_ERROR)
3865         return MATCH_ERROR;
3866
3867       if (gfc_match_char (')') != MATCH_YES)
3868         goto syntax;
3869     }
3870
3871   if (gfc_match_eos () != MATCH_YES)
3872     {
3873       /* Only makes sense if we have a where-construct-name.  */
3874       if (!gfc_current_block ())
3875         {
3876           m = MATCH_ERROR;
3877           goto cleanup;
3878         }
3879       /* Better be a name at this point.  */
3880       m = gfc_match_name (name);
3881       if (m == MATCH_NO)
3882         goto syntax;
3883       if (m == MATCH_ERROR)
3884         goto cleanup;
3885
3886       if (gfc_match_eos () != MATCH_YES)
3887         goto syntax;
3888
3889       if (strcmp (name, gfc_current_block ()->name) != 0)
3890         {
3891           gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3892                      name, gfc_current_block ()->name);
3893           goto cleanup;
3894         }
3895     }
3896
3897   new_st.op = EXEC_WHERE;
3898   new_st.expr1 = expr;
3899   return MATCH_YES;
3900
3901 syntax:
3902   gfc_syntax_error (ST_ELSEWHERE);
3903
3904 cleanup:
3905   gfc_free_expr (expr);
3906   return MATCH_ERROR;
3907 }
3908
3909
3910 /******************** FORALL subroutines ********************/
3911
3912 /* Free a list of FORALL iterators.  */
3913
3914 void
3915 gfc_free_forall_iterator (gfc_forall_iterator *iter)
3916 {
3917   gfc_forall_iterator *next;
3918
3919   while (iter)
3920     {
3921       next = iter->next;
3922       gfc_free_expr (iter->var);
3923       gfc_free_expr (iter->start);
3924       gfc_free_expr (iter->end);
3925       gfc_free_expr (iter->stride);
3926       gfc_free (iter);
3927       iter = next;
3928     }
3929 }
3930
3931
3932 /* Match an iterator as part of a FORALL statement.  The format is:
3933
3934      <var> = <start>:<end>[:<stride>]
3935
3936    On MATCH_NO, the caller tests for the possibility that there is a
3937    scalar mask expression.  */
3938
3939 static match
3940 match_forall_iterator (gfc_forall_iterator **result)
3941 {
3942   gfc_forall_iterator *iter;
3943   locus where;
3944   match m;
3945
3946   where = gfc_current_locus;
3947   iter = XCNEW (gfc_forall_iterator);
3948
3949   m = gfc_match_expr (&iter->var);
3950   if (m != MATCH_YES)
3951     goto cleanup;
3952
3953   if (gfc_match_char ('=') != MATCH_YES
3954       || iter->var->expr_type != EXPR_VARIABLE)
3955     {
3956       m = MATCH_NO;
3957       goto cleanup;
3958     }
3959
3960   m = gfc_match_expr (&iter->start);
3961   if (m != MATCH_YES)
3962     goto cleanup;
3963
3964   if (gfc_match_char (':') != MATCH_YES)
3965     goto syntax;
3966
3967   m = gfc_match_expr (&iter->end);
3968   if (m == MATCH_NO)
3969     goto syntax;
3970   if (m == MATCH_ERROR)
3971     goto cleanup;
3972
3973   if (gfc_match_char (':') == MATCH_NO)
3974     iter->stride = gfc_int_expr (1);
3975   else
3976     {
3977       m = gfc_match_expr (&iter->stride);
3978       if (m == MATCH_NO)
3979         goto syntax;
3980       if (m == MATCH_ERROR)
3981         goto cleanup;
3982     }
3983
3984   /* Mark the iteration variable's symbol as used as a FORALL index.  */
3985   iter->var->symtree->n.sym->forall_index = true;
3986
3987   *result = iter;
3988   return MATCH_YES;
3989
3990 syntax:
3991   gfc_error ("Syntax error in FORALL iterator at %C");
3992   m = MATCH_ERROR;
3993
3994 cleanup:
3995
3996   gfc_current_locus = where;
3997   gfc_free_forall_iterator (iter);
3998   return m;
3999 }
4000
4001
4002 /* Match the header of a FORALL statement.  */
4003
4004 static match
4005 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
4006 {
4007   gfc_forall_iterator *head, *tail, *new_iter;
4008   gfc_expr *msk;
4009   match m;
4010
4011   gfc_gobble_whitespace ();
4012
4013   head = tail = NULL;
4014   msk = NULL;
4015
4016   if (gfc_match_char ('(') != MATCH_YES)
4017     return MATCH_NO;
4018
4019   m = match_forall_iterator (&new_iter);
4020   if (m == MATCH_ERROR)
4021     goto cleanup;
4022   if (m == MATCH_NO)
4023     goto syntax;
4024
4025   head = tail = new_iter;
4026
4027   for (;;)
4028     {
4029       if (gfc_match_char (',') != MATCH_YES)
4030         break;
4031
4032       m = match_forall_iterator (&new_iter);
4033       if (m == MATCH_ERROR)
4034         goto cleanup;
4035
4036       if (m == MATCH_YES)
4037         {
4038           tail->next = new_iter;
4039           tail = new_iter;
4040           continue;
4041         }
4042
4043       /* Have to have a mask expression.  */
4044
4045       m = gfc_match_expr (&msk);
4046       if (m == MATCH_NO)
4047         goto syntax;
4048       if (m == MATCH_ERROR)
4049         goto cleanup;
4050
4051       break;
4052     }
4053
4054   if (gfc_match_char (')') == MATCH_NO)
4055     goto syntax;
4056
4057   *phead = head;
4058   *mask = msk;
4059   return MATCH_YES;
4060
4061 syntax:
4062   gfc_syntax_error (ST_FORALL);
4063
4064 cleanup:
4065   gfc_free_expr (msk);
4066   gfc_free_forall_iterator (head);
4067
4068   return MATCH_ERROR;
4069 }
4070
4071 /* Match the rest of a simple FORALL statement that follows an 
4072    IF statement.  */
4073
4074 static match
4075 match_simple_forall (void)
4076 {
4077   gfc_forall_iterator *head;
4078   gfc_expr *mask;
4079   gfc_code *c;
4080   match m;
4081
4082   mask = NULL;
4083   head = NULL;
4084   c = NULL;
4085
4086   m = match_forall_header (&head, &mask);
4087
4088   if (m == MATCH_NO)
4089     goto syntax;
4090   if (m != MATCH_YES)
4091     goto cleanup;
4092
4093   m = gfc_match_assignment ();
4094
4095   if (m == MATCH_ERROR)
4096     goto cleanup;
4097   if (m == MATCH_NO)
4098     {
4099       m = gfc_match_pointer_assignment ();
4100       if (m == MATCH_ERROR)
4101         goto cleanup;
4102       if (m == MATCH_NO)
4103         goto syntax;
4104     }
4105
4106   c = gfc_get_code ();
4107   *c = new_st;
4108   c->loc = gfc_current_locus;
4109
4110   if (gfc_match_eos () != MATCH_YES)
4111     goto syntax;
4112
4113   gfc_clear_new_st ();
4114   new_st.op = EXEC_FORALL;
4115   new_st.expr1 = mask;
4116   new_st.ext.forall_iterator = head;
4117   new_st.block = gfc_get_code ();
4118
4119   new_st.block->op = EXEC_FORALL;
4120   new_st.block->next = c;
4121
4122   return MATCH_YES;
4123
4124 syntax:
4125   gfc_syntax_error (ST_FORALL);
4126
4127 cleanup:
4128   gfc_free_forall_iterator (head);
4129   gfc_free_expr (mask);
4130
4131   return MATCH_ERROR;
4132 }
4133
4134
4135 /* Match a FORALL statement.  */
4136
4137 match
4138 gfc_match_forall (gfc_statement *st)
4139 {
4140   gfc_forall_iterator *head;
4141   gfc_expr *mask;
4142   gfc_code *c;
4143   match m0, m;
4144
4145   head = NULL;
4146   mask = NULL;
4147   c = NULL;
4148
4149   m0 = gfc_match_label ();
4150   if (m0 == MATCH_ERROR)
4151     return MATCH_ERROR;
4152
4153   m = gfc_match (" forall");
4154   if (m != MATCH_YES)
4155     return m;
4156
4157   m = match_forall_header (&head, &mask);
4158   if (m == MATCH_ERROR)
4159     goto cleanup;
4160   if (m == MATCH_NO)
4161     goto syntax;
4162
4163   if (gfc_match_eos () == MATCH_YES)
4164     {
4165       *st = ST_FORALL_BLOCK;
4166       new_st.op = EXEC_FORALL;
4167       new_st.expr1 = mask;
4168       new_st.ext.forall_iterator = head;
4169       return MATCH_YES;
4170     }
4171
4172   m = gfc_match_assignment ();
4173   if (m == MATCH_ERROR)
4174     goto cleanup;
4175   if (m == MATCH_NO)
4176     {
4177       m = gfc_match_pointer_assignment ();
4178       if (m == MATCH_ERROR)
4179         goto cleanup;
4180       if (m == MATCH_NO)
4181         goto syntax;
4182     }
4183
4184   c = gfc_get_code ();
4185   *c = new_st;
4186   c->loc = gfc_current_locus;
4187
4188   gfc_clear_new_st ();
4189   new_st.op = EXEC_FORALL;
4190   new_st.expr1 = mask;
4191   new_st.ext.forall_iterator = head;
4192   new_st.block = gfc_get_code ();
4193   new_st.block->op = EXEC_FORALL;
4194   new_st.block->next = c;
4195
4196   *st = ST_FORALL;
4197   return MATCH_YES;
4198
4199 syntax:
4200   gfc_syntax_error (ST_FORALL);
4201
4202 cleanup:
4203   gfc_free_forall_iterator (head);
4204   gfc_free_expr (mask);
4205   gfc_free_statements (c);
4206   return MATCH_NO;
4207 }