1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000-2013 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 format_asterisk
= {0, NULL
, NULL
, -1, ST_LABEL_FORMAT
, ST_LABEL_FORMAT
, NULL
,
35 const char *name
, *spec
, *value
;
41 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
42 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
43 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
44 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
45 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
46 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
47 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
48 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
49 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
50 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
51 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
52 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
53 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
54 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
55 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
56 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
57 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
58 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
59 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
60 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
61 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
62 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
63 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
64 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
65 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
66 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
67 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
68 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
69 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
70 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
71 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
72 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
73 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
74 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
75 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
76 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
77 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
78 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
79 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
80 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
81 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
82 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
83 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
84 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
85 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
86 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
87 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
88 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
89 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
90 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
91 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
92 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
93 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
94 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
95 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
96 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
97 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
98 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
},
99 tag_s_iqstream
= {"STREAM", " stream =", " %v", BT_CHARACTER
};
101 static gfc_dt
*current_dt
;
103 #define RESOLVE_TAG(x, y) if (!resolve_tag (x, y)) return false;
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
);
248 c
= next_char_not_space (&error
);
259 c
= next_char_not_space (&error
);
261 value
= 10 * value
+ c
- '0';
270 token
= FMT_SIGNED_INT
;
289 c
= next_char_not_space (&error
);
292 value
= 10 * value
+ c
- '0';
300 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
324 c
= next_char_not_space (&error
);
352 c
= next_char_not_space (&error
);
353 if (c
!= 'P' && c
!= 'S')
360 c
= next_char_not_space (&error
);
361 if (c
== 'N' || c
== 'Z')
379 c
= next_char (INSTRING_WARN
);
388 c
= next_char (INSTRING_NOWARN
);
422 c
= next_char_not_space (&error
);
452 c
= next_char_not_space (&error
);
455 if (!gfc_notify_std (GFC_STD_F2003
, "DP format "
456 "specifier not allowed at %C"))
462 if (!gfc_notify_std (GFC_STD_F2003
, "DC format "
463 "specifier not allowed at %C"))
475 c
= next_char_not_space (&error
);
524 token_to_string (format_token t
)
543 /* Check a format statement. The format string, either from a FORMAT
544 statement or a constant in an I/O statement has already been parsed
545 by itself, and we are checking it for validity. The dual origin
546 means that the warning message is a little less than great. */
549 check_format (bool is_input
)
551 const char *posint_required
= _("Positive width required");
552 const char *nonneg_required
= _("Nonnegative width required");
553 const char *unexpected_element
= _("Unexpected element '%c' in format string"
555 const char *unexpected_end
= _("Unexpected end of format string");
556 const char *zero_width
= _("Zero width in format descriptor");
565 saved_token
= FMT_NONE
;
569 format_string_pos
= 0;
576 error
= _("Missing leading left parenthesis");
584 goto finished
; /* Empty format is legal */
588 /* In this state, the next thing has to be a format item. */
605 error
= _("Left parenthesis required after '*'");
630 /* Signed integer can only precede a P format. */
636 error
= _("Expected P edit descriptor");
643 /* P requires a prior number. */
644 error
= _("P descriptor requires leading scale factor");
648 /* X requires a prior number if we're being pedantic. */
649 if (mode
!= MODE_FORMAT
)
650 format_locus
.nextc
+= format_string_pos
;
651 if (!gfc_notify_std (GFC_STD_GNU
, "X descriptor requires leading "
652 "space count at %L", &format_locus
))
669 goto extension_optional_comma
;
680 if (!gfc_notify_std (GFC_STD_GNU
, "$ descriptor at %L", &format_locus
))
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
, "'G0' in format at %L",
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
, "Missing comma at %L", &format_locus
))
1061 /* If we do not actually return a failure, we need to unwind this
1062 before the next round. */
1063 if (mode
!= MODE_FORMAT
)
1064 format_locus
.nextc
-= format_string_pos
;
1069 /* Optional comma is a weird between state where we've just finished
1070 reading a colon, slash, dollar or P descriptor. */
1087 /* Assume that we have another format item. */
1094 extension_optional_comma
:
1095 /* As a GNU extension, permit a missing comma after a string literal. */
1112 goto optional_comma
;
1115 error
= unexpected_end
;
1119 if (mode
!= MODE_FORMAT
)
1120 format_locus
.nextc
+= format_string_pos
;
1121 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1123 /* If we do not actually return a failure, we need to unwind this
1124 before the next round. */
1125 if (mode
!= MODE_FORMAT
)
1126 format_locus
.nextc
-= format_string_pos
;
1134 if (mode
!= MODE_FORMAT
)
1135 format_locus
.nextc
+= format_string_pos
;
1136 if (error
== unexpected_element
)
1137 gfc_error (error
, error_element
, &format_locus
);
1139 gfc_error ("%s in format string at %L", error
, &format_locus
);
1148 /* Given an expression node that is a constant string, see if it looks
1149 like a format string. */
1152 check_format_string (gfc_expr
*e
, bool is_input
)
1156 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1160 format_string
= e
->value
.character
.string
;
1162 /* More elaborate measures are needed to show where a problem is within a
1163 format string that has been calculated, but that's probably not worth the
1165 format_locus
= e
->where
;
1166 rv
= check_format (is_input
);
1167 /* check for extraneous characters at the end of an otherwise valid format
1168 string, like '(A10,I3)F5'
1169 start at the end and move back to the last character processed,
1171 if (rv
&& e
->value
.character
.length
> format_string_pos
)
1172 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1173 if (e
->value
.character
.string
[i
] != ' ')
1175 format_locus
.nextc
+= format_length
+ 1;
1176 gfc_warning ("Extraneous characters in format at %L", &format_locus
);
1183 /************ Fortran 95 I/O statement matchers *************/
1185 /* Match a FORMAT statement. This amounts to actually parsing the
1186 format descriptors in order to correctly locate the end of the
1190 gfc_match_format (void)
1195 if (gfc_current_ns
->proc_name
1196 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1198 gfc_error ("Format statement in module main block at %C");
1202 if (gfc_statement_label
== NULL
)
1204 gfc_error ("Missing format label at %C");
1207 gfc_gobble_whitespace ();
1212 start
= gfc_current_locus
;
1214 if (!check_format (false))
1217 if (gfc_match_eos () != MATCH_YES
)
1219 gfc_syntax_error (ST_FORMAT
);
1223 /* The label doesn't get created until after the statement is done
1224 being matched, so we have to leave the string for later. */
1226 gfc_current_locus
= start
; /* Back to the beginning */
1229 new_st
.op
= EXEC_NOP
;
1231 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1232 NULL
, format_length
);
1233 format_string
= e
->value
.character
.string
;
1234 gfc_statement_label
->format
= e
;
1237 check_format (false); /* Guaranteed to succeed */
1238 gfc_match_eos (); /* Guaranteed to succeed */
1244 /* Match an expression I/O tag of some sort. */
1247 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1252 m
= gfc_match (tag
->spec
);
1256 m
= gfc_match (tag
->value
, &result
);
1259 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1265 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1266 gfc_free_expr (result
);
1275 /* Match a variable I/O tag of some sort. */
1278 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1283 m
= gfc_match (tag
->spec
);
1287 m
= gfc_match (tag
->value
, &result
);
1290 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1296 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1297 gfc_free_expr (result
);
1301 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1303 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1304 gfc_free_expr (result
);
1308 if (gfc_pure (NULL
) && gfc_impure_variable (result
->symtree
->n
.sym
))
1310 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1312 gfc_free_expr (result
);
1316 if (gfc_implicit_pure (NULL
) && gfc_impure_variable (result
->symtree
->n
.sym
))
1317 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
1324 /* Match I/O tags that cause variables to become redefined. */
1327 match_out_tag (const io_tag
*tag
, gfc_expr
**result
)
1331 m
= match_vtag (tag
, result
);
1333 gfc_check_do_variable ((*result
)->symtree
);
1339 /* Match a label I/O tag. */
1342 match_ltag (const io_tag
*tag
, gfc_st_label
** label
)
1348 m
= gfc_match (tag
->spec
);
1352 m
= gfc_match (tag
->value
, label
);
1355 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1361 gfc_error ("Duplicate %s label specification at %C", tag
->name
);
1365 if (!gfc_reference_st_label (*label
, ST_LABEL_TARGET
))
1372 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1375 resolve_tag_format (const gfc_expr
*e
)
1377 if (e
->expr_type
== EXPR_CONSTANT
1378 && (e
->ts
.type
!= BT_CHARACTER
1379 || e
->ts
.kind
!= gfc_default_character_kind
))
1381 gfc_error ("Constant expression in FORMAT tag at %L must be "
1382 "of type default CHARACTER", &e
->where
);
1386 /* If e's rank is zero and e is not an element of an array, it should be
1387 of integer or character type. The integer variable should be
1390 && (e
->expr_type
!= EXPR_VARIABLE
1391 || e
->symtree
== NULL
1392 || e
->symtree
->n
.sym
->as
== NULL
1393 || e
->symtree
->n
.sym
->as
->rank
== 0))
1395 if ((e
->ts
.type
!= BT_CHARACTER
1396 || e
->ts
.kind
!= gfc_default_character_kind
)
1397 && e
->ts
.type
!= BT_INTEGER
)
1399 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1400 "or of INTEGER", &e
->where
);
1403 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1405 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGNED variable in "
1406 "FORMAT tag at %L", &e
->where
))
1408 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1410 gfc_error ("Variable '%s' at %L has not been assigned a "
1411 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1415 else if (e
->ts
.type
== BT_INTEGER
)
1417 gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
1418 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1425 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1426 It may be assigned an Hollerith constant. */
1427 if (e
->ts
.type
!= BT_CHARACTER
)
1429 if (!gfc_notify_std (GFC_STD_LEGACY
, "Non-character in FORMAT tag "
1430 "at %L", &e
->where
))
1433 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1435 gfc_error ("Non-character assumed shape array element in FORMAT"
1436 " tag at %L", &e
->where
);
1440 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1442 gfc_error ("Non-character assumed size array element in FORMAT"
1443 " tag at %L", &e
->where
);
1447 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1449 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1459 /* Do expression resolution and type-checking on an expression tag. */
1462 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1467 if (!gfc_resolve_expr (e
))
1470 if (tag
== &tag_format
)
1471 return resolve_tag_format (e
);
1473 if (e
->ts
.type
!= tag
->type
)
1475 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1476 &e
->where
, gfc_basic_typename (tag
->type
));
1480 if (e
->ts
.type
== BT_CHARACTER
&& e
->ts
.kind
!= gfc_default_character_kind
)
1482 gfc_error ("%s tag at %L must be a character string of default kind",
1483 tag
->name
, &e
->where
);
1489 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1493 if (tag
== &tag_iomsg
)
1495 if (!gfc_notify_std (GFC_STD_F2003
, "IOMSG tag at %L", &e
->where
))
1499 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
)
1500 && e
->ts
.kind
!= gfc_default_integer_kind
)
1502 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1503 "INTEGER in %s tag at %L", tag
->name
, &e
->where
))
1507 if (tag
== &tag_exist
&& e
->ts
.kind
!= gfc_default_logical_kind
)
1509 if (!gfc_notify_std (GFC_STD_F2008
, "Nondefault LOGICAL "
1510 "in %s tag at %L", tag
->name
, &e
->where
))
1514 if (tag
== &tag_newunit
)
1516 if (!gfc_notify_std (GFC_STD_F2008
, "NEWUNIT specifier at %L",
1521 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1522 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1523 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1527 sprintf (context
, _("%s tag"), tag
->name
);
1528 if (!gfc_check_vardef_context (e
, false, false, false, context
))
1532 if (tag
== &tag_convert
)
1534 if (!gfc_notify_std (GFC_STD_GNU
, "CONVERT tag at %L", &e
->where
))
1542 /* Match a single tag of an OPEN statement. */
1545 match_open_element (gfc_open
*open
)
1549 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1552 m
= match_etag (&tag_unit
, &open
->unit
);
1555 m
= match_out_tag (&tag_iomsg
, &open
->iomsg
);
1558 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1561 m
= match_etag (&tag_file
, &open
->file
);
1564 m
= match_etag (&tag_status
, &open
->status
);
1567 m
= match_etag (&tag_e_access
, &open
->access
);
1570 m
= match_etag (&tag_e_form
, &open
->form
);
1573 m
= match_etag (&tag_e_recl
, &open
->recl
);
1576 m
= match_etag (&tag_e_blank
, &open
->blank
);
1579 m
= match_etag (&tag_e_position
, &open
->position
);
1582 m
= match_etag (&tag_e_action
, &open
->action
);
1585 m
= match_etag (&tag_e_delim
, &open
->delim
);
1588 m
= match_etag (&tag_e_pad
, &open
->pad
);
1591 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1594 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1597 m
= match_etag (&tag_e_round
, &open
->round
);
1600 m
= match_etag (&tag_e_sign
, &open
->sign
);
1603 m
= match_ltag (&tag_err
, &open
->err
);
1606 m
= match_etag (&tag_convert
, &open
->convert
);
1609 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1617 /* Free the gfc_open structure and all the expressions it contains. */
1620 gfc_free_open (gfc_open
*open
)
1625 gfc_free_expr (open
->unit
);
1626 gfc_free_expr (open
->iomsg
);
1627 gfc_free_expr (open
->iostat
);
1628 gfc_free_expr (open
->file
);
1629 gfc_free_expr (open
->status
);
1630 gfc_free_expr (open
->access
);
1631 gfc_free_expr (open
->form
);
1632 gfc_free_expr (open
->recl
);
1633 gfc_free_expr (open
->blank
);
1634 gfc_free_expr (open
->position
);
1635 gfc_free_expr (open
->action
);
1636 gfc_free_expr (open
->delim
);
1637 gfc_free_expr (open
->pad
);
1638 gfc_free_expr (open
->decimal
);
1639 gfc_free_expr (open
->encoding
);
1640 gfc_free_expr (open
->round
);
1641 gfc_free_expr (open
->sign
);
1642 gfc_free_expr (open
->convert
);
1643 gfc_free_expr (open
->asynchronous
);
1644 gfc_free_expr (open
->newunit
);
1649 /* Resolve everything in a gfc_open structure. */
1652 gfc_resolve_open (gfc_open
*open
)
1655 RESOLVE_TAG (&tag_unit
, open
->unit
);
1656 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1657 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1658 RESOLVE_TAG (&tag_file
, open
->file
);
1659 RESOLVE_TAG (&tag_status
, open
->status
);
1660 RESOLVE_TAG (&tag_e_access
, open
->access
);
1661 RESOLVE_TAG (&tag_e_form
, open
->form
);
1662 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1663 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1664 RESOLVE_TAG (&tag_e_position
, open
->position
);
1665 RESOLVE_TAG (&tag_e_action
, open
->action
);
1666 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1667 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1668 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1669 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1670 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1671 RESOLVE_TAG (&tag_e_round
, open
->round
);
1672 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1673 RESOLVE_TAG (&tag_convert
, open
->convert
);
1674 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1676 if (!gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
))
1683 /* Check if a given value for a SPECIFIER is either in the list of values
1684 allowed in F95 or F2003, issuing an error message and returning a zero
1685 value if it is not allowed. */
1688 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1689 const char *allowed_f2003
[],
1690 const char *allowed_gnu
[], gfc_char_t
*value
,
1691 const char *statement
, bool warn
)
1696 len
= gfc_wide_strlen (value
);
1699 for (len
--; len
> 0; len
--)
1700 if (value
[len
] != ' ')
1705 for (i
= 0; allowed
[i
]; i
++)
1706 if (len
== strlen (allowed
[i
])
1707 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
1710 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
1711 if (len
== strlen (allowed_f2003
[i
])
1712 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
1713 strlen (allowed_f2003
[i
])) == 0)
1715 notification n
= gfc_notification_std (GFC_STD_F2003
);
1717 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1719 gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1720 "has value '%s'", specifier
, statement
,
1727 gfc_notify_std (GFC_STD_F2003
, "%s specifier in "
1728 "%s statement at %C has value '%s'", specifier
,
1729 statement
, allowed_f2003
[i
]);
1737 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
1738 if (len
== strlen (allowed_gnu
[i
])
1739 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
1740 strlen (allowed_gnu
[i
])) == 0)
1742 notification n
= gfc_notification_std (GFC_STD_GNU
);
1744 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1746 gfc_warning ("Extension: %s specifier in %s statement at %C "
1747 "has value '%s'", specifier
, statement
,
1754 gfc_notify_std (GFC_STD_GNU
, "%s specifier in "
1755 "%s statement at %C has value '%s'", specifier
,
1756 statement
, allowed_gnu
[i
]);
1766 char *s
= gfc_widechar_to_char (value
, -1);
1767 gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1768 specifier
, statement
, s
);
1774 char *s
= gfc_widechar_to_char (value
, -1);
1775 gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1776 specifier
, statement
, s
);
1783 /* Match an OPEN statement. */
1786 gfc_match_open (void)
1792 m
= gfc_match_char ('(');
1796 open
= XCNEW (gfc_open
);
1798 m
= match_open_element (open
);
1800 if (m
== MATCH_ERROR
)
1804 m
= gfc_match_expr (&open
->unit
);
1805 if (m
== MATCH_ERROR
)
1811 if (gfc_match_char (')') == MATCH_YES
)
1813 if (gfc_match_char (',') != MATCH_YES
)
1816 m
= match_open_element (open
);
1817 if (m
== MATCH_ERROR
)
1823 if (gfc_match_eos () == MATCH_NO
)
1826 if (gfc_pure (NULL
))
1828 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1832 if (gfc_implicit_pure (NULL
))
1833 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
1835 warn
= (open
->err
|| open
->iostat
) ? true : false;
1837 /* Checks on NEWUNIT specifier. */
1842 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1846 if (!(open
->file
|| (open
->status
1847 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
1848 "scratch", 7) == 0)))
1850 gfc_error ("NEWUNIT specifier must have FILE= "
1851 "or STATUS='scratch' at %C");
1855 else if (!open
->unit
)
1857 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1861 /* Checks on the ACCESS specifier. */
1862 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
1864 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
1865 static const char *access_f2003
[] = { "STREAM", NULL
};
1866 static const char *access_gnu
[] = { "APPEND", NULL
};
1868 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
1870 open
->access
->value
.character
.string
,
1875 /* Checks on the ACTION specifier. */
1876 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
1878 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
1880 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
1881 open
->action
->value
.character
.string
,
1886 /* Checks on the ASYNCHRONOUS specifier. */
1887 if (open
->asynchronous
)
1889 if (!gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
1890 "not allowed in Fortran 95"))
1893 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
1895 static const char * asynchronous
[] = { "YES", "NO", NULL
};
1897 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
1898 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
1904 /* Checks on the BLANK specifier. */
1907 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
1908 "not allowed in Fortran 95"))
1911 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
1913 static const char *blank
[] = { "ZERO", "NULL", NULL
};
1915 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
1916 open
->blank
->value
.character
.string
,
1922 /* Checks on the DECIMAL specifier. */
1925 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
1926 "not allowed in Fortran 95"))
1929 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
1931 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
1933 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
1934 open
->decimal
->value
.character
.string
,
1940 /* Checks on the DELIM specifier. */
1943 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
1945 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
1947 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
1948 open
->delim
->value
.character
.string
,
1954 /* Checks on the ENCODING specifier. */
1957 if (!gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
1958 "not allowed in Fortran 95"))
1961 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
1963 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
1965 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
1966 open
->encoding
->value
.character
.string
,
1972 /* Checks on the FORM specifier. */
1973 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
1975 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
1977 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
1978 open
->form
->value
.character
.string
,
1983 /* Checks on the PAD specifier. */
1984 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
1986 static const char *pad
[] = { "YES", "NO", NULL
};
1988 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
1989 open
->pad
->value
.character
.string
,
1994 /* Checks on the POSITION specifier. */
1995 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
1997 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
1999 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2000 open
->position
->value
.character
.string
,
2005 /* Checks on the ROUND specifier. */
2008 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2009 "not allowed in Fortran 95"))
2012 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2014 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2015 "COMPATIBLE", "PROCESSOR_DEFINED",
2018 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2019 open
->round
->value
.character
.string
,
2025 /* Checks on the SIGN specifier. */
2028 if (!gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2029 "not allowed in Fortran 95"))
2032 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2034 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2037 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2038 open
->sign
->value
.character
.string
,
2044 #define warn_or_error(...) \
2047 gfc_warning (__VA_ARGS__); \
2050 gfc_error (__VA_ARGS__); \
2055 /* Checks on the RECL specifier. */
2056 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2057 && open
->recl
->ts
.type
== BT_INTEGER
2058 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2060 warn_or_error ("RECL in OPEN statement at %C must be positive");
2063 /* Checks on the STATUS specifier. */
2064 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2066 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2067 "REPLACE", "UNKNOWN", NULL
};
2069 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2070 open
->status
->value
.character
.string
,
2074 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2075 the FILE= specifier shall appear. */
2076 if (open
->file
== NULL
2077 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2079 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2082 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2084 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2085 "'%s' and no FILE specifier is present", s
);
2089 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2090 the FILE= specifier shall not appear. */
2091 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2092 "scratch", 7) == 0 && open
->file
)
2094 warn_or_error ("The STATUS specified in OPEN statement at %C "
2095 "cannot have the value SCRATCH if a FILE specifier "
2100 /* Things that are not allowed for unformatted I/O. */
2101 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2102 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2103 || open
->sign
|| open
->pad
|| open
->blank
)
2104 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2105 "unformatted", 11) == 0)
2107 const char *spec
= (open
->delim
? "DELIM "
2108 : (open
->pad
? "PAD " : open
->blank
2111 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2112 "unformatted I/O", spec
);
2115 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2116 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2119 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2124 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2125 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2126 "sequential", 10) == 0
2127 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2129 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2132 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2133 "for stream or sequential ACCESS");
2136 #undef warn_or_error
2138 new_st
.op
= EXEC_OPEN
;
2139 new_st
.ext
.open
= open
;
2143 gfc_syntax_error (ST_OPEN
);
2146 gfc_free_open (open
);
2151 /* Free a gfc_close structure an all its expressions. */
2154 gfc_free_close (gfc_close
*close
)
2159 gfc_free_expr (close
->unit
);
2160 gfc_free_expr (close
->iomsg
);
2161 gfc_free_expr (close
->iostat
);
2162 gfc_free_expr (close
->status
);
2167 /* Match elements of a CLOSE statement. */
2170 match_close_element (gfc_close
*close
)
2174 m
= match_etag (&tag_unit
, &close
->unit
);
2177 m
= match_etag (&tag_status
, &close
->status
);
2180 m
= match_out_tag (&tag_iomsg
, &close
->iomsg
);
2183 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2186 m
= match_ltag (&tag_err
, &close
->err
);
2194 /* Match a CLOSE statement. */
2197 gfc_match_close (void)
2203 m
= gfc_match_char ('(');
2207 close
= XCNEW (gfc_close
);
2209 m
= match_close_element (close
);
2211 if (m
== MATCH_ERROR
)
2215 m
= gfc_match_expr (&close
->unit
);
2218 if (m
== MATCH_ERROR
)
2224 if (gfc_match_char (')') == MATCH_YES
)
2226 if (gfc_match_char (',') != MATCH_YES
)
2229 m
= match_close_element (close
);
2230 if (m
== MATCH_ERROR
)
2236 if (gfc_match_eos () == MATCH_NO
)
2239 if (gfc_pure (NULL
))
2241 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2245 if (gfc_implicit_pure (NULL
))
2246 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2248 warn
= (close
->iostat
|| close
->err
) ? true : false;
2250 /* Checks on the STATUS specifier. */
2251 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2253 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2255 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2256 close
->status
->value
.character
.string
,
2261 new_st
.op
= EXEC_CLOSE
;
2262 new_st
.ext
.close
= close
;
2266 gfc_syntax_error (ST_CLOSE
);
2269 gfc_free_close (close
);
2274 /* Resolve everything in a gfc_close structure. */
2277 gfc_resolve_close (gfc_close
*close
)
2279 RESOLVE_TAG (&tag_unit
, close
->unit
);
2280 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2281 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2282 RESOLVE_TAG (&tag_status
, close
->status
);
2284 if (!gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
))
2287 if (close
->unit
== NULL
)
2289 /* Find a locus from one of the arguments to close, when UNIT is
2291 locus loc
= gfc_current_locus
;
2293 loc
= close
->status
->where
;
2294 else if (close
->iostat
)
2295 loc
= close
->iostat
->where
;
2296 else if (close
->iomsg
)
2297 loc
= close
->iomsg
->where
;
2298 else if (close
->err
)
2299 loc
= close
->err
->where
;
2301 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2305 if (close
->unit
->expr_type
== EXPR_CONSTANT
2306 && close
->unit
->ts
.type
== BT_INTEGER
2307 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2309 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2310 &close
->unit
->where
);
2317 /* Free a gfc_filepos structure. */
2320 gfc_free_filepos (gfc_filepos
*fp
)
2322 gfc_free_expr (fp
->unit
);
2323 gfc_free_expr (fp
->iomsg
);
2324 gfc_free_expr (fp
->iostat
);
2329 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2332 match_file_element (gfc_filepos
*fp
)
2336 m
= match_etag (&tag_unit
, &fp
->unit
);
2339 m
= match_out_tag (&tag_iomsg
, &fp
->iomsg
);
2342 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2345 m
= match_ltag (&tag_err
, &fp
->err
);
2353 /* Match the second half of the file-positioning statements, REWIND,
2354 BACKSPACE, ENDFILE, or the FLUSH statement. */
2357 match_filepos (gfc_statement st
, gfc_exec_op op
)
2362 fp
= XCNEW (gfc_filepos
);
2364 if (gfc_match_char ('(') == MATCH_NO
)
2366 m
= gfc_match_expr (&fp
->unit
);
2367 if (m
== MATCH_ERROR
)
2375 m
= match_file_element (fp
);
2376 if (m
== MATCH_ERROR
)
2380 m
= gfc_match_expr (&fp
->unit
);
2381 if (m
== MATCH_ERROR
)
2389 if (gfc_match_char (')') == MATCH_YES
)
2391 if (gfc_match_char (',') != MATCH_YES
)
2394 m
= match_file_element (fp
);
2395 if (m
== MATCH_ERROR
)
2402 if (gfc_match_eos () != MATCH_YES
)
2405 if (gfc_pure (NULL
))
2407 gfc_error ("%s statement not allowed in PURE procedure at %C",
2408 gfc_ascii_statement (st
));
2413 if (gfc_implicit_pure (NULL
))
2414 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2417 new_st
.ext
.filepos
= fp
;
2421 gfc_syntax_error (st
);
2424 gfc_free_filepos (fp
);
2430 gfc_resolve_filepos (gfc_filepos
*fp
)
2432 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2433 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2434 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2435 if (!gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
))
2438 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2439 && fp
->unit
->ts
.type
== BT_INTEGER
2440 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2442 gfc_error ("UNIT number in statement at %L must be non-negative",
2450 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2451 and the FLUSH statement. */
2454 gfc_match_endfile (void)
2456 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2460 gfc_match_backspace (void)
2462 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2466 gfc_match_rewind (void)
2468 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2472 gfc_match_flush (void)
2474 if (!gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C"))
2477 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2480 /******************** Data Transfer Statements *********************/
2482 /* Return a default unit number. */
2485 default_unit (io_kind k
)
2494 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2498 /* Match a unit specification for a data transfer statement. */
2501 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2505 if (gfc_match_char ('*') == MATCH_YES
)
2507 if (dt
->io_unit
!= NULL
)
2510 dt
->io_unit
= default_unit (k
);
2514 if (gfc_match_expr (&e
) == MATCH_YES
)
2516 if (dt
->io_unit
!= NULL
)
2529 gfc_error ("Duplicate UNIT specification at %C");
2534 /* Match a format specification. */
2537 match_dt_format (gfc_dt
*dt
)
2541 gfc_st_label
*label
;
2544 where
= gfc_current_locus
;
2546 if (gfc_match_char ('*') == MATCH_YES
)
2548 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2551 dt
->format_label
= &format_asterisk
;
2555 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2559 /* Need to check if the format label is actually either an operand
2560 to a user-defined operator or is a kind type parameter. That is,
2561 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2562 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2564 gfc_gobble_whitespace ();
2565 c
= gfc_peek_ascii_char ();
2566 if (c
== '.' || c
== '_')
2567 gfc_current_locus
= where
;
2570 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2572 gfc_free_st_label (label
);
2576 if (!gfc_reference_st_label (label
, ST_LABEL_FORMAT
))
2579 dt
->format_label
= label
;
2583 else if (m
== MATCH_ERROR
)
2584 /* The label was zero or too large. Emit the correct diagnosis. */
2587 if (gfc_match_expr (&e
) == MATCH_YES
)
2589 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2594 dt
->format_expr
= e
;
2598 gfc_current_locus
= where
; /* The only case where we have to restore */
2603 gfc_error ("Duplicate format specification at %C");
2608 /* Traverse a namelist that is part of a READ statement to make sure
2609 that none of the variables in the namelist are INTENT(IN). Returns
2610 nonzero if we find such a variable. */
2613 check_namelist (gfc_symbol
*sym
)
2617 for (p
= sym
->namelist
; p
; p
= p
->next
)
2618 if (p
->sym
->attr
.intent
== INTENT_IN
)
2620 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2621 p
->sym
->name
, sym
->name
);
2629 /* Match a single data transfer element. */
2632 match_dt_element (io_kind k
, gfc_dt
*dt
)
2634 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2638 if (gfc_match (" unit =") == MATCH_YES
)
2640 m
= match_dt_unit (k
, dt
);
2645 if (gfc_match (" fmt =") == MATCH_YES
)
2647 m
= match_dt_format (dt
);
2652 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
2654 if (dt
->namelist
!= NULL
)
2656 gfc_error ("Duplicate NML specification at %C");
2660 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
2663 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
2665 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2666 sym
!= NULL
? sym
->name
: name
);
2671 if (k
== M_READ
&& check_namelist (sym
))
2677 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
2680 m
= match_etag (&tag_e_blank
, &dt
->blank
);
2683 m
= match_etag (&tag_e_delim
, &dt
->delim
);
2686 m
= match_etag (&tag_e_pad
, &dt
->pad
);
2689 m
= match_etag (&tag_e_sign
, &dt
->sign
);
2692 m
= match_etag (&tag_e_round
, &dt
->round
);
2695 m
= match_out_tag (&tag_id
, &dt
->id
);
2698 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
2701 m
= match_etag (&tag_rec
, &dt
->rec
);
2704 m
= match_etag (&tag_spos
, &dt
->pos
);
2707 m
= match_out_tag (&tag_iomsg
, &dt
->iomsg
);
2710 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
2713 m
= match_ltag (&tag_err
, &dt
->err
);
2715 dt
->err_where
= gfc_current_locus
;
2718 m
= match_etag (&tag_advance
, &dt
->advance
);
2721 m
= match_out_tag (&tag_size
, &dt
->size
);
2725 m
= match_ltag (&tag_end
, &dt
->end
);
2730 gfc_error ("END tag at %C not allowed in output statement");
2733 dt
->end_where
= gfc_current_locus
;
2738 m
= match_ltag (&tag_eor
, &dt
->eor
);
2740 dt
->eor_where
= gfc_current_locus
;
2748 /* Free a data transfer structure and everything below it. */
2751 gfc_free_dt (gfc_dt
*dt
)
2756 gfc_free_expr (dt
->io_unit
);
2757 gfc_free_expr (dt
->format_expr
);
2758 gfc_free_expr (dt
->rec
);
2759 gfc_free_expr (dt
->advance
);
2760 gfc_free_expr (dt
->iomsg
);
2761 gfc_free_expr (dt
->iostat
);
2762 gfc_free_expr (dt
->size
);
2763 gfc_free_expr (dt
->pad
);
2764 gfc_free_expr (dt
->delim
);
2765 gfc_free_expr (dt
->sign
);
2766 gfc_free_expr (dt
->round
);
2767 gfc_free_expr (dt
->blank
);
2768 gfc_free_expr (dt
->decimal
);
2769 gfc_free_expr (dt
->pos
);
2770 gfc_free_expr (dt
->dt_io_kind
);
2771 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2776 /* Resolve everything in a gfc_dt structure. */
2779 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
2784 /* This is set in any case. */
2785 gcc_assert (dt
->dt_io_kind
);
2786 k
= dt
->dt_io_kind
->value
.iokind
;
2788 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
2789 RESOLVE_TAG (&tag_rec
, dt
->rec
);
2790 RESOLVE_TAG (&tag_spos
, dt
->pos
);
2791 RESOLVE_TAG (&tag_advance
, dt
->advance
);
2792 RESOLVE_TAG (&tag_id
, dt
->id
);
2793 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
2794 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
2795 RESOLVE_TAG (&tag_size
, dt
->size
);
2796 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
2797 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
2798 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
2799 RESOLVE_TAG (&tag_e_round
, dt
->round
);
2800 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
2801 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
2802 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
2807 gfc_error ("UNIT not specified at %L", loc
);
2811 if (gfc_resolve_expr (e
)
2812 && (e
->ts
.type
!= BT_INTEGER
2813 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
2815 /* If there is no extra comma signifying the "format" form of the IO
2816 statement, then this must be an error. */
2817 if (!dt
->extra_comma
)
2819 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2820 "or a CHARACTER variable", &e
->where
);
2825 /* At this point, we have an extra comma. If io_unit has arrived as
2826 type character, we assume its really the "format" form of the I/O
2827 statement. We set the io_unit to the default unit and format to
2828 the character expression. See F95 Standard section 9.4. */
2829 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
2831 dt
->format_expr
= dt
->io_unit
;
2832 dt
->io_unit
= default_unit (k
);
2834 /* Nullify this pointer now so that a warning/error is not
2835 triggered below for the "Extension". */
2836 dt
->extra_comma
= NULL
;
2841 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2842 &dt
->extra_comma
->where
);
2848 if (e
->ts
.type
== BT_CHARACTER
)
2850 if (gfc_has_vector_index (e
))
2852 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
2856 /* If we are writing, make sure the internal unit can be changed. */
2857 gcc_assert (k
!= M_PRINT
);
2859 && !gfc_check_vardef_context (e
, false, false, false,
2860 _("internal unit in WRITE")))
2864 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
2866 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
2870 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
2871 && mpz_sgn (e
->value
.integer
) < 0)
2873 gfc_error ("UNIT number in statement at %L must be non-negative",
2878 /* If we are reading and have a namelist, check that all namelist symbols
2879 can appear in a variable definition context. */
2880 if (k
== M_READ
&& dt
->namelist
)
2883 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
2888 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
2889 t
= gfc_check_vardef_context (e
, false, false, false, NULL
);
2894 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2895 " the symbol '%s' which may not appear in a"
2896 " variable definition context",
2897 dt
->namelist
->name
, loc
, n
->sym
->name
);
2904 && !gfc_notify_std (GFC_STD_GNU
, "Comma before i/o item list at %L",
2905 &dt
->extra_comma
->where
))
2910 if (!gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
))
2912 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
2914 gfc_error ("ERR tag label %d at %L not defined",
2915 dt
->err
->value
, &dt
->err_where
);
2922 if (!gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
))
2924 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
2926 gfc_error ("END tag label %d at %L not defined",
2927 dt
->end
->value
, &dt
->end_where
);
2934 if (!gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
))
2936 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
2938 gfc_error ("EOR tag label %d at %L not defined",
2939 dt
->eor
->value
, &dt
->eor_where
);
2944 /* Check the format label actually exists. */
2945 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
2946 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
2948 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
2949 &dt
->format_label
->where
);
2957 /* Given an io_kind, return its name. */
2960 io_kind_name (io_kind k
)
2979 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2986 /* Match an IO iteration statement of the form:
2988 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2990 which is equivalent to a single IO element. This function is
2991 mutually recursive with match_io_element(). */
2993 static match
match_io_element (io_kind
, gfc_code
**);
2996 match_io_iterator (io_kind k
, gfc_code
**result
)
2998 gfc_code
*head
, *tail
, *new_code
;
3006 old_loc
= gfc_current_locus
;
3008 if (gfc_match_char ('(') != MATCH_YES
)
3011 m
= match_io_element (k
, &head
);
3014 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3020 /* Can't be anything but an IO iterator. Build a list. */
3021 iter
= gfc_get_iterator ();
3025 m
= gfc_match_iterator (iter
, 0);
3026 if (m
== MATCH_ERROR
)
3030 gfc_check_do_variable (iter
->var
->symtree
);
3034 m
= match_io_element (k
, &new_code
);
3035 if (m
== MATCH_ERROR
)
3044 tail
= gfc_append_code (tail
, new_code
);
3046 if (gfc_match_char (',') != MATCH_YES
)
3055 if (gfc_match_char (')') != MATCH_YES
)
3058 new_code
= gfc_get_code ();
3059 new_code
->op
= EXEC_DO
;
3060 new_code
->ext
.iterator
= iter
;
3062 new_code
->block
= gfc_get_code ();
3063 new_code
->block
->op
= EXEC_DO
;
3064 new_code
->block
->next
= head
;
3070 gfc_error ("Syntax error in I/O iterator at %C");
3074 gfc_free_iterator (iter
, 1);
3075 gfc_free_statements (head
);
3076 gfc_current_locus
= old_loc
;
3081 /* Match a single element of an IO list, which is either a single
3082 expression or an IO Iterator. */
3085 match_io_element (io_kind k
, gfc_code
**cpp
)
3093 m
= match_io_iterator (k
, cpp
);
3099 m
= gfc_match_variable (&expr
, 0);
3101 gfc_error ("Expected variable in READ statement at %C");
3105 m
= gfc_match_expr (&expr
);
3107 gfc_error ("Expected expression in %s statement at %C",
3111 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3116 gfc_free_expr (expr
);
3120 cp
= gfc_get_code ();
3121 cp
->op
= EXEC_TRANSFER
;
3124 cp
->ext
.dt
= current_dt
;
3131 /* Match an I/O list, building gfc_code structures as we go. */
3134 match_io_list (io_kind k
, gfc_code
**head_p
)
3136 gfc_code
*head
, *tail
, *new_code
;
3139 *head_p
= head
= tail
= NULL
;
3140 if (gfc_match_eos () == MATCH_YES
)
3145 m
= match_io_element (k
, &new_code
);
3146 if (m
== MATCH_ERROR
)
3151 tail
= gfc_append_code (tail
, new_code
);
3155 if (gfc_match_eos () == MATCH_YES
)
3157 if (gfc_match_char (',') != MATCH_YES
)
3165 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3168 gfc_free_statements (head
);
3173 /* Attach the data transfer end node. */
3176 terminate_io (gfc_code
*io_code
)
3180 if (io_code
== NULL
)
3181 io_code
= new_st
.block
;
3183 c
= gfc_get_code ();
3184 c
->op
= EXEC_DT_END
;
3186 /* Point to structure that is already there */
3187 c
->ext
.dt
= new_st
.ext
.dt
;
3188 gfc_append_code (io_code
, c
);
3192 /* Check the constraints for a data transfer statement. The majority of the
3193 constraints appearing in 9.4 of the standard appear here. Some are handled
3194 in resolve_tag and others in gfc_resolve_dt. */
3197 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3200 #define io_constraint(condition,msg,arg)\
3203 gfc_error(msg,arg);\
3209 gfc_symbol
*sym
= NULL
;
3210 bool warn
, unformatted
;
3212 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3213 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3214 && dt
->namelist
== NULL
;
3219 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3220 && expr
->ts
.type
== BT_CHARACTER
)
3222 sym
= expr
->symtree
->n
.sym
;
3224 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3225 "Internal file at %L must not be INTENT(IN)",
3228 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3229 "Internal file incompatible with vector subscript at %L",
3232 io_constraint (dt
->rec
!= NULL
,
3233 "REC tag at %L is incompatible with internal file",
3236 io_constraint (dt
->pos
!= NULL
,
3237 "POS tag at %L is incompatible with internal file",
3240 io_constraint (unformatted
,
3241 "Unformatted I/O not allowed with internal unit at %L",
3242 &dt
->io_unit
->where
);
3244 io_constraint (dt
->asynchronous
!= NULL
,
3245 "ASYNCHRONOUS tag at %L not allowed with internal file",
3246 &dt
->asynchronous
->where
);
3248 if (dt
->namelist
!= NULL
)
3250 if (!gfc_notify_std (GFC_STD_F2003
, "Internal file at %L with "
3251 "namelist", &expr
->where
))
3255 io_constraint (dt
->advance
!= NULL
,
3256 "ADVANCE tag at %L is incompatible with internal file",
3257 &dt
->advance
->where
);
3260 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3263 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3264 "IO UNIT in %s statement at %C must be "
3265 "an internal file in a PURE procedure",
3268 if (gfc_implicit_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
))
3269 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3275 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3278 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3281 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3284 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3287 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3292 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3293 "SIZE tag at %L requires an ADVANCE tag",
3296 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3297 "EOR tag at %L requires an ADVANCE tag",
3301 if (dt
->asynchronous
)
3303 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3305 if (!gfc_reduce_init_expr (dt
->asynchronous
))
3307 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3308 "expression", &dt
->asynchronous
->where
);
3312 if (!compare_to_allowed_values
3313 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3314 dt
->asynchronous
->value
.character
.string
,
3315 io_kind_name (k
), warn
))
3323 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3324 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3326 io_constraint (not_yes
,
3327 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3328 "specifier", &dt
->id
->where
);
3333 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3334 "not allowed in Fortran 95"))
3337 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3339 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3341 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3342 dt
->decimal
->value
.character
.string
,
3343 io_kind_name (k
), warn
))
3346 io_constraint (unformatted
,
3347 "the DECIMAL= specifier at %L must be with an "
3348 "explicit format expression", &dt
->decimal
->where
);
3354 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3355 "not allowed in Fortran 95"))
3358 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3360 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3362 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3363 dt
->blank
->value
.character
.string
,
3364 io_kind_name (k
), warn
))
3367 io_constraint (unformatted
,
3368 "the BLANK= specifier at %L must be with an "
3369 "explicit format expression", &dt
->blank
->where
);
3375 if (!gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3376 "not allowed in Fortran 95"))
3379 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3381 static const char * pad
[] = { "YES", "NO", NULL
};
3383 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3384 dt
->pad
->value
.character
.string
,
3385 io_kind_name (k
), warn
))
3388 io_constraint (unformatted
,
3389 "the PAD= specifier at %L must be with an "
3390 "explicit format expression", &dt
->pad
->where
);
3396 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3397 "not allowed in Fortran 95"))
3400 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3402 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3403 "COMPATIBLE", "PROCESSOR_DEFINED",
3406 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3407 dt
->round
->value
.character
.string
,
3408 io_kind_name (k
), warn
))
3415 /* When implemented, change the following to use gfc_notify_std F2003.
3416 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3417 "not allowed in Fortran 95") == false)
3418 return MATCH_ERROR; */
3419 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3421 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3424 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3425 dt
->sign
->value
.character
.string
,
3426 io_kind_name (k
), warn
))
3429 io_constraint (unformatted
,
3430 "SIGN= specifier at %L must be with an "
3431 "explicit format expression", &dt
->sign
->where
);
3433 io_constraint (k
== M_READ
,
3434 "SIGN= specifier at %L not allowed in a "
3435 "READ statement", &dt
->sign
->where
);
3441 if (!gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
3442 "not allowed in Fortran 95"))
3445 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3447 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3449 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3450 dt
->delim
->value
.character
.string
,
3451 io_kind_name (k
), warn
))
3454 io_constraint (k
== M_READ
,
3455 "DELIM= specifier at %L not allowed in a "
3456 "READ statement", &dt
->delim
->where
);
3458 io_constraint (dt
->format_label
!= &format_asterisk
3459 && dt
->namelist
== NULL
,
3460 "DELIM= specifier at %L must have FMT=*",
3463 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3464 "DELIM= specifier at %L must be with FMT=* or "
3465 "NML= specifier ", &dt
->delim
->where
);
3471 io_constraint (io_code
&& dt
->namelist
,
3472 "NAMELIST cannot be followed by IO-list at %L",
3475 io_constraint (dt
->format_expr
,
3476 "IO spec-list cannot contain both NAMELIST group name "
3477 "and format specification at %L",
3478 &dt
->format_expr
->where
);
3480 io_constraint (dt
->format_label
,
3481 "IO spec-list cannot contain both NAMELIST group name "
3482 "and format label at %L", spec_end
);
3484 io_constraint (dt
->rec
,
3485 "NAMELIST IO is not allowed with a REC= specifier "
3486 "at %L", &dt
->rec
->where
);
3488 io_constraint (dt
->advance
,
3489 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3490 "at %L", &dt
->advance
->where
);
3495 io_constraint (dt
->end
,
3496 "An END tag is not allowed with a "
3497 "REC= specifier at %L", &dt
->end_where
);
3499 io_constraint (dt
->format_label
== &format_asterisk
,
3500 "FMT=* is not allowed with a REC= specifier "
3503 io_constraint (dt
->pos
,
3504 "POS= is not allowed with REC= specifier "
3505 "at %L", &dt
->pos
->where
);
3510 int not_yes
, not_no
;
3513 io_constraint (dt
->format_label
== &format_asterisk
,
3514 "List directed format(*) is not allowed with a "
3515 "ADVANCE= specifier at %L.", &expr
->where
);
3517 io_constraint (unformatted
,
3518 "the ADVANCE= specifier at %L must appear with an "
3519 "explicit format expression", &expr
->where
);
3521 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
3523 const gfc_char_t
*advance
= expr
->value
.character
.string
;
3524 not_no
= gfc_wide_strlen (advance
) != 2
3525 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
3526 not_yes
= gfc_wide_strlen (advance
) != 3
3527 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
3535 io_constraint (not_no
&& not_yes
,
3536 "ADVANCE= specifier at %L must have value = "
3537 "YES or NO.", &expr
->where
);
3539 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
3540 "SIZE tag at %L requires an ADVANCE = 'NO'",
3543 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
3544 "EOR tag at %L requires an ADVANCE = 'NO'",
3548 expr
= dt
->format_expr
;
3549 if (!gfc_simplify_expr (expr
, 0)
3550 || !check_format_string (expr
, k
== M_READ
))
3555 #undef io_constraint
3558 /* Match a READ, WRITE or PRINT statement. */
3561 match_io (io_kind k
)
3563 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3572 where
= gfc_current_locus
;
3574 current_dt
= dt
= XCNEW (gfc_dt
);
3575 m
= gfc_match_char ('(');
3578 where
= gfc_current_locus
;
3581 else if (k
== M_PRINT
)
3583 /* Treat the non-standard case of PRINT namelist. */
3584 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
3585 && gfc_match_name (name
) == MATCH_YES
)
3587 gfc_find_symbol (name
, NULL
, 1, &sym
);
3588 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3590 if (!gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
3591 "%C is an extension"))
3597 dt
->io_unit
= default_unit (k
);
3602 gfc_current_locus
= where
;
3606 if (gfc_current_form
== FORM_FREE
)
3608 char c
= gfc_peek_ascii_char ();
3609 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
3616 m
= match_dt_format (dt
);
3617 if (m
== MATCH_ERROR
)
3623 dt
->io_unit
= default_unit (k
);
3628 /* Before issuing an error for a malformed 'print (1,*)' type of
3629 error, check for a default-char-expr of the form ('(I0)'). */
3630 if (k
== M_PRINT
&& m
== MATCH_YES
)
3632 /* Reset current locus to get the initial '(' in an expression. */
3633 gfc_current_locus
= where
;
3634 dt
->format_expr
= NULL
;
3635 m
= match_dt_format (dt
);
3637 if (m
== MATCH_ERROR
)
3639 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
3643 dt
->io_unit
= default_unit (k
);
3648 /* Match a control list */
3649 if (match_dt_element (k
, dt
) == MATCH_YES
)
3651 if (match_dt_unit (k
, dt
) != MATCH_YES
)
3654 if (gfc_match_char (')') == MATCH_YES
)
3656 if (gfc_match_char (',') != MATCH_YES
)
3659 m
= match_dt_element (k
, dt
);
3662 if (m
== MATCH_ERROR
)
3665 m
= match_dt_format (dt
);
3668 if (m
== MATCH_ERROR
)
3671 where
= gfc_current_locus
;
3673 m
= gfc_match_name (name
);
3676 gfc_find_symbol (name
, NULL
, 1, &sym
);
3677 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3680 if (k
== M_READ
&& check_namelist (sym
))
3689 gfc_current_locus
= where
;
3691 goto loop
; /* No matches, try regular elements */
3694 if (gfc_match_char (')') == MATCH_YES
)
3696 if (gfc_match_char (',') != MATCH_YES
)
3702 m
= match_dt_element (k
, dt
);
3705 if (m
== MATCH_ERROR
)
3708 if (gfc_match_char (')') == MATCH_YES
)
3710 if (gfc_match_char (',') != MATCH_YES
)
3716 /* Used in check_io_constraints, where no locus is available. */
3717 spec_end
= gfc_current_locus
;
3719 /* Save the IO kind for later use. */
3720 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
3722 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3723 to save the locus. This is used later when resolving transfer statements
3724 that might have a format expression without unit number. */
3725 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
3726 dt
->extra_comma
= dt
->dt_io_kind
;
3729 if (gfc_match_eos () != MATCH_YES
)
3731 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
3733 gfc_error ("Expected comma in I/O list at %C");
3738 m
= match_io_list (k
, &io_code
);
3739 if (m
== MATCH_ERROR
)
3745 /* A full IO statement has been matched. Check the constraints. spec_end is
3746 supplied for cases where no locus is supplied. */
3747 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
3749 if (m
== MATCH_ERROR
)
3752 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
3754 new_st
.block
= gfc_get_code ();
3755 new_st
.block
->op
= new_st
.op
;
3756 new_st
.block
->next
= io_code
;
3758 terminate_io (io_code
);
3763 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3773 gfc_match_read (void)
3775 return match_io (M_READ
);
3780 gfc_match_write (void)
3782 return match_io (M_WRITE
);
3787 gfc_match_print (void)
3791 m
= match_io (M_PRINT
);
3795 if (gfc_pure (NULL
))
3797 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3801 if (gfc_implicit_pure (NULL
))
3802 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3808 /* Free a gfc_inquire structure. */
3811 gfc_free_inquire (gfc_inquire
*inquire
)
3814 if (inquire
== NULL
)
3817 gfc_free_expr (inquire
->unit
);
3818 gfc_free_expr (inquire
->file
);
3819 gfc_free_expr (inquire
->iomsg
);
3820 gfc_free_expr (inquire
->iostat
);
3821 gfc_free_expr (inquire
->exist
);
3822 gfc_free_expr (inquire
->opened
);
3823 gfc_free_expr (inquire
->number
);
3824 gfc_free_expr (inquire
->named
);
3825 gfc_free_expr (inquire
->name
);
3826 gfc_free_expr (inquire
->access
);
3827 gfc_free_expr (inquire
->sequential
);
3828 gfc_free_expr (inquire
->direct
);
3829 gfc_free_expr (inquire
->form
);
3830 gfc_free_expr (inquire
->formatted
);
3831 gfc_free_expr (inquire
->unformatted
);
3832 gfc_free_expr (inquire
->recl
);
3833 gfc_free_expr (inquire
->nextrec
);
3834 gfc_free_expr (inquire
->blank
);
3835 gfc_free_expr (inquire
->position
);
3836 gfc_free_expr (inquire
->action
);
3837 gfc_free_expr (inquire
->read
);
3838 gfc_free_expr (inquire
->write
);
3839 gfc_free_expr (inquire
->readwrite
);
3840 gfc_free_expr (inquire
->delim
);
3841 gfc_free_expr (inquire
->encoding
);
3842 gfc_free_expr (inquire
->pad
);
3843 gfc_free_expr (inquire
->iolength
);
3844 gfc_free_expr (inquire
->convert
);
3845 gfc_free_expr (inquire
->strm_pos
);
3846 gfc_free_expr (inquire
->asynchronous
);
3847 gfc_free_expr (inquire
->decimal
);
3848 gfc_free_expr (inquire
->pending
);
3849 gfc_free_expr (inquire
->id
);
3850 gfc_free_expr (inquire
->sign
);
3851 gfc_free_expr (inquire
->size
);
3852 gfc_free_expr (inquire
->round
);
3857 /* Match an element of an INQUIRE statement. */
3859 #define RETM if (m != MATCH_NO) return m;
3862 match_inquire_element (gfc_inquire
*inquire
)
3866 m
= match_etag (&tag_unit
, &inquire
->unit
);
3867 RETM m
= match_etag (&tag_file
, &inquire
->file
);
3868 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
3869 RETM m
= match_out_tag (&tag_iomsg
, &inquire
->iomsg
);
3870 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
3871 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
3872 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
3873 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
3874 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
3875 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
3876 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
3877 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
3878 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
3879 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
3880 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
3881 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
3882 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
3883 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
3884 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
3885 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
3886 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
3887 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
3888 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
3889 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
3890 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
3891 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
3892 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
3893 RETM m
= match_vtag (&tag_size
, &inquire
->size
);
3894 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
3895 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
3896 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
3897 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
3898 RETM m
= match_vtag (&tag_iolength
, &inquire
->iolength
);
3899 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
3900 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
3901 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
3902 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
3903 RETM m
= match_vtag (&tag_s_iqstream
, &inquire
->iqstream
);
3904 RETM
return MATCH_NO
;
3911 gfc_match_inquire (void)
3913 gfc_inquire
*inquire
;
3918 m
= gfc_match_char ('(');
3922 inquire
= XCNEW (gfc_inquire
);
3924 loc
= gfc_current_locus
;
3926 m
= match_inquire_element (inquire
);
3927 if (m
== MATCH_ERROR
)
3931 m
= gfc_match_expr (&inquire
->unit
);
3932 if (m
== MATCH_ERROR
)
3938 /* See if we have the IOLENGTH form of the inquire statement. */
3939 if (inquire
->iolength
!= NULL
)
3941 if (gfc_match_char (')') != MATCH_YES
)
3944 m
= match_io_list (M_INQUIRE
, &code
);
3945 if (m
== MATCH_ERROR
)
3950 new_st
.op
= EXEC_IOLENGTH
;
3951 new_st
.expr1
= inquire
->iolength
;
3952 new_st
.ext
.inquire
= inquire
;
3954 if (gfc_pure (NULL
))
3956 gfc_free_statements (code
);
3957 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3961 if (gfc_implicit_pure (NULL
))
3962 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3964 new_st
.block
= gfc_get_code ();
3965 new_st
.block
->op
= EXEC_IOLENGTH
;
3966 terminate_io (code
);
3967 new_st
.block
->next
= code
;
3971 /* At this point, we have the non-IOLENGTH inquire statement. */
3974 if (gfc_match_char (')') == MATCH_YES
)
3976 if (gfc_match_char (',') != MATCH_YES
)
3979 m
= match_inquire_element (inquire
);
3980 if (m
== MATCH_ERROR
)
3985 if (inquire
->iolength
!= NULL
)
3987 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
3992 if (gfc_match_eos () != MATCH_YES
)
3995 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
3997 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
3998 "UNIT specifiers", &loc
);
4002 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4004 gfc_error ("INQUIRE statement at %L requires either FILE or "
4005 "UNIT specifier", &loc
);
4009 if (gfc_pure (NULL
))
4011 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4015 if (gfc_implicit_pure (NULL
))
4016 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
4018 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4020 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4021 "the ID= specifier", &loc
);
4025 new_st
.op
= EXEC_INQUIRE
;
4026 new_st
.ext
.inquire
= inquire
;
4030 gfc_syntax_error (ST_INQUIRE
);
4033 gfc_free_inquire (inquire
);
4038 /* Resolve everything in a gfc_inquire structure. */
4041 gfc_resolve_inquire (gfc_inquire
*inquire
)
4043 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4044 RESOLVE_TAG (&tag_file
, inquire
->file
);
4045 RESOLVE_TAG (&tag_id
, inquire
->id
);
4047 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4048 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4049 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4050 RESOLVE_TAG (tag, expr); \
4054 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4055 if (gfc_check_vardef_context ((expr), false, false, false, \
4056 context) == false) \
4059 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4060 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4061 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4062 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4063 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4064 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4065 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4066 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4067 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4068 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4069 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4070 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4071 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4072 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4073 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4074 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4075 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4076 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4077 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4078 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4079 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4080 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4081 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4082 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4083 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4084 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4085 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4086 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4087 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4088 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4089 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4090 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4091 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4092 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4093 INQUIRE_RESOLVE_TAG (&tag_s_iqstream
, inquire
->iqstream
);
4094 #undef INQUIRE_RESOLVE_TAG
4096 if (!gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
))
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
);
4118 gfc_resolve_wait (gfc_wait
*wait
)
4120 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4121 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4122 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4123 RESOLVE_TAG (&tag_id
, wait
->id
);
4125 if (!gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
))
4128 if (!gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
))
4134 /* Match an element of a WAIT statement. */
4136 #define RETM if (m != MATCH_NO) return m;
4139 match_wait_element (gfc_wait
*wait
)
4143 m
= match_etag (&tag_unit
, &wait
->unit
);
4144 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4145 RETM m
= match_ltag (&tag_end
, &wait
->eor
);
4146 RETM m
= match_ltag (&tag_eor
, &wait
->end
);
4147 RETM m
= match_out_tag (&tag_iomsg
, &wait
->iomsg
);
4148 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4149 RETM m
= match_etag (&tag_id
, &wait
->id
);
4150 RETM
return MATCH_NO
;
4157 gfc_match_wait (void)
4162 m
= gfc_match_char ('(');
4166 wait
= XCNEW (gfc_wait
);
4168 m
= match_wait_element (wait
);
4169 if (m
== MATCH_ERROR
)
4173 m
= gfc_match_expr (&wait
->unit
);
4174 if (m
== MATCH_ERROR
)
4182 if (gfc_match_char (')') == MATCH_YES
)
4184 if (gfc_match_char (',') != MATCH_YES
)
4187 m
= match_wait_element (wait
);
4188 if (m
== MATCH_ERROR
)
4194 if (!gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4195 "not allowed in Fortran 95"))
4198 if (gfc_pure (NULL
))
4200 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4204 if (gfc_implicit_pure (NULL
))
4205 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
4207 new_st
.op
= EXEC_WAIT
;
4208 new_st
.ext
.wait
= wait
;
4213 gfc_syntax_error (ST_WAIT
);
4216 gfc_free_wait (wait
);