+2007-06-24 Tobias Burnus <burnus@net-de>
+
+ PR fortran/32460
+ * interface.c (gfc_compare_derived_types): Add access check.
+ * symbol.c (gfc_find_component): Ditto.
+ (gfc_set_component_attr,gfc_get_component_attr) Copy access state.
+ * dump-parse-tree.c (gfc_show_components): Dump access state.
+ * gfortran.h (struct gfc_component): Add gfc_access.
+ * module.c (mio_component): Add access state.
+ * (gfc_match_structure_constructor): Check for private access state.
+
2007-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32298
gfc_status (" DIMENSION");
gfc_status_char (' ');
gfc_show_array_spec (c->as);
+ if (c->access)
+ gfc_status (" %s", gfc_code2string (access_types, c->access));
gfc_status (")");
if (c->next != NULL)
gfc_status_char (' ');
gfc_typespec ts;
int pointer, allocatable, dimension;
+ gfc_access access;
gfc_array_spec *as;
tree backend_decl;
if (strcmp (dt1->name, dt2->name) != 0)
return 0;
+ if (dt1->access != dt2->access)
+ return 0;
+
if (dt1->pointer != dt2->pointer)
return 0;
mio_integer (&c->dimension);
mio_integer (&c->pointer);
mio_integer (&c->allocatable);
+ c->access = MIO_NAME (gfc_access) (c->access, access_types);
mio_expr (&c->initializer);
mio_rparen ();
gfc_expr *e;
locus where;
match m;
+ bool private_comp = false;
head = tail = NULL;
for (comp = sym->components; comp; comp = comp->next)
{
+ if (comp->access == ACCESS_PRIVATE)
+ {
+ private_comp = true;
+ break;
+ }
if (head == NULL)
tail = head = gfc_get_constructor ();
else
break;
}
+ if (sym->attr.use_assoc
+ && (sym->component_access == ACCESS_PRIVATE || private_comp))
+ {
+ gfc_error ("Structure constructor for '%s' at %C has PRIVATE "
+ "components", sym->name);
+ goto cleanup;
+ }
+
if (gfc_match_char (')') != MATCH_YES)
goto syntax;
name, sym->name);
else
{
- if (sym->attr.use_assoc && sym->component_access == ACCESS_PRIVATE)
+ if (sym->attr.use_assoc && (sym->component_access == ACCESS_PRIVATE
+ || p->access == ACCESS_PRIVATE))
{
gfc_error ("Component '%s' at %C is a PRIVATE component of '%s'",
name, sym->name);
c->dimension = attr->dimension;
c->pointer = attr->pointer;
c->allocatable = attr->allocatable;
+ c->access = attr->access;
}
attr->dimension = c->dimension;
attr->pointer = c->pointer;
attr->allocatable = c->allocatable;
+ attr->access = c->access;
}
+2007-06-24 Tobias Burnus <burnus@net-de>
+
+ PR fortran/32460
+ * gfortran.dg/private_type_6.f90: New.
+
2007-06-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31726
--- /dev/null
+! { dg-do compile }
+! PR fortran/32460
+!
+module foomod
+ implicit none
+ type :: footype
+ private
+ integer :: dummy
+ end type footype
+ TYPE :: bartype
+ integer :: dummy
+ integer, private :: dummy2
+ end type bartype
+end module foomod
+
+program foo_test
+ USE foomod
+ implicit none
+ TYPE(footype) :: foo
+ TYPE(bartype) :: foo2
+ foo = footype(1) ! { dg-error "has PRIVATE components" }
+ foo2 = bartype(1,2) ! { dg-error "has PRIVATE components" }
+ foo2%dummy2 = 5 ! { dg-error "is a PRIVATE component" }
+end program foo_test
+! { dg-final { cleanup-tree-dump "foomod" } }