2010-10-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / io.c
blobe80202fab06273cd8fd031a11f495c40bc573353
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
7 This file is part of GCC.
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.
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.
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/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "flags.h"
26 #include "gfortran.h"
27 #include "match.h"
28 #include "parse.h"
30 gfc_st_label
31 format_asterisk = {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL,
32 0, {NULL, NULL}};
34 typedef struct
36 const char *name, *spec, *value;
37 bt type;
39 io_tag;
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};
101 static gfc_dt *current_dt;
103 #define RESOLVE_TAG(x, y) if (resolve_tag(x, y) == FAILURE) return FAILURE;
106 /**************** Fortran 95 FORMAT parser *****************/
108 /* FORMAT tokens returned by format_lex(). */
109 typedef enum
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
118 format_token;
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;
129 static format_token saved_token;
131 static enum
132 { MODE_STRING, MODE_FORMAT, MODE_COPY }
133 mode;
136 /* Return the next character in the format string. */
138 static char
139 next_char (int in_string)
141 static gfc_char_t c;
143 if (use_last_char)
145 use_last_char = 0;
146 return c;
149 format_length++;
151 if (mode == MODE_STRING)
152 c = *format_string++;
153 else
155 c = gfc_next_char_literal (in_string);
156 if (c == '\n')
157 c = '\0';
160 if (gfc_option.flag_backslash && c == '\\')
162 locus old_locus = gfc_current_locus;
164 if (gfc_match_special_char (&c) == MATCH_NO)
165 gfc_current_locus = old_locus;
167 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
168 gfc_warning ("Extension: backslash character at %C");
171 if (mode == MODE_COPY)
172 *format_string++ = c;
174 if (mode != MODE_STRING)
175 format_locus = gfc_current_locus;
177 format_string_pos++;
179 c = gfc_wide_toupper (c);
180 return c;
184 /* Back up one character position. Only works once. */
186 static void
187 unget_char (void)
189 use_last_char = 1;
192 /* Eat up the spaces and return a character. */
194 static char
195 next_char_not_space (bool *error)
197 char c;
200 error_element = c = next_char (0);
201 if (c == '\t')
203 if (gfc_option.allow_std & GFC_STD_GNU)
204 gfc_warning ("Extension: Tab character in format at %C");
205 else
207 gfc_error ("Extension: Tab character in format at %C");
208 *error = true;
209 return c;
213 while (gfc_is_whitespace (c));
214 return c;
217 static int value = 0;
219 /* Simple lexical analyzer for getting the next token in a FORMAT
220 statement. */
222 static format_token
223 format_lex (void)
225 format_token token;
226 char c, delim;
227 int zflag;
228 int negative_flag;
229 bool error = false;
231 if (saved_token != FMT_NONE)
233 token = saved_token;
234 saved_token = FMT_NONE;
235 return token;
238 c = next_char_not_space (&error);
240 negative_flag = 0;
241 switch (c)
243 case '-':
244 negative_flag = 1;
245 case '+':
246 c = next_char_not_space (&error);
247 if (!ISDIGIT (c))
249 token = FMT_UNKNOWN;
250 break;
253 value = c - '0';
257 c = next_char_not_space (&error);
258 if (ISDIGIT (c))
259 value = 10 * value + c - '0';
261 while (ISDIGIT (c));
263 unget_char ();
265 if (negative_flag)
266 value = -value;
268 token = FMT_SIGNED_INT;
269 break;
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');
283 value = c - '0';
287 c = next_char_not_space (&error);
288 if (ISDIGIT (c))
290 value = 10 * value + c - '0';
291 if (c != '0')
292 zflag = 0;
295 while (ISDIGIT (c));
297 unget_char ();
298 token = zflag ? FMT_ZERO : FMT_POSINT;
299 break;
301 case '.':
302 token = FMT_PERIOD;
303 break;
305 case ',':
306 token = FMT_COMMA;
307 break;
309 case ':':
310 token = FMT_COLON;
311 break;
313 case '/':
314 token = FMT_SLASH;
315 break;
317 case '$':
318 token = FMT_DOLLAR;
319 break;
321 case 'T':
322 c = next_char_not_space (&error);
323 switch (c)
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 ();
335 break;
337 case '(':
338 token = FMT_LPAREN;
339 break;
341 case ')':
342 token = FMT_RPAREN;
343 break;
345 case 'X':
346 token = FMT_X;
347 break;
349 case 'S':
350 c = next_char_not_space (&error);
351 if (c != 'P' && c != 'S')
352 unget_char ();
354 token = FMT_SIGN;
355 break;
357 case 'B':
358 c = next_char_not_space (&error);
359 if (c == 'N' || c == 'Z')
360 token = FMT_BLANK;
361 else
363 unget_char ();
364 token = FMT_IBOZ;
367 break;
369 case '\'':
370 case '"':
371 delim = c;
373 value = 0;
375 for (;;)
377 c = next_char (1);
378 if (c == '\0')
380 token = FMT_END;
381 break;
384 if (c == delim)
386 c = next_char (1);
388 if (c == '\0')
390 token = FMT_END;
391 break;
394 if (c != delim)
396 unget_char ();
397 token = FMT_CHAR;
398 break;
401 value++;
403 break;
405 case 'P':
406 token = FMT_P;
407 break;
409 case 'I':
410 case 'O':
411 case 'Z':
412 token = FMT_IBOZ;
413 break;
415 case 'F':
416 token = FMT_F;
417 break;
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
427 token = FMT_E;
428 unget_char ();
431 break;
433 case 'G':
434 token = FMT_G;
435 break;
437 case 'H':
438 token = FMT_H;
439 break;
441 case 'L':
442 token = FMT_L;
443 break;
445 case 'A':
446 token = FMT_A;
447 break;
449 case 'D':
450 c = next_char_not_space (&error);
451 if (c == 'P')
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;
458 else if (c == 'C')
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;
465 else
467 token = FMT_D;
468 unget_char ();
470 break;
472 case 'R':
473 c = next_char_not_space (&error);
474 switch (c)
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;
499 break;
501 case '\0':
502 token = FMT_END;
503 break;
505 case '*':
506 token = FMT_STAR;
507 break;
509 default:
510 token = FMT_UNKNOWN;
511 break;
514 if (error)
515 return FMT_ERROR;
517 return token;
521 static const char *
522 token_to_string (format_token t)
524 switch (t)
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 "";
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. */
546 static gfc_try
547 check_format (bool is_input)
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");
556 const char *error;
557 format_token t, u;
558 int level;
559 int repeat;
560 gfc_try rv;
562 use_last_char = 0;
563 saved_token = FMT_NONE;
564 level = 0;
565 repeat = 0;
566 rv = SUCCESS;
567 format_string_pos = 0;
569 t = format_lex ();
570 if (t == FMT_ERROR)
571 goto fail;
572 if (t != FMT_LPAREN)
574 error = _("Missing leading left parenthesis");
575 goto syntax;
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;
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)
593 case FMT_STAR:
594 repeat = -1;
595 t = format_lex ();
596 if (t == FMT_ERROR)
597 goto fail;
598 if (t == FMT_LPAREN)
600 level++;
601 goto format_item;
603 error = _("Left parenthesis required after '*'");
604 goto syntax;
606 case FMT_POSINT:
607 repeat = value;
608 t = format_lex ();
609 if (t == FMT_ERROR)
610 goto fail;
611 if (t == FMT_LPAREN)
613 level++;
614 goto format_item;
617 if (t == FMT_SLASH)
618 goto optional_comma;
620 goto data_desc;
622 case FMT_LPAREN:
623 level++;
624 goto format_item;
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)
634 error = _("Expected P edit descriptor");
635 goto syntax;
638 goto data_desc;
640 case FMT_P:
641 /* P requires a prior number. */
642 error = _("P descriptor requires leading scale factor");
643 goto syntax;
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;
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;
667 case FMT_CHAR:
668 goto extension_optional_comma;
670 case FMT_COLON:
671 case FMT_SLASH:
672 goto optional_comma;
674 case FMT_DOLLAR:
675 t = format_lex ();
676 if (t == FMT_ERROR)
677 goto fail;
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)
684 gfc_warning ("$ should be the last specifier in format at %L",
685 &format_locus);
686 goto optional_comma_1;
689 goto finished;
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;
706 case FMT_END:
707 error = unexpected_end;
708 goto syntax;
710 default:
711 error = unexpected_element;
712 goto syntax;
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)
720 case FMT_SIGN:
721 case FMT_BLANK:
722 case FMT_DP:
723 case FMT_DC:
724 case FMT_X:
725 break;
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)
737 error = _("Comma required after P descriptor");
738 goto syntax;
740 if (t != FMT_COMMA)
742 if (t == FMT_POSINT)
744 t = format_lex ();
745 if (t == FMT_ERROR)
746 goto fail;
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)
751 error = _("Comma required after P descriptor");
752 goto syntax;
756 saved_token = t;
757 goto optional_comma;
759 case FMT_T:
760 case FMT_TL:
761 case FMT_TR:
762 t = format_lex ();
763 if (t != FMT_POSINT)
765 error = _("Positive width required with T descriptor");
766 goto syntax;
768 break;
770 case FMT_L:
771 t = format_lex ();
772 if (t == FMT_ERROR)
773 goto fail;
774 if (t == FMT_POSINT)
775 break;
777 switch (gfc_notification_std (GFC_STD_GNU))
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;
787 case ERROR:
788 error = posint_required;
789 goto syntax;
791 case SILENT:
792 saved_token = t;
793 break;
795 default:
796 gcc_unreachable ();
798 break;
800 case FMT_A:
801 t = format_lex ();
802 if (t == FMT_ERROR)
803 goto fail;
804 if (t == FMT_ZERO)
806 error = zero_width;
807 goto syntax;
809 if (t != FMT_POSINT)
810 saved_token = t;
811 break;
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)
821 if (is_input)
823 error = zero_width;
824 goto syntax;
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)
832 saved_token = u;
833 break;
835 u = format_lex ();
836 if (u != FMT_POSINT)
838 error = posint_required;
839 goto syntax;
841 u = format_lex ();
842 if (u == FMT_E)
844 error = _("E specifier not allowed with g0 descriptor");
845 goto syntax;
847 saved_token = u;
848 break;
851 if (u != FMT_POSINT)
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;
861 u = format_lex ();
862 if (u == FMT_ERROR)
863 goto fail;
864 if (u != FMT_PERIOD)
866 /* Warn if -std=legacy, otherwise error. */
867 format_locus.nextc += format_string_pos;
868 if (gfc_option.warn_std != 0)
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;
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;
887 u = format_lex ();
888 if (u == FMT_ERROR)
889 goto fail;
890 if (u != FMT_ZERO && u != FMT_POSINT)
892 error = nonneg_required;
893 goto syntax;
896 if (t == FMT_D)
897 break;
899 /* Look for optional exponent. */
900 u = format_lex ();
901 if (u == FMT_ERROR)
902 goto fail;
903 if (u != FMT_E)
905 saved_token = u;
907 else
909 u = format_lex ();
910 if (u == FMT_ERROR)
911 goto fail;
912 if (u != FMT_POSINT)
914 error = _("Positive exponent width required");
915 goto syntax;
919 break;
921 case FMT_F:
922 t = format_lex ();
923 if (t == FMT_ERROR)
924 goto fail;
925 if (t != FMT_ZERO && t != FMT_POSINT)
927 error = nonneg_required;
928 goto syntax;
930 else if (is_input && t == FMT_ZERO)
932 error = posint_required;
933 goto syntax;
936 t = format_lex ();
937 if (t == FMT_ERROR)
938 goto fail;
939 if (t != FMT_PERIOD)
941 /* Warn if -std=legacy, otherwise error. */
942 if (gfc_option.warn_std != 0)
944 error = _("Period required in format specifier");
945 goto syntax;
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;
955 t = format_lex ();
956 if (t == FMT_ERROR)
957 goto fail;
958 if (t != FMT_ZERO && t != FMT_POSINT)
960 error = nonneg_required;
961 goto syntax;
964 break;
966 case FMT_H:
967 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
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);
974 if (mode == MODE_STRING)
976 format_string += value;
977 format_length -= value;
978 format_string_pos += repeat;
980 else
982 while (repeat >0)
984 next_char (1);
985 repeat -- ;
988 break;
990 case FMT_IBOZ:
991 t = format_lex ();
992 if (t == FMT_ERROR)
993 goto fail;
994 if (t != FMT_ZERO && t != FMT_POSINT)
996 error = nonneg_required;
997 goto syntax;
999 else if (is_input && t == FMT_ZERO)
1001 error = posint_required;
1002 goto syntax;
1005 t = format_lex ();
1006 if (t == FMT_ERROR)
1007 goto fail;
1008 if (t != FMT_PERIOD)
1010 saved_token = t;
1012 else
1014 t = format_lex ();
1015 if (t == FMT_ERROR)
1016 goto fail;
1017 if (t != FMT_ZERO && t != FMT_POSINT)
1019 error = nonneg_required;
1020 goto syntax;
1024 break;
1026 default:
1027 error = unexpected_element;
1028 goto syntax;
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)
1039 case FMT_COMMA:
1040 goto format_item;
1042 case FMT_RPAREN:
1043 level--;
1044 if (level < 0)
1045 goto finished;
1046 goto between_desc;
1048 case FMT_COLON:
1049 case FMT_SLASH:
1050 goto optional_comma;
1052 case FMT_END:
1053 error = unexpected_end;
1054 goto syntax;
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;
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)
1078 case FMT_COMMA:
1079 break;
1081 case FMT_RPAREN:
1082 level--;
1083 if (level < 0)
1084 goto finished;
1085 goto between_desc;
1087 default:
1088 /* Assume that we have another format item. */
1089 saved_token = t;
1090 break;
1093 goto format_item;
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)
1102 case FMT_COMMA:
1103 break;
1105 case FMT_RPAREN:
1106 level--;
1107 if (level < 0)
1108 goto finished;
1109 goto between_desc;
1111 case FMT_COLON:
1112 case FMT_SLASH:
1113 goto optional_comma;
1115 case FMT_END:
1116 error = unexpected_end;
1117 goto syntax;
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;
1133 goto format_item;
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;
1145 finished:
1146 return rv;
1150 /* Given an expression node that is a constant string, see if it looks
1151 like a format string. */
1153 static gfc_try
1154 check_format_string (gfc_expr *e, bool is_input)
1156 gfc_try rv;
1157 int i;
1158 if (!e || e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1159 return SUCCESS;
1161 mode = MODE_STRING;
1162 format_string = e->value.character.string;
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] != ' ')
1177 format_locus.nextc += format_length + 1;
1178 gfc_warning ("Extraneous characters in format at %L", &format_locus);
1179 break;
1181 return rv;
1185 /************ Fortran 95 I/O statement matchers *************/
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. */
1191 match
1192 gfc_match_format (void)
1194 gfc_expr *e;
1195 locus start;
1197 if (gfc_current_ns->proc_name
1198 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
1200 gfc_error ("Format statement in module main block at %C");
1201 return MATCH_ERROR;
1204 if (gfc_statement_label == NULL)
1206 gfc_error ("Missing format label at %C");
1207 return MATCH_ERROR;
1209 gfc_gobble_whitespace ();
1211 mode = MODE_FORMAT;
1212 format_length = 0;
1214 start = gfc_current_locus;
1216 if (check_format (false) == FAILURE)
1217 return MATCH_ERROR;
1219 if (gfc_match_eos () != MATCH_YES)
1221 gfc_syntax_error (ST_FORMAT);
1222 return MATCH_ERROR;
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. */
1228 gfc_current_locus = start; /* Back to the beginning */
1230 new_st.loc = start;
1231 new_st.op = EXEC_NOP;
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;
1238 mode = MODE_COPY;
1239 check_format (false); /* Guaranteed to succeed */
1240 gfc_match_eos (); /* Guaranteed to succeed */
1242 return MATCH_YES;
1246 /* Match an expression I/O tag of some sort. */
1248 static match
1249 match_etag (const io_tag *tag, gfc_expr **v)
1251 gfc_expr *result;
1252 match m;
1254 m = gfc_match (tag->spec);
1255 if (m != MATCH_YES)
1256 return m;
1258 m = gfc_match (tag->value, &result);
1259 if (m != MATCH_YES)
1261 gfc_error ("Invalid value for %s specification at %C", tag->name);
1262 return MATCH_ERROR;
1265 if (*v != NULL)
1267 gfc_error ("Duplicate %s specification at %C", tag->name);
1268 gfc_free_expr (result);
1269 return MATCH_ERROR;
1272 *v = result;
1273 return MATCH_YES;
1277 /* Match a variable I/O tag of some sort. */
1279 static match
1280 match_vtag (const io_tag *tag, gfc_expr **v)
1282 gfc_expr *result;
1283 match m;
1285 m = gfc_match (tag->spec);
1286 if (m != MATCH_YES)
1287 return m;
1289 m = gfc_match (tag->value, &result);
1290 if (m != MATCH_YES)
1292 gfc_error ("Invalid value for %s specification at %C", tag->name);
1293 return MATCH_ERROR;
1296 if (*v != NULL)
1298 gfc_error ("Duplicate %s specification at %C", tag->name);
1299 gfc_free_expr (result);
1300 return MATCH_ERROR;
1303 if (result->symtree->n.sym->attr.intent == INTENT_IN)
1305 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag->name);
1306 gfc_free_expr (result);
1307 return MATCH_ERROR;
1310 if (gfc_pure (NULL) && gfc_impure_variable (result->symtree->n.sym))
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;
1318 *v = result;
1319 return MATCH_YES;
1323 /* Match I/O tags that cause variables to become redefined. */
1325 static match
1326 match_out_tag (const io_tag *tag, gfc_expr **result)
1328 match m;
1330 m = match_vtag (tag, result);
1331 if (m == MATCH_YES)
1332 gfc_check_do_variable ((*result)->symtree);
1334 return m;
1338 /* Match a label I/O tag. */
1340 static match
1341 match_ltag (const io_tag *tag, gfc_st_label ** label)
1343 match m;
1344 gfc_st_label *old;
1346 old = *label;
1347 m = gfc_match (tag->spec);
1348 if (m != MATCH_YES)
1349 return m;
1351 m = gfc_match (tag->value, label);
1352 if (m != MATCH_YES)
1354 gfc_error ("Invalid value for %s specification at %C", tag->name);
1355 return MATCH_ERROR;
1358 if (old)
1360 gfc_error ("Duplicate %s label specification at %C", tag->name);
1361 return MATCH_ERROR;
1364 if (gfc_reference_st_label (*label, ST_LABEL_TARGET) == FAILURE)
1365 return MATCH_ERROR;
1367 return m;
1371 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1373 static gfc_try
1374 resolve_tag_format (const gfc_expr *e)
1376 if (e->expr_type == EXPR_CONSTANT
1377 && (e->ts.type != BT_CHARACTER
1378 || e->ts.kind != gfc_default_character_kind))
1380 gfc_error ("Constant expression in FORMAT tag at %L must be "
1381 "of type default CHARACTER", &e->where);
1382 return FAILURE;
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))
1394 if (e->ts.type != BT_CHARACTER && e->ts.type != BT_INTEGER)
1396 gfc_error ("FORMAT tag at %L must be of type CHARACTER or INTEGER",
1397 &e->where);
1398 return FAILURE;
1400 else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
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)
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;
1413 else if (e->ts.type == BT_INTEGER)
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;
1420 return SUCCESS;
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)
1427 if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
1428 "in FORMAT tag at %L", &e->where) == FAILURE)
1429 return FAILURE;
1431 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)
1433 gfc_error ("Non-character assumed shape array element in FORMAT"
1434 " tag at %L", &e->where);
1435 return FAILURE;
1438 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SIZE)
1440 gfc_error ("Non-character assumed size array element in FORMAT"
1441 " tag at %L", &e->where);
1442 return FAILURE;
1445 if (e->rank == 0 && e->symtree->n.sym->attr.pointer)
1447 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1448 &e->where);
1449 return FAILURE;
1453 return SUCCESS;
1457 /* Do expression resolution and type-checking on an expression tag. */
1459 static gfc_try
1460 resolve_tag (const io_tag *tag, gfc_expr *e)
1462 if (e == NULL)
1463 return SUCCESS;
1465 if (gfc_resolve_expr (e) == FAILURE)
1466 return FAILURE;
1468 if (tag == &tag_format)
1469 return resolve_tag_format (e);
1471 if (e->ts.type != tag->type)
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;
1478 if (e->rank != 0)
1480 gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
1481 return FAILURE;
1484 if (tag == &tag_iomsg)
1486 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
1487 &e->where) == FAILURE)
1488 return FAILURE;
1491 if ((tag == &tag_iostat || tag == &tag_size || tag == &tag_iolength)
1492 && e->ts.kind != gfc_default_integer_kind)
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;
1500 if (tag == &tag_exist && e->ts.kind != gfc_default_logical_kind)
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;
1508 if (tag == &tag_newunit)
1510 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: NEWUNIT specifier"
1511 " at %L", &e->where) == FAILURE)
1512 return FAILURE;
1515 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1516 if (tag == &tag_newunit || tag == &tag_iostat
1517 || tag == &tag_size || tag == &tag_iomsg)
1519 char context[64];
1521 sprintf (context, _("%s tag"), tag->name);
1522 if (gfc_check_vardef_context (e, false, context) == FAILURE)
1523 return FAILURE;
1526 if (tag == &tag_convert)
1528 if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
1529 &e->where) == FAILURE)
1530 return FAILURE;
1533 return SUCCESS;
1537 /* Match a single tag of an OPEN statement. */
1539 static match
1540 match_open_element (gfc_open *open)
1542 match m;
1544 m = match_etag (&tag_e_async, &open->asynchronous);
1545 if (m != MATCH_NO)
1546 return m;
1547 m = match_etag (&tag_unit, &open->unit);
1548 if (m != MATCH_NO)
1549 return m;
1550 m = match_out_tag (&tag_iomsg, &open->iomsg);
1551 if (m != MATCH_NO)
1552 return m;
1553 m = match_out_tag (&tag_iostat, &open->iostat);
1554 if (m != MATCH_NO)
1555 return m;
1556 m = match_etag (&tag_file, &open->file);
1557 if (m != MATCH_NO)
1558 return m;
1559 m = match_etag (&tag_status, &open->status);
1560 if (m != MATCH_NO)
1561 return m;
1562 m = match_etag (&tag_e_access, &open->access);
1563 if (m != MATCH_NO)
1564 return m;
1565 m = match_etag (&tag_e_form, &open->form);
1566 if (m != MATCH_NO)
1567 return m;
1568 m = match_etag (&tag_e_recl, &open->recl);
1569 if (m != MATCH_NO)
1570 return m;
1571 m = match_etag (&tag_e_blank, &open->blank);
1572 if (m != MATCH_NO)
1573 return m;
1574 m = match_etag (&tag_e_position, &open->position);
1575 if (m != MATCH_NO)
1576 return m;
1577 m = match_etag (&tag_e_action, &open->action);
1578 if (m != MATCH_NO)
1579 return m;
1580 m = match_etag (&tag_e_delim, &open->delim);
1581 if (m != MATCH_NO)
1582 return m;
1583 m = match_etag (&tag_e_pad, &open->pad);
1584 if (m != MATCH_NO)
1585 return m;
1586 m = match_etag (&tag_e_decimal, &open->decimal);
1587 if (m != MATCH_NO)
1588 return m;
1589 m = match_etag (&tag_e_encoding, &open->encoding);
1590 if (m != MATCH_NO)
1591 return m;
1592 m = match_etag (&tag_e_round, &open->round);
1593 if (m != MATCH_NO)
1594 return m;
1595 m = match_etag (&tag_e_sign, &open->sign);
1596 if (m != MATCH_NO)
1597 return m;
1598 m = match_ltag (&tag_err, &open->err);
1599 if (m != MATCH_NO)
1600 return m;
1601 m = match_etag (&tag_convert, &open->convert);
1602 if (m != MATCH_NO)
1603 return m;
1604 m = match_out_tag (&tag_newunit, &open->newunit);
1605 if (m != MATCH_NO)
1606 return m;
1608 return MATCH_NO;
1612 /* Free the gfc_open structure and all the expressions it contains. */
1614 void
1615 gfc_free_open (gfc_open *open)
1617 if (open == NULL)
1618 return;
1620 gfc_free_expr (open->unit);
1621 gfc_free_expr (open->iomsg);
1622 gfc_free_expr (open->iostat);
1623 gfc_free_expr (open->file);
1624 gfc_free_expr (open->status);
1625 gfc_free_expr (open->access);
1626 gfc_free_expr (open->form);
1627 gfc_free_expr (open->recl);
1628 gfc_free_expr (open->blank);
1629 gfc_free_expr (open->position);
1630 gfc_free_expr (open->action);
1631 gfc_free_expr (open->delim);
1632 gfc_free_expr (open->pad);
1633 gfc_free_expr (open->decimal);
1634 gfc_free_expr (open->encoding);
1635 gfc_free_expr (open->round);
1636 gfc_free_expr (open->sign);
1637 gfc_free_expr (open->convert);
1638 gfc_free_expr (open->asynchronous);
1639 gfc_free_expr (open->newunit);
1640 gfc_free (open);
1644 /* Resolve everything in a gfc_open structure. */
1646 gfc_try
1647 gfc_resolve_open (gfc_open *open)
1650 RESOLVE_TAG (&tag_unit, open->unit);
1651 RESOLVE_TAG (&tag_iomsg, open->iomsg);
1652 RESOLVE_TAG (&tag_iostat, open->iostat);
1653 RESOLVE_TAG (&tag_file, open->file);
1654 RESOLVE_TAG (&tag_status, open->status);
1655 RESOLVE_TAG (&tag_e_access, open->access);
1656 RESOLVE_TAG (&tag_e_form, open->form);
1657 RESOLVE_TAG (&tag_e_recl, open->recl);
1658 RESOLVE_TAG (&tag_e_blank, open->blank);
1659 RESOLVE_TAG (&tag_e_position, open->position);
1660 RESOLVE_TAG (&tag_e_action, open->action);
1661 RESOLVE_TAG (&tag_e_delim, open->delim);
1662 RESOLVE_TAG (&tag_e_pad, open->pad);
1663 RESOLVE_TAG (&tag_e_decimal, open->decimal);
1664 RESOLVE_TAG (&tag_e_encoding, open->encoding);
1665 RESOLVE_TAG (&tag_e_async, open->asynchronous);
1666 RESOLVE_TAG (&tag_e_round, open->round);
1667 RESOLVE_TAG (&tag_e_sign, open->sign);
1668 RESOLVE_TAG (&tag_convert, open->convert);
1669 RESOLVE_TAG (&tag_newunit, open->newunit);
1671 if (gfc_reference_st_label (open->err, ST_LABEL_TARGET) == FAILURE)
1672 return FAILURE;
1674 return SUCCESS;
1678 /* Check if a given value for a SPECIFIER is either in the list of values
1679 allowed in F95 or F2003, issuing an error message and returning a zero
1680 value if it is not allowed. */
1682 static int
1683 compare_to_allowed_values (const char *specifier, const char *allowed[],
1684 const char *allowed_f2003[],
1685 const char *allowed_gnu[], gfc_char_t *value,
1686 const char *statement, bool warn)
1688 int i;
1689 unsigned int len;
1691 len = gfc_wide_strlen (value);
1692 if (len > 0)
1694 for (len--; len > 0; len--)
1695 if (value[len] != ' ')
1696 break;
1697 len++;
1700 for (i = 0; allowed[i]; i++)
1701 if (len == strlen (allowed[i])
1702 && gfc_wide_strncasecmp (value, allowed[i], strlen (allowed[i])) == 0)
1703 return 1;
1705 for (i = 0; allowed_f2003 && allowed_f2003[i]; i++)
1706 if (len == strlen (allowed_f2003[i])
1707 && gfc_wide_strncasecmp (value, allowed_f2003[i],
1708 strlen (allowed_f2003[i])) == 0)
1710 notification n = gfc_notification_std (GFC_STD_F2003);
1712 if (n == WARNING || (warn && n == ERROR))
1714 gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1715 "has value '%s'", specifier, statement,
1716 allowed_f2003[i]);
1717 return 1;
1719 else
1720 if (n == ERROR)
1722 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: %s specifier in "
1723 "%s statement at %C has value '%s'", specifier,
1724 statement, allowed_f2003[i]);
1725 return 0;
1728 /* n == SILENT */
1729 return 1;
1732 for (i = 0; allowed_gnu && allowed_gnu[i]; i++)
1733 if (len == strlen (allowed_gnu[i])
1734 && gfc_wide_strncasecmp (value, allowed_gnu[i],
1735 strlen (allowed_gnu[i])) == 0)
1737 notification n = gfc_notification_std (GFC_STD_GNU);
1739 if (n == WARNING || (warn && n == ERROR))
1741 gfc_warning ("Extension: %s specifier in %s statement at %C "
1742 "has value '%s'", specifier, statement,
1743 allowed_gnu[i]);
1744 return 1;
1746 else
1747 if (n == ERROR)
1749 gfc_notify_std (GFC_STD_GNU, "Extension: %s specifier in "
1750 "%s statement at %C has value '%s'", specifier,
1751 statement, allowed_gnu[i]);
1752 return 0;
1755 /* n == SILENT */
1756 return 1;
1759 if (warn)
1761 char *s = gfc_widechar_to_char (value, -1);
1762 gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1763 specifier, statement, s);
1764 gfc_free (s);
1765 return 1;
1767 else
1769 char *s = gfc_widechar_to_char (value, -1);
1770 gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1771 specifier, statement, s);
1772 gfc_free (s);
1773 return 0;
1778 /* Match an OPEN statement. */
1780 match
1781 gfc_match_open (void)
1783 gfc_open *open;
1784 match m;
1785 bool warn;
1787 m = gfc_match_char ('(');
1788 if (m == MATCH_NO)
1789 return m;
1791 open = XCNEW (gfc_open);
1793 m = match_open_element (open);
1795 if (m == MATCH_ERROR)
1796 goto cleanup;
1797 if (m == MATCH_NO)
1799 m = gfc_match_expr (&open->unit);
1800 if (m == MATCH_ERROR)
1801 goto cleanup;
1804 for (;;)
1806 if (gfc_match_char (')') == MATCH_YES)
1807 break;
1808 if (gfc_match_char (',') != MATCH_YES)
1809 goto syntax;
1811 m = match_open_element (open);
1812 if (m == MATCH_ERROR)
1813 goto cleanup;
1814 if (m == MATCH_NO)
1815 goto syntax;
1818 if (gfc_match_eos () == MATCH_NO)
1819 goto syntax;
1821 if (gfc_pure (NULL))
1823 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1824 goto cleanup;
1827 warn = (open->err || open->iostat) ? true : false;
1829 /* Checks on NEWUNIT specifier. */
1830 if (open->newunit)
1832 if (open->unit)
1834 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1835 goto cleanup;
1838 if (!(open->file || (open->status
1839 && gfc_wide_strncasecmp (open->status->value.character.string,
1840 "scratch", 7) == 0)))
1842 gfc_error ("NEWUNIT specifier must have FILE= "
1843 "or STATUS='scratch' at %C");
1844 goto cleanup;
1847 else if (!open->unit)
1849 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1850 goto cleanup;
1853 /* Checks on the ACCESS specifier. */
1854 if (open->access && open->access->expr_type == EXPR_CONSTANT)
1856 static const char *access_f95[] = { "SEQUENTIAL", "DIRECT", NULL };
1857 static const char *access_f2003[] = { "STREAM", NULL };
1858 static const char *access_gnu[] = { "APPEND", NULL };
1860 if (!compare_to_allowed_values ("ACCESS", access_f95, access_f2003,
1861 access_gnu,
1862 open->access->value.character.string,
1863 "OPEN", warn))
1864 goto cleanup;
1867 /* Checks on the ACTION specifier. */
1868 if (open->action && open->action->expr_type == EXPR_CONSTANT)
1870 static const char *action[] = { "READ", "WRITE", "READWRITE", NULL };
1872 if (!compare_to_allowed_values ("ACTION", action, NULL, NULL,
1873 open->action->value.character.string,
1874 "OPEN", warn))
1875 goto cleanup;
1878 /* Checks on the ASYNCHRONOUS specifier. */
1879 if (open->asynchronous)
1881 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ASYNCHRONOUS= at %C "
1882 "not allowed in Fortran 95") == FAILURE)
1883 goto cleanup;
1885 if (open->asynchronous->expr_type == EXPR_CONSTANT)
1887 static const char * asynchronous[] = { "YES", "NO", NULL };
1889 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous,
1890 NULL, NULL, open->asynchronous->value.character.string,
1891 "OPEN", warn))
1892 goto cleanup;
1896 /* Checks on the BLANK specifier. */
1897 if (open->blank)
1899 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
1900 "not allowed in Fortran 95") == FAILURE)
1901 goto cleanup;
1903 if (open->blank->expr_type == EXPR_CONSTANT)
1905 static const char *blank[] = { "ZERO", "NULL", NULL };
1907 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
1908 open->blank->value.character.string,
1909 "OPEN", warn))
1910 goto cleanup;
1914 /* Checks on the DECIMAL specifier. */
1915 if (open->decimal)
1917 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
1918 "not allowed in Fortran 95") == FAILURE)
1919 goto cleanup;
1921 if (open->decimal->expr_type == EXPR_CONSTANT)
1923 static const char * decimal[] = { "COMMA", "POINT", NULL };
1925 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
1926 open->decimal->value.character.string,
1927 "OPEN", warn))
1928 goto cleanup;
1932 /* Checks on the DELIM specifier. */
1933 if (open->delim)
1935 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
1936 "not allowed in Fortran 95") == FAILURE)
1937 goto cleanup;
1939 if (open->delim->expr_type == EXPR_CONSTANT)
1941 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
1943 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
1944 open->delim->value.character.string,
1945 "OPEN", warn))
1946 goto cleanup;
1950 /* Checks on the ENCODING specifier. */
1951 if (open->encoding)
1953 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENCODING= at %C "
1954 "not allowed in Fortran 95") == FAILURE)
1955 goto cleanup;
1957 if (open->encoding->expr_type == EXPR_CONSTANT)
1959 static const char * encoding[] = { "DEFAULT", "UTF-8", NULL };
1961 if (!compare_to_allowed_values ("ENCODING", encoding, NULL, NULL,
1962 open->encoding->value.character.string,
1963 "OPEN", warn))
1964 goto cleanup;
1968 /* Checks on the FORM specifier. */
1969 if (open->form && open->form->expr_type == EXPR_CONSTANT)
1971 static const char *form[] = { "FORMATTED", "UNFORMATTED", NULL };
1973 if (!compare_to_allowed_values ("FORM", form, NULL, NULL,
1974 open->form->value.character.string,
1975 "OPEN", warn))
1976 goto cleanup;
1979 /* Checks on the PAD specifier. */
1980 if (open->pad && open->pad->expr_type == EXPR_CONSTANT)
1982 static const char *pad[] = { "YES", "NO", NULL };
1984 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
1985 open->pad->value.character.string,
1986 "OPEN", warn))
1987 goto cleanup;
1990 /* Checks on the POSITION specifier. */
1991 if (open->position && open->position->expr_type == EXPR_CONSTANT)
1993 static const char *position[] = { "ASIS", "REWIND", "APPEND", NULL };
1995 if (!compare_to_allowed_values ("POSITION", position, NULL, NULL,
1996 open->position->value.character.string,
1997 "OPEN", warn))
1998 goto cleanup;
2001 /* Checks on the ROUND specifier. */
2002 if (open->round)
2004 if (gfc_notify_std (GFC_STD_F2003, "Fortran F2003: ROUND= at %C "
2005 "not allowed in Fortran 95") == FAILURE)
2006 goto cleanup;
2008 if (open->round->expr_type == EXPR_CONSTANT)
2010 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
2011 "COMPATIBLE", "PROCESSOR_DEFINED",
2012 NULL };
2014 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
2015 open->round->value.character.string,
2016 "OPEN", warn))
2017 goto cleanup;
2021 /* Checks on the SIGN specifier. */
2022 if (open->sign)
2024 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
2025 "not allowed in Fortran 95") == FAILURE)
2026 goto cleanup;
2028 if (open->sign->expr_type == EXPR_CONSTANT)
2030 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2031 NULL };
2033 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
2034 open->sign->value.character.string,
2035 "OPEN", warn))
2036 goto cleanup;
2040 #define warn_or_error(...) \
2042 if (warn) \
2043 gfc_warning (__VA_ARGS__); \
2044 else \
2046 gfc_error (__VA_ARGS__); \
2047 goto cleanup; \
2051 /* Checks on the RECL specifier. */
2052 if (open->recl && open->recl->expr_type == EXPR_CONSTANT
2053 && open->recl->ts.type == BT_INTEGER
2054 && mpz_sgn (open->recl->value.integer) != 1)
2056 warn_or_error ("RECL in OPEN statement at %C must be positive");
2059 /* Checks on the STATUS specifier. */
2060 if (open->status && open->status->expr_type == EXPR_CONSTANT)
2062 static const char *status[] = { "OLD", "NEW", "SCRATCH",
2063 "REPLACE", "UNKNOWN", NULL };
2065 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2066 open->status->value.character.string,
2067 "OPEN", warn))
2068 goto cleanup;
2070 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2071 the FILE= specifier shall appear. */
2072 if (open->file == NULL
2073 && (gfc_wide_strncasecmp (open->status->value.character.string,
2074 "replace", 7) == 0
2075 || gfc_wide_strncasecmp (open->status->value.character.string,
2076 "new", 3) == 0))
2078 char *s = gfc_widechar_to_char (open->status->value.character.string,
2079 -1);
2080 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2081 "'%s' and no FILE specifier is present", s);
2082 gfc_free (s);
2085 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2086 the FILE= specifier shall not appear. */
2087 if (gfc_wide_strncasecmp (open->status->value.character.string,
2088 "scratch", 7) == 0 && open->file)
2090 warn_or_error ("The STATUS specified in OPEN statement at %C "
2091 "cannot have the value SCRATCH if a FILE specifier "
2092 "is present");
2096 /* Things that are not allowed for unformatted I/O. */
2097 if (open->form && open->form->expr_type == EXPR_CONSTANT
2098 && (open->delim || open->decimal || open->encoding || open->round
2099 || open->sign || open->pad || open->blank)
2100 && gfc_wide_strncasecmp (open->form->value.character.string,
2101 "unformatted", 11) == 0)
2103 const char *spec = (open->delim ? "DELIM "
2104 : (open->pad ? "PAD " : open->blank
2105 ? "BLANK " : ""));
2107 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2108 "unformatted I/O", spec);
2111 if (open->recl && open->access && open->access->expr_type == EXPR_CONSTANT
2112 && gfc_wide_strncasecmp (open->access->value.character.string,
2113 "stream", 6) == 0)
2115 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2116 "stream I/O");
2119 if (open->position
2120 && open->access && open->access->expr_type == EXPR_CONSTANT
2121 && !(gfc_wide_strncasecmp (open->access->value.character.string,
2122 "sequential", 10) == 0
2123 || gfc_wide_strncasecmp (open->access->value.character.string,
2124 "stream", 6) == 0
2125 || gfc_wide_strncasecmp (open->access->value.character.string,
2126 "append", 6) == 0))
2128 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2129 "for stream or sequential ACCESS");
2132 #undef warn_or_error
2134 new_st.op = EXEC_OPEN;
2135 new_st.ext.open = open;
2136 return MATCH_YES;
2138 syntax:
2139 gfc_syntax_error (ST_OPEN);
2141 cleanup:
2142 gfc_free_open (open);
2143 return MATCH_ERROR;
2147 /* Free a gfc_close structure an all its expressions. */
2149 void
2150 gfc_free_close (gfc_close *close)
2152 if (close == NULL)
2153 return;
2155 gfc_free_expr (close->unit);
2156 gfc_free_expr (close->iomsg);
2157 gfc_free_expr (close->iostat);
2158 gfc_free_expr (close->status);
2159 gfc_free (close);
2163 /* Match elements of a CLOSE statement. */
2165 static match
2166 match_close_element (gfc_close *close)
2168 match m;
2170 m = match_etag (&tag_unit, &close->unit);
2171 if (m != MATCH_NO)
2172 return m;
2173 m = match_etag (&tag_status, &close->status);
2174 if (m != MATCH_NO)
2175 return m;
2176 m = match_out_tag (&tag_iomsg, &close->iomsg);
2177 if (m != MATCH_NO)
2178 return m;
2179 m = match_out_tag (&tag_iostat, &close->iostat);
2180 if (m != MATCH_NO)
2181 return m;
2182 m = match_ltag (&tag_err, &close->err);
2183 if (m != MATCH_NO)
2184 return m;
2186 return MATCH_NO;
2190 /* Match a CLOSE statement. */
2192 match
2193 gfc_match_close (void)
2195 gfc_close *close;
2196 match m;
2197 bool warn;
2199 m = gfc_match_char ('(');
2200 if (m == MATCH_NO)
2201 return m;
2203 close = XCNEW (gfc_close);
2205 m = match_close_element (close);
2207 if (m == MATCH_ERROR)
2208 goto cleanup;
2209 if (m == MATCH_NO)
2211 m = gfc_match_expr (&close->unit);
2212 if (m == MATCH_NO)
2213 goto syntax;
2214 if (m == MATCH_ERROR)
2215 goto cleanup;
2218 for (;;)
2220 if (gfc_match_char (')') == MATCH_YES)
2221 break;
2222 if (gfc_match_char (',') != MATCH_YES)
2223 goto syntax;
2225 m = match_close_element (close);
2226 if (m == MATCH_ERROR)
2227 goto cleanup;
2228 if (m == MATCH_NO)
2229 goto syntax;
2232 if (gfc_match_eos () == MATCH_NO)
2233 goto syntax;
2235 if (gfc_pure (NULL))
2237 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2238 goto cleanup;
2241 warn = (close->iostat || close->err) ? true : false;
2243 /* Checks on the STATUS specifier. */
2244 if (close->status && close->status->expr_type == EXPR_CONSTANT)
2246 static const char *status[] = { "KEEP", "DELETE", NULL };
2248 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2249 close->status->value.character.string,
2250 "CLOSE", warn))
2251 goto cleanup;
2254 new_st.op = EXEC_CLOSE;
2255 new_st.ext.close = close;
2256 return MATCH_YES;
2258 syntax:
2259 gfc_syntax_error (ST_CLOSE);
2261 cleanup:
2262 gfc_free_close (close);
2263 return MATCH_ERROR;
2267 /* Resolve everything in a gfc_close structure. */
2269 gfc_try
2270 gfc_resolve_close (gfc_close *close)
2272 RESOLVE_TAG (&tag_unit, close->unit);
2273 RESOLVE_TAG (&tag_iomsg, close->iomsg);
2274 RESOLVE_TAG (&tag_iostat, close->iostat);
2275 RESOLVE_TAG (&tag_status, close->status);
2277 if (gfc_reference_st_label (close->err, ST_LABEL_TARGET) == FAILURE)
2278 return FAILURE;
2280 if (close->unit->expr_type == EXPR_CONSTANT
2281 && close->unit->ts.type == BT_INTEGER
2282 && mpz_sgn (close->unit->value.integer) < 0)
2284 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2285 &close->unit->where);
2288 return SUCCESS;
2292 /* Free a gfc_filepos structure. */
2294 void
2295 gfc_free_filepos (gfc_filepos *fp)
2297 gfc_free_expr (fp->unit);
2298 gfc_free_expr (fp->iomsg);
2299 gfc_free_expr (fp->iostat);
2300 gfc_free (fp);
2304 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2306 static match
2307 match_file_element (gfc_filepos *fp)
2309 match m;
2311 m = match_etag (&tag_unit, &fp->unit);
2312 if (m != MATCH_NO)
2313 return m;
2314 m = match_out_tag (&tag_iomsg, &fp->iomsg);
2315 if (m != MATCH_NO)
2316 return m;
2317 m = match_out_tag (&tag_iostat, &fp->iostat);
2318 if (m != MATCH_NO)
2319 return m;
2320 m = match_ltag (&tag_err, &fp->err);
2321 if (m != MATCH_NO)
2322 return m;
2324 return MATCH_NO;
2328 /* Match the second half of the file-positioning statements, REWIND,
2329 BACKSPACE, ENDFILE, or the FLUSH statement. */
2331 static match
2332 match_filepos (gfc_statement st, gfc_exec_op op)
2334 gfc_filepos *fp;
2335 match m;
2337 fp = XCNEW (gfc_filepos);
2339 if (gfc_match_char ('(') == MATCH_NO)
2341 m = gfc_match_expr (&fp->unit);
2342 if (m == MATCH_ERROR)
2343 goto cleanup;
2344 if (m == MATCH_NO)
2345 goto syntax;
2347 goto done;
2350 m = match_file_element (fp);
2351 if (m == MATCH_ERROR)
2352 goto done;
2353 if (m == MATCH_NO)
2355 m = gfc_match_expr (&fp->unit);
2356 if (m == MATCH_ERROR)
2357 goto done;
2358 if (m == MATCH_NO)
2359 goto syntax;
2362 for (;;)
2364 if (gfc_match_char (')') == MATCH_YES)
2365 break;
2366 if (gfc_match_char (',') != MATCH_YES)
2367 goto syntax;
2369 m = match_file_element (fp);
2370 if (m == MATCH_ERROR)
2371 goto cleanup;
2372 if (m == MATCH_NO)
2373 goto syntax;
2376 done:
2377 if (gfc_match_eos () != MATCH_YES)
2378 goto syntax;
2380 if (gfc_pure (NULL))
2382 gfc_error ("%s statement not allowed in PURE procedure at %C",
2383 gfc_ascii_statement (st));
2385 goto cleanup;
2388 new_st.op = op;
2389 new_st.ext.filepos = fp;
2390 return MATCH_YES;
2392 syntax:
2393 gfc_syntax_error (st);
2395 cleanup:
2396 gfc_free_filepos (fp);
2397 return MATCH_ERROR;
2401 gfc_try
2402 gfc_resolve_filepos (gfc_filepos *fp)
2404 RESOLVE_TAG (&tag_unit, fp->unit);
2405 RESOLVE_TAG (&tag_iostat, fp->iostat);
2406 RESOLVE_TAG (&tag_iomsg, fp->iomsg);
2407 if (gfc_reference_st_label (fp->err, ST_LABEL_TARGET) == FAILURE)
2408 return FAILURE;
2410 if (fp->unit->expr_type == EXPR_CONSTANT
2411 && fp->unit->ts.type == BT_INTEGER
2412 && mpz_sgn (fp->unit->value.integer) < 0)
2414 gfc_error ("UNIT number in statement at %L must be non-negative",
2415 &fp->unit->where);
2418 return SUCCESS;
2422 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2423 and the FLUSH statement. */
2425 match
2426 gfc_match_endfile (void)
2428 return match_filepos (ST_END_FILE, EXEC_ENDFILE);
2431 match
2432 gfc_match_backspace (void)
2434 return match_filepos (ST_BACKSPACE, EXEC_BACKSPACE);
2437 match
2438 gfc_match_rewind (void)
2440 return match_filepos (ST_REWIND, EXEC_REWIND);
2443 match
2444 gfc_match_flush (void)
2446 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C")
2447 == FAILURE)
2448 return MATCH_ERROR;
2450 return match_filepos (ST_FLUSH, EXEC_FLUSH);
2453 /******************** Data Transfer Statements *********************/
2455 /* Return a default unit number. */
2457 static gfc_expr *
2458 default_unit (io_kind k)
2460 int unit;
2462 if (k == M_READ)
2463 unit = 5;
2464 else
2465 unit = 6;
2467 return gfc_get_int_expr (gfc_default_integer_kind, NULL, unit);
2471 /* Match a unit specification for a data transfer statement. */
2473 static match
2474 match_dt_unit (io_kind k, gfc_dt *dt)
2476 gfc_expr *e;
2478 if (gfc_match_char ('*') == MATCH_YES)
2480 if (dt->io_unit != NULL)
2481 goto conflict;
2483 dt->io_unit = default_unit (k);
2484 return MATCH_YES;
2487 if (gfc_match_expr (&e) == MATCH_YES)
2489 if (dt->io_unit != NULL)
2491 gfc_free_expr (e);
2492 goto conflict;
2495 dt->io_unit = e;
2496 return MATCH_YES;
2499 return MATCH_NO;
2501 conflict:
2502 gfc_error ("Duplicate UNIT specification at %C");
2503 return MATCH_ERROR;
2507 /* Match a format specification. */
2509 static match
2510 match_dt_format (gfc_dt *dt)
2512 locus where;
2513 gfc_expr *e;
2514 gfc_st_label *label;
2515 match m;
2517 where = gfc_current_locus;
2519 if (gfc_match_char ('*') == MATCH_YES)
2521 if (dt->format_expr != NULL || dt->format_label != NULL)
2522 goto conflict;
2524 dt->format_label = &format_asterisk;
2525 return MATCH_YES;
2528 if ((m = gfc_match_st_label (&label)) == MATCH_YES)
2530 if (dt->format_expr != NULL || dt->format_label != NULL)
2532 gfc_free_st_label (label);
2533 goto conflict;
2536 if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE)
2537 return MATCH_ERROR;
2539 dt->format_label = label;
2540 return MATCH_YES;
2542 else if (m == MATCH_ERROR)
2543 /* The label was zero or too large. Emit the correct diagnosis. */
2544 return MATCH_ERROR;
2546 if (gfc_match_expr (&e) == MATCH_YES)
2548 if (dt->format_expr != NULL || dt->format_label != NULL)
2550 gfc_free_expr (e);
2551 goto conflict;
2553 dt->format_expr = e;
2554 return MATCH_YES;
2557 gfc_current_locus = where; /* The only case where we have to restore */
2559 return MATCH_NO;
2561 conflict:
2562 gfc_error ("Duplicate format specification at %C");
2563 return MATCH_ERROR;
2567 /* Traverse a namelist that is part of a READ statement to make sure
2568 that none of the variables in the namelist are INTENT(IN). Returns
2569 nonzero if we find such a variable. */
2571 static int
2572 check_namelist (gfc_symbol *sym)
2574 gfc_namelist *p;
2576 for (p = sym->namelist; p; p = p->next)
2577 if (p->sym->attr.intent == INTENT_IN)
2579 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2580 p->sym->name, sym->name);
2581 return 1;
2584 return 0;
2588 /* Match a single data transfer element. */
2590 static match
2591 match_dt_element (io_kind k, gfc_dt *dt)
2593 char name[GFC_MAX_SYMBOL_LEN + 1];
2594 gfc_symbol *sym;
2595 match m;
2597 if (gfc_match (" unit =") == MATCH_YES)
2599 m = match_dt_unit (k, dt);
2600 if (m != MATCH_NO)
2601 return m;
2604 if (gfc_match (" fmt =") == MATCH_YES)
2606 m = match_dt_format (dt);
2607 if (m != MATCH_NO)
2608 return m;
2611 if (gfc_match (" nml = %n", name) == MATCH_YES)
2613 if (dt->namelist != NULL)
2615 gfc_error ("Duplicate NML specification at %C");
2616 return MATCH_ERROR;
2619 if (gfc_find_symbol (name, NULL, 1, &sym))
2620 return MATCH_ERROR;
2622 if (sym == NULL || sym->attr.flavor != FL_NAMELIST)
2624 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2625 sym != NULL ? sym->name : name);
2626 return MATCH_ERROR;
2629 dt->namelist = sym;
2630 if (k == M_READ && check_namelist (sym))
2631 return MATCH_ERROR;
2633 return MATCH_YES;
2636 m = match_etag (&tag_e_async, &dt->asynchronous);
2637 if (m != MATCH_NO)
2638 return m;
2639 m = match_etag (&tag_e_blank, &dt->blank);
2640 if (m != MATCH_NO)
2641 return m;
2642 m = match_etag (&tag_e_delim, &dt->delim);
2643 if (m != MATCH_NO)
2644 return m;
2645 m = match_etag (&tag_e_pad, &dt->pad);
2646 if (m != MATCH_NO)
2647 return m;
2648 m = match_etag (&tag_e_sign, &dt->sign);
2649 if (m != MATCH_NO)
2650 return m;
2651 m = match_etag (&tag_e_round, &dt->round);
2652 if (m != MATCH_NO)
2653 return m;
2654 m = match_out_tag (&tag_id, &dt->id);
2655 if (m != MATCH_NO)
2656 return m;
2657 m = match_etag (&tag_e_decimal, &dt->decimal);
2658 if (m != MATCH_NO)
2659 return m;
2660 m = match_etag (&tag_rec, &dt->rec);
2661 if (m != MATCH_NO)
2662 return m;
2663 m = match_etag (&tag_spos, &dt->pos);
2664 if (m != MATCH_NO)
2665 return m;
2666 m = match_out_tag (&tag_iomsg, &dt->iomsg);
2667 if (m != MATCH_NO)
2668 return m;
2669 m = match_out_tag (&tag_iostat, &dt->iostat);
2670 if (m != MATCH_NO)
2671 return m;
2672 m = match_ltag (&tag_err, &dt->err);
2673 if (m == MATCH_YES)
2674 dt->err_where = gfc_current_locus;
2675 if (m != MATCH_NO)
2676 return m;
2677 m = match_etag (&tag_advance, &dt->advance);
2678 if (m != MATCH_NO)
2679 return m;
2680 m = match_out_tag (&tag_size, &dt->size);
2681 if (m != MATCH_NO)
2682 return m;
2684 m = match_ltag (&tag_end, &dt->end);
2685 if (m == MATCH_YES)
2687 if (k == M_WRITE)
2689 gfc_error ("END tag at %C not allowed in output statement");
2690 return MATCH_ERROR;
2692 dt->end_where = gfc_current_locus;
2694 if (m != MATCH_NO)
2695 return m;
2697 m = match_ltag (&tag_eor, &dt->eor);
2698 if (m == MATCH_YES)
2699 dt->eor_where = gfc_current_locus;
2700 if (m != MATCH_NO)
2701 return m;
2703 return MATCH_NO;
2707 /* Free a data transfer structure and everything below it. */
2709 void
2710 gfc_free_dt (gfc_dt *dt)
2712 if (dt == NULL)
2713 return;
2715 gfc_free_expr (dt->io_unit);
2716 gfc_free_expr (dt->format_expr);
2717 gfc_free_expr (dt->rec);
2718 gfc_free_expr (dt->advance);
2719 gfc_free_expr (dt->iomsg);
2720 gfc_free_expr (dt->iostat);
2721 gfc_free_expr (dt->size);
2722 gfc_free_expr (dt->pad);
2723 gfc_free_expr (dt->delim);
2724 gfc_free_expr (dt->sign);
2725 gfc_free_expr (dt->round);
2726 gfc_free_expr (dt->blank);
2727 gfc_free_expr (dt->decimal);
2728 gfc_free_expr (dt->pos);
2729 gfc_free_expr (dt->dt_io_kind);
2730 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2731 gfc_free (dt);
2735 /* Resolve everything in a gfc_dt structure. */
2737 gfc_try
2738 gfc_resolve_dt (gfc_dt *dt, locus *loc)
2740 gfc_expr *e;
2741 io_kind k;
2743 /* This is set in any case. */
2744 gcc_assert (dt->dt_io_kind);
2745 k = dt->dt_io_kind->value.iokind;
2747 RESOLVE_TAG (&tag_format, dt->format_expr);
2748 RESOLVE_TAG (&tag_rec, dt->rec);
2749 RESOLVE_TAG (&tag_spos, dt->pos);
2750 RESOLVE_TAG (&tag_advance, dt->advance);
2751 RESOLVE_TAG (&tag_id, dt->id);
2752 RESOLVE_TAG (&tag_iomsg, dt->iomsg);
2753 RESOLVE_TAG (&tag_iostat, dt->iostat);
2754 RESOLVE_TAG (&tag_size, dt->size);
2755 RESOLVE_TAG (&tag_e_pad, dt->pad);
2756 RESOLVE_TAG (&tag_e_delim, dt->delim);
2757 RESOLVE_TAG (&tag_e_sign, dt->sign);
2758 RESOLVE_TAG (&tag_e_round, dt->round);
2759 RESOLVE_TAG (&tag_e_blank, dt->blank);
2760 RESOLVE_TAG (&tag_e_decimal, dt->decimal);
2761 RESOLVE_TAG (&tag_e_async, dt->asynchronous);
2763 e = dt->io_unit;
2764 if (e == NULL)
2766 gfc_error ("UNIT not specified at %L", loc);
2767 return FAILURE;
2770 if (gfc_resolve_expr (e) == SUCCESS
2771 && (e->ts.type != BT_INTEGER
2772 && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE)))
2774 /* If there is no extra comma signifying the "format" form of the IO
2775 statement, then this must be an error. */
2776 if (!dt->extra_comma)
2778 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2779 "or a CHARACTER variable", &e->where);
2780 return FAILURE;
2782 else
2784 /* At this point, we have an extra comma. If io_unit has arrived as
2785 type character, we assume its really the "format" form of the I/O
2786 statement. We set the io_unit to the default unit and format to
2787 the character expression. See F95 Standard section 9.4. */
2788 if (e->ts.type == BT_CHARACTER && (k == M_READ || k == M_PRINT))
2790 dt->format_expr = dt->io_unit;
2791 dt->io_unit = default_unit (k);
2793 /* Nullify this pointer now so that a warning/error is not
2794 triggered below for the "Extension". */
2795 dt->extra_comma = NULL;
2798 if (k == M_WRITE)
2800 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2801 &dt->extra_comma->where);
2802 return FAILURE;
2807 if (e->ts.type == BT_CHARACTER)
2809 if (gfc_has_vector_index (e))
2811 gfc_error ("Internal unit with vector subscript at %L", &e->where);
2812 return FAILURE;
2815 /* If we are writing, make sure the internal unit can be changed. */
2816 gcc_assert (k != M_PRINT);
2817 if (k == M_WRITE
2818 && gfc_check_vardef_context (e, false, _("internal unit in WRITE"))
2819 == FAILURE)
2820 return FAILURE;
2823 if (e->rank && e->ts.type != BT_CHARACTER)
2825 gfc_error ("External IO UNIT cannot be an array at %L", &e->where);
2826 return FAILURE;
2829 if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_INTEGER
2830 && mpz_sgn (e->value.integer) < 0)
2832 gfc_error ("UNIT number in statement at %L must be non-negative",
2833 &e->where);
2834 return FAILURE;
2837 /* If we are reading and have a namelist, check that all namelist symbols
2838 can appear in a variable definition context. */
2839 if (k == M_READ && dt->namelist)
2841 gfc_namelist* n;
2842 for (n = dt->namelist->namelist; n; n = n->next)
2844 gfc_expr* e;
2845 gfc_try t;
2847 e = gfc_get_variable_expr (gfc_find_sym_in_symtree (n->sym));
2848 t = gfc_check_vardef_context (e, false, NULL);
2849 gfc_free_expr (e);
2851 if (t == FAILURE)
2853 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2854 " the symbol '%s' which may not appear in a"
2855 " variable definition context",
2856 dt->namelist->name, loc, n->sym->name);
2857 return FAILURE;
2862 if (dt->extra_comma
2863 && gfc_notify_std (GFC_STD_GNU, "Extension: Comma before i/o "
2864 "item list at %L", &dt->extra_comma->where) == FAILURE)
2865 return FAILURE;
2867 if (dt->err)
2869 if (gfc_reference_st_label (dt->err, ST_LABEL_TARGET) == FAILURE)
2870 return FAILURE;
2871 if (dt->err->defined == ST_LABEL_UNKNOWN)
2873 gfc_error ("ERR tag label %d at %L not defined",
2874 dt->err->value, &dt->err_where);
2875 return FAILURE;
2879 if (dt->end)
2881 if (gfc_reference_st_label (dt->end, ST_LABEL_TARGET) == FAILURE)
2882 return FAILURE;
2883 if (dt->end->defined == ST_LABEL_UNKNOWN)
2885 gfc_error ("END tag label %d at %L not defined",
2886 dt->end->value, &dt->end_where);
2887 return FAILURE;
2891 if (dt->eor)
2893 if (gfc_reference_st_label (dt->eor, ST_LABEL_TARGET) == FAILURE)
2894 return FAILURE;
2895 if (dt->eor->defined == ST_LABEL_UNKNOWN)
2897 gfc_error ("EOR tag label %d at %L not defined",
2898 dt->eor->value, &dt->eor_where);
2899 return FAILURE;
2903 /* Check the format label actually exists. */
2904 if (dt->format_label && dt->format_label != &format_asterisk
2905 && dt->format_label->defined == ST_LABEL_UNKNOWN)
2907 gfc_error ("FORMAT label %d at %L not defined", dt->format_label->value,
2908 &dt->format_label->where);
2909 return FAILURE;
2912 return SUCCESS;
2916 /* Given an io_kind, return its name. */
2918 static const char *
2919 io_kind_name (io_kind k)
2921 const char *name;
2923 switch (k)
2925 case M_READ:
2926 name = "READ";
2927 break;
2928 case M_WRITE:
2929 name = "WRITE";
2930 break;
2931 case M_PRINT:
2932 name = "PRINT";
2933 break;
2934 case M_INQUIRE:
2935 name = "INQUIRE";
2936 break;
2937 default:
2938 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2941 return name;
2945 /* Match an IO iteration statement of the form:
2947 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2949 which is equivalent to a single IO element. This function is
2950 mutually recursive with match_io_element(). */
2952 static match match_io_element (io_kind, gfc_code **);
2954 static match
2955 match_io_iterator (io_kind k, gfc_code **result)
2957 gfc_code *head, *tail, *new_code;
2958 gfc_iterator *iter;
2959 locus old_loc;
2960 match m;
2961 int n;
2963 iter = NULL;
2964 head = NULL;
2965 old_loc = gfc_current_locus;
2967 if (gfc_match_char ('(') != MATCH_YES)
2968 return MATCH_NO;
2970 m = match_io_element (k, &head);
2971 tail = head;
2973 if (m != MATCH_YES || gfc_match_char (',') != MATCH_YES)
2975 m = MATCH_NO;
2976 goto cleanup;
2979 /* Can't be anything but an IO iterator. Build a list. */
2980 iter = gfc_get_iterator ();
2982 for (n = 1;; n++)
2984 m = gfc_match_iterator (iter, 0);
2985 if (m == MATCH_ERROR)
2986 goto cleanup;
2987 if (m == MATCH_YES)
2989 gfc_check_do_variable (iter->var->symtree);
2990 break;
2993 m = match_io_element (k, &new_code);
2994 if (m == MATCH_ERROR)
2995 goto cleanup;
2996 if (m == MATCH_NO)
2998 if (n > 2)
2999 goto syntax;
3000 goto cleanup;
3003 tail = gfc_append_code (tail, new_code);
3005 if (gfc_match_char (',') != MATCH_YES)
3007 if (n > 2)
3008 goto syntax;
3009 m = MATCH_NO;
3010 goto cleanup;
3014 if (gfc_match_char (')') != MATCH_YES)
3015 goto syntax;
3017 new_code = gfc_get_code ();
3018 new_code->op = EXEC_DO;
3019 new_code->ext.iterator = iter;
3021 new_code->block = gfc_get_code ();
3022 new_code->block->op = EXEC_DO;
3023 new_code->block->next = head;
3025 *result = new_code;
3026 return MATCH_YES;
3028 syntax:
3029 gfc_error ("Syntax error in I/O iterator at %C");
3030 m = MATCH_ERROR;
3032 cleanup:
3033 gfc_free_iterator (iter, 1);
3034 gfc_free_statements (head);
3035 gfc_current_locus = old_loc;
3036 return m;
3040 /* Match a single element of an IO list, which is either a single
3041 expression or an IO Iterator. */
3043 static match
3044 match_io_element (io_kind k, gfc_code **cpp)
3046 gfc_expr *expr;
3047 gfc_code *cp;
3048 match m;
3050 expr = NULL;
3052 m = match_io_iterator (k, cpp);
3053 if (m == MATCH_YES)
3054 return MATCH_YES;
3056 if (k == M_READ)
3058 m = gfc_match_variable (&expr, 0);
3059 if (m == MATCH_NO)
3060 gfc_error ("Expected variable in READ statement at %C");
3062 else
3064 m = gfc_match_expr (&expr);
3065 if (m == MATCH_NO)
3066 gfc_error ("Expected expression in %s statement at %C",
3067 io_kind_name (k));
3070 if (m == MATCH_YES && k == M_READ && gfc_check_do_variable (expr->symtree))
3071 m = MATCH_ERROR;
3073 if (m != MATCH_YES)
3075 gfc_free_expr (expr);
3076 return MATCH_ERROR;
3079 cp = gfc_get_code ();
3080 cp->op = EXEC_TRANSFER;
3081 cp->expr1 = expr;
3082 cp->ext.dt = current_dt;
3084 *cpp = cp;
3085 return MATCH_YES;
3089 /* Match an I/O list, building gfc_code structures as we go. */
3091 static match
3092 match_io_list (io_kind k, gfc_code **head_p)
3094 gfc_code *head, *tail, *new_code;
3095 match m;
3097 *head_p = head = tail = NULL;
3098 if (gfc_match_eos () == MATCH_YES)
3099 return MATCH_YES;
3101 for (;;)
3103 m = match_io_element (k, &new_code);
3104 if (m == MATCH_ERROR)
3105 goto cleanup;
3106 if (m == MATCH_NO)
3107 goto syntax;
3109 tail = gfc_append_code (tail, new_code);
3110 if (head == NULL)
3111 head = new_code;
3113 if (gfc_match_eos () == MATCH_YES)
3114 break;
3115 if (gfc_match_char (',') != MATCH_YES)
3116 goto syntax;
3119 *head_p = head;
3120 return MATCH_YES;
3122 syntax:
3123 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3125 cleanup:
3126 gfc_free_statements (head);
3127 return MATCH_ERROR;
3131 /* Attach the data transfer end node. */
3133 static void
3134 terminate_io (gfc_code *io_code)
3136 gfc_code *c;
3138 if (io_code == NULL)
3139 io_code = new_st.block;
3141 c = gfc_get_code ();
3142 c->op = EXEC_DT_END;
3144 /* Point to structure that is already there */
3145 c->ext.dt = new_st.ext.dt;
3146 gfc_append_code (io_code, c);
3150 /* Check the constraints for a data transfer statement. The majority of the
3151 constraints appearing in 9.4 of the standard appear here. Some are handled
3152 in resolve_tag and others in gfc_resolve_dt. */
3154 static match
3155 check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code,
3156 locus *spec_end)
3158 #define io_constraint(condition,msg,arg)\
3159 if (condition) \
3161 gfc_error(msg,arg);\
3162 m = MATCH_ERROR;\
3165 match m;
3166 gfc_expr *expr;
3167 gfc_symbol *sym = NULL;
3168 bool warn, unformatted;
3170 warn = (dt->err || dt->iostat) ? true : false;
3171 unformatted = dt->format_expr == NULL && dt->format_label == NULL
3172 && dt->namelist == NULL;
3174 m = MATCH_YES;
3176 expr = dt->io_unit;
3177 if (expr && expr->expr_type == EXPR_VARIABLE
3178 && expr->ts.type == BT_CHARACTER)
3180 sym = expr->symtree->n.sym;
3182 io_constraint (k == M_WRITE && sym->attr.intent == INTENT_IN,
3183 "Internal file at %L must not be INTENT(IN)",
3184 &expr->where);
3186 io_constraint (gfc_has_vector_index (dt->io_unit),
3187 "Internal file incompatible with vector subscript at %L",
3188 &expr->where);
3190 io_constraint (dt->rec != NULL,
3191 "REC tag at %L is incompatible with internal file",
3192 &dt->rec->where);
3194 io_constraint (dt->pos != NULL,
3195 "POS tag at %L is incompatible with internal file",
3196 &dt->pos->where);
3198 io_constraint (unformatted,
3199 "Unformatted I/O not allowed with internal unit at %L",
3200 &dt->io_unit->where);
3202 io_constraint (dt->asynchronous != NULL,
3203 "ASYNCHRONOUS tag at %L not allowed with internal file",
3204 &dt->asynchronous->where);
3206 if (dt->namelist != NULL)
3208 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Internal file "
3209 "at %L with namelist", &expr->where)
3210 == FAILURE)
3211 m = MATCH_ERROR;
3214 io_constraint (dt->advance != NULL,
3215 "ADVANCE tag at %L is incompatible with internal file",
3216 &dt->advance->where);
3219 if (expr && expr->ts.type != BT_CHARACTER)
3222 io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE),
3223 "IO UNIT in %s statement at %C must be "
3224 "an internal file in a PURE procedure",
3225 io_kind_name (k));
3228 if (k != M_READ)
3230 io_constraint (dt->end, "END tag not allowed with output at %L",
3231 &dt->end_where);
3233 io_constraint (dt->eor, "EOR tag not allowed with output at %L",
3234 &dt->eor_where);
3236 io_constraint (dt->blank, "BLANK= specifier not allowed with output at %L",
3237 &dt->blank->where);
3239 io_constraint (dt->pad, "PAD= specifier not allowed with output at %L",
3240 &dt->pad->where);
3242 io_constraint (dt->size, "SIZE= specifier not allowed with output at %L",
3243 &dt->size->where);
3245 else
3247 io_constraint (dt->size && dt->advance == NULL,
3248 "SIZE tag at %L requires an ADVANCE tag",
3249 &dt->size->where);
3251 io_constraint (dt->eor && dt->advance == NULL,
3252 "EOR tag at %L requires an ADVANCE tag",
3253 &dt->eor_where);
3256 if (dt->asynchronous)
3258 static const char * asynchronous[] = { "YES", "NO", NULL };
3260 if (gfc_reduce_init_expr (dt->asynchronous) != SUCCESS)
3262 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3263 "expression", &dt->asynchronous->where);
3264 return MATCH_ERROR;
3267 if (!compare_to_allowed_values
3268 ("ASYNCHRONOUS", asynchronous, NULL, NULL,
3269 dt->asynchronous->value.character.string,
3270 io_kind_name (k), warn))
3271 return MATCH_ERROR;
3274 if (dt->id)
3276 bool not_yes
3277 = !dt->asynchronous
3278 || gfc_wide_strlen (dt->asynchronous->value.character.string) != 3
3279 || gfc_wide_strncasecmp (dt->asynchronous->value.character.string,
3280 "yes", 3) != 0;
3281 io_constraint (not_yes,
3282 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3283 "specifier", &dt->id->where);
3286 if (dt->decimal)
3288 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
3289 "not allowed in Fortran 95") == FAILURE)
3290 return MATCH_ERROR;
3292 if (dt->decimal->expr_type == EXPR_CONSTANT)
3294 static const char * decimal[] = { "COMMA", "POINT", NULL };
3296 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
3297 dt->decimal->value.character.string,
3298 io_kind_name (k), warn))
3299 return MATCH_ERROR;
3301 io_constraint (unformatted,
3302 "the DECIMAL= specifier at %L must be with an "
3303 "explicit format expression", &dt->decimal->where);
3307 if (dt->blank)
3309 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
3310 "not allowed in Fortran 95") == FAILURE)
3311 return MATCH_ERROR;
3313 if (dt->blank->expr_type == EXPR_CONSTANT)
3315 static const char * blank[] = { "NULL", "ZERO", NULL };
3317 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
3318 dt->blank->value.character.string,
3319 io_kind_name (k), warn))
3320 return MATCH_ERROR;
3322 io_constraint (unformatted,
3323 "the BLANK= specifier at %L must be with an "
3324 "explicit format expression", &dt->blank->where);
3328 if (dt->pad)
3330 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PAD= at %C "
3331 "not allowed in Fortran 95") == FAILURE)
3332 return MATCH_ERROR;
3334 if (dt->pad->expr_type == EXPR_CONSTANT)
3336 static const char * pad[] = { "YES", "NO", NULL };
3338 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
3339 dt->pad->value.character.string,
3340 io_kind_name (k), warn))
3341 return MATCH_ERROR;
3343 io_constraint (unformatted,
3344 "the PAD= specifier at %L must be with an "
3345 "explicit format expression", &dt->pad->where);
3349 if (dt->round)
3351 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ROUND= at %C "
3352 "not allowed in Fortran 95") == FAILURE)
3353 return MATCH_ERROR;
3355 if (dt->round->expr_type == EXPR_CONSTANT)
3357 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
3358 "COMPATIBLE", "PROCESSOR_DEFINED",
3359 NULL };
3361 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
3362 dt->round->value.character.string,
3363 io_kind_name (k), warn))
3364 return MATCH_ERROR;
3368 if (dt->sign)
3370 /* When implemented, change the following to use gfc_notify_std F2003.
3371 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
3372 "not allowed in Fortran 95") == FAILURE)
3373 return MATCH_ERROR; */
3374 if (dt->sign->expr_type == EXPR_CONSTANT)
3376 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3377 NULL };
3379 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
3380 dt->sign->value.character.string,
3381 io_kind_name (k), warn))
3382 return MATCH_ERROR;
3384 io_constraint (unformatted,
3385 "SIGN= specifier at %L must be with an "
3386 "explicit format expression", &dt->sign->where);
3388 io_constraint (k == M_READ,
3389 "SIGN= specifier at %L not allowed in a "
3390 "READ statement", &dt->sign->where);
3394 if (dt->delim)
3396 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
3397 "not allowed in Fortran 95") == FAILURE)
3398 return MATCH_ERROR;
3400 if (dt->delim->expr_type == EXPR_CONSTANT)
3402 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
3404 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
3405 dt->delim->value.character.string,
3406 io_kind_name (k), warn))
3407 return MATCH_ERROR;
3409 io_constraint (k == M_READ,
3410 "DELIM= specifier at %L not allowed in a "
3411 "READ statement", &dt->delim->where);
3413 io_constraint (dt->format_label != &format_asterisk
3414 && dt->namelist == NULL,
3415 "DELIM= specifier at %L must have FMT=*",
3416 &dt->delim->where);
3418 io_constraint (unformatted && dt->namelist == NULL,
3419 "DELIM= specifier at %L must be with FMT=* or "
3420 "NML= specifier ", &dt->delim->where);
3424 if (dt->namelist)
3426 io_constraint (io_code && dt->namelist,
3427 "NAMELIST cannot be followed by IO-list at %L",
3428 &io_code->loc);
3430 io_constraint (dt->format_expr,
3431 "IO spec-list cannot contain both NAMELIST group name "
3432 "and format specification at %L",
3433 &dt->format_expr->where);
3435 io_constraint (dt->format_label,
3436 "IO spec-list cannot contain both NAMELIST group name "
3437 "and format label at %L", spec_end);
3439 io_constraint (dt->rec,
3440 "NAMELIST IO is not allowed with a REC= specifier "
3441 "at %L", &dt->rec->where);
3443 io_constraint (dt->advance,
3444 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3445 "at %L", &dt->advance->where);
3448 if (dt->rec)
3450 io_constraint (dt->end,
3451 "An END tag is not allowed with a "
3452 "REC= specifier at %L", &dt->end_where);
3454 io_constraint (dt->format_label == &format_asterisk,
3455 "FMT=* is not allowed with a REC= specifier "
3456 "at %L", spec_end);
3458 io_constraint (dt->pos,
3459 "POS= is not allowed with REC= specifier "
3460 "at %L", &dt->pos->where);
3463 if (dt->advance)
3465 int not_yes, not_no;
3466 expr = dt->advance;
3468 io_constraint (dt->format_label == &format_asterisk,
3469 "List directed format(*) is not allowed with a "
3470 "ADVANCE= specifier at %L.", &expr->where);
3472 io_constraint (unformatted,
3473 "the ADVANCE= specifier at %L must appear with an "
3474 "explicit format expression", &expr->where);
3476 if (expr->expr_type == EXPR_CONSTANT && expr->ts.type == BT_CHARACTER)
3478 const gfc_char_t *advance = expr->value.character.string;
3479 not_no = gfc_wide_strlen (advance) != 2
3480 || gfc_wide_strncasecmp (advance, "no", 2) != 0;
3481 not_yes = gfc_wide_strlen (advance) != 3
3482 || gfc_wide_strncasecmp (advance, "yes", 3) != 0;
3484 else
3486 not_no = 0;
3487 not_yes = 0;
3490 io_constraint (not_no && not_yes,
3491 "ADVANCE= specifier at %L must have value = "
3492 "YES or NO.", &expr->where);
3494 io_constraint (dt->size && not_no && k == M_READ,
3495 "SIZE tag at %L requires an ADVANCE = 'NO'",
3496 &dt->size->where);
3498 io_constraint (dt->eor && not_no && k == M_READ,
3499 "EOR tag at %L requires an ADVANCE = 'NO'",
3500 &dt->eor_where);
3503 expr = dt->format_expr;
3504 if (gfc_simplify_expr (expr, 0) == FAILURE
3505 || check_format_string (expr, k == M_READ) == FAILURE)
3506 return MATCH_ERROR;
3508 return m;
3510 #undef io_constraint
3513 /* Match a READ, WRITE or PRINT statement. */
3515 static match
3516 match_io (io_kind k)
3518 char name[GFC_MAX_SYMBOL_LEN + 1];
3519 gfc_code *io_code;
3520 gfc_symbol *sym;
3521 int comma_flag;
3522 locus where;
3523 locus spec_end;
3524 gfc_dt *dt;
3525 match m;
3527 where = gfc_current_locus;
3528 comma_flag = 0;
3529 current_dt = dt = XCNEW (gfc_dt);
3530 m = gfc_match_char ('(');
3531 if (m == MATCH_NO)
3533 where = gfc_current_locus;
3534 if (k == M_WRITE)
3535 goto syntax;
3536 else if (k == M_PRINT)
3538 /* Treat the non-standard case of PRINT namelist. */
3539 if ((gfc_current_form == FORM_FIXED || gfc_peek_ascii_char () == ' ')
3540 && gfc_match_name (name) == MATCH_YES)
3542 gfc_find_symbol (name, NULL, 1, &sym);
3543 if (sym && sym->attr.flavor == FL_NAMELIST)
3545 if (gfc_notify_std (GFC_STD_GNU, "PRINT namelist at "
3546 "%C is an extension") == FAILURE)
3548 m = MATCH_ERROR;
3549 goto cleanup;
3552 dt->io_unit = default_unit (k);
3553 dt->namelist = sym;
3554 goto get_io_list;
3556 else
3557 gfc_current_locus = where;
3561 if (gfc_current_form == FORM_FREE)
3563 char c = gfc_peek_ascii_char ();
3564 if (c != ' ' && c != '*' && c != '\'' && c != '"')
3566 m = MATCH_NO;
3567 goto cleanup;
3571 m = match_dt_format (dt);
3572 if (m == MATCH_ERROR)
3573 goto cleanup;
3574 if (m == MATCH_NO)
3575 goto syntax;
3577 comma_flag = 1;
3578 dt->io_unit = default_unit (k);
3579 goto get_io_list;
3581 else
3583 /* Before issuing an error for a malformed 'print (1,*)' type of
3584 error, check for a default-char-expr of the form ('(I0)'). */
3585 if (k == M_PRINT && m == MATCH_YES)
3587 /* Reset current locus to get the initial '(' in an expression. */
3588 gfc_current_locus = where;
3589 dt->format_expr = NULL;
3590 m = match_dt_format (dt);
3592 if (m == MATCH_ERROR)
3593 goto cleanup;
3594 if (m == MATCH_NO || dt->format_expr == NULL)
3595 goto syntax;
3597 comma_flag = 1;
3598 dt->io_unit = default_unit (k);
3599 goto get_io_list;
3603 /* Match a control list */
3604 if (match_dt_element (k, dt) == MATCH_YES)
3605 goto next;
3606 if (match_dt_unit (k, dt) != MATCH_YES)
3607 goto loop;
3609 if (gfc_match_char (')') == MATCH_YES)
3610 goto get_io_list;
3611 if (gfc_match_char (',') != MATCH_YES)
3612 goto syntax;
3614 m = match_dt_element (k, dt);
3615 if (m == MATCH_YES)
3616 goto next;
3617 if (m == MATCH_ERROR)
3618 goto cleanup;
3620 m = match_dt_format (dt);
3621 if (m == MATCH_YES)
3622 goto next;
3623 if (m == MATCH_ERROR)
3624 goto cleanup;
3626 where = gfc_current_locus;
3628 m = gfc_match_name (name);
3629 if (m == MATCH_YES)
3631 gfc_find_symbol (name, NULL, 1, &sym);
3632 if (sym && sym->attr.flavor == FL_NAMELIST)
3634 dt->namelist = sym;
3635 if (k == M_READ && check_namelist (sym))
3637 m = MATCH_ERROR;
3638 goto cleanup;
3640 goto next;
3644 gfc_current_locus = where;
3646 goto loop; /* No matches, try regular elements */
3648 next:
3649 if (gfc_match_char (')') == MATCH_YES)
3650 goto get_io_list;
3651 if (gfc_match_char (',') != MATCH_YES)
3652 goto syntax;
3654 loop:
3655 for (;;)
3657 m = match_dt_element (k, dt);
3658 if (m == MATCH_NO)
3659 goto syntax;
3660 if (m == MATCH_ERROR)
3661 goto cleanup;
3663 if (gfc_match_char (')') == MATCH_YES)
3664 break;
3665 if (gfc_match_char (',') != MATCH_YES)
3666 goto syntax;
3669 get_io_list:
3671 /* Used in check_io_constraints, where no locus is available. */
3672 spec_end = gfc_current_locus;
3674 /* Save the IO kind for later use. */
3675 dt->dt_io_kind = gfc_get_iokind_expr (&gfc_current_locus, k);
3677 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3678 to save the locus. This is used later when resolving transfer statements
3679 that might have a format expression without unit number. */
3680 if (!comma_flag && gfc_match_char (',') == MATCH_YES)
3681 dt->extra_comma = dt->dt_io_kind;
3683 io_code = NULL;
3684 if (gfc_match_eos () != MATCH_YES)
3686 if (comma_flag && gfc_match_char (',') != MATCH_YES)
3688 gfc_error ("Expected comma in I/O list at %C");
3689 m = MATCH_ERROR;
3690 goto cleanup;
3693 m = match_io_list (k, &io_code);
3694 if (m == MATCH_ERROR)
3695 goto cleanup;
3696 if (m == MATCH_NO)
3697 goto syntax;
3700 /* A full IO statement has been matched. Check the constraints. spec_end is
3701 supplied for cases where no locus is supplied. */
3702 m = check_io_constraints (k, dt, io_code, &spec_end);
3704 if (m == MATCH_ERROR)
3705 goto cleanup;
3707 new_st.op = (k == M_READ) ? EXEC_READ : EXEC_WRITE;
3708 new_st.ext.dt = dt;
3709 new_st.block = gfc_get_code ();
3710 new_st.block->op = new_st.op;
3711 new_st.block->next = io_code;
3713 terminate_io (io_code);
3715 return MATCH_YES;
3717 syntax:
3718 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3719 m = MATCH_ERROR;
3721 cleanup:
3722 gfc_free_dt (dt);
3723 return m;
3727 match
3728 gfc_match_read (void)
3730 return match_io (M_READ);
3734 match
3735 gfc_match_write (void)
3737 return match_io (M_WRITE);
3741 match
3742 gfc_match_print (void)
3744 match m;
3746 m = match_io (M_PRINT);
3747 if (m != MATCH_YES)
3748 return m;
3750 if (gfc_pure (NULL))
3752 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3753 return MATCH_ERROR;
3756 return MATCH_YES;
3760 /* Free a gfc_inquire structure. */
3762 void
3763 gfc_free_inquire (gfc_inquire *inquire)
3766 if (inquire == NULL)
3767 return;
3769 gfc_free_expr (inquire->unit);
3770 gfc_free_expr (inquire->file);
3771 gfc_free_expr (inquire->iomsg);
3772 gfc_free_expr (inquire->iostat);
3773 gfc_free_expr (inquire->exist);
3774 gfc_free_expr (inquire->opened);
3775 gfc_free_expr (inquire->number);
3776 gfc_free_expr (inquire->named);
3777 gfc_free_expr (inquire->name);
3778 gfc_free_expr (inquire->access);
3779 gfc_free_expr (inquire->sequential);
3780 gfc_free_expr (inquire->direct);
3781 gfc_free_expr (inquire->form);
3782 gfc_free_expr (inquire->formatted);
3783 gfc_free_expr (inquire->unformatted);
3784 gfc_free_expr (inquire->recl);
3785 gfc_free_expr (inquire->nextrec);
3786 gfc_free_expr (inquire->blank);
3787 gfc_free_expr (inquire->position);
3788 gfc_free_expr (inquire->action);
3789 gfc_free_expr (inquire->read);
3790 gfc_free_expr (inquire->write);
3791 gfc_free_expr (inquire->readwrite);
3792 gfc_free_expr (inquire->delim);
3793 gfc_free_expr (inquire->encoding);
3794 gfc_free_expr (inquire->pad);
3795 gfc_free_expr (inquire->iolength);
3796 gfc_free_expr (inquire->convert);
3797 gfc_free_expr (inquire->strm_pos);
3798 gfc_free_expr (inquire->asynchronous);
3799 gfc_free_expr (inquire->decimal);
3800 gfc_free_expr (inquire->pending);
3801 gfc_free_expr (inquire->id);
3802 gfc_free_expr (inquire->sign);
3803 gfc_free_expr (inquire->size);
3804 gfc_free_expr (inquire->round);
3805 gfc_free (inquire);
3809 /* Match an element of an INQUIRE statement. */
3811 #define RETM if (m != MATCH_NO) return m;
3813 static match
3814 match_inquire_element (gfc_inquire *inquire)
3816 match m;
3818 m = match_etag (&tag_unit, &inquire->unit);
3819 RETM m = match_etag (&tag_file, &inquire->file);
3820 RETM m = match_ltag (&tag_err, &inquire->err);
3821 RETM m = match_out_tag (&tag_iomsg, &inquire->iomsg);
3822 RETM m = match_out_tag (&tag_iostat, &inquire->iostat);
3823 RETM m = match_vtag (&tag_exist, &inquire->exist);
3824 RETM m = match_vtag (&tag_opened, &inquire->opened);
3825 RETM m = match_vtag (&tag_named, &inquire->named);
3826 RETM m = match_vtag (&tag_name, &inquire->name);
3827 RETM m = match_out_tag (&tag_number, &inquire->number);
3828 RETM m = match_vtag (&tag_s_access, &inquire->access);
3829 RETM m = match_vtag (&tag_sequential, &inquire->sequential);
3830 RETM m = match_vtag (&tag_direct, &inquire->direct);
3831 RETM m = match_vtag (&tag_s_form, &inquire->form);
3832 RETM m = match_vtag (&tag_formatted, &inquire->formatted);
3833 RETM m = match_vtag (&tag_unformatted, &inquire->unformatted);
3834 RETM m = match_out_tag (&tag_s_recl, &inquire->recl);
3835 RETM m = match_out_tag (&tag_nextrec, &inquire->nextrec);
3836 RETM m = match_vtag (&tag_s_blank, &inquire->blank);
3837 RETM m = match_vtag (&tag_s_position, &inquire->position);
3838 RETM m = match_vtag (&tag_s_action, &inquire->action);
3839 RETM m = match_vtag (&tag_read, &inquire->read);
3840 RETM m = match_vtag (&tag_write, &inquire->write);
3841 RETM m = match_vtag (&tag_readwrite, &inquire->readwrite);
3842 RETM m = match_vtag (&tag_s_async, &inquire->asynchronous);
3843 RETM m = match_vtag (&tag_s_delim, &inquire->delim);
3844 RETM m = match_vtag (&tag_s_decimal, &inquire->decimal);
3845 RETM m = match_vtag (&tag_size, &inquire->size);
3846 RETM m = match_vtag (&tag_s_encoding, &inquire->encoding);
3847 RETM m = match_vtag (&tag_s_round, &inquire->round);
3848 RETM m = match_vtag (&tag_s_sign, &inquire->sign);
3849 RETM m = match_vtag (&tag_s_pad, &inquire->pad);
3850 RETM m = match_vtag (&tag_iolength, &inquire->iolength);
3851 RETM m = match_vtag (&tag_convert, &inquire->convert);
3852 RETM m = match_out_tag (&tag_strm_out, &inquire->strm_pos);
3853 RETM m = match_vtag (&tag_pending, &inquire->pending);
3854 RETM m = match_vtag (&tag_id, &inquire->id);
3855 RETM return MATCH_NO;
3858 #undef RETM
3861 match
3862 gfc_match_inquire (void)
3864 gfc_inquire *inquire;
3865 gfc_code *code;
3866 match m;
3867 locus loc;
3869 m = gfc_match_char ('(');
3870 if (m == MATCH_NO)
3871 return m;
3873 inquire = XCNEW (gfc_inquire);
3875 loc = gfc_current_locus;
3877 m = match_inquire_element (inquire);
3878 if (m == MATCH_ERROR)
3879 goto cleanup;
3880 if (m == MATCH_NO)
3882 m = gfc_match_expr (&inquire->unit);
3883 if (m == MATCH_ERROR)
3884 goto cleanup;
3885 if (m == MATCH_NO)
3886 goto syntax;
3889 /* See if we have the IOLENGTH form of the inquire statement. */
3890 if (inquire->iolength != NULL)
3892 if (gfc_match_char (')') != MATCH_YES)
3893 goto syntax;
3895 m = match_io_list (M_INQUIRE, &code);
3896 if (m == MATCH_ERROR)
3897 goto cleanup;
3898 if (m == MATCH_NO)
3899 goto syntax;
3901 new_st.op = EXEC_IOLENGTH;
3902 new_st.expr1 = inquire->iolength;
3903 new_st.ext.inquire = inquire;
3905 if (gfc_pure (NULL))
3907 gfc_free_statements (code);
3908 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3909 return MATCH_ERROR;
3912 new_st.block = gfc_get_code ();
3913 new_st.block->op = EXEC_IOLENGTH;
3914 terminate_io (code);
3915 new_st.block->next = code;
3916 return MATCH_YES;
3919 /* At this point, we have the non-IOLENGTH inquire statement. */
3920 for (;;)
3922 if (gfc_match_char (')') == MATCH_YES)
3923 break;
3924 if (gfc_match_char (',') != MATCH_YES)
3925 goto syntax;
3927 m = match_inquire_element (inquire);
3928 if (m == MATCH_ERROR)
3929 goto cleanup;
3930 if (m == MATCH_NO)
3931 goto syntax;
3933 if (inquire->iolength != NULL)
3935 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
3936 goto cleanup;
3940 if (gfc_match_eos () != MATCH_YES)
3941 goto syntax;
3943 if (inquire->unit != NULL && inquire->file != NULL)
3945 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
3946 "UNIT specifiers", &loc);
3947 goto cleanup;
3950 if (inquire->unit == NULL && inquire->file == NULL)
3952 gfc_error ("INQUIRE statement at %L requires either FILE or "
3953 "UNIT specifier", &loc);
3954 goto cleanup;
3957 if (gfc_pure (NULL))
3959 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3960 goto cleanup;
3963 if (inquire->id != NULL && inquire->pending == NULL)
3965 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
3966 "the ID= specifier", &loc);
3967 goto cleanup;
3970 new_st.op = EXEC_INQUIRE;
3971 new_st.ext.inquire = inquire;
3972 return MATCH_YES;
3974 syntax:
3975 gfc_syntax_error (ST_INQUIRE);
3977 cleanup:
3978 gfc_free_inquire (inquire);
3979 return MATCH_ERROR;
3983 /* Resolve everything in a gfc_inquire structure. */
3985 gfc_try
3986 gfc_resolve_inquire (gfc_inquire *inquire)
3988 RESOLVE_TAG (&tag_unit, inquire->unit);
3989 RESOLVE_TAG (&tag_file, inquire->file);
3990 RESOLVE_TAG (&tag_id, inquire->id);
3992 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
3993 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
3994 #define INQUIRE_RESOLVE_TAG(tag, expr) \
3995 RESOLVE_TAG (tag, expr); \
3996 if (expr) \
3998 char context[64]; \
3999 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4000 if (gfc_check_vardef_context ((expr), false, context) == FAILURE) \
4001 return FAILURE; \
4003 INQUIRE_RESOLVE_TAG (&tag_iomsg, inquire->iomsg);
4004 INQUIRE_RESOLVE_TAG (&tag_iostat, inquire->iostat);
4005 INQUIRE_RESOLVE_TAG (&tag_exist, inquire->exist);
4006 INQUIRE_RESOLVE_TAG (&tag_opened, inquire->opened);
4007 INQUIRE_RESOLVE_TAG (&tag_number, inquire->number);
4008 INQUIRE_RESOLVE_TAG (&tag_named, inquire->named);
4009 INQUIRE_RESOLVE_TAG (&tag_name, inquire->name);
4010 INQUIRE_RESOLVE_TAG (&tag_s_access, inquire->access);
4011 INQUIRE_RESOLVE_TAG (&tag_sequential, inquire->sequential);
4012 INQUIRE_RESOLVE_TAG (&tag_direct, inquire->direct);
4013 INQUIRE_RESOLVE_TAG (&tag_s_form, inquire->form);
4014 INQUIRE_RESOLVE_TAG (&tag_formatted, inquire->formatted);
4015 INQUIRE_RESOLVE_TAG (&tag_unformatted, inquire->unformatted);
4016 INQUIRE_RESOLVE_TAG (&tag_s_recl, inquire->recl);
4017 INQUIRE_RESOLVE_TAG (&tag_nextrec, inquire->nextrec);
4018 INQUIRE_RESOLVE_TAG (&tag_s_blank, inquire->blank);
4019 INQUIRE_RESOLVE_TAG (&tag_s_position, inquire->position);
4020 INQUIRE_RESOLVE_TAG (&tag_s_action, inquire->action);
4021 INQUIRE_RESOLVE_TAG (&tag_read, inquire->read);
4022 INQUIRE_RESOLVE_TAG (&tag_write, inquire->write);
4023 INQUIRE_RESOLVE_TAG (&tag_readwrite, inquire->readwrite);
4024 INQUIRE_RESOLVE_TAG (&tag_s_delim, inquire->delim);
4025 INQUIRE_RESOLVE_TAG (&tag_s_pad, inquire->pad);
4026 INQUIRE_RESOLVE_TAG (&tag_s_encoding, inquire->encoding);
4027 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4028 INQUIRE_RESOLVE_TAG (&tag_iolength, inquire->iolength);
4029 INQUIRE_RESOLVE_TAG (&tag_convert, inquire->convert);
4030 INQUIRE_RESOLVE_TAG (&tag_strm_out, inquire->strm_pos);
4031 INQUIRE_RESOLVE_TAG (&tag_s_async, inquire->asynchronous);
4032 INQUIRE_RESOLVE_TAG (&tag_s_sign, inquire->sign);
4033 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4034 INQUIRE_RESOLVE_TAG (&tag_pending, inquire->pending);
4035 INQUIRE_RESOLVE_TAG (&tag_size, inquire->size);
4036 #undef INQUIRE_RESOLVE_TAG
4038 if (gfc_reference_st_label (inquire->err, ST_LABEL_TARGET) == FAILURE)
4039 return FAILURE;
4041 return SUCCESS;
4045 void
4046 gfc_free_wait (gfc_wait *wait)
4048 if (wait == NULL)
4049 return;
4051 gfc_free_expr (wait->unit);
4052 gfc_free_expr (wait->iostat);
4053 gfc_free_expr (wait->iomsg);
4054 gfc_free_expr (wait->id);
4058 gfc_try
4059 gfc_resolve_wait (gfc_wait *wait)
4061 RESOLVE_TAG (&tag_unit, wait->unit);
4062 RESOLVE_TAG (&tag_iomsg, wait->iomsg);
4063 RESOLVE_TAG (&tag_iostat, wait->iostat);
4064 RESOLVE_TAG (&tag_id, wait->id);
4066 if (gfc_reference_st_label (wait->err, ST_LABEL_TARGET) == FAILURE)
4067 return FAILURE;
4069 if (gfc_reference_st_label (wait->end, ST_LABEL_TARGET) == FAILURE)
4070 return FAILURE;
4072 return SUCCESS;
4075 /* Match an element of a WAIT statement. */
4077 #define RETM if (m != MATCH_NO) return m;
4079 static match
4080 match_wait_element (gfc_wait *wait)
4082 match m;
4084 m = match_etag (&tag_unit, &wait->unit);
4085 RETM m = match_ltag (&tag_err, &wait->err);
4086 RETM m = match_ltag (&tag_end, &wait->eor);
4087 RETM m = match_ltag (&tag_eor, &wait->end);
4088 RETM m = match_out_tag (&tag_iomsg, &wait->iomsg);
4089 RETM m = match_out_tag (&tag_iostat, &wait->iostat);
4090 RETM m = match_etag (&tag_id, &wait->id);
4091 RETM return MATCH_NO;
4094 #undef RETM
4097 match
4098 gfc_match_wait (void)
4100 gfc_wait *wait;
4101 match m;
4103 m = gfc_match_char ('(');
4104 if (m == MATCH_NO)
4105 return m;
4107 wait = XCNEW (gfc_wait);
4109 m = match_wait_element (wait);
4110 if (m == MATCH_ERROR)
4111 goto cleanup;
4112 if (m == MATCH_NO)
4114 m = gfc_match_expr (&wait->unit);
4115 if (m == MATCH_ERROR)
4116 goto cleanup;
4117 if (m == MATCH_NO)
4118 goto syntax;
4121 for (;;)
4123 if (gfc_match_char (')') == MATCH_YES)
4124 break;
4125 if (gfc_match_char (',') != MATCH_YES)
4126 goto syntax;
4128 m = match_wait_element (wait);
4129 if (m == MATCH_ERROR)
4130 goto cleanup;
4131 if (m == MATCH_NO)
4132 goto syntax;
4135 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: WAIT at %C "
4136 "not allowed in Fortran 95") == FAILURE)
4137 goto cleanup;
4139 if (gfc_pure (NULL))
4141 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4142 goto cleanup;
4145 new_st.op = EXEC_WAIT;
4146 new_st.ext.wait = wait;
4148 return MATCH_YES;
4150 syntax:
4151 gfc_syntax_error (ST_WAIT);
4153 cleanup:
4154 gfc_free_wait (wait);
4155 return MATCH_ERROR;