2 ! { dg-options "-fdump-tree-original" }
5 ! Test the use of temporaries in case of elemental subroutines.
9 INTEGER, PARAMETER :: sz = 5
11 INTEGER :: a(sz) = (/ (i, i=1,sz) /)
15 CALL double(a(sz-b+1), a) ! { dg-warning "might interfere with actual" }
16 ! Don't check the result, as the above is invalid
17 ! and might produce unexpected results (overlapping vector subscripts).
21 CALL double (a, a) ! same range, no temporary
22 IF (ANY(a /= 2*b)) CALL abort
26 CALL double (a+1, a) ! same range, no temporary
27 IF (ANY(a /= 2*b+2)) CALL abort
31 CALL double ((a(1:sz)), a(1:sz)) ! same range, no temporary
32 IF (ANY(a /= 2*b)) CALL abort
36 CALL double(a(1:sz-1), a(2:sz)) ! { dg-warning "might interfere with actual" }
37 ! Don't check the result, as the above is invalid,
38 ! and might produce unexpected results (arguments overlap).
42 CALL double((a(1:sz-1)), a(2:sz)) ! paren expression, temporary created
43 ! { dg-final { scan-tree-dump-times "A\.16\\\[4\\\]" 1 "original" } }
45 IF (ANY(a /= (/ b(1), (2*b(i), i=1,sz-1) /))) CALL abort
49 CALL double(a(1:sz-1)+1, a(2:sz)) ! op expression, temporary created
50 ! { dg-final { scan-tree-dump-times "A\.25\\\[4\\\]" 1 "original" } }
52 IF (ANY(a /= (/ b(1), (2*b(i)+2, i=1,sz-1) /))) CALL abort
56 CALL double(self(a), a) ! same range, no temporary
57 IF (ANY(a /= 2*b)) CALL abort
61 CALL double(self(a(1:sz-1)), a(2:sz)) ! function expr, temporary created
62 ! { dg-final { scan-tree-dump-times "A\.37\\\[4\\\]" 1 "original" } }
64 IF (ANY(a /= (/ b(1), (2*b(i), i=1,sz-1) /))) CALL abort
68 ELEMENTAL SUBROUTINE double(a, b)
70 INTEGER, INTENT(IN) :: a
71 INTEGER, INTENT(OUT) :: b
74 ELEMENTAL FUNCTION self(a)
76 INTEGER, INTENT(IN) :: a
82 ! { dg-final { scan-tree-dump-times "_gfortran_internal_unpack" 3 "original" } }
83 ! { dg-final { cleanup-tree-dump "original" } }