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"
28 #include "constructor.h"
31 format_asterisk
= {0, NULL
, NULL
, -1, ST_LABEL_FORMAT
, ST_LABEL_FORMAT
, NULL
,
32 0, {NULL
, NULL
}, NULL
};
36 const char *name
, *spec
, *value
;
42 tag_readonly
= {"READONLY", " readonly", NULL
, BT_UNKNOWN
},
43 tag_shared
= {"SHARE", " shared", NULL
, BT_UNKNOWN
},
44 tag_noshared
= {"SHARE", " noshared", NULL
, BT_UNKNOWN
},
45 tag_e_share
= {"SHARE", " share =", " %e", BT_CHARACTER
},
46 tag_v_share
= {"SHARE", " share =", " %v", BT_CHARACTER
},
47 tag_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %e",
49 tag_v_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %v",
51 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
52 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
53 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
54 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
55 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
56 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
57 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
58 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
59 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
60 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
61 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
62 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
63 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
64 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
65 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
66 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
67 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
68 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
69 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
70 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
71 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
72 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
73 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
74 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
75 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
76 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
77 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
78 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
79 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
80 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
81 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
82 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
83 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
84 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
85 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
86 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
87 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
88 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
89 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
90 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
91 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
92 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
93 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
94 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
95 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
96 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
97 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
98 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
99 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
100 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
101 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
102 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
103 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
104 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
105 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
106 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
107 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
108 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
},
109 tag_s_iqstream
= {"STREAM", " stream =", " %v", BT_CHARACTER
};
111 static gfc_dt
*current_dt
;
113 #define RESOLVE_TAG(x, y) if (!resolve_tag (x, y)) return false;
115 /* Are we currently processing an asynchronous I/O statement? */
119 /**************** Fortran 95 FORMAT parser *****************/
121 /* FORMAT tokens returned by format_lex(). */
124 FMT_NONE
, FMT_UNKNOWN
, FMT_SIGNED_INT
, FMT_ZERO
, FMT_POSINT
, FMT_PERIOD
,
125 FMT_COMMA
, FMT_COLON
, FMT_SLASH
, FMT_DOLLAR
, FMT_LPAREN
,
126 FMT_RPAREN
, FMT_X
, FMT_SIGN
, FMT_BLANK
, FMT_CHAR
, FMT_P
, FMT_IBOZ
, FMT_F
,
127 FMT_E
, FMT_EN
, FMT_ES
, FMT_G
, FMT_L
, FMT_A
, FMT_D
, FMT_H
, FMT_END
,
128 FMT_ERROR
, FMT_DC
, FMT_DP
, FMT_T
, FMT_TR
, FMT_TL
, FMT_STAR
, FMT_RC
,
129 FMT_RD
, FMT_RN
, FMT_RP
, FMT_RU
, FMT_RZ
, FMT_DT
132 /* Local variables for checking format strings. The saved_token is
133 used to back up by a single format token during the parsing
135 static gfc_char_t
*format_string
;
136 static int format_string_pos
;
137 static int format_length
, use_last_char
;
138 static char error_element
;
139 static locus format_locus
;
141 static format_token saved_token
;
144 { MODE_STRING
, MODE_FORMAT
, MODE_COPY
}
148 /* Return the next character in the format string. */
151 next_char (gfc_instring in_string
)
163 if (mode
== MODE_STRING
)
164 c
= *format_string
++;
167 c
= gfc_next_char_literal (in_string
);
172 if (flag_backslash
&& c
== '\\')
174 locus old_locus
= gfc_current_locus
;
176 if (gfc_match_special_char (&c
) == MATCH_NO
)
177 gfc_current_locus
= old_locus
;
179 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
180 gfc_warning (0, "Extension: backslash character at %C");
183 if (mode
== MODE_COPY
)
184 *format_string
++ = c
;
186 if (mode
!= MODE_STRING
)
187 format_locus
= gfc_current_locus
;
191 c
= gfc_wide_toupper (c
);
196 /* Back up one character position. Only works once. */
204 /* Eat up the spaces and return a character. */
207 next_char_not_space ()
212 error_element
= c
= next_char (NONSTRING
);
214 gfc_warning (OPT_Wtabs
, "Nonconforming tab character in format at %C");
216 while (gfc_is_whitespace (c
));
220 static int value
= 0;
222 /* Simple lexical analyzer for getting the next token in a FORMAT
233 if (saved_token
!= FMT_NONE
)
236 saved_token
= FMT_NONE
;
240 c
= next_char_not_space ();
250 c
= next_char_not_space ();
261 c
= next_char_not_space ();
263 value
= 10 * value
+ c
- '0';
272 token
= FMT_SIGNED_INT
;
291 c
= next_char_not_space ();
294 value
= 10 * value
+ c
- '0';
302 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
326 c
= next_char_not_space ();
354 c
= next_char_not_space ();
355 if (c
!= 'P' && c
!= 'S')
362 c
= next_char_not_space ();
363 if (c
== 'N' || c
== 'Z')
381 c
= next_char (INSTRING_WARN
);
390 c
= next_char (NONSTRING
);
424 c
= next_char_not_space ();
454 c
= next_char_not_space ();
457 if (!gfc_notify_std (GFC_STD_F2003
, "DP format "
458 "specifier not allowed at %C"))
464 if (!gfc_notify_std (GFC_STD_F2003
, "DC format "
465 "specifier not allowed at %C"))
471 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DT format "
472 "specifier not allowed at %C"))
475 c
= next_char_not_space ();
476 if (c
== '\'' || c
== '"')
483 c
= next_char (INSTRING_WARN
);
492 c
= next_char (NONSTRING
);
526 c
= next_char_not_space ();
572 token_to_string (format_token t
)
591 /* Check a format statement. The format string, either from a FORMAT
592 statement or a constant in an I/O statement has already been parsed
593 by itself, and we are checking it for validity. The dual origin
594 means that the warning message is a little less than great. */
597 check_format (bool is_input
)
599 const char *posint_required
= _("Positive width required");
600 const char *nonneg_required
= _("Nonnegative width required");
601 const char *unexpected_element
= _("Unexpected element %qc in format "
603 const char *unexpected_end
= _("Unexpected end of format string");
604 const char *zero_width
= _("Zero width in format descriptor");
606 const char *error
= NULL
;
613 saved_token
= FMT_NONE
;
617 format_string_pos
= 0;
624 error
= _("Missing leading left parenthesis");
632 goto finished
; /* Empty format is legal */
636 /* In this state, the next thing has to be a format item. */
653 error
= _("Left parenthesis required after %<*%>");
678 /* Signed integer can only precede a P format. */
684 error
= _("Expected P edit descriptor");
691 /* P requires a prior number. */
692 error
= _("P descriptor requires leading scale factor");
696 /* X requires a prior number if we're being pedantic. */
697 if (mode
!= MODE_FORMAT
)
698 format_locus
.nextc
+= format_string_pos
;
699 if (!gfc_notify_std (GFC_STD_GNU
, "X descriptor requires leading "
700 "space count at %L", &format_locus
))
717 goto extension_optional_comma
;
728 if (!gfc_notify_std (GFC_STD_GNU
, "$ descriptor at %L", &format_locus
))
730 if (t
!= FMT_RPAREN
|| level
> 0)
732 gfc_warning (0, "$ should be the last specifier in format at %L",
734 goto optional_comma_1
;
756 error
= unexpected_end
;
760 error
= unexpected_element
;
765 /* In this state, t must currently be a data descriptor.
766 Deal with things that can/must follow the descriptor. */
777 /* No comma after P allowed only for F, E, EN, ES, D, or G.
782 if (!(gfc_option
.allow_std
& GFC_STD_F2003
) && t
!= FMT_COMMA
783 && t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
784 && t
!= FMT_D
&& t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
786 error
= _("Comma required after P descriptor");
797 if (t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
&& t
!= FMT_D
798 && t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
800 error
= _("Comma required after P descriptor");
814 error
= _("Positive width required with T descriptor");
825 if (mode
!= MODE_FORMAT
)
826 format_locus
.nextc
+= format_string_pos
;
829 switch (gfc_notification_std (GFC_STD_GNU
))
832 gfc_warning (0, "Extension: Zero width after L "
833 "descriptor at %L", &format_locus
);
836 gfc_error ("Extension: Zero width after L "
837 "descriptor at %L", &format_locus
);
848 gfc_notify_std (GFC_STD_GNU
, "Missing positive width after "
849 "L descriptor at %L", &format_locus
);
872 if (t
== FMT_G
&& u
== FMT_ZERO
)
879 if (!gfc_notify_std (GFC_STD_F2008
, "%<G0%> in format at %L",
891 error
= posint_required
;
897 error
= _("E specifier not allowed with g0 descriptor");
906 format_locus
.nextc
+= format_string_pos
;
907 gfc_error ("Positive width required in format "
908 "specifier %s at %L", token_to_string (t
),
919 /* Warn if -std=legacy, otherwise error. */
920 format_locus
.nextc
+= format_string_pos
;
921 if (gfc_option
.warn_std
!= 0)
923 gfc_error ("Period required in format "
924 "specifier %s at %L", token_to_string (t
),
930 gfc_warning (0, "Period required in format "
931 "specifier %s at %L", token_to_string (t
),
933 /* If we go to finished, we need to unwind this
934 before the next round. */
935 format_locus
.nextc
-= format_string_pos
;
943 if (u
!= FMT_ZERO
&& u
!= FMT_POSINT
)
945 error
= nonneg_required
;
952 /* Look for optional exponent. */
967 error
= _("Positive exponent width required");
1001 error
= posint_required
;
1011 if (t
!= FMT_RPAREN
)
1013 error
= _("Right parenthesis expected at %C");
1019 error
= unexpected_element
;
1028 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1030 error
= nonneg_required
;
1033 else if (is_input
&& t
== FMT_ZERO
)
1035 error
= posint_required
;
1042 if (t
!= FMT_PERIOD
)
1044 /* Warn if -std=legacy, otherwise error. */
1045 if (gfc_option
.warn_std
!= 0)
1047 error
= _("Period required in format specifier");
1050 if (mode
!= MODE_FORMAT
)
1051 format_locus
.nextc
+= format_string_pos
;
1052 gfc_warning (0, "Period required in format specifier at %L",
1061 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1063 error
= nonneg_required
;
1070 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
1072 if (mode
!= MODE_FORMAT
)
1073 format_locus
.nextc
+= format_string_pos
;
1074 gfc_warning (0, "The H format specifier at %L is"
1075 " a Fortran 95 deleted feature", &format_locus
);
1077 if (mode
== MODE_STRING
)
1079 format_string
+= value
;
1080 format_length
-= value
;
1081 format_string_pos
+= repeat
;
1087 next_char (INSTRING_WARN
);
1097 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1099 error
= nonneg_required
;
1102 else if (is_input
&& t
== FMT_ZERO
)
1104 error
= posint_required
;
1111 if (t
!= FMT_PERIOD
)
1120 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1122 error
= nonneg_required
;
1130 error
= unexpected_element
;
1135 /* Between a descriptor and what comes next. */
1153 goto optional_comma
;
1156 error
= unexpected_end
;
1160 if (mode
!= MODE_FORMAT
)
1161 format_locus
.nextc
+= format_string_pos
- 1;
1162 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1164 /* If we do not actually return a failure, we need to unwind this
1165 before the next round. */
1166 if (mode
!= MODE_FORMAT
)
1167 format_locus
.nextc
-= format_string_pos
;
1172 /* Optional comma is a weird between state where we've just finished
1173 reading a colon, slash, dollar or P descriptor. */
1190 /* Assume that we have another format item. */
1197 extension_optional_comma
:
1198 /* As a GNU extension, permit a missing comma after a string literal. */
1215 goto optional_comma
;
1218 error
= unexpected_end
;
1222 if (mode
!= MODE_FORMAT
)
1223 format_locus
.nextc
+= format_string_pos
;
1224 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1226 /* If we do not actually return a failure, we need to unwind this
1227 before the next round. */
1228 if (mode
!= MODE_FORMAT
)
1229 format_locus
.nextc
-= format_string_pos
;
1237 if (mode
!= MODE_FORMAT
)
1238 format_locus
.nextc
+= format_string_pos
;
1239 if (error
== unexpected_element
)
1240 gfc_error (error
, error_element
, &format_locus
);
1242 gfc_error ("%s in format string at %L", error
, &format_locus
);
1251 /* Given an expression node that is a constant string, see if it looks
1252 like a format string. */
1255 check_format_string (gfc_expr
*e
, bool is_input
)
1259 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1263 format_string
= e
->value
.character
.string
;
1265 /* More elaborate measures are needed to show where a problem is within a
1266 format string that has been calculated, but that's probably not worth the
1268 format_locus
= e
->where
;
1269 rv
= check_format (is_input
);
1270 /* check for extraneous characters at the end of an otherwise valid format
1271 string, like '(A10,I3)F5'
1272 start at the end and move back to the last character processed,
1274 if (rv
&& e
->value
.character
.length
> format_string_pos
)
1275 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1276 if (e
->value
.character
.string
[i
] != ' ')
1278 format_locus
.nextc
+= format_length
+ 1;
1280 "Extraneous characters in format at %L", &format_locus
);
1287 /************ Fortran I/O statement matchers *************/
1289 /* Match a FORMAT statement. This amounts to actually parsing the
1290 format descriptors in order to correctly locate the end of the
1294 gfc_match_format (void)
1299 if (gfc_current_ns
->proc_name
1300 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1302 gfc_error ("Format statement in module main block at %C");
1306 /* Before parsing the rest of a FORMAT statement, check F2008:c1206. */
1307 if ((gfc_current_state () == COMP_FUNCTION
1308 || gfc_current_state () == COMP_SUBROUTINE
)
1309 && gfc_state_stack
->previous
->state
== COMP_INTERFACE
)
1311 gfc_error ("FORMAT statement at %C cannot appear within an INTERFACE");
1315 if (gfc_statement_label
== NULL
)
1317 gfc_error ("Missing format label at %C");
1320 gfc_gobble_whitespace ();
1325 start
= gfc_current_locus
;
1327 if (!check_format (false))
1330 if (gfc_match_eos () != MATCH_YES
)
1332 gfc_syntax_error (ST_FORMAT
);
1336 /* The label doesn't get created until after the statement is done
1337 being matched, so we have to leave the string for later. */
1339 gfc_current_locus
= start
; /* Back to the beginning */
1342 new_st
.op
= EXEC_NOP
;
1344 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1345 NULL
, format_length
);
1346 format_string
= e
->value
.character
.string
;
1347 gfc_statement_label
->format
= e
;
1350 check_format (false); /* Guaranteed to succeed */
1351 gfc_match_eos (); /* Guaranteed to succeed */
1357 /* Check for a CHARACTER variable. The check for scalar is done in
1361 check_char_variable (gfc_expr
*e
)
1363 if (e
->expr_type
!= EXPR_VARIABLE
|| e
->ts
.type
!= BT_CHARACTER
)
1365 gfc_error("IOMSG must be a scalar-default-char-variable at %L", &e
->where
);
1373 is_char_type (const char *name
, gfc_expr
*e
)
1375 gfc_resolve_expr (e
);
1377 if (e
->ts
.type
!= BT_CHARACTER
)
1379 gfc_error ("%s requires a scalar-default-char-expr at %L",
1387 /* Match an expression I/O tag of some sort. */
1390 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1395 m
= gfc_match (tag
->spec
);
1399 m
= gfc_match (tag
->value
, &result
);
1402 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1408 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1409 gfc_free_expr (result
);
1418 /* Match a variable I/O tag of some sort. */
1421 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1426 m
= gfc_match (tag
->spec
);
1430 m
= gfc_match (tag
->value
, &result
);
1433 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1439 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1440 gfc_free_expr (result
);
1444 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1446 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1447 gfc_free_expr (result
);
1451 bool impure
= gfc_impure_variable (result
->symtree
->n
.sym
);
1452 if (impure
&& gfc_pure (NULL
))
1454 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1456 gfc_free_expr (result
);
1461 gfc_unset_implicit_pure (NULL
);
1468 /* Match I/O tags that cause variables to become redefined. */
1471 match_out_tag (const io_tag
*tag
, gfc_expr
**result
)
1475 m
= match_vtag (tag
, result
);
1477 gfc_check_do_variable ((*result
)->symtree
);
1483 /* Match a label I/O tag. */
1486 match_ltag (const io_tag
*tag
, gfc_st_label
** label
)
1492 m
= gfc_match (tag
->spec
);
1496 m
= gfc_match (tag
->value
, label
);
1499 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1505 gfc_error ("Duplicate %s label specification at %C", tag
->name
);
1509 if (!gfc_reference_st_label (*label
, ST_LABEL_TARGET
))
1516 /* Match a tag using match_etag, but only if -fdec is enabled. */
1518 match_dec_etag (const io_tag
*tag
, gfc_expr
**e
)
1520 match m
= match_etag (tag
, e
);
1521 if (flag_dec
&& m
!= MATCH_NO
)
1523 else if (m
!= MATCH_NO
)
1525 gfc_error ("%s at %C is a DEC extension, enable with "
1526 "%<-fdec%>", tag
->name
);
1533 /* Match a tag using match_vtag, but only if -fdec is enabled. */
1535 match_dec_vtag (const io_tag
*tag
, gfc_expr
**e
)
1537 match m
= match_vtag(tag
, e
);
1538 if (flag_dec
&& m
!= MATCH_NO
)
1540 else if (m
!= MATCH_NO
)
1542 gfc_error ("%s at %C is a DEC extension, enable with "
1543 "%<-fdec%>", tag
->name
);
1550 /* Match a DEC I/O flag tag - a tag with no expression such as READONLY. */
1553 match_dec_ftag (const io_tag
*tag
, gfc_open
*o
)
1557 m
= gfc_match (tag
->spec
);
1563 gfc_error ("%s at %C is a DEC extension, enable with "
1564 "%<-fdec%>", tag
->name
);
1568 /* Just set the READONLY flag, which we use at runtime to avoid delete on
1570 if (tag
== &tag_readonly
)
1576 /* Interpret SHARED as SHARE='DENYNONE' (read lock). */
1577 else if (tag
== &tag_shared
)
1579 if (o
->share
!= NULL
)
1581 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1584 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1585 &gfc_current_locus
, "denynone", 8);
1589 /* Interpret NOSHARED as SHARE='DENYRW' (exclusive lock). */
1590 else if (tag
== &tag_noshared
)
1592 if (o
->share
!= NULL
)
1594 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1597 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1598 &gfc_current_locus
, "denyrw", 6);
1602 /* We handle all DEC tags above. */
1607 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1610 resolve_tag_format (gfc_expr
*e
)
1612 if (e
->expr_type
== EXPR_CONSTANT
1613 && (e
->ts
.type
!= BT_CHARACTER
1614 || e
->ts
.kind
!= gfc_default_character_kind
))
1616 gfc_error ("Constant expression in FORMAT tag at %L must be "
1617 "of type default CHARACTER", &e
->where
);
1621 /* Concatenate a constant character array into a single character
1624 if ((e
->expr_type
== EXPR_ARRAY
|| e
->rank
> 0)
1625 && e
->ts
.type
== BT_CHARACTER
1626 && gfc_is_constant_expr (e
))
1628 if (e
->expr_type
== EXPR_VARIABLE
1629 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
1630 gfc_simplify_expr (e
, 1);
1632 if (e
->expr_type
== EXPR_ARRAY
)
1635 gfc_charlen_t n
, len
;
1637 gfc_char_t
*dest
, *src
;
1640 c
= gfc_constructor_first (e
->value
.constructor
);
1641 len
= c
->expr
->value
.character
.length
;
1643 for ( ; c
; c
= gfc_constructor_next (c
))
1646 r
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, n
);
1647 dest
= r
->value
.character
.string
;
1649 for (c
= gfc_constructor_first (e
->value
.constructor
);
1650 c
; c
= gfc_constructor_next (c
))
1652 src
= c
->expr
->value
.character
.string
;
1653 for (gfc_charlen_t i
= 0 ; i
< len
; i
++)
1657 gfc_replace_expr (e
, r
);
1662 /* If e's rank is zero and e is not an element of an array, it should be
1663 of integer or character type. The integer variable should be
1666 && (e
->expr_type
!= EXPR_VARIABLE
1667 || e
->symtree
== NULL
1668 || e
->symtree
->n
.sym
->as
== NULL
1669 || e
->symtree
->n
.sym
->as
->rank
== 0))
1671 if ((e
->ts
.type
!= BT_CHARACTER
1672 || e
->ts
.kind
!= gfc_default_character_kind
)
1673 && e
->ts
.type
!= BT_INTEGER
)
1675 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1676 "or of INTEGER", &e
->where
);
1679 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1681 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGNED variable in "
1682 "FORMAT tag at %L", &e
->where
))
1684 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1686 gfc_error ("Variable %qs at %L has not been assigned a "
1687 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1691 else if (e
->ts
.type
== BT_INTEGER
)
1693 gfc_error ("Scalar %qs in FORMAT tag at %L is not an ASSIGNED "
1694 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1701 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1702 It may be assigned an Hollerith constant. */
1703 if (e
->ts
.type
!= BT_CHARACTER
)
1705 if (!gfc_notify_std (GFC_STD_LEGACY
, "Non-character in FORMAT tag "
1706 "at %L", &e
->where
))
1709 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1711 gfc_error ("Non-character assumed shape array element in FORMAT"
1712 " tag at %L", &e
->where
);
1716 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1718 gfc_error ("Non-character assumed size array element in FORMAT"
1719 " tag at %L", &e
->where
);
1723 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1725 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1735 /* Do expression resolution and type-checking on an expression tag. */
1738 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1743 if (!gfc_resolve_expr (e
))
1746 if (tag
== &tag_format
)
1747 return resolve_tag_format (e
);
1749 if (e
->ts
.type
!= tag
->type
)
1751 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1752 &e
->where
, gfc_basic_typename (tag
->type
));
1756 if (e
->ts
.type
== BT_CHARACTER
&& e
->ts
.kind
!= gfc_default_character_kind
)
1758 gfc_error ("%s tag at %L must be a character string of default kind",
1759 tag
->name
, &e
->where
);
1765 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1769 if (tag
== &tag_iomsg
)
1771 if (!gfc_notify_std (GFC_STD_F2003
, "IOMSG tag at %L", &e
->where
))
1775 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
1776 || tag
== &tag_number
|| tag
== &tag_nextrec
|| tag
== &tag_s_recl
)
1777 && e
->ts
.kind
!= gfc_default_integer_kind
)
1779 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1780 "INTEGER in %s tag at %L", tag
->name
, &e
->where
))
1784 if (e
->ts
.kind
!= gfc_default_logical_kind
&&
1785 (tag
== &tag_exist
|| tag
== &tag_named
|| tag
== &tag_opened
1786 || tag
== &tag_pending
))
1788 if (!gfc_notify_std (GFC_STD_F2008
, "Non-default LOGICAL kind "
1789 "in %s tag at %L", tag
->name
, &e
->where
))
1793 if (tag
== &tag_newunit
)
1795 if (!gfc_notify_std (GFC_STD_F2008
, "NEWUNIT specifier at %L",
1800 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1801 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1802 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1806 sprintf (context
, _("%s tag"), tag
->name
);
1807 if (!gfc_check_vardef_context (e
, false, false, false, context
))
1811 if (tag
== &tag_convert
)
1813 if (!gfc_notify_std (GFC_STD_GNU
, "CONVERT tag at %L", &e
->where
))
1821 /* Match a single tag of an OPEN statement. */
1824 match_open_element (gfc_open
*open
)
1828 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1829 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
1833 m
= match_etag (&tag_unit
, &open
->unit
);
1836 m
= match_etag (&tag_iomsg
, &open
->iomsg
);
1837 if (m
== MATCH_YES
&& !check_char_variable (open
->iomsg
))
1841 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1844 m
= match_etag (&tag_file
, &open
->file
);
1847 m
= match_etag (&tag_status
, &open
->status
);
1850 m
= match_etag (&tag_e_access
, &open
->access
);
1853 m
= match_etag (&tag_e_form
, &open
->form
);
1856 m
= match_etag (&tag_e_recl
, &open
->recl
);
1859 m
= match_etag (&tag_e_blank
, &open
->blank
);
1862 m
= match_etag (&tag_e_position
, &open
->position
);
1865 m
= match_etag (&tag_e_action
, &open
->action
);
1868 m
= match_etag (&tag_e_delim
, &open
->delim
);
1871 m
= match_etag (&tag_e_pad
, &open
->pad
);
1874 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1877 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1880 m
= match_etag (&tag_e_round
, &open
->round
);
1883 m
= match_etag (&tag_e_sign
, &open
->sign
);
1886 m
= match_ltag (&tag_err
, &open
->err
);
1889 m
= match_etag (&tag_convert
, &open
->convert
);
1892 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1896 /* The following are extensions enabled with -fdec. */
1897 m
= match_dec_etag (&tag_e_share
, &open
->share
);
1900 m
= match_dec_etag (&tag_cc
, &open
->cc
);
1903 m
= match_dec_ftag (&tag_readonly
, open
);
1906 m
= match_dec_ftag (&tag_shared
, open
);
1909 m
= match_dec_ftag (&tag_noshared
, open
);
1917 /* Free the gfc_open structure and all the expressions it contains. */
1920 gfc_free_open (gfc_open
*open
)
1925 gfc_free_expr (open
->unit
);
1926 gfc_free_expr (open
->iomsg
);
1927 gfc_free_expr (open
->iostat
);
1928 gfc_free_expr (open
->file
);
1929 gfc_free_expr (open
->status
);
1930 gfc_free_expr (open
->access
);
1931 gfc_free_expr (open
->form
);
1932 gfc_free_expr (open
->recl
);
1933 gfc_free_expr (open
->blank
);
1934 gfc_free_expr (open
->position
);
1935 gfc_free_expr (open
->action
);
1936 gfc_free_expr (open
->delim
);
1937 gfc_free_expr (open
->pad
);
1938 gfc_free_expr (open
->decimal
);
1939 gfc_free_expr (open
->encoding
);
1940 gfc_free_expr (open
->round
);
1941 gfc_free_expr (open
->sign
);
1942 gfc_free_expr (open
->convert
);
1943 gfc_free_expr (open
->asynchronous
);
1944 gfc_free_expr (open
->newunit
);
1945 gfc_free_expr (open
->share
);
1946 gfc_free_expr (open
->cc
);
1951 /* Resolve everything in a gfc_open structure. */
1954 gfc_resolve_open (gfc_open
*open
)
1957 RESOLVE_TAG (&tag_unit
, open
->unit
);
1958 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1959 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1960 RESOLVE_TAG (&tag_file
, open
->file
);
1961 RESOLVE_TAG (&tag_status
, open
->status
);
1962 RESOLVE_TAG (&tag_e_access
, open
->access
);
1963 RESOLVE_TAG (&tag_e_form
, open
->form
);
1964 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1965 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1966 RESOLVE_TAG (&tag_e_position
, open
->position
);
1967 RESOLVE_TAG (&tag_e_action
, open
->action
);
1968 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1969 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1970 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1971 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1972 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1973 RESOLVE_TAG (&tag_e_round
, open
->round
);
1974 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1975 RESOLVE_TAG (&tag_convert
, open
->convert
);
1976 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1977 RESOLVE_TAG (&tag_e_share
, open
->share
);
1978 RESOLVE_TAG (&tag_cc
, open
->cc
);
1980 if (!gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
))
1987 /* Check if a given value for a SPECIFIER is either in the list of values
1988 allowed in F95 or F2003, issuing an error message and returning a zero
1989 value if it is not allowed. */
1992 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1993 const char *allowed_f2003
[],
1994 const char *allowed_gnu
[], gfc_char_t
*value
,
1995 const char *statement
, bool warn
,
2000 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
2001 const char *allowed_f2003
[],
2002 const char *allowed_gnu
[], gfc_char_t
*value
,
2003 const char *statement
, bool warn
, int *num
)
2008 len
= gfc_wide_strlen (value
);
2011 for (len
--; len
> 0; len
--)
2012 if (value
[len
] != ' ')
2017 for (i
= 0; allowed
[i
]; i
++)
2018 if (len
== strlen (allowed
[i
])
2019 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
2026 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
2027 if (len
== strlen (allowed_f2003
[i
])
2028 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
2029 strlen (allowed_f2003
[i
])) == 0)
2031 notification n
= gfc_notification_std (GFC_STD_F2003
);
2033 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2035 gfc_warning (0, "Fortran 2003: %s specifier in %s statement at %C "
2036 "has value %qs", specifier
, statement
,
2043 gfc_notify_std (GFC_STD_F2003
, "%s specifier in "
2044 "%s statement at %C has value %qs", specifier
,
2045 statement
, allowed_f2003
[i
]);
2053 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
2054 if (len
== strlen (allowed_gnu
[i
])
2055 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
2056 strlen (allowed_gnu
[i
])) == 0)
2058 notification n
= gfc_notification_std (GFC_STD_GNU
);
2060 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2062 gfc_warning (0, "Extension: %s specifier in %s statement at %C "
2063 "has value %qs", specifier
, statement
,
2070 gfc_notify_std (GFC_STD_GNU
, "%s specifier in "
2071 "%s statement at %C has value %qs", specifier
,
2072 statement
, allowed_gnu
[i
]);
2082 char *s
= gfc_widechar_to_char (value
, -1);
2084 "%s specifier in %s statement at %C has invalid value %qs",
2085 specifier
, statement
, s
);
2091 char *s
= gfc_widechar_to_char (value
, -1);
2092 gfc_error ("%s specifier in %s statement at %C has invalid value %qs",
2093 specifier
, statement
, s
);
2100 /* Match an OPEN statement. */
2103 gfc_match_open (void)
2109 m
= gfc_match_char ('(');
2113 open
= XCNEW (gfc_open
);
2115 m
= match_open_element (open
);
2117 if (m
== MATCH_ERROR
)
2121 m
= gfc_match_expr (&open
->unit
);
2122 if (m
== MATCH_ERROR
)
2128 if (gfc_match_char (')') == MATCH_YES
)
2130 if (gfc_match_char (',') != MATCH_YES
)
2133 m
= match_open_element (open
);
2134 if (m
== MATCH_ERROR
)
2140 if (gfc_match_eos () == MATCH_NO
)
2143 if (gfc_pure (NULL
))
2145 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
2149 gfc_unset_implicit_pure (NULL
);
2151 warn
= (open
->err
|| open
->iostat
) ? true : false;
2153 /* Checks on NEWUNIT specifier. */
2158 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
2162 if (!open
->file
&& open
->status
)
2164 if (open
->status
->expr_type
== EXPR_CONSTANT
2165 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2168 gfc_error ("NEWUNIT specifier must have FILE= "
2169 "or STATUS='scratch' at %C");
2174 else if (!open
->unit
)
2176 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
2180 /* Checks on the ACCESS specifier. */
2181 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
2183 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
2184 static const char *access_f2003
[] = { "STREAM", NULL
};
2185 static const char *access_gnu
[] = { "APPEND", NULL
};
2187 if (!is_char_type ("ACCESS", open
->access
))
2190 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
2192 open
->access
->value
.character
.string
,
2197 /* Checks on the ACTION specifier. */
2198 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
2200 gfc_char_t
*str
= open
->action
->value
.character
.string
;
2201 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
2203 if (!is_char_type ("ACTION", open
->action
))
2206 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
2210 /* With READONLY, only allow ACTION='READ'. */
2211 if (open
->readonly
&& (gfc_wide_strlen (str
) != 4
2212 || gfc_wide_strncasecmp (str
, "READ", 4) != 0))
2214 gfc_error ("ACTION type conflicts with READONLY specifier at %C");
2218 /* If we see READONLY and no ACTION, set ACTION='READ'. */
2219 else if (open
->readonly
&& open
->action
== NULL
)
2221 open
->action
= gfc_get_character_expr (gfc_default_character_kind
,
2222 &gfc_current_locus
, "read", 4);
2225 /* Checks on the ASYNCHRONOUS specifier. */
2226 if (open
->asynchronous
)
2228 if (!gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
2229 "not allowed in Fortran 95"))
2232 if (!is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
2235 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
2237 static const char * asynchronous
[] = { "YES", "NO", NULL
};
2239 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
2240 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
2246 /* Checks on the BLANK specifier. */
2249 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
2250 "not allowed in Fortran 95"))
2253 if (!is_char_type ("BLANK", open
->blank
))
2256 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
2258 static const char *blank
[] = { "ZERO", "NULL", NULL
};
2260 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
2261 open
->blank
->value
.character
.string
,
2267 /* Checks on the CARRIAGECONTROL specifier. */
2270 if (!is_char_type ("CARRIAGECONTROL", open
->cc
))
2273 if (open
->cc
->expr_type
== EXPR_CONSTANT
)
2275 static const char *cc
[] = { "LIST", "FORTRAN", "NONE", NULL
};
2276 if (!compare_to_allowed_values ("CARRIAGECONTROL", cc
, NULL
, NULL
,
2277 open
->cc
->value
.character
.string
,
2283 /* Checks on the DECIMAL specifier. */
2286 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
2287 "not allowed in Fortran 95"))
2290 if (!is_char_type ("DECIMAL", open
->decimal
))
2293 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
2295 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
2297 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
2298 open
->decimal
->value
.character
.string
,
2304 /* Checks on the DELIM specifier. */
2307 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
2309 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
2311 if (!is_char_type ("DELIM", open
->delim
))
2314 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
2315 open
->delim
->value
.character
.string
,
2321 /* Checks on the ENCODING specifier. */
2324 if (!gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
2325 "not allowed in Fortran 95"))
2328 if (!is_char_type ("ENCODING", open
->encoding
))
2331 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
2333 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
2335 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
2336 open
->encoding
->value
.character
.string
,
2342 /* Checks on the FORM specifier. */
2343 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
2345 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
2347 if (!is_char_type ("FORM", open
->form
))
2350 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
2351 open
->form
->value
.character
.string
,
2356 /* Checks on the PAD specifier. */
2357 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
2359 static const char *pad
[] = { "YES", "NO", NULL
};
2361 if (!is_char_type ("PAD", open
->pad
))
2364 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
2365 open
->pad
->value
.character
.string
,
2370 /* Checks on the POSITION specifier. */
2371 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
2373 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
2375 if (!is_char_type ("POSITION", open
->position
))
2378 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2379 open
->position
->value
.character
.string
,
2384 /* Checks on the ROUND specifier. */
2387 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2388 "not allowed in Fortran 95"))
2391 if (!is_char_type ("ROUND", open
->round
))
2394 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2396 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2397 "COMPATIBLE", "PROCESSOR_DEFINED",
2400 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2401 open
->round
->value
.character
.string
,
2407 /* Checks on the SHARE specifier. */
2410 if (!is_char_type ("SHARE", open
->share
))
2413 if (open
->share
->expr_type
== EXPR_CONSTANT
)
2415 static const char *share
[] = { "DENYNONE", "DENYRW", NULL
};
2416 if (!compare_to_allowed_values ("SHARE", share
, NULL
, NULL
,
2417 open
->share
->value
.character
.string
,
2423 /* Checks on the SIGN specifier. */
2426 if (!gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2427 "not allowed in Fortran 95"))
2430 if (!is_char_type ("SIGN", open
->sign
))
2433 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2435 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2438 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2439 open
->sign
->value
.character
.string
,
2445 #define warn_or_error(...) \
2448 gfc_warning (0, __VA_ARGS__); \
2451 gfc_error (__VA_ARGS__); \
2456 /* Checks on the RECL specifier. */
2457 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2458 && open
->recl
->ts
.type
== BT_INTEGER
2459 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2461 warn_or_error ("RECL in OPEN statement at %C must be positive");
2464 /* Checks on the STATUS specifier. */
2465 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2467 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2468 "REPLACE", "UNKNOWN", NULL
};
2470 if (!is_char_type ("STATUS", open
->status
))
2473 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2474 open
->status
->value
.character
.string
,
2478 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2479 the FILE= specifier shall appear. */
2480 if (open
->file
== NULL
2481 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2483 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2486 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2488 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2489 "%qs and no FILE specifier is present", s
);
2493 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2494 the FILE= specifier shall not appear. */
2495 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2496 "scratch", 7) == 0 && open
->file
)
2498 warn_or_error ("The STATUS specified in OPEN statement at %C "
2499 "cannot have the value SCRATCH if a FILE specifier "
2504 /* Things that are not allowed for unformatted I/O. */
2505 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2506 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2507 || open
->sign
|| open
->pad
|| open
->blank
)
2508 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2509 "unformatted", 11) == 0)
2511 const char *spec
= (open
->delim
? "DELIM "
2512 : (open
->pad
? "PAD " : open
->blank
2515 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2516 "unformatted I/O", spec
);
2519 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2520 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2523 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2528 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2529 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2530 "sequential", 10) == 0
2531 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2533 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2536 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2537 "for stream or sequential ACCESS");
2540 #undef warn_or_error
2542 new_st
.op
= EXEC_OPEN
;
2543 new_st
.ext
.open
= open
;
2547 gfc_syntax_error (ST_OPEN
);
2550 gfc_free_open (open
);
2555 /* Free a gfc_close structure an all its expressions. */
2558 gfc_free_close (gfc_close
*close
)
2563 gfc_free_expr (close
->unit
);
2564 gfc_free_expr (close
->iomsg
);
2565 gfc_free_expr (close
->iostat
);
2566 gfc_free_expr (close
->status
);
2571 /* Match elements of a CLOSE statement. */
2574 match_close_element (gfc_close
*close
)
2578 m
= match_etag (&tag_unit
, &close
->unit
);
2581 m
= match_etag (&tag_status
, &close
->status
);
2584 m
= match_etag (&tag_iomsg
, &close
->iomsg
);
2585 if (m
== MATCH_YES
&& !check_char_variable (close
->iomsg
))
2589 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2592 m
= match_ltag (&tag_err
, &close
->err
);
2600 /* Match a CLOSE statement. */
2603 gfc_match_close (void)
2609 m
= gfc_match_char ('(');
2613 close
= XCNEW (gfc_close
);
2615 m
= match_close_element (close
);
2617 if (m
== MATCH_ERROR
)
2621 m
= gfc_match_expr (&close
->unit
);
2624 if (m
== MATCH_ERROR
)
2630 if (gfc_match_char (')') == MATCH_YES
)
2632 if (gfc_match_char (',') != MATCH_YES
)
2635 m
= match_close_element (close
);
2636 if (m
== MATCH_ERROR
)
2642 if (gfc_match_eos () == MATCH_NO
)
2645 if (gfc_pure (NULL
))
2647 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2651 gfc_unset_implicit_pure (NULL
);
2653 warn
= (close
->iostat
|| close
->err
) ? true : false;
2655 /* Checks on the STATUS specifier. */
2656 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2658 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2660 if (!is_char_type ("STATUS", close
->status
))
2663 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2664 close
->status
->value
.character
.string
,
2669 new_st
.op
= EXEC_CLOSE
;
2670 new_st
.ext
.close
= close
;
2674 gfc_syntax_error (ST_CLOSE
);
2677 gfc_free_close (close
);
2682 /* Resolve everything in a gfc_close structure. */
2685 gfc_resolve_close (gfc_close
*close
)
2687 RESOLVE_TAG (&tag_unit
, close
->unit
);
2688 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2689 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2690 RESOLVE_TAG (&tag_status
, close
->status
);
2692 if (!gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
))
2695 if (close
->unit
== NULL
)
2697 /* Find a locus from one of the arguments to close, when UNIT is
2699 locus loc
= gfc_current_locus
;
2701 loc
= close
->status
->where
;
2702 else if (close
->iostat
)
2703 loc
= close
->iostat
->where
;
2704 else if (close
->iomsg
)
2705 loc
= close
->iomsg
->where
;
2706 else if (close
->err
)
2707 loc
= close
->err
->where
;
2709 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2713 if (close
->unit
->expr_type
== EXPR_CONSTANT
2714 && close
->unit
->ts
.type
== BT_INTEGER
2715 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2717 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2718 &close
->unit
->where
);
2725 /* Free a gfc_filepos structure. */
2728 gfc_free_filepos (gfc_filepos
*fp
)
2730 gfc_free_expr (fp
->unit
);
2731 gfc_free_expr (fp
->iomsg
);
2732 gfc_free_expr (fp
->iostat
);
2737 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2740 match_file_element (gfc_filepos
*fp
)
2744 m
= match_etag (&tag_unit
, &fp
->unit
);
2747 m
= match_etag (&tag_iomsg
, &fp
->iomsg
);
2748 if (m
== MATCH_YES
&& !check_char_variable (fp
->iomsg
))
2752 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2755 m
= match_ltag (&tag_err
, &fp
->err
);
2763 /* Match the second half of the file-positioning statements, REWIND,
2764 BACKSPACE, ENDFILE, or the FLUSH statement. */
2767 match_filepos (gfc_statement st
, gfc_exec_op op
)
2772 fp
= XCNEW (gfc_filepos
);
2774 if (gfc_match_char ('(') == MATCH_NO
)
2776 m
= gfc_match_expr (&fp
->unit
);
2777 if (m
== MATCH_ERROR
)
2785 m
= match_file_element (fp
);
2786 if (m
== MATCH_ERROR
)
2790 m
= gfc_match_expr (&fp
->unit
);
2791 if (m
== MATCH_ERROR
|| m
== MATCH_NO
)
2797 if (gfc_match_char (')') == MATCH_YES
)
2799 if (gfc_match_char (',') != MATCH_YES
)
2802 m
= match_file_element (fp
);
2803 if (m
== MATCH_ERROR
)
2810 if (gfc_match_eos () != MATCH_YES
)
2813 if (gfc_pure (NULL
))
2815 gfc_error ("%s statement not allowed in PURE procedure at %C",
2816 gfc_ascii_statement (st
));
2821 gfc_unset_implicit_pure (NULL
);
2824 new_st
.ext
.filepos
= fp
;
2828 gfc_syntax_error (st
);
2831 gfc_free_filepos (fp
);
2837 gfc_resolve_filepos (gfc_filepos
*fp
)
2839 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2840 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2841 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2842 if (!gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
))
2845 if (!fp
->unit
&& (fp
->iostat
|| fp
->iomsg
))
2848 where
= fp
->iostat
? fp
->iostat
->where
: fp
->iomsg
->where
;
2849 gfc_error ("UNIT number missing in statement at %L", &where
);
2853 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2854 && fp
->unit
->ts
.type
== BT_INTEGER
2855 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2857 gfc_error ("UNIT number in statement at %L must be non-negative",
2866 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2867 and the FLUSH statement. */
2870 gfc_match_endfile (void)
2872 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2876 gfc_match_backspace (void)
2878 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2882 gfc_match_rewind (void)
2884 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2888 gfc_match_flush (void)
2890 if (!gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C"))
2893 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2896 /******************** Data Transfer Statements *********************/
2898 /* Return a default unit number. */
2901 default_unit (io_kind k
)
2910 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2914 /* Match a unit specification for a data transfer statement. */
2917 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2922 if (gfc_match_char ('*') == MATCH_YES
)
2924 if (dt
->io_unit
!= NULL
)
2927 dt
->io_unit
= default_unit (k
);
2929 c
= gfc_peek_ascii_char ();
2931 gfc_error_now ("Missing format with default unit at %C");
2936 if (gfc_match_expr (&e
) == MATCH_YES
)
2938 if (dt
->io_unit
!= NULL
)
2951 gfc_error ("Duplicate UNIT specification at %C");
2956 /* Match a format specification. */
2959 match_dt_format (gfc_dt
*dt
)
2963 gfc_st_label
*label
;
2966 where
= gfc_current_locus
;
2968 if (gfc_match_char ('*') == MATCH_YES
)
2970 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2973 dt
->format_label
= &format_asterisk
;
2977 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2981 /* Need to check if the format label is actually either an operand
2982 to a user-defined operator or is a kind type parameter. That is,
2983 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2984 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2986 gfc_gobble_whitespace ();
2987 c
= gfc_peek_ascii_char ();
2988 if (c
== '.' || c
== '_')
2989 gfc_current_locus
= where
;
2992 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2994 gfc_free_st_label (label
);
2998 if (!gfc_reference_st_label (label
, ST_LABEL_FORMAT
))
3001 dt
->format_label
= label
;
3005 else if (m
== MATCH_ERROR
)
3006 /* The label was zero or too large. Emit the correct diagnosis. */
3009 if (gfc_match_expr (&e
) == MATCH_YES
)
3011 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
3016 dt
->format_expr
= e
;
3020 gfc_current_locus
= where
; /* The only case where we have to restore */
3025 gfc_error ("Duplicate format specification at %C");
3029 /* Check for formatted read and write DTIO procedures. */
3032 dtio_procs_present (gfc_symbol
*sym
, io_kind k
)
3034 gfc_symbol
*derived
;
3036 if (sym
&& sym
->ts
.u
.derived
)
3038 if (sym
->ts
.type
== BT_CLASS
&& CLASS_DATA (sym
))
3039 derived
= CLASS_DATA (sym
)->ts
.u
.derived
;
3040 else if (sym
->ts
.type
== BT_DERIVED
)
3041 derived
= sym
->ts
.u
.derived
;
3044 if ((k
== M_WRITE
|| k
== M_PRINT
) &&
3045 (gfc_find_specific_dtio_proc (derived
, true, true) != NULL
))
3047 if ((k
== M_READ
) &&
3048 (gfc_find_specific_dtio_proc (derived
, false, true) != NULL
))
3054 /* Traverse a namelist that is part of a READ statement to make sure
3055 that none of the variables in the namelist are INTENT(IN). Returns
3056 nonzero if we find such a variable. */
3059 check_namelist (gfc_symbol
*sym
)
3063 for (p
= sym
->namelist
; p
; p
= p
->next
)
3064 if (p
->sym
->attr
.intent
== INTENT_IN
)
3066 gfc_error ("Symbol %qs in namelist %qs is INTENT(IN) at %C",
3067 p
->sym
->name
, sym
->name
);
3075 /* Match a single data transfer element. */
3078 match_dt_element (io_kind k
, gfc_dt
*dt
)
3080 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3084 if (gfc_match (" unit =") == MATCH_YES
)
3086 m
= match_dt_unit (k
, dt
);
3091 if (gfc_match (" fmt =") == MATCH_YES
)
3093 m
= match_dt_format (dt
);
3098 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
3100 if (dt
->namelist
!= NULL
)
3102 gfc_error ("Duplicate NML specification at %C");
3106 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
3109 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
3111 gfc_error ("Symbol %qs at %C must be a NAMELIST group name",
3112 sym
!= NULL
? sym
->name
: name
);
3117 if (k
== M_READ
&& check_namelist (sym
))
3123 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
3124 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3128 m
= match_etag (&tag_e_blank
, &dt
->blank
);
3131 m
= match_etag (&tag_e_delim
, &dt
->delim
);
3134 m
= match_etag (&tag_e_pad
, &dt
->pad
);
3137 m
= match_etag (&tag_e_sign
, &dt
->sign
);
3140 m
= match_etag (&tag_e_round
, &dt
->round
);
3143 m
= match_out_tag (&tag_id
, &dt
->id
);
3146 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
3149 m
= match_etag (&tag_rec
, &dt
->rec
);
3152 m
= match_etag (&tag_spos
, &dt
->pos
);
3155 m
= match_etag (&tag_iomsg
, &dt
->iomsg
);
3156 if (m
== MATCH_YES
&& !check_char_variable (dt
->iomsg
))
3161 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
3164 m
= match_ltag (&tag_err
, &dt
->err
);
3166 dt
->err_where
= gfc_current_locus
;
3169 m
= match_etag (&tag_advance
, &dt
->advance
);
3172 m
= match_out_tag (&tag_size
, &dt
->size
);
3176 m
= match_ltag (&tag_end
, &dt
->end
);
3181 gfc_error ("END tag at %C not allowed in output statement");
3184 dt
->end_where
= gfc_current_locus
;
3189 m
= match_ltag (&tag_eor
, &dt
->eor
);
3191 dt
->eor_where
= gfc_current_locus
;
3199 /* Free a data transfer structure and everything below it. */
3202 gfc_free_dt (gfc_dt
*dt
)
3207 gfc_free_expr (dt
->io_unit
);
3208 gfc_free_expr (dt
->format_expr
);
3209 gfc_free_expr (dt
->rec
);
3210 gfc_free_expr (dt
->advance
);
3211 gfc_free_expr (dt
->iomsg
);
3212 gfc_free_expr (dt
->iostat
);
3213 gfc_free_expr (dt
->size
);
3214 gfc_free_expr (dt
->pad
);
3215 gfc_free_expr (dt
->delim
);
3216 gfc_free_expr (dt
->sign
);
3217 gfc_free_expr (dt
->round
);
3218 gfc_free_expr (dt
->blank
);
3219 gfc_free_expr (dt
->decimal
);
3220 gfc_free_expr (dt
->pos
);
3221 gfc_free_expr (dt
->dt_io_kind
);
3222 /* dt->extra_comma is a link to dt_io_kind if it is set. */
3227 /* Resolve everything in a gfc_dt structure. */
3230 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
3235 /* This is set in any case. */
3236 gcc_assert (dt
->dt_io_kind
);
3237 k
= dt
->dt_io_kind
->value
.iokind
;
3239 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
3240 RESOLVE_TAG (&tag_rec
, dt
->rec
);
3241 RESOLVE_TAG (&tag_spos
, dt
->pos
);
3242 RESOLVE_TAG (&tag_advance
, dt
->advance
);
3243 RESOLVE_TAG (&tag_id
, dt
->id
);
3244 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
3245 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
3246 RESOLVE_TAG (&tag_size
, dt
->size
);
3247 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
3248 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
3249 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
3250 RESOLVE_TAG (&tag_e_round
, dt
->round
);
3251 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
3252 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
3253 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
3258 gfc_error ("UNIT not specified at %L", loc
);
3262 if (gfc_resolve_expr (e
)
3263 && (e
->ts
.type
!= BT_INTEGER
3264 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
3266 /* If there is no extra comma signifying the "format" form of the IO
3267 statement, then this must be an error. */
3268 if (!dt
->extra_comma
)
3270 gfc_error ("UNIT specification at %L must be an INTEGER expression "
3271 "or a CHARACTER variable", &e
->where
);
3276 /* At this point, we have an extra comma. If io_unit has arrived as
3277 type character, we assume its really the "format" form of the I/O
3278 statement. We set the io_unit to the default unit and format to
3279 the character expression. See F95 Standard section 9.4. */
3280 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
3282 dt
->format_expr
= dt
->io_unit
;
3283 dt
->io_unit
= default_unit (k
);
3285 /* Nullify this pointer now so that a warning/error is not
3286 triggered below for the "Extension". */
3287 dt
->extra_comma
= NULL
;
3292 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
3293 &dt
->extra_comma
->where
);
3299 if (e
->ts
.type
== BT_CHARACTER
)
3301 if (gfc_has_vector_index (e
))
3303 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
3307 /* If we are writing, make sure the internal unit can be changed. */
3308 gcc_assert (k
!= M_PRINT
);
3310 && !gfc_check_vardef_context (e
, false, false, false,
3311 _("internal unit in WRITE")))
3315 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
3317 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
3321 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
3322 && mpz_sgn (e
->value
.integer
) < 0)
3324 gfc_error ("UNIT number in statement at %L must be non-negative",
3329 /* If we are reading and have a namelist, check that all namelist symbols
3330 can appear in a variable definition context. */
3334 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
3341 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
3342 t
= gfc_check_vardef_context (e
, false, false, false, NULL
);
3347 gfc_error ("NAMELIST %qs in READ statement at %L contains"
3348 " the symbol %qs which may not appear in a"
3349 " variable definition context",
3350 dt
->namelist
->name
, loc
, n
->sym
->name
);
3355 t
= dtio_procs_present (n
->sym
, k
);
3357 if (n
->sym
->ts
.type
== BT_CLASS
&& !t
)
3359 gfc_error ("NAMELIST object %qs in namelist %qs at %L is "
3360 "polymorphic and requires a defined input/output "
3361 "procedure", n
->sym
->name
, dt
->namelist
->name
, loc
);
3365 if ((n
->sym
->ts
.type
== BT_DERIVED
)
3366 && (n
->sym
->ts
.u
.derived
->attr
.alloc_comp
3367 || n
->sym
->ts
.u
.derived
->attr
.pointer_comp
))
3369 if (!gfc_notify_std (GFC_STD_F2003
, "NAMELIST object %qs in "
3370 "namelist %qs at %L with ALLOCATABLE "
3371 "or POINTER components", n
->sym
->name
,
3372 dt
->namelist
->name
, loc
))
3377 gfc_error ("NAMELIST object %qs in namelist %qs at %L has "
3378 "ALLOCATABLE or POINTER components and thus requires "
3379 "a defined input/output procedure", n
->sym
->name
,
3380 dt
->namelist
->name
, loc
);
3388 && !gfc_notify_std (GFC_STD_LEGACY
, "Comma before i/o item list at %L",
3389 &dt
->extra_comma
->where
))
3394 if (!gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
))
3396 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
3398 gfc_error ("ERR tag label %d at %L not defined",
3399 dt
->err
->value
, &dt
->err_where
);
3406 if (!gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
))
3408 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
3410 gfc_error ("END tag label %d at %L not defined",
3411 dt
->end
->value
, &dt
->end_where
);
3418 if (!gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
))
3420 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
3422 gfc_error ("EOR tag label %d at %L not defined",
3423 dt
->eor
->value
, &dt
->eor_where
);
3428 /* Check the format label actually exists. */
3429 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
3430 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
3432 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
3441 /* Given an io_kind, return its name. */
3444 io_kind_name (io_kind k
)
3463 gfc_internal_error ("io_kind_name(): bad I/O-kind");
3470 /* Match an IO iteration statement of the form:
3472 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
3474 which is equivalent to a single IO element. This function is
3475 mutually recursive with match_io_element(). */
3477 static match
match_io_element (io_kind
, gfc_code
**);
3480 match_io_iterator (io_kind k
, gfc_code
**result
)
3482 gfc_code
*head
, *tail
, *new_code
;
3490 old_loc
= gfc_current_locus
;
3492 if (gfc_match_char ('(') != MATCH_YES
)
3495 m
= match_io_element (k
, &head
);
3498 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3504 /* Can't be anything but an IO iterator. Build a list. */
3505 iter
= gfc_get_iterator ();
3509 m
= gfc_match_iterator (iter
, 0);
3510 if (m
== MATCH_ERROR
)
3514 gfc_check_do_variable (iter
->var
->symtree
);
3518 m
= match_io_element (k
, &new_code
);
3519 if (m
== MATCH_ERROR
)
3528 tail
= gfc_append_code (tail
, new_code
);
3530 if (gfc_match_char (',') != MATCH_YES
)
3539 if (gfc_match_char (')') != MATCH_YES
)
3542 new_code
= gfc_get_code (EXEC_DO
);
3543 new_code
->ext
.iterator
= iter
;
3545 new_code
->block
= gfc_get_code (EXEC_DO
);
3546 new_code
->block
->next
= head
;
3552 gfc_error ("Syntax error in I/O iterator at %C");
3556 gfc_free_iterator (iter
, 1);
3557 gfc_free_statements (head
);
3558 gfc_current_locus
= old_loc
;
3563 /* Match a single element of an IO list, which is either a single
3564 expression or an IO Iterator. */
3567 match_io_element (io_kind k
, gfc_code
**cpp
)
3575 m
= match_io_iterator (k
, cpp
);
3581 m
= gfc_match_variable (&expr
, 0);
3583 gfc_error ("Expected variable in READ statement at %C");
3587 m
= gfc_match_expr (&expr
);
3589 gfc_error ("Expected expression in %s statement at %C",
3593 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3598 gfc_free_expr (expr
);
3602 cp
= gfc_get_code (EXEC_TRANSFER
);
3605 cp
->ext
.dt
= current_dt
;
3612 /* Match an I/O list, building gfc_code structures as we go. */
3615 match_io_list (io_kind k
, gfc_code
**head_p
)
3617 gfc_code
*head
, *tail
, *new_code
;
3620 *head_p
= head
= tail
= NULL
;
3621 if (gfc_match_eos () == MATCH_YES
)
3626 m
= match_io_element (k
, &new_code
);
3627 if (m
== MATCH_ERROR
)
3632 tail
= gfc_append_code (tail
, new_code
);
3636 if (gfc_match_eos () == MATCH_YES
)
3638 if (gfc_match_char (',') != MATCH_YES
)
3646 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3649 gfc_free_statements (head
);
3654 /* Attach the data transfer end node. */
3657 terminate_io (gfc_code
*io_code
)
3661 if (io_code
== NULL
)
3662 io_code
= new_st
.block
;
3664 c
= gfc_get_code (EXEC_DT_END
);
3666 /* Point to structure that is already there */
3667 c
->ext
.dt
= new_st
.ext
.dt
;
3668 gfc_append_code (io_code
, c
);
3672 /* Check the constraints for a data transfer statement. The majority of the
3673 constraints appearing in 9.4 of the standard appear here. Some are handled
3674 in resolve_tag and others in gfc_resolve_dt. Also set the async_io_dt flag
3675 and, if necessary, the asynchronous flag on the SIZE argument. */
3678 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3681 #define io_constraint(condition,msg,arg)\
3684 gfc_error(msg,arg);\
3690 gfc_symbol
*sym
= NULL
;
3691 bool warn
, unformatted
;
3693 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3694 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3695 && dt
->namelist
== NULL
;
3700 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3701 && expr
->ts
.type
== BT_CHARACTER
)
3703 sym
= expr
->symtree
->n
.sym
;
3705 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3706 "Internal file at %L must not be INTENT(IN)",
3709 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3710 "Internal file incompatible with vector subscript at %L",
3713 io_constraint (dt
->rec
!= NULL
,
3714 "REC tag at %L is incompatible with internal file",
3717 io_constraint (dt
->pos
!= NULL
,
3718 "POS tag at %L is incompatible with internal file",
3721 io_constraint (unformatted
,
3722 "Unformatted I/O not allowed with internal unit at %L",
3723 &dt
->io_unit
->where
);
3725 io_constraint (dt
->asynchronous
!= NULL
,
3726 "ASYNCHRONOUS tag at %L not allowed with internal file",
3727 &dt
->asynchronous
->where
);
3729 if (dt
->namelist
!= NULL
)
3731 if (!gfc_notify_std (GFC_STD_F2003
, "Internal file at %L with "
3732 "namelist", &expr
->where
))
3736 io_constraint (dt
->advance
!= NULL
,
3737 "ADVANCE tag at %L is incompatible with internal file",
3738 &dt
->advance
->where
);
3741 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3744 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3745 "IO UNIT in %s statement at %C must be "
3746 "an internal file in a PURE procedure",
3749 if (k
== M_READ
|| k
== M_WRITE
)
3750 gfc_unset_implicit_pure (NULL
);
3755 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3758 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3761 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3764 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3767 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3772 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3773 "SIZE tag at %L requires an ADVANCE tag",
3776 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3777 "EOR tag at %L requires an ADVANCE tag",
3781 if (dt
->asynchronous
)
3784 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3786 if (!gfc_reduce_init_expr (dt
->asynchronous
))
3788 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3789 "expression", &dt
->asynchronous
->where
);
3793 if (!is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3796 if (!compare_to_allowed_values
3797 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3798 dt
->asynchronous
->value
.character
.string
,
3799 io_kind_name (k
), warn
, &num
))
3802 /* Best to put this here because the yes/no info is still around. */
3803 async_io_dt
= num
== 0;
3804 if (async_io_dt
&& dt
->size
)
3805 dt
->size
->symtree
->n
.sym
->attr
.asynchronous
= 1;
3808 async_io_dt
= false;
3814 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3815 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3817 io_constraint (not_yes
,
3818 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3819 "specifier", &dt
->id
->where
);
3824 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3825 "not allowed in Fortran 95"))
3828 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3830 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3832 if (!is_char_type ("DECIMAL", dt
->decimal
))
3835 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3836 dt
->decimal
->value
.character
.string
,
3837 io_kind_name (k
), warn
))
3840 io_constraint (unformatted
,
3841 "the DECIMAL= specifier at %L must be with an "
3842 "explicit format expression", &dt
->decimal
->where
);
3848 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3849 "not allowed in Fortran 95"))
3852 if (!is_char_type ("BLANK", dt
->blank
))
3855 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3857 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3860 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3861 dt
->blank
->value
.character
.string
,
3862 io_kind_name (k
), warn
))
3865 io_constraint (unformatted
,
3866 "the BLANK= specifier at %L must be with an "
3867 "explicit format expression", &dt
->blank
->where
);
3873 if (!gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3874 "not allowed in Fortran 95"))
3877 if (!is_char_type ("PAD", dt
->pad
))
3880 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3882 static const char * pad
[] = { "YES", "NO", NULL
};
3884 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3885 dt
->pad
->value
.character
.string
,
3886 io_kind_name (k
), warn
))
3889 io_constraint (unformatted
,
3890 "the PAD= specifier at %L must be with an "
3891 "explicit format expression", &dt
->pad
->where
);
3897 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3898 "not allowed in Fortran 95"))
3901 if (!is_char_type ("ROUND", dt
->round
))
3904 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3906 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3907 "COMPATIBLE", "PROCESSOR_DEFINED",
3910 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3911 dt
->round
->value
.character
.string
,
3912 io_kind_name (k
), warn
))
3919 /* When implemented, change the following to use gfc_notify_std F2003.
3920 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3921 "not allowed in Fortran 95") == false)
3922 return MATCH_ERROR; */
3924 if (!is_char_type ("SIGN", dt
->sign
))
3927 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3929 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3932 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3933 dt
->sign
->value
.character
.string
,
3934 io_kind_name (k
), warn
))
3937 io_constraint (unformatted
,
3938 "SIGN= specifier at %L must be with an "
3939 "explicit format expression", &dt
->sign
->where
);
3941 io_constraint (k
== M_READ
,
3942 "SIGN= specifier at %L not allowed in a "
3943 "READ statement", &dt
->sign
->where
);
3949 if (!gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
3950 "not allowed in Fortran 95"))
3953 if (!is_char_type ("DELIM", dt
->delim
))
3956 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3958 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3960 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3961 dt
->delim
->value
.character
.string
,
3962 io_kind_name (k
), warn
))
3965 io_constraint (k
== M_READ
,
3966 "DELIM= specifier at %L not allowed in a "
3967 "READ statement", &dt
->delim
->where
);
3969 io_constraint (dt
->format_label
!= &format_asterisk
3970 && dt
->namelist
== NULL
,
3971 "DELIM= specifier at %L must have FMT=*",
3974 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3975 "DELIM= specifier at %L must be with FMT=* or "
3976 "NML= specifier", &dt
->delim
->where
);
3982 io_constraint (io_code
&& dt
->namelist
,
3983 "NAMELIST cannot be followed by IO-list at %L",
3986 io_constraint (dt
->format_expr
,
3987 "IO spec-list cannot contain both NAMELIST group name "
3988 "and format specification at %L",
3989 &dt
->format_expr
->where
);
3991 io_constraint (dt
->format_label
,
3992 "IO spec-list cannot contain both NAMELIST group name "
3993 "and format label at %L", spec_end
);
3995 io_constraint (dt
->rec
,
3996 "NAMELIST IO is not allowed with a REC= specifier "
3997 "at %L", &dt
->rec
->where
);
3999 io_constraint (dt
->advance
,
4000 "NAMELIST IO is not allowed with a ADVANCE= specifier "
4001 "at %L", &dt
->advance
->where
);
4006 io_constraint (dt
->end
,
4007 "An END tag is not allowed with a "
4008 "REC= specifier at %L", &dt
->end_where
);
4010 io_constraint (dt
->format_label
== &format_asterisk
,
4011 "FMT=* is not allowed with a REC= specifier "
4014 io_constraint (dt
->pos
,
4015 "POS= is not allowed with REC= specifier "
4016 "at %L", &dt
->pos
->where
);
4021 int not_yes
, not_no
;
4024 io_constraint (dt
->format_label
== &format_asterisk
,
4025 "List directed format(*) is not allowed with a "
4026 "ADVANCE= specifier at %L.", &expr
->where
);
4028 io_constraint (unformatted
,
4029 "the ADVANCE= specifier at %L must appear with an "
4030 "explicit format expression", &expr
->where
);
4032 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
4034 const gfc_char_t
*advance
= expr
->value
.character
.string
;
4035 not_no
= gfc_wide_strlen (advance
) != 2
4036 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
4037 not_yes
= gfc_wide_strlen (advance
) != 3
4038 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
4046 io_constraint (not_no
&& not_yes
,
4047 "ADVANCE= specifier at %L must have value = "
4048 "YES or NO.", &expr
->where
);
4050 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
4051 "SIZE tag at %L requires an ADVANCE = %<NO%>",
4054 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
4055 "EOR tag at %L requires an ADVANCE = %<NO%>",
4059 expr
= dt
->format_expr
;
4060 if (!gfc_simplify_expr (expr
, 0)
4061 || !check_format_string (expr
, k
== M_READ
))
4066 #undef io_constraint
4069 /* Match a READ, WRITE or PRINT statement. */
4072 match_io (io_kind k
)
4074 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4079 locus spec_end
, control
;
4083 where
= gfc_current_locus
;
4085 current_dt
= dt
= XCNEW (gfc_dt
);
4086 m
= gfc_match_char ('(');
4089 where
= gfc_current_locus
;
4092 else if (k
== M_PRINT
)
4094 /* Treat the non-standard case of PRINT namelist. */
4095 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
4096 && gfc_match_name (name
) == MATCH_YES
)
4098 gfc_find_symbol (name
, NULL
, 1, &sym
);
4099 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4101 if (!gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
4102 "%C is an extension"))
4108 dt
->io_unit
= default_unit (k
);
4113 gfc_current_locus
= where
;
4117 if (gfc_current_form
== FORM_FREE
)
4119 char c
= gfc_peek_ascii_char ();
4120 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
4127 m
= match_dt_format (dt
);
4128 if (m
== MATCH_ERROR
)
4134 dt
->io_unit
= default_unit (k
);
4139 /* Before issuing an error for a malformed 'print (1,*)' type of
4140 error, check for a default-char-expr of the form ('(I0)'). */
4143 control
= gfc_current_locus
;
4146 /* Reset current locus to get the initial '(' in an expression. */
4147 gfc_current_locus
= where
;
4148 dt
->format_expr
= NULL
;
4149 m
= match_dt_format (dt
);
4151 if (m
== MATCH_ERROR
)
4153 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
4157 dt
->io_unit
= default_unit (k
);
4162 /* Commit any pending symbols now so that when we undo
4163 symbols later we wont lose them. */
4164 gfc_commit_symbols ();
4165 /* Reset current locus to get the initial '(' in an expression. */
4166 gfc_current_locus
= where
;
4167 dt
->format_expr
= NULL
;
4168 m
= gfc_match_expr (&dt
->format_expr
);
4172 && dt
->format_expr
->ts
.type
== BT_CHARACTER
)
4175 dt
->io_unit
= default_unit (k
);
4180 gfc_free_expr (dt
->format_expr
);
4181 dt
->format_expr
= NULL
;
4182 gfc_current_locus
= control
;
4188 gfc_undo_symbols ();
4189 gfc_free_expr (dt
->format_expr
);
4190 dt
->format_expr
= NULL
;
4191 gfc_current_locus
= control
;
4197 /* Match a control list */
4198 if (match_dt_element (k
, dt
) == MATCH_YES
)
4200 if (match_dt_unit (k
, dt
) != MATCH_YES
)
4203 if (gfc_match_char (')') == MATCH_YES
)
4205 if (gfc_match_char (',') != MATCH_YES
)
4208 m
= match_dt_element (k
, dt
);
4211 if (m
== MATCH_ERROR
)
4214 m
= match_dt_format (dt
);
4217 if (m
== MATCH_ERROR
)
4220 where
= gfc_current_locus
;
4222 m
= gfc_match_name (name
);
4225 gfc_find_symbol (name
, NULL
, 1, &sym
);
4226 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4229 if (k
== M_READ
&& check_namelist (sym
))
4238 gfc_current_locus
= where
;
4240 goto loop
; /* No matches, try regular elements */
4243 if (gfc_match_char (')') == MATCH_YES
)
4245 if (gfc_match_char (',') != MATCH_YES
)
4251 m
= match_dt_element (k
, dt
);
4254 if (m
== MATCH_ERROR
)
4257 if (gfc_match_char (')') == MATCH_YES
)
4259 if (gfc_match_char (',') != MATCH_YES
)
4265 /* Used in check_io_constraints, where no locus is available. */
4266 spec_end
= gfc_current_locus
;
4268 /* Save the IO kind for later use. */
4269 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
4271 /* Optional leading comma (non-standard). We use a gfc_expr structure here
4272 to save the locus. This is used later when resolving transfer statements
4273 that might have a format expression without unit number. */
4274 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
4275 dt
->extra_comma
= dt
->dt_io_kind
;
4278 if (gfc_match_eos () != MATCH_YES
)
4280 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
4282 gfc_error ("Expected comma in I/O list at %C");
4287 m
= match_io_list (k
, &io_code
);
4288 if (m
== MATCH_ERROR
)
4294 /* See if we want to use defaults for missing exponents in real transfers
4295 and other DEC runtime extensions. */
4299 /* A full IO statement has been matched. Check the constraints. spec_end is
4300 supplied for cases where no locus is supplied. */
4301 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
4303 if (m
== MATCH_ERROR
)
4306 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
4308 new_st
.block
= gfc_get_code (new_st
.op
);
4309 new_st
.block
->next
= io_code
;
4311 terminate_io (io_code
);
4316 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
4326 gfc_match_read (void)
4328 return match_io (M_READ
);
4333 gfc_match_write (void)
4335 return match_io (M_WRITE
);
4340 gfc_match_print (void)
4344 m
= match_io (M_PRINT
);
4348 if (gfc_pure (NULL
))
4350 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
4354 gfc_unset_implicit_pure (NULL
);
4360 /* Free a gfc_inquire structure. */
4363 gfc_free_inquire (gfc_inquire
*inquire
)
4366 if (inquire
== NULL
)
4369 gfc_free_expr (inquire
->unit
);
4370 gfc_free_expr (inquire
->file
);
4371 gfc_free_expr (inquire
->iomsg
);
4372 gfc_free_expr (inquire
->iostat
);
4373 gfc_free_expr (inquire
->exist
);
4374 gfc_free_expr (inquire
->opened
);
4375 gfc_free_expr (inquire
->number
);
4376 gfc_free_expr (inquire
->named
);
4377 gfc_free_expr (inquire
->name
);
4378 gfc_free_expr (inquire
->access
);
4379 gfc_free_expr (inquire
->sequential
);
4380 gfc_free_expr (inquire
->direct
);
4381 gfc_free_expr (inquire
->form
);
4382 gfc_free_expr (inquire
->formatted
);
4383 gfc_free_expr (inquire
->unformatted
);
4384 gfc_free_expr (inquire
->recl
);
4385 gfc_free_expr (inquire
->nextrec
);
4386 gfc_free_expr (inquire
->blank
);
4387 gfc_free_expr (inquire
->position
);
4388 gfc_free_expr (inquire
->action
);
4389 gfc_free_expr (inquire
->read
);
4390 gfc_free_expr (inquire
->write
);
4391 gfc_free_expr (inquire
->readwrite
);
4392 gfc_free_expr (inquire
->delim
);
4393 gfc_free_expr (inquire
->encoding
);
4394 gfc_free_expr (inquire
->pad
);
4395 gfc_free_expr (inquire
->iolength
);
4396 gfc_free_expr (inquire
->convert
);
4397 gfc_free_expr (inquire
->strm_pos
);
4398 gfc_free_expr (inquire
->asynchronous
);
4399 gfc_free_expr (inquire
->decimal
);
4400 gfc_free_expr (inquire
->pending
);
4401 gfc_free_expr (inquire
->id
);
4402 gfc_free_expr (inquire
->sign
);
4403 gfc_free_expr (inquire
->size
);
4404 gfc_free_expr (inquire
->round
);
4405 gfc_free_expr (inquire
->share
);
4406 gfc_free_expr (inquire
->cc
);
4411 /* Match an element of an INQUIRE statement. */
4413 #define RETM if (m != MATCH_NO) return m;
4416 match_inquire_element (gfc_inquire
*inquire
)
4420 m
= match_etag (&tag_unit
, &inquire
->unit
);
4421 RETM m
= match_etag (&tag_file
, &inquire
->file
);
4422 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
4423 RETM m
= match_etag (&tag_iomsg
, &inquire
->iomsg
);
4424 if (m
== MATCH_YES
&& !check_char_variable (inquire
->iomsg
))
4426 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
4427 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
4428 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
4429 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
4430 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
4431 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
4432 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
4433 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
4434 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
4435 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
4436 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
4437 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
4438 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
4439 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
4440 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
4441 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
4442 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
4443 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
4444 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
4445 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
4446 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
4447 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", inquire
->asynchronous
))
4449 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
4450 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
4451 RETM m
= match_out_tag (&tag_size
, &inquire
->size
);
4452 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
4453 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
4454 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
4455 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
4456 RETM m
= match_out_tag (&tag_iolength
, &inquire
->iolength
);
4457 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
4458 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
4459 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
4460 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
4461 RETM m
= match_vtag (&tag_s_iqstream
, &inquire
->iqstream
);
4462 RETM m
= match_dec_vtag (&tag_v_share
, &inquire
->share
);
4463 RETM m
= match_dec_vtag (&tag_v_cc
, &inquire
->cc
);
4464 RETM
return MATCH_NO
;
4471 gfc_match_inquire (void)
4473 gfc_inquire
*inquire
;
4478 m
= gfc_match_char ('(');
4482 inquire
= XCNEW (gfc_inquire
);
4484 loc
= gfc_current_locus
;
4486 m
= match_inquire_element (inquire
);
4487 if (m
== MATCH_ERROR
)
4491 m
= gfc_match_expr (&inquire
->unit
);
4492 if (m
== MATCH_ERROR
)
4498 /* See if we have the IOLENGTH form of the inquire statement. */
4499 if (inquire
->iolength
!= NULL
)
4501 if (gfc_match_char (')') != MATCH_YES
)
4504 m
= match_io_list (M_INQUIRE
, &code
);
4505 if (m
== MATCH_ERROR
)
4510 new_st
.op
= EXEC_IOLENGTH
;
4511 new_st
.expr1
= inquire
->iolength
;
4512 new_st
.ext
.inquire
= inquire
;
4514 if (gfc_pure (NULL
))
4516 gfc_free_statements (code
);
4517 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4521 gfc_unset_implicit_pure (NULL
);
4523 new_st
.block
= gfc_get_code (EXEC_IOLENGTH
);
4524 terminate_io (code
);
4525 new_st
.block
->next
= code
;
4529 /* At this point, we have the non-IOLENGTH inquire statement. */
4532 if (gfc_match_char (')') == MATCH_YES
)
4534 if (gfc_match_char (',') != MATCH_YES
)
4537 m
= match_inquire_element (inquire
);
4538 if (m
== MATCH_ERROR
)
4543 if (inquire
->iolength
!= NULL
)
4545 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4550 if (gfc_match_eos () != MATCH_YES
)
4553 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
4555 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4556 "UNIT specifiers", &loc
);
4560 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4562 gfc_error ("INQUIRE statement at %L requires either FILE or "
4563 "UNIT specifier", &loc
);
4567 if (inquire
->unit
!= NULL
&& inquire
->unit
->expr_type
== EXPR_CONSTANT
4568 && inquire
->unit
->ts
.type
== BT_INTEGER
4569 && ((mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT4
)
4570 || (mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT
)))
4572 gfc_error ("UNIT number in INQUIRE statement at %L can not "
4573 "be %d", &loc
, (int) mpz_get_si (inquire
->unit
->value
.integer
));
4577 if (gfc_pure (NULL
))
4579 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4583 gfc_unset_implicit_pure (NULL
);
4585 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4587 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4588 "the ID= specifier", &loc
);
4592 new_st
.op
= EXEC_INQUIRE
;
4593 new_st
.ext
.inquire
= inquire
;
4597 gfc_syntax_error (ST_INQUIRE
);
4600 gfc_free_inquire (inquire
);
4605 /* Resolve everything in a gfc_inquire structure. */
4608 gfc_resolve_inquire (gfc_inquire
*inquire
)
4610 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4611 RESOLVE_TAG (&tag_file
, inquire
->file
);
4612 RESOLVE_TAG (&tag_id
, inquire
->id
);
4614 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4615 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4616 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4617 RESOLVE_TAG (tag, expr); \
4621 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4622 if (gfc_check_vardef_context ((expr), false, false, false, \
4623 context) == false) \
4626 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4627 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4628 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4629 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4630 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4631 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4632 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4633 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4634 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4635 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4636 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4637 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4638 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4639 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4640 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4641 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4642 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4643 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4644 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4645 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4646 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4647 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4648 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4649 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4650 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4651 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4652 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4653 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4654 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4655 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4656 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4657 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4658 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4659 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4660 INQUIRE_RESOLVE_TAG (&tag_s_iqstream
, inquire
->iqstream
);
4661 INQUIRE_RESOLVE_TAG (&tag_v_share
, inquire
->share
);
4662 INQUIRE_RESOLVE_TAG (&tag_v_cc
, inquire
->cc
);
4663 #undef INQUIRE_RESOLVE_TAG
4665 if (!gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
))
4673 gfc_free_wait (gfc_wait
*wait
)
4678 gfc_free_expr (wait
->unit
);
4679 gfc_free_expr (wait
->iostat
);
4680 gfc_free_expr (wait
->iomsg
);
4681 gfc_free_expr (wait
->id
);
4687 gfc_resolve_wait (gfc_wait
*wait
)
4689 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4690 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4691 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4692 RESOLVE_TAG (&tag_id
, wait
->id
);
4694 if (!gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
))
4697 if (!gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
))
4703 /* Match an element of a WAIT statement. */
4705 #define RETM if (m != MATCH_NO) return m;
4708 match_wait_element (gfc_wait
*wait
)
4712 m
= match_etag (&tag_unit
, &wait
->unit
);
4713 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4714 RETM m
= match_ltag (&tag_end
, &wait
->end
);
4715 RETM m
= match_ltag (&tag_eor
, &wait
->eor
);
4716 RETM m
= match_etag (&tag_iomsg
, &wait
->iomsg
);
4717 if (m
== MATCH_YES
&& !check_char_variable (wait
->iomsg
))
4719 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4720 RETM m
= match_etag (&tag_id
, &wait
->id
);
4721 RETM
return MATCH_NO
;
4728 gfc_match_wait (void)
4733 m
= gfc_match_char ('(');
4737 wait
= XCNEW (gfc_wait
);
4739 m
= match_wait_element (wait
);
4740 if (m
== MATCH_ERROR
)
4744 m
= gfc_match_expr (&wait
->unit
);
4745 if (m
== MATCH_ERROR
)
4753 if (gfc_match_char (')') == MATCH_YES
)
4755 if (gfc_match_char (',') != MATCH_YES
)
4758 m
= match_wait_element (wait
);
4759 if (m
== MATCH_ERROR
)
4765 if (!gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4766 "not allowed in Fortran 95"))
4769 if (gfc_pure (NULL
))
4771 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4775 gfc_unset_implicit_pure (NULL
);
4777 new_st
.op
= EXEC_WAIT
;
4778 new_st
.ext
.wait
= wait
;
4783 gfc_syntax_error (ST_WAIT
);
4786 gfc_free_wait (wait
);