aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2007-11-15 16:12:03 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2007-11-15 16:12:03 +0100
commitbb343a6c9b448d036a02a3eaeb475f76f1871577 (patch)
tree87b38110bd972bf830aae9bed26b88a27b52c998 /gcc
parentea6684648c9c2bf8d3e2e656a3dd1726768a87e8 (diff)
downloadgcc-bb343a6c9b448d036a02a3eaeb475f76f1871577.zip
gcc-bb343a6c9b448d036a02a3eaeb475f76f1871577.tar.gz
gcc-bb343a6c9b448d036a02a3eaeb475f76f1871577.tar.bz2
re PR fortran/33917 (Rejects valid PROCEDURE declarations)
2007-11-15 Tobias Burnus <burnus@net-b.de> PR fortran/33917 * decl.c (match_procedure_decl): Pre-resolve interface. * resolve.c (resolve_symbol): Reject interfaces later declared in procedure statements. 2007-11-15 Tobias Burnus <burnus@net-b.de> PR fortran/33917 * gfortran.dg/proc_decl_11.f90: New. From-SVN: r130202
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/decl.c6
-rw-r--r--gcc/fortran/resolve.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/proc_decl_11.f9034
5 files changed, 56 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a38d4ad..5411776 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-15 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33917
+ * decl.c (match_procedure_decl): Pre-resolve interface.
+ * resolve.c (resolve_symbol): Reject interfaces later
+ declared in procedure statements.
+
2007-11-13 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/33162
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 29b02ea..be197bc 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -3946,6 +3946,12 @@ match_procedure_decl (void)
/* Various interface checks. */
if (proc_if)
{
+ /* Resolve interface if possible. That way, attr.procedure is only set
+ if it is declared by a later procedure-declaration-stmt, which is
+ invalid per C1212. */
+ while (proc_if->interface)
+ proc_if = proc_if->interface;
+
if (proc_if->generic)
{
gfc_error ("Interface '%s' at %C may not be generic", proc_if->name);
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 3f3ef03..586d601 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -7615,8 +7615,10 @@ resolve_symbol (gfc_symbol *sym)
if (sym->attr.procedure && sym->interface
&& sym->attr.if_source != IFSRC_DECL)
{
- while (sym->interface->interface)
- sym->interface = sym->interface->interface;
+ if (sym->interface->attr.procedure)
+ gfc_error ("Interface '%s', used by procedure '%s' at %L, is declared "
+ "in a later PROCEDURE statement", sym->interface->name,
+ sym->name,&sym->declared_at);
/* Get the attributes from the interface (now resolved). */
if (sym->interface->attr.if_source || sym->interface->attr.intrinsic)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d937f4f..b3e26c0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-15 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33917
+ * gfortran.dg/proc_decl_11.f90: New.
+
2007-11-15 Ben Elliston <bje@au.ibm.com>
* gcc.target/spu/compare-dp.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_11.f90 b/gcc/testsuite/gfortran.dg/proc_decl_11.f90
new file mode 100644
index 0000000..74c0680
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_decl_11.f90
@@ -0,0 +1,34 @@
+! { dg-do compile }
+! PR fortran/33917
+!
+! Depending, in which order the symbol tree
+! was walked in resolve, gfortran resolved
+! p6 before p4; thus there was no explicit
+! interface available for p4 and an error
+! was printed. (This is a variant of proc_decl_2.f90)
+!
+! Additionally, the following contrain was not honoured:
+! "C1212 (R1215) [...] If name is declared by a procedure-declaration-stmt
+! it shall be previously declared." ("name" = interface-name)
+!
+program s
+ implicit none
+ procedure() :: q2
+ procedure() :: q3
+ procedure() :: q5
+ procedure(sub) :: p4
+ procedure(p4) :: p6
+contains
+ subroutine sub
+ end subroutine
+end program s
+
+subroutine test
+ implicit none
+ abstract interface
+ subroutine sub()
+ end subroutine sub
+ end interface
+ procedure(p4) :: p6 ! { dg-error "declared in a later PROCEDURE statement" }
+ procedure(sub) :: p4
+end subroutine test