OpenACC 1.0 fortran FE support -- tests.

    gcc/testsuite/gfortran.dg/goacc/
    * goacc.exp: New test directory.
    * branch.f95: New test.
    * continuation-free-form.f95: Likewise.
    * data-clauses.f95: Likewise.
    * data-tree.f95: Likewise.
    * declare-1.f95: Likewise.
    * declare.f95: Likewise.
    * directive-names.f95: Likewise.
    * enter-exit-data.f95: Likewise.
    * host_data-tree.f95: Likewise.
    * if.f95: Likewise.
    * kernels-tree.f95: Likewise.
    * list.f95: Likewise.
    * parallel-kernels-clauses.f95: Likewise.
    * parallel-kernels-regions.f95: Likewise.
    * parallel-tree.f95: Likewise.
    * pure-elemental-procedures.f95: Likewise.
    * reduction.f95: Likewise.
    * sentinel-free-form.f95: Likewise.
    * several-directives.f95: Likewise.
    * sie.f95: Likewise.
>From 9850a2e343e506fa06edf1518414ac71eed60d48 Mon Sep 17 00:00:00 2001
From: Ilmir Usmanov <i.usma...@samsung.com>
Date: Fri, 31 Jan 2014 13:29:44 +0400
Subject: [PATCH 5/6] OpenACC fortran tests

---
 gcc/testsuite/gfortran.dg/goacc/branch.f95         |  55 +++++
 .../gfortran.dg/goacc/continuation-free-form.f95   |  24 ++
 gcc/testsuite/gfortran.dg/goacc/data-clauses.f95   | 261 +++++++++++++++++++++
 gcc/testsuite/gfortran.dg/goacc/data-tree.f95      |  33 +++
 gcc/testsuite/gfortran.dg/goacc/declare-1.f95      |  13 +
 .../gfortran.dg/goacc/directive-names.f95          |  20 ++
 .../gfortran.dg/goacc/enter-exit-data.f95          |  89 +++++++
 gcc/testsuite/gfortran.dg/goacc/goacc.exp          |  36 +++
 gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95 |  13 +
 gcc/testsuite/gfortran.dg/goacc/if.f95             |  53 +++++
 gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95   |  34 +++
 gcc/testsuite/gfortran.dg/goacc/list.f95           | 111 +++++++++
 .../gfortran.dg/goacc/parallel-kernels-clauses.f95 |  96 ++++++++
 .../gfortran.dg/goacc/parallel-kernels-regions.f95 |  57 +++++
 gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95  |  42 ++++
 .../goacc/pure-elemental-procedures.f95            |  46 ++++
 gcc/testsuite/gfortran.dg/goacc/reduction.f95      | 138 +++++++++++
 .../gfortran.dg/goacc/sentinel-free-form.f95       |  22 ++
 .../gfortran.dg/goacc/several-directives.f95       |   7 +
 gcc/testsuite/gfortran.dg/goacc/sie.f95            | 252 ++++++++++++++++++++
 20 files changed, 1402 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/branch.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/data-clauses.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/data-tree.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/declare-1.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/directive-names.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/enter-exit-data.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/goacc.exp
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/if.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/list.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/parallel-kernels-clauses.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/pure-elemental-procedures.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/reduction.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/several-directives.f95
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/sie.f95

diff --git a/gcc/testsuite/gfortran.dg/goacc/branch.f95 b/gcc/testsuite/gfortran.dg/goacc/branch.f95
new file mode 100644
index 0000000..e470ce2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/branch.f95
@@ -0,0 +1,55 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	implicit none
+
+	integer :: i
+
+	if (.true.) then
+		!$acc parallel 
+	end if ! { dg-error "Unexpected" }
+	!$acc end parallel 
+	end if
+
+	if (.true.) then
+		!$acc kernels 
+	end if ! { dg-error "Unexpected" }
+	!$acc end kernels 
+	end if
+
+	!$acc parallel
+	if (.true.) then
+		!$acc end parallel ! { dg-error "Unexpected" }
+	end if 
+	!$acc end parallel
+
+	!$acc kernels
+	if (.true.) then
+		!$acc end kernels ! { dg-error "Unexpected" }
+	end if 
+	!$acc end kernels
+
+	!$acc parallel
+	if (.true.) then
+	end if
+	!$acc end parallel
+
+	!$acc kernels
+	if (.true.) then
+	end if
+	!$acc end kernels
+
+	if (.true.) then
+		!$acc parallel
+		!$acc end parallel
+	end if
+
+	if (.true.) then
+		!$acc kernels
+		!$acc end kernels
+	end if
+10	i = 0
+
+
+end program test 
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 b/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95
new file mode 100644
index 0000000..df32d9c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95
@@ -0,0 +1,24 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	implicit none
+
+	integer :: i
+	real :: x
+
+	!$acc parallel &
+	!$acc loop & ! continuation
+	!$acc & reduction(+:x)
+
+	! this line must be ignored
+	!$acc ! kernels
+	do i = 1,10
+		x = x + 0.3
+	enddo
+	! continuation must begin with sentinel
+	!$acc end parallel & ! { dg-error "Unclassifiable OpenACC directive" }
+	! loop
+
+	print *, x
+end
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/data-clauses.f95 b/gcc/testsuite/gfortran.dg/goacc/data-clauses.f95
new file mode 100644
index 0000000..1e0e246
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/data-clauses.f95
@@ -0,0 +1,261 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+! todo: some of warnings are not necessary
+
+module test 
+	implicit none
+contains
+
+	subroutine foo (vi)
+	integer, value :: vi
+	integer :: i, ia(10)
+	complex :: c, ca(10)
+	real, target:: r
+	real :: ra(10)
+	real, pointer :: rp
+	real, dimension(:), allocatable :: aa
+	type t
+		integer :: i
+	end type
+	type(t) :: ti
+	type(t), allocatable :: tia
+	type(t), target :: tit
+	type(t), pointer :: tip
+	rp => r
+	tip => tit
+
+	!$acc parallel deviceptr (rp) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel deviceptr (vi) ! { dg-error "VALUE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (aa) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+
+	!$acc parallel deviceptr (i, c, r, ia, ca, ra, ti)
+	!$acc end parallel
+	!$acc kernels deviceptr (i, c, r, ia, ca, ra, ti)
+	!$acc end kernels
+	!$acc data deviceptr (i, c, r, ia, ca, ra, ti)
+	!$acc end data
+
+
+	!$acc parallel copy (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel copy (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel copyin (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel copyin (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel copyout (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel copyout (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel create (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel create (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel present (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel present (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) present (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) present (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) present (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) present (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel create (i) present (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel present (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels present (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data present (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel pcopy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc parallel pcopyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc parallel pcopyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc parallel pcreate (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+
+
+	!$acc parallel present_or_copy (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel present_or_copy (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel create (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present (i) present_or_copy (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel present_or_copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels present_or_copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data present_or_copy (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel present_or_copyin (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel present_or_copyin (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel create (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copy (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel present_or_copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels present_or_copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data present_or_copyin (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel present_or_copyout (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel present_or_copyout (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel create (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copy (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copyin (i) present_or_copyout (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel present_or_copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels present_or_copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data present_or_copyout (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+
+	!$acc parallel present_or_create (tip) ! { dg-error "POINTER" }
+	!$acc end parallel
+	!$acc parallel present_or_create (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc end parallel
+	!$acc parallel deviceptr (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copy (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyin (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel copyout (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel create (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copy (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copyin (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+	!$acc parallel present_or_copyout (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel present_or_create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end parallel
+	!$acc kernels present_or_create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end kernels
+	!$acc data present_or_create (i, c, r, ia, ca, ra, rp, ti, vi, aa)
+	!$acc end data
+
+	end subroutine foo
+	
+end module test
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/data-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/data-tree.f95
new file mode 100644
index 0000000..e7929f8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/data-tree.f95
@@ -0,0 +1,33 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fdump-tree-original" } 
+
+! test for tree-dump-original and spaces-commas
+
+program test
+	implicit none
+	integer :: q, i, j, k, m, n, o, p, r, s, t, u, v, w
+	logical :: l
+
+	!$acc data if(l) copy(i), copyin(j), copyout(k), create(m) &
+	!$acc present(o), pcopy(p), pcopyin(r), pcopyout(s), pcreate(t) &
+	!$acc deviceptr(u)
+	!$acc end data
+
+end program test
+! { dg-excess-errors "unimplemented" }
+! { dg-final { scan-tree-dump "pragma acc data" "original" } } 
+
+! { dg-final { scan-tree-dump "if" "original" } }
+! { dg-final { scan-tree-dump "force_tofrom" "original" } } 
+! { dg-final { scan-tree-dump "force_to" "original" } } 
+! { dg-final { scan-tree-dump "force_from" "original" } } 
+! { dg-final { scan-tree-dump "force_alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_present" "original" } } 
+! { dg-final { scan-tree-dump "tofrom" "original" } } 
+! { dg-final { scan-tree-dump "to" "original" } } 
+! { dg-final { scan-tree-dump "from" "original" } } 
+! { dg-final { scan-tree-dump "alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_deviceptr" "original" } } 
+! { dg-final { cleanup-tree-dump "original" } } 
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/declare-1.f95 b/gcc/testsuite/gfortran.dg/goacc/declare-1.f95
new file mode 100644
index 0000000..2784214
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/declare-1.f95
@@ -0,0 +1,13 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fdump-tree-original" } 
+program test
+	implicit none
+	integer :: i
+
+	!$acc declare copy(i)
+
+end program test
+! { dg-excess-errors "unimplemented" }
+! { dg-final { scan-tree-dump "pragma acc declare" "original" } } 
+! { dg-final { scan-tree-dump "force_tofrom" "original" } } 
+! { dg-final { cleanup-tree-dump "original" } } 
diff --git a/gcc/testsuite/gfortran.dg/goacc/directive-names.f95 b/gcc/testsuite/gfortran.dg/goacc/directive-names.f95
new file mode 100644
index 0000000..f9e3a5d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/directive-names.f95
@@ -0,0 +1,20 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	implicit none
+
+	!$acc parallel
+	!$acc end parallel
+
+	!$acc kernels
+	!$acc end kernels
+
+	!$acc data
+	!$acc end data
+
+	!$acc host_data
+	!$acc end host_data
+	
+end program test
+! { dg-excess-errors "unimplemented" }
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/enter-exit-data.f95 b/gcc/testsuite/gfortran.dg/goacc/enter-exit-data.f95
new file mode 100644
index 0000000..58c2db3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/enter-exit-data.f95
@@ -0,0 +1,89 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+
+module test 
+	implicit none
+contains
+
+	subroutine foo (vi)
+    logical :: l
+	integer, value :: vi
+	integer :: i, ia(10), a(10), b(2:8)
+	complex :: c, ca(10)
+	real, target:: r
+	real :: ra(10)
+	real, pointer :: rp
+	real, dimension(:), allocatable :: aa
+	type t
+		integer :: i
+	end type
+	type(t) :: ti
+	type(t), allocatable :: tia
+	type(t), target :: tit
+	type(t), pointer :: tip
+	rp => r
+	tip => tit
+
+    ! enter data
+    !$acc enter data
+    !$acc enter data if (.false.)
+    !$acc enter data if (l)
+    !$acc enter data if (.false.) if (l) ! { dg-error "Unclassifiable" }
+    !$acc enter data if (i) ! { dg-error "LOGICAL" }
+    !$acc enter data if (1) ! { dg-error "LOGICAL" }
+    !$acc enter data if (a) ! { dg-error "LOGICAL" }
+    !$acc enter data if (b(5:6)) ! { dg-error "LOGICAL" }
+    !$acc enter data async (l) ! { dg-error "INTEGER" }
+    !$acc enter data async (.true.) ! { dg-error "INTEGER" }
+    !$acc enter data async (1) 
+    !$acc enter data async (i) 
+    !$acc enter data async (a) ! { dg-error "INTEGER" }
+    !$acc enter data async (b(5:6)) ! { dg-error "INTEGER" }
+    !$acc enter data wait (l) ! { dg-error "INTEGER" }
+    !$acc enter data wait (.true.) ! { dg-error "INTEGER" }
+    !$acc enter data wait (i, 1) 
+    !$acc enter data wait (a) ! { dg-error "INTEGER" }
+    !$acc enter data wait (b(5:6)) ! { dg-error "INTEGER" }
+	!$acc enter data copyin (tip) ! { dg-error "POINTER" }
+	!$acc enter data copyin (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc enter data create (tip) ! { dg-error "POINTER" }
+	!$acc enter data create (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc enter data present_or_copyin (tip) ! { dg-error "POINTER" }
+	!$acc enter data present_or_copyin (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc enter data present_or_create (tip) ! { dg-error "POINTER" }
+	!$acc enter data present_or_create (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc enter data copyin (i) create (i) ! { dg-error "multiple clauses" }
+	!$acc enter data copyin (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc enter data create (i) present_or_copyin (i) ! { dg-error "multiple clauses" }
+	!$acc enter data copyin (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc enter data create (i) present_or_create (i) ! { dg-error "multiple clauses" }
+	!$acc enter data present_or_copyin (i) present_or_create (i) ! { dg-error "multiple clauses" }
+
+	! exit data
+    !$acc exit data
+    !$acc exit data if (.false.)
+    !$acc exit data if (l)
+    !$acc exit data if (.false.) if (l) ! { dg-error "Unclassifiable" }
+    !$acc exit data if (i) ! { dg-error "LOGICAL" }
+    !$acc exit data if (1) ! { dg-error "LOGICAL" }
+    !$acc exit data if (a) ! { dg-error "LOGICAL" }
+    !$acc exit data if (b(5:6)) ! { dg-error "LOGICAL" }
+    !$acc exit data async (l) ! { dg-error "INTEGER" }
+    !$acc exit data async (.true.) ! { dg-error "INTEGER" }
+    !$acc exit data async (1) 
+    !$acc exit data async (i) 
+    !$acc exit data async (a) ! { dg-error "INTEGER" }
+    !$acc exit data async (b(5:6)) ! { dg-error "INTEGER" }
+    !$acc exit data wait (l) ! { dg-error "INTEGER" }
+    !$acc exit data wait (.true.) ! { dg-error "INTEGER" }
+    !$acc exit data wait (i, 1) 
+    !$acc exit data wait (a) ! { dg-error "INTEGER" }
+    !$acc exit data wait (b(5:6)) ! { dg-error "INTEGER" }
+	!$acc exit data copyout (tip) ! { dg-error "POINTER" }
+	!$acc exit data copyout (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc exit data delete (tip) ! { dg-error "POINTER" }
+	!$acc exit data delete (tia) ! { dg-error "ALLOCATABLE" }
+	!$acc exit data copyout (i) delete (i) ! { dg-error "multiple clauses" }
+	end subroutine foo
+end module test
diff --git a/gcc/testsuite/gfortran.dg/goacc/goacc.exp b/gcc/testsuite/gfortran.dg/goacc/goacc.exp
new file mode 100644
index 0000000..9ab131c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/goacc.exp
@@ -0,0 +1,36 @@
+# Copyright (C) 2005-2013 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib gfortran-dg.exp
+
+if ![check_effective_target_fopenmp] {
+  return
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+gfortran-dg-runtest [lsort \
+       [find $srcdir/$subdir *.\[fF\]{,90,95,03,08} ] ] " -fopenacc -fdump-parse-tree"
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95
new file mode 100644
index 0000000..d2cf8df
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/host_data-tree.f95
@@ -0,0 +1,13 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fdump-tree-original" } 
+
+program test
+	implicit none
+	integer :: i
+
+	!$acc host_data use_device(i)
+	!$acc end host_data
+end program test
+! { dg-excess-errors "unimplemented" }
+! { dg-final { scan-tree-dump "pragma acc host_data use_device" "original" } } 
+! { dg-final { cleanup-tree-dump "original" } } 
diff --git a/gcc/testsuite/gfortran.dg/goacc/if.f95 b/gcc/testsuite/gfortran.dg/goacc/if.f95
new file mode 100644
index 0000000..f543c8a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/if.f95
@@ -0,0 +1,53 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	implicit none
+
+	logical :: x
+	integer :: i
+
+	!$acc parallel if ! { dg-error "Unclassifiable OpenACC directive" }
+	!$acc parallel if () ! { dg-error "Invalid character" }
+	!$acc parallel if (i) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end parallel 
+	!$acc parallel if (1) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end parallel 
+	!$acc kernels if (i) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end kernels 
+	!$acc kernels if ! { dg-error "Unclassifiable OpenACC directive" }
+	!$acc kernels if () ! { dg-error "Invalid character" }
+	!$acc kernels if (1) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end kernels
+	!$acc data if ! { dg-error "Unclassifiable OpenACC directive" }
+	!$acc data if () ! { dg-error "Invalid character" }
+	!$acc data if (i) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end data 
+	!$acc data if (1) ! { dg-error "scalar LOGICAL expression" }
+	!$acc end data 
+
+	! at most one if clause may appear
+	!$acc parallel if (.false.) if (.false.) { dg-error "Unclassifiable OpenACC directive" }
+	!$acc kernels if (.false.) if (.false.) { dg-error "Unclassifiable OpenACC directive" }
+	!$acc data if (.false.) if (.false.) { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel if (x)
+	!$acc end parallel
+	!$acc parallel if (.true.)
+	!$acc end parallel
+	!$acc parallel if (i.gt.1)
+	!$acc end parallel
+	!$acc kernels if (x)
+	!$acc end kernels
+	!$acc kernels if (.true.)
+	!$acc end kernels
+	!$acc kernels if (i.gt.1)
+	!$acc end kernels
+	!$acc data if (x)
+	!$acc end data
+	!$acc data if (.true.)
+	!$acc end data
+	!$acc data if (i.gt.1)
+	!$acc end data
+
+end program test
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95
new file mode 100644
index 0000000..1fd4d52
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/kernels-tree.f95
@@ -0,0 +1,34 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fdump-tree-original" } 
+
+! test for tree-dump-original and spaces-commas
+
+program test
+	implicit none
+	integer :: q, i, j, k, m, n, o, p, r, s, t, u, v, w
+	logical :: l
+
+	!$acc kernels if(l) async copy(i), copyin(j), copyout(k), create(m) &
+	!$acc present(o), pcopy(p), pcopyin(r), pcopyout(s), pcreate(t) &
+	!$acc deviceptr(u)
+	!$acc end kernels
+
+end program test
+! { dg-excess-errors "unimplemented" }
+! { dg-final { scan-tree-dump "pragma acc kernels" "original" } } 
+
+! { dg-final { scan-tree-dump "if" "original" } }
+! { dg-final { scan-tree-dump "async" "original" } } 
+! { dg-final { scan-tree-dump "force_tofrom" "original" } } 
+! { dg-final { scan-tree-dump "force_to" "original" } } 
+! { dg-final { scan-tree-dump "force_from" "original" } } 
+! { dg-final { scan-tree-dump "force_alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_present" "original" } } 
+! { dg-final { scan-tree-dump "tofrom" "original" } } 
+! { dg-final { scan-tree-dump "to" "original" } } 
+! { dg-final { scan-tree-dump "from" "original" } } 
+! { dg-final { scan-tree-dump "alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_deviceptr" "original" } } 
+! { dg-final { cleanup-tree-dump "original" } } 
diff --git a/gcc/testsuite/gfortran.dg/goacc/list.f95 b/gcc/testsuite/gfortran.dg/goacc/list.f95
new file mode 100644
index 0000000..6139f11
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/list.f95
@@ -0,0 +1,111 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+program test 
+	implicit none
+
+	integer :: i, j, k, l, a(10)
+	common /b/ j, k
+	real, pointer :: p1 => NULL()
+	complex :: c, d(10)
+
+	!$acc parallel private(i)
+	!$acc end parallel
+
+	!$acc parallel private(a)
+	!$acc end parallel
+
+	!$acc parallel private(c, d)
+	!$acc end parallel
+
+	!$acc parallel private(i, j, k, l, a)
+	!$acc end parallel	
+
+	!$acc parallel private (i) private (j)
+	!$acc end parallel
+
+	!$acc parallel private ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel private() ! { dg-error "Syntax error" }
+
+	!$acc parallel private(a(1:3)) ! { dg-error "Syntax error" }
+
+	!$acc parallel private(10) ! { dg-error "Syntax error" }
+
+	!$acc parallel private(/b/, /b/) ! { dg-error "present on multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel private(i, j, i) ! { dg-error "present on multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel private(p1) 
+	!$acc end parallel
+
+	!$acc parallel firstprivate(i)
+	!$acc end parallel
+
+	!$acc parallel firstprivate(c, d)
+	!$acc end parallel
+
+	!$acc parallel firstprivate(a)
+	!$acc end parallel
+
+	!$acc parallel firstprivate(i, j, k, l, a)
+	!$acc end parallel	
+
+	!$acc parallel firstprivate (i) firstprivate (j)
+	!$acc end parallel
+
+	!$acc parallel firstprivate ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel firstprivate() ! { dg-error "Syntax error" }
+
+	!$acc parallel firstprivate(a(1:3)) ! { dg-error "Syntax error" }
+
+	!$acc parallel firstprivate(10) ! { dg-error "Syntax error" }
+
+	!$acc parallel firstprivate (/b/, /b/) ! { dg-error "present on multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel firstprivate (i, j, i) ! { dg-error "present on multiple clauses" }
+	!$acc end parallel
+
+	!$acc parallel firstprivate(p1) 
+	!$acc end parallel
+
+	!$acc parallel private (i) firstprivate (i) ! { dg-error "present on multiple clauses" }
+	!$acc end parallel
+
+	!$acc host_data use_device(i)
+	!$acc end host_data
+
+	!$acc host_data use_device(c, d)
+	!$acc end host_data
+
+	!$acc host_data use_device(a)
+	!$acc end host_data
+
+	!$acc host_data use_device(i, j, k, l, a)
+	!$acc end host_data	
+
+	!$acc host_data use_device (i) use_device (j)
+	!$acc end host_data
+
+	!$acc host_data use_device ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc host_data use_device() ! { dg-error "Syntax error" }
+
+	!$acc host_data use_device(a(1:3)) ! { dg-error "Syntax error" }
+
+	!$acc host_data use_device(10) ! { dg-error "Syntax error" }
+
+	!$acc host_data use_device(/b/, /b/) ! { dg-error "present on multiple clauses" }
+	!$acc end host_data
+
+	!$acc host_data use_device(i, j, i) ! { dg-error "present on multiple clauses" }
+	!$acc end host_data
+
+	!$acc host_data use_device(p1) ! { dg-error "POINTER" }
+	!$acc end host_data
+
+end program test
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-clauses.f95 b/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-clauses.f95
new file mode 100644
index 0000000..4ee080d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-clauses.f95
@@ -0,0 +1,96 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+! test clauses added in OpenACC ver 2.0
+
+program test
+    implicit none
+    integer :: i, a(10), b(5:7)
+    integer, parameter :: acc_async_noval = -1 
+    integer, parameter :: acc_async_sync = -2
+    logical :: l
+
+    ! async
+    !$acc kernels async(i)
+    !$acc end kernels
+    !$acc parallel async(i)
+    !$acc end parallel
+
+    !$acc kernels async(0, 1) { dg-error "Unclassifiable" }
+    !$acc parallel async(0, 1) { dg-error "Unclassifiable" }
+
+    !$acc kernels async
+    !$acc end kernels
+    !$acc parallel async
+    !$acc end parallel
+
+    !$acc kernels async(acc_async_noval)
+    !$acc end kernels
+    !$acc parallel async(acc_async_noval)
+    !$acc end parallel
+
+    !$acc kernels async(acc_async_sync)
+    !$acc end kernels
+    !$acc parallel async(acc_async_sync)
+    !$acc end parallel
+
+    !$acc kernels async() { dg-error "Invalid character" }
+    !$acc parallel async() { dg-error "Invalid character" }
+
+    !$acc kernels async("a") { dg-error "Unclassifiable" }
+    !$acc parallel async("a") { dg-error "Unclassifiable" }
+
+    !$acc kernels async(.true.) { dg-error "Unclassifiable" }
+    !$acc parallel async(.true.) { dg-error "Unclassifiable" }
+
+    ! default(none)
+    !$acc kernels default(none)
+    !$acc end kernels
+    !$acc parallel default(none)
+    !$acc end parallel
+
+    !$acc kernels default (none)
+    !$acc end kernels
+    !$acc parallel default (none)
+    !$acc end parallel
+
+    !$acc kernels default ( none )
+    !$acc end kernels
+    !$acc parallel default ( none )
+    !$acc end parallel
+
+    !$acc kernels default { dg-error "Unclassifiable" }
+    !$acc parallel default { dg-error "Unclassifiable" }
+
+    !$acc kernels default() { dg-error "Unclassifiable" }
+    !$acc parallel default() { dg-error "Unclassifiable" }
+
+    !$acc kernels default(i) { dg-error "Unclassifiable" }
+    !$acc parallel default(i) { dg-error "Unclassifiable" }
+
+    !$acc kernels default(1) { dg-error "Unclassifiable" }
+    !$acc parallel default(1) { dg-error "Unclassifiable" }
+
+    ! Wait
+    !$acc kernels wait (l) ! { dg-error "INTEGER" }
+    !$acc end kernels
+    !$acc kernels wait (.true.) ! { dg-error "INTEGER" }
+    !$acc end kernels
+    !$acc kernels wait (i, 1) 
+    !$acc end kernels
+    !$acc kernels wait (a) ! { dg-error "INTEGER" }
+    !$acc end kernels
+    !$acc kernels wait (b(5:6)) ! { dg-error "INTEGER" }
+    !$acc end kernels
+
+    !$acc parallel wait (l) ! { dg-error "INTEGER" }
+    !$acc end parallel
+    !$acc parallel wait (.true.) ! { dg-error "INTEGER" }
+    !$acc end parallel
+    !$acc parallel wait (i, 1) 
+    !$acc end parallel
+    !$acc parallel wait (a) ! { dg-error "INTEGER" }
+    !$acc end parallel
+    !$acc parallel wait (b(5:6)) ! { dg-error "INTEGER" }
+    !$acc end parallel
+end
diff --git a/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95 b/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95
new file mode 100644
index 0000000..3208315
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95
@@ -0,0 +1,57 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+! OpenACC 2.0 allows nested parallel/kernels regions
+! However, in middle-end there is check for nested parallel
+
+program test
+	implicit none
+
+	integer :: i
+
+	!$acc parallel
+		!$acc kernels 
+		!$acc end kernels
+	!$acc end parallel
+
+	!$acc parallel
+		!$acc parallel ! { dg-error "may not be nested" }
+		!$acc end parallel
+	!$acc end parallel
+
+	!$acc parallel
+		!$acc parallel ! { dg-error "may not be nested" }
+		!$acc end parallel
+		!$acc kernels 
+		!$acc end kernels
+	!$acc end parallel
+
+	!$acc kernels
+		!$acc kernels 
+		!$acc end kernels
+	!$acc end kernels
+
+	!$acc kernels
+		!$acc parallel 
+		!$acc end parallel
+	!$acc end kernels
+
+	!$acc kernels
+		!$acc parallel 
+		!$acc end parallel
+		!$acc kernels 
+		!$acc end kernels
+	!$acc end kernels
+
+	!$acc parallel
+		!$acc data
+		!$acc end data
+	!$acc end parallel
+
+	!$acc kernels
+		!$acc data
+		!$acc end data
+	!$acc end kernels
+	
+end program test
+! { dg-excess-errors "unimplemented" }
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95
new file mode 100644
index 0000000..2c7ee5b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95
@@ -0,0 +1,42 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fdump-tree-original" } 
+
+! test for tree-dump-original and spaces-commas
+
+program test
+	implicit none
+	integer :: q, i, j, k, m, n, o, p, r, s, t, u, v, w
+	logical :: l
+
+	!$acc parallel if(l) async num_gangs(i) num_workers(i) vector_length(i) &
+	!$acc reduction(max:q), copy(i), copyin(j), copyout(k), create(m) &
+	!$acc present(o), pcopy(p), pcopyin(r), pcopyout(s), pcreate(t) &
+	!$acc deviceptr(u), private(v), firstprivate(w)
+	!$acc end parallel
+
+end program test
+! { dg-excess-errors "unimplemented" }
+! { dg-final { scan-tree-dump "pragma acc parallel" "original" } } 
+
+! { dg-final { scan-tree-dump "if" "original" } }
+! { dg-final { scan-tree-dump "async" "original" } } 
+! { dg-final { scan-tree-dump "num_gangs" "original" } } 
+! { dg-final { scan-tree-dump "num_workers" "original" } } 
+! { dg-final { scan-tree-dump "vector_length" "original" } } 
+
+! { dg-final { scan-tree-dump "reduction" "original" } } 
+! { dg-final { scan-tree-dump "force_tofrom" "original" } } 
+! { dg-final { scan-tree-dump "force_to" "original" } } 
+! { dg-final { scan-tree-dump "force_from" "original" } } 
+! { dg-final { scan-tree-dump "force_alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_present" "original" } } 
+! { dg-final { scan-tree-dump "tofrom" "original" } } 
+! { dg-final { scan-tree-dump "to" "original" } } 
+! { dg-final { scan-tree-dump "from" "original" } } 
+! { dg-final { scan-tree-dump "alloc" "original" } } 
+
+! { dg-final { scan-tree-dump "force_deviceptr" "original" } } 
+! { dg-final { scan-tree-dump "private" "original" } } 
+! { dg-final { scan-tree-dump "firstprivate" "original" } } 
+! { dg-final { cleanup-tree-dump "original" } } 
diff --git a/gcc/testsuite/gfortran.dg/goacc/pure-elemental-procedures.f95 b/gcc/testsuite/gfortran.dg/goacc/pure-elemental-procedures.f95
new file mode 100644
index 0000000..18495b6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/pure-elemental-procedures.f95
@@ -0,0 +1,46 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+module test
+	implicit none
+contains
+	elemental subroutine test1
+		!$acc parallel ! { dg-error "may not appear in PURE or ELEMENTAL procedures" }
+	end subroutine test1
+
+	pure subroutine test2
+		!$acc parallel ! { dg-error "may not appear in PURE or ELEMENTAL procedures" }
+	end subroutine test2
+
+	elemental real function test3(x)
+		real, intent(in) :: x
+		!$acc parallel ! { dg-error "may not appear in PURE or ELEMENTAL procedures" }
+		test3 = x
+	end function test3
+
+	pure real function test4(x)
+		real, intent(in) :: x
+		!$acc parallel ! { dg-error "may not appear in PURE or ELEMENTAL procedures" }
+		test4 = x
+	end function test4
+
+	subroutine test5
+		real :: x = 0.0
+		integer :: i
+		!$acc parallel loop collapse(1) reduction(+:x)
+		do i = 1,10
+			x = x + 0.3
+		enddo
+		print *, x
+	end subroutine test5
+
+	real function test6(x)
+		real :: x
+		integer :: i
+		!$acc parallel loop collapse(1) reduction(+:x)
+		do i = 1,10
+			x = x + 0.3
+		enddo
+		test6 = x
+	end function test6
+end module test
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/reduction.f95 b/gcc/testsuite/gfortran.dg/goacc/reduction.f95
new file mode 100644
index 0000000..bc54745
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/reduction.f95
@@ -0,0 +1,138 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+subroutine foo (ia1)
+integer :: i1, i2, i3
+integer, dimension (*) :: ia1
+integer, dimension (10) :: ia2
+real :: r1
+real, dimension (5) :: ra1
+double precision :: d1
+double precision, dimension (4) :: da1
+complex :: c1
+complex, dimension (7) :: ca1
+logical :: l1
+logical, dimension (3) :: la1
+character (5) :: a1
+type t
+  integer :: i
+end type
+type(t) :: t1
+type(t), dimension (2) :: ta1
+real, pointer :: p1 => NULL()
+integer, allocatable :: aa1 (:,:)
+save i2
+common /blk/ i1
+
+!$acc parallel reduction (+:ia2)
+!$acc end parallel
+!$acc parallel reduction (+:ra1)
+!$acc end parallel
+!$acc parallel reduction (+:ca1)
+!$acc end parallel
+!$acc parallel reduction (+:da1)
+!$acc end parallel
+!$acc parallel reduction (.and.:la1)
+!$acc end parallel
+!$acc parallel reduction (+:i3, r1, d1, c1)
+!$acc end parallel
+!$acc parallel reduction (*:i3, r1, d1, c1)
+!$acc end parallel
+!$acc parallel reduction (-:i3, r1, d1, c1)
+!$acc end parallel
+!$acc parallel reduction (.and.:l1)
+!$acc end parallel
+!$acc parallel reduction (.or.:l1)
+!$acc end parallel
+!$acc parallel reduction (.eqv.:l1)
+!$acc end parallel
+!$acc parallel reduction (.neqv.:l1)
+!$acc end parallel
+!$acc parallel reduction (min:i3, r1, d1)
+!$acc end parallel
+!$acc parallel reduction (max:i3, r1, d1)
+!$acc end parallel
+!$acc parallel reduction (iand:i3)
+!$acc end parallel
+!$acc parallel reduction (ior:i3)
+!$acc end parallel
+!$acc parallel reduction (ieor:i3)
+!$acc end parallel
+!$acc parallel reduction (+:/blk/)	! { dg-error "Syntax error" }
+!$acc end parallel			! { dg-error "Unexpected" }
+!$acc parallel reduction (*:p1)		! { dg-error "POINTER object" }
+!$acc end parallel
+!$acc parallel reduction (-:aa1)
+!$acc end parallel
+!$acc parallel reduction (*:ia1)	! { dg-error "Assumed size" }
+!$acc end parallel
+!$acc parallel reduction (+:l1)		! { dg-error "must be of numeric type, got LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (*:la1)	! { dg-error "must be of numeric type, got LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (-:a1)		! { dg-error "must be of numeric type, got CHARACTER" }
+!$acc end parallel
+!$acc parallel reduction (+:t1)		! { dg-error "must be of numeric type, got TYPE" }
+!$acc end parallel
+!$acc parallel reduction (*:ta1)	! { dg-error "must be of numeric type, got TYPE" }
+!$acc end parallel
+!$acc parallel reduction (.and.:i3)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.or.:ia2)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.eqv.:r1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.neqv.:ra1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.and.:d1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.or.:da1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.eqv.:c1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.neqv.:ca1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.and.:a1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.or.:t1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (.eqv.:ta1)	! { dg-error "must be LOGICAL" }
+!$acc end parallel
+!$acc parallel reduction (min:c1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (max:ca1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (max:l1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (min:la1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (max:a1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (min:t1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (max:ta1)	! { dg-error "must be INTEGER or REAL" }
+!$acc end parallel
+!$acc parallel reduction (iand:r1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ior:ra1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ieor:d1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ior:da1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (iand:c1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ior:ca1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ieor:l1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (iand:la1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ior:a1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (ieor:t1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+!$acc parallel reduction (iand:ta1)	! { dg-error "must be INTEGER" }
+!$acc end parallel
+
+end subroutine
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95 b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
new file mode 100644
index 0000000..04c67d5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/sentinel-free-form.f95
@@ -0,0 +1,22 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	implicit none
+
+	integer :: i
+	real :: x
+
+	! sentinel may only be preceeded by white space
+	x = 0.0 !$acc parallel ! comment
+	! sentinel must appear as a single word
+	! $acc parallel ! comment
+	!$ acc parallel ! { dg-error "Unclassifiable statement" }
+	! directive lines must have space after sentinel
+	!$accparallel ! { dg-warning "followed by a space" }
+	do i = 1,10
+		x = x + 0.3
+	enddo
+	!$acc end parallel ! { dg-error "Unexpected" }
+	print *, x
+end
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/several-directives.f95 b/gcc/testsuite/gfortran.dg/goacc/several-directives.f95
new file mode 100644
index 0000000..7e1d0f9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/several-directives.f95
@@ -0,0 +1,7 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc" } 
+
+program test
+	! only one directive-name may appear in directive
+	!$acc parallel kernels ! { dg-error "Unclassifiable OpenACC directive" }
+end
\ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/goacc/sie.f95 b/gcc/testsuite/gfortran.dg/goacc/sie.f95
new file mode 100644
index 0000000..e49c387
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/sie.f95
@@ -0,0 +1,252 @@
+! { dg-do compile } 
+! { dg-options "-fopenacc -fmax-errors=100" } 
+
+! tests async, num_gangs, num_workers, vector_length, gang, worker, vector clauses
+
+program test
+	implicit none
+
+	integer :: i
+
+	!$acc parallel async
+	!$acc end parallel
+
+	!$acc parallel async(3)
+	!$acc end parallel
+
+	!$acc parallel async(i)
+	!$acc end parallel
+
+	!$acc parallel async(i+1)
+	!$acc end parallel
+
+	!$acc parallel async(-1) 
+	!$acc end parallel
+
+	!$acc parallel async(0) 
+	!$acc end parallel
+
+	!$acc parallel async() ! { dg-error "Invalid character in name" }
+
+	!$acc parallel async(1.5) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel async(.true.) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel async("1") ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc kernels async
+	!$acc end kernels
+
+	!$acc kernels async(3)
+	!$acc end kernels
+
+	!$acc kernels async(i)
+	!$acc end kernels
+
+	!$acc kernels async(i+1)
+	!$acc end kernels
+
+	!$acc kernels async(-1) 
+	!$acc end kernels
+
+	!$acc kernels async(0) 
+	!$acc end kernels
+
+	!$acc kernels async() ! { dg-error "Invalid character in name" }
+
+	!$acc kernels async(1.5) ! { dg-error "scalar INTEGER expression" }
+	!$acc end kernels
+
+	!$acc kernels async(.true.) ! { dg-error "scalar INTEGER expression" }
+	!$acc end kernels
+
+	!$acc kernels async("1") ! { dg-error "scalar INTEGER expression" }
+	!$acc end kernels
+
+
+	!$acc parallel num_gangs ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel num_gangs(3)
+	!$acc end parallel
+
+	!$acc parallel num_gangs(i)
+	!$acc end parallel
+
+	!$acc parallel num_gangs(i+1)
+	!$acc end parallel
+
+	!$acc parallel num_gangs(-1) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel num_gangs(0) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel num_gangs() ! { dg-error "Invalid character in name" }
+
+	!$acc parallel num_gangs(1.5) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel num_gangs(.true.) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel num_gangs("1") ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+
+	!$acc parallel num_workers ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel num_workers(3)
+	!$acc end parallel
+
+	!$acc parallel num_workers(i)
+	!$acc end parallel
+
+	!$acc parallel num_workers(i+1)
+	!$acc end parallel
+
+	!$acc parallel num_workers(-1) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel num_workers(0) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel num_workers() ! { dg-error "Invalid character in name" }
+
+	!$acc parallel num_workers(1.5) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel num_workers(.true.) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel num_workers("1") ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+
+	!$acc parallel vector_length ! { dg-error "Unclassifiable OpenACC directive" }
+
+	!$acc parallel vector_length(3)
+	!$acc end parallel
+
+	!$acc parallel vector_length(i)
+	!$acc end parallel
+
+	!$acc parallel vector_length(i+1)
+	!$acc end parallel
+
+	!$acc parallel vector_length(-1) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel vector_length(0) ! { dg-warning "must be positive" }
+	!$acc end parallel
+
+	!$acc parallel vector_length() ! { dg-error "Invalid character in name" }
+
+	!$acc parallel vector_length(1.5) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel vector_length(.true.) ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+	!$acc parallel vector_length("1") ! { dg-error "scalar INTEGER expression" }
+	!$acc end parallel
+
+
+	!$acc loop gang
+	do i = 1,10
+	enddo
+	!$acc loop gang(3)
+	do i = 1,10
+	enddo
+	!$acc loop gang(i)
+	do i = 1,10
+	enddo
+	!$acc loop gang(i+1)
+	do i = 1,10
+	enddo
+	!$acc loop gang(-1) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop gang(0) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop gang() ! { dg-error "Invalid character in name" }
+	do i = 1,10
+	enddo
+	!$acc loop gang(1.5) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop gang(.true.) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop gang("1") ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+
+
+	!$acc loop worker
+	do i = 1,10
+	enddo
+	!$acc loop worker(3)
+	do i = 1,10
+	enddo
+	!$acc loop worker(i)
+	do i = 1,10
+	enddo
+	!$acc loop worker(i+1)
+	do i = 1,10
+	enddo
+	!$acc loop worker(-1) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop worker(0) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop worker() ! { dg-error "Invalid character in name" }
+	do i = 1,10
+	enddo
+	!$acc loop worker(1.5) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop worker(.true.) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop worker("1") ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+
+
+	!$acc loop vector
+	do i = 1,10
+	enddo
+	!$acc loop vector(3)
+	do i = 1,10
+	enddo
+	!$acc loop vector(i)
+	do i = 1,10
+	enddo
+	!$acc loop vector(i+1)
+	do i = 1,10
+	enddo
+	!$acc loop vector(-1) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop vector(0) ! { dg-warning "must be positive" }
+	do i = 1,10
+	enddo
+	!$acc loop vector() ! { dg-error "Invalid character in name" }
+	do i = 1,10
+	enddo
+	!$acc loop vector(1.5) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop vector(.true.) ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+	!$acc loop vector("1") ! { dg-error "scalar INTEGER expression" }
+	do i = 1,10
+	enddo
+
+end program test
\ No newline at end of file
-- 
1.8.3.2

Reply via email to