| ! { dg-do run } |
| ! Check the fix for PR38863 comment #1, where defined assignment |
| ! to derived types was not treating components correctly that were |
| ! not set explicitly. |
| ! |
| ! Contributed by Mikael Morin <mikael@gcc.gnu.org> |
| ! |
| module m |
| type t |
| integer :: i,j |
| end type t |
| type ti |
| integer :: i,j = 99 |
| end type ti |
| interface assignment (=) |
| module procedure i_to_t, i_to_ti |
| end interface |
| contains |
| elemental subroutine i_to_ti (p, q) |
| type(ti), intent(out) :: p |
| integer, intent(in) :: q |
| p%i = q |
| end subroutine |
| elemental subroutine i_to_t (p, q) |
| type(t), intent(out) :: p |
| integer, intent(in) :: q |
| p%i = q |
| end subroutine |
| end module |
| |
| use m |
| call test_t ! Check original problem |
| call test_ti ! Default initializers were treated wrongly |
| contains |
| subroutine test_t |
| type(t), target :: a(3) |
| type(t), target :: b(3) |
| type(t), dimension(:), pointer :: p |
| logical :: l(3) |
| |
| a%i = 1 |
| a%j = [101, 102, 103] |
| b%i = 3 |
| b%j = 4 |
| |
| p => b |
| l = .true. |
| |
| where (l) |
| a = p%i ! Comment #1 of PR38863 concerned WHERE assignment |
| end where |
| if (any (a%j .ne. [101, 102, 103])) STOP 1 |
| |
| a = p%i ! Ordinary assignment was wrong too. |
| if (any (a%j .ne. [101, 102, 103])) STOP 2 |
| end subroutine |
| |
| subroutine test_ti |
| type(ti), target :: a(3) |
| type(ti), target :: b(3) |
| type(ti), dimension(:), pointer :: p |
| logical :: l(3) |
| |
| a%i = 1 |
| a%j = [101, 102, 103] |
| b%i = 3 |
| b%j = 4 |
| |
| p => b |
| l = .true. |
| |
| where (l) |
| a = p%i |
| end where |
| if (any (a%j .ne. 99)) STOP 3 |
| |
| a = p%i |
| if (any (a%j .ne. 99)) STOP 4 |
| end subroutine |
| end |