| ! { dg-do run } |
| ! Test the fix for PR114280 in which inquiry references of associate names |
| ! of as yet unparsed function selectors failed. |
| ! Contributed by Steve Kargl <> |
| program paul2 |
| implicit none |
| type t |
| real :: re |
| end type t |
| real :: comp = 1, repart = 10, impart =100 |
| call foo |
| contains |
| subroutine foo () |
| associate (x => bar1()) |
| ! 'x' identified as complex from outset |
| if (int(x%im) .ne. 100) stop 1 ! Has no IMPLICIT type |
| if (int(x%re) .ne. 10) stop 2 |
| end associate |
| |
| associate (x => bar1()) |
| ! 'x' identified as derived then corrected to complex |
| if (int(x%re) .ne. 11) stop 3 ! Has no IMPLICIT type |
| if (int(x%im) .ne. 101) stop 4 |
| if (x%kind .ne. kind(1.0)) stop 5 |
| end associate |
| |
| associate (x => bar1()) |
| if (x%kind .ne. kind(1.0)) stop 6 ! Invalid character in name |
| end associate |
| |
| associate (x => bar2()) |
| if (int(x%re) .ne. 1) stop 7 ! Invalid character in name |
| end associate |
| |
| associate (xx => bar3()) |
| if (xx%len .ne. 8) stop 8 ! Has no IMPLICIT type |
| if (trim (xx) .ne. "Nice one") stop 9 |
| if (xx(6:8) .ne. "one") stop 10 |
| end associate |
| |
| ! Now check the array versions |
| associate (x => bar4()) |
| if (any (int(abs (x(:) + 2.0)) .ne. [104,105])) stop 0 |
| if (int(x(2)%re) .ne. 14) stop 11 |
| if (any (int(x%im) .ne. [103,104])) stop 12 |
| if (any (int(abs(x)) .ne. [103,104])) stop 13 |
| end associate |
| |
| associate (x => bar5()) |
| if (x(:)%kind .ne. kind("A")) stop 14 |
| if (x(2)%len .ne. 4) stop 15 |
| if (x%len .ne. 4) stop 16 |
| if (x(2)(1:3) .ne. "two") stop 17 |
| if (any(x .ne. ["one ", "two "])) stop 18 |
| end associate |
| end |
| complex function bar1 () |
| bar1 = cmplx(repart, impart) |
| repart = repart + 1 |
| impart = impart + 1 |
| end |
| type(t) function bar2 () |
| bar2% re = comp |
| comp = comp + 1 |
| end |
| character(8) function bar3 () |
| bar3 = "Nice one!" |
| end |
| function bar4 () result (res) |
| complex, allocatable, dimension(:) :: res |
| res = [cmplx(repart, impart),cmplx(repart+1, impart+1)] |
| repart = repart + 2 |
| impart = impart + 2 |
| end |
| function bar5 () result (res) |
| character(4), allocatable, dimension(:) :: res |
| res = ["one ", "two "] |
| end |
| end |