aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c54
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/gfortran.dg/goacc/pr77765.f903
-rw-r--r--gcc/testsuite/gfortran.dg/interface_42.f904
-rw-r--r--gcc/testsuite/gfortran.dg/internal_references_1.f908
-rw-r--r--gcc/testsuite/gfortran.dg/invalid_procedure_name.f902
-rw-r--r--gcc/testsuite/gfortran.dg/pr65453.f902
-rw-r--r--gcc/testsuite/gfortran.dg/pr77414.f904
-rw-r--r--gcc/testsuite/gfortran.dg/pr78741.f902
-rw-r--r--gcc/testsuite/gfortran.dg/same_name_2.f904
11 files changed, 69 insertions, 32 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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 964f4ea..4991c2e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2018-10-12 Tobias Burnus <burnus@net-b.de>
+
+ 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.
+
2018-10-12 Wilco Dijkstra <wdijkstr@arm.com>
* gcc.target/aarch64/popcnt.c: Test zero-extended popcount.
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr77765.f90 b/gcc/testsuite/gfortran.dg/goacc/pr77765.f90
index 3819cf7..afa0a56 100644
--- a/gcc/testsuite/gfortran.dg/goacc/pr77765.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/pr77765.f90
@@ -13,7 +13,6 @@ contains
end module m
! { dg-error "Procedure 'f' at .1. is already defined" "" { target *-*-* } 8 }
-! { dg-error "Duplicate RECURSIVE attribute specified" "" { target *-*-* } 8 }
! { dg-error ".1." "" { target *-*-* } 10 }
-! { dg-error "Unexpected ..ACC ROUTINE" "" { target *-*-* } 11 }
+! { dg-error "Syntax error in ..ACC ROUTINE . NAME . at .1., invalid function name f" "" { target *-*-* } 11 }
! { dg-error "Expecting END MODULE statement" "" { target *-*-* } 12 }
diff --git a/gcc/testsuite/gfortran.dg/interface_42.f90 b/gcc/testsuite/gfortran.dg/interface_42.f90
index 1fd47b9..d260755 100644
--- a/gcc/testsuite/gfortran.dg/interface_42.f90
+++ b/gcc/testsuite/gfortran.dg/interface_42.f90
@@ -13,7 +13,7 @@ module copy
contains
- subroutine foo_da(da, copy) ! { dg-error "defined in interface body" }
+ subroutine foo_da(da, copy) ! { dg-error "defined in interface body|PROCEDURE attribute conflicts with PROCEDURE attribute" }
integer, intent(in) :: da(:)
integer, allocatable, intent(out) :: copy(:)
allocate( copy( size(da) ) )
@@ -21,4 +21,4 @@ module copy
end subroutine foo_da
end module copy
-{ dg-prune-output "compilation terminated" }
+! { dg-prune-output "compilation terminated" }
diff --git a/gcc/testsuite/gfortran.dg/internal_references_1.f90 b/gcc/testsuite/gfortran.dg/internal_references_1.f90
index 2434e28..b53ab32 100644
--- a/gcc/testsuite/gfortran.dg/internal_references_1.f90
+++ b/gcc/testsuite/gfortran.dg/internal_references_1.f90
@@ -16,8 +16,8 @@ contains
end subroutine
subroutine p (i) ! { dg-error "is already defined" }
- integer :: i
- end subroutine
+ integer :: i ! { dg-error "Unexpected data declaration statement in CONTAINS section" }
+ end subroutine ! { dg-error "Expecting END MODULE statement" }
end module
!
! PR25124 - would happily ignore the declaration of foo in the main program.
@@ -27,8 +27,8 @@ x = bar () ! This is OK because it is a regular reference.
x = foo ()
contains
function foo () ! { dg-error "explicit interface from a previous" }
- foo = 1.0
- end function foo
+ foo = 1.0 ! { dg-error "Unexpected assignment statement in CONTAINS section" }
+ end function foo ! { dg-error "Expecting END PROGRAM statement" }
function bar ()
bar = 1.0
end function bar
diff --git a/gcc/testsuite/gfortran.dg/invalid_procedure_name.f90 b/gcc/testsuite/gfortran.dg/invalid_procedure_name.f90
index dd31938..74eaa63 100644
--- a/gcc/testsuite/gfortran.dg/invalid_procedure_name.f90
+++ b/gcc/testsuite/gfortran.dg/invalid_procedure_name.f90
@@ -9,6 +9,6 @@ INTERFACE I1 ! { dg-error "" }
END INTERFACE I1
CONTAINS
SUBROUTINE I1(I) ! { dg-error "already defined as a generic" }
- END SUBROUTINE I1
+ END SUBROUTINE I1 ! { dg-error "Expecting END PROGRAM statement" }
END
diff --git a/gcc/testsuite/gfortran.dg/pr65453.f90 b/gcc/testsuite/gfortran.dg/pr65453.f90
index 8d30116..9f40121 100644
--- a/gcc/testsuite/gfortran.dg/pr65453.f90
+++ b/gcc/testsuite/gfortran.dg/pr65453.f90
@@ -5,4 +5,4 @@ procedure() :: foo ! { dg-error "(1)" }
contains
subroutine foo() ! { dg-error "clashes with procedure" }
end
-end
+end ! { dg-error "Two main PROGRAMs" }
diff --git a/gcc/testsuite/gfortran.dg/pr77414.f90 b/gcc/testsuite/gfortran.dg/pr77414.f90
index 222c1a3..00f14e3 100644
--- a/gcc/testsuite/gfortran.dg/pr77414.f90
+++ b/gcc/testsuite/gfortran.dg/pr77414.f90
@@ -4,6 +4,6 @@ subroutine a(x) ! { dg-error "(1)" }
character(*) :: x
contains
subroutine a(x) ! { dg-error " is already defined at" }
- character(*) :: x
+ character(*) :: x ! { dg-error "Unexpected data declaration statement in CONTAINS section" }
end subroutine a
-end subroutine a
+end subroutine a ! { dg-error "Expecting END PROGRAM statement" }
diff --git a/gcc/testsuite/gfortran.dg/pr78741.f90 b/gcc/testsuite/gfortran.dg/pr78741.f90
index 6eb8578..707b299 100644
--- a/gcc/testsuite/gfortran.dg/pr78741.f90
+++ b/gcc/testsuite/gfortran.dg/pr78741.f90
@@ -11,6 +11,6 @@ entry g(n, x) ! { dg-error "is already defined" }
x = 'b'
contains
subroutine g ! { dg-error "(1)" }
- z(1) = x(1:1)
+ z(1) = x(1:1) ! { dg-error "Unclassifiable statement" }
end
end
diff --git a/gcc/testsuite/gfortran.dg/same_name_2.f90 b/gcc/testsuite/gfortran.dg/same_name_2.f90
index 463ac85..f37de55 100644
--- a/gcc/testsuite/gfortran.dg/same_name_2.f90
+++ b/gcc/testsuite/gfortran.dg/same_name_2.f90
@@ -10,6 +10,6 @@ subroutine aa ! { dg-error "Procedure" }
write(*,*) 'AA'
end subroutine aa
subroutine aa ! { dg-error "is already defined" }
- write(*,*) 'BB'
-end subroutine aa
+ write(*,*) 'BB' ! { dg-error "Unexpected WRITE statement in CONTAINS section" }
+end subroutine aa ! { dg-error "Expecting END MODULE statement" }
end module