OSDN Git Service

2009-08-22 Steven K. kargl <kargl@gcc.gnu.org>
[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, false))
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       || gfc_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 feature: Arithmetic IF "
1387                       "statement 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 feature: 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   if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Computed GOTO "
2184                       "at %C") == FAILURE)
2185     return MATCH_ERROR;
2186
2187   /* At this point, a computed GOTO has been fully matched and an
2188      equivalent SELECT statement constructed.  */
2189
2190   new_st.op = EXEC_SELECT;
2191   new_st.expr1 = NULL;
2192
2193   /* Hack: For a "real" SELECT, the expression is in expr. We put
2194      it in expr2 so we can distinguish then and produce the correct
2195      diagnostics.  */
2196   new_st.expr2 = expr;
2197   new_st.block = head;
2198   return MATCH_YES;
2199
2200 syntax:
2201   gfc_syntax_error (ST_GOTO);
2202 cleanup:
2203   gfc_free_statements (head);
2204   return MATCH_ERROR;
2205 }
2206
2207
2208 /* Frees a list of gfc_alloc structures.  */
2209
2210 void
2211 gfc_free_alloc_list (gfc_alloc *p)
2212 {
2213   gfc_alloc *q;
2214
2215   for (; p; p = q)
2216     {
2217       q = p->next;
2218       gfc_free_expr (p->expr);
2219       gfc_free (p);
2220     }
2221 }
2222
2223
2224 /* Match a Fortran 2003 intrinsic-type-spec.  This is a stripped
2225    down version of gfc_match_type_spec() from decl.c.  It only includes
2226    the intrinsic types from the Fortran 2003 standard.  Thus, neither
2227    BYTE nor forms like REAL*4 are allowed.  Additionally, the implicit_flag
2228    is not needed, so it was removed.  The handling of derived types has
2229    been removed and no notion of the gfc_matching_function state
2230    is needed.  In short, this functions matches only standard conforming
2231    intrinsic-type-spec (R403).  */
2232
2233 static match
2234 match_intrinsic_typespec (gfc_typespec *ts)
2235 {
2236   match m;
2237
2238   gfc_clear_ts (ts);
2239
2240   if (gfc_match ("integer") == MATCH_YES)
2241     {
2242       ts->type = BT_INTEGER;
2243       ts->kind = gfc_default_integer_kind;
2244       goto kind_selector;
2245     }
2246
2247   if (gfc_match ("real") == MATCH_YES)
2248     {
2249       ts->type = BT_REAL;
2250       ts->kind = gfc_default_real_kind;
2251       goto kind_selector;
2252     }
2253
2254   if (gfc_match ("double precision") == MATCH_YES)
2255     {
2256       ts->type = BT_REAL;
2257       ts->kind = gfc_default_double_kind;
2258       return MATCH_YES;
2259     }
2260
2261   if (gfc_match ("complex") == MATCH_YES)
2262     {
2263       ts->type = BT_COMPLEX;
2264       ts->kind = gfc_default_complex_kind;
2265       goto kind_selector;
2266     }
2267
2268   if (gfc_match ("character") == MATCH_YES)
2269     {
2270       ts->type = BT_CHARACTER;
2271       goto char_selector;
2272     }
2273
2274   if (gfc_match ("logical") == MATCH_YES)
2275     {
2276       ts->type = BT_LOGICAL;
2277       ts->kind = gfc_default_logical_kind;
2278       goto kind_selector;
2279     }
2280
2281   /* If an intrinsic type is not matched, simply return MATCH_NO.  */ 
2282   return MATCH_NO;
2283
2284 kind_selector:
2285
2286   gfc_gobble_whitespace ();
2287   if (gfc_peek_ascii_char () == '*')
2288     {
2289       gfc_error ("Invalid type-spec at %C");
2290       return MATCH_ERROR;
2291     }
2292
2293   m = gfc_match_kind_spec (ts, false);
2294
2295   if (m == MATCH_NO)
2296     m = MATCH_YES;              /* No kind specifier found.  */
2297
2298   return m;
2299
2300 char_selector:
2301
2302   m = gfc_match_char_spec (ts);
2303
2304   if (m == MATCH_NO)
2305     m = MATCH_YES;              /* No kind specifier found.  */
2306
2307   return m;
2308 }
2309
2310
2311 /* Used in gfc_match_allocate to check that a allocation-object and
2312    a source-expr are conformable.  This does not catch all possible 
2313    cases; in particular a runtime checking is needed.  */
2314
2315 static gfc_try
2316 conformable_arrays (gfc_expr *e1, gfc_expr *e2)
2317 {
2318   /* First compare rank.  */
2319   if (e2->ref && e1->rank != e2->ref->u.ar.as->rank)
2320     {
2321       gfc_error ("Source-expr at %L must be scalar or have the "
2322                  "same rank as the allocate-object at %L",
2323                  &e1->where, &e2->where);
2324       return FAILURE;
2325     }
2326
2327   if (e1->shape)
2328     {
2329       int i;
2330       mpz_t s;
2331
2332       mpz_init (s);
2333
2334       for (i = 0; i < e1->rank; i++)
2335         {
2336           if (e2->ref->u.ar.end[i])
2337             {
2338               mpz_set (s, e2->ref->u.ar.end[i]->value.integer);
2339               mpz_sub (s, s, e2->ref->u.ar.start[i]->value.integer);
2340               mpz_add_ui (s, s, 1);
2341             }
2342           else
2343             {
2344               mpz_set (s, e2->ref->u.ar.start[i]->value.integer);
2345             }
2346
2347           if (mpz_cmp (e1->shape[i], s) != 0)
2348             {
2349               gfc_error ("Source-expr at %L and allocate-object at %L must "
2350                          "have the same shape", &e1->where, &e2->where);
2351               mpz_clear (s);
2352               return FAILURE;
2353             }
2354         }
2355
2356       mpz_clear (s);
2357     }
2358
2359   return SUCCESS;
2360 }
2361
2362
2363 /* Match an ALLOCATE statement.  */
2364
2365 match
2366 gfc_match_allocate (void)
2367 {
2368   gfc_alloc *head, *tail;
2369   gfc_expr *stat, *errmsg, *tmp, *source;
2370   gfc_typespec ts;
2371   match m;
2372   locus old_locus;
2373   bool saw_stat, saw_errmsg, saw_source, b1, b2, b3;
2374
2375   head = tail = NULL;
2376   stat = errmsg = source = tmp = NULL;
2377   saw_stat = saw_errmsg = saw_source = false;
2378
2379   if (gfc_match_char ('(') != MATCH_YES)
2380     goto syntax;
2381
2382   /* Match an optional intrinsic-type-spec.  */
2383   old_locus = gfc_current_locus;
2384   m = match_intrinsic_typespec (&ts);
2385   if (m == MATCH_ERROR)
2386     goto cleanup;
2387   else if (m == MATCH_NO)
2388     ts.type = BT_UNKNOWN;
2389   else
2390     {
2391       if (gfc_match (" :: ") == MATCH_YES)
2392         {
2393           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: typespec in "
2394                               "ALLOCATE at %L", &old_locus) == FAILURE)
2395             goto cleanup;
2396         }
2397       else
2398         {
2399           ts.type = BT_UNKNOWN;
2400           gfc_current_locus = old_locus;
2401         }
2402     }
2403
2404   for (;;)
2405     {
2406       if (head == NULL)
2407         head = tail = gfc_get_alloc ();
2408       else
2409         {
2410           tail->next = gfc_get_alloc ();
2411           tail = tail->next;
2412         }
2413
2414       m = gfc_match_variable (&tail->expr, 0);
2415       if (m == MATCH_NO)
2416         goto syntax;
2417       if (m == MATCH_ERROR)
2418         goto cleanup;
2419
2420       if (gfc_check_do_variable (tail->expr->symtree))
2421         goto cleanup;
2422
2423       if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2424         {
2425           gfc_error ("Bad allocate-object at %C for a PURE procedure");
2426           goto cleanup;
2427         }
2428
2429       /* The ALLOCATE statement had an optional typespec.  Check the
2430          constraints.  */
2431       if (ts.type != BT_UNKNOWN)
2432         {
2433           /* Enforce C626.  */
2434           if (ts.type != tail->expr->ts.type)
2435             {
2436               gfc_error ("Type of entity at %L is type incompatible with "
2437                          "typespec", &tail->expr->where);
2438               goto cleanup;
2439             }
2440
2441           /* Enforce C627.  */
2442           if (ts.kind != tail->expr->ts.kind)
2443             {
2444               gfc_error ("Kind type parameter for entity at %L differs from "
2445                          "the kind type parameter of the typespec",
2446                          &tail->expr->where);
2447               goto cleanup;
2448             }
2449         }
2450
2451       if (tail->expr->ts.type == BT_DERIVED)
2452         tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
2453
2454       /* FIXME: disable the checking on derived types and arrays.  */
2455       b1 = !(tail->expr->ref
2456            && (tail->expr->ref->type == REF_COMPONENT
2457                 || tail->expr->ref->type == REF_ARRAY));
2458       b2 = tail->expr->symtree->n.sym
2459            && !(tail->expr->symtree->n.sym->attr.allocatable
2460                 || tail->expr->symtree->n.sym->attr.pointer
2461                 || tail->expr->symtree->n.sym->attr.proc_pointer);
2462       b3 = tail->expr->symtree->n.sym
2463            && tail->expr->symtree->n.sym->ns
2464            && tail->expr->symtree->n.sym->ns->proc_name
2465            && (tail->expr->symtree->n.sym->ns->proc_name->attr.allocatable
2466                 || tail->expr->symtree->n.sym->ns->proc_name->attr.pointer
2467                 || tail->expr->symtree->n.sym->ns->proc_name->attr.proc_pointer);
2468       if (b1 && b2 && !b3)
2469         {
2470           gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2471                      "or an allocatable variable");
2472           goto cleanup;
2473         }
2474
2475       if (gfc_match_char (',') != MATCH_YES)
2476         break;
2477
2478 alloc_opt_list:
2479
2480       m = gfc_match (" stat = %v", &tmp);
2481       if (m == MATCH_ERROR)
2482         goto cleanup;
2483       if (m == MATCH_YES)
2484         {
2485           /* Enforce C630.  */
2486           if (saw_stat)
2487             {
2488               gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2489               goto cleanup;
2490             }
2491
2492           stat = tmp;
2493           saw_stat = true;
2494
2495           if (gfc_check_do_variable (stat->symtree))
2496             goto cleanup;
2497
2498           if (gfc_match_char (',') == MATCH_YES)
2499             goto alloc_opt_list;
2500         }
2501
2502       m = gfc_match (" errmsg = %v", &tmp);
2503       if (m == MATCH_ERROR)
2504         goto cleanup;
2505       if (m == MATCH_YES)
2506         {
2507           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG tag at %L",
2508                               &tmp->where) == FAILURE)
2509             goto cleanup;
2510
2511           /* Enforce C630.  */
2512           if (saw_errmsg)
2513             {
2514               gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2515               goto cleanup;
2516             }
2517
2518           errmsg = tmp;
2519           saw_errmsg = true;
2520
2521           if (gfc_match_char (',') == MATCH_YES)
2522             goto alloc_opt_list;
2523         }
2524
2525       m = gfc_match (" source = %e", &tmp);
2526       if (m == MATCH_ERROR)
2527         goto cleanup;
2528       if (m == MATCH_YES)
2529         {
2530           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SOURCE tag at %L",
2531                               &tmp->where) == FAILURE)
2532             goto cleanup;
2533
2534           /* Enforce C630.  */
2535           if (saw_source)
2536             {
2537               gfc_error ("Redundant SOURCE tag found at %L ", &tmp->where);
2538               goto cleanup;
2539             }
2540
2541           /* The next 3 conditionals check C631.  */
2542           if (ts.type != BT_UNKNOWN)
2543             {
2544               gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
2545                          &tmp->where, &old_locus);
2546               goto cleanup;
2547             }
2548
2549           if (head->next)
2550             {
2551               gfc_error ("SOURCE tag at %L requires only a single entity in "
2552                          "the allocation-list", &tmp->where);
2553               goto cleanup;
2554             }
2555
2556           gfc_resolve_expr (tmp);
2557
2558           if (head->expr->ts.type != tmp->ts.type)
2559             {
2560               gfc_error ("Type of entity at %L is type incompatible with "
2561                          "source-expr at %L", &head->expr->where, &tmp->where);
2562               goto cleanup;
2563             }
2564
2565           /* Check C633.  */
2566           if (tmp->ts.kind != head->expr->ts.kind)
2567             {
2568               gfc_error ("The allocate-object at %L and the source-expr at %L "
2569                          "shall have the same kind type parameter",
2570                          &head->expr->where, &tmp->where);
2571               goto cleanup;
2572             }
2573
2574           /* Check C632 and restriction following Note 6.18.  */
2575           if (tmp->rank > 0 && conformable_arrays (tmp, head->expr) == FAILURE)
2576             goto cleanup;
2577
2578           source = tmp;
2579           saw_source = true;
2580
2581           if (gfc_match_char (',') == MATCH_YES)
2582             goto alloc_opt_list;
2583         }
2584
2585         gfc_gobble_whitespace ();
2586
2587         if (gfc_peek_char () == ')')
2588           break;
2589     }
2590
2591
2592   if (gfc_match (" )%t") != MATCH_YES)
2593     goto syntax;
2594
2595   new_st.op = EXEC_ALLOCATE;
2596   new_st.expr1 = stat;
2597   new_st.expr2 = errmsg;
2598   new_st.expr3 = source;
2599   new_st.ext.alloc_list = head;
2600
2601   return MATCH_YES;
2602
2603 syntax:
2604   gfc_syntax_error (ST_ALLOCATE);
2605
2606 cleanup:
2607   gfc_free_expr (errmsg);
2608   gfc_free_expr (source);
2609   gfc_free_expr (stat);
2610   gfc_free_expr (tmp);
2611   gfc_free_alloc_list (head);
2612   return MATCH_ERROR;
2613 }
2614
2615
2616 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
2617    a set of pointer assignments to intrinsic NULL().  */
2618
2619 match
2620 gfc_match_nullify (void)
2621 {
2622   gfc_code *tail;
2623   gfc_expr *e, *p;
2624   match m;
2625
2626   tail = NULL;
2627
2628   if (gfc_match_char ('(') != MATCH_YES)
2629     goto syntax;
2630
2631   for (;;)
2632     {
2633       m = gfc_match_variable (&p, 0);
2634       if (m == MATCH_ERROR)
2635         goto cleanup;
2636       if (m == MATCH_NO)
2637         goto syntax;
2638
2639       if (gfc_check_do_variable (p->symtree))
2640         goto cleanup;
2641
2642       if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2643         {
2644           gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2645           goto cleanup;
2646         }
2647
2648       /* build ' => NULL() '.  */
2649       e = gfc_get_expr ();
2650       e->where = gfc_current_locus;
2651       e->expr_type = EXPR_NULL;
2652       e->ts.type = BT_UNKNOWN;
2653
2654       /* Chain to list.  */
2655       if (tail == NULL)
2656         tail = &new_st;
2657       else
2658         {
2659           tail->next = gfc_get_code ();
2660           tail = tail->next;
2661         }
2662
2663       tail->op = EXEC_POINTER_ASSIGN;
2664       tail->expr1 = p;
2665       tail->expr2 = e;
2666
2667       if (gfc_match (" )%t") == MATCH_YES)
2668         break;
2669       if (gfc_match_char (',') != MATCH_YES)
2670         goto syntax;
2671     }
2672
2673   return MATCH_YES;
2674
2675 syntax:
2676   gfc_syntax_error (ST_NULLIFY);
2677
2678 cleanup:
2679   gfc_free_statements (new_st.next);
2680   new_st.next = NULL;
2681   gfc_free_expr (new_st.expr1);
2682   new_st.expr1 = NULL;
2683   gfc_free_expr (new_st.expr2);
2684   new_st.expr2 = NULL;
2685   return MATCH_ERROR;
2686 }
2687
2688
2689 /* Match a DEALLOCATE statement.  */
2690
2691 match
2692 gfc_match_deallocate (void)
2693 {
2694   gfc_alloc *head, *tail;
2695   gfc_expr *stat, *errmsg, *tmp;
2696   match m;
2697   bool saw_stat, saw_errmsg;
2698
2699   head = tail = NULL;
2700   stat = errmsg = tmp = NULL;
2701   saw_stat = saw_errmsg = false;
2702
2703   if (gfc_match_char ('(') != MATCH_YES)
2704     goto syntax;
2705
2706   for (;;)
2707     {
2708       if (head == NULL)
2709         head = tail = gfc_get_alloc ();
2710       else
2711         {
2712           tail->next = gfc_get_alloc ();
2713           tail = tail->next;
2714         }
2715
2716       m = gfc_match_variable (&tail->expr, 0);
2717       if (m == MATCH_ERROR)
2718         goto cleanup;
2719       if (m == MATCH_NO)
2720         goto syntax;
2721
2722       if (gfc_check_do_variable (tail->expr->symtree))
2723         goto cleanup;
2724
2725       if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2726         {
2727           gfc_error ("Illegal allocate-object at %C for a PURE procedure");
2728           goto cleanup;
2729         }
2730
2731       /* FIXME: disable the checking on derived types.  */
2732       if (!(tail->expr->ref
2733            && (tail->expr->ref->type == REF_COMPONENT
2734                || tail->expr->ref->type == REF_ARRAY)) 
2735           && tail->expr->symtree->n.sym
2736           && !(tail->expr->symtree->n.sym->attr.allocatable
2737                || tail->expr->symtree->n.sym->attr.pointer
2738                || tail->expr->symtree->n.sym->attr.proc_pointer))
2739         {
2740           gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2741                      "or an allocatable variable");
2742           goto cleanup;
2743         }
2744
2745       if (gfc_match_char (',') != MATCH_YES)
2746         break;
2747
2748 dealloc_opt_list:
2749
2750       m = gfc_match (" stat = %v", &tmp);
2751       if (m == MATCH_ERROR)
2752         goto cleanup;
2753       if (m == MATCH_YES)
2754         {
2755           if (saw_stat)
2756             {
2757               gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2758               gfc_free_expr (tmp);
2759               goto cleanup;
2760             }
2761
2762           stat = tmp;
2763           saw_stat = true;
2764
2765           if (gfc_check_do_variable (stat->symtree))
2766             goto cleanup;
2767
2768           if (gfc_match_char (',') == MATCH_YES)
2769             goto dealloc_opt_list;
2770         }
2771
2772       m = gfc_match (" errmsg = %v", &tmp);
2773       if (m == MATCH_ERROR)
2774         goto cleanup;
2775       if (m == MATCH_YES)
2776         {
2777           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2778                               &tmp->where) == FAILURE)
2779             goto cleanup;
2780
2781           if (saw_errmsg)
2782             {
2783               gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2784               gfc_free_expr (tmp);
2785               goto cleanup;
2786             }
2787
2788           errmsg = tmp;
2789           saw_errmsg = true;
2790
2791           if (gfc_match_char (',') == MATCH_YES)
2792             goto dealloc_opt_list;
2793         }
2794
2795         gfc_gobble_whitespace ();
2796
2797         if (gfc_peek_char () == ')')
2798           break;
2799     }
2800
2801   if (gfc_match (" )%t") != MATCH_YES)
2802     goto syntax;
2803
2804   new_st.op = EXEC_DEALLOCATE;
2805   new_st.expr1 = stat;
2806   new_st.expr2 = errmsg;
2807   new_st.ext.alloc_list = head;
2808
2809   return MATCH_YES;
2810
2811 syntax:
2812   gfc_syntax_error (ST_DEALLOCATE);
2813
2814 cleanup:
2815   gfc_free_expr (errmsg);
2816   gfc_free_expr (stat);
2817   gfc_free_alloc_list (head);
2818   return MATCH_ERROR;
2819 }
2820
2821
2822 /* Match a RETURN statement.  */
2823
2824 match
2825 gfc_match_return (void)
2826 {
2827   gfc_expr *e;
2828   match m;
2829   gfc_compile_state s;
2830
2831   e = NULL;
2832   if (gfc_match_eos () == MATCH_YES)
2833     goto done;
2834
2835   if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2836     {
2837       gfc_error ("Alternate RETURN statement at %C is only allowed within "
2838                  "a SUBROUTINE");
2839       goto cleanup;
2840     }
2841
2842   if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Alternate RETURN "
2843                       "at %C") == FAILURE)
2844     return MATCH_ERROR;
2845
2846   if (gfc_current_form == FORM_FREE)
2847     {
2848       /* The following are valid, so we can't require a blank after the
2849         RETURN keyword:
2850           return+1
2851           return(1)  */
2852       char c = gfc_peek_ascii_char ();
2853       if (ISALPHA (c) || ISDIGIT (c))
2854         return MATCH_NO;
2855     }
2856
2857   m = gfc_match (" %e%t", &e);
2858   if (m == MATCH_YES)
2859     goto done;
2860   if (m == MATCH_ERROR)
2861     goto cleanup;
2862
2863   gfc_syntax_error (ST_RETURN);
2864
2865 cleanup:
2866   gfc_free_expr (e);
2867   return MATCH_ERROR;
2868
2869 done:
2870   gfc_enclosing_unit (&s);
2871   if (s == COMP_PROGRAM
2872       && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2873                         "main program at %C") == FAILURE)
2874       return MATCH_ERROR;
2875
2876   new_st.op = EXEC_RETURN;
2877   new_st.expr1 = e;
2878
2879   return MATCH_YES;
2880 }
2881
2882
2883 /* Match the call of a type-bound procedure, if CALL%var has already been 
2884    matched and var found to be a derived-type variable.  */
2885
2886 static match
2887 match_typebound_call (gfc_symtree* varst)
2888 {
2889   gfc_symbol* var;
2890   gfc_expr* base;
2891   match m;
2892
2893   var = varst->n.sym;
2894
2895   base = gfc_get_expr ();
2896   base->expr_type = EXPR_VARIABLE;
2897   base->symtree = varst;
2898   base->where = gfc_current_locus;
2899   gfc_set_sym_referenced (varst->n.sym);
2900   
2901   m = gfc_match_varspec (base, 0, true, true);
2902   if (m == MATCH_NO)
2903     gfc_error ("Expected component reference at %C");
2904   if (m != MATCH_YES)
2905     return MATCH_ERROR;
2906
2907   if (gfc_match_eos () != MATCH_YES)
2908     {
2909       gfc_error ("Junk after CALL at %C");
2910       return MATCH_ERROR;
2911     }
2912
2913   if (base->expr_type == EXPR_COMPCALL)
2914     new_st.op = EXEC_COMPCALL;
2915   else if (base->expr_type == EXPR_PPC)
2916     new_st.op = EXEC_CALL_PPC;
2917   else
2918     {
2919       gfc_error ("Expected type-bound procedure or procedure pointer component "
2920                  "at %C");
2921       return MATCH_ERROR;
2922     }
2923   new_st.expr1 = base;
2924
2925   return MATCH_YES;
2926 }
2927
2928
2929 /* Match a CALL statement.  The tricky part here are possible
2930    alternate return specifiers.  We handle these by having all
2931    "subroutines" actually return an integer via a register that gives
2932    the return number.  If the call specifies alternate returns, we
2933    generate code for a SELECT statement whose case clauses contain
2934    GOTOs to the various labels.  */
2935
2936 match
2937 gfc_match_call (void)
2938 {
2939   char name[GFC_MAX_SYMBOL_LEN + 1];
2940   gfc_actual_arglist *a, *arglist;
2941   gfc_case *new_case;
2942   gfc_symbol *sym;
2943   gfc_symtree *st;
2944   gfc_code *c;
2945   match m;
2946   int i;
2947
2948   arglist = NULL;
2949
2950   m = gfc_match ("% %n", name);
2951   if (m == MATCH_NO)
2952     goto syntax;
2953   if (m != MATCH_YES)
2954     return m;
2955
2956   if (gfc_get_ha_sym_tree (name, &st))
2957     return MATCH_ERROR;
2958
2959   sym = st->n.sym;
2960
2961   /* If this is a variable of derived-type, it probably starts a type-bound
2962      procedure call.  */
2963   if (sym->attr.flavor != FL_PROCEDURE && sym->ts.type == BT_DERIVED)
2964     return match_typebound_call (st);
2965
2966   /* If it does not seem to be callable (include functions so that the
2967      right association is made.  They are thrown out in resolution.)
2968      ...  */
2969   if (!sym->attr.generic
2970         && !sym->attr.subroutine
2971         && !sym->attr.function)
2972     {
2973       if (!(sym->attr.external && !sym->attr.referenced))
2974         {
2975           /* ...create a symbol in this scope...  */
2976           if (sym->ns != gfc_current_ns
2977                 && gfc_get_sym_tree (name, NULL, &st, false) == 1)
2978             return MATCH_ERROR;
2979
2980           if (sym != st->n.sym)
2981             sym = st->n.sym;
2982         }
2983
2984       /* ...and then to try to make the symbol into a subroutine.  */
2985       if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2986         return MATCH_ERROR;
2987     }
2988
2989   gfc_set_sym_referenced (sym);
2990
2991   if (gfc_match_eos () != MATCH_YES)
2992     {
2993       m = gfc_match_actual_arglist (1, &arglist);
2994       if (m == MATCH_NO)
2995         goto syntax;
2996       if (m == MATCH_ERROR)
2997         goto cleanup;
2998
2999       if (gfc_match_eos () != MATCH_YES)
3000         goto syntax;
3001     }
3002
3003   /* If any alternate return labels were found, construct a SELECT
3004      statement that will jump to the right place.  */
3005
3006   i = 0;
3007   for (a = arglist; a; a = a->next)
3008     if (a->expr == NULL)
3009       i = 1;
3010
3011   if (i)
3012     {
3013       gfc_symtree *select_st;
3014       gfc_symbol *select_sym;
3015       char name[GFC_MAX_SYMBOL_LEN + 1];
3016
3017       new_st.next = c = gfc_get_code ();
3018       c->op = EXEC_SELECT;
3019       sprintf (name, "_result_%s", sym->name);
3020       gfc_get_ha_sym_tree (name, &select_st);   /* Can't fail.  */
3021
3022       select_sym = select_st->n.sym;
3023       select_sym->ts.type = BT_INTEGER;
3024       select_sym->ts.kind = gfc_default_integer_kind;
3025       gfc_set_sym_referenced (select_sym);
3026       c->expr1 = gfc_get_expr ();
3027       c->expr1->expr_type = EXPR_VARIABLE;
3028       c->expr1->symtree = select_st;
3029       c->expr1->ts = select_sym->ts;
3030       c->expr1->where = gfc_current_locus;
3031
3032       i = 0;
3033       for (a = arglist; a; a = a->next)
3034         {
3035           if (a->expr != NULL)
3036             continue;
3037
3038           if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
3039             continue;
3040
3041           i++;
3042
3043           c->block = gfc_get_code ();
3044           c = c->block;
3045           c->op = EXEC_SELECT;
3046
3047           new_case = gfc_get_case ();
3048           new_case->high = new_case->low = gfc_int_expr (i);
3049           c->ext.case_list = new_case;
3050
3051           c->next = gfc_get_code ();
3052           c->next->op = EXEC_GOTO;
3053           c->next->label1 = a->label;
3054         }
3055     }
3056
3057   new_st.op = EXEC_CALL;
3058   new_st.symtree = st;
3059   new_st.ext.actual = arglist;
3060
3061   return MATCH_YES;
3062
3063 syntax:
3064   gfc_syntax_error (ST_CALL);
3065
3066 cleanup:
3067   gfc_free_actual_arglist (arglist);
3068   return MATCH_ERROR;
3069 }
3070
3071
3072 /* Given a name, return a pointer to the common head structure,
3073    creating it if it does not exist. If FROM_MODULE is nonzero, we
3074    mangle the name so that it doesn't interfere with commons defined 
3075    in the using namespace.
3076    TODO: Add to global symbol tree.  */
3077
3078 gfc_common_head *
3079 gfc_get_common (const char *name, int from_module)
3080 {
3081   gfc_symtree *st;
3082   static int serial = 0;
3083   char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
3084
3085   if (from_module)
3086     {
3087       /* A use associated common block is only needed to correctly layout
3088          the variables it contains.  */
3089       snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
3090       st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
3091     }
3092   else
3093     {
3094       st = gfc_find_symtree (gfc_current_ns->common_root, name);
3095
3096       if (st == NULL)
3097         st = gfc_new_symtree (&gfc_current_ns->common_root, name);
3098     }
3099
3100   if (st->n.common == NULL)
3101     {
3102       st->n.common = gfc_get_common_head ();
3103       st->n.common->where = gfc_current_locus;
3104       strcpy (st->n.common->name, name);
3105     }
3106
3107   return st->n.common;
3108 }
3109
3110
3111 /* Match a common block name.  */
3112
3113 match match_common_name (char *name)
3114 {
3115   match m;
3116
3117   if (gfc_match_char ('/') == MATCH_NO)
3118     {
3119       name[0] = '\0';
3120       return MATCH_YES;
3121     }
3122
3123   if (gfc_match_char ('/') == MATCH_YES)
3124     {
3125       name[0] = '\0';
3126       return MATCH_YES;
3127     }
3128
3129   m = gfc_match_name (name);
3130
3131   if (m == MATCH_ERROR)
3132     return MATCH_ERROR;
3133   if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
3134     return MATCH_YES;
3135
3136   gfc_error ("Syntax error in common block name at %C");
3137   return MATCH_ERROR;
3138 }
3139
3140
3141 /* Match a COMMON statement.  */
3142
3143 match
3144 gfc_match_common (void)
3145 {
3146   gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
3147   char name[GFC_MAX_SYMBOL_LEN + 1];
3148   gfc_common_head *t;
3149   gfc_array_spec *as;
3150   gfc_equiv *e1, *e2;
3151   match m;
3152   gfc_gsymbol *gsym;
3153
3154   old_blank_common = gfc_current_ns->blank_common.head;
3155   if (old_blank_common)
3156     {
3157       while (old_blank_common->common_next)
3158         old_blank_common = old_blank_common->common_next;
3159     }
3160
3161   as = NULL;
3162
3163   for (;;)
3164     {
3165       m = match_common_name (name);
3166       if (m == MATCH_ERROR)
3167         goto cleanup;
3168
3169       gsym = gfc_get_gsymbol (name);
3170       if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
3171         {
3172           gfc_error ("Symbol '%s' at %C is already an external symbol that "
3173                      "is not COMMON", name);
3174           goto cleanup;
3175         }
3176
3177       if (gsym->type == GSYM_UNKNOWN)
3178         {
3179           gsym->type = GSYM_COMMON;
3180           gsym->where = gfc_current_locus;
3181           gsym->defined = 1;
3182         }
3183
3184       gsym->used = 1;
3185
3186       if (name[0] == '\0')
3187         {
3188           t = &gfc_current_ns->blank_common;
3189           if (t->head == NULL)
3190             t->where = gfc_current_locus;
3191         }
3192       else
3193         {
3194           t = gfc_get_common (name, 0);
3195         }
3196       head = &t->head;
3197
3198       if (*head == NULL)
3199         tail = NULL;
3200       else
3201         {
3202           tail = *head;
3203           while (tail->common_next)
3204             tail = tail->common_next;
3205         }
3206
3207       /* Grab the list of symbols.  */
3208       for (;;)
3209         {
3210           m = gfc_match_symbol (&sym, 0);
3211           if (m == MATCH_ERROR)
3212             goto cleanup;
3213           if (m == MATCH_NO)
3214             goto syntax;
3215
3216           /* Store a ref to the common block for error checking.  */
3217           sym->common_block = t;
3218           
3219           /* See if we know the current common block is bind(c), and if
3220              so, then see if we can check if the symbol is (which it'll
3221              need to be).  This can happen if the bind(c) attr stmt was
3222              applied to the common block, and the variable(s) already
3223              defined, before declaring the common block.  */
3224           if (t->is_bind_c == 1)
3225             {
3226               if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
3227                 {
3228                   /* If we find an error, just print it and continue,
3229                      cause it's just semantic, and we can see if there
3230                      are more errors.  */
3231                   gfc_error_now ("Variable '%s' at %L in common block '%s' "
3232                                  "at %C must be declared with a C "
3233                                  "interoperable kind since common block "
3234                                  "'%s' is bind(c)",
3235                                  sym->name, &(sym->declared_at), t->name,
3236                                  t->name);
3237                 }
3238               
3239               if (sym->attr.is_bind_c == 1)
3240                 gfc_error_now ("Variable '%s' in common block "
3241                                "'%s' at %C can not be bind(c) since "
3242                                "it is not global", sym->name, t->name);
3243             }
3244           
3245           if (sym->attr.in_common)
3246             {
3247               gfc_error ("Symbol '%s' at %C is already in a COMMON block",
3248                          sym->name);
3249               goto cleanup;
3250             }
3251
3252           if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
3253                || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
3254             {
3255               if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
3256                                                "can only be COMMON in "
3257                                                "BLOCK DATA", sym->name)
3258                   == FAILURE)
3259                 goto cleanup;
3260             }
3261
3262           if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
3263             goto cleanup;
3264
3265           if (tail != NULL)
3266             tail->common_next = sym;
3267           else
3268             *head = sym;
3269
3270           tail = sym;
3271
3272           /* Deal with an optional array specification after the
3273              symbol name.  */
3274           m = gfc_match_array_spec (&as);
3275           if (m == MATCH_ERROR)
3276             goto cleanup;
3277
3278           if (m == MATCH_YES)
3279             {
3280               if (as->type != AS_EXPLICIT)
3281                 {
3282                   gfc_error ("Array specification for symbol '%s' in COMMON "
3283                              "at %C must be explicit", sym->name);
3284                   goto cleanup;
3285                 }
3286
3287               if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3288                 goto cleanup;
3289
3290               if (sym->attr.pointer)
3291                 {
3292                   gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3293                              "POINTER array", sym->name);
3294                   goto cleanup;
3295                 }
3296
3297               sym->as = as;
3298               as = NULL;
3299
3300             }
3301
3302           sym->common_head = t;
3303
3304           /* Check to see if the symbol is already in an equivalence group.
3305              If it is, set the other members as being in common.  */
3306           if (sym->attr.in_equivalence)
3307             {
3308               for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3309                 {
3310                   for (e2 = e1; e2; e2 = e2->eq)
3311                     if (e2->expr->symtree->n.sym == sym)
3312                       goto equiv_found;
3313
3314                   continue;
3315
3316           equiv_found:
3317
3318                   for (e2 = e1; e2; e2 = e2->eq)
3319                     {
3320                       other = e2->expr->symtree->n.sym;
3321                       if (other->common_head
3322                           && other->common_head != sym->common_head)
3323                         {
3324                           gfc_error ("Symbol '%s', in COMMON block '%s' at "
3325                                      "%C is being indirectly equivalenced to "
3326                                      "another COMMON block '%s'",
3327                                      sym->name, sym->common_head->name,
3328                                      other->common_head->name);
3329                             goto cleanup;
3330                         }
3331                       other->attr.in_common = 1;
3332                       other->common_head = t;
3333                     }
3334                 }
3335             }
3336
3337
3338           gfc_gobble_whitespace ();
3339           if (gfc_match_eos () == MATCH_YES)
3340             goto done;
3341           if (gfc_peek_ascii_char () == '/')
3342             break;
3343           if (gfc_match_char (',') != MATCH_YES)
3344             goto syntax;
3345           gfc_gobble_whitespace ();
3346           if (gfc_peek_ascii_char () == '/')
3347             break;
3348         }
3349     }
3350
3351 done:
3352   return MATCH_YES;
3353
3354 syntax:
3355   gfc_syntax_error (ST_COMMON);
3356
3357 cleanup:
3358   if (old_blank_common)
3359     old_blank_common->common_next = NULL;
3360   else
3361     gfc_current_ns->blank_common.head = NULL;
3362   gfc_free_array_spec (as);
3363   return MATCH_ERROR;
3364 }
3365
3366
3367 /* Match a BLOCK DATA program unit.  */
3368
3369 match
3370 gfc_match_block_data (void)
3371 {
3372   char name[GFC_MAX_SYMBOL_LEN + 1];
3373   gfc_symbol *sym;
3374   match m;
3375
3376   if (gfc_match_eos () == MATCH_YES)
3377     {
3378       gfc_new_block = NULL;
3379       return MATCH_YES;
3380     }
3381
3382   m = gfc_match ("% %n%t", name);
3383   if (m != MATCH_YES)
3384     return MATCH_ERROR;
3385
3386   if (gfc_get_symbol (name, NULL, &sym))
3387     return MATCH_ERROR;
3388
3389   if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3390     return MATCH_ERROR;
3391
3392   gfc_new_block = sym;
3393
3394   return MATCH_YES;
3395 }
3396
3397
3398 /* Free a namelist structure.  */
3399
3400 void
3401 gfc_free_namelist (gfc_namelist *name)
3402 {
3403   gfc_namelist *n;
3404
3405   for (; name; name = n)
3406     {
3407       n = name->next;
3408       gfc_free (name);
3409     }
3410 }
3411
3412
3413 /* Match a NAMELIST statement.  */
3414
3415 match
3416 gfc_match_namelist (void)
3417 {
3418   gfc_symbol *group_name, *sym;
3419   gfc_namelist *nl;
3420   match m, m2;
3421
3422   m = gfc_match (" / %s /", &group_name);
3423   if (m == MATCH_NO)
3424     goto syntax;
3425   if (m == MATCH_ERROR)
3426     goto error;
3427
3428   for (;;)
3429     {
3430       if (group_name->ts.type != BT_UNKNOWN)
3431         {
3432           gfc_error ("Namelist group name '%s' at %C already has a basic "
3433                      "type of %s", group_name->name,
3434                      gfc_typename (&group_name->ts));
3435           return MATCH_ERROR;
3436         }
3437
3438       if (group_name->attr.flavor == FL_NAMELIST
3439           && group_name->attr.use_assoc
3440           && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3441                              "at %C already is USE associated and can"
3442                              "not be respecified.", group_name->name)
3443              == FAILURE)
3444         return MATCH_ERROR;
3445
3446       if (group_name->attr.flavor != FL_NAMELIST
3447           && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3448                              group_name->name, NULL) == FAILURE)
3449         return MATCH_ERROR;
3450
3451       for (;;)
3452         {
3453           m = gfc_match_symbol (&sym, 1);
3454           if (m == MATCH_NO)
3455             goto syntax;
3456           if (m == MATCH_ERROR)
3457             goto error;
3458
3459           if (sym->attr.in_namelist == 0
3460               && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3461             goto error;
3462
3463           /* Use gfc_error_check here, rather than goto error, so that
3464              these are the only errors for the next two lines.  */
3465           if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3466             {
3467               gfc_error ("Assumed size array '%s' in namelist '%s' at "
3468                          "%C is not allowed", sym->name, group_name->name);
3469               gfc_error_check ();
3470             }
3471
3472           if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl->length == NULL)
3473             {
3474               gfc_error ("Assumed character length '%s' in namelist '%s' at "
3475                          "%C is not allowed", sym->name, group_name->name);
3476               gfc_error_check ();
3477             }
3478
3479           nl = gfc_get_namelist ();
3480           nl->sym = sym;
3481           sym->refs++;
3482
3483           if (group_name->namelist == NULL)
3484             group_name->namelist = group_name->namelist_tail = nl;
3485           else
3486             {
3487               group_name->namelist_tail->next = nl;
3488               group_name->namelist_tail = nl;
3489             }
3490
3491           if (gfc_match_eos () == MATCH_YES)
3492             goto done;
3493
3494           m = gfc_match_char (',');
3495
3496           if (gfc_match_char ('/') == MATCH_YES)
3497             {
3498               m2 = gfc_match (" %s /", &group_name);
3499               if (m2 == MATCH_YES)
3500                 break;
3501               if (m2 == MATCH_ERROR)
3502                 goto error;
3503               goto syntax;
3504             }
3505
3506           if (m != MATCH_YES)
3507             goto syntax;
3508         }
3509     }
3510
3511 done:
3512   return MATCH_YES;
3513
3514 syntax:
3515   gfc_syntax_error (ST_NAMELIST);
3516
3517 error:
3518   return MATCH_ERROR;
3519 }
3520
3521
3522 /* Match a MODULE statement.  */
3523
3524 match
3525 gfc_match_module (void)
3526 {
3527   match m;
3528
3529   m = gfc_match (" %s%t", &gfc_new_block);
3530   if (m != MATCH_YES)
3531     return m;
3532
3533   if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3534                       gfc_new_block->name, NULL) == FAILURE)
3535     return MATCH_ERROR;
3536
3537   return MATCH_YES;
3538 }
3539
3540
3541 /* Free equivalence sets and lists.  Recursively is the easiest way to
3542    do this.  */
3543
3544 void
3545 gfc_free_equiv (gfc_equiv *eq)
3546 {
3547   if (eq == NULL)
3548     return;
3549
3550   gfc_free_equiv (eq->eq);
3551   gfc_free_equiv (eq->next);
3552   gfc_free_expr (eq->expr);
3553   gfc_free (eq);
3554 }
3555
3556
3557 /* Match an EQUIVALENCE statement.  */
3558
3559 match
3560 gfc_match_equivalence (void)
3561 {
3562   gfc_equiv *eq, *set, *tail;
3563   gfc_ref *ref;
3564   gfc_symbol *sym;
3565   match m;
3566   gfc_common_head *common_head = NULL;
3567   bool common_flag;
3568   int cnt;
3569
3570   tail = NULL;
3571
3572   for (;;)
3573     {
3574       eq = gfc_get_equiv ();
3575       if (tail == NULL)
3576         tail = eq;
3577
3578       eq->next = gfc_current_ns->equiv;
3579       gfc_current_ns->equiv = eq;
3580
3581       if (gfc_match_char ('(') != MATCH_YES)
3582         goto syntax;
3583
3584       set = eq;
3585       common_flag = FALSE;
3586       cnt = 0;
3587
3588       for (;;)
3589         {
3590           m = gfc_match_equiv_variable (&set->expr);
3591           if (m == MATCH_ERROR)
3592             goto cleanup;
3593           if (m == MATCH_NO)
3594             goto syntax;
3595
3596           /*  count the number of objects.  */
3597           cnt++;
3598
3599           if (gfc_match_char ('%') == MATCH_YES)
3600             {
3601               gfc_error ("Derived type component %C is not a "
3602                          "permitted EQUIVALENCE member");
3603               goto cleanup;
3604             }
3605
3606           for (ref = set->expr->ref; ref; ref = ref->next)
3607             if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3608               {
3609                 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3610                            "be an array section");
3611                 goto cleanup;
3612               }
3613
3614           sym = set->expr->symtree->n.sym;
3615
3616           if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3617             goto cleanup;
3618
3619           if (sym->attr.in_common)
3620             {
3621               common_flag = TRUE;
3622               common_head = sym->common_head;
3623             }
3624
3625           if (gfc_match_char (')') == MATCH_YES)
3626             break;
3627
3628           if (gfc_match_char (',') != MATCH_YES)
3629             goto syntax;
3630
3631           set->eq = gfc_get_equiv ();
3632           set = set->eq;
3633         }
3634
3635       if (cnt < 2)
3636         {
3637           gfc_error ("EQUIVALENCE at %C requires two or more objects");
3638           goto cleanup;
3639         }
3640
3641       /* If one of the members of an equivalence is in common, then
3642          mark them all as being in common.  Before doing this, check
3643          that members of the equivalence group are not in different
3644          common blocks.  */
3645       if (common_flag)
3646         for (set = eq; set; set = set->eq)
3647           {
3648             sym = set->expr->symtree->n.sym;
3649             if (sym->common_head && sym->common_head != common_head)
3650               {
3651                 gfc_error ("Attempt to indirectly overlap COMMON "
3652                            "blocks %s and %s by EQUIVALENCE at %C",
3653                            sym->common_head->name, common_head->name);
3654                 goto cleanup;
3655               }
3656             sym->attr.in_common = 1;
3657             sym->common_head = common_head;
3658           }
3659
3660       if (gfc_match_eos () == MATCH_YES)
3661         break;
3662       if (gfc_match_char (',') != MATCH_YES)
3663         goto syntax;
3664     }
3665
3666   return MATCH_YES;
3667
3668 syntax:
3669   gfc_syntax_error (ST_EQUIVALENCE);
3670
3671 cleanup:
3672   eq = tail->next;
3673   tail->next = NULL;
3674
3675   gfc_free_equiv (gfc_current_ns->equiv);
3676   gfc_current_ns->equiv = eq;
3677
3678   return MATCH_ERROR;
3679 }
3680
3681
3682 /* Check that a statement function is not recursive. This is done by looking
3683    for the statement function symbol(sym) by looking recursively through its
3684    expression(e).  If a reference to sym is found, true is returned.  
3685    12.5.4 requires that any variable of function that is implicitly typed
3686    shall have that type confirmed by any subsequent type declaration.  The
3687    implicit typing is conveniently done here.  */
3688 static bool
3689 recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3690
3691 static bool
3692 check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3693 {
3694
3695   if (e == NULL)
3696     return false;
3697
3698   switch (e->expr_type)
3699     {
3700     case EXPR_FUNCTION:
3701       if (e->symtree == NULL)
3702         return false;
3703
3704       /* Check the name before testing for nested recursion!  */
3705       if (sym->name == e->symtree->n.sym->name)
3706         return true;
3707
3708       /* Catch recursion via other statement functions.  */
3709       if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3710           && e->symtree->n.sym->value
3711           && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3712         return true;
3713
3714       if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3715         gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3716
3717       break;
3718
3719     case EXPR_VARIABLE:
3720       if (e->symtree && sym->name == e->symtree->n.sym->name)
3721         return true;
3722
3723       if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3724         gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3725       break;
3726
3727     default:
3728       break;
3729     }
3730
3731   return false;
3732 }
3733
3734
3735 static bool
3736 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3737 {
3738   return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3739 }
3740
3741
3742 /* Match a statement function declaration.  It is so easy to match
3743    non-statement function statements with a MATCH_ERROR as opposed to
3744    MATCH_NO that we suppress error message in most cases.  */
3745
3746 match
3747 gfc_match_st_function (void)
3748 {
3749   gfc_error_buf old_error;
3750   gfc_symbol *sym;
3751   gfc_expr *expr;
3752   match m;
3753
3754   m = gfc_match_symbol (&sym, 0);
3755   if (m != MATCH_YES)
3756     return m;
3757
3758   gfc_push_error (&old_error);
3759
3760   if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3761                          sym->name, NULL) == FAILURE)
3762     goto undo_error;
3763
3764   if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3765     goto undo_error;
3766
3767   m = gfc_match (" = %e%t", &expr);
3768   if (m == MATCH_NO)
3769     goto undo_error;
3770
3771   gfc_free_error (&old_error);
3772   if (m == MATCH_ERROR)
3773     return m;
3774
3775   if (recursive_stmt_fcn (expr, sym))
3776     {
3777       gfc_error ("Statement function at %L is recursive", &expr->where);
3778       return MATCH_ERROR;
3779     }
3780
3781   sym->value = expr;
3782
3783   if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
3784                       "Statement function at %C") == FAILURE)
3785     return MATCH_ERROR;
3786
3787   return MATCH_YES;
3788
3789 undo_error:
3790   gfc_pop_error (&old_error);
3791   return MATCH_NO;
3792 }
3793
3794
3795 /***************** SELECT CASE subroutines ******************/
3796
3797 /* Free a single case structure.  */
3798
3799 static void
3800 free_case (gfc_case *p)
3801 {
3802   if (p->low == p->high)
3803     p->high = NULL;
3804   gfc_free_expr (p->low);
3805   gfc_free_expr (p->high);
3806   gfc_free (p);
3807 }
3808
3809
3810 /* Free a list of case structures.  */
3811
3812 void
3813 gfc_free_case_list (gfc_case *p)
3814 {
3815   gfc_case *q;
3816
3817   for (; p; p = q)
3818     {
3819       q = p->next;
3820       free_case (p);
3821     }
3822 }
3823
3824
3825 /* Match a single case selector.  */
3826
3827 static match
3828 match_case_selector (gfc_case **cp)
3829 {
3830   gfc_case *c;
3831   match m;
3832
3833   c = gfc_get_case ();
3834   c->where = gfc_current_locus;
3835
3836   if (gfc_match_char (':') == MATCH_YES)
3837     {
3838       m = gfc_match_init_expr (&c->high);
3839       if (m == MATCH_NO)
3840         goto need_expr;
3841       if (m == MATCH_ERROR)
3842         goto cleanup;
3843     }
3844   else
3845     {
3846       m = gfc_match_init_expr (&c->low);
3847       if (m == MATCH_ERROR)
3848         goto cleanup;
3849       if (m == MATCH_NO)
3850         goto need_expr;
3851
3852       /* If we're not looking at a ':' now, make a range out of a single
3853          target.  Else get the upper bound for the case range.  */
3854       if (gfc_match_char (':') != MATCH_YES)
3855         c->high = c->low;
3856       else
3857         {
3858           m = gfc_match_init_expr (&c->high);
3859           if (m == MATCH_ERROR)
3860             goto cleanup;
3861           /* MATCH_NO is fine.  It's OK if nothing is there!  */
3862         }
3863     }
3864
3865   *cp = c;
3866   return MATCH_YES;
3867
3868 need_expr:
3869   gfc_error ("Expected initialization expression in CASE at %C");
3870
3871 cleanup:
3872   free_case (c);
3873   return MATCH_ERROR;
3874 }
3875
3876
3877 /* Match the end of a case statement.  */
3878
3879 static match
3880 match_case_eos (void)
3881 {
3882   char name[GFC_MAX_SYMBOL_LEN + 1];
3883   match m;
3884
3885   if (gfc_match_eos () == MATCH_YES)
3886     return MATCH_YES;
3887
3888   /* If the case construct doesn't have a case-construct-name, we
3889      should have matched the EOS.  */
3890   if (!gfc_current_block ())
3891     {
3892       gfc_error ("Expected the name of the SELECT CASE construct at %C");
3893       return MATCH_ERROR;
3894     }
3895
3896   gfc_gobble_whitespace ();
3897
3898   m = gfc_match_name (name);
3899   if (m != MATCH_YES)
3900     return m;
3901
3902   if (strcmp (name, gfc_current_block ()->name) != 0)
3903     {
3904       gfc_error ("Expected case name of '%s' at %C",
3905                  gfc_current_block ()->name);
3906       return MATCH_ERROR;
3907     }
3908
3909   return gfc_match_eos ();
3910 }
3911
3912
3913 /* Match a SELECT statement.  */
3914
3915 match
3916 gfc_match_select (void)
3917 {
3918   gfc_expr *expr;
3919   match m;
3920
3921   m = gfc_match_label ();
3922   if (m == MATCH_ERROR)
3923     return m;
3924
3925   m = gfc_match (" select case ( %e )%t", &expr);
3926   if (m != MATCH_YES)
3927     return m;
3928
3929   new_st.op = EXEC_SELECT;
3930   new_st.expr1 = expr;
3931
3932   return MATCH_YES;
3933 }
3934
3935
3936 /* Match a CASE statement.  */
3937
3938 match
3939 gfc_match_case (void)
3940 {
3941   gfc_case *c, *head, *tail;
3942   match m;
3943
3944   head = tail = NULL;
3945
3946   if (gfc_current_state () != COMP_SELECT)
3947     {
3948       gfc_error ("Unexpected CASE statement at %C");
3949       return MATCH_ERROR;
3950     }
3951
3952   if (gfc_match ("% default") == MATCH_YES)
3953     {
3954       m = match_case_eos ();
3955       if (m == MATCH_NO)
3956         goto syntax;
3957       if (m == MATCH_ERROR)
3958         goto cleanup;
3959
3960       new_st.op = EXEC_SELECT;
3961       c = gfc_get_case ();
3962       c->where = gfc_current_locus;
3963       new_st.ext.case_list = c;
3964       return MATCH_YES;
3965     }
3966
3967   if (gfc_match_char ('(') != MATCH_YES)
3968     goto syntax;
3969
3970   for (;;)
3971     {
3972       if (match_case_selector (&c) == MATCH_ERROR)
3973         goto cleanup;
3974
3975       if (head == NULL)
3976         head = c;
3977       else
3978         tail->next = c;
3979
3980       tail = c;
3981
3982       if (gfc_match_char (')') == MATCH_YES)
3983         break;
3984       if (gfc_match_char (',') != MATCH_YES)
3985         goto syntax;
3986     }
3987
3988   m = match_case_eos ();
3989   if (m == MATCH_NO)
3990     goto syntax;
3991   if (m == MATCH_ERROR)
3992     goto cleanup;
3993
3994   new_st.op = EXEC_SELECT;
3995   new_st.ext.case_list = head;
3996
3997   return MATCH_YES;
3998
3999 syntax:
4000   gfc_error ("Syntax error in CASE-specification at %C");
4001
4002 cleanup:
4003   gfc_free_case_list (head);  /* new_st is cleaned up in parse.c.  */
4004   return MATCH_ERROR;
4005 }
4006
4007 /********************* WHERE subroutines ********************/
4008
4009 /* Match the rest of a simple WHERE statement that follows an IF statement.  
4010  */
4011
4012 static match
4013 match_simple_where (void)
4014 {
4015   gfc_expr *expr;
4016   gfc_code *c;
4017   match m;
4018
4019   m = gfc_match (" ( %e )", &expr);
4020   if (m != MATCH_YES)
4021     return m;
4022
4023   m = gfc_match_assignment ();
4024   if (m == MATCH_NO)
4025     goto syntax;
4026   if (m == MATCH_ERROR)
4027     goto cleanup;
4028
4029   if (gfc_match_eos () != MATCH_YES)
4030     goto syntax;
4031
4032   c = gfc_get_code ();
4033
4034   c->op = EXEC_WHERE;
4035   c->expr1 = expr;
4036   c->next = gfc_get_code ();
4037
4038   *c->next = new_st;
4039   gfc_clear_new_st ();
4040
4041   new_st.op = EXEC_WHERE;
4042   new_st.block = c;
4043
4044   return MATCH_YES;
4045
4046 syntax:
4047   gfc_syntax_error (ST_WHERE);
4048
4049 cleanup:
4050   gfc_free_expr (expr);
4051   return MATCH_ERROR;
4052 }
4053
4054
4055 /* Match a WHERE statement.  */
4056
4057 match
4058 gfc_match_where (gfc_statement *st)
4059 {
4060   gfc_expr *expr;
4061   match m0, m;
4062   gfc_code *c;
4063
4064   m0 = gfc_match_label ();
4065   if (m0 == MATCH_ERROR)
4066     return m0;
4067
4068   m = gfc_match (" where ( %e )", &expr);
4069   if (m != MATCH_YES)
4070     return m;
4071
4072   if (gfc_match_eos () == MATCH_YES)
4073     {
4074       *st = ST_WHERE_BLOCK;
4075       new_st.op = EXEC_WHERE;
4076       new_st.expr1 = expr;
4077       return MATCH_YES;
4078     }
4079
4080   m = gfc_match_assignment ();
4081   if (m == MATCH_NO)
4082     gfc_syntax_error (ST_WHERE);
4083
4084   if (m != MATCH_YES)
4085     {
4086       gfc_free_expr (expr);
4087       return MATCH_ERROR;
4088     }
4089
4090   /* We've got a simple WHERE statement.  */
4091   *st = ST_WHERE;
4092   c = gfc_get_code ();
4093
4094   c->op = EXEC_WHERE;
4095   c->expr1 = expr;
4096   c->next = gfc_get_code ();
4097
4098   *c->next = new_st;
4099   gfc_clear_new_st ();
4100
4101   new_st.op = EXEC_WHERE;
4102   new_st.block = c;
4103
4104   return MATCH_YES;
4105 }
4106
4107
4108 /* Match an ELSEWHERE statement.  We leave behind a WHERE node in
4109    new_st if successful.  */
4110
4111 match
4112 gfc_match_elsewhere (void)
4113 {
4114   char name[GFC_MAX_SYMBOL_LEN + 1];
4115   gfc_expr *expr;
4116   match m;
4117
4118   if (gfc_current_state () != COMP_WHERE)
4119     {
4120       gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
4121       return MATCH_ERROR;
4122     }
4123
4124   expr = NULL;
4125
4126   if (gfc_match_char ('(') == MATCH_YES)
4127     {
4128       m = gfc_match_expr (&expr);
4129       if (m == MATCH_NO)
4130         goto syntax;
4131       if (m == MATCH_ERROR)
4132         return MATCH_ERROR;
4133
4134       if (gfc_match_char (')') != MATCH_YES)
4135         goto syntax;
4136     }
4137
4138   if (gfc_match_eos () != MATCH_YES)
4139     {
4140       /* Only makes sense if we have a where-construct-name.  */
4141       if (!gfc_current_block ())
4142         {
4143           m = MATCH_ERROR;
4144           goto cleanup;
4145         }
4146       /* Better be a name at this point.  */
4147       m = gfc_match_name (name);
4148       if (m == MATCH_NO)
4149         goto syntax;
4150       if (m == MATCH_ERROR)
4151         goto cleanup;
4152
4153       if (gfc_match_eos () != MATCH_YES)
4154         goto syntax;
4155
4156       if (strcmp (name, gfc_current_block ()->name) != 0)
4157         {
4158           gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
4159                      name, gfc_current_block ()->name);
4160           goto cleanup;
4161         }
4162     }
4163
4164   new_st.op = EXEC_WHERE;
4165   new_st.expr1 = expr;
4166   return MATCH_YES;
4167
4168 syntax:
4169   gfc_syntax_error (ST_ELSEWHERE);
4170
4171 cleanup:
4172   gfc_free_expr (expr);
4173   return MATCH_ERROR;
4174 }
4175
4176
4177 /******************** FORALL subroutines ********************/
4178
4179 /* Free a list of FORALL iterators.  */
4180
4181 void
4182 gfc_free_forall_iterator (gfc_forall_iterator *iter)
4183 {
4184   gfc_forall_iterator *next;
4185
4186   while (iter)
4187     {
4188       next = iter->next;
4189       gfc_free_expr (iter->var);
4190       gfc_free_expr (iter->start);
4191       gfc_free_expr (iter->end);
4192       gfc_free_expr (iter->stride);
4193       gfc_free (iter);
4194       iter = next;
4195     }
4196 }
4197
4198
4199 /* Match an iterator as part of a FORALL statement.  The format is:
4200
4201      <var> = <start>:<end>[:<stride>]
4202
4203    On MATCH_NO, the caller tests for the possibility that there is a
4204    scalar mask expression.  */
4205
4206 static match
4207 match_forall_iterator (gfc_forall_iterator **result)
4208 {
4209   gfc_forall_iterator *iter;
4210   locus where;
4211   match m;
4212
4213   where = gfc_current_locus;
4214   iter = XCNEW (gfc_forall_iterator);
4215
4216   m = gfc_match_expr (&iter->var);
4217   if (m != MATCH_YES)
4218     goto cleanup;
4219
4220   if (gfc_match_char ('=') != MATCH_YES
4221       || iter->var->expr_type != EXPR_VARIABLE)
4222     {
4223       m = MATCH_NO;
4224       goto cleanup;
4225     }
4226
4227   m = gfc_match_expr (&iter->start);
4228   if (m != MATCH_YES)
4229     goto cleanup;
4230
4231   if (gfc_match_char (':') != MATCH_YES)
4232     goto syntax;
4233
4234   m = gfc_match_expr (&iter->end);
4235   if (m == MATCH_NO)
4236     goto syntax;
4237   if (m == MATCH_ERROR)
4238     goto cleanup;
4239
4240   if (gfc_match_char (':') == MATCH_NO)
4241     iter->stride = gfc_int_expr (1);
4242   else
4243     {
4244       m = gfc_match_expr (&iter->stride);
4245       if (m == MATCH_NO)
4246         goto syntax;
4247       if (m == MATCH_ERROR)
4248         goto cleanup;
4249     }
4250
4251   /* Mark the iteration variable's symbol as used as a FORALL index.  */
4252   iter->var->symtree->n.sym->forall_index = true;
4253
4254   *result = iter;
4255   return MATCH_YES;
4256
4257 syntax:
4258   gfc_error ("Syntax error in FORALL iterator at %C");
4259   m = MATCH_ERROR;
4260
4261 cleanup:
4262
4263   gfc_current_locus = where;
4264   gfc_free_forall_iterator (iter);
4265   return m;
4266 }
4267
4268
4269 /* Match the header of a FORALL statement.  */
4270
4271 static match
4272 match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
4273 {
4274   gfc_forall_iterator *head, *tail, *new_iter;
4275   gfc_expr *msk;
4276   match m;
4277
4278   gfc_gobble_whitespace ();
4279
4280   head = tail = NULL;
4281   msk = NULL;
4282
4283   if (gfc_match_char ('(') != MATCH_YES)
4284     return MATCH_NO;
4285
4286   m = match_forall_iterator (&new_iter);
4287   if (m == MATCH_ERROR)
4288     goto cleanup;
4289   if (m == MATCH_NO)
4290     goto syntax;
4291
4292   head = tail = new_iter;
4293
4294   for (;;)
4295     {
4296       if (gfc_match_char (',') != MATCH_YES)
4297         break;
4298
4299       m = match_forall_iterator (&new_iter);
4300       if (m == MATCH_ERROR)
4301         goto cleanup;
4302
4303       if (m == MATCH_YES)
4304         {
4305           tail->next = new_iter;
4306           tail = new_iter;
4307           continue;
4308         }
4309
4310       /* Have to have a mask expression.  */
4311
4312       m = gfc_match_expr (&msk);
4313       if (m == MATCH_NO)
4314         goto syntax;
4315       if (m == MATCH_ERROR)
4316         goto cleanup;
4317
4318       break;
4319     }
4320
4321   if (gfc_match_char (')') == MATCH_NO)
4322     goto syntax;
4323
4324   *phead = head;
4325   *mask = msk;
4326   return MATCH_YES;
4327
4328 syntax:
4329   gfc_syntax_error (ST_FORALL);
4330
4331 cleanup:
4332   gfc_free_expr (msk);
4333   gfc_free_forall_iterator (head);
4334
4335   return MATCH_ERROR;
4336 }
4337
4338 /* Match the rest of a simple FORALL statement that follows an 
4339    IF statement.  */
4340
4341 static match
4342 match_simple_forall (void)
4343 {
4344   gfc_forall_iterator *head;
4345   gfc_expr *mask;
4346   gfc_code *c;
4347   match m;
4348
4349   mask = NULL;
4350   head = NULL;
4351   c = NULL;
4352
4353   m = match_forall_header (&head, &mask);
4354
4355   if (m == MATCH_NO)
4356     goto syntax;
4357   if (m != MATCH_YES)
4358     goto cleanup;
4359
4360   m = gfc_match_assignment ();
4361
4362   if (m == MATCH_ERROR)
4363     goto cleanup;
4364   if (m == MATCH_NO)
4365     {
4366       m = gfc_match_pointer_assignment ();
4367       if (m == MATCH_ERROR)
4368         goto cleanup;
4369       if (m == MATCH_NO)
4370         goto syntax;
4371     }
4372
4373   c = gfc_get_code ();
4374   *c = new_st;
4375   c->loc = gfc_current_locus;
4376
4377   if (gfc_match_eos () != MATCH_YES)
4378     goto syntax;
4379
4380   gfc_clear_new_st ();
4381   new_st.op = EXEC_FORALL;
4382   new_st.expr1 = mask;
4383   new_st.ext.forall_iterator = head;
4384   new_st.block = gfc_get_code ();
4385
4386   new_st.block->op = EXEC_FORALL;
4387   new_st.block->next = c;
4388
4389   return MATCH_YES;
4390
4391 syntax:
4392   gfc_syntax_error (ST_FORALL);
4393
4394 cleanup:
4395   gfc_free_forall_iterator (head);
4396   gfc_free_expr (mask);
4397
4398   return MATCH_ERROR;
4399 }
4400
4401
4402 /* Match a FORALL statement.  */
4403
4404 match
4405 gfc_match_forall (gfc_statement *st)
4406 {
4407   gfc_forall_iterator *head;
4408   gfc_expr *mask;
4409   gfc_code *c;
4410   match m0, m;
4411
4412   head = NULL;
4413   mask = NULL;
4414   c = NULL;
4415
4416   m0 = gfc_match_label ();
4417   if (m0 == MATCH_ERROR)
4418     return MATCH_ERROR;
4419
4420   m = gfc_match (" forall");
4421   if (m != MATCH_YES)
4422     return m;
4423
4424   m = match_forall_header (&head, &mask);
4425   if (m == MATCH_ERROR)
4426     goto cleanup;
4427   if (m == MATCH_NO)
4428     goto syntax;
4429
4430   if (gfc_match_eos () == MATCH_YES)
4431     {
4432       *st = ST_FORALL_BLOCK;
4433       new_st.op = EXEC_FORALL;
4434       new_st.expr1 = mask;
4435       new_st.ext.forall_iterator = head;
4436       return MATCH_YES;
4437     }
4438
4439   m = gfc_match_assignment ();
4440   if (m == MATCH_ERROR)
4441     goto cleanup;
4442   if (m == MATCH_NO)
4443     {
4444       m = gfc_match_pointer_assignment ();
4445       if (m == MATCH_ERROR)
4446         goto cleanup;
4447       if (m == MATCH_NO)
4448         goto syntax;
4449     }
4450
4451   c = gfc_get_code ();
4452   *c = new_st;
4453   c->loc = gfc_current_locus;
4454
4455   gfc_clear_new_st ();
4456   new_st.op = EXEC_FORALL;
4457   new_st.expr1 = mask;
4458   new_st.ext.forall_iterator = head;
4459   new_st.block = gfc_get_code ();
4460   new_st.block->op = EXEC_FORALL;
4461   new_st.block->next = c;
4462
4463   *st = ST_FORALL;
4464   return MATCH_YES;
4465
4466 syntax:
4467   gfc_syntax_error (ST_FORALL);
4468
4469 cleanup:
4470   gfc_free_forall_iterator (head);
4471   gfc_free_expr (mask);
4472   gfc_free_statements (c);
4473   return MATCH_NO;
4474 }