1 /* Deal with I/O statements & related stuff.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 Free Software Foundation, Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
31 format_asterisk
= {0, NULL
, NULL
, -1, ST_LABEL_FORMAT
, ST_LABEL_FORMAT
, NULL
,
36 const char *name
, *spec
, *value
;
42 tag_file
= {"FILE", " file =", " %e", BT_CHARACTER
},
43 tag_status
= {"STATUS", " status =", " %e", BT_CHARACTER
},
44 tag_e_access
= {"ACCESS", " access =", " %e", BT_CHARACTER
},
45 tag_e_form
= {"FORM", " form =", " %e", BT_CHARACTER
},
46 tag_e_recl
= {"RECL", " recl =", " %e", BT_INTEGER
},
47 tag_e_blank
= {"BLANK", " blank =", " %e", BT_CHARACTER
},
48 tag_e_position
= {"POSITION", " position =", " %e", BT_CHARACTER
},
49 tag_e_action
= {"ACTION", " action =", " %e", BT_CHARACTER
},
50 tag_e_delim
= {"DELIM", " delim =", " %e", BT_CHARACTER
},
51 tag_e_pad
= {"PAD", " pad =", " %e", BT_CHARACTER
},
52 tag_e_decimal
= {"DECIMAL", " decimal =", " %e", BT_CHARACTER
},
53 tag_e_encoding
= {"ENCODING", " encoding =", " %e", BT_CHARACTER
},
54 tag_e_async
= {"ASYNCHRONOUS", " asynchronous =", " %e", BT_CHARACTER
},
55 tag_e_round
= {"ROUND", " round =", " %e", BT_CHARACTER
},
56 tag_e_sign
= {"SIGN", " sign =", " %e", BT_CHARACTER
},
57 tag_unit
= {"UNIT", " unit =", " %e", BT_INTEGER
},
58 tag_advance
= {"ADVANCE", " advance =", " %e", BT_CHARACTER
},
59 tag_rec
= {"REC", " rec =", " %e", BT_INTEGER
},
60 tag_spos
= {"POSITION", " pos =", " %e", BT_INTEGER
},
61 tag_format
= {"FORMAT", NULL
, NULL
, BT_CHARACTER
},
62 tag_iomsg
= {"IOMSG", " iomsg =", " %e", BT_CHARACTER
},
63 tag_iostat
= {"IOSTAT", " iostat =", " %v", BT_INTEGER
},
64 tag_size
= {"SIZE", " size =", " %v", BT_INTEGER
},
65 tag_exist
= {"EXIST", " exist =", " %v", BT_LOGICAL
},
66 tag_opened
= {"OPENED", " opened =", " %v", BT_LOGICAL
},
67 tag_named
= {"NAMED", " named =", " %v", BT_LOGICAL
},
68 tag_name
= {"NAME", " name =", " %v", BT_CHARACTER
},
69 tag_number
= {"NUMBER", " number =", " %v", BT_INTEGER
},
70 tag_s_access
= {"ACCESS", " access =", " %v", BT_CHARACTER
},
71 tag_sequential
= {"SEQUENTIAL", " sequential =", " %v", BT_CHARACTER
},
72 tag_direct
= {"DIRECT", " direct =", " %v", BT_CHARACTER
},
73 tag_s_form
= {"FORM", " form =", " %v", BT_CHARACTER
},
74 tag_formatted
= {"FORMATTED", " formatted =", " %v", BT_CHARACTER
},
75 tag_unformatted
= {"UNFORMATTED", " unformatted =", " %v", BT_CHARACTER
},
76 tag_s_recl
= {"RECL", " recl =", " %v", BT_INTEGER
},
77 tag_nextrec
= {"NEXTREC", " nextrec =", " %v", BT_INTEGER
},
78 tag_s_blank
= {"BLANK", " blank =", " %v", BT_CHARACTER
},
79 tag_s_position
= {"POSITION", " position =", " %v", BT_CHARACTER
},
80 tag_s_action
= {"ACTION", " action =", " %v", BT_CHARACTER
},
81 tag_read
= {"READ", " read =", " %v", BT_CHARACTER
},
82 tag_write
= {"WRITE", " write =", " %v", BT_CHARACTER
},
83 tag_readwrite
= {"READWRITE", " readwrite =", " %v", BT_CHARACTER
},
84 tag_s_delim
= {"DELIM", " delim =", " %v", BT_CHARACTER
},
85 tag_s_pad
= {"PAD", " pad =", " %v", BT_CHARACTER
},
86 tag_s_decimal
= {"DECIMAL", " decimal =", " %v", BT_CHARACTER
},
87 tag_s_encoding
= {"ENCODING", " encoding =", " %v", BT_CHARACTER
},
88 tag_s_async
= {"ASYNCHRONOUS", " asynchronous =", " %v", BT_CHARACTER
},
89 tag_s_round
= {"ROUND", " round =", " %v", BT_CHARACTER
},
90 tag_s_sign
= {"SIGN", " sign =", " %v", BT_CHARACTER
},
91 tag_iolength
= {"IOLENGTH", " iolength =", " %v", BT_INTEGER
},
92 tag_convert
= {"CONVERT", " convert =", " %e", BT_CHARACTER
},
93 tag_strm_out
= {"POS", " pos =", " %v", BT_INTEGER
},
94 tag_err
= {"ERR", " err =", " %l", BT_UNKNOWN
},
95 tag_end
= {"END", " end =", " %l", BT_UNKNOWN
},
96 tag_eor
= {"EOR", " eor =", " %l", BT_UNKNOWN
},
97 tag_id
= {"ID", " id =", " %v", BT_INTEGER
},
98 tag_pending
= {"PENDING", " pending =", " %v", BT_LOGICAL
},
99 tag_newunit
= {"NEWUNIT", " newunit =", " %v", BT_INTEGER
};
101 static gfc_dt
*current_dt
;
103 #define RESOLVE_TAG(x, y) if (resolve_tag(x, y) == FAILURE) return FAILURE;
106 /**************** Fortran 95 FORMAT parser *****************/
108 /* FORMAT tokens returned by format_lex(). */
111 FMT_NONE
, FMT_UNKNOWN
, FMT_SIGNED_INT
, FMT_ZERO
, FMT_POSINT
, FMT_PERIOD
,
112 FMT_COMMA
, FMT_COLON
, FMT_SLASH
, FMT_DOLLAR
, FMT_LPAREN
,
113 FMT_RPAREN
, FMT_X
, FMT_SIGN
, FMT_BLANK
, FMT_CHAR
, FMT_P
, FMT_IBOZ
, FMT_F
,
114 FMT_E
, FMT_EN
, FMT_ES
, FMT_G
, FMT_L
, FMT_A
, FMT_D
, FMT_H
, FMT_END
,
115 FMT_ERROR
, FMT_DC
, FMT_DP
, FMT_T
, FMT_TR
, FMT_TL
, FMT_STAR
, FMT_RC
,
116 FMT_RD
, FMT_RN
, FMT_RP
, FMT_RU
, FMT_RZ
120 /* Local variables for checking format strings. The saved_token is
121 used to back up by a single format token during the parsing
123 static gfc_char_t
*format_string
;
124 static int format_string_pos
;
125 static int format_length
, use_last_char
;
126 static char error_element
;
127 static locus format_locus
;
129 static format_token saved_token
;
132 { MODE_STRING
, MODE_FORMAT
, MODE_COPY
}
136 /* Return the next character in the format string. */
139 next_char (int in_string
)
151 if (mode
== MODE_STRING
)
152 c
= *format_string
++;
155 c
= gfc_next_char_literal (in_string
);
160 if (gfc_option
.flag_backslash
&& c
== '\\')
162 locus old_locus
= gfc_current_locus
;
164 if (gfc_match_special_char (&c
) == MATCH_NO
)
165 gfc_current_locus
= old_locus
;
167 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
168 gfc_warning ("Extension: backslash character at %C");
171 if (mode
== MODE_COPY
)
172 *format_string
++ = c
;
174 if (mode
!= MODE_STRING
)
175 format_locus
= gfc_current_locus
;
179 c
= gfc_wide_toupper (c
);
184 /* Back up one character position. Only works once. */
192 /* Eat up the spaces and return a character. */
195 next_char_not_space (bool *error
)
200 error_element
= c
= next_char (0);
203 if (gfc_option
.allow_std
& GFC_STD_GNU
)
204 gfc_warning ("Extension: Tab character in format at %C");
207 gfc_error ("Extension: Tab character in format at %C");
213 while (gfc_is_whitespace (c
));
217 static int value
= 0;
219 /* Simple lexical analyzer for getting the next token in a FORMAT
231 if (saved_token
!= FMT_NONE
)
234 saved_token
= FMT_NONE
;
238 c
= next_char_not_space (&error
);
246 c
= next_char_not_space (&error
);
257 c
= next_char_not_space (&error
);
259 value
= 10 * value
+ c
- '0';
268 token
= FMT_SIGNED_INT
;
287 c
= next_char_not_space (&error
);
290 value
= 10 * value
+ c
- '0';
298 token
= zflag
? FMT_ZERO
: FMT_POSINT
;
322 c
= next_char_not_space (&error
);
350 c
= next_char_not_space (&error
);
351 if (c
!= 'P' && c
!= 'S')
358 c
= next_char_not_space (&error
);
359 if (c
== 'N' || c
== 'Z')
420 c
= next_char_not_space (&error
);
450 c
= next_char_not_space (&error
);
453 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DP format "
454 "specifier not allowed at %C") == FAILURE
)
460 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DC format "
461 "specifier not allowed at %C") == FAILURE
)
473 c
= next_char_not_space (&error
);
522 token_to_string (format_token t
)
541 /* Check a format statement. The format string, either from a FORMAT
542 statement or a constant in an I/O statement has already been parsed
543 by itself, and we are checking it for validity. The dual origin
544 means that the warning message is a little less than great. */
547 check_format (bool is_input
)
549 const char *posint_required
= _("Positive width required");
550 const char *nonneg_required
= _("Nonnegative width required");
551 const char *unexpected_element
= _("Unexpected element '%c' in format string"
553 const char *unexpected_end
= _("Unexpected end of format string");
554 const char *zero_width
= _("Zero width in format descriptor");
563 saved_token
= FMT_NONE
;
567 format_string_pos
= 0;
574 error
= _("Missing leading left parenthesis");
582 goto finished
; /* Empty format is legal */
586 /* In this state, the next thing has to be a format item. */
603 error
= _("Left parenthesis required after '*'");
628 /* Signed integer can only precede a P format. */
634 error
= _("Expected P edit descriptor");
641 /* P requires a prior number. */
642 error
= _("P descriptor requires leading scale factor");
646 /* X requires a prior number if we're being pedantic. */
647 if (mode
!= MODE_FORMAT
)
648 format_locus
.nextc
+= format_string_pos
;
649 if (gfc_notify_std (GFC_STD_GNU
, "Extension: X descriptor "
650 "requires leading space count at %L", &format_locus
)
668 goto extension_optional_comma
;
679 if (gfc_notify_std (GFC_STD_GNU
, "Extension: $ descriptor at %L",
680 &format_locus
) == FAILURE
)
682 if (t
!= FMT_RPAREN
|| level
> 0)
684 gfc_warning ("$ should be the last specifier in format at %L",
686 goto optional_comma_1
;
707 error
= unexpected_end
;
711 error
= unexpected_element
;
716 /* In this state, t must currently be a data descriptor.
717 Deal with things that can/must follow the descriptor. */
728 /* No comma after P allowed only for F, E, EN, ES, D, or G.
733 if (!(gfc_option
.allow_std
& GFC_STD_F2003
) && t
!= FMT_COMMA
734 && t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
735 && t
!= FMT_D
&& t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
737 error
= _("Comma required after P descriptor");
748 if (t
!= FMT_F
&& t
!= FMT_E
&& t
!= FMT_EN
&& t
!= FMT_ES
&& t
!= FMT_D
749 && t
!= FMT_G
&& t
!= FMT_RPAREN
&& t
!= FMT_SLASH
)
751 error
= _("Comma required after P descriptor");
765 error
= _("Positive width required with T descriptor");
777 switch (gfc_notification_std (GFC_STD_GNU
))
780 if (mode
!= MODE_FORMAT
)
781 format_locus
.nextc
+= format_string_pos
;
782 gfc_warning ("Extension: Missing positive width after L "
783 "descriptor at %L", &format_locus
);
788 error
= posint_required
;
819 if (t
== FMT_G
&& u
== FMT_ZERO
)
826 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: 'G0' in "
827 "format at %L", &format_locus
) == FAILURE
)
838 error
= posint_required
;
844 error
= _("E specifier not allowed with g0 descriptor");
853 format_locus
.nextc
+= format_string_pos
;
854 gfc_error ("Positive width required in format "
855 "specifier %s at %L", token_to_string (t
),
866 /* Warn if -std=legacy, otherwise error. */
867 format_locus
.nextc
+= format_string_pos
;
868 if (gfc_option
.warn_std
!= 0)
870 gfc_error ("Period required in format "
871 "specifier %s at %L", token_to_string (t
),
877 gfc_warning ("Period required in format "
878 "specifier %s at %L", token_to_string (t
),
880 /* If we go to finished, we need to unwind this
881 before the next round. */
882 format_locus
.nextc
-= format_string_pos
;
890 if (u
!= FMT_ZERO
&& u
!= FMT_POSINT
)
892 error
= nonneg_required
;
899 /* Look for optional exponent. */
914 error
= _("Positive exponent width required");
925 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
927 error
= nonneg_required
;
930 else if (is_input
&& t
== FMT_ZERO
)
932 error
= posint_required
;
941 /* Warn if -std=legacy, otherwise error. */
942 if (gfc_option
.warn_std
!= 0)
944 error
= _("Period required in format specifier");
947 if (mode
!= MODE_FORMAT
)
948 format_locus
.nextc
+= format_string_pos
;
949 gfc_warning ("Period required in format specifier at %L",
958 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
960 error
= nonneg_required
;
967 if (!(gfc_option
.allow_std
& GFC_STD_GNU
) && !inhibit_warnings
)
969 if (mode
!= MODE_FORMAT
)
970 format_locus
.nextc
+= format_string_pos
;
971 gfc_warning ("The H format specifier at %L is"
972 " a Fortran 95 deleted feature", &format_locus
);
974 if (mode
== MODE_STRING
)
976 format_string
+= value
;
977 format_length
-= value
;
978 format_string_pos
+= repeat
;
994 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
996 error
= nonneg_required
;
999 else if (is_input
&& t
== FMT_ZERO
)
1001 error
= posint_required
;
1008 if (t
!= FMT_PERIOD
)
1017 if (t
!= FMT_ZERO
&& t
!= FMT_POSINT
)
1019 error
= nonneg_required
;
1027 error
= unexpected_element
;
1032 /* Between a descriptor and what comes next. */
1050 goto optional_comma
;
1053 error
= unexpected_end
;
1057 if (mode
!= MODE_FORMAT
)
1058 format_locus
.nextc
+= format_string_pos
- 1;
1059 if (gfc_notify_std (GFC_STD_GNU
, "Extension: Missing comma at %L",
1060 &format_locus
) == FAILURE
)
1062 /* If we do not actually return a failure, we need to unwind this
1063 before the next round. */
1064 if (mode
!= MODE_FORMAT
)
1065 format_locus
.nextc
-= format_string_pos
;
1070 /* Optional comma is a weird between state where we've just finished
1071 reading a colon, slash, dollar or P descriptor. */
1088 /* Assume that we have another format item. */
1095 extension_optional_comma
:
1096 /* As a GNU extension, permit a missing comma after a string literal. */
1113 goto optional_comma
;
1116 error
= unexpected_end
;
1120 if (mode
!= MODE_FORMAT
)
1121 format_locus
.nextc
+= format_string_pos
;
1122 if (gfc_notify_std (GFC_STD_GNU
, "Extension: Missing comma at %L",
1123 &format_locus
) == FAILURE
)
1125 /* If we do not actually return a failure, we need to unwind this
1126 before the next round. */
1127 if (mode
!= MODE_FORMAT
)
1128 format_locus
.nextc
-= format_string_pos
;
1136 if (mode
!= MODE_FORMAT
)
1137 format_locus
.nextc
+= format_string_pos
;
1138 if (error
== unexpected_element
)
1139 gfc_error (error
, error_element
, &format_locus
);
1141 gfc_error ("%s in format string at %L", error
, &format_locus
);
1150 /* Given an expression node that is a constant string, see if it looks
1151 like a format string. */
1154 check_format_string (gfc_expr
*e
, bool is_input
)
1158 if (!e
|| e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_CONSTANT
)
1162 format_string
= e
->value
.character
.string
;
1164 /* More elaborate measures are needed to show where a problem is within a
1165 format string that has been calculated, but that's probably not worth the
1167 format_locus
= e
->where
;
1168 rv
= check_format (is_input
);
1169 /* check for extraneous characters at the end of an otherwise valid format
1170 string, like '(A10,I3)F5'
1171 start at the end and move back to the last character processed,
1173 if (rv
== SUCCESS
&& e
->value
.character
.length
> format_string_pos
)
1174 for (i
=e
->value
.character
.length
-1;i
>format_string_pos
-1;i
--)
1175 if (e
->value
.character
.string
[i
] != ' ')
1177 format_locus
.nextc
+= format_length
+ 1;
1178 gfc_warning ("Extraneous characters in format at %L", &format_locus
);
1185 /************ Fortran 95 I/O statement matchers *************/
1187 /* Match a FORMAT statement. This amounts to actually parsing the
1188 format descriptors in order to correctly locate the end of the
1192 gfc_match_format (void)
1197 if (gfc_current_ns
->proc_name
1198 && gfc_current_ns
->proc_name
->attr
.flavor
== FL_MODULE
)
1200 gfc_error ("Format statement in module main block at %C");
1204 if (gfc_statement_label
== NULL
)
1206 gfc_error ("Missing format label at %C");
1209 gfc_gobble_whitespace ();
1214 start
= gfc_current_locus
;
1216 if (check_format (false) == FAILURE
)
1219 if (gfc_match_eos () != MATCH_YES
)
1221 gfc_syntax_error (ST_FORMAT
);
1225 /* The label doesn't get created until after the statement is done
1226 being matched, so we have to leave the string for later. */
1228 gfc_current_locus
= start
; /* Back to the beginning */
1231 new_st
.op
= EXEC_NOP
;
1233 e
= gfc_get_character_expr (gfc_default_character_kind
, &start
,
1234 NULL
, format_length
);
1235 format_string
= e
->value
.character
.string
;
1236 gfc_statement_label
->format
= e
;
1239 check_format (false); /* Guaranteed to succeed */
1240 gfc_match_eos (); /* Guaranteed to succeed */
1246 /* Match an expression I/O tag of some sort. */
1249 match_etag (const io_tag
*tag
, gfc_expr
**v
)
1254 m
= gfc_match (tag
->spec
);
1258 m
= gfc_match (tag
->value
, &result
);
1261 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1267 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1268 gfc_free_expr (result
);
1277 /* Match a variable I/O tag of some sort. */
1280 match_vtag (const io_tag
*tag
, gfc_expr
**v
)
1285 m
= gfc_match (tag
->spec
);
1289 m
= gfc_match (tag
->value
, &result
);
1292 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1298 gfc_error ("Duplicate %s specification at %C", tag
->name
);
1299 gfc_free_expr (result
);
1303 if (result
->symtree
->n
.sym
->attr
.intent
== INTENT_IN
)
1305 gfc_error ("Variable %s cannot be INTENT(IN) at %C", tag
->name
);
1306 gfc_free_expr (result
);
1310 if (gfc_pure (NULL
) && gfc_impure_variable (result
->symtree
->n
.sym
))
1312 gfc_error ("Variable %s cannot be assigned in PURE procedure at %C",
1314 gfc_free_expr (result
);
1323 /* Match I/O tags that cause variables to become redefined. */
1326 match_out_tag (const io_tag
*tag
, gfc_expr
**result
)
1330 m
= match_vtag (tag
, result
);
1332 gfc_check_do_variable ((*result
)->symtree
);
1338 /* Match a label I/O tag. */
1341 match_ltag (const io_tag
*tag
, gfc_st_label
** label
)
1347 m
= gfc_match (tag
->spec
);
1351 m
= gfc_match (tag
->value
, label
);
1354 gfc_error ("Invalid value for %s specification at %C", tag
->name
);
1360 gfc_error ("Duplicate %s label specification at %C", tag
->name
);
1364 if (gfc_reference_st_label (*label
, ST_LABEL_TARGET
) == FAILURE
)
1371 /* Resolution of the FORMAT tag, to be called from resolve_tag. */
1374 resolve_tag_format (const gfc_expr
*e
)
1376 if (e
->expr_type
== EXPR_CONSTANT
1377 && (e
->ts
.type
!= BT_CHARACTER
1378 || e
->ts
.kind
!= gfc_default_character_kind
))
1380 gfc_error ("Constant expression in FORMAT tag at %L must be "
1381 "of type default CHARACTER", &e
->where
);
1385 /* If e's rank is zero and e is not an element of an array, it should be
1386 of integer or character type. The integer variable should be
1389 && (e
->expr_type
!= EXPR_VARIABLE
1390 || e
->symtree
== NULL
1391 || e
->symtree
->n
.sym
->as
== NULL
1392 || e
->symtree
->n
.sym
->as
->rank
== 0))
1394 if (e
->ts
.type
!= BT_CHARACTER
&& e
->ts
.type
!= BT_INTEGER
)
1396 gfc_error ("FORMAT tag at %L must be of type CHARACTER or INTEGER",
1400 else if (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_VARIABLE
)
1402 if (gfc_notify_std (GFC_STD_F95_DEL
, "Deleted feature: ASSIGNED "
1403 "variable in FORMAT tag at %L", &e
->where
)
1406 if (e
->symtree
->n
.sym
->attr
.assign
!= 1)
1408 gfc_error ("Variable '%s' at %L has not been assigned a "
1409 "format label", e
->symtree
->n
.sym
->name
, &e
->where
);
1413 else if (e
->ts
.type
== BT_INTEGER
)
1415 gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
1416 "variable", gfc_basic_typename (e
->ts
.type
), &e
->where
);
1423 /* If rank is nonzero and type is not character, we allow it under GFC_STD_LEGACY.
1424 It may be assigned an Hollerith constant. */
1425 if (e
->ts
.type
!= BT_CHARACTER
)
1427 if (gfc_notify_std (GFC_STD_LEGACY
, "Extension: Non-character "
1428 "in FORMAT tag at %L", &e
->where
) == FAILURE
)
1431 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SHAPE
)
1433 gfc_error ("Non-character assumed shape array element in FORMAT"
1434 " tag at %L", &e
->where
);
1438 if (e
->rank
== 0 && e
->symtree
->n
.sym
->as
->type
== AS_ASSUMED_SIZE
)
1440 gfc_error ("Non-character assumed size array element in FORMAT"
1441 " tag at %L", &e
->where
);
1445 if (e
->rank
== 0 && e
->symtree
->n
.sym
->attr
.pointer
)
1447 gfc_error ("Non-character pointer array element in FORMAT tag at %L",
1457 /* Do expression resolution and type-checking on an expression tag. */
1460 resolve_tag (const io_tag
*tag
, gfc_expr
*e
)
1465 if (gfc_resolve_expr (e
) == FAILURE
)
1468 if (tag
== &tag_format
)
1469 return resolve_tag_format (e
);
1471 if (e
->ts
.type
!= tag
->type
)
1473 gfc_error ("%s tag at %L must be of type %s", tag
->name
,
1474 &e
->where
, gfc_basic_typename (tag
->type
));
1480 gfc_error ("%s tag at %L must be scalar", tag
->name
, &e
->where
);
1484 if (tag
== &tag_iomsg
)
1486 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: IOMSG tag at %L",
1487 &e
->where
) == FAILURE
)
1491 if ((tag
== &tag_iostat
|| tag
== &tag_size
|| tag
== &tag_iolength
)
1492 && e
->ts
.kind
!= gfc_default_integer_kind
)
1494 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 95 requires default "
1495 "INTEGER in %s tag at %L", tag
->name
, &e
->where
)
1500 if (tag
== &tag_exist
&& e
->ts
.kind
!= gfc_default_logical_kind
)
1502 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: Nondefault LOGICAL "
1503 "in %s tag at %L", tag
->name
, &e
->where
)
1508 if (tag
== &tag_newunit
)
1510 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: NEWUNIT specifier"
1511 " at %L", &e
->where
) == FAILURE
)
1515 /* NEWUNIT, IOSTAT, SIZE and IOMSG are variable definition contexts. */
1516 if (tag
== &tag_newunit
|| tag
== &tag_iostat
1517 || tag
== &tag_size
|| tag
== &tag_iomsg
)
1521 sprintf (context
, _("%s tag"), tag
->name
);
1522 if (gfc_check_vardef_context (e
, false, context
) == FAILURE
)
1526 if (tag
== &tag_convert
)
1528 if (gfc_notify_std (GFC_STD_GNU
, "Extension: CONVERT tag at %L",
1529 &e
->where
) == FAILURE
)
1537 /* Match a single tag of an OPEN statement. */
1540 match_open_element (gfc_open
*open
)
1544 m
= match_etag (&tag_e_async
, &open
->asynchronous
);
1547 m
= match_etag (&tag_unit
, &open
->unit
);
1550 m
= match_out_tag (&tag_iomsg
, &open
->iomsg
);
1553 m
= match_out_tag (&tag_iostat
, &open
->iostat
);
1556 m
= match_etag (&tag_file
, &open
->file
);
1559 m
= match_etag (&tag_status
, &open
->status
);
1562 m
= match_etag (&tag_e_access
, &open
->access
);
1565 m
= match_etag (&tag_e_form
, &open
->form
);
1568 m
= match_etag (&tag_e_recl
, &open
->recl
);
1571 m
= match_etag (&tag_e_blank
, &open
->blank
);
1574 m
= match_etag (&tag_e_position
, &open
->position
);
1577 m
= match_etag (&tag_e_action
, &open
->action
);
1580 m
= match_etag (&tag_e_delim
, &open
->delim
);
1583 m
= match_etag (&tag_e_pad
, &open
->pad
);
1586 m
= match_etag (&tag_e_decimal
, &open
->decimal
);
1589 m
= match_etag (&tag_e_encoding
, &open
->encoding
);
1592 m
= match_etag (&tag_e_round
, &open
->round
);
1595 m
= match_etag (&tag_e_sign
, &open
->sign
);
1598 m
= match_ltag (&tag_err
, &open
->err
);
1601 m
= match_etag (&tag_convert
, &open
->convert
);
1604 m
= match_out_tag (&tag_newunit
, &open
->newunit
);
1612 /* Free the gfc_open structure and all the expressions it contains. */
1615 gfc_free_open (gfc_open
*open
)
1620 gfc_free_expr (open
->unit
);
1621 gfc_free_expr (open
->iomsg
);
1622 gfc_free_expr (open
->iostat
);
1623 gfc_free_expr (open
->file
);
1624 gfc_free_expr (open
->status
);
1625 gfc_free_expr (open
->access
);
1626 gfc_free_expr (open
->form
);
1627 gfc_free_expr (open
->recl
);
1628 gfc_free_expr (open
->blank
);
1629 gfc_free_expr (open
->position
);
1630 gfc_free_expr (open
->action
);
1631 gfc_free_expr (open
->delim
);
1632 gfc_free_expr (open
->pad
);
1633 gfc_free_expr (open
->decimal
);
1634 gfc_free_expr (open
->encoding
);
1635 gfc_free_expr (open
->round
);
1636 gfc_free_expr (open
->sign
);
1637 gfc_free_expr (open
->convert
);
1638 gfc_free_expr (open
->asynchronous
);
1639 gfc_free_expr (open
->newunit
);
1644 /* Resolve everything in a gfc_open structure. */
1647 gfc_resolve_open (gfc_open
*open
)
1650 RESOLVE_TAG (&tag_unit
, open
->unit
);
1651 RESOLVE_TAG (&tag_iomsg
, open
->iomsg
);
1652 RESOLVE_TAG (&tag_iostat
, open
->iostat
);
1653 RESOLVE_TAG (&tag_file
, open
->file
);
1654 RESOLVE_TAG (&tag_status
, open
->status
);
1655 RESOLVE_TAG (&tag_e_access
, open
->access
);
1656 RESOLVE_TAG (&tag_e_form
, open
->form
);
1657 RESOLVE_TAG (&tag_e_recl
, open
->recl
);
1658 RESOLVE_TAG (&tag_e_blank
, open
->blank
);
1659 RESOLVE_TAG (&tag_e_position
, open
->position
);
1660 RESOLVE_TAG (&tag_e_action
, open
->action
);
1661 RESOLVE_TAG (&tag_e_delim
, open
->delim
);
1662 RESOLVE_TAG (&tag_e_pad
, open
->pad
);
1663 RESOLVE_TAG (&tag_e_decimal
, open
->decimal
);
1664 RESOLVE_TAG (&tag_e_encoding
, open
->encoding
);
1665 RESOLVE_TAG (&tag_e_async
, open
->asynchronous
);
1666 RESOLVE_TAG (&tag_e_round
, open
->round
);
1667 RESOLVE_TAG (&tag_e_sign
, open
->sign
);
1668 RESOLVE_TAG (&tag_convert
, open
->convert
);
1669 RESOLVE_TAG (&tag_newunit
, open
->newunit
);
1671 if (gfc_reference_st_label (open
->err
, ST_LABEL_TARGET
) == FAILURE
)
1678 /* Check if a given value for a SPECIFIER is either in the list of values
1679 allowed in F95 or F2003, issuing an error message and returning a zero
1680 value if it is not allowed. */
1683 compare_to_allowed_values (const char *specifier
, const char *allowed
[],
1684 const char *allowed_f2003
[],
1685 const char *allowed_gnu
[], gfc_char_t
*value
,
1686 const char *statement
, bool warn
)
1691 len
= gfc_wide_strlen (value
);
1694 for (len
--; len
> 0; len
--)
1695 if (value
[len
] != ' ')
1700 for (i
= 0; allowed
[i
]; i
++)
1701 if (len
== strlen (allowed
[i
])
1702 && gfc_wide_strncasecmp (value
, allowed
[i
], strlen (allowed
[i
])) == 0)
1705 for (i
= 0; allowed_f2003
&& allowed_f2003
[i
]; i
++)
1706 if (len
== strlen (allowed_f2003
[i
])
1707 && gfc_wide_strncasecmp (value
, allowed_f2003
[i
],
1708 strlen (allowed_f2003
[i
])) == 0)
1710 notification n
= gfc_notification_std (GFC_STD_F2003
);
1712 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1714 gfc_warning ("Fortran 2003: %s specifier in %s statement at %C "
1715 "has value '%s'", specifier
, statement
,
1722 gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: %s specifier in "
1723 "%s statement at %C has value '%s'", specifier
,
1724 statement
, allowed_f2003
[i
]);
1732 for (i
= 0; allowed_gnu
&& allowed_gnu
[i
]; i
++)
1733 if (len
== strlen (allowed_gnu
[i
])
1734 && gfc_wide_strncasecmp (value
, allowed_gnu
[i
],
1735 strlen (allowed_gnu
[i
])) == 0)
1737 notification n
= gfc_notification_std (GFC_STD_GNU
);
1739 if (n
== WARNING
|| (warn
&& n
== ERROR
))
1741 gfc_warning ("Extension: %s specifier in %s statement at %C "
1742 "has value '%s'", specifier
, statement
,
1749 gfc_notify_std (GFC_STD_GNU
, "Extension: %s specifier in "
1750 "%s statement at %C has value '%s'", specifier
,
1751 statement
, allowed_gnu
[i
]);
1761 char *s
= gfc_widechar_to_char (value
, -1);
1762 gfc_warning ("%s specifier in %s statement at %C has invalid value '%s'",
1763 specifier
, statement
, s
);
1769 char *s
= gfc_widechar_to_char (value
, -1);
1770 gfc_error ("%s specifier in %s statement at %C has invalid value '%s'",
1771 specifier
, statement
, s
);
1778 /* Match an OPEN statement. */
1781 gfc_match_open (void)
1787 m
= gfc_match_char ('(');
1791 open
= XCNEW (gfc_open
);
1793 m
= match_open_element (open
);
1795 if (m
== MATCH_ERROR
)
1799 m
= gfc_match_expr (&open
->unit
);
1800 if (m
== MATCH_ERROR
)
1806 if (gfc_match_char (')') == MATCH_YES
)
1808 if (gfc_match_char (',') != MATCH_YES
)
1811 m
= match_open_element (open
);
1812 if (m
== MATCH_ERROR
)
1818 if (gfc_match_eos () == MATCH_NO
)
1821 if (gfc_pure (NULL
))
1823 gfc_error ("OPEN statement not allowed in PURE procedure at %C");
1827 warn
= (open
->err
|| open
->iostat
) ? true : false;
1829 /* Checks on NEWUNIT specifier. */
1834 gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
1838 if (!(open
->file
|| (open
->status
1839 && gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
1840 "scratch", 7) == 0)))
1842 gfc_error ("NEWUNIT specifier must have FILE= "
1843 "or STATUS='scratch' at %C");
1847 else if (!open
->unit
)
1849 gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
1853 /* Checks on the ACCESS specifier. */
1854 if (open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
)
1856 static const char *access_f95
[] = { "SEQUENTIAL", "DIRECT", NULL
};
1857 static const char *access_f2003
[] = { "STREAM", NULL
};
1858 static const char *access_gnu
[] = { "APPEND", NULL
};
1860 if (!compare_to_allowed_values ("ACCESS", access_f95
, access_f2003
,
1862 open
->access
->value
.character
.string
,
1867 /* Checks on the ACTION specifier. */
1868 if (open
->action
&& open
->action
->expr_type
== EXPR_CONSTANT
)
1870 static const char *action
[] = { "READ", "WRITE", "READWRITE", NULL
};
1872 if (!compare_to_allowed_values ("ACTION", action
, NULL
, NULL
,
1873 open
->action
->value
.character
.string
,
1878 /* Checks on the ASYNCHRONOUS specifier. */
1879 if (open
->asynchronous
)
1881 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: ASYNCHRONOUS= at %C "
1882 "not allowed in Fortran 95") == FAILURE
)
1885 if (open
->asynchronous
->expr_type
== EXPR_CONSTANT
)
1887 static const char * asynchronous
[] = { "YES", "NO", NULL
};
1889 if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous
,
1890 NULL
, NULL
, open
->asynchronous
->value
.character
.string
,
1896 /* Checks on the BLANK specifier. */
1899 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: BLANK= at %C "
1900 "not allowed in Fortran 95") == FAILURE
)
1903 if (open
->blank
->expr_type
== EXPR_CONSTANT
)
1905 static const char *blank
[] = { "ZERO", "NULL", NULL
};
1907 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
1908 open
->blank
->value
.character
.string
,
1914 /* Checks on the DECIMAL specifier. */
1917 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DECIMAL= at %C "
1918 "not allowed in Fortran 95") == FAILURE
)
1921 if (open
->decimal
->expr_type
== EXPR_CONSTANT
)
1923 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
1925 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
1926 open
->decimal
->value
.character
.string
,
1932 /* Checks on the DELIM specifier. */
1935 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DELIM= at %C "
1936 "not allowed in Fortran 95") == FAILURE
)
1939 if (open
->delim
->expr_type
== EXPR_CONSTANT
)
1941 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
1943 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
1944 open
->delim
->value
.character
.string
,
1950 /* Checks on the ENCODING specifier. */
1953 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: ENCODING= at %C "
1954 "not allowed in Fortran 95") == FAILURE
)
1957 if (open
->encoding
->expr_type
== EXPR_CONSTANT
)
1959 static const char * encoding
[] = { "DEFAULT", "UTF-8", NULL
};
1961 if (!compare_to_allowed_values ("ENCODING", encoding
, NULL
, NULL
,
1962 open
->encoding
->value
.character
.string
,
1968 /* Checks on the FORM specifier. */
1969 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
)
1971 static const char *form
[] = { "FORMATTED", "UNFORMATTED", NULL
};
1973 if (!compare_to_allowed_values ("FORM", form
, NULL
, NULL
,
1974 open
->form
->value
.character
.string
,
1979 /* Checks on the PAD specifier. */
1980 if (open
->pad
&& open
->pad
->expr_type
== EXPR_CONSTANT
)
1982 static const char *pad
[] = { "YES", "NO", NULL
};
1984 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
1985 open
->pad
->value
.character
.string
,
1990 /* Checks on the POSITION specifier. */
1991 if (open
->position
&& open
->position
->expr_type
== EXPR_CONSTANT
)
1993 static const char *position
[] = { "ASIS", "REWIND", "APPEND", NULL
};
1995 if (!compare_to_allowed_values ("POSITION", position
, NULL
, NULL
,
1996 open
->position
->value
.character
.string
,
2001 /* Checks on the ROUND specifier. */
2004 if (gfc_notify_std (GFC_STD_F2003
, "Fortran F2003: ROUND= at %C "
2005 "not allowed in Fortran 95") == FAILURE
)
2008 if (open
->round
->expr_type
== EXPR_CONSTANT
)
2010 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
2011 "COMPATIBLE", "PROCESSOR_DEFINED",
2014 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
2015 open
->round
->value
.character
.string
,
2021 /* Checks on the SIGN specifier. */
2024 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: SIGN= at %C "
2025 "not allowed in Fortran 95") == FAILURE
)
2028 if (open
->sign
->expr_type
== EXPR_CONSTANT
)
2030 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
2033 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
2034 open
->sign
->value
.character
.string
,
2040 #define warn_or_error(...) \
2043 gfc_warning (__VA_ARGS__); \
2046 gfc_error (__VA_ARGS__); \
2051 /* Checks on the RECL specifier. */
2052 if (open
->recl
&& open
->recl
->expr_type
== EXPR_CONSTANT
2053 && open
->recl
->ts
.type
== BT_INTEGER
2054 && mpz_sgn (open
->recl
->value
.integer
) != 1)
2056 warn_or_error ("RECL in OPEN statement at %C must be positive");
2059 /* Checks on the STATUS specifier. */
2060 if (open
->status
&& open
->status
->expr_type
== EXPR_CONSTANT
)
2062 static const char *status
[] = { "OLD", "NEW", "SCRATCH",
2063 "REPLACE", "UNKNOWN", NULL
};
2065 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2066 open
->status
->value
.character
.string
,
2070 /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE,
2071 the FILE= specifier shall appear. */
2072 if (open
->file
== NULL
2073 && (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2075 || gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2078 char *s
= gfc_widechar_to_char (open
->status
->value
.character
.string
,
2080 warn_or_error ("The STATUS specified in OPEN statement at %C is "
2081 "'%s' and no FILE specifier is present", s
);
2085 /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH,
2086 the FILE= specifier shall not appear. */
2087 if (gfc_wide_strncasecmp (open
->status
->value
.character
.string
,
2088 "scratch", 7) == 0 && open
->file
)
2090 warn_or_error ("The STATUS specified in OPEN statement at %C "
2091 "cannot have the value SCRATCH if a FILE specifier "
2096 /* Things that are not allowed for unformatted I/O. */
2097 if (open
->form
&& open
->form
->expr_type
== EXPR_CONSTANT
2098 && (open
->delim
|| open
->decimal
|| open
->encoding
|| open
->round
2099 || open
->sign
|| open
->pad
|| open
->blank
)
2100 && gfc_wide_strncasecmp (open
->form
->value
.character
.string
,
2101 "unformatted", 11) == 0)
2103 const char *spec
= (open
->delim
? "DELIM "
2104 : (open
->pad
? "PAD " : open
->blank
2107 warn_or_error ("%s specifier at %C not allowed in OPEN statement for "
2108 "unformatted I/O", spec
);
2111 if (open
->recl
&& open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2112 && gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2115 warn_or_error ("RECL specifier not allowed in OPEN statement at %C for "
2120 && open
->access
&& open
->access
->expr_type
== EXPR_CONSTANT
2121 && !(gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2122 "sequential", 10) == 0
2123 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2125 || gfc_wide_strncasecmp (open
->access
->value
.character
.string
,
2128 warn_or_error ("POSITION specifier in OPEN statement at %C only allowed "
2129 "for stream or sequential ACCESS");
2132 #undef warn_or_error
2134 new_st
.op
= EXEC_OPEN
;
2135 new_st
.ext
.open
= open
;
2139 gfc_syntax_error (ST_OPEN
);
2142 gfc_free_open (open
);
2147 /* Free a gfc_close structure an all its expressions. */
2150 gfc_free_close (gfc_close
*close
)
2155 gfc_free_expr (close
->unit
);
2156 gfc_free_expr (close
->iomsg
);
2157 gfc_free_expr (close
->iostat
);
2158 gfc_free_expr (close
->status
);
2163 /* Match elements of a CLOSE statement. */
2166 match_close_element (gfc_close
*close
)
2170 m
= match_etag (&tag_unit
, &close
->unit
);
2173 m
= match_etag (&tag_status
, &close
->status
);
2176 m
= match_out_tag (&tag_iomsg
, &close
->iomsg
);
2179 m
= match_out_tag (&tag_iostat
, &close
->iostat
);
2182 m
= match_ltag (&tag_err
, &close
->err
);
2190 /* Match a CLOSE statement. */
2193 gfc_match_close (void)
2199 m
= gfc_match_char ('(');
2203 close
= XCNEW (gfc_close
);
2205 m
= match_close_element (close
);
2207 if (m
== MATCH_ERROR
)
2211 m
= gfc_match_expr (&close
->unit
);
2214 if (m
== MATCH_ERROR
)
2220 if (gfc_match_char (')') == MATCH_YES
)
2222 if (gfc_match_char (',') != MATCH_YES
)
2225 m
= match_close_element (close
);
2226 if (m
== MATCH_ERROR
)
2232 if (gfc_match_eos () == MATCH_NO
)
2235 if (gfc_pure (NULL
))
2237 gfc_error ("CLOSE statement not allowed in PURE procedure at %C");
2241 warn
= (close
->iostat
|| close
->err
) ? true : false;
2243 /* Checks on the STATUS specifier. */
2244 if (close
->status
&& close
->status
->expr_type
== EXPR_CONSTANT
)
2246 static const char *status
[] = { "KEEP", "DELETE", NULL
};
2248 if (!compare_to_allowed_values ("STATUS", status
, NULL
, NULL
,
2249 close
->status
->value
.character
.string
,
2254 new_st
.op
= EXEC_CLOSE
;
2255 new_st
.ext
.close
= close
;
2259 gfc_syntax_error (ST_CLOSE
);
2262 gfc_free_close (close
);
2267 /* Resolve everything in a gfc_close structure. */
2270 gfc_resolve_close (gfc_close
*close
)
2272 RESOLVE_TAG (&tag_unit
, close
->unit
);
2273 RESOLVE_TAG (&tag_iomsg
, close
->iomsg
);
2274 RESOLVE_TAG (&tag_iostat
, close
->iostat
);
2275 RESOLVE_TAG (&tag_status
, close
->status
);
2277 if (gfc_reference_st_label (close
->err
, ST_LABEL_TARGET
) == FAILURE
)
2280 if (close
->unit
->expr_type
== EXPR_CONSTANT
2281 && close
->unit
->ts
.type
== BT_INTEGER
2282 && mpz_sgn (close
->unit
->value
.integer
) < 0)
2284 gfc_error ("UNIT number in CLOSE statement at %L must be non-negative",
2285 &close
->unit
->where
);
2292 /* Free a gfc_filepos structure. */
2295 gfc_free_filepos (gfc_filepos
*fp
)
2297 gfc_free_expr (fp
->unit
);
2298 gfc_free_expr (fp
->iomsg
);
2299 gfc_free_expr (fp
->iostat
);
2304 /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */
2307 match_file_element (gfc_filepos
*fp
)
2311 m
= match_etag (&tag_unit
, &fp
->unit
);
2314 m
= match_out_tag (&tag_iomsg
, &fp
->iomsg
);
2317 m
= match_out_tag (&tag_iostat
, &fp
->iostat
);
2320 m
= match_ltag (&tag_err
, &fp
->err
);
2328 /* Match the second half of the file-positioning statements, REWIND,
2329 BACKSPACE, ENDFILE, or the FLUSH statement. */
2332 match_filepos (gfc_statement st
, gfc_exec_op op
)
2337 fp
= XCNEW (gfc_filepos
);
2339 if (gfc_match_char ('(') == MATCH_NO
)
2341 m
= gfc_match_expr (&fp
->unit
);
2342 if (m
== MATCH_ERROR
)
2350 m
= match_file_element (fp
);
2351 if (m
== MATCH_ERROR
)
2355 m
= gfc_match_expr (&fp
->unit
);
2356 if (m
== MATCH_ERROR
)
2364 if (gfc_match_char (')') == MATCH_YES
)
2366 if (gfc_match_char (',') != MATCH_YES
)
2369 m
= match_file_element (fp
);
2370 if (m
== MATCH_ERROR
)
2377 if (gfc_match_eos () != MATCH_YES
)
2380 if (gfc_pure (NULL
))
2382 gfc_error ("%s statement not allowed in PURE procedure at %C",
2383 gfc_ascii_statement (st
));
2389 new_st
.ext
.filepos
= fp
;
2393 gfc_syntax_error (st
);
2396 gfc_free_filepos (fp
);
2402 gfc_resolve_filepos (gfc_filepos
*fp
)
2404 RESOLVE_TAG (&tag_unit
, fp
->unit
);
2405 RESOLVE_TAG (&tag_iostat
, fp
->iostat
);
2406 RESOLVE_TAG (&tag_iomsg
, fp
->iomsg
);
2407 if (gfc_reference_st_label (fp
->err
, ST_LABEL_TARGET
) == FAILURE
)
2410 if (fp
->unit
->expr_type
== EXPR_CONSTANT
2411 && fp
->unit
->ts
.type
== BT_INTEGER
2412 && mpz_sgn (fp
->unit
->value
.integer
) < 0)
2414 gfc_error ("UNIT number in statement at %L must be non-negative",
2422 /* Match the file positioning statements: ENDFILE, BACKSPACE, REWIND,
2423 and the FLUSH statement. */
2426 gfc_match_endfile (void)
2428 return match_filepos (ST_END_FILE
, EXEC_ENDFILE
);
2432 gfc_match_backspace (void)
2434 return match_filepos (ST_BACKSPACE
, EXEC_BACKSPACE
);
2438 gfc_match_rewind (void)
2440 return match_filepos (ST_REWIND
, EXEC_REWIND
);
2444 gfc_match_flush (void)
2446 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: FLUSH statement at %C")
2450 return match_filepos (ST_FLUSH
, EXEC_FLUSH
);
2453 /******************** Data Transfer Statements *********************/
2455 /* Return a default unit number. */
2458 default_unit (io_kind k
)
2467 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, unit
);
2471 /* Match a unit specification for a data transfer statement. */
2474 match_dt_unit (io_kind k
, gfc_dt
*dt
)
2478 if (gfc_match_char ('*') == MATCH_YES
)
2480 if (dt
->io_unit
!= NULL
)
2483 dt
->io_unit
= default_unit (k
);
2487 if (gfc_match_expr (&e
) == MATCH_YES
)
2489 if (dt
->io_unit
!= NULL
)
2502 gfc_error ("Duplicate UNIT specification at %C");
2507 /* Match a format specification. */
2510 match_dt_format (gfc_dt
*dt
)
2514 gfc_st_label
*label
;
2517 where
= gfc_current_locus
;
2519 if (gfc_match_char ('*') == MATCH_YES
)
2521 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2524 dt
->format_label
= &format_asterisk
;
2528 if ((m
= gfc_match_st_label (&label
)) == MATCH_YES
)
2530 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2532 gfc_free_st_label (label
);
2536 if (gfc_reference_st_label (label
, ST_LABEL_FORMAT
) == FAILURE
)
2539 dt
->format_label
= label
;
2542 else if (m
== MATCH_ERROR
)
2543 /* The label was zero or too large. Emit the correct diagnosis. */
2546 if (gfc_match_expr (&e
) == MATCH_YES
)
2548 if (dt
->format_expr
!= NULL
|| dt
->format_label
!= NULL
)
2553 dt
->format_expr
= e
;
2557 gfc_current_locus
= where
; /* The only case where we have to restore */
2562 gfc_error ("Duplicate format specification at %C");
2567 /* Traverse a namelist that is part of a READ statement to make sure
2568 that none of the variables in the namelist are INTENT(IN). Returns
2569 nonzero if we find such a variable. */
2572 check_namelist (gfc_symbol
*sym
)
2576 for (p
= sym
->namelist
; p
; p
= p
->next
)
2577 if (p
->sym
->attr
.intent
== INTENT_IN
)
2579 gfc_error ("Symbol '%s' in namelist '%s' is INTENT(IN) at %C",
2580 p
->sym
->name
, sym
->name
);
2588 /* Match a single data transfer element. */
2591 match_dt_element (io_kind k
, gfc_dt
*dt
)
2593 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2597 if (gfc_match (" unit =") == MATCH_YES
)
2599 m
= match_dt_unit (k
, dt
);
2604 if (gfc_match (" fmt =") == MATCH_YES
)
2606 m
= match_dt_format (dt
);
2611 if (gfc_match (" nml = %n", name
) == MATCH_YES
)
2613 if (dt
->namelist
!= NULL
)
2615 gfc_error ("Duplicate NML specification at %C");
2619 if (gfc_find_symbol (name
, NULL
, 1, &sym
))
2622 if (sym
== NULL
|| sym
->attr
.flavor
!= FL_NAMELIST
)
2624 gfc_error ("Symbol '%s' at %C must be a NAMELIST group name",
2625 sym
!= NULL
? sym
->name
: name
);
2630 if (k
== M_READ
&& check_namelist (sym
))
2636 m
= match_etag (&tag_e_async
, &dt
->asynchronous
);
2639 m
= match_etag (&tag_e_blank
, &dt
->blank
);
2642 m
= match_etag (&tag_e_delim
, &dt
->delim
);
2645 m
= match_etag (&tag_e_pad
, &dt
->pad
);
2648 m
= match_etag (&tag_e_sign
, &dt
->sign
);
2651 m
= match_etag (&tag_e_round
, &dt
->round
);
2654 m
= match_out_tag (&tag_id
, &dt
->id
);
2657 m
= match_etag (&tag_e_decimal
, &dt
->decimal
);
2660 m
= match_etag (&tag_rec
, &dt
->rec
);
2663 m
= match_etag (&tag_spos
, &dt
->pos
);
2666 m
= match_out_tag (&tag_iomsg
, &dt
->iomsg
);
2669 m
= match_out_tag (&tag_iostat
, &dt
->iostat
);
2672 m
= match_ltag (&tag_err
, &dt
->err
);
2674 dt
->err_where
= gfc_current_locus
;
2677 m
= match_etag (&tag_advance
, &dt
->advance
);
2680 m
= match_out_tag (&tag_size
, &dt
->size
);
2684 m
= match_ltag (&tag_end
, &dt
->end
);
2689 gfc_error ("END tag at %C not allowed in output statement");
2692 dt
->end_where
= gfc_current_locus
;
2697 m
= match_ltag (&tag_eor
, &dt
->eor
);
2699 dt
->eor_where
= gfc_current_locus
;
2707 /* Free a data transfer structure and everything below it. */
2710 gfc_free_dt (gfc_dt
*dt
)
2715 gfc_free_expr (dt
->io_unit
);
2716 gfc_free_expr (dt
->format_expr
);
2717 gfc_free_expr (dt
->rec
);
2718 gfc_free_expr (dt
->advance
);
2719 gfc_free_expr (dt
->iomsg
);
2720 gfc_free_expr (dt
->iostat
);
2721 gfc_free_expr (dt
->size
);
2722 gfc_free_expr (dt
->pad
);
2723 gfc_free_expr (dt
->delim
);
2724 gfc_free_expr (dt
->sign
);
2725 gfc_free_expr (dt
->round
);
2726 gfc_free_expr (dt
->blank
);
2727 gfc_free_expr (dt
->decimal
);
2728 gfc_free_expr (dt
->pos
);
2729 gfc_free_expr (dt
->dt_io_kind
);
2730 /* dt->extra_comma is a link to dt_io_kind if it is set. */
2735 /* Resolve everything in a gfc_dt structure. */
2738 gfc_resolve_dt (gfc_dt
*dt
, locus
*loc
)
2743 /* This is set in any case. */
2744 gcc_assert (dt
->dt_io_kind
);
2745 k
= dt
->dt_io_kind
->value
.iokind
;
2747 RESOLVE_TAG (&tag_format
, dt
->format_expr
);
2748 RESOLVE_TAG (&tag_rec
, dt
->rec
);
2749 RESOLVE_TAG (&tag_spos
, dt
->pos
);
2750 RESOLVE_TAG (&tag_advance
, dt
->advance
);
2751 RESOLVE_TAG (&tag_id
, dt
->id
);
2752 RESOLVE_TAG (&tag_iomsg
, dt
->iomsg
);
2753 RESOLVE_TAG (&tag_iostat
, dt
->iostat
);
2754 RESOLVE_TAG (&tag_size
, dt
->size
);
2755 RESOLVE_TAG (&tag_e_pad
, dt
->pad
);
2756 RESOLVE_TAG (&tag_e_delim
, dt
->delim
);
2757 RESOLVE_TAG (&tag_e_sign
, dt
->sign
);
2758 RESOLVE_TAG (&tag_e_round
, dt
->round
);
2759 RESOLVE_TAG (&tag_e_blank
, dt
->blank
);
2760 RESOLVE_TAG (&tag_e_decimal
, dt
->decimal
);
2761 RESOLVE_TAG (&tag_e_async
, dt
->asynchronous
);
2766 gfc_error ("UNIT not specified at %L", loc
);
2770 if (gfc_resolve_expr (e
) == SUCCESS
2771 && (e
->ts
.type
!= BT_INTEGER
2772 && (e
->ts
.type
!= BT_CHARACTER
|| e
->expr_type
!= EXPR_VARIABLE
)))
2774 /* If there is no extra comma signifying the "format" form of the IO
2775 statement, then this must be an error. */
2776 if (!dt
->extra_comma
)
2778 gfc_error ("UNIT specification at %L must be an INTEGER expression "
2779 "or a CHARACTER variable", &e
->where
);
2784 /* At this point, we have an extra comma. If io_unit has arrived as
2785 type character, we assume its really the "format" form of the I/O
2786 statement. We set the io_unit to the default unit and format to
2787 the character expression. See F95 Standard section 9.4. */
2788 if (e
->ts
.type
== BT_CHARACTER
&& (k
== M_READ
|| k
== M_PRINT
))
2790 dt
->format_expr
= dt
->io_unit
;
2791 dt
->io_unit
= default_unit (k
);
2793 /* Nullify this pointer now so that a warning/error is not
2794 triggered below for the "Extension". */
2795 dt
->extra_comma
= NULL
;
2800 gfc_error ("Invalid form of WRITE statement at %L, UNIT required",
2801 &dt
->extra_comma
->where
);
2807 if (e
->ts
.type
== BT_CHARACTER
)
2809 if (gfc_has_vector_index (e
))
2811 gfc_error ("Internal unit with vector subscript at %L", &e
->where
);
2815 /* If we are writing, make sure the internal unit can be changed. */
2816 gcc_assert (k
!= M_PRINT
);
2818 && gfc_check_vardef_context (e
, false, _("internal unit in WRITE"))
2823 if (e
->rank
&& e
->ts
.type
!= BT_CHARACTER
)
2825 gfc_error ("External IO UNIT cannot be an array at %L", &e
->where
);
2829 if (e
->expr_type
== EXPR_CONSTANT
&& e
->ts
.type
== BT_INTEGER
2830 && mpz_sgn (e
->value
.integer
) < 0)
2832 gfc_error ("UNIT number in statement at %L must be non-negative",
2837 /* If we are reading and have a namelist, check that all namelist symbols
2838 can appear in a variable definition context. */
2839 if (k
== M_READ
&& dt
->namelist
)
2842 for (n
= dt
->namelist
->namelist
; n
; n
= n
->next
)
2847 e
= gfc_get_variable_expr (gfc_find_sym_in_symtree (n
->sym
));
2848 t
= gfc_check_vardef_context (e
, false, NULL
);
2853 gfc_error ("NAMELIST '%s' in READ statement at %L contains"
2854 " the symbol '%s' which may not appear in a"
2855 " variable definition context",
2856 dt
->namelist
->name
, loc
, n
->sym
->name
);
2863 && gfc_notify_std (GFC_STD_GNU
, "Extension: Comma before i/o "
2864 "item list at %L", &dt
->extra_comma
->where
) == FAILURE
)
2869 if (gfc_reference_st_label (dt
->err
, ST_LABEL_TARGET
) == FAILURE
)
2871 if (dt
->err
->defined
== ST_LABEL_UNKNOWN
)
2873 gfc_error ("ERR tag label %d at %L not defined",
2874 dt
->err
->value
, &dt
->err_where
);
2881 if (gfc_reference_st_label (dt
->end
, ST_LABEL_TARGET
) == FAILURE
)
2883 if (dt
->end
->defined
== ST_LABEL_UNKNOWN
)
2885 gfc_error ("END tag label %d at %L not defined",
2886 dt
->end
->value
, &dt
->end_where
);
2893 if (gfc_reference_st_label (dt
->eor
, ST_LABEL_TARGET
) == FAILURE
)
2895 if (dt
->eor
->defined
== ST_LABEL_UNKNOWN
)
2897 gfc_error ("EOR tag label %d at %L not defined",
2898 dt
->eor
->value
, &dt
->eor_where
);
2903 /* Check the format label actually exists. */
2904 if (dt
->format_label
&& dt
->format_label
!= &format_asterisk
2905 && dt
->format_label
->defined
== ST_LABEL_UNKNOWN
)
2907 gfc_error ("FORMAT label %d at %L not defined", dt
->format_label
->value
,
2908 &dt
->format_label
->where
);
2916 /* Given an io_kind, return its name. */
2919 io_kind_name (io_kind k
)
2938 gfc_internal_error ("io_kind_name(): bad I/O-kind");
2945 /* Match an IO iteration statement of the form:
2947 ( [<IO element> ,] <IO element>, I = <expr>, <expr> [, <expr> ] )
2949 which is equivalent to a single IO element. This function is
2950 mutually recursive with match_io_element(). */
2952 static match
match_io_element (io_kind
, gfc_code
**);
2955 match_io_iterator (io_kind k
, gfc_code
**result
)
2957 gfc_code
*head
, *tail
, *new_code
;
2965 old_loc
= gfc_current_locus
;
2967 if (gfc_match_char ('(') != MATCH_YES
)
2970 m
= match_io_element (k
, &head
);
2973 if (m
!= MATCH_YES
|| gfc_match_char (',') != MATCH_YES
)
2979 /* Can't be anything but an IO iterator. Build a list. */
2980 iter
= gfc_get_iterator ();
2984 m
= gfc_match_iterator (iter
, 0);
2985 if (m
== MATCH_ERROR
)
2989 gfc_check_do_variable (iter
->var
->symtree
);
2993 m
= match_io_element (k
, &new_code
);
2994 if (m
== MATCH_ERROR
)
3003 tail
= gfc_append_code (tail
, new_code
);
3005 if (gfc_match_char (',') != MATCH_YES
)
3014 if (gfc_match_char (')') != MATCH_YES
)
3017 new_code
= gfc_get_code ();
3018 new_code
->op
= EXEC_DO
;
3019 new_code
->ext
.iterator
= iter
;
3021 new_code
->block
= gfc_get_code ();
3022 new_code
->block
->op
= EXEC_DO
;
3023 new_code
->block
->next
= head
;
3029 gfc_error ("Syntax error in I/O iterator at %C");
3033 gfc_free_iterator (iter
, 1);
3034 gfc_free_statements (head
);
3035 gfc_current_locus
= old_loc
;
3040 /* Match a single element of an IO list, which is either a single
3041 expression or an IO Iterator. */
3044 match_io_element (io_kind k
, gfc_code
**cpp
)
3052 m
= match_io_iterator (k
, cpp
);
3058 m
= gfc_match_variable (&expr
, 0);
3060 gfc_error ("Expected variable in READ statement at %C");
3064 m
= gfc_match_expr (&expr
);
3066 gfc_error ("Expected expression in %s statement at %C",
3070 if (m
== MATCH_YES
&& k
== M_READ
&& gfc_check_do_variable (expr
->symtree
))
3075 gfc_free_expr (expr
);
3079 cp
= gfc_get_code ();
3080 cp
->op
= EXEC_TRANSFER
;
3082 cp
->ext
.dt
= current_dt
;
3089 /* Match an I/O list, building gfc_code structures as we go. */
3092 match_io_list (io_kind k
, gfc_code
**head_p
)
3094 gfc_code
*head
, *tail
, *new_code
;
3097 *head_p
= head
= tail
= NULL
;
3098 if (gfc_match_eos () == MATCH_YES
)
3103 m
= match_io_element (k
, &new_code
);
3104 if (m
== MATCH_ERROR
)
3109 tail
= gfc_append_code (tail
, new_code
);
3113 if (gfc_match_eos () == MATCH_YES
)
3115 if (gfc_match_char (',') != MATCH_YES
)
3123 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3126 gfc_free_statements (head
);
3131 /* Attach the data transfer end node. */
3134 terminate_io (gfc_code
*io_code
)
3138 if (io_code
== NULL
)
3139 io_code
= new_st
.block
;
3141 c
= gfc_get_code ();
3142 c
->op
= EXEC_DT_END
;
3144 /* Point to structure that is already there */
3145 c
->ext
.dt
= new_st
.ext
.dt
;
3146 gfc_append_code (io_code
, c
);
3150 /* Check the constraints for a data transfer statement. The majority of the
3151 constraints appearing in 9.4 of the standard appear here. Some are handled
3152 in resolve_tag and others in gfc_resolve_dt. */
3155 check_io_constraints (io_kind k
, gfc_dt
*dt
, gfc_code
*io_code
,
3158 #define io_constraint(condition,msg,arg)\
3161 gfc_error(msg,arg);\
3167 gfc_symbol
*sym
= NULL
;
3168 bool warn
, unformatted
;
3170 warn
= (dt
->err
|| dt
->iostat
) ? true : false;
3171 unformatted
= dt
->format_expr
== NULL
&& dt
->format_label
== NULL
3172 && dt
->namelist
== NULL
;
3177 if (expr
&& expr
->expr_type
== EXPR_VARIABLE
3178 && expr
->ts
.type
== BT_CHARACTER
)
3180 sym
= expr
->symtree
->n
.sym
;
3182 io_constraint (k
== M_WRITE
&& sym
->attr
.intent
== INTENT_IN
,
3183 "Internal file at %L must not be INTENT(IN)",
3186 io_constraint (gfc_has_vector_index (dt
->io_unit
),
3187 "Internal file incompatible with vector subscript at %L",
3190 io_constraint (dt
->rec
!= NULL
,
3191 "REC tag at %L is incompatible with internal file",
3194 io_constraint (dt
->pos
!= NULL
,
3195 "POS tag at %L is incompatible with internal file",
3198 io_constraint (unformatted
,
3199 "Unformatted I/O not allowed with internal unit at %L",
3200 &dt
->io_unit
->where
);
3202 io_constraint (dt
->asynchronous
!= NULL
,
3203 "ASYNCHRONOUS tag at %L not allowed with internal file",
3204 &dt
->asynchronous
->where
);
3206 if (dt
->namelist
!= NULL
)
3208 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: Internal file "
3209 "at %L with namelist", &expr
->where
)
3214 io_constraint (dt
->advance
!= NULL
,
3215 "ADVANCE tag at %L is incompatible with internal file",
3216 &dt
->advance
->where
);
3219 if (expr
&& expr
->ts
.type
!= BT_CHARACTER
)
3222 io_constraint (gfc_pure (NULL
) && (k
== M_READ
|| k
== M_WRITE
),
3223 "IO UNIT in %s statement at %C must be "
3224 "an internal file in a PURE procedure",
3230 io_constraint (dt
->end
, "END tag not allowed with output at %L",
3233 io_constraint (dt
->eor
, "EOR tag not allowed with output at %L",
3236 io_constraint (dt
->blank
, "BLANK= specifier not allowed with output at %L",
3239 io_constraint (dt
->pad
, "PAD= specifier not allowed with output at %L",
3242 io_constraint (dt
->size
, "SIZE= specifier not allowed with output at %L",
3247 io_constraint (dt
->size
&& dt
->advance
== NULL
,
3248 "SIZE tag at %L requires an ADVANCE tag",
3251 io_constraint (dt
->eor
&& dt
->advance
== NULL
,
3252 "EOR tag at %L requires an ADVANCE tag",
3256 if (dt
->asynchronous
)
3258 static const char * asynchronous
[] = { "YES", "NO", NULL
};
3260 if (gfc_reduce_init_expr (dt
->asynchronous
) != SUCCESS
)
3262 gfc_error ("ASYNCHRONOUS= specifier at %L must be an initialization "
3263 "expression", &dt
->asynchronous
->where
);
3267 if (!compare_to_allowed_values
3268 ("ASYNCHRONOUS", asynchronous
, NULL
, NULL
,
3269 dt
->asynchronous
->value
.character
.string
,
3270 io_kind_name (k
), warn
))
3278 || gfc_wide_strlen (dt
->asynchronous
->value
.character
.string
) != 3
3279 || gfc_wide_strncasecmp (dt
->asynchronous
->value
.character
.string
,
3281 io_constraint (not_yes
,
3282 "ID= specifier at %L must be with ASYNCHRONOUS='yes' "
3283 "specifier", &dt
->id
->where
);
3288 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DECIMAL= at %C "
3289 "not allowed in Fortran 95") == FAILURE
)
3292 if (dt
->decimal
->expr_type
== EXPR_CONSTANT
)
3294 static const char * decimal
[] = { "COMMA", "POINT", NULL
};
3296 if (!compare_to_allowed_values ("DECIMAL", decimal
, NULL
, NULL
,
3297 dt
->decimal
->value
.character
.string
,
3298 io_kind_name (k
), warn
))
3301 io_constraint (unformatted
,
3302 "the DECIMAL= specifier at %L must be with an "
3303 "explicit format expression", &dt
->decimal
->where
);
3309 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: BLANK= at %C "
3310 "not allowed in Fortran 95") == FAILURE
)
3313 if (dt
->blank
->expr_type
== EXPR_CONSTANT
)
3315 static const char * blank
[] = { "NULL", "ZERO", NULL
};
3317 if (!compare_to_allowed_values ("BLANK", blank
, NULL
, NULL
,
3318 dt
->blank
->value
.character
.string
,
3319 io_kind_name (k
), warn
))
3322 io_constraint (unformatted
,
3323 "the BLANK= specifier at %L must be with an "
3324 "explicit format expression", &dt
->blank
->where
);
3330 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: PAD= at %C "
3331 "not allowed in Fortran 95") == FAILURE
)
3334 if (dt
->pad
->expr_type
== EXPR_CONSTANT
)
3336 static const char * pad
[] = { "YES", "NO", NULL
};
3338 if (!compare_to_allowed_values ("PAD", pad
, NULL
, NULL
,
3339 dt
->pad
->value
.character
.string
,
3340 io_kind_name (k
), warn
))
3343 io_constraint (unformatted
,
3344 "the PAD= specifier at %L must be with an "
3345 "explicit format expression", &dt
->pad
->where
);
3351 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: ROUND= at %C "
3352 "not allowed in Fortran 95") == FAILURE
)
3355 if (dt
->round
->expr_type
== EXPR_CONSTANT
)
3357 static const char * round
[] = { "UP", "DOWN", "ZERO", "NEAREST",
3358 "COMPATIBLE", "PROCESSOR_DEFINED",
3361 if (!compare_to_allowed_values ("ROUND", round
, NULL
, NULL
,
3362 dt
->round
->value
.character
.string
,
3363 io_kind_name (k
), warn
))
3370 /* When implemented, change the following to use gfc_notify_std F2003.
3371 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SIGN= at %C "
3372 "not allowed in Fortran 95") == FAILURE)
3373 return MATCH_ERROR; */
3374 if (dt
->sign
->expr_type
== EXPR_CONSTANT
)
3376 static const char * sign
[] = { "PLUS", "SUPPRESS", "PROCESSOR_DEFINED",
3379 if (!compare_to_allowed_values ("SIGN", sign
, NULL
, NULL
,
3380 dt
->sign
->value
.character
.string
,
3381 io_kind_name (k
), warn
))
3384 io_constraint (unformatted
,
3385 "SIGN= specifier at %L must be with an "
3386 "explicit format expression", &dt
->sign
->where
);
3388 io_constraint (k
== M_READ
,
3389 "SIGN= specifier at %L not allowed in a "
3390 "READ statement", &dt
->sign
->where
);
3396 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: DELIM= at %C "
3397 "not allowed in Fortran 95") == FAILURE
)
3400 if (dt
->delim
->expr_type
== EXPR_CONSTANT
)
3402 static const char *delim
[] = { "APOSTROPHE", "QUOTE", "NONE", NULL
};
3404 if (!compare_to_allowed_values ("DELIM", delim
, NULL
, NULL
,
3405 dt
->delim
->value
.character
.string
,
3406 io_kind_name (k
), warn
))
3409 io_constraint (k
== M_READ
,
3410 "DELIM= specifier at %L not allowed in a "
3411 "READ statement", &dt
->delim
->where
);
3413 io_constraint (dt
->format_label
!= &format_asterisk
3414 && dt
->namelist
== NULL
,
3415 "DELIM= specifier at %L must have FMT=*",
3418 io_constraint (unformatted
&& dt
->namelist
== NULL
,
3419 "DELIM= specifier at %L must be with FMT=* or "
3420 "NML= specifier ", &dt
->delim
->where
);
3426 io_constraint (io_code
&& dt
->namelist
,
3427 "NAMELIST cannot be followed by IO-list at %L",
3430 io_constraint (dt
->format_expr
,
3431 "IO spec-list cannot contain both NAMELIST group name "
3432 "and format specification at %L",
3433 &dt
->format_expr
->where
);
3435 io_constraint (dt
->format_label
,
3436 "IO spec-list cannot contain both NAMELIST group name "
3437 "and format label at %L", spec_end
);
3439 io_constraint (dt
->rec
,
3440 "NAMELIST IO is not allowed with a REC= specifier "
3441 "at %L", &dt
->rec
->where
);
3443 io_constraint (dt
->advance
,
3444 "NAMELIST IO is not allowed with a ADVANCE= specifier "
3445 "at %L", &dt
->advance
->where
);
3450 io_constraint (dt
->end
,
3451 "An END tag is not allowed with a "
3452 "REC= specifier at %L", &dt
->end_where
);
3454 io_constraint (dt
->format_label
== &format_asterisk
,
3455 "FMT=* is not allowed with a REC= specifier "
3458 io_constraint (dt
->pos
,
3459 "POS= is not allowed with REC= specifier "
3460 "at %L", &dt
->pos
->where
);
3465 int not_yes
, not_no
;
3468 io_constraint (dt
->format_label
== &format_asterisk
,
3469 "List directed format(*) is not allowed with a "
3470 "ADVANCE= specifier at %L.", &expr
->where
);
3472 io_constraint (unformatted
,
3473 "the ADVANCE= specifier at %L must appear with an "
3474 "explicit format expression", &expr
->where
);
3476 if (expr
->expr_type
== EXPR_CONSTANT
&& expr
->ts
.type
== BT_CHARACTER
)
3478 const gfc_char_t
*advance
= expr
->value
.character
.string
;
3479 not_no
= gfc_wide_strlen (advance
) != 2
3480 || gfc_wide_strncasecmp (advance
, "no", 2) != 0;
3481 not_yes
= gfc_wide_strlen (advance
) != 3
3482 || gfc_wide_strncasecmp (advance
, "yes", 3) != 0;
3490 io_constraint (not_no
&& not_yes
,
3491 "ADVANCE= specifier at %L must have value = "
3492 "YES or NO.", &expr
->where
);
3494 io_constraint (dt
->size
&& not_no
&& k
== M_READ
,
3495 "SIZE tag at %L requires an ADVANCE = 'NO'",
3498 io_constraint (dt
->eor
&& not_no
&& k
== M_READ
,
3499 "EOR tag at %L requires an ADVANCE = 'NO'",
3503 expr
= dt
->format_expr
;
3504 if (gfc_simplify_expr (expr
, 0) == FAILURE
3505 || check_format_string (expr
, k
== M_READ
) == FAILURE
)
3510 #undef io_constraint
3513 /* Match a READ, WRITE or PRINT statement. */
3516 match_io (io_kind k
)
3518 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
3527 where
= gfc_current_locus
;
3529 current_dt
= dt
= XCNEW (gfc_dt
);
3530 m
= gfc_match_char ('(');
3533 where
= gfc_current_locus
;
3536 else if (k
== M_PRINT
)
3538 /* Treat the non-standard case of PRINT namelist. */
3539 if ((gfc_current_form
== FORM_FIXED
|| gfc_peek_ascii_char () == ' ')
3540 && gfc_match_name (name
) == MATCH_YES
)
3542 gfc_find_symbol (name
, NULL
, 1, &sym
);
3543 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3545 if (gfc_notify_std (GFC_STD_GNU
, "PRINT namelist at "
3546 "%C is an extension") == FAILURE
)
3552 dt
->io_unit
= default_unit (k
);
3557 gfc_current_locus
= where
;
3561 if (gfc_current_form
== FORM_FREE
)
3563 char c
= gfc_peek_ascii_char ();
3564 if (c
!= ' ' && c
!= '*' && c
!= '\'' && c
!= '"')
3571 m
= match_dt_format (dt
);
3572 if (m
== MATCH_ERROR
)
3578 dt
->io_unit
= default_unit (k
);
3583 /* Before issuing an error for a malformed 'print (1,*)' type of
3584 error, check for a default-char-expr of the form ('(I0)'). */
3585 if (k
== M_PRINT
&& m
== MATCH_YES
)
3587 /* Reset current locus to get the initial '(' in an expression. */
3588 gfc_current_locus
= where
;
3589 dt
->format_expr
= NULL
;
3590 m
= match_dt_format (dt
);
3592 if (m
== MATCH_ERROR
)
3594 if (m
== MATCH_NO
|| dt
->format_expr
== NULL
)
3598 dt
->io_unit
= default_unit (k
);
3603 /* Match a control list */
3604 if (match_dt_element (k
, dt
) == MATCH_YES
)
3606 if (match_dt_unit (k
, dt
) != MATCH_YES
)
3609 if (gfc_match_char (')') == MATCH_YES
)
3611 if (gfc_match_char (',') != MATCH_YES
)
3614 m
= match_dt_element (k
, dt
);
3617 if (m
== MATCH_ERROR
)
3620 m
= match_dt_format (dt
);
3623 if (m
== MATCH_ERROR
)
3626 where
= gfc_current_locus
;
3628 m
= gfc_match_name (name
);
3631 gfc_find_symbol (name
, NULL
, 1, &sym
);
3632 if (sym
&& sym
->attr
.flavor
== FL_NAMELIST
)
3635 if (k
== M_READ
&& check_namelist (sym
))
3644 gfc_current_locus
= where
;
3646 goto loop
; /* No matches, try regular elements */
3649 if (gfc_match_char (')') == MATCH_YES
)
3651 if (gfc_match_char (',') != MATCH_YES
)
3657 m
= match_dt_element (k
, dt
);
3660 if (m
== MATCH_ERROR
)
3663 if (gfc_match_char (')') == MATCH_YES
)
3665 if (gfc_match_char (',') != MATCH_YES
)
3671 /* Used in check_io_constraints, where no locus is available. */
3672 spec_end
= gfc_current_locus
;
3674 /* Save the IO kind for later use. */
3675 dt
->dt_io_kind
= gfc_get_iokind_expr (&gfc_current_locus
, k
);
3677 /* Optional leading comma (non-standard). We use a gfc_expr structure here
3678 to save the locus. This is used later when resolving transfer statements
3679 that might have a format expression without unit number. */
3680 if (!comma_flag
&& gfc_match_char (',') == MATCH_YES
)
3681 dt
->extra_comma
= dt
->dt_io_kind
;
3684 if (gfc_match_eos () != MATCH_YES
)
3686 if (comma_flag
&& gfc_match_char (',') != MATCH_YES
)
3688 gfc_error ("Expected comma in I/O list at %C");
3693 m
= match_io_list (k
, &io_code
);
3694 if (m
== MATCH_ERROR
)
3700 /* A full IO statement has been matched. Check the constraints. spec_end is
3701 supplied for cases where no locus is supplied. */
3702 m
= check_io_constraints (k
, dt
, io_code
, &spec_end
);
3704 if (m
== MATCH_ERROR
)
3707 new_st
.op
= (k
== M_READ
) ? EXEC_READ
: EXEC_WRITE
;
3709 new_st
.block
= gfc_get_code ();
3710 new_st
.block
->op
= new_st
.op
;
3711 new_st
.block
->next
= io_code
;
3713 terminate_io (io_code
);
3718 gfc_error ("Syntax error in %s statement at %C", io_kind_name (k
));
3728 gfc_match_read (void)
3730 return match_io (M_READ
);
3735 gfc_match_write (void)
3737 return match_io (M_WRITE
);
3742 gfc_match_print (void)
3746 m
= match_io (M_PRINT
);
3750 if (gfc_pure (NULL
))
3752 gfc_error ("PRINT statement at %C not allowed within PURE procedure");
3760 /* Free a gfc_inquire structure. */
3763 gfc_free_inquire (gfc_inquire
*inquire
)
3766 if (inquire
== NULL
)
3769 gfc_free_expr (inquire
->unit
);
3770 gfc_free_expr (inquire
->file
);
3771 gfc_free_expr (inquire
->iomsg
);
3772 gfc_free_expr (inquire
->iostat
);
3773 gfc_free_expr (inquire
->exist
);
3774 gfc_free_expr (inquire
->opened
);
3775 gfc_free_expr (inquire
->number
);
3776 gfc_free_expr (inquire
->named
);
3777 gfc_free_expr (inquire
->name
);
3778 gfc_free_expr (inquire
->access
);
3779 gfc_free_expr (inquire
->sequential
);
3780 gfc_free_expr (inquire
->direct
);
3781 gfc_free_expr (inquire
->form
);
3782 gfc_free_expr (inquire
->formatted
);
3783 gfc_free_expr (inquire
->unformatted
);
3784 gfc_free_expr (inquire
->recl
);
3785 gfc_free_expr (inquire
->nextrec
);
3786 gfc_free_expr (inquire
->blank
);
3787 gfc_free_expr (inquire
->position
);
3788 gfc_free_expr (inquire
->action
);
3789 gfc_free_expr (inquire
->read
);
3790 gfc_free_expr (inquire
->write
);
3791 gfc_free_expr (inquire
->readwrite
);
3792 gfc_free_expr (inquire
->delim
);
3793 gfc_free_expr (inquire
->encoding
);
3794 gfc_free_expr (inquire
->pad
);
3795 gfc_free_expr (inquire
->iolength
);
3796 gfc_free_expr (inquire
->convert
);
3797 gfc_free_expr (inquire
->strm_pos
);
3798 gfc_free_expr (inquire
->asynchronous
);
3799 gfc_free_expr (inquire
->decimal
);
3800 gfc_free_expr (inquire
->pending
);
3801 gfc_free_expr (inquire
->id
);
3802 gfc_free_expr (inquire
->sign
);
3803 gfc_free_expr (inquire
->size
);
3804 gfc_free_expr (inquire
->round
);
3809 /* Match an element of an INQUIRE statement. */
3811 #define RETM if (m != MATCH_NO) return m;
3814 match_inquire_element (gfc_inquire
*inquire
)
3818 m
= match_etag (&tag_unit
, &inquire
->unit
);
3819 RETM m
= match_etag (&tag_file
, &inquire
->file
);
3820 RETM m
= match_ltag (&tag_err
, &inquire
->err
);
3821 RETM m
= match_out_tag (&tag_iomsg
, &inquire
->iomsg
);
3822 RETM m
= match_out_tag (&tag_iostat
, &inquire
->iostat
);
3823 RETM m
= match_vtag (&tag_exist
, &inquire
->exist
);
3824 RETM m
= match_vtag (&tag_opened
, &inquire
->opened
);
3825 RETM m
= match_vtag (&tag_named
, &inquire
->named
);
3826 RETM m
= match_vtag (&tag_name
, &inquire
->name
);
3827 RETM m
= match_out_tag (&tag_number
, &inquire
->number
);
3828 RETM m
= match_vtag (&tag_s_access
, &inquire
->access
);
3829 RETM m
= match_vtag (&tag_sequential
, &inquire
->sequential
);
3830 RETM m
= match_vtag (&tag_direct
, &inquire
->direct
);
3831 RETM m
= match_vtag (&tag_s_form
, &inquire
->form
);
3832 RETM m
= match_vtag (&tag_formatted
, &inquire
->formatted
);
3833 RETM m
= match_vtag (&tag_unformatted
, &inquire
->unformatted
);
3834 RETM m
= match_out_tag (&tag_s_recl
, &inquire
->recl
);
3835 RETM m
= match_out_tag (&tag_nextrec
, &inquire
->nextrec
);
3836 RETM m
= match_vtag (&tag_s_blank
, &inquire
->blank
);
3837 RETM m
= match_vtag (&tag_s_position
, &inquire
->position
);
3838 RETM m
= match_vtag (&tag_s_action
, &inquire
->action
);
3839 RETM m
= match_vtag (&tag_read
, &inquire
->read
);
3840 RETM m
= match_vtag (&tag_write
, &inquire
->write
);
3841 RETM m
= match_vtag (&tag_readwrite
, &inquire
->readwrite
);
3842 RETM m
= match_vtag (&tag_s_async
, &inquire
->asynchronous
);
3843 RETM m
= match_vtag (&tag_s_delim
, &inquire
->delim
);
3844 RETM m
= match_vtag (&tag_s_decimal
, &inquire
->decimal
);
3845 RETM m
= match_vtag (&tag_size
, &inquire
->size
);
3846 RETM m
= match_vtag (&tag_s_encoding
, &inquire
->encoding
);
3847 RETM m
= match_vtag (&tag_s_round
, &inquire
->round
);
3848 RETM m
= match_vtag (&tag_s_sign
, &inquire
->sign
);
3849 RETM m
= match_vtag (&tag_s_pad
, &inquire
->pad
);
3850 RETM m
= match_vtag (&tag_iolength
, &inquire
->iolength
);
3851 RETM m
= match_vtag (&tag_convert
, &inquire
->convert
);
3852 RETM m
= match_out_tag (&tag_strm_out
, &inquire
->strm_pos
);
3853 RETM m
= match_vtag (&tag_pending
, &inquire
->pending
);
3854 RETM m
= match_vtag (&tag_id
, &inquire
->id
);
3855 RETM
return MATCH_NO
;
3862 gfc_match_inquire (void)
3864 gfc_inquire
*inquire
;
3869 m
= gfc_match_char ('(');
3873 inquire
= XCNEW (gfc_inquire
);
3875 loc
= gfc_current_locus
;
3877 m
= match_inquire_element (inquire
);
3878 if (m
== MATCH_ERROR
)
3882 m
= gfc_match_expr (&inquire
->unit
);
3883 if (m
== MATCH_ERROR
)
3889 /* See if we have the IOLENGTH form of the inquire statement. */
3890 if (inquire
->iolength
!= NULL
)
3892 if (gfc_match_char (')') != MATCH_YES
)
3895 m
= match_io_list (M_INQUIRE
, &code
);
3896 if (m
== MATCH_ERROR
)
3901 new_st
.op
= EXEC_IOLENGTH
;
3902 new_st
.expr1
= inquire
->iolength
;
3903 new_st
.ext
.inquire
= inquire
;
3905 if (gfc_pure (NULL
))
3907 gfc_free_statements (code
);
3908 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3912 new_st
.block
= gfc_get_code ();
3913 new_st
.block
->op
= EXEC_IOLENGTH
;
3914 terminate_io (code
);
3915 new_st
.block
->next
= code
;
3919 /* At this point, we have the non-IOLENGTH inquire statement. */
3922 if (gfc_match_char (')') == MATCH_YES
)
3924 if (gfc_match_char (',') != MATCH_YES
)
3927 m
= match_inquire_element (inquire
);
3928 if (m
== MATCH_ERROR
)
3933 if (inquire
->iolength
!= NULL
)
3935 gfc_error ("IOLENGTH tag invalid in INQUIRE statement at %C");
3940 if (gfc_match_eos () != MATCH_YES
)
3943 if (inquire
->unit
!= NULL
&& inquire
->file
!= NULL
)
3945 gfc_error ("INQUIRE statement at %L cannot contain both FILE and "
3946 "UNIT specifiers", &loc
);
3950 if (inquire
->unit
== NULL
&& inquire
->file
== NULL
)
3952 gfc_error ("INQUIRE statement at %L requires either FILE or "
3953 "UNIT specifier", &loc
);
3957 if (gfc_pure (NULL
))
3959 gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
3963 if (inquire
->id
!= NULL
&& inquire
->pending
== NULL
)
3965 gfc_error ("INQUIRE statement at %L requires a PENDING= specifier with "
3966 "the ID= specifier", &loc
);
3970 new_st
.op
= EXEC_INQUIRE
;
3971 new_st
.ext
.inquire
= inquire
;
3975 gfc_syntax_error (ST_INQUIRE
);
3978 gfc_free_inquire (inquire
);
3983 /* Resolve everything in a gfc_inquire structure. */
3986 gfc_resolve_inquire (gfc_inquire
*inquire
)
3988 RESOLVE_TAG (&tag_unit
, inquire
->unit
);
3989 RESOLVE_TAG (&tag_file
, inquire
->file
);
3990 RESOLVE_TAG (&tag_id
, inquire
->id
);
3992 /* For INQUIRE, all tags except FILE, ID and UNIT are variable definition
3993 contexts. Thus, use an extended RESOLVE_TAG macro for that. */
3994 #define INQUIRE_RESOLVE_TAG(tag, expr) \
3995 RESOLVE_TAG (tag, expr); \
3999 sprintf (context, _("%s tag with INQUIRE"), (tag)->name); \
4000 if (gfc_check_vardef_context ((expr), false, context) == FAILURE) \
4003 INQUIRE_RESOLVE_TAG (&tag_iomsg
, inquire
->iomsg
);
4004 INQUIRE_RESOLVE_TAG (&tag_iostat
, inquire
->iostat
);
4005 INQUIRE_RESOLVE_TAG (&tag_exist
, inquire
->exist
);
4006 INQUIRE_RESOLVE_TAG (&tag_opened
, inquire
->opened
);
4007 INQUIRE_RESOLVE_TAG (&tag_number
, inquire
->number
);
4008 INQUIRE_RESOLVE_TAG (&tag_named
, inquire
->named
);
4009 INQUIRE_RESOLVE_TAG (&tag_name
, inquire
->name
);
4010 INQUIRE_RESOLVE_TAG (&tag_s_access
, inquire
->access
);
4011 INQUIRE_RESOLVE_TAG (&tag_sequential
, inquire
->sequential
);
4012 INQUIRE_RESOLVE_TAG (&tag_direct
, inquire
->direct
);
4013 INQUIRE_RESOLVE_TAG (&tag_s_form
, inquire
->form
);
4014 INQUIRE_RESOLVE_TAG (&tag_formatted
, inquire
->formatted
);
4015 INQUIRE_RESOLVE_TAG (&tag_unformatted
, inquire
->unformatted
);
4016 INQUIRE_RESOLVE_TAG (&tag_s_recl
, inquire
->recl
);
4017 INQUIRE_RESOLVE_TAG (&tag_nextrec
, inquire
->nextrec
);
4018 INQUIRE_RESOLVE_TAG (&tag_s_blank
, inquire
->blank
);
4019 INQUIRE_RESOLVE_TAG (&tag_s_position
, inquire
->position
);
4020 INQUIRE_RESOLVE_TAG (&tag_s_action
, inquire
->action
);
4021 INQUIRE_RESOLVE_TAG (&tag_read
, inquire
->read
);
4022 INQUIRE_RESOLVE_TAG (&tag_write
, inquire
->write
);
4023 INQUIRE_RESOLVE_TAG (&tag_readwrite
, inquire
->readwrite
);
4024 INQUIRE_RESOLVE_TAG (&tag_s_delim
, inquire
->delim
);
4025 INQUIRE_RESOLVE_TAG (&tag_s_pad
, inquire
->pad
);
4026 INQUIRE_RESOLVE_TAG (&tag_s_encoding
, inquire
->encoding
);
4027 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4028 INQUIRE_RESOLVE_TAG (&tag_iolength
, inquire
->iolength
);
4029 INQUIRE_RESOLVE_TAG (&tag_convert
, inquire
->convert
);
4030 INQUIRE_RESOLVE_TAG (&tag_strm_out
, inquire
->strm_pos
);
4031 INQUIRE_RESOLVE_TAG (&tag_s_async
, inquire
->asynchronous
);
4032 INQUIRE_RESOLVE_TAG (&tag_s_sign
, inquire
->sign
);
4033 INQUIRE_RESOLVE_TAG (&tag_s_round
, inquire
->round
);
4034 INQUIRE_RESOLVE_TAG (&tag_pending
, inquire
->pending
);
4035 INQUIRE_RESOLVE_TAG (&tag_size
, inquire
->size
);
4036 #undef INQUIRE_RESOLVE_TAG
4038 if (gfc_reference_st_label (inquire
->err
, ST_LABEL_TARGET
) == FAILURE
)
4046 gfc_free_wait (gfc_wait
*wait
)
4051 gfc_free_expr (wait
->unit
);
4052 gfc_free_expr (wait
->iostat
);
4053 gfc_free_expr (wait
->iomsg
);
4054 gfc_free_expr (wait
->id
);
4059 gfc_resolve_wait (gfc_wait
*wait
)
4061 RESOLVE_TAG (&tag_unit
, wait
->unit
);
4062 RESOLVE_TAG (&tag_iomsg
, wait
->iomsg
);
4063 RESOLVE_TAG (&tag_iostat
, wait
->iostat
);
4064 RESOLVE_TAG (&tag_id
, wait
->id
);
4066 if (gfc_reference_st_label (wait
->err
, ST_LABEL_TARGET
) == FAILURE
)
4069 if (gfc_reference_st_label (wait
->end
, ST_LABEL_TARGET
) == FAILURE
)
4075 /* Match an element of a WAIT statement. */
4077 #define RETM if (m != MATCH_NO) return m;
4080 match_wait_element (gfc_wait
*wait
)
4084 m
= match_etag (&tag_unit
, &wait
->unit
);
4085 RETM m
= match_ltag (&tag_err
, &wait
->err
);
4086 RETM m
= match_ltag (&tag_end
, &wait
->eor
);
4087 RETM m
= match_ltag (&tag_eor
, &wait
->end
);
4088 RETM m
= match_out_tag (&tag_iomsg
, &wait
->iomsg
);
4089 RETM m
= match_out_tag (&tag_iostat
, &wait
->iostat
);
4090 RETM m
= match_etag (&tag_id
, &wait
->id
);
4091 RETM
return MATCH_NO
;
4098 gfc_match_wait (void)
4103 m
= gfc_match_char ('(');
4107 wait
= XCNEW (gfc_wait
);
4109 m
= match_wait_element (wait
);
4110 if (m
== MATCH_ERROR
)
4114 m
= gfc_match_expr (&wait
->unit
);
4115 if (m
== MATCH_ERROR
)
4123 if (gfc_match_char (')') == MATCH_YES
)
4125 if (gfc_match_char (',') != MATCH_YES
)
4128 m
= match_wait_element (wait
);
4129 if (m
== MATCH_ERROR
)
4135 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: WAIT at %C "
4136 "not allowed in Fortran 95") == FAILURE
)
4139 if (gfc_pure (NULL
))
4141 gfc_error ("WAIT statement not allowed in PURE procedure at %C");
4145 new_st
.op
= EXEC_WAIT
;
4146 new_st
.ext
.wait
= wait
;
4151 gfc_syntax_error (ST_WAIT
);
4154 gfc_free_wait (wait
);