1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000-2016 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
30 format_asterisk
= {0, NULL
, NULL
, -1, ST_LABEL_FORMAT
, ST_LABEL_FORMAT
, NULL
,
31 0, {NULL
, NULL
}, NULL
};
35 const char *name
, *spec
, *value
;
41 tag_readonly
= {"READONLY", " readonly", NULL
, BT_UNKNOWN
},
42 tag_shared
= {"SHARE", " shared", NULL
, BT_UNKNOWN
},
43 tag_noshared
= {"SHARE", " noshared", NULL
, BT_UNKNOWN
},
44 tag_e_share
= {"SHARE", " share =", " %e", BT_CHARACTER
},
45 tag_v_share
= {"SHARE", " share =", " %v", BT_CHARACTER
},
46 tag_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %e",
48 tag_v_cc
= {"CARRIAGECONTROL", " carriagecontrol =", " %v",
50 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
51 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
52 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
53 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
54 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
55 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
56 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
57 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
58 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
59 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
60 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
61 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
62 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
63 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
64 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
65 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
66 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
67 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
68 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
69 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
70 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
71 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
72 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
73 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
74 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
75 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
76 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
77 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
78 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
79 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
80 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
81 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
82 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
83 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
84 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
85 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
86 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
87 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
88 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
89 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
90 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
91 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
92 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
93 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
94 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
95 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
96 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
97 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
98 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
99 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
100 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
101 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
102 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
103 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
104 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
105 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
106 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
107 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
},
108 tag_s_iqstream
= {"STREAM", " stream =", " %v", BT_CHARACTER
};
110 static gfc_dt
*current_dt
;
112 #define RESOLVE_TAG(x, y) if (!resolve_tag (x, y)) return false;
115 /**************** Fortran 95 FORMAT parser *****************/
117 /* FORMAT tokens returned by format_lex(). */
120 FMT_NONE
, FMT_UNKNOWN
, FMT_SIGNED_INT
, FMT_ZERO
, FMT_POSINT
, FMT_PERIOD
,
121 FMT_COMMA
, FMT_COLON
, FMT_SLASH
, FMT_DOLLAR
, FMT_LPAREN
,
122 FMT_RPAREN
, FMT_X
, FMT_SIGN
, FMT_BLANK
, FMT_CHAR
, FMT_P
, FMT_IBOZ
, FMT_F
,
123 FMT_E
, FMT_EN
, FMT_ES
, FMT_G
, FMT_L
, FMT_A
, FMT_D
, FMT_H
, FMT_END
,
124 FMT_ERROR
, FMT_DC
, FMT_DP
, FMT_T
, FMT_TR
, FMT_TL
, FMT_STAR
, FMT_RC
,
125 FMT_RD
, FMT_RN
, FMT_RP
, FMT_RU
, FMT_RZ
, FMT_DT
128 /* Local variables for checking format strings. The saved_token is
129 used to back up by a single format token during the parsing
131 static gfc_char_t
*format_string
;
132 static int format_string_pos
;
133 static int format_length
, use_last_char
;
134 static char error_element
;
135 static locus format_locus
;
137 static format_token saved_token
;
140 { MODE_STRING
, MODE_FORMAT
, MODE_COPY
}
144 /* Return the next character in the format string. */
147 next_char (gfc_instring in_string
)
159 if (mode
== MODE_STRING
)
160 c
= *format_string
++;
163 c
= gfc_next_char_literal (in_string
);
168 if (flag_backslash
&& c
== '\\')
170 locus old_locus
= gfc_current_locus
;
172 if (gfc_match_special_char (&c
) == MATCH_NO
)
173 gfc_current_locus
= old_locus
;
175 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
176 gfc_warning (0, "Extension: backslash character at %C");
179 if (mode
== MODE_COPY
)
180 *format_string
++ = c
;
182 if (mode
!= MODE_STRING
)
183 format_locus
= gfc_current_locus
;
187 c
= gfc_wide_toupper (c
);
192 /* Back up one character position. Only works once. */
200 /* Eat up the spaces and return a character. */
203 next_char_not_space (bool *error
)
208 error_element
= c
= next_char (NONSTRING
);
211 if (gfc_option
.allow_std
& GFC_STD_GNU
)
212 gfc_warning (0, "Extension: Tab character in format at %C");
215 gfc_error ("Extension: Tab character in format at %C");
221 while (gfc_is_whitespace (c
));
225 static int value
= 0;
227 /* Simple lexical analyzer for getting the next token in a FORMAT
239 if (saved_token
!= FMT_NONE
)
242 saved_token
= FMT_NONE
;
246 c
= next_char_not_space (&error
);
256 c
= next_char_not_space (&error
);
267 c
= next_char_not_space (&error
);
269 value
= 10 * value
+ c
- '0';
278 token
= FMT_SIGNED_INT
;
297 c
= next_char_not_space (&error
);
300 value
= 10 * value
+ c
- '0';
308 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
332 c
= next_char_not_space (&error
);
360 c
= next_char_not_space (&error
);
361 if (c
!= 'P' && c
!= 'S')
368 c
= next_char_not_space (&error
);
369 if (c
== 'N' || c
== 'Z')
387 c
= next_char (INSTRING_WARN
);
396 c
= next_char (NONSTRING
);
430 c
= next_char_not_space (&error
);
460 c
= next_char_not_space (&error
);
463 if (!gfc_notify_std (GFC_STD_F2003
, "DP format "
464 "specifier not allowed at %C"))
470 if (!gfc_notify_std (GFC_STD_F2003
, "DC format "
471 "specifier not allowed at %C"))
477 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DT format "
478 "specifier not allowed at %C"))
481 c
= next_char_not_space (&error
);
482 if (c
== '\'' || c
== '"')
489 c
= next_char (INSTRING_WARN
);
498 c
= next_char (NONSTRING
);
521 c
= next_char_not_space (&error
);
570 token_to_string (format_token t
)
589 /* Check a format statement. The format string, either from a FORMAT
590 statement or a constant in an I/O statement has already been parsed
591 by itself, and we are checking it for validity. The dual origin
592 means that the warning message is a little less than great. */
595 check_format (bool is_input
)
597 const char *posint_required
= _("Positive width required");
598 const char *nonneg_required
= _("Nonnegative width required");
599 const char *unexpected_element
= _("Unexpected element %qc in format "
601 const char *unexpected_end
= _("Unexpected end of format string");
602 const char *zero_width
= _("Zero width in format descriptor");
611 saved_token
= FMT_NONE
;
615 format_string_pos
= 0;
622 error
= _("Missing leading left parenthesis");
630 goto finished
; /* Empty format is legal */
634 /* In this state, the next thing has to be a format item. */
651 error
= _("Left parenthesis required after %<*%>");
676 /* Signed integer can only precede a P format. */
682 error
= _("Expected P edit descriptor");
689 /* P requires a prior number. */
690 error
= _("P descriptor requires leading scale factor");
694 /* X requires a prior number if we're being pedantic. */
695 if (mode
!= MODE_FORMAT
)
696 format_locus
.nextc
+= format_string_pos
;
697 if (!gfc_notify_std (GFC_STD_GNU
, "X descriptor requires leading "
698 "space count at %L", &format_locus
))
726 error
= posint_required
;
738 error
= _("Right parenthesis expected at %C");
744 error
= unexpected_element
;
763 goto extension_optional_comma
;
774 if (!gfc_notify_std (GFC_STD_GNU
, "$ descriptor at %L", &format_locus
))
776 if (t
!= FMT_RPAREN
|| level
> 0)
778 gfc_warning (0, "$ should be the last specifier in format at %L",
780 goto optional_comma_1
;
801 error
= unexpected_end
;
805 error
= unexpected_element
;
810 /* In this state, t must currently be a data descriptor.
811 Deal with things that can/must follow the descriptor. */
822 /* No comma after P allowed only for F, E, EN, ES, D, or G.
827 if (!(gfc_option
.allow_std
& GFC_STD_F2003
) && t
!= FMT_COMMA
828 && t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
829 && t
!= FMT_D
&& t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
831 error
= _("Comma required after P descriptor");
842 if (t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
&& t
!= FMT_D
843 && t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
845 error
= _("Comma required after P descriptor");
859 error
= _("Positive width required with T descriptor");
871 switch (gfc_notification_std (GFC_STD_GNU
))
874 if (mode
!= MODE_FORMAT
)
875 format_locus
.nextc
+= format_string_pos
;
876 gfc_warning (0, "Extension: Missing positive width after L "
877 "descriptor at %L", &format_locus
);
882 error
= posint_required
;
913 if (t
== FMT_G
&& u
== FMT_ZERO
)
920 if (!gfc_notify_std (GFC_STD_F2008
, "%<G0%> in format at %L",
932 error
= posint_required
;
938 error
= _("E specifier not allowed with g0 descriptor");
947 format_locus
.nextc
+= format_string_pos
;
948 gfc_error ("Positive width required in format "
949 "specifier %s at %L", token_to_string (t
),
960 /* Warn if -std=legacy, otherwise error. */
961 format_locus
.nextc
+= format_string_pos
;
962 if (gfc_option
.warn_std
!= 0)
964 gfc_error ("Period required in format "
965 "specifier %s at %L", token_to_string (t
),
971 gfc_warning (0, "Period required in format "
972 "specifier %s at %L", token_to_string (t
),
974 /* If we go to finished, we need to unwind this
975 before the next round. */
976 format_locus
.nextc
-= format_string_pos
;
984 if (u
!= FMT_ZERO
&& u
!= FMT_POSINT
)
986 error
= nonneg_required
;
993 /* Look for optional exponent. */
1006 if (u
!= FMT_POSINT
)
1008 error
= _("Positive exponent width required");
1019 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1021 error
= nonneg_required
;
1024 else if (is_input
&& t
== FMT_ZERO
)
1026 error
= posint_required
;
1033 if (t
!= FMT_PERIOD
)
1035 /* Warn if -std=legacy, otherwise error. */
1036 if (gfc_option
.warn_std
!= 0)
1038 error
= _("Period required in format specifier");
1041 if (mode
!= MODE_FORMAT
)
1042 format_locus
.nextc
+= format_string_pos
;
1043 gfc_warning (0, "Period required in format specifier at %L",
1052 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1054 error
= nonneg_required
;
1061 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
1063 if (mode
!= MODE_FORMAT
)
1064 format_locus
.nextc
+= format_string_pos
;
1065 gfc_warning (0, "The H format specifier at %L is"
1066 " a Fortran 95 deleted feature", &format_locus
);
1068 if (mode
== MODE_STRING
)
1070 format_string
+= value
;
1071 format_length
-= value
;
1072 format_string_pos
+= repeat
;
1078 next_char (INSTRING_WARN
);
1088 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1090 error
= nonneg_required
;
1093 else if (is_input
&& t
== FMT_ZERO
)
1095 error
= posint_required
;
1102 if (t
!= FMT_PERIOD
)
1111 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1113 error
= nonneg_required
;
1121 error
= unexpected_element
;
1126 /* Between a descriptor and what comes next. */
1144 goto optional_comma
;
1147 error
= unexpected_end
;
1151 if (mode
!= MODE_FORMAT
)
1152 format_locus
.nextc
+= format_string_pos
- 1;
1153 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1155 /* If we do not actually return a failure, we need to unwind this
1156 before the next round. */
1157 if (mode
!= MODE_FORMAT
)
1158 format_locus
.nextc
-= format_string_pos
;
1163 /* Optional comma is a weird between state where we've just finished
1164 reading a colon, slash, dollar or P descriptor. */
1181 /* Assume that we have another format item. */
1188 extension_optional_comma
:
1189 /* As a GNU extension, permit a missing comma after a string literal. */
1206 goto optional_comma
;
1209 error
= unexpected_end
;
1213 if (mode
!= MODE_FORMAT
)
1214 format_locus
.nextc
+= format_string_pos
;
1215 if (!gfc_notify_std (GFC_STD_GNU
, "Missing comma at %L", &format_locus
))
1217 /* If we do not actually return a failure, we need to unwind this
1218 before the next round. */
1219 if (mode
!= MODE_FORMAT
)
1220 format_locus
.nextc
-= format_string_pos
;
1228 if (mode
!= MODE_FORMAT
)
1229 format_locus
.nextc
+= format_string_pos
;
1230 if (error
== unexpected_element
)
1231 gfc_error (error
, error_element
, &format_locus
);
1233 gfc_error ("%s in format string at %L", error
, &format_locus
);
1242 /* Given an expression node that is a constant string, see if it looks
1243 like a format string. */
1246 check_format_string (gfc_expr
*e
, bool is_input
)
1250 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1254 format_string
= e
->value
.character
.string
;
1256 /* More elaborate measures are needed to show where a problem is within a
1257 format string that has been calculated, but that's probably not worth the
1259 format_locus
= e
->where
;
1260 rv
= check_format (is_input
);
1261 /* check for extraneous characters at the end of an otherwise valid format
1262 string, like '(A10,I3)F5'
1263 start at the end and move back to the last character processed,
1265 if (rv
&& e
->value
.character
.length
> format_string_pos
)
1266 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1267 if (e
->value
.character
.string
[i
] != ' ')
1269 format_locus
.nextc
+= format_length
+ 1;
1271 "Extraneous characters in format at %L", &format_locus
);
1278 /************ Fortran I/O statement matchers *************/
1280 /* Match a FORMAT statement. This amounts to actually parsing the
1281 format descriptors in order to correctly locate the end of the
1285 gfc_match_format (void)
1290 if (gfc_current_ns
->proc_name
1291 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1293 gfc_error ("Format statement in module main block at %C");
1297 /* Before parsing the rest of a FORMAT statement, check F2008:c1206. */
1298 if ((gfc_current_state () == COMP_FUNCTION
1299 || gfc_current_state () == COMP_SUBROUTINE
)
1300 && gfc_state_stack
->previous
->state
== COMP_INTERFACE
)
1302 gfc_error ("FORMAT statement at %C cannot appear within an INTERFACE");
1306 if (gfc_statement_label
== NULL
)
1308 gfc_error ("Missing format label at %C");
1311 gfc_gobble_whitespace ();
1316 start
= gfc_current_locus
;
1318 if (!check_format (false))
1321 if (gfc_match_eos () != MATCH_YES
)
1323 gfc_syntax_error (ST_FORMAT
);
1327 /* The label doesn't get created until after the statement is done
1328 being matched, so we have to leave the string for later. */
1330 gfc_current_locus
= start
; /* Back to the beginning */
1333 new_st
.op
= EXEC_NOP
;
1335 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1336 NULL
, format_length
);
1337 format_string
= e
->value
.character
.string
;
1338 gfc_statement_label
->format
= e
;
1341 check_format (false); /* Guaranteed to succeed */
1342 gfc_match_eos (); /* Guaranteed to succeed */
1348 /* Check for a CHARACTER variable. The check for scalar is done in
1352 check_char_variable (gfc_expr
*e
)
1354 if (e
->expr_type
!= EXPR_VARIABLE
|| e
->ts
.type
!= BT_CHARACTER
)
1356 gfc_error("IOMSG must be a scalar-default-char-variable at %L", &e
->where
);
1364 is_char_type (const char *name
, gfc_expr
*e
)
1366 gfc_resolve_expr (e
);
1368 if (e
->ts
.type
!= BT_CHARACTER
)
1370 gfc_error ("%s requires a scalar-default-char-expr at %L",
1378 /* Match an expression I/O tag of some sort. */
1381 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1386 m
= gfc_match (tag
->spec
);
1390 m
= gfc_match (tag
->value
, &result
);
1393 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1399 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1400 gfc_free_expr (result
);
1409 /* Match a variable I/O tag of some sort. */
1412 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1417 m
= gfc_match (tag
->spec
);
1421 m
= gfc_match (tag
->value
, &result
);
1424 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1430 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1431 gfc_free_expr (result
);
1435 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1437 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1438 gfc_free_expr (result
);
1442 bool impure
= gfc_impure_variable (result
->symtree
->n
.sym
);
1443 if (impure
&& gfc_pure (NULL
))
1445 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1447 gfc_free_expr (result
);
1452 gfc_unset_implicit_pure (NULL
);
1459 /* Match I/O tags that cause variables to become redefined. */
1462 match_out_tag (const io_tag
*tag
, gfc_expr
**result
)
1466 m
= match_vtag (tag
, result
);
1468 gfc_check_do_variable ((*result
)->symtree
);
1474 /* Match a label I/O tag. */
1477 match_ltag (const io_tag
*tag
, gfc_st_label
** label
)
1483 m
= gfc_match (tag
->spec
);
1487 m
= gfc_match (tag
->value
, label
);
1490 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1496 gfc_error ("Duplicate %s label specification at %C", tag
->name
);
1500 if (!gfc_reference_st_label (*label
, ST_LABEL_TARGET
))
1507 /* Match a tag using match_etag, but only if -fdec is enabled. */
1509 match_dec_etag (const io_tag
*tag
, gfc_expr
**e
)
1511 match m
= match_etag (tag
, e
);
1512 if (flag_dec
&& m
!= MATCH_NO
)
1514 else if (m
!= MATCH_NO
)
1516 gfc_error ("%s is a DEC extension at %C, re-compile with "
1517 "-fdec to enable", tag
->name
);
1524 /* Match a tag using match_vtag, but only if -fdec is enabled. */
1526 match_dec_vtag (const io_tag
*tag
, gfc_expr
**e
)
1528 match m
= match_vtag(tag
, e
);
1529 if (flag_dec
&& m
!= MATCH_NO
)
1531 else if (m
!= MATCH_NO
)
1533 gfc_error ("%s is a DEC extension at %C, re-compile with "
1534 "-fdec to enable", tag
->name
);
1541 /* Match a DEC I/O flag tag - a tag with no expression such as READONLY. */
1544 match_dec_ftag (const io_tag
*tag
, gfc_open
*o
)
1548 m
= gfc_match (tag
->spec
);
1554 gfc_error ("%s is a DEC extension at %C, re-compile with "
1555 "-fdec to enable", tag
->name
);
1559 /* Just set the READONLY flag, which we use at runtime to avoid delete on
1561 if (tag
== &tag_readonly
)
1567 /* Interpret SHARED as SHARE='DENYNONE' (read lock). */
1568 else if (tag
== &tag_shared
)
1570 if (o
->share
!= NULL
)
1572 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1575 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1576 &gfc_current_locus
, "denynone", 8);
1580 /* Interpret NOSHARED as SHARE='DENYRW' (exclusive lock). */
1581 else if (tag
== &tag_noshared
)
1583 if (o
->share
!= NULL
)
1585 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1588 o
->share
= gfc_get_character_expr (gfc_default_character_kind
,
1589 &gfc_current_locus
, "denyrw", 6);
1593 /* We handle all DEC tags above. */
1598 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1601 resolve_tag_format (const gfc_expr
*e
)
1603 if (e
->expr_type
== EXPR_CONSTANT
1604 && (e
->ts
.type
!= BT_CHARACTER
1605 || e
->ts
.kind
!= gfc_default_character_kind
))
1607 gfc_error ("Constant expression in FORMAT tag at %L must be "
1608 "of type default CHARACTER", &e
->where
);
1612 /* If e's rank is zero and e is not an element of an array, it should be
1613 of integer or character type. The integer variable should be
1616 && (e
->expr_type
!= EXPR_VARIABLE
1617 || e
->symtree
== NULL
1618 || e
->symtree
->n
.sym
->as
== NULL
1619 || e
->symtree
->n
.sym
->as
->rank
== 0))
1621 if ((e
->ts
.type
!= BT_CHARACTER
1622 || e
->ts
.kind
!= gfc_default_character_kind
)
1623 && e
->ts
.type
!= BT_INTEGER
)
1625 gfc_error ("FORMAT tag at %L must be of type default-kind CHARACTER "
1626 "or of INTEGER", &e
->where
);
1629 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1631 if (!gfc_notify_std (GFC_STD_F95_DEL
, "ASSIGNED variable in "
1632 "FORMAT tag at %L", &e
->where
))
1634 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1636 gfc_error ("Variable %qs at %L has not been assigned a "
1637 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1641 else if (e
->ts
.type
== BT_INTEGER
)
1643 gfc_error ("Scalar %qs in FORMAT tag at %L is not an ASSIGNED "
1644 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1651 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1652 It may be assigned an Hollerith constant. */
1653 if (e
->ts
.type
!= BT_CHARACTER
)
1655 if (!gfc_notify_std (GFC_STD_LEGACY
, "Non-character in FORMAT tag "
1656 "at %L", &e
->where
))
1659 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1661 gfc_error ("Non-character assumed shape array element in FORMAT"
1662 " tag at %L", &e
->where
);
1666 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1668 gfc_error ("Non-character assumed size array element in FORMAT"
1669 " tag at %L", &e
->where
);
1673 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1675 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1685 /* Do expression resolution and type-checking on an expression tag. */
1688 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1693 if (!gfc_resolve_expr (e
))
1696 if (tag
== &tag_format
)
1697 return resolve_tag_format (e
);
1699 if (e
->ts
.type
!= tag
->type
)
1701 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1702 &e
->where
, gfc_basic_typename (tag
->type
));
1706 if (e
->ts
.type
== BT_CHARACTER
&& e
->ts
.kind
!= gfc_default_character_kind
)
1708 gfc_error ("%s tag at %L must be a character string of default kind",
1709 tag
->name
, &e
->where
);
1715 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1719 if (tag
== &tag_iomsg
)
1721 if (!gfc_notify_std (GFC_STD_F2003
, "IOMSG tag at %L", &e
->where
))
1725 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
1726 || tag
== &tag_number
|| tag
== &tag_nextrec
|| tag
== &tag_s_recl
)
1727 && e
->ts
.kind
!= gfc_default_integer_kind
)
1729 if (!gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1730 "INTEGER in %s tag at %L", tag
->name
, &e
->where
))
1734 if (e
->ts
.kind
!= gfc_default_logical_kind
&&
1735 (tag
== &tag_exist
|| tag
== &tag_named
|| tag
== &tag_opened
1736 || tag
== &tag_pending
))
1738 if (!gfc_notify_std (GFC_STD_F2008
, "Non-default LOGICAL kind "
1739 "in %s tag at %L", tag
->name
, &e
->where
))
1743 if (tag
== &tag_newunit
)
1745 if (!gfc_notify_std (GFC_STD_F2008
, "NEWUNIT specifier at %L",
1750 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1751 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1752 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1756 sprintf (context
, _("%s tag"), tag
->name
);
1757 if (!gfc_check_vardef_context (e
, false, false, false, context
))
1761 if (tag
== &tag_convert
)
1763 if (!gfc_notify_std (GFC_STD_GNU
, "CONVERT tag at %L", &e
->where
))
1771 /* Match a single tag of an OPEN statement. */
1774 match_open_element (gfc_open
*open
)
1778 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1779 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
1783 m
= match_etag (&tag_unit
, &open
->unit
);
1786 m
= match_etag (&tag_iomsg
, &open
->iomsg
);
1787 if (m
== MATCH_YES
&& !check_char_variable (open
->iomsg
))
1791 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1794 m
= match_etag (&tag_file
, &open
->file
);
1797 m
= match_etag (&tag_status
, &open
->status
);
1800 m
= match_etag (&tag_e_access
, &open
->access
);
1803 m
= match_etag (&tag_e_form
, &open
->form
);
1806 m
= match_etag (&tag_e_recl
, &open
->recl
);
1809 m
= match_etag (&tag_e_blank
, &open
->blank
);
1812 m
= match_etag (&tag_e_position
, &open
->position
);
1815 m
= match_etag (&tag_e_action
, &open
->action
);
1818 m
= match_etag (&tag_e_delim
, &open
->delim
);
1821 m
= match_etag (&tag_e_pad
, &open
->pad
);
1824 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1827 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1830 m
= match_etag (&tag_e_round
, &open
->round
);
1833 m
= match_etag (&tag_e_sign
, &open
->sign
);
1836 m
= match_ltag (&tag_err
, &open
->err
);
1839 m
= match_etag (&tag_convert
, &open
->convert
);
1842 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1846 /* The following are extensions enabled with -fdec. */
1847 m
= match_dec_etag (&tag_e_share
, &open
->share
);
1850 m
= match_dec_etag (&tag_cc
, &open
->cc
);
1853 m
= match_dec_ftag (&tag_readonly
, open
);
1856 m
= match_dec_ftag (&tag_shared
, open
);
1859 m
= match_dec_ftag (&tag_noshared
, open
);
1867 /* Free the gfc_open structure and all the expressions it contains. */
1870 gfc_free_open (gfc_open
*open
)
1875 gfc_free_expr (open
->unit
);
1876 gfc_free_expr (open
->iomsg
);
1877 gfc_free_expr (open
->iostat
);
1878 gfc_free_expr (open
->file
);
1879 gfc_free_expr (open
->status
);
1880 gfc_free_expr (open
->access
);
1881 gfc_free_expr (open
->form
);
1882 gfc_free_expr (open
->recl
);
1883 gfc_free_expr (open
->blank
);
1884 gfc_free_expr (open
->position
);
1885 gfc_free_expr (open
->action
);
1886 gfc_free_expr (open
->delim
);
1887 gfc_free_expr (open
->pad
);
1888 gfc_free_expr (open
->decimal
);
1889 gfc_free_expr (open
->encoding
);
1890 gfc_free_expr (open
->round
);
1891 gfc_free_expr (open
->sign
);
1892 gfc_free_expr (open
->convert
);
1893 gfc_free_expr (open
->asynchronous
);
1894 gfc_free_expr (open
->newunit
);
1895 gfc_free_expr (open
->share
);
1896 gfc_free_expr (open
->cc
);
1901 /* Resolve everything in a gfc_open structure. */
1904 gfc_resolve_open (gfc_open
*open
)
1907 RESOLVE_TAG (&tag_unit
, open
->unit
);
1908 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1909 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1910 RESOLVE_TAG (&tag_file
, open
->file
);
1911 RESOLVE_TAG (&tag_status
, open
->status
);
1912 RESOLVE_TAG (&tag_e_access
, open
->access
);
1913 RESOLVE_TAG (&tag_e_form
, open
->form
);
1914 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1915 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1916 RESOLVE_TAG (&tag_e_position
, open
->position
);
1917 RESOLVE_TAG (&tag_e_action
, open
->action
);
1918 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1919 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1920 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1921 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1922 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1923 RESOLVE_TAG (&tag_e_round
, open
->round
);
1924 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1925 RESOLVE_TAG (&tag_convert
, open
->convert
);
1926 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1927 RESOLVE_TAG (&tag_e_share
, open
->share
);
1928 RESOLVE_TAG (&tag_cc
, open
->cc
);
1930 if (!gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
))
1937 /* Check if a given value for a SPECIFIER is either in the list of values
1938 allowed in F95 or F2003, issuing an error message and returning a zero
1939 value if it is not allowed. */
1942 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1943 const char *allowed_f2003
[],
1944 const char *allowed_gnu
[], gfc_char_t
*value
,
1945 const char *statement
, bool warn
)
1950 len
= gfc_wide_strlen (value
);
1953 for (len
--; len
> 0; len
--)
1954 if (value
[len
] != ' ')
1959 for (i
= 0; allowed
[i
]; i
++)
1960 if (len
== strlen (allowed
[i
])
1961 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
1964 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
1965 if (len
== strlen (allowed_f2003
[i
])
1966 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
1967 strlen (allowed_f2003
[i
])) == 0)
1969 notification n
= gfc_notification_std (GFC_STD_F2003
);
1971 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1973 gfc_warning (0, "Fortran 2003: %s specifier in %s statement at %C "
1974 "has value %qs", specifier
, statement
,
1981 gfc_notify_std (GFC_STD_F2003
, "%s specifier in "
1982 "%s statement at %C has value %qs", specifier
,
1983 statement
, allowed_f2003
[i
]);
1991 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
1992 if (len
== strlen (allowed_gnu
[i
])
1993 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
1994 strlen (allowed_gnu
[i
])) == 0)
1996 notification n
= gfc_notification_std (GFC_STD_GNU
);
1998 if (n
== WARNING
|| (warn
&& n
== ERROR
))
2000 gfc_warning (0, "Extension: %s specifier in %s statement at %C "
2001 "has value %qs", specifier
, statement
,
2008 gfc_notify_std (GFC_STD_GNU
, "%s specifier in "
2009 "%s statement at %C has value %qs", specifier
,
2010 statement
, allowed_gnu
[i
]);
2020 char *s
= gfc_widechar_to_char (value
, -1);
2022 "%s specifier in %s statement at %C has invalid value %qs",
2023 specifier
, statement
, s
);
2029 char *s
= gfc_widechar_to_char (value
, -1);
2030 gfc_error ("%s specifier in %s statement at %C has invalid value %qs",
2031 specifier
, statement
, s
);
2038 /* Match an OPEN statement. */
2041 gfc_match_open (void)
2047 m
= gfc_match_char ('(');
2051 open
= XCNEW (gfc_open
);
2053 m
= match_open_element (open
);
2055 if (m
== MATCH_ERROR
)
2059 m
= gfc_match_expr (&open
->unit
);
2060 if (m
== MATCH_ERROR
)
2066 if (gfc_match_char (')') == MATCH_YES
)
2068 if (gfc_match_char (',') != MATCH_YES
)
2071 m
= match_open_element (open
);
2072 if (m
== MATCH_ERROR
)
2078 if (gfc_match_eos () == MATCH_NO
)
2081 if (gfc_pure (NULL
))
2083 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
2087 gfc_unset_implicit_pure (NULL
);
2089 warn
= (open
->err
|| open
->iostat
) ? true : false;
2091 /* Checks on NEWUNIT specifier. */
2096 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
2100 if (!open
->file
&& open
->status
)
2102 if (open
->status
->expr_type
== EXPR_CONSTANT
2103 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2106 gfc_error ("NEWUNIT specifier must have FILE= "
2107 "or STATUS='scratch' at %C");
2112 else if (!open
->unit
)
2114 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
2118 /* Checks on the ACCESS specifier. */
2119 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
2121 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
2122 static const char *access_f2003
[] = { "STREAM", NULL
};
2123 static const char *access_gnu
[] = { "APPEND", NULL
};
2125 if (!is_char_type ("ACCESS", open
->access
))
2128 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
2130 open
->access
->value
.character
.string
,
2135 /* Checks on the ACTION specifier. */
2136 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
2138 gfc_char_t
*str
= open
->action
->value
.character
.string
;
2139 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
2141 if (!is_char_type ("ACTION", open
->action
))
2144 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
2148 /* With READONLY, only allow ACTION='READ'. */
2149 if (open
->readonly
&& (gfc_wide_strlen (str
) != 4
2150 || gfc_wide_strncasecmp (str
, "READ", 4) != 0))
2152 gfc_error ("ACTION type conflicts with READONLY specifier at %C");
2156 /* If we see READONLY and no ACTION, set ACTION='READ'. */
2157 else if (open
->readonly
&& open
->action
== NULL
)
2159 open
->action
= gfc_get_character_expr (gfc_default_character_kind
,
2160 &gfc_current_locus
, "read", 4);
2163 /* Checks on the ASYNCHRONOUS specifier. */
2164 if (open
->asynchronous
)
2166 if (!gfc_notify_std (GFC_STD_F2003
, "ASYNCHRONOUS= at %C "
2167 "not allowed in Fortran 95"))
2170 if (!is_char_type ("ASYNCHRONOUS", open
->asynchronous
))
2173 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
2175 static const char * asynchronous
[] = { "YES", "NO", NULL
};
2177 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
2178 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
2184 /* Checks on the BLANK specifier. */
2187 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
2188 "not allowed in Fortran 95"))
2191 if (!is_char_type ("BLANK", open
->blank
))
2194 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
2196 static const char *blank
[] = { "ZERO", "NULL", NULL
};
2198 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
2199 open
->blank
->value
.character
.string
,
2205 /* Checks on the CARRIAGECONTROL specifier. */
2208 if (!is_char_type ("CARRIAGECONTROL", open
->cc
))
2211 if (open
->cc
->expr_type
== EXPR_CONSTANT
)
2213 static const char *cc
[] = { "LIST", "FORTRAN", "NONE", NULL
};
2214 if (!compare_to_allowed_values ("CARRIAGECONTROL", cc
, NULL
, NULL
,
2215 open
->cc
->value
.character
.string
,
2221 /* Checks on the DECIMAL specifier. */
2224 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
2225 "not allowed in Fortran 95"))
2228 if (!is_char_type ("DECIMAL", open
->decimal
))
2231 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
2233 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
2235 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
2236 open
->decimal
->value
.character
.string
,
2242 /* Checks on the DELIM specifier. */
2245 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
2247 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
2249 if (!is_char_type ("DELIM", open
->delim
))
2252 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
2253 open
->delim
->value
.character
.string
,
2259 /* Checks on the ENCODING specifier. */
2262 if (!gfc_notify_std (GFC_STD_F2003
, "ENCODING= at %C "
2263 "not allowed in Fortran 95"))
2266 if (!is_char_type ("ENCODING", open
->encoding
))
2269 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
2271 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
2273 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
2274 open
->encoding
->value
.character
.string
,
2280 /* Checks on the FORM specifier. */
2281 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
2283 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
2285 if (!is_char_type ("FORM", open
->form
))
2288 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
2289 open
->form
->value
.character
.string
,
2294 /* Checks on the PAD specifier. */
2295 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
2297 static const char *pad
[] = { "YES", "NO", NULL
};
2299 if (!is_char_type ("PAD", open
->pad
))
2302 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
2303 open
->pad
->value
.character
.string
,
2308 /* Checks on the POSITION specifier. */
2309 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
2311 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
2313 if (!is_char_type ("POSITION", open
->position
))
2316 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
2317 open
->position
->value
.character
.string
,
2322 /* Checks on the ROUND specifier. */
2325 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
2326 "not allowed in Fortran 95"))
2329 if (!is_char_type ("ROUND", open
->round
))
2332 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2334 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2335 "COMPATIBLE", "PROCESSOR_DEFINED",
2338 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2339 open
->round
->value
.character
.string
,
2345 /* Checks on the SHARE specifier. */
2348 if (!is_char_type ("SHARE", open
->share
))
2351 if (open
->share
->expr_type
== EXPR_CONSTANT
)
2353 static const char *share
[] = { "DENYNONE", "DENYRW", NULL
};
2354 if (!compare_to_allowed_values ("SHARE", share
, NULL
, NULL
,
2355 open
->share
->value
.character
.string
,
2361 /* Checks on the SIGN specifier. */
2364 if (!gfc_notify_std (GFC_STD_F2003
, "SIGN= at %C "
2365 "not allowed in Fortran 95"))
2368 if (!is_char_type ("SIGN", open
->sign
))
2371 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2373 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2376 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2377 open
->sign
->value
.character
.string
,
2383 #define warn_or_error(...) \
2386 gfc_warning (0, __VA_ARGS__); \
2389 gfc_error (__VA_ARGS__); \
2394 /* Checks on the RECL specifier. */
2395 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2396 && open
->recl
->ts
.type
== BT_INTEGER
2397 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2399 warn_or_error ("RECL in OPEN statement at %C must be positive");
2402 /* Checks on the STATUS specifier. */
2403 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2405 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2406 "REPLACE", "UNKNOWN", NULL
};
2408 if (!is_char_type ("STATUS", open
->status
))
2411 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2412 open
->status
->value
.character
.string
,
2416 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2417 the FILE= specifier shall appear. */
2418 if (open
->file
== NULL
2419 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2421 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2424 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2426 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2427 "%qs and no FILE specifier is present", s
);
2431 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2432 the FILE= specifier shall not appear. */
2433 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2434 "scratch", 7) == 0 && open
->file
)
2436 warn_or_error ("The STATUS specified in OPEN statement at %C "
2437 "cannot have the value SCRATCH if a FILE specifier "
2442 /* Things that are not allowed for unformatted I/O. */
2443 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2444 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2445 || open
->sign
|| open
->pad
|| open
->blank
)
2446 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2447 "unformatted", 11) == 0)
2449 const char *spec
= (open
->delim
? "DELIM "
2450 : (open
->pad
? "PAD " : open
->blank
2453 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2454 "unformatted I/O", spec
);
2457 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2458 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2461 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2466 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2467 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2468 "sequential", 10) == 0
2469 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2471 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2474 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2475 "for stream or sequential ACCESS");
2478 #undef warn_or_error
2480 new_st
.op
= EXEC_OPEN
;
2481 new_st
.ext
.open
= open
;
2485 gfc_syntax_error (ST_OPEN
);
2488 gfc_free_open (open
);
2493 /* Free a gfc_close structure an all its expressions. */
2496 gfc_free_close (gfc_close
*close
)
2501 gfc_free_expr (close
->unit
);
2502 gfc_free_expr (close
->iomsg
);
2503 gfc_free_expr (close
->iostat
);
2504 gfc_free_expr (close
->status
);
2509 /* Match elements of a CLOSE statement. */
2512 match_close_element (gfc_close
*close
)
2516 m
= match_etag (&tag_unit
, &close
->unit
);
2519 m
= match_etag (&tag_status
, &close
->status
);
2522 m
= match_etag (&tag_iomsg
, &close
->iomsg
);
2523 if (m
== MATCH_YES
&& !check_char_variable (close
->iomsg
))
2527 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2530 m
= match_ltag (&tag_err
, &close
->err
);
2538 /* Match a CLOSE statement. */
2541 gfc_match_close (void)
2547 m
= gfc_match_char ('(');
2551 close
= XCNEW (gfc_close
);
2553 m
= match_close_element (close
);
2555 if (m
== MATCH_ERROR
)
2559 m
= gfc_match_expr (&close
->unit
);
2562 if (m
== MATCH_ERROR
)
2568 if (gfc_match_char (')') == MATCH_YES
)
2570 if (gfc_match_char (',') != MATCH_YES
)
2573 m
= match_close_element (close
);
2574 if (m
== MATCH_ERROR
)
2580 if (gfc_match_eos () == MATCH_NO
)
2583 if (gfc_pure (NULL
))
2585 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2589 gfc_unset_implicit_pure (NULL
);
2591 warn
= (close
->iostat
|| close
->err
) ? true : false;
2593 /* Checks on the STATUS specifier. */
2594 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2596 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2598 if (!is_char_type ("STATUS", close
->status
))
2601 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2602 close
->status
->value
.character
.string
,
2607 new_st
.op
= EXEC_CLOSE
;
2608 new_st
.ext
.close
= close
;
2612 gfc_syntax_error (ST_CLOSE
);
2615 gfc_free_close (close
);
2620 /* Resolve everything in a gfc_close structure. */
2623 gfc_resolve_close (gfc_close
*close
)
2625 RESOLVE_TAG (&tag_unit
, close
->unit
);
2626 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2627 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2628 RESOLVE_TAG (&tag_status
, close
->status
);
2630 if (!gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
))
2633 if (close
->unit
== NULL
)
2635 /* Find a locus from one of the arguments to close, when UNIT is
2637 locus loc
= gfc_current_locus
;
2639 loc
= close
->status
->where
;
2640 else if (close
->iostat
)
2641 loc
= close
->iostat
->where
;
2642 else if (close
->iomsg
)
2643 loc
= close
->iomsg
->where
;
2644 else if (close
->err
)
2645 loc
= close
->err
->where
;
2647 gfc_error ("CLOSE statement at %L requires a UNIT number", &loc
);
2651 if (close
->unit
->expr_type
== EXPR_CONSTANT
2652 && close
->unit
->ts
.type
== BT_INTEGER
2653 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2655 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2656 &close
->unit
->where
);
2663 /* Free a gfc_filepos structure. */
2666 gfc_free_filepos (gfc_filepos
*fp
)
2668 gfc_free_expr (fp
->unit
);
2669 gfc_free_expr (fp
->iomsg
);
2670 gfc_free_expr (fp
->iostat
);
2675 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2678 match_file_element (gfc_filepos
*fp
)
2682 m
= match_etag (&tag_unit
, &fp
->unit
);
2685 m
= match_etag (&tag_iomsg
, &fp
->iomsg
);
2686 if (m
== MATCH_YES
&& !check_char_variable (fp
->iomsg
))
2690 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2693 m
= match_ltag (&tag_err
, &fp
->err
);
2701 /* Match the second half of the file-positioning statements, REWIND,
2702 BACKSPACE, ENDFILE, or the FLUSH statement. */
2705 match_filepos (gfc_statement st
, gfc_exec_op op
)
2710 fp
= XCNEW (gfc_filepos
);
2712 if (gfc_match_char ('(') == MATCH_NO
)
2714 m
= gfc_match_expr (&fp
->unit
);
2715 if (m
== MATCH_ERROR
)
2723 m
= match_file_element (fp
);
2724 if (m
== MATCH_ERROR
)
2728 m
= gfc_match_expr (&fp
->unit
);
2729 if (m
== MATCH_ERROR
|| m
== MATCH_NO
)
2735 if (gfc_match_char (')') == MATCH_YES
)
2737 if (gfc_match_char (',') != MATCH_YES
)
2740 m
= match_file_element (fp
);
2741 if (m
== MATCH_ERROR
)
2748 if (gfc_match_eos () != MATCH_YES
)
2751 if (gfc_pure (NULL
))
2753 gfc_error ("%s statement not allowed in PURE procedure at %C",
2754 gfc_ascii_statement (st
));
2759 gfc_unset_implicit_pure (NULL
);
2762 new_st
.ext
.filepos
= fp
;
2766 gfc_syntax_error (st
);
2769 gfc_free_filepos (fp
);
2775 gfc_resolve_filepos (gfc_filepos
*fp
)
2777 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2778 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2779 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2780 if (!gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
))
2783 if (!fp
->unit
&& (fp
->iostat
|| fp
->iomsg
))
2786 where
= fp
->iostat
? fp
->iostat
->where
: fp
->iomsg
->where
;
2787 gfc_error ("UNIT number missing in statement at %L", &where
);
2791 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2792 && fp
->unit
->ts
.type
== BT_INTEGER
2793 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2795 gfc_error ("UNIT number in statement at %L must be non-negative",
2804 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2805 and the FLUSH statement. */
2808 gfc_match_endfile (void)
2810 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2814 gfc_match_backspace (void)
2816 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2820 gfc_match_rewind (void)
2822 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2826 gfc_match_flush (void)
2828 if (!gfc_notify_std (GFC_STD_F2003
, "FLUSH statement at %C"))
2831 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2834 /******************** Data Transfer Statements *********************/
2836 /* Return a default unit number. */
2839 default_unit (io_kind k
)
2848 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2852 /* Match a unit specification for a data transfer statement. */
2855 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2860 if (gfc_match_char ('*') == MATCH_YES
)
2862 if (dt
->io_unit
!= NULL
)
2865 dt
->io_unit
= default_unit (k
);
2867 c
= gfc_peek_ascii_char ();
2869 gfc_error_now ("Missing format with default unit at %C");
2874 if (gfc_match_expr (&e
) == MATCH_YES
)
2876 if (dt
->io_unit
!= NULL
)
2889 gfc_error ("Duplicate UNIT specification at %C");
2894 /* Match a format specification. */
2897 match_dt_format (gfc_dt
*dt
)
2901 gfc_st_label
*label
;
2904 where
= gfc_current_locus
;
2906 if (gfc_match_char ('*') == MATCH_YES
)
2908 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2911 dt
->format_label
= &format_asterisk
;
2915 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2919 /* Need to check if the format label is actually either an operand
2920 to a user-defined operator or is a kind type parameter. That is,
2921 print 2.ip.8 ! .ip. is a user-defined operator return CHARACTER.
2922 print 1_'(I0)', i ! 1_'(I0)' is a default character string. */
2924 gfc_gobble_whitespace ();
2925 c
= gfc_peek_ascii_char ();
2926 if (c
== '.' || c
== '_')
2927 gfc_current_locus
= where
;
2930 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2932 gfc_free_st_label (label
);
2936 if (!gfc_reference_st_label (label
, ST_LABEL_FORMAT
))
2939 dt
->format_label
= label
;
2943 else if (m
== MATCH_ERROR
)
2944 /* The label was zero or too large. Emit the correct diagnosis. */
2947 if (gfc_match_expr (&e
) == MATCH_YES
)
2949 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2954 dt
->format_expr
= e
;
2958 gfc_current_locus
= where
; /* The only case where we have to restore */
2963 gfc_error ("Duplicate format specification at %C");
2968 /* Traverse a namelist that is part of a READ statement to make sure
2969 that none of the variables in the namelist are INTENT(IN). Returns
2970 nonzero if we find such a variable. */
2973 check_namelist (gfc_symbol
*sym
)
2977 for (p
= sym
->namelist
; p
; p
= p
->next
)
2978 if (p
->sym
->attr
.intent
== INTENT_IN
)
2980 gfc_error ("Symbol %qs in namelist %qs is INTENT(IN) at %C",
2981 p
->sym
->name
, sym
->name
);
2989 /* Match a single data transfer element. */
2992 match_dt_element (io_kind k
, gfc_dt
*dt
)
2994 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2998 if (gfc_match (" unit =") == MATCH_YES
)
3000 m
= match_dt_unit (k
, dt
);
3005 if (gfc_match (" fmt =") == MATCH_YES
)
3007 m
= match_dt_format (dt
);
3012 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
3014 if (dt
->namelist
!= NULL
)
3016 gfc_error ("Duplicate NML specification at %C");
3020 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
3023 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
3025 gfc_error ("Symbol %qs at %C must be a NAMELIST group name",
3026 sym
!= NULL
? sym
->name
: name
);
3031 if (k
== M_READ
&& check_namelist (sym
))
3037 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
3038 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3042 m
= match_etag (&tag_e_blank
, &dt
->blank
);
3045 m
= match_etag (&tag_e_delim
, &dt
->delim
);
3048 m
= match_etag (&tag_e_pad
, &dt
->pad
);
3051 m
= match_etag (&tag_e_sign
, &dt
->sign
);
3054 m
= match_etag (&tag_e_round
, &dt
->round
);
3057 m
= match_out_tag (&tag_id
, &dt
->id
);
3060 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
3063 m
= match_etag (&tag_rec
, &dt
->rec
);
3066 m
= match_etag (&tag_spos
, &dt
->pos
);
3069 m
= match_etag (&tag_iomsg
, &dt
->iomsg
);
3070 if (m
== MATCH_YES
&& !check_char_variable (dt
->iomsg
))
3075 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
3078 m
= match_ltag (&tag_err
, &dt
->err
);
3080 dt
->err_where
= gfc_current_locus
;
3083 m
= match_etag (&tag_advance
, &dt
->advance
);
3086 m
= match_out_tag (&tag_size
, &dt
->size
);
3090 m
= match_ltag (&tag_end
, &dt
->end
);
3095 gfc_error ("END tag at %C not allowed in output statement");
3098 dt
->end_where
= gfc_current_locus
;
3103 m
= match_ltag (&tag_eor
, &dt
->eor
);
3105 dt
->eor_where
= gfc_current_locus
;
3113 /* Free a data transfer structure and everything below it. */
3116 gfc_free_dt (gfc_dt
*dt
)
3121 gfc_free_expr (dt
->io_unit
);
3122 gfc_free_expr (dt
->format_expr
);
3123 gfc_free_expr (dt
->rec
);
3124 gfc_free_expr (dt
->advance
);
3125 gfc_free_expr (dt
->iomsg
);
3126 gfc_free_expr (dt
->iostat
);
3127 gfc_free_expr (dt
->size
);
3128 gfc_free_expr (dt
->pad
);
3129 gfc_free_expr (dt
->delim
);
3130 gfc_free_expr (dt
->sign
);
3131 gfc_free_expr (dt
->round
);
3132 gfc_free_expr (dt
->blank
);
3133 gfc_free_expr (dt
->decimal
);
3134 gfc_free_expr (dt
->pos
);
3135 gfc_free_expr (dt
->dt_io_kind
);
3136 /* dt->extra_comma is a link to dt_io_kind if it is set. */
3141 /* Resolve everything in a gfc_dt structure. */
3144 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
3149 /* This is set in any case. */
3150 gcc_assert (dt
->dt_io_kind
);
3151 k
= dt
->dt_io_kind
->value
.iokind
;
3153 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
3154 RESOLVE_TAG (&tag_rec
, dt
->rec
);
3155 RESOLVE_TAG (&tag_spos
, dt
->pos
);
3156 RESOLVE_TAG (&tag_advance
, dt
->advance
);
3157 RESOLVE_TAG (&tag_id
, dt
->id
);
3158 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
3159 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
3160 RESOLVE_TAG (&tag_size
, dt
->size
);
3161 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
3162 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
3163 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
3164 RESOLVE_TAG (&tag_e_round
, dt
->round
);
3165 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
3166 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
3167 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
3172 gfc_error ("UNIT not specified at %L", loc
);
3176 if (gfc_resolve_expr (e
)
3177 && (e
->ts
.type
!= BT_INTEGER
3178 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
3180 /* If there is no extra comma signifying the "format" form of the IO
3181 statement, then this must be an error. */
3182 if (!dt
->extra_comma
)
3184 gfc_error ("UNIT specification at %L must be an INTEGER expression "
3185 "or a CHARACTER variable", &e
->where
);
3190 /* At this point, we have an extra comma. If io_unit has arrived as
3191 type character, we assume its really the "format" form of the I/O
3192 statement. We set the io_unit to the default unit and format to
3193 the character expression. See F95 Standard section 9.4. */
3194 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
3196 dt
->format_expr
= dt
->io_unit
;
3197 dt
->io_unit
= default_unit (k
);
3199 /* Nullify this pointer now so that a warning/error is not
3200 triggered below for the "Extension". */
3201 dt
->extra_comma
= NULL
;
3206 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
3207 &dt
->extra_comma
->where
);
3213 if (e
->ts
.type
== BT_CHARACTER
)
3215 if (gfc_has_vector_index (e
))
3217 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
3221 /* If we are writing, make sure the internal unit can be changed. */
3222 gcc_assert (k
!= M_PRINT
);
3224 && !gfc_check_vardef_context (e
, false, false, false,
3225 _("internal unit in WRITE")))
3229 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
3231 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
3235 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
3236 && mpz_sgn (e
->value
.integer
) < 0)
3238 gfc_error ("UNIT number in statement at %L must be non-negative",
3243 /* If we are reading and have a namelist, check that all namelist symbols
3244 can appear in a variable definition context. */
3245 if (k
== M_READ
&& dt
->namelist
)
3248 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
3253 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
3254 t
= gfc_check_vardef_context (e
, false, false, false, NULL
);
3259 gfc_error ("NAMELIST %qs in READ statement at %L contains"
3260 " the symbol %qs which may not appear in a"
3261 " variable definition context",
3262 dt
->namelist
->name
, loc
, n
->sym
->name
);
3269 && !gfc_notify_std (GFC_STD_LEGACY
, "Comma before i/o item list at %L",
3270 &dt
->extra_comma
->where
))
3275 if (!gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
))
3277 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
3279 gfc_error ("ERR tag label %d at %L not defined",
3280 dt
->err
->value
, &dt
->err_where
);
3287 if (!gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
))
3289 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
3291 gfc_error ("END tag label %d at %L not defined",
3292 dt
->end
->value
, &dt
->end_where
);
3299 if (!gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
))
3301 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
3303 gfc_error ("EOR tag label %d at %L not defined",
3304 dt
->eor
->value
, &dt
->eor_where
);
3309 /* Check the format label actually exists. */
3310 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
3311 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
3313 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
3322 /* Given an io_kind, return its name. */
3325 io_kind_name (io_kind k
)
3344 gfc_internal_error ("io_kind_name(): bad I/O-kind");
3351 /* Match an IO iteration statement of the form:
3353 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
3355 which is equivalent to a single IO element. This function is
3356 mutually recursive with match_io_element(). */
3358 static match
match_io_element (io_kind
, gfc_code
**);
3361 match_io_iterator (io_kind k
, gfc_code
**result
)
3363 gfc_code
*head
, *tail
, *new_code
;
3371 old_loc
= gfc_current_locus
;
3373 if (gfc_match_char ('(') != MATCH_YES
)
3376 m
= match_io_element (k
, &head
);
3379 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
3385 /* Can't be anything but an IO iterator. Build a list. */
3386 iter
= gfc_get_iterator ();
3390 m
= gfc_match_iterator (iter
, 0);
3391 if (m
== MATCH_ERROR
)
3395 gfc_check_do_variable (iter
->var
->symtree
);
3399 m
= match_io_element (k
, &new_code
);
3400 if (m
== MATCH_ERROR
)
3409 tail
= gfc_append_code (tail
, new_code
);
3411 if (gfc_match_char (',') != MATCH_YES
)
3420 if (gfc_match_char (')') != MATCH_YES
)
3423 new_code
= gfc_get_code (EXEC_DO
);
3424 new_code
->ext
.iterator
= iter
;
3426 new_code
->block
= gfc_get_code (EXEC_DO
);
3427 new_code
->block
->next
= head
;
3433 gfc_error ("Syntax error in I/O iterator at %C");
3437 gfc_free_iterator (iter
, 1);
3438 gfc_free_statements (head
);
3439 gfc_current_locus
= old_loc
;
3444 /* Match a single element of an IO list, which is either a single
3445 expression or an IO Iterator. */
3448 match_io_element (io_kind k
, gfc_code
**cpp
)
3456 m
= match_io_iterator (k
, cpp
);
3462 m
= gfc_match_variable (&expr
, 0);
3464 gfc_error ("Expected variable in READ statement at %C");
3468 m
= gfc_match_expr (&expr
);
3470 gfc_error ("Expected expression in %s statement at %C",
3474 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3479 gfc_free_expr (expr
);
3483 cp
= gfc_get_code (EXEC_TRANSFER
);
3486 cp
->ext
.dt
= current_dt
;
3493 /* Match an I/O list, building gfc_code structures as we go. */
3496 match_io_list (io_kind k
, gfc_code
**head_p
)
3498 gfc_code
*head
, *tail
, *new_code
;
3501 *head_p
= head
= tail
= NULL
;
3502 if (gfc_match_eos () == MATCH_YES
)
3507 m
= match_io_element (k
, &new_code
);
3508 if (m
== MATCH_ERROR
)
3513 tail
= gfc_append_code (tail
, new_code
);
3517 if (gfc_match_eos () == MATCH_YES
)
3519 if (gfc_match_char (',') != MATCH_YES
)
3527 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3530 gfc_free_statements (head
);
3535 /* Attach the data transfer end node. */
3538 terminate_io (gfc_code
*io_code
)
3542 if (io_code
== NULL
)
3543 io_code
= new_st
.block
;
3545 c
= gfc_get_code (EXEC_DT_END
);
3547 /* Point to structure that is already there */
3548 c
->ext
.dt
= new_st
.ext
.dt
;
3549 gfc_append_code (io_code
, c
);
3553 /* Check the constraints for a data transfer statement. The majority of the
3554 constraints appearing in 9.4 of the standard appear here. Some are handled
3555 in resolve_tag and others in gfc_resolve_dt. */
3558 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3561 #define io_constraint(condition,msg,arg)\
3564 gfc_error(msg,arg);\
3570 gfc_symbol
*sym
= NULL
;
3571 bool warn
, unformatted
;
3573 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3574 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3575 && dt
->namelist
== NULL
;
3580 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3581 && expr
->ts
.type
== BT_CHARACTER
)
3583 sym
= expr
->symtree
->n
.sym
;
3585 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3586 "Internal file at %L must not be INTENT(IN)",
3589 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3590 "Internal file incompatible with vector subscript at %L",
3593 io_constraint (dt
->rec
!= NULL
,
3594 "REC tag at %L is incompatible with internal file",
3597 io_constraint (dt
->pos
!= NULL
,
3598 "POS tag at %L is incompatible with internal file",
3601 io_constraint (unformatted
,
3602 "Unformatted I/O not allowed with internal unit at %L",
3603 &dt
->io_unit
->where
);
3605 io_constraint (dt
->asynchronous
!= NULL
,
3606 "ASYNCHRONOUS tag at %L not allowed with internal file",
3607 &dt
->asynchronous
->where
);
3609 if (dt
->namelist
!= NULL
)
3611 if (!gfc_notify_std (GFC_STD_F2003
, "Internal file at %L with "
3612 "namelist", &expr
->where
))
3616 io_constraint (dt
->advance
!= NULL
,
3617 "ADVANCE tag at %L is incompatible with internal file",
3618 &dt
->advance
->where
);
3621 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3624 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3625 "IO UNIT in %s statement at %C must be "
3626 "an internal file in a PURE procedure",
3629 if (k
== M_READ
|| k
== M_WRITE
)
3630 gfc_unset_implicit_pure (NULL
);
3635 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3638 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3641 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3644 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3647 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3652 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3653 "SIZE tag at %L requires an ADVANCE tag",
3656 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3657 "EOR tag at %L requires an ADVANCE tag",
3661 if (dt
->asynchronous
)
3663 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3665 if (!gfc_reduce_init_expr (dt
->asynchronous
))
3667 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3668 "expression", &dt
->asynchronous
->where
);
3672 if (!is_char_type ("ASYNCHRONOUS", dt
->asynchronous
))
3675 if (!compare_to_allowed_values
3676 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3677 dt
->asynchronous
->value
.character
.string
,
3678 io_kind_name (k
), warn
))
3686 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3687 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3689 io_constraint (not_yes
,
3690 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3691 "specifier", &dt
->id
->where
);
3696 if (!gfc_notify_std (GFC_STD_F2003
, "DECIMAL= at %C "
3697 "not allowed in Fortran 95"))
3700 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3702 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3704 if (!is_char_type ("DECIMAL", dt
->decimal
))
3707 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3708 dt
->decimal
->value
.character
.string
,
3709 io_kind_name (k
), warn
))
3712 io_constraint (unformatted
,
3713 "the DECIMAL= specifier at %L must be with an "
3714 "explicit format expression", &dt
->decimal
->where
);
3720 if (!gfc_notify_std (GFC_STD_F2003
, "BLANK= at %C "
3721 "not allowed in Fortran 95"))
3724 if (!is_char_type ("BLANK", dt
->blank
))
3727 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3729 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3732 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3733 dt
->blank
->value
.character
.string
,
3734 io_kind_name (k
), warn
))
3737 io_constraint (unformatted
,
3738 "the BLANK= specifier at %L must be with an "
3739 "explicit format expression", &dt
->blank
->where
);
3745 if (!gfc_notify_std (GFC_STD_F2003
, "PAD= at %C "
3746 "not allowed in Fortran 95"))
3749 if (!is_char_type ("PAD", dt
->pad
))
3752 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3754 static const char * pad
[] = { "YES", "NO", NULL
};
3756 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3757 dt
->pad
->value
.character
.string
,
3758 io_kind_name (k
), warn
))
3761 io_constraint (unformatted
,
3762 "the PAD= specifier at %L must be with an "
3763 "explicit format expression", &dt
->pad
->where
);
3769 if (!gfc_notify_std (GFC_STD_F2003
, "ROUND= at %C "
3770 "not allowed in Fortran 95"))
3773 if (!is_char_type ("ROUND", dt
->round
))
3776 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3778 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3779 "COMPATIBLE", "PROCESSOR_DEFINED",
3782 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3783 dt
->round
->value
.character
.string
,
3784 io_kind_name (k
), warn
))
3791 /* When implemented, change the following to use gfc_notify_std F2003.
3792 if (gfc_notify_std (GFC_STD_F2003, "SIGN= at %C "
3793 "not allowed in Fortran 95") == false)
3794 return MATCH_ERROR; */
3796 if (!is_char_type ("SIGN", dt
->sign
))
3799 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3801 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3804 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3805 dt
->sign
->value
.character
.string
,
3806 io_kind_name (k
), warn
))
3809 io_constraint (unformatted
,
3810 "SIGN= specifier at %L must be with an "
3811 "explicit format expression", &dt
->sign
->where
);
3813 io_constraint (k
== M_READ
,
3814 "SIGN= specifier at %L not allowed in a "
3815 "READ statement", &dt
->sign
->where
);
3821 if (!gfc_notify_std (GFC_STD_F2003
, "DELIM= at %C "
3822 "not allowed in Fortran 95"))
3825 if (!is_char_type ("DELIM", dt
->delim
))
3828 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3830 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3832 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3833 dt
->delim
->value
.character
.string
,
3834 io_kind_name (k
), warn
))
3837 io_constraint (k
== M_READ
,
3838 "DELIM= specifier at %L not allowed in a "
3839 "READ statement", &dt
->delim
->where
);
3841 io_constraint (dt
->format_label
!= &format_asterisk
3842 && dt
->namelist
== NULL
,
3843 "DELIM= specifier at %L must have FMT=*",
3846 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3847 "DELIM= specifier at %L must be with FMT=* or "
3848 "NML= specifier ", &dt
->delim
->where
);
3854 io_constraint (io_code
&& dt
->namelist
,
3855 "NAMELIST cannot be followed by IO-list at %L",
3858 io_constraint (dt
->format_expr
,
3859 "IO spec-list cannot contain both NAMELIST group name "
3860 "and format specification at %L",
3861 &dt
->format_expr
->where
);
3863 io_constraint (dt
->format_label
,
3864 "IO spec-list cannot contain both NAMELIST group name "
3865 "and format label at %L", spec_end
);
3867 io_constraint (dt
->rec
,
3868 "NAMELIST IO is not allowed with a REC= specifier "
3869 "at %L", &dt
->rec
->where
);
3871 io_constraint (dt
->advance
,
3872 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3873 "at %L", &dt
->advance
->where
);
3878 io_constraint (dt
->end
,
3879 "An END tag is not allowed with a "
3880 "REC= specifier at %L", &dt
->end_where
);
3882 io_constraint (dt
->format_label
== &format_asterisk
,
3883 "FMT=* is not allowed with a REC= specifier "
3886 io_constraint (dt
->pos
,
3887 "POS= is not allowed with REC= specifier "
3888 "at %L", &dt
->pos
->where
);
3893 int not_yes
, not_no
;
3896 io_constraint (dt
->format_label
== &format_asterisk
,
3897 "List directed format(*) is not allowed with a "
3898 "ADVANCE= specifier at %L.", &expr
->where
);
3900 io_constraint (unformatted
,
3901 "the ADVANCE= specifier at %L must appear with an "
3902 "explicit format expression", &expr
->where
);
3904 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
3906 const gfc_char_t
*advance
= expr
->value
.character
.string
;
3907 not_no
= gfc_wide_strlen (advance
) != 2
3908 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
3909 not_yes
= gfc_wide_strlen (advance
) != 3
3910 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
3918 io_constraint (not_no
&& not_yes
,
3919 "ADVANCE= specifier at %L must have value = "
3920 "YES or NO.", &expr
->where
);
3922 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
3923 "SIZE tag at %L requires an ADVANCE = %<NO%>",
3926 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
3927 "EOR tag at %L requires an ADVANCE = %<NO%>",
3931 expr
= dt
->format_expr
;
3932 if (!gfc_simplify_expr (expr
, 0)
3933 || !check_format_string (expr
, k
== M_READ
))
3938 #undef io_constraint
3941 /* Match a READ, WRITE or PRINT statement. */
3944 match_io (io_kind k
)
3946 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3951 locus spec_end
, control
;
3955 where
= gfc_current_locus
;
3957 current_dt
= dt
= XCNEW (gfc_dt
);
3958 m
= gfc_match_char ('(');
3961 where
= gfc_current_locus
;
3964 else if (k
== M_PRINT
)
3966 /* Treat the non-standard case of PRINT namelist. */
3967 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
3968 && gfc_match_name (name
) == MATCH_YES
)
3970 gfc_find_symbol (name
, NULL
, 1, &sym
);
3971 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3973 if (!gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
3974 "%C is an extension"))
3980 dt
->io_unit
= default_unit (k
);
3985 gfc_current_locus
= where
;
3989 if (gfc_current_form
== FORM_FREE
)
3991 char c
= gfc_peek_ascii_char ();
3992 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
3999 m
= match_dt_format (dt
);
4000 if (m
== MATCH_ERROR
)
4006 dt
->io_unit
= default_unit (k
);
4011 /* Before issuing an error for a malformed 'print (1,*)' type of
4012 error, check for a default-char-expr of the form ('(I0)'). */
4015 control
= gfc_current_locus
;
4018 /* Reset current locus to get the initial '(' in an expression. */
4019 gfc_current_locus
= where
;
4020 dt
->format_expr
= NULL
;
4021 m
= match_dt_format (dt
);
4023 if (m
== MATCH_ERROR
)
4025 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
4029 dt
->io_unit
= default_unit (k
);
4034 /* Commit any pending symbols now so that when we undo
4035 symbols later we wont lose them. */
4036 gfc_commit_symbols ();
4037 /* Reset current locus to get the initial '(' in an expression. */
4038 gfc_current_locus
= where
;
4039 dt
->format_expr
= NULL
;
4040 m
= gfc_match_expr (&dt
->format_expr
);
4044 && dt
->format_expr
->ts
.type
== BT_CHARACTER
)
4047 dt
->io_unit
= default_unit (k
);
4052 gfc_free_expr (dt
->format_expr
);
4053 dt
->format_expr
= NULL
;
4054 gfc_current_locus
= control
;
4060 gfc_undo_symbols ();
4061 gfc_free_expr (dt
->format_expr
);
4062 dt
->format_expr
= NULL
;
4063 gfc_current_locus
= control
;
4069 /* Match a control list */
4070 if (match_dt_element (k
, dt
) == MATCH_YES
)
4072 if (match_dt_unit (k
, dt
) != MATCH_YES
)
4075 if (gfc_match_char (')') == MATCH_YES
)
4077 if (gfc_match_char (',') != MATCH_YES
)
4080 m
= match_dt_element (k
, dt
);
4083 if (m
== MATCH_ERROR
)
4086 m
= match_dt_format (dt
);
4089 if (m
== MATCH_ERROR
)
4092 where
= gfc_current_locus
;
4094 m
= gfc_match_name (name
);
4097 gfc_find_symbol (name
, NULL
, 1, &sym
);
4098 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
4101 if (k
== M_READ
&& check_namelist (sym
))
4110 gfc_current_locus
= where
;
4112 goto loop
; /* No matches, try regular elements */
4115 if (gfc_match_char (')') == MATCH_YES
)
4117 if (gfc_match_char (',') != MATCH_YES
)
4123 m
= match_dt_element (k
, dt
);
4126 if (m
== MATCH_ERROR
)
4129 if (gfc_match_char (')') == MATCH_YES
)
4131 if (gfc_match_char (',') != MATCH_YES
)
4137 /* Used in check_io_constraints, where no locus is available. */
4138 spec_end
= gfc_current_locus
;
4140 /* Save the IO kind for later use. */
4141 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
4143 /* Optional leading comma (non-standard). We use a gfc_expr structure here
4144 to save the locus. This is used later when resolving transfer statements
4145 that might have a format expression without unit number. */
4146 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
4147 dt
->extra_comma
= dt
->dt_io_kind
;
4150 if (gfc_match_eos () != MATCH_YES
)
4152 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
4154 gfc_error ("Expected comma in I/O list at %C");
4159 m
= match_io_list (k
, &io_code
);
4160 if (m
== MATCH_ERROR
)
4166 /* A full IO statement has been matched. Check the constraints. spec_end is
4167 supplied for cases where no locus is supplied. */
4168 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
4170 if (m
== MATCH_ERROR
)
4173 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
4175 new_st
.block
= gfc_get_code (new_st
.op
);
4176 new_st
.block
->next
= io_code
;
4178 terminate_io (io_code
);
4183 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
4193 gfc_match_read (void)
4195 return match_io (M_READ
);
4200 gfc_match_write (void)
4202 return match_io (M_WRITE
);
4207 gfc_match_print (void)
4211 m
= match_io (M_PRINT
);
4215 if (gfc_pure (NULL
))
4217 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
4221 gfc_unset_implicit_pure (NULL
);
4227 /* Free a gfc_inquire structure. */
4230 gfc_free_inquire (gfc_inquire
*inquire
)
4233 if (inquire
== NULL
)
4236 gfc_free_expr (inquire
->unit
);
4237 gfc_free_expr (inquire
->file
);
4238 gfc_free_expr (inquire
->iomsg
);
4239 gfc_free_expr (inquire
->iostat
);
4240 gfc_free_expr (inquire
->exist
);
4241 gfc_free_expr (inquire
->opened
);
4242 gfc_free_expr (inquire
->number
);
4243 gfc_free_expr (inquire
->named
);
4244 gfc_free_expr (inquire
->name
);
4245 gfc_free_expr (inquire
->access
);
4246 gfc_free_expr (inquire
->sequential
);
4247 gfc_free_expr (inquire
->direct
);
4248 gfc_free_expr (inquire
->form
);
4249 gfc_free_expr (inquire
->formatted
);
4250 gfc_free_expr (inquire
->unformatted
);
4251 gfc_free_expr (inquire
->recl
);
4252 gfc_free_expr (inquire
->nextrec
);
4253 gfc_free_expr (inquire
->blank
);
4254 gfc_free_expr (inquire
->position
);
4255 gfc_free_expr (inquire
->action
);
4256 gfc_free_expr (inquire
->read
);
4257 gfc_free_expr (inquire
->write
);
4258 gfc_free_expr (inquire
->readwrite
);
4259 gfc_free_expr (inquire
->delim
);
4260 gfc_free_expr (inquire
->encoding
);
4261 gfc_free_expr (inquire
->pad
);
4262 gfc_free_expr (inquire
->iolength
);
4263 gfc_free_expr (inquire
->convert
);
4264 gfc_free_expr (inquire
->strm_pos
);
4265 gfc_free_expr (inquire
->asynchronous
);
4266 gfc_free_expr (inquire
->decimal
);
4267 gfc_free_expr (inquire
->pending
);
4268 gfc_free_expr (inquire
->id
);
4269 gfc_free_expr (inquire
->sign
);
4270 gfc_free_expr (inquire
->size
);
4271 gfc_free_expr (inquire
->round
);
4272 gfc_free_expr (inquire
->share
);
4273 gfc_free_expr (inquire
->cc
);
4278 /* Match an element of an INQUIRE statement. */
4280 #define RETM if (m != MATCH_NO) return m;
4283 match_inquire_element (gfc_inquire
*inquire
)
4287 m
= match_etag (&tag_unit
, &inquire
->unit
);
4288 RETM m
= match_etag (&tag_file
, &inquire
->file
);
4289 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
4290 RETM m
= match_etag (&tag_iomsg
, &inquire
->iomsg
);
4291 if (m
== MATCH_YES
&& !check_char_variable (inquire
->iomsg
))
4293 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
4294 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
4295 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
4296 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
4297 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
4298 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
4299 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
4300 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
4301 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
4302 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
4303 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
4304 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
4305 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
4306 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
4307 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
4308 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
4309 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
4310 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
4311 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
4312 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
4313 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
4314 if (m
== MATCH_YES
&& !is_char_type ("ASYNCHRONOUS", inquire
->asynchronous
))
4316 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
4317 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
4318 RETM m
= match_out_tag (&tag_size
, &inquire
->size
);
4319 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
4320 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
4321 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
4322 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
4323 RETM m
= match_out_tag (&tag_iolength
, &inquire
->iolength
);
4324 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
4325 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
4326 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
4327 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
4328 RETM m
= match_vtag (&tag_s_iqstream
, &inquire
->iqstream
);
4329 RETM m
= match_dec_vtag (&tag_v_share
, &inquire
->share
);
4330 RETM m
= match_dec_vtag (&tag_v_cc
, &inquire
->cc
);
4331 RETM
return MATCH_NO
;
4338 gfc_match_inquire (void)
4340 gfc_inquire
*inquire
;
4345 m
= gfc_match_char ('(');
4349 inquire
= XCNEW (gfc_inquire
);
4351 loc
= gfc_current_locus
;
4353 m
= match_inquire_element (inquire
);
4354 if (m
== MATCH_ERROR
)
4358 m
= gfc_match_expr (&inquire
->unit
);
4359 if (m
== MATCH_ERROR
)
4365 /* See if we have the IOLENGTH form of the inquire statement. */
4366 if (inquire
->iolength
!= NULL
)
4368 if (gfc_match_char (')') != MATCH_YES
)
4371 m
= match_io_list (M_INQUIRE
, &code
);
4372 if (m
== MATCH_ERROR
)
4377 new_st
.op
= EXEC_IOLENGTH
;
4378 new_st
.expr1
= inquire
->iolength
;
4379 new_st
.ext
.inquire
= inquire
;
4381 if (gfc_pure (NULL
))
4383 gfc_free_statements (code
);
4384 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4388 gfc_unset_implicit_pure (NULL
);
4390 new_st
.block
= gfc_get_code (EXEC_IOLENGTH
);
4391 terminate_io (code
);
4392 new_st
.block
->next
= code
;
4396 /* At this point, we have the non-IOLENGTH inquire statement. */
4399 if (gfc_match_char (')') == MATCH_YES
)
4401 if (gfc_match_char (',') != MATCH_YES
)
4404 m
= match_inquire_element (inquire
);
4405 if (m
== MATCH_ERROR
)
4410 if (inquire
->iolength
!= NULL
)
4412 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
4417 if (gfc_match_eos () != MATCH_YES
)
4420 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
4422 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
4423 "UNIT specifiers", &loc
);
4427 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
4429 gfc_error ("INQUIRE statement at %L requires either FILE or "
4430 "UNIT specifier", &loc
);
4434 if (inquire
->unit
!= NULL
&& inquire
->unit
->expr_type
== EXPR_CONSTANT
4435 && inquire
->unit
->ts
.type
== BT_INTEGER
4436 && ((mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT4
)
4437 || (mpz_get_si (inquire
->unit
->value
.integer
) == GFC_INTERNAL_UNIT
)))
4439 gfc_error ("UNIT number in INQUIRE statement at %L can not "
4440 "be %d", &loc
, (int) mpz_get_si (inquire
->unit
->value
.integer
));
4444 if (gfc_pure (NULL
))
4446 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
4450 gfc_unset_implicit_pure (NULL
);
4452 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
4454 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
4455 "the ID= specifier", &loc
);
4459 new_st
.op
= EXEC_INQUIRE
;
4460 new_st
.ext
.inquire
= inquire
;
4464 gfc_syntax_error (ST_INQUIRE
);
4467 gfc_free_inquire (inquire
);
4472 /* Resolve everything in a gfc_inquire structure. */
4475 gfc_resolve_inquire (gfc_inquire
*inquire
)
4477 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
4478 RESOLVE_TAG (&tag_file
, inquire
->file
);
4479 RESOLVE_TAG (&tag_id
, inquire
->id
);
4481 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
4482 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
4483 #define INQUIRE_RESOLVE_TAG(tag, expr) \
4484 RESOLVE_TAG (tag, expr); \
4488 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4489 if (gfc_check_vardef_context ((expr), false, false, false, \
4490 context) == false) \
4493 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4494 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4495 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4496 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4497 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4498 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4499 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4500 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4501 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4502 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4503 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4504 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4505 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4506 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4507 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4508 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4509 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4510 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4511 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4512 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4513 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4514 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4515 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4516 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4517 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4518 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4519 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4520 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4521 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4522 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4523 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4524 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4525 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4526 INQUIRE_RESOLVE_TAG (&tag_s_decimal
, inquire
->decimal
);
4527 INQUIRE_RESOLVE_TAG (&tag_s_iqstream
, inquire
->iqstream
);
4528 INQUIRE_RESOLVE_TAG (&tag_v_share
, inquire
->share
);
4529 INQUIRE_RESOLVE_TAG (&tag_v_cc
, inquire
->cc
);
4530 #undef INQUIRE_RESOLVE_TAG
4532 if (!gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
))
4540 gfc_free_wait (gfc_wait
*wait
)
4545 gfc_free_expr (wait
->unit
);
4546 gfc_free_expr (wait
->iostat
);
4547 gfc_free_expr (wait
->iomsg
);
4548 gfc_free_expr (wait
->id
);
4554 gfc_resolve_wait (gfc_wait
*wait
)
4556 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4557 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4558 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4559 RESOLVE_TAG (&tag_id
, wait
->id
);
4561 if (!gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
))
4564 if (!gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
))
4570 /* Match an element of a WAIT statement. */
4572 #define RETM if (m != MATCH_NO) return m;
4575 match_wait_element (gfc_wait
*wait
)
4579 m
= match_etag (&tag_unit
, &wait
->unit
);
4580 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4581 RETM m
= match_ltag (&tag_end
, &wait
->eor
);
4582 RETM m
= match_ltag (&tag_eor
, &wait
->end
);
4583 RETM m
= match_etag (&tag_iomsg
, &wait
->iomsg
);
4584 if (m
== MATCH_YES
&& !check_char_variable (wait
->iomsg
))
4586 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4587 RETM m
= match_etag (&tag_id
, &wait
->id
);
4588 RETM
return MATCH_NO
;
4595 gfc_match_wait (void)
4600 m
= gfc_match_char ('(');
4604 wait
= XCNEW (gfc_wait
);
4606 m
= match_wait_element (wait
);
4607 if (m
== MATCH_ERROR
)
4611 m
= gfc_match_expr (&wait
->unit
);
4612 if (m
== MATCH_ERROR
)
4620 if (gfc_match_char (')') == MATCH_YES
)
4622 if (gfc_match_char (',') != MATCH_YES
)
4625 m
= match_wait_element (wait
);
4626 if (m
== MATCH_ERROR
)
4632 if (!gfc_notify_std (GFC_STD_F2003
, "WAIT at %C "
4633 "not allowed in Fortran 95"))
4636 if (gfc_pure (NULL
))
4638 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4642 gfc_unset_implicit_pure (NULL
);
4644 new_st
.op
= EXEC_WAIT
;
4645 new_st
.ext
.wait
= wait
;
4650 gfc_syntax_error (ST_WAIT
);
4653 gfc_free_wait (wait
);