1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000-2019 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
;
1639 if (e
->value
.constructor
== NULL
)
1641 gfc_error ("FORMAT tag at %C cannot be a zero-sized array");
1646 c
= gfc_constructor_first (e
->value
.constructor
);
1647 len
= c
->expr
->value
.character
.length
;
1649 for ( ; c
; c
= gfc_constructor_next (c
))
1652 r
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, n
);
1653 dest
= r
->value
.character
.string
;
1655 for (c
= gfc_constructor_first (e
->value
.constructor
);
1656 c
; c
= gfc_constructor_next (c
))
1658 src
= c
->expr
->value
.character
.string
;
1659 for (gfc_charlen_t i
= 0 ; i
< len
; i
++)
1663 gfc_replace_expr (e
, r
);
1668 /* If e's rank is zero and e is not an element of an array, it should be
1669 of integer or character type. The integer variable should be
1672 && (e
->expr_type
!= EXPR_VARIABLE
1673 || e
->symtree
== NULL
1674 || e
->symtree
->n
.sym
->as
== NULL
1675 || e
->symtree
->n
.sym
->as
->rank
== 0))
1677 if ((e
->ts
.type
!= BT_CHARACTER
1678 || e
->ts
.kind
!= gfc_default_character_kind
)
1679 && e
->ts
.type
!= BT_INTEGER
)
1681 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1682 "or of INTEGER", &e
->where
);
1685 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1687 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGNED variable in "
1688 "FORMAT tag at %L", &e
->where
))
1690 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1692 gfc_error ("Variable %qs at %L has not been assigned a "
1693 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1697 else if (e
->ts
.type
== BT_INTEGER
)
1699 gfc_error ("Scalar %qs in FORMAT tag at %L is not an ASSIGNED "
1700 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1707 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1708 It may be assigned an Hollerith constant. */
1709 if (e
->ts
.type
!= BT_CHARACTER
)
1711 if (!gfc_notify_std (GFC_STD_LEGACY
, "Non-character in FORMAT tag "
1712 "at %L", &e
->where
))
1715 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1717 gfc_error ("Non-character assumed shape array element in FORMAT"
1718 " tag at %L", &e
->where
);
1722 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1724 gfc_error ("Non-character assumed size array element in FORMAT"
1725 " tag at %L", &e
->where
);
1729 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1731 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1741 /* Do expression resolution and type-checking on an expression tag. */
1744 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1749 if (!gfc_resolve_expr (e
))
1752 if (tag
== &tag_format
)
1753 return resolve_tag_format (e
);
1755 if (e
->ts
.type
!= tag
->type
)
1757 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1758 &e
->where
, gfc_basic_typename (tag
->type
));
1762 if (e
->ts
.type
== BT_CHARACTER
&& e
->ts
.kind
!= gfc_default_character_kind
)
1764 gfc_error ("%s tag at %L must be a character string of default kind",
1765 tag
->name
, &e
->where
);
1771 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1775 if (tag
== &tag_iomsg
)
1777 if (!gfc_notify_std (GFC_STD_F2003
, "IOMSG tag at %L", &e
->where
))
1781 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
1782 || tag
== &tag_number
|| tag
== &tag_nextrec
|| tag
== &tag_s_recl
)
1783 && e
->ts
.kind
!= gfc_default_integer_kind
)
1785 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1786 "INTEGER in %s tag at %L", tag
->name
, &e
->where
))
1790 if (e
->ts
.kind
!= gfc_default_logical_kind
&&
1791 (tag
== &tag_exist
|| tag
== &tag_named
|| tag
== &tag_opened
1792 || tag
== &tag_pending
))
1794 if (!gfc_notify_std (GFC_STD_F2008
, "Non-default LOGICAL kind "
1795 "in %s tag at %L", tag
->name
, &e
->where
))
1799 if (tag
== &tag_newunit
)
1801 if (!gfc_notify_std (GFC_STD_F2008
, "NEWUNIT specifier at %L",
1806 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1807 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1808 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1812 sprintf (context
, _("%s tag"), tag
->name
);
1813 if (!gfc_check_vardef_context (e
, false, false, false, context
))
1817 if (tag
== &tag_convert
)
1819 if (!gfc_notify_std (GFC_STD_GNU
, "CONVERT tag at %L", &e
->where
))
1827 /* Match a single tag of an OPEN statement. */
1830 match_open_element (gfc_open
*open
)
1834 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1835 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
1839 m
= match_etag (&tag_unit
, &open
->unit
);
1842 m
= match_etag (&tag_iomsg
, &open
->iomsg
);
1843 if (m
== MATCH_YES
&& !check_char_variable (open
->iomsg
))
1847 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1850 m
= match_etag (&tag_file
, &open
->file
);
1853 m
= match_etag (&tag_status
, &open
->status
);
1856 m
= match_etag (&tag_e_access
, &open
->access
);
1859 m
= match_etag (&tag_e_form
, &open
->form
);
1862 m
= match_etag (&tag_e_recl
, &open
->recl
);
1865 m
= match_etag (&tag_e_blank
, &open
->blank
);
1868 m
= match_etag (&tag_e_position
, &open
->position
);
1871 m
= match_etag (&tag_e_action
, &open
->action
);
1874 m
= match_etag (&tag_e_delim
, &open
->delim
);
1877 m
= match_etag (&tag_e_pad
, &open
->pad
);
1880 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1883 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1886 m
= match_etag (&tag_e_round
, &open
->round
);
1889 m
= match_etag (&tag_e_sign
, &open
->sign
);
1892 m
= match_ltag (&tag_err
, &open
->err
);
1895 m
= match_etag (&tag_convert
, &open
->convert
);
1898 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1902 /* The following are extensions enabled with -fdec. */
1903 m
= match_dec_etag (&tag_e_share
, &open
->share
);
1906 m
= match_dec_etag (&tag_cc
, &open
->cc
);
1909 m
= match_dec_ftag (&tag_readonly
, open
);
1912 m
= match_dec_ftag (&tag_shared
, open
);
1915 m
= match_dec_ftag (&tag_noshared
, open
);
1923 /* Free the gfc_open structure and all the expressions it contains. */
1926 gfc_free_open (gfc_open
*open
)
1931 gfc_free_expr (open
->unit
);
1932 gfc_free_expr (open
->iomsg
);
1933 gfc_free_expr (open
->iostat
);
1934 gfc_free_expr (open
->file
);
1935 gfc_free_expr (open
->status
);
1936 gfc_free_expr (open
->access
);
1937 gfc_free_expr (open
->form
);
1938 gfc_free_expr (open
->recl
);
1939 gfc_free_expr (open
->blank
);
1940 gfc_free_expr (open
->position
);
1941 gfc_free_expr (open
->action
);
1942 gfc_free_expr (open
->delim
);
1943 gfc_free_expr (open
->pad
);
1944 gfc_free_expr (open
->decimal
);
1945 gfc_free_expr (open
->encoding
);
1946 gfc_free_expr (open
->round
);
1947 gfc_free_expr (open
->sign
);
1948 gfc_free_expr (open
->convert
);
1949 gfc_free_expr (open
->asynchronous
);
1950 gfc_free_expr (open
->newunit
);
1951 gfc_free_expr (open
->share
);
1952 gfc_free_expr (open
->cc
);
1957 /* Resolve everything in a gfc_open structure. */
1960 gfc_resolve_open (gfc_open
*open
)
1963 RESOLVE_TAG (&tag_unit
, open
->unit
);
1964 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1965 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1966 RESOLVE_TAG (&tag_file
, open
->file
);
1967 RESOLVE_TAG (&tag_status
, open
->status
);
1968 RESOLVE_TAG (&tag_e_access
, open
->access
);
1969 RESOLVE_TAG (&tag_e_form
, open
->form
);
1970 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1971 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1972 RESOLVE_TAG (&tag_e_position
, open
->position
);
1973 RESOLVE_TAG (&tag_e_action
, open
->action
);
1974 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1975 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1976 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1977 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1978 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1979 RESOLVE_TAG (&tag_e_round
, open
->round
);
1980 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1981 RESOLVE_TAG (&tag_convert
, open
->convert
);
1982 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1983 RESOLVE_TAG (&tag_e_share
, open
->share
);
1984 RESOLVE_TAG (&tag_cc
, open
->cc
);
1986 if (!gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
))
1993 /* Check if a given value for a SPECIFIER is either in the list of values
1994 allowed in F95 or F2003, issuing an error message and returning a zero
1995 value if it is not allowed. */
1998 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1999 const char *allowed_f2003
[],
2000 const char *allowed_gnu
[], gfc_char_t
*value
,
2001 const char *statement
, bool warn
,
2006 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
2007 const char *allowed_f2003
[],
2008 const char *allowed_gnu
[], gfc_char_t
*value
,
2009 const char *statement
, bool warn
, int *num
)
2014 len
= gfc_wide_strlen (value
);
2017 for (len
--; len
> 0; len
--)
2018 if (value
[len
] != ' ')
2023 for (i
= 0; allowed
[i
]; i
++)
2024 if (len
== strlen (allowed
[i
])
2025 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
2032 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
2033 if (len
== strlen (allowed_f2003
[i
])
2034 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
2035 strlen (allowed_f2003
[i
])) == 0)
2037 notification n
= gfc_notification_std (GFC_STD_F2003
);
2039 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2041 gfc_warning (0, "Fortran 2003: %s specifier in %s statement at %C "
2042 "has value %qs", specifier
, statement
,
2049 gfc_notify_std (GFC_STD_F2003
, "%s specifier in "
2050 "%s statement at %C has value %qs", specifier
,
2051 statement
, allowed_f2003
[i
]);
2059 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
2060 if (len
== strlen (allowed_gnu
[i
])
2061 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
2062 strlen (allowed_gnu
[i
])) == 0)
2064 notification n
= gfc_notification_std (GFC_STD_GNU
);
2066 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2068 gfc_warning (0, "Extension: %s specifier in %s statement at %C "
2069 "has value %qs", specifier
, statement
,
2076 gfc_notify_std (GFC_STD_GNU
, "%s specifier in "
2077 "%s statement at %C has value %qs", specifier
,
2078 statement
, allowed_gnu
[i
]);
2088 char *s
= gfc_widechar_to_char (value
, -1);
2090 "%s specifier in %s statement at %C has invalid value %qs",
2091 specifier
, statement
, s
);
2097 char *s
= gfc_widechar_to_char (value
, -1);
2098 gfc_error ("%s specifier in %s statement at %C has invalid value %qs",
2099 specifier
, statement
, s
);
2106 /* Match an OPEN statement. */
2109 gfc_match_open (void)
2115 m
= gfc_match_char ('(');
2119 open
= XCNEW (gfc_open
);
2121 m
= match_open_element (open
);
2123 if (m
== MATCH_ERROR
)
2127 m
= gfc_match_expr (&open
->unit
);
2128 if (m
== MATCH_ERROR
)
2134 if (gfc_match_char (')') == MATCH_YES
)
2136 if (gfc_match_char (',') != MATCH_YES
)
2139 m
= match_open_element (open
);
2140 if (m
== MATCH_ERROR
)
2146 if (gfc_match_eos () == MATCH_NO
)
2149 if (gfc_pure (NULL
))
2151 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
2155 gfc_unset_implicit_pure (NULL
);
2157 warn
= (open
->err
|| open
->iostat
) ? true : false;
2159 /* Checks on the ACCESS specifier. */
2160 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
2162 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
2163 static const char *access_f2003
[] = { "STREAM", NULL
};
2164 static const char *access_gnu
[] = { "APPEND", NULL
};
2166 if (!is_char_type ("ACCESS", open
->access
))
2169 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
2171 open
->access
->value
.character
.string
,
2176 /* Checks on the ACTION specifier. */
2177 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
2179 gfc_char_t
*str
= open
->action
->value
.character
.string
;
2180 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
2182 if (!is_char_type ("ACTION", open
->action
))
2185 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
2189 /* With READONLY, only allow ACTION='READ'. */
2190 if (open
->readonly
&& (gfc_wide_strlen (str
) != 4
2191 || gfc_wide_strncasecmp (str
, "READ", 4) != 0))
2193 gfc_error ("ACTION type conflicts with READONLY specifier at %C");
2197 /* If we see READONLY and no ACTION, set ACTION='READ'. */
2198 else if (open
->readonly
&& open
->action
== NULL
)
2200 open
->action
= gfc_get_character_expr (gfc_default_character_kind
,
2201 &gfc_current_locus
, "read", 4);
2204 /* Checks on the ASYNCHRONOUS specifier. */
2205 if (open
->asynchronous
)
2207 if (!gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
2208 "not allowed in Fortran 95"))
2211 if (!is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
2214 if (open
->asynchronous
->ts
.kind
!= 1)
2216 gfc_error ("ASYNCHRONOUS= specifier at %L must be of default "
2217 "CHARACTER kind", &open
->asynchronous
->where
);
2221 if (open
->asynchronous
->expr_type
== EXPR_ARRAY
2222 || open
->asynchronous
->expr_type
== EXPR_STRUCTURE
)
2224 gfc_error ("ASYNCHRONOUS= specifier at %L must be scalar",
2225 &open
->asynchronous
->where
);
2229 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
2231 static const char * asynchronous
[] = { "YES", "NO", NULL
};
2233 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
2234 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
2240 /* Checks on the BLANK specifier. */
2243 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
2244 "not allowed in Fortran 95"))
2247 if (!is_char_type ("BLANK", open
->blank
))
2250 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
2252 static const char *blank
[] = { "ZERO", "NULL", NULL
};
2254 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
2255 open
->blank
->value
.character
.string
,
2261 /* Checks on the CARRIAGECONTROL specifier. */
2264 if (!is_char_type ("CARRIAGECONTROL", open
->cc
))
2267 if (open
->cc
->expr_type
== EXPR_CONSTANT
)
2269 static const char *cc
[] = { "LIST", "FORTRAN", "NONE", NULL
};
2270 if (!compare_to_allowed_values ("CARRIAGECONTROL", cc
, NULL
, NULL
,
2271 open
->cc
->value
.character
.string
,
2277 /* Checks on the DECIMAL specifier. */
2280 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
2281 "not allowed in Fortran 95"))
2284 if (!is_char_type ("DECIMAL", open
->decimal
))
2287 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
2289 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
2291 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
2292 open
->decimal
->value
.character
.string
,
2298 /* Checks on the DELIM specifier. */
2301 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
2303 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
2305 if (!is_char_type ("DELIM", open
->delim
))
2308 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
2309 open
->delim
->value
.character
.string
,
2315 /* Checks on the ENCODING specifier. */
2318 if (!gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
2319 "not allowed in Fortran 95"))
2322 if (!is_char_type ("ENCODING", open
->encoding
))
2325 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
2327 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
2329 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
2330 open
->encoding
->value
.character
.string
,
2336 /* Checks on the FORM specifier. */
2337 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
2339 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
2341 if (!is_char_type ("FORM", open
->form
))
2344 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
2345 open
->form
->value
.character
.string
,
2350 /* Checks on the PAD specifier. */
2351 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
2353 static const char *pad
[] = { "YES", "NO", NULL
};
2355 if (!is_char_type ("PAD", open
->pad
))
2358 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
2359 open
->pad
->value
.character
.string
,
2364 /* Checks on the POSITION specifier. */
2365 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
2367 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
2369 if (!is_char_type ("POSITION", open
->position
))
2372 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2373 open
->position
->value
.character
.string
,
2378 /* Checks on the ROUND specifier. */
2381 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2382 "not allowed in Fortran 95"))
2385 if (!is_char_type ("ROUND", open
->round
))
2388 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2390 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2391 "COMPATIBLE", "PROCESSOR_DEFINED",
2394 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2395 open
->round
->value
.character
.string
,
2401 /* Checks on the SHARE specifier. */
2404 if (!is_char_type ("SHARE", open
->share
))
2407 if (open
->share
->expr_type
== EXPR_CONSTANT
)
2409 static const char *share
[] = { "DENYNONE", "DENYRW", NULL
};
2410 if (!compare_to_allowed_values ("SHARE", share
, NULL
, NULL
,
2411 open
->share
->value
.character
.string
,
2417 /* Checks on the SIGN specifier. */
2420 if (!gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2421 "not allowed in Fortran 95"))
2424 if (!is_char_type ("SIGN", open
->sign
))
2427 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2429 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2432 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2433 open
->sign
->value
.character
.string
,
2439 #define warn_or_error(...) \
2442 gfc_warning (0, __VA_ARGS__); \
2445 gfc_error (__VA_ARGS__); \
2450 /* Checks on the RECL specifier. */
2451 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2452 && open
->recl
->ts
.type
== BT_INTEGER
2453 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2455 warn_or_error ("RECL in OPEN statement at %C must be positive");
2458 /* Checks on the STATUS specifier. */
2459 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2461 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2462 "REPLACE", "UNKNOWN", NULL
};
2464 if (!is_char_type ("STATUS", open
->status
))
2467 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2468 open
->status
->value
.character
.string
,
2472 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2473 the FILE= specifier shall appear. */
2474 if (open
->file
== NULL
2475 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2477 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2480 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2482 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2483 "%qs and no FILE specifier is present", s
);
2487 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2488 the FILE= specifier shall not appear. */
2489 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2490 "scratch", 7) == 0 && open
->file
)
2492 warn_or_error ("The STATUS specified in OPEN statement at %C "
2493 "cannot have the value SCRATCH if a FILE specifier "
2498 /* Checks on NEWUNIT specifier. */
2503 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
2507 if (!open
->file
&& open
->status
)
2509 if (open
->status
->expr_type
== EXPR_CONSTANT
2510 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2513 gfc_error ("NEWUNIT specifier must have FILE= "
2514 "or STATUS='scratch' at %C");
2519 else if (!open
->unit
)
2521 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
2525 /* Things that are not allowed for unformatted I/O. */
2526 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2527 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2528 || open
->sign
|| open
->pad
|| open
->blank
)
2529 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2530 "unformatted", 11) == 0)
2532 const char *spec
= (open
->delim
? "DELIM "
2533 : (open
->pad
? "PAD " : open
->blank
2536 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2537 "unformatted I/O", spec
);
2540 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2541 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2544 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2549 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2550 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2551 "sequential", 10) == 0
2552 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2554 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2557 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2558 "for stream or sequential ACCESS");
2561 #undef warn_or_error
2563 new_st
.op
= EXEC_OPEN
;
2564 new_st
.ext
.open
= open
;
2568 gfc_syntax_error (ST_OPEN
);
2571 gfc_free_open (open
);
2576 /* Free a gfc_close structure an all its expressions. */
2579 gfc_free_close (gfc_close
*close
)
2584 gfc_free_expr (close
->unit
);
2585 gfc_free_expr (close
->iomsg
);
2586 gfc_free_expr (close
->iostat
);
2587 gfc_free_expr (close
->status
);
2592 /* Match elements of a CLOSE statement. */
2595 match_close_element (gfc_close
*close
)
2599 m
= match_etag (&tag_unit
, &close
->unit
);
2602 m
= match_etag (&tag_status
, &close
->status
);
2605 m
= match_etag (&tag_iomsg
, &close
->iomsg
);
2606 if (m
== MATCH_YES
&& !check_char_variable (close
->iomsg
))
2610 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2613 m
= match_ltag (&tag_err
, &close
->err
);
2621 /* Match a CLOSE statement. */
2624 gfc_match_close (void)
2630 m
= gfc_match_char ('(');
2634 close
= XCNEW (gfc_close
);
2636 m
= match_close_element (close
);
2638 if (m
== MATCH_ERROR
)
2642 m
= gfc_match_expr (&close
->unit
);
2645 if (m
== MATCH_ERROR
)
2651 if (gfc_match_char (')') == MATCH_YES
)
2653 if (gfc_match_char (',') != MATCH_YES
)
2656 m
= match_close_element (close
);
2657 if (m
== MATCH_ERROR
)
2663 if (gfc_match_eos () == MATCH_NO
)
2666 if (gfc_pure (NULL
))
2668 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2672 gfc_unset_implicit_pure (NULL
);
2674 warn
= (close
->iostat
|| close
->err
) ? true : false;
2676 /* Checks on the STATUS specifier. */
2677 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2679 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2681 if (!is_char_type ("STATUS", close
->status
))
2684 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2685 close
->status
->value
.character
.string
,
2690 new_st
.op
= EXEC_CLOSE
;
2691 new_st
.ext
.close
= close
;
2695 gfc_syntax_error (ST_CLOSE
);
2698 gfc_free_close (close
);
2703 /* Resolve everything in a gfc_close structure. */
2706 gfc_resolve_close (gfc_close
*close
)
2708 RESOLVE_TAG (&tag_unit
, close
->unit
);
2709 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2710 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2711 RESOLVE_TAG (&tag_status
, close
->status
);
2713 if (!gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
))
2716 if (close
->unit
== NULL
)
2718 /* Find a locus from one of the arguments to close, when UNIT is
2720 locus loc
= gfc_current_locus
;
2722 loc
= close
->status
->where
;
2723 else if (close
->iostat
)
2724 loc
= close
->iostat
->where
;
2725 else if (close
->iomsg
)
2726 loc
= close
->iomsg
->where
;
2727 else if (close
->err
)
2728 loc
= close
->err
->where
;
2730 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2734 if (close
->unit
->expr_type
== EXPR_CONSTANT
2735 && close
->unit
->ts
.type
== BT_INTEGER
2736 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2738 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2739 &close
->unit
->where
);
2746 /* Free a gfc_filepos structure. */
2749 gfc_free_filepos (gfc_filepos
*fp
)
2751 gfc_free_expr (fp
->unit
);
2752 gfc_free_expr (fp
->iomsg
);
2753 gfc_free_expr (fp
->iostat
);
2758 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2761 match_file_element (gfc_filepos
*fp
)
2765 m
= match_etag (&tag_unit
, &fp
->unit
);
2768 m
= match_etag (&tag_iomsg
, &fp
->iomsg
);
2769 if (m
== MATCH_YES
&& !check_char_variable (fp
->iomsg
))
2773 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2776 m
= match_ltag (&tag_err
, &fp
->err
);
2784 /* Match the second half of the file-positioning statements, REWIND,
2785 BACKSPACE, ENDFILE, or the FLUSH statement. */
2788 match_filepos (gfc_statement st
, gfc_exec_op op
)
2793 fp
= XCNEW (gfc_filepos
);
2795 if (gfc_match_char ('(') == MATCH_NO
)
2797 m
= gfc_match_expr (&fp
->unit
);
2798 if (m
== MATCH_ERROR
)
2806 m
= match_file_element (fp
);
2807 if (m
== MATCH_ERROR
)
2811 m
= gfc_match_expr (&fp
->unit
);
2812 if (m
== MATCH_ERROR
|| m
== MATCH_NO
)
2818 if (gfc_match_char (')') == MATCH_YES
)
2820 if (gfc_match_char (',') != MATCH_YES
)
2823 m
= match_file_element (fp
);
2824 if (m
== MATCH_ERROR
)
2831 if (gfc_match_eos () != MATCH_YES
)
2834 if (gfc_pure (NULL
))
2836 gfc_error ("%s statement not allowed in PURE procedure at %C",
2837 gfc_ascii_statement (st
));
2842 gfc_unset_implicit_pure (NULL
);
2845 new_st
.ext
.filepos
= fp
;
2849 gfc_syntax_error (st
);
2852 gfc_free_filepos (fp
);
2858 gfc_resolve_filepos (gfc_filepos
*fp
, locus
*where
)
2860 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2861 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2862 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2864 if (!fp
->unit
&& (fp
->iostat
|| fp
->iomsg
|| fp
->err
))
2866 gfc_error ("UNIT number missing in statement at %L", where
);
2870 if (!gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
))
2873 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2874 && fp
->unit
->ts
.type
== BT_INTEGER
2875 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2877 gfc_error ("UNIT number in statement at %L must be non-negative",
2886 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2887 and the FLUSH statement. */
2890 gfc_match_endfile (void)
2892 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2896 gfc_match_backspace (void)
2898 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2902 gfc_match_rewind (void)
2904 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2908 gfc_match_flush (void)
2910 if (!gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C"))
2913 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2916 /******************** Data Transfer Statements *********************/
2918 /* Return a default unit number. */
2921 default_unit (io_kind k
)
2930 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2934 /* Match a unit specification for a data transfer statement. */
2937 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2942 if (gfc_match_char ('*') == MATCH_YES
)
2944 if (dt
->io_unit
!= NULL
)
2947 dt
->io_unit
= default_unit (k
);
2949 c
= gfc_peek_ascii_char ();
2951 gfc_error_now ("Missing format with default unit at %C");
2956 if (gfc_match_expr (&e
) == MATCH_YES
)
2958 if (dt
->io_unit
!= NULL
)
2971 gfc_error ("Duplicate UNIT specification at %C");
2976 /* Match a format specification. */
2979 match_dt_format (gfc_dt
*dt
)
2983 gfc_st_label
*label
;
2986 where
= gfc_current_locus
;
2988 if (gfc_match_char ('*') == MATCH_YES
)
2990 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2993 dt
->format_label
= &format_asterisk
;
2997 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
3001 /* Need to check if the format label is actually either an operand
3002 to a user-defined operator or is a kind type parameter. That is,
3003 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
3004 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
3006 gfc_gobble_whitespace ();
3007 c
= gfc_peek_ascii_char ();
3008 if (c
== '.' || c
== '_')
3009 gfc_current_locus
= where
;
3012 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
3014 gfc_free_st_label (label
);
3018 if (!gfc_reference_st_label (label
, ST_LABEL_FORMAT
))
3021 dt
->format_label
= label
;
3025 else if (m
== MATCH_ERROR
)
3026 /* The label was zero or too large. Emit the correct diagnosis. */
3029 if (gfc_match_expr (&e
) == MATCH_YES
)
3031 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
3036 dt
->format_expr
= e
;
3040 gfc_current_locus
= where
; /* The only case where we have to restore */
3045 gfc_error ("Duplicate format specification at %C");
3049 /* Check for formatted read and write DTIO procedures. */
3052 dtio_procs_present (gfc_symbol
*sym
, io_kind k
)
3054 gfc_symbol
*derived
;
3056 if (sym
&& sym
->ts
.u
.derived
)
3058 if (sym
->ts
.type
== BT_CLASS
&& CLASS_DATA (sym
))
3059 derived
= CLASS_DATA (sym
)->ts
.u
.derived
;
3060 else if (sym
->ts
.type
== BT_DERIVED
)
3061 derived
= sym
->ts
.u
.derived
;
3064 if ((k
== M_WRITE
|| k
== M_PRINT
) &&
3065 (gfc_find_specific_dtio_proc (derived
, true, true) != NULL
))
3067 if ((k
== M_READ
) &&
3068 (gfc_find_specific_dtio_proc (derived
, false, true) != NULL
))
3074 /* Traverse a namelist that is part of a READ statement to make sure
3075 that none of the variables in the namelist are INTENT(IN). Returns
3076 nonzero if we find such a variable. */
3079 check_namelist (gfc_symbol
*sym
)
3083 for (p
= sym
->namelist
; p
; p
= p
->next
)
3084 if (p
->sym
->attr
.intent
== INTENT_IN
)
3086 gfc_error ("Symbol %qs in namelist %qs is INTENT(IN) at %C",
3087 p
->sym
->name
, sym
->name
);
3095 /* Match a single data transfer element. */
3098 match_dt_element (io_kind k
, gfc_dt
*dt
)
3100 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3104 if (gfc_match (" unit =") == MATCH_YES
)
3106 m
= match_dt_unit (k
, dt
);
3111 if (gfc_match (" fmt =") == MATCH_YES
)
3113 m
= match_dt_format (dt
);
3118 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
3120 if (dt
->namelist
!= NULL
)
3122 gfc_error ("Duplicate NML specification at %C");
3126 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
3129 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
3131 gfc_error ("Symbol %qs at %C must be a NAMELIST group name",
3132 sym
!= NULL
? sym
->name
: name
);
3137 if (k
== M_READ
&& check_namelist (sym
))
3143 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
3144 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3148 m
= match_etag (&tag_e_blank
, &dt
->blank
);
3151 m
= match_etag (&tag_e_delim
, &dt
->delim
);
3154 m
= match_etag (&tag_e_pad
, &dt
->pad
);
3157 m
= match_etag (&tag_e_sign
, &dt
->sign
);
3160 m
= match_etag (&tag_e_round
, &dt
->round
);
3163 m
= match_out_tag (&tag_id
, &dt
->id
);
3166 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
3169 m
= match_etag (&tag_rec
, &dt
->rec
);
3172 m
= match_etag (&tag_spos
, &dt
->pos
);
3175 m
= match_etag (&tag_iomsg
, &dt
->iomsg
);
3176 if (m
== MATCH_YES
&& !check_char_variable (dt
->iomsg
))
3181 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
3184 m
= match_ltag (&tag_err
, &dt
->err
);
3186 dt
->err_where
= gfc_current_locus
;
3189 m
= match_etag (&tag_advance
, &dt
->advance
);
3192 m
= match_out_tag (&tag_size
, &dt
->size
);
3196 m
= match_ltag (&tag_end
, &dt
->end
);
3201 gfc_error ("END tag at %C not allowed in output statement");
3204 dt
->end_where
= gfc_current_locus
;
3209 m
= match_ltag (&tag_eor
, &dt
->eor
);
3211 dt
->eor_where
= gfc_current_locus
;
3219 /* Free a data transfer structure and everything below it. */
3222 gfc_free_dt (gfc_dt
*dt
)
3227 gfc_free_expr (dt
->io_unit
);
3228 gfc_free_expr (dt
->format_expr
);
3229 gfc_free_expr (dt
->rec
);
3230 gfc_free_expr (dt
->advance
);
3231 gfc_free_expr (dt
->iomsg
);
3232 gfc_free_expr (dt
->iostat
);
3233 gfc_free_expr (dt
->size
);
3234 gfc_free_expr (dt
->pad
);
3235 gfc_free_expr (dt
->delim
);
3236 gfc_free_expr (dt
->sign
);
3237 gfc_free_expr (dt
->round
);
3238 gfc_free_expr (dt
->blank
);
3239 gfc_free_expr (dt
->decimal
);
3240 gfc_free_expr (dt
->pos
);
3241 gfc_free_expr (dt
->dt_io_kind
);
3242 /* dt->extra_comma is a link to dt_io_kind if it is set. */
3247 /* Resolve everything in a gfc_dt structure. */
3250 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
3256 /* This is set in any case. */
3257 gcc_assert (dt
->dt_io_kind
);
3258 k
= dt
->dt_io_kind
->value
.iokind
;
3260 tmp
= gfc_current_locus
;
3261 gfc_current_locus
= *loc
;
3262 if (!resolve_tag (&tag_format
, dt
->format_expr
))
3264 gfc_current_locus
= tmp
;
3267 gfc_current_locus
= tmp
;
3269 RESOLVE_TAG (&tag_rec
, dt
->rec
);
3270 RESOLVE_TAG (&tag_spos
, dt
->pos
);
3271 RESOLVE_TAG (&tag_advance
, dt
->advance
);
3272 RESOLVE_TAG (&tag_id
, dt
->id
);
3273 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
3274 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
3275 RESOLVE_TAG (&tag_size
, dt
->size
);
3276 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
3277 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
3278 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
3279 RESOLVE_TAG (&tag_e_round
, dt
->round
);
3280 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
3281 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
3282 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
3287 gfc_error ("UNIT not specified at %L", loc
);
3291 if (gfc_resolve_expr (e
)
3292 && (e
->ts
.type
!= BT_INTEGER
3293 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
3295 /* If there is no extra comma signifying the "format" form of the IO
3296 statement, then this must be an error. */
3297 if (!dt
->extra_comma
)
3299 gfc_error ("UNIT specification at %L must be an INTEGER expression "
3300 "or a CHARACTER variable", &e
->where
);
3305 /* At this point, we have an extra comma. If io_unit has arrived as
3306 type character, we assume its really the "format" form of the I/O
3307 statement. We set the io_unit to the default unit and format to
3308 the character expression. See F95 Standard section 9.4. */
3309 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
3311 dt
->format_expr
= dt
->io_unit
;
3312 dt
->io_unit
= default_unit (k
);
3314 /* Nullify this pointer now so that a warning/error is not
3315 triggered below for the "Extension". */
3316 dt
->extra_comma
= NULL
;
3321 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
3322 &dt
->extra_comma
->where
);
3328 if (e
->ts
.type
== BT_CHARACTER
)
3330 if (gfc_has_vector_index (e
))
3332 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
3336 /* If we are writing, make sure the internal unit can be changed. */
3337 gcc_assert (k
!= M_PRINT
);
3339 && !gfc_check_vardef_context (e
, false, false, false,
3340 _("internal unit in WRITE")))
3344 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
3346 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
3350 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
3351 && mpz_sgn (e
->value
.integer
) < 0)
3353 gfc_error ("UNIT number in statement at %L must be non-negative",
3358 /* If we are reading and have a namelist, check that all namelist symbols
3359 can appear in a variable definition context. */
3363 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
3370 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
3371 t
= gfc_check_vardef_context (e
, false, false, false, NULL
);
3376 gfc_error ("NAMELIST %qs in READ statement at %L contains"
3377 " the symbol %qs which may not appear in a"
3378 " variable definition context",
3379 dt
->namelist
->name
, loc
, n
->sym
->name
);
3384 t
= dtio_procs_present (n
->sym
, k
);
3386 if (n
->sym
->ts
.type
== BT_CLASS
&& !t
)
3388 gfc_error ("NAMELIST object %qs in namelist %qs at %L is "
3389 "polymorphic and requires a defined input/output "
3390 "procedure", n
->sym
->name
, dt
->namelist
->name
, loc
);
3394 if ((n
->sym
->ts
.type
== BT_DERIVED
)
3395 && (n
->sym
->ts
.u
.derived
->attr
.alloc_comp
3396 || n
->sym
->ts
.u
.derived
->attr
.pointer_comp
))
3398 if (!gfc_notify_std (GFC_STD_F2003
, "NAMELIST object %qs in "
3399 "namelist %qs at %L with ALLOCATABLE "
3400 "or POINTER components", n
->sym
->name
,
3401 dt
->namelist
->name
, loc
))
3406 gfc_error ("NAMELIST object %qs in namelist %qs at %L has "
3407 "ALLOCATABLE or POINTER components and thus requires "
3408 "a defined input/output procedure", n
->sym
->name
,
3409 dt
->namelist
->name
, loc
);
3417 && !gfc_notify_std (GFC_STD_LEGACY
, "Comma before i/o item list at %L",
3418 &dt
->extra_comma
->where
))
3423 if (!gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
))
3425 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
3427 gfc_error ("ERR tag label %d at %L not defined",
3428 dt
->err
->value
, &dt
->err_where
);
3435 if (!gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
))
3437 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
3439 gfc_error ("END tag label %d at %L not defined",
3440 dt
->end
->value
, &dt
->end_where
);
3447 if (!gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
))
3449 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
3451 gfc_error ("EOR tag label %d at %L not defined",
3452 dt
->eor
->value
, &dt
->eor_where
);
3457 /* Check the format label actually exists. */
3458 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
3459 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
3461 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
3470 /* Given an io_kind, return its name. */
3473 io_kind_name (io_kind k
)
3492 gfc_internal_error ("io_kind_name(): bad I/O-kind");
3499 /* Match an IO iteration statement of the form:
3501 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
3503 which is equivalent to a single IO element. This function is
3504 mutually recursive with match_io_element(). */
3506 static match
match_io_element (io_kind
, gfc_code
**);
3509 match_io_iterator (io_kind k
, gfc_code
**result
)
3511 gfc_code
*head
, *tail
, *new_code
;
3519 old_loc
= gfc_current_locus
;
3521 if (gfc_match_char ('(') != MATCH_YES
)
3524 m
= match_io_element (k
, &head
);
3527 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3533 /* Can't be anything but an IO iterator. Build a list. */
3534 iter
= gfc_get_iterator ();
3538 m
= gfc_match_iterator (iter
, 0);
3539 if (m
== MATCH_ERROR
)
3543 gfc_check_do_variable (iter
->var
->symtree
);
3547 m
= match_io_element (k
, &new_code
);
3548 if (m
== MATCH_ERROR
)
3557 tail
= gfc_append_code (tail
, new_code
);
3559 if (gfc_match_char (',') != MATCH_YES
)
3568 if (gfc_match_char (')') != MATCH_YES
)
3571 new_code
= gfc_get_code (EXEC_DO
);
3572 new_code
->ext
.iterator
= iter
;
3574 new_code
->block
= gfc_get_code (EXEC_DO
);
3575 new_code
->block
->next
= head
;
3581 gfc_error ("Syntax error in I/O iterator at %C");
3585 gfc_free_iterator (iter
, 1);
3586 gfc_free_statements (head
);
3587 gfc_current_locus
= old_loc
;
3592 /* Match a single element of an IO list, which is either a single
3593 expression or an IO Iterator. */
3596 match_io_element (io_kind k
, gfc_code
**cpp
)
3604 m
= match_io_iterator (k
, cpp
);
3610 m
= gfc_match_variable (&expr
, 0);
3612 gfc_error ("Expected variable in READ statement at %C");
3616 m
= gfc_match_expr (&expr
);
3618 gfc_error ("Expected expression in %s statement at %C",
3622 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3627 gfc_free_expr (expr
);
3631 cp
= gfc_get_code (EXEC_TRANSFER
);
3634 cp
->ext
.dt
= current_dt
;
3641 /* Match an I/O list, building gfc_code structures as we go. */
3644 match_io_list (io_kind k
, gfc_code
**head_p
)
3646 gfc_code
*head
, *tail
, *new_code
;
3649 *head_p
= head
= tail
= NULL
;
3650 if (gfc_match_eos () == MATCH_YES
)
3655 m
= match_io_element (k
, &new_code
);
3656 if (m
== MATCH_ERROR
)
3661 tail
= gfc_append_code (tail
, new_code
);
3665 if (gfc_match_eos () == MATCH_YES
)
3667 if (gfc_match_char (',') != MATCH_YES
)
3675 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3678 gfc_free_statements (head
);
3683 /* Attach the data transfer end node. */
3686 terminate_io (gfc_code
*io_code
)
3690 if (io_code
== NULL
)
3691 io_code
= new_st
.block
;
3693 c
= gfc_get_code (EXEC_DT_END
);
3695 /* Point to structure that is already there */
3696 c
->ext
.dt
= new_st
.ext
.dt
;
3697 gfc_append_code (io_code
, c
);
3701 /* Check the constraints for a data transfer statement. The majority of the
3702 constraints appearing in 9.4 of the standard appear here. Some are handled
3703 in resolve_tag and others in gfc_resolve_dt. Also set the async_io_dt flag
3704 and, if necessary, the asynchronous flag on the SIZE argument. */
3707 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3710 #define io_constraint(condition, msg, arg)\
3713 if ((arg)->lb != NULL)\
3714 gfc_error ((msg), (arg));\
3716 gfc_error ((msg), &gfc_current_locus);\
3722 gfc_symbol
*sym
= NULL
;
3723 bool warn
, unformatted
;
3725 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3726 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3727 && dt
->namelist
== NULL
;
3732 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3733 && expr
->ts
.type
== BT_CHARACTER
)
3735 sym
= expr
->symtree
->n
.sym
;
3737 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3738 "Internal file at %L must not be INTENT(IN)",
3741 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3742 "Internal file incompatible with vector subscript at %L",
3745 io_constraint (dt
->rec
!= NULL
,
3746 "REC tag at %L is incompatible with internal file",
3749 io_constraint (dt
->pos
!= NULL
,
3750 "POS tag at %L is incompatible with internal file",
3753 io_constraint (unformatted
,
3754 "Unformatted I/O not allowed with internal unit at %L",
3755 &dt
->io_unit
->where
);
3757 io_constraint (dt
->asynchronous
!= NULL
,
3758 "ASYNCHRONOUS tag at %L not allowed with internal file",
3759 &dt
->asynchronous
->where
);
3761 if (dt
->namelist
!= NULL
)
3763 if (!gfc_notify_std (GFC_STD_F2003
, "Internal file at %L with "
3764 "namelist", &expr
->where
))
3768 io_constraint (dt
->advance
!= NULL
,
3769 "ADVANCE tag at %L is incompatible with internal file",
3770 &dt
->advance
->where
);
3773 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3776 if (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
))
3778 gfc_error ("IO UNIT in %s statement at %C must be "
3779 "an internal file in a PURE procedure",
3784 if (k
== M_READ
|| k
== M_WRITE
)
3785 gfc_unset_implicit_pure (NULL
);
3790 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3793 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3796 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3799 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3802 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3807 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3808 "SIZE tag at %L requires an ADVANCE tag",
3811 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3812 "EOR tag at %L requires an ADVANCE tag",
3816 if (dt
->asynchronous
)
3819 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3821 if (!gfc_reduce_init_expr (dt
->asynchronous
))
3823 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3824 "expression", &dt
->asynchronous
->where
);
3828 if (!is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3831 if (dt
->asynchronous
->ts
.kind
!= 1)
3833 gfc_error ("ASYNCHRONOUS= specifier at %L must be of default "
3834 "CHARACTER kind", &dt
->asynchronous
->where
);
3838 if (dt
->asynchronous
->expr_type
== EXPR_ARRAY
3839 || dt
->asynchronous
->expr_type
== EXPR_STRUCTURE
)
3841 gfc_error ("ASYNCHRONOUS= specifier at %L must be scalar",
3842 &dt
->asynchronous
->where
);
3846 if (!compare_to_allowed_values
3847 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3848 dt
->asynchronous
->value
.character
.string
,
3849 io_kind_name (k
), warn
, &num
))
3852 /* Best to put this here because the yes/no info is still around. */
3853 async_io_dt
= num
== 0;
3854 if (async_io_dt
&& dt
->size
)
3855 dt
->size
->symtree
->n
.sym
->attr
.asynchronous
= 1;
3858 async_io_dt
= false;
3864 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3865 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3867 io_constraint (not_yes
,
3868 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3869 "specifier", &dt
->id
->where
);
3874 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3875 "not allowed in Fortran 95"))
3878 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3880 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3882 if (!is_char_type ("DECIMAL", dt
->decimal
))
3885 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3886 dt
->decimal
->value
.character
.string
,
3887 io_kind_name (k
), warn
))
3890 io_constraint (unformatted
,
3891 "the DECIMAL= specifier at %L must be with an "
3892 "explicit format expression", &dt
->decimal
->where
);
3898 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3899 "not allowed in Fortran 95"))
3902 if (!is_char_type ("BLANK", dt
->blank
))
3905 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3907 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3910 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3911 dt
->blank
->value
.character
.string
,
3912 io_kind_name (k
), warn
))
3915 io_constraint (unformatted
,
3916 "the BLANK= specifier at %L must be with an "
3917 "explicit format expression", &dt
->blank
->where
);
3923 if (!gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3924 "not allowed in Fortran 95"))
3927 if (!is_char_type ("PAD", dt
->pad
))
3930 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3932 static const char * pad
[] = { "YES", "NO", NULL
};
3934 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3935 dt
->pad
->value
.character
.string
,
3936 io_kind_name (k
), warn
))
3939 io_constraint (unformatted
,
3940 "the PAD= specifier at %L must be with an "
3941 "explicit format expression", &dt
->pad
->where
);
3947 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3948 "not allowed in Fortran 95"))
3951 if (!is_char_type ("ROUND", dt
->round
))
3954 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3956 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3957 "COMPATIBLE", "PROCESSOR_DEFINED",
3960 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3961 dt
->round
->value
.character
.string
,
3962 io_kind_name (k
), warn
))
3969 /* When implemented, change the following to use gfc_notify_std F2003.
3970 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3971 "not allowed in Fortran 95") == false)
3972 return MATCH_ERROR; */
3974 if (!is_char_type ("SIGN", dt
->sign
))
3977 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3979 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3982 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3983 dt
->sign
->value
.character
.string
,
3984 io_kind_name (k
), warn
))
3987 io_constraint (unformatted
,
3988 "SIGN= specifier at %L must be with an "
3989 "explicit format expression", &dt
->sign
->where
);
3991 io_constraint (k
== M_READ
,
3992 "SIGN= specifier at %L not allowed in a "
3993 "READ statement", &dt
->sign
->where
);
3999 if (!gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
4000 "not allowed in Fortran 95"))
4003 if (!is_char_type ("DELIM", dt
->delim
))
4006 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
4008 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
4010 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
4011 dt
->delim
->value
.character
.string
,
4012 io_kind_name (k
), warn
))
4015 io_constraint (k
== M_READ
,
4016 "DELIM= specifier at %L not allowed in a "
4017 "READ statement", &dt
->delim
->where
);
4019 io_constraint (dt
->format_label
!= &format_asterisk
4020 && dt
->namelist
== NULL
,
4021 "DELIM= specifier at %L must have FMT=*",
4024 io_constraint (unformatted
&& dt
->namelist
== NULL
,
4025 "DELIM= specifier at %L must be with FMT=* or "
4026 "NML= specifier", &dt
->delim
->where
);
4032 io_constraint (io_code
&& dt
->namelist
,
4033 "NAMELIST cannot be followed by IO-list at %L",
4036 io_constraint (dt
->format_expr
,
4037 "IO spec-list cannot contain both NAMELIST group name "
4038 "and format specification at %L",
4039 &dt
->format_expr
->where
);
4041 io_constraint (dt
->format_label
,
4042 "IO spec-list cannot contain both NAMELIST group name "
4043 "and format label at %L", spec_end
);
4045 io_constraint (dt
->rec
,
4046 "NAMELIST IO is not allowed with a REC= specifier "
4047 "at %L", &dt
->rec
->where
);
4049 io_constraint (dt
->advance
,
4050 "NAMELIST IO is not allowed with a ADVANCE= specifier "
4051 "at %L", &dt
->advance
->where
);
4056 io_constraint (dt
->end
,
4057 "An END tag is not allowed with a "
4058 "REC= specifier at %L", &dt
->end_where
);
4060 io_constraint (dt
->format_label
== &format_asterisk
,
4061 "FMT=* is not allowed with a REC= specifier "
4064 io_constraint (dt
->pos
,
4065 "POS= is not allowed with REC= specifier "
4066 "at %L", &dt
->pos
->where
);
4071 int not_yes
, not_no
;
4074 io_constraint (dt
->format_label
== &format_asterisk
,
4075 "List directed format(*) is not allowed with a "
4076 "ADVANCE= specifier at %L.", &expr
->where
);
4078 io_constraint (unformatted
,
4079 "the ADVANCE= specifier at %L must appear with an "
4080 "explicit format expression", &expr
->where
);
4082 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
4084 const gfc_char_t
*advance
= expr
->value
.character
.string
;
4085 not_no
= gfc_wide_strlen (advance
) != 2
4086 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
4087 not_yes
= gfc_wide_strlen (advance
) != 3
4088 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
4096 io_constraint (not_no
&& not_yes
,
4097 "ADVANCE= specifier at %L must have value = "
4098 "YES or NO.", &expr
->where
);
4100 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
4101 "SIZE tag at %L requires an ADVANCE = %<NO%>",
4104 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
4105 "EOR tag at %L requires an ADVANCE = %<NO%>",
4109 expr
= dt
->format_expr
;
4110 if (!gfc_simplify_expr (expr
, 0)
4111 || !check_format_string (expr
, k
== M_READ
))
4116 #undef io_constraint
4119 /* Match a READ, WRITE or PRINT statement. */
4122 match_io (io_kind k
)
4124 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4129 locus spec_end
, control
;
4133 where
= gfc_current_locus
;
4135 current_dt
= dt
= XCNEW (gfc_dt
);
4136 m
= gfc_match_char ('(');
4139 where
= gfc_current_locus
;
4142 else if (k
== M_PRINT
)
4144 /* Treat the non-standard case of PRINT namelist. */
4145 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
4146 && gfc_match_name (name
) == MATCH_YES
)
4148 gfc_find_symbol (name
, NULL
, 1, &sym
);
4149 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4151 if (!gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
4152 "%C is an extension"))
4158 dt
->io_unit
= default_unit (k
);
4163 gfc_current_locus
= where
;
4167 if (gfc_current_form
== FORM_FREE
)
4169 char c
= gfc_peek_ascii_char ();
4170 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
4177 m
= match_dt_format (dt
);
4178 if (m
== MATCH_ERROR
)
4184 dt
->io_unit
= default_unit (k
);
4189 /* Before issuing an error for a malformed 'print (1,*)' type of
4190 error, check for a default-char-expr of the form ('(I0)'). */
4193 control
= gfc_current_locus
;
4196 /* Reset current locus to get the initial '(' in an expression. */
4197 gfc_current_locus
= where
;
4198 dt
->format_expr
= NULL
;
4199 m
= match_dt_format (dt
);
4201 if (m
== MATCH_ERROR
)
4203 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
4207 dt
->io_unit
= default_unit (k
);
4212 /* Commit any pending symbols now so that when we undo
4213 symbols later we wont lose them. */
4214 gfc_commit_symbols ();
4215 /* Reset current locus to get the initial '(' in an expression. */
4216 gfc_current_locus
= where
;
4217 dt
->format_expr
= NULL
;
4218 m
= gfc_match_expr (&dt
->format_expr
);
4222 && dt
->format_expr
->ts
.type
== BT_CHARACTER
)
4225 dt
->io_unit
= default_unit (k
);
4230 gfc_free_expr (dt
->format_expr
);
4231 dt
->format_expr
= NULL
;
4232 gfc_current_locus
= control
;
4238 gfc_undo_symbols ();
4239 gfc_free_expr (dt
->format_expr
);
4240 dt
->format_expr
= NULL
;
4241 gfc_current_locus
= control
;
4247 /* Match a control list */
4248 if (match_dt_element (k
, dt
) == MATCH_YES
)
4250 if (match_dt_unit (k
, dt
) != MATCH_YES
)
4253 if (gfc_match_char (')') == MATCH_YES
)
4255 if (gfc_match_char (',') != MATCH_YES
)
4258 m
= match_dt_element (k
, dt
);
4261 if (m
== MATCH_ERROR
)
4264 m
= match_dt_format (dt
);
4267 if (m
== MATCH_ERROR
)
4270 where
= gfc_current_locus
;
4272 m
= gfc_match_name (name
);
4275 gfc_find_symbol (name
, NULL
, 1, &sym
);
4276 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4279 if (k
== M_READ
&& check_namelist (sym
))
4288 gfc_current_locus
= where
;
4290 goto loop
; /* No matches, try regular elements */
4293 if (gfc_match_char (')') == MATCH_YES
)
4295 if (gfc_match_char (',') != MATCH_YES
)
4301 m
= match_dt_element (k
, dt
);
4304 if (m
== MATCH_ERROR
)
4307 if (gfc_match_char (')') == MATCH_YES
)
4309 if (gfc_match_char (',') != MATCH_YES
)
4315 /* Used in check_io_constraints, where no locus is available. */
4316 spec_end
= gfc_current_locus
;
4318 /* Save the IO kind for later use. */
4319 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
4321 /* Optional leading comma (non-standard). We use a gfc_expr structure here
4322 to save the locus. This is used later when resolving transfer statements
4323 that might have a format expression without unit number. */
4324 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
4325 dt
->extra_comma
= dt
->dt_io_kind
;
4328 if (gfc_match_eos () != MATCH_YES
)
4330 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
4332 gfc_error ("Expected comma in I/O list at %C");
4337 m
= match_io_list (k
, &io_code
);
4338 if (m
== MATCH_ERROR
)
4344 /* See if we want to use defaults for missing exponents in real transfers
4345 and other DEC runtime extensions. */
4349 /* A full IO statement has been matched. Check the constraints. spec_end is
4350 supplied for cases where no locus is supplied. */
4351 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
4353 if (m
== MATCH_ERROR
)
4356 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
4358 new_st
.block
= gfc_get_code (new_st
.op
);
4359 new_st
.block
->next
= io_code
;
4361 terminate_io (io_code
);
4366 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
4376 gfc_match_read (void)
4378 return match_io (M_READ
);
4383 gfc_match_write (void)
4385 return match_io (M_WRITE
);
4390 gfc_match_print (void)
4394 m
= match_io (M_PRINT
);
4398 if (gfc_pure (NULL
))
4400 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
4404 gfc_unset_implicit_pure (NULL
);
4410 /* Free a gfc_inquire structure. */
4413 gfc_free_inquire (gfc_inquire
*inquire
)
4416 if (inquire
== NULL
)
4419 gfc_free_expr (inquire
->unit
);
4420 gfc_free_expr (inquire
->file
);
4421 gfc_free_expr (inquire
->iomsg
);
4422 gfc_free_expr (inquire
->iostat
);
4423 gfc_free_expr (inquire
->exist
);
4424 gfc_free_expr (inquire
->opened
);
4425 gfc_free_expr (inquire
->number
);
4426 gfc_free_expr (inquire
->named
);
4427 gfc_free_expr (inquire
->name
);
4428 gfc_free_expr (inquire
->access
);
4429 gfc_free_expr (inquire
->sequential
);
4430 gfc_free_expr (inquire
->direct
);
4431 gfc_free_expr (inquire
->form
);
4432 gfc_free_expr (inquire
->formatted
);
4433 gfc_free_expr (inquire
->unformatted
);
4434 gfc_free_expr (inquire
->recl
);
4435 gfc_free_expr (inquire
->nextrec
);
4436 gfc_free_expr (inquire
->blank
);
4437 gfc_free_expr (inquire
->position
);
4438 gfc_free_expr (inquire
->action
);
4439 gfc_free_expr (inquire
->read
);
4440 gfc_free_expr (inquire
->write
);
4441 gfc_free_expr (inquire
->readwrite
);
4442 gfc_free_expr (inquire
->delim
);
4443 gfc_free_expr (inquire
->encoding
);
4444 gfc_free_expr (inquire
->pad
);
4445 gfc_free_expr (inquire
->iolength
);
4446 gfc_free_expr (inquire
->convert
);
4447 gfc_free_expr (inquire
->strm_pos
);
4448 gfc_free_expr (inquire
->asynchronous
);
4449 gfc_free_expr (inquire
->decimal
);
4450 gfc_free_expr (inquire
->pending
);
4451 gfc_free_expr (inquire
->id
);
4452 gfc_free_expr (inquire
->sign
);
4453 gfc_free_expr (inquire
->size
);
4454 gfc_free_expr (inquire
->round
);
4455 gfc_free_expr (inquire
->share
);
4456 gfc_free_expr (inquire
->cc
);
4461 /* Match an element of an INQUIRE statement. */
4463 #define RETM if (m != MATCH_NO) return m;
4466 match_inquire_element (gfc_inquire
*inquire
)
4470 m
= match_etag (&tag_unit
, &inquire
->unit
);
4471 RETM m
= match_etag (&tag_file
, &inquire
->file
);
4472 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
4473 RETM m
= match_etag (&tag_iomsg
, &inquire
->iomsg
);
4474 if (m
== MATCH_YES
&& !check_char_variable (inquire
->iomsg
))
4476 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
4477 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
4478 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
4479 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
4480 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
4481 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
4482 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
4483 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
4484 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
4485 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
4486 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
4487 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
4488 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
4489 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
4490 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
4491 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
4492 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
4493 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
4494 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
4495 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
4496 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
4497 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", inquire
->asynchronous
))
4499 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
4500 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
4501 RETM m
= match_out_tag (&tag_size
, &inquire
->size
);
4502 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
4503 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
4504 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
4505 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
4506 RETM m
= match_out_tag (&tag_iolength
, &inquire
->iolength
);
4507 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
4508 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
4509 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
4510 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
4511 RETM m
= match_vtag (&tag_s_iqstream
, &inquire
->iqstream
);
4512 RETM m
= match_dec_vtag (&tag_v_share
, &inquire
->share
);
4513 RETM m
= match_dec_vtag (&tag_v_cc
, &inquire
->cc
);
4514 RETM
return MATCH_NO
;
4521 gfc_match_inquire (void)
4523 gfc_inquire
*inquire
;
4528 m
= gfc_match_char ('(');
4532 inquire
= XCNEW (gfc_inquire
);
4534 loc
= gfc_current_locus
;
4536 m
= match_inquire_element (inquire
);
4537 if (m
== MATCH_ERROR
)
4541 m
= gfc_match_expr (&inquire
->unit
);
4542 if (m
== MATCH_ERROR
)
4548 /* See if we have the IOLENGTH form of the inquire statement. */
4549 if (inquire
->iolength
!= NULL
)
4551 if (gfc_match_char (')') != MATCH_YES
)
4554 m
= match_io_list (M_INQUIRE
, &code
);
4555 if (m
== MATCH_ERROR
)
4560 new_st
.op
= EXEC_IOLENGTH
;
4561 new_st
.expr1
= inquire
->iolength
;
4562 new_st
.ext
.inquire
= inquire
;
4564 if (gfc_pure (NULL
))
4566 gfc_free_statements (code
);
4567 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4571 gfc_unset_implicit_pure (NULL
);
4573 new_st
.block
= gfc_get_code (EXEC_IOLENGTH
);
4574 terminate_io (code
);
4575 new_st
.block
->next
= code
;
4579 /* At this point, we have the non-IOLENGTH inquire statement. */
4582 if (gfc_match_char (')') == MATCH_YES
)
4584 if (gfc_match_char (',') != MATCH_YES
)
4587 m
= match_inquire_element (inquire
);
4588 if (m
== MATCH_ERROR
)
4593 if (inquire
->iolength
!= NULL
)
4595 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4600 if (gfc_match_eos () != MATCH_YES
)
4603 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
4605 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4606 "UNIT specifiers", &loc
);
4610 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4612 gfc_error ("INQUIRE statement at %L requires either FILE or "
4613 "UNIT specifier", &loc
);
4617 if (inquire
->unit
!= NULL
&& inquire
->unit
->expr_type
== EXPR_CONSTANT
4618 && inquire
->unit
->ts
.type
== BT_INTEGER
4619 && ((mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT4
)
4620 || (mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT
)))
4622 gfc_error ("UNIT number in INQUIRE statement at %L cannot "
4623 "be %d", &loc
, (int) mpz_get_si (inquire
->unit
->value
.integer
));
4627 if (gfc_pure (NULL
))
4629 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4633 gfc_unset_implicit_pure (NULL
);
4635 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4637 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4638 "the ID= specifier", &loc
);
4642 new_st
.op
= EXEC_INQUIRE
;
4643 new_st
.ext
.inquire
= inquire
;
4647 gfc_syntax_error (ST_INQUIRE
);
4650 gfc_free_inquire (inquire
);
4655 /* Resolve everything in a gfc_inquire structure. */
4658 gfc_resolve_inquire (gfc_inquire
*inquire
)
4660 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4661 RESOLVE_TAG (&tag_file
, inquire
->file
);
4662 RESOLVE_TAG (&tag_id
, inquire
->id
);
4664 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4665 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4666 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4667 RESOLVE_TAG (tag, expr); \
4671 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4672 if (gfc_check_vardef_context ((expr), false, false, false, \
4673 context) == false) \
4676 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4677 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4678 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4679 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4680 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4681 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4682 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4683 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4684 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4685 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4686 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4687 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4688 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4689 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4690 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4691 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4692 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4693 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4694 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4695 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4696 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4697 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4698 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4699 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4700 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4701 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4702 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4703 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4704 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4705 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4706 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4707 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4708 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4709 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4710 INQUIRE_RESOLVE_TAG (&tag_s_iqstream
, inquire
->iqstream
);
4711 INQUIRE_RESOLVE_TAG (&tag_v_share
, inquire
->share
);
4712 INQUIRE_RESOLVE_TAG (&tag_v_cc
, inquire
->cc
);
4713 #undef INQUIRE_RESOLVE_TAG
4715 if (!gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
))
4723 gfc_free_wait (gfc_wait
*wait
)
4728 gfc_free_expr (wait
->unit
);
4729 gfc_free_expr (wait
->iostat
);
4730 gfc_free_expr (wait
->iomsg
);
4731 gfc_free_expr (wait
->id
);
4737 gfc_resolve_wait (gfc_wait
*wait
)
4739 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4740 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4741 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4742 RESOLVE_TAG (&tag_id
, wait
->id
);
4744 if (!gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
))
4747 if (!gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
))
4753 /* Match an element of a WAIT statement. */
4755 #define RETM if (m != MATCH_NO) return m;
4758 match_wait_element (gfc_wait
*wait
)
4762 m
= match_etag (&tag_unit
, &wait
->unit
);
4763 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4764 RETM m
= match_ltag (&tag_end
, &wait
->end
);
4765 RETM m
= match_ltag (&tag_eor
, &wait
->eor
);
4766 RETM m
= match_etag (&tag_iomsg
, &wait
->iomsg
);
4767 if (m
== MATCH_YES
&& !check_char_variable (wait
->iomsg
))
4769 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4770 RETM m
= match_etag (&tag_id
, &wait
->id
);
4771 RETM
return MATCH_NO
;
4778 gfc_match_wait (void)
4783 m
= gfc_match_char ('(');
4787 wait
= XCNEW (gfc_wait
);
4789 m
= match_wait_element (wait
);
4790 if (m
== MATCH_ERROR
)
4794 m
= gfc_match_expr (&wait
->unit
);
4795 if (m
== MATCH_ERROR
)
4803 if (gfc_match_char (')') == MATCH_YES
)
4805 if (gfc_match_char (',') != MATCH_YES
)
4808 m
= match_wait_element (wait
);
4809 if (m
== MATCH_ERROR
)
4815 if (!gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4816 "not allowed in Fortran 95"))
4819 if (gfc_pure (NULL
))
4821 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4825 gfc_unset_implicit_pure (NULL
);
4827 new_st
.op
= EXEC_WAIT
;
4828 new_st
.ext
.wait
= wait
;
4833 gfc_syntax_error (ST_WAIT
);
4836 gfc_free_wait (wait
);