diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2016-06-01 17:06:50 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2016-06-01 17:06:50 +0000 |
commit | 4731c9f025a6c14d77e3127b8c64a46bd933c687 (patch) | |
tree | eafde5e9fd53bc92265eb5140f61ccade2ebc1e3 /gcc/fortran/io.c | |
parent | 042dee3e3bd99807f894963d89177a0f0db6ffd5 (diff) | |
download | gcc-4731c9f025a6c14d77e3127b8c64a46bd933c687.zip gcc-4731c9f025a6c14d77e3127b8c64a46bd933c687.tar.gz gcc-4731c9f025a6c14d77e3127b8c64a46bd933c687.tar.bz2 |
re PR fortran/52393 (I/O: "READ format" statement with parenthesed default-char-expr)
2016-06-01 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/52393
* io.c (match_io): For READ, try to match a default character
expression. If found, set the dt format expression to this,
otherwise go back and try control list.
PR fortran/52393
* gfortran.dg/fmt_read_3.f90: New test.
From-SVN: r237003
Diffstat (limited to 'gcc/fortran/io.c')
-rw-r--r-- | gcc/fortran/io.c | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index da0e1c5..204cce2 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -3689,7 +3689,7 @@ match_io (io_kind k) gfc_symbol *sym; int comma_flag; locus where; - locus spec_end; + locus spec_end, control; gfc_dt *dt; match m; @@ -3751,21 +3751,56 @@ match_io (io_kind k) { /* Before issuing an error for a malformed 'print (1,*)' type of error, check for a default-char-expr of the form ('(I0)'). */ - if (k == M_PRINT && m == MATCH_YES) - { - /* Reset current locus to get the initial '(' in an expression. */ - gfc_current_locus = where; - dt->format_expr = NULL; - m = match_dt_format (dt); + if (m == MATCH_YES) + { + control = gfc_current_locus; + if (k == M_PRINT) + { + /* Reset current locus to get the initial '(' in an expression. */ + gfc_current_locus = where; + dt->format_expr = NULL; + m = match_dt_format (dt); - if (m == MATCH_ERROR) - goto cleanup; - if (m == MATCH_NO || dt->format_expr == NULL) - goto syntax; + if (m == MATCH_ERROR) + goto cleanup; + if (m == MATCH_NO || dt->format_expr == NULL) + goto syntax; - comma_flag = 1; - dt->io_unit = default_unit (k); - goto get_io_list; + comma_flag = 1; + dt->io_unit = default_unit (k); + goto get_io_list; + } + if (k == M_READ) + { + /* Reset current locus to get the initial '(' in an expression. */ + gfc_current_locus = where; + dt->format_expr = NULL; + m = gfc_match_expr (&dt->format_expr); + if (m == MATCH_YES) + { + if (dt->format_expr + && dt->format_expr->ts.type == BT_CHARACTER) + { + comma_flag = 1; + dt->io_unit = default_unit (k); + goto get_io_list; + } + else + { + gfc_free_expr (dt->format_expr); + dt->format_expr = NULL; + gfc_current_locus = control; + } + } + else + { + gfc_clear_error (); + gfc_undo_symbols (); + gfc_free_expr (dt->format_expr); + dt->format_expr = NULL; + gfc_current_locus = control; + } + } } } |