2020-02-26 07:22:14 +08:00
|
|
|
! RUN: %B/test/Semantics/test_errors.sh %s %flang %t
|
2019-07-16 08:09:03 +08:00
|
|
|
! C772
|
2018-12-27 05:31:13 +08:00
|
|
|
module m1
|
|
|
|
type t1
|
|
|
|
contains
|
|
|
|
procedure, nopass :: s1
|
|
|
|
!ERROR: Binding name 's2' not found in this derived type
|
|
|
|
generic :: g1 => s2
|
|
|
|
end type
|
|
|
|
type t2
|
|
|
|
integer :: s1
|
|
|
|
contains
|
|
|
|
!ERROR: 's1' is not the name of a specific binding of this type
|
|
|
|
generic :: g2 => s1
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
subroutine s1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module m2
|
|
|
|
type :: t3
|
|
|
|
contains
|
|
|
|
private
|
|
|
|
procedure, nopass :: s3
|
|
|
|
generic, public :: g3 => s3
|
|
|
|
generic :: h3 => s3
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
subroutine s3(i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-07-16 08:09:03 +08:00
|
|
|
! C771
|
2018-12-27 05:31:13 +08:00
|
|
|
module m3
|
|
|
|
use m2
|
|
|
|
type, extends(t3) :: t4
|
|
|
|
contains
|
|
|
|
procedure, nopass :: s4
|
|
|
|
procedure, nopass :: s5
|
|
|
|
!ERROR: 'g3' does not have the same accessibility as its previous declaration
|
|
|
|
generic, private :: g3 => s4
|
|
|
|
!ERROR: 'h3' does not have the same accessibility as its previous declaration
|
|
|
|
generic, public :: h3 => s4
|
|
|
|
generic :: i3 => s4
|
|
|
|
!ERROR: 'i3' does not have the same accessibility as its previous declaration
|
|
|
|
generic, private :: i3 => s5
|
|
|
|
end type
|
|
|
|
type :: t5
|
|
|
|
contains
|
|
|
|
private
|
|
|
|
procedure, nopass :: s3
|
|
|
|
procedure, nopass :: s4
|
|
|
|
procedure, nopass :: s5
|
|
|
|
generic :: g5 => s3, s4
|
|
|
|
!ERROR: 'g5' does not have the same accessibility as its previous declaration
|
|
|
|
generic, public :: g5 => s5
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
subroutine s4(r)
|
|
|
|
end
|
|
|
|
subroutine s5(z)
|
|
|
|
complex :: z
|
|
|
|
end
|
|
|
|
end
|
2019-07-16 08:09:03 +08:00
|
|
|
|
|
|
|
! Test forward reference in type-bound generic to binding is allowed
|
|
|
|
module m4
|
|
|
|
type :: t1
|
|
|
|
contains
|
|
|
|
generic :: g => s1
|
|
|
|
generic :: g => s2
|
|
|
|
procedure, nopass :: s1
|
|
|
|
procedure, nopass :: s2
|
|
|
|
end type
|
|
|
|
type :: t2
|
|
|
|
contains
|
|
|
|
generic :: g => p1
|
|
|
|
generic :: g => p2
|
|
|
|
procedure, nopass :: p1 => s1
|
|
|
|
procedure, nopass :: p2 => s2
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
subroutine s1()
|
|
|
|
end
|
|
|
|
subroutine s2(x)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
! C773 - duplicate binding names
|
|
|
|
module m5
|
|
|
|
type :: t1
|
|
|
|
contains
|
|
|
|
generic :: g => s1
|
|
|
|
generic :: g => s2
|
|
|
|
procedure, nopass :: s1
|
|
|
|
procedure, nopass :: s2
|
|
|
|
!ERROR: Binding name 's1' was already specified for generic 'g'
|
|
|
|
generic :: g => s1
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
subroutine s1()
|
|
|
|
end
|
|
|
|
subroutine s2(x)
|
|
|
|
end
|
|
|
|
end
|
[flang] Handle alternative names for relational operators
10.1.6.2 says:
> The operators <, <=, >, >=, ==, and /= always have the same interpretations
> as the operators .LT., .LE., .GT., .GE., .EQ., and .NE., respectively.
That means we have to treat `operator(<)` like `operator(.lt.)`,
for example. `<>` is a third alias for `.NE.`.
We can't just choose always to use one form (e.g. replacing `operator(.lt.)`
with `operator(<)`). This is because all symbols names are `CharBlock`s
referring to the cooked character stream so that they have proper source
provenance. Also, if a user prefers one style and uses it consistently,
that's the form they should see in messages.
So the fix is to use whatever form is found in the source, but also to
look up symbols by the other names when necessary. To assist this, add
`GenericSpecInfo::GetAllNames()` to return all of the names of a generic
spec. Each place a generic spec can occur we have to use these to look
for the symbol.
Also reorganize the `AddUse()` overloads to work with this change.
Fixes flang-compiler/f18#746.
Original-commit: flang-compiler/f18@7f06f175d5033f0728f67b1be25ecd53df1f8de5
Reviewed-on: https://github.com/flang-compiler/f18/pull/752
2019-09-18 07:57:09 +08:00
|
|
|
|
|
|
|
module m6
|
|
|
|
type t
|
|
|
|
contains
|
|
|
|
procedure :: f1
|
|
|
|
procedure :: f2
|
|
|
|
generic :: operator(.eq.) => f1
|
|
|
|
!ERROR: Binding name 'f1' was already specified for generic 'operator(.eq.)'
|
|
|
|
generic :: operator(==) => f2, f1
|
|
|
|
end type
|
|
|
|
contains
|
|
|
|
logical function f1(x, y) result(result)
|
|
|
|
class(t), intent(in) :: x
|
|
|
|
real, intent(in) :: y
|
|
|
|
result = .true.
|
|
|
|
end
|
|
|
|
logical function f2(x, y) result(result)
|
|
|
|
class(t), intent(in) :: x
|
|
|
|
integer, intent(in) :: y
|
|
|
|
result = .true.
|
|
|
|
end
|
|
|
|
end
|