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