aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/decl.c6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/pr78719_1.f9029
-rw-r--r--gcc/testsuite/gfortran.dg/pr78719_2.f9032
-rw-r--r--gcc/testsuite/gfortran.dg/pr78719_3.f9032
6 files changed, 109 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 130c3df..2de3532 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/78719
+ * decl.c (get_proc_name): Check for a CLASS entity when trying to
+ add attributes to an entity that already has an explicit interface.
+
+2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
+
PR fortran/91471
* primary.c (gfc_variable_attr): Remove a gfc_internal_error(),
which cannot be reached by conforming Fortran code, but seems to
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 436dd10..5f12fe1 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1363,9 +1363,9 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
}
/* Trap declarations of attributes in encompassing scope. The
- signature for this is that ts.kind is set. Legitimate
- references only set ts.type. */
- if (sym->ts.kind != 0
+ signature for this is that ts.kind is nonzero for no-CLASS
+ entity. For a CLASS entity, ts.kind is zero. */
+ if ((sym->ts.kind != 0 || sym->ts.type == BT_CLASS)
&& !sym->attr.implicit_type
&& sym->attr.proc == 0
&& gfc_current_ns->parent != NULL
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a2bbc1..1ab8b9e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
+ PR fortran/78719
+ * gfortran.dg/pr78719_1.f90: New test.
+ * gfortran.dg/pr78719_2.f90: Ditto.
+ * gfortran.dg/pr78719_3.f90: Ditto.
+
+2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
+
PR fortran/91471
* gfortran.dg/pr91471.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr78719_1.f90 b/gcc/testsuite/gfortran.dg/pr78719_1.f90
new file mode 100644
index 0000000..f5a99c2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr78719_1.f90
@@ -0,0 +1,29 @@
+! { dg-do run }
+! PR fortran/78719
+! Code contributed by Gerhard Steinmetz
+program p
+
+ type t
+ integer :: n
+ end type
+
+ abstract interface
+ subroutine h
+ end
+ end interface
+
+ procedure(h), pointer :: s
+
+ s => f
+ call s
+ s => g
+ call s
+
+ contains
+
+ subroutine f
+ end
+
+ subroutine g
+ end
+end program p
diff --git a/gcc/testsuite/gfortran.dg/pr78719_2.f90 b/gcc/testsuite/gfortran.dg/pr78719_2.f90
new file mode 100644
index 0000000..59abebe
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr78719_2.f90
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! PR fortran/78719
+! Code contributed by Gerhard Steinmetz
+program p
+
+ type t
+ integer :: n
+ end type
+
+ real :: g
+
+ abstract interface
+ subroutine h
+ end
+ end interface
+
+ procedure(h), pointer :: s
+
+ s => f
+ call s
+ s => g ! { dg-error "Invalid procedure pointer" }
+ call s
+
+ contains
+
+ subroutine f
+ end
+
+ subroutine g ! { dg-error "has an explicit interface" }
+ end
+
+end program p ! { dg-error "Syntax error" }
diff --git a/gcc/testsuite/gfortran.dg/pr78719_3.f90 b/gcc/testsuite/gfortran.dg/pr78719_3.f90
new file mode 100644
index 0000000..8e7f6ac
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr78719_3.f90
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! PR fortran/78719
+! Code contributed by Gerhard Steinmetz
+program p
+
+ type t
+ integer :: n
+ end type
+
+ class(t) :: g ! { dg-error "must be dummy, allocatable or pointer" }
+
+ abstract interface
+ subroutine h
+ end
+ end interface
+
+ procedure(h), pointer :: s
+
+ s => f
+ call s
+ s => g ! { dg-error "Invalid procedure pointer" }
+ call s
+
+ contains
+
+ subroutine f
+ end
+
+ subroutine g ! { dg-error "has an explicit interface" }
+ end
+
+end program p ! { dg-error "Syntax error" }