re PR debug/51746 (Segfault in cselib_preserved_value_p)
[official-gcc.git] / gcc / fortran / io.c
blob88f7a249e001377ffcd38f1c149ca43953687459
1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009, 2010, 2011
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 (gfc_instring 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 (NONSTRING);
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 (INSTRING_WARN);
378 if (c == '\0')
380 token = FMT_END;
381 break;
384 if (c == delim)
386 c = next_char (INSTRING_NOWARN);
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 (INSTRING_WARN);
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 if (gfc_implicit_pure (NULL) && gfc_impure_variable (result->symtree->n.sym))
1319 gfc_current_ns->proc_name->attr.implicit_pure = 0;
1321 *v = result;
1322 return MATCH_YES;
1326 /* Match I/O tags that cause variables to become redefined. */
1328 static match
1329 match_out_tag (const io_tag *tag, gfc_expr **result)
1331 match m;
1333 m = match_vtag (tag, result);
1334 if (m == MATCH_YES)
1335 gfc_check_do_variable ((*result)->symtree);
1337 return m;
1341 /* Match a label I/O tag. */
1343 static match
1344 match_ltag (const io_tag *tag, gfc_st_label ** label)
1346 match m;
1347 gfc_st_label *old;
1349 old = *label;
1350 m = gfc_match (tag->spec);
1351 if (m != MATCH_YES)
1352 return m;
1354 m = gfc_match (tag->value, label);
1355 if (m != MATCH_YES)
1357 gfc_error ("Invalid value for %s specification at %C", tag->name);
1358 return MATCH_ERROR;
1361 if (old)
1363 gfc_error ("Duplicate %s label specification at %C", tag->name);
1364 return MATCH_ERROR;
1367 if (gfc_reference_st_label (*label, ST_LABEL_TARGET) == FAILURE)
1368 return MATCH_ERROR;
1370 return m;
1374 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1376 static gfc_try
1377 resolve_tag_format (const gfc_expr *e)
1379 if (e->expr_type == EXPR_CONSTANT
1380 && (e->ts.type != BT_CHARACTER
1381 || e->ts.kind != gfc_default_character_kind))
1383 gfc_error ("Constant expression in FORMAT tag at %L must be "
1384 "of type default CHARACTER", &e->where);
1385 return FAILURE;
1388 /* If e's rank is zero and e is not an element of an array, it should be
1389 of integer or character type. The integer variable should be
1390 ASSIGNED. */
1391 if (e->rank == 0
1392 && (e->expr_type != EXPR_VARIABLE
1393 || e->symtree == NULL
1394 || e->symtree->n.sym->as == NULL
1395 || e->symtree->n.sym->as->rank == 0))
1397 if ((e->ts.type != BT_CHARACTER
1398 || e->ts.kind != gfc_default_character_kind)
1399 && e->ts.type != BT_INTEGER)
1401 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1402 "or of INTEGER", &e->where);
1403 return FAILURE;
1405 else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
1407 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
1408 "variable in FORMAT tag at %L", &e->where)
1409 == FAILURE)
1410 return FAILURE;
1411 if (e->symtree->n.sym->attr.assign != 1)
1413 gfc_error ("Variable '%s' at %L has not been assigned a "
1414 "format label", e->symtree->n.sym->name, &e->where);
1415 return FAILURE;
1418 else if (e->ts.type == BT_INTEGER)
1420 gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
1421 "variable", gfc_basic_typename (e->ts.type), &e->where);
1422 return FAILURE;
1425 return SUCCESS;
1428 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1429 It may be assigned an Hollerith constant. */
1430 if (e->ts.type != BT_CHARACTER)
1432 if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
1433 "in FORMAT tag at %L", &e->where) == FAILURE)
1434 return FAILURE;
1436 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)
1438 gfc_error ("Non-character assumed shape array element in FORMAT"
1439 " tag at %L", &e->where);
1440 return FAILURE;
1443 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SIZE)
1445 gfc_error ("Non-character assumed size array element in FORMAT"
1446 " tag at %L", &e->where);
1447 return FAILURE;
1450 if (e->rank == 0 && e->symtree->n.sym->attr.pointer)
1452 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1453 &e->where);
1454 return FAILURE;
1458 return SUCCESS;
1462 /* Do expression resolution and type-checking on an expression tag. */
1464 static gfc_try
1465 resolve_tag (const io_tag *tag, gfc_expr *e)
1467 if (e == NULL)
1468 return SUCCESS;
1470 if (gfc_resolve_expr (e) == FAILURE)
1471 return FAILURE;
1473 if (tag == &tag_format)
1474 return resolve_tag_format (e);
1476 if (e->ts.type != tag->type)
1478 gfc_error ("%s tag at %L must be of type %s", tag->name,
1479 &e->where, gfc_basic_typename (tag->type));
1480 return FAILURE;
1483 if (e->ts.type == BT_CHARACTER && e->ts.kind != gfc_default_character_kind)
1485 gfc_error ("%s tag at %L must be a character string of default kind",
1486 tag->name, &e->where);
1487 return FAILURE;
1490 if (e->rank != 0)
1492 gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
1493 return FAILURE;
1496 if (tag == &tag_iomsg)
1498 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
1499 &e->where) == FAILURE)
1500 return FAILURE;
1503 if ((tag == &tag_iostat || tag == &tag_size || tag == &tag_iolength)
1504 && e->ts.kind != gfc_default_integer_kind)
1506 if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
1507 "INTEGER in %s tag at %L", tag->name, &e->where)
1508 == FAILURE)
1509 return FAILURE;
1512 if (tag == &tag_exist && e->ts.kind != gfc_default_logical_kind)
1514 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Nondefault LOGICAL "
1515 "in %s tag at %L", tag->name, &e->where)
1516 == FAILURE)
1517 return FAILURE;
1520 if (tag == &tag_newunit)
1522 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: NEWUNIT specifier"
1523 " at %L", &e->where) == FAILURE)
1524 return FAILURE;
1527 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1528 if (tag == &tag_newunit || tag == &tag_iostat
1529 || tag == &tag_size || tag == &tag_iomsg)
1531 char context[64];
1533 sprintf (context, _("%s tag"), tag->name);
1534 if (gfc_check_vardef_context (e, false, false, context) == FAILURE)
1535 return FAILURE;
1538 if (tag == &tag_convert)
1540 if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
1541 &e->where) == FAILURE)
1542 return FAILURE;
1545 return SUCCESS;
1549 /* Match a single tag of an OPEN statement. */
1551 static match
1552 match_open_element (gfc_open *open)
1554 match m;
1556 m = match_etag (&tag_e_async, &open->asynchronous);
1557 if (m != MATCH_NO)
1558 return m;
1559 m = match_etag (&tag_unit, &open->unit);
1560 if (m != MATCH_NO)
1561 return m;
1562 m = match_out_tag (&tag_iomsg, &open->iomsg);
1563 if (m != MATCH_NO)
1564 return m;
1565 m = match_out_tag (&tag_iostat, &open->iostat);
1566 if (m != MATCH_NO)
1567 return m;
1568 m = match_etag (&tag_file, &open->file);
1569 if (m != MATCH_NO)
1570 return m;
1571 m = match_etag (&tag_status, &open->status);
1572 if (m != MATCH_NO)
1573 return m;
1574 m = match_etag (&tag_e_access, &open->access);
1575 if (m != MATCH_NO)
1576 return m;
1577 m = match_etag (&tag_e_form, &open->form);
1578 if (m != MATCH_NO)
1579 return m;
1580 m = match_etag (&tag_e_recl, &open->recl);
1581 if (m != MATCH_NO)
1582 return m;
1583 m = match_etag (&tag_e_blank, &open->blank);
1584 if (m != MATCH_NO)
1585 return m;
1586 m = match_etag (&tag_e_position, &open->position);
1587 if (m != MATCH_NO)
1588 return m;
1589 m = match_etag (&tag_e_action, &open->action);
1590 if (m != MATCH_NO)
1591 return m;
1592 m = match_etag (&tag_e_delim, &open->delim);
1593 if (m != MATCH_NO)
1594 return m;
1595 m = match_etag (&tag_e_pad, &open->pad);
1596 if (m != MATCH_NO)
1597 return m;
1598 m = match_etag (&tag_e_decimal, &open->decimal);
1599 if (m != MATCH_NO)
1600 return m;
1601 m = match_etag (&tag_e_encoding, &open->encoding);
1602 if (m != MATCH_NO)
1603 return m;
1604 m = match_etag (&tag_e_round, &open->round);
1605 if (m != MATCH_NO)
1606 return m;
1607 m = match_etag (&tag_e_sign, &open->sign);
1608 if (m != MATCH_NO)
1609 return m;
1610 m = match_ltag (&tag_err, &open->err);
1611 if (m != MATCH_NO)
1612 return m;
1613 m = match_etag (&tag_convert, &open->convert);
1614 if (m != MATCH_NO)
1615 return m;
1616 m = match_out_tag (&tag_newunit, &open->newunit);
1617 if (m != MATCH_NO)
1618 return m;
1620 return MATCH_NO;
1624 /* Free the gfc_open structure and all the expressions it contains. */
1626 void
1627 gfc_free_open (gfc_open *open)
1629 if (open == NULL)
1630 return;
1632 gfc_free_expr (open->unit);
1633 gfc_free_expr (open->iomsg);
1634 gfc_free_expr (open->iostat);
1635 gfc_free_expr (open->file);
1636 gfc_free_expr (open->status);
1637 gfc_free_expr (open->access);
1638 gfc_free_expr (open->form);
1639 gfc_free_expr (open->recl);
1640 gfc_free_expr (open->blank);
1641 gfc_free_expr (open->position);
1642 gfc_free_expr (open->action);
1643 gfc_free_expr (open->delim);
1644 gfc_free_expr (open->pad);
1645 gfc_free_expr (open->decimal);
1646 gfc_free_expr (open->encoding);
1647 gfc_free_expr (open->round);
1648 gfc_free_expr (open->sign);
1649 gfc_free_expr (open->convert);
1650 gfc_free_expr (open->asynchronous);
1651 gfc_free_expr (open->newunit);
1652 free (open);
1656 /* Resolve everything in a gfc_open structure. */
1658 gfc_try
1659 gfc_resolve_open (gfc_open *open)
1662 RESOLVE_TAG (&tag_unit, open->unit);
1663 RESOLVE_TAG (&tag_iomsg, open->iomsg);
1664 RESOLVE_TAG (&tag_iostat, open->iostat);
1665 RESOLVE_TAG (&tag_file, open->file);
1666 RESOLVE_TAG (&tag_status, open->status);
1667 RESOLVE_TAG (&tag_e_access, open->access);
1668 RESOLVE_TAG (&tag_e_form, open->form);
1669 RESOLVE_TAG (&tag_e_recl, open->recl);
1670 RESOLVE_TAG (&tag_e_blank, open->blank);
1671 RESOLVE_TAG (&tag_e_position, open->position);
1672 RESOLVE_TAG (&tag_e_action, open->action);
1673 RESOLVE_TAG (&tag_e_delim, open->delim);
1674 RESOLVE_TAG (&tag_e_pad, open->pad);
1675 RESOLVE_TAG (&tag_e_decimal, open->decimal);
1676 RESOLVE_TAG (&tag_e_encoding, open->encoding);
1677 RESOLVE_TAG (&tag_e_async, open->asynchronous);
1678 RESOLVE_TAG (&tag_e_round, open->round);
1679 RESOLVE_TAG (&tag_e_sign, open->sign);
1680 RESOLVE_TAG (&tag_convert, open->convert);
1681 RESOLVE_TAG (&tag_newunit, open->newunit);
1683 if (gfc_reference_st_label (open->err, ST_LABEL_TARGET) == FAILURE)
1684 return FAILURE;
1686 return SUCCESS;
1690 /* Check if a given value for a SPECIFIER is either in the list of values
1691 allowed in F95 or F2003, issuing an error message and returning a zero
1692 value if it is not allowed. */
1694 static int
1695 compare_to_allowed_values (const char *specifier, const char *allowed[],
1696 const char *allowed_f2003[],
1697 const char *allowed_gnu[], gfc_char_t *value,
1698 const char *statement, bool warn)
1700 int i;
1701 unsigned int len;
1703 len = gfc_wide_strlen (value);
1704 if (len > 0)
1706 for (len--; len > 0; len--)
1707 if (value[len] != ' ')
1708 break;
1709 len++;
1712 for (i = 0; allowed[i]; i++)
1713 if (len == strlen (allowed[i])
1714 && gfc_wide_strncasecmp (value, allowed[i], strlen (allowed[i])) == 0)
1715 return 1;
1717 for (i = 0; allowed_f2003 && allowed_f2003[i]; i++)
1718 if (len == strlen (allowed_f2003[i])
1719 && gfc_wide_strncasecmp (value, allowed_f2003[i],
1720 strlen (allowed_f2003[i])) == 0)
1722 notification n = gfc_notification_std (GFC_STD_F2003);
1724 if (n == WARNING || (warn && n == ERROR))
1726 gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1727 "has value '%s'", specifier, statement,
1728 allowed_f2003[i]);
1729 return 1;
1731 else
1732 if (n == ERROR)
1734 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: %s specifier in "
1735 "%s statement at %C has value '%s'", specifier,
1736 statement, allowed_f2003[i]);
1737 return 0;
1740 /* n == SILENT */
1741 return 1;
1744 for (i = 0; allowed_gnu && allowed_gnu[i]; i++)
1745 if (len == strlen (allowed_gnu[i])
1746 && gfc_wide_strncasecmp (value, allowed_gnu[i],
1747 strlen (allowed_gnu[i])) == 0)
1749 notification n = gfc_notification_std (GFC_STD_GNU);
1751 if (n == WARNING || (warn && n == ERROR))
1753 gfc_warning ("Extension: %s specifier in %s statement at %C "
1754 "has value '%s'", specifier, statement,
1755 allowed_gnu[i]);
1756 return 1;
1758 else
1759 if (n == ERROR)
1761 gfc_notify_std (GFC_STD_GNU, "Extension: %s specifier in "
1762 "%s statement at %C has value '%s'", specifier,
1763 statement, allowed_gnu[i]);
1764 return 0;
1767 /* n == SILENT */
1768 return 1;
1771 if (warn)
1773 char *s = gfc_widechar_to_char (value, -1);
1774 gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1775 specifier, statement, s);
1776 free (s);
1777 return 1;
1779 else
1781 char *s = gfc_widechar_to_char (value, -1);
1782 gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1783 specifier, statement, s);
1784 free (s);
1785 return 0;
1790 /* Match an OPEN statement. */
1792 match
1793 gfc_match_open (void)
1795 gfc_open *open;
1796 match m;
1797 bool warn;
1799 m = gfc_match_char ('(');
1800 if (m == MATCH_NO)
1801 return m;
1803 open = XCNEW (gfc_open);
1805 m = match_open_element (open);
1807 if (m == MATCH_ERROR)
1808 goto cleanup;
1809 if (m == MATCH_NO)
1811 m = gfc_match_expr (&open->unit);
1812 if (m == MATCH_ERROR)
1813 goto cleanup;
1816 for (;;)
1818 if (gfc_match_char (')') == MATCH_YES)
1819 break;
1820 if (gfc_match_char (',') != MATCH_YES)
1821 goto syntax;
1823 m = match_open_element (open);
1824 if (m == MATCH_ERROR)
1825 goto cleanup;
1826 if (m == MATCH_NO)
1827 goto syntax;
1830 if (gfc_match_eos () == MATCH_NO)
1831 goto syntax;
1833 if (gfc_pure (NULL))
1835 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1836 goto cleanup;
1839 if (gfc_implicit_pure (NULL))
1840 gfc_current_ns->proc_name->attr.implicit_pure = 0;
1842 warn = (open->err || open->iostat) ? true : false;
1844 /* Checks on NEWUNIT specifier. */
1845 if (open->newunit)
1847 if (open->unit)
1849 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1850 goto cleanup;
1853 if (!(open->file || (open->status
1854 && gfc_wide_strncasecmp (open->status->value.character.string,
1855 "scratch", 7) == 0)))
1857 gfc_error ("NEWUNIT specifier must have FILE= "
1858 "or STATUS='scratch' at %C");
1859 goto cleanup;
1862 else if (!open->unit)
1864 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1865 goto cleanup;
1868 /* Checks on the ACCESS specifier. */
1869 if (open->access && open->access->expr_type == EXPR_CONSTANT)
1871 static const char *access_f95[] = { "SEQUENTIAL", "DIRECT", NULL };
1872 static const char *access_f2003[] = { "STREAM", NULL };
1873 static const char *access_gnu[] = { "APPEND", NULL };
1875 if (!compare_to_allowed_values ("ACCESS", access_f95, access_f2003,
1876 access_gnu,
1877 open->access->value.character.string,
1878 "OPEN", warn))
1879 goto cleanup;
1882 /* Checks on the ACTION specifier. */
1883 if (open->action && open->action->expr_type == EXPR_CONSTANT)
1885 static const char *action[] = { "READ", "WRITE", "READWRITE", NULL };
1887 if (!compare_to_allowed_values ("ACTION", action, NULL, NULL,
1888 open->action->value.character.string,
1889 "OPEN", warn))
1890 goto cleanup;
1893 /* Checks on the ASYNCHRONOUS specifier. */
1894 if (open->asynchronous)
1896 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ASYNCHRONOUS= at %C "
1897 "not allowed in Fortran 95") == FAILURE)
1898 goto cleanup;
1900 if (open->asynchronous->expr_type == EXPR_CONSTANT)
1902 static const char * asynchronous[] = { "YES", "NO", NULL };
1904 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous,
1905 NULL, NULL, open->asynchronous->value.character.string,
1906 "OPEN", warn))
1907 goto cleanup;
1911 /* Checks on the BLANK specifier. */
1912 if (open->blank)
1914 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
1915 "not allowed in Fortran 95") == FAILURE)
1916 goto cleanup;
1918 if (open->blank->expr_type == EXPR_CONSTANT)
1920 static const char *blank[] = { "ZERO", "NULL", NULL };
1922 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
1923 open->blank->value.character.string,
1924 "OPEN", warn))
1925 goto cleanup;
1929 /* Checks on the DECIMAL specifier. */
1930 if (open->decimal)
1932 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
1933 "not allowed in Fortran 95") == FAILURE)
1934 goto cleanup;
1936 if (open->decimal->expr_type == EXPR_CONSTANT)
1938 static const char * decimal[] = { "COMMA", "POINT", NULL };
1940 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
1941 open->decimal->value.character.string,
1942 "OPEN", warn))
1943 goto cleanup;
1947 /* Checks on the DELIM specifier. */
1948 if (open->delim)
1950 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
1951 "not allowed in Fortran 95") == FAILURE)
1952 goto cleanup;
1954 if (open->delim->expr_type == EXPR_CONSTANT)
1956 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
1958 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
1959 open->delim->value.character.string,
1960 "OPEN", warn))
1961 goto cleanup;
1965 /* Checks on the ENCODING specifier. */
1966 if (open->encoding)
1968 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENCODING= at %C "
1969 "not allowed in Fortran 95") == FAILURE)
1970 goto cleanup;
1972 if (open->encoding->expr_type == EXPR_CONSTANT)
1974 static const char * encoding[] = { "DEFAULT", "UTF-8", NULL };
1976 if (!compare_to_allowed_values ("ENCODING", encoding, NULL, NULL,
1977 open->encoding->value.character.string,
1978 "OPEN", warn))
1979 goto cleanup;
1983 /* Checks on the FORM specifier. */
1984 if (open->form && open->form->expr_type == EXPR_CONSTANT)
1986 static const char *form[] = { "FORMATTED", "UNFORMATTED", NULL };
1988 if (!compare_to_allowed_values ("FORM", form, NULL, NULL,
1989 open->form->value.character.string,
1990 "OPEN", warn))
1991 goto cleanup;
1994 /* Checks on the PAD specifier. */
1995 if (open->pad && open->pad->expr_type == EXPR_CONSTANT)
1997 static const char *pad[] = { "YES", "NO", NULL };
1999 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
2000 open->pad->value.character.string,
2001 "OPEN", warn))
2002 goto cleanup;
2005 /* Checks on the POSITION specifier. */
2006 if (open->position && open->position->expr_type == EXPR_CONSTANT)
2008 static const char *position[] = { "ASIS", "REWIND", "APPEND", NULL };
2010 if (!compare_to_allowed_values ("POSITION", position, NULL, NULL,
2011 open->position->value.character.string,
2012 "OPEN", warn))
2013 goto cleanup;
2016 /* Checks on the ROUND specifier. */
2017 if (open->round)
2019 if (gfc_notify_std (GFC_STD_F2003, "Fortran F2003: ROUND= at %C "
2020 "not allowed in Fortran 95") == FAILURE)
2021 goto cleanup;
2023 if (open->round->expr_type == EXPR_CONSTANT)
2025 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
2026 "COMPATIBLE", "PROCESSOR_DEFINED",
2027 NULL };
2029 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
2030 open->round->value.character.string,
2031 "OPEN", warn))
2032 goto cleanup;
2036 /* Checks on the SIGN specifier. */
2037 if (open->sign)
2039 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
2040 "not allowed in Fortran 95") == FAILURE)
2041 goto cleanup;
2043 if (open->sign->expr_type == EXPR_CONSTANT)
2045 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2046 NULL };
2048 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
2049 open->sign->value.character.string,
2050 "OPEN", warn))
2051 goto cleanup;
2055 #define warn_or_error(...) \
2057 if (warn) \
2058 gfc_warning (__VA_ARGS__); \
2059 else \
2061 gfc_error (__VA_ARGS__); \
2062 goto cleanup; \
2066 /* Checks on the RECL specifier. */
2067 if (open->recl && open->recl->expr_type == EXPR_CONSTANT
2068 && open->recl->ts.type == BT_INTEGER
2069 && mpz_sgn (open->recl->value.integer) != 1)
2071 warn_or_error ("RECL in OPEN statement at %C must be positive");
2074 /* Checks on the STATUS specifier. */
2075 if (open->status && open->status->expr_type == EXPR_CONSTANT)
2077 static const char *status[] = { "OLD", "NEW", "SCRATCH",
2078 "REPLACE", "UNKNOWN", NULL };
2080 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2081 open->status->value.character.string,
2082 "OPEN", warn))
2083 goto cleanup;
2085 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2086 the FILE= specifier shall appear. */
2087 if (open->file == NULL
2088 && (gfc_wide_strncasecmp (open->status->value.character.string,
2089 "replace", 7) == 0
2090 || gfc_wide_strncasecmp (open->status->value.character.string,
2091 "new", 3) == 0))
2093 char *s = gfc_widechar_to_char (open->status->value.character.string,
2094 -1);
2095 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2096 "'%s' and no FILE specifier is present", s);
2097 free (s);
2100 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2101 the FILE= specifier shall not appear. */
2102 if (gfc_wide_strncasecmp (open->status->value.character.string,
2103 "scratch", 7) == 0 && open->file)
2105 warn_or_error ("The STATUS specified in OPEN statement at %C "
2106 "cannot have the value SCRATCH if a FILE specifier "
2107 "is present");
2111 /* Things that are not allowed for unformatted I/O. */
2112 if (open->form && open->form->expr_type == EXPR_CONSTANT
2113 && (open->delim || open->decimal || open->encoding || open->round
2114 || open->sign || open->pad || open->blank)
2115 && gfc_wide_strncasecmp (open->form->value.character.string,
2116 "unformatted", 11) == 0)
2118 const char *spec = (open->delim ? "DELIM "
2119 : (open->pad ? "PAD " : open->blank
2120 ? "BLANK " : ""));
2122 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2123 "unformatted I/O", spec);
2126 if (open->recl && open->access && open->access->expr_type == EXPR_CONSTANT
2127 && gfc_wide_strncasecmp (open->access->value.character.string,
2128 "stream", 6) == 0)
2130 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2131 "stream I/O");
2134 if (open->position
2135 && open->access && open->access->expr_type == EXPR_CONSTANT
2136 && !(gfc_wide_strncasecmp (open->access->value.character.string,
2137 "sequential", 10) == 0
2138 || gfc_wide_strncasecmp (open->access->value.character.string,
2139 "stream", 6) == 0
2140 || gfc_wide_strncasecmp (open->access->value.character.string,
2141 "append", 6) == 0))
2143 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2144 "for stream or sequential ACCESS");
2147 #undef warn_or_error
2149 new_st.op = EXEC_OPEN;
2150 new_st.ext.open = open;
2151 return MATCH_YES;
2153 syntax:
2154 gfc_syntax_error (ST_OPEN);
2156 cleanup:
2157 gfc_free_open (open);
2158 return MATCH_ERROR;
2162 /* Free a gfc_close structure an all its expressions. */
2164 void
2165 gfc_free_close (gfc_close *close)
2167 if (close == NULL)
2168 return;
2170 gfc_free_expr (close->unit);
2171 gfc_free_expr (close->iomsg);
2172 gfc_free_expr (close->iostat);
2173 gfc_free_expr (close->status);
2174 free (close);
2178 /* Match elements of a CLOSE statement. */
2180 static match
2181 match_close_element (gfc_close *close)
2183 match m;
2185 m = match_etag (&tag_unit, &close->unit);
2186 if (m != MATCH_NO)
2187 return m;
2188 m = match_etag (&tag_status, &close->status);
2189 if (m != MATCH_NO)
2190 return m;
2191 m = match_out_tag (&tag_iomsg, &close->iomsg);
2192 if (m != MATCH_NO)
2193 return m;
2194 m = match_out_tag (&tag_iostat, &close->iostat);
2195 if (m != MATCH_NO)
2196 return m;
2197 m = match_ltag (&tag_err, &close->err);
2198 if (m != MATCH_NO)
2199 return m;
2201 return MATCH_NO;
2205 /* Match a CLOSE statement. */
2207 match
2208 gfc_match_close (void)
2210 gfc_close *close;
2211 match m;
2212 bool warn;
2214 m = gfc_match_char ('(');
2215 if (m == MATCH_NO)
2216 return m;
2218 close = XCNEW (gfc_close);
2220 m = match_close_element (close);
2222 if (m == MATCH_ERROR)
2223 goto cleanup;
2224 if (m == MATCH_NO)
2226 m = gfc_match_expr (&close->unit);
2227 if (m == MATCH_NO)
2228 goto syntax;
2229 if (m == MATCH_ERROR)
2230 goto cleanup;
2233 for (;;)
2235 if (gfc_match_char (')') == MATCH_YES)
2236 break;
2237 if (gfc_match_char (',') != MATCH_YES)
2238 goto syntax;
2240 m = match_close_element (close);
2241 if (m == MATCH_ERROR)
2242 goto cleanup;
2243 if (m == MATCH_NO)
2244 goto syntax;
2247 if (gfc_match_eos () == MATCH_NO)
2248 goto syntax;
2250 if (gfc_pure (NULL))
2252 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2253 goto cleanup;
2256 if (gfc_implicit_pure (NULL))
2257 gfc_current_ns->proc_name->attr.implicit_pure = 0;
2259 warn = (close->iostat || close->err) ? true : false;
2261 /* Checks on the STATUS specifier. */
2262 if (close->status && close->status->expr_type == EXPR_CONSTANT)
2264 static const char *status[] = { "KEEP", "DELETE", NULL };
2266 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2267 close->status->value.character.string,
2268 "CLOSE", warn))
2269 goto cleanup;
2272 new_st.op = EXEC_CLOSE;
2273 new_st.ext.close = close;
2274 return MATCH_YES;
2276 syntax:
2277 gfc_syntax_error (ST_CLOSE);
2279 cleanup:
2280 gfc_free_close (close);
2281 return MATCH_ERROR;
2285 /* Resolve everything in a gfc_close structure. */
2287 gfc_try
2288 gfc_resolve_close (gfc_close *close)
2290 RESOLVE_TAG (&tag_unit, close->unit);
2291 RESOLVE_TAG (&tag_iomsg, close->iomsg);
2292 RESOLVE_TAG (&tag_iostat, close->iostat);
2293 RESOLVE_TAG (&tag_status, close->status);
2295 if (gfc_reference_st_label (close->err, ST_LABEL_TARGET) == FAILURE)
2296 return FAILURE;
2298 if (close->unit == NULL)
2300 /* Find a locus from one of the arguments to close, when UNIT is
2301 not specified. */
2302 locus loc = gfc_current_locus;
2303 if (close->status)
2304 loc = close->status->where;
2305 else if (close->iostat)
2306 loc = close->iostat->where;
2307 else if (close->iomsg)
2308 loc = close->iomsg->where;
2309 else if (close->err)
2310 loc = close->err->where;
2312 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc);
2313 return FAILURE;
2316 if (close->unit->expr_type == EXPR_CONSTANT
2317 && close->unit->ts.type == BT_INTEGER
2318 && mpz_sgn (close->unit->value.integer) < 0)
2320 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2321 &close->unit->where);
2324 return SUCCESS;
2328 /* Free a gfc_filepos structure. */
2330 void
2331 gfc_free_filepos (gfc_filepos *fp)
2333 gfc_free_expr (fp->unit);
2334 gfc_free_expr (fp->iomsg);
2335 gfc_free_expr (fp->iostat);
2336 free (fp);
2340 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2342 static match
2343 match_file_element (gfc_filepos *fp)
2345 match m;
2347 m = match_etag (&tag_unit, &fp->unit);
2348 if (m != MATCH_NO)
2349 return m;
2350 m = match_out_tag (&tag_iomsg, &fp->iomsg);
2351 if (m != MATCH_NO)
2352 return m;
2353 m = match_out_tag (&tag_iostat, &fp->iostat);
2354 if (m != MATCH_NO)
2355 return m;
2356 m = match_ltag (&tag_err, &fp->err);
2357 if (m != MATCH_NO)
2358 return m;
2360 return MATCH_NO;
2364 /* Match the second half of the file-positioning statements, REWIND,
2365 BACKSPACE, ENDFILE, or the FLUSH statement. */
2367 static match
2368 match_filepos (gfc_statement st, gfc_exec_op op)
2370 gfc_filepos *fp;
2371 match m;
2373 fp = XCNEW (gfc_filepos);
2375 if (gfc_match_char ('(') == MATCH_NO)
2377 m = gfc_match_expr (&fp->unit);
2378 if (m == MATCH_ERROR)
2379 goto cleanup;
2380 if (m == MATCH_NO)
2381 goto syntax;
2383 goto done;
2386 m = match_file_element (fp);
2387 if (m == MATCH_ERROR)
2388 goto done;
2389 if (m == MATCH_NO)
2391 m = gfc_match_expr (&fp->unit);
2392 if (m == MATCH_ERROR)
2393 goto done;
2394 if (m == MATCH_NO)
2395 goto syntax;
2398 for (;;)
2400 if (gfc_match_char (')') == MATCH_YES)
2401 break;
2402 if (gfc_match_char (',') != MATCH_YES)
2403 goto syntax;
2405 m = match_file_element (fp);
2406 if (m == MATCH_ERROR)
2407 goto cleanup;
2408 if (m == MATCH_NO)
2409 goto syntax;
2412 done:
2413 if (gfc_match_eos () != MATCH_YES)
2414 goto syntax;
2416 if (gfc_pure (NULL))
2418 gfc_error ("%s statement not allowed in PURE procedure at %C",
2419 gfc_ascii_statement (st));
2421 goto cleanup;
2424 if (gfc_implicit_pure (NULL))
2425 gfc_current_ns->proc_name->attr.implicit_pure = 0;
2427 new_st.op = op;
2428 new_st.ext.filepos = fp;
2429 return MATCH_YES;
2431 syntax:
2432 gfc_syntax_error (st);
2434 cleanup:
2435 gfc_free_filepos (fp);
2436 return MATCH_ERROR;
2440 gfc_try
2441 gfc_resolve_filepos (gfc_filepos *fp)
2443 RESOLVE_TAG (&tag_unit, fp->unit);
2444 RESOLVE_TAG (&tag_iostat, fp->iostat);
2445 RESOLVE_TAG (&tag_iomsg, fp->iomsg);
2446 if (gfc_reference_st_label (fp->err, ST_LABEL_TARGET) == FAILURE)
2447 return FAILURE;
2449 if (fp->unit->expr_type == EXPR_CONSTANT
2450 && fp->unit->ts.type == BT_INTEGER
2451 && mpz_sgn (fp->unit->value.integer) < 0)
2453 gfc_error ("UNIT number in statement at %L must be non-negative",
2454 &fp->unit->where);
2457 return SUCCESS;
2461 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2462 and the FLUSH statement. */
2464 match
2465 gfc_match_endfile (void)
2467 return match_filepos (ST_END_FILE, EXEC_ENDFILE);
2470 match
2471 gfc_match_backspace (void)
2473 return match_filepos (ST_BACKSPACE, EXEC_BACKSPACE);
2476 match
2477 gfc_match_rewind (void)
2479 return match_filepos (ST_REWIND, EXEC_REWIND);
2482 match
2483 gfc_match_flush (void)
2485 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C")
2486 == FAILURE)
2487 return MATCH_ERROR;
2489 return match_filepos (ST_FLUSH, EXEC_FLUSH);
2492 /******************** Data Transfer Statements *********************/
2494 /* Return a default unit number. */
2496 static gfc_expr *
2497 default_unit (io_kind k)
2499 int unit;
2501 if (k == M_READ)
2502 unit = 5;
2503 else
2504 unit = 6;
2506 return gfc_get_int_expr (gfc_default_integer_kind, NULL, unit);
2510 /* Match a unit specification for a data transfer statement. */
2512 static match
2513 match_dt_unit (io_kind k, gfc_dt *dt)
2515 gfc_expr *e;
2517 if (gfc_match_char ('*') == MATCH_YES)
2519 if (dt->io_unit != NULL)
2520 goto conflict;
2522 dt->io_unit = default_unit (k);
2523 return MATCH_YES;
2526 if (gfc_match_expr (&e) == MATCH_YES)
2528 if (dt->io_unit != NULL)
2530 gfc_free_expr (e);
2531 goto conflict;
2534 dt->io_unit = e;
2535 return MATCH_YES;
2538 return MATCH_NO;
2540 conflict:
2541 gfc_error ("Duplicate UNIT specification at %C");
2542 return MATCH_ERROR;
2546 /* Match a format specification. */
2548 static match
2549 match_dt_format (gfc_dt *dt)
2551 locus where;
2552 gfc_expr *e;
2553 gfc_st_label *label;
2554 match m;
2556 where = gfc_current_locus;
2558 if (gfc_match_char ('*') == MATCH_YES)
2560 if (dt->format_expr != NULL || dt->format_label != NULL)
2561 goto conflict;
2563 dt->format_label = &format_asterisk;
2564 return MATCH_YES;
2567 if ((m = gfc_match_st_label (&label)) == MATCH_YES)
2569 char c;
2571 /* Need to check if the format label is actually either an operand
2572 to a user-defined operator or is a kind type parameter. That is,
2573 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2574 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2576 gfc_gobble_whitespace ();
2577 c = gfc_peek_ascii_char ();
2578 if (c == '.' || c == '_')
2579 gfc_current_locus = where;
2580 else
2582 if (dt->format_expr != NULL || dt->format_label != NULL)
2584 gfc_free_st_label (label);
2585 goto conflict;
2588 if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE)
2589 return MATCH_ERROR;
2591 dt->format_label = label;
2592 return MATCH_YES;
2595 else if (m == MATCH_ERROR)
2596 /* The label was zero or too large. Emit the correct diagnosis. */
2597 return MATCH_ERROR;
2599 if (gfc_match_expr (&e) == MATCH_YES)
2601 if (dt->format_expr != NULL || dt->format_label != NULL)
2603 gfc_free_expr (e);
2604 goto conflict;
2606 dt->format_expr = e;
2607 return MATCH_YES;
2610 gfc_current_locus = where; /* The only case where we have to restore */
2612 return MATCH_NO;
2614 conflict:
2615 gfc_error ("Duplicate format specification at %C");
2616 return MATCH_ERROR;
2620 /* Traverse a namelist that is part of a READ statement to make sure
2621 that none of the variables in the namelist are INTENT(IN). Returns
2622 nonzero if we find such a variable. */
2624 static int
2625 check_namelist (gfc_symbol *sym)
2627 gfc_namelist *p;
2629 for (p = sym->namelist; p; p = p->next)
2630 if (p->sym->attr.intent == INTENT_IN)
2632 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2633 p->sym->name, sym->name);
2634 return 1;
2637 return 0;
2641 /* Match a single data transfer element. */
2643 static match
2644 match_dt_element (io_kind k, gfc_dt *dt)
2646 char name[GFC_MAX_SYMBOL_LEN + 1];
2647 gfc_symbol *sym;
2648 match m;
2650 if (gfc_match (" unit =") == MATCH_YES)
2652 m = match_dt_unit (k, dt);
2653 if (m != MATCH_NO)
2654 return m;
2657 if (gfc_match (" fmt =") == MATCH_YES)
2659 m = match_dt_format (dt);
2660 if (m != MATCH_NO)
2661 return m;
2664 if (gfc_match (" nml = %n", name) == MATCH_YES)
2666 if (dt->namelist != NULL)
2668 gfc_error ("Duplicate NML specification at %C");
2669 return MATCH_ERROR;
2672 if (gfc_find_symbol (name, NULL, 1, &sym))
2673 return MATCH_ERROR;
2675 if (sym == NULL || sym->attr.flavor != FL_NAMELIST)
2677 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2678 sym != NULL ? sym->name : name);
2679 return MATCH_ERROR;
2682 dt->namelist = sym;
2683 if (k == M_READ && check_namelist (sym))
2684 return MATCH_ERROR;
2686 return MATCH_YES;
2689 m = match_etag (&tag_e_async, &dt->asynchronous);
2690 if (m != MATCH_NO)
2691 return m;
2692 m = match_etag (&tag_e_blank, &dt->blank);
2693 if (m != MATCH_NO)
2694 return m;
2695 m = match_etag (&tag_e_delim, &dt->delim);
2696 if (m != MATCH_NO)
2697 return m;
2698 m = match_etag (&tag_e_pad, &dt->pad);
2699 if (m != MATCH_NO)
2700 return m;
2701 m = match_etag (&tag_e_sign, &dt->sign);
2702 if (m != MATCH_NO)
2703 return m;
2704 m = match_etag (&tag_e_round, &dt->round);
2705 if (m != MATCH_NO)
2706 return m;
2707 m = match_out_tag (&tag_id, &dt->id);
2708 if (m != MATCH_NO)
2709 return m;
2710 m = match_etag (&tag_e_decimal, &dt->decimal);
2711 if (m != MATCH_NO)
2712 return m;
2713 m = match_etag (&tag_rec, &dt->rec);
2714 if (m != MATCH_NO)
2715 return m;
2716 m = match_etag (&tag_spos, &dt->pos);
2717 if (m != MATCH_NO)
2718 return m;
2719 m = match_out_tag (&tag_iomsg, &dt->iomsg);
2720 if (m != MATCH_NO)
2721 return m;
2722 m = match_out_tag (&tag_iostat, &dt->iostat);
2723 if (m != MATCH_NO)
2724 return m;
2725 m = match_ltag (&tag_err, &dt->err);
2726 if (m == MATCH_YES)
2727 dt->err_where = gfc_current_locus;
2728 if (m != MATCH_NO)
2729 return m;
2730 m = match_etag (&tag_advance, &dt->advance);
2731 if (m != MATCH_NO)
2732 return m;
2733 m = match_out_tag (&tag_size, &dt->size);
2734 if (m != MATCH_NO)
2735 return m;
2737 m = match_ltag (&tag_end, &dt->end);
2738 if (m == MATCH_YES)
2740 if (k == M_WRITE)
2742 gfc_error ("END tag at %C not allowed in output statement");
2743 return MATCH_ERROR;
2745 dt->end_where = gfc_current_locus;
2747 if (m != MATCH_NO)
2748 return m;
2750 m = match_ltag (&tag_eor, &dt->eor);
2751 if (m == MATCH_YES)
2752 dt->eor_where = gfc_current_locus;
2753 if (m != MATCH_NO)
2754 return m;
2756 return MATCH_NO;
2760 /* Free a data transfer structure and everything below it. */
2762 void
2763 gfc_free_dt (gfc_dt *dt)
2765 if (dt == NULL)
2766 return;
2768 gfc_free_expr (dt->io_unit);
2769 gfc_free_expr (dt->format_expr);
2770 gfc_free_expr (dt->rec);
2771 gfc_free_expr (dt->advance);
2772 gfc_free_expr (dt->iomsg);
2773 gfc_free_expr (dt->iostat);
2774 gfc_free_expr (dt->size);
2775 gfc_free_expr (dt->pad);
2776 gfc_free_expr (dt->delim);
2777 gfc_free_expr (dt->sign);
2778 gfc_free_expr (dt->round);
2779 gfc_free_expr (dt->blank);
2780 gfc_free_expr (dt->decimal);
2781 gfc_free_expr (dt->pos);
2782 gfc_free_expr (dt->dt_io_kind);
2783 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2784 free (dt);
2788 /* Resolve everything in a gfc_dt structure. */
2790 gfc_try
2791 gfc_resolve_dt (gfc_dt *dt, locus *loc)
2793 gfc_expr *e;
2794 io_kind k;
2796 /* This is set in any case. */
2797 gcc_assert (dt->dt_io_kind);
2798 k = dt->dt_io_kind->value.iokind;
2800 RESOLVE_TAG (&tag_format, dt->format_expr);
2801 RESOLVE_TAG (&tag_rec, dt->rec);
2802 RESOLVE_TAG (&tag_spos, dt->pos);
2803 RESOLVE_TAG (&tag_advance, dt->advance);
2804 RESOLVE_TAG (&tag_id, dt->id);
2805 RESOLVE_TAG (&tag_iomsg, dt->iomsg);
2806 RESOLVE_TAG (&tag_iostat, dt->iostat);
2807 RESOLVE_TAG (&tag_size, dt->size);
2808 RESOLVE_TAG (&tag_e_pad, dt->pad);
2809 RESOLVE_TAG (&tag_e_delim, dt->delim);
2810 RESOLVE_TAG (&tag_e_sign, dt->sign);
2811 RESOLVE_TAG (&tag_e_round, dt->round);
2812 RESOLVE_TAG (&tag_e_blank, dt->blank);
2813 RESOLVE_TAG (&tag_e_decimal, dt->decimal);
2814 RESOLVE_TAG (&tag_e_async, dt->asynchronous);
2816 e = dt->io_unit;
2817 if (e == NULL)
2819 gfc_error ("UNIT not specified at %L", loc);
2820 return FAILURE;
2823 if (gfc_resolve_expr (e) == SUCCESS
2824 && (e->ts.type != BT_INTEGER
2825 && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE)))
2827 /* If there is no extra comma signifying the "format" form of the IO
2828 statement, then this must be an error. */
2829 if (!dt->extra_comma)
2831 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2832 "or a CHARACTER variable", &e->where);
2833 return FAILURE;
2835 else
2837 /* At this point, we have an extra comma. If io_unit has arrived as
2838 type character, we assume its really the "format" form of the I/O
2839 statement. We set the io_unit to the default unit and format to
2840 the character expression. See F95 Standard section 9.4. */
2841 if (e->ts.type == BT_CHARACTER && (k == M_READ || k == M_PRINT))
2843 dt->format_expr = dt->io_unit;
2844 dt->io_unit = default_unit (k);
2846 /* Nullify this pointer now so that a warning/error is not
2847 triggered below for the "Extension". */
2848 dt->extra_comma = NULL;
2851 if (k == M_WRITE)
2853 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2854 &dt->extra_comma->where);
2855 return FAILURE;
2860 if (e->ts.type == BT_CHARACTER)
2862 if (gfc_has_vector_index (e))
2864 gfc_error ("Internal unit with vector subscript at %L", &e->where);
2865 return FAILURE;
2868 /* If we are writing, make sure the internal unit can be changed. */
2869 gcc_assert (k != M_PRINT);
2870 if (k == M_WRITE
2871 && gfc_check_vardef_context (e, false, false,
2872 _("internal unit in WRITE")) == FAILURE)
2873 return FAILURE;
2876 if (e->rank && e->ts.type != BT_CHARACTER)
2878 gfc_error ("External IO UNIT cannot be an array at %L", &e->where);
2879 return FAILURE;
2882 if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_INTEGER
2883 && mpz_sgn (e->value.integer) < 0)
2885 gfc_error ("UNIT number in statement at %L must be non-negative",
2886 &e->where);
2887 return FAILURE;
2890 /* If we are reading and have a namelist, check that all namelist symbols
2891 can appear in a variable definition context. */
2892 if (k == M_READ && dt->namelist)
2894 gfc_namelist* n;
2895 for (n = dt->namelist->namelist; n; n = n->next)
2897 gfc_expr* e;
2898 gfc_try t;
2900 e = gfc_get_variable_expr (gfc_find_sym_in_symtree (n->sym));
2901 t = gfc_check_vardef_context (e, false, false, NULL);
2902 gfc_free_expr (e);
2904 if (t == FAILURE)
2906 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2907 " the symbol '%s' which may not appear in a"
2908 " variable definition context",
2909 dt->namelist->name, loc, n->sym->name);
2910 return FAILURE;
2915 if (dt->extra_comma
2916 && gfc_notify_std (GFC_STD_GNU, "Extension: Comma before i/o "
2917 "item list at %L", &dt->extra_comma->where) == FAILURE)
2918 return FAILURE;
2920 if (dt->err)
2922 if (gfc_reference_st_label (dt->err, ST_LABEL_TARGET) == FAILURE)
2923 return FAILURE;
2924 if (dt->err->defined == ST_LABEL_UNKNOWN)
2926 gfc_error ("ERR tag label %d at %L not defined",
2927 dt->err->value, &dt->err_where);
2928 return FAILURE;
2932 if (dt->end)
2934 if (gfc_reference_st_label (dt->end, ST_LABEL_TARGET) == FAILURE)
2935 return FAILURE;
2936 if (dt->end->defined == ST_LABEL_UNKNOWN)
2938 gfc_error ("END tag label %d at %L not defined",
2939 dt->end->value, &dt->end_where);
2940 return FAILURE;
2944 if (dt->eor)
2946 if (gfc_reference_st_label (dt->eor, ST_LABEL_TARGET) == FAILURE)
2947 return FAILURE;
2948 if (dt->eor->defined == ST_LABEL_UNKNOWN)
2950 gfc_error ("EOR tag label %d at %L not defined",
2951 dt->eor->value, &dt->eor_where);
2952 return FAILURE;
2956 /* Check the format label actually exists. */
2957 if (dt->format_label && dt->format_label != &format_asterisk
2958 && dt->format_label->defined == ST_LABEL_UNKNOWN)
2960 gfc_error ("FORMAT label %d at %L not defined", dt->format_label->value,
2961 &dt->format_label->where);
2962 return FAILURE;
2965 return SUCCESS;
2969 /* Given an io_kind, return its name. */
2971 static const char *
2972 io_kind_name (io_kind k)
2974 const char *name;
2976 switch (k)
2978 case M_READ:
2979 name = "READ";
2980 break;
2981 case M_WRITE:
2982 name = "WRITE";
2983 break;
2984 case M_PRINT:
2985 name = "PRINT";
2986 break;
2987 case M_INQUIRE:
2988 name = "INQUIRE";
2989 break;
2990 default:
2991 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2994 return name;
2998 /* Match an IO iteration statement of the form:
3000 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
3002 which is equivalent to a single IO element. This function is
3003 mutually recursive with match_io_element(). */
3005 static match match_io_element (io_kind, gfc_code **);
3007 static match
3008 match_io_iterator (io_kind k, gfc_code **result)
3010 gfc_code *head, *tail, *new_code;
3011 gfc_iterator *iter;
3012 locus old_loc;
3013 match m;
3014 int n;
3016 iter = NULL;
3017 head = NULL;
3018 old_loc = gfc_current_locus;
3020 if (gfc_match_char ('(') != MATCH_YES)
3021 return MATCH_NO;
3023 m = match_io_element (k, &head);
3024 tail = head;
3026 if (m != MATCH_YES || gfc_match_char (',') != MATCH_YES)
3028 m = MATCH_NO;
3029 goto cleanup;
3032 /* Can't be anything but an IO iterator. Build a list. */
3033 iter = gfc_get_iterator ();
3035 for (n = 1;; n++)
3037 m = gfc_match_iterator (iter, 0);
3038 if (m == MATCH_ERROR)
3039 goto cleanup;
3040 if (m == MATCH_YES)
3042 gfc_check_do_variable (iter->var->symtree);
3043 break;
3046 m = match_io_element (k, &new_code);
3047 if (m == MATCH_ERROR)
3048 goto cleanup;
3049 if (m == MATCH_NO)
3051 if (n > 2)
3052 goto syntax;
3053 goto cleanup;
3056 tail = gfc_append_code (tail, new_code);
3058 if (gfc_match_char (',') != MATCH_YES)
3060 if (n > 2)
3061 goto syntax;
3062 m = MATCH_NO;
3063 goto cleanup;
3067 if (gfc_match_char (')') != MATCH_YES)
3068 goto syntax;
3070 new_code = gfc_get_code ();
3071 new_code->op = EXEC_DO;
3072 new_code->ext.iterator = iter;
3074 new_code->block = gfc_get_code ();
3075 new_code->block->op = EXEC_DO;
3076 new_code->block->next = head;
3078 *result = new_code;
3079 return MATCH_YES;
3081 syntax:
3082 gfc_error ("Syntax error in I/O iterator at %C");
3083 m = MATCH_ERROR;
3085 cleanup:
3086 gfc_free_iterator (iter, 1);
3087 gfc_free_statements (head);
3088 gfc_current_locus = old_loc;
3089 return m;
3093 /* Match a single element of an IO list, which is either a single
3094 expression or an IO Iterator. */
3096 static match
3097 match_io_element (io_kind k, gfc_code **cpp)
3099 gfc_expr *expr;
3100 gfc_code *cp;
3101 match m;
3103 expr = NULL;
3105 m = match_io_iterator (k, cpp);
3106 if (m == MATCH_YES)
3107 return MATCH_YES;
3109 if (k == M_READ)
3111 m = gfc_match_variable (&expr, 0);
3112 if (m == MATCH_NO)
3113 gfc_error ("Expected variable in READ statement at %C");
3115 else
3117 m = gfc_match_expr (&expr);
3118 if (m == MATCH_NO)
3119 gfc_error ("Expected expression in %s statement at %C",
3120 io_kind_name (k));
3123 if (m == MATCH_YES && k == M_READ && gfc_check_do_variable (expr->symtree))
3124 m = MATCH_ERROR;
3126 if (m != MATCH_YES)
3128 gfc_free_expr (expr);
3129 return MATCH_ERROR;
3132 cp = gfc_get_code ();
3133 cp->op = EXEC_TRANSFER;
3134 cp->expr1 = expr;
3135 if (k != M_INQUIRE)
3136 cp->ext.dt = current_dt;
3138 *cpp = cp;
3139 return MATCH_YES;
3143 /* Match an I/O list, building gfc_code structures as we go. */
3145 static match
3146 match_io_list (io_kind k, gfc_code **head_p)
3148 gfc_code *head, *tail, *new_code;
3149 match m;
3151 *head_p = head = tail = NULL;
3152 if (gfc_match_eos () == MATCH_YES)
3153 return MATCH_YES;
3155 for (;;)
3157 m = match_io_element (k, &new_code);
3158 if (m == MATCH_ERROR)
3159 goto cleanup;
3160 if (m == MATCH_NO)
3161 goto syntax;
3163 tail = gfc_append_code (tail, new_code);
3164 if (head == NULL)
3165 head = new_code;
3167 if (gfc_match_eos () == MATCH_YES)
3168 break;
3169 if (gfc_match_char (',') != MATCH_YES)
3170 goto syntax;
3173 *head_p = head;
3174 return MATCH_YES;
3176 syntax:
3177 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3179 cleanup:
3180 gfc_free_statements (head);
3181 return MATCH_ERROR;
3185 /* Attach the data transfer end node. */
3187 static void
3188 terminate_io (gfc_code *io_code)
3190 gfc_code *c;
3192 if (io_code == NULL)
3193 io_code = new_st.block;
3195 c = gfc_get_code ();
3196 c->op = EXEC_DT_END;
3198 /* Point to structure that is already there */
3199 c->ext.dt = new_st.ext.dt;
3200 gfc_append_code (io_code, c);
3204 /* Check the constraints for a data transfer statement. The majority of the
3205 constraints appearing in 9.4 of the standard appear here. Some are handled
3206 in resolve_tag and others in gfc_resolve_dt. */
3208 static match
3209 check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code,
3210 locus *spec_end)
3212 #define io_constraint(condition,msg,arg)\
3213 if (condition) \
3215 gfc_error(msg,arg);\
3216 m = MATCH_ERROR;\
3219 match m;
3220 gfc_expr *expr;
3221 gfc_symbol *sym = NULL;
3222 bool warn, unformatted;
3224 warn = (dt->err || dt->iostat) ? true : false;
3225 unformatted = dt->format_expr == NULL && dt->format_label == NULL
3226 && dt->namelist == NULL;
3228 m = MATCH_YES;
3230 expr = dt->io_unit;
3231 if (expr && expr->expr_type == EXPR_VARIABLE
3232 && expr->ts.type == BT_CHARACTER)
3234 sym = expr->symtree->n.sym;
3236 io_constraint (k == M_WRITE && sym->attr.intent == INTENT_IN,
3237 "Internal file at %L must not be INTENT(IN)",
3238 &expr->where);
3240 io_constraint (gfc_has_vector_index (dt->io_unit),
3241 "Internal file incompatible with vector subscript at %L",
3242 &expr->where);
3244 io_constraint (dt->rec != NULL,
3245 "REC tag at %L is incompatible with internal file",
3246 &dt->rec->where);
3248 io_constraint (dt->pos != NULL,
3249 "POS tag at %L is incompatible with internal file",
3250 &dt->pos->where);
3252 io_constraint (unformatted,
3253 "Unformatted I/O not allowed with internal unit at %L",
3254 &dt->io_unit->where);
3256 io_constraint (dt->asynchronous != NULL,
3257 "ASYNCHRONOUS tag at %L not allowed with internal file",
3258 &dt->asynchronous->where);
3260 if (dt->namelist != NULL)
3262 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Internal file "
3263 "at %L with namelist", &expr->where)
3264 == FAILURE)
3265 m = MATCH_ERROR;
3268 io_constraint (dt->advance != NULL,
3269 "ADVANCE tag at %L is incompatible with internal file",
3270 &dt->advance->where);
3273 if (expr && expr->ts.type != BT_CHARACTER)
3276 io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE),
3277 "IO UNIT in %s statement at %C must be "
3278 "an internal file in a PURE procedure",
3279 io_kind_name (k));
3281 if (gfc_implicit_pure (NULL) && (k == M_READ || k == M_WRITE))
3282 gfc_current_ns->proc_name->attr.implicit_pure = 0;
3286 if (k != M_READ)
3288 io_constraint (dt->end, "END tag not allowed with output at %L",
3289 &dt->end_where);
3291 io_constraint (dt->eor, "EOR tag not allowed with output at %L",
3292 &dt->eor_where);
3294 io_constraint (dt->blank, "BLANK= specifier not allowed with output at %L",
3295 &dt->blank->where);
3297 io_constraint (dt->pad, "PAD= specifier not allowed with output at %L",
3298 &dt->pad->where);
3300 io_constraint (dt->size, "SIZE= specifier not allowed with output at %L",
3301 &dt->size->where);
3303 else
3305 io_constraint (dt->size && dt->advance == NULL,
3306 "SIZE tag at %L requires an ADVANCE tag",
3307 &dt->size->where);
3309 io_constraint (dt->eor && dt->advance == NULL,
3310 "EOR tag at %L requires an ADVANCE tag",
3311 &dt->eor_where);
3314 if (dt->asynchronous)
3316 static const char * asynchronous[] = { "YES", "NO", NULL };
3318 if (gfc_reduce_init_expr (dt->asynchronous) != SUCCESS)
3320 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3321 "expression", &dt->asynchronous->where);
3322 return MATCH_ERROR;
3325 if (!compare_to_allowed_values
3326 ("ASYNCHRONOUS", asynchronous, NULL, NULL,
3327 dt->asynchronous->value.character.string,
3328 io_kind_name (k), warn))
3329 return MATCH_ERROR;
3332 if (dt->id)
3334 bool not_yes
3335 = !dt->asynchronous
3336 || gfc_wide_strlen (dt->asynchronous->value.character.string) != 3
3337 || gfc_wide_strncasecmp (dt->asynchronous->value.character.string,
3338 "yes", 3) != 0;
3339 io_constraint (not_yes,
3340 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3341 "specifier", &dt->id->where);
3344 if (dt->decimal)
3346 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
3347 "not allowed in Fortran 95") == FAILURE)
3348 return MATCH_ERROR;
3350 if (dt->decimal->expr_type == EXPR_CONSTANT)
3352 static const char * decimal[] = { "COMMA", "POINT", NULL };
3354 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
3355 dt->decimal->value.character.string,
3356 io_kind_name (k), warn))
3357 return MATCH_ERROR;
3359 io_constraint (unformatted,
3360 "the DECIMAL= specifier at %L must be with an "
3361 "explicit format expression", &dt->decimal->where);
3365 if (dt->blank)
3367 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
3368 "not allowed in Fortran 95") == FAILURE)
3369 return MATCH_ERROR;
3371 if (dt->blank->expr_type == EXPR_CONSTANT)
3373 static const char * blank[] = { "NULL", "ZERO", NULL };
3375 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
3376 dt->blank->value.character.string,
3377 io_kind_name (k), warn))
3378 return MATCH_ERROR;
3380 io_constraint (unformatted,
3381 "the BLANK= specifier at %L must be with an "
3382 "explicit format expression", &dt->blank->where);
3386 if (dt->pad)
3388 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PAD= at %C "
3389 "not allowed in Fortran 95") == FAILURE)
3390 return MATCH_ERROR;
3392 if (dt->pad->expr_type == EXPR_CONSTANT)
3394 static const char * pad[] = { "YES", "NO", NULL };
3396 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
3397 dt->pad->value.character.string,
3398 io_kind_name (k), warn))
3399 return MATCH_ERROR;
3401 io_constraint (unformatted,
3402 "the PAD= specifier at %L must be with an "
3403 "explicit format expression", &dt->pad->where);
3407 if (dt->round)
3409 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ROUND= at %C "
3410 "not allowed in Fortran 95") == FAILURE)
3411 return MATCH_ERROR;
3413 if (dt->round->expr_type == EXPR_CONSTANT)
3415 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
3416 "COMPATIBLE", "PROCESSOR_DEFINED",
3417 NULL };
3419 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
3420 dt->round->value.character.string,
3421 io_kind_name (k), warn))
3422 return MATCH_ERROR;
3426 if (dt->sign)
3428 /* When implemented, change the following to use gfc_notify_std F2003.
3429 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
3430 "not allowed in Fortran 95") == FAILURE)
3431 return MATCH_ERROR; */
3432 if (dt->sign->expr_type == EXPR_CONSTANT)
3434 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3435 NULL };
3437 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
3438 dt->sign->value.character.string,
3439 io_kind_name (k), warn))
3440 return MATCH_ERROR;
3442 io_constraint (unformatted,
3443 "SIGN= specifier at %L must be with an "
3444 "explicit format expression", &dt->sign->where);
3446 io_constraint (k == M_READ,
3447 "SIGN= specifier at %L not allowed in a "
3448 "READ statement", &dt->sign->where);
3452 if (dt->delim)
3454 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
3455 "not allowed in Fortran 95") == FAILURE)
3456 return MATCH_ERROR;
3458 if (dt->delim->expr_type == EXPR_CONSTANT)
3460 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
3462 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
3463 dt->delim->value.character.string,
3464 io_kind_name (k), warn))
3465 return MATCH_ERROR;
3467 io_constraint (k == M_READ,
3468 "DELIM= specifier at %L not allowed in a "
3469 "READ statement", &dt->delim->where);
3471 io_constraint (dt->format_label != &format_asterisk
3472 && dt->namelist == NULL,
3473 "DELIM= specifier at %L must have FMT=*",
3474 &dt->delim->where);
3476 io_constraint (unformatted && dt->namelist == NULL,
3477 "DELIM= specifier at %L must be with FMT=* or "
3478 "NML= specifier ", &dt->delim->where);
3482 if (dt->namelist)
3484 io_constraint (io_code && dt->namelist,
3485 "NAMELIST cannot be followed by IO-list at %L",
3486 &io_code->loc);
3488 io_constraint (dt->format_expr,
3489 "IO spec-list cannot contain both NAMELIST group name "
3490 "and format specification at %L",
3491 &dt->format_expr->where);
3493 io_constraint (dt->format_label,
3494 "IO spec-list cannot contain both NAMELIST group name "
3495 "and format label at %L", spec_end);
3497 io_constraint (dt->rec,
3498 "NAMELIST IO is not allowed with a REC= specifier "
3499 "at %L", &dt->rec->where);
3501 io_constraint (dt->advance,
3502 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3503 "at %L", &dt->advance->where);
3506 if (dt->rec)
3508 io_constraint (dt->end,
3509 "An END tag is not allowed with a "
3510 "REC= specifier at %L", &dt->end_where);
3512 io_constraint (dt->format_label == &format_asterisk,
3513 "FMT=* is not allowed with a REC= specifier "
3514 "at %L", spec_end);
3516 io_constraint (dt->pos,
3517 "POS= is not allowed with REC= specifier "
3518 "at %L", &dt->pos->where);
3521 if (dt->advance)
3523 int not_yes, not_no;
3524 expr = dt->advance;
3526 io_constraint (dt->format_label == &format_asterisk,
3527 "List directed format(*) is not allowed with a "
3528 "ADVANCE= specifier at %L.", &expr->where);
3530 io_constraint (unformatted,
3531 "the ADVANCE= specifier at %L must appear with an "
3532 "explicit format expression", &expr->where);
3534 if (expr->expr_type == EXPR_CONSTANT && expr->ts.type == BT_CHARACTER)
3536 const gfc_char_t *advance = expr->value.character.string;
3537 not_no = gfc_wide_strlen (advance) != 2
3538 || gfc_wide_strncasecmp (advance, "no", 2) != 0;
3539 not_yes = gfc_wide_strlen (advance) != 3
3540 || gfc_wide_strncasecmp (advance, "yes", 3) != 0;
3542 else
3544 not_no = 0;
3545 not_yes = 0;
3548 io_constraint (not_no && not_yes,
3549 "ADVANCE= specifier at %L must have value = "
3550 "YES or NO.", &expr->where);
3552 io_constraint (dt->size && not_no && k == M_READ,
3553 "SIZE tag at %L requires an ADVANCE = 'NO'",
3554 &dt->size->where);
3556 io_constraint (dt->eor && not_no && k == M_READ,
3557 "EOR tag at %L requires an ADVANCE = 'NO'",
3558 &dt->eor_where);
3561 expr = dt->format_expr;
3562 if (gfc_simplify_expr (expr, 0) == FAILURE
3563 || check_format_string (expr, k == M_READ) == FAILURE)
3564 return MATCH_ERROR;
3566 return m;
3568 #undef io_constraint
3571 /* Match a READ, WRITE or PRINT statement. */
3573 static match
3574 match_io (io_kind k)
3576 char name[GFC_MAX_SYMBOL_LEN + 1];
3577 gfc_code *io_code;
3578 gfc_symbol *sym;
3579 int comma_flag;
3580 locus where;
3581 locus spec_end;
3582 gfc_dt *dt;
3583 match m;
3585 where = gfc_current_locus;
3586 comma_flag = 0;
3587 current_dt = dt = XCNEW (gfc_dt);
3588 m = gfc_match_char ('(');
3589 if (m == MATCH_NO)
3591 where = gfc_current_locus;
3592 if (k == M_WRITE)
3593 goto syntax;
3594 else if (k == M_PRINT)
3596 /* Treat the non-standard case of PRINT namelist. */
3597 if ((gfc_current_form == FORM_FIXED || gfc_peek_ascii_char () == ' ')
3598 && gfc_match_name (name) == MATCH_YES)
3600 gfc_find_symbol (name, NULL, 1, &sym);
3601 if (sym && sym->attr.flavor == FL_NAMELIST)
3603 if (gfc_notify_std (GFC_STD_GNU, "PRINT namelist at "
3604 "%C is an extension") == FAILURE)
3606 m = MATCH_ERROR;
3607 goto cleanup;
3610 dt->io_unit = default_unit (k);
3611 dt->namelist = sym;
3612 goto get_io_list;
3614 else
3615 gfc_current_locus = where;
3619 if (gfc_current_form == FORM_FREE)
3621 char c = gfc_peek_ascii_char ();
3622 if (c != ' ' && c != '*' && c != '\'' && c != '"')
3624 m = MATCH_NO;
3625 goto cleanup;
3629 m = match_dt_format (dt);
3630 if (m == MATCH_ERROR)
3631 goto cleanup;
3632 if (m == MATCH_NO)
3633 goto syntax;
3635 comma_flag = 1;
3636 dt->io_unit = default_unit (k);
3637 goto get_io_list;
3639 else
3641 /* Before issuing an error for a malformed 'print (1,*)' type of
3642 error, check for a default-char-expr of the form ('(I0)'). */
3643 if (k == M_PRINT && m == MATCH_YES)
3645 /* Reset current locus to get the initial '(' in an expression. */
3646 gfc_current_locus = where;
3647 dt->format_expr = NULL;
3648 m = match_dt_format (dt);
3650 if (m == MATCH_ERROR)
3651 goto cleanup;
3652 if (m == MATCH_NO || dt->format_expr == NULL)
3653 goto syntax;
3655 comma_flag = 1;
3656 dt->io_unit = default_unit (k);
3657 goto get_io_list;
3661 /* Match a control list */
3662 if (match_dt_element (k, dt) == MATCH_YES)
3663 goto next;
3664 if (match_dt_unit (k, dt) != MATCH_YES)
3665 goto loop;
3667 if (gfc_match_char (')') == MATCH_YES)
3668 goto get_io_list;
3669 if (gfc_match_char (',') != MATCH_YES)
3670 goto syntax;
3672 m = match_dt_element (k, dt);
3673 if (m == MATCH_YES)
3674 goto next;
3675 if (m == MATCH_ERROR)
3676 goto cleanup;
3678 m = match_dt_format (dt);
3679 if (m == MATCH_YES)
3680 goto next;
3681 if (m == MATCH_ERROR)
3682 goto cleanup;
3684 where = gfc_current_locus;
3686 m = gfc_match_name (name);
3687 if (m == MATCH_YES)
3689 gfc_find_symbol (name, NULL, 1, &sym);
3690 if (sym && sym->attr.flavor == FL_NAMELIST)
3692 dt->namelist = sym;
3693 if (k == M_READ && check_namelist (sym))
3695 m = MATCH_ERROR;
3696 goto cleanup;
3698 goto next;
3702 gfc_current_locus = where;
3704 goto loop; /* No matches, try regular elements */
3706 next:
3707 if (gfc_match_char (')') == MATCH_YES)
3708 goto get_io_list;
3709 if (gfc_match_char (',') != MATCH_YES)
3710 goto syntax;
3712 loop:
3713 for (;;)
3715 m = match_dt_element (k, dt);
3716 if (m == MATCH_NO)
3717 goto syntax;
3718 if (m == MATCH_ERROR)
3719 goto cleanup;
3721 if (gfc_match_char (')') == MATCH_YES)
3722 break;
3723 if (gfc_match_char (',') != MATCH_YES)
3724 goto syntax;
3727 get_io_list:
3729 /* Used in check_io_constraints, where no locus is available. */
3730 spec_end = gfc_current_locus;
3732 /* Save the IO kind for later use. */
3733 dt->dt_io_kind = gfc_get_iokind_expr (&gfc_current_locus, k);
3735 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3736 to save the locus. This is used later when resolving transfer statements
3737 that might have a format expression without unit number. */
3738 if (!comma_flag && gfc_match_char (',') == MATCH_YES)
3739 dt->extra_comma = dt->dt_io_kind;
3741 io_code = NULL;
3742 if (gfc_match_eos () != MATCH_YES)
3744 if (comma_flag && gfc_match_char (',') != MATCH_YES)
3746 gfc_error ("Expected comma in I/O list at %C");
3747 m = MATCH_ERROR;
3748 goto cleanup;
3751 m = match_io_list (k, &io_code);
3752 if (m == MATCH_ERROR)
3753 goto cleanup;
3754 if (m == MATCH_NO)
3755 goto syntax;
3758 /* A full IO statement has been matched. Check the constraints. spec_end is
3759 supplied for cases where no locus is supplied. */
3760 m = check_io_constraints (k, dt, io_code, &spec_end);
3762 if (m == MATCH_ERROR)
3763 goto cleanup;
3765 new_st.op = (k == M_READ) ? EXEC_READ : EXEC_WRITE;
3766 new_st.ext.dt = dt;
3767 new_st.block = gfc_get_code ();
3768 new_st.block->op = new_st.op;
3769 new_st.block->next = io_code;
3771 terminate_io (io_code);
3773 return MATCH_YES;
3775 syntax:
3776 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3777 m = MATCH_ERROR;
3779 cleanup:
3780 gfc_free_dt (dt);
3781 return m;
3785 match
3786 gfc_match_read (void)
3788 return match_io (M_READ);
3792 match
3793 gfc_match_write (void)
3795 return match_io (M_WRITE);
3799 match
3800 gfc_match_print (void)
3802 match m;
3804 m = match_io (M_PRINT);
3805 if (m != MATCH_YES)
3806 return m;
3808 if (gfc_pure (NULL))
3810 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3811 return MATCH_ERROR;
3814 if (gfc_implicit_pure (NULL))
3815 gfc_current_ns->proc_name->attr.implicit_pure = 0;
3817 return MATCH_YES;
3821 /* Free a gfc_inquire structure. */
3823 void
3824 gfc_free_inquire (gfc_inquire *inquire)
3827 if (inquire == NULL)
3828 return;
3830 gfc_free_expr (inquire->unit);
3831 gfc_free_expr (inquire->file);
3832 gfc_free_expr (inquire->iomsg);
3833 gfc_free_expr (inquire->iostat);
3834 gfc_free_expr (inquire->exist);
3835 gfc_free_expr (inquire->opened);
3836 gfc_free_expr (inquire->number);
3837 gfc_free_expr (inquire->named);
3838 gfc_free_expr (inquire->name);
3839 gfc_free_expr (inquire->access);
3840 gfc_free_expr (inquire->sequential);
3841 gfc_free_expr (inquire->direct);
3842 gfc_free_expr (inquire->form);
3843 gfc_free_expr (inquire->formatted);
3844 gfc_free_expr (inquire->unformatted);
3845 gfc_free_expr (inquire->recl);
3846 gfc_free_expr (inquire->nextrec);
3847 gfc_free_expr (inquire->blank);
3848 gfc_free_expr (inquire->position);
3849 gfc_free_expr (inquire->action);
3850 gfc_free_expr (inquire->read);
3851 gfc_free_expr (inquire->write);
3852 gfc_free_expr (inquire->readwrite);
3853 gfc_free_expr (inquire->delim);
3854 gfc_free_expr (inquire->encoding);
3855 gfc_free_expr (inquire->pad);
3856 gfc_free_expr (inquire->iolength);
3857 gfc_free_expr (inquire->convert);
3858 gfc_free_expr (inquire->strm_pos);
3859 gfc_free_expr (inquire->asynchronous);
3860 gfc_free_expr (inquire->decimal);
3861 gfc_free_expr (inquire->pending);
3862 gfc_free_expr (inquire->id);
3863 gfc_free_expr (inquire->sign);
3864 gfc_free_expr (inquire->size);
3865 gfc_free_expr (inquire->round);
3866 free (inquire);
3870 /* Match an element of an INQUIRE statement. */
3872 #define RETM if (m != MATCH_NO) return m;
3874 static match
3875 match_inquire_element (gfc_inquire *inquire)
3877 match m;
3879 m = match_etag (&tag_unit, &inquire->unit);
3880 RETM m = match_etag (&tag_file, &inquire->file);
3881 RETM m = match_ltag (&tag_err, &inquire->err);
3882 RETM m = match_out_tag (&tag_iomsg, &inquire->iomsg);
3883 RETM m = match_out_tag (&tag_iostat, &inquire->iostat);
3884 RETM m = match_vtag (&tag_exist, &inquire->exist);
3885 RETM m = match_vtag (&tag_opened, &inquire->opened);
3886 RETM m = match_vtag (&tag_named, &inquire->named);
3887 RETM m = match_vtag (&tag_name, &inquire->name);
3888 RETM m = match_out_tag (&tag_number, &inquire->number);
3889 RETM m = match_vtag (&tag_s_access, &inquire->access);
3890 RETM m = match_vtag (&tag_sequential, &inquire->sequential);
3891 RETM m = match_vtag (&tag_direct, &inquire->direct);
3892 RETM m = match_vtag (&tag_s_form, &inquire->form);
3893 RETM m = match_vtag (&tag_formatted, &inquire->formatted);
3894 RETM m = match_vtag (&tag_unformatted, &inquire->unformatted);
3895 RETM m = match_out_tag (&tag_s_recl, &inquire->recl);
3896 RETM m = match_out_tag (&tag_nextrec, &inquire->nextrec);
3897 RETM m = match_vtag (&tag_s_blank, &inquire->blank);
3898 RETM m = match_vtag (&tag_s_position, &inquire->position);
3899 RETM m = match_vtag (&tag_s_action, &inquire->action);
3900 RETM m = match_vtag (&tag_read, &inquire->read);
3901 RETM m = match_vtag (&tag_write, &inquire->write);
3902 RETM m = match_vtag (&tag_readwrite, &inquire->readwrite);
3903 RETM m = match_vtag (&tag_s_async, &inquire->asynchronous);
3904 RETM m = match_vtag (&tag_s_delim, &inquire->delim);
3905 RETM m = match_vtag (&tag_s_decimal, &inquire->decimal);
3906 RETM m = match_vtag (&tag_size, &inquire->size);
3907 RETM m = match_vtag (&tag_s_encoding, &inquire->encoding);
3908 RETM m = match_vtag (&tag_s_round, &inquire->round);
3909 RETM m = match_vtag (&tag_s_sign, &inquire->sign);
3910 RETM m = match_vtag (&tag_s_pad, &inquire->pad);
3911 RETM m = match_vtag (&tag_iolength, &inquire->iolength);
3912 RETM m = match_vtag (&tag_convert, &inquire->convert);
3913 RETM m = match_out_tag (&tag_strm_out, &inquire->strm_pos);
3914 RETM m = match_vtag (&tag_pending, &inquire->pending);
3915 RETM m = match_vtag (&tag_id, &inquire->id);
3916 RETM return MATCH_NO;
3919 #undef RETM
3922 match
3923 gfc_match_inquire (void)
3925 gfc_inquire *inquire;
3926 gfc_code *code;
3927 match m;
3928 locus loc;
3930 m = gfc_match_char ('(');
3931 if (m == MATCH_NO)
3932 return m;
3934 inquire = XCNEW (gfc_inquire);
3936 loc = gfc_current_locus;
3938 m = match_inquire_element (inquire);
3939 if (m == MATCH_ERROR)
3940 goto cleanup;
3941 if (m == MATCH_NO)
3943 m = gfc_match_expr (&inquire->unit);
3944 if (m == MATCH_ERROR)
3945 goto cleanup;
3946 if (m == MATCH_NO)
3947 goto syntax;
3950 /* See if we have the IOLENGTH form of the inquire statement. */
3951 if (inquire->iolength != NULL)
3953 if (gfc_match_char (')') != MATCH_YES)
3954 goto syntax;
3956 m = match_io_list (M_INQUIRE, &code);
3957 if (m == MATCH_ERROR)
3958 goto cleanup;
3959 if (m == MATCH_NO)
3960 goto syntax;
3962 new_st.op = EXEC_IOLENGTH;
3963 new_st.expr1 = inquire->iolength;
3964 new_st.ext.inquire = inquire;
3966 if (gfc_pure (NULL))
3968 gfc_free_statements (code);
3969 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3970 return MATCH_ERROR;
3973 if (gfc_implicit_pure (NULL))
3974 gfc_current_ns->proc_name->attr.implicit_pure = 0;
3976 new_st.block = gfc_get_code ();
3977 new_st.block->op = EXEC_IOLENGTH;
3978 terminate_io (code);
3979 new_st.block->next = code;
3980 return MATCH_YES;
3983 /* At this point, we have the non-IOLENGTH inquire statement. */
3984 for (;;)
3986 if (gfc_match_char (')') == MATCH_YES)
3987 break;
3988 if (gfc_match_char (',') != MATCH_YES)
3989 goto syntax;
3991 m = match_inquire_element (inquire);
3992 if (m == MATCH_ERROR)
3993 goto cleanup;
3994 if (m == MATCH_NO)
3995 goto syntax;
3997 if (inquire->iolength != NULL)
3999 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4000 goto cleanup;
4004 if (gfc_match_eos () != MATCH_YES)
4005 goto syntax;
4007 if (inquire->unit != NULL && inquire->file != NULL)
4009 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4010 "UNIT specifiers", &loc);
4011 goto cleanup;
4014 if (inquire->unit == NULL && inquire->file == NULL)
4016 gfc_error ("INQUIRE statement at %L requires either FILE or "
4017 "UNIT specifier", &loc);
4018 goto cleanup;
4021 if (gfc_pure (NULL))
4023 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4024 goto cleanup;
4027 if (gfc_implicit_pure (NULL))
4028 gfc_current_ns->proc_name->attr.implicit_pure = 0;
4030 if (inquire->id != NULL && inquire->pending == NULL)
4032 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4033 "the ID= specifier", &loc);
4034 goto cleanup;
4037 new_st.op = EXEC_INQUIRE;
4038 new_st.ext.inquire = inquire;
4039 return MATCH_YES;
4041 syntax:
4042 gfc_syntax_error (ST_INQUIRE);
4044 cleanup:
4045 gfc_free_inquire (inquire);
4046 return MATCH_ERROR;
4050 /* Resolve everything in a gfc_inquire structure. */
4052 gfc_try
4053 gfc_resolve_inquire (gfc_inquire *inquire)
4055 RESOLVE_TAG (&tag_unit, inquire->unit);
4056 RESOLVE_TAG (&tag_file, inquire->file);
4057 RESOLVE_TAG (&tag_id, inquire->id);
4059 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4060 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4061 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4062 RESOLVE_TAG (tag, expr); \
4063 if (expr) \
4065 char context[64]; \
4066 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4067 if (gfc_check_vardef_context ((expr), false, false, context) == FAILURE) \
4068 return FAILURE; \
4070 INQUIRE_RESOLVE_TAG (&tag_iomsg, inquire->iomsg);
4071 INQUIRE_RESOLVE_TAG (&tag_iostat, inquire->iostat);
4072 INQUIRE_RESOLVE_TAG (&tag_exist, inquire->exist);
4073 INQUIRE_RESOLVE_TAG (&tag_opened, inquire->opened);
4074 INQUIRE_RESOLVE_TAG (&tag_number, inquire->number);
4075 INQUIRE_RESOLVE_TAG (&tag_named, inquire->named);
4076 INQUIRE_RESOLVE_TAG (&tag_name, inquire->name);
4077 INQUIRE_RESOLVE_TAG (&tag_s_access, inquire->access);
4078 INQUIRE_RESOLVE_TAG (&tag_sequential, inquire->sequential);
4079 INQUIRE_RESOLVE_TAG (&tag_direct, inquire->direct);
4080 INQUIRE_RESOLVE_TAG (&tag_s_form, inquire->form);
4081 INQUIRE_RESOLVE_TAG (&tag_formatted, inquire->formatted);
4082 INQUIRE_RESOLVE_TAG (&tag_unformatted, inquire->unformatted);
4083 INQUIRE_RESOLVE_TAG (&tag_s_recl, inquire->recl);
4084 INQUIRE_RESOLVE_TAG (&tag_nextrec, inquire->nextrec);
4085 INQUIRE_RESOLVE_TAG (&tag_s_blank, inquire->blank);
4086 INQUIRE_RESOLVE_TAG (&tag_s_position, inquire->position);
4087 INQUIRE_RESOLVE_TAG (&tag_s_action, inquire->action);
4088 INQUIRE_RESOLVE_TAG (&tag_read, inquire->read);
4089 INQUIRE_RESOLVE_TAG (&tag_write, inquire->write);
4090 INQUIRE_RESOLVE_TAG (&tag_readwrite, inquire->readwrite);
4091 INQUIRE_RESOLVE_TAG (&tag_s_delim, inquire->delim);
4092 INQUIRE_RESOLVE_TAG (&tag_s_pad, inquire->pad);
4093 INQUIRE_RESOLVE_TAG (&tag_s_encoding, inquire->encoding);
4094 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4095 INQUIRE_RESOLVE_TAG (&tag_iolength, inquire->iolength);
4096 INQUIRE_RESOLVE_TAG (&tag_convert, inquire->convert);
4097 INQUIRE_RESOLVE_TAG (&tag_strm_out, inquire->strm_pos);
4098 INQUIRE_RESOLVE_TAG (&tag_s_async, inquire->asynchronous);
4099 INQUIRE_RESOLVE_TAG (&tag_s_sign, inquire->sign);
4100 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4101 INQUIRE_RESOLVE_TAG (&tag_pending, inquire->pending);
4102 INQUIRE_RESOLVE_TAG (&tag_size, inquire->size);
4103 INQUIRE_RESOLVE_TAG (&tag_s_decimal, inquire->decimal);
4104 #undef INQUIRE_RESOLVE_TAG
4106 if (gfc_reference_st_label (inquire->err, ST_LABEL_TARGET) == FAILURE)
4107 return FAILURE;
4109 return SUCCESS;
4113 void
4114 gfc_free_wait (gfc_wait *wait)
4116 if (wait == NULL)
4117 return;
4119 gfc_free_expr (wait->unit);
4120 gfc_free_expr (wait->iostat);
4121 gfc_free_expr (wait->iomsg);
4122 gfc_free_expr (wait->id);
4126 gfc_try
4127 gfc_resolve_wait (gfc_wait *wait)
4129 RESOLVE_TAG (&tag_unit, wait->unit);
4130 RESOLVE_TAG (&tag_iomsg, wait->iomsg);
4131 RESOLVE_TAG (&tag_iostat, wait->iostat);
4132 RESOLVE_TAG (&tag_id, wait->id);
4134 if (gfc_reference_st_label (wait->err, ST_LABEL_TARGET) == FAILURE)
4135 return FAILURE;
4137 if (gfc_reference_st_label (wait->end, ST_LABEL_TARGET) == FAILURE)
4138 return FAILURE;
4140 return SUCCESS;
4143 /* Match an element of a WAIT statement. */
4145 #define RETM if (m != MATCH_NO) return m;
4147 static match
4148 match_wait_element (gfc_wait *wait)
4150 match m;
4152 m = match_etag (&tag_unit, &wait->unit);
4153 RETM m = match_ltag (&tag_err, &wait->err);
4154 RETM m = match_ltag (&tag_end, &wait->eor);
4155 RETM m = match_ltag (&tag_eor, &wait->end);
4156 RETM m = match_out_tag (&tag_iomsg, &wait->iomsg);
4157 RETM m = match_out_tag (&tag_iostat, &wait->iostat);
4158 RETM m = match_etag (&tag_id, &wait->id);
4159 RETM return MATCH_NO;
4162 #undef RETM
4165 match
4166 gfc_match_wait (void)
4168 gfc_wait *wait;
4169 match m;
4171 m = gfc_match_char ('(');
4172 if (m == MATCH_NO)
4173 return m;
4175 wait = XCNEW (gfc_wait);
4177 m = match_wait_element (wait);
4178 if (m == MATCH_ERROR)
4179 goto cleanup;
4180 if (m == MATCH_NO)
4182 m = gfc_match_expr (&wait->unit);
4183 if (m == MATCH_ERROR)
4184 goto cleanup;
4185 if (m == MATCH_NO)
4186 goto syntax;
4189 for (;;)
4191 if (gfc_match_char (')') == MATCH_YES)
4192 break;
4193 if (gfc_match_char (',') != MATCH_YES)
4194 goto syntax;
4196 m = match_wait_element (wait);
4197 if (m == MATCH_ERROR)
4198 goto cleanup;
4199 if (m == MATCH_NO)
4200 goto syntax;
4203 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: WAIT at %C "
4204 "not allowed in Fortran 95") == FAILURE)
4205 goto cleanup;
4207 if (gfc_pure (NULL))
4209 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4210 goto cleanup;
4213 if (gfc_implicit_pure (NULL))
4214 gfc_current_ns->proc_name->attr.implicit_pure = 0;
4216 new_st.op = EXEC_WAIT;
4217 new_st.ext.wait = wait;
4219 return MATCH_YES;
4221 syntax:
4222 gfc_syntax_error (ST_WAIT);
4224 cleanup:
4225 gfc_free_wait (wait);
4226 return MATCH_ERROR;