diff options
Diffstat (limited to 'gcc/fortran/io.c')
-rw-r--r-- | gcc/fortran/io.c | 330 |
1 files changed, 157 insertions, 173 deletions
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index cb424c4..312bb39 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -1,6 +1,6 @@ /* Deal with I/O statements & related stuff. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software - Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation, Inc. Contributed by Andy Vaught This file is part of GCC. @@ -27,9 +27,9 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "match.h" #include "parse.h" -gfc_st_label format_asterisk = - {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL, - 0, {NULL, NULL}}; +gfc_st_label +format_asterisk = {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL, + 0, {NULL, NULL}}; typedef struct { @@ -52,7 +52,7 @@ static const io_tag tag_unit = {"UNIT", " unit = %e", BT_INTEGER}, tag_advance = {"ADVANCE", " advance = %e", BT_CHARACTER}, tag_rec = {"REC", " rec = %e", BT_INTEGER}, - tag_spos = {"POSITION", " pos = %e", BT_INTEGER}, + tag_spos = {"POSITION", " pos = %e", BT_INTEGER}, tag_format = {"FORMAT", NULL, BT_CHARACTER}, tag_iomsg = {"IOMSG", " iomsg = %e", BT_CHARACTER}, tag_iostat = {"IOSTAT", " iostat = %v", BT_INTEGER}, @@ -152,14 +152,13 @@ next_char (int in_string) static void unget_char (void) { - use_last_char = 1; } /* Eat up the spaces and return a character. */ static char -next_char_not_space(void) +next_char_not_space (void) { char c; do @@ -210,15 +209,15 @@ format_lex (void) do { c = next_char_not_space (); - if(ISDIGIT (c)) - value = 10 * value + c - '0'; + if (ISDIGIT (c)) + value = 10 * value + c - '0'; } while (ISDIGIT (c)); unget_char (); if (negative_flag) - value = -value; + value = -value; token = FMT_SIGNED_INT; break; @@ -242,8 +241,8 @@ format_lex (void) c = next_char_not_space (); if (c != '0') zflag = 0; - if (ISDIGIT (c)) - value = 10 * value + c - '0'; + if (ISDIGIT (c)) + value = 10 * value + c - '0'; } while (ISDIGIT (c)); @@ -343,7 +342,7 @@ format_lex (void) break; } } - value++; + value++; } break; @@ -506,8 +505,8 @@ format_item_1: t = format_lex (); if (gfc_notify_std (GFC_STD_GNU, "Extension: $ descriptor at %C") - == FAILURE) - return FAILURE; + == FAILURE) + return FAILURE; if (t != FMT_RPAREN || level > 0) { gfc_warning ("$ should be the last specifier in format at %C"); @@ -573,8 +572,8 @@ data_desc: switch (gfc_notification_std (GFC_STD_GNU)) { case WARNING: - gfc_warning - ("Extension: Missing positive width after L descriptor at %C"); + gfc_warning ("Extension: Missing positive width after L " + "descriptor at %C"); saved_token = t; break; @@ -660,7 +659,7 @@ data_desc: if (t != FMT_PERIOD) { /* Warn if -std=legacy, otherwise error. */ - if (gfc_option.warn_std != 0) + if (gfc_option.warn_std != 0) gfc_error_now ("Period required in format specifier at %C"); else gfc_warning ("Period required in format specifier at %C"); @@ -680,16 +679,16 @@ data_desc: case FMT_H: if(mode == MODE_STRING) { - format_string += value; - format_length -= value; + format_string += value; + format_length -= value; } else { - while(repeat >0) - { - next_char(1); - repeat -- ; - } + while (repeat >0) + { + next_char (1); + repeat -- ; + } } break; @@ -821,7 +820,7 @@ syntax: gfc_warning ("%s in format string at %C", error); /* TODO: More elaborate measures are needed to show where a problem - is within a format string that has been calculated. */ + is within a format string that has been calculated. */ } rv = FAILURE; @@ -835,9 +834,8 @@ finished: like a format string. */ static void -check_format_string (gfc_expr * e) +check_format_string (gfc_expr *e) { - mode = MODE_STRING; format_string = e->value.character.string; check_format (); @@ -857,7 +855,7 @@ gfc_match_format (void) locus start; if (gfc_current_ns->proc_name - && gfc_current_ns->proc_name->attr.flavor == FL_MODULE) + && gfc_current_ns->proc_name->attr.flavor == FL_MODULE) { gfc_error ("Format statement in module main block at %C"); return MATCH_ERROR; @@ -897,7 +895,7 @@ gfc_match_format (void) e->ts.type = BT_CHARACTER; e->ts.kind = gfc_default_character_kind; e->where = start; - e->value.character.string = format_string = gfc_getmem(format_length+1); + e->value.character.string = format_string = gfc_getmem (format_length + 1); e->value.character.length = format_length; gfc_statement_label->format = e; @@ -912,7 +910,7 @@ gfc_match_format (void) /* Match an expression I/O tag of some sort. */ static match -match_etag (const io_tag * tag, gfc_expr ** v) +match_etag (const io_tag *tag, gfc_expr **v) { gfc_expr *result; match m; @@ -936,7 +934,7 @@ match_etag (const io_tag * tag, gfc_expr ** v) /* Match a variable I/O tag of some sort. */ static match -match_vtag (const io_tag * tag, gfc_expr ** v) +match_vtag (const io_tag *tag, gfc_expr **v) { gfc_expr *result; match m; @@ -989,7 +987,7 @@ match_out_tag(const io_tag *tag, gfc_expr **result) /* Match a label I/O tag. */ static match -match_ltag (const io_tag * tag, gfc_st_label ** label) +match_ltag (const io_tag *tag, gfc_st_label ** label) { match m; gfc_st_label *old; @@ -1013,9 +1011,8 @@ match_ltag (const io_tag * tag, gfc_st_label ** label) /* Do expression resolution and type-checking on an expression tag. */ static try -resolve_tag (const io_tag * tag, gfc_expr * e) +resolve_tag (const io_tag *tag, gfc_expr *e) { - if (e == NULL) return SUCCESS; @@ -1025,7 +1022,7 @@ resolve_tag (const io_tag * tag, gfc_expr * e) if (e->ts.type != tag->type && tag != &tag_format) { gfc_error ("%s tag at %L must be of type %s", tag->name, - &e->where, gfc_basic_typename (tag->type)); + &e->where, gfc_basic_typename (tag->type)); return FAILURE; } @@ -1044,32 +1041,34 @@ resolve_tag (const io_tag * tag, gfc_expr * e) of integer or character type. The integer variable should be ASSIGNED. */ if (e->symtree == NULL || e->symtree->n.sym->as == NULL - || e->symtree->n.sym->as->rank == 0) + || e->symtree->n.sym->as->rank == 0) { if (e->ts.type != BT_CHARACTER && e->ts.type != BT_INTEGER) { gfc_error ("%s tag at %L must be of type %s or %s", tag->name, - &e->where, gfc_basic_typename (BT_CHARACTER), - gfc_basic_typename (BT_INTEGER)); + &e->where, gfc_basic_typename (BT_CHARACTER), + gfc_basic_typename (BT_INTEGER)); return FAILURE; } else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE) { - if (gfc_notify_std (GFC_STD_F95_DEL, - "Obsolete: ASSIGNED variable in FORMAT tag at %L", - &e->where) == FAILURE) + if (gfc_notify_std (GFC_STD_F95_DEL, "Obsolete: ASSIGNED " + "variable in FORMAT tag at %L", &e->where) + == FAILURE) return FAILURE; if (e->symtree->n.sym->attr.assign != 1) { gfc_error ("Variable '%s' at %L has not been assigned a " - "format label", e->symtree->n.sym->name, &e->where); + "format label", e->symtree->n.sym->name, + &e->where); return FAILURE; } } else if (e->ts.type == BT_INTEGER) { gfc_error ("scalar '%s' FORMAT tag at %L is not an ASSIGNED " - "variable", gfc_basic_typename (e->ts.type), &e->where); + "variable", gfc_basic_typename (e->ts.type), + &e->where); return FAILURE; } @@ -1082,16 +1081,16 @@ resolve_tag (const io_tag * tag, gfc_expr * e) assigned an Hollerith constant. */ if (e->ts.type == BT_CHARACTER) { - if (gfc_notify_std (GFC_STD_GNU, - "Extension: Character array in FORMAT tag at %L", - &e->where) == FAILURE) + if (gfc_notify_std (GFC_STD_GNU, "Extension: Character array " + "in FORMAT tag at %L", &e->where) + == FAILURE) return FAILURE; } else { - if (gfc_notify_std (GFC_STD_LEGACY, - "Extension: Non-character in FORMAT tag at %L", - &e->where) == FAILURE) + if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character " + "in FORMAT tag at %L", &e->where) + == FAILURE) return FAILURE; } return SUCCESS; @@ -1115,16 +1114,16 @@ resolve_tag (const io_tag * tag, gfc_expr * e) if (tag == &tag_iostat && e->ts.kind != gfc_default_integer_kind) { if (gfc_notify_std (GFC_STD_GNU, "Fortran 95 requires default " - "INTEGER in IOSTAT tag at %L", - &e->where) == FAILURE) + "INTEGER in IOSTAT tag at %L", &e->where) + == FAILURE) return FAILURE; } if (tag == &tag_size && e->ts.kind != gfc_default_integer_kind) { if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default " - "INTEGER in SIZE tag at %L", - &e->where) == FAILURE) + "INTEGER in SIZE tag at %L", &e->where) + == FAILURE) return FAILURE; } @@ -1138,8 +1137,8 @@ resolve_tag (const io_tag * tag, gfc_expr * e) if (tag == &tag_iolength && e->ts.kind != gfc_default_integer_kind) { if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default " - "INTEGER in IOLENGTH tag at %L", - &e->where) == FAILURE) + "INTEGER in IOLENGTH tag at %L", &e->where) + == FAILURE) return FAILURE; } } @@ -1151,7 +1150,7 @@ resolve_tag (const io_tag * tag, gfc_expr * e) /* Match a single tag of an OPEN statement. */ static match -match_open_element (gfc_open * open) +match_open_element (gfc_open *open) { match m; @@ -1208,9 +1207,8 @@ match_open_element (gfc_open * open) /* Free the gfc_open structure and all the expressions it contains. */ void -gfc_free_open (gfc_open * open) +gfc_free_open (gfc_open *open) { - if (open == NULL) return; @@ -1228,7 +1226,6 @@ gfc_free_open (gfc_open * open) gfc_free_expr (open->delim); gfc_free_expr (open->pad); gfc_free_expr (open->convert); - gfc_free (open); } @@ -1236,7 +1233,7 @@ gfc_free_open (gfc_open * open) /* Resolve everything in a gfc_open structure. */ try -gfc_resolve_open (gfc_open * open) +gfc_resolve_open (gfc_open *open) { RESOLVE_TAG (&tag_unit, open->unit); @@ -1247,7 +1244,6 @@ gfc_resolve_open (gfc_open * open) RESOLVE_TAG (&tag_e_access, open->access); RESOLVE_TAG (&tag_e_form, open->form); RESOLVE_TAG (&tag_e_recl, open->recl); - RESOLVE_TAG (&tag_e_blank, open->blank); RESOLVE_TAG (&tag_e_position, open->position); RESOLVE_TAG (&tag_e_action, open->action); @@ -1262,20 +1258,20 @@ gfc_resolve_open (gfc_open * open) } - /* Check if a given value for a SPECIFIER is either in the list of values allowed in F95 or F2003, issuing an error message and returning a zero value if it is not allowed. */ + static int -compare_to_allowed_values (const char * specifier, const char * allowed[], - const char * allowed_f2003[], - const char * allowed_gnu[], char * value, - const char * statement, bool warn) +compare_to_allowed_values (const char *specifier, const char *allowed[], + const char *allowed_f2003[], + const char *allowed_gnu[], char *value, + const char *statement, bool warn) { int i; unsigned int len; - len = strlen(value); + len = strlen (value); if (len > 0) { for (len--; len > 0; len--) @@ -1285,13 +1281,14 @@ compare_to_allowed_values (const char * specifier, const char * allowed[], } for (i = 0; allowed[i]; i++) - if (len == strlen(allowed[i]) - && strncasecmp (value, allowed[i], strlen(allowed[i])) == 0) + if (len == strlen (allowed[i]) + && strncasecmp (value, allowed[i], strlen (allowed[i])) == 0) return 1; for (i = 0; allowed_f2003 && allowed_f2003[i]; i++) - if (len == strlen(allowed_f2003[i]) - && strncasecmp (value, allowed_f2003[i], strlen(allowed_f2003[i])) == 0) + if (len == strlen (allowed_f2003[i]) + && strncasecmp (value, allowed_f2003[i], strlen (allowed_f2003[i])) + == 0) { notification n = gfc_notification_std (GFC_STD_F2003); @@ -1316,8 +1313,8 @@ compare_to_allowed_values (const char * specifier, const char * allowed[], } for (i = 0; allowed_gnu && allowed_gnu[i]; i++) - if (len == strlen(allowed_gnu[i]) - && strncasecmp (value, allowed_gnu[i], strlen(allowed_gnu[i])) == 0) + if (len == strlen (allowed_gnu[i]) + && strncasecmp (value, allowed_gnu[i], strlen (allowed_gnu[i])) == 0) { notification n = gfc_notification_std (GFC_STD_GNU); @@ -1355,6 +1352,7 @@ compare_to_allowed_values (const char * specifier, const char * allowed[], } } + /* Match an OPEN statement. */ match @@ -1410,9 +1408,9 @@ gfc_match_open (void) /* Checks on the ACCESS specifier. */ if (open->access && open->access->expr_type == EXPR_CONSTANT) { - static const char * access_f95[] = { "SEQUENTIAL", "DIRECT", NULL }; - static const char * access_f2003[] = { "STREAM", NULL }; - static const char * access_gnu[] = { "APPEND", NULL }; + static const char *access_f95[] = { "SEQUENTIAL", "DIRECT", NULL }; + static const char *access_f2003[] = { "STREAM", NULL }; + static const char *access_gnu[] = { "APPEND", NULL }; if (!compare_to_allowed_values ("ACCESS", access_f95, access_f2003, access_gnu, @@ -1424,7 +1422,7 @@ gfc_match_open (void) /* Checks on the ACTION specifier. */ if (open->action && open->action->expr_type == EXPR_CONSTANT) { - static const char * action[] = { "READ", "WRITE", "READWRITE", NULL }; + static const char *action[] = { "READ", "WRITE", "READWRITE", NULL }; if (!compare_to_allowed_values ("ACTION", action, NULL, NULL, open->action->value.character.string, @@ -1448,7 +1446,7 @@ gfc_match_open (void) /* Checks on the BLANK specifier. */ if (open->blank && open->blank->expr_type == EXPR_CONSTANT) { - static const char * blank[] = { "ZERO", "NULL", NULL }; + static const char *blank[] = { "ZERO", "NULL", NULL }; if (!compare_to_allowed_values ("BLANK", blank, NULL, NULL, open->blank->value.character.string, @@ -1471,7 +1469,7 @@ gfc_match_open (void) /* Checks on the DELIM specifier. */ if (open->delim && open->delim->expr_type == EXPR_CONSTANT) { - static const char * delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL }; + static const char *delim[] = { "APOSTROPHE", "QUOTE", "NONE", NULL }; if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL, open->delim->value.character.string, @@ -1494,7 +1492,7 @@ gfc_match_open (void) /* Checks on the FORM specifier. */ if (open->form && open->form->expr_type == EXPR_CONSTANT) { - static const char * form[] = { "FORMATTED", "UNFORMATTED", NULL }; + static const char *form[] = { "FORMATTED", "UNFORMATTED", NULL }; if (!compare_to_allowed_values ("FORM", form, NULL, NULL, open->form->value.character.string, @@ -1505,7 +1503,7 @@ gfc_match_open (void) /* Checks on the PAD specifier. */ if (open->pad && open->pad->expr_type == EXPR_CONSTANT) { - static const char * pad[] = { "YES", "NO", NULL }; + static const char *pad[] = { "YES", "NO", NULL }; if (!compare_to_allowed_values ("PAD", pad, NULL, NULL, open->pad->value.character.string, @@ -1516,7 +1514,7 @@ gfc_match_open (void) /* Checks on the POSITION specifier. */ if (open->position && open->position->expr_type == EXPR_CONSTANT) { - static const char * position[] = { "ASIS", "REWIND", "APPEND", NULL }; + static const char *position[] = { "ASIS", "REWIND", "APPEND", NULL }; if (!compare_to_allowed_values ("POSITION", position, NULL, NULL, open->position->value.character.string, @@ -1572,7 +1570,7 @@ gfc_match_open (void) /* Checks on the STATUS specifier. */ if (open->status && open->status->expr_type == EXPR_CONSTANT) { - static const char * status[] = { "OLD", "NEW", "SCRATCH", + static const char *status[] = { "OLD", "NEW", "SCRATCH", "REPLACE", "UNKNOWN", NULL }; if (!compare_to_allowed_values ("STATUS", status, NULL, NULL, @@ -1581,23 +1579,25 @@ gfc_match_open (void) goto cleanup; /* F2003, 9.4.5: If the STATUS= specifier has the value NEW or REPLACE, - the FILE= specifier shall appear. */ - if (open->file == NULL && - (strncasecmp (open->status->value.character.string, "replace", 7) == 0 - || strncasecmp (open->status->value.character.string, "new", 3) == 0)) + the FILE= specifier shall appear. */ + if (open->file == NULL + && (strncasecmp (open->status->value.character.string, "replace", 7) + == 0 + || strncasecmp (open->status->value.character.string, "new", 3) + == 0)) { - warn_or_error ("The STATUS specified in OPEN statement at %C is '%s' " - "and no FILE specifier is present", + warn_or_error ("The STATUS specified in OPEN statement at %C is " + "'%s' and no FILE specifier is present", open->status->value.character.string); } /* F2003, 9.4.5: If the STATUS= specifier has the value SCRATCH, the FILE= specifier shall not appear. */ - if (strncasecmp (open->status->value.character.string, "scratch", 7) == 0 - && open->file) + if (strncasecmp (open->status->value.character.string, "scratch", 7) + == 0 && open->file) { - warn_or_error ("The STATUS specified in OPEN statement at %C cannot " - "have the value SCRATCH if a FILE specifier " + warn_or_error ("The STATUS specified in OPEN statement at %C " + "cannot have the value SCRATCH if a FILE specifier " "is present"); } } @@ -1612,10 +1612,11 @@ gfc_match_open (void) && strncasecmp (open->form->value.character.string, "unformatted", 11) == 0) { - const char * spec = (open->delim ? "DELIM " : (open->pad ? "PAD " : - open->blank ? "BLANK " : "")); + const char *spec = (open->delim ? "DELIM " + : (open->pad ? "PAD " : open->blank + ? "BLANK " : "")); - warn_or_error ("%sspecifier at %C not allowed in OPEN statement for " + warn_or_error ("%s specifier at %C not allowed in OPEN statement for " "unformatted I/O", spec); } @@ -1626,7 +1627,8 @@ gfc_match_open (void) "stream I/O"); } - if (open->position && open->access && open->access->expr_type == EXPR_CONSTANT + if (open->position + && open->access && open->access->expr_type == EXPR_CONSTANT && !(strncasecmp (open->access->value.character.string, "sequential", 10) == 0 || strncasecmp (open->access->value.character.string, @@ -1656,9 +1658,8 @@ cleanup: /* Free a gfc_close structure an all its expressions. */ void -gfc_free_close (gfc_close * close) +gfc_free_close (gfc_close *close) { - if (close == NULL) return; @@ -1666,7 +1667,6 @@ gfc_free_close (gfc_close * close) gfc_free_expr (close->iomsg); gfc_free_expr (close->iostat); gfc_free_expr (close->status); - gfc_free (close); } @@ -1674,7 +1674,7 @@ gfc_free_close (gfc_close * close) /* Match elements of a CLOSE statement. */ static match -match_close_element (gfc_close * close) +match_close_element (gfc_close *close) { match m; @@ -1754,7 +1754,7 @@ gfc_match_close (void) /* Checks on the STATUS specifier. */ if (close->status && close->status->expr_type == EXPR_CONSTANT) { - static const char * status[] = { "KEEP", "DELETE", NULL }; + static const char *status[] = { "KEEP", "DELETE", NULL }; if (!compare_to_allowed_values ("STATUS", status, NULL, NULL, close->status->value.character.string, @@ -1778,9 +1778,8 @@ cleanup: /* Resolve everything in a gfc_close structure. */ try -gfc_resolve_close (gfc_close * close) +gfc_resolve_close (gfc_close *close) { - RESOLVE_TAG (&tag_unit, close->unit); RESOLVE_TAG (&tag_iomsg, close->iomsg); RESOLVE_TAG (&tag_iostat, close->iostat); @@ -1796,9 +1795,8 @@ gfc_resolve_close (gfc_close * close) /* Free a gfc_filepos structure. */ void -gfc_free_filepos (gfc_filepos * fp) +gfc_free_filepos (gfc_filepos *fp) { - gfc_free_expr (fp->unit); gfc_free_expr (fp->iomsg); gfc_free_expr (fp->iostat); @@ -1809,7 +1807,7 @@ gfc_free_filepos (gfc_filepos * fp) /* Match elements of a REWIND, BACKSPACE, ENDFILE, or FLUSH statement. */ static match -match_file_element (gfc_filepos * fp) +match_file_element (gfc_filepos *fp) { match m; @@ -1904,9 +1902,8 @@ cleanup: try -gfc_resolve_filepos (gfc_filepos * fp) +gfc_resolve_filepos (gfc_filepos *fp) { - RESOLVE_TAG (&tag_unit, fp->unit); RESOLVE_TAG (&tag_iostat, fp->iostat); RESOLVE_TAG (&tag_iomsg, fp->iomsg); @@ -1923,28 +1920,26 @@ gfc_resolve_filepos (gfc_filepos * fp) match gfc_match_endfile (void) { - return match_filepos (ST_END_FILE, EXEC_ENDFILE); } match gfc_match_backspace (void) { - return match_filepos (ST_BACKSPACE, EXEC_BACKSPACE); } match gfc_match_rewind (void) { - return match_filepos (ST_REWIND, EXEC_REWIND); } match gfc_match_flush (void) { - if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C") == FAILURE) + if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: FLUSH statement at %C") + == FAILURE) return MATCH_ERROR; return match_filepos (ST_FLUSH, EXEC_FLUSH); @@ -1976,7 +1971,7 @@ default_unit (io_kind k) /* Match a unit specification for a data transfer statement. */ static match -match_dt_unit (io_kind k, gfc_dt * dt) +match_dt_unit (io_kind k, gfc_dt *dt) { gfc_expr *e; @@ -2012,7 +2007,7 @@ conflict: /* Match a format specification. */ static match -match_dt_format (gfc_dt * dt) +match_dt_format (gfc_dt *dt) { locus where; gfc_expr *e; @@ -2070,7 +2065,7 @@ conflict: nonzero if we find such a variable. */ static int -check_namelist (gfc_symbol * sym) +check_namelist (gfc_symbol *sym) { gfc_namelist *p; @@ -2089,7 +2084,7 @@ check_namelist (gfc_symbol * sym) /* Match a single data transfer element. */ static match -match_dt_element (io_kind k, gfc_dt * dt) +match_dt_element (io_kind k, gfc_dt *dt) { char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_symbol *sym; @@ -2163,8 +2158,8 @@ match_dt_element (io_kind k, gfc_dt * dt) { if (k == M_WRITE) { - gfc_error ("END tag at %C not allowed in output statement"); - return MATCH_ERROR; + gfc_error ("END tag at %C not allowed in output statement"); + return MATCH_ERROR; } dt->end_where = gfc_current_locus; } @@ -2184,9 +2179,8 @@ match_dt_element (io_kind k, gfc_dt * dt) /* Free a data transfer structure and everything below it. */ void -gfc_free_dt (gfc_dt * dt) +gfc_free_dt (gfc_dt *dt) { - if (dt == NULL) return; @@ -2197,7 +2191,6 @@ gfc_free_dt (gfc_dt * dt) gfc_free_expr (dt->iomsg); gfc_free_expr (dt->iostat); gfc_free_expr (dt->size); - gfc_free (dt); } @@ -2205,7 +2198,7 @@ gfc_free_dt (gfc_dt * dt) /* Resolve everything in a gfc_dt structure. */ try -gfc_resolve_dt (gfc_dt * dt) +gfc_resolve_dt (gfc_dt *dt) { gfc_expr *e; @@ -2220,12 +2213,10 @@ gfc_resolve_dt (gfc_dt * dt) e = dt->io_unit; if (gfc_resolve_expr (e) == SUCCESS && (e->ts.type != BT_INTEGER - && (e->ts.type != BT_CHARACTER - || e->expr_type != EXPR_VARIABLE))) + && (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_VARIABLE))) { - gfc_error - ("UNIT specification at %L must be an INTEGER expression or a " - "CHARACTER variable", &e->where); + gfc_error ("UNIT specification at %L must be an INTEGER expression " + "or a CHARACTER variable", &e->where); return FAILURE; } @@ -2233,8 +2224,7 @@ gfc_resolve_dt (gfc_dt * dt) { if (gfc_has_vector_index (e)) { - gfc_error ("Internal unit with vector subscript at %L", - &e->where); + gfc_error ("Internal unit with vector subscript at %L", &e->where); return FAILURE; } } @@ -2286,7 +2276,7 @@ gfc_resolve_dt (gfc_dt * dt) && dt->format_label->defined == ST_LABEL_UNKNOWN) { gfc_error ("FORMAT label %d at %L not defined", dt->format_label->value, - &dt->format_label->where); + &dt->format_label->where); return FAILURE; } return SUCCESS; @@ -2329,10 +2319,10 @@ io_kind_name (io_kind k) which is equivalent to a single IO element. This function is mutually recursive with match_io_element(). */ -static match match_io_element (io_kind k, gfc_code **); +static match match_io_element (io_kind, gfc_code **); static match -match_io_iterator (io_kind k, gfc_code ** result) +match_io_iterator (io_kind k, gfc_code **result) { gfc_code *head, *tail, *new; gfc_iterator *iter; @@ -2421,7 +2411,7 @@ cleanup: expression or an IO Iterator. */ static match -match_io_element (io_kind k, gfc_code ** cpp) +match_io_element (io_kind k, gfc_code **cpp) { gfc_expr *expr; gfc_code *cp; @@ -2453,9 +2443,8 @@ match_io_element (io_kind k, gfc_code ** cpp) case M_READ: if (expr->symtree->n.sym->attr.intent == INTENT_IN) { - gfc_error - ("Variable '%s' in input list at %C cannot be INTENT(IN)", - expr->symtree->n.sym->name); + gfc_error ("Variable '%s' in input list at %C cannot be " + "INTENT(IN)", expr->symtree->n.sym->name); m = MATCH_ERROR; } @@ -2479,9 +2468,9 @@ match_io_element (io_kind k, gfc_code ** cpp) && current_dt->io_unit->expr_type == EXPR_VARIABLE && gfc_impure_variable (current_dt->io_unit->symtree->n.sym)) { - gfc_error - ("Cannot write to internal file unit '%s' at %C inside a " - "PURE procedure", current_dt->io_unit->symtree->n.sym->name); + gfc_error ("Cannot write to internal file unit '%s' at %C " + "inside a PURE procedure", + current_dt->io_unit->symtree->n.sym->name); m = MATCH_ERROR; } @@ -2509,7 +2498,7 @@ match_io_element (io_kind k, gfc_code ** cpp) /* Match an I/O list, building gfc_code structures as we go. */ static match -match_io_list (io_kind k, gfc_code ** head_p) +match_io_list (io_kind k, gfc_code **head_p) { gfc_code *head, *tail, *new; match m; @@ -2551,7 +2540,7 @@ cleanup: /* Attach the data transfer end node. */ static void -terminate_io (gfc_code * io_code) +terminate_io (gfc_code *io_code) { gfc_code *c; @@ -2572,7 +2561,8 @@ terminate_io (gfc_code * io_code) in resolve_tag and others in gfc_resolve_dt. */ static match -check_io_constraints (io_kind k, gfc_dt *dt, gfc_code * io_code, locus * spec_end) +check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code, + locus *spec_end) { #define io_constraint(condition,msg,arg)\ if (condition) \ @@ -2582,14 +2572,14 @@ if (condition) \ } match m; - gfc_expr * expr; - gfc_symbol * sym = NULL; + gfc_expr *expr; + gfc_symbol *sym = NULL; m = MATCH_YES; expr = dt->io_unit; if (expr && expr->expr_type == EXPR_VARIABLE - && expr->ts.type == BT_CHARACTER) + && expr->ts.type == BT_CHARACTER) { sym = expr->symtree->n.sym; @@ -2606,12 +2596,12 @@ if (condition) \ &dt->rec->where); if (dt->namelist != NULL) - { - if (gfc_notify_std(GFC_STD_F2003, - "Fortran 2003: Internal file at %L with namelist", - &expr->where) == FAILURE) - m = MATCH_ERROR; - } + { + if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Internal file " + "at %L with namelist", &expr->where) + == FAILURE) + m = MATCH_ERROR; + } io_constraint (dt->advance != NULL, "ADVANCE tag at %L is incompatible with internal file", @@ -2621,8 +2611,7 @@ if (condition) \ if (expr && expr->ts.type != BT_CHARACTER) { - io_constraint (gfc_pure (NULL) - && (k == M_READ || k == M_WRITE), + io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE), "IO UNIT in %s statement at %C must be " "an internal file in a PURE procedure", io_kind_name (k)); @@ -2631,12 +2620,10 @@ if (condition) \ if (k != M_READ) { - io_constraint (dt->end, - "END tag not allowed with output at %L", + io_constraint (dt->end, "END tag not allowed with output at %L", &dt->end_where); - io_constraint (dt->eor, - "EOR tag not allowed with output at %L", + io_constraint (dt->eor, "EOR tag not allowed with output at %L", &dt->eor_where); io_constraint (k != M_READ && dt->size, @@ -2701,9 +2688,8 @@ if (condition) \ "List directed format(*) is not allowed with a " "ADVANCE=specifier at %L.", &expr->where); - io_constraint (dt->format_expr == NULL - && dt->format_label == NULL - && dt->namelist == NULL, + io_constraint (dt->format_expr == NULL && dt->format_label == NULL + && dt->namelist == NULL, "the ADVANCE=specifier at %L must appear with an " "explicit format expression", &expr->where); @@ -2740,6 +2726,7 @@ if (condition) \ } #undef io_constraint + /* Match a READ, WRITE or PRINT statement. */ static match @@ -2812,7 +2799,6 @@ 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. */ @@ -2988,7 +2974,7 @@ gfc_match_print (void) /* Free a gfc_inquire structure. */ void -gfc_free_inquire (gfc_inquire * inquire) +gfc_free_inquire (gfc_inquire *inquire) { if (inquire == NULL) @@ -3022,7 +3008,6 @@ gfc_free_inquire (gfc_inquire * inquire) gfc_free_expr (inquire->iolength); gfc_free_expr (inquire->convert); gfc_free_expr (inquire->strm_pos); - gfc_free (inquire); } @@ -3032,7 +3017,7 @@ gfc_free_inquire (gfc_inquire * inquire) #define RETM if (m != MATCH_NO) return m; static match -match_inquire_element (gfc_inquire * inquire) +match_inquire_element (gfc_inquire *inquire) { match m; @@ -3155,15 +3140,15 @@ gfc_match_inquire (void) if (inquire->unit != NULL && inquire->file != NULL) { - gfc_error ("INQUIRE statement at %L cannot contain both FILE and" - " UNIT specifiers", &loc); + gfc_error ("INQUIRE statement at %L cannot contain both FILE and " + "UNIT specifiers", &loc); goto cleanup; } if (inquire->unit == NULL && inquire->file == NULL) { - gfc_error ("INQUIRE statement at %L requires either FILE or" - " UNIT specifier", &loc); + gfc_error ("INQUIRE statement at %L requires either FILE or " + "UNIT specifier", &loc); goto cleanup; } @@ -3189,9 +3174,8 @@ cleanup: /* Resolve everything in a gfc_inquire structure. */ try -gfc_resolve_inquire (gfc_inquire * inquire) +gfc_resolve_inquire (gfc_inquire *inquire) { - RESOLVE_TAG (&tag_unit, inquire->unit); RESOLVE_TAG (&tag_file, inquire->file); RESOLVE_TAG (&tag_iomsg, inquire->iomsg); |