aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/parse.c
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2010-08-02 15:30:47 +0000
committerMikael Morin <mikael@gcc.gnu.org>2010-08-02 15:30:47 +0000
commitef973f3f4b72e19f6e1354f4cbd9f387bbb7e510 (patch)
tree1b3eba31b52898eea06166444e90925e4c80c906 /gcc/fortran/parse.c
parent13cc4787bfdee0fa3d1cfe7b73f9d2492eb3320c (diff)
downloadgcc-ef973f3f4b72e19f6e1354f4cbd9f387bbb7e510.zip
gcc-ef973f3f4b72e19f6e1354f4cbd9f387bbb7e510.tar.gz
gcc-ef973f3f4b72e19f6e1354f4cbd9f387bbb7e510.tar.bz2
re PR fortran/42051 ([OOP] ICE on array-valued function with CLASS formal argument)
2010-08-02 Mikael Morin <mikael@gcc.gnu.org> Janus Weil <janus@gcc.gnu.org> PR fortran/42051 PR fortran/44064 PR fortran/45151 * intrinsic.c (gfc_get_intrinsic_sub_symbol): Commit changed symbol. * symbol.c (gen_cptr_param, gen_fptr_param, gen_shape_param, gfc_copy_formal_args, gfc_copy_formal_args_intr, gfc_copy_formal_args_ppc, generate_isocbinding_symbol): Ditto. * parse.c (parse_derived_contains, parse_spec, parse_progunit): Call reject_statement in case of error. (match_deferred_characteritics): Call gfc_undo_symbols in case match fails. Co-Authored-By: Janus Weil <janus@gcc.gnu.org> From-SVN: r162821
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r--gcc/fortran/parse.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 94440e9..d65ff1f 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -1892,13 +1892,12 @@ parse_derived_contains (void)
case ST_DATA_DECL:
gfc_error ("Components in TYPE at %C must precede CONTAINS");
- error_flag = true;
- break;
+ goto error;
case ST_PROCEDURE:
if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Type-bound"
" procedure at %C") == FAILURE)
- error_flag = true;
+ goto error;
accept_statement (ST_PROCEDURE);
seen_comps = true;
@@ -1907,7 +1906,7 @@ parse_derived_contains (void)
case ST_GENERIC:
if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: GENERIC binding"
" at %C") == FAILURE)
- error_flag = true;
+ goto error;
accept_statement (ST_GENERIC);
seen_comps = true;
@@ -1917,7 +1916,7 @@ parse_derived_contains (void)
if (gfc_notify_std (GFC_STD_F2003,
"Fortran 2003: FINAL procedure declaration"
" at %C") == FAILURE)
- error_flag = true;
+ goto error;
accept_statement (ST_FINAL);
seen_comps = true;
@@ -1930,7 +1929,7 @@ parse_derived_contains (void)
&& (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Derived type "
"definition at %C with empty CONTAINS "
"section") == FAILURE))
- error_flag = true;
+ goto error;
/* ST_END_TYPE is accepted by parse_derived after return. */
break;
@@ -1940,22 +1939,20 @@ parse_derived_contains (void)
{
gfc_error ("PRIVATE statement in TYPE at %C must be inside "
"a MODULE");
- error_flag = true;
- break;
+ goto error;
}
if (seen_comps)
{
gfc_error ("PRIVATE statement at %C must precede procedure"
" bindings");
- error_flag = true;
- break;
+ goto error;
}
if (seen_private)
{
gfc_error ("Duplicate PRIVATE statement at %C");
- error_flag = true;
+ goto error;
}
accept_statement (ST_PRIVATE);
@@ -1965,18 +1962,22 @@ parse_derived_contains (void)
case ST_SEQUENCE:
gfc_error ("SEQUENCE statement at %C must precede CONTAINS");
- error_flag = true;
- break;
+ goto error;
case ST_CONTAINS:
gfc_error ("Already inside a CONTAINS block at %C");
- error_flag = true;
- break;
+ goto error;
default:
unexpected_statement (st);
break;
}
+
+ continue;
+
+error:
+ error_flag = true;
+ reject_statement ();
}
pop_state ();
@@ -2395,7 +2396,10 @@ match_deferred_characteristics (gfc_typespec * ts)
gfc_commit_symbols ();
}
else
- gfc_error_check ();
+ {
+ gfc_error_check ();
+ gfc_undo_symbols ();
+ }
gfc_current_locus =loc;
return m;
@@ -2467,6 +2471,7 @@ loop:
case ST_STATEMENT_FUNCTION:
gfc_error ("%s statement is not allowed inside of BLOCK at %C",
gfc_ascii_statement (st));
+ reject_statement ();
break;
default:
@@ -2553,6 +2558,7 @@ declSt:
{
gfc_error ("%s statement must appear in a MODULE",
gfc_ascii_statement (st));
+ reject_statement ();
break;
}
@@ -2560,6 +2566,7 @@ declSt:
{
gfc_error ("%s statement at %C follows another accessibility "
"specification", gfc_ascii_statement (st));
+ reject_statement ();
break;
}
@@ -4004,6 +4011,7 @@ contains:
{
gfc_error ("CONTAINS statement at %C is already in a contained "
"program unit");
+ reject_statement ();
st = next_statement ();
goto loop;
}