1! { dg-do run }
2!
3! PR 42144: [OOP] deferred TBPs do not work
4!
5! Contributed by Damian Rouson <damian@rouson.net>
6
7module field_module
8  implicit none
9  private
10  public :: field
11  type ,abstract :: field 
12  end type
13end module
14
15module periodic_5th_order_module
16  use field_module ,only : field
17  implicit none
18  type ,extends(field) :: periodic_5th_order
19  end type
20end module
21
22module field_factory_module
23  implicit none
24  private
25  public :: field_factory
26  type, abstract :: field_factory 
27  contains 
28    procedure(create_interface), deferred :: create 
29  end type 
30  abstract interface 
31    function create_interface(this) 
32      use field_module ,only : field
33      import :: field_factory
34      class(field_factory), intent(in) :: this 
35      class(field) ,pointer :: create_interface
36    end function
37  end interface 
38end module
39
40module periodic_5th_factory_module
41  use field_factory_module , only : field_factory
42  implicit none
43  private
44  public :: periodic_5th_factory
45  type, extends(field_factory) :: periodic_5th_factory 
46  contains 
47    procedure :: create=>new_periodic_5th_order
48  end type 
49contains
50  function new_periodic_5th_order(this) 
51    use field_module ,only : field
52    use periodic_5th_order_module ,only : periodic_5th_order
53    class(periodic_5th_factory), intent(in) :: this
54    class(field) ,pointer :: new_periodic_5th_order
55  end function
56end module
57
58program main 
59  use field_module ,only : field 
60  use field_factory_module ,only : field_factory
61  use periodic_5th_factory_module ,only : periodic_5th_factory
62  implicit none 
63  class(field) ,pointer :: u
64  class(field_factory), allocatable :: field_creator 
65  allocate (periodic_5th_factory ::  field_creator) 
66  u => field_creator%create() 
67end program
68