diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-17 17:49:45 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-17 17:49:45 +0000 |
commit | 2b77e908124cefa480e1e3143c57b4fc3e353da0 (patch) | |
tree | 267c805c4f889eb005138028072b31606dfc71d5 /gcc/fortran/interface.c | |
parent | a0857153ddb27ba0f64a16c934734421fd2fccfc (diff) | |
download | gcc-2b77e908124cefa480e1e3143c57b4fc3e353da0.zip gcc-2b77e908124cefa480e1e3143c57b4fc3e353da0.tar.gz gcc-2b77e908124cefa480e1e3143c57b4fc3e353da0.tar.bz2 |
re PR fortran/25252 (ICE on invalid code)
PR fortran/25252
* interface.c (gfc_current_interface_head,
gfc_set_current_interface_head): New functions.
* decl.c (gfc_match_modproc): Move check for syntax error earlier.
On syntax error, restore previous state of the interface.
* gfortran.h (gfc_current_interface_head,
gfc_set_current_interface_head): New prototypes.
* gfortran.dg/interface_22.f90: New test.
From-SVN: r130259
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r-- | gcc/fortran/interface.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 650cd21..67a60f6 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -2707,6 +2707,52 @@ gfc_add_interface (gfc_symbol *new) } +gfc_interface * +gfc_current_interface_head (void) +{ + switch (current_interface.type) + { + case INTERFACE_INTRINSIC_OP: + return current_interface.ns->operator[current_interface.op]; + break; + + case INTERFACE_GENERIC: + return current_interface.sym->generic; + break; + + case INTERFACE_USER_OP: + return current_interface.uop->operator; + break; + + default: + gcc_unreachable (); + } +} + + +void +gfc_set_current_interface_head (gfc_interface *i) +{ + switch (current_interface.type) + { + case INTERFACE_INTRINSIC_OP: + current_interface.ns->operator[current_interface.op] = i; + break; + + case INTERFACE_GENERIC: + current_interface.sym->generic = i; + break; + + case INTERFACE_USER_OP: + current_interface.uop->operator = i; + break; + + default: + gcc_unreachable (); + } +} + + /* Gets rid of a formal argument list. We do not free symbols. Symbols are freed when a namespace is freed. */ |