aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/io.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2015-07-17 00:05:02 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2015-07-17 00:05:02 +0000
commit1a6872a2eb088bdfe9839f8ece776da8029fe078 (patch)
tree7789fcb2480c84980f493babbe9a6967a0c54931 /gcc/fortran/io.c
parent1470e75f92c375cb27c473fd5f26af4a7b3bf1cd (diff)
downloadgcc-1a6872a2eb088bdfe9839f8ece776da8029fe078.zip
gcc-1a6872a2eb088bdfe9839f8ece776da8029fe078.tar.gz
gcc-1a6872a2eb088bdfe9839f8ece776da8029fe078.tar.bz2
re PR fortran/66724 (ICE on input/output statements with wrong specifier data)
2015-07-16 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/66724 PR fortran/66724 * io.c (is_char_type): Call gfc_resolve_expr (). (match_open_element, match_dt_element, match_inquire_element): Fix ASYNCHRONOUS case. From-SVN: r225913
Diffstat (limited to 'gcc/fortran/io.c')
-rw-r--r--gcc/fortran/io.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index d50a45a..436c09a 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -1260,6 +1260,8 @@ check_char_variable (gfc_expr *e)
static bool
is_char_type (const char *name, gfc_expr *e)
{
+ gfc_resolve_expr (e);
+
if (e->ts.type != BT_CHARACTER)
{
gfc_error ("%s requires a scalar-default-char-expr at %L",
@@ -1580,6 +1582,8 @@ match_open_element (gfc_open *open)
match m;
m = match_etag (&tag_e_async, &open->asynchronous);
+ if (m == MATCH_YES && !is_char_type ("ASYNCHRONOUS", open->asynchronous))
+ return MATCH_ERROR;
if (m != MATCH_NO)
return m;
m = match_etag (&tag_unit, &open->unit);
@@ -2752,6 +2756,8 @@ match_dt_element (io_kind k, gfc_dt *dt)
}
m = match_etag (&tag_e_async, &dt->asynchronous);
+ if (m == MATCH_YES && !is_char_type ("ASYNCHRONOUS", dt->asynchronous))
+ return MATCH_ERROR;
if (m != MATCH_NO)
return m;
m = match_etag (&tag_e_blank, &dt->blank);
@@ -3986,6 +3992,8 @@ match_inquire_element (gfc_inquire *inquire)
RETM m = match_vtag (&tag_write, &inquire->write);
RETM m = match_vtag (&tag_readwrite, &inquire->readwrite);
RETM m = match_vtag (&tag_s_async, &inquire->asynchronous);
+ if (m == MATCH_YES && !is_char_type ("ASYNCHRONOUS", inquire->asynchronous))
+ return MATCH_ERROR;
RETM m = match_vtag (&tag_s_delim, &inquire->delim);
RETM m = match_vtag (&tag_s_decimal, &inquire->decimal);
RETM m = match_out_tag (&tag_size, &inquire->size);