/* If this type is an extension, see if this component has the same name
as an inherited type-bound procedure. */
- if (super_type
+ if (super_type && !sym->attr.is_class
&& gfc_find_typebound_proc (super_type, NULL, c->name, true, NULL))
{
gfc_error ("Component '%s' of '%s' at %L has the same name as an"
}
}
- if (c->ts.type == BT_DERIVED && c->attr.pointer
+ if (!sym->attr.is_class && c->ts.type == BT_DERIVED && c->attr.pointer
&& c->ts.u.derived->components == NULL
&& !c->ts.u.derived->attr.zero_comp)
{
return FAILURE;
}
+ if (c->ts.type == BT_CLASS && c->ts.u.derived->components->attr.pointer
+ && c->ts.u.derived->components->ts.u.derived->components == NULL
+ && !c->ts.u.derived->components->ts.u.derived->attr.zero_comp)
+ {
+ gfc_error ("The pointer component '%s' of '%s' at %L is a type "
+ "that has not been declared", c->name, sym->name,
+ &c->loc);
+ return FAILURE;
+ }
+
/* C437. */
if (c->ts.type == BT_CLASS
&& !(c->ts.u.derived->components->attr.pointer
sprintf (name, ".class.%s.%d.a", ts->u.derived->name, (*as)->rank);
else if ((*as) && (*as)->rank)
sprintf (name, ".class.%s.%d", ts->u.derived->name, (*as)->rank);
+ else if (attr->pointer)
+ sprintf (name, ".class.%s.p", ts->u.derived->name);
else if (attr->allocatable)
sprintf (name, ".class.%s.a", ts->u.derived->name);
else
--- /dev/null
+! { dg-do compile }
+!
+! PR 43696: [OOP] Bogus error: Passed-object dummy argument must not be POINTER
+!
+! Contributed by Hans-Werner Boschmann <boschmann@tp1.physik.uni-siegen.de>
+
+
+MODULE error_stack_module
+ implicit none
+
+ type,abstract::serializable_class
+ contains
+ procedure(ser_DTV_RF),deferred::read_formatted
+ end type serializable_class
+
+ abstract interface
+ subroutine ser_DTV_RF(dtv,unit,iotype,v_list,iostat,iomsg)
+ import serializable_class
+ CLASS(serializable_class),INTENT(INOUT) :: dtv
+ INTEGER, INTENT(IN) :: unit
+ CHARACTER (LEN=*), INTENT(IN) :: iotype
+ INTEGER, INTENT(IN) :: v_list(:)
+ INTEGER, INTENT(OUT) :: iostat
+ CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
+ end subroutine ser_DTV_RF
+ end interface
+
+ type,extends(serializable_class)::error_type
+ class(error_type),pointer::next=>null()
+ contains
+ procedure::read_formatted=>error_read_formatted
+ end type error_type
+
+contains
+
+ recursive subroutine error_read_formatted(dtv,unit,iotype,v_list,iostat,iomsg)
+ CLASS(error_type),INTENT(INOUT) :: dtv
+ INTEGER, INTENT(IN) :: unit
+ CHARACTER (LEN=*), INTENT(IN) :: iotype
+ INTEGER, INTENT(IN) :: v_list(:)
+ INTEGER, INTENT(OUT) :: iostat
+ CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
+ character(8),allocatable::type
+ character(8),allocatable::next
+ call basic_read_string(unit,type)
+ call basic_read_string(unit,next)
+ if(next=="NEXT")then
+ allocate(dtv%next)
+ call dtv%next%read_formatted(unit,iotype,v_list,iostat,iomsg)
+ end if
+ end subroutine error_read_formatted
+
+end MODULE error_stack_module
+
+
+module b_module
+ implicit none
+ type::b_type
+ class(not_yet_defined_type_type),pointer::b_component ! { dg-error "is a type that has not been declared" }
+ end type b_type
+end module b_module
+
+
+! { dg-final { cleanup-modules "error_stack_module b_module" } }