mirror of git://gcc.gnu.org/git/gcc.git
re PR fortran/33106 (Access of components of public entities of private types wrongly allowed)
2007-09-17 Tobias Burnus <burnus@net-b.de> PR fortran/33106 * resolve.c (resolve_symbol): Reject public variable of private derived-types for Fortran 95. 2007-09-17 Tobias Burnus <burnus@net-b.de> PR fortran/33106 * gfortran.dg/private_type_9.f90: New. From-SVN: r128550
This commit is contained in:
parent
90b1c344ce
commit
a08a5751bb
|
|
@ -1,3 +1,9 @@
|
||||||
|
2007-09-17 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR fortran/33106
|
||||||
|
* resolve.c (resolve_symbol): Reject public variable of
|
||||||
|
private derived-types for Fortran 95.
|
||||||
|
|
||||||
2007-09-17 Tobias Burnus <burnus@net-b.de>
|
2007-09-17 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
* resolve.c (resolve_fl_procedure): Allow private dummies
|
* resolve.c (resolve_fl_procedure): Allow private dummies
|
||||||
|
|
|
||||||
|
|
@ -7581,6 +7581,22 @@ resolve_symbol (gfc_symbol *sym)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Unless the derived-type declaration is use associated, Fortran 95
|
||||||
|
does not allow public entries of private derived types.
|
||||||
|
See 4.4.1 (F95) and 4.5.1.1 (F2003); and related interpretation
|
||||||
|
161 in 95-006r3. */
|
||||||
|
if (sym->ts.type == BT_DERIVED
|
||||||
|
&& gfc_check_access (sym->attr.access, sym->ns->default_access)
|
||||||
|
&& !gfc_check_access (sym->ts.derived->attr.access,
|
||||||
|
sym->ts.derived->ns->default_access)
|
||||||
|
&& !sym->ts.derived->attr.use_assoc
|
||||||
|
&& gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PUBLIC %s '%s' at %L "
|
||||||
|
"of PRIVATE derived type '%s'",
|
||||||
|
(sym->attr.flavor == FL_PARAMETER) ? "parameter"
|
||||||
|
: "variable", sym->name, &sym->declared_at,
|
||||||
|
sym->ts.derived->name) == FAILURE)
|
||||||
|
return;
|
||||||
|
|
||||||
/* An assumed-size array with INTENT(OUT) shall not be of a type for which
|
/* An assumed-size array with INTENT(OUT) shall not be of a type for which
|
||||||
default initialization is defined (5.1.2.4.4). */
|
default initialization is defined (5.1.2.4.4). */
|
||||||
if (sym->ts.type == BT_DERIVED
|
if (sym->ts.type == BT_DERIVED
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2007-09-17 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR fortran/33106
|
||||||
|
* gfortran.dg/private_type_9.f90: New.
|
||||||
|
|
||||||
2007-09-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
2007-09-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||||
|
|
||||||
PR middle-end/33449
|
PR middle-end/33449
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
! { dg-do compile }
|
||||||
|
! { dg-options "-std=f95" }
|
||||||
|
!
|
||||||
|
! PR fortran/33106
|
||||||
|
!
|
||||||
|
module m1
|
||||||
|
implicit none
|
||||||
|
type, private :: t
|
||||||
|
integer :: i
|
||||||
|
end type t
|
||||||
|
type(t), public :: one ! { dg-error "PRIVATE derived type" }
|
||||||
|
type(t), public, parameter :: two = t(2) ! { dg-error "PRIVATE derived type" }
|
||||||
|
end module m1
|
||||||
|
|
||||||
|
module m2
|
||||||
|
implicit none
|
||||||
|
private
|
||||||
|
type t
|
||||||
|
integer :: i
|
||||||
|
end type t
|
||||||
|
type(t), public :: one ! { dg-error "PRIVATE derived type" }
|
||||||
|
type(t), public, parameter :: two = t(2) ! { dg-error "PRIVATE derived type" }
|
||||||
|
end module m2
|
||||||
|
|
||||||
|
module m3
|
||||||
|
implicit none
|
||||||
|
type t
|
||||||
|
integer :: i
|
||||||
|
end type t
|
||||||
|
end module m3
|
||||||
|
|
||||||
|
module m4
|
||||||
|
use m3!, only: t
|
||||||
|
implicit none
|
||||||
|
private
|
||||||
|
private :: t
|
||||||
|
type(t), public :: one
|
||||||
|
type(t), public, parameter :: two = t(2)
|
||||||
|
end module m4
|
||||||
|
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue