xref: /llvm-project/flang/test/Semantics/resolve38.f90 (revision 6c1ac141d3c98af9738bc77fcb55602cbff7751f)
1*6c1ac141SIvan Zhechev! RUN: %python %S/test_errors.py %s %flang_fc1
264ab3302SCarolineConcatto! C772
364ab3302SCarolineConcattomodule m1
464ab3302SCarolineConcatto  type t1
564ab3302SCarolineConcatto  contains
664ab3302SCarolineConcatto    procedure, nopass :: s1
764ab3302SCarolineConcatto    !ERROR: Binding name 's2' not found in this derived type
864ab3302SCarolineConcatto    generic :: g1 => s2
964ab3302SCarolineConcatto  end type
1064ab3302SCarolineConcatto  type t2
1164ab3302SCarolineConcatto    integer :: s1
1264ab3302SCarolineConcatto  contains
1364ab3302SCarolineConcatto    !ERROR: 's1' is not the name of a specific binding of this type
1464ab3302SCarolineConcatto    generic :: g2 => s1
1564ab3302SCarolineConcatto  end type
1664ab3302SCarolineConcattocontains
1764ab3302SCarolineConcatto  subroutine s1
1864ab3302SCarolineConcatto  end
1964ab3302SCarolineConcattoend
2064ab3302SCarolineConcatto
2164ab3302SCarolineConcattomodule m2
2264ab3302SCarolineConcatto  type :: t3
2364ab3302SCarolineConcatto  contains
2464ab3302SCarolineConcatto    private
2564ab3302SCarolineConcatto    procedure, nopass :: s3
2664ab3302SCarolineConcatto    generic, public :: g3 => s3
2764ab3302SCarolineConcatto    generic :: h3 => s3
2864ab3302SCarolineConcatto  end type
2964ab3302SCarolineConcattocontains
3064ab3302SCarolineConcatto  subroutine s3(i)
3164ab3302SCarolineConcatto  end
3264ab3302SCarolineConcattoend
3364ab3302SCarolineConcatto
3464ab3302SCarolineConcatto! C771
3564ab3302SCarolineConcattomodule m3
3664ab3302SCarolineConcatto  use m2
3764ab3302SCarolineConcatto  type, extends(t3) :: t4
3864ab3302SCarolineConcatto  contains
3964ab3302SCarolineConcatto    procedure, nopass :: s4
4064ab3302SCarolineConcatto    procedure, nopass :: s5
4164ab3302SCarolineConcatto    !ERROR: 'g3' does not have the same accessibility as its previous declaration
4264ab3302SCarolineConcatto    generic, private :: g3 => s4
4364ab3302SCarolineConcatto    !ERROR: 'h3' does not have the same accessibility as its previous declaration
4464ab3302SCarolineConcatto    generic, public :: h3 => s4
4564ab3302SCarolineConcatto    generic :: i3 => s4
4664ab3302SCarolineConcatto    !ERROR: 'i3' does not have the same accessibility as its previous declaration
4764ab3302SCarolineConcatto    generic, private :: i3 => s5
4864ab3302SCarolineConcatto  end type
4964ab3302SCarolineConcatto  type :: t5
5064ab3302SCarolineConcatto  contains
5164ab3302SCarolineConcatto    private
5264ab3302SCarolineConcatto    procedure, nopass :: s3
5364ab3302SCarolineConcatto    procedure, nopass :: s4
5464ab3302SCarolineConcatto    procedure, nopass :: s5
5564ab3302SCarolineConcatto    generic :: g5 => s3, s4
5664ab3302SCarolineConcatto    !ERROR: 'g5' does not have the same accessibility as its previous declaration
5764ab3302SCarolineConcatto    generic, public :: g5 => s5
5864ab3302SCarolineConcatto  end type
5964ab3302SCarolineConcattocontains
6064ab3302SCarolineConcatto  subroutine s4(r)
6164ab3302SCarolineConcatto  end
6264ab3302SCarolineConcatto  subroutine s5(z)
6364ab3302SCarolineConcatto    complex :: z
6464ab3302SCarolineConcatto  end
6564ab3302SCarolineConcattoend
6664ab3302SCarolineConcatto
6764ab3302SCarolineConcatto! Test forward reference in type-bound generic to binding is allowed
6864ab3302SCarolineConcattomodule m4
6964ab3302SCarolineConcatto  type :: t1
7064ab3302SCarolineConcatto  contains
7164ab3302SCarolineConcatto    generic :: g => s1
7264ab3302SCarolineConcatto    generic :: g => s2
7364ab3302SCarolineConcatto    procedure, nopass :: s1
7464ab3302SCarolineConcatto    procedure, nopass :: s2
7564ab3302SCarolineConcatto  end type
7664ab3302SCarolineConcatto  type :: t2
7764ab3302SCarolineConcatto  contains
7864ab3302SCarolineConcatto    generic :: g => p1
7964ab3302SCarolineConcatto    generic :: g => p2
8064ab3302SCarolineConcatto    procedure, nopass :: p1 => s1
8164ab3302SCarolineConcatto    procedure, nopass :: p2 => s2
8264ab3302SCarolineConcatto  end type
8364ab3302SCarolineConcattocontains
8464ab3302SCarolineConcatto  subroutine s1()
8564ab3302SCarolineConcatto  end
8664ab3302SCarolineConcatto  subroutine s2(x)
8764ab3302SCarolineConcatto  end
8864ab3302SCarolineConcattoend
8964ab3302SCarolineConcatto
9064ab3302SCarolineConcatto! C773 - duplicate binding names
9164ab3302SCarolineConcattomodule m5
9264ab3302SCarolineConcatto  type :: t1
9364ab3302SCarolineConcatto  contains
9464ab3302SCarolineConcatto    generic :: g => s1
9564ab3302SCarolineConcatto    generic :: g => s2
9664ab3302SCarolineConcatto    procedure, nopass :: s1
9764ab3302SCarolineConcatto    procedure, nopass :: s2
9864ab3302SCarolineConcatto    !ERROR: Binding name 's1' was already specified for generic 'g'
9964ab3302SCarolineConcatto    generic :: g => s1
10064ab3302SCarolineConcatto  end type
10164ab3302SCarolineConcattocontains
10264ab3302SCarolineConcatto  subroutine s1()
10364ab3302SCarolineConcatto  end
10464ab3302SCarolineConcatto  subroutine s2(x)
10564ab3302SCarolineConcatto  end
10664ab3302SCarolineConcattoend
10764ab3302SCarolineConcatto
10864ab3302SCarolineConcattomodule m6
10964ab3302SCarolineConcatto  type t
11064ab3302SCarolineConcatto  contains
11164ab3302SCarolineConcatto    procedure :: f1
11264ab3302SCarolineConcatto    procedure :: f2
11364ab3302SCarolineConcatto    generic :: operator(.eq.) => f1
11464ab3302SCarolineConcatto    !ERROR: Binding name 'f1' was already specified for generic 'operator(.eq.)'
11564ab3302SCarolineConcatto    generic :: operator(==) => f2, f1
11664ab3302SCarolineConcatto  end type
11764ab3302SCarolineConcattocontains
11864ab3302SCarolineConcatto  logical function f1(x, y) result(result)
11964ab3302SCarolineConcatto    class(t), intent(in) :: x
12064ab3302SCarolineConcatto    real, intent(in) :: y
12164ab3302SCarolineConcatto    result = .true.
12264ab3302SCarolineConcatto  end
12364ab3302SCarolineConcatto  logical function f2(x, y) result(result)
12464ab3302SCarolineConcatto    class(t), intent(in) :: x
12564ab3302SCarolineConcatto    integer, intent(in) :: y
12664ab3302SCarolineConcatto    result = .true.
12764ab3302SCarolineConcatto  end
12864ab3302SCarolineConcattoend
129