diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2007-01-20 22:01:41 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2007-01-20 22:01:41 +0000 |
commit | edf1eac29ebf11051dfcba996ac4fb3064e3c95c (patch) | |
tree | a5e1dd4c7002a6118aa4d0e313e2d22c3b3aa8ad /gcc/fortran/parse.c | |
parent | 70fadd09be30c98ab6fccf3a97eede5f5c253c1e (diff) | |
download | gcc-edf1eac29ebf11051dfcba996ac4fb3064e3c95c.zip gcc-edf1eac29ebf11051dfcba996ac4fb3064e3c95c.tar.gz gcc-edf1eac29ebf11051dfcba996ac4fb3064e3c95c.tar.bz2 |
openmp.c, [...]: Next installment in the massive whitespace patch.
* openmp.c, matchexp.c, module.c, scanner.c, resolve.c, st.c,
parse.c, primary.c, options.c, misc.c, simplify.c: Next installment
in the massive whitespace patch.
From-SVN: r121012
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r-- | gcc/fortran/parse.c | 309 |
1 files changed, 146 insertions, 163 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index cbbf734..eb7802e 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -1,6 +1,6 @@ /* Main parser. - 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. @@ -20,7 +20,6 @@ along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - #include "config.h" #include "system.h" #include <setjmp.h> @@ -28,9 +27,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "match.h" #include "parse.h" -/* Current statement label. Zero means no statement label. Because - new_st can get wiped during statement matching, we have to keep it - separate. */ +/* Current statement label. Zero means no statement label. Because new_st + can get wiped during statement matching, we have to keep it separate. */ gfc_st_label *gfc_statement_label; @@ -51,7 +49,7 @@ static void reject_statement (void); gfc_match_eos(). */ static match -match_word (const char *str, match (*subr) (void), locus * old_locus) +match_word (const char *str, match (*subr) (void), locus *old_locus) { match m; @@ -79,11 +77,11 @@ match_word (const char *str, match (*subr) (void), locus * old_locus) ambiguity. */ #define match(keyword, subr, st) \ - do { \ + do { \ if (match_word(keyword, subr, &old_locus) == MATCH_YES) \ - return st; \ + return st; \ else \ - undo_new_statement (); \ + undo_new_statement (); \ } while (0); static gfc_statement @@ -322,7 +320,8 @@ decode_omp_directive (void) if (gfc_pure (NULL)) { - gfc_error_now ("OpenMP directives at %C may not appear in PURE or ELEMENTAL procedures"); + gfc_error_now ("OpenMP directives at %C may not appear in PURE " + "or ELEMENTAL procedures"); gfc_error_recovery (); return ST_NONE; } @@ -434,7 +433,7 @@ next_free (void) { gfc_match_small_literal_int (&c, &cnt); - if (cnt > 5) + if (cnt > 5) gfc_error_now ("Too many digits in statement label at %C"); if (c == 0) @@ -457,16 +456,16 @@ next_free (void) if (at_bol && gfc_peek_char () == ';') { - gfc_error_now - ("Semicolon at %C needs to be preceded by statement"); + gfc_error_now ("Semicolon at %C needs to be preceded by " + "statement"); gfc_next_char (); /* Eat up the semicolon. */ return ST_NONE; } if (gfc_match_eos () == MATCH_YES) { - gfc_warning_now - ("Ignoring statement label in empty statement at %C"); + gfc_warning_now ("Ignoring statement label in empty statement " + "at %C"); gfc_free_st_label (gfc_statement_label); gfc_statement_label = NULL; return ST_NONE; @@ -669,8 +668,7 @@ next_statement (void) break; } - st = - (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free (); + st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free (); if (st != ST_NONE) break; @@ -723,21 +721,19 @@ next_statement (void) are detected in gfc_match_end(). */ #define case_end case ST_END_BLOCK_DATA: case ST_END_FUNCTION: \ - case ST_END_PROGRAM: case ST_END_SUBROUTINE + case ST_END_PROGRAM: case ST_END_SUBROUTINE /* Push a new state onto the stack. */ static void -push_state (gfc_state_data * p, gfc_compile_state new_state, gfc_symbol * sym) +push_state (gfc_state_data *p, gfc_compile_state new_state, gfc_symbol *sym) { - p->state = new_state; p->previous = gfc_state_stack; p->sym = sym; p->head = p->tail = NULL; p->do_variable = NULL; - gfc_state_stack = p; } @@ -747,7 +743,6 @@ push_state (gfc_state_data * p, gfc_compile_state new_state, gfc_symbol * sym) static void pop_state (void) { - gfc_state_stack = gfc_state_stack->previous; } @@ -770,7 +765,7 @@ gfc_find_state (gfc_compile_state state) /* Starts a new level in the statement list. */ static gfc_code * -new_level (gfc_code * q) +new_level (gfc_code *q) { gfc_code *p; @@ -857,8 +852,8 @@ check_statement_label (gfc_statement st) break; /* Statement labels are not restricted from appearing on a - particular line. However, there are plenty of situations - where the resulting label can't be referenced. */ + particular line. However, there are plenty of situations + where the resulting label can't be referenced. */ default: type = ST_LABEL_BAD_TARGET; @@ -1230,7 +1225,7 @@ gfc_ascii_statement (gfc_statement st) /* Create a symbol for the main program and assign it to ns->proc_name. */ static void -main_program_symbol (gfc_namespace * ns) +main_program_symbol (gfc_namespace *ns) { gfc_symbol *main_program; symbol_attribute attr; @@ -1254,7 +1249,6 @@ main_program_symbol (gfc_namespace * ns) static void accept_statement (gfc_statement st) { - switch (st) { case ST_USE: @@ -1275,8 +1269,8 @@ accept_statement (gfc_statement st) break; /* If the statement is the end of a block, lay down a special code - that allows a branch to the end of the block from within the - construct. */ + that allows a branch to the end of the block from within the + construct. */ case ST_ENDIF: case ST_END_SELECT: @@ -1289,8 +1283,8 @@ accept_statement (gfc_statement st) break; /* The end-of-program unit statements do not get the special - marker and require a statement of some sort if they are a - branch target. */ + marker and require a statement of some sort if they are a + branch target. */ case ST_END_PROGRAM: case ST_END_FUNCTION: @@ -1338,7 +1332,6 @@ reject_statement (void) static void unexpected_statement (gfc_statement st) { - gfc_error ("Unexpected %s statement at %C", gfc_ascii_statement (st)); reject_statement (); @@ -1354,30 +1347,30 @@ unexpected_statement (gfc_statement st) valid before calling here, ie ENTRY statements are not allowed in INTERFACE blocks. The following diagram is taken from the standard: - +---------------------------------------+ - | program subroutine function module | - +---------------------------------------+ - | use | - +---------------------------------------+ - | import | - +---------------------------------------+ - | | implicit none | - | +-----------+------------------+ - | | parameter | implicit | - | +-----------+------------------+ - | format | | derived type | - | entry | parameter | interface | - | | data | specification | - | | | statement func | - | +-----------+------------------+ - | | data | executable | - +--------+-----------+------------------+ - | contains | - +---------------------------------------+ - | internal module/subprogram | - +---------------------------------------+ - | end | - +---------------------------------------+ + +---------------------------------------+ + | program subroutine function module | + +---------------------------------------+ + | use | + +---------------------------------------+ + | import | + +---------------------------------------+ + | | implicit none | + | +-----------+------------------+ + | | parameter | implicit | + | +-----------+------------------+ + | format | | derived type | + | entry | parameter | interface | + | | data | specification | + | | | statement func | + | +-----------+------------------+ + | | data | executable | + +--------+-----------+------------------+ + | contains | + +---------------------------------------+ + | internal module/subprogram | + +---------------------------------------+ + | end | + +---------------------------------------+ */ @@ -1394,7 +1387,7 @@ typedef struct st_state; static try -verify_st_order (st_state * p, gfc_statement st) +verify_st_order (st_state *p, gfc_statement st) { switch (st) @@ -1419,10 +1412,10 @@ verify_st_order (st_state * p, gfc_statement st) if (p->state > ORDER_IMPLICIT_NONE) goto order; - /* The '>' sign cannot be a '>=', because a FORMAT or ENTRY - statement disqualifies a USE but not an IMPLICIT NONE. - Duplicate IMPLICIT NONEs are caught when the implicit types - are set. */ + /* The '>' sign cannot be a '>=', because a FORMAT or ENTRY + statement disqualifies a USE but not an IMPLICIT NONE. + Duplicate IMPLICIT NONEs are caught when the implicit types + are set. */ p->state = ORDER_IMPLICIT_NONE; break; @@ -1468,9 +1461,8 @@ verify_st_order (st_state * p, gfc_statement st) break; default: - gfc_internal_error - ("Unexpected %s statement in verify_st_order() at %C", - gfc_ascii_statement (st)); + gfc_internal_error ("Unexpected %s statement in verify_st_order() at %C", + gfc_ascii_statement (st)); } /* All is well, record the statement in case we need it next time. */ @@ -1560,8 +1552,8 @@ parse_derived (void) case ST_PRIVATE: if (gfc_find_state (COMP_MODULE) == FAILURE) { - gfc_error - ("PRIVATE statement in TYPE at %C must be inside a MODULE"); + gfc_error ("PRIVATE statement in TYPE at %C must be inside " + "a MODULE"); error_flag = 1; break; } @@ -1619,8 +1611,8 @@ parse_derived (void) sym = gfc_current_block (); for (c = sym->components; c; c = c->next) { - if (c->allocatable || (c->ts.type == BT_DERIVED - && c->ts.derived->attr.alloc_comp)) + if (c->allocatable + || (c->ts.type == BT_DERIVED && c->ts.derived->attr.alloc_comp)) { sym->attr.alloc_comp = 1; break; @@ -1631,7 +1623,6 @@ parse_derived (void) } - /* Parse an ENUM. */ static void @@ -1653,35 +1644,36 @@ parse_enum (void) { st = next_statement (); switch (st) - { - case ST_NONE: - unexpected_eof (); - break; + { + case ST_NONE: + unexpected_eof (); + break; - case ST_ENUMERATOR: + case ST_ENUMERATOR: seen_enumerator = 1; - accept_statement (st); - break; + accept_statement (st); + break; - case ST_END_ENUM: - compiling_enum = 0; + case ST_END_ENUM: + compiling_enum = 0; if (!seen_enumerator) - { - gfc_error ("ENUM declaration at %C has no ENUMERATORS"); + { + gfc_error ("ENUM declaration at %C has no ENUMERATORS"); error_flag = 1; - } - accept_statement (st); - break; - - default: - gfc_free_enum_history (); - unexpected_statement (st); - break; - } + } + accept_statement (st); + break; + + default: + gfc_free_enum_history (); + unexpected_statement (st); + break; + } } pop_state (); } + /* Parse an interface. We must be able to deal with the possibility of recursive interfaces. The parse_spec() subroutine is mutually recursive with parse_interface(). */ @@ -1704,7 +1696,8 @@ parse_interface (void) save = current_interface; sym = (current_interface.type == INTERFACE_GENERIC - || current_interface.type == INTERFACE_USER_OP) ? gfc_new_block : NULL; + || current_interface.type == INTERFACE_USER_OP) + ? gfc_new_block : NULL; push_state (&s1, COMP_INTERFACE, sym); current_state = COMP_NONE; @@ -1768,14 +1761,12 @@ loop: if (new_state != current_state) { if (new_state == COMP_SUBROUTINE) - gfc_error - ("SUBROUTINE at %C does not belong in a generic function " - "interface"); + gfc_error ("SUBROUTINE at %C does not belong in a " + "generic function interface"); if (new_state == COMP_FUNCTION) - gfc_error - ("FUNCTION at %C does not belong in a generic subroutine " - "interface"); + gfc_error ("FUNCTION at %C does not belong in a " + "generic subroutine interface"); } } } @@ -1945,7 +1936,7 @@ parse_where_block (void) case ST_WHERE_BLOCK: parse_where_block (); - break; + break; case ST_ASSIGNMENT: case ST_WHERE: @@ -1955,9 +1946,8 @@ parse_where_block (void) case ST_ELSEWHERE: if (seen_empty_else) { - gfc_error - ("ELSEWHERE statement at %C follows previous unmasked " - "ELSEWHERE"); + gfc_error ("ELSEWHERE statement at %C follows previous " + "unmasked ELSEWHERE"); break; } @@ -1982,7 +1972,6 @@ parse_where_block (void) reject_statement (); break; } - } while (st != ST_END_WHERE); @@ -2088,9 +2077,8 @@ parse_if_block (void) case ST_ELSEIF: if (seen_else) { - gfc_error - ("ELSE IF statement at %C cannot follow ELSE statement at %L", - &else_locus); + gfc_error ("ELSE IF statement at %C cannot follow ELSE " + "statement at %L", &else_locus); reject_statement (); break; @@ -2168,9 +2156,8 @@ parse_select_block (void) if (st == ST_CASE) break; - gfc_error - ("Expected a CASE or END SELECT statement following SELECT CASE " - "at %C"); + gfc_error ("Expected a CASE or END SELECT statement following SELECT " + "CASE at %C"); reject_statement (); } @@ -2200,8 +2187,8 @@ parse_select_block (void) case ST_END_SELECT: break; - /* Can't have an executable statement because of - parse_executable(). */ + /* Can't have an executable statement because of + parse_executable(). */ default: unexpected_statement (st); break; @@ -2261,8 +2248,7 @@ check_do_closure (void) if (p == gfc_state_stack) return 1; - gfc_error - ("End of nonblock DO statement at %C is within another block"); + gfc_error ("End of nonblock DO statement at %C is within another block"); return 2; } @@ -2320,8 +2306,8 @@ loop: case ST_ENDDO: if (s.ext.end_do_label != NULL && s.ext.end_do_label != gfc_statement_label) - gfc_error_now - ("Statement label in ENDDO at %C doesn't match DO label"); + gfc_error_now ("Statement label in ENDDO at %C doesn't match " + "DO label"); if (gfc_statement_label != NULL) { @@ -2336,9 +2322,8 @@ loop: name, but in that case we must have seen ST_ENDDO first). We only complain about this in pedantic mode. */ if (gfc_current_block () != NULL) - gfc_error_now - ("named block DO at %L requires matching ENDDO name", - &gfc_current_block()->declared_at); + gfc_error_now ("named block DO at %L requires matching ENDDO name", + &gfc_current_block()->declared_at); break; @@ -2387,12 +2372,12 @@ parse_omp_do (gfc_statement omp_st) && gfc_state_stack->previous->ext.end_do_label == gfc_statement_label) { /* In - DO 100 I=1,10 - !$OMP DO - DO J=1,10 - ... - 100 CONTINUE - there should be no !$OMP END DO. */ + DO 100 I=1,10 + !$OMP DO + DO J=1,10 + ... + 100 CONTINUE + there should be no !$OMP END DO. */ pop_state (); return ST_IMPLIED_ENDDO; } @@ -2593,8 +2578,8 @@ parse_omp_structured_block (gfc_statement omp_st, bool workshare_stmts_only) if (((cp->ext.omp_name == NULL) ^ (new_st.ext.omp_name == NULL)) || (new_st.ext.omp_name != NULL && strcmp (cp->ext.omp_name, new_st.ext.omp_name) != 0)) - gfc_error ("Name after !$omp critical and !$omp end critical does" - " not match at %C"); + gfc_error ("Name after !$omp critical and !$omp end critical does " + "not match at %C"); gfc_free ((char *) new_st.ext.omp_name); break; case EXEC_OMP_END_SINGLE: @@ -2649,9 +2634,8 @@ parse_executable (gfc_statement st) case ST_FORALL: case ST_WHERE: case ST_SELECT_CASE: - gfc_error - ("%s statement at %C cannot terminate a non-block DO loop", - gfc_ascii_statement (st)); + gfc_error ("%s statement at %C cannot terminate a non-block " + "DO loop", gfc_ascii_statement (st)); break; default: @@ -2738,7 +2722,7 @@ static void parse_progunit (gfc_statement); the child namespace as the parser didn't know about this procedure. */ static void -gfc_fixup_sibling_symbols (gfc_symbol * sym, gfc_namespace * siblings) +gfc_fixup_sibling_symbols (gfc_symbol *sym, gfc_namespace *siblings) { gfc_namespace *ns; gfc_symtree *st; @@ -2756,17 +2740,17 @@ gfc_fixup_sibling_symbols (gfc_symbol * sym, gfc_namespace * siblings) if ((old_sym->attr.flavor == FL_PROCEDURE || old_sym->ts.type == BT_UNKNOWN) && old_sym->ns == ns - && ! old_sym->attr.contained) - { - /* Replace it with the symbol from the parent namespace. */ - st->n.sym = sym; - sym->refs++; - - /* Free the old (local) symbol. */ - old_sym->refs--; - if (old_sym->refs == 0) - gfc_free_symbol (old_sym); - } + && !old_sym->attr.contained) + { + /* Replace it with the symbol from the parent namespace. */ + st->n.sym = sym; + sym->refs++; + + /* Free the old (local) symbol. */ + old_sym->refs--; + if (old_sym->refs == 0) + gfc_free_symbol (old_sym); + } /* Do the same for any contained procedures. */ gfc_fixup_sibling_symbols (sym, ns->contained); @@ -2815,9 +2799,8 @@ parse_contained (int module) if (!module) { if (gfc_get_symbol (gfc_new_block->name, parent_ns, &sym)) - gfc_error - ("Contained procedure '%s' at %C is already ambiguous", - gfc_new_block->name); + gfc_error ("Contained procedure '%s' at %C is already " + "ambiguous", gfc_new_block->name); else { if (gfc_add_procedure (&sym->attr, PROC_INTERNAL, sym->name, @@ -2835,18 +2818,18 @@ parse_contained (int module) gfc_commit_symbols (); } - else - sym = gfc_new_block; + else + sym = gfc_new_block; - /* Mark this as a contained function, so it isn't replaced - by other module functions. */ - sym->attr.contained = 1; + /* Mark this as a contained function, so it isn't replaced + by other module functions. */ + sym->attr.contained = 1; sym->attr.referenced = 1; parse_progunit (ST_NONE); - /* Fix up any sibling functions that refer to this one. */ - gfc_fixup_sibling_symbols (sym, gfc_current_ns); + /* Fix up any sibling functions that refer to this one. */ + gfc_fixup_sibling_symbols (sym, gfc_current_ns); /* Or refer to any of its alternate entry points. */ for (el = gfc_current_ns->entries; el; el = el->next) gfc_fixup_sibling_symbols (el->sym, gfc_current_ns); @@ -2857,8 +2840,7 @@ parse_contained (int module) pop_state (); break; - /* These statements are associated with the end of the host - unit. */ + /* These statements are associated with the end of the host unit. */ case ST_END_FUNCTION: case ST_END_MODULE: case ST_END_PROGRAM: @@ -2888,9 +2870,8 @@ parse_contained (int module) pop_state (); if (!contains_statements) /* This is valid in Fortran 2008. */ - gfc_notify_std (GFC_STD_GNU, "Extension: " - "CONTAINS statement without FUNCTION " - "or SUBROUTINE statement at %C"); + gfc_notify_std (GFC_STD_GNU, "Extension: CONTAINS statement without " + "FUNCTION or SUBROUTINE statement at %C"); } @@ -3028,22 +3009,23 @@ parse_block_data (void) { if (blank_block) gfc_error ("Blank BLOCK DATA at %C conflicts with " - "prior BLOCK DATA at %L", &blank_locus); + "prior BLOCK DATA at %L", &blank_locus); else { - blank_block = 1; - blank_locus = gfc_current_locus; + blank_block = 1; + blank_locus = gfc_current_locus; } } else { s = gfc_get_gsymbol (gfc_new_block->name); - if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA)) + if (s->defined + || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA)) global_used(s, NULL); else { - s->type = GSYM_BLOCK_DATA; - s->where = gfc_current_locus; + s->type = GSYM_BLOCK_DATA; + s->where = gfc_current_locus; s->defined = 1; } } @@ -3115,7 +3097,8 @@ add_global_procedure (int sub) s = gfc_get_gsymbol(gfc_new_block->name); if (s->defined - || (s->type != GSYM_UNKNOWN && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION))) + || (s->type != GSYM_UNKNOWN + && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION))) global_used(s, NULL); else { @@ -3237,7 +3220,7 @@ loop: prog_locus = gfc_current_locus; push_state (&s, COMP_PROGRAM, gfc_new_block); - main_program_symbol(gfc_current_ns); + main_program_symbol (gfc_current_ns); parse_progunit (st); break; } |