aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2018-10-12 20:13:25 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2018-10-12 20:13:25 +0200
commitb4439561c4019cf3bc4c59cc6260d7464917f1e5 (patch)
treec4412a931256b6cbf19606a293be351d0b3ea9c2 /gcc/fortran
parentd8d3cc098eda75481a13d66f6e04fadffc5cecff (diff)
downloadgcc-b4439561c4019cf3bc4c59cc6260d7464917f1e5.zip
gcc-b4439561c4019cf3bc4c59cc6260d7464917f1e5.tar.gz
gcc-b4439561c4019cf3bc4c59cc6260d7464917f1e5.tar.bz2
Fix error-recovery ICE in check_proc_interface
PR fortran/58787 * decl.c (get_proc_name): Return with error before creating sym_tree. PR fortran/58787 * gfortran.dg/goacc/pr77765.f90: Modify dg-error. * gfortran.dg/interface_42.f90: Ditto. * gfortran.dg/internal_references_1.f90: Ditto. * gfortran.dg/invalid_procedure_name.f90: Ditto. * gfortran.dg/pr65453.f90: Ditto. * gfortran.dg/pr77414.f90: Ditto. * gfortran.dg/pr78741.f90: Ditto. * gfortran.dg/same_name_2.f90: Ditto. From-SVN: r265125
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c54
2 files changed, 43 insertions, 17 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ac2bf3a..2181363 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-10-12 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/58787
+ * decl.c (get_proc_name): Return with error before
+ creating sym_tree.
+
2018-10-11 Tobias Burnus <burnus@net-b.de>
Revert:
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 7f79811..87c736f 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1231,28 +1231,39 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& sym->attr.proc != 0
&& (sym->attr.subroutine || sym->attr.function || sym->attr.entry)
&& sym->attr.if_source != IFSRC_UNKNOWN)
- gfc_error_now ("Procedure %qs at %C is already defined at %L",
- name, &sym->declared_at);
-
+ {
+ gfc_error_now ("Procedure %qs at %C is already defined at %L",
+ name, &sym->declared_at);
+ return true;
+ }
if (sym->attr.flavor != 0
&& sym->attr.entry && sym->attr.if_source != IFSRC_UNKNOWN)
- gfc_error_now ("Procedure %qs at %C is already defined at %L",
- name, &sym->declared_at);
+ {
+ gfc_error_now ("Procedure %qs at %C is already defined at %L",
+ name, &sym->declared_at);
+ return true;
+ }
if (sym->attr.external && sym->attr.procedure
&& gfc_current_state () == COMP_CONTAINS)
- gfc_error_now ("Contained procedure %qs at %C clashes with "
- "procedure defined at %L",
- name, &sym->declared_at);
+ {
+ gfc_error_now ("Contained procedure %qs at %C clashes with "
+ "procedure defined at %L",
+ name, &sym->declared_at);
+ return true;
+ }
/* Trap a procedure with a name the same as interface in the
encompassing scope. */
if (sym->attr.generic != 0
&& (sym->attr.subroutine || sym->attr.function)
&& !sym->attr.mod_proc)
- gfc_error_now ("Name %qs at %C is already defined"
- " as a generic interface at %L",
- name, &sym->declared_at);
+ {
+ gfc_error_now ("Name %qs at %C is already defined"
+ " as a generic interface at %L",
+ name, &sym->declared_at);
+ return true;
+ }
/* Trap declarations of attributes in encompassing scope. The
signature for this is that ts.kind is set. Legitimate
@@ -1263,8 +1274,11 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& gfc_current_ns->parent != NULL
&& sym->attr.access == 0
&& !module_fcn_entry)
- gfc_error_now ("Procedure %qs at %C has an explicit interface "
+ {
+ gfc_error_now ("Procedure %qs at %C has an explicit interface "
"from a previous declaration", name);
+ return true;
+ }
}
/* C1246 (R1225) MODULE shall appear only in the function-stmt or
@@ -1276,17 +1290,23 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
&& !current_attr.module_procedure
&& sym->attr.proc == PROC_MODULE
&& gfc_state_stack->state == COMP_CONTAINS)
- gfc_error_now ("Procedure %qs defined in interface body at %L "
- "clashes with internal procedure defined at %C",
- name, &sym->declared_at);
+ {
+ gfc_error_now ("Procedure %qs defined in interface body at %L "
+ "clashes with internal procedure defined at %C",
+ name, &sym->declared_at);
+ return true;
+ }
if (sym && !sym->gfc_new
&& sym->attr.flavor != FL_UNKNOWN
&& sym->attr.referenced == 0 && sym->attr.subroutine == 1
&& gfc_state_stack->state == COMP_CONTAINS
&& gfc_state_stack->previous->state == COMP_SUBROUTINE)
- gfc_error_now ("Procedure %qs at %C is already defined at %L",
- name, &sym->declared_at);
+ {
+ gfc_error_now ("Procedure %qs at %C is already defined at %L",
+ name, &sym->declared_at);
+ return true;
+ }
if (gfc_current_ns->parent == NULL || *result == NULL)
return rc;