| ! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s |
| module m1 |
| type base |
| contains |
| procedure, private :: binding => basesub |
| generic :: generic => binding |
| end type |
| type, extends(base) :: ext1 |
| contains |
| procedure, private :: binding => ext1sub |
| end type |
| contains |
| subroutine basesub(x) |
| class(base), intent(in) :: x |
| end |
| subroutine ext1sub(x) |
| class(ext1), intent(in) :: x |
| end |
| subroutine test1 |
| type(ext1) x |
| !CHECK: CALL ext1sub(x) |
| call x%generic |
| end |
| end |
| |
| module m2 |
| use m1 |
| type, extends(ext1) :: ext2 |
| contains |
| procedure :: binding => ext2sub |
| end type |
| contains |
| subroutine ext2sub(x) |
| class(ext2), intent(in) :: x |
| end |
| subroutine test2 |
| type(ext2) x |
| !CHECK: CALL ext1sub(x) |
| call x%generic ! private binding not overridable |
| end |
| end |
| |
| module m3 |
| type base |
| contains |
| procedure, public :: binding => basesub |
| generic :: generic => binding |
| end type |
| type, extends(base) :: ext1 |
| contains |
| procedure, public :: binding => ext1sub |
| end type |
| contains |
| subroutine basesub(x) |
| class(base), intent(in) :: x |
| end |
| subroutine ext1sub(x) |
| class(ext1), intent(in) :: x |
| end |
| subroutine test1 |
| type(ext1) x |
| !CHECK: CALL ext1sub(x) |
| call x%generic |
| end |
| end |
| |
| module m4 |
| use m3 |
| type, extends(ext1) :: ext2 |
| contains |
| procedure :: binding => ext2sub |
| end type |
| contains |
| subroutine ext2sub(x) |
| class(ext2), intent(in) :: x |
| end |
| subroutine test2 |
| type(ext2) x |
| !CHECK: CALL ext2sub(x) |
| call x%generic ! public binding is overridable |
| end |
| end |
| |
| module m5 |
| type base |
| contains |
| procedure, private :: binding => basesub |
| generic :: generic => binding |
| end type |
| type, extends(base) :: ext1 |
| contains |
| procedure, public :: binding => ext1sub |
| end type |
| contains |
| subroutine basesub(x) |
| class(base), intent(in) :: x |
| end |
| subroutine ext1sub(x) |
| class(ext1), intent(in) :: x |
| end |
| subroutine test1 |
| type(ext1) x |
| !CHECK: CALL ext1sub(x) |
| call x%generic |
| end |
| end |
| |
| module m6 |
| use m5 |
| type, extends(ext1) :: ext2 |
| contains |
| procedure :: binding => ext2sub |
| end type |
| contains |
| subroutine ext2sub(x) |
| class(ext2), intent(in) :: x |
| end |
| subroutine test2 |
| type(ext2) x |
| !CHECK: CALL ext2sub(x) |
| call x%generic ! public binding is overridable |
| end |
| end |