1! { dg-do run }
2! Tests the fix for PR31229, PR31154 and PR33334, in which
3! the KIND and TYPE parameters in the function declarations
4! would cause errors.
5!
6! Contributed by Brooks Moses <brooks@gcc.gnu.org>
7!           and Tobias Burnus <burnus@gcc.gnu.org>
8!
9module kinds
10  implicit none
11  integer, parameter :: dp = selected_real_kind(6)
12  type t
13     integer :: i
14  end type t
15  interface
16    real(dp) function y()
17      import
18    end function
19  end interface
20end module kinds
21
22type(t) function func() ! The legal bit of PR33334
23  use kinds
24  func%i = 5
25end function func
26
27real(dp) function another_dp_before_defined ()
28  use kinds
29  another_dp_before_defined = real (kind (4.0_DP))
30end function
31
32module mymodule;
33contains
34  REAL(2*DP) function declared_dp_before_defined()
35    use kinds, only: dp
36    real (dp) :: x
37    declared_dp_before_defined = 1.0_dp
38    x = 1.0_dp
39    declared_dp_before_defined = real (kind (x))
40  end function
41end module mymodule
42
43  use kinds
44  use mymodule
45  type(t), external :: func
46  type(t) :: z
47  if (kind (y ()) .ne. 4) call abort ()
48  if (kind (declared_dp_before_defined ()) .ne. 8) call abort ()
49  if (int (declared_dp_before_defined ()) .ne. 4) call abort ()
50  if (int (another_dp_before_defined ()) .ne. 4) call abort ()
51  z = func()
52  if (z%i .ne. 5) call abort ()
53end
54