OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / fortran / io.c
1 /* Deal with I/O statements & related stuff.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3    2009, 2010
4    Free Software Foundation, Inc.
5    Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "match.h"
28 #include "parse.h"
29
30 gfc_st_label
31 format_asterisk = {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL,
32                    0, {NULL, NULL}};
33
34 typedef struct
35 {
36   const char *name, *spec, *value;
37   bt type;
38 }
39 io_tag;
40
41 static const io_tag
42         tag_file        = {"FILE", " file =", " %e", BT_CHARACTER },
43         tag_status      = {"STATUS", " status =", " %e", BT_CHARACTER},
44         tag_e_access    = {"ACCESS", " access =", " %e", BT_CHARACTER},
45         tag_e_form      = {"FORM", " form =", " %e", BT_CHARACTER},
46         tag_e_recl      = {"RECL", " recl =", " %e", BT_INTEGER},
47         tag_e_blank     = {"BLANK", " blank =", " %e", BT_CHARACTER},
48         tag_e_position  = {"POSITION", " position =", " %e", BT_CHARACTER},
49         tag_e_action    = {"ACTION", " action =", " %e", BT_CHARACTER},
50         tag_e_delim     = {"DELIM", " delim =", " %e", BT_CHARACTER},
51         tag_e_pad       = {"PAD", " pad =", " %e", BT_CHARACTER},
52         tag_e_decimal   = {"DECIMAL", " decimal =", " %e", BT_CHARACTER},
53         tag_e_encoding  = {"ENCODING", " encoding =", " %e", BT_CHARACTER},
54         tag_e_async     = {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER},
55         tag_e_round     = {"ROUND", " round =", " %e", BT_CHARACTER},
56         tag_e_sign      = {"SIGN", " sign =", " %e", BT_CHARACTER},
57         tag_unit        = {"UNIT", " unit =", " %e", BT_INTEGER},
58         tag_advance     = {"ADVANCE", " advance =", " %e", BT_CHARACTER},
59         tag_rec         = {"REC", " rec =", " %e", BT_INTEGER},
60         tag_spos        = {"POSITION", " pos =", " %e", BT_INTEGER},
61         tag_format      = {"FORMAT", NULL, NULL, BT_CHARACTER},
62         tag_iomsg       = {"IOMSG", " iomsg =", " %e", BT_CHARACTER},
63         tag_iostat      = {"IOSTAT", " iostat =", " %v", BT_INTEGER},
64         tag_size        = {"SIZE", " size =", " %v", BT_INTEGER},
65         tag_exist       = {"EXIST", " exist =", " %v", BT_LOGICAL},
66         tag_opened      = {"OPENED", " opened =", " %v", BT_LOGICAL},
67         tag_named       = {"NAMED", " named =", " %v", BT_LOGICAL},
68         tag_name        = {"NAME", " name =", " %v", BT_CHARACTER},
69         tag_number      = {"NUMBER", " number =", " %v", BT_INTEGER},
70         tag_s_access    = {"ACCESS", " access =", " %v", BT_CHARACTER},
71         tag_sequential  = {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER},
72         tag_direct      = {"DIRECT", " direct =", " %v", BT_CHARACTER},
73         tag_s_form      = {"FORM", " form =", " %v", BT_CHARACTER},
74         tag_formatted   = {"FORMATTED", " formatted =", " %v", BT_CHARACTER},
75         tag_unformatted = {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER},
76         tag_s_recl      = {"RECL", " recl =", " %v", BT_INTEGER},
77         tag_nextrec     = {"NEXTREC", " nextrec =", " %v", BT_INTEGER},
78         tag_s_blank     = {"BLANK", " blank =", " %v", BT_CHARACTER},
79         tag_s_position  = {"POSITION", " position =", " %v", BT_CHARACTER},
80         tag_s_action    = {"ACTION", " action =", " %v", BT_CHARACTER},
81         tag_read        = {"READ", " read =", " %v", BT_CHARACTER},
82         tag_write       = {"WRITE", " write =", " %v", BT_CHARACTER},
83         tag_readwrite   = {"READWRITE", " readwrite =", " %v", BT_CHARACTER},
84         tag_s_delim     = {"DELIM", " delim =", " %v", BT_CHARACTER},
85         tag_s_pad       = {"PAD", " pad =", " %v", BT_CHARACTER},
86         tag_s_decimal   = {"DECIMAL", " decimal =", " %v", BT_CHARACTER},
87         tag_s_encoding  = {"ENCODING", " encoding =", " %v", BT_CHARACTER},
88         tag_s_async     = {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER},
89         tag_s_round     = {"ROUND", " round =", " %v", BT_CHARACTER},
90         tag_s_sign      = {"SIGN", " sign =", " %v", BT_CHARACTER},
91         tag_iolength    = {"IOLENGTH", " iolength =", " %v", BT_INTEGER},
92         tag_convert     = {"CONVERT", " convert =", " %e", BT_CHARACTER},
93         tag_strm_out    = {"POS", " pos =", " %v", BT_INTEGER},
94         tag_err         = {"ERR", " err =", " %l", BT_UNKNOWN},
95         tag_end         = {"END", " end =", " %l", BT_UNKNOWN},
96         tag_eor         = {"EOR", " eor =", " %l", BT_UNKNOWN},
97         tag_id          = {"ID", " id =", " %v", BT_INTEGER},
98         tag_pending     = {"PENDING", " pending =", " %v", BT_LOGICAL},
99         tag_newunit     = {"NEWUNIT", " newunit =", " %v", BT_INTEGER};
100
101 static gfc_dt *current_dt;
102
103 #define RESOLVE_TAG(x, y) if (resolve_tag(x, y) == FAILURE) return FAILURE;
104
105
106 /**************** Fortran 95 FORMAT parser  *****************/
107
108 /* FORMAT tokens returned by format_lex().  */
109 typedef enum
110 {
111   FMT_NONE, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
112   FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_LPAREN,
113   FMT_RPAREN, FMT_X, FMT_SIGN, FMT_BLANK, FMT_CHAR, FMT_P, FMT_IBOZ, FMT_F,
114   FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END,
115   FMT_ERROR, FMT_DC, FMT_DP, FMT_T, FMT_TR, FMT_TL, FMT_STAR, FMT_RC,
116   FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ
117 }
118 format_token;
119
120 /* Local variables for checking format strings.  The saved_token is
121    used to back up by a single format token during the parsing
122    process.  */
123 static gfc_char_t *format_string;
124 static int format_string_pos;
125 static int format_length, use_last_char;
126 static char error_element;
127 static locus format_locus;
128
129 static format_token saved_token;
130
131 static enum
132 { MODE_STRING, MODE_FORMAT, MODE_COPY }
133 mode;
134
135
136 /* Return the next character in the format string.  */
137
138 static char
139 next_char (int in_string)
140 {
141   static gfc_char_t c;
142
143   if (use_last_char)
144     {
145       use_last_char = 0;
146       return c;
147     }
148
149   format_length++;
150
151   if (mode == MODE_STRING)
152     c = *format_string++;
153   else
154     {
155       c = gfc_next_char_literal (in_string);
156       if (c == '\n')
157         c = '\0';
158     }
159
160   if (gfc_option.flag_backslash && c == '\\')
161     {
162       locus old_locus = gfc_current_locus;
163
164       if (gfc_match_special_char (&c) == MATCH_NO)
165         gfc_current_locus = old_locus;
166
167       if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
168         gfc_warning ("Extension: backslash character at %C");
169     }
170
171   if (mode == MODE_COPY)
172     *format_string++ = c;
173
174   if (mode != MODE_STRING)
175     format_locus = gfc_current_locus;
176
177   format_string_pos++;
178
179   c = gfc_wide_toupper (c);
180   return c;
181 }
182
183
184 /* Back up one character position.  Only works once.  */
185
186 static void
187 unget_char (void)
188 {
189   use_last_char = 1;
190 }
191
192 /* Eat up the spaces and return a character.  */
193
194 static char
195 next_char_not_space (bool *error)
196 {
197   char c;
198   do
199     {
200       error_element = c = next_char (0);
201       if (c == '\t')
202         {
203           if (gfc_option.allow_std & GFC_STD_GNU)
204             gfc_warning ("Extension: Tab character in format at %C");
205           else
206             {
207               gfc_error ("Extension: Tab character in format at %C");
208               *error = true;
209               return c;
210             }
211         }
212     }
213   while (gfc_is_whitespace (c));
214   return c;
215 }
216
217 static int value = 0;
218
219 /* Simple lexical analyzer for getting the next token in a FORMAT
220    statement.  */
221
222 static format_token
223 format_lex (void)
224 {
225   format_token token;
226   char c, delim;
227   int zflag;
228   int negative_flag;
229   bool error = false;
230
231   if (saved_token != FMT_NONE)
232     {
233       token = saved_token;
234       saved_token = FMT_NONE;
235       return token;
236     }
237
238   c = next_char_not_space (&error);
239   
240   negative_flag = 0;
241   switch (c)
242     {
243     case '-':
244       negative_flag = 1;
245     case '+':
246       c = next_char_not_space (&error);
247       if (!ISDIGIT (c))
248         {
249           token = FMT_UNKNOWN;
250           break;
251         }
252
253       value = c - '0';
254
255       do
256         {
257           c = next_char_not_space (&error);
258           if (ISDIGIT (c))
259             value = 10 * value + c - '0';
260         }
261       while (ISDIGIT (c));
262
263       unget_char ();
264
265       if (negative_flag)
266         value = -value;
267
268       token = FMT_SIGNED_INT;
269       break;
270
271     case '0':
272     case '1':
273     case '2':
274     case '3':
275     case '4':
276     case '5':
277     case '6':
278     case '7':
279     case '8':
280     case '9':
281       zflag = (c == '0');
282
283       value = c - '0';
284
285       do
286         {
287           c = next_char_not_space (&error);
288           if (ISDIGIT (c))
289             {
290               value = 10 * value + c - '0';
291               if (c != '0')
292                 zflag = 0;
293             }
294         }
295       while (ISDIGIT (c));
296
297       unget_char ();
298       token = zflag ? FMT_ZERO : FMT_POSINT;
299       break;
300
301     case '.':
302       token = FMT_PERIOD;
303       break;
304
305     case ',':
306       token = FMT_COMMA;
307       break;
308
309     case ':':
310       token = FMT_COLON;
311       break;
312
313     case '/':
314       token = FMT_SLASH;
315       break;
316
317     case '$':
318       token = FMT_DOLLAR;
319       break;
320
321     case 'T':
322       c = next_char_not_space (&error);
323       switch (c)
324         {
325         case 'L':
326           token = FMT_TL;
327           break;
328         case 'R':
329           token = FMT_TR;
330           break;
331         default:
332           token = FMT_T;
333           unget_char ();
334         }
335       break;
336
337     case '(':
338       token = FMT_LPAREN;
339       break;
340
341     case ')':
342       token = FMT_RPAREN;
343       break;
344
345     case 'X':
346       token = FMT_X;
347       break;
348
349     case 'S':
350       c = next_char_not_space (&error);
351       if (c != 'P' && c != 'S')
352         unget_char ();
353
354       token = FMT_SIGN;
355       break;
356
357     case 'B':
358       c = next_char_not_space (&error);
359       if (c == 'N' || c == 'Z')
360         token = FMT_BLANK;
361       else
362         {
363           unget_char ();
364           token = FMT_IBOZ;
365         }
366
367       break;
368
369     case '\'':
370     case '"':
371       delim = c;
372
373       value = 0;
374
375       for (;;)
376         {
377           c = next_char (1);
378           if (c == '\0')
379             {
380               token = FMT_END;
381               break;
382             }
383
384           if (c == delim)
385             {
386               c = next_char (1);
387
388               if (c == '\0')
389                 {
390                   token = FMT_END;
391                   break;
392                 }
393
394               if (c != delim)
395                 {
396                   unget_char ();
397                   token = FMT_CHAR;
398                   break;
399                 }
400             }
401           value++;
402         }
403       break;
404
405     case 'P':
406       token = FMT_P;
407       break;
408
409     case 'I':
410     case 'O':
411     case 'Z':
412       token = FMT_IBOZ;
413       break;
414
415     case 'F':
416       token = FMT_F;
417       break;
418
419     case 'E':
420       c = next_char_not_space (&error);
421       if (c == 'N' )
422         token = FMT_EN;
423       else if (c == 'S')
424         token = FMT_ES;
425       else
426         {
427           token = FMT_E;
428           unget_char ();
429         }
430
431       break;
432
433     case 'G':
434       token = FMT_G;
435       break;
436
437     case 'H':
438       token = FMT_H;
439       break;
440
441     case 'L':
442       token = FMT_L;
443       break;
444
445     case 'A':
446       token = FMT_A;
447       break;
448
449     case 'D':
450       c = next_char_not_space (&error);
451       if (c == 'P')
452         {
453           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DP format "
454               "specifier not allowed at %C") == FAILURE)
455             return FMT_ERROR;
456           token = FMT_DP;
457         }
458       else if (c == 'C')
459         {
460           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DC format "
461               "specifier not allowed at %C") == FAILURE)
462             return FMT_ERROR;
463           token = FMT_DC;
464         }
465       else
466         {
467           token = FMT_D;
468           unget_char ();
469         }
470       break;
471
472     case 'R':
473       c = next_char_not_space (&error);
474       switch (c)
475         {
476         case 'C':
477           token = FMT_RC;
478           break;
479         case 'D':
480           token = FMT_RD;
481           break;
482         case 'N':
483           token = FMT_RN;
484           break;
485         case 'P':
486           token = FMT_RP;
487           break;
488         case 'U':
489           token = FMT_RU;
490           break;
491         case 'Z':
492           token = FMT_RZ;
493           break;
494         default:
495           token = FMT_UNKNOWN;
496           unget_char ();
497           break;
498         }
499       break;
500
501     case '\0':
502       token = FMT_END;
503       break;
504
505     case '*':
506       token = FMT_STAR;
507       break;
508
509     default:
510       token = FMT_UNKNOWN;
511       break;
512     }
513
514   if (error)
515     return FMT_ERROR;
516
517   return token;
518 }
519
520
521 static const char *
522 token_to_string (format_token t)
523 {
524   switch (t)
525     {
526       case FMT_D:
527         return "D";
528       case FMT_G:
529         return "G";
530       case FMT_E:
531         return "E";
532       case FMT_EN:
533         return "EN";
534       case FMT_ES:
535         return "ES";
536       default:
537         return "";
538     }
539 }
540
541 /* Check a format statement.  The format string, either from a FORMAT
542    statement or a constant in an I/O statement has already been parsed
543    by itself, and we are checking it for validity.  The dual origin
544    means that the warning message is a little less than great.  */
545
546 static gfc_try
547 check_format (bool is_input)
548 {
549   const char *posint_required     = _("Positive width required");
550   const char *nonneg_required     = _("Nonnegative width required");
551   const char *unexpected_element  = _("Unexpected element '%c' in format string"
552                                       " at %L");
553   const char *unexpected_end      = _("Unexpected end of format string");
554   const char *zero_width          = _("Zero width in format descriptor");
555
556   const char *error;
557   format_token t, u;
558   int level;
559   int repeat;
560   gfc_try rv;
561
562   use_last_char = 0;
563   saved_token = FMT_NONE;
564   level = 0;
565   repeat = 0;
566   rv = SUCCESS;
567   format_string_pos = 0;
568
569   t = format_lex ();
570   if (t == FMT_ERROR)
571     goto fail;
572   if (t != FMT_LPAREN)
573     {
574       error = _("Missing leading left parenthesis");
575       goto syntax;
576     }
577
578   t = format_lex ();
579   if (t == FMT_ERROR)
580     goto fail;
581   if (t == FMT_RPAREN)
582     goto finished;              /* Empty format is legal */
583   saved_token = t;
584
585 format_item:
586   /* In this state, the next thing has to be a format item.  */
587   t = format_lex ();
588   if (t == FMT_ERROR)
589     goto fail;
590 format_item_1:
591   switch (t)
592     {
593     case FMT_STAR:
594       repeat = -1;
595       t = format_lex ();
596       if (t == FMT_ERROR)
597         goto fail;
598       if (t == FMT_LPAREN)
599         {
600           level++;
601           goto format_item;
602         }
603       error = _("Left parenthesis required after '*'");
604       goto syntax;
605
606     case FMT_POSINT:
607       repeat = value;
608       t = format_lex ();
609       if (t == FMT_ERROR)
610         goto fail;
611       if (t == FMT_LPAREN)
612         {
613           level++;
614           goto format_item;
615         }
616
617       if (t == FMT_SLASH)
618         goto optional_comma;
619
620       goto data_desc;
621
622     case FMT_LPAREN:
623       level++;
624       goto format_item;
625
626     case FMT_SIGNED_INT:
627     case FMT_ZERO:
628       /* Signed integer can only precede a P format.  */
629       t = format_lex ();
630       if (t == FMT_ERROR)
631         goto fail;
632       if (t != FMT_P)
633         {
634           error = _("Expected P edit descriptor");
635           goto syntax;
636         }
637
638       goto data_desc;
639
640     case FMT_P:
641       /* P requires a prior number.  */
642       error = _("P descriptor requires leading scale factor");
643       goto syntax;
644
645     case FMT_X:
646       /* X requires a prior number if we're being pedantic.  */
647       if (mode != MODE_FORMAT)
648         format_locus.nextc += format_string_pos;
649       if (gfc_notify_std (GFC_STD_GNU, "Extension: X descriptor "
650                           "requires leading space count at %L", &format_locus)
651           == FAILURE)
652         return FAILURE;
653       goto between_desc;
654
655     case FMT_SIGN:
656     case FMT_BLANK:
657     case FMT_DP:
658     case FMT_DC:
659     case FMT_RC:
660     case FMT_RD:
661     case FMT_RN:
662     case FMT_RP:
663     case FMT_RU:
664     case FMT_RZ:
665       goto between_desc;
666
667     case FMT_CHAR:
668       goto extension_optional_comma;
669
670     case FMT_COLON:
671     case FMT_SLASH:
672       goto optional_comma;
673
674     case FMT_DOLLAR:
675       t = format_lex ();
676       if (t == FMT_ERROR)
677         goto fail;
678
679       if (gfc_notify_std (GFC_STD_GNU, "Extension: $ descriptor at %L",
680           &format_locus) == FAILURE)
681         return FAILURE;
682       if (t != FMT_RPAREN || level > 0)
683         {
684           gfc_warning ("$ should be the last specifier in format at %L",
685                        &format_locus);
686           goto optional_comma_1;
687         }
688
689       goto finished;
690
691     case FMT_T:
692     case FMT_TL:
693     case FMT_TR:
694     case FMT_IBOZ:
695     case FMT_F:
696     case FMT_E:
697     case FMT_EN:
698     case FMT_ES:
699     case FMT_G:
700     case FMT_L:
701     case FMT_A:
702     case FMT_D:
703     case FMT_H:
704       goto data_desc;
705
706     case FMT_END:
707       error = unexpected_end;
708       goto syntax;
709
710     default:
711       error = unexpected_element;
712       goto syntax;
713     }
714
715 data_desc:
716   /* In this state, t must currently be a data descriptor.
717      Deal with things that can/must follow the descriptor.  */
718   switch (t)
719     {
720     case FMT_SIGN:
721     case FMT_BLANK:
722     case FMT_DP:
723     case FMT_DC:
724     case FMT_X:
725       break;
726
727     case FMT_P:
728       /* No comma after P allowed only for F, E, EN, ES, D, or G.
729          10.1.1 (1).  */
730       t = format_lex ();
731       if (t == FMT_ERROR)
732         goto fail;
733       if (!(gfc_option.allow_std & GFC_STD_F2003) && t != FMT_COMMA
734           && t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES
735           && t != FMT_D && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
736         {
737           error = _("Comma required after P descriptor");
738           goto syntax;
739         }
740       if (t != FMT_COMMA)
741         {
742           if (t == FMT_POSINT)
743             {
744               t = format_lex ();
745               if (t == FMT_ERROR)
746                 goto fail;
747             }
748           if (t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES && t != FMT_D
749               && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
750             {
751               error = _("Comma required after P descriptor");
752               goto syntax;
753             }
754         }
755
756       saved_token = t;
757       goto optional_comma;
758
759     case FMT_T:
760     case FMT_TL:
761     case FMT_TR:
762       t = format_lex ();
763       if (t != FMT_POSINT)
764         {
765           error = _("Positive width required with T descriptor");
766           goto syntax;
767         }
768       break;
769
770     case FMT_L:
771       t = format_lex ();
772       if (t == FMT_ERROR)
773         goto fail;
774       if (t == FMT_POSINT)
775         break;
776
777       switch (gfc_notification_std (GFC_STD_GNU))
778         {
779           case WARNING:
780             if (mode != MODE_FORMAT)
781               format_locus.nextc += format_string_pos;
782             gfc_warning ("Extension: Missing positive width after L "
783                          "descriptor at %L", &format_locus);
784             saved_token = t;
785             break;
786
787           case ERROR:
788             error = posint_required;
789             goto syntax;
790
791           case SILENT:
792             saved_token = t;
793             break;
794
795           default:
796             gcc_unreachable ();
797         }
798       break;
799
800     case FMT_A:
801       t = format_lex ();
802       if (t == FMT_ERROR)
803         goto fail;
804       if (t == FMT_ZERO)
805         {
806           error = zero_width;
807           goto syntax;
808         }
809       if (t != FMT_POSINT)
810         saved_token = t;
811       break;
812
813     case FMT_D:
814     case FMT_E:
815     case FMT_G:
816     case FMT_EN:
817     case FMT_ES:
818       u = format_lex ();
819       if (t == FMT_G && u == FMT_ZERO)
820         {
821           if (is_input)
822             {
823               error = zero_width;
824               goto syntax;
825             }
826           if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: 'G0' in "
827                               "format at %L", &format_locus) == FAILURE)
828             return FAILURE;
829           u = format_lex ();
830           if (u != FMT_PERIOD)
831             {
832               saved_token = u;
833               break;
834             }
835           u = format_lex ();
836           if (u != FMT_POSINT)
837             {
838               error = posint_required;
839               goto syntax;
840             }
841           u = format_lex ();
842           if (u == FMT_E)
843             {
844               error = _("E specifier not allowed with g0 descriptor");
845               goto syntax;
846             }
847           saved_token = u;
848           break;
849         }
850
851       if (u != FMT_POSINT)
852         {
853           format_locus.nextc += format_string_pos;
854           gfc_error ("Positive width required in format "
855                          "specifier %s at %L", token_to_string (t),
856                          &format_locus);
857           saved_token = u;
858           goto fail;
859         }
860
861       u = format_lex ();
862       if (u == FMT_ERROR)
863         goto fail;
864       if (u != FMT_PERIOD)
865         {
866           /* Warn if -std=legacy, otherwise error.  */
867           format_locus.nextc += format_string_pos;
868           if (gfc_option.warn_std != 0)
869             {
870               gfc_error ("Period required in format "
871                              "specifier %s at %L", token_to_string (t),
872                              &format_locus);
873               saved_token = u;
874               goto fail;
875             }
876           else
877             gfc_warning ("Period required in format "
878                          "specifier %s at %L", token_to_string (t),
879                           &format_locus);
880           /* If we go to finished, we need to unwind this
881              before the next round.  */
882           format_locus.nextc -= format_string_pos;
883           saved_token = u;
884           break;
885         }
886
887       u = format_lex ();
888       if (u == FMT_ERROR)
889         goto fail;
890       if (u != FMT_ZERO && u != FMT_POSINT)
891         {
892           error = nonneg_required;
893           goto syntax;
894         }
895
896       if (t == FMT_D)
897         break;
898
899       /* Look for optional exponent.  */
900       u = format_lex ();
901       if (u == FMT_ERROR)
902         goto fail;
903       if (u != FMT_E)
904         {
905           saved_token = u;
906         }
907       else
908         {
909           u = format_lex ();
910           if (u == FMT_ERROR)
911             goto fail;
912           if (u != FMT_POSINT)
913             {
914               error = _("Positive exponent width required");
915               goto syntax;
916             }
917         }
918
919       break;
920
921     case FMT_F:
922       t = format_lex ();
923       if (t == FMT_ERROR)
924         goto fail;
925       if (t != FMT_ZERO && t != FMT_POSINT)
926         {
927           error = nonneg_required;
928           goto syntax;
929         }
930       else if (is_input && t == FMT_ZERO)
931         {
932           error = posint_required;
933           goto syntax;
934         }
935
936       t = format_lex ();
937       if (t == FMT_ERROR)
938         goto fail;
939       if (t != FMT_PERIOD)
940         {
941           /* Warn if -std=legacy, otherwise error.  */
942           if (gfc_option.warn_std != 0)
943             {
944               error = _("Period required in format specifier");
945               goto syntax;
946             }
947           if (mode != MODE_FORMAT)
948             format_locus.nextc += format_string_pos;
949           gfc_warning ("Period required in format specifier at %L",
950                        &format_locus);
951           saved_token = t;
952           break;
953         }
954
955       t = format_lex ();
956       if (t == FMT_ERROR)
957         goto fail;
958       if (t != FMT_ZERO && t != FMT_POSINT)
959         {
960           error = nonneg_required;
961           goto syntax;
962         }
963
964       break;
965
966     case FMT_H:
967       if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
968         {
969           if (mode != MODE_FORMAT)
970             format_locus.nextc += format_string_pos;
971           gfc_warning ("The H format specifier at %L is"
972                        " a Fortran 95 deleted feature", &format_locus);
973         }
974       if (mode == MODE_STRING)
975         {
976           format_string += value;
977           format_length -= value;
978           format_string_pos += repeat;
979         }
980       else
981         {
982           while (repeat >0)
983            {
984              next_char (1);
985              repeat -- ;
986            }
987         }
988      break;
989
990     case FMT_IBOZ:
991       t = format_lex ();
992       if (t == FMT_ERROR)
993         goto fail;
994       if (t != FMT_ZERO && t != FMT_POSINT)
995         {
996           error = nonneg_required;
997           goto syntax;
998         }
999       else if (is_input && t == FMT_ZERO)
1000         {
1001           error = posint_required;
1002           goto syntax;
1003         }
1004
1005       t = format_lex ();
1006       if (t == FMT_ERROR)
1007         goto fail;
1008       if (t != FMT_PERIOD)
1009         {
1010           saved_token = t;
1011         }
1012       else
1013         {
1014           t = format_lex ();
1015           if (t == FMT_ERROR)
1016             goto fail;
1017           if (t != FMT_ZERO && t != FMT_POSINT)
1018             {
1019               error = nonneg_required;
1020               goto syntax;
1021             }
1022         }
1023
1024       break;
1025
1026     default:
1027       error = unexpected_element;
1028       goto syntax;
1029     }
1030
1031 between_desc:
1032   /* Between a descriptor and what comes next.  */
1033   t = format_lex ();
1034   if (t == FMT_ERROR)
1035     goto fail;
1036   switch (t)
1037     {
1038
1039     case FMT_COMMA:
1040       goto format_item;
1041
1042     case FMT_RPAREN:
1043       level--;
1044       if (level < 0)
1045         goto finished;
1046       goto between_desc;
1047
1048     case FMT_COLON:
1049     case FMT_SLASH:
1050       goto optional_comma;
1051
1052     case FMT_END:
1053       error = unexpected_end;
1054       goto syntax;
1055
1056     default:
1057       if (mode != MODE_FORMAT)
1058         format_locus.nextc += format_string_pos - 1;
1059       if (gfc_notify_std (GFC_STD_GNU, "Extension: Missing comma at %L",
1060           &format_locus) == FAILURE)
1061         return FAILURE;
1062       /* If we do not actually return a failure, we need to unwind this
1063          before the next round.  */
1064       if (mode != MODE_FORMAT)
1065         format_locus.nextc -= format_string_pos;
1066       goto format_item_1;
1067     }
1068
1069 optional_comma:
1070   /* Optional comma is a weird between state where we've just finished
1071      reading a colon, slash, dollar or P descriptor.  */
1072   t = format_lex ();
1073   if (t == FMT_ERROR)
1074     goto fail;
1075 optional_comma_1:
1076   switch (t)
1077     {
1078     case FMT_COMMA:
1079       break;
1080
1081     case FMT_RPAREN:
1082       level--;
1083       if (level < 0)
1084         goto finished;
1085       goto between_desc;
1086
1087     default:
1088       /* Assume that we have another format item.  */
1089       saved_token = t;
1090       break;
1091     }
1092
1093   goto format_item;
1094
1095 extension_optional_comma:
1096   /* As a GNU extension, permit a missing comma after a string literal.  */
1097   t = format_lex ();
1098   if (t == FMT_ERROR)
1099     goto fail;
1100   switch (t)
1101     {
1102     case FMT_COMMA:
1103       break;
1104
1105     case FMT_RPAREN:
1106       level--;
1107       if (level < 0)
1108         goto finished;
1109       goto between_desc;
1110
1111     case FMT_COLON:
1112     case FMT_SLASH:
1113       goto optional_comma;
1114
1115     case FMT_END:
1116       error = unexpected_end;
1117       goto syntax;
1118
1119     default:
1120       if (mode != MODE_FORMAT)
1121         format_locus.nextc += format_string_pos;
1122       if (gfc_notify_std (GFC_STD_GNU, "Extension: Missing comma at %L",
1123           &format_locus) == FAILURE)
1124         return FAILURE;
1125       /* If we do not actually return a failure, we need to unwind this
1126          before the next round.  */
1127       if (mode != MODE_FORMAT)
1128         format_locus.nextc -= format_string_pos;
1129       saved_token = t;
1130       break;
1131     }
1132
1133   goto format_item;
1134   
1135 syntax:
1136   if (mode != MODE_FORMAT)
1137     format_locus.nextc += format_string_pos;
1138   if (error == unexpected_element)
1139     gfc_error (error, error_element, &format_locus);
1140   else
1141     gfc_error ("%s in format string at %L", error, &format_locus);
1142 fail:
1143   rv = FAILURE;
1144
1145 finished:
1146   return rv;
1147 }
1148
1149
1150 /* Given an expression node that is a constant string, see if it looks
1151    like a format string.  */
1152
1153 static gfc_try
1154 check_format_string (gfc_expr *e, bool is_input)
1155 {
1156   gfc_try rv;
1157   int i;
1158   if (!e || e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1159     return SUCCESS;
1160
1161   mode = MODE_STRING;
1162   format_string = e->value.character.string;
1163
1164   /* More elaborate measures are needed to show where a problem is within a
1165      format string that has been calculated, but that's probably not worth the
1166      effort.  */
1167   format_locus = e->where;
1168   rv = check_format (is_input);
1169   /* check for extraneous characters at the end of an otherwise valid format
1170      string, like '(A10,I3)F5'
1171      start at the end and move back to the last character processed,
1172      spaces are OK */
1173   if (rv == SUCCESS && e->value.character.length > format_string_pos)
1174     for (i=e->value.character.length-1;i>format_string_pos-1;i--)
1175       if (e->value.character.string[i] != ' ')
1176         {
1177           format_locus.nextc += format_length + 1; 
1178           gfc_warning ("Extraneous characters in format at %L", &format_locus); 
1179           break;
1180         }
1181   return rv;
1182 }
1183
1184
1185 /************ Fortran 95 I/O statement matchers *************/
1186
1187 /* Match a FORMAT statement.  This amounts to actually parsing the
1188    format descriptors in order to correctly locate the end of the
1189    format string.  */
1190
1191 match
1192 gfc_match_format (void)
1193 {
1194   gfc_expr *e;
1195   locus start;
1196
1197   if (gfc_current_ns->proc_name
1198       && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
1199     {
1200       gfc_error ("Format statement in module main block at %C");
1201       return MATCH_ERROR;
1202     }
1203
1204   if (gfc_statement_label == NULL)
1205     {
1206       gfc_error ("Missing format label at %C");
1207       return MATCH_ERROR;
1208     }
1209   gfc_gobble_whitespace ();
1210
1211   mode = MODE_FORMAT;
1212   format_length = 0;
1213
1214   start = gfc_current_locus;
1215
1216   if (check_format (false) == FAILURE)
1217     return MATCH_ERROR;
1218
1219   if (gfc_match_eos () != MATCH_YES)
1220     {
1221       gfc_syntax_error (ST_FORMAT);
1222       return MATCH_ERROR;
1223     }
1224
1225   /* The label doesn't get created until after the statement is done
1226      being matched, so we have to leave the string for later.  */
1227
1228   gfc_current_locus = start;    /* Back to the beginning */
1229
1230   new_st.loc = start;
1231   new_st.op = EXEC_NOP;
1232
1233   e = gfc_get_character_expr (gfc_default_character_kind, &start,
1234                               NULL, format_length);
1235   format_string = e->value.character.string;
1236   gfc_statement_label->format = e;
1237
1238   mode = MODE_COPY;
1239   check_format (false);         /* Guaranteed to succeed */
1240   gfc_match_eos ();             /* Guaranteed to succeed */
1241
1242   return MATCH_YES;
1243 }
1244
1245
1246 /* Match an expression I/O tag of some sort.  */
1247
1248 static match
1249 match_etag (const io_tag *tag, gfc_expr **v)
1250 {
1251   gfc_expr *result;
1252   match m;
1253
1254   m = gfc_match (tag->spec);
1255   if (m != MATCH_YES)
1256     return m;
1257
1258   m = gfc_match (tag->value, &result);
1259   if (m != MATCH_YES)
1260     {
1261       gfc_error ("Invalid value for %s specification at %C", tag->name);
1262       return MATCH_ERROR;
1263     }
1264
1265   if (*v != NULL)
1266     {
1267       gfc_error ("Duplicate %s specification at %C", tag->name);
1268       gfc_free_expr (result);
1269       return MATCH_ERROR;
1270     }
1271
1272   *v = result;
1273   return MATCH_YES;
1274 }
1275
1276
1277 /* Match a variable I/O tag of some sort.  */
1278
1279 static match
1280 match_vtag (const io_tag *tag, gfc_expr **v)
1281 {
1282   gfc_expr *result;
1283   match m;
1284
1285   m = gfc_match (tag->spec);
1286   if (m != MATCH_YES)
1287     return m;
1288
1289   m = gfc_match (tag->value, &result);
1290   if (m != MATCH_YES)
1291     {
1292       gfc_error ("Invalid value for %s specification at %C", tag->name);
1293       return MATCH_ERROR;
1294     }
1295
1296   if (*v != NULL)
1297     {
1298       gfc_error ("Duplicate %s specification at %C", tag->name);
1299       gfc_free_expr (result);
1300       return MATCH_ERROR;
1301     }
1302
1303   if (result->symtree->n.sym->attr.intent == INTENT_IN)
1304     {
1305       gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag->name);
1306       gfc_free_expr (result);
1307       return MATCH_ERROR;
1308     }
1309
1310   if (gfc_pure (NULL) && gfc_impure_variable (result->symtree->n.sym))
1311     {
1312       gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1313                  tag->name);
1314       gfc_free_expr (result);
1315       return MATCH_ERROR;
1316     }
1317
1318   *v = result;
1319   return MATCH_YES;
1320 }
1321
1322
1323 /* Match I/O tags that cause variables to become redefined.  */
1324
1325 static match
1326 match_out_tag (const io_tag *tag, gfc_expr **result)
1327 {
1328   match m;
1329
1330   m = match_vtag (tag, result);
1331   if (m == MATCH_YES)
1332     gfc_check_do_variable ((*result)->symtree);
1333
1334   return m;
1335 }
1336
1337
1338 /* Match a label I/O tag.  */
1339
1340 static match
1341 match_ltag (const io_tag *tag, gfc_st_label ** label)
1342 {
1343   match m;
1344   gfc_st_label *old;
1345
1346   old = *label;
1347   m = gfc_match (tag->spec);
1348   if (m != MATCH_YES)
1349     return m;
1350
1351   m = gfc_match (tag->value, label);
1352   if (m != MATCH_YES)
1353     {
1354       gfc_error ("Invalid value for %s specification at %C", tag->name);
1355       return MATCH_ERROR;
1356     }
1357
1358   if (old)
1359     {
1360       gfc_error ("Duplicate %s label specification at %C", tag->name);
1361       return MATCH_ERROR;
1362     }
1363
1364   if (gfc_reference_st_label (*label, ST_LABEL_TARGET) == FAILURE)
1365     return MATCH_ERROR;
1366
1367   return m;
1368 }
1369
1370
1371 /* Resolution of the FORMAT tag, to be called from resolve_tag.  */
1372
1373 static gfc_try
1374 resolve_tag_format (const gfc_expr *e)
1375 {
1376   if (e->expr_type == EXPR_CONSTANT
1377       && (e->ts.type != BT_CHARACTER
1378           || e->ts.kind != gfc_default_character_kind))
1379     {
1380       gfc_error ("Constant expression in FORMAT tag at %L must be "
1381                  "of type default CHARACTER", &e->where);
1382       return FAILURE;
1383     }
1384
1385   /* If e's rank is zero and e is not an element of an array, it should be
1386      of integer or character type.  The integer variable should be
1387      ASSIGNED.  */
1388   if (e->rank == 0
1389       && (e->expr_type != EXPR_VARIABLE
1390           || e->symtree == NULL
1391           || e->symtree->n.sym->as == NULL
1392           || e->symtree->n.sym->as->rank == 0))
1393     {
1394       if (e->ts.type != BT_CHARACTER && e->ts.type != BT_INTEGER)
1395         {
1396           gfc_error ("FORMAT tag at %L must be of type CHARACTER or INTEGER",
1397                      &e->where);
1398           return FAILURE;
1399         }
1400       else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
1401         {
1402           if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
1403                               "variable in FORMAT tag at %L", &e->where)
1404               == FAILURE)
1405             return FAILURE;
1406           if (e->symtree->n.sym->attr.assign != 1)
1407             {
1408               gfc_error ("Variable '%s' at %L has not been assigned a "
1409                          "format label", e->symtree->n.sym->name, &e->where);
1410               return FAILURE;
1411             }
1412         }
1413       else if (e->ts.type == BT_INTEGER)
1414         {
1415           gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
1416                      "variable", gfc_basic_typename (e->ts.type), &e->where);
1417           return FAILURE;
1418         }
1419
1420       return SUCCESS;
1421     }
1422
1423   /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1424      It may be assigned an Hollerith constant.  */
1425   if (e->ts.type != BT_CHARACTER)
1426     {
1427       if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
1428                           "in FORMAT tag at %L", &e->where) == FAILURE)
1429         return FAILURE;
1430
1431       if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)
1432         {
1433           gfc_error ("Non-character assumed shape array element in FORMAT"
1434                      " tag at %L", &e->where);
1435           return FAILURE;
1436         }
1437
1438       if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SIZE)
1439         {
1440           gfc_error ("Non-character assumed size array element in FORMAT"
1441                      " tag at %L", &e->where);
1442           return FAILURE;
1443         }
1444
1445       if (e->rank == 0 && e->symtree->n.sym->attr.pointer)
1446         {
1447           gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1448                      &e->where);
1449           return FAILURE;
1450         }
1451     }
1452
1453   return SUCCESS;
1454 }
1455
1456
1457 /* Do expression resolution and type-checking on an expression tag.  */
1458
1459 static gfc_try
1460 resolve_tag (const io_tag *tag, gfc_expr *e)
1461 {
1462   if (e == NULL)
1463     return SUCCESS;
1464
1465   if (gfc_resolve_expr (e) == FAILURE)
1466     return FAILURE;
1467
1468   if (tag == &tag_format)
1469     return resolve_tag_format (e);
1470
1471   if (e->ts.type != tag->type)
1472     {
1473       gfc_error ("%s tag at %L must be of type %s", tag->name,
1474                  &e->where, gfc_basic_typename (tag->type));
1475       return FAILURE;
1476     }
1477
1478   if (e->rank != 0)
1479     {
1480       gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
1481       return FAILURE;
1482     }
1483
1484   if (tag == &tag_iomsg)
1485     {
1486       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
1487                           &e->where) == FAILURE)
1488         return FAILURE;
1489     }
1490
1491   if ((tag == &tag_iostat || tag == &tag_size || tag == &tag_iolength)
1492       && e->ts.kind != gfc_default_integer_kind)
1493     {
1494       if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
1495                           "INTEGER in %s tag at %L", tag->name, &e->where)
1496           == FAILURE)
1497         return FAILURE;
1498     }
1499
1500   if (tag == &tag_exist && e->ts.kind != gfc_default_logical_kind)
1501     {
1502       if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Nondefault LOGICAL "
1503                           "in %s tag at %L", tag->name, &e->where)
1504           == FAILURE)
1505         return FAILURE;
1506     }
1507
1508   if (tag == &tag_convert)
1509     {
1510       if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
1511                           &e->where) == FAILURE)
1512         return FAILURE;
1513     }
1514   
1515   return SUCCESS;
1516 }
1517
1518
1519 /* Match a single tag of an OPEN statement.  */
1520
1521 static match
1522 match_open_element (gfc_open *open)
1523 {
1524   match m;
1525
1526   m = match_etag (&tag_e_async, &open->asynchronous);
1527   if (m != MATCH_NO)
1528     return m;
1529   m = match_etag (&tag_unit, &open->unit);
1530   if (m != MATCH_NO)
1531     return m;
1532   m = match_out_tag (&tag_iomsg, &open->iomsg);
1533   if (m != MATCH_NO)
1534     return m;
1535   m = match_out_tag (&tag_iostat, &open->iostat);
1536   if (m != MATCH_NO)
1537     return m;
1538   m = match_etag (&tag_file, &open->file);
1539   if (m != MATCH_NO)
1540     return m;
1541   m = match_etag (&tag_status, &open->status);
1542   if (m != MATCH_NO)
1543     return m;
1544   m = match_etag (&tag_e_access, &open->access);
1545   if (m != MATCH_NO)
1546     return m;
1547   m = match_etag (&tag_e_form, &open->form);
1548   if (m != MATCH_NO)
1549     return m;
1550   m = match_etag (&tag_e_recl, &open->recl);
1551   if (m != MATCH_NO)
1552     return m;
1553   m = match_etag (&tag_e_blank, &open->blank);
1554   if (m != MATCH_NO)
1555     return m;
1556   m = match_etag (&tag_e_position, &open->position);
1557   if (m != MATCH_NO)
1558     return m;
1559   m = match_etag (&tag_e_action, &open->action);
1560   if (m != MATCH_NO)
1561     return m;
1562   m = match_etag (&tag_e_delim, &open->delim);
1563   if (m != MATCH_NO)
1564     return m;
1565   m = match_etag (&tag_e_pad, &open->pad);
1566   if (m != MATCH_NO)
1567     return m;
1568   m = match_etag (&tag_e_decimal, &open->decimal);
1569   if (m != MATCH_NO)
1570     return m;
1571   m = match_etag (&tag_e_encoding, &open->encoding);
1572   if (m != MATCH_NO)
1573     return m;
1574   m = match_etag (&tag_e_round, &open->round);
1575   if (m != MATCH_NO)
1576     return m;
1577   m = match_etag (&tag_e_sign, &open->sign);
1578   if (m != MATCH_NO)
1579     return m;
1580   m = match_ltag (&tag_err, &open->err);
1581   if (m != MATCH_NO)
1582     return m;
1583   m = match_etag (&tag_convert, &open->convert);
1584   if (m != MATCH_NO)
1585     return m;
1586   m = match_out_tag (&tag_newunit, &open->newunit);
1587   if (m != MATCH_NO)
1588     return m;
1589
1590   return MATCH_NO;
1591 }
1592
1593
1594 /* Free the gfc_open structure and all the expressions it contains.  */
1595
1596 void
1597 gfc_free_open (gfc_open *open)
1598 {
1599   if (open == NULL)
1600     return;
1601
1602   gfc_free_expr (open->unit);
1603   gfc_free_expr (open->iomsg);
1604   gfc_free_expr (open->iostat);
1605   gfc_free_expr (open->file);
1606   gfc_free_expr (open->status);
1607   gfc_free_expr (open->access);
1608   gfc_free_expr (open->form);
1609   gfc_free_expr (open->recl);
1610   gfc_free_expr (open->blank);
1611   gfc_free_expr (open->position);
1612   gfc_free_expr (open->action);
1613   gfc_free_expr (open->delim);
1614   gfc_free_expr (open->pad);
1615   gfc_free_expr (open->decimal);
1616   gfc_free_expr (open->encoding);
1617   gfc_free_expr (open->round);
1618   gfc_free_expr (open->sign);
1619   gfc_free_expr (open->convert);
1620   gfc_free_expr (open->asynchronous);
1621   gfc_free_expr (open->newunit);
1622   gfc_free (open);
1623 }
1624
1625
1626 /* Resolve everything in a gfc_open structure.  */
1627
1628 gfc_try
1629 gfc_resolve_open (gfc_open *open)
1630 {
1631
1632   RESOLVE_TAG (&tag_unit, open->unit);
1633   RESOLVE_TAG (&tag_iomsg, open->iomsg);
1634   RESOLVE_TAG (&tag_iostat, open->iostat);
1635   RESOLVE_TAG (&tag_file, open->file);
1636   RESOLVE_TAG (&tag_status, open->status);
1637   RESOLVE_TAG (&tag_e_access, open->access);
1638   RESOLVE_TAG (&tag_e_form, open->form);
1639   RESOLVE_TAG (&tag_e_recl, open->recl);
1640   RESOLVE_TAG (&tag_e_blank, open->blank);
1641   RESOLVE_TAG (&tag_e_position, open->position);
1642   RESOLVE_TAG (&tag_e_action, open->action);
1643   RESOLVE_TAG (&tag_e_delim, open->delim);
1644   RESOLVE_TAG (&tag_e_pad, open->pad);
1645   RESOLVE_TAG (&tag_e_decimal, open->decimal);
1646   RESOLVE_TAG (&tag_e_encoding, open->encoding);
1647   RESOLVE_TAG (&tag_e_async, open->asynchronous);
1648   RESOLVE_TAG (&tag_e_round, open->round);
1649   RESOLVE_TAG (&tag_e_sign, open->sign);
1650   RESOLVE_TAG (&tag_convert, open->convert);
1651   RESOLVE_TAG (&tag_newunit, open->newunit);
1652
1653   if (gfc_reference_st_label (open->err, ST_LABEL_TARGET) == FAILURE)
1654     return FAILURE;
1655
1656   return SUCCESS;
1657 }
1658
1659
1660 /* Check if a given value for a SPECIFIER is either in the list of values
1661    allowed in F95 or F2003, issuing an error message and returning a zero
1662    value if it is not allowed.  */
1663
1664 static int
1665 compare_to_allowed_values (const char *specifier, const char *allowed[],
1666                            const char *allowed_f2003[], 
1667                            const char *allowed_gnu[], gfc_char_t *value,
1668                            const char *statement, bool warn)
1669 {
1670   int i;
1671   unsigned int len;
1672
1673   len = gfc_wide_strlen (value);
1674   if (len > 0)
1675   {
1676     for (len--; len > 0; len--)
1677       if (value[len] != ' ')
1678         break;
1679     len++;
1680   }
1681
1682   for (i = 0; allowed[i]; i++)
1683     if (len == strlen (allowed[i])
1684         && gfc_wide_strncasecmp (value, allowed[i], strlen (allowed[i])) == 0)
1685       return 1;
1686
1687   for (i = 0; allowed_f2003 && allowed_f2003[i]; i++)
1688     if (len == strlen (allowed_f2003[i])
1689         && gfc_wide_strncasecmp (value, allowed_f2003[i],
1690                                  strlen (allowed_f2003[i])) == 0)
1691       {
1692         notification n = gfc_notification_std (GFC_STD_F2003);
1693
1694         if (n == WARNING || (warn && n == ERROR))
1695           {
1696             gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1697                          "has value '%s'", specifier, statement,
1698                          allowed_f2003[i]);
1699             return 1;
1700           }
1701         else
1702           if (n == ERROR)
1703             {
1704               gfc_notify_std (GFC_STD_F2003, "Fortran 2003: %s specifier in "
1705                               "%s statement at %C has value '%s'", specifier,
1706                               statement, allowed_f2003[i]);
1707               return 0;
1708             }
1709
1710         /* n == SILENT */
1711         return 1;
1712       }
1713
1714   for (i = 0; allowed_gnu && allowed_gnu[i]; i++)
1715     if (len == strlen (allowed_gnu[i])
1716         && gfc_wide_strncasecmp (value, allowed_gnu[i],
1717                                  strlen (allowed_gnu[i])) == 0)
1718       {
1719         notification n = gfc_notification_std (GFC_STD_GNU);
1720
1721         if (n == WARNING || (warn && n == ERROR))
1722           {
1723             gfc_warning ("Extension: %s specifier in %s statement at %C "
1724                          "has value '%s'", specifier, statement,
1725                          allowed_gnu[i]);
1726             return 1;
1727           }
1728         else
1729           if (n == ERROR)
1730             {
1731               gfc_notify_std (GFC_STD_GNU, "Extension: %s specifier in "
1732                               "%s statement at %C has value '%s'", specifier,
1733                               statement, allowed_gnu[i]);
1734               return 0;
1735             }
1736
1737         /* n == SILENT */
1738         return 1;
1739       }
1740
1741   if (warn)
1742     {
1743       char *s = gfc_widechar_to_char (value, -1);
1744       gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1745                    specifier, statement, s);
1746       gfc_free (s);
1747       return 1;
1748     }
1749   else
1750     {
1751       char *s = gfc_widechar_to_char (value, -1);
1752       gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1753                  specifier, statement, s);
1754       gfc_free (s);
1755       return 0;
1756     }
1757 }
1758
1759
1760 /* Match an OPEN statement.  */
1761
1762 match
1763 gfc_match_open (void)
1764 {
1765   gfc_open *open;
1766   match m;
1767   bool warn;
1768
1769   m = gfc_match_char ('(');
1770   if (m == MATCH_NO)
1771     return m;
1772
1773   open = XCNEW (gfc_open);
1774
1775   m = match_open_element (open);
1776
1777   if (m == MATCH_ERROR)
1778     goto cleanup;
1779   if (m == MATCH_NO)
1780     {
1781       m = gfc_match_expr (&open->unit);
1782       if (m == MATCH_ERROR)
1783         goto cleanup;
1784     }
1785
1786   for (;;)
1787     {
1788       if (gfc_match_char (')') == MATCH_YES)
1789         break;
1790       if (gfc_match_char (',') != MATCH_YES)
1791         goto syntax;
1792
1793       m = match_open_element (open);
1794       if (m == MATCH_ERROR)
1795         goto cleanup;
1796       if (m == MATCH_NO)
1797         goto syntax;
1798     }
1799
1800   if (gfc_match_eos () == MATCH_NO)
1801     goto syntax;
1802
1803   if (gfc_pure (NULL))
1804     {
1805       gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1806       goto cleanup;
1807     }
1808
1809   warn = (open->err || open->iostat) ? true : false;
1810
1811   /* Checks on NEWUNIT specifier.  */
1812   if (open->newunit)
1813     {
1814       if (open->unit)
1815         {
1816           gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1817           goto cleanup;
1818         }
1819
1820       if (!(open->file || (open->status
1821           && gfc_wide_strncasecmp (open->status->value.character.string,
1822                                    "scratch", 7) == 0)))
1823         {
1824           gfc_error ("NEWUNIT specifier must have FILE= "
1825                      "or STATUS='scratch' at %C");
1826           goto cleanup;
1827         }
1828     }
1829   else if (!open->unit)
1830     {
1831       gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1832       goto cleanup;
1833     }
1834
1835   /* Checks on the ACCESS specifier.  */
1836   if (open->access && open->access->expr_type == EXPR_CONSTANT)
1837     {
1838       static const char *access_f95[] = { "SEQUENTIAL", "DIRECT", NULL };
1839       static const char *access_f2003[] = { "STREAM", NULL };
1840       static const char *access_gnu[] = { "APPEND", NULL };
1841
1842       if (!compare_to_allowed_values ("ACCESS", access_f95, access_f2003,
1843                                       access_gnu,
1844                                       open->access->value.character.string,
1845                                       "OPEN", warn))
1846         goto cleanup;
1847     }
1848
1849   /* Checks on the ACTION specifier.  */
1850   if (open->action && open->action->expr_type == EXPR_CONSTANT)
1851     {
1852       static const char *action[] = { "READ", "WRITE", "READWRITE", NULL };
1853
1854       if (!compare_to_allowed_values ("ACTION", action, NULL, NULL,
1855                                       open->action->value.character.string,
1856                                       "OPEN", warn))
1857         goto cleanup;
1858     }
1859
1860   /* Checks on the ASYNCHRONOUS specifier.  */
1861   if (open->asynchronous)
1862     {
1863       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ASYNCHRONOUS= at %C "
1864           "not allowed in Fortran 95") == FAILURE)
1865         goto cleanup;
1866
1867       if (open->asynchronous->expr_type == EXPR_CONSTANT)
1868         {
1869           static const char * asynchronous[] = { "YES", "NO", NULL };
1870
1871           if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous,
1872                         NULL, NULL, open->asynchronous->value.character.string,
1873                         "OPEN", warn))
1874             goto cleanup;
1875         }
1876     }
1877
1878   /* Checks on the BLANK specifier.  */
1879   if (open->blank)
1880     {
1881       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
1882           "not allowed in Fortran 95") == FAILURE)
1883         goto cleanup;
1884
1885       if (open->blank->expr_type == EXPR_CONSTANT)
1886         {
1887           static const char *blank[] = { "ZERO", "NULL", NULL };
1888
1889           if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
1890                                           open->blank->value.character.string,
1891                                           "OPEN", warn))
1892             goto cleanup;
1893         }
1894     }
1895
1896   /* Checks on the DECIMAL specifier.  */
1897   if (open->decimal)
1898     {
1899       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
1900           "not allowed in Fortran 95") == FAILURE)
1901         goto cleanup;
1902
1903       if (open->decimal->expr_type == EXPR_CONSTANT)
1904         {
1905           static const char * decimal[] = { "COMMA", "POINT", NULL };
1906
1907           if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
1908                                           open->decimal->value.character.string,
1909                                           "OPEN", warn))
1910             goto cleanup;
1911         }
1912     }
1913
1914   /* Checks on the DELIM specifier.  */
1915   if (open->delim)
1916     {
1917       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
1918           "not allowed in Fortran 95") == FAILURE)
1919         goto cleanup;
1920
1921       if (open->delim->expr_type == EXPR_CONSTANT)
1922         {
1923           static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
1924
1925           if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
1926                                           open->delim->value.character.string,
1927                                           "OPEN", warn))
1928           goto cleanup;
1929         }
1930     }
1931
1932   /* Checks on the ENCODING specifier.  */
1933   if (open->encoding)
1934     {
1935       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENCODING= at %C "
1936           "not allowed in Fortran 95") == FAILURE)
1937         goto cleanup;
1938     
1939       if (open->encoding->expr_type == EXPR_CONSTANT)
1940         {
1941           static const char * encoding[] = { "DEFAULT", "UTF-8", NULL };
1942
1943           if (!compare_to_allowed_values ("ENCODING", encoding, NULL, NULL,
1944                                           open->encoding->value.character.string,
1945                                           "OPEN", warn))
1946           goto cleanup;
1947         }
1948     }
1949
1950   /* Checks on the FORM specifier.  */
1951   if (open->form && open->form->expr_type == EXPR_CONSTANT)
1952     {
1953       static const char *form[] = { "FORMATTED", "UNFORMATTED", NULL };
1954
1955       if (!compare_to_allowed_values ("FORM", form, NULL, NULL,
1956                                       open->form->value.character.string,
1957                                       "OPEN", warn))
1958         goto cleanup;
1959     }
1960
1961   /* Checks on the PAD specifier.  */
1962   if (open->pad && open->pad->expr_type == EXPR_CONSTANT)
1963     {
1964       static const char *pad[] = { "YES", "NO", NULL };
1965
1966       if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
1967                                       open->pad->value.character.string,
1968                                       "OPEN", warn))
1969         goto cleanup;
1970     }
1971
1972   /* Checks on the POSITION specifier.  */
1973   if (open->position && open->position->expr_type == EXPR_CONSTANT)
1974     {
1975       static const char *position[] = { "ASIS", "REWIND", "APPEND", NULL };
1976
1977       if (!compare_to_allowed_values ("POSITION", position, NULL, NULL,
1978                                       open->position->value.character.string,
1979                                       "OPEN", warn))
1980         goto cleanup;
1981     }
1982
1983   /* Checks on the ROUND specifier.  */
1984   if (open->round)
1985     {
1986       if (gfc_notify_std (GFC_STD_F2003, "Fortran F2003: ROUND= at %C "
1987           "not allowed in Fortran 95") == FAILURE)
1988       goto cleanup;
1989
1990       if (open->round->expr_type == EXPR_CONSTANT)
1991         {
1992           static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
1993                                           "COMPATIBLE", "PROCESSOR_DEFINED",
1994                                            NULL };
1995
1996           if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
1997                                           open->round->value.character.string,
1998                                           "OPEN", warn))
1999           goto cleanup;
2000         }
2001     }
2002
2003   /* Checks on the SIGN specifier.  */
2004   if (open->sign) 
2005     {
2006       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
2007           "not allowed in Fortran 95") == FAILURE)
2008         goto cleanup;
2009
2010       if (open->sign->expr_type == EXPR_CONSTANT)
2011         {
2012           static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2013                                           NULL };
2014
2015           if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
2016                                           open->sign->value.character.string,
2017                                           "OPEN", warn))
2018           goto cleanup;
2019         }
2020     }
2021
2022 #define warn_or_error(...) \
2023 { \
2024   if (warn) \
2025     gfc_warning (__VA_ARGS__); \
2026   else \
2027     { \
2028       gfc_error (__VA_ARGS__); \
2029       goto cleanup; \
2030     } \
2031 }
2032
2033   /* Checks on the RECL specifier.  */
2034   if (open->recl && open->recl->expr_type == EXPR_CONSTANT
2035       && open->recl->ts.type == BT_INTEGER
2036       && mpz_sgn (open->recl->value.integer) != 1)
2037     {
2038       warn_or_error ("RECL in OPEN statement at %C must be positive");
2039     }
2040
2041   /* Checks on the STATUS specifier.  */
2042   if (open->status && open->status->expr_type == EXPR_CONSTANT)
2043     {
2044       static const char *status[] = { "OLD", "NEW", "SCRATCH",
2045         "REPLACE", "UNKNOWN", NULL };
2046
2047       if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2048                                       open->status->value.character.string,
2049                                       "OPEN", warn))
2050         goto cleanup;
2051
2052       /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2053          the FILE= specifier shall appear.  */
2054       if (open->file == NULL
2055           && (gfc_wide_strncasecmp (open->status->value.character.string,
2056                                     "replace", 7) == 0
2057               || gfc_wide_strncasecmp (open->status->value.character.string,
2058                                        "new", 3) == 0))
2059         {
2060           char *s = gfc_widechar_to_char (open->status->value.character.string,
2061                                           -1);
2062           warn_or_error ("The STATUS specified in OPEN statement at %C is "
2063                          "'%s' and no FILE specifier is present", s);
2064           gfc_free (s);
2065         }
2066
2067       /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2068          the FILE= specifier shall not appear.  */
2069       if (gfc_wide_strncasecmp (open->status->value.character.string,
2070                                 "scratch", 7) == 0 && open->file)
2071         {
2072           warn_or_error ("The STATUS specified in OPEN statement at %C "
2073                          "cannot have the value SCRATCH if a FILE specifier "
2074                          "is present");
2075         }
2076     }
2077
2078   /* Things that are not allowed for unformatted I/O.  */
2079   if (open->form && open->form->expr_type == EXPR_CONSTANT
2080       && (open->delim || open->decimal || open->encoding || open->round
2081           || open->sign || open->pad || open->blank)
2082       && gfc_wide_strncasecmp (open->form->value.character.string,
2083                                "unformatted", 11) == 0)
2084     {
2085       const char *spec = (open->delim ? "DELIM "
2086                                       : (open->pad ? "PAD " : open->blank
2087                                                             ? "BLANK " : ""));
2088
2089       warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2090                      "unformatted I/O", spec);
2091     }
2092
2093   if (open->recl && open->access && open->access->expr_type == EXPR_CONSTANT
2094       && gfc_wide_strncasecmp (open->access->value.character.string,
2095                                "stream", 6) == 0)
2096     {
2097       warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2098                      "stream I/O");
2099     }
2100
2101   if (open->position
2102       && open->access && open->access->expr_type == EXPR_CONSTANT
2103       && !(gfc_wide_strncasecmp (open->access->value.character.string,
2104                                  "sequential", 10) == 0
2105            || gfc_wide_strncasecmp (open->access->value.character.string,
2106                                     "stream", 6) == 0
2107            || gfc_wide_strncasecmp (open->access->value.character.string,
2108                                     "append", 6) == 0))
2109     {
2110       warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2111                      "for stream or sequential ACCESS");
2112     }
2113
2114 #undef warn_or_error
2115
2116   new_st.op = EXEC_OPEN;
2117   new_st.ext.open = open;
2118   return MATCH_YES;
2119
2120 syntax:
2121   gfc_syntax_error (ST_OPEN);
2122
2123 cleanup:
2124   gfc_free_open (open);
2125   return MATCH_ERROR;
2126 }
2127
2128
2129 /* Free a gfc_close structure an all its expressions.  */
2130
2131 void
2132 gfc_free_close (gfc_close *close)
2133 {
2134   if (close == NULL)
2135     return;
2136
2137   gfc_free_expr (close->unit);
2138   gfc_free_expr (close->iomsg);
2139   gfc_free_expr (close->iostat);
2140   gfc_free_expr (close->status);
2141   gfc_free (close);
2142 }
2143
2144
2145 /* Match elements of a CLOSE statement.  */
2146
2147 static match
2148 match_close_element (gfc_close *close)
2149 {
2150   match m;
2151
2152   m = match_etag (&tag_unit, &close->unit);
2153   if (m != MATCH_NO)
2154     return m;
2155   m = match_etag (&tag_status, &close->status);
2156   if (m != MATCH_NO)
2157     return m;
2158   m = match_out_tag (&tag_iomsg, &close->iomsg);
2159   if (m != MATCH_NO)
2160     return m;
2161   m = match_out_tag (&tag_iostat, &close->iostat);
2162   if (m != MATCH_NO)
2163     return m;
2164   m = match_ltag (&tag_err, &close->err);
2165   if (m != MATCH_NO)
2166     return m;
2167
2168   return MATCH_NO;
2169 }
2170
2171
2172 /* Match a CLOSE statement.  */
2173
2174 match
2175 gfc_match_close (void)
2176 {
2177   gfc_close *close;
2178   match m;
2179   bool warn;
2180
2181   m = gfc_match_char ('(');
2182   if (m == MATCH_NO)
2183     return m;
2184
2185   close = XCNEW (gfc_close);
2186
2187   m = match_close_element (close);
2188
2189   if (m == MATCH_ERROR)
2190     goto cleanup;
2191   if (m == MATCH_NO)
2192     {
2193       m = gfc_match_expr (&close->unit);
2194       if (m == MATCH_NO)
2195         goto syntax;
2196       if (m == MATCH_ERROR)
2197         goto cleanup;
2198     }
2199
2200   for (;;)
2201     {
2202       if (gfc_match_char (')') == MATCH_YES)
2203         break;
2204       if (gfc_match_char (',') != MATCH_YES)
2205         goto syntax;
2206
2207       m = match_close_element (close);
2208       if (m == MATCH_ERROR)
2209         goto cleanup;
2210       if (m == MATCH_NO)
2211         goto syntax;
2212     }
2213
2214   if (gfc_match_eos () == MATCH_NO)
2215     goto syntax;
2216
2217   if (gfc_pure (NULL))
2218     {
2219       gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2220       goto cleanup;
2221     }
2222
2223   warn = (close->iostat || close->err) ? true : false;
2224
2225   /* Checks on the STATUS specifier.  */
2226   if (close->status && close->status->expr_type == EXPR_CONSTANT)
2227     {
2228       static const char *status[] = { "KEEP", "DELETE", NULL };
2229
2230       if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2231                                       close->status->value.character.string,
2232                                       "CLOSE", warn))
2233         goto cleanup;
2234     }
2235
2236   new_st.op = EXEC_CLOSE;
2237   new_st.ext.close = close;
2238   return MATCH_YES;
2239
2240 syntax:
2241   gfc_syntax_error (ST_CLOSE);
2242
2243 cleanup:
2244   gfc_free_close (close);
2245   return MATCH_ERROR;
2246 }
2247
2248
2249 /* Resolve everything in a gfc_close structure.  */
2250
2251 gfc_try
2252 gfc_resolve_close (gfc_close *close)
2253 {
2254   RESOLVE_TAG (&tag_unit, close->unit);
2255   RESOLVE_TAG (&tag_iomsg, close->iomsg);
2256   RESOLVE_TAG (&tag_iostat, close->iostat);
2257   RESOLVE_TAG (&tag_status, close->status);
2258
2259   if (gfc_reference_st_label (close->err, ST_LABEL_TARGET) == FAILURE)
2260     return FAILURE;
2261
2262   if (close->unit->expr_type == EXPR_CONSTANT
2263       && close->unit->ts.type == BT_INTEGER
2264       && mpz_sgn (close->unit->value.integer) < 0)
2265     {
2266       gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2267                  &close->unit->where);
2268     }
2269
2270   return SUCCESS;
2271 }
2272
2273
2274 /* Free a gfc_filepos structure.  */
2275
2276 void
2277 gfc_free_filepos (gfc_filepos *fp)
2278 {
2279   gfc_free_expr (fp->unit);
2280   gfc_free_expr (fp->iomsg);
2281   gfc_free_expr (fp->iostat);
2282   gfc_free (fp);
2283 }
2284
2285
2286 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement.  */
2287
2288 static match
2289 match_file_element (gfc_filepos *fp)
2290 {
2291   match m;
2292
2293   m = match_etag (&tag_unit, &fp->unit);
2294   if (m != MATCH_NO)
2295     return m;
2296   m = match_out_tag (&tag_iomsg, &fp->iomsg);
2297   if (m != MATCH_NO)
2298     return m;
2299   m = match_out_tag (&tag_iostat, &fp->iostat);
2300   if (m != MATCH_NO)
2301     return m;
2302   m = match_ltag (&tag_err, &fp->err);
2303   if (m != MATCH_NO)
2304     return m;
2305
2306   return MATCH_NO;
2307 }
2308
2309
2310 /* Match the second half of the file-positioning statements, REWIND,
2311    BACKSPACE, ENDFILE, or the FLUSH statement.  */
2312
2313 static match
2314 match_filepos (gfc_statement st, gfc_exec_op op)
2315 {
2316   gfc_filepos *fp;
2317   match m;
2318
2319   fp = XCNEW (gfc_filepos);
2320
2321   if (gfc_match_char ('(') == MATCH_NO)
2322     {
2323       m = gfc_match_expr (&fp->unit);
2324       if (m == MATCH_ERROR)
2325         goto cleanup;
2326       if (m == MATCH_NO)
2327         goto syntax;
2328
2329       goto done;
2330     }
2331
2332   m = match_file_element (fp);
2333   if (m == MATCH_ERROR)
2334     goto done;
2335   if (m == MATCH_NO)
2336     {
2337       m = gfc_match_expr (&fp->unit);
2338       if (m == MATCH_ERROR)
2339         goto done;
2340       if (m == MATCH_NO)
2341         goto syntax;
2342     }
2343
2344   for (;;)
2345     {
2346       if (gfc_match_char (')') == MATCH_YES)
2347         break;
2348       if (gfc_match_char (',') != MATCH_YES)
2349         goto syntax;
2350
2351       m = match_file_element (fp);
2352       if (m == MATCH_ERROR)
2353         goto cleanup;
2354       if (m == MATCH_NO)
2355         goto syntax;
2356     }
2357
2358 done:
2359   if (gfc_match_eos () != MATCH_YES)
2360     goto syntax;
2361
2362   if (gfc_pure (NULL))
2363     {
2364       gfc_error ("%s statement not allowed in PURE procedure at %C",
2365                  gfc_ascii_statement (st));
2366
2367       goto cleanup;
2368     }
2369
2370   new_st.op = op;
2371   new_st.ext.filepos = fp;
2372   return MATCH_YES;
2373
2374 syntax:
2375   gfc_syntax_error (st);
2376
2377 cleanup:
2378   gfc_free_filepos (fp);
2379   return MATCH_ERROR;
2380 }
2381
2382
2383 gfc_try
2384 gfc_resolve_filepos (gfc_filepos *fp)
2385 {
2386   RESOLVE_TAG (&tag_unit, fp->unit);
2387   RESOLVE_TAG (&tag_iostat, fp->iostat);
2388   RESOLVE_TAG (&tag_iomsg, fp->iomsg);
2389   if (gfc_reference_st_label (fp->err, ST_LABEL_TARGET) == FAILURE)
2390     return FAILURE;
2391
2392   if (fp->unit->expr_type == EXPR_CONSTANT
2393       && fp->unit->ts.type == BT_INTEGER
2394       && mpz_sgn (fp->unit->value.integer) < 0)
2395     {
2396       gfc_error ("UNIT number in statement at %L must be non-negative",
2397                  &fp->unit->where);
2398     }
2399
2400   return SUCCESS;
2401 }
2402
2403
2404 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2405    and the FLUSH statement.  */
2406
2407 match
2408 gfc_match_endfile (void)
2409 {
2410   return match_filepos (ST_END_FILE, EXEC_ENDFILE);
2411 }
2412
2413 match
2414 gfc_match_backspace (void)
2415 {
2416   return match_filepos (ST_BACKSPACE, EXEC_BACKSPACE);
2417 }
2418
2419 match
2420 gfc_match_rewind (void)
2421 {
2422   return match_filepos (ST_REWIND, EXEC_REWIND);
2423 }
2424
2425 match
2426 gfc_match_flush (void)
2427 {
2428   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C")
2429       == FAILURE)
2430     return MATCH_ERROR;
2431
2432   return match_filepos (ST_FLUSH, EXEC_FLUSH);
2433 }
2434
2435 /******************** Data Transfer Statements *********************/
2436
2437 /* Return a default unit number.  */
2438
2439 static gfc_expr *
2440 default_unit (io_kind k)
2441 {
2442   int unit;
2443
2444   if (k == M_READ)
2445     unit = 5;
2446   else
2447     unit = 6;
2448
2449   return gfc_get_int_expr (gfc_default_integer_kind, NULL, unit);
2450 }
2451
2452
2453 /* Match a unit specification for a data transfer statement.  */
2454
2455 static match
2456 match_dt_unit (io_kind k, gfc_dt *dt)
2457 {
2458   gfc_expr *e;
2459
2460   if (gfc_match_char ('*') == MATCH_YES)
2461     {
2462       if (dt->io_unit != NULL)
2463         goto conflict;
2464
2465       dt->io_unit = default_unit (k);
2466       return MATCH_YES;
2467     }
2468
2469   if (gfc_match_expr (&e) == MATCH_YES)
2470     {
2471       if (dt->io_unit != NULL)
2472         {
2473           gfc_free_expr (e);
2474           goto conflict;
2475         }
2476
2477       dt->io_unit = e;
2478       return MATCH_YES;
2479     }
2480
2481   return MATCH_NO;
2482
2483 conflict:
2484   gfc_error ("Duplicate UNIT specification at %C");
2485   return MATCH_ERROR;
2486 }
2487
2488
2489 /* Match a format specification.  */
2490
2491 static match
2492 match_dt_format (gfc_dt *dt)
2493 {
2494   locus where;
2495   gfc_expr *e;
2496   gfc_st_label *label;
2497   match m;
2498
2499   where = gfc_current_locus;
2500
2501   if (gfc_match_char ('*') == MATCH_YES)
2502     {
2503       if (dt->format_expr != NULL || dt->format_label != NULL)
2504         goto conflict;
2505
2506       dt->format_label = &format_asterisk;
2507       return MATCH_YES;
2508     }
2509
2510   if ((m = gfc_match_st_label (&label)) == MATCH_YES)
2511     {
2512       if (dt->format_expr != NULL || dt->format_label != NULL)
2513         {
2514           gfc_free_st_label (label);
2515           goto conflict;
2516         }
2517
2518       if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE)
2519         return MATCH_ERROR;
2520
2521       dt->format_label = label;
2522       return MATCH_YES;
2523     }
2524   else if (m == MATCH_ERROR)
2525     /* The label was zero or too large.  Emit the correct diagnosis.  */
2526     return MATCH_ERROR;
2527
2528   if (gfc_match_expr (&e) == MATCH_YES)
2529     {
2530       if (dt->format_expr != NULL || dt->format_label != NULL)
2531         {
2532           gfc_free_expr (e);
2533           goto conflict;
2534         }
2535       dt->format_expr = e;
2536       return MATCH_YES;
2537     }
2538
2539   gfc_current_locus = where;    /* The only case where we have to restore */
2540
2541   return MATCH_NO;
2542
2543 conflict:
2544   gfc_error ("Duplicate format specification at %C");
2545   return MATCH_ERROR;
2546 }
2547
2548
2549 /* Traverse a namelist that is part of a READ statement to make sure
2550    that none of the variables in the namelist are INTENT(IN).  Returns
2551    nonzero if we find such a variable.  */
2552
2553 static int
2554 check_namelist (gfc_symbol *sym)
2555 {
2556   gfc_namelist *p;
2557
2558   for (p = sym->namelist; p; p = p->next)
2559     if (p->sym->attr.intent == INTENT_IN)
2560       {
2561         gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2562                    p->sym->name, sym->name);
2563         return 1;
2564       }
2565
2566   return 0;
2567 }
2568
2569
2570 /* Match a single data transfer element.  */
2571
2572 static match
2573 match_dt_element (io_kind k, gfc_dt *dt)
2574 {
2575   char name[GFC_MAX_SYMBOL_LEN + 1];
2576   gfc_symbol *sym;
2577   match m;
2578
2579   if (gfc_match (" unit =") == MATCH_YES)
2580     {
2581       m = match_dt_unit (k, dt);
2582       if (m != MATCH_NO)
2583         return m;
2584     }
2585
2586   if (gfc_match (" fmt =") == MATCH_YES)
2587     {
2588       m = match_dt_format (dt);
2589       if (m != MATCH_NO)
2590         return m;
2591     }
2592
2593   if (gfc_match (" nml = %n", name) == MATCH_YES)
2594     {
2595       if (dt->namelist != NULL)
2596         {
2597           gfc_error ("Duplicate NML specification at %C");
2598           return MATCH_ERROR;
2599         }
2600
2601       if (gfc_find_symbol (name, NULL, 1, &sym))
2602         return MATCH_ERROR;
2603
2604       if (sym == NULL || sym->attr.flavor != FL_NAMELIST)
2605         {
2606           gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2607                      sym != NULL ? sym->name : name);
2608           return MATCH_ERROR;
2609         }
2610
2611       dt->namelist = sym;
2612       if (k == M_READ && check_namelist (sym))
2613         return MATCH_ERROR;
2614
2615       return MATCH_YES;
2616     }
2617
2618   m = match_etag (&tag_e_async, &dt->asynchronous);
2619   if (m != MATCH_NO)
2620     return m;
2621   m = match_etag (&tag_e_blank, &dt->blank);
2622   if (m != MATCH_NO)
2623     return m;
2624   m = match_etag (&tag_e_delim, &dt->delim);
2625   if (m != MATCH_NO)
2626     return m;
2627   m = match_etag (&tag_e_pad, &dt->pad);
2628   if (m != MATCH_NO)
2629     return m;
2630   m = match_etag (&tag_e_sign, &dt->sign);
2631   if (m != MATCH_NO)
2632     return m;
2633   m = match_etag (&tag_e_round, &dt->round);
2634   if (m != MATCH_NO)
2635     return m;
2636   m = match_out_tag (&tag_id, &dt->id);
2637   if (m != MATCH_NO)
2638     return m;
2639   m = match_etag (&tag_e_decimal, &dt->decimal);
2640   if (m != MATCH_NO)
2641     return m;
2642   m = match_etag (&tag_rec, &dt->rec);
2643   if (m != MATCH_NO)
2644     return m;
2645   m = match_etag (&tag_spos, &dt->pos);
2646   if (m != MATCH_NO)
2647     return m;
2648   m = match_out_tag (&tag_iomsg, &dt->iomsg);
2649   if (m != MATCH_NO)
2650     return m;
2651   m = match_out_tag (&tag_iostat, &dt->iostat);
2652   if (m != MATCH_NO)
2653     return m;
2654   m = match_ltag (&tag_err, &dt->err);
2655   if (m == MATCH_YES)
2656     dt->err_where = gfc_current_locus;
2657   if (m != MATCH_NO)
2658     return m;
2659   m = match_etag (&tag_advance, &dt->advance);
2660   if (m != MATCH_NO)
2661     return m;
2662   m = match_out_tag (&tag_size, &dt->size);
2663   if (m != MATCH_NO)
2664     return m;
2665
2666   m = match_ltag (&tag_end, &dt->end);
2667   if (m == MATCH_YES)
2668     {
2669       if (k == M_WRITE)
2670        {
2671          gfc_error ("END tag at %C not allowed in output statement");
2672          return MATCH_ERROR;
2673        }
2674       dt->end_where = gfc_current_locus;
2675     }
2676   if (m != MATCH_NO)
2677     return m;
2678
2679   m = match_ltag (&tag_eor, &dt->eor);
2680   if (m == MATCH_YES)
2681     dt->eor_where = gfc_current_locus;
2682   if (m != MATCH_NO)
2683     return m;
2684
2685   return MATCH_NO;
2686 }
2687
2688
2689 /* Free a data transfer structure and everything below it.  */
2690
2691 void
2692 gfc_free_dt (gfc_dt *dt)
2693 {
2694   if (dt == NULL)
2695     return;
2696
2697   gfc_free_expr (dt->io_unit);
2698   gfc_free_expr (dt->format_expr);
2699   gfc_free_expr (dt->rec);
2700   gfc_free_expr (dt->advance);
2701   gfc_free_expr (dt->iomsg);
2702   gfc_free_expr (dt->iostat);
2703   gfc_free_expr (dt->size);
2704   gfc_free_expr (dt->pad);
2705   gfc_free_expr (dt->delim);
2706   gfc_free_expr (dt->sign);
2707   gfc_free_expr (dt->round);
2708   gfc_free_expr (dt->blank);
2709   gfc_free_expr (dt->decimal);
2710   gfc_free_expr (dt->extra_comma);
2711   gfc_free_expr (dt->pos);
2712   gfc_free (dt);
2713 }
2714
2715
2716 /* Resolve everything in a gfc_dt structure.  */
2717
2718 gfc_try
2719 gfc_resolve_dt (gfc_dt *dt, locus *loc)
2720 {
2721   gfc_expr *e;
2722
2723   RESOLVE_TAG (&tag_format, dt->format_expr);
2724   RESOLVE_TAG (&tag_rec, dt->rec);
2725   RESOLVE_TAG (&tag_spos, dt->pos);
2726   RESOLVE_TAG (&tag_advance, dt->advance);
2727   RESOLVE_TAG (&tag_id, dt->id);
2728   RESOLVE_TAG (&tag_iomsg, dt->iomsg);
2729   RESOLVE_TAG (&tag_iostat, dt->iostat);
2730   RESOLVE_TAG (&tag_size, dt->size);
2731   RESOLVE_TAG (&tag_e_pad, dt->pad);
2732   RESOLVE_TAG (&tag_e_delim, dt->delim);
2733   RESOLVE_TAG (&tag_e_sign, dt->sign);
2734   RESOLVE_TAG (&tag_e_round, dt->round);
2735   RESOLVE_TAG (&tag_e_blank, dt->blank);
2736   RESOLVE_TAG (&tag_e_decimal, dt->decimal);
2737   RESOLVE_TAG (&tag_e_async, dt->asynchronous);
2738
2739   e = dt->io_unit;
2740   if (e == NULL)
2741     {
2742       gfc_error ("UNIT not specified at %L", loc);
2743       return FAILURE;
2744     }
2745
2746   if (gfc_resolve_expr (e) == SUCCESS
2747       && (e->ts.type != BT_INTEGER
2748           && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE)))
2749     {
2750       /* If there is no extra comma signifying the "format" form of the IO
2751          statement, then this must be an error.  */
2752       if (!dt->extra_comma)
2753         {
2754           gfc_error ("UNIT specification at %L must be an INTEGER expression "
2755                      "or a CHARACTER variable", &e->where);
2756           return FAILURE;
2757         }
2758       else
2759         {
2760           /* At this point, we have an extra comma.  If io_unit has arrived as
2761              type character, we assume its really the "format" form of the I/O
2762              statement.  We set the io_unit to the default unit and format to
2763              the character expression.  See F95 Standard section 9.4.  */
2764           io_kind k;
2765           k = dt->extra_comma->value.iokind;
2766           if (e->ts.type == BT_CHARACTER && (k == M_READ || k == M_PRINT))
2767             {
2768               dt->format_expr = dt->io_unit;
2769               dt->io_unit = default_unit (k);
2770
2771               /* Free this pointer now so that a warning/error is not triggered
2772                  below for the "Extension".  */
2773               gfc_free_expr (dt->extra_comma);
2774               dt->extra_comma = NULL;
2775             }
2776
2777           if (k == M_WRITE)
2778             {
2779               gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2780                          &dt->extra_comma->where);
2781               return FAILURE;
2782             }
2783         }
2784     }
2785
2786   if (e->ts.type == BT_CHARACTER)
2787     {
2788       if (gfc_has_vector_index (e))
2789         {
2790           gfc_error ("Internal unit with vector subscript at %L", &e->where);
2791           return FAILURE;
2792         }
2793     }
2794
2795   if (e->rank && e->ts.type != BT_CHARACTER)
2796     {
2797       gfc_error ("External IO UNIT cannot be an array at %L", &e->where);
2798       return FAILURE;
2799     }
2800
2801   if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_INTEGER
2802       && mpz_sgn (e->value.integer) < 0)
2803     {
2804       gfc_error ("UNIT number in statement at %L must be non-negative", &e->where);
2805       return FAILURE;
2806     }
2807
2808   if (dt->extra_comma
2809       && gfc_notify_std (GFC_STD_GNU, "Extension: Comma before i/o "
2810                          "item list at %L", &dt->extra_comma->where) == FAILURE)
2811     return FAILURE;
2812
2813   if (dt->err)
2814     {
2815       if (gfc_reference_st_label (dt->err, ST_LABEL_TARGET) == FAILURE)
2816         return FAILURE;
2817       if (dt->err->defined == ST_LABEL_UNKNOWN)
2818         {
2819           gfc_error ("ERR tag label %d at %L not defined",
2820                       dt->err->value, &dt->err_where);
2821           return FAILURE;
2822         }
2823     }
2824
2825   if (dt->end)
2826     {
2827       if (gfc_reference_st_label (dt->end, ST_LABEL_TARGET) == FAILURE)
2828         return FAILURE;
2829       if (dt->end->defined == ST_LABEL_UNKNOWN)
2830         {
2831           gfc_error ("END tag label %d at %L not defined",
2832                       dt->end->value, &dt->end_where);
2833           return FAILURE;
2834         }
2835     }
2836
2837   if (dt->eor)
2838     {
2839       if (gfc_reference_st_label (dt->eor, ST_LABEL_TARGET) == FAILURE)
2840         return FAILURE;
2841       if (dt->eor->defined == ST_LABEL_UNKNOWN)
2842         {
2843           gfc_error ("EOR tag label %d at %L not defined",
2844                       dt->eor->value, &dt->eor_where);
2845           return FAILURE;
2846         }
2847     }
2848
2849   /* Check the format label actually exists.  */
2850   if (dt->format_label && dt->format_label != &format_asterisk
2851       && dt->format_label->defined == ST_LABEL_UNKNOWN)
2852     {
2853       gfc_error ("FORMAT label %d at %L not defined", dt->format_label->value,
2854                  &dt->format_label->where);
2855       return FAILURE;
2856     }
2857   return SUCCESS;
2858 }
2859
2860
2861 /* Given an io_kind, return its name.  */
2862
2863 static const char *
2864 io_kind_name (io_kind k)
2865 {
2866   const char *name;
2867
2868   switch (k)
2869     {
2870     case M_READ:
2871       name = "READ";
2872       break;
2873     case M_WRITE:
2874       name = "WRITE";
2875       break;
2876     case M_PRINT:
2877       name = "PRINT";
2878       break;
2879     case M_INQUIRE:
2880       name = "INQUIRE";
2881       break;
2882     default:
2883       gfc_internal_error ("io_kind_name(): bad I/O-kind");
2884     }
2885
2886   return name;
2887 }
2888
2889
2890 /* Match an IO iteration statement of the form:
2891
2892    ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2893
2894    which is equivalent to a single IO element.  This function is
2895    mutually recursive with match_io_element().  */
2896
2897 static match match_io_element (io_kind, gfc_code **);
2898
2899 static match
2900 match_io_iterator (io_kind k, gfc_code **result)
2901 {
2902   gfc_code *head, *tail, *new_code;
2903   gfc_iterator *iter;
2904   locus old_loc;
2905   match m;
2906   int n;
2907
2908   iter = NULL;
2909   head = NULL;
2910   old_loc = gfc_current_locus;
2911
2912   if (gfc_match_char ('(') != MATCH_YES)
2913     return MATCH_NO;
2914
2915   m = match_io_element (k, &head);
2916   tail = head;
2917
2918   if (m != MATCH_YES || gfc_match_char (',') != MATCH_YES)
2919     {
2920       m = MATCH_NO;
2921       goto cleanup;
2922     }
2923
2924   /* Can't be anything but an IO iterator.  Build a list.  */
2925   iter = gfc_get_iterator ();
2926
2927   for (n = 1;; n++)
2928     {
2929       m = gfc_match_iterator (iter, 0);
2930       if (m == MATCH_ERROR)
2931         goto cleanup;
2932       if (m == MATCH_YES)
2933         {
2934           gfc_check_do_variable (iter->var->symtree);
2935           break;
2936         }
2937
2938       m = match_io_element (k, &new_code);
2939       if (m == MATCH_ERROR)
2940         goto cleanup;
2941       if (m == MATCH_NO)
2942         {
2943           if (n > 2)
2944             goto syntax;
2945           goto cleanup;
2946         }
2947
2948       tail = gfc_append_code (tail, new_code);
2949
2950       if (gfc_match_char (',') != MATCH_YES)
2951         {
2952           if (n > 2)
2953             goto syntax;
2954           m = MATCH_NO;
2955           goto cleanup;
2956         }
2957     }
2958
2959   if (gfc_match_char (')') != MATCH_YES)
2960     goto syntax;
2961
2962   new_code = gfc_get_code ();
2963   new_code->op = EXEC_DO;
2964   new_code->ext.iterator = iter;
2965
2966   new_code->block = gfc_get_code ();
2967   new_code->block->op = EXEC_DO;
2968   new_code->block->next = head;
2969
2970   *result = new_code;
2971   return MATCH_YES;
2972
2973 syntax:
2974   gfc_error ("Syntax error in I/O iterator at %C");
2975   m = MATCH_ERROR;
2976
2977 cleanup:
2978   gfc_free_iterator (iter, 1);
2979   gfc_free_statements (head);
2980   gfc_current_locus = old_loc;
2981   return m;
2982 }
2983
2984
2985 /* Match a single element of an IO list, which is either a single
2986    expression or an IO Iterator.  */
2987
2988 static match
2989 match_io_element (io_kind k, gfc_code **cpp)
2990 {
2991   gfc_expr *expr;
2992   gfc_code *cp;
2993   match m;
2994
2995   expr = NULL;
2996
2997   m = match_io_iterator (k, cpp);
2998   if (m == MATCH_YES)
2999     return MATCH_YES;
3000
3001   if (k == M_READ)
3002     {
3003       m = gfc_match_variable (&expr, 0);
3004       if (m == MATCH_NO)
3005         gfc_error ("Expected variable in READ statement at %C");
3006     }
3007   else
3008     {
3009       m = gfc_match_expr (&expr);
3010       if (m == MATCH_NO)
3011         gfc_error ("Expected expression in %s statement at %C",
3012                    io_kind_name (k));
3013     }
3014
3015   if (m == MATCH_YES)
3016     switch (k)
3017       {
3018       case M_READ:
3019         if (expr->symtree->n.sym->attr.intent == INTENT_IN)
3020           {
3021             gfc_error ("Variable '%s' in input list at %C cannot be "
3022                        "INTENT(IN)", expr->symtree->n.sym->name);
3023             m = MATCH_ERROR;
3024           }
3025
3026         if (gfc_pure (NULL)
3027             && gfc_impure_variable (expr->symtree->n.sym)
3028             && current_dt->io_unit
3029             && current_dt->io_unit->ts.type == BT_CHARACTER)
3030           {
3031             gfc_error ("Cannot read to variable '%s' in PURE procedure at %C",
3032                        expr->symtree->n.sym->name);
3033             m = MATCH_ERROR;
3034           }
3035
3036         if (gfc_check_do_variable (expr->symtree))
3037           m = MATCH_ERROR;
3038
3039         break;
3040
3041       case M_WRITE:
3042         if (current_dt->io_unit
3043             && current_dt->io_unit->ts.type == BT_CHARACTER
3044             && gfc_pure (NULL)
3045             && current_dt->io_unit->expr_type == EXPR_VARIABLE
3046             && gfc_impure_variable (current_dt->io_unit->symtree->n.sym))
3047           {
3048             gfc_error ("Cannot write to internal file unit '%s' at %C "
3049                        "inside a PURE procedure",
3050                        current_dt->io_unit->symtree->n.sym->name);
3051             m = MATCH_ERROR;
3052           }
3053
3054         break;
3055
3056       default:
3057         break;
3058       }
3059
3060   if (m != MATCH_YES)
3061     {
3062       gfc_free_expr (expr);
3063       return MATCH_ERROR;
3064     }
3065
3066   cp = gfc_get_code ();
3067   cp->op = EXEC_TRANSFER;
3068   cp->expr1 = expr;
3069
3070   *cpp = cp;
3071   return MATCH_YES;
3072 }
3073
3074
3075 /* Match an I/O list, building gfc_code structures as we go.  */
3076
3077 static match
3078 match_io_list (io_kind k, gfc_code **head_p)
3079 {
3080   gfc_code *head, *tail, *new_code;
3081   match m;
3082
3083   *head_p = head = tail = NULL;
3084   if (gfc_match_eos () == MATCH_YES)
3085     return MATCH_YES;
3086
3087   for (;;)
3088     {
3089       m = match_io_element (k, &new_code);
3090       if (m == MATCH_ERROR)
3091         goto cleanup;
3092       if (m == MATCH_NO)
3093         goto syntax;
3094
3095       tail = gfc_append_code (tail, new_code);
3096       if (head == NULL)
3097         head = new_code;
3098
3099       if (gfc_match_eos () == MATCH_YES)
3100         break;
3101       if (gfc_match_char (',') != MATCH_YES)
3102         goto syntax;
3103     }
3104
3105   *head_p = head;
3106   return MATCH_YES;
3107
3108 syntax:
3109   gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3110
3111 cleanup:
3112   gfc_free_statements (head);
3113   return MATCH_ERROR;
3114 }
3115
3116
3117 /* Attach the data transfer end node.  */
3118
3119 static void
3120 terminate_io (gfc_code *io_code)
3121 {
3122   gfc_code *c;
3123
3124   if (io_code == NULL)
3125     io_code = new_st.block;
3126
3127   c = gfc_get_code ();
3128   c->op = EXEC_DT_END;
3129
3130   /* Point to structure that is already there */
3131   c->ext.dt = new_st.ext.dt;
3132   gfc_append_code (io_code, c);
3133 }
3134
3135
3136 /* Check the constraints for a data transfer statement.  The majority of the
3137    constraints appearing in 9.4 of the standard appear here.  Some are handled
3138    in resolve_tag and others in gfc_resolve_dt.  */
3139
3140 static match
3141 check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code,
3142                       locus *spec_end)
3143 {
3144 #define io_constraint(condition,msg,arg)\
3145 if (condition) \
3146   {\
3147     gfc_error(msg,arg);\
3148     m = MATCH_ERROR;\
3149   }
3150
3151   match m;
3152   gfc_expr *expr;
3153   gfc_symbol *sym = NULL;
3154   bool warn, unformatted;
3155
3156   warn = (dt->err || dt->iostat) ? true : false;
3157   unformatted = dt->format_expr == NULL && dt->format_label == NULL
3158                 && dt->namelist == NULL;
3159
3160   m = MATCH_YES;
3161
3162   expr = dt->io_unit;
3163   if (expr && expr->expr_type == EXPR_VARIABLE
3164       && expr->ts.type == BT_CHARACTER)
3165     {
3166       sym = expr->symtree->n.sym;
3167
3168       io_constraint (k == M_WRITE && sym->attr.intent == INTENT_IN,
3169                      "Internal file at %L must not be INTENT(IN)",
3170                      &expr->where);
3171
3172       io_constraint (gfc_has_vector_index (dt->io_unit),
3173                      "Internal file incompatible with vector subscript at %L",
3174                      &expr->where);
3175
3176       io_constraint (dt->rec != NULL,
3177                      "REC tag at %L is incompatible with internal file",
3178                      &dt->rec->where);
3179     
3180       io_constraint (dt->pos != NULL,
3181                      "POS tag at %L is incompatible with internal file",
3182                      &dt->pos->where);
3183
3184       io_constraint (unformatted,
3185                      "Unformatted I/O not allowed with internal unit at %L",
3186                      &dt->io_unit->where);
3187
3188       io_constraint (dt->asynchronous != NULL,
3189                      "ASYNCHRONOUS tag at %L not allowed with internal file",
3190                      &dt->asynchronous->where);
3191
3192       if (dt->namelist != NULL)
3193         {
3194           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Internal file "
3195                               "at %L with namelist", &expr->where)
3196               == FAILURE)
3197             m = MATCH_ERROR;
3198         }
3199
3200       io_constraint (dt->advance != NULL,
3201                      "ADVANCE tag at %L is incompatible with internal file",
3202                      &dt->advance->where);
3203     }
3204
3205   if (expr && expr->ts.type != BT_CHARACTER)
3206     {
3207
3208       io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE),
3209                      "IO UNIT in %s statement at %C must be "
3210                      "an internal file in a PURE procedure",
3211                      io_kind_name (k));
3212     }
3213
3214   if (k != M_READ)
3215     {
3216       io_constraint (dt->end, "END tag not allowed with output at %L",
3217                      &dt->end_where);
3218
3219       io_constraint (dt->eor, "EOR tag not allowed with output at %L",
3220                      &dt->eor_where);
3221
3222       io_constraint (dt->blank, "BLANK= specifier not allowed with output at %L",
3223                      &dt->blank->where);
3224
3225       io_constraint (dt->pad, "PAD= specifier not allowed with output at %L",
3226                      &dt->pad->where);
3227
3228       io_constraint (dt->size, "SIZE= specifier not allowed with output at %L",
3229                      &dt->size->where);
3230     }
3231   else
3232     {
3233       io_constraint (dt->size && dt->advance == NULL,
3234                      "SIZE tag at %L requires an ADVANCE tag",
3235                      &dt->size->where);
3236
3237       io_constraint (dt->eor && dt->advance == NULL,
3238                      "EOR tag at %L requires an ADVANCE tag",
3239                      &dt->eor_where);
3240     }
3241
3242   if (dt->asynchronous) 
3243     {
3244       static const char * asynchronous[] = { "YES", "NO", NULL };
3245
3246       if (gfc_reduce_init_expr (dt->asynchronous) != SUCCESS)
3247         {
3248           gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3249                      "expression", &dt->asynchronous->where);
3250           return MATCH_ERROR;
3251         }
3252
3253       if (!compare_to_allowed_values
3254                 ("ASYNCHRONOUS", asynchronous, NULL, NULL,
3255                  dt->asynchronous->value.character.string,
3256                  io_kind_name (k), warn))
3257         return MATCH_ERROR;
3258     }
3259
3260   if (dt->id)
3261     {
3262       bool not_yes
3263         = !dt->asynchronous
3264           || gfc_wide_strlen (dt->asynchronous->value.character.string) != 3
3265           || gfc_wide_strncasecmp (dt->asynchronous->value.character.string,
3266                                    "yes", 3) != 0;
3267       io_constraint (not_yes,
3268                      "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3269                      "specifier", &dt->id->where);
3270     }
3271
3272   if (dt->decimal)
3273     {
3274       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
3275           "not allowed in Fortran 95") == FAILURE)
3276         return MATCH_ERROR;
3277
3278       if (dt->decimal->expr_type == EXPR_CONSTANT)
3279         {
3280           static const char * decimal[] = { "COMMA", "POINT", NULL };
3281
3282           if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
3283                                           dt->decimal->value.character.string,
3284                                           io_kind_name (k), warn))
3285             return MATCH_ERROR;
3286
3287           io_constraint (unformatted,
3288                          "the DECIMAL= specifier at %L must be with an "
3289                          "explicit format expression", &dt->decimal->where);
3290         }
3291     }
3292   
3293   if (dt->blank)
3294     {
3295       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
3296           "not allowed in Fortran 95") == FAILURE)
3297         return MATCH_ERROR;
3298
3299       if (dt->blank->expr_type == EXPR_CONSTANT)
3300         {
3301           static const char * blank[] = { "NULL", "ZERO", NULL };
3302
3303           if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
3304                                           dt->blank->value.character.string,
3305                                           io_kind_name (k), warn))
3306             return MATCH_ERROR;
3307
3308           io_constraint (unformatted,
3309                          "the BLANK= specifier at %L must be with an "
3310                          "explicit format expression", &dt->blank->where);
3311         }
3312     }
3313
3314   if (dt->pad)
3315     {
3316       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PAD= at %C "
3317           "not allowed in Fortran 95") == FAILURE)
3318         return MATCH_ERROR;
3319
3320       if (dt->pad->expr_type == EXPR_CONSTANT)
3321         {
3322           static const char * pad[] = { "YES", "NO", NULL };
3323
3324           if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
3325                                           dt->pad->value.character.string,
3326                                           io_kind_name (k), warn))
3327             return MATCH_ERROR;
3328
3329           io_constraint (unformatted,
3330                          "the PAD= specifier at %L must be with an "
3331                          "explicit format expression", &dt->pad->where);
3332         }
3333     }
3334
3335   if (dt->round)
3336     {
3337       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ROUND= at %C "
3338           "not allowed in Fortran 95") == FAILURE)
3339         return MATCH_ERROR;
3340
3341       if (dt->round->expr_type == EXPR_CONSTANT)
3342         {
3343           static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
3344                                           "COMPATIBLE", "PROCESSOR_DEFINED",
3345                                           NULL };
3346
3347           if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
3348                                           dt->round->value.character.string,
3349                                           io_kind_name (k), warn))
3350             return MATCH_ERROR;
3351         }
3352     }
3353   
3354   if (dt->sign)
3355     {
3356       /* When implemented, change the following to use gfc_notify_std F2003.
3357       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
3358           "not allowed in Fortran 95") == FAILURE)
3359         return MATCH_ERROR;  */
3360       if (dt->sign->expr_type == EXPR_CONSTANT)
3361         {
3362           static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3363                                          NULL };
3364
3365           if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
3366                                       dt->sign->value.character.string,
3367                                       io_kind_name (k), warn))
3368             return MATCH_ERROR;
3369
3370           io_constraint (unformatted,
3371                          "SIGN= specifier at %L must be with an "
3372                          "explicit format expression", &dt->sign->where);
3373
3374           io_constraint (k == M_READ,
3375                          "SIGN= specifier at %L not allowed in a "
3376                          "READ statement", &dt->sign->where);
3377         }
3378     }
3379
3380   if (dt->delim)
3381     {
3382       if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
3383           "not allowed in Fortran 95") == FAILURE)
3384         return MATCH_ERROR;
3385
3386       if (dt->delim->expr_type == EXPR_CONSTANT)
3387         {
3388           static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
3389
3390           if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
3391                                           dt->delim->value.character.string,
3392                                           io_kind_name (k), warn))
3393             return MATCH_ERROR;
3394
3395           io_constraint (k == M_READ,
3396                          "DELIM= specifier at %L not allowed in a "
3397                          "READ statement", &dt->delim->where);
3398       
3399           io_constraint (dt->format_label != &format_asterisk
3400                          && dt->namelist == NULL,
3401                          "DELIM= specifier at %L must have FMT=*",
3402                          &dt->delim->where);
3403
3404           io_constraint (unformatted && dt->namelist == NULL,
3405                          "DELIM= specifier at %L must be with FMT=* or "
3406                          "NML= specifier ", &dt->delim->where);
3407         }
3408     }
3409   
3410   if (dt->namelist)
3411     {
3412       io_constraint (io_code && dt->namelist,
3413                      "NAMELIST cannot be followed by IO-list at %L",
3414                      &io_code->loc);
3415
3416       io_constraint (dt->format_expr,
3417                      "IO spec-list cannot contain both NAMELIST group name "
3418                      "and format specification at %L",
3419                      &dt->format_expr->where);
3420
3421       io_constraint (dt->format_label,
3422                      "IO spec-list cannot contain both NAMELIST group name "
3423                      "and format label at %L", spec_end);
3424
3425       io_constraint (dt->rec,
3426                      "NAMELIST IO is not allowed with a REC= specifier "
3427                      "at %L", &dt->rec->where);
3428
3429       io_constraint (dt->advance,
3430                      "NAMELIST IO is not allowed with a ADVANCE= specifier "
3431                      "at %L", &dt->advance->where);
3432     }
3433
3434   if (dt->rec)
3435     {
3436       io_constraint (dt->end,
3437                      "An END tag is not allowed with a "
3438                      "REC= specifier at %L", &dt->end_where);
3439
3440       io_constraint (dt->format_label == &format_asterisk,
3441                      "FMT=* is not allowed with a REC= specifier "
3442                      "at %L", spec_end);
3443
3444       io_constraint (dt->pos,
3445                      "POS= is not allowed with REC= specifier "
3446                      "at %L", &dt->pos->where);
3447     }
3448
3449   if (dt->advance)
3450     {
3451       int not_yes, not_no;
3452       expr = dt->advance;
3453
3454       io_constraint (dt->format_label == &format_asterisk,
3455                      "List directed format(*) is not allowed with a "
3456                      "ADVANCE= specifier at %L.", &expr->where);
3457
3458       io_constraint (unformatted,
3459                      "the ADVANCE= specifier at %L must appear with an "
3460                      "explicit format expression", &expr->where);
3461
3462       if (expr->expr_type == EXPR_CONSTANT && expr->ts.type == BT_CHARACTER)
3463         {
3464           const gfc_char_t *advance = expr->value.character.string;
3465           not_no = gfc_wide_strlen (advance) != 2
3466                    || gfc_wide_strncasecmp (advance, "no", 2) != 0;
3467           not_yes = gfc_wide_strlen (advance) != 3
3468                     || gfc_wide_strncasecmp (advance, "yes", 3) != 0;
3469         }
3470       else
3471         {
3472           not_no = 0;
3473           not_yes = 0;
3474         }
3475
3476       io_constraint (not_no && not_yes,
3477                      "ADVANCE= specifier at %L must have value = "
3478                      "YES or NO.", &expr->where);
3479
3480       io_constraint (dt->size && not_no && k == M_READ,
3481                      "SIZE tag at %L requires an ADVANCE = 'NO'",
3482                      &dt->size->where);
3483
3484       io_constraint (dt->eor && not_no && k == M_READ,
3485                      "EOR tag at %L requires an ADVANCE = 'NO'",
3486                      &dt->eor_where);      
3487     }
3488
3489   expr = dt->format_expr;
3490   if (gfc_simplify_expr (expr, 0) == FAILURE
3491       || check_format_string (expr, k == M_READ) == FAILURE)
3492     return MATCH_ERROR;
3493
3494   return m;
3495 }
3496 #undef io_constraint
3497
3498
3499 /* Match a READ, WRITE or PRINT statement.  */
3500
3501 static match
3502 match_io (io_kind k)
3503 {
3504   char name[GFC_MAX_SYMBOL_LEN + 1];
3505   gfc_code *io_code;
3506   gfc_symbol *sym;
3507   int comma_flag;
3508   locus where;
3509   locus spec_end;
3510   gfc_dt *dt;
3511   match m;
3512
3513   where = gfc_current_locus;
3514   comma_flag = 0;
3515   current_dt = dt = XCNEW (gfc_dt);
3516   m = gfc_match_char ('(');
3517   if (m == MATCH_NO)
3518     {
3519       where = gfc_current_locus;
3520       if (k == M_WRITE)
3521         goto syntax;
3522       else if (k == M_PRINT)
3523         {
3524           /* Treat the non-standard case of PRINT namelist.  */
3525           if ((gfc_current_form == FORM_FIXED || gfc_peek_ascii_char () == ' ')
3526               && gfc_match_name (name) == MATCH_YES)
3527             {
3528               gfc_find_symbol (name, NULL, 1, &sym);
3529               if (sym && sym->attr.flavor == FL_NAMELIST)
3530                 {
3531                   if (gfc_notify_std (GFC_STD_GNU, "PRINT namelist at "
3532                                       "%C is an extension") == FAILURE)
3533                     {
3534                       m = MATCH_ERROR;
3535                       goto cleanup;
3536                     }
3537
3538                   dt->io_unit = default_unit (k);
3539                   dt->namelist = sym;
3540                   goto get_io_list;
3541                 }
3542               else
3543                 gfc_current_locus = where;
3544             }
3545         }
3546
3547       if (gfc_current_form == FORM_FREE)
3548         {
3549           char c = gfc_peek_ascii_char ();
3550           if (c != ' ' && c != '*' && c != '\'' && c != '"')
3551             {
3552               m = MATCH_NO;
3553               goto cleanup;
3554             }
3555         }
3556
3557       m = match_dt_format (dt);
3558       if (m == MATCH_ERROR)
3559         goto cleanup;
3560       if (m == MATCH_NO)
3561         goto syntax;
3562
3563       comma_flag = 1;
3564       dt->io_unit = default_unit (k);
3565       goto get_io_list;
3566     }
3567   else
3568     {
3569       /* Before issuing an error for a malformed 'print (1,*)' type of
3570          error, check for a default-char-expr of the form ('(I0)').  */
3571       if (k == M_PRINT && m == MATCH_YES)
3572         {
3573           /* Reset current locus to get the initial '(' in an expression.  */
3574           gfc_current_locus = where;
3575           dt->format_expr = NULL;
3576           m = match_dt_format (dt);
3577
3578           if (m == MATCH_ERROR)
3579             goto cleanup;
3580           if (m == MATCH_NO || dt->format_expr == NULL)
3581             goto syntax;
3582
3583           comma_flag = 1;
3584           dt->io_unit = default_unit (k);
3585           goto get_io_list;
3586         }
3587     }
3588
3589   /* Match a control list */
3590   if (match_dt_element (k, dt) == MATCH_YES)
3591     goto next;
3592   if (match_dt_unit (k, dt) != MATCH_YES)
3593     goto loop;
3594
3595   if (gfc_match_char (')') == MATCH_YES)
3596     goto get_io_list;
3597   if (gfc_match_char (',') != MATCH_YES)
3598     goto syntax;
3599
3600   m = match_dt_element (k, dt);
3601   if (m == MATCH_YES)
3602     goto next;
3603   if (m == MATCH_ERROR)
3604     goto cleanup;
3605
3606   m = match_dt_format (dt);
3607   if (m == MATCH_YES)
3608     goto next;
3609   if (m == MATCH_ERROR)
3610     goto cleanup;
3611
3612   where = gfc_current_locus;
3613
3614   m = gfc_match_name (name);
3615   if (m == MATCH_YES)
3616     {
3617       gfc_find_symbol (name, NULL, 1, &sym);
3618       if (sym && sym->attr.flavor == FL_NAMELIST)
3619         {
3620           dt->namelist = sym;
3621           if (k == M_READ && check_namelist (sym))
3622             {
3623               m = MATCH_ERROR;
3624               goto cleanup;
3625             }
3626           goto next;
3627         }
3628     }
3629
3630   gfc_current_locus = where;
3631
3632   goto loop;                    /* No matches, try regular elements */
3633
3634 next:
3635   if (gfc_match_char (')') == MATCH_YES)
3636     goto get_io_list;
3637   if (gfc_match_char (',') != MATCH_YES)
3638     goto syntax;
3639
3640 loop:
3641   for (;;)
3642     {
3643       m = match_dt_element (k, dt);
3644       if (m == MATCH_NO)
3645         goto syntax;
3646       if (m == MATCH_ERROR)
3647         goto cleanup;
3648
3649       if (gfc_match_char (')') == MATCH_YES)
3650         break;
3651       if (gfc_match_char (',') != MATCH_YES)
3652         goto syntax;
3653     }
3654
3655 get_io_list:
3656
3657   /* Used in check_io_constraints, where no locus is available.  */
3658   spec_end = gfc_current_locus;
3659
3660   /* Optional leading comma (non-standard).  We use a gfc_expr structure here
3661      to save the locus.  This is used later when resolving transfer statements
3662      that might have a format expression without unit number.  */
3663   if (!comma_flag && gfc_match_char (',') == MATCH_YES)
3664     {
3665       /* Save the iokind and locus for later use in resolution.  */
3666       dt->extra_comma = gfc_get_iokind_expr (&gfc_current_locus, k);
3667     }
3668
3669   io_code = NULL;
3670   if (gfc_match_eos () != MATCH_YES)
3671     {
3672       if (comma_flag && gfc_match_char (',') != MATCH_YES)
3673         {
3674           gfc_error ("Expected comma in I/O list at %C");
3675           m = MATCH_ERROR;
3676           goto cleanup;
3677         }
3678
3679       m = match_io_list (k, &io_code);
3680       if (m == MATCH_ERROR)
3681         goto cleanup;
3682       if (m == MATCH_NO)
3683         goto syntax;
3684     }
3685
3686   /* A full IO statement has been matched.  Check the constraints.  spec_end is
3687      supplied for cases where no locus is supplied.  */
3688   m = check_io_constraints (k, dt, io_code, &spec_end);
3689
3690   if (m == MATCH_ERROR)
3691     goto cleanup;
3692
3693   new_st.op = (k == M_READ) ? EXEC_READ : EXEC_WRITE;
3694   new_st.ext.dt = dt;
3695   new_st.block = gfc_get_code ();
3696   new_st.block->op = new_st.op;
3697   new_st.block->next = io_code;
3698
3699   terminate_io (io_code);
3700
3701   return MATCH_YES;
3702
3703 syntax:
3704   gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3705   m = MATCH_ERROR;
3706
3707 cleanup:
3708   gfc_free_dt (dt);
3709   return m;
3710 }
3711
3712
3713 match
3714 gfc_match_read (void)
3715 {
3716   return match_io (M_READ);
3717 }
3718
3719
3720 match
3721 gfc_match_write (void)
3722 {
3723   return match_io (M_WRITE);
3724 }
3725
3726
3727 match
3728 gfc_match_print (void)
3729 {
3730   match m;
3731
3732   m = match_io (M_PRINT);
3733   if (m != MATCH_YES)
3734     return m;
3735
3736   if (gfc_pure (NULL))
3737     {
3738       gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3739       return MATCH_ERROR;
3740     }
3741
3742   return MATCH_YES;
3743 }
3744
3745
3746 /* Free a gfc_inquire structure.  */
3747
3748 void
3749 gfc_free_inquire (gfc_inquire *inquire)
3750 {
3751
3752   if (inquire == NULL)
3753     return;
3754
3755   gfc_free_expr (inquire->unit);
3756   gfc_free_expr (inquire->file);
3757   gfc_free_expr (inquire->iomsg);
3758   gfc_free_expr (inquire->iostat);
3759   gfc_free_expr (inquire->exist);
3760   gfc_free_expr (inquire->opened);
3761   gfc_free_expr (inquire->number);
3762   gfc_free_expr (inquire->named);
3763   gfc_free_expr (inquire->name);
3764   gfc_free_expr (inquire->access);
3765   gfc_free_expr (inquire->sequential);
3766   gfc_free_expr (inquire->direct);
3767   gfc_free_expr (inquire->form);
3768   gfc_free_expr (inquire->formatted);
3769   gfc_free_expr (inquire->unformatted);
3770   gfc_free_expr (inquire->recl);
3771   gfc_free_expr (inquire->nextrec);
3772   gfc_free_expr (inquire->blank);
3773   gfc_free_expr (inquire->position);
3774   gfc_free_expr (inquire->action);
3775   gfc_free_expr (inquire->read);
3776   gfc_free_expr (inquire->write);
3777   gfc_free_expr (inquire->readwrite);
3778   gfc_free_expr (inquire->delim);
3779   gfc_free_expr (inquire->encoding);
3780   gfc_free_expr (inquire->pad);
3781   gfc_free_expr (inquire->iolength);
3782   gfc_free_expr (inquire->convert);
3783   gfc_free_expr (inquire->strm_pos);
3784   gfc_free_expr (inquire->asynchronous);
3785   gfc_free_expr (inquire->decimal);
3786   gfc_free_expr (inquire->pending);
3787   gfc_free_expr (inquire->id);
3788   gfc_free_expr (inquire->sign);
3789   gfc_free_expr (inquire->size);
3790   gfc_free_expr (inquire->round);
3791   gfc_free (inquire);
3792 }
3793
3794
3795 /* Match an element of an INQUIRE statement.  */
3796
3797 #define RETM   if (m != MATCH_NO) return m;
3798
3799 static match
3800 match_inquire_element (gfc_inquire *inquire)
3801 {
3802   match m;
3803
3804   m = match_etag (&tag_unit, &inquire->unit);
3805   RETM m = match_etag (&tag_file, &inquire->file);
3806   RETM m = match_ltag (&tag_err, &inquire->err);
3807   RETM m = match_out_tag (&tag_iomsg, &inquire->iomsg);
3808   RETM m = match_out_tag (&tag_iostat, &inquire->iostat);
3809   RETM m = match_vtag (&tag_exist, &inquire->exist);
3810   RETM m = match_vtag (&tag_opened, &inquire->opened);
3811   RETM m = match_vtag (&tag_named, &inquire->named);
3812   RETM m = match_vtag (&tag_name, &inquire->name);
3813   RETM m = match_out_tag (&tag_number, &inquire->number);
3814   RETM m = match_vtag (&tag_s_access, &inquire->access);
3815   RETM m = match_vtag (&tag_sequential, &inquire->sequential);
3816   RETM m = match_vtag (&tag_direct, &inquire->direct);
3817   RETM m = match_vtag (&tag_s_form, &inquire->form);
3818   RETM m = match_vtag (&tag_formatted, &inquire->formatted);
3819   RETM m = match_vtag (&tag_unformatted, &inquire->unformatted);
3820   RETM m = match_out_tag (&tag_s_recl, &inquire->recl);
3821   RETM m = match_out_tag (&tag_nextrec, &inquire->nextrec);
3822   RETM m = match_vtag (&tag_s_blank, &inquire->blank);
3823   RETM m = match_vtag (&tag_s_position, &inquire->position);
3824   RETM m = match_vtag (&tag_s_action, &inquire->action);
3825   RETM m = match_vtag (&tag_read, &inquire->read);
3826   RETM m = match_vtag (&tag_write, &inquire->write);
3827   RETM m = match_vtag (&tag_readwrite, &inquire->readwrite);
3828   RETM m = match_vtag (&tag_s_async, &inquire->asynchronous);
3829   RETM m = match_vtag (&tag_s_delim, &inquire->delim);
3830   RETM m = match_vtag (&tag_s_decimal, &inquire->decimal);
3831   RETM m = match_vtag (&tag_size, &inquire->size);
3832   RETM m = match_vtag (&tag_s_encoding, &inquire->encoding);
3833   RETM m = match_vtag (&tag_s_round, &inquire->round);
3834   RETM m = match_vtag (&tag_s_sign, &inquire->sign);
3835   RETM m = match_vtag (&tag_s_pad, &inquire->pad);
3836   RETM m = match_vtag (&tag_iolength, &inquire->iolength);
3837   RETM m = match_vtag (&tag_convert, &inquire->convert);
3838   RETM m = match_out_tag (&tag_strm_out, &inquire->strm_pos);
3839   RETM m = match_vtag (&tag_pending, &inquire->pending);
3840   RETM m = match_vtag (&tag_id, &inquire->id);
3841   RETM return MATCH_NO;
3842 }
3843
3844 #undef RETM
3845
3846
3847 match
3848 gfc_match_inquire (void)
3849 {
3850   gfc_inquire *inquire;
3851   gfc_code *code;
3852   match m;
3853   locus loc;
3854
3855   m = gfc_match_char ('(');
3856   if (m == MATCH_NO)
3857     return m;
3858
3859   inquire = XCNEW (gfc_inquire);
3860
3861   loc = gfc_current_locus;
3862
3863   m = match_inquire_element (inquire);
3864   if (m == MATCH_ERROR)
3865     goto cleanup;
3866   if (m == MATCH_NO)
3867     {
3868       m = gfc_match_expr (&inquire->unit);
3869       if (m == MATCH_ERROR)
3870         goto cleanup;
3871       if (m == MATCH_NO)
3872         goto syntax;
3873     }
3874
3875   /* See if we have the IOLENGTH form of the inquire statement.  */
3876   if (inquire->iolength != NULL)
3877     {
3878       if (gfc_match_char (')') != MATCH_YES)
3879         goto syntax;
3880
3881       m = match_io_list (M_INQUIRE, &code);
3882       if (m == MATCH_ERROR)
3883         goto cleanup;
3884       if (m == MATCH_NO)
3885         goto syntax;
3886
3887       new_st.op = EXEC_IOLENGTH;
3888       new_st.expr1 = inquire->iolength;
3889       new_st.ext.inquire = inquire;
3890
3891       if (gfc_pure (NULL))
3892         {
3893           gfc_free_statements (code);
3894           gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3895           return MATCH_ERROR;
3896         }
3897
3898       new_st.block = gfc_get_code ();
3899       new_st.block->op = EXEC_IOLENGTH;
3900       terminate_io (code);
3901       new_st.block->next = code;
3902       return MATCH_YES;
3903     }
3904
3905   /* At this point, we have the non-IOLENGTH inquire statement.  */
3906   for (;;)
3907     {
3908       if (gfc_match_char (')') == MATCH_YES)
3909         break;
3910       if (gfc_match_char (',') != MATCH_YES)
3911         goto syntax;
3912
3913       m = match_inquire_element (inquire);
3914       if (m == MATCH_ERROR)
3915         goto cleanup;
3916       if (m == MATCH_NO)
3917         goto syntax;
3918
3919       if (inquire->iolength != NULL)
3920         {
3921           gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
3922           goto cleanup;
3923         }
3924     }
3925
3926   if (gfc_match_eos () != MATCH_YES)
3927     goto syntax;
3928
3929   if (inquire->unit != NULL && inquire->file != NULL)
3930     {
3931       gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
3932                  "UNIT specifiers", &loc);
3933       goto cleanup;
3934     }
3935
3936   if (inquire->unit == NULL && inquire->file == NULL)
3937     {
3938       gfc_error ("INQUIRE statement at %L requires either FILE or "
3939                  "UNIT specifier", &loc);
3940       goto cleanup;
3941     }
3942
3943   if (gfc_pure (NULL))
3944     {
3945       gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3946       goto cleanup;
3947     }
3948   
3949   if (inquire->id != NULL && inquire->pending == NULL)
3950     {
3951       gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
3952                  "the ID= specifier", &loc);
3953       goto cleanup;
3954     }
3955
3956   new_st.op = EXEC_INQUIRE;
3957   new_st.ext.inquire = inquire;
3958   return MATCH_YES;
3959
3960 syntax:
3961   gfc_syntax_error (ST_INQUIRE);
3962
3963 cleanup:
3964   gfc_free_inquire (inquire);
3965   return MATCH_ERROR;
3966 }
3967
3968
3969 /* Resolve everything in a gfc_inquire structure.  */
3970
3971 gfc_try
3972 gfc_resolve_inquire (gfc_inquire *inquire)
3973 {
3974   RESOLVE_TAG (&tag_unit, inquire->unit);
3975   RESOLVE_TAG (&tag_file, inquire->file);
3976   RESOLVE_TAG (&tag_iomsg, inquire->iomsg);
3977   RESOLVE_TAG (&tag_iostat, inquire->iostat);
3978   RESOLVE_TAG (&tag_exist, inquire->exist);
3979   RESOLVE_TAG (&tag_opened, inquire->opened);
3980   RESOLVE_TAG (&tag_number, inquire->number);
3981   RESOLVE_TAG (&tag_named, inquire->named);
3982   RESOLVE_TAG (&tag_name, inquire->name);
3983   RESOLVE_TAG (&tag_s_access, inquire->access);
3984   RESOLVE_TAG (&tag_sequential, inquire->sequential);
3985   RESOLVE_TAG (&tag_direct, inquire->direct);
3986   RESOLVE_TAG (&tag_s_form, inquire->form);
3987   RESOLVE_TAG (&tag_formatted, inquire->formatted);
3988   RESOLVE_TAG (&tag_unformatted, inquire->unformatted);
3989   RESOLVE_TAG (&tag_s_recl, inquire->recl);
3990   RESOLVE_TAG (&tag_nextrec, inquire->nextrec);
3991   RESOLVE_TAG (&tag_s_blank, inquire->blank);
3992   RESOLVE_TAG (&tag_s_position, inquire->position);
3993   RESOLVE_TAG (&tag_s_action, inquire->action);
3994   RESOLVE_TAG (&tag_read, inquire->read);
3995   RESOLVE_TAG (&tag_write, inquire->write);
3996   RESOLVE_TAG (&tag_readwrite, inquire->readwrite);
3997   RESOLVE_TAG (&tag_s_delim, inquire->delim);
3998   RESOLVE_TAG (&tag_s_pad, inquire->pad);
3999   RESOLVE_TAG (&tag_s_encoding, inquire->encoding);
4000   RESOLVE_TAG (&tag_s_round, inquire->round);
4001   RESOLVE_TAG (&tag_iolength, inquire->iolength);
4002   RESOLVE_TAG (&tag_convert, inquire->convert);
4003   RESOLVE_TAG (&tag_strm_out, inquire->strm_pos);
4004   RESOLVE_TAG (&tag_s_async, inquire->asynchronous);
4005   RESOLVE_TAG (&tag_s_sign, inquire->sign);
4006   RESOLVE_TAG (&tag_s_round, inquire->round);
4007   RESOLVE_TAG (&tag_pending, inquire->pending);
4008   RESOLVE_TAG (&tag_size, inquire->size);
4009   RESOLVE_TAG (&tag_id, inquire->id);
4010
4011   if (gfc_reference_st_label (inquire->err, ST_LABEL_TARGET) == FAILURE)
4012     return FAILURE;
4013
4014   return SUCCESS;
4015 }
4016
4017
4018 void
4019 gfc_free_wait (gfc_wait *wait)
4020 {
4021   if (wait == NULL)
4022     return;
4023
4024   gfc_free_expr (wait->unit);
4025   gfc_free_expr (wait->iostat);
4026   gfc_free_expr (wait->iomsg);
4027   gfc_free_expr (wait->id);
4028 }
4029
4030
4031 gfc_try
4032 gfc_resolve_wait (gfc_wait *wait)
4033 {
4034   RESOLVE_TAG (&tag_unit, wait->unit);
4035   RESOLVE_TAG (&tag_iomsg, wait->iomsg);
4036   RESOLVE_TAG (&tag_iostat, wait->iostat);
4037   RESOLVE_TAG (&tag_id, wait->id);
4038
4039   if (gfc_reference_st_label (wait->err, ST_LABEL_TARGET) == FAILURE)
4040     return FAILURE;
4041   
4042   if (gfc_reference_st_label (wait->end, ST_LABEL_TARGET) == FAILURE)
4043     return FAILURE;
4044
4045   return SUCCESS;
4046 }
4047
4048 /* Match an element of a WAIT statement.  */
4049
4050 #define RETM   if (m != MATCH_NO) return m;
4051
4052 static match
4053 match_wait_element (gfc_wait *wait)
4054 {
4055   match m;
4056
4057   m = match_etag (&tag_unit, &wait->unit);
4058   RETM m = match_ltag (&tag_err, &wait->err);
4059   RETM m = match_ltag (&tag_end, &wait->eor);
4060   RETM m = match_ltag (&tag_eor, &wait->end);
4061   RETM m = match_out_tag (&tag_iomsg, &wait->iomsg);
4062   RETM m = match_out_tag (&tag_iostat, &wait->iostat);
4063   RETM m = match_etag (&tag_id, &wait->id);
4064   RETM return MATCH_NO;
4065 }
4066
4067 #undef RETM
4068
4069
4070 match
4071 gfc_match_wait (void)
4072 {
4073   gfc_wait *wait;
4074   match m;
4075
4076   m = gfc_match_char ('(');
4077   if (m == MATCH_NO)
4078     return m;
4079
4080   wait = XCNEW (gfc_wait);
4081
4082   m = match_wait_element (wait);
4083   if (m == MATCH_ERROR)
4084     goto cleanup;
4085   if (m == MATCH_NO)
4086     {
4087       m = gfc_match_expr (&wait->unit);
4088       if (m == MATCH_ERROR)
4089         goto cleanup;
4090       if (m == MATCH_NO)
4091         goto syntax;
4092     }
4093
4094   for (;;)
4095     {
4096       if (gfc_match_char (')') == MATCH_YES)
4097         break;
4098       if (gfc_match_char (',') != MATCH_YES)
4099         goto syntax;
4100
4101       m = match_wait_element (wait);
4102       if (m == MATCH_ERROR)
4103         goto cleanup;
4104       if (m == MATCH_NO)
4105         goto syntax;
4106     }
4107
4108   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: WAIT at %C "
4109           "not allowed in Fortran 95") == FAILURE)
4110     goto cleanup;
4111
4112   if (gfc_pure (NULL))
4113     {
4114       gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4115       goto cleanup;
4116     }
4117
4118   new_st.op = EXEC_WAIT;
4119   new_st.ext.wait = wait;
4120
4121   return MATCH_YES;
4122
4123 syntax:
4124   gfc_syntax_error (ST_WAIT);
4125
4126 cleanup:
4127   gfc_free_wait (wait);
4128   return MATCH_ERROR;
4129 }