| ! RUN: not %flang_fc1 -fsyntax-only -fopenacc %s 2>&1 | FileCheck %s | |
| program acc_data_test | |
| implicit none | |
| integer :: a(100), b(100), c(100), d(100) | |
| integer :: i, s ! FIXME: if s is named sum you get semantic errors. | |
| ! Positive tests | |
| ! Basic data construct in program body | |
| !$acc data copy(a, b) create(c) | |
| a = 1 | |
| b = 2 | |
| c = a + b | |
| !$acc end data | |
| print *, "After first data region" | |
| ! Data construct within IF block | |
| if (.true.) then | |
| !$acc data copyout(a) | |
| a = a + 1 | |
| !$acc end data | |
| print *, "Inside if block" | |
| end if | |
| ! Data construct within DO loop | |
| do i = 1, 10 | |
| !$acc data present(a) | |
| a(i) = a(i) * 2 | |
| !$acc end data | |
| print *, "Loop iteration", i | |
| end do | |
| ! Nested data constructs | |
| !$acc data copyin(a) | |
| s = 0 | |
| !$acc data copy(s) | |
| s = s + 1 | |
| !$acc end data | |
| print *, "After nested data" | |
| !$acc end data | |
| ! Negative tests | |
| ! Basic data construct in program body | |
| !$acc data copy(a, b) create(d) bogus() | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected end of OpenACC directive | |
| !CHECK-NEXT: !$acc data copy(a, b) create(d) bogus() | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copy(a, b) create(d) bogus() | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: execution part | |
| !CHECK-NEXT: !$acc data copy(a, b) create(c) | |
| !CHECK-NEXT: ^ | |
| a = 1 | |
| b = 2 | |
| d = a + b | |
| ! !$acc end data | |
| print *, "After first data region" | |
| ! Data construct within IF block | |
| if (.true.) then | |
| !$acc data copyout(a) | |
| a = a + 1 | |
| ! !$acc end data | |
| print *, "Inside if block" | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: end if | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copyout(a) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: IF construct | |
| !CHECK-NEXT: if (.true.) then | |
| !CHECK-NEXT: ^ | |
| end if | |
| ! Data construct within DO loop | |
| do i = 1, 10 | |
| !$acc data present(a) | |
| a(i) = a(i) * 2 | |
| ! !$acc end data | |
| print *, "Loop iteration", i | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: end do | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data present(a) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: DO construct | |
| !CHECK-NEXT: do i = 1, 10 | |
| !CHECK-NEXT: ^ | |
| end do | |
| ! Nested data constructs | |
| !$acc data copyin(a) | |
| s = 0 | |
| !$acc data copy(s) | |
| s = s + 1 | |
| ! !$acc end data | |
| print *, "After nested data" | |
| !$acc end data I forgot to comment this out. | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected end of OpenACC directive | |
| !CHECK-NEXT: !$acc end data I forgot to comment this out. | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copy(s) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copyin(a) | |
| !CHECK-NEXT: ^ | |
| print *, "Program finished" | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: contains | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copyin(a) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copy(a, b) create(d) bogus() | |
| !CHECK-NEXT: ^ | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: contains | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: $acc data copy(a, b) create(d) bogus() | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: execution part | |
| !CHECK-NEXT: !$acc data copy(a, b) create(c) | |
| !CHECK-NEXT: ^ | |
| contains | |
| subroutine positive_process_array(x) | |
| integer, intent(inout) :: x(:) | |
| ! Data construct in subroutine | |
| !$acc data copy(x) | |
| x = x + 1 | |
| !$acc end data | |
| print *, "Subroutine finished" | |
| end subroutine | |
| function positive_compute_sum(x) result(total) | |
| integer, intent(in) :: x(:) | |
| integer :: total | |
| ! Data construct in function | |
| !$acc data copyin(x) copy(total) | |
| total = sum(x) | |
| !$acc end data | |
| print *, "Function finished" | |
| end function | |
| subroutine negative_process_array(x) | |
| integer, intent(inout) :: x(:) | |
| ! Data construct in subroutine | |
| !$acc data copy(x) | |
| x = x + 1 | |
| ! !$acc end data | |
| print *, "Subroutine finished" | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: end subroutine | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copy(x) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: SUBROUTINE subprogram | |
| !CHECK-NEXT: subroutine negative_process_array(x) | |
| !CHECK-NEXT: ^ | |
| end subroutine | |
| function negative_compute_sum(x) result(total) | |
| integer, intent(in) :: x(:) | |
| integer :: total | |
| total = sum(x) | |
| ! Data construct in function | |
| !$acc data copyin(x) copy(total) | |
| total = total + x | |
| ! !$acc end data | |
| print *, "Function finished" | |
| !CHECK: acc-data-statement.f90: | |
| !CHECK-SAME: error: expected OpenACC end block directive | |
| !CHECK-NEXT: end function | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: OpenACC construct | |
| !CHECK-NEXT: !$acc data copyin(x) copy(total) | |
| !CHECK-NEXT: ^ | |
| !CHECK-NEXT: in the context: execution part | |
| !CHECK-NEXT: total = sum(x) | |
| !CHECK-NEXT: ^ | |
| end function | |
| end program acc_data_test |