1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000-2018 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
,
31 0, {NULL
, NULL
}, NULL
};
35 const char *name
, *spec
, *value
;
41 tag_readonly
= {"READONLY", " readonly", NULL
, BT_UNKNOWN
},
42 tag_shared
= {"SHARE", " shared", NULL
, BT_UNKNOWN
},
43 tag_noshared
= {"SHARE", " noshared", NULL
, BT_UNKNOWN
},
44 tag_e_share
= {"SHARE", " share =", " %e", BT_CHARACTER
},
45 tag_v_share
= {"SHARE", " share =", " %v", BT_CHARACTER
},
46 tag_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %e",
48 tag_v_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %v",
50 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
51 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
52 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
53 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
54 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
55 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
56 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
57 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
58 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
59 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
60 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
61 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
62 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
63 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
64 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
65 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
66 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
67 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
68 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
69 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
70 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
71 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
72 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
73 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
74 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
75 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
76 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
77 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
78 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
79 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
80 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
81 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
82 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
83 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
84 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
85 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
86 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
87 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
88 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
89 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
90 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
91 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
92 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
93 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
94 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
95 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
96 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
97 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
98 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
99 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
100 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
101 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
102 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
103 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
104 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
105 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
106 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
107 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
},
108 tag_s_iqstream
= {"STREAM", " stream =", " %v", BT_CHARACTER
};
110 static gfc_dt
*current_dt
;
112 #define RESOLVE_TAG(x, y) if (!resolve_tag (x, y)) return false;
114 /* Are we currently processing an asynchronous I/O statement? */
118 /**************** Fortran 95 FORMAT parser *****************/
120 /* FORMAT tokens returned by format_lex(). */
123 FMT_NONE
, FMT_UNKNOWN
, FMT_SIGNED_INT
, FMT_ZERO
, FMT_POSINT
, FMT_PERIOD
,
124 FMT_COMMA
, FMT_COLON
, FMT_SLASH
, FMT_DOLLAR
, FMT_LPAREN
,
125 FMT_RPAREN
, FMT_X
, FMT_SIGN
, FMT_BLANK
, FMT_CHAR
, FMT_P
, FMT_IBOZ
, FMT_F
,
126 FMT_E
, FMT_EN
, FMT_ES
, FMT_G
, FMT_L
, FMT_A
, FMT_D
, FMT_H
, FMT_END
,
127 FMT_ERROR
, FMT_DC
, FMT_DP
, FMT_T
, FMT_TR
, FMT_TL
, FMT_STAR
, FMT_RC
,
128 FMT_RD
, FMT_RN
, FMT_RP
, FMT_RU
, FMT_RZ
, FMT_DT
131 /* Local variables for checking format strings. The saved_token is
132 used to back up by a single format token during the parsing
134 static gfc_char_t
*format_string
;
135 static int format_string_pos
;
136 static int format_length
, use_last_char
;
137 static char error_element
;
138 static locus format_locus
;
140 static format_token saved_token
;
143 { MODE_STRING
, MODE_FORMAT
, MODE_COPY
}
147 /* Return the next character in the format string. */
150 next_char (gfc_instring in_string
)
162 if (mode
== MODE_STRING
)
163 c
= *format_string
++;
166 c
= gfc_next_char_literal (in_string
);
171 if (flag_backslash
&& c
== '\\')
173 locus old_locus
= gfc_current_locus
;
175 if (gfc_match_special_char (&c
) == MATCH_NO
)
176 gfc_current_locus
= old_locus
;
178 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
179 gfc_warning (0, "Extension: backslash character at %C");
182 if (mode
== MODE_COPY
)
183 *format_string
++ = c
;
185 if (mode
!= MODE_STRING
)
186 format_locus
= gfc_current_locus
;
190 c
= gfc_wide_toupper (c
);
195 /* Back up one character position. Only works once. */
203 /* Eat up the spaces and return a character. */
206 next_char_not_space ()
211 error_element
= c
= next_char (NONSTRING
);
213 gfc_warning (OPT_Wtabs
, "Nonconforming tab character in format at %C");
215 while (gfc_is_whitespace (c
));
219 static int value
= 0;
221 /* 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 ();
249 c
= next_char_not_space ();
260 c
= next_char_not_space ();
262 value
= 10 * value
+ c
- '0';
271 token
= FMT_SIGNED_INT
;
290 c
= next_char_not_space ();
293 value
= 10 * value
+ c
- '0';
301 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
325 c
= next_char_not_space ();
353 c
= next_char_not_space ();
354 if (c
!= 'P' && c
!= 'S')
361 c
= next_char_not_space ();
362 if (c
== 'N' || c
== 'Z')
380 c
= next_char (INSTRING_WARN
);
389 c
= next_char (NONSTRING
);
423 c
= next_char_not_space ();
453 c
= next_char_not_space ();
456 if (!gfc_notify_std (GFC_STD_F2003
, "DP format "
457 "specifier not allowed at %C"))
463 if (!gfc_notify_std (GFC_STD_F2003
, "DC format "
464 "specifier not allowed at %C"))
470 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DT format "
471 "specifier not allowed at %C"))
474 c
= next_char_not_space ();
475 if (c
== '\'' || c
== '"')
482 c
= next_char (INSTRING_WARN
);
491 c
= next_char (NONSTRING
);
525 c
= next_char_not_space ();
571 token_to_string (format_token t
)
590 /* Check a format statement. The format string, either from a FORMAT
591 statement or a constant in an I/O statement has already been parsed
592 by itself, and we are checking it for validity. The dual origin
593 means that the warning message is a little less than great. */
596 check_format (bool is_input
)
598 const char *posint_required
= _("Positive width required");
599 const char *nonneg_required
= _("Nonnegative width required");
600 const char *unexpected_element
= _("Unexpected element %qc in format "
602 const char *unexpected_end
= _("Unexpected end of format string");
603 const char *zero_width
= _("Zero width in format descriptor");
605 const char *error
= NULL
;
612 saved_token
= FMT_NONE
;
616 format_string_pos
= 0;
623 error
= _("Missing leading left parenthesis");
631 goto finished
; /* Empty format is legal */
635 /* In this state, the next thing has to be a format item. */
652 error
= _("Left parenthesis required after %<*%>");
677 /* Signed integer can only precede a P format. */
683 error
= _("Expected P edit descriptor");
690 /* P requires a prior number. */
691 error
= _("P descriptor requires leading scale factor");
695 /* X requires a prior number if we're being pedantic. */
696 if (mode
!= MODE_FORMAT
)
697 format_locus
.nextc
+= format_string_pos
;
698 if (!gfc_notify_std (GFC_STD_GNU
, "X descriptor requires leading "
699 "space count at %L", &format_locus
))
716 goto extension_optional_comma
;
727 if (!gfc_notify_std (GFC_STD_GNU
, "$ descriptor at %L", &format_locus
))
729 if (t
!= FMT_RPAREN
|| level
> 0)
731 gfc_warning (0, "$ should be the last specifier in format at %L",
733 goto optional_comma_1
;
755 error
= unexpected_end
;
759 error
= unexpected_element
;
764 /* In this state, t must currently be a data descriptor.
765 Deal with things that can/must follow the descriptor. */
776 /* No comma after P allowed only for F, E, EN, ES, D, or G.
781 if (!(gfc_option
.allow_std
& GFC_STD_F2003
) && t
!= FMT_COMMA
782 && t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
783 && t
!= FMT_D
&& t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
785 error
= _("Comma required after P descriptor");
796 if (t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
&& t
!= FMT_D
797 && t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
799 error
= _("Comma required after P descriptor");
813 error
= _("Positive width required with T descriptor");
824 if (mode
!= MODE_FORMAT
)
825 format_locus
.nextc
+= format_string_pos
;
828 switch (gfc_notification_std (GFC_STD_GNU
))
831 gfc_warning (0, "Extension: Zero width after L "
832 "descriptor at %L", &format_locus
);
835 gfc_error ("Extension: Zero width after L "
836 "descriptor at %L", &format_locus
);
847 gfc_notify_std (GFC_STD_GNU
, "Missing positive width after "
848 "L descriptor at %L", &format_locus
);
871 if (t
== FMT_G
&& u
== FMT_ZERO
)
878 if (!gfc_notify_std (GFC_STD_F2008
, "%<G0%> in format at %L",
890 error
= posint_required
;
896 error
= _("E specifier not allowed with g0 descriptor");
905 format_locus
.nextc
+= format_string_pos
;
906 gfc_error ("Positive width required in format "
907 "specifier %s at %L", token_to_string (t
),
918 /* Warn if -std=legacy, otherwise error. */
919 format_locus
.nextc
+= format_string_pos
;
920 if (gfc_option
.warn_std
!= 0)
922 gfc_error ("Period required in format "
923 "specifier %s at %L", token_to_string (t
),
929 gfc_warning (0, "Period required in format "
930 "specifier %s at %L", token_to_string (t
),
932 /* If we go to finished, we need to unwind this
933 before the next round. */
934 format_locus
.nextc
-= format_string_pos
;
942 if (u
!= FMT_ZERO
&& u
!= FMT_POSINT
)
944 error
= nonneg_required
;
951 /* Look for optional exponent. */
966 error
= _("Positive exponent width required");
1000 error
= posint_required
;
1010 if (t
!= FMT_RPAREN
)
1012 error
= _("Right parenthesis expected at %C");
1018 error
= unexpected_element
;
1027 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1029 error
= nonneg_required
;
1032 else if (is_input
&& t
== FMT_ZERO
)
1034 error
= posint_required
;
1041 if (t
!= FMT_PERIOD
)
1043 /* Warn if -std=legacy, otherwise error. */
1044 if (gfc_option
.warn_std
!= 0)
1046 error
= _("Period required in format specifier");
1049 if (mode
!= MODE_FORMAT
)
1050 format_locus
.nextc
+= format_string_pos
;
1051 gfc_warning (0, "Period required in format specifier at %L",
1060 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1062 error
= nonneg_required
;
1069 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
1071 if (mode
!= MODE_FORMAT
)
1072 format_locus
.nextc
+= format_string_pos
;
1073 gfc_warning (0, "The H format specifier at %L is"
1074 " a Fortran 95 deleted feature", &format_locus
);
1076 if (mode
== MODE_STRING
)
1078 format_string
+= value
;
1079 format_length
-= value
;
1080 format_string_pos
+= repeat
;
1086 next_char (INSTRING_WARN
);
1096 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1098 error
= nonneg_required
;
1101 else if (is_input
&& t
== FMT_ZERO
)
1103 error
= posint_required
;
1110 if (t
!= FMT_PERIOD
)
1119 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1121 error
= nonneg_required
;
1129 error
= unexpected_element
;
1134 /* Between a descriptor and what comes next. */
1152 goto optional_comma
;
1155 error
= unexpected_end
;
1159 if (mode
!= MODE_FORMAT
)
1160 format_locus
.nextc
+= format_string_pos
- 1;
1161 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1163 /* If we do not actually return a failure, we need to unwind this
1164 before the next round. */
1165 if (mode
!= MODE_FORMAT
)
1166 format_locus
.nextc
-= format_string_pos
;
1171 /* Optional comma is a weird between state where we've just finished
1172 reading a colon, slash, dollar or P descriptor. */
1189 /* Assume that we have another format item. */
1196 extension_optional_comma
:
1197 /* As a GNU extension, permit a missing comma after a string literal. */
1214 goto optional_comma
;
1217 error
= unexpected_end
;
1221 if (mode
!= MODE_FORMAT
)
1222 format_locus
.nextc
+= format_string_pos
;
1223 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1225 /* If we do not actually return a failure, we need to unwind this
1226 before the next round. */
1227 if (mode
!= MODE_FORMAT
)
1228 format_locus
.nextc
-= format_string_pos
;
1236 if (mode
!= MODE_FORMAT
)
1237 format_locus
.nextc
+= format_string_pos
;
1238 if (error
== unexpected_element
)
1239 gfc_error (error
, error_element
, &format_locus
);
1241 gfc_error ("%s in format string at %L", error
, &format_locus
);
1250 /* Given an expression node that is a constant string, see if it looks
1251 like a format string. */
1254 check_format_string (gfc_expr
*e
, bool is_input
)
1258 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1262 format_string
= e
->value
.character
.string
;
1264 /* More elaborate measures are needed to show where a problem is within a
1265 format string that has been calculated, but that's probably not worth the
1267 format_locus
= e
->where
;
1268 rv
= check_format (is_input
);
1269 /* check for extraneous characters at the end of an otherwise valid format
1270 string, like '(A10,I3)F5'
1271 start at the end and move back to the last character processed,
1273 if (rv
&& e
->value
.character
.length
> format_string_pos
)
1274 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1275 if (e
->value
.character
.string
[i
] != ' ')
1277 format_locus
.nextc
+= format_length
+ 1;
1279 "Extraneous characters in format at %L", &format_locus
);
1286 /************ Fortran I/O statement matchers *************/
1288 /* Match a FORMAT statement. This amounts to actually parsing the
1289 format descriptors in order to correctly locate the end of the
1293 gfc_match_format (void)
1298 if (gfc_current_ns
->proc_name
1299 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1301 gfc_error ("Format statement in module main block at %C");
1305 /* Before parsing the rest of a FORMAT statement, check F2008:c1206. */
1306 if ((gfc_current_state () == COMP_FUNCTION
1307 || gfc_current_state () == COMP_SUBROUTINE
)
1308 && gfc_state_stack
->previous
->state
== COMP_INTERFACE
)
1310 gfc_error ("FORMAT statement at %C cannot appear within an INTERFACE");
1314 if (gfc_statement_label
== NULL
)
1316 gfc_error ("Missing format label at %C");
1319 gfc_gobble_whitespace ();
1324 start
= gfc_current_locus
;
1326 if (!check_format (false))
1329 if (gfc_match_eos () != MATCH_YES
)
1331 gfc_syntax_error (ST_FORMAT
);
1335 /* The label doesn't get created until after the statement is done
1336 being matched, so we have to leave the string for later. */
1338 gfc_current_locus
= start
; /* Back to the beginning */
1341 new_st
.op
= EXEC_NOP
;
1343 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1344 NULL
, format_length
);
1345 format_string
= e
->value
.character
.string
;
1346 gfc_statement_label
->format
= e
;
1349 check_format (false); /* Guaranteed to succeed */
1350 gfc_match_eos (); /* Guaranteed to succeed */
1356 /* Check for a CHARACTER variable. The check for scalar is done in
1360 check_char_variable (gfc_expr
*e
)
1362 if (e
->expr_type
!= EXPR_VARIABLE
|| e
->ts
.type
!= BT_CHARACTER
)
1364 gfc_error("IOMSG must be a scalar-default-char-variable at %L", &e
->where
);
1372 is_char_type (const char *name
, gfc_expr
*e
)
1374 gfc_resolve_expr (e
);
1376 if (e
->ts
.type
!= BT_CHARACTER
)
1378 gfc_error ("%s requires a scalar-default-char-expr at %L",
1386 /* Match an expression I/O tag of some sort. */
1389 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1394 m
= gfc_match (tag
->spec
);
1398 m
= gfc_match (tag
->value
, &result
);
1401 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1407 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1408 gfc_free_expr (result
);
1417 /* Match a variable I/O tag of some sort. */
1420 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1425 m
= gfc_match (tag
->spec
);
1429 m
= gfc_match (tag
->value
, &result
);
1432 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1438 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1439 gfc_free_expr (result
);
1443 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1445 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1446 gfc_free_expr (result
);
1450 bool impure
= gfc_impure_variable (result
->symtree
->n
.sym
);
1451 if (impure
&& gfc_pure (NULL
))
1453 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1455 gfc_free_expr (result
);
1460 gfc_unset_implicit_pure (NULL
);
1467 /* Match I/O tags that cause variables to become redefined. */
1470 match_out_tag (const io_tag
*tag
, gfc_expr
**result
)
1474 m
= match_vtag (tag
, result
);
1476 gfc_check_do_variable ((*result
)->symtree
);
1482 /* Match a label I/O tag. */
1485 match_ltag (const io_tag
*tag
, gfc_st_label
** label
)
1491 m
= gfc_match (tag
->spec
);
1495 m
= gfc_match (tag
->value
, label
);
1498 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1504 gfc_error ("Duplicate %s label specification at %C", tag
->name
);
1508 if (!gfc_reference_st_label (*label
, ST_LABEL_TARGET
))
1515 /* Match a tag using match_etag, but only if -fdec is enabled. */
1517 match_dec_etag (const io_tag
*tag
, gfc_expr
**e
)
1519 match m
= match_etag (tag
, e
);
1520 if (flag_dec
&& m
!= MATCH_NO
)
1522 else if (m
!= MATCH_NO
)
1524 gfc_error ("%s at %C is a DEC extension, enable with "
1525 "%<-fdec%>", tag
->name
);
1532 /* Match a tag using match_vtag, but only if -fdec is enabled. */
1534 match_dec_vtag (const io_tag
*tag
, gfc_expr
**e
)
1536 match m
= match_vtag(tag
, e
);
1537 if (flag_dec
&& m
!= MATCH_NO
)
1539 else if (m
!= MATCH_NO
)
1541 gfc_error ("%s at %C is a DEC extension, enable with "
1542 "%<-fdec%>", tag
->name
);
1549 /* Match a DEC I/O flag tag - a tag with no expression such as READONLY. */
1552 match_dec_ftag (const io_tag
*tag
, gfc_open
*o
)
1556 m
= gfc_match (tag
->spec
);
1562 gfc_error ("%s at %C is a DEC extension, enable with "
1563 "%<-fdec%>", tag
->name
);
1567 /* Just set the READONLY flag, which we use at runtime to avoid delete on
1569 if (tag
== &tag_readonly
)
1575 /* Interpret SHARED as SHARE='DENYNONE' (read lock). */
1576 else if (tag
== &tag_shared
)
1578 if (o
->share
!= NULL
)
1580 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1583 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1584 &gfc_current_locus
, "denynone", 8);
1588 /* Interpret NOSHARED as SHARE='DENYRW' (exclusive lock). */
1589 else if (tag
== &tag_noshared
)
1591 if (o
->share
!= NULL
)
1593 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1596 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1597 &gfc_current_locus
, "denyrw", 6);
1601 /* We handle all DEC tags above. */
1606 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1609 resolve_tag_format (const gfc_expr
*e
)
1611 if (e
->expr_type
== EXPR_CONSTANT
1612 && (e
->ts
.type
!= BT_CHARACTER
1613 || e
->ts
.kind
!= gfc_default_character_kind
))
1615 gfc_error ("Constant expression in FORMAT tag at %L must be "
1616 "of type default CHARACTER", &e
->where
);
1620 /* If e's rank is zero and e is not an element of an array, it should be
1621 of integer or character type. The integer variable should be
1624 && (e
->expr_type
!= EXPR_VARIABLE
1625 || e
->symtree
== NULL
1626 || e
->symtree
->n
.sym
->as
== NULL
1627 || e
->symtree
->n
.sym
->as
->rank
== 0))
1629 if ((e
->ts
.type
!= BT_CHARACTER
1630 || e
->ts
.kind
!= gfc_default_character_kind
)
1631 && e
->ts
.type
!= BT_INTEGER
)
1633 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1634 "or of INTEGER", &e
->where
);
1637 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1639 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGNED variable in "
1640 "FORMAT tag at %L", &e
->where
))
1642 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1644 gfc_error ("Variable %qs at %L has not been assigned a "
1645 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1649 else if (e
->ts
.type
== BT_INTEGER
)
1651 gfc_error ("Scalar %qs in FORMAT tag at %L is not an ASSIGNED "
1652 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1659 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1660 It may be assigned an Hollerith constant. */
1661 if (e
->ts
.type
!= BT_CHARACTER
)
1663 if (!gfc_notify_std (GFC_STD_LEGACY
, "Non-character in FORMAT tag "
1664 "at %L", &e
->where
))
1667 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1669 gfc_error ("Non-character assumed shape array element in FORMAT"
1670 " tag at %L", &e
->where
);
1674 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1676 gfc_error ("Non-character assumed size array element in FORMAT"
1677 " tag at %L", &e
->where
);
1681 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1683 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1693 /* Do expression resolution and type-checking on an expression tag. */
1696 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1701 if (!gfc_resolve_expr (e
))
1704 if (tag
== &tag_format
)
1705 return resolve_tag_format (e
);
1707 if (e
->ts
.type
!= tag
->type
)
1709 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1710 &e
->where
, gfc_basic_typename (tag
->type
));
1714 if (e
->ts
.type
== BT_CHARACTER
&& e
->ts
.kind
!= gfc_default_character_kind
)
1716 gfc_error ("%s tag at %L must be a character string of default kind",
1717 tag
->name
, &e
->where
);
1723 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1727 if (tag
== &tag_iomsg
)
1729 if (!gfc_notify_std (GFC_STD_F2003
, "IOMSG tag at %L", &e
->where
))
1733 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
1734 || tag
== &tag_number
|| tag
== &tag_nextrec
|| tag
== &tag_s_recl
)
1735 && e
->ts
.kind
!= gfc_default_integer_kind
)
1737 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1738 "INTEGER in %s tag at %L", tag
->name
, &e
->where
))
1742 if (e
->ts
.kind
!= gfc_default_logical_kind
&&
1743 (tag
== &tag_exist
|| tag
== &tag_named
|| tag
== &tag_opened
1744 || tag
== &tag_pending
))
1746 if (!gfc_notify_std (GFC_STD_F2008
, "Non-default LOGICAL kind "
1747 "in %s tag at %L", tag
->name
, &e
->where
))
1751 if (tag
== &tag_newunit
)
1753 if (!gfc_notify_std (GFC_STD_F2008
, "NEWUNIT specifier at %L",
1758 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1759 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1760 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1764 sprintf (context
, _("%s tag"), tag
->name
);
1765 if (!gfc_check_vardef_context (e
, false, false, false, context
))
1769 if (tag
== &tag_convert
)
1771 if (!gfc_notify_std (GFC_STD_GNU
, "CONVERT tag at %L", &e
->where
))
1779 /* Match a single tag of an OPEN statement. */
1782 match_open_element (gfc_open
*open
)
1786 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1787 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
1791 m
= match_etag (&tag_unit
, &open
->unit
);
1794 m
= match_etag (&tag_iomsg
, &open
->iomsg
);
1795 if (m
== MATCH_YES
&& !check_char_variable (open
->iomsg
))
1799 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1802 m
= match_etag (&tag_file
, &open
->file
);
1805 m
= match_etag (&tag_status
, &open
->status
);
1808 m
= match_etag (&tag_e_access
, &open
->access
);
1811 m
= match_etag (&tag_e_form
, &open
->form
);
1814 m
= match_etag (&tag_e_recl
, &open
->recl
);
1817 m
= match_etag (&tag_e_blank
, &open
->blank
);
1820 m
= match_etag (&tag_e_position
, &open
->position
);
1823 m
= match_etag (&tag_e_action
, &open
->action
);
1826 m
= match_etag (&tag_e_delim
, &open
->delim
);
1829 m
= match_etag (&tag_e_pad
, &open
->pad
);
1832 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1835 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1838 m
= match_etag (&tag_e_round
, &open
->round
);
1841 m
= match_etag (&tag_e_sign
, &open
->sign
);
1844 m
= match_ltag (&tag_err
, &open
->err
);
1847 m
= match_etag (&tag_convert
, &open
->convert
);
1850 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1854 /* The following are extensions enabled with -fdec. */
1855 m
= match_dec_etag (&tag_e_share
, &open
->share
);
1858 m
= match_dec_etag (&tag_cc
, &open
->cc
);
1861 m
= match_dec_ftag (&tag_readonly
, open
);
1864 m
= match_dec_ftag (&tag_shared
, open
);
1867 m
= match_dec_ftag (&tag_noshared
, open
);
1875 /* Free the gfc_open structure and all the expressions it contains. */
1878 gfc_free_open (gfc_open
*open
)
1883 gfc_free_expr (open
->unit
);
1884 gfc_free_expr (open
->iomsg
);
1885 gfc_free_expr (open
->iostat
);
1886 gfc_free_expr (open
->file
);
1887 gfc_free_expr (open
->status
);
1888 gfc_free_expr (open
->access
);
1889 gfc_free_expr (open
->form
);
1890 gfc_free_expr (open
->recl
);
1891 gfc_free_expr (open
->blank
);
1892 gfc_free_expr (open
->position
);
1893 gfc_free_expr (open
->action
);
1894 gfc_free_expr (open
->delim
);
1895 gfc_free_expr (open
->pad
);
1896 gfc_free_expr (open
->decimal
);
1897 gfc_free_expr (open
->encoding
);
1898 gfc_free_expr (open
->round
);
1899 gfc_free_expr (open
->sign
);
1900 gfc_free_expr (open
->convert
);
1901 gfc_free_expr (open
->asynchronous
);
1902 gfc_free_expr (open
->newunit
);
1903 gfc_free_expr (open
->share
);
1904 gfc_free_expr (open
->cc
);
1909 /* Resolve everything in a gfc_open structure. */
1912 gfc_resolve_open (gfc_open
*open
)
1915 RESOLVE_TAG (&tag_unit
, open
->unit
);
1916 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1917 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1918 RESOLVE_TAG (&tag_file
, open
->file
);
1919 RESOLVE_TAG (&tag_status
, open
->status
);
1920 RESOLVE_TAG (&tag_e_access
, open
->access
);
1921 RESOLVE_TAG (&tag_e_form
, open
->form
);
1922 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1923 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1924 RESOLVE_TAG (&tag_e_position
, open
->position
);
1925 RESOLVE_TAG (&tag_e_action
, open
->action
);
1926 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1927 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1928 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1929 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1930 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1931 RESOLVE_TAG (&tag_e_round
, open
->round
);
1932 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1933 RESOLVE_TAG (&tag_convert
, open
->convert
);
1934 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1935 RESOLVE_TAG (&tag_e_share
, open
->share
);
1936 RESOLVE_TAG (&tag_cc
, open
->cc
);
1938 if (!gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
))
1945 /* Check if a given value for a SPECIFIER is either in the list of values
1946 allowed in F95 or F2003, issuing an error message and returning a zero
1947 value if it is not allowed. */
1950 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1951 const char *allowed_f2003
[],
1952 const char *allowed_gnu
[], gfc_char_t
*value
,
1953 const char *statement
, bool warn
,
1958 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1959 const char *allowed_f2003
[],
1960 const char *allowed_gnu
[], gfc_char_t
*value
,
1961 const char *statement
, bool warn
, int *num
)
1966 len
= gfc_wide_strlen (value
);
1969 for (len
--; len
> 0; len
--)
1970 if (value
[len
] != ' ')
1975 for (i
= 0; allowed
[i
]; i
++)
1976 if (len
== strlen (allowed
[i
])
1977 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
1984 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
1985 if (len
== strlen (allowed_f2003
[i
])
1986 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
1987 strlen (allowed_f2003
[i
])) == 0)
1989 notification n
= gfc_notification_std (GFC_STD_F2003
);
1991 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1993 gfc_warning (0, "Fortran 2003: %s specifier in %s statement at %C "
1994 "has value %qs", specifier
, statement
,
2001 gfc_notify_std (GFC_STD_F2003
, "%s specifier in "
2002 "%s statement at %C has value %qs", specifier
,
2003 statement
, allowed_f2003
[i
]);
2011 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
2012 if (len
== strlen (allowed_gnu
[i
])
2013 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
2014 strlen (allowed_gnu
[i
])) == 0)
2016 notification n
= gfc_notification_std (GFC_STD_GNU
);
2018 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2020 gfc_warning (0, "Extension: %s specifier in %s statement at %C "
2021 "has value %qs", specifier
, statement
,
2028 gfc_notify_std (GFC_STD_GNU
, "%s specifier in "
2029 "%s statement at %C has value %qs", specifier
,
2030 statement
, allowed_gnu
[i
]);
2040 char *s
= gfc_widechar_to_char (value
, -1);
2042 "%s specifier in %s statement at %C has invalid value %qs",
2043 specifier
, statement
, s
);
2049 char *s
= gfc_widechar_to_char (value
, -1);
2050 gfc_error ("%s specifier in %s statement at %C has invalid value %qs",
2051 specifier
, statement
, s
);
2058 /* Match an OPEN statement. */
2061 gfc_match_open (void)
2067 m
= gfc_match_char ('(');
2071 open
= XCNEW (gfc_open
);
2073 m
= match_open_element (open
);
2075 if (m
== MATCH_ERROR
)
2079 m
= gfc_match_expr (&open
->unit
);
2080 if (m
== MATCH_ERROR
)
2086 if (gfc_match_char (')') == MATCH_YES
)
2088 if (gfc_match_char (',') != MATCH_YES
)
2091 m
= match_open_element (open
);
2092 if (m
== MATCH_ERROR
)
2098 if (gfc_match_eos () == MATCH_NO
)
2101 if (gfc_pure (NULL
))
2103 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
2107 gfc_unset_implicit_pure (NULL
);
2109 warn
= (open
->err
|| open
->iostat
) ? true : false;
2111 /* Checks on NEWUNIT specifier. */
2116 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
2120 if (!open
->file
&& open
->status
)
2122 if (open
->status
->expr_type
== EXPR_CONSTANT
2123 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2126 gfc_error ("NEWUNIT specifier must have FILE= "
2127 "or STATUS='scratch' at %C");
2132 else if (!open
->unit
)
2134 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
2138 /* Checks on the ACCESS specifier. */
2139 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
2141 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
2142 static const char *access_f2003
[] = { "STREAM", NULL
};
2143 static const char *access_gnu
[] = { "APPEND", NULL
};
2145 if (!is_char_type ("ACCESS", open
->access
))
2148 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
2150 open
->access
->value
.character
.string
,
2155 /* Checks on the ACTION specifier. */
2156 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
2158 gfc_char_t
*str
= open
->action
->value
.character
.string
;
2159 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
2161 if (!is_char_type ("ACTION", open
->action
))
2164 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
2168 /* With READONLY, only allow ACTION='READ'. */
2169 if (open
->readonly
&& (gfc_wide_strlen (str
) != 4
2170 || gfc_wide_strncasecmp (str
, "READ", 4) != 0))
2172 gfc_error ("ACTION type conflicts with READONLY specifier at %C");
2176 /* If we see READONLY and no ACTION, set ACTION='READ'. */
2177 else if (open
->readonly
&& open
->action
== NULL
)
2179 open
->action
= gfc_get_character_expr (gfc_default_character_kind
,
2180 &gfc_current_locus
, "read", 4);
2183 /* Checks on the ASYNCHRONOUS specifier. */
2184 if (open
->asynchronous
)
2186 if (!gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
2187 "not allowed in Fortran 95"))
2190 if (!is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
2193 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
2195 static const char * asynchronous
[] = { "YES", "NO", NULL
};
2197 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
2198 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
2204 /* Checks on the BLANK specifier. */
2207 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
2208 "not allowed in Fortran 95"))
2211 if (!is_char_type ("BLANK", open
->blank
))
2214 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
2216 static const char *blank
[] = { "ZERO", "NULL", NULL
};
2218 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
2219 open
->blank
->value
.character
.string
,
2225 /* Checks on the CARRIAGECONTROL specifier. */
2228 if (!is_char_type ("CARRIAGECONTROL", open
->cc
))
2231 if (open
->cc
->expr_type
== EXPR_CONSTANT
)
2233 static const char *cc
[] = { "LIST", "FORTRAN", "NONE", NULL
};
2234 if (!compare_to_allowed_values ("CARRIAGECONTROL", cc
, NULL
, NULL
,
2235 open
->cc
->value
.character
.string
,
2241 /* Checks on the DECIMAL specifier. */
2244 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
2245 "not allowed in Fortran 95"))
2248 if (!is_char_type ("DECIMAL", open
->decimal
))
2251 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
2253 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
2255 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
2256 open
->decimal
->value
.character
.string
,
2262 /* Checks on the DELIM specifier. */
2265 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
2267 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
2269 if (!is_char_type ("DELIM", open
->delim
))
2272 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
2273 open
->delim
->value
.character
.string
,
2279 /* Checks on the ENCODING specifier. */
2282 if (!gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
2283 "not allowed in Fortran 95"))
2286 if (!is_char_type ("ENCODING", open
->encoding
))
2289 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
2291 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
2293 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
2294 open
->encoding
->value
.character
.string
,
2300 /* Checks on the FORM specifier. */
2301 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
2303 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
2305 if (!is_char_type ("FORM", open
->form
))
2308 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
2309 open
->form
->value
.character
.string
,
2314 /* Checks on the PAD specifier. */
2315 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
2317 static const char *pad
[] = { "YES", "NO", NULL
};
2319 if (!is_char_type ("PAD", open
->pad
))
2322 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
2323 open
->pad
->value
.character
.string
,
2328 /* Checks on the POSITION specifier. */
2329 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
2331 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
2333 if (!is_char_type ("POSITION", open
->position
))
2336 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2337 open
->position
->value
.character
.string
,
2342 /* Checks on the ROUND specifier. */
2345 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2346 "not allowed in Fortran 95"))
2349 if (!is_char_type ("ROUND", open
->round
))
2352 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2354 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2355 "COMPATIBLE", "PROCESSOR_DEFINED",
2358 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2359 open
->round
->value
.character
.string
,
2365 /* Checks on the SHARE specifier. */
2368 if (!is_char_type ("SHARE", open
->share
))
2371 if (open
->share
->expr_type
== EXPR_CONSTANT
)
2373 static const char *share
[] = { "DENYNONE", "DENYRW", NULL
};
2374 if (!compare_to_allowed_values ("SHARE", share
, NULL
, NULL
,
2375 open
->share
->value
.character
.string
,
2381 /* Checks on the SIGN specifier. */
2384 if (!gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2385 "not allowed in Fortran 95"))
2388 if (!is_char_type ("SIGN", open
->sign
))
2391 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2393 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2396 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2397 open
->sign
->value
.character
.string
,
2403 #define warn_or_error(...) \
2406 gfc_warning (0, __VA_ARGS__); \
2409 gfc_error (__VA_ARGS__); \
2414 /* Checks on the RECL specifier. */
2415 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2416 && open
->recl
->ts
.type
== BT_INTEGER
2417 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2419 warn_or_error ("RECL in OPEN statement at %C must be positive");
2422 /* Checks on the STATUS specifier. */
2423 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2425 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2426 "REPLACE", "UNKNOWN", NULL
};
2428 if (!is_char_type ("STATUS", open
->status
))
2431 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2432 open
->status
->value
.character
.string
,
2436 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2437 the FILE= specifier shall appear. */
2438 if (open
->file
== NULL
2439 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2441 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2444 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2446 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2447 "%qs and no FILE specifier is present", s
);
2451 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2452 the FILE= specifier shall not appear. */
2453 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2454 "scratch", 7) == 0 && open
->file
)
2456 warn_or_error ("The STATUS specified in OPEN statement at %C "
2457 "cannot have the value SCRATCH if a FILE specifier "
2462 /* Things that are not allowed for unformatted I/O. */
2463 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2464 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2465 || open
->sign
|| open
->pad
|| open
->blank
)
2466 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2467 "unformatted", 11) == 0)
2469 const char *spec
= (open
->delim
? "DELIM "
2470 : (open
->pad
? "PAD " : open
->blank
2473 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2474 "unformatted I/O", spec
);
2477 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2478 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2481 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2486 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2487 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2488 "sequential", 10) == 0
2489 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2491 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2494 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2495 "for stream or sequential ACCESS");
2498 #undef warn_or_error
2500 new_st
.op
= EXEC_OPEN
;
2501 new_st
.ext
.open
= open
;
2505 gfc_syntax_error (ST_OPEN
);
2508 gfc_free_open (open
);
2513 /* Free a gfc_close structure an all its expressions. */
2516 gfc_free_close (gfc_close
*close
)
2521 gfc_free_expr (close
->unit
);
2522 gfc_free_expr (close
->iomsg
);
2523 gfc_free_expr (close
->iostat
);
2524 gfc_free_expr (close
->status
);
2529 /* Match elements of a CLOSE statement. */
2532 match_close_element (gfc_close
*close
)
2536 m
= match_etag (&tag_unit
, &close
->unit
);
2539 m
= match_etag (&tag_status
, &close
->status
);
2542 m
= match_etag (&tag_iomsg
, &close
->iomsg
);
2543 if (m
== MATCH_YES
&& !check_char_variable (close
->iomsg
))
2547 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2550 m
= match_ltag (&tag_err
, &close
->err
);
2558 /* Match a CLOSE statement. */
2561 gfc_match_close (void)
2567 m
= gfc_match_char ('(');
2571 close
= XCNEW (gfc_close
);
2573 m
= match_close_element (close
);
2575 if (m
== MATCH_ERROR
)
2579 m
= gfc_match_expr (&close
->unit
);
2582 if (m
== MATCH_ERROR
)
2588 if (gfc_match_char (')') == MATCH_YES
)
2590 if (gfc_match_char (',') != MATCH_YES
)
2593 m
= match_close_element (close
);
2594 if (m
== MATCH_ERROR
)
2600 if (gfc_match_eos () == MATCH_NO
)
2603 if (gfc_pure (NULL
))
2605 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2609 gfc_unset_implicit_pure (NULL
);
2611 warn
= (close
->iostat
|| close
->err
) ? true : false;
2613 /* Checks on the STATUS specifier. */
2614 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2616 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2618 if (!is_char_type ("STATUS", close
->status
))
2621 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2622 close
->status
->value
.character
.string
,
2627 new_st
.op
= EXEC_CLOSE
;
2628 new_st
.ext
.close
= close
;
2632 gfc_syntax_error (ST_CLOSE
);
2635 gfc_free_close (close
);
2640 /* Resolve everything in a gfc_close structure. */
2643 gfc_resolve_close (gfc_close
*close
)
2645 RESOLVE_TAG (&tag_unit
, close
->unit
);
2646 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2647 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2648 RESOLVE_TAG (&tag_status
, close
->status
);
2650 if (!gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
))
2653 if (close
->unit
== NULL
)
2655 /* Find a locus from one of the arguments to close, when UNIT is
2657 locus loc
= gfc_current_locus
;
2659 loc
= close
->status
->where
;
2660 else if (close
->iostat
)
2661 loc
= close
->iostat
->where
;
2662 else if (close
->iomsg
)
2663 loc
= close
->iomsg
->where
;
2664 else if (close
->err
)
2665 loc
= close
->err
->where
;
2667 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2671 if (close
->unit
->expr_type
== EXPR_CONSTANT
2672 && close
->unit
->ts
.type
== BT_INTEGER
2673 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2675 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2676 &close
->unit
->where
);
2683 /* Free a gfc_filepos structure. */
2686 gfc_free_filepos (gfc_filepos
*fp
)
2688 gfc_free_expr (fp
->unit
);
2689 gfc_free_expr (fp
->iomsg
);
2690 gfc_free_expr (fp
->iostat
);
2695 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2698 match_file_element (gfc_filepos
*fp
)
2702 m
= match_etag (&tag_unit
, &fp
->unit
);
2705 m
= match_etag (&tag_iomsg
, &fp
->iomsg
);
2706 if (m
== MATCH_YES
&& !check_char_variable (fp
->iomsg
))
2710 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2713 m
= match_ltag (&tag_err
, &fp
->err
);
2721 /* Match the second half of the file-positioning statements, REWIND,
2722 BACKSPACE, ENDFILE, or the FLUSH statement. */
2725 match_filepos (gfc_statement st
, gfc_exec_op op
)
2730 fp
= XCNEW (gfc_filepos
);
2732 if (gfc_match_char ('(') == MATCH_NO
)
2734 m
= gfc_match_expr (&fp
->unit
);
2735 if (m
== MATCH_ERROR
)
2743 m
= match_file_element (fp
);
2744 if (m
== MATCH_ERROR
)
2748 m
= gfc_match_expr (&fp
->unit
);
2749 if (m
== MATCH_ERROR
|| m
== MATCH_NO
)
2755 if (gfc_match_char (')') == MATCH_YES
)
2757 if (gfc_match_char (',') != MATCH_YES
)
2760 m
= match_file_element (fp
);
2761 if (m
== MATCH_ERROR
)
2768 if (gfc_match_eos () != MATCH_YES
)
2771 if (gfc_pure (NULL
))
2773 gfc_error ("%s statement not allowed in PURE procedure at %C",
2774 gfc_ascii_statement (st
));
2779 gfc_unset_implicit_pure (NULL
);
2782 new_st
.ext
.filepos
= fp
;
2786 gfc_syntax_error (st
);
2789 gfc_free_filepos (fp
);
2795 gfc_resolve_filepos (gfc_filepos
*fp
)
2797 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2798 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2799 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2800 if (!gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
))
2803 if (!fp
->unit
&& (fp
->iostat
|| fp
->iomsg
))
2806 where
= fp
->iostat
? fp
->iostat
->where
: fp
->iomsg
->where
;
2807 gfc_error ("UNIT number missing in statement at %L", &where
);
2811 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2812 && fp
->unit
->ts
.type
== BT_INTEGER
2813 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2815 gfc_error ("UNIT number in statement at %L must be non-negative",
2824 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2825 and the FLUSH statement. */
2828 gfc_match_endfile (void)
2830 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2834 gfc_match_backspace (void)
2836 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2840 gfc_match_rewind (void)
2842 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2846 gfc_match_flush (void)
2848 if (!gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C"))
2851 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2854 /******************** Data Transfer Statements *********************/
2856 /* Return a default unit number. */
2859 default_unit (io_kind k
)
2868 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2872 /* Match a unit specification for a data transfer statement. */
2875 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2880 if (gfc_match_char ('*') == MATCH_YES
)
2882 if (dt
->io_unit
!= NULL
)
2885 dt
->io_unit
= default_unit (k
);
2887 c
= gfc_peek_ascii_char ();
2889 gfc_error_now ("Missing format with default unit at %C");
2894 if (gfc_match_expr (&e
) == MATCH_YES
)
2896 if (dt
->io_unit
!= NULL
)
2909 gfc_error ("Duplicate UNIT specification at %C");
2914 /* Match a format specification. */
2917 match_dt_format (gfc_dt
*dt
)
2921 gfc_st_label
*label
;
2924 where
= gfc_current_locus
;
2926 if (gfc_match_char ('*') == MATCH_YES
)
2928 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2931 dt
->format_label
= &format_asterisk
;
2935 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2939 /* Need to check if the format label is actually either an operand
2940 to a user-defined operator or is a kind type parameter. That is,
2941 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2942 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2944 gfc_gobble_whitespace ();
2945 c
= gfc_peek_ascii_char ();
2946 if (c
== '.' || c
== '_')
2947 gfc_current_locus
= where
;
2950 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2952 gfc_free_st_label (label
);
2956 if (!gfc_reference_st_label (label
, ST_LABEL_FORMAT
))
2959 dt
->format_label
= label
;
2963 else if (m
== MATCH_ERROR
)
2964 /* The label was zero or too large. Emit the correct diagnosis. */
2967 if (gfc_match_expr (&e
) == MATCH_YES
)
2969 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2974 dt
->format_expr
= e
;
2978 gfc_current_locus
= where
; /* The only case where we have to restore */
2983 gfc_error ("Duplicate format specification at %C");
2987 /* Check for formatted read and write DTIO procedures. */
2990 dtio_procs_present (gfc_symbol
*sym
, io_kind k
)
2992 gfc_symbol
*derived
;
2994 if (sym
&& sym
->ts
.u
.derived
)
2996 if (sym
->ts
.type
== BT_CLASS
&& CLASS_DATA (sym
))
2997 derived
= CLASS_DATA (sym
)->ts
.u
.derived
;
2998 else if (sym
->ts
.type
== BT_DERIVED
)
2999 derived
= sym
->ts
.u
.derived
;
3002 if ((k
== M_WRITE
|| k
== M_PRINT
) &&
3003 (gfc_find_specific_dtio_proc (derived
, true, true) != NULL
))
3005 if ((k
== M_READ
) &&
3006 (gfc_find_specific_dtio_proc (derived
, false, true) != NULL
))
3012 /* Traverse a namelist that is part of a READ statement to make sure
3013 that none of the variables in the namelist are INTENT(IN). Returns
3014 nonzero if we find such a variable. */
3017 check_namelist (gfc_symbol
*sym
)
3021 for (p
= sym
->namelist
; p
; p
= p
->next
)
3022 if (p
->sym
->attr
.intent
== INTENT_IN
)
3024 gfc_error ("Symbol %qs in namelist %qs is INTENT(IN) at %C",
3025 p
->sym
->name
, sym
->name
);
3033 /* Match a single data transfer element. */
3036 match_dt_element (io_kind k
, gfc_dt
*dt
)
3038 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3042 if (gfc_match (" unit =") == MATCH_YES
)
3044 m
= match_dt_unit (k
, dt
);
3049 if (gfc_match (" fmt =") == MATCH_YES
)
3051 m
= match_dt_format (dt
);
3056 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
3058 if (dt
->namelist
!= NULL
)
3060 gfc_error ("Duplicate NML specification at %C");
3064 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
3067 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
3069 gfc_error ("Symbol %qs at %C must be a NAMELIST group name",
3070 sym
!= NULL
? sym
->name
: name
);
3075 if (k
== M_READ
&& check_namelist (sym
))
3081 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
3082 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3086 m
= match_etag (&tag_e_blank
, &dt
->blank
);
3089 m
= match_etag (&tag_e_delim
, &dt
->delim
);
3092 m
= match_etag (&tag_e_pad
, &dt
->pad
);
3095 m
= match_etag (&tag_e_sign
, &dt
->sign
);
3098 m
= match_etag (&tag_e_round
, &dt
->round
);
3101 m
= match_out_tag (&tag_id
, &dt
->id
);
3104 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
3107 m
= match_etag (&tag_rec
, &dt
->rec
);
3110 m
= match_etag (&tag_spos
, &dt
->pos
);
3113 m
= match_etag (&tag_iomsg
, &dt
->iomsg
);
3114 if (m
== MATCH_YES
&& !check_char_variable (dt
->iomsg
))
3119 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
3122 m
= match_ltag (&tag_err
, &dt
->err
);
3124 dt
->err_where
= gfc_current_locus
;
3127 m
= match_etag (&tag_advance
, &dt
->advance
);
3130 m
= match_out_tag (&tag_size
, &dt
->size
);
3134 m
= match_ltag (&tag_end
, &dt
->end
);
3139 gfc_error ("END tag at %C not allowed in output statement");
3142 dt
->end_where
= gfc_current_locus
;
3147 m
= match_ltag (&tag_eor
, &dt
->eor
);
3149 dt
->eor_where
= gfc_current_locus
;
3157 /* Free a data transfer structure and everything below it. */
3160 gfc_free_dt (gfc_dt
*dt
)
3165 gfc_free_expr (dt
->io_unit
);
3166 gfc_free_expr (dt
->format_expr
);
3167 gfc_free_expr (dt
->rec
);
3168 gfc_free_expr (dt
->advance
);
3169 gfc_free_expr (dt
->iomsg
);
3170 gfc_free_expr (dt
->iostat
);
3171 gfc_free_expr (dt
->size
);
3172 gfc_free_expr (dt
->pad
);
3173 gfc_free_expr (dt
->delim
);
3174 gfc_free_expr (dt
->sign
);
3175 gfc_free_expr (dt
->round
);
3176 gfc_free_expr (dt
->blank
);
3177 gfc_free_expr (dt
->decimal
);
3178 gfc_free_expr (dt
->pos
);
3179 gfc_free_expr (dt
->dt_io_kind
);
3180 /* dt->extra_comma is a link to dt_io_kind if it is set. */
3185 /* Resolve everything in a gfc_dt structure. */
3188 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
3193 /* This is set in any case. */
3194 gcc_assert (dt
->dt_io_kind
);
3195 k
= dt
->dt_io_kind
->value
.iokind
;
3197 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
3198 RESOLVE_TAG (&tag_rec
, dt
->rec
);
3199 RESOLVE_TAG (&tag_spos
, dt
->pos
);
3200 RESOLVE_TAG (&tag_advance
, dt
->advance
);
3201 RESOLVE_TAG (&tag_id
, dt
->id
);
3202 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
3203 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
3204 RESOLVE_TAG (&tag_size
, dt
->size
);
3205 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
3206 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
3207 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
3208 RESOLVE_TAG (&tag_e_round
, dt
->round
);
3209 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
3210 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
3211 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
3216 gfc_error ("UNIT not specified at %L", loc
);
3220 if (gfc_resolve_expr (e
)
3221 && (e
->ts
.type
!= BT_INTEGER
3222 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
3224 /* If there is no extra comma signifying the "format" form of the IO
3225 statement, then this must be an error. */
3226 if (!dt
->extra_comma
)
3228 gfc_error ("UNIT specification at %L must be an INTEGER expression "
3229 "or a CHARACTER variable", &e
->where
);
3234 /* At this point, we have an extra comma. If io_unit has arrived as
3235 type character, we assume its really the "format" form of the I/O
3236 statement. We set the io_unit to the default unit and format to
3237 the character expression. See F95 Standard section 9.4. */
3238 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
3240 dt
->format_expr
= dt
->io_unit
;
3241 dt
->io_unit
= default_unit (k
);
3243 /* Nullify this pointer now so that a warning/error is not
3244 triggered below for the "Extension". */
3245 dt
->extra_comma
= NULL
;
3250 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
3251 &dt
->extra_comma
->where
);
3257 if (e
->ts
.type
== BT_CHARACTER
)
3259 if (gfc_has_vector_index (e
))
3261 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
3265 /* If we are writing, make sure the internal unit can be changed. */
3266 gcc_assert (k
!= M_PRINT
);
3268 && !gfc_check_vardef_context (e
, false, false, false,
3269 _("internal unit in WRITE")))
3273 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
3275 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
3279 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
3280 && mpz_sgn (e
->value
.integer
) < 0)
3282 gfc_error ("UNIT number in statement at %L must be non-negative",
3287 /* If we are reading and have a namelist, check that all namelist symbols
3288 can appear in a variable definition context. */
3292 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
3299 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
3300 t
= gfc_check_vardef_context (e
, false, false, false, NULL
);
3305 gfc_error ("NAMELIST %qs in READ statement at %L contains"
3306 " the symbol %qs which may not appear in a"
3307 " variable definition context",
3308 dt
->namelist
->name
, loc
, n
->sym
->name
);
3313 t
= dtio_procs_present (n
->sym
, k
);
3315 if (n
->sym
->ts
.type
== BT_CLASS
&& !t
)
3317 gfc_error ("NAMELIST object %qs in namelist %qs at %L is "
3318 "polymorphic and requires a defined input/output "
3319 "procedure", n
->sym
->name
, dt
->namelist
->name
, loc
);
3323 if ((n
->sym
->ts
.type
== BT_DERIVED
)
3324 && (n
->sym
->ts
.u
.derived
->attr
.alloc_comp
3325 || n
->sym
->ts
.u
.derived
->attr
.pointer_comp
))
3327 if (!gfc_notify_std (GFC_STD_F2003
, "NAMELIST object %qs in "
3328 "namelist %qs at %L with ALLOCATABLE "
3329 "or POINTER components", n
->sym
->name
,
3330 dt
->namelist
->name
, loc
))
3335 gfc_error ("NAMELIST object %qs in namelist %qs at %L has "
3336 "ALLOCATABLE or POINTER components and thus requires "
3337 "a defined input/output procedure", n
->sym
->name
,
3338 dt
->namelist
->name
, loc
);
3346 && !gfc_notify_std (GFC_STD_LEGACY
, "Comma before i/o item list at %L",
3347 &dt
->extra_comma
->where
))
3352 if (!gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
))
3354 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
3356 gfc_error ("ERR tag label %d at %L not defined",
3357 dt
->err
->value
, &dt
->err_where
);
3364 if (!gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
))
3366 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
3368 gfc_error ("END tag label %d at %L not defined",
3369 dt
->end
->value
, &dt
->end_where
);
3376 if (!gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
))
3378 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
3380 gfc_error ("EOR tag label %d at %L not defined",
3381 dt
->eor
->value
, &dt
->eor_where
);
3386 /* Check the format label actually exists. */
3387 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
3388 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
3390 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
3399 /* Given an io_kind, return its name. */
3402 io_kind_name (io_kind k
)
3421 gfc_internal_error ("io_kind_name(): bad I/O-kind");
3428 /* Match an IO iteration statement of the form:
3430 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
3432 which is equivalent to a single IO element. This function is
3433 mutually recursive with match_io_element(). */
3435 static match
match_io_element (io_kind
, gfc_code
**);
3438 match_io_iterator (io_kind k
, gfc_code
**result
)
3440 gfc_code
*head
, *tail
, *new_code
;
3448 old_loc
= gfc_current_locus
;
3450 if (gfc_match_char ('(') != MATCH_YES
)
3453 m
= match_io_element (k
, &head
);
3456 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3462 /* Can't be anything but an IO iterator. Build a list. */
3463 iter
= gfc_get_iterator ();
3467 m
= gfc_match_iterator (iter
, 0);
3468 if (m
== MATCH_ERROR
)
3472 gfc_check_do_variable (iter
->var
->symtree
);
3476 m
= match_io_element (k
, &new_code
);
3477 if (m
== MATCH_ERROR
)
3486 tail
= gfc_append_code (tail
, new_code
);
3488 if (gfc_match_char (',') != MATCH_YES
)
3497 if (gfc_match_char (')') != MATCH_YES
)
3500 new_code
= gfc_get_code (EXEC_DO
);
3501 new_code
->ext
.iterator
= iter
;
3503 new_code
->block
= gfc_get_code (EXEC_DO
);
3504 new_code
->block
->next
= head
;
3510 gfc_error ("Syntax error in I/O iterator at %C");
3514 gfc_free_iterator (iter
, 1);
3515 gfc_free_statements (head
);
3516 gfc_current_locus
= old_loc
;
3521 /* Match a single element of an IO list, which is either a single
3522 expression or an IO Iterator. */
3525 match_io_element (io_kind k
, gfc_code
**cpp
)
3533 m
= match_io_iterator (k
, cpp
);
3539 m
= gfc_match_variable (&expr
, 0);
3541 gfc_error ("Expected variable in READ statement at %C");
3545 m
= gfc_match_expr (&expr
);
3547 gfc_error ("Expected expression in %s statement at %C",
3551 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3556 gfc_free_expr (expr
);
3560 cp
= gfc_get_code (EXEC_TRANSFER
);
3563 cp
->ext
.dt
= current_dt
;
3570 /* Match an I/O list, building gfc_code structures as we go. */
3573 match_io_list (io_kind k
, gfc_code
**head_p
)
3575 gfc_code
*head
, *tail
, *new_code
;
3578 *head_p
= head
= tail
= NULL
;
3579 if (gfc_match_eos () == MATCH_YES
)
3584 m
= match_io_element (k
, &new_code
);
3585 if (m
== MATCH_ERROR
)
3590 tail
= gfc_append_code (tail
, new_code
);
3594 if (gfc_match_eos () == MATCH_YES
)
3596 if (gfc_match_char (',') != MATCH_YES
)
3604 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3607 gfc_free_statements (head
);
3612 /* Attach the data transfer end node. */
3615 terminate_io (gfc_code
*io_code
)
3619 if (io_code
== NULL
)
3620 io_code
= new_st
.block
;
3622 c
= gfc_get_code (EXEC_DT_END
);
3624 /* Point to structure that is already there */
3625 c
->ext
.dt
= new_st
.ext
.dt
;
3626 gfc_append_code (io_code
, c
);
3630 /* Check the constraints for a data transfer statement. The majority of the
3631 constraints appearing in 9.4 of the standard appear here. Some are handled
3632 in resolve_tag and others in gfc_resolve_dt. Also set the async_io_dt flag
3633 and, if necessary, the asynchronous flag on the SIZE argument. */
3636 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3639 #define io_constraint(condition,msg,arg)\
3642 gfc_error(msg,arg);\
3648 gfc_symbol
*sym
= NULL
;
3649 bool warn
, unformatted
;
3651 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3652 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3653 && dt
->namelist
== NULL
;
3658 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3659 && expr
->ts
.type
== BT_CHARACTER
)
3661 sym
= expr
->symtree
->n
.sym
;
3663 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3664 "Internal file at %L must not be INTENT(IN)",
3667 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3668 "Internal file incompatible with vector subscript at %L",
3671 io_constraint (dt
->rec
!= NULL
,
3672 "REC tag at %L is incompatible with internal file",
3675 io_constraint (dt
->pos
!= NULL
,
3676 "POS tag at %L is incompatible with internal file",
3679 io_constraint (unformatted
,
3680 "Unformatted I/O not allowed with internal unit at %L",
3681 &dt
->io_unit
->where
);
3683 io_constraint (dt
->asynchronous
!= NULL
,
3684 "ASYNCHRONOUS tag at %L not allowed with internal file",
3685 &dt
->asynchronous
->where
);
3687 if (dt
->namelist
!= NULL
)
3689 if (!gfc_notify_std (GFC_STD_F2003
, "Internal file at %L with "
3690 "namelist", &expr
->where
))
3694 io_constraint (dt
->advance
!= NULL
,
3695 "ADVANCE tag at %L is incompatible with internal file",
3696 &dt
->advance
->where
);
3699 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3702 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3703 "IO UNIT in %s statement at %C must be "
3704 "an internal file in a PURE procedure",
3707 if (k
== M_READ
|| k
== M_WRITE
)
3708 gfc_unset_implicit_pure (NULL
);
3713 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3716 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3719 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3722 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3725 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3730 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3731 "SIZE tag at %L requires an ADVANCE tag",
3734 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3735 "EOR tag at %L requires an ADVANCE tag",
3739 if (dt
->asynchronous
)
3742 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3744 if (!gfc_reduce_init_expr (dt
->asynchronous
))
3746 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3747 "expression", &dt
->asynchronous
->where
);
3751 if (!is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3754 if (!compare_to_allowed_values
3755 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3756 dt
->asynchronous
->value
.character
.string
,
3757 io_kind_name (k
), warn
, &num
))
3760 /* Best to put this here because the yes/no info is still around. */
3761 async_io_dt
= num
== 0;
3762 if (async_io_dt
&& dt
->size
)
3763 dt
->size
->symtree
->n
.sym
->attr
.asynchronous
= 1;
3766 async_io_dt
= false;
3772 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3773 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3775 io_constraint (not_yes
,
3776 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3777 "specifier", &dt
->id
->where
);
3782 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3783 "not allowed in Fortran 95"))
3786 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3788 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3790 if (!is_char_type ("DECIMAL", dt
->decimal
))
3793 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3794 dt
->decimal
->value
.character
.string
,
3795 io_kind_name (k
), warn
))
3798 io_constraint (unformatted
,
3799 "the DECIMAL= specifier at %L must be with an "
3800 "explicit format expression", &dt
->decimal
->where
);
3806 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3807 "not allowed in Fortran 95"))
3810 if (!is_char_type ("BLANK", dt
->blank
))
3813 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3815 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3818 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3819 dt
->blank
->value
.character
.string
,
3820 io_kind_name (k
), warn
))
3823 io_constraint (unformatted
,
3824 "the BLANK= specifier at %L must be with an "
3825 "explicit format expression", &dt
->blank
->where
);
3831 if (!gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3832 "not allowed in Fortran 95"))
3835 if (!is_char_type ("PAD", dt
->pad
))
3838 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3840 static const char * pad
[] = { "YES", "NO", NULL
};
3842 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3843 dt
->pad
->value
.character
.string
,
3844 io_kind_name (k
), warn
))
3847 io_constraint (unformatted
,
3848 "the PAD= specifier at %L must be with an "
3849 "explicit format expression", &dt
->pad
->where
);
3855 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3856 "not allowed in Fortran 95"))
3859 if (!is_char_type ("ROUND", dt
->round
))
3862 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3864 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3865 "COMPATIBLE", "PROCESSOR_DEFINED",
3868 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3869 dt
->round
->value
.character
.string
,
3870 io_kind_name (k
), warn
))
3877 /* When implemented, change the following to use gfc_notify_std F2003.
3878 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3879 "not allowed in Fortran 95") == false)
3880 return MATCH_ERROR; */
3882 if (!is_char_type ("SIGN", dt
->sign
))
3885 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3887 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3890 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3891 dt
->sign
->value
.character
.string
,
3892 io_kind_name (k
), warn
))
3895 io_constraint (unformatted
,
3896 "SIGN= specifier at %L must be with an "
3897 "explicit format expression", &dt
->sign
->where
);
3899 io_constraint (k
== M_READ
,
3900 "SIGN= specifier at %L not allowed in a "
3901 "READ statement", &dt
->sign
->where
);
3907 if (!gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
3908 "not allowed in Fortran 95"))
3911 if (!is_char_type ("DELIM", dt
->delim
))
3914 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3916 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3918 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3919 dt
->delim
->value
.character
.string
,
3920 io_kind_name (k
), warn
))
3923 io_constraint (k
== M_READ
,
3924 "DELIM= specifier at %L not allowed in a "
3925 "READ statement", &dt
->delim
->where
);
3927 io_constraint (dt
->format_label
!= &format_asterisk
3928 && dt
->namelist
== NULL
,
3929 "DELIM= specifier at %L must have FMT=*",
3932 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3933 "DELIM= specifier at %L must be with FMT=* or "
3934 "NML= specifier", &dt
->delim
->where
);
3940 io_constraint (io_code
&& dt
->namelist
,
3941 "NAMELIST cannot be followed by IO-list at %L",
3944 io_constraint (dt
->format_expr
,
3945 "IO spec-list cannot contain both NAMELIST group name "
3946 "and format specification at %L",
3947 &dt
->format_expr
->where
);
3949 io_constraint (dt
->format_label
,
3950 "IO spec-list cannot contain both NAMELIST group name "
3951 "and format label at %L", spec_end
);
3953 io_constraint (dt
->rec
,
3954 "NAMELIST IO is not allowed with a REC= specifier "
3955 "at %L", &dt
->rec
->where
);
3957 io_constraint (dt
->advance
,
3958 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3959 "at %L", &dt
->advance
->where
);
3964 io_constraint (dt
->end
,
3965 "An END tag is not allowed with a "
3966 "REC= specifier at %L", &dt
->end_where
);
3968 io_constraint (dt
->format_label
== &format_asterisk
,
3969 "FMT=* is not allowed with a REC= specifier "
3972 io_constraint (dt
->pos
,
3973 "POS= is not allowed with REC= specifier "
3974 "at %L", &dt
->pos
->where
);
3979 int not_yes
, not_no
;
3982 io_constraint (dt
->format_label
== &format_asterisk
,
3983 "List directed format(*) is not allowed with a "
3984 "ADVANCE= specifier at %L.", &expr
->where
);
3986 io_constraint (unformatted
,
3987 "the ADVANCE= specifier at %L must appear with an "
3988 "explicit format expression", &expr
->where
);
3990 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
3992 const gfc_char_t
*advance
= expr
->value
.character
.string
;
3993 not_no
= gfc_wide_strlen (advance
) != 2
3994 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
3995 not_yes
= gfc_wide_strlen (advance
) != 3
3996 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
4004 io_constraint (not_no
&& not_yes
,
4005 "ADVANCE= specifier at %L must have value = "
4006 "YES or NO.", &expr
->where
);
4008 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
4009 "SIZE tag at %L requires an ADVANCE = %<NO%>",
4012 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
4013 "EOR tag at %L requires an ADVANCE = %<NO%>",
4017 expr
= dt
->format_expr
;
4018 if (!gfc_simplify_expr (expr
, 0)
4019 || !check_format_string (expr
, k
== M_READ
))
4024 #undef io_constraint
4027 /* Match a READ, WRITE or PRINT statement. */
4030 match_io (io_kind k
)
4032 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4037 locus spec_end
, control
;
4041 where
= gfc_current_locus
;
4043 current_dt
= dt
= XCNEW (gfc_dt
);
4044 m
= gfc_match_char ('(');
4047 where
= gfc_current_locus
;
4050 else if (k
== M_PRINT
)
4052 /* Treat the non-standard case of PRINT namelist. */
4053 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
4054 && gfc_match_name (name
) == MATCH_YES
)
4056 gfc_find_symbol (name
, NULL
, 1, &sym
);
4057 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4059 if (!gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
4060 "%C is an extension"))
4066 dt
->io_unit
= default_unit (k
);
4071 gfc_current_locus
= where
;
4075 if (gfc_current_form
== FORM_FREE
)
4077 char c
= gfc_peek_ascii_char ();
4078 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
4085 m
= match_dt_format (dt
);
4086 if (m
== MATCH_ERROR
)
4092 dt
->io_unit
= default_unit (k
);
4097 /* Before issuing an error for a malformed 'print (1,*)' type of
4098 error, check for a default-char-expr of the form ('(I0)'). */
4101 control
= gfc_current_locus
;
4104 /* Reset current locus to get the initial '(' in an expression. */
4105 gfc_current_locus
= where
;
4106 dt
->format_expr
= NULL
;
4107 m
= match_dt_format (dt
);
4109 if (m
== MATCH_ERROR
)
4111 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
4115 dt
->io_unit
= default_unit (k
);
4120 /* Commit any pending symbols now so that when we undo
4121 symbols later we wont lose them. */
4122 gfc_commit_symbols ();
4123 /* Reset current locus to get the initial '(' in an expression. */
4124 gfc_current_locus
= where
;
4125 dt
->format_expr
= NULL
;
4126 m
= gfc_match_expr (&dt
->format_expr
);
4130 && dt
->format_expr
->ts
.type
== BT_CHARACTER
)
4133 dt
->io_unit
= default_unit (k
);
4138 gfc_free_expr (dt
->format_expr
);
4139 dt
->format_expr
= NULL
;
4140 gfc_current_locus
= control
;
4146 gfc_undo_symbols ();
4147 gfc_free_expr (dt
->format_expr
);
4148 dt
->format_expr
= NULL
;
4149 gfc_current_locus
= control
;
4155 /* Match a control list */
4156 if (match_dt_element (k
, dt
) == MATCH_YES
)
4158 if (match_dt_unit (k
, dt
) != MATCH_YES
)
4161 if (gfc_match_char (')') == MATCH_YES
)
4163 if (gfc_match_char (',') != MATCH_YES
)
4166 m
= match_dt_element (k
, dt
);
4169 if (m
== MATCH_ERROR
)
4172 m
= match_dt_format (dt
);
4175 if (m
== MATCH_ERROR
)
4178 where
= gfc_current_locus
;
4180 m
= gfc_match_name (name
);
4183 gfc_find_symbol (name
, NULL
, 1, &sym
);
4184 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4187 if (k
== M_READ
&& check_namelist (sym
))
4196 gfc_current_locus
= where
;
4198 goto loop
; /* No matches, try regular elements */
4201 if (gfc_match_char (')') == MATCH_YES
)
4203 if (gfc_match_char (',') != MATCH_YES
)
4209 m
= match_dt_element (k
, dt
);
4212 if (m
== MATCH_ERROR
)
4215 if (gfc_match_char (')') == MATCH_YES
)
4217 if (gfc_match_char (',') != MATCH_YES
)
4223 /* Used in check_io_constraints, where no locus is available. */
4224 spec_end
= gfc_current_locus
;
4226 /* Save the IO kind for later use. */
4227 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
4229 /* Optional leading comma (non-standard). We use a gfc_expr structure here
4230 to save the locus. This is used later when resolving transfer statements
4231 that might have a format expression without unit number. */
4232 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
4233 dt
->extra_comma
= dt
->dt_io_kind
;
4236 if (gfc_match_eos () != MATCH_YES
)
4238 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
4240 gfc_error ("Expected comma in I/O list at %C");
4245 m
= match_io_list (k
, &io_code
);
4246 if (m
== MATCH_ERROR
)
4252 /* See if we want to use defaults for missing exponents in real transfers. */
4254 dt
->default_exp
= 1;
4256 /* A full IO statement has been matched. Check the constraints. spec_end is
4257 supplied for cases where no locus is supplied. */
4258 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
4260 if (m
== MATCH_ERROR
)
4263 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
4265 new_st
.block
= gfc_get_code (new_st
.op
);
4266 new_st
.block
->next
= io_code
;
4268 terminate_io (io_code
);
4273 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
4283 gfc_match_read (void)
4285 return match_io (M_READ
);
4290 gfc_match_write (void)
4292 return match_io (M_WRITE
);
4297 gfc_match_print (void)
4301 m
= match_io (M_PRINT
);
4305 if (gfc_pure (NULL
))
4307 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
4311 gfc_unset_implicit_pure (NULL
);
4317 /* Free a gfc_inquire structure. */
4320 gfc_free_inquire (gfc_inquire
*inquire
)
4323 if (inquire
== NULL
)
4326 gfc_free_expr (inquire
->unit
);
4327 gfc_free_expr (inquire
->file
);
4328 gfc_free_expr (inquire
->iomsg
);
4329 gfc_free_expr (inquire
->iostat
);
4330 gfc_free_expr (inquire
->exist
);
4331 gfc_free_expr (inquire
->opened
);
4332 gfc_free_expr (inquire
->number
);
4333 gfc_free_expr (inquire
->named
);
4334 gfc_free_expr (inquire
->name
);
4335 gfc_free_expr (inquire
->access
);
4336 gfc_free_expr (inquire
->sequential
);
4337 gfc_free_expr (inquire
->direct
);
4338 gfc_free_expr (inquire
->form
);
4339 gfc_free_expr (inquire
->formatted
);
4340 gfc_free_expr (inquire
->unformatted
);
4341 gfc_free_expr (inquire
->recl
);
4342 gfc_free_expr (inquire
->nextrec
);
4343 gfc_free_expr (inquire
->blank
);
4344 gfc_free_expr (inquire
->position
);
4345 gfc_free_expr (inquire
->action
);
4346 gfc_free_expr (inquire
->read
);
4347 gfc_free_expr (inquire
->write
);
4348 gfc_free_expr (inquire
->readwrite
);
4349 gfc_free_expr (inquire
->delim
);
4350 gfc_free_expr (inquire
->encoding
);
4351 gfc_free_expr (inquire
->pad
);
4352 gfc_free_expr (inquire
->iolength
);
4353 gfc_free_expr (inquire
->convert
);
4354 gfc_free_expr (inquire
->strm_pos
);
4355 gfc_free_expr (inquire
->asynchronous
);
4356 gfc_free_expr (inquire
->decimal
);
4357 gfc_free_expr (inquire
->pending
);
4358 gfc_free_expr (inquire
->id
);
4359 gfc_free_expr (inquire
->sign
);
4360 gfc_free_expr (inquire
->size
);
4361 gfc_free_expr (inquire
->round
);
4362 gfc_free_expr (inquire
->share
);
4363 gfc_free_expr (inquire
->cc
);
4368 /* Match an element of an INQUIRE statement. */
4370 #define RETM if (m != MATCH_NO) return m;
4373 match_inquire_element (gfc_inquire
*inquire
)
4377 m
= match_etag (&tag_unit
, &inquire
->unit
);
4378 RETM m
= match_etag (&tag_file
, &inquire
->file
);
4379 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
4380 RETM m
= match_etag (&tag_iomsg
, &inquire
->iomsg
);
4381 if (m
== MATCH_YES
&& !check_char_variable (inquire
->iomsg
))
4383 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
4384 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
4385 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
4386 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
4387 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
4388 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
4389 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
4390 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
4391 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
4392 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
4393 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
4394 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
4395 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
4396 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
4397 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
4398 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
4399 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
4400 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
4401 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
4402 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
4403 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
4404 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", inquire
->asynchronous
))
4406 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
4407 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
4408 RETM m
= match_out_tag (&tag_size
, &inquire
->size
);
4409 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
4410 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
4411 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
4412 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
4413 RETM m
= match_out_tag (&tag_iolength
, &inquire
->iolength
);
4414 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
4415 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
4416 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
4417 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
4418 RETM m
= match_vtag (&tag_s_iqstream
, &inquire
->iqstream
);
4419 RETM m
= match_dec_vtag (&tag_v_share
, &inquire
->share
);
4420 RETM m
= match_dec_vtag (&tag_v_cc
, &inquire
->cc
);
4421 RETM
return MATCH_NO
;
4428 gfc_match_inquire (void)
4430 gfc_inquire
*inquire
;
4435 m
= gfc_match_char ('(');
4439 inquire
= XCNEW (gfc_inquire
);
4441 loc
= gfc_current_locus
;
4443 m
= match_inquire_element (inquire
);
4444 if (m
== MATCH_ERROR
)
4448 m
= gfc_match_expr (&inquire
->unit
);
4449 if (m
== MATCH_ERROR
)
4455 /* See if we have the IOLENGTH form of the inquire statement. */
4456 if (inquire
->iolength
!= NULL
)
4458 if (gfc_match_char (')') != MATCH_YES
)
4461 m
= match_io_list (M_INQUIRE
, &code
);
4462 if (m
== MATCH_ERROR
)
4467 new_st
.op
= EXEC_IOLENGTH
;
4468 new_st
.expr1
= inquire
->iolength
;
4469 new_st
.ext
.inquire
= inquire
;
4471 if (gfc_pure (NULL
))
4473 gfc_free_statements (code
);
4474 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4478 gfc_unset_implicit_pure (NULL
);
4480 new_st
.block
= gfc_get_code (EXEC_IOLENGTH
);
4481 terminate_io (code
);
4482 new_st
.block
->next
= code
;
4486 /* At this point, we have the non-IOLENGTH inquire statement. */
4489 if (gfc_match_char (')') == MATCH_YES
)
4491 if (gfc_match_char (',') != MATCH_YES
)
4494 m
= match_inquire_element (inquire
);
4495 if (m
== MATCH_ERROR
)
4500 if (inquire
->iolength
!= NULL
)
4502 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4507 if (gfc_match_eos () != MATCH_YES
)
4510 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
4512 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4513 "UNIT specifiers", &loc
);
4517 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4519 gfc_error ("INQUIRE statement at %L requires either FILE or "
4520 "UNIT specifier", &loc
);
4524 if (inquire
->unit
!= NULL
&& inquire
->unit
->expr_type
== EXPR_CONSTANT
4525 && inquire
->unit
->ts
.type
== BT_INTEGER
4526 && ((mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT4
)
4527 || (mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT
)))
4529 gfc_error ("UNIT number in INQUIRE statement at %L can not "
4530 "be %d", &loc
, (int) mpz_get_si (inquire
->unit
->value
.integer
));
4534 if (gfc_pure (NULL
))
4536 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4540 gfc_unset_implicit_pure (NULL
);
4542 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4544 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4545 "the ID= specifier", &loc
);
4549 new_st
.op
= EXEC_INQUIRE
;
4550 new_st
.ext
.inquire
= inquire
;
4554 gfc_syntax_error (ST_INQUIRE
);
4557 gfc_free_inquire (inquire
);
4562 /* Resolve everything in a gfc_inquire structure. */
4565 gfc_resolve_inquire (gfc_inquire
*inquire
)
4567 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4568 RESOLVE_TAG (&tag_file
, inquire
->file
);
4569 RESOLVE_TAG (&tag_id
, inquire
->id
);
4571 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4572 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4573 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4574 RESOLVE_TAG (tag, expr); \
4578 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4579 if (gfc_check_vardef_context ((expr), false, false, false, \
4580 context) == false) \
4583 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4584 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4585 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4586 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4587 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4588 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4589 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4590 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4591 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4592 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4593 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4594 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4595 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4596 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4597 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4598 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4599 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4600 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4601 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4602 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4603 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4604 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4605 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4606 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4607 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4608 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4609 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4610 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4611 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4612 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4613 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4614 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4615 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4616 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4617 INQUIRE_RESOLVE_TAG (&tag_s_iqstream
, inquire
->iqstream
);
4618 INQUIRE_RESOLVE_TAG (&tag_v_share
, inquire
->share
);
4619 INQUIRE_RESOLVE_TAG (&tag_v_cc
, inquire
->cc
);
4620 #undef INQUIRE_RESOLVE_TAG
4622 if (!gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
))
4630 gfc_free_wait (gfc_wait
*wait
)
4635 gfc_free_expr (wait
->unit
);
4636 gfc_free_expr (wait
->iostat
);
4637 gfc_free_expr (wait
->iomsg
);
4638 gfc_free_expr (wait
->id
);
4644 gfc_resolve_wait (gfc_wait
*wait
)
4646 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4647 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4648 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4649 RESOLVE_TAG (&tag_id
, wait
->id
);
4651 if (!gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
))
4654 if (!gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
))
4660 /* Match an element of a WAIT statement. */
4662 #define RETM if (m != MATCH_NO) return m;
4665 match_wait_element (gfc_wait
*wait
)
4669 m
= match_etag (&tag_unit
, &wait
->unit
);
4670 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4671 RETM m
= match_ltag (&tag_end
, &wait
->end
);
4672 RETM m
= match_ltag (&tag_eor
, &wait
->eor
);
4673 RETM m
= match_etag (&tag_iomsg
, &wait
->iomsg
);
4674 if (m
== MATCH_YES
&& !check_char_variable (wait
->iomsg
))
4676 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4677 RETM m
= match_etag (&tag_id
, &wait
->id
);
4678 RETM
return MATCH_NO
;
4685 gfc_match_wait (void)
4690 m
= gfc_match_char ('(');
4694 wait
= XCNEW (gfc_wait
);
4696 m
= match_wait_element (wait
);
4697 if (m
== MATCH_ERROR
)
4701 m
= gfc_match_expr (&wait
->unit
);
4702 if (m
== MATCH_ERROR
)
4710 if (gfc_match_char (')') == MATCH_YES
)
4712 if (gfc_match_char (',') != MATCH_YES
)
4715 m
= match_wait_element (wait
);
4716 if (m
== MATCH_ERROR
)
4722 if (!gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4723 "not allowed in Fortran 95"))
4726 if (gfc_pure (NULL
))
4728 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4732 gfc_unset_implicit_pure (NULL
);
4734 new_st
.op
= EXEC_WAIT
;
4735 new_st
.ext
.wait
= wait
;
4740 gfc_syntax_error (ST_WAIT
);
4743 gfc_free_wait (wait
);