1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 Free Software Foundation, Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
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
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/>. */
31 format_asterisk = {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL,
36 const char *name, *spec, *value;
42 tag_file = {"FILE", " file =", " %e", BT_CHARACTER },
43 tag_status = {"STATUS", " status =", " %e", BT_CHARACTER},
44 tag_e_access = {"ACCESS", " access =", " %e", BT_CHARACTER},
45 tag_e_form = {"FORM", " form =", " %e", BT_CHARACTER},
46 tag_e_recl = {"RECL", " recl =", " %e", BT_INTEGER},
47 tag_e_blank = {"BLANK", " blank =", " %e", BT_CHARACTER},
48 tag_e_position = {"POSITION", " position =", " %e", BT_CHARACTER},
49 tag_e_action = {"ACTION", " action =", " %e", BT_CHARACTER},
50 tag_e_delim = {"DELIM", " delim =", " %e", BT_CHARACTER},
51 tag_e_pad = {"PAD", " pad =", " %e", BT_CHARACTER},
52 tag_e_decimal = {"DECIMAL", " decimal =", " %e", BT_CHARACTER},
53 tag_e_encoding = {"ENCODING", " encoding =", " %e", BT_CHARACTER},
54 tag_e_async = {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER},
55 tag_e_round = {"ROUND", " round =", " %e", BT_CHARACTER},
56 tag_e_sign = {"SIGN", " sign =", " %e", BT_CHARACTER},
57 tag_unit = {"UNIT", " unit =", " %e", BT_INTEGER},
58 tag_advance = {"ADVANCE", " advance =", " %e", BT_CHARACTER},
59 tag_rec = {"REC", " rec =", " %e", BT_INTEGER},
60 tag_spos = {"POSITION", " pos =", " %e", BT_INTEGER},
61 tag_format = {"FORMAT", NULL, NULL, BT_CHARACTER},
62 tag_iomsg = {"IOMSG", " iomsg =", " %e", BT_CHARACTER},
63 tag_iostat = {"IOSTAT", " iostat =", " %v", BT_INTEGER},
64 tag_size = {"SIZE", " size =", " %v", BT_INTEGER},
65 tag_exist = {"EXIST", " exist =", " %v", BT_LOGICAL},
66 tag_opened = {"OPENED", " opened =", " %v", BT_LOGICAL},
67 tag_named = {"NAMED", " named =", " %v", BT_LOGICAL},
68 tag_name = {"NAME", " name =", " %v", BT_CHARACTER},
69 tag_number = {"NUMBER", " number =", " %v", BT_INTEGER},
70 tag_s_access = {"ACCESS", " access =", " %v", BT_CHARACTER},
71 tag_sequential = {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER},
72 tag_direct = {"DIRECT", " direct =", " %v", BT_CHARACTER},
73 tag_s_form = {"FORM", " form =", " %v", BT_CHARACTER},
74 tag_formatted = {"FORMATTED", " formatted =", " %v", BT_CHARACTER},
75 tag_unformatted = {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER},
76 tag_s_recl = {"RECL", " recl =", " %v", BT_INTEGER},
77 tag_nextrec = {"NEXTREC", " nextrec =", " %v", BT_INTEGER},
78 tag_s_blank = {"BLANK", " blank =", " %v", BT_CHARACTER},
79 tag_s_position = {"POSITION", " position =", " %v", BT_CHARACTER},
80 tag_s_action = {"ACTION", " action =", " %v", BT_CHARACTER},
81 tag_read = {"READ", " read =", " %v", BT_CHARACTER},
82 tag_write = {"WRITE", " write =", " %v", BT_CHARACTER},
83 tag_readwrite = {"READWRITE", " readwrite =", " %v", BT_CHARACTER},
84 tag_s_delim = {"DELIM", " delim =", " %v", BT_CHARACTER},
85 tag_s_pad = {"PAD", " pad =", " %v", BT_CHARACTER},
86 tag_s_decimal = {"DECIMAL", " decimal =", " %v", BT_CHARACTER},
87 tag_s_encoding = {"ENCODING", " encoding =", " %v", BT_CHARACTER},
88 tag_s_async = {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER},
89 tag_s_round = {"ROUND", " round =", " %v", BT_CHARACTER},
90 tag_s_sign = {"SIGN", " sign =", " %v", BT_CHARACTER},
91 tag_iolength = {"IOLENGTH", " iolength =", " %v", BT_INTEGER},
92 tag_convert = {"CONVERT", " convert =", " %e", BT_CHARACTER},
93 tag_strm_out = {"POS", " pos =", " %v", BT_INTEGER},
94 tag_err = {"ERR", " err =", " %l", BT_UNKNOWN},
95 tag_end = {"END", " end =", " %l", BT_UNKNOWN},
96 tag_eor = {"EOR", " eor =", " %l", BT_UNKNOWN},
97 tag_id = {"ID", " id =", " %v", BT_INTEGER},
98 tag_pending = {"PENDING", " pending =", " %v", BT_LOGICAL},
99 tag_newunit = {"NEWUNIT", " newunit =", " %v", BT_INTEGER};
101 static gfc_dt *current_dt;
103 #define RESOLVE_TAG(x, y) if (resolve_tag(x, y) == FAILURE) return FAILURE;
106 /**************** Fortran 95 FORMAT parser *****************/
108 /* FORMAT tokens returned by format_lex(). */
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
120 /* Local variables for checking format strings. The saved_token is
121 used to back up by a single format token during the parsing
123 static gfc_char_t *format_string;
124 static int format_string_pos;
125 static int format_length, use_last_char;
126 static char error_element;
127 static locus format_locus;
129 static format_token saved_token;
132 { MODE_STRING, MODE_FORMAT, MODE_COPY }
136 /* Return the next character in the format string. */
139 next_char (gfc_instring in_string)
151 if (mode == MODE_STRING)
152 c = *format_string++;
155 c = gfc_next_char_literal (in_string);
160 if (gfc_option.flag_backslash && c == '\\')
162 locus old_locus = gfc_current_locus;
164 if (gfc_match_special_char (&c) == MATCH_NO)
165 gfc_current_locus = old_locus;
167 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
168 gfc_warning ("Extension: backslash character at %C");
171 if (mode == MODE_COPY)
172 *format_string++ = c;
174 if (mode != MODE_STRING)
175 format_locus = gfc_current_locus;
179 c = gfc_wide_toupper (c);
184 /* Back up one character position. Only works once. */
192 /* Eat up the spaces and return a character. */
195 next_char_not_space (bool *error)
200 error_element = c = next_char (NONSTRING);
203 if (gfc_option.allow_std & GFC_STD_GNU)
204 gfc_warning ("Extension: Tab character in format at %C");
207 gfc_error ("Extension: Tab character in format at %C");
213 while (gfc_is_whitespace (c));
217 static int value = 0;
219 /* Simple lexical analyzer for getting the next token in a FORMAT
231 if (saved_token != FMT_NONE)
234 saved_token = FMT_NONE;
238 c = next_char_not_space (&error);
246 c = next_char_not_space (&error);
257 c = next_char_not_space (&error);
259 value = 10 * value + c - '0';
268 token = FMT_SIGNED_INT;
287 c = next_char_not_space (&error);
290 value = 10 * value + c - '0';
298 token = zflag ? FMT_ZERO : FMT_POSINT;
322 c = next_char_not_space (&error);
350 c = next_char_not_space (&error);
351 if (c != 'P' && c != 'S')
358 c = next_char_not_space (&error);
359 if (c == 'N' || c == 'Z')
377 c = next_char (INSTRING_WARN);
386 c = next_char (INSTRING_NOWARN);
420 c = next_char_not_space (&error);
450 c = next_char_not_space (&error);
453 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DP format "
454 "specifier not allowed at %C") == FAILURE)
460 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DC format "
461 "specifier not allowed at %C") == FAILURE)
473 c = next_char_not_space (&error);
522 token_to_string (format_token t)
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. */
547 check_format (bool is_input)
549 const char *posint_required = _("Positive width required");
550 const char *nonneg_required = _("Nonnegative width required");
551 const char *unexpected_element = _("Unexpected element '%c' in format string"
553 const char *unexpected_end = _("Unexpected end of format string");
554 const char *zero_width = _("Zero width in format descriptor");
563 saved_token = FMT_NONE;
567 format_string_pos = 0;
574 error = _("Missing leading left parenthesis");
582 goto finished; /* Empty format is legal */
586 /* In this state, the next thing has to be a format item. */
603 error = _("Left parenthesis required after '*'");
628 /* Signed integer can only precede a P format. */
634 error = _("Expected P edit descriptor");
641 /* P requires a prior number. */
642 error = _("P descriptor requires leading scale factor");
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)
668 goto extension_optional_comma;
679 if (gfc_notify_std (GFC_STD_GNU, "Extension: $ descriptor at %L",
680 &format_locus) == FAILURE)
682 if (t != FMT_RPAREN || level > 0)
684 gfc_warning ("$ should be the last specifier in format at %L",
686 goto optional_comma_1;
707 error = unexpected_end;
711 error = unexpected_element;
716 /* In this state, t must currently be a data descriptor.
717 Deal with things that can/must follow the descriptor. */
728 /* No comma after P allowed only for F, E, EN, ES, D, or G.
733 if (!(gfc_option.allow_std & GFC_STD_F2003) && t != FMT_COMMA
734 && t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES
735 && t != FMT_D && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
737 error = _("Comma required after P descriptor");
748 if (t != FMT_F && t != FMT_E && t != FMT_EN && t != FMT_ES && t != FMT_D
749 && t != FMT_G && t != FMT_RPAREN && t != FMT_SLASH)
751 error = _("Comma required after P descriptor");
765 error = _("Positive width required with T descriptor");
777 switch (gfc_notification_std (GFC_STD_GNU))
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);
788 error = posint_required;
819 if (t == FMT_G && u == FMT_ZERO)
826 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: 'G0' in "
827 "format at %L", &format_locus) == FAILURE)
838 error = posint_required;
844 error = _("E specifier not allowed with g0 descriptor");
853 format_locus.nextc += format_string_pos;
854 gfc_error ("Positive width required in format "
855 "specifier %s at %L", token_to_string (t),
866 /* Warn if -std=legacy, otherwise error. */
867 format_locus.nextc += format_string_pos;
868 if (gfc_option.warn_std != 0)
870 gfc_error ("Period required in format "
871 "specifier %s at %L", token_to_string (t),
877 gfc_warning ("Period required in format "
878 "specifier %s at %L", token_to_string (t),
880 /* If we go to finished, we need to unwind this
881 before the next round. */
882 format_locus.nextc -= format_string_pos;
890 if (u != FMT_ZERO && u != FMT_POSINT)
892 error = nonneg_required;
899 /* Look for optional exponent. */
914 error = _("Positive exponent width required");
925 if (t != FMT_ZERO && t != FMT_POSINT)
927 error = nonneg_required;
930 else if (is_input && t == FMT_ZERO)
932 error = posint_required;
941 /* Warn if -std=legacy, otherwise error. */
942 if (gfc_option.warn_std != 0)
944 error = _("Period required in format specifier");
947 if (mode != MODE_FORMAT)
948 format_locus.nextc += format_string_pos;
949 gfc_warning ("Period required in format specifier at %L",
958 if (t != FMT_ZERO && t != FMT_POSINT)
960 error = nonneg_required;
967 if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
969 if (mode != MODE_FORMAT)
970 format_locus.nextc += format_string_pos;
971 gfc_warning ("The H format specifier at %L is"
972 " a Fortran 95 deleted feature", &format_locus);
974 if (mode == MODE_STRING)
976 format_string += value;
977 format_length -= value;
978 format_string_pos += repeat;
984 next_char (INSTRING_WARN);
994 if (t != FMT_ZERO && t != FMT_POSINT)
996 error = nonneg_required;
999 else if (is_input && t == FMT_ZERO)
1001 error = posint_required;
1008 if (t != FMT_PERIOD)
1017 if (t != FMT_ZERO && t != FMT_POSINT)
1019 error = nonneg_required;
1027 error = unexpected_element;
1032 /* Between a descriptor and what comes next. */
1050 goto optional_comma;
1053 error = unexpected_end;
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)
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;
1070 /* Optional comma is a weird between state where we've just finished
1071 reading a colon, slash, dollar or P descriptor. */
1088 /* Assume that we have another format item. */
1095 extension_optional_comma:
1096 /* As a GNU extension, permit a missing comma after a string literal. */
1113 goto optional_comma;
1116 error = unexpected_end;
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)
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;
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);
1141 gfc_error ("%s in format string at %L", error, &format_locus);
1150 /* Given an expression node that is a constant string, see if it looks
1151 like a format string. */
1154 check_format_string (gfc_expr *e, bool is_input)
1158 if (!e || e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1162 format_string = e->value.character.string;
1164 /* More elaborate measures are needed to show where a problem is within a
1165 format string that has been calculated, but that's probably not worth the
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,
1173 if (rv == SUCCESS && e->value.character.length > format_string_pos)
1174 for (i=e->value.character.length-1;i>format_string_pos-1;i--)
1175 if (e->value.character.string[i] != ' ')
1177 format_locus.nextc += format_length + 1;
1178 gfc_warning ("Extraneous characters in format at %L", &format_locus);
1185 /************ Fortran 95 I/O statement matchers *************/
1187 /* Match a FORMAT statement. This amounts to actually parsing the
1188 format descriptors in order to correctly locate the end of the
1192 gfc_match_format (void)
1197 if (gfc_current_ns->proc_name
1198 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)
1200 gfc_error ("Format statement in module main block at %C");
1204 if (gfc_statement_label == NULL)
1206 gfc_error ("Missing format label at %C");
1209 gfc_gobble_whitespace ();
1214 start = gfc_current_locus;
1216 if (check_format (false) == FAILURE)
1219 if (gfc_match_eos () != MATCH_YES)
1221 gfc_syntax_error (ST_FORMAT);
1225 /* The label doesn't get created until after the statement is done
1226 being matched, so we have to leave the string for later. */
1228 gfc_current_locus = start; /* Back to the beginning */
1231 new_st.op = EXEC_NOP;
1233 e = gfc_get_character_expr (gfc_default_character_kind, &start,
1234 NULL, format_length);
1235 format_string = e->value.character.string;
1236 gfc_statement_label->format = e;
1239 check_format (false); /* Guaranteed to succeed */
1240 gfc_match_eos (); /* Guaranteed to succeed */
1246 /* Match an expression I/O tag of some sort. */
1249 match_etag (const io_tag *tag, gfc_expr **v)
1254 m = gfc_match (tag->spec);
1258 m = gfc_match (tag->value, &result);
1261 gfc_error ("Invalid value for %s specification at %C", tag->name);
1267 gfc_error ("Duplicate %s specification at %C", tag->name);
1268 gfc_free_expr (result);
1277 /* Match a variable I/O tag of some sort. */
1280 match_vtag (const io_tag *tag, gfc_expr **v)
1285 m = gfc_match (tag->spec);
1289 m = gfc_match (tag->value, &result);
1292 gfc_error ("Invalid value for %s specification at %C", tag->name);
1298 gfc_error ("Duplicate %s specification at %C", tag->name);
1299 gfc_free_expr (result);
1303 if (result->symtree->n.sym->attr.intent == INTENT_IN)
1305 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag->name);
1306 gfc_free_expr (result);
1310 bool impure = gfc_impure_variable (result->symtree->n.sym);
1311 if (impure && gfc_pure (NULL))
1313 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1315 gfc_free_expr (result);
1320 gfc_unset_implicit_pure (NULL);
1327 /* Match I/O tags that cause variables to become redefined. */
1330 match_out_tag (const io_tag *tag, gfc_expr **result)
1334 m = match_vtag (tag, result);
1336 gfc_check_do_variable ((*result)->symtree);
1342 /* Match a label I/O tag. */
1345 match_ltag (const io_tag *tag, gfc_st_label ** label)
1351 m = gfc_match (tag->spec);
1355 m = gfc_match (tag->value, label);
1358 gfc_error ("Invalid value for %s specification at %C", tag->name);
1364 gfc_error ("Duplicate %s label specification at %C", tag->name);
1368 if (gfc_reference_st_label (*label, ST_LABEL_TARGET) == FAILURE)
1375 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1378 resolve_tag_format (const gfc_expr *e)
1380 if (e->expr_type == EXPR_CONSTANT
1381 && (e->ts.type != BT_CHARACTER
1382 || e->ts.kind != gfc_default_character_kind))
1384 gfc_error ("Constant expression in FORMAT tag at %L must be "
1385 "of type default CHARACTER", &e->where);
1389 /* If e's rank is zero and e is not an element of an array, it should be
1390 of integer or character type. The integer variable should be
1393 && (e->expr_type != EXPR_VARIABLE
1394 || e->symtree == NULL
1395 || e->symtree->n.sym->as == NULL
1396 || e->symtree->n.sym->as->rank == 0))
1398 if ((e->ts.type != BT_CHARACTER
1399 || e->ts.kind != gfc_default_character_kind)
1400 && e->ts.type != BT_INTEGER)
1402 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1403 "or of INTEGER", &e->where);
1406 else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
1408 if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
1409 "variable in FORMAT tag at %L", &e->where)
1412 if (e->symtree->n.sym->attr.assign != 1)
1414 gfc_error ("Variable '%s' at %L has not been assigned a "
1415 "format label", e->symtree->n.sym->name, &e->where);
1419 else if (e->ts.type == BT_INTEGER)
1421 gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
1422 "variable", gfc_basic_typename (e->ts.type), &e->where);
1429 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1430 It may be assigned an Hollerith constant. */
1431 if (e->ts.type != BT_CHARACTER)
1433 if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
1434 "in FORMAT tag at %L", &e->where) == FAILURE)
1437 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SHAPE)
1439 gfc_error ("Non-character assumed shape array element in FORMAT"
1440 " tag at %L", &e->where);
1444 if (e->rank == 0 && e->symtree->n.sym->as->type == AS_ASSUMED_SIZE)
1446 gfc_error ("Non-character assumed size array element in FORMAT"
1447 " tag at %L", &e->where);
1451 if (e->rank == 0 && e->symtree->n.sym->attr.pointer)
1453 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1463 /* Do expression resolution and type-checking on an expression tag. */
1466 resolve_tag (const io_tag *tag, gfc_expr *e)
1471 if (gfc_resolve_expr (e) == FAILURE)
1474 if (tag == &tag_format)
1475 return resolve_tag_format (e);
1477 if (e->ts.type != tag->type)
1479 gfc_error ("%s tag at %L must be of type %s", tag->name,
1480 &e->where, gfc_basic_typename (tag->type));
1484 if (e->ts.type == BT_CHARACTER && e->ts.kind != gfc_default_character_kind)
1486 gfc_error ("%s tag at %L must be a character string of default kind",
1487 tag->name, &e->where);
1493 gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
1497 if (tag == &tag_iomsg)
1499 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
1500 &e->where) == FAILURE)
1504 if ((tag == &tag_iostat || tag == &tag_size || tag == &tag_iolength)
1505 && e->ts.kind != gfc_default_integer_kind)
1507 if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
1508 "INTEGER in %s tag at %L", tag->name, &e->where)
1513 if (tag == &tag_exist && e->ts.kind != gfc_default_logical_kind)
1515 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Nondefault LOGICAL "
1516 "in %s tag at %L", tag->name, &e->where)
1521 if (tag == &tag_newunit)
1523 if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: NEWUNIT specifier"
1524 " at %L", &e->where) == FAILURE)
1528 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1529 if (tag == &tag_newunit || tag == &tag_iostat
1530 || tag == &tag_size || tag == &tag_iomsg)
1534 sprintf (context, _("%s tag"), tag->name);
1535 if (gfc_check_vardef_context (e, false, false, context) == FAILURE)
1539 if (tag == &tag_convert)
1541 if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
1542 &e->where) == FAILURE)
1550 /* Match a single tag of an OPEN statement. */
1553 match_open_element (gfc_open *open)
1557 m = match_etag (&tag_e_async, &open->asynchronous);
1560 m = match_etag (&tag_unit, &open->unit);
1563 m = match_out_tag (&tag_iomsg, &open->iomsg);
1566 m = match_out_tag (&tag_iostat, &open->iostat);
1569 m = match_etag (&tag_file, &open->file);
1572 m = match_etag (&tag_status, &open->status);
1575 m = match_etag (&tag_e_access, &open->access);
1578 m = match_etag (&tag_e_form, &open->form);
1581 m = match_etag (&tag_e_recl, &open->recl);
1584 m = match_etag (&tag_e_blank, &open->blank);
1587 m = match_etag (&tag_e_position, &open->position);
1590 m = match_etag (&tag_e_action, &open->action);
1593 m = match_etag (&tag_e_delim, &open->delim);
1596 m = match_etag (&tag_e_pad, &open->pad);
1599 m = match_etag (&tag_e_decimal, &open->decimal);
1602 m = match_etag (&tag_e_encoding, &open->encoding);
1605 m = match_etag (&tag_e_round, &open->round);
1608 m = match_etag (&tag_e_sign, &open->sign);
1611 m = match_ltag (&tag_err, &open->err);
1614 m = match_etag (&tag_convert, &open->convert);
1617 m = match_out_tag (&tag_newunit, &open->newunit);
1625 /* Free the gfc_open structure and all the expressions it contains. */
1628 gfc_free_open (gfc_open *open)
1633 gfc_free_expr (open->unit);
1634 gfc_free_expr (open->iomsg);
1635 gfc_free_expr (open->iostat);
1636 gfc_free_expr (open->file);
1637 gfc_free_expr (open->status);
1638 gfc_free_expr (open->access);
1639 gfc_free_expr (open->form);
1640 gfc_free_expr (open->recl);
1641 gfc_free_expr (open->blank);
1642 gfc_free_expr (open->position);
1643 gfc_free_expr (open->action);
1644 gfc_free_expr (open->delim);
1645 gfc_free_expr (open->pad);
1646 gfc_free_expr (open->decimal);
1647 gfc_free_expr (open->encoding);
1648 gfc_free_expr (open->round);
1649 gfc_free_expr (open->sign);
1650 gfc_free_expr (open->convert);
1651 gfc_free_expr (open->asynchronous);
1652 gfc_free_expr (open->newunit);
1657 /* Resolve everything in a gfc_open structure. */
1660 gfc_resolve_open (gfc_open *open)
1663 RESOLVE_TAG (&tag_unit, open->unit);
1664 RESOLVE_TAG (&tag_iomsg, open->iomsg);
1665 RESOLVE_TAG (&tag_iostat, open->iostat);
1666 RESOLVE_TAG (&tag_file, open->file);
1667 RESOLVE_TAG (&tag_status, open->status);
1668 RESOLVE_TAG (&tag_e_access, open->access);
1669 RESOLVE_TAG (&tag_e_form, open->form);
1670 RESOLVE_TAG (&tag_e_recl, open->recl);
1671 RESOLVE_TAG (&tag_e_blank, open->blank);
1672 RESOLVE_TAG (&tag_e_position, open->position);
1673 RESOLVE_TAG (&tag_e_action, open->action);
1674 RESOLVE_TAG (&tag_e_delim, open->delim);
1675 RESOLVE_TAG (&tag_e_pad, open->pad);
1676 RESOLVE_TAG (&tag_e_decimal, open->decimal);
1677 RESOLVE_TAG (&tag_e_encoding, open->encoding);
1678 RESOLVE_TAG (&tag_e_async, open->asynchronous);
1679 RESOLVE_TAG (&tag_e_round, open->round);
1680 RESOLVE_TAG (&tag_e_sign, open->sign);
1681 RESOLVE_TAG (&tag_convert, open->convert);
1682 RESOLVE_TAG (&tag_newunit, open->newunit);
1684 if (gfc_reference_st_label (open->err, ST_LABEL_TARGET) == FAILURE)
1691 /* Check if a given value for a SPECIFIER is either in the list of values
1692 allowed in F95 or F2003, issuing an error message and returning a zero
1693 value if it is not allowed. */
1696 compare_to_allowed_values (const char *specifier, const char *allowed[],
1697 const char *allowed_f2003[],
1698 const char *allowed_gnu[], gfc_char_t *value,
1699 const char *statement, bool warn)
1704 len = gfc_wide_strlen (value);
1707 for (len--; len > 0; len--)
1708 if (value[len] != ' ')
1713 for (i = 0; allowed[i]; i++)
1714 if (len == strlen (allowed[i])
1715 && gfc_wide_strncasecmp (value, allowed[i], strlen (allowed[i])) == 0)
1718 for (i = 0; allowed_f2003 && allowed_f2003[i]; i++)
1719 if (len == strlen (allowed_f2003[i])
1720 && gfc_wide_strncasecmp (value, allowed_f2003[i],
1721 strlen (allowed_f2003[i])) == 0)
1723 notification n = gfc_notification_std (GFC_STD_F2003);
1725 if (n == WARNING || (warn && n == ERROR))
1727 gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1728 "has value '%s'", specifier, statement,
1735 gfc_notify_std (GFC_STD_F2003, "Fortran 2003: %s specifier in "
1736 "%s statement at %C has value '%s'", specifier,
1737 statement, allowed_f2003[i]);
1745 for (i = 0; allowed_gnu && allowed_gnu[i]; i++)
1746 if (len == strlen (allowed_gnu[i])
1747 && gfc_wide_strncasecmp (value, allowed_gnu[i],
1748 strlen (allowed_gnu[i])) == 0)
1750 notification n = gfc_notification_std (GFC_STD_GNU);
1752 if (n == WARNING || (warn && n == ERROR))
1754 gfc_warning ("Extension: %s specifier in %s statement at %C "
1755 "has value '%s'", specifier, statement,
1762 gfc_notify_std (GFC_STD_GNU, "Extension: %s specifier in "
1763 "%s statement at %C has value '%s'", specifier,
1764 statement, allowed_gnu[i]);
1774 char *s = gfc_widechar_to_char (value, -1);
1775 gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1776 specifier, statement, s);
1782 char *s = gfc_widechar_to_char (value, -1);
1783 gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1784 specifier, statement, s);
1791 /* Match an OPEN statement. */
1794 gfc_match_open (void)
1800 m = gfc_match_char ('(');
1804 open = XCNEW (gfc_open);
1806 m = match_open_element (open);
1808 if (m == MATCH_ERROR)
1812 m = gfc_match_expr (&open->unit);
1813 if (m == MATCH_ERROR)
1819 if (gfc_match_char (')') == MATCH_YES)
1821 if (gfc_match_char (',') != MATCH_YES)
1824 m = match_open_element (open);
1825 if (m == MATCH_ERROR)
1831 if (gfc_match_eos () == MATCH_NO)
1834 if (gfc_pure (NULL))
1836 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1840 gfc_unset_implicit_pure (NULL);
1842 warn = (open->err || open->iostat) ? true : false;
1844 /* Checks on NEWUNIT specifier. */
1849 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1853 if (!(open->file || (open->status
1854 && gfc_wide_strncasecmp (open->status->value.character.string,
1855 "scratch", 7) == 0)))
1857 gfc_error ("NEWUNIT specifier must have FILE= "
1858 "or STATUS='scratch' at %C");
1862 else if (!open->unit)
1864 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1868 /* Checks on the ACCESS specifier. */
1869 if (open->access && open->access->expr_type == EXPR_CONSTANT)
1871 static const char *access_f95[] = { "SEQUENTIAL", "DIRECT", NULL };
1872 static const char *access_f2003[] = { "STREAM", NULL };
1873 static const char *access_gnu[] = { "APPEND", NULL };
1875 if (!compare_to_allowed_values ("ACCESS", access_f95, access_f2003,
1877 open->access->value.character.string,
1882 /* Checks on the ACTION specifier. */
1883 if (open->action && open->action->expr_type == EXPR_CONSTANT)
1885 static const char *action[] = { "READ", "WRITE", "READWRITE", NULL };
1887 if (!compare_to_allowed_values ("ACTION", action, NULL, NULL,
1888 open->action->value.character.string,
1893 /* Checks on the ASYNCHRONOUS specifier. */
1894 if (open->asynchronous)
1896 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ASYNCHRONOUS= at %C "
1897 "not allowed in Fortran 95") == FAILURE)
1900 if (open->asynchronous->expr_type == EXPR_CONSTANT)
1902 static const char * asynchronous[] = { "YES", "NO", NULL };
1904 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous,
1905 NULL, NULL, open->asynchronous->value.character.string,
1911 /* Checks on the BLANK specifier. */
1914 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
1915 "not allowed in Fortran 95") == FAILURE)
1918 if (open->blank->expr_type == EXPR_CONSTANT)
1920 static const char *blank[] = { "ZERO", "NULL", NULL };
1922 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
1923 open->blank->value.character.string,
1929 /* Checks on the DECIMAL specifier. */
1932 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
1933 "not allowed in Fortran 95") == FAILURE)
1936 if (open->decimal->expr_type == EXPR_CONSTANT)
1938 static const char * decimal[] = { "COMMA", "POINT", NULL };
1940 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
1941 open->decimal->value.character.string,
1947 /* Checks on the DELIM specifier. */
1950 if (open->delim->expr_type == EXPR_CONSTANT)
1952 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
1954 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
1955 open->delim->value.character.string,
1961 /* Checks on the ENCODING specifier. */
1964 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENCODING= at %C "
1965 "not allowed in Fortran 95") == FAILURE)
1968 if (open->encoding->expr_type == EXPR_CONSTANT)
1970 static const char * encoding[] = { "DEFAULT", "UTF-8", NULL };
1972 if (!compare_to_allowed_values ("ENCODING", encoding, NULL, NULL,
1973 open->encoding->value.character.string,
1979 /* Checks on the FORM specifier. */
1980 if (open->form && open->form->expr_type == EXPR_CONSTANT)
1982 static const char *form[] = { "FORMATTED", "UNFORMATTED", NULL };
1984 if (!compare_to_allowed_values ("FORM", form, NULL, NULL,
1985 open->form->value.character.string,
1990 /* Checks on the PAD specifier. */
1991 if (open->pad && open->pad->expr_type == EXPR_CONSTANT)
1993 static const char *pad[] = { "YES", "NO", NULL };
1995 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
1996 open->pad->value.character.string,
2001 /* Checks on the POSITION specifier. */
2002 if (open->position && open->position->expr_type == EXPR_CONSTANT)
2004 static const char *position[] = { "ASIS", "REWIND", "APPEND", NULL };
2006 if (!compare_to_allowed_values ("POSITION", position, NULL, NULL,
2007 open->position->value.character.string,
2012 /* Checks on the ROUND specifier. */
2015 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ROUND= at %C "
2016 "not allowed in Fortran 95") == FAILURE)
2019 if (open->round->expr_type == EXPR_CONSTANT)
2021 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
2022 "COMPATIBLE", "PROCESSOR_DEFINED",
2025 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
2026 open->round->value.character.string,
2032 /* Checks on the SIGN specifier. */
2035 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
2036 "not allowed in Fortran 95") == FAILURE)
2039 if (open->sign->expr_type == EXPR_CONSTANT)
2041 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2044 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
2045 open->sign->value.character.string,
2051 #define warn_or_error(...) \
2054 gfc_warning (__VA_ARGS__); \
2057 gfc_error (__VA_ARGS__); \
2062 /* Checks on the RECL specifier. */
2063 if (open->recl && open->recl->expr_type == EXPR_CONSTANT
2064 && open->recl->ts.type == BT_INTEGER
2065 && mpz_sgn (open->recl->value.integer) != 1)
2067 warn_or_error ("RECL in OPEN statement at %C must be positive");
2070 /* Checks on the STATUS specifier. */
2071 if (open->status && open->status->expr_type == EXPR_CONSTANT)
2073 static const char *status[] = { "OLD", "NEW", "SCRATCH",
2074 "REPLACE", "UNKNOWN", NULL };
2076 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2077 open->status->value.character.string,
2081 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2082 the FILE= specifier shall appear. */
2083 if (open->file == NULL
2084 && (gfc_wide_strncasecmp (open->status->value.character.string,
2086 || gfc_wide_strncasecmp (open->status->value.character.string,
2089 char *s = gfc_widechar_to_char (open->status->value.character.string,
2091 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2092 "'%s' and no FILE specifier is present", s);
2096 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2097 the FILE= specifier shall not appear. */
2098 if (gfc_wide_strncasecmp (open->status->value.character.string,
2099 "scratch", 7) == 0 && open->file)
2101 warn_or_error ("The STATUS specified in OPEN statement at %C "
2102 "cannot have the value SCRATCH if a FILE specifier "
2107 /* Things that are not allowed for unformatted I/O. */
2108 if (open->form && open->form->expr_type == EXPR_CONSTANT
2109 && (open->delim || open->decimal || open->encoding || open->round
2110 || open->sign || open->pad || open->blank)
2111 && gfc_wide_strncasecmp (open->form->value.character.string,
2112 "unformatted", 11) == 0)
2114 const char *spec = (open->delim ? "DELIM "
2115 : (open->pad ? "PAD " : open->blank
2118 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2119 "unformatted I/O", spec);
2122 if (open->recl && open->access && open->access->expr_type == EXPR_CONSTANT
2123 && gfc_wide_strncasecmp (open->access->value.character.string,
2126 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2131 && open->access && open->access->expr_type == EXPR_CONSTANT
2132 && !(gfc_wide_strncasecmp (open->access->value.character.string,
2133 "sequential", 10) == 0
2134 || gfc_wide_strncasecmp (open->access->value.character.string,
2136 || gfc_wide_strncasecmp (open->access->value.character.string,
2139 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2140 "for stream or sequential ACCESS");
2143 #undef warn_or_error
2145 new_st.op = EXEC_OPEN;
2146 new_st.ext.open = open;
2150 gfc_syntax_error (ST_OPEN);
2153 gfc_free_open (open);
2158 /* Free a gfc_close structure an all its expressions. */
2161 gfc_free_close (gfc_close *close)
2166 gfc_free_expr (close->unit);
2167 gfc_free_expr (close->iomsg);
2168 gfc_free_expr (close->iostat);
2169 gfc_free_expr (close->status);
2174 /* Match elements of a CLOSE statement. */
2177 match_close_element (gfc_close *close)
2181 m = match_etag (&tag_unit, &close->unit);
2184 m = match_etag (&tag_status, &close->status);
2187 m = match_out_tag (&tag_iomsg, &close->iomsg);
2190 m = match_out_tag (&tag_iostat, &close->iostat);
2193 m = match_ltag (&tag_err, &close->err);
2201 /* Match a CLOSE statement. */
2204 gfc_match_close (void)
2210 m = gfc_match_char ('(');
2214 close = XCNEW (gfc_close);
2216 m = match_close_element (close);
2218 if (m == MATCH_ERROR)
2222 m = gfc_match_expr (&close->unit);
2225 if (m == MATCH_ERROR)
2231 if (gfc_match_char (')') == MATCH_YES)
2233 if (gfc_match_char (',') != MATCH_YES)
2236 m = match_close_element (close);
2237 if (m == MATCH_ERROR)
2243 if (gfc_match_eos () == MATCH_NO)
2246 if (gfc_pure (NULL))
2248 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2252 gfc_unset_implicit_pure (NULL);
2254 warn = (close->iostat || close->err) ? true : false;
2256 /* Checks on the STATUS specifier. */
2257 if (close->status && close->status->expr_type == EXPR_CONSTANT)
2259 static const char *status[] = { "KEEP", "DELETE", NULL };
2261 if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
2262 close->status->value.character.string,
2267 new_st.op = EXEC_CLOSE;
2268 new_st.ext.close = close;
2272 gfc_syntax_error (ST_CLOSE);
2275 gfc_free_close (close);
2280 /* Resolve everything in a gfc_close structure. */
2283 gfc_resolve_close (gfc_close *close)
2285 RESOLVE_TAG (&tag_unit, close->unit);
2286 RESOLVE_TAG (&tag_iomsg, close->iomsg);
2287 RESOLVE_TAG (&tag_iostat, close->iostat);
2288 RESOLVE_TAG (&tag_status, close->status);
2290 if (gfc_reference_st_label (close->err, ST_LABEL_TARGET) == FAILURE)
2293 if (close->unit == NULL)
2295 /* Find a locus from one of the arguments to close, when UNIT is
2297 locus loc = gfc_current_locus;
2299 loc = close->status->where;
2300 else if (close->iostat)
2301 loc = close->iostat->where;
2302 else if (close->iomsg)
2303 loc = close->iomsg->where;
2304 else if (close->err)
2305 loc = close->err->where;
2307 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc);
2311 if (close->unit->expr_type == EXPR_CONSTANT
2312 && close->unit->ts.type == BT_INTEGER
2313 && mpz_sgn (close->unit->value.integer) < 0)
2315 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2316 &close->unit->where);
2323 /* Free a gfc_filepos structure. */
2326 gfc_free_filepos (gfc_filepos *fp)
2328 gfc_free_expr (fp->unit);
2329 gfc_free_expr (fp->iomsg);
2330 gfc_free_expr (fp->iostat);
2335 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2338 match_file_element (gfc_filepos *fp)
2342 m = match_etag (&tag_unit, &fp->unit);
2345 m = match_out_tag (&tag_iomsg, &fp->iomsg);
2348 m = match_out_tag (&tag_iostat, &fp->iostat);
2351 m = match_ltag (&tag_err, &fp->err);
2359 /* Match the second half of the file-positioning statements, REWIND,
2360 BACKSPACE, ENDFILE, or the FLUSH statement. */
2363 match_filepos (gfc_statement st, gfc_exec_op op)
2368 fp = XCNEW (gfc_filepos);
2370 if (gfc_match_char ('(') == MATCH_NO)
2372 m = gfc_match_expr (&fp->unit);
2373 if (m == MATCH_ERROR)
2381 m = match_file_element (fp);
2382 if (m == MATCH_ERROR)
2386 m = gfc_match_expr (&fp->unit);
2387 if (m == MATCH_ERROR)
2395 if (gfc_match_char (')') == MATCH_YES)
2397 if (gfc_match_char (',') != MATCH_YES)
2400 m = match_file_element (fp);
2401 if (m == MATCH_ERROR)
2408 if (gfc_match_eos () != MATCH_YES)
2411 if (gfc_pure (NULL))
2413 gfc_error ("%s statement not allowed in PURE procedure at %C",
2414 gfc_ascii_statement (st));
2419 gfc_unset_implicit_pure (NULL);
2422 new_st.ext.filepos = fp;
2426 gfc_syntax_error (st);
2429 gfc_free_filepos (fp);
2435 gfc_resolve_filepos (gfc_filepos *fp)
2437 RESOLVE_TAG (&tag_unit, fp->unit);
2438 RESOLVE_TAG (&tag_iostat, fp->iostat);
2439 RESOLVE_TAG (&tag_iomsg, fp->iomsg);
2440 if (gfc_reference_st_label (fp->err, ST_LABEL_TARGET) == FAILURE)
2443 if (fp->unit->expr_type == EXPR_CONSTANT
2444 && fp->unit->ts.type == BT_INTEGER
2445 && mpz_sgn (fp->unit->value.integer) < 0)
2447 gfc_error ("UNIT number in statement at %L must be non-negative",
2455 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2456 and the FLUSH statement. */
2459 gfc_match_endfile (void)
2461 return match_filepos (ST_END_FILE, EXEC_ENDFILE);
2465 gfc_match_backspace (void)
2467 return match_filepos (ST_BACKSPACE, EXEC_BACKSPACE);
2471 gfc_match_rewind (void)
2473 return match_filepos (ST_REWIND, EXEC_REWIND);
2477 gfc_match_flush (void)
2479 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C")
2483 return match_filepos (ST_FLUSH, EXEC_FLUSH);
2486 /******************** Data Transfer Statements *********************/
2488 /* Return a default unit number. */
2491 default_unit (io_kind k)
2500 return gfc_get_int_expr (gfc_default_integer_kind, NULL, unit);
2504 /* Match a unit specification for a data transfer statement. */
2507 match_dt_unit (io_kind k, gfc_dt *dt)
2511 if (gfc_match_char ('*') == MATCH_YES)
2513 if (dt->io_unit != NULL)
2516 dt->io_unit = default_unit (k);
2520 if (gfc_match_expr (&e) == MATCH_YES)
2522 if (dt->io_unit != NULL)
2535 gfc_error ("Duplicate UNIT specification at %C");
2540 /* Match a format specification. */
2543 match_dt_format (gfc_dt *dt)
2547 gfc_st_label *label;
2550 where = gfc_current_locus;
2552 if (gfc_match_char ('*') == MATCH_YES)
2554 if (dt->format_expr != NULL || dt->format_label != NULL)
2557 dt->format_label = &format_asterisk;
2561 if ((m = gfc_match_st_label (&label)) == MATCH_YES)
2565 /* Need to check if the format label is actually either an operand
2566 to a user-defined operator or is a kind type parameter. That is,
2567 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2568 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2570 gfc_gobble_whitespace ();
2571 c = gfc_peek_ascii_char ();
2572 if (c == '.' || c == '_')
2573 gfc_current_locus = where;
2576 if (dt->format_expr != NULL || dt->format_label != NULL)
2578 gfc_free_st_label (label);
2582 if (gfc_reference_st_label (label, ST_LABEL_FORMAT) == FAILURE)
2585 dt->format_label = label;
2589 else if (m == MATCH_ERROR)
2590 /* The label was zero or too large. Emit the correct diagnosis. */
2593 if (gfc_match_expr (&e) == MATCH_YES)
2595 if (dt->format_expr != NULL || dt->format_label != NULL)
2600 dt->format_expr = e;
2604 gfc_current_locus = where; /* The only case where we have to restore */
2609 gfc_error ("Duplicate format specification at %C");
2614 /* Traverse a namelist that is part of a READ statement to make sure
2615 that none of the variables in the namelist are INTENT(IN). Returns
2616 nonzero if we find such a variable. */
2619 check_namelist (gfc_symbol *sym)
2623 for (p = sym->namelist; p; p = p->next)
2624 if (p->sym->attr.intent == INTENT_IN)
2626 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2627 p->sym->name, sym->name);
2635 /* Match a single data transfer element. */
2638 match_dt_element (io_kind k, gfc_dt *dt)
2640 char name[GFC_MAX_SYMBOL_LEN + 1];
2644 if (gfc_match (" unit =") == MATCH_YES)
2646 m = match_dt_unit (k, dt);
2651 if (gfc_match (" fmt =") == MATCH_YES)
2653 m = match_dt_format (dt);
2658 if (gfc_match (" nml = %n", name) == MATCH_YES)
2660 if (dt->namelist != NULL)
2662 gfc_error ("Duplicate NML specification at %C");
2666 if (gfc_find_symbol (name, NULL, 1, &sym))
2669 if (sym == NULL || sym->attr.flavor != FL_NAMELIST)
2671 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2672 sym != NULL ? sym->name : name);
2677 if (k == M_READ && check_namelist (sym))
2683 m = match_etag (&tag_e_async, &dt->asynchronous);
2686 m = match_etag (&tag_e_blank, &dt->blank);
2689 m = match_etag (&tag_e_delim, &dt->delim);
2692 m = match_etag (&tag_e_pad, &dt->pad);
2695 m = match_etag (&tag_e_sign, &dt->sign);
2698 m = match_etag (&tag_e_round, &dt->round);
2701 m = match_out_tag (&tag_id, &dt->id);
2704 m = match_etag (&tag_e_decimal, &dt->decimal);
2707 m = match_etag (&tag_rec, &dt->rec);
2710 m = match_etag (&tag_spos, &dt->pos);
2713 m = match_out_tag (&tag_iomsg, &dt->iomsg);
2716 m = match_out_tag (&tag_iostat, &dt->iostat);
2719 m = match_ltag (&tag_err, &dt->err);
2721 dt->err_where = gfc_current_locus;
2724 m = match_etag (&tag_advance, &dt->advance);
2727 m = match_out_tag (&tag_size, &dt->size);
2731 m = match_ltag (&tag_end, &dt->end);
2736 gfc_error ("END tag at %C not allowed in output statement");
2739 dt->end_where = gfc_current_locus;
2744 m = match_ltag (&tag_eor, &dt->eor);
2746 dt->eor_where = gfc_current_locus;
2754 /* Free a data transfer structure and everything below it. */
2757 gfc_free_dt (gfc_dt *dt)
2762 gfc_free_expr (dt->io_unit);
2763 gfc_free_expr (dt->format_expr);
2764 gfc_free_expr (dt->rec);
2765 gfc_free_expr (dt->advance);
2766 gfc_free_expr (dt->iomsg);
2767 gfc_free_expr (dt->iostat);
2768 gfc_free_expr (dt->size);
2769 gfc_free_expr (dt->pad);
2770 gfc_free_expr (dt->delim);
2771 gfc_free_expr (dt->sign);
2772 gfc_free_expr (dt->round);
2773 gfc_free_expr (dt->blank);
2774 gfc_free_expr (dt->decimal);
2775 gfc_free_expr (dt->pos);
2776 gfc_free_expr (dt->dt_io_kind);
2777 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2782 /* Resolve everything in a gfc_dt structure. */
2785 gfc_resolve_dt (gfc_dt *dt, locus *loc)
2790 /* This is set in any case. */
2791 gcc_assert (dt->dt_io_kind);
2792 k = dt->dt_io_kind->value.iokind;
2794 RESOLVE_TAG (&tag_format, dt->format_expr);
2795 RESOLVE_TAG (&tag_rec, dt->rec);
2796 RESOLVE_TAG (&tag_spos, dt->pos);
2797 RESOLVE_TAG (&tag_advance, dt->advance);
2798 RESOLVE_TAG (&tag_id, dt->id);
2799 RESOLVE_TAG (&tag_iomsg, dt->iomsg);
2800 RESOLVE_TAG (&tag_iostat, dt->iostat);
2801 RESOLVE_TAG (&tag_size, dt->size);
2802 RESOLVE_TAG (&tag_e_pad, dt->pad);
2803 RESOLVE_TAG (&tag_e_delim, dt->delim);
2804 RESOLVE_TAG (&tag_e_sign, dt->sign);
2805 RESOLVE_TAG (&tag_e_round, dt->round);
2806 RESOLVE_TAG (&tag_e_blank, dt->blank);
2807 RESOLVE_TAG (&tag_e_decimal, dt->decimal);
2808 RESOLVE_TAG (&tag_e_async, dt->asynchronous);
2813 gfc_error ("UNIT not specified at %L", loc);
2817 if (gfc_resolve_expr (e) == SUCCESS
2818 && (e->ts.type != BT_INTEGER
2819 && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE)))
2821 /* If there is no extra comma signifying the "format" form of the IO
2822 statement, then this must be an error. */
2823 if (!dt->extra_comma)
2825 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2826 "or a CHARACTER variable", &e->where);
2831 /* At this point, we have an extra comma. If io_unit has arrived as
2832 type character, we assume its really the "format" form of the I/O
2833 statement. We set the io_unit to the default unit and format to
2834 the character expression. See F95 Standard section 9.4. */
2835 if (e->ts.type == BT_CHARACTER && (k == M_READ || k == M_PRINT))
2837 dt->format_expr = dt->io_unit;
2838 dt->io_unit = default_unit (k);
2840 /* Nullify this pointer now so that a warning/error is not
2841 triggered below for the "Extension". */
2842 dt->extra_comma = NULL;
2847 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2848 &dt->extra_comma->where);
2854 if (e->ts.type == BT_CHARACTER)
2856 if (gfc_has_vector_index (e))
2858 gfc_error ("Internal unit with vector subscript at %L", &e->where);
2862 /* If we are writing, make sure the internal unit can be changed. */
2863 gcc_assert (k != M_PRINT);
2865 && gfc_check_vardef_context (e, false, false,
2866 _("internal unit in WRITE")) == FAILURE)
2870 if (e->rank && e->ts.type != BT_CHARACTER)
2872 gfc_error ("External IO UNIT cannot be an array at %L", &e->where);
2876 if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_INTEGER
2877 && mpz_sgn (e->value.integer) < 0)
2879 gfc_error ("UNIT number in statement at %L must be non-negative",
2884 /* If we are reading and have a namelist, check that all namelist symbols
2885 can appear in a variable definition context. */
2886 if (k == M_READ && dt->namelist)
2889 for (n = dt->namelist->namelist; n; n = n->next)
2894 e = gfc_get_variable_expr (gfc_find_sym_in_symtree (n->sym));
2895 t = gfc_check_vardef_context (e, false, false, NULL);
2900 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2901 " the symbol '%s' which may not appear in a"
2902 " variable definition context",
2903 dt->namelist->name, loc, n->sym->name);
2910 && gfc_notify_std (GFC_STD_GNU, "Extension: Comma before i/o "
2911 "item list at %L", &dt->extra_comma->where) == FAILURE)
2916 if (gfc_reference_st_label (dt->err, ST_LABEL_TARGET) == FAILURE)
2918 if (dt->err->defined == ST_LABEL_UNKNOWN)
2920 gfc_error ("ERR tag label %d at %L not defined",
2921 dt->err->value, &dt->err_where);
2928 if (gfc_reference_st_label (dt->end, ST_LABEL_TARGET) == FAILURE)
2930 if (dt->end->defined == ST_LABEL_UNKNOWN)
2932 gfc_error ("END tag label %d at %L not defined",
2933 dt->end->value, &dt->end_where);
2940 if (gfc_reference_st_label (dt->eor, ST_LABEL_TARGET) == FAILURE)
2942 if (dt->eor->defined == ST_LABEL_UNKNOWN)
2944 gfc_error ("EOR tag label %d at %L not defined",
2945 dt->eor->value, &dt->eor_where);
2950 /* Check the format label actually exists. */
2951 if (dt->format_label && dt->format_label != &format_asterisk
2952 && dt->format_label->defined == ST_LABEL_UNKNOWN)
2954 gfc_error ("FORMAT label %d at %L not defined", dt->format_label->value,
2955 &dt->format_label->where);
2963 /* Given an io_kind, return its name. */
2966 io_kind_name (io_kind k)
2985 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2992 /* Match an IO iteration statement of the form:
2994 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2996 which is equivalent to a single IO element. This function is
2997 mutually recursive with match_io_element(). */
2999 static match match_io_element (io_kind, gfc_code **);
3002 match_io_iterator (io_kind k, gfc_code **result)
3004 gfc_code *head, *tail, *new_code;
3012 old_loc = gfc_current_locus;
3014 if (gfc_match_char ('(') != MATCH_YES)
3017 m = match_io_element (k, &head);
3020 if (m != MATCH_YES || gfc_match_char (',') != MATCH_YES)
3026 /* Can't be anything but an IO iterator. Build a list. */
3027 iter = gfc_get_iterator ();
3031 m = gfc_match_iterator (iter, 0);
3032 if (m == MATCH_ERROR)
3036 gfc_check_do_variable (iter->var->symtree);
3040 m = match_io_element (k, &new_code);
3041 if (m == MATCH_ERROR)
3050 tail = gfc_append_code (tail, new_code);
3052 if (gfc_match_char (',') != MATCH_YES)
3061 if (gfc_match_char (')') != MATCH_YES)
3064 new_code = gfc_get_code ();
3065 new_code->op = EXEC_DO;
3066 new_code->ext.iterator = iter;
3068 new_code->block = gfc_get_code ();
3069 new_code->block->op = EXEC_DO;
3070 new_code->block->next = head;
3076 gfc_error ("Syntax error in I/O iterator at %C");
3080 gfc_free_iterator (iter, 1);
3081 gfc_free_statements (head);
3082 gfc_current_locus = old_loc;
3087 /* Match a single element of an IO list, which is either a single
3088 expression or an IO Iterator. */
3091 match_io_element (io_kind k, gfc_code **cpp)
3099 m = match_io_iterator (k, cpp);
3105 m = gfc_match_variable (&expr, 0);
3107 gfc_error ("Expected variable in READ statement at %C");
3111 m = gfc_match_expr (&expr);
3113 gfc_error ("Expected expression in %s statement at %C",
3117 if (m == MATCH_YES && k == M_READ && gfc_check_do_variable (expr->symtree))
3122 gfc_free_expr (expr);
3126 cp = gfc_get_code ();
3127 cp->op = EXEC_TRANSFER;
3130 cp->ext.dt = current_dt;
3137 /* Match an I/O list, building gfc_code structures as we go. */
3140 match_io_list (io_kind k, gfc_code **head_p)
3142 gfc_code *head, *tail, *new_code;
3145 *head_p = head = tail = NULL;
3146 if (gfc_match_eos () == MATCH_YES)
3151 m = match_io_element (k, &new_code);
3152 if (m == MATCH_ERROR)
3157 tail = gfc_append_code (tail, new_code);
3161 if (gfc_match_eos () == MATCH_YES)
3163 if (gfc_match_char (',') != MATCH_YES)
3171 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3174 gfc_free_statements (head);
3179 /* Attach the data transfer end node. */
3182 terminate_io (gfc_code *io_code)
3186 if (io_code == NULL)
3187 io_code = new_st.block;
3189 c = gfc_get_code ();
3190 c->op = EXEC_DT_END;
3192 /* Point to structure that is already there */
3193 c->ext.dt = new_st.ext.dt;
3194 gfc_append_code (io_code, c);
3198 /* Check the constraints for a data transfer statement. The majority of the
3199 constraints appearing in 9.4 of the standard appear here. Some are handled
3200 in resolve_tag and others in gfc_resolve_dt. */
3203 check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code,
3206 #define io_constraint(condition,msg,arg)\
3209 gfc_error(msg,arg);\
3215 gfc_symbol *sym = NULL;
3216 bool warn, unformatted;
3218 warn = (dt->err || dt->iostat) ? true : false;
3219 unformatted = dt->format_expr == NULL && dt->format_label == NULL
3220 && dt->namelist == NULL;
3225 if (expr && expr->expr_type == EXPR_VARIABLE
3226 && expr->ts.type == BT_CHARACTER)
3228 sym = expr->symtree->n.sym;
3230 io_constraint (k == M_WRITE && sym->attr.intent == INTENT_IN,
3231 "Internal file at %L must not be INTENT(IN)",
3234 io_constraint (gfc_has_vector_index (dt->io_unit),
3235 "Internal file incompatible with vector subscript at %L",
3238 io_constraint (dt->rec != NULL,
3239 "REC tag at %L is incompatible with internal file",
3242 io_constraint (dt->pos != NULL,
3243 "POS tag at %L is incompatible with internal file",
3246 io_constraint (unformatted,
3247 "Unformatted I/O not allowed with internal unit at %L",
3248 &dt->io_unit->where);
3250 io_constraint (dt->asynchronous != NULL,
3251 "ASYNCHRONOUS tag at %L not allowed with internal file",
3252 &dt->asynchronous->where);
3254 if (dt->namelist != NULL)
3256 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Internal file "
3257 "at %L with namelist", &expr->where)
3262 io_constraint (dt->advance != NULL,
3263 "ADVANCE tag at %L is incompatible with internal file",
3264 &dt->advance->where);
3267 if (expr && expr->ts.type != BT_CHARACTER)
3270 io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE),
3271 "IO UNIT in %s statement at %C must be "
3272 "an internal file in a PURE procedure",
3275 if (k == M_READ || k == M_WRITE)
3276 gfc_unset_implicit_pure (NULL);
3281 io_constraint (dt->end, "END tag not allowed with output at %L",
3284 io_constraint (dt->eor, "EOR tag not allowed with output at %L",
3287 io_constraint (dt->blank, "BLANK= specifier not allowed with output at %L",
3290 io_constraint (dt->pad, "PAD= specifier not allowed with output at %L",
3293 io_constraint (dt->size, "SIZE= specifier not allowed with output at %L",
3298 io_constraint (dt->size && dt->advance == NULL,
3299 "SIZE tag at %L requires an ADVANCE tag",
3302 io_constraint (dt->eor && dt->advance == NULL,
3303 "EOR tag at %L requires an ADVANCE tag",
3307 if (dt->asynchronous)
3309 static const char * asynchronous[] = { "YES", "NO", NULL };
3311 if (gfc_reduce_init_expr (dt->asynchronous) != SUCCESS)
3313 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3314 "expression", &dt->asynchronous->where);
3318 if (!compare_to_allowed_values
3319 ("ASYNCHRONOUS", asynchronous, NULL, NULL,
3320 dt->asynchronous->value.character.string,
3321 io_kind_name (k), warn))
3329 || gfc_wide_strlen (dt->asynchronous->value.character.string) != 3
3330 || gfc_wide_strncasecmp (dt->asynchronous->value.character.string,
3332 io_constraint (not_yes,
3333 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3334 "specifier", &dt->id->where);
3339 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DECIMAL= at %C "
3340 "not allowed in Fortran 95") == FAILURE)
3343 if (dt->decimal->expr_type == EXPR_CONSTANT)
3345 static const char * decimal[] = { "COMMA", "POINT", NULL };
3347 if (!compare_to_allowed_values ("DECIMAL", decimal, NULL, NULL,
3348 dt->decimal->value.character.string,
3349 io_kind_name (k), warn))
3352 io_constraint (unformatted,
3353 "the DECIMAL= specifier at %L must be with an "
3354 "explicit format expression", &dt->decimal->where);
3360 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BLANK= at %C "
3361 "not allowed in Fortran 95") == FAILURE)
3364 if (dt->blank->expr_type == EXPR_CONSTANT)
3366 static const char * blank[] = { "NULL", "ZERO", NULL };
3368 if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL,
3369 dt->blank->value.character.string,
3370 io_kind_name (k), warn))
3373 io_constraint (unformatted,
3374 "the BLANK= specifier at %L must be with an "
3375 "explicit format expression", &dt->blank->where);
3381 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PAD= at %C "
3382 "not allowed in Fortran 95") == FAILURE)
3385 if (dt->pad->expr_type == EXPR_CONSTANT)
3387 static const char * pad[] = { "YES", "NO", NULL };
3389 if (!compare_to_allowed_values ("PAD", pad, NULL, NULL,
3390 dt->pad->value.character.string,
3391 io_kind_name (k), warn))
3394 io_constraint (unformatted,
3395 "the PAD= specifier at %L must be with an "
3396 "explicit format expression", &dt->pad->where);
3402 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ROUND= at %C "
3403 "not allowed in Fortran 95") == FAILURE)
3406 if (dt->round->expr_type == EXPR_CONSTANT)
3408 static const char * round[] = { "UP", "DOWN", "ZERO", "NEAREST",
3409 "COMPATIBLE", "PROCESSOR_DEFINED",
3412 if (!compare_to_allowed_values ("ROUND", round, NULL, NULL,
3413 dt->round->value.character.string,
3414 io_kind_name (k), warn))
3421 /* When implemented, change the following to use gfc_notify_std F2003.
3422 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
3423 "not allowed in Fortran 95") == FAILURE)
3424 return MATCH_ERROR; */
3425 if (dt->sign->expr_type == EXPR_CONSTANT)
3427 static const char * sign[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3430 if (!compare_to_allowed_values ("SIGN", sign, NULL, NULL,
3431 dt->sign->value.character.string,
3432 io_kind_name (k), warn))
3435 io_constraint (unformatted,
3436 "SIGN= specifier at %L must be with an "
3437 "explicit format expression", &dt->sign->where);
3439 io_constraint (k == M_READ,
3440 "SIGN= specifier at %L not allowed in a "
3441 "READ statement", &dt->sign->where);
3447 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: DELIM= at %C "
3448 "not allowed in Fortran 95") == FAILURE)
3451 if (dt->delim->expr_type == EXPR_CONSTANT)
3453 static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL };
3455 if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
3456 dt->delim->value.character.string,
3457 io_kind_name (k), warn))
3460 io_constraint (k == M_READ,
3461 "DELIM= specifier at %L not allowed in a "
3462 "READ statement", &dt->delim->where);
3464 io_constraint (dt->format_label != &format_asterisk
3465 && dt->namelist == NULL,
3466 "DELIM= specifier at %L must have FMT=*",
3469 io_constraint (unformatted && dt->namelist == NULL,
3470 "DELIM= specifier at %L must be with FMT=* or "
3471 "NML= specifier ", &dt->delim->where);
3477 io_constraint (io_code && dt->namelist,
3478 "NAMELIST cannot be followed by IO-list at %L",
3481 io_constraint (dt->format_expr,
3482 "IO spec-list cannot contain both NAMELIST group name "
3483 "and format specification at %L",
3484 &dt->format_expr->where);
3486 io_constraint (dt->format_label,
3487 "IO spec-list cannot contain both NAMELIST group name "
3488 "and format label at %L", spec_end);
3490 io_constraint (dt->rec,
3491 "NAMELIST IO is not allowed with a REC= specifier "
3492 "at %L", &dt->rec->where);
3494 io_constraint (dt->advance,
3495 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3496 "at %L", &dt->advance->where);
3501 io_constraint (dt->end,
3502 "An END tag is not allowed with a "
3503 "REC= specifier at %L", &dt->end_where);
3505 io_constraint (dt->format_label == &format_asterisk,
3506 "FMT=* is not allowed with a REC= specifier "
3509 io_constraint (dt->pos,
3510 "POS= is not allowed with REC= specifier "
3511 "at %L", &dt->pos->where);
3516 int not_yes, not_no;
3519 io_constraint (dt->format_label == &format_asterisk,
3520 "List directed format(*) is not allowed with a "
3521 "ADVANCE= specifier at %L.", &expr->where);
3523 io_constraint (unformatted,
3524 "the ADVANCE= specifier at %L must appear with an "
3525 "explicit format expression", &expr->where);
3527 if (expr->expr_type == EXPR_CONSTANT && expr->ts.type == BT_CHARACTER)
3529 const gfc_char_t *advance = expr->value.character.string;
3530 not_no = gfc_wide_strlen (advance) != 2
3531 || gfc_wide_strncasecmp (advance, "no", 2) != 0;
3532 not_yes = gfc_wide_strlen (advance) != 3
3533 || gfc_wide_strncasecmp (advance, "yes", 3) != 0;
3541 io_constraint (not_no && not_yes,
3542 "ADVANCE= specifier at %L must have value = "
3543 "YES or NO.", &expr->where);
3545 io_constraint (dt->size && not_no && k == M_READ,
3546 "SIZE tag at %L requires an ADVANCE = 'NO'",
3549 io_constraint (dt->eor && not_no && k == M_READ,
3550 "EOR tag at %L requires an ADVANCE = 'NO'",
3554 expr = dt->format_expr;
3555 if (gfc_simplify_expr (expr, 0) == FAILURE
3556 || check_format_string (expr, k == M_READ) == FAILURE)
3561 #undef io_constraint
3564 /* Match a READ, WRITE or PRINT statement. */
3567 match_io (io_kind k)
3569 char name[GFC_MAX_SYMBOL_LEN + 1];
3578 where = gfc_current_locus;
3580 current_dt = dt = XCNEW (gfc_dt);
3581 m = gfc_match_char ('(');
3584 where = gfc_current_locus;
3587 else if (k == M_PRINT)
3589 /* Treat the non-standard case of PRINT namelist. */
3590 if ((gfc_current_form == FORM_FIXED || gfc_peek_ascii_char () == ' ')
3591 && gfc_match_name (name) == MATCH_YES)
3593 gfc_find_symbol (name, NULL, 1, &sym);
3594 if (sym && sym->attr.flavor == FL_NAMELIST)
3596 if (gfc_notify_std (GFC_STD_GNU, "PRINT namelist at "
3597 "%C is an extension") == FAILURE)
3603 dt->io_unit = default_unit (k);
3608 gfc_current_locus = where;
3612 if (gfc_current_form == FORM_FREE)
3614 char c = gfc_peek_ascii_char ();
3615 if (c != ' ' && c != '*' && c != '\'' && c != '"')
3622 m = match_dt_format (dt);
3623 if (m == MATCH_ERROR)
3629 dt->io_unit = default_unit (k);
3634 /* Before issuing an error for a malformed 'print (1,*)' type of
3635 error, check for a default-char-expr of the form ('(I0)'). */
3636 if (k == M_PRINT && m == MATCH_YES)
3638 /* Reset current locus to get the initial '(' in an expression. */
3639 gfc_current_locus = where;
3640 dt->format_expr = NULL;
3641 m = match_dt_format (dt);
3643 if (m == MATCH_ERROR)
3645 if (m == MATCH_NO || dt->format_expr == NULL)
3649 dt->io_unit = default_unit (k);
3654 /* Match a control list */
3655 if (match_dt_element (k, dt) == MATCH_YES)
3657 if (match_dt_unit (k, dt) != MATCH_YES)
3660 if (gfc_match_char (')') == MATCH_YES)
3662 if (gfc_match_char (',') != MATCH_YES)
3665 m = match_dt_element (k, dt);
3668 if (m == MATCH_ERROR)
3671 m = match_dt_format (dt);
3674 if (m == MATCH_ERROR)
3677 where = gfc_current_locus;
3679 m = gfc_match_name (name);
3682 gfc_find_symbol (name, NULL, 1, &sym);
3683 if (sym && sym->attr.flavor == FL_NAMELIST)
3686 if (k == M_READ && check_namelist (sym))
3695 gfc_current_locus = where;
3697 goto loop; /* No matches, try regular elements */
3700 if (gfc_match_char (')') == MATCH_YES)
3702 if (gfc_match_char (',') != MATCH_YES)
3708 m = match_dt_element (k, dt);
3711 if (m == MATCH_ERROR)
3714 if (gfc_match_char (')') == MATCH_YES)
3716 if (gfc_match_char (',') != MATCH_YES)
3722 /* Used in check_io_constraints, where no locus is available. */
3723 spec_end = gfc_current_locus;
3725 /* Save the IO kind for later use. */
3726 dt->dt_io_kind = gfc_get_iokind_expr (&gfc_current_locus, k);
3728 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3729 to save the locus. This is used later when resolving transfer statements
3730 that might have a format expression without unit number. */
3731 if (!comma_flag && gfc_match_char (',') == MATCH_YES)
3732 dt->extra_comma = dt->dt_io_kind;
3735 if (gfc_match_eos () != MATCH_YES)
3737 if (comma_flag && gfc_match_char (',') != MATCH_YES)
3739 gfc_error ("Expected comma in I/O list at %C");
3744 m = match_io_list (k, &io_code);
3745 if (m == MATCH_ERROR)
3751 /* A full IO statement has been matched. Check the constraints. spec_end is
3752 supplied for cases where no locus is supplied. */
3753 m = check_io_constraints (k, dt, io_code, &spec_end);
3755 if (m == MATCH_ERROR)
3758 new_st.op = (k == M_READ) ? EXEC_READ : EXEC_WRITE;
3760 new_st.block = gfc_get_code ();
3761 new_st.block->op = new_st.op;
3762 new_st.block->next = io_code;
3764 terminate_io (io_code);
3769 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k));
3779 gfc_match_read (void)
3781 return match_io (M_READ);
3786 gfc_match_write (void)
3788 return match_io (M_WRITE);
3793 gfc_match_print (void)
3797 m = match_io (M_PRINT);
3801 if (gfc_pure (NULL))
3803 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3807 gfc_unset_implicit_pure (NULL);
3813 /* Free a gfc_inquire structure. */
3816 gfc_free_inquire (gfc_inquire *inquire)
3819 if (inquire == NULL)
3822 gfc_free_expr (inquire->unit);
3823 gfc_free_expr (inquire->file);
3824 gfc_free_expr (inquire->iomsg);
3825 gfc_free_expr (inquire->iostat);
3826 gfc_free_expr (inquire->exist);
3827 gfc_free_expr (inquire->opened);
3828 gfc_free_expr (inquire->number);
3829 gfc_free_expr (inquire->named);
3830 gfc_free_expr (inquire->name);
3831 gfc_free_expr (inquire->access);
3832 gfc_free_expr (inquire->sequential);
3833 gfc_free_expr (inquire->direct);
3834 gfc_free_expr (inquire->form);
3835 gfc_free_expr (inquire->formatted);
3836 gfc_free_expr (inquire->unformatted);
3837 gfc_free_expr (inquire->recl);
3838 gfc_free_expr (inquire->nextrec);
3839 gfc_free_expr (inquire->blank);
3840 gfc_free_expr (inquire->position);
3841 gfc_free_expr (inquire->action);
3842 gfc_free_expr (inquire->read);
3843 gfc_free_expr (inquire->write);
3844 gfc_free_expr (inquire->readwrite);
3845 gfc_free_expr (inquire->delim);
3846 gfc_free_expr (inquire->encoding);
3847 gfc_free_expr (inquire->pad);
3848 gfc_free_expr (inquire->iolength);
3849 gfc_free_expr (inquire->convert);
3850 gfc_free_expr (inquire->strm_pos);
3851 gfc_free_expr (inquire->asynchronous);
3852 gfc_free_expr (inquire->decimal);
3853 gfc_free_expr (inquire->pending);
3854 gfc_free_expr (inquire->id);
3855 gfc_free_expr (inquire->sign);
3856 gfc_free_expr (inquire->size);
3857 gfc_free_expr (inquire->round);
3862 /* Match an element of an INQUIRE statement. */
3864 #define RETM if (m != MATCH_NO) return m;
3867 match_inquire_element (gfc_inquire *inquire)
3871 m = match_etag (&tag_unit, &inquire->unit);
3872 RETM m = match_etag (&tag_file, &inquire->file);
3873 RETM m = match_ltag (&tag_err, &inquire->err);
3874 RETM m = match_out_tag (&tag_iomsg, &inquire->iomsg);
3875 RETM m = match_out_tag (&tag_iostat, &inquire->iostat);
3876 RETM m = match_vtag (&tag_exist, &inquire->exist);
3877 RETM m = match_vtag (&tag_opened, &inquire->opened);
3878 RETM m = match_vtag (&tag_named, &inquire->named);
3879 RETM m = match_vtag (&tag_name, &inquire->name);
3880 RETM m = match_out_tag (&tag_number, &inquire->number);
3881 RETM m = match_vtag (&tag_s_access, &inquire->access);
3882 RETM m = match_vtag (&tag_sequential, &inquire->sequential);
3883 RETM m = match_vtag (&tag_direct, &inquire->direct);
3884 RETM m = match_vtag (&tag_s_form, &inquire->form);
3885 RETM m = match_vtag (&tag_formatted, &inquire->formatted);
3886 RETM m = match_vtag (&tag_unformatted, &inquire->unformatted);
3887 RETM m = match_out_tag (&tag_s_recl, &inquire->recl);
3888 RETM m = match_out_tag (&tag_nextrec, &inquire->nextrec);
3889 RETM m = match_vtag (&tag_s_blank, &inquire->blank);
3890 RETM m = match_vtag (&tag_s_position, &inquire->position);
3891 RETM m = match_vtag (&tag_s_action, &inquire->action);
3892 RETM m = match_vtag (&tag_read, &inquire->read);
3893 RETM m = match_vtag (&tag_write, &inquire->write);
3894 RETM m = match_vtag (&tag_readwrite, &inquire->readwrite);
3895 RETM m = match_vtag (&tag_s_async, &inquire->asynchronous);
3896 RETM m = match_vtag (&tag_s_delim, &inquire->delim);
3897 RETM m = match_vtag (&tag_s_decimal, &inquire->decimal);
3898 RETM m = match_vtag (&tag_size, &inquire->size);
3899 RETM m = match_vtag (&tag_s_encoding, &inquire->encoding);
3900 RETM m = match_vtag (&tag_s_round, &inquire->round);
3901 RETM m = match_vtag (&tag_s_sign, &inquire->sign);
3902 RETM m = match_vtag (&tag_s_pad, &inquire->pad);
3903 RETM m = match_vtag (&tag_iolength, &inquire->iolength);
3904 RETM m = match_vtag (&tag_convert, &inquire->convert);
3905 RETM m = match_out_tag (&tag_strm_out, &inquire->strm_pos);
3906 RETM m = match_vtag (&tag_pending, &inquire->pending);
3907 RETM m = match_vtag (&tag_id, &inquire->id);
3908 RETM return MATCH_NO;
3915 gfc_match_inquire (void)
3917 gfc_inquire *inquire;
3922 m = gfc_match_char ('(');
3926 inquire = XCNEW (gfc_inquire);
3928 loc = gfc_current_locus;
3930 m = match_inquire_element (inquire);
3931 if (m == MATCH_ERROR)
3935 m = gfc_match_expr (&inquire->unit);
3936 if (m == MATCH_ERROR)
3942 /* See if we have the IOLENGTH form of the inquire statement. */
3943 if (inquire->iolength != NULL)
3945 if (gfc_match_char (')') != MATCH_YES)
3948 m = match_io_list (M_INQUIRE, &code);
3949 if (m == MATCH_ERROR)
3954 new_st.op = EXEC_IOLENGTH;
3955 new_st.expr1 = inquire->iolength;
3956 new_st.ext.inquire = inquire;
3958 if (gfc_pure (NULL))
3960 gfc_free_statements (code);
3961 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3965 gfc_unset_implicit_pure (NULL);
3967 new_st.block = gfc_get_code ();
3968 new_st.block->op = EXEC_IOLENGTH;
3969 terminate_io (code);
3970 new_st.block->next = code;
3974 /* At this point, we have the non-IOLENGTH inquire statement. */
3977 if (gfc_match_char (')') == MATCH_YES)
3979 if (gfc_match_char (',') != MATCH_YES)
3982 m = match_inquire_element (inquire);
3983 if (m == MATCH_ERROR)
3988 if (inquire->iolength != NULL)
3990 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
3995 if (gfc_match_eos () != MATCH_YES)
3998 if (inquire->unit != NULL && inquire->file != NULL)
4000 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4001 "UNIT specifiers", &loc);
4005 if (inquire->unit == NULL && inquire->file == NULL)
4007 gfc_error ("INQUIRE statement at %L requires either FILE or "
4008 "UNIT specifier", &loc);
4012 if (gfc_pure (NULL))
4014 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4018 gfc_unset_implicit_pure (NULL);
4020 if (inquire->id != NULL && inquire->pending == NULL)
4022 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4023 "the ID= specifier", &loc);
4027 new_st.op = EXEC_INQUIRE;
4028 new_st.ext.inquire = inquire;
4032 gfc_syntax_error (ST_INQUIRE);
4035 gfc_free_inquire (inquire);
4040 /* Resolve everything in a gfc_inquire structure. */
4043 gfc_resolve_inquire (gfc_inquire *inquire)
4045 RESOLVE_TAG (&tag_unit, inquire->unit);
4046 RESOLVE_TAG (&tag_file, inquire->file);
4047 RESOLVE_TAG (&tag_id, inquire->id);
4049 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4050 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4051 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4052 RESOLVE_TAG (tag, expr); \
4056 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4057 if (gfc_check_vardef_context ((expr), false, false, context) == FAILURE) \
4060 INQUIRE_RESOLVE_TAG (&tag_iomsg, inquire->iomsg);
4061 INQUIRE_RESOLVE_TAG (&tag_iostat, inquire->iostat);
4062 INQUIRE_RESOLVE_TAG (&tag_exist, inquire->exist);
4063 INQUIRE_RESOLVE_TAG (&tag_opened, inquire->opened);
4064 INQUIRE_RESOLVE_TAG (&tag_number, inquire->number);
4065 INQUIRE_RESOLVE_TAG (&tag_named, inquire->named);
4066 INQUIRE_RESOLVE_TAG (&tag_name, inquire->name);
4067 INQUIRE_RESOLVE_TAG (&tag_s_access, inquire->access);
4068 INQUIRE_RESOLVE_TAG (&tag_sequential, inquire->sequential);
4069 INQUIRE_RESOLVE_TAG (&tag_direct, inquire->direct);
4070 INQUIRE_RESOLVE_TAG (&tag_s_form, inquire->form);
4071 INQUIRE_RESOLVE_TAG (&tag_formatted, inquire->formatted);
4072 INQUIRE_RESOLVE_TAG (&tag_unformatted, inquire->unformatted);
4073 INQUIRE_RESOLVE_TAG (&tag_s_recl, inquire->recl);
4074 INQUIRE_RESOLVE_TAG (&tag_nextrec, inquire->nextrec);
4075 INQUIRE_RESOLVE_TAG (&tag_s_blank, inquire->blank);
4076 INQUIRE_RESOLVE_TAG (&tag_s_position, inquire->position);
4077 INQUIRE_RESOLVE_TAG (&tag_s_action, inquire->action);
4078 INQUIRE_RESOLVE_TAG (&tag_read, inquire->read);
4079 INQUIRE_RESOLVE_TAG (&tag_write, inquire->write);
4080 INQUIRE_RESOLVE_TAG (&tag_readwrite, inquire->readwrite);
4081 INQUIRE_RESOLVE_TAG (&tag_s_delim, inquire->delim);
4082 INQUIRE_RESOLVE_TAG (&tag_s_pad, inquire->pad);
4083 INQUIRE_RESOLVE_TAG (&tag_s_encoding, inquire->encoding);
4084 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4085 INQUIRE_RESOLVE_TAG (&tag_iolength, inquire->iolength);
4086 INQUIRE_RESOLVE_TAG (&tag_convert, inquire->convert);
4087 INQUIRE_RESOLVE_TAG (&tag_strm_out, inquire->strm_pos);
4088 INQUIRE_RESOLVE_TAG (&tag_s_async, inquire->asynchronous);
4089 INQUIRE_RESOLVE_TAG (&tag_s_sign, inquire->sign);
4090 INQUIRE_RESOLVE_TAG (&tag_s_round, inquire->round);
4091 INQUIRE_RESOLVE_TAG (&tag_pending, inquire->pending);
4092 INQUIRE_RESOLVE_TAG (&tag_size, inquire->size);
4093 INQUIRE_RESOLVE_TAG (&tag_s_decimal, inquire->decimal);
4094 #undef INQUIRE_RESOLVE_TAG
4096 if (gfc_reference_st_label (inquire->err, ST_LABEL_TARGET) == FAILURE)
4104 gfc_free_wait (gfc_wait *wait)
4109 gfc_free_expr (wait->unit);
4110 gfc_free_expr (wait->iostat);
4111 gfc_free_expr (wait->iomsg);
4112 gfc_free_expr (wait->id);
4117 gfc_resolve_wait (gfc_wait *wait)
4119 RESOLVE_TAG (&tag_unit, wait->unit);
4120 RESOLVE_TAG (&tag_iomsg, wait->iomsg);
4121 RESOLVE_TAG (&tag_iostat, wait->iostat);
4122 RESOLVE_TAG (&tag_id, wait->id);
4124 if (gfc_reference_st_label (wait->err, ST_LABEL_TARGET) == FAILURE)
4127 if (gfc_reference_st_label (wait->end, ST_LABEL_TARGET) == FAILURE)
4133 /* Match an element of a WAIT statement. */
4135 #define RETM if (m != MATCH_NO) return m;
4138 match_wait_element (gfc_wait *wait)
4142 m = match_etag (&tag_unit, &wait->unit);
4143 RETM m = match_ltag (&tag_err, &wait->err);
4144 RETM m = match_ltag (&tag_end, &wait->eor);
4145 RETM m = match_ltag (&tag_eor, &wait->end);
4146 RETM m = match_out_tag (&tag_iomsg, &wait->iomsg);
4147 RETM m = match_out_tag (&tag_iostat, &wait->iostat);
4148 RETM m = match_etag (&tag_id, &wait->id);
4149 RETM return MATCH_NO;
4156 gfc_match_wait (void)
4161 m = gfc_match_char ('(');
4165 wait = XCNEW (gfc_wait);
4167 m = match_wait_element (wait);
4168 if (m == MATCH_ERROR)
4172 m = gfc_match_expr (&wait->unit);
4173 if (m == MATCH_ERROR)
4181 if (gfc_match_char (')') == MATCH_YES)
4183 if (gfc_match_char (',') != MATCH_YES)
4186 m = match_wait_element (wait);
4187 if (m == MATCH_ERROR)
4193 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: WAIT at %C "
4194 "not allowed in Fortran 95") == FAILURE)
4197 if (gfc_pure (NULL))
4199 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4203 gfc_unset_implicit_pure (NULL);
4205 new_st.op = EXEC_WAIT;
4206 new_st.ext.wait = wait;
4211 gfc_syntax_error (ST_WAIT);
4214 gfc_free_wait (wait);