summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-17 10:12:06 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2007-09-17 10:12:06 +0000
commite040c5e39ccea6979064e42059833fc7ff345cd6 (patch)
tree56db3b58416c1136678431d5bd3e7a342b178613
parenta98b52d13e4a6ec25bb20846a99ed1ff90f2ac9c (diff)
downloadgcc-e040c5e39ccea6979064e42059833fc7ff345cd6.tar.gz
2007-09-17 Tobias Burnus <burnus@net-b.de>
* resolve.c (resolve_fl_procedure): Allow private dummies for Fortran 2003. 2007-09-17 Tobias Burnus <burnus@net-b.de> * gfortran.dg/interface_15.f90: Compile with -std=f95. * gfortran.dg/private_type_1.f90: Ditto * gfortran.dg/interface_18.f90: New. * gfortran.dg/private_type_8.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128541 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/resolve.c35
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/interface_15.f902
-rw-r--r--gcc/testsuite/gfortran.dg/interface_18.f9021
-rw-r--r--gcc/testsuite/gfortran.dg/private_type_1.f901
-rw-r--r--gcc/testsuite/gfortran.dg/private_type_8.f9021
7 files changed, 76 insertions, 16 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9137da53870..8d5bcfac932 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-17 Tobias Burnus <burnus@net-b.de>
+
+ * resolve.c (resolve_fl_procedure): Allow private dummies
+ for Fortran 2003.
+
2007-09-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* trans-types.c (gfc_get_desc_dim_type): Do not to try
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 55d087ff089..a2444a34894 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -6885,12 +6885,13 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
&& arg->sym->ts.type == BT_DERIVED
&& !arg->sym->ts.derived->attr.use_assoc
&& !gfc_check_access (arg->sym->ts.derived->attr.access,
- arg->sym->ts.derived->ns->default_access))
+ arg->sym->ts.derived->ns->default_access)
+ && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: '%s' is of a "
+ "PRIVATE type and cannot be a dummy argument"
+ " of '%s', which is PUBLIC at %L",
+ arg->sym->name, sym->name, &sym->declared_at)
+ == FAILURE)
{
- gfc_error_now ("'%s' is of a PRIVATE type and cannot be "
- "a dummy argument of '%s', which is "
- "PUBLIC at %L", arg->sym->name, sym->name,
- &sym->declared_at);
/* Stop this message from recurring. */
arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
return FAILURE;
@@ -6907,12 +6908,14 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
&& arg->sym->ts.type == BT_DERIVED
&& !arg->sym->ts.derived->attr.use_assoc
&& !gfc_check_access (arg->sym->ts.derived->attr.access,
- arg->sym->ts.derived->ns->default_access))
+ arg->sym->ts.derived->ns->default_access)
+ && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
+ "'%s' in PUBLIC interface '%s' at %L "
+ "takes dummy arguments of '%s' which is "
+ "PRIVATE", iface->sym->name, sym->name,
+ &iface->sym->declared_at,
+ gfc_typename (&arg->sym->ts)) == FAILURE)
{
- gfc_error_now ("Procedure '%s' in PUBLIC interface '%s' at %L takes "
- "dummy arguments of '%s' which is PRIVATE",
- iface->sym->name, sym->name, &iface->sym->declared_at,
- gfc_typename(&arg->sym->ts));
/* Stop this message from recurring. */
arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
return FAILURE;
@@ -6930,12 +6933,14 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
&& arg->sym->ts.type == BT_DERIVED
&& !arg->sym->ts.derived->attr.use_assoc
&& !gfc_check_access (arg->sym->ts.derived->attr.access,
- arg->sym->ts.derived->ns->default_access))
+ arg->sym->ts.derived->ns->default_access)
+ && gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Procedure "
+ "'%s' in PUBLIC interface '%s' at %L "
+ "takes dummy arguments of '%s' which is "
+ "PRIVATE", iface->sym->name, sym->name,
+ &iface->sym->declared_at,
+ gfc_typename (&arg->sym->ts)) == FAILURE)
{
- gfc_error_now ("Procedure '%s' in PUBLIC interface '%s' at %L takes "
- "dummy arguments of '%s' which is PRIVATE",
- iface->sym->name, sym->name, &iface->sym->declared_at,
- gfc_typename(&arg->sym->ts));
/* Stop this message from recurring. */
arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
return FAILURE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1c5209a66a5..94285578b5c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-17 Tobias Burnus <burnus@net-b.de>
+
+ * gfortran.dg/interface_15.f90: Compile with -std=f95.
+ * gfortran.dg/private_type_1.f90: Ditto
+ * gfortran.dg/interface_18.f90: New.
+ * gfortran.dg/private_type_8.f90: New.
+
2007-09-16 Paolo Carlini <pcarlini@suse.de>
PR c++/33124
diff --git a/gcc/testsuite/gfortran.dg/interface_15.f90 b/gcc/testsuite/gfortran.dg/interface_15.f90
index c9a3add74ae..15f4298390e 100644
--- a/gcc/testsuite/gfortran.dg/interface_15.f90
+++ b/gcc/testsuite/gfortran.dg/interface_15.f90
@@ -1,5 +1,5 @@
! { dg-do compile }
-! { dg-options "-c" }
+! { dg-options "-c -std=f95" }
! Testcase from PR fortran/25094
! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
diff --git a/gcc/testsuite/gfortran.dg/interface_18.f90 b/gcc/testsuite/gfortran.dg/interface_18.f90
new file mode 100644
index 00000000000..d0a54754883
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_18.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-options "-std=f2003" }
+!
+! Public procedures with private types for the dummies
+! is valid F2003, but invalid per Fortran 95, Sect. 5.2.3
+! See interface_15.f90 for the F95 test case.
+!
+ module mytype_application
+ implicit none
+ private
+ public :: mytype_test
+ type :: mytype_type
+ integer :: i=0
+ end type mytype_type
+ contains
+ subroutine mytype_test( mytype )
+ type(mytype_type), intent(in out) :: mytype
+ end subroutine mytype_test
+ end module mytype_application
+
+! { dg-final { cleanup-modules "mytype_application" } }
diff --git a/gcc/testsuite/gfortran.dg/private_type_1.f90 b/gcc/testsuite/gfortran.dg/private_type_1.f90
index 34bc457a52f..b6e915104b9 100644
--- a/gcc/testsuite/gfortran.dg/private_type_1.f90
+++ b/gcc/testsuite/gfortran.dg/private_type_1.f90
@@ -1,4 +1,5 @@
! { dg-do compile }
+! { dg-options "-std=f95" }
! PR21986 - test based on original example.
! A public subroutine must not have private-type, dummy arguments.
! Contributed by Paul Thomas <pault@gcc.gnu.org>
diff --git a/gcc/testsuite/gfortran.dg/private_type_8.f90 b/gcc/testsuite/gfortran.dg/private_type_8.f90
new file mode 100644
index 00000000000..df1609646cf
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/private_type_8.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! A public subroutine can have private-type, dummy arguments
+! in Fortran 2003 (but not in Fortran 95).
+! See private_type_1.f90 for the F95 test.
+!
+module modboom
+ implicit none
+ private
+ public:: dummysub
+ type:: intwrapper
+ integer n
+ end type intwrapper
+contains
+ subroutine dummysub(size, arg_array)
+ type(intwrapper) :: size
+ real, dimension(size%n) :: arg_array
+ real :: local_array(4)
+ end subroutine dummysub
+end module modboom
+
+! { dg-final { cleanup-modules "modboom" } }