&& !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
&& !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer)
&& !(sym->attr.flavor == FL_PROCEDURE
- && sym->attr.function && sym->attr.pointer))
+ && sym->attr.function && attr.pointer))
{
if (context)
gfc_error ("%qs in variable definition context (%s) at %L is not"
--- /dev/null
+! { dg-do compile }
+! PR fortran/109846
+! CLASS pointer function result in variable definition context
+
+module foo
+ implicit none
+ type :: parameter_list
+ contains
+ procedure :: sublist, sublist_nores
+ end type
+contains
+ function sublist (this) result (slist)
+ class(parameter_list), intent(inout) :: this
+ class(parameter_list), pointer :: slist
+ allocate (slist)
+ end function
+ function sublist_nores (this)
+ class(parameter_list), intent(inout) :: this
+ class(parameter_list), pointer :: sublist_nores
+ allocate (sublist_nores)
+ end function
+end module
+
+program example
+ use foo
+ implicit none
+ type(parameter_list) :: plist
+ call sub1 (plist%sublist())
+ call sub1 (plist%sublist_nores())
+ call sub2 (plist%sublist())
+ call sub2 (plist%sublist_nores())
+contains
+ subroutine sub1 (plist)
+ type(parameter_list), intent(inout) :: plist
+ end subroutine
+ subroutine sub2 (plist)
+ type(parameter_list) :: plist
+ end subroutine
+end program