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/>. */
25 #include "coretypes.h"
32 format_asterisk
= {0, NULL
, NULL
, -1, ST_LABEL_FORMAT
, ST_LABEL_FORMAT
, NULL
,
37 const char *name
, *spec
, *value
;
43 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
44 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
45 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
46 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
47 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
48 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
49 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
50 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
51 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
52 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
53 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
54 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
55 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
56 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
57 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
58 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
59 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
60 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
61 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
62 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
63 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
64 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
65 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
66 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
67 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
68 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
69 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
70 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
71 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
72 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
73 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
74 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
75 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
76 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
77 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
78 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
79 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
80 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
81 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
82 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
83 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
84 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
85 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
86 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
87 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
88 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
89 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
90 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
91 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
92 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
93 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
94 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
95 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
96 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
97 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
98 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
99 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
100 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
};
102 static gfc_dt
*current_dt
;
104 #define RESOLVE_TAG(x, y) if (resolve_tag(x, y) == FAILURE) return FAILURE;
107 /**************** Fortran 95 FORMAT parser *****************/
109 /* FORMAT tokens returned by format_lex(). */
112 FMT_NONE
, FMT_UNKNOWN
, FMT_SIGNED_INT
, FMT_ZERO
, FMT_POSINT
, FMT_PERIOD
,
113 FMT_COMMA
, FMT_COLON
, FMT_SLASH
, FMT_DOLLAR
, FMT_LPAREN
,
114 FMT_RPAREN
, FMT_X
, FMT_SIGN
, FMT_BLANK
, FMT_CHAR
, FMT_P
, FMT_IBOZ
, FMT_F
,
115 FMT_E
, FMT_EN
, FMT_ES
, FMT_G
, FMT_L
, FMT_A
, FMT_D
, FMT_H
, FMT_END
,
116 FMT_ERROR
, FMT_DC
, FMT_DP
, FMT_T
, FMT_TR
, FMT_TL
, FMT_STAR
, FMT_RC
,
117 FMT_RD
, FMT_RN
, FMT_RP
, FMT_RU
, FMT_RZ
121 /* Local variables for checking format strings. The saved_token is
122 used to back up by a single format token during the parsing
124 static gfc_char_t
*format_string
;
125 static int format_string_pos
;
126 static int format_length
, use_last_char
;
127 static char error_element
;
128 static locus format_locus
;
130 static format_token saved_token
;
133 { MODE_STRING
, MODE_FORMAT
, MODE_COPY
}
137 /* Return the next character in the format string. */
140 next_char (gfc_instring in_string
)
152 if (mode
== MODE_STRING
)
153 c
= *format_string
++;
156 c
= gfc_next_char_literal (in_string
);
161 if (gfc_option
.flag_backslash
&& c
== '\\')
163 locus old_locus
= gfc_current_locus
;
165 if (gfc_match_special_char (&c
) == MATCH_NO
)
166 gfc_current_locus
= old_locus
;
168 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
169 gfc_warning ("Extension: backslash character at %C");
172 if (mode
== MODE_COPY
)
173 *format_string
++ = c
;
175 if (mode
!= MODE_STRING
)
176 format_locus
= gfc_current_locus
;
180 c
= gfc_wide_toupper (c
);
185 /* Back up one character position. Only works once. */
193 /* Eat up the spaces and return a character. */
196 next_char_not_space (bool *error
)
201 error_element
= c
= next_char (NONSTRING
);
204 if (gfc_option
.allow_std
& GFC_STD_GNU
)
205 gfc_warning ("Extension: Tab character in format at %C");
208 gfc_error ("Extension: Tab character in format at %C");
214 while (gfc_is_whitespace (c
));
218 static int value
= 0;
220 /* Simple lexical analyzer for getting the next token in a FORMAT
232 if (saved_token
!= FMT_NONE
)
235 saved_token
= FMT_NONE
;
239 c
= next_char_not_space (&error
);
247 c
= next_char_not_space (&error
);
258 c
= next_char_not_space (&error
);
260 value
= 10 * value
+ c
- '0';
269 token
= FMT_SIGNED_INT
;
288 c
= next_char_not_space (&error
);
291 value
= 10 * value
+ c
- '0';
299 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
323 c
= next_char_not_space (&error
);
351 c
= next_char_not_space (&error
);
352 if (c
!= 'P' && c
!= 'S')
359 c
= next_char_not_space (&error
);
360 if (c
== 'N' || c
== 'Z')
378 c
= next_char (INSTRING_WARN
);
387 c
= next_char (INSTRING_NOWARN
);
421 c
= next_char_not_space (&error
);
451 c
= next_char_not_space (&error
);
454 if (gfc_notify_std (GFC_STD_F2003
, "DP format "
455 "specifier not allowed at %C") == FAILURE
)
461 if (gfc_notify_std (GFC_STD_F2003
, "DC format "
462 "specifier not allowed at %C") == FAILURE
)
474 c
= next_char_not_space (&error
);
523 token_to_string (format_token t
)
542 /* Check a format statement. The format string, either from a FORMAT
543 statement or a constant in an I/O statement has already been parsed
544 by itself, and we are checking it for validity. The dual origin
545 means that the warning message is a little less than great. */
548 check_format (bool is_input
)
550 const char *posint_required
= _("Positive width required");
551 const char *nonneg_required
= _("Nonnegative width required");
552 const char *unexpected_element
= _("Unexpected element '%c' in format string"
554 const char *unexpected_end
= _("Unexpected end of format string");
555 const char *zero_width
= _("Zero width in format descriptor");
564 saved_token
= FMT_NONE
;
568 format_string_pos
= 0;
575 error
= _("Missing leading left parenthesis");
583 goto finished
; /* Empty format is legal */
587 /* In this state, the next thing has to be a format item. */
604 error
= _("Left parenthesis required after '*'");
629 /* Signed integer can only precede a P format. */
635 error
= _("Expected P edit descriptor");
642 /* P requires a prior number. */
643 error
= _("P descriptor requires leading scale factor");
647 /* X requires a prior number if we're being pedantic. */
648 if (mode
!= MODE_FORMAT
)
649 format_locus
.nextc
+= format_string_pos
;
650 if (gfc_notify_std (GFC_STD_GNU
, "X descriptor "
651 "requires leading space count at %L", &format_locus
)
669 goto extension_optional_comma
;
680 if (gfc_notify_std (GFC_STD_GNU
, "$ descriptor at %L",
681 &format_locus
) == FAILURE
)
683 if (t
!= FMT_RPAREN
|| level
> 0)
685 gfc_warning ("$ should be the last specifier in format at %L",
687 goto optional_comma_1
;
708 error
= unexpected_end
;
712 error
= unexpected_element
;
717 /* In this state, t must currently be a data descriptor.
718 Deal with things that can/must follow the descriptor. */
729 /* No comma after P allowed only for F, E, EN, ES, D, or G.
734 if (!(gfc_option
.allow_std
& GFC_STD_F2003
) && t
!= FMT_COMMA
735 && t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
736 && t
!= FMT_D
&& t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
738 error
= _("Comma required after P descriptor");
749 if (t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
&& t
!= FMT_D
750 && t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
752 error
= _("Comma required after P descriptor");
766 error
= _("Positive width required with T descriptor");
778 switch (gfc_notification_std (GFC_STD_GNU
))
781 if (mode
!= MODE_FORMAT
)
782 format_locus
.nextc
+= format_string_pos
;
783 gfc_warning ("Extension: Missing positive width after L "
784 "descriptor at %L", &format_locus
);
789 error
= posint_required
;
820 if (t
== FMT_G
&& u
== FMT_ZERO
)
827 if (gfc_notify_std (GFC_STD_F2008
, "'G0' in "
828 "format at %L", &format_locus
) == FAILURE
)
839 error
= posint_required
;
845 error
= _("E specifier not allowed with g0 descriptor");
854 format_locus
.nextc
+= format_string_pos
;
855 gfc_error ("Positive width required in format "
856 "specifier %s at %L", token_to_string (t
),
867 /* Warn if -std=legacy, otherwise error. */
868 format_locus
.nextc
+= format_string_pos
;
869 if (gfc_option
.warn_std
!= 0)
871 gfc_error ("Period required in format "
872 "specifier %s at %L", token_to_string (t
),
878 gfc_warning ("Period required in format "
879 "specifier %s at %L", token_to_string (t
),
881 /* If we go to finished, we need to unwind this
882 before the next round. */
883 format_locus
.nextc
-= format_string_pos
;
891 if (u
!= FMT_ZERO
&& u
!= FMT_POSINT
)
893 error
= nonneg_required
;
900 /* Look for optional exponent. */
915 error
= _("Positive exponent width required");
926 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
928 error
= nonneg_required
;
931 else if (is_input
&& t
== FMT_ZERO
)
933 error
= posint_required
;
942 /* Warn if -std=legacy, otherwise error. */
943 if (gfc_option
.warn_std
!= 0)
945 error
= _("Period required in format specifier");
948 if (mode
!= MODE_FORMAT
)
949 format_locus
.nextc
+= format_string_pos
;
950 gfc_warning ("Period required in format specifier at %L",
959 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
961 error
= nonneg_required
;
968 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
970 if (mode
!= MODE_FORMAT
)
971 format_locus
.nextc
+= format_string_pos
;
972 gfc_warning ("The H format specifier at %L is"
973 " a Fortran 95 deleted feature", &format_locus
);
975 if (mode
== MODE_STRING
)
977 format_string
+= value
;
978 format_length
-= value
;
979 format_string_pos
+= repeat
;
985 next_char (INSTRING_WARN
);
995 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
997 error
= nonneg_required
;
1000 else if (is_input
&& t
== FMT_ZERO
)
1002 error
= posint_required
;
1009 if (t
!= FMT_PERIOD
)
1018 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1020 error
= nonneg_required
;
1028 error
= unexpected_element
;
1033 /* Between a descriptor and what comes next. */
1051 goto optional_comma
;
1054 error
= unexpected_end
;
1058 if (mode
!= MODE_FORMAT
)
1059 format_locus
.nextc
+= format_string_pos
- 1;
1060 if (gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L",
1061 &format_locus
) == FAILURE
)
1063 /* If we do not actually return a failure, we need to unwind this
1064 before the next round. */
1065 if (mode
!= MODE_FORMAT
)
1066 format_locus
.nextc
-= format_string_pos
;
1071 /* Optional comma is a weird between state where we've just finished
1072 reading a colon, slash, dollar or P descriptor. */
1089 /* Assume that we have another format item. */
1096 extension_optional_comma
:
1097 /* As a GNU extension, permit a missing comma after a string literal. */
1114 goto optional_comma
;
1117 error
= unexpected_end
;
1121 if (mode
!= MODE_FORMAT
)
1122 format_locus
.nextc
+= format_string_pos
;
1123 if (gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L",
1124 &format_locus
) == FAILURE
)
1126 /* If we do not actually return a failure, we need to unwind this
1127 before the next round. */
1128 if (mode
!= MODE_FORMAT
)
1129 format_locus
.nextc
-= format_string_pos
;
1137 if (mode
!= MODE_FORMAT
)
1138 format_locus
.nextc
+= format_string_pos
;
1139 if (error
== unexpected_element
)
1140 gfc_error (error
, error_element
, &format_locus
);
1142 gfc_error ("%s in format string at %L", error
, &format_locus
);
1151 /* Given an expression node that is a constant string, see if it looks
1152 like a format string. */
1155 check_format_string (gfc_expr
*e
, bool is_input
)
1159 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1163 format_string
= e
->value
.character
.string
;
1165 /* More elaborate measures are needed to show where a problem is within a
1166 format string that has been calculated, but that's probably not worth the
1168 format_locus
= e
->where
;
1169 rv
= check_format (is_input
);
1170 /* check for extraneous characters at the end of an otherwise valid format
1171 string, like '(A10,I3)F5'
1172 start at the end and move back to the last character processed,
1174 if (rv
== SUCCESS
&& e
->value
.character
.length
> format_string_pos
)
1175 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1176 if (e
->value
.character
.string
[i
] != ' ')
1178 format_locus
.nextc
+= format_length
+ 1;
1179 gfc_warning ("Extraneous characters in format at %L", &format_locus
);
1186 /************ Fortran 95 I/O statement matchers *************/
1188 /* Match a FORMAT statement. This amounts to actually parsing the
1189 format descriptors in order to correctly locate the end of the
1193 gfc_match_format (void)
1198 if (gfc_current_ns
->proc_name
1199 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1201 gfc_error ("Format statement in module main block at %C");
1205 if (gfc_statement_label
== NULL
)
1207 gfc_error ("Missing format label at %C");
1210 gfc_gobble_whitespace ();
1215 start
= gfc_current_locus
;
1217 if (check_format (false) == FAILURE
)
1220 if (gfc_match_eos () != MATCH_YES
)
1222 gfc_syntax_error (ST_FORMAT
);
1226 /* The label doesn't get created until after the statement is done
1227 being matched, so we have to leave the string for later. */
1229 gfc_current_locus
= start
; /* Back to the beginning */
1232 new_st
.op
= EXEC_NOP
;
1234 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1235 NULL
, format_length
);
1236 format_string
= e
->value
.character
.string
;
1237 gfc_statement_label
->format
= e
;
1240 check_format (false); /* Guaranteed to succeed */
1241 gfc_match_eos (); /* Guaranteed to succeed */
1247 /* Match an expression I/O tag of some sort. */
1250 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1255 m
= gfc_match (tag
->spec
);
1259 m
= gfc_match (tag
->value
, &result
);
1262 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1268 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1269 gfc_free_expr (result
);
1278 /* Match a variable I/O tag of some sort. */
1281 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1286 m
= gfc_match (tag
->spec
);
1290 m
= gfc_match (tag
->value
, &result
);
1293 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1299 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1300 gfc_free_expr (result
);
1304 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1306 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1307 gfc_free_expr (result
);
1311 if (gfc_pure (NULL
) && gfc_impure_variable (result
->symtree
->n
.sym
))
1313 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1315 gfc_free_expr (result
);
1319 if (gfc_implicit_pure (NULL
) && gfc_impure_variable (result
->symtree
->n
.sym
))
1320 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
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
, "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
, "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
, "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
, "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
, "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
, "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
, "%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
, "%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 if (gfc_implicit_pure (NULL
))
1841 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
1843 warn
= (open
->err
|| open
->iostat
) ? true : false;
1845 /* Checks on NEWUNIT specifier. */
1850 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1854 if (!(open
->file
|| (open
->status
1855 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
1856 "scratch", 7) == 0)))
1858 gfc_error ("NEWUNIT specifier must have FILE= "
1859 "or STATUS='scratch' at %C");
1863 else if (!open
->unit
)
1865 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1869 /* Checks on the ACCESS specifier. */
1870 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
1872 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
1873 static const char *access_f2003
[] = { "STREAM", NULL
};
1874 static const char *access_gnu
[] = { "APPEND", NULL
};
1876 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
1878 open
->access
->value
.character
.string
,
1883 /* Checks on the ACTION specifier. */
1884 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
1886 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
1888 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
1889 open
->action
->value
.character
.string
,
1894 /* Checks on the ASYNCHRONOUS specifier. */
1895 if (open
->asynchronous
)
1897 if (gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
1898 "not allowed in Fortran 95") == FAILURE
)
1901 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
1903 static const char * asynchronous
[] = { "YES", "NO", NULL
};
1905 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
1906 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
1912 /* Checks on the BLANK specifier. */
1915 if (gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
1916 "not allowed in Fortran 95") == FAILURE
)
1919 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
1921 static const char *blank
[] = { "ZERO", "NULL", NULL
};
1923 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
1924 open
->blank
->value
.character
.string
,
1930 /* Checks on the DECIMAL specifier. */
1933 if (gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
1934 "not allowed in Fortran 95") == FAILURE
)
1937 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
1939 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
1941 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
1942 open
->decimal
->value
.character
.string
,
1948 /* Checks on the DELIM specifier. */
1951 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
1953 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
1955 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
1956 open
->delim
->value
.character
.string
,
1962 /* Checks on the ENCODING specifier. */
1965 if (gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
1966 "not allowed in Fortran 95") == FAILURE
)
1969 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
1971 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
1973 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
1974 open
->encoding
->value
.character
.string
,
1980 /* Checks on the FORM specifier. */
1981 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
1983 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
1985 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
1986 open
->form
->value
.character
.string
,
1991 /* Checks on the PAD specifier. */
1992 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
1994 static const char *pad
[] = { "YES", "NO", NULL
};
1996 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
1997 open
->pad
->value
.character
.string
,
2002 /* Checks on the POSITION specifier. */
2003 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
2005 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
2007 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2008 open
->position
->value
.character
.string
,
2013 /* Checks on the ROUND specifier. */
2016 if (gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2017 "not allowed in Fortran 95") == FAILURE
)
2020 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2022 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2023 "COMPATIBLE", "PROCESSOR_DEFINED",
2026 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2027 open
->round
->value
.character
.string
,
2033 /* Checks on the SIGN specifier. */
2036 if (gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2037 "not allowed in Fortran 95") == FAILURE
)
2040 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2042 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2045 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2046 open
->sign
->value
.character
.string
,
2052 #define warn_or_error(...) \
2055 gfc_warning (__VA_ARGS__); \
2058 gfc_error (__VA_ARGS__); \
2063 /* Checks on the RECL specifier. */
2064 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2065 && open
->recl
->ts
.type
== BT_INTEGER
2066 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2068 warn_or_error ("RECL in OPEN statement at %C must be positive");
2071 /* Checks on the STATUS specifier. */
2072 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2074 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2075 "REPLACE", "UNKNOWN", NULL
};
2077 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2078 open
->status
->value
.character
.string
,
2082 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2083 the FILE= specifier shall appear. */
2084 if (open
->file
== NULL
2085 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2087 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2090 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2092 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2093 "'%s' and no FILE specifier is present", s
);
2097 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2098 the FILE= specifier shall not appear. */
2099 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2100 "scratch", 7) == 0 && open
->file
)
2102 warn_or_error ("The STATUS specified in OPEN statement at %C "
2103 "cannot have the value SCRATCH if a FILE specifier "
2108 /* Things that are not allowed for unformatted I/O. */
2109 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2110 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2111 || open
->sign
|| open
->pad
|| open
->blank
)
2112 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2113 "unformatted", 11) == 0)
2115 const char *spec
= (open
->delim
? "DELIM "
2116 : (open
->pad
? "PAD " : open
->blank
2119 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2120 "unformatted I/O", spec
);
2123 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2124 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2127 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2132 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2133 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2134 "sequential", 10) == 0
2135 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2137 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2140 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2141 "for stream or sequential ACCESS");
2144 #undef warn_or_error
2146 new_st
.op
= EXEC_OPEN
;
2147 new_st
.ext
.open
= open
;
2151 gfc_syntax_error (ST_OPEN
);
2154 gfc_free_open (open
);
2159 /* Free a gfc_close structure an all its expressions. */
2162 gfc_free_close (gfc_close
*close
)
2167 gfc_free_expr (close
->unit
);
2168 gfc_free_expr (close
->iomsg
);
2169 gfc_free_expr (close
->iostat
);
2170 gfc_free_expr (close
->status
);
2175 /* Match elements of a CLOSE statement. */
2178 match_close_element (gfc_close
*close
)
2182 m
= match_etag (&tag_unit
, &close
->unit
);
2185 m
= match_etag (&tag_status
, &close
->status
);
2188 m
= match_out_tag (&tag_iomsg
, &close
->iomsg
);
2191 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2194 m
= match_ltag (&tag_err
, &close
->err
);
2202 /* Match a CLOSE statement. */
2205 gfc_match_close (void)
2211 m
= gfc_match_char ('(');
2215 close
= XCNEW (gfc_close
);
2217 m
= match_close_element (close
);
2219 if (m
== MATCH_ERROR
)
2223 m
= gfc_match_expr (&close
->unit
);
2226 if (m
== MATCH_ERROR
)
2232 if (gfc_match_char (')') == MATCH_YES
)
2234 if (gfc_match_char (',') != MATCH_YES
)
2237 m
= match_close_element (close
);
2238 if (m
== MATCH_ERROR
)
2244 if (gfc_match_eos () == MATCH_NO
)
2247 if (gfc_pure (NULL
))
2249 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2253 if (gfc_implicit_pure (NULL
))
2254 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2256 warn
= (close
->iostat
|| close
->err
) ? true : false;
2258 /* Checks on the STATUS specifier. */
2259 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2261 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2263 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2264 close
->status
->value
.character
.string
,
2269 new_st
.op
= EXEC_CLOSE
;
2270 new_st
.ext
.close
= close
;
2274 gfc_syntax_error (ST_CLOSE
);
2277 gfc_free_close (close
);
2282 /* Resolve everything in a gfc_close structure. */
2285 gfc_resolve_close (gfc_close
*close
)
2287 RESOLVE_TAG (&tag_unit
, close
->unit
);
2288 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2289 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2290 RESOLVE_TAG (&tag_status
, close
->status
);
2292 if (gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
) == FAILURE
)
2295 if (close
->unit
== NULL
)
2297 /* Find a locus from one of the arguments to close, when UNIT is
2299 locus loc
= gfc_current_locus
;
2301 loc
= close
->status
->where
;
2302 else if (close
->iostat
)
2303 loc
= close
->iostat
->where
;
2304 else if (close
->iomsg
)
2305 loc
= close
->iomsg
->where
;
2306 else if (close
->err
)
2307 loc
= close
->err
->where
;
2309 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2313 if (close
->unit
->expr_type
== EXPR_CONSTANT
2314 && close
->unit
->ts
.type
== BT_INTEGER
2315 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2317 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2318 &close
->unit
->where
);
2325 /* Free a gfc_filepos structure. */
2328 gfc_free_filepos (gfc_filepos
*fp
)
2330 gfc_free_expr (fp
->unit
);
2331 gfc_free_expr (fp
->iomsg
);
2332 gfc_free_expr (fp
->iostat
);
2337 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2340 match_file_element (gfc_filepos
*fp
)
2344 m
= match_etag (&tag_unit
, &fp
->unit
);
2347 m
= match_out_tag (&tag_iomsg
, &fp
->iomsg
);
2350 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2353 m
= match_ltag (&tag_err
, &fp
->err
);
2361 /* Match the second half of the file-positioning statements, REWIND,
2362 BACKSPACE, ENDFILE, or the FLUSH statement. */
2365 match_filepos (gfc_statement st
, gfc_exec_op op
)
2370 fp
= XCNEW (gfc_filepos
);
2372 if (gfc_match_char ('(') == MATCH_NO
)
2374 m
= gfc_match_expr (&fp
->unit
);
2375 if (m
== MATCH_ERROR
)
2383 m
= match_file_element (fp
);
2384 if (m
== MATCH_ERROR
)
2388 m
= gfc_match_expr (&fp
->unit
);
2389 if (m
== MATCH_ERROR
)
2397 if (gfc_match_char (')') == MATCH_YES
)
2399 if (gfc_match_char (',') != MATCH_YES
)
2402 m
= match_file_element (fp
);
2403 if (m
== MATCH_ERROR
)
2410 if (gfc_match_eos () != MATCH_YES
)
2413 if (gfc_pure (NULL
))
2415 gfc_error ("%s statement not allowed in PURE procedure at %C",
2416 gfc_ascii_statement (st
));
2421 if (gfc_implicit_pure (NULL
))
2422 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2425 new_st
.ext
.filepos
= fp
;
2429 gfc_syntax_error (st
);
2432 gfc_free_filepos (fp
);
2438 gfc_resolve_filepos (gfc_filepos
*fp
)
2440 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2441 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2442 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2443 if (gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
) == FAILURE
)
2446 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2447 && fp
->unit
->ts
.type
== BT_INTEGER
2448 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2450 gfc_error ("UNIT number in statement at %L must be non-negative",
2458 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2459 and the FLUSH statement. */
2462 gfc_match_endfile (void)
2464 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2468 gfc_match_backspace (void)
2470 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2474 gfc_match_rewind (void)
2476 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2480 gfc_match_flush (void)
2482 if (gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C")
2486 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2489 /******************** Data Transfer Statements *********************/
2491 /* Return a default unit number. */
2494 default_unit (io_kind k
)
2503 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2507 /* Match a unit specification for a data transfer statement. */
2510 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2514 if (gfc_match_char ('*') == MATCH_YES
)
2516 if (dt
->io_unit
!= NULL
)
2519 dt
->io_unit
= default_unit (k
);
2523 if (gfc_match_expr (&e
) == MATCH_YES
)
2525 if (dt
->io_unit
!= NULL
)
2538 gfc_error ("Duplicate UNIT specification at %C");
2543 /* Match a format specification. */
2546 match_dt_format (gfc_dt
*dt
)
2550 gfc_st_label
*label
;
2553 where
= gfc_current_locus
;
2555 if (gfc_match_char ('*') == MATCH_YES
)
2557 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2560 dt
->format_label
= &format_asterisk
;
2564 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2568 /* Need to check if the format label is actually either an operand
2569 to a user-defined operator or is a kind type parameter. That is,
2570 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2571 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2573 gfc_gobble_whitespace ();
2574 c
= gfc_peek_ascii_char ();
2575 if (c
== '.' || c
== '_')
2576 gfc_current_locus
= where
;
2579 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2581 gfc_free_st_label (label
);
2585 if (gfc_reference_st_label (label
, ST_LABEL_FORMAT
) == FAILURE
)
2588 dt
->format_label
= label
;
2592 else if (m
== MATCH_ERROR
)
2593 /* The label was zero or too large. Emit the correct diagnosis. */
2596 if (gfc_match_expr (&e
) == MATCH_YES
)
2598 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2603 dt
->format_expr
= e
;
2607 gfc_current_locus
= where
; /* The only case where we have to restore */
2612 gfc_error ("Duplicate format specification at %C");
2617 /* Traverse a namelist that is part of a READ statement to make sure
2618 that none of the variables in the namelist are INTENT(IN). Returns
2619 nonzero if we find such a variable. */
2622 check_namelist (gfc_symbol
*sym
)
2626 for (p
= sym
->namelist
; p
; p
= p
->next
)
2627 if (p
->sym
->attr
.intent
== INTENT_IN
)
2629 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2630 p
->sym
->name
, sym
->name
);
2638 /* Match a single data transfer element. */
2641 match_dt_element (io_kind k
, gfc_dt
*dt
)
2643 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2647 if (gfc_match (" unit =") == MATCH_YES
)
2649 m
= match_dt_unit (k
, dt
);
2654 if (gfc_match (" fmt =") == MATCH_YES
)
2656 m
= match_dt_format (dt
);
2661 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
2663 if (dt
->namelist
!= NULL
)
2665 gfc_error ("Duplicate NML specification at %C");
2669 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
2672 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
2674 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2675 sym
!= NULL
? sym
->name
: name
);
2680 if (k
== M_READ
&& check_namelist (sym
))
2686 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
2689 m
= match_etag (&tag_e_blank
, &dt
->blank
);
2692 m
= match_etag (&tag_e_delim
, &dt
->delim
);
2695 m
= match_etag (&tag_e_pad
, &dt
->pad
);
2698 m
= match_etag (&tag_e_sign
, &dt
->sign
);
2701 m
= match_etag (&tag_e_round
, &dt
->round
);
2704 m
= match_out_tag (&tag_id
, &dt
->id
);
2707 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
2710 m
= match_etag (&tag_rec
, &dt
->rec
);
2713 m
= match_etag (&tag_spos
, &dt
->pos
);
2716 m
= match_out_tag (&tag_iomsg
, &dt
->iomsg
);
2719 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
2722 m
= match_ltag (&tag_err
, &dt
->err
);
2724 dt
->err_where
= gfc_current_locus
;
2727 m
= match_etag (&tag_advance
, &dt
->advance
);
2730 m
= match_out_tag (&tag_size
, &dt
->size
);
2734 m
= match_ltag (&tag_end
, &dt
->end
);
2739 gfc_error ("END tag at %C not allowed in output statement");
2742 dt
->end_where
= gfc_current_locus
;
2747 m
= match_ltag (&tag_eor
, &dt
->eor
);
2749 dt
->eor_where
= gfc_current_locus
;
2757 /* Free a data transfer structure and everything below it. */
2760 gfc_free_dt (gfc_dt
*dt
)
2765 gfc_free_expr (dt
->io_unit
);
2766 gfc_free_expr (dt
->format_expr
);
2767 gfc_free_expr (dt
->rec
);
2768 gfc_free_expr (dt
->advance
);
2769 gfc_free_expr (dt
->iomsg
);
2770 gfc_free_expr (dt
->iostat
);
2771 gfc_free_expr (dt
->size
);
2772 gfc_free_expr (dt
->pad
);
2773 gfc_free_expr (dt
->delim
);
2774 gfc_free_expr (dt
->sign
);
2775 gfc_free_expr (dt
->round
);
2776 gfc_free_expr (dt
->blank
);
2777 gfc_free_expr (dt
->decimal
);
2778 gfc_free_expr (dt
->pos
);
2779 gfc_free_expr (dt
->dt_io_kind
);
2780 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2785 /* Resolve everything in a gfc_dt structure. */
2788 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
2793 /* This is set in any case. */
2794 gcc_assert (dt
->dt_io_kind
);
2795 k
= dt
->dt_io_kind
->value
.iokind
;
2797 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
2798 RESOLVE_TAG (&tag_rec
, dt
->rec
);
2799 RESOLVE_TAG (&tag_spos
, dt
->pos
);
2800 RESOLVE_TAG (&tag_advance
, dt
->advance
);
2801 RESOLVE_TAG (&tag_id
, dt
->id
);
2802 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
2803 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
2804 RESOLVE_TAG (&tag_size
, dt
->size
);
2805 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
2806 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
2807 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
2808 RESOLVE_TAG (&tag_e_round
, dt
->round
);
2809 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
2810 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
2811 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
2816 gfc_error ("UNIT not specified at %L", loc
);
2820 if (gfc_resolve_expr (e
) == SUCCESS
2821 && (e
->ts
.type
!= BT_INTEGER
2822 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
2824 /* If there is no extra comma signifying the "format" form of the IO
2825 statement, then this must be an error. */
2826 if (!dt
->extra_comma
)
2828 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2829 "or a CHARACTER variable", &e
->where
);
2834 /* At this point, we have an extra comma. If io_unit has arrived as
2835 type character, we assume its really the "format" form of the I/O
2836 statement. We set the io_unit to the default unit and format to
2837 the character expression. See F95 Standard section 9.4. */
2838 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
2840 dt
->format_expr
= dt
->io_unit
;
2841 dt
->io_unit
= default_unit (k
);
2843 /* Nullify this pointer now so that a warning/error is not
2844 triggered below for the "Extension". */
2845 dt
->extra_comma
= NULL
;
2850 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2851 &dt
->extra_comma
->where
);
2857 if (e
->ts
.type
== BT_CHARACTER
)
2859 if (gfc_has_vector_index (e
))
2861 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
2865 /* If we are writing, make sure the internal unit can be changed. */
2866 gcc_assert (k
!= M_PRINT
);
2868 && gfc_check_vardef_context (e
, false, false,
2869 _("internal unit in WRITE")) == FAILURE
)
2873 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
2875 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
2879 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
2880 && mpz_sgn (e
->value
.integer
) < 0)
2882 gfc_error ("UNIT number in statement at %L must be non-negative",
2887 /* If we are reading and have a namelist, check that all namelist symbols
2888 can appear in a variable definition context. */
2889 if (k
== M_READ
&& dt
->namelist
)
2892 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
2897 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
2898 t
= gfc_check_vardef_context (e
, false, false, NULL
);
2903 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2904 " the symbol '%s' which may not appear in a"
2905 " variable definition context",
2906 dt
->namelist
->name
, loc
, n
->sym
->name
);
2913 && gfc_notify_std (GFC_STD_GNU
, "Comma before i/o "
2914 "item list at %L", &dt
->extra_comma
->where
) == FAILURE
)
2919 if (gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
) == FAILURE
)
2921 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
2923 gfc_error ("ERR tag label %d at %L not defined",
2924 dt
->err
->value
, &dt
->err_where
);
2931 if (gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
) == FAILURE
)
2933 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
2935 gfc_error ("END tag label %d at %L not defined",
2936 dt
->end
->value
, &dt
->end_where
);
2943 if (gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
) == FAILURE
)
2945 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
2947 gfc_error ("EOR tag label %d at %L not defined",
2948 dt
->eor
->value
, &dt
->eor_where
);
2953 /* Check the format label actually exists. */
2954 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
2955 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
2957 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
2958 &dt
->format_label
->where
);
2966 /* Given an io_kind, return its name. */
2969 io_kind_name (io_kind k
)
2988 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2995 /* Match an IO iteration statement of the form:
2997 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2999 which is equivalent to a single IO element. This function is
3000 mutually recursive with match_io_element(). */
3002 static match
match_io_element (io_kind
, gfc_code
**);
3005 match_io_iterator (io_kind k
, gfc_code
**result
)
3007 gfc_code
*head
, *tail
, *new_code
;
3015 old_loc
= gfc_current_locus
;
3017 if (gfc_match_char ('(') != MATCH_YES
)
3020 m
= match_io_element (k
, &head
);
3023 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3029 /* Can't be anything but an IO iterator. Build a list. */
3030 iter
= gfc_get_iterator ();
3034 m
= gfc_match_iterator (iter
, 0);
3035 if (m
== MATCH_ERROR
)
3039 gfc_check_do_variable (iter
->var
->symtree
);
3043 m
= match_io_element (k
, &new_code
);
3044 if (m
== MATCH_ERROR
)
3053 tail
= gfc_append_code (tail
, new_code
);
3055 if (gfc_match_char (',') != MATCH_YES
)
3064 if (gfc_match_char (')') != MATCH_YES
)
3067 new_code
= gfc_get_code ();
3068 new_code
->op
= EXEC_DO
;
3069 new_code
->ext
.iterator
= iter
;
3071 new_code
->block
= gfc_get_code ();
3072 new_code
->block
->op
= EXEC_DO
;
3073 new_code
->block
->next
= head
;
3079 gfc_error ("Syntax error in I/O iterator at %C");
3083 gfc_free_iterator (iter
, 1);
3084 gfc_free_statements (head
);
3085 gfc_current_locus
= old_loc
;
3090 /* Match a single element of an IO list, which is either a single
3091 expression or an IO Iterator. */
3094 match_io_element (io_kind k
, gfc_code
**cpp
)
3102 m
= match_io_iterator (k
, cpp
);
3108 m
= gfc_match_variable (&expr
, 0);
3110 gfc_error ("Expected variable in READ statement at %C");
3114 m
= gfc_match_expr (&expr
);
3116 gfc_error ("Expected expression in %s statement at %C",
3120 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3125 gfc_free_expr (expr
);
3129 cp
= gfc_get_code ();
3130 cp
->op
= EXEC_TRANSFER
;
3133 cp
->ext
.dt
= current_dt
;
3140 /* Match an I/O list, building gfc_code structures as we go. */
3143 match_io_list (io_kind k
, gfc_code
**head_p
)
3145 gfc_code
*head
, *tail
, *new_code
;
3148 *head_p
= head
= tail
= NULL
;
3149 if (gfc_match_eos () == MATCH_YES
)
3154 m
= match_io_element (k
, &new_code
);
3155 if (m
== MATCH_ERROR
)
3160 tail
= gfc_append_code (tail
, new_code
);
3164 if (gfc_match_eos () == MATCH_YES
)
3166 if (gfc_match_char (',') != MATCH_YES
)
3174 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3177 gfc_free_statements (head
);
3182 /* Attach the data transfer end node. */
3185 terminate_io (gfc_code
*io_code
)
3189 if (io_code
== NULL
)
3190 io_code
= new_st
.block
;
3192 c
= gfc_get_code ();
3193 c
->op
= EXEC_DT_END
;
3195 /* Point to structure that is already there */
3196 c
->ext
.dt
= new_st
.ext
.dt
;
3197 gfc_append_code (io_code
, c
);
3201 /* Check the constraints for a data transfer statement. The majority of the
3202 constraints appearing in 9.4 of the standard appear here. Some are handled
3203 in resolve_tag and others in gfc_resolve_dt. */
3206 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3209 #define io_constraint(condition,msg,arg)\
3212 gfc_error(msg,arg);\
3218 gfc_symbol
*sym
= NULL
;
3219 bool warn
, unformatted
;
3221 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3222 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3223 && dt
->namelist
== NULL
;
3228 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3229 && expr
->ts
.type
== BT_CHARACTER
)
3231 sym
= expr
->symtree
->n
.sym
;
3233 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3234 "Internal file at %L must not be INTENT(IN)",
3237 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3238 "Internal file incompatible with vector subscript at %L",
3241 io_constraint (dt
->rec
!= NULL
,
3242 "REC tag at %L is incompatible with internal file",
3245 io_constraint (dt
->pos
!= NULL
,
3246 "POS tag at %L is incompatible with internal file",
3249 io_constraint (unformatted
,
3250 "Unformatted I/O not allowed with internal unit at %L",
3251 &dt
->io_unit
->where
);
3253 io_constraint (dt
->asynchronous
!= NULL
,
3254 "ASYNCHRONOUS tag at %L not allowed with internal file",
3255 &dt
->asynchronous
->where
);
3257 if (dt
->namelist
!= NULL
)
3259 if (gfc_notify_std (GFC_STD_F2003
, "Internal file "
3260 "at %L with namelist", &expr
->where
)
3265 io_constraint (dt
->advance
!= NULL
,
3266 "ADVANCE tag at %L is incompatible with internal file",
3267 &dt
->advance
->where
);
3270 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3273 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3274 "IO UNIT in %s statement at %C must be "
3275 "an internal file in a PURE procedure",
3278 if (gfc_implicit_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
))
3279 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3285 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3288 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3291 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3294 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3297 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3302 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3303 "SIZE tag at %L requires an ADVANCE tag",
3306 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3307 "EOR tag at %L requires an ADVANCE tag",
3311 if (dt
->asynchronous
)
3313 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3315 if (gfc_reduce_init_expr (dt
->asynchronous
) != SUCCESS
)
3317 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3318 "expression", &dt
->asynchronous
->where
);
3322 if (!compare_to_allowed_values
3323 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3324 dt
->asynchronous
->value
.character
.string
,
3325 io_kind_name (k
), warn
))
3333 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3334 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3336 io_constraint (not_yes
,
3337 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3338 "specifier", &dt
->id
->where
);
3343 if (gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3344 "not allowed in Fortran 95") == FAILURE
)
3347 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3349 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3351 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3352 dt
->decimal
->value
.character
.string
,
3353 io_kind_name (k
), warn
))
3356 io_constraint (unformatted
,
3357 "the DECIMAL= specifier at %L must be with an "
3358 "explicit format expression", &dt
->decimal
->where
);
3364 if (gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3365 "not allowed in Fortran 95") == FAILURE
)
3368 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3370 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3372 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3373 dt
->blank
->value
.character
.string
,
3374 io_kind_name (k
), warn
))
3377 io_constraint (unformatted
,
3378 "the BLANK= specifier at %L must be with an "
3379 "explicit format expression", &dt
->blank
->where
);
3385 if (gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3386 "not allowed in Fortran 95") == FAILURE
)
3389 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3391 static const char * pad
[] = { "YES", "NO", NULL
};
3393 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3394 dt
->pad
->value
.character
.string
,
3395 io_kind_name (k
), warn
))
3398 io_constraint (unformatted
,
3399 "the PAD= specifier at %L must be with an "
3400 "explicit format expression", &dt
->pad
->where
);
3406 if (gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3407 "not allowed in Fortran 95") == FAILURE
)
3410 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3412 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3413 "COMPATIBLE", "PROCESSOR_DEFINED",
3416 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3417 dt
->round
->value
.character
.string
,
3418 io_kind_name (k
), warn
))
3425 /* When implemented, change the following to use gfc_notify_std F2003.
3426 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3427 "not allowed in Fortran 95") == FAILURE)
3428 return MATCH_ERROR; */
3429 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3431 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3434 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3435 dt
->sign
->value
.character
.string
,
3436 io_kind_name (k
), warn
))
3439 io_constraint (unformatted
,
3440 "SIGN= specifier at %L must be with an "
3441 "explicit format expression", &dt
->sign
->where
);
3443 io_constraint (k
== M_READ
,
3444 "SIGN= specifier at %L not allowed in a "
3445 "READ statement", &dt
->sign
->where
);
3451 if (gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
3452 "not allowed in Fortran 95") == FAILURE
)
3455 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3457 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3459 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3460 dt
->delim
->value
.character
.string
,
3461 io_kind_name (k
), warn
))
3464 io_constraint (k
== M_READ
,
3465 "DELIM= specifier at %L not allowed in a "
3466 "READ statement", &dt
->delim
->where
);
3468 io_constraint (dt
->format_label
!= &format_asterisk
3469 && dt
->namelist
== NULL
,
3470 "DELIM= specifier at %L must have FMT=*",
3473 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3474 "DELIM= specifier at %L must be with FMT=* or "
3475 "NML= specifier ", &dt
->delim
->where
);
3481 io_constraint (io_code
&& dt
->namelist
,
3482 "NAMELIST cannot be followed by IO-list at %L",
3485 io_constraint (dt
->format_expr
,
3486 "IO spec-list cannot contain both NAMELIST group name "
3487 "and format specification at %L",
3488 &dt
->format_expr
->where
);
3490 io_constraint (dt
->format_label
,
3491 "IO spec-list cannot contain both NAMELIST group name "
3492 "and format label at %L", spec_end
);
3494 io_constraint (dt
->rec
,
3495 "NAMELIST IO is not allowed with a REC= specifier "
3496 "at %L", &dt
->rec
->where
);
3498 io_constraint (dt
->advance
,
3499 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3500 "at %L", &dt
->advance
->where
);
3505 io_constraint (dt
->end
,
3506 "An END tag is not allowed with a "
3507 "REC= specifier at %L", &dt
->end_where
);
3509 io_constraint (dt
->format_label
== &format_asterisk
,
3510 "FMT=* is not allowed with a REC= specifier "
3513 io_constraint (dt
->pos
,
3514 "POS= is not allowed with REC= specifier "
3515 "at %L", &dt
->pos
->where
);
3520 int not_yes
, not_no
;
3523 io_constraint (dt
->format_label
== &format_asterisk
,
3524 "List directed format(*) is not allowed with a "
3525 "ADVANCE= specifier at %L.", &expr
->where
);
3527 io_constraint (unformatted
,
3528 "the ADVANCE= specifier at %L must appear with an "
3529 "explicit format expression", &expr
->where
);
3531 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
3533 const gfc_char_t
*advance
= expr
->value
.character
.string
;
3534 not_no
= gfc_wide_strlen (advance
) != 2
3535 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
3536 not_yes
= gfc_wide_strlen (advance
) != 3
3537 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
3545 io_constraint (not_no
&& not_yes
,
3546 "ADVANCE= specifier at %L must have value = "
3547 "YES or NO.", &expr
->where
);
3549 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
3550 "SIZE tag at %L requires an ADVANCE = 'NO'",
3553 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
3554 "EOR tag at %L requires an ADVANCE = 'NO'",
3558 expr
= dt
->format_expr
;
3559 if (gfc_simplify_expr (expr
, 0) == FAILURE
3560 || check_format_string (expr
, k
== M_READ
) == FAILURE
)
3565 #undef io_constraint
3568 /* Match a READ, WRITE or PRINT statement. */
3571 match_io (io_kind k
)
3573 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3582 where
= gfc_current_locus
;
3584 current_dt
= dt
= XCNEW (gfc_dt
);
3585 m
= gfc_match_char ('(');
3588 where
= gfc_current_locus
;
3591 else if (k
== M_PRINT
)
3593 /* Treat the non-standard case of PRINT namelist. */
3594 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
3595 && gfc_match_name (name
) == MATCH_YES
)
3597 gfc_find_symbol (name
, NULL
, 1, &sym
);
3598 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3600 if (gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
3601 "%C is an extension") == FAILURE
)
3607 dt
->io_unit
= default_unit (k
);
3612 gfc_current_locus
= where
;
3616 if (gfc_current_form
== FORM_FREE
)
3618 char c
= gfc_peek_ascii_char ();
3619 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
3626 m
= match_dt_format (dt
);
3627 if (m
== MATCH_ERROR
)
3633 dt
->io_unit
= default_unit (k
);
3638 /* Before issuing an error for a malformed 'print (1,*)' type of
3639 error, check for a default-char-expr of the form ('(I0)'). */
3640 if (k
== M_PRINT
&& m
== MATCH_YES
)
3642 /* Reset current locus to get the initial '(' in an expression. */
3643 gfc_current_locus
= where
;
3644 dt
->format_expr
= NULL
;
3645 m
= match_dt_format (dt
);
3647 if (m
== MATCH_ERROR
)
3649 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
3653 dt
->io_unit
= default_unit (k
);
3658 /* Match a control list */
3659 if (match_dt_element (k
, dt
) == MATCH_YES
)
3661 if (match_dt_unit (k
, dt
) != MATCH_YES
)
3664 if (gfc_match_char (')') == MATCH_YES
)
3666 if (gfc_match_char (',') != MATCH_YES
)
3669 m
= match_dt_element (k
, dt
);
3672 if (m
== MATCH_ERROR
)
3675 m
= match_dt_format (dt
);
3678 if (m
== MATCH_ERROR
)
3681 where
= gfc_current_locus
;
3683 m
= gfc_match_name (name
);
3686 gfc_find_symbol (name
, NULL
, 1, &sym
);
3687 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3690 if (k
== M_READ
&& check_namelist (sym
))
3699 gfc_current_locus
= where
;
3701 goto loop
; /* No matches, try regular elements */
3704 if (gfc_match_char (')') == MATCH_YES
)
3706 if (gfc_match_char (',') != MATCH_YES
)
3712 m
= match_dt_element (k
, dt
);
3715 if (m
== MATCH_ERROR
)
3718 if (gfc_match_char (')') == MATCH_YES
)
3720 if (gfc_match_char (',') != MATCH_YES
)
3726 /* Used in check_io_constraints, where no locus is available. */
3727 spec_end
= gfc_current_locus
;
3729 /* Save the IO kind for later use. */
3730 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
3732 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3733 to save the locus. This is used later when resolving transfer statements
3734 that might have a format expression without unit number. */
3735 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
3736 dt
->extra_comma
= dt
->dt_io_kind
;
3739 if (gfc_match_eos () != MATCH_YES
)
3741 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
3743 gfc_error ("Expected comma in I/O list at %C");
3748 m
= match_io_list (k
, &io_code
);
3749 if (m
== MATCH_ERROR
)
3755 /* A full IO statement has been matched. Check the constraints. spec_end is
3756 supplied for cases where no locus is supplied. */
3757 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
3759 if (m
== MATCH_ERROR
)
3762 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
3764 new_st
.block
= gfc_get_code ();
3765 new_st
.block
->op
= new_st
.op
;
3766 new_st
.block
->next
= io_code
;
3768 terminate_io (io_code
);
3773 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3783 gfc_match_read (void)
3785 return match_io (M_READ
);
3790 gfc_match_write (void)
3792 return match_io (M_WRITE
);
3797 gfc_match_print (void)
3801 m
= match_io (M_PRINT
);
3805 if (gfc_pure (NULL
))
3807 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3811 if (gfc_implicit_pure (NULL
))
3812 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3818 /* Free a gfc_inquire structure. */
3821 gfc_free_inquire (gfc_inquire
*inquire
)
3824 if (inquire
== NULL
)
3827 gfc_free_expr (inquire
->unit
);
3828 gfc_free_expr (inquire
->file
);
3829 gfc_free_expr (inquire
->iomsg
);
3830 gfc_free_expr (inquire
->iostat
);
3831 gfc_free_expr (inquire
->exist
);
3832 gfc_free_expr (inquire
->opened
);
3833 gfc_free_expr (inquire
->number
);
3834 gfc_free_expr (inquire
->named
);
3835 gfc_free_expr (inquire
->name
);
3836 gfc_free_expr (inquire
->access
);
3837 gfc_free_expr (inquire
->sequential
);
3838 gfc_free_expr (inquire
->direct
);
3839 gfc_free_expr (inquire
->form
);
3840 gfc_free_expr (inquire
->formatted
);
3841 gfc_free_expr (inquire
->unformatted
);
3842 gfc_free_expr (inquire
->recl
);
3843 gfc_free_expr (inquire
->nextrec
);
3844 gfc_free_expr (inquire
->blank
);
3845 gfc_free_expr (inquire
->position
);
3846 gfc_free_expr (inquire
->action
);
3847 gfc_free_expr (inquire
->read
);
3848 gfc_free_expr (inquire
->write
);
3849 gfc_free_expr (inquire
->readwrite
);
3850 gfc_free_expr (inquire
->delim
);
3851 gfc_free_expr (inquire
->encoding
);
3852 gfc_free_expr (inquire
->pad
);
3853 gfc_free_expr (inquire
->iolength
);
3854 gfc_free_expr (inquire
->convert
);
3855 gfc_free_expr (inquire
->strm_pos
);
3856 gfc_free_expr (inquire
->asynchronous
);
3857 gfc_free_expr (inquire
->decimal
);
3858 gfc_free_expr (inquire
->pending
);
3859 gfc_free_expr (inquire
->id
);
3860 gfc_free_expr (inquire
->sign
);
3861 gfc_free_expr (inquire
->size
);
3862 gfc_free_expr (inquire
->round
);
3867 /* Match an element of an INQUIRE statement. */
3869 #define RETM if (m != MATCH_NO) return m;
3872 match_inquire_element (gfc_inquire
*inquire
)
3876 m
= match_etag (&tag_unit
, &inquire
->unit
);
3877 RETM m
= match_etag (&tag_file
, &inquire
->file
);
3878 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
3879 RETM m
= match_out_tag (&tag_iomsg
, &inquire
->iomsg
);
3880 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
3881 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
3882 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
3883 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
3884 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
3885 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
3886 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
3887 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
3888 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
3889 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
3890 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
3891 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
3892 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
3893 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
3894 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
3895 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
3896 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
3897 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
3898 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
3899 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
3900 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
3901 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
3902 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
3903 RETM m
= match_vtag (&tag_size
, &inquire
->size
);
3904 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
3905 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
3906 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
3907 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
3908 RETM m
= match_vtag (&tag_iolength
, &inquire
->iolength
);
3909 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
3910 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
3911 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
3912 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
3913 RETM
return MATCH_NO
;
3920 gfc_match_inquire (void)
3922 gfc_inquire
*inquire
;
3927 m
= gfc_match_char ('(');
3931 inquire
= XCNEW (gfc_inquire
);
3933 loc
= gfc_current_locus
;
3935 m
= match_inquire_element (inquire
);
3936 if (m
== MATCH_ERROR
)
3940 m
= gfc_match_expr (&inquire
->unit
);
3941 if (m
== MATCH_ERROR
)
3947 /* See if we have the IOLENGTH form of the inquire statement. */
3948 if (inquire
->iolength
!= NULL
)
3950 if (gfc_match_char (')') != MATCH_YES
)
3953 m
= match_io_list (M_INQUIRE
, &code
);
3954 if (m
== MATCH_ERROR
)
3959 new_st
.op
= EXEC_IOLENGTH
;
3960 new_st
.expr1
= inquire
->iolength
;
3961 new_st
.ext
.inquire
= inquire
;
3963 if (gfc_pure (NULL
))
3965 gfc_free_statements (code
);
3966 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3970 if (gfc_implicit_pure (NULL
))
3971 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3973 new_st
.block
= gfc_get_code ();
3974 new_st
.block
->op
= EXEC_IOLENGTH
;
3975 terminate_io (code
);
3976 new_st
.block
->next
= code
;
3980 /* At this point, we have the non-IOLENGTH inquire statement. */
3983 if (gfc_match_char (')') == MATCH_YES
)
3985 if (gfc_match_char (',') != MATCH_YES
)
3988 m
= match_inquire_element (inquire
);
3989 if (m
== MATCH_ERROR
)
3994 if (inquire
->iolength
!= NULL
)
3996 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4001 if (gfc_match_eos () != MATCH_YES
)
4004 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
4006 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4007 "UNIT specifiers", &loc
);
4011 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4013 gfc_error ("INQUIRE statement at %L requires either FILE or "
4014 "UNIT specifier", &loc
);
4018 if (gfc_pure (NULL
))
4020 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4024 if (gfc_implicit_pure (NULL
))
4025 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
4027 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4029 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4030 "the ID= specifier", &loc
);
4034 new_st
.op
= EXEC_INQUIRE
;
4035 new_st
.ext
.inquire
= inquire
;
4039 gfc_syntax_error (ST_INQUIRE
);
4042 gfc_free_inquire (inquire
);
4047 /* Resolve everything in a gfc_inquire structure. */
4050 gfc_resolve_inquire (gfc_inquire
*inquire
)
4052 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4053 RESOLVE_TAG (&tag_file
, inquire
->file
);
4054 RESOLVE_TAG (&tag_id
, inquire
->id
);
4056 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4057 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4058 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4059 RESOLVE_TAG (tag, expr); \
4063 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4064 if (gfc_check_vardef_context ((expr), false, false, context) == FAILURE) \
4067 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4068 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4069 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4070 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4071 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4072 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4073 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4074 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4075 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4076 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4077 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4078 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4079 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4080 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4081 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4082 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4083 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4084 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4085 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4086 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4087 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4088 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4089 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4090 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4091 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4092 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4093 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4094 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4095 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4096 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4097 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4098 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4099 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4100 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4101 #undef INQUIRE_RESOLVE_TAG
4103 if (gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
) == FAILURE
)
4111 gfc_free_wait (gfc_wait
*wait
)
4116 gfc_free_expr (wait
->unit
);
4117 gfc_free_expr (wait
->iostat
);
4118 gfc_free_expr (wait
->iomsg
);
4119 gfc_free_expr (wait
->id
);
4124 gfc_resolve_wait (gfc_wait
*wait
)
4126 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4127 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4128 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4129 RESOLVE_TAG (&tag_id
, wait
->id
);
4131 if (gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
) == FAILURE
)
4134 if (gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
) == FAILURE
)
4140 /* Match an element of a WAIT statement. */
4142 #define RETM if (m != MATCH_NO) return m;
4145 match_wait_element (gfc_wait
*wait
)
4149 m
= match_etag (&tag_unit
, &wait
->unit
);
4150 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4151 RETM m
= match_ltag (&tag_end
, &wait
->eor
);
4152 RETM m
= match_ltag (&tag_eor
, &wait
->end
);
4153 RETM m
= match_out_tag (&tag_iomsg
, &wait
->iomsg
);
4154 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4155 RETM m
= match_etag (&tag_id
, &wait
->id
);
4156 RETM
return MATCH_NO
;
4163 gfc_match_wait (void)
4168 m
= gfc_match_char ('(');
4172 wait
= XCNEW (gfc_wait
);
4174 m
= match_wait_element (wait
);
4175 if (m
== MATCH_ERROR
)
4179 m
= gfc_match_expr (&wait
->unit
);
4180 if (m
== MATCH_ERROR
)
4188 if (gfc_match_char (')') == MATCH_YES
)
4190 if (gfc_match_char (',') != MATCH_YES
)
4193 m
= match_wait_element (wait
);
4194 if (m
== MATCH_ERROR
)
4200 if (gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4201 "not allowed in Fortran 95") == FAILURE
)
4204 if (gfc_pure (NULL
))
4206 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4210 if (gfc_implicit_pure (NULL
))
4211 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
4213 new_st
.op
= EXEC_WAIT
;
4214 new_st
.ext
.wait
= wait
;
4219 gfc_syntax_error (ST_WAIT
);
4222 gfc_free_wait (wait
);