diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2006-11-22 00:02:02 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2006-11-22 00:02:02 +0000 |
commit | 991f3b1289865f843d1724594f3dd57f4abf87ec (patch) | |
tree | e62b2d2f9aaa4913fcee701e4860e243dd0984c3 | |
parent | ac8f6c69032b9a07b3036a2514bd59353b2a32c3 (diff) | |
download | gcc-991f3b1289865f843d1724594f3dd57f4abf87ec.zip gcc-991f3b1289865f843d1724594f3dd57f4abf87ec.tar.gz gcc-991f3b1289865f843d1724594f3dd57f4abf87ec.tar.bz2 |
re PR fortran/29652 (ambiguous interface declaration undetected)
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652
* interface.c (check_interface1): Use a local value, instead of
the dummy, as the inner iterator over interface symbols.
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652
* gfortran.dg/generic_7.f90: New test.
* gfortran.dg/defined_operators_1.f90: Add new error.
From-SVN: r119076
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/interface.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/defined_operators_1.f90 | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/generic_7.f90 | 27 |
5 files changed, 43 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bfc6d6d..d758a48 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2006-11-22 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/29652 + * interface.c (check_interface1): Use a local value, instead of + the dummy, as the inner iterator over interface symbols. + 2006-11-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/29820 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 5a9b2da..e1564b2 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -964,12 +964,12 @@ check_interface0 (gfc_interface * p, const char *interface_name) here. */ static int -check_interface1 (gfc_interface * p, gfc_interface * q, +check_interface1 (gfc_interface * p, gfc_interface * q0, int generic_flag, const char *interface_name) { - + gfc_interface * q; for (; p; p = p->next) - for (; q; q = q->next) + for (q = q0; q; q = q->next) { if (p->sym == q->sym) continue; /* Duplicates OK here */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 58ed09d..564af55 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-11-22 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/29652 + * gfortran.dg/generic_7.f90: New test. + * gfortran.dg/defined_operators_1.f90: Add new error. + 2006-11-22 Zdenek Dvorak <dvorakz@suse.cz> PR tree-optimization/29902 diff --git a/gcc/testsuite/gfortran.dg/defined_operators_1.f90 b/gcc/testsuite/gfortran.dg/defined_operators_1.f90 index c2369b2..0233bf0 100644 --- a/gcc/testsuite/gfortran.dg/defined_operators_1.f90 +++ b/gcc/testsuite/gfortran.dg/defined_operators_1.f90 @@ -11,7 +11,7 @@ module mymod module procedure foo_1 ! { dg-error "must be INTENT" } module procedure foo_2 ! { dg-error "cannot be optional" } module procedure foo_3 ! { dg-error "must have, at most, two arguments" } - module procedure foo_1_OK + module procedure foo_1_OK ! { dg-error "Ambiguous interfaces" } module procedure foo_2_OK function foo_chr (chr) ! { dg-error "cannot be assumed character length" } character(*) :: foo_chr diff --git a/gcc/testsuite/gfortran.dg/generic_7.f90 b/gcc/testsuite/gfortran.dg/generic_7.f90 new file mode 100644 index 0000000..12cb9ae --- /dev/null +++ b/gcc/testsuite/gfortran.dg/generic_7.f90 @@ -0,0 +1,27 @@ +! { dg-do compile } +! Tests the fix for PR29652, in which ambiguous interfaces were not detected +! with more than two specific procedures in the interface. +! +! Contributed by Daniel Franke <franke.daniel@gmail.com> +! +MODULE global +INTERFACE iface + MODULE PROCEDURE sub_a + MODULE PROCEDURE sub_b ! { dg-error "Ambiguous interfaces" } + MODULE PROCEDURE sub_c +END INTERFACE +CONTAINS + SUBROUTINE sub_a(x) + INTEGER, INTENT(in) :: x + WRITE (*,*) 'A: ', x + END SUBROUTINE + SUBROUTINE sub_b(y) + INTEGER, INTENT(in) :: y + WRITE (*,*) 'B: ', y + END SUBROUTINE + SUBROUTINE sub_c(x, y) + REAL, INTENT(in) :: x, y + WRITE(*,*) x, y + END SUBROUTINE +END MODULE +! { dg-final { cleanup-modules "global" } } |